# Changelog

All notable changes to lucanleung.com are documented here.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

---

## [2.8] — 2026-07-13

### Added
- **Cushion #1 — sticky scroll greeting sequence** (`.v4-cushion--greet`, `home-engine-v4.js` §9). Per `comments-13jul001.md` line 1. One sentence visible at a time. As user scrolls DOWN past this section, current line fades out as next line fades in (opacity + translateY stagger via CSS transitions on `.v4-greet-line.is-active`). Scrolling UP reverses the motion (the scroll-progress math is symmetric, so reverse happens automatically). 6 lines, each occupying one viewport of scroll (600vh total section height + `position: sticky` container pinned to top 100vh).
  - Line 1: `Greetings` (the user explicitly asked for this as the first single word)
  - Line 2: `I'm Lucan.`
  - Line 3: `A neurotechnologist, an engineer, a designer.`
  - Line 4: `Working where minds and machines stop being distinct.`
  - Line 5: `Where the technology disappears — and the person shows up.`
  - Line 6 (hero, enlarged ~2.4×): `Welcome to the work.` — italic serif `clamp(3rem, 7vw, 6rem)` for the dramatic anchor.
  - Background: pure white `#FFFFFF` (replaced the canvas beige `#F8F7F5` per user feedback that beige didn't match the vibe).
- **Cushion label element** (`.v4-cushion-label`) — short 2-5 word sentence above each cushion editorial title (per `comments-13jul001.md` line 4). Small-caps treatment: 0.75rem, 500 weight, 2px tracking, uppercase, dimmed (`--v-text-muted-d` on canvas, `rgba(248,247,245,0.7)` on dark variants). Placed above cushions #2 (`A note on the work`), #3 (`A note on the thesis`), #4 (`A note on the practice`).
- **Right-aligned content variant for cushion #4** (`.v4-cushion-image-content--right`) — flex-column aligned to `align-items: flex-end` + `text-align: right`, max-width 480px, sits in the right half of the 1120px wrap so the skew-bleed + drawing subject dominate the left/center. Per `comments-13jul001.md` line 5.
- **Tall variant for cushion #4** (`.v4-cushion--tall`) — `padding: 14rem 0 !important` (vs the 11rem standard `--expanded` token). Taller section gives the parallax travel more real estate to play out. Per `comments-13jul001.md` line 5 ("increase the height of the section significantly").
- **Sticky greeting JS scroll observer** (`home-engine-v4.js` §9). Computes `scrollProgress` across the 600vh section (not the 100vh sticky viewport), then activates line `floor(progress × 6)`. rAF-gated, passive scroll listener. Honors `prefers-reduced-motion: reduce` (renders only the final hero `Welcome to the work.` line, no scrolling animation).

### Changed
- **Cushion #4 parallax range doubled**: `±40px` → `±80px` (the `(0.5 - progress) * 80` multiplier bumped to `* 160` so the offset amplitude is now ±80px). The pull-up effect on scroll-down now reads more dramatically. Still honors `prefers-reduced-motion: reduce` (parallax disabled, `--parallax-y` pinned to 0). Per `comments-13jul001.md` line 5.
- **Cushion #4 vignette reweighted** — moved darker gradient stops to the right side (70%/85% alpha) so the right-aligned text sits in the cleanest legibility zone. Reversed from prior left-weighted vignette.
- **Cushion #1 background**: canvas beige `#F8F7F5` → pure white `#FFFFFF`. Per `comments-13jul001.md` line 3 the beige didn't match the vibe. White reads as a clean breath after the pure-black hero.
- **`.v4-greet-sticky` `position: sticky` now uses `!important`** — required to override `home-overrides-v4.css` line 60's blanket `.section-inner { position: relative !important }` rule that was silently defeating the sticky context. Diagnostic: `getComputedStyle` reported `position: relative` despite `position: sticky` declared in v4-home.css — specificity + `!important` resolved it.
- **Home-engine-v4.js cache-bust `?v=6` → `?v=7`** (greeting observer + parallax multiplier update).
- **v4-home.css cache-bust `?v=10` → `?v=13`** (greeting CSS rewrite + cushion label + right-align variant + tall variant + sticky `!important` + mobile overrides).

### Answered (no code changes — comments that were design questions, not requests)
- **Comment #2 (fonts)**: cushion titles + descriptions already use Helvetica Neue (matching the rest of the homepage). Caption on cushion #4 is Times New Roman serif italic — same serif tradition as the existing sage pullquotes. Documented in the inline CSS comments + this changelog; no change to font stack.
- **Comment #3 (color sequence)**: cushion color sequence is `#1 white → #2 charcoal #232323 → #3 canvas beige #F8F7F5 → #4 image bg`. Adjacent sections: hero `#000` / caps `#F8F7F5` / gallery `#F8F7F5` / sage dark video / connect `#0A0A0A` / band `#333` / footer `#232323`. The charcoal cushion #2 reads as a dark tonal pivot between two canvas sections. The only user-flagged issue was the beige on cushion #1 (since changed to white); cushions #3 remains beige because it sits between two darker/kinetic sections (gallery rail + dark sage video) and the beige reads as a deliberate breath.

### Known Issues
- Greeting copy is 6 lines of draft content. Easy to swap any line — they're plain text in `index-v4.html` lines ~88-93 (`data-greet-step` 0..5).
- Sticky greeting scroll behavior verified by sampling: progress 0/0.18/0.45/0.60/0.75/0.92 activates lines 0/1/2/3/4/5 respectively. Reverse scroll mirrors because progress is a function of scrollY. But the actual motion can only be visually confirmed by the user — headless screenshots are static (Playwright can't show the live transition).
- `favicon.ico` returning 404 in console (pre-existing across all variants, benign).
- Related-subject capability card videos not yet produced — `#0A0A0A` placeholders still in use.
- Cinematic scroll chevron still no-op (dormant). Full cinematic engine bytes still preserved in `home-engine-v4-cinematic.js` for future revival.

### Tuning knobs (per comment #5 request to be told where to adjust bg image)
For cushion #4 background image, the relevant code lives in `css/v4-home.css` inside the rule `.v4-cushion-image-bg`:
- `background-size: cover` — change to `contain` to see the entire image without bleeds, or any absolute size (`50%`, `1200px`, etc).
- `background-position: center` — adjust to `top`, `bottom`, `50% 30%`, etc, to reframe.
- `transform: translateX(8%)` — the 8% skew offset (rightward bleed). Increase for more skew (e.g. `15%`), decrease to `0` for no skew, or negative to bleed the other way.
- Parallax range: `js/home-engine-v4.js` §8, the line `const offset = (0.5 - progress) * 160;` — `160` is the multiplier (range ±80px). Change to `* 240` for ±120px, etc.

---

## [2.7] — 2026-07-12

### Added
- **Cushion #1 scroll-revealed greeting sequence** (`.v4-cushion--greet`). Centrally-aligned text sequence — 5 short lines introducing Lucan at the start of the personal website. Each line fades in via IntersectionObserver as user scrolls past. Off-white canvas bg (#F8F7F5 — page main bg, so cushion reads as a clean breath after the pure-black hero). Per `comments-12jul003.md` line 1. Copy: `I'm Lucan.` → `A neurotechnologist, an engineer, a designer.` → `Working where minds and machines stop being distinct.` → `Where the technology disappears — and the person shows up.` → quiet italic sign-off `Welcome to the work.`
- **Cushion #4 scroll parallax** (`.v4-cushion--parallax` + JS handler `home-engine-v4.js` §8). Drawing-7.png full-bleed bg + offside skew offset (`translateX(8%)` — image bleeds 8% off the right edge of the section). As user scrolls DOWN past this section, bg pulls UP via `--parallax-y` CSS variable updated by rAF-gated scroll listener (`±40px` translation range, gated by viewport near-visibility). Scrolling UP reverses the motion. Honors `prefers-reduced-motion: reduce` (parallax disabled, bg stays at neutral). Per `comments-12jul003.md` line 4.
- **Vignette overlay** for cushion #4 (`.v4-cushion-image-vignette`) — linear-gradient weighted to the left for text legibility on the dark-on-dark image. 替代 prior 2-col image-left/text-right layout which broke on viewport width changes (per `comments-12jul003.md` line 4 — explicitly called out as fragile).
- **Parallax bg layer** (`.v4-cushion-image-bg`) — `position: absolute; inset: -10% -10%` so the image is 110% wider than the section with overflow hidden, giving the skew + parallax travel room without exposing edges. Skew + parallax composed into a single `transform` declaration.
- Greeting line element (`.v4-greet-line`) + quiet closing variant (`.v4-greet-line--quiet`) fade-up observer extensions added to `home-engine-v4.js` selector list.

### Changed
- **Cushion #2** (`caps → gallery`: `Selected, not exhaustive.`): copy + CTA preserved, but padding expanded from `7rem` → `11rem` (height grew from 498px → 626px) + background swapped from cream `#F2F0EA` → charcoal `#232323` (Even Realities footer tone from project palette). Text inverted to `--v-text-on-dark` (#F8F7F5). Reads as a dark tonal inversion moment between the pure-black hero above and the canvas gallery below. Per `comments-12jul003.md` line 2.
- **Cushion #3** (`gallery → community`: frontier thesis): copy + treatment preserved (text-only, no image), padding expanded from `7rem` → `11rem` (height grew from 484px → 612px). Per `comments-12jul003.md` line 3 + my recommendation that the frontier thesis should stand alone before the image cushion #4 follows.
- **Cushion #4** (`community → connect`): the prior 2-col `image-left / text-right` layout was REMOVED. New full-bleed background treatment: Drawing-7.png (1920×1080 PNG — confirmed existing) replaces Drawing 4.png as bg image + text overlay with vignette legibility layer. Stable across all viewport widths (per `comments-12jul003.md` line 4: prior 2-col "is easily broken when the window tab size alter"). Padding expanded to `11rem` to match cushions #2 and #3 breathing rhythm.
- **Non-hero button corner radius: 8px → 4px** (per `comments-12jul003.md` line 5). Applied to `.v3-btn-square-light` (sage CTA + cushion CTAs + band CTA), `.v4-btn-light` (connect CTAs), `.v3-btn-square-yellow` + `.v4-btn-yellow` (band CTA). Hero pill buttons (`.v3-btn-pill-solid` + `.v3-btn-pill-ghost`) keep their 40px radius — only chrome buttons below the hero are tightened.
- `home-engine-v4.js` cache-bust `?v=5` → `?v=6` (parallax handler + greeting observer extension).
- `v4-home.css` cache-bust `?v=9` → `?v=10` (cushion ruleset updated for r6).

### Removed
- Prior `.v4-cushion--cream` cushion variant (cushion #2 no longer uses the cream `#F2F0EA` tone — replaced with charcoal `#232323`).
- Prior `.v4-cushion-image-wrap` + `.v4-cushion-image-asset` + `.v4-cushion-image-text` ruleset — replaced with full-bleed bg + content overlay treatment.
- Prior `.v4-bg-cream` root token (no longer referenced anywhere in v4-r6).

### Known Issues
- Drawing-7 bottom-50% crop from r5 is REMOVED — image is now shown full-bleed as-is. Skew offset is the only "offside" framing.
- v4-r6 cushion #1 greeting copy is draft — 5 short lines written to introduce Lucan in the editorial register, awaits user voice approval.
- Parallax scroll handler verified by computed styles (`--parallax-y` variable is readied, transform on bg layer wraps the var). The actual scrolling motion can only be visually confirmed by the user — headless screenshots are static.
- `favicon.ico` returning 404 in console (pre-existing, benign).
- Related-subject capability card videos not yet produced — `#0A0A0A` placeholders still in use.
- Cinematic scroll chevron still no-op (dormant). Full cinematic engine bytes still preserved in `home-engine-v4-cinematic.js` for future revival.

---

## [2.6] — 2026-07-12

### Added
- **3 editorial cushion sections** between every major transition (per v4-r5 spec). Bounded 1120px wrap, medium-bold tile title on top, 2-column description below, optional CTA. Apple-tile / Even-layer register — a deliberate breath between sections instead of a continuous surface.
  - **Cushion #1 (hero → capabilities, `.v4-cushion--canvas`):** title `Where discipline meets curiosity.` + 2-col description + `Read the practice` CTA. Sits between black hero (#000) and canvas capabilities (#F8F7F5) — acts as a tonal step-down.
  - **Cushion #2 (capabilities → gallery, `.v4-cushion--cream`):** title `Selected, not exhaustive.` + 2-col description + `See the work` CTA. Cream tone (#F2F0EA) breaks the otherwise continuous canvas tone of caps + gallery so the cushion reads as a distinct breath.
  - **Cushion #3 (gallery → community, `.v4-cushion--canvas v4-aphorism`):** REPLACES the prior quiet italic one-liner aphorism. Same frontier thesis preserved as the tile title: `The frontier is not the technology itself, but how it disappears into us.` Two columns explicitly unpack the thesis (humbles the technology, settles into instinct). No CTA — sage/community picks up the thread below.
- **Custom image aphorism cushion** sitting in the slot sage #2 used to occupy (community → connect). Drawing 4.png from `images/Connect_Sequence/` cropped to bottom-50%-only — image left, text right, split 1fr 1fr inside the 1120px wrap. Title `From the hand to the habit.` + italic serif caption `Each sketch is a guess about what the user is doing when they are not noticing us. By the time the design ships, the sketch has to disappear too.` Treatment chosen over background-fill because the dense line drawing would fight text legibility (per user-led rationale).
- **Cushion fade-up observer** added to `home-engine-v4.js` — selector list extended to include `.v4-editor-cushion .v4-tile-title`, `.v4-tile-col`, `.v4-tile-cta`, `.v4-cushion-image-title`, `.v4-cushion-image-caption`. Belt-and-braces with global.js (both add `.visible`, both unobserve after firing).
- Canonical 1120px text boundary verified at 1440px across all 4 cushions — `section-inner` left/right edges identical (x=153 → x=1273, width 1120px) with every other section on the page. Zero regression.
- New design token: `--v-bg-cream: #F2F0EA` (slight warmer/darker tone than `--v-bg-canvas: #F8F7F5`) for alternating cushions.

### Changed
- `home-engine-v4.js` cache-bust `?v=4` → `?v=5` (cushion observer extension).
- `v4-home.css` cache-bust `?v=8` → `?v=9` (cushion ruleset appended, ~230 new lines).
- Prior `.v4-aphorism` quiet-italic separator converted into cushion #3 — the aphorism thesis becomes the tile title (preserving the line the user valued) but gains the 2-column description treatment matching the other editorial cushions. Visual register unified.

### Removed
- (none — prior v4-r4-c1 layout intact; only added cushions and converted the aphorism into the editorial-cushion format)

### Known Issues
- v4-r5 cushion copy is draft — title statements + column descriptions are written to match the Cortical/Even editorial register but await user approval.
- Drawing 4 bottom-50% crop is correctness-verified via computed styles (`background-position: bottom`, `transform: translateY(-100%)` on 200%-height asset) but awaits user visual approval (current model can't read images).
- `favicon.ico` returning 404 in console (pre-existing across all variants, benign).
- Related-subject capability card videos not yet produced — `#0A0A0A` placeholders still in use.
- Cinematic scroll chevron still no-op (dormant). Full cinematic engine bytes still preserved in `home-engine-v4-cinematic.js` for future revival.

---

## [2.5] — 2026-07-12

### Added
- **2nd sage band** between sage #1 and Connect (`#outreach-2`, `.v4-sage--video-2`). Antithesis pivot: "Until it becomes us." — single short breakthrough statement, no pullquote, no CTA. Thesis-antithesis rhythm: sage #1 ("Inventing the technology that disappears.") → sage #2 ("Until it becomes us.") → Connect synthesis.
- **"Explore network initiatives" hairline shortcut** beside the sage CTA button. Links to `outreach.html#initiatives`. Restores the original homepage link affordance (per `comments-12jul002.md` line 7).
- v4-r3 section-title statements: `Capabilities.` → `What I do.`, `Gallery.` → `Selected work.`, `Connect.` → `Let's talk.` Short editorial register matching Cortical / Even Realities.
- v4-r3 gallery rail restored to full-bleed kinetic scroll (width: 100vw, escapes 1120px wrap).
- v4-r3 footer column-gap 3rem → 6rem — brand+desc cluster breathes from the 4 link columns.

### Changed
- **Pullquote glyphs stripped** — removed `“`/`”` curly-quote entities and `— Lucan Leung` self-attribution from sage + connect pullquotes (per `comments-12jul002.md` line 4). Self-quotes no longer read as borrowed wisdom; they read as confident statements.
- **Sage stage height 150vh → 100vh** + video coverage shrunk 100% → 80% (`object-fit: cover`). Trims the bloated scroll length so the user sees one clean viewport of sage, not 1.5 viewports of video.
- **Sage text alignment: left → center.** Eyebrow / breakthrough / pullquote / CTA all center-aligned within the 1120px wrap, matching the Connect + band centering established in v4-r3.
- **Connect section padding 8rem → 14rem** top/bot. Doubles breathing room so Connect sits as a deliberate CTA moment between the two sage bands.
- v4-r3: bug where sage band text was rendering 1356px below sage section top (due to v3 reset stripping `position: relative` + overlay `align-items: center` centering across the full 150vh stage). Fixed by re-establishing position contexts + absolutely-positioning `.v4-sage__inner` filling the first 100vh viewport with flex-column centered.
- v4-r3: latent JS bug where `home-engine-v4.js` observer added class `is-in` but CSS uses `.fade-up.visible`. Corrected to `visible`, selector expanded to include sage eyebrow / breakthrough / CTA / connect eyebrow / title / subtitle / CTA / band.

### Removed
- Self-attribution `— Lucan Leung, March 2026` cite from sage pullquote.
- Self-attribution `— Lucan Leung` cite from connect pullquote.
- Curly-quote entities (`&ldquo;` / `&rdquo;`) from all v4 pullquotes.

### Known Issues
- `favicon.ico` returning 404 in console (pre-existing across all variants, benign).
- Related-subject capability card videos not yet produced — `#0A0A0A` placeholders still in use.
- Cinematic scroll chevron still no-op (dormant). Full cinematic engine bytes still preserved in `home-engine-v4-cinematic.js` for future revival.

---

## [2.4] — 2026-07-11

### Added
- Fourth homepage variant (`index-v4.html`) synthesised from v2/v3 reviews. Static hero by default; opt-in cinematic scroll via chevron.
- 2x2 capabilities bento with meta-thesis card ("Tools for minds that don't yet exist.") alongside three real capability cards.
- Quiet italic-serif aphorism separator between Gallery and Sage band — sets a rhythm break without a separate manifesto section.
- Sage editorial band with cycling canary eyebrow (Inventing → Connecting → Discovering) and attributed pull-quote.
- Italic-serif attributed pull-quote inside Connect section, between title and subtitle.
- Even-style square hairline contact pills in footer (`0px` radius, `-0.3px` tracking).
- "Last updated · view changelog" line in footer meta, linking to this file.
- Four-corner radius policy: cards/gallery items 4px, chrome buttons 0px, hero CTAs 100px pill. Reduces Apple-derivative signature.
- `CHANGELOG.md` itself (this file).

### Changed
- Capabilities section eyebrow restored to `.small-caps` "Core Competencies" (retokenized: 2px tracking, weight 500, uppercase).
- Gallery section eyebrow restored to `.small-caps` "New Ventures".
- Sage band rewrites the function of the dropped manifesto canvas — just a quote, no animation.
- Footer contact pills retooled from rounded inline text links to bordered Even-style squares.
- Dynamic policy below the fold: only gallery hover-dim and card content-reveal (text expand + canary title colour). No scale, no shadow-escalate, no blur.

### Removed
- Italic-serif `.v3-quote-eyebrow` overlines on Capabilities and Gallery sections (too much, per user review).
- `cap1-3.mov` videos in capability cards — replaced with solid `#0A0A0A` placeholders pending related-subject clip production.
- Rotating-squares three.js canvas from the manifesto/sage section.
- Connect image-flickering canvas (image-sequence sync) — relocated to portfolio.html in a future session.
- Outreach `combined.MP4` video stage on the homepage — folded into the sage band.
- Pre-existing `.fade-up` fade-up loops that triggered on already-revealed content.

### Performance
- Initial page weight: ~5MB (v3) → ~40KB (v4) at first paint. Cinematic engine lazy-loads only on chevron click.
- Dropped scripts from initial `<head>`: `three.min.js`, `manifesto-bg.js`. Loaded dynamically on opt-in.

### Known Issues
- `favicon.ico` returning 404 in console (pre-existing across all variants, benign).
- Related-subject capability card videos not yet produced — placeholders in use.

---

## [2.3] — 2026-07-10
- v3 static editorial homepage created as parallel fork (dropped cinematic, added sage band + Even footer + dark announcement band).

## [2.2] — 2026-07-10
- v2 cinematic + retokenized homepage created as parallel fork (same DOM, new design vocabulary overlay).

## [2.1] — 2026-07-09
- Mock-up (`mock-home.html` + `mock-home.css`) authored to validate Cortical Labs + Even Realities reference design language. (Now archived at `references/archive/mock-design/`.)

## [2.0] — 2026-05-22
- Original cinematic homepage shipped. 4200vh scroll-sequence with 80-frame image preload, three.js rotating-squares manifesto canvas, outreach video stage, connect image-flickering canvas.
