Skip to content

Commit 5f94b3d

Browse files
committed
Animate layout blocks in scroll reveal
1 parent babb6da commit 5f94b3d

File tree

2 files changed

+434
-421
lines changed

2 files changed

+434
-421
lines changed

src/main.ts

Lines changed: 69 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -154,59 +154,55 @@ app.innerHTML = `
154154
</div>
155155
</header>
156156
157-
<main class="container">
158-
<section id="home" class="hero">
159-
<div class="hero-grid"></div>
160-
<div class="avatar-wrap">
161-
<img class="avatar" src="/images/marco-profile.png" alt="Marco Pisco" />
162-
<span id="discord-avatar-status" class="status-dot offline avatar-status"></span>
163-
</div>
164-
<h1>
165-
Hi, I am <span class="gradient-name">Marco Pisco</span>.
166-
</h1>
167-
<p class="hero-alias">aka <span class="alias-name" data-tip="nvld">neverland</span></p>
168-
<p>
169-
Student, Developer and System Administrator based in Portugal.
170-
</p>
171-
<div id="hero-status" class="hero-status hidden"></div>
172-
</section>
173-
174-
<hr />
175-
176-
<section id="about" class="split-section">
177-
<div>
178-
<p class="section-id">// 01.</p>
179-
<h2>About Me</h2>
180-
</div>
181-
<div class="section-content">
182-
<p>
183-
I am a student, software developer, and system administrator focused on
184-
secure infrastructure, practical product delivery, and dependable operations.
185-
</p>
186-
<p>
187-
I work across software engineering, systems administration, and security-focused
188-
infrastructure, with a strong focus on reliability, automation, and maintainable operations.
157+
<main class="container page-shell">
158+
<section id="home" class="hero-panel panel">
159+
<div class="hero-copy">
160+
<p class="eyebrow">Portfolio</p>
161+
<h1>
162+
Hi, I am <span class="gradient-name">Marco Pisco</span>.
163+
</h1>
164+
<p class="hero-alias">aka <span class="alias-name" data-tip="nvld">neverland</span></p>
165+
<p class="hero-subtitle">
166+
Student, Developer and System Administrator based in Portugal.
189167
</p>
168+
<div id="hero-status" class="hero-status hidden"></div>
190169
</div>
170+
<aside class="hero-media">
171+
<div class="avatar-frame">
172+
<img class="avatar" src="/images/marco-profile.png" alt="Marco Pisco" />
173+
<span id="discord-avatar-status" class="status-dot offline avatar-status"></span>
174+
</div>
175+
<p class="hero-note">
176+
Building reliable systems, safer infrastructure, and practical software.
177+
</p>
178+
</aside>
191179
</section>
192180
193-
<hr />
181+
<section class="info-grid">
182+
<article id="about" class="panel about-panel">
183+
<h2>About Me</h2>
184+
<div class="section-content">
185+
<p>
186+
I am a student, software developer, and system administrator focused on
187+
secure infrastructure, practical product delivery, and dependable operations.
188+
</p>
189+
<p>
190+
I work across software engineering, systems administration, and security-focused
191+
infrastructure, with a strong focus on reliability, automation, and maintainable operations.
192+
</p>
193+
</div>
194+
</article>
194195
195-
<section id="skills" class="split-section">
196-
<div>
197-
<p class="section-id">// 02.</p>
196+
<article id="skills" class="panel skills-panel">
198197
<h2>Tech Stack</h2>
199-
</div>
200-
<div class="pill-wrap">
201-
${techStack.map((skill) => `<span class="pill">${skill}</span>`).join('')}
202-
</div>
198+
<div class="pill-wrap">
199+
${techStack.map((skill) => `<span class="pill">${skill}</span>`).join('')}
200+
</div>
201+
</article>
203202
</section>
204203
205-
<hr />
206-
207-
<section id="experience" class="stack-section">
208-
<div>
209-
<p class="section-id">// 03.</p>
204+
<section id="experience" class="panel section-panel">
205+
<div class="section-head">
210206
<h2>Experience</h2>
211207
</div>
212208
<div class="cards">
@@ -228,11 +224,8 @@ app.innerHTML = `
228224
</div>
229225
</section>
230226
231-
<hr />
232-
233-
<section id="education" class="stack-section">
234-
<div>
235-
<p class="section-id">// 04.</p>
227+
<section id="education" class="panel section-panel">
228+
<div class="section-head">
236229
<h2>Education</h2>
237230
</div>
238231
<div class="cards">
@@ -254,21 +247,15 @@ app.innerHTML = `
254247
</div>
255248
</section>
256249
257-
<hr />
258-
259-
<section id="writeups" class="stack-section">
260-
<div>
261-
<p class="section-id">// 05.</p>
250+
<section id="writeups" class="panel section-panel">
251+
<div class="section-head">
262252
<h2>Posts</h2>
263253
</div>
264254
<div id="writeups-list" class="cards"></div>
265255
<article id="writeup-viewer" class="writeup-viewer hidden"></article>
266256
</section>
267257
268-
<hr />
269-
270-
<section id="contact" class="contact">
271-
<p class="section-id">// 06.</p>
258+
<section id="contact" class="panel contact-panel">
272259
<h2>Get In Touch</h2>
273260
<p>
274261
If you need help with platform engineering, production hardening,
@@ -458,20 +445,37 @@ function closeWriteup(): void {
458445
}
459446

460447
function setupScrollReveal(root: ParentNode = document): void {
461-
const targets = root.querySelectorAll<HTMLElement>(
462-
'#about h2, #about p, #skills h2, #skills .pill, #experience h2, #experience .card, #education h2, #education .card, #writeups h2, #writeups .card, #contact h2, #contact p, #contact .social-btn',
448+
const textTargets = Array.from(
449+
root.querySelectorAll<HTMLElement>(
450+
'.hero-copy h1, .hero-copy p, .hero-note, .panel h2, .panel .section-content p, .panel .pill, .panel .card, .panel .social-btn',
451+
),
452+
);
453+
const blockTargets = Array.from(
454+
root.querySelectorAll<HTMLElement>(
455+
'.hero-panel, .about-panel, .skills-panel, .section-panel, .contact-panel, .hero-media, .avatar-frame, .hero-status .status-card, .contact-actions, .writeup-viewer',
456+
),
463457
);
458+
const targets = Array.from(new Set([...textTargets, ...blockTargets]));
464459

465460
if (targets.length === 0) {
466461
return;
467462
}
468463

469-
let stagger = 0;
470-
for (const target of targets) {
464+
let textStagger = 0;
465+
for (const target of textTargets) {
471466
if (!target.classList.contains('reveal-text')) {
472467
target.classList.add('reveal-text');
473-
target.style.setProperty('--reveal-delay', `${Math.min(stagger * 55, 260)}ms`);
474-
stagger += 1;
468+
target.style.setProperty('--reveal-delay', `${Math.min(textStagger * 55, 260)}ms`);
469+
textStagger += 1;
470+
}
471+
}
472+
473+
let blockStagger = 0;
474+
for (const target of blockTargets) {
475+
if (!target.classList.contains('reveal-block')) {
476+
target.classList.add('reveal-block');
477+
target.style.setProperty('--reveal-delay', `${Math.min(blockStagger * 70, 320)}ms`);
478+
blockStagger += 1;
475479
}
476480
}
477481

0 commit comments

Comments
 (0)