dreative 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,171 @@
1
+ # Dreative Specialist Skill — Cinematic WebGL & Experiential Interfaces
2
+
3
+ Load this file when `plan.skills` includes `cinematic`, or the brief/prompt asks
4
+ for a dark cinematic shader-driven look, "sites like unseen.co", drag-to-explore
5
+ navigation, click-and-hold interactions, fluid/particle distortion effects,
6
+ sound design, or "experimental / experiential" interfaces. This is the genre's
7
+ high-fashion end: fewer elements, extreme polish, the interface itself behaves
8
+ like a graded film.
9
+
10
+ It STACKS with `immersive.md` (world architecture — read it when routes/scenes
11
+ are involved) and `3d.md` (shader craft). DESIGN.md still governs type and
12
+ accessibility floors. It is universal — apply directly to any codebase; the
13
+ Dreative editor is optional. This is an OPT-IN aesthetic: propose it only when
14
+ the brief supports it; it is never the default answer to "make it nicer".
15
+
16
+ ## 0. The register: cinematic restraint
17
+
18
+ Where immersive.md builds a place, this genre builds a MOOD. Its rules:
19
+
20
+ - **Atmosphere is the canvas.** Commit to ONE graded atmosphere and grade
21
+ everything into it. Dark cinematic (near-black #0a0a0c-ish base, tinted, never
22
+ pure #000, stage-light falloff on one subject) is the common form — but pale
23
+ worlds are equally genre-valid: UNSEEN's actual site is a blush-pink flooded
24
+ dream-room with prismatic dispersion on its arches and soft daylight. What
25
+ makes it cinematic is not darkness but unity of light: one light temperature,
26
+ one falloff logic, one grain, everything (DOM included) living inside it.
27
+ - **Radical reduction.** Each view holds ONE visual subject + a few lines of
28
+ type + numbered chrome. If a section needs three columns of content, it does
29
+ not belong in this register — move it to a conventional subpage.
30
+ - **Everything is graded.** One post-processing/color pass unifies DOM and
31
+ canvas: film grain (3-6%), subtle vignette, bloom only on emissive accents,
32
+ optional chromatic aberration at transition peaks ONLY (constant CA = broken
33
+ monitor). The grade is one system — define it once, apply globally.
34
+ - **Typography as credits.** Restrained scale (this genre whispers where
35
+ immersive shouts): refined grotesk or editorial serif, generous tracking on
36
+ small mono/small-caps labels, and the signature **numbered index** chrome —
37
+ `01 Index`, `02 Projects`, coordinates, timestamps — laid out like a film
38
+ slate. Big type appears sparingly and is often distorted by the shader layer
39
+ as it passes (see §2).
40
+
41
+ ## 1. The living surface (the genre's engine)
42
+
43
+ The background is not decoration — it's a continuously-running simulation the
44
+ whole interface sits on. One fullscreen canvas, one of these families:
45
+
46
+ - **Fluid distortion** (the UNSEEN signature): GPGPU fluid sim or cheap
47
+ velocity-buffer approximation; pointer movement injects velocity; the field
48
+ distorts whatever sits under it — images, WebGL text copies of the headlines,
49
+ the scene itself. Intensity tuned so idle = near-still, movement = silky wake.
50
+ - **Particle field**: 10k-100k GPU particles (FBO/GPGPU, see 3d.md §5) forming
51
+ a subject — a logo, a face, a landscape — that disperses and reforms on
52
+ interaction or route change. Curl noise for drift; mouse as attractor/repulsor.
53
+ - **Volumetric/raymarched fog + light**: a raymarched or layered-noise volume
54
+ with one light source tracking the pointer or the active section.
55
+
56
+ Rules: ONE simulation per site, palette fed from the page tokens, `uTime` slow
57
+ (3d.md §4), sim pauses off-screen and on `document.hidden`, and pointer force is
58
+ damped — the surface reacts like water, not like a cursor-following gimmick.
59
+ Images/media on the page render INTO the canvas layer (texture planes synced to
60
+ DOM rects — measure, don't guess) so the distortion can touch them; keep real
61
+ DOM (invisible or fallback-visible) underneath for a11y/SEO/selection.
62
+
63
+ ## 2. Interaction vocabulary
64
+
65
+ The genre replaces "click around a document" with deliberate, weighty gestures.
66
+ Pick 2-3, execute perfectly:
67
+
68
+ - **Drag to explore**: the primary surface pans on drag (inertia + rubber-band
69
+ edges, damped) across a spatial arrangement of works. Cursor label says
70
+ "Drag"; a minimap/index shows position. Wheel/trackpad maps to the same pan.
71
+ ALWAYS pair with a conventional index list (the numbered menu) — drag is the
72
+ scenic route, never the only route.
73
+ - **Click & hold**: press-and-hold to enter a project / reveal a layer — a ring
74
+ or bar fills during the hold (400-700ms), releasing early cancels with a
75
+ spring-back. Label it ("Hold"). Keyboard equivalent: Enter activates
76
+ immediately — the hold is texture for pointer users, not a gate.
77
+ - **Velocity-reactive media**: scroll/drag velocity feeds shader intensity —
78
+ images stretch, RGB channels split for a beat, grain agitates — settling with
79
+ damped decay. Read velocity from Lenis/`useScroll`; clamp hard: peak effect at
80
+ a fast flick should still be legible.
81
+ - **Cursor as instrument**: single dot that morphs into contextual labels
82
+ ("Drag", "Hold", "Play", index numbers). In this genre the cursor may also
83
+ cast light — the surface (§1) brightens around it. One cursor identity,
84
+ fine-pointer devices only.
85
+ - **Idle cinematography**: after ~10s idle the scene performs — slow camera
86
+ drift, sim breathing, a highlight reel. Any input snaps back (damped, 300ms).
87
+
88
+ ## 3. Sound design (optional layer, genre-native)
89
+
90
+ The only web genre where audio is expected — still strictly opt-in:
91
+
92
+ - Entry gate offers the choice up front ("Enter with sound / without") or an
93
+ always-visible mute toggle in the HUD (animated equalizer bars = the
94
+ convention). NEVER autoplay audio; browsers block it and users hate it.
95
+ - One ambient loop (-30dB-ish, long crossfaded loop) + micro-SFX on primary
96
+ interactions only (hover tick, hold-complete, transition whoosh). Web Audio
97
+ API with a master gain; fade in/out over 400ms on toggle, duck during video.
98
+ - Persist the choice (localStorage), default OFF on return visits unless
99
+ enabled; respect `prefers-reduced-motion` as a proxy for "calm mode" — start
100
+ muted there.
101
+
102
+ ## 4. Composition & transitions in this register
103
+
104
+ - Views compose like film frames: subject off-center (rule-of-thirds), type in
105
+ the negative space, numbered label anchoring a corner. Symmetric centered
106
+ compositions only for title-card moments.
107
+ - Route transitions are CUTS and DISSOLVES driven by the surface: the sim
108
+ swallows the view (fluid floods, particles disperse) → beat at full abstraction
109
+ (~200ms, the surface alone) → next view condenses out of it. The simulation is
110
+ the transition medium — no white flashes, no generic slide-wipes on top of it.
111
+ - Section changes within a view: crossfade + parallax nudge, ≤ 500ms; let the
112
+ surface do the drama, keep DOM motion quiet (this genre's DOM moves LESS than
113
+ a normal site's — contrast is what reads as expensive).
114
+ - The loader (immersive.md §2 rules apply) is minimal here: percentage numeral +
115
+ the sim warming up behind it. The sim visibly "becoming ready" IS the loader.
116
+
117
+ ## 5. Performance & accessibility (non-negotiable, hardest here)
118
+
119
+ All of 3d.md §7 and immersive.md §6, plus:
120
+
121
+ - GPGPU sims are the most expensive thing on the web: cap sim resolution
122
+ (fluid ≤ 256², particles per device tier), halve on mobile or replace the sim
123
+ with a pre-rendered video loop of it — visually near-identical, free to play.
124
+ - Measure, don't assume: if frame time > 20ms for a sustained burst, degrade
125
+ live (drop sim resolution → drop post-FX → static grade). Build the ladder in.
126
+ - `prefers-reduced-motion`: sim frozen to one still frame (it's the grade's
127
+ texture now), velocity effects off, hold-to-enter becomes click, idle
128
+ cinematography off. The site must remain fully usable and still look graded.
129
+ - Contrast discipline: dark register makes AA failures easy — body text ≥ 4.5:1
130
+ against the DARKEST point of the animated surface behind it (test the worst
131
+ frame, not the average); put text over a stabilized scrim when the sim is busy.
132
+ - Every drag/hold/spatial interaction has a boring equivalent: real links in the
133
+ numbered index, tab order through works, Enter to open. Screen readers get the
134
+ DOM document; the canvas is `role="img"` with a scene description.
135
+ - Battery/data respect: pause everything on `visibilitychange`, honor
136
+ `prefers-reduced-data` by skipping the sim entirely (grade + posters only).
137
+
138
+ ## 6. Recipes
139
+
140
+ - **UNSEEN-style studio home** (verified on the live site): letter-cycling
141
+ loader (the wordmark's letters flip one at a time over the studio's one-line
142
+ bio) → entry gate ("Enter" pill + quieter "ENTER WITHOUT AUDIO" underneath) →
143
+ a pastel 3D room half-flooded with reflective water; drag pans the view and
144
+ reveals chrome/reflective 3D display type STANDING IN the scene (italic serif
145
+ + grotesk mixed in one headline), mirrored in the water. Scrolling dollies the
146
+ camera forward through the room into a bright gallery hall — hero and works
147
+ index are one continuous camera journey, with the route updating mid-flight.
148
+ Work cards render as sheets of paper floating in the space, subtly warped,
149
+ with chromatic fringing at their edges; filter pills carry counts (All 20 /
150
+ Branding 5…); butterfly/petal particles drift through; HUD = wordmark
151
+ top-left, Index/Projects/Contact top-right, globe "world" button bottom-center,
152
+ © year bottom-right. Heavy uniform film grain glues all of it together.
153
+ - **Particle identity page**: brand mark as 50k particles that disperse on
154
+ pointer force and reform; sections change the formation target; scroll
155
+ velocity agitates; reduced-motion = the formed mark as a still.
156
+ - **Cinematic case study**: dark editorial page, media rendered through the
157
+ distortion layer, velocity-reactive stretch on scroll, chapter numerals,
158
+ one raymarched-light hero; DOM otherwise quiet and typographic.
159
+ - **Budget version (no GPGPU)**: pre-rendered fluid/particle video loops as
160
+ background + `mix-blend-mode` type, CSS grain, velocity-reactive transforms
161
+ on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
162
+ the right call below motion dial 8 or on content-heavy sites.
163
+
164
+ ## 7. Changing an existing site into this
165
+
166
+ Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
167
+ page — it needs the canvas surface, the reduced composition, and usually a
168
+ content edit (views hold less). Use DESIGN.md §11's transformation-depth ladder;
169
+ this genre is almost always rung 3 (Restructure) or 4 (Reimagine). Offer the
170
+ ladder, get the user's pick, then rebuild for real — and offer the budget recipe
171
+ (§6) as the rung-2 alternative for users who want the mood without the rebuild.
@@ -0,0 +1,217 @@
1
+ # Dreative Specialist Skill — Immersive Worlds & Spatial Transitions
2
+
3
+ Load this file when `plan.skills` includes `immersive`, or the brief/prompt asks
4
+ for an "award-site" feel, a site that behaves like a world/scene/space, spatial or
5
+ 3D page transitions, "sites like epic.net / Awwwards winners", scroll-as-journey,
6
+ or "make it feel like an experience, not a webpage". This is the genre young
7
+ studios and portfolios use to signal craft: the page is a continuous SPACE the
8
+ visitor travels through, not a stack of sections.
9
+
10
+ It EXTENDS DESIGN.md (register, type, color still apply) and STACKS with
11
+ `motion.md` (timing vocabulary) and `3d.md` (WebGL craft) — read those too when
12
+ listed. This file is about the architecture and choreography that makes a site
13
+ read as one continuous world. It is universal: apply it to any codebase or
14
+ framework directly; the Dreative editor is never required.
15
+
16
+ ## 0. Commit to the genre or don't enter it
17
+
18
+ Immersive is a REGISTER, not a garnish. A normal marketing page with one fancy
19
+ transition reads as broken; a world with one static utility page reads as
20
+ intentional. Decide up front:
21
+
22
+ - **Earns it**: portfolios, studios/agencies, campaign and launch sites, brand
23
+ storytelling, exhibitions, games/entertainment — anywhere the site IS the proof
24
+ of craft and visitors expect to explore.
25
+ - **Doesn't**: dashboards, docs, e-commerce checkout, anything task-first.
26
+ Product register (DESIGN.md §1) hard-caps this genre to a hero moment.
27
+ - The genre demands a **spatial metaphor** named in one sentence before any code:
28
+ "each project is a room off a corridor", "scroll descends through a tower",
29
+ "the cursor is a flashlight over an archive", "works float in a void you orbit".
30
+ No metaphor = you'll produce disconnected effects. The metaphor decides what
31
+ transitions, camera moves, and layout make sense — everything below serves it.
32
+ - Immersive sites still need an **escape hatch**: visible menu with plain links,
33
+ working back button, deep-linkable routes. Lost visitors close tabs.
34
+
35
+ ## 1. Architecture: one persistent stage
36
+
37
+ The defining trait of this genre is that navigation doesn't feel like page loads
38
+ — the world persists and the camera/content moves. Structure the app accordingly:
39
+
40
+ - **App shell + stage**: one persistent layer (WebGL canvas, fixed background
41
+ scene, or shared layout chrome) mounted OUTSIDE the router's swap point. Routes
42
+ change the DOM content layer; the stage transitions continuously underneath.
43
+ React: canvas in the root layout, never inside a page component. Vanilla/MPA:
44
+ use cross-document View Transitions (`@view-transition { navigation: auto; }`)
45
+ or an SPA-ify layer (barba.js/Taxi.js-style: fetch next page, swap `<main>`,
46
+ play the transition yourself).
47
+ - **Scene manager**: each route/section maps to a named scene state (camera pose,
48
+ palette, fog, active objects). Transitions tween BETWEEN states — never unmount
49
+ scene A and mount scene B. Keep one source of truth
50
+ (`{ route → { cameraPos, lookAt, theme } }`) so transitions are data, not
51
+ scattered code.
52
+ - **State machine for choreography**: preloading → intro → idle → transitioning.
53
+ Input is locked during `transitioning` (ignore clicks, queue at most one). Every
54
+ award-site jank bug is two transitions running at once.
55
+ - URLs stay honest: every "place" in the world has a route; refresh lands you
56
+ there with the scene in the right state (read route on boot, snap camera, skip
57
+ the travel animation).
58
+
59
+ ## 2. The preloader (the genre's front door)
60
+
61
+ Heavy worlds need loading; the genre turns it into the first brand moment.
62
+
63
+ - Show a preloader ONLY if real assets need it (fonts+models+textures > ~1s).
64
+ Faking a 3-second counter on a light page is user-hostile — banned.
65
+ - Real progress: count bytes/items from an asset manifest (`THREE.LoadingManager`
66
+ `onProgress`, or Promise.allSettled over fetches), display as an oversized
67
+ number (tabular-nums) or a filling wordmark — not a spinner.
68
+ - Exit is a choreographed REVEAL, not a fade: counter completes → beat (~200ms) →
69
+ curtain wipe (clip-path/transform panel slide) or mask expansion reveals the
70
+ hero mid-motion (world already idling underneath). The hero entrance and the
71
+ preloader exit are ONE timeline.
72
+ - Cache the visit (`sessionStorage`): returning visitors within a session skip to
73
+ a ≤400ms version. Preloader shows once, not per navigation.
74
+
75
+ ## 3. Spatial transitions (route ↔ route)
76
+
77
+ The signature move: leaving a page feels like traveling, not swapping.
78
+
79
+ Pick per the metaphor — every route pair uses the SAME transition language:
80
+
81
+ - **Camera travel** (persistent WebGL): tween camera along a path to the next
82
+ scene anchor while DOM content of page A exits (fast fade + small offset) and
83
+ page B's content enters after arrival. Travel 600–1200ms; longer feels like a
84
+ loading screen.
85
+ - **Shared-element morph**: the clicked card/image IS the next page's hero.
86
+ Same-doc: Motion `layoutId` or FLIP the element to its new bounds. MPA/simple
87
+ SPA: `view-transition-name` on the pair. This is the highest-value transition
88
+ per line of code — prefer it for list → detail (work index → project page).
89
+ - **Mask/wipe**: full-viewport panel or clip-path (`inset()`/`circle()` from the
90
+ click point) sweeps over A, next route mounts underneath, sweep continues off.
91
+ Two-phase with a color/texture beat at full-cover (~150ms hold) reads as
92
+ premium; a plain crossfade reads as a slideshow.
93
+ - **WebGL texture transition**: page A screenshot/render and page B as two
94
+ textures on a fullscreen plane, shader-blended with a noise/displacement mask
95
+ (see 3d.md §4). For image-heavy portfolios.
96
+
97
+ Rules: exits ≤ 40% of the total; something from A must persist through the
98
+ transition (the stage, a morphing element, the nav) or it's just a fancy reload;
99
+ browser back plays the REVERSE direction (remember last direction); first paint
100
+ on a cold URL never plays a transition.
101
+
102
+ ## 4. Scroll as travel (the world's main axis)
103
+
104
+ In this genre scroll is displacement through space, not document reading:
105
+
106
+ - Map document scroll to world motion: a tall scroll container
107
+ (`height: N * 100vh`) drives camera position along a `CatmullRomCurve3` (or
108
+ layered 2D transforms for a DOM-only world) via damped progress — Lenis +
109
+ ScrollTrigger scrub, or `useScroll` + `useTransform`. The page height IS the
110
+ journey length; native scrollbar, momentum, and a11y keep working. This is how
111
+ you get the "flying through the site" feel WITHOUT scroll-jacking — wheel
112
+ hijacking stays banned (motion.md §3).
113
+ - **Chapters**: divide the journey into named stops (sections). Each chapter owns
114
+ a camera pose + palette shift + one content group. Snap gently
115
+ (`scroll-snap-type: y proximity`, never `mandatory` on long chapters). Expose a
116
+ progress rail / chapter index (dots or numerals, current chapter labeled) —
117
+ spatial sites without one feel endless.
118
+ - Depth cues sell the space: atmospheric fade (fog / opacity by depth), scale +
119
+ blur on far layers, parallax speed ordered by depth (bg slowest), a subtle
120
+ camera sway on idle (≤ 2°, damped). 3–5 depth layers; more reads as soup.
121
+ - Horizontal chapters: translate a wide track from vertical scroll progress
122
+ inside a pinned section (sticky wrapper) — one per page, ≤ 4 viewport-widths.
123
+ - DOM content floats IN the world: copy blocks fade/rise at their chapter,
124
+ anchored to scene positions (drei `<Html>`, or absolutely-positioned blocks
125
+ keyed to progress ranges). Text always real DOM — never baked into textures.
126
+
127
+ ## 5. The dressing: what makes it read "award site"
128
+
129
+ The genre's supporting cast — apply 3–4, not all (checklist-complete = template):
130
+
131
+ - **Oversized display type** as an object in the space: 10–20vw headlines that
132
+ clip, sit behind/in front of the 3D subject (z-sandwiching via two text layers
133
+ or `occlude`), or run off-canvas. Line-mask reveals on arrival (motion.md §4).
134
+ The full-commitment version (unseen.co's hero) puts the headline INSIDE the
135
+ scene as reflective 3D type — chrome material, mirrored in the environment,
136
+ revealed by dragging/panning the world; pair a keep-real-DOM copy underneath
137
+ for a11y/SEO.
138
+ - **Custom cursor**: small dot + trailing ring (damped follow, ~0.15 lerp),
139
+ morphs over interactives (scales up with a label: "View", "Drag", "Play").
140
+ Hide only the visual cursor layer via CSS on fine pointers; touch devices get
141
+ none of it and lose nothing. Magnetic pull on nav/CTAs (interaction.md).
142
+ - **HUD chrome**: fixed corners used as an instrument panel — wordmark top-left,
143
+ menu top-right, chapter index + local time / coordinates bottom corners, mono
144
+ small-caps microtype. The frame stays put while the world moves — it's what
145
+ makes the motion legible.
146
+ - **Fullscreen menu** as a scene: menu button flips a full-viewport overlay with
147
+ oversized nav links (staggered line-mask entrance), hover previews (image or
148
+ scene tint per link). The overlay is part of the world (same palette/texture),
149
+ not a white sheet.
150
+ - **Textural grain**: one fullscreen noise/grain layer (CSS `mask` over an SVG
151
+ turbulence tile or a tiny shader) at 3–6% opacity unifies WebGL and DOM into
152
+ one photographic surface. Cheap, high-impact.
153
+ - **Easter eggs** (epic.net's signature): 1–3 hidden delights — a konami code, a
154
+ clickable mascot, an idle-timeout animation. Never gate content behind them.
155
+
156
+ ## 6. Performance & accessibility (the genre's hard mode)
157
+
158
+ Everything in motion.md §6 and 3d.md §7 applies, plus genre-specific:
159
+
160
+ - Budget the WHOLE experience: ≤ 4–5MB initial including models/fonts; stage
161
+ code lazy-loaded behind the preloader; route content prefetched on hover so
162
+ spatial transitions never wait on network mid-flight.
163
+ - One rAF loop owns the world (scene + cursor + scroll damping share it). Two
164
+ competing loops = the micro-stutter that separates good from great here.
165
+ - `prefers-reduced-motion` gets a REAL alternative, not a broken world: static
166
+ scene per chapter, instant route swaps (crossfade ≤ 200ms), scroll returns to
167
+ plain document reading. Decide this layout up front — retrofitting it is why
168
+ most immersive sites fail the audit.
169
+ - Keyboard path through the world: chapter index and nav focusable, focus moved
170
+ to incoming page's `<h1>`/main after a route transition, skip-link to content
171
+ over the intro. Announce route changes (`aria-live="polite"` region).
172
+ - Low-power fallback ("flat mode"): detect weak GPU/`navigator.deviceMemory`/
173
+ first dropped-frame burst → swap stage for poster art + gradients, keep ALL
174
+ content and transitions-lite. Content is never hostage to the world. Offer the
175
+ same switch as a visible toggle if the brief allows.
176
+ - SEO/no-JS: every route server-renders its real copy; the world enhances it.
177
+
178
+ ## 7. Recipes
179
+
180
+ - **Scroll-dolly index (verified on unseen.co)**: one scroll axis dollies the
181
+ camera from the hero space directly into the works gallery — a bright hall
182
+ whose section heading and filter pills are DOM floating in front of the
183
+ scene, work cards as gently-warped paper planes hovering in depth. The route
184
+ updates mid-journey while the world persists. One continuous shot, zero page
185
+ loads.
186
+ - **Chapter theme inversion (verified on bdsn.club)**: an editorial case-study
187
+ page where each full-viewport project chapter flips the ENTIRE page theme
188
+ (white → black → brand indigo…) as it scrolls in, with an oversized grotesk
189
+ project title and one product render per chapter; HUD (local time top-left,
190
+ CTA top-right, awards rail on the edge) stays fixed through every inversion.
191
+ DOM-only, no WebGL — the spatial feel comes purely from theme travel + scale.
192
+ - **World portfolio**: persistent canvas; works as textured planes arranged in
193
+ depth; scroll flies the camera past them; hover tilts a plane + cursor says
194
+ "View"; click = camera dives to the plane which morphs into the project hero
195
+ (shared-element). Back = reverse flight.
196
+ - **Scene-hopping studio site (epic-style)**: stylized environment as stage;
197
+ each route = a location; nav travels the camera between locations with a
198
+ velocity blur beat; DOM copy floats per location; playful idle animations +
199
+ 1–2 easter eggs; HUD chrome + fullscreen menu.
200
+ - **One-page descent**: 6–8 chapter tall-scroll journey down one axis (tower,
201
+ ocean, timeline); palette darkens/shifts per chapter; progress rail with
202
+ chapter names; ends on a contact "floor" that snaps.
203
+ - **DOM-only spatial site (no WebGL)**: layered `translateZ`-style parallax with
204
+ scale/blur depth cues, View Transitions for shared-element route morphs,
205
+ clip-path wipes, grain overlay, custom cursor, oversized type. 80% of the feel
206
+ at 5% of the cost — the right call below motion dial 8 or without 3D subject
207
+ matter.
208
+
209
+ ## 8. Changing an existing site into this
210
+
211
+ An existing conventional site cannot become immersive through CSS — this genre
212
+ requires the app-shell/stage architecture (§1), which means restructuring markup,
213
+ routing, and component boundaries. Follow DESIGN.md §11's transformation-depth
214
+ ladder: present the depth options, and on user confirmation restructure for real
215
+ — move the router swap point, introduce the stage layer, rebuild sections as
216
+ chapters. Never simulate the genre by decorating the old structure; a restyled
217
+ static page with a custom cursor is the uncanny valley of this genre.