# SCROLL_EXPERIENCE.md

## 1. Governing rule

**The scrollbar is a contract.** Native scroll physics everywhere: no hijacking, no pinned scenes, no snap-scrolling on prose, no horizontal sections. Recruiters skim with momentum-flicks; anything that interferes reads as hostile.

## 2. Homepage scroll narrative (desktop)

| Scroll position | What happens | Why |
|---|---|---|
| 0 (load) | Hero static except trace draw (A1) | Decision facts readable instantly |
| 0–120px | Header compresses 72→56px, gains blur backdrop + hairline bottom border (linear-mapped to scroll, not toggled — no pop) | Reclaims space, signals "we're moving" |
| Each section at 20% entry | A2 section arrive, once | Reading rhythm |
| Proof strip enter | Chip dots light in stagger (accent pulse A4) | Draws eye across the four facts |
| Projects enter | Cards rise in 2-stagger; screenshots have 4px max parallax offset relative to card scroll | Depth without gimmick |
| Experience enter | Timeline draw (A8) | Guides top-down reading |
| Contact band enter | No animation — band is high-contrast already | Calm before conversion action |
| Any position | Header CV button + nav always available | ≤1 interaction to CV rule |

Scroll-spy updates nav underline per section. No "back to top" button on homepage (header is sticky; document is ~5 viewports); case studies (longer) get one after 3 viewports, ghost-style, bottom-right.

## 3. Case-study scroll

- Mini-TOC (≥1200px) tracks reading position with an accent tick; no progress bars (this is a document, not an article funnel — but see next point).
- Long-form sections use generous `space-9` rhythm; architecture diagram gets full-width breakout (max 1200px) beyond the 72ch prose measure.
- Images lazy-load 1 viewport ahead with aspect-locked skeletons — **zero cumulative layout shift** is a hard requirement.
- Section anchors offset by header height + 24px; anchor links in TL;DR jump correctly.

## 4. Mobile scroll

- No parallax, no scroll-linked header compression (fixed 56px slim header from the start); section reveals still fire (opacity-dominant).
- Sticky elements budget: header only. No sticky CTAs covering content (thumb-reach conversion handled by the contact band + header CV icon-button).
- Overscroll behaviour default; PWA-style rubber-banding untouched.
- Gallery swipe is the only horizontal gesture, clearly contained inside the lightbox.

## 5. Deep-link & restoration behaviour

- Anchor navigation (nav click, TOC, TL;DR links): smooth scroll 400ms max — distance-capped so cross-page-length jumps don't take seconds; reduced motion → instant.
- Back/forward restores scroll position (browser default — do not fight it).
- Language switch preserves scroll ratio where section structure matches (A7); if the target page differs structurally, land at top of the equivalent section rather than a mismatched pixel offset.

## 6. Performance constraints on scroll effects

- All scroll-linked effects (header compression, spy, reveals) via passive observers/transforms — no scroll-handler layout reads (jank = instant credibility loss with P2).
- Reveal thresholds via IntersectionObserver semantics (conceptually); everything degrades to "visible" when JS is absent — **content is never gated behind scroll animation.**
