dreative 0.4.0 → 0.5.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/server/ai.js +177 -0
- package/dist/server/preview.js +73 -73
- package/dist/ui/index.html +11 -11
- package/package.json +1 -1
- package/skill/dreative/DESIGN.md +25 -1
- package/skill/dreative/PLAN.md +201 -143
- package/skill/dreative/SKILL.md +2 -2
- package/skill/dreative/skills/cinematic.md +232 -232
- package/skill/dreative/skills/immersive.md +223 -223
- package/skill/dreative/skills/media.md +216 -216
- package/skill/dreative/skills/mobile.md +117 -117
- package/skill/dreative/skills/refined.md +102 -102
- package/skill/dreative/skills/ux.md +144 -144
|
@@ -1,232 +1,232 @@
|
|
|
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 — the
|
|
62
|
-
full media-plane pattern, video textures, and the wired fallback rule live in
|
|
63
|
-
`media.md` §3. When a video-generation tool exists, the pre-rendered-loop
|
|
64
|
-
budget path (§6) becomes first-class: generate the sim-like loop instead of
|
|
65
|
-
building the GPGPU sim (media.md §1).
|
|
66
|
-
|
|
67
|
-
## 2. Interaction vocabulary
|
|
68
|
-
|
|
69
|
-
The genre replaces "click around a document" with deliberate, weighty gestures.
|
|
70
|
-
Pick 2-3, execute perfectly:
|
|
71
|
-
|
|
72
|
-
- **Drag to explore**: the primary surface pans on drag (inertia + rubber-band
|
|
73
|
-
edges, damped) across a spatial arrangement of works. Cursor label says
|
|
74
|
-
"Drag"; a minimap/index shows position. Wheel/trackpad maps to the same pan.
|
|
75
|
-
ALWAYS pair with a conventional index list (the numbered menu) — drag is the
|
|
76
|
-
scenic route, never the only route.
|
|
77
|
-
- **Click & hold**: press-and-hold to enter a project / reveal a layer — a ring
|
|
78
|
-
or bar fills during the hold (400-700ms), releasing early cancels with a
|
|
79
|
-
spring-back. Label it ("Hold"). Keyboard equivalent: Enter activates
|
|
80
|
-
immediately — the hold is texture for pointer users, not a gate.
|
|
81
|
-
- **Velocity-reactive media**: scroll/drag velocity feeds shader intensity —
|
|
82
|
-
images stretch, RGB channels split for a beat, grain agitates — settling with
|
|
83
|
-
damped decay. Read velocity from Lenis/`useScroll`; clamp hard: peak effect at
|
|
84
|
-
a fast flick should still be legible.
|
|
85
|
-
- **Cursor as instrument**: single dot that morphs into contextual labels
|
|
86
|
-
("Drag", "Hold", "Play", index numbers). In this genre the cursor may also
|
|
87
|
-
cast light — the surface (§1) brightens around it. One cursor identity,
|
|
88
|
-
fine-pointer devices only.
|
|
89
|
-
- **Idle cinematography**: after ~10s idle the scene performs — slow camera
|
|
90
|
-
drift, sim breathing, a highlight reel. Any input snaps back (damped, 300ms).
|
|
91
|
-
|
|
92
|
-
## 3. Sound design (optional layer, genre-native)
|
|
93
|
-
|
|
94
|
-
The only web genre where audio is expected — still strictly opt-in:
|
|
95
|
-
|
|
96
|
-
- Entry gate offers the choice up front ("Enter with sound / without") or an
|
|
97
|
-
always-visible mute toggle in the HUD (animated equalizer bars = the
|
|
98
|
-
convention). NEVER autoplay audio; browsers block it and users hate it.
|
|
99
|
-
- One ambient loop (-30dB-ish, long crossfaded loop) + micro-SFX on primary
|
|
100
|
-
interactions only (hover tick, hold-complete, transition whoosh). Web Audio
|
|
101
|
-
API with a master gain; fade in/out over 400ms on toggle, duck during video.
|
|
102
|
-
- Persist the choice (localStorage), default OFF on return visits unless
|
|
103
|
-
enabled; respect `prefers-reduced-motion` as a proxy for "calm mode" — start
|
|
104
|
-
muted there.
|
|
105
|
-
|
|
106
|
-
## 4. Composition & transitions in this register
|
|
107
|
-
|
|
108
|
-
- Views compose like film frames: subject off-center (rule-of-thirds), type in
|
|
109
|
-
the negative space, numbered label anchoring a corner. Symmetric centered
|
|
110
|
-
compositions only for title-card moments.
|
|
111
|
-
- Route transitions are CUTS and DISSOLVES driven by the surface: the sim
|
|
112
|
-
swallows the view (fluid floods, particles disperse) → beat at full abstraction
|
|
113
|
-
(~200ms, the surface alone) → next view condenses out of it. The simulation is
|
|
114
|
-
the transition medium — no white flashes, no generic slide-wipes on top of it.
|
|
115
|
-
- Section changes within a view: crossfade + parallax nudge, ≤ 500ms; let the
|
|
116
|
-
surface do the drama, keep DOM motion quiet (this genre's DOM moves LESS than
|
|
117
|
-
a normal site's — contrast is what reads as expensive).
|
|
118
|
-
- The loader (immersive.md §2 rules apply) is minimal here: percentage numeral +
|
|
119
|
-
the sim warming up behind it. The sim visibly "becoming ready" IS the loader.
|
|
120
|
-
|
|
121
|
-
## 5. Performance & accessibility (non-negotiable, hardest here)
|
|
122
|
-
|
|
123
|
-
All of 3d.md §7 and immersive.md §6, plus:
|
|
124
|
-
|
|
125
|
-
- GPGPU sims are the most expensive thing on the web: cap sim resolution
|
|
126
|
-
(fluid ≤ 256², particles per device tier), halve on mobile or replace the sim
|
|
127
|
-
with a pre-rendered video loop of it — visually near-identical, free to play.
|
|
128
|
-
- Measure, don't assume: if frame time > 20ms for a sustained burst, degrade
|
|
129
|
-
live (drop sim resolution → drop post-FX → static grade). Build the ladder in.
|
|
130
|
-
- `prefers-reduced-motion`: sim frozen to one still frame (it's the grade's
|
|
131
|
-
texture now), velocity effects off, hold-to-enter becomes click, idle
|
|
132
|
-
cinematography off. The site must remain fully usable and still look graded.
|
|
133
|
-
- Contrast discipline: dark register makes AA failures easy — body text ≥ 4.5:1
|
|
134
|
-
against the DARKEST point of the animated surface behind it (test the worst
|
|
135
|
-
frame, not the average); put text over a stabilized scrim when the sim is busy.
|
|
136
|
-
- Every drag/hold/spatial interaction has a boring equivalent: real links in the
|
|
137
|
-
numbered index, tab order through works, Enter to open. Screen readers get the
|
|
138
|
-
DOM document; the canvas is `role="img"` with a scene description.
|
|
139
|
-
- Battery/data respect: pause everything on `visibilitychange`, honor
|
|
140
|
-
`prefers-reduced-data` by skipping the sim entirely (grade + posters only).
|
|
141
|
-
|
|
142
|
-
## 6. Recipes
|
|
143
|
-
|
|
144
|
-
- **UNSEEN-style studio home** (verified on the live site): letter-cycling
|
|
145
|
-
loader (the wordmark's letters flip one at a time over the studio's one-line
|
|
146
|
-
bio) → entry gate ("Enter" pill + quieter "ENTER WITHOUT AUDIO" underneath) →
|
|
147
|
-
a pastel 3D room half-flooded with reflective water; drag pans the view and
|
|
148
|
-
reveals chrome/reflective 3D display type STANDING IN the scene (italic serif
|
|
149
|
-
+ grotesk mixed in one headline), mirrored in the water. Scrolling dollies the
|
|
150
|
-
camera forward through the room into a bright gallery hall — hero and works
|
|
151
|
-
index are one continuous camera journey, with the route updating mid-flight.
|
|
152
|
-
Work cards render as sheets of paper floating in the space, subtly warped,
|
|
153
|
-
with chromatic fringing at their edges; filter pills carry counts (All 20 /
|
|
154
|
-
Branding 5…); butterfly/petal particles drift through; HUD = wordmark
|
|
155
|
-
top-left, Index/Projects/Contact top-right, globe "world" button bottom-center,
|
|
156
|
-
© year bottom-right. Heavy uniform film grain glues all of it together.
|
|
157
|
-
- **Single-flower lab page (verified on unseen.co/labs/blossom)**: the minimal
|
|
158
|
-
form of the genre — one WebGL subject (a blooming particle flower) on one
|
|
159
|
-
canvas, Lenis smooth scroll, headlines split into `overflow-hidden` line
|
|
160
|
-
masks (`splittext--line`) sliding up on arrival, and a two-family type system
|
|
161
|
-
(light serif with true italics — SangBleu-style — mixed into a neutral
|
|
162
|
-
grotesk). No drag, no sound, no HUD maximalism: one subject + line-mask type
|
|
163
|
-
+ smooth scroll already reads as the genre. Start here; add §2 gestures only
|
|
164
|
-
if the brief earns them. (unseen.co's own home additionally runs a
|
|
165
|
-
`webgl-rain` particle layer over the scene — weather as grade texture.)
|
|
166
|
-
- **Particle identity page**: brand mark as 50k particles that disperse on
|
|
167
|
-
pointer force and reform; sections change the formation target; scroll
|
|
168
|
-
velocity agitates; reduced-motion = the formed mark as a still.
|
|
169
|
-
- **Cinematic case study**: dark editorial page, media rendered through the
|
|
170
|
-
distortion layer, velocity-reactive stretch on scroll, chapter numerals,
|
|
171
|
-
one raymarched-light hero; DOM otherwise quiet and typographic.
|
|
172
|
-
- **Budget version (no GPGPU)**: pre-rendered fluid/particle video loops as
|
|
173
|
-
background + `mix-blend-mode` type, CSS grain, velocity-reactive transforms
|
|
174
|
-
on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
|
|
175
|
-
the right call below motion dial 8 or on content-heavy sites.
|
|
176
|
-
|
|
177
|
-
## 6.5 The unseen.co replication blueprint (build order)
|
|
178
|
-
|
|
179
|
-
When the brief is "make it like unseen.co" (or this genre at dial 9–10), build
|
|
180
|
-
in THIS order — each layer works before the next starts. Do not attempt it as
|
|
181
|
-
one monolithic rewrite; do not stop after step 2 and call it done.
|
|
182
|
-
|
|
183
|
-
**Manifest:** `npm i gsap lenis three @react-three/fiber @react-three/drei
|
|
184
|
-
@react-three/postprocessing` (React) or `gsap lenis three` (vanilla/OGL).
|
|
185
|
-
Wire Lenis + ScrollTrigger per motion.md §8 first.
|
|
186
|
-
|
|
187
|
-
**Layer stack (bottom → top):** persistent WebGL canvas (fixed, full-viewport)
|
|
188
|
-
→ real DOM content (the accessible document) → HUD chrome (fixed corners) →
|
|
189
|
-
grain overlay → custom cursor. Each is its own component/layer mounted in the
|
|
190
|
-
root layout, outside the router swap point (immersive.md §1).
|
|
191
|
-
|
|
192
|
-
1. **Smooth scroll + type system.** Lenis running, line-mask reveals on every
|
|
193
|
-
heading (motion.md §8), the two-family type mix (grotesk + true-italic
|
|
194
|
-
serif accents in one headline), numbered HUD chrome (`01 Index`…). The page
|
|
195
|
-
should already feel 60% of the genre with zero WebGL.
|
|
196
|
-
2. **The living surface.** One canvas, one simulation family (§1). Start with
|
|
197
|
-
the highest effort/impact ratio: a shader plane with fbm + domain-warp fed
|
|
198
|
-
by palette uniforms and damped `uMouse` velocity (3d.md §4), or the
|
|
199
|
-
pre-rendered-video budget path (§6). Grain overlay goes in now — it glues
|
|
200
|
-
DOM and canvas into one graded image.
|
|
201
|
-
3. **Scroll = camera.** Tall scroll container drives a camera dolly / scene
|
|
202
|
-
progress via damped scrub (immersive.md §4). Section copy floats in at
|
|
203
|
-
progress stops. This is the "one continuous shot" that separates the genre
|
|
204
|
-
from a parallax page.
|
|
205
|
-
4. **Media through the surface.** Sync DOM image/work-card rects to texture
|
|
206
|
-
planes in the canvas (measure with `getBoundingClientRect` on resize +
|
|
207
|
-
scroll, don't guess) so hover/velocity distortion touches them; keep the
|
|
208
|
-
real DOM images underneath for a11y/fallback (§1). Velocity-reactive
|
|
209
|
-
stretch/RGB-split on scroll flicks, hard-clamped (§2).
|
|
210
|
-
5. **Gestures + cursor.** Pick 2–3 from §2 (drag-to-explore, click & hold,
|
|
211
|
-
cursor-as-instrument), each labeled, each with a keyboard/boring
|
|
212
|
-
equivalent. Custom cursor: one dot, damped follow, contextual labels.
|
|
213
|
-
6. **Doors and passages.** Preloader (real progress, choreographed reveal into
|
|
214
|
-
the idling scene — immersive.md §2), entry gate if sound ships (§3), route
|
|
215
|
-
transitions driven by the simulation (§4).
|
|
216
|
-
7. **The floor.** Reduced-motion still frame, degrade ladder, contrast scrim,
|
|
217
|
-
mobile strategy (poster or halved sim), pause on hidden (§5).
|
|
218
|
-
|
|
219
|
-
Ship checkpoint after every layer: run it, screenshot it, READ THE CONSOLE,
|
|
220
|
-
click through it (ux.md §7's audit on the touched surface), keep it working.
|
|
221
|
-
A failed step 4 must not take down steps 1–3 — each layer's fallback is the
|
|
222
|
-
previous layer, and the runtime gate (DESIGN.md §12.18) runs on the final
|
|
223
|
-
stack, not just the last layer added.
|
|
224
|
-
|
|
225
|
-
## 7. Changing an existing site into this
|
|
226
|
-
|
|
227
|
-
Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
|
|
228
|
-
page — it needs the canvas surface, the reduced composition, and usually a
|
|
229
|
-
content edit (views hold less). Use DESIGN.md §11's transformation-depth ladder;
|
|
230
|
-
this genre is almost always rung 3 (Restructure) or 4 (Reimagine). Offer the
|
|
231
|
-
ladder, get the user's pick, then rebuild for real — and offer the budget recipe
|
|
232
|
-
(§6) as the rung-2 alternative for users who want the mood without the rebuild.
|
|
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 — the
|
|
62
|
+
full media-plane pattern, video textures, and the wired fallback rule live in
|
|
63
|
+
`media.md` §3. When a video-generation tool exists, the pre-rendered-loop
|
|
64
|
+
budget path (§6) becomes first-class: generate the sim-like loop instead of
|
|
65
|
+
building the GPGPU sim (media.md §1).
|
|
66
|
+
|
|
67
|
+
## 2. Interaction vocabulary
|
|
68
|
+
|
|
69
|
+
The genre replaces "click around a document" with deliberate, weighty gestures.
|
|
70
|
+
Pick 2-3, execute perfectly:
|
|
71
|
+
|
|
72
|
+
- **Drag to explore**: the primary surface pans on drag (inertia + rubber-band
|
|
73
|
+
edges, damped) across a spatial arrangement of works. Cursor label says
|
|
74
|
+
"Drag"; a minimap/index shows position. Wheel/trackpad maps to the same pan.
|
|
75
|
+
ALWAYS pair with a conventional index list (the numbered menu) — drag is the
|
|
76
|
+
scenic route, never the only route.
|
|
77
|
+
- **Click & hold**: press-and-hold to enter a project / reveal a layer — a ring
|
|
78
|
+
or bar fills during the hold (400-700ms), releasing early cancels with a
|
|
79
|
+
spring-back. Label it ("Hold"). Keyboard equivalent: Enter activates
|
|
80
|
+
immediately — the hold is texture for pointer users, not a gate.
|
|
81
|
+
- **Velocity-reactive media**: scroll/drag velocity feeds shader intensity —
|
|
82
|
+
images stretch, RGB channels split for a beat, grain agitates — settling with
|
|
83
|
+
damped decay. Read velocity from Lenis/`useScroll`; clamp hard: peak effect at
|
|
84
|
+
a fast flick should still be legible.
|
|
85
|
+
- **Cursor as instrument**: single dot that morphs into contextual labels
|
|
86
|
+
("Drag", "Hold", "Play", index numbers). In this genre the cursor may also
|
|
87
|
+
cast light — the surface (§1) brightens around it. One cursor identity,
|
|
88
|
+
fine-pointer devices only.
|
|
89
|
+
- **Idle cinematography**: after ~10s idle the scene performs — slow camera
|
|
90
|
+
drift, sim breathing, a highlight reel. Any input snaps back (damped, 300ms).
|
|
91
|
+
|
|
92
|
+
## 3. Sound design (optional layer, genre-native)
|
|
93
|
+
|
|
94
|
+
The only web genre where audio is expected — still strictly opt-in:
|
|
95
|
+
|
|
96
|
+
- Entry gate offers the choice up front ("Enter with sound / without") or an
|
|
97
|
+
always-visible mute toggle in the HUD (animated equalizer bars = the
|
|
98
|
+
convention). NEVER autoplay audio; browsers block it and users hate it.
|
|
99
|
+
- One ambient loop (-30dB-ish, long crossfaded loop) + micro-SFX on primary
|
|
100
|
+
interactions only (hover tick, hold-complete, transition whoosh). Web Audio
|
|
101
|
+
API with a master gain; fade in/out over 400ms on toggle, duck during video.
|
|
102
|
+
- Persist the choice (localStorage), default OFF on return visits unless
|
|
103
|
+
enabled; respect `prefers-reduced-motion` as a proxy for "calm mode" — start
|
|
104
|
+
muted there.
|
|
105
|
+
|
|
106
|
+
## 4. Composition & transitions in this register
|
|
107
|
+
|
|
108
|
+
- Views compose like film frames: subject off-center (rule-of-thirds), type in
|
|
109
|
+
the negative space, numbered label anchoring a corner. Symmetric centered
|
|
110
|
+
compositions only for title-card moments.
|
|
111
|
+
- Route transitions are CUTS and DISSOLVES driven by the surface: the sim
|
|
112
|
+
swallows the view (fluid floods, particles disperse) → beat at full abstraction
|
|
113
|
+
(~200ms, the surface alone) → next view condenses out of it. The simulation is
|
|
114
|
+
the transition medium — no white flashes, no generic slide-wipes on top of it.
|
|
115
|
+
- Section changes within a view: crossfade + parallax nudge, ≤ 500ms; let the
|
|
116
|
+
surface do the drama, keep DOM motion quiet (this genre's DOM moves LESS than
|
|
117
|
+
a normal site's — contrast is what reads as expensive).
|
|
118
|
+
- The loader (immersive.md §2 rules apply) is minimal here: percentage numeral +
|
|
119
|
+
the sim warming up behind it. The sim visibly "becoming ready" IS the loader.
|
|
120
|
+
|
|
121
|
+
## 5. Performance & accessibility (non-negotiable, hardest here)
|
|
122
|
+
|
|
123
|
+
All of 3d.md §7 and immersive.md §6, plus:
|
|
124
|
+
|
|
125
|
+
- GPGPU sims are the most expensive thing on the web: cap sim resolution
|
|
126
|
+
(fluid ≤ 256², particles per device tier), halve on mobile or replace the sim
|
|
127
|
+
with a pre-rendered video loop of it — visually near-identical, free to play.
|
|
128
|
+
- Measure, don't assume: if frame time > 20ms for a sustained burst, degrade
|
|
129
|
+
live (drop sim resolution → drop post-FX → static grade). Build the ladder in.
|
|
130
|
+
- `prefers-reduced-motion`: sim frozen to one still frame (it's the grade's
|
|
131
|
+
texture now), velocity effects off, hold-to-enter becomes click, idle
|
|
132
|
+
cinematography off. The site must remain fully usable and still look graded.
|
|
133
|
+
- Contrast discipline: dark register makes AA failures easy — body text ≥ 4.5:1
|
|
134
|
+
against the DARKEST point of the animated surface behind it (test the worst
|
|
135
|
+
frame, not the average); put text over a stabilized scrim when the sim is busy.
|
|
136
|
+
- Every drag/hold/spatial interaction has a boring equivalent: real links in the
|
|
137
|
+
numbered index, tab order through works, Enter to open. Screen readers get the
|
|
138
|
+
DOM document; the canvas is `role="img"` with a scene description.
|
|
139
|
+
- Battery/data respect: pause everything on `visibilitychange`, honor
|
|
140
|
+
`prefers-reduced-data` by skipping the sim entirely (grade + posters only).
|
|
141
|
+
|
|
142
|
+
## 6. Recipes
|
|
143
|
+
|
|
144
|
+
- **UNSEEN-style studio home** (verified on the live site): letter-cycling
|
|
145
|
+
loader (the wordmark's letters flip one at a time over the studio's one-line
|
|
146
|
+
bio) → entry gate ("Enter" pill + quieter "ENTER WITHOUT AUDIO" underneath) →
|
|
147
|
+
a pastel 3D room half-flooded with reflective water; drag pans the view and
|
|
148
|
+
reveals chrome/reflective 3D display type STANDING IN the scene (italic serif
|
|
149
|
+
+ grotesk mixed in one headline), mirrored in the water. Scrolling dollies the
|
|
150
|
+
camera forward through the room into a bright gallery hall — hero and works
|
|
151
|
+
index are one continuous camera journey, with the route updating mid-flight.
|
|
152
|
+
Work cards render as sheets of paper floating in the space, subtly warped,
|
|
153
|
+
with chromatic fringing at their edges; filter pills carry counts (All 20 /
|
|
154
|
+
Branding 5…); butterfly/petal particles drift through; HUD = wordmark
|
|
155
|
+
top-left, Index/Projects/Contact top-right, globe "world" button bottom-center,
|
|
156
|
+
© year bottom-right. Heavy uniform film grain glues all of it together.
|
|
157
|
+
- **Single-flower lab page (verified on unseen.co/labs/blossom)**: the minimal
|
|
158
|
+
form of the genre — one WebGL subject (a blooming particle flower) on one
|
|
159
|
+
canvas, Lenis smooth scroll, headlines split into `overflow-hidden` line
|
|
160
|
+
masks (`splittext--line`) sliding up on arrival, and a two-family type system
|
|
161
|
+
(light serif with true italics — SangBleu-style — mixed into a neutral
|
|
162
|
+
grotesk). No drag, no sound, no HUD maximalism: one subject + line-mask type
|
|
163
|
+
+ smooth scroll already reads as the genre. Start here; add §2 gestures only
|
|
164
|
+
if the brief earns them. (unseen.co's own home additionally runs a
|
|
165
|
+
`webgl-rain` particle layer over the scene — weather as grade texture.)
|
|
166
|
+
- **Particle identity page**: brand mark as 50k particles that disperse on
|
|
167
|
+
pointer force and reform; sections change the formation target; scroll
|
|
168
|
+
velocity agitates; reduced-motion = the formed mark as a still.
|
|
169
|
+
- **Cinematic case study**: dark editorial page, media rendered through the
|
|
170
|
+
distortion layer, velocity-reactive stretch on scroll, chapter numerals,
|
|
171
|
+
one raymarched-light hero; DOM otherwise quiet and typographic.
|
|
172
|
+
- **Budget version (no GPGPU)**: pre-rendered fluid/particle video loops as
|
|
173
|
+
background + `mix-blend-mode` type, CSS grain, velocity-reactive transforms
|
|
174
|
+
on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
|
|
175
|
+
the right call below motion dial 8 or on content-heavy sites.
|
|
176
|
+
|
|
177
|
+
## 6.5 The unseen.co replication blueprint (build order)
|
|
178
|
+
|
|
179
|
+
When the brief is "make it like unseen.co" (or this genre at dial 9–10), build
|
|
180
|
+
in THIS order — each layer works before the next starts. Do not attempt it as
|
|
181
|
+
one monolithic rewrite; do not stop after step 2 and call it done.
|
|
182
|
+
|
|
183
|
+
**Manifest:** `npm i gsap lenis three @react-three/fiber @react-three/drei
|
|
184
|
+
@react-three/postprocessing` (React) or `gsap lenis three` (vanilla/OGL).
|
|
185
|
+
Wire Lenis + ScrollTrigger per motion.md §8 first.
|
|
186
|
+
|
|
187
|
+
**Layer stack (bottom → top):** persistent WebGL canvas (fixed, full-viewport)
|
|
188
|
+
→ real DOM content (the accessible document) → HUD chrome (fixed corners) →
|
|
189
|
+
grain overlay → custom cursor. Each is its own component/layer mounted in the
|
|
190
|
+
root layout, outside the router swap point (immersive.md §1).
|
|
191
|
+
|
|
192
|
+
1. **Smooth scroll + type system.** Lenis running, line-mask reveals on every
|
|
193
|
+
heading (motion.md §8), the two-family type mix (grotesk + true-italic
|
|
194
|
+
serif accents in one headline), numbered HUD chrome (`01 Index`…). The page
|
|
195
|
+
should already feel 60% of the genre with zero WebGL.
|
|
196
|
+
2. **The living surface.** One canvas, one simulation family (§1). Start with
|
|
197
|
+
the highest effort/impact ratio: a shader plane with fbm + domain-warp fed
|
|
198
|
+
by palette uniforms and damped `uMouse` velocity (3d.md §4), or the
|
|
199
|
+
pre-rendered-video budget path (§6). Grain overlay goes in now — it glues
|
|
200
|
+
DOM and canvas into one graded image.
|
|
201
|
+
3. **Scroll = camera.** Tall scroll container drives a camera dolly / scene
|
|
202
|
+
progress via damped scrub (immersive.md §4). Section copy floats in at
|
|
203
|
+
progress stops. This is the "one continuous shot" that separates the genre
|
|
204
|
+
from a parallax page.
|
|
205
|
+
4. **Media through the surface.** Sync DOM image/work-card rects to texture
|
|
206
|
+
planes in the canvas (measure with `getBoundingClientRect` on resize +
|
|
207
|
+
scroll, don't guess) so hover/velocity distortion touches them; keep the
|
|
208
|
+
real DOM images underneath for a11y/fallback (§1). Velocity-reactive
|
|
209
|
+
stretch/RGB-split on scroll flicks, hard-clamped (§2).
|
|
210
|
+
5. **Gestures + cursor.** Pick 2–3 from §2 (drag-to-explore, click & hold,
|
|
211
|
+
cursor-as-instrument), each labeled, each with a keyboard/boring
|
|
212
|
+
equivalent. Custom cursor: one dot, damped follow, contextual labels.
|
|
213
|
+
6. **Doors and passages.** Preloader (real progress, choreographed reveal into
|
|
214
|
+
the idling scene — immersive.md §2), entry gate if sound ships (§3), route
|
|
215
|
+
transitions driven by the simulation (§4).
|
|
216
|
+
7. **The floor.** Reduced-motion still frame, degrade ladder, contrast scrim,
|
|
217
|
+
mobile strategy (poster or halved sim), pause on hidden (§5).
|
|
218
|
+
|
|
219
|
+
Ship checkpoint after every layer: run it, screenshot it, READ THE CONSOLE,
|
|
220
|
+
click through it (ux.md §7's audit on the touched surface), keep it working.
|
|
221
|
+
A failed step 4 must not take down steps 1–3 — each layer's fallback is the
|
|
222
|
+
previous layer, and the runtime gate (DESIGN.md §12.18) runs on the final
|
|
223
|
+
stack, not just the last layer added.
|
|
224
|
+
|
|
225
|
+
## 7. Changing an existing site into this
|
|
226
|
+
|
|
227
|
+
Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
|
|
228
|
+
page — it needs the canvas surface, the reduced composition, and usually a
|
|
229
|
+
content edit (views hold less). Use DESIGN.md §11's transformation-depth ladder;
|
|
230
|
+
this genre is almost always rung 3 (Restructure) or 4 (Reimagine). Offer the
|
|
231
|
+
ladder, get the user's pick, then rebuild for real — and offer the budget recipe
|
|
232
|
+
(§6) as the rung-2 alternative for users who want the mood without the rebuild.
|