api-ix commited on
Commit
1bb904a
·
verified ·
1 Parent(s): 1069489

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +82 -20
index.html CHANGED
@@ -30,6 +30,21 @@
30
  line-height: 1.6;
31
  }
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  /* --- UTILITIES --- */
34
  .container {
35
  max-width: 1200px;
@@ -81,7 +96,9 @@
81
  border: 1px solid var(--text-main);
82
  padding: 4px 10px;
83
  z-index: 101;
 
84
  }
 
85
 
86
  .nav-links { display: flex; gap: 2rem; }
87
  .nav-links a {
@@ -110,7 +127,6 @@
110
 
111
  .hero-content {
112
  display: grid;
113
- /* Updated Grid: Name | Image | Text */
114
  grid-template-columns: auto 300px 1fr;
115
  gap: 3rem;
116
  align-items: center;
@@ -128,39 +144,63 @@
128
  padding-right: 2rem;
129
  letter-spacing: 0.5rem;
130
  white-space: nowrap;
 
 
 
 
 
 
131
  }
132
 
133
- /* --- PROFILE IMAGE STYLING --- */
134
  .hero-img-container {
135
  width: 100%;
136
  height: 400px;
137
  position: relative;
138
  border: 1px solid #333;
139
  overflow: hidden;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  }
141
 
142
  .hero-img {
143
  width: 100%;
144
  height: 100%;
145
  object-fit: cover;
146
- /* Manga Style Filter: Black & White + High Contrast */
147
  filter: grayscale(100%) contrast(120%);
148
  transition: filter 0.5s ease, transform 0.5s ease;
 
 
 
149
  }
150
 
151
- /* Color reveal on hover */
 
152
  .hero-img-container:hover .hero-img {
153
  filter: grayscale(0%) contrast(100%);
154
  transform: scale(1.05);
155
  }
156
 
157
- /* Decorative "Corners" for the image */
158
  .hero-img-container::after {
159
  content: '';
160
  position: absolute;
161
  top: 0; left: 0; width: 100%; height: 100%;
162
  border: 1px solid transparent;
163
- /* Top Left and Bottom Right Red Accents */
164
  background:
165
  linear-gradient(to right, var(--accent-red) 2px, transparent 2px) 0 0,
166
  linear-gradient(to bottom, var(--accent-red) 2px, transparent 2px) 0 0,
@@ -169,6 +209,7 @@
169
  background-repeat: no-repeat;
170
  background-size: 20px 20px;
171
  pointer-events: none;
 
172
  }
173
 
174
  .hero-text h2 {
@@ -201,6 +242,7 @@
201
  .btn:hover {
202
  background: var(--accent-red);
203
  color: var(--bg-color);
 
204
  }
205
 
206
  /* --- SECTIONS --- */
@@ -228,6 +270,11 @@
228
  padding: 1.5rem;
229
  transition: 0.3s;
230
  }
 
 
 
 
 
231
  .skill-card li { margin-bottom: 0.5rem; font-size: 0.9rem; color: var(--text-muted); }
232
  .skill-card li::before { content: ':: '; color: var(--accent-red); }
233
 
@@ -247,7 +294,9 @@
247
  display: flex;
248
  justify-content: center;
249
  align-items: center;
 
250
  }
 
251
 
252
  footer {
253
  padding: 4rem 0 6rem 0;
@@ -264,7 +313,10 @@
264
  margin: 0 auto 1.5rem auto;
265
  font-family: var(--font-serif);
266
  font-weight: 900;
 
 
267
  }
 
268
 
269
  /* --- MOBILE MEDIA QUERIES --- */
270
  @media (max-width: 900px) {
@@ -273,15 +325,11 @@
273
  text-align: center;
274
  gap: 2rem;
275
  }
276
-
277
- /* Image styling for mobile */
278
  .hero-img-container {
279
- width: 200px;
280
- height: 200px;
281
  margin: 0 auto;
282
- border-radius: 50%; /* Circle on mobile */
283
  }
284
-
285
  .name-vertical {
286
  writing-mode: horizontal-tb;
287
  border-right: none;
@@ -291,7 +339,6 @@
291
  font-size: 3rem;
292
  width: 100%;
293
  }
294
-
295
  .menu-toggle { display: block; }
296
  .nav-links {
297
  position: fixed; top: 0; right: -100%; width: 70%; height: 100vh;
@@ -300,7 +347,6 @@
300
  border-left: 1px solid var(--accent-red);
301
  }
302
  .nav-links.active { right: 0; }
303
-
304
  .project-item { grid-template-columns: 1fr; }
305
  }
306
  </style>
@@ -322,16 +368,17 @@
322
 
323
  <header class="hero container">
324
  <div class="hero-content">
325
- <h1 class="name-vertical">アーケイン</h1>
326
 
327
  <div class="hero-img-container">
328
- <img src="./profile.jpg" alt="Arcane Profile" class="hero-img">
 
329
  </div>
330
 
331
  <div class="hero-text">
332
  <span class="japanese-label">BACKEND ARCHITECT</span>
333
  <h2>Logic in the<br>Shadows.</h2>
334
- <p>Specialized in high-load server environments, distributed database management, and algorithmic efficiency.</p>
335
  <a href="#contact" class="btn">INITIATE_CONTACT()</a>
336
  </div>
337
  </div>
@@ -344,6 +391,7 @@
344
  <div class="skill-card">
345
  <h3>Core Languages</h3>
346
  <ul>
 
347
  <li>Python (FastAPI)</li>
348
  <li>Go (Golang)</li>
349
  <li>Rust (Systems)</li>
@@ -355,14 +403,16 @@
355
  <li>PostgreSQL (Tuning)</li>
356
  <li>Redis Cluster</li>
357
  <li>Kafka / RabbitMQ</li>
 
358
  </ul>
359
  </div>
360
  <div class="skill-card">
361
  <h3>Infrastructure</h3>
362
  <ul>
363
- <li>Docker & K8s</li>
364
  <li>AWS (EC2, Lambda)</li>
365
- <li>Terraform</li>
 
366
  </ul>
367
  </div>
368
  </div>
@@ -413,10 +463,21 @@
413
  </footer>
414
 
415
  <script>
 
416
  function toggleMenu() {
417
  document.getElementById('navLinks').classList.toggle('active');
418
  }
419
 
 
 
 
 
 
 
 
 
 
 
420
  const observer = new IntersectionObserver((entries) => {
421
  entries.forEach(entry => {
422
  if (entry.isIntersecting) {
@@ -424,8 +485,9 @@
424
  entry.target.style.transform = 'translateY(0)';
425
  }
426
  });
427
- });
428
 
 
429
  document.querySelectorAll('.skill-card, .project-item').forEach((el) => {
430
  el.style.opacity = 0;
431
  el.style.transform = 'translateY(30px)';
 
30
  line-height: 1.6;
31
  }
32
 
33
+ /* --- KEYFRAMES --- */
34
+ @keyframes spin {
35
+ 0% { transform: rotate(0deg); }
36
+ 100% { transform: rotate(360deg); }
37
+ }
38
+
39
+ @keyframes glitch {
40
+ 0% { transform: translate(0); }
41
+ 20% { transform: translate(-2px, 2px); }
42
+ 40% { transform: translate(-2px, -2px); }
43
+ 60% { transform: translate(2px, 2px); }
44
+ 80% { transform: translate(2px, -2px); }
45
+ 100% { transform: translate(0); }
46
+ }
47
+
48
  /* --- UTILITIES --- */
49
  .container {
50
  max-width: 1200px;
 
96
  border: 1px solid var(--text-main);
97
  padding: 4px 10px;
98
  z-index: 101;
99
+ transition: 0.3s;
100
  }
101
+ .logo:hover { background: var(--text-main); color: var(--bg-color); }
102
 
103
  .nav-links { display: flex; gap: 2rem; }
104
  .nav-links a {
 
127
 
128
  .hero-content {
129
  display: grid;
 
130
  grid-template-columns: auto 300px 1fr;
131
  gap: 3rem;
132
  align-items: center;
 
144
  padding-right: 2rem;
145
  letter-spacing: 0.5rem;
146
  white-space: nowrap;
147
+ /* Glitch Animation trigger class */
148
+ }
149
+
150
+ .glitch-effect:hover {
151
+ animation: glitch 0.3s cubic-bezier(.25, .46, .45, .94) both infinite;
152
+ color: var(--accent-red);
153
  }
154
 
155
+ /* --- PROFILE IMAGE & LOADER --- */
156
  .hero-img-container {
157
  width: 100%;
158
  height: 400px;
159
  position: relative;
160
  border: 1px solid #333;
161
  overflow: hidden;
162
+ background: #111;
163
+ display: flex;
164
+ justify-content: center;
165
+ align-items: center;
166
+ }
167
+
168
+ /* Loading Spinner */
169
+ .img-loader {
170
+ width: 50px;
171
+ height: 50px;
172
+ border: 2px solid transparent;
173
+ border-top: 2px solid var(--accent-red);
174
+ border-radius: 50%;
175
+ animation: spin 1s linear infinite;
176
+ position: absolute;
177
+ z-index: 1;
178
  }
179
 
180
  .hero-img {
181
  width: 100%;
182
  height: 100%;
183
  object-fit: cover;
 
184
  filter: grayscale(100%) contrast(120%);
185
  transition: filter 0.5s ease, transform 0.5s ease;
186
+ opacity: 0; /* Hidden until loaded */
187
+ position: relative;
188
+ z-index: 2;
189
  }
190
 
191
+ .hero-img.loaded { opacity: 1; }
192
+
193
  .hero-img-container:hover .hero-img {
194
  filter: grayscale(0%) contrast(100%);
195
  transform: scale(1.05);
196
  }
197
 
198
+ /* Decorative Corners */
199
  .hero-img-container::after {
200
  content: '';
201
  position: absolute;
202
  top: 0; left: 0; width: 100%; height: 100%;
203
  border: 1px solid transparent;
 
204
  background:
205
  linear-gradient(to right, var(--accent-red) 2px, transparent 2px) 0 0,
206
  linear-gradient(to bottom, var(--accent-red) 2px, transparent 2px) 0 0,
 
209
  background-repeat: no-repeat;
210
  background-size: 20px 20px;
211
  pointer-events: none;
212
+ z-index: 3;
213
  }
214
 
215
  .hero-text h2 {
 
242
  .btn:hover {
243
  background: var(--accent-red);
244
  color: var(--bg-color);
245
+ box-shadow: 0 0 15px var(--accent-red);
246
  }
247
 
248
  /* --- SECTIONS --- */
 
270
  padding: 1.5rem;
271
  transition: 0.3s;
272
  }
273
+ .skill-card:hover {
274
+ border-color: var(--accent-red);
275
+ transform: translateY(-5px);
276
+ }
277
+
278
  .skill-card li { margin-bottom: 0.5rem; font-size: 0.9rem; color: var(--text-muted); }
279
  .skill-card li::before { content: ':: '; color: var(--accent-red); }
280
 
 
294
  display: flex;
295
  justify-content: center;
296
  align-items: center;
297
+ transition: 0.3s;
298
  }
299
+ .project-diagram:hover { border-color: var(--accent-red); }
300
 
301
  footer {
302
  padding: 4rem 0 6rem 0;
 
313
  margin: 0 auto 1.5rem auto;
314
  font-family: var(--font-serif);
315
  font-weight: 900;
316
+ cursor: pointer;
317
+ transition: 0.3s;
318
  }
319
+ .stamp:hover { background: var(--accent-red); color: #000; }
320
 
321
  /* --- MOBILE MEDIA QUERIES --- */
322
  @media (max-width: 900px) {
 
325
  text-align: center;
326
  gap: 2rem;
327
  }
 
 
328
  .hero-img-container {
329
+ width: 200px; height: 200px;
 
330
  margin: 0 auto;
331
+ border-radius: 50%;
332
  }
 
333
  .name-vertical {
334
  writing-mode: horizontal-tb;
335
  border-right: none;
 
339
  font-size: 3rem;
340
  width: 100%;
341
  }
 
342
  .menu-toggle { display: block; }
343
  .nav-links {
344
  position: fixed; top: 0; right: -100%; width: 70%; height: 100vh;
 
347
  border-left: 1px solid var(--accent-red);
348
  }
349
  .nav-links.active { right: 0; }
 
350
  .project-item { grid-template-columns: 1fr; }
351
  }
352
  </style>
 
368
 
369
  <header class="hero container">
370
  <div class="hero-content">
371
+ <h1 class="name-vertical glitch-effect">アーケイン</h1>
372
 
373
  <div class="hero-img-container">
374
+ <div class="img-loader" id="imgLoader"></div>
375
+ <img src="./profile.jpg" alt="Arcane Profile" class="hero-img" onload="imageLoaded()">
376
  </div>
377
 
378
  <div class="hero-text">
379
  <span class="japanese-label">BACKEND ARCHITECT</span>
380
  <h2>Logic in the<br>Shadows.</h2>
381
+ <p>Specialized in high-load server environments, Node.js scalability, and algorithmic efficiency.</p>
382
  <a href="#contact" class="btn">INITIATE_CONTACT()</a>
383
  </div>
384
  </div>
 
391
  <div class="skill-card">
392
  <h3>Core Languages</h3>
393
  <ul>
394
+ <li>Node.js (Express/NestJS)</li>
395
  <li>Python (FastAPI)</li>
396
  <li>Go (Golang)</li>
397
  <li>Rust (Systems)</li>
 
403
  <li>PostgreSQL (Tuning)</li>
404
  <li>Redis Cluster</li>
405
  <li>Kafka / RabbitMQ</li>
406
+ <li>MongoDB Aggregation</li>
407
  </ul>
408
  </div>
409
  <div class="skill-card">
410
  <h3>Infrastructure</h3>
411
  <ul>
412
+ <li>Docker & Kubernetes</li>
413
  <li>AWS (EC2, Lambda)</li>
414
+ <li>Terraform / Ansible</li>
415
+ <li>Nginx Reverse Proxy</li>
416
  </ul>
417
  </div>
418
  </div>
 
463
  </footer>
464
 
465
  <script>
466
+ // Toggle Mobile Menu
467
  function toggleMenu() {
468
  document.getElementById('navLinks').classList.toggle('active');
469
  }
470
 
471
+ // Image Load Handler
472
+ function imageLoaded() {
473
+ const img = document.querySelector('.hero-img');
474
+ const loader = document.getElementById('imgLoader');
475
+
476
+ img.classList.add('loaded'); // Reveal image
477
+ loader.style.display = 'none'; // Hide spinner
478
+ }
479
+
480
+ // Intersection Observer for Scroll Animations
481
  const observer = new IntersectionObserver((entries) => {
482
  entries.forEach(entry => {
483
  if (entry.isIntersecting) {
 
485
  entry.target.style.transform = 'translateY(0)';
486
  }
487
  });
488
+ }, { threshold: 0.1 });
489
 
490
+ // Apply animations to elements
491
  document.querySelectorAll('.skill-card, .project-item').forEach((el) => {
492
  el.style.opacity = 0;
493
  el.style.transform = 'translateY(30px)';