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.
- package/README.md +35 -35
- package/dist/cli/index.js +8 -8
- package/dist/server/preview.js +73 -73
- package/dist/shared/design.js +2 -0
- package/dist/ui/index.html +11 -11
- package/package.json +44 -44
- package/skill/dreative/DESIGN.md +387 -358
- package/skill/dreative/SKILL.md +108 -108
- package/skill/dreative/skills/3d.md +134 -131
- package/skill/dreative/skills/cinematic.md +171 -0
- package/skill/dreative/skills/immersive.md +217 -0
- package/skill/dreative/skills/interaction.md +129 -126
- package/skill/dreative/skills/motion.md +137 -125
- package/dist/server/ai.js +0 -177
|
@@ -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.
|