dreative 0.5.0 → 0.5.1
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/dist/cli/index.js +38 -1
- package/package.json +1 -1
- package/skill/dreative/DESIGN.md +181 -14
- package/skill/dreative/PLAN.md +314 -60
- package/skill/dreative/SKILL.md +149 -126
- package/skill/dreative/skills/3d.md +113 -3
- package/skill/dreative/skills/experimental.md +98 -0
- package/skill/dreative/skills/media.md +349 -1
- package/skill/dreative/skills/motion.md +31 -4
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Dreative Specialist Skill — Experimental / Creative-Mindset Dial
|
|
2
|
+
|
|
3
|
+
Load this file when `plan.skills` includes `experimental`, or the brief asks for
|
|
4
|
+
"crazy", "bizarre", "never seen before", "way more creative", "wow factor", or
|
|
5
|
+
stacks award-site ambition with 3d/immersive/cinematic and clearly wants the
|
|
6
|
+
result to go further than a competent, safe execution of those genres.
|
|
7
|
+
|
|
8
|
+
This file is not a genre on its own — it STACKS with `motion.md`, `3d.md`,
|
|
9
|
+
`immersive.md`, `cinematic.md`, `media.md`. It is a mindset correction for a
|
|
10
|
+
specific, recurring failure: builds that hit every named treatment competently
|
|
11
|
+
but still read as *effects placed on a static page* rather than a page that
|
|
12
|
+
*behaves* differently as you move through it. The gap between those two is
|
|
13
|
+
where the top-tier reference sites (PLAN.md's calibration list) actually live.
|
|
14
|
+
|
|
15
|
+
## 0. See the whole scroll, not one frame at a time
|
|
16
|
+
|
|
17
|
+
The most common miss: designing each section as a still composition and then
|
|
18
|
+
bolting particles/parallax onto it, instead of asking what the SAME asset does
|
|
19
|
+
across its entire scroll range.
|
|
20
|
+
|
|
21
|
+
- Before writing a section, sketch its motion as a **timeline, not a pose**:
|
|
22
|
+
what does this look like at scroll 0%, 40%, 100%? An image that is static at
|
|
23
|
+
every one of those points and only has particles drifting in front of it has
|
|
24
|
+
not been treated — the particles are decoration, not behavior.
|
|
25
|
+
- Prefer techniques where the ASSET ITSELF changes: a photo that dissolves into
|
|
26
|
+
its constituent color field and reassembles as a different crop; a product
|
|
27
|
+
render that the camera physically orbits as you scroll, revealing a side you
|
|
28
|
+
hadn't seen; a shader that reads scroll velocity and warps/refracts the media
|
|
29
|
+
plane harder the faster you scroll, settling to true crispness only at rest.
|
|
30
|
+
- Treat interaction inputs (scroll, cursor, drag, time-idle) as free stagehands,
|
|
31
|
+
not one-off triggers: the same input should be able to drive multiple things
|
|
32
|
+
at once (camera position AND grain intensity AND type kerning) so the page
|
|
33
|
+
feels like one system reacting, not independent effects that happen to share
|
|
34
|
+
a page.
|
|
35
|
+
|
|
36
|
+
## 1. Texture and material, not smooth plain geometry
|
|
37
|
+
|
|
38
|
+
A 3D object with default lighting and a flat color material reads as a stock
|
|
39
|
+
asset even when it renders and animates cleanly. Before shipping any custom 3D
|
|
40
|
+
element:
|
|
41
|
+
|
|
42
|
+
- Give it a **material identity**: roughness/metalness maps, a normal map or
|
|
43
|
+
procedural bump (even a cheap noise-driven `onBeforeCompile`/shader tweak),
|
|
44
|
+
fresnel/rim light, or a physically-motivated finish (brushed metal, wet
|
|
45
|
+
ceramic, frosted glass, matte paper) — pick ONE that fits the brand and
|
|
46
|
+
commit, rather than leaving `MeshStandardMaterial` defaults.
|
|
47
|
+
- Light it like a product shot, not a demo scene: a key light + rim light +
|
|
48
|
+
soft fill, an environment map (even a cheap generated HDRI/gradient cubemap)
|
|
49
|
+
for reflections — flat ambient-only lighting is what makes geometry look
|
|
50
|
+
"plain" even when the model is good.
|
|
51
|
+
- If the model IS meant to look clean/minimal (a deliberate register choice),
|
|
52
|
+
say so explicitly in the plan — plainness should be a decision, not the
|
|
53
|
+
default outcome of skipping material work.
|
|
54
|
+
|
|
55
|
+
## 2. Dimension shifts as a real technique, not just camera dolly
|
|
56
|
+
|
|
57
|
+
"Zoom when I scroll" and "go different 3D dimensions and views" point at scroll
|
|
58
|
+
or interaction driving genuine viewpoint change, beyond the immersive.md scroll-
|
|
59
|
+
as-travel camera path:
|
|
60
|
+
|
|
61
|
+
- **Depth dive**: scroll or click zooms PAST the current plane into a nested
|
|
62
|
+
scene (a product card's texture becomes the next section's background at
|
|
63
|
+
full zoom — one continuous zoom, not a cut).
|
|
64
|
+
- **Orbit reveal**: dragging or scroll-linked rotation swings the camera around
|
|
65
|
+
a subject to a genuinely different vantage (front → 3/4 → side), timed to
|
|
66
|
+
reveal new content at each stop rather than just spinning for spectacle.
|
|
67
|
+
- **World swap**: a full scene transition where the "rules" change (palette
|
|
68
|
+
inverts, gravity/particle behavior flips, camera projection shifts from
|
|
69
|
+
perspective to a flattened orthographic beat) — used sparingly, at most once
|
|
70
|
+
or twice per page, as a structural beat (e.g. between "problem" and
|
|
71
|
+
"solution" sections), not as constant novelty.
|
|
72
|
+
- Every dimension shift still obeys immersive.md §3's rule: something must
|
|
73
|
+
persist across the cut (the subject, the camera, a color) or it reads as a
|
|
74
|
+
jarring reload, not a journey.
|
|
75
|
+
|
|
76
|
+
## 3. Budget for one deliberately unusual idea per major section
|
|
77
|
+
|
|
78
|
+
Competent execution of the named treatments is the floor, not the ceiling.
|
|
79
|
+
When the user has opted into `experimental`:
|
|
80
|
+
|
|
81
|
+
- For each blueprint row, after picking its treatment(s), ask "what is the
|
|
82
|
+
ONE non-obvious version of this?" and write it down even if it's risky — a
|
|
83
|
+
gallery that disperses into a particle field and reforms as the next item
|
|
84
|
+
instead of a slide/fade; a form where each correct field entry visibly
|
|
85
|
+
feeds a growing 3D structure; a footer that only fully renders once you've
|
|
86
|
+
scrolled back UP to summon it. Not every idea survives the fallback
|
|
87
|
+
requirement (PLAN.md §2), but the blueprint should contain at least one per
|
|
88
|
+
major section, not zero.
|
|
89
|
+
- Reference sites should be read as **systems to extract principles from**,
|
|
90
|
+
not screenshots to imitate: note what makes their asset behave (a shader
|
|
91
|
+
uniform driven by scroll velocity, a shared depth-of-field across the whole
|
|
92
|
+
scene, type that occludes/is-occluded by 3D subjects) and reapply the
|
|
93
|
+
PRINCIPLE to Northwind/the actual brand — copying their literal palette or
|
|
94
|
+
layout without the underlying system produces exactly the "images still
|
|
95
|
+
static, objects still plain" outcome this file exists to prevent.
|
|
96
|
+
- Every ambitious idea still needs 3d.md §7 / motion.md §6 performance
|
|
97
|
+
budgets and a concrete fallback (PLAN.md §2) — experimental means bolder
|
|
98
|
+
ideas, not exemption from the runtime verification gate.
|
|
@@ -11,6 +11,120 @@ choreographed, distorted, revealed, and lit, never just placed.
|
|
|
11
11
|
|
|
12
12
|
## 0. The doctrine
|
|
13
13
|
|
|
14
|
+
- **The static-placement ban (any dial, whenever this file is loaded).** A
|
|
15
|
+
generated or supplied image dropped in as `background-image`, a full-bleed
|
|
16
|
+
`<img>` behind text, or a card thumbnail with zero behavior is a FAILURE of
|
|
17
|
+
this skill, not a baseline. Every media element ships with at least one
|
|
18
|
+
living quality — an entrance from §2/§2.5 (curtain, strip-slice, pixel/dither
|
|
19
|
+
develop, print develop, fade-sweep…), an idle (loop, drift, ken-burns), or a
|
|
20
|
+
response (hover wake, directional wipe, cursor torch, distortion). "Static on
|
|
21
|
+
purpose" is allowed only when written into the plan blueprint with a reason
|
|
22
|
+
(e.g. evidence screenshots in a refined register). At dial ≥ 8 with a canvas,
|
|
23
|
+
media belongs on media planes (§3) moving in depth — parallax layers, curved
|
|
24
|
+
sheets, velocity distortion — not pasted flat behind the DOM.
|
|
25
|
+
- **Sourced media is media.** Everything in this file applies equally to
|
|
26
|
+
images/video that were generated, supplied by the user, or sourced from
|
|
27
|
+
stock/CDN when no generation tool exists — "we had no image-gen" changes the
|
|
28
|
+
PRODUCTION path (§1), never the treatment obligations. A picsum/stock photo
|
|
29
|
+
dropped in flat is the same failure as a generated one.
|
|
30
|
+
- **The zoom/fade floor is a floor, not a treatment plan.** Fade-in entrances
|
|
31
|
+
plus ken-burns idles on every image = the minimum-compliance page, and at
|
|
32
|
+
motion dial ≥ 6 it FAILS this skill: at that dial, hero + key section
|
|
33
|
+
imagery each need at least one treatment that is scroll- or cursor-DRIVEN
|
|
34
|
+
(curtain synced to type, strip-slice, inner-zoom parallax, directional hover
|
|
35
|
+
wipe, cursor torch, velocity distortion, media plane — §2/§2.5/§3), where
|
|
36
|
+
the visitor's input visibly pushes the media. Ken-burns-everywhere is the
|
|
37
|
+
refined register's budget (refined.md), nobody else's.
|
|
38
|
+
- **One media SET-PIECE per page (dial ≥ 7 / expressive+).** Beyond the
|
|
39
|
+
per-image floors, the page needs one moment where imagery itself IS the
|
|
40
|
+
spectacle — a composed §2.5 exotic (or an invention in its spirit) that a
|
|
41
|
+
visitor would describe to someone else: an image tornado/vortex the scroll
|
|
42
|
+
spins through, a hero that disintegrates into particles as you scroll past,
|
|
43
|
+
a gallery that shatters and reassembles, a melt/liquid exit between
|
|
44
|
+
chapters. Quiet treatments (curtain, parallax, ken-burns) on every image
|
|
45
|
+
with no set-piece = the page failed this skill even though each image
|
|
46
|
+
technically "moves". The set-piece is named in the plan blueprint like a
|
|
47
|
+
signature element, ONE per page as the default (refined register
|
|
48
|
+
may skip with a stated reason). At award-site ambition a SECOND
|
|
49
|
+
set-piece is permitted — never required — when the plan states what the
|
|
50
|
+
page needs it FOR (e.g. an entrance spectacle and a mid-page dive
|
|
51
|
+
serving different chapters), it uses a different mechanism family than
|
|
52
|
+
the first, and the intensity curve places a genuine rest between them;
|
|
53
|
+
two set-pieces back-to-back, or two of the same family, still compete
|
|
54
|
+
and still fail. **At dial ≥ 8 / award tier the set-piece
|
|
55
|
+
must transform the media at PIXEL level** — the image's own content visibly
|
|
56
|
+
changes under scroll/input, not just its placement. Qualifying classes:
|
|
57
|
+
particle/point-grid decomposition, shader displacement/dissolve/melt,
|
|
58
|
+
scroll-scrubbed frame sequences, slice/shatter of the bitmap, live texture
|
|
59
|
+
feedback or refraction, and the §3.5 immersion recipes (portal dive,
|
|
60
|
+
depth-map dive, diorama, particle fly-through, scrub-dive). **At award-site
|
|
61
|
+
ambition the default set-piece IS a §3.5 dive** — one moment where the
|
|
62
|
+
visitor goes INTO an image or video rather than watching it move; choose a
|
|
63
|
+
different pixel-transforming class only when a stated ASSET impossibility is
|
|
64
|
+
recorded in the plan (no depth-capable asset exists AND none can be
|
|
65
|
+
generated — with image-gen available this reason is almost never true, since
|
|
66
|
+
a depth-capable composition can be prompted). Brand fit, taste, or "this
|
|
67
|
+
concept links better" is NOT a valid skip reason: a masked reveal or curtain
|
|
68
|
+
chosen over the dive on preference grounds fails the award-tier check. Choreographing whole rectangles (orbit, collapse,
|
|
69
|
+
card fly-ins, grid reflow) is composition, not a set-piece at this tier —
|
|
70
|
+
it may accompany one, never substitute for it. Evidence at verify: the
|
|
71
|
+
sampled shader uniform / particle count / frame index changing with scroll.
|
|
72
|
+
- **Treatment classes, and a coverage floor at award tier.** Treatments split
|
|
73
|
+
into two classes. QUIET class moves the rectangle or its window: curtain,
|
|
74
|
+
inner-zoom parallax, ken-burns, hover wipe, strip entrance, floating drift.
|
|
75
|
+
PIXEL class changes the image's own content: slice/shatter, particle
|
|
76
|
+
disintegration or assembly, UV distortion/melt/ripple, RGB split, mosaic/
|
|
77
|
+
pixel-assembly, living overlay, cursor torch, depth-map parallax, terrain
|
|
78
|
+
displacement, tornado/vortex, frame scrub, print develop. **At dial ≥ 8 /
|
|
79
|
+
award-site, ONE set-piece is not the whole show: at least half of the
|
|
80
|
+
hero + key section images (minimum 3, set-piece included) carry a
|
|
81
|
+
PIXEL-class treatment, each a DIFFERENT mechanism** — and the HERO image
|
|
82
|
+
is always one of them: the hero is the page's first impression and is
|
|
83
|
+
never the designated rest. Quiet class is
|
|
84
|
+
reserved for the intensity curve's designated rest sections, chosen as
|
|
85
|
+
rests on purpose. "Key image" is MECHANICAL, not discretionary: every
|
|
86
|
+
image that occupies ≥ 25% of the viewport at any scroll position, plus
|
|
87
|
+
the largest image of every blueprint section whose intensity is ≥ 5,
|
|
88
|
+
counts — the denominator is fixed by the blueprint, and reclassifying
|
|
89
|
+
images as "not key" to shrink it is the same self-grading this floor
|
|
90
|
+
exists to stop (a repeated card-grid pattern counts as ONE image for the
|
|
91
|
+
tally, treated uniformly). EXEMPT from the tally: prop/item cutouts —
|
|
92
|
+
transparent-background object images seeded as scene props or product
|
|
93
|
+
shots (§1.5) — which follow §1.5's behavior rules instead; the floor
|
|
94
|
+
governs scenic/editorial imagery, not the objects living in the layout. A page that is one set-piece plus curtains everywhere
|
|
95
|
+
else reads exactly as static as no set-piece at all, and fails this floor.
|
|
96
|
+
(Below dial 8 the §0 zoom/fade-floor and set-piece rules stand unchanged —
|
|
97
|
+
this floor is what "award" buys.)
|
|
98
|
+
- **The perceivability bar: a treatment that reads as zoom/pan doesn't
|
|
99
|
+
count.** Uniforms changing is machine evidence, not human evidence — a
|
|
100
|
+
depth shader at ±2px displacement, an RGB split a hair wide, an exposure
|
|
101
|
+
sweep too slow to catch: all "run" and all read to a visitor as a static
|
|
102
|
+
image or a plain zoom. Every pixel-class treatment must be obvious to a
|
|
103
|
+
stranger watching for 3 seconds: tune amplitude UP until a before/after
|
|
104
|
+
screenshot pair (same element, two scroll/input states) shows an
|
|
105
|
+
unmistakable difference in the image's CONTENT — pieces visibly apart,
|
|
106
|
+
pixels visibly displaced or sorted, particles visibly detached — not
|
|
107
|
+
just framing. If the honest description of what's visible is "it zooms/
|
|
108
|
+
slides a bit," raise the amplitude or swap to a bolder mechanism.
|
|
109
|
+
Subtlety is the refined register's virtue; at award tier it is a bug.
|
|
110
|
+
Mechanism CHOICE is free — dive/depth, fragment (particles, tiles,
|
|
111
|
+
slices, shards, pixel-assembly), distortion (melt, ripple, sort/smear),
|
|
112
|
+
optical (RGB split, torch, develop), scrub — pick what the brand's world
|
|
113
|
+
calls for. Two disciplines on the choice: (a) the page's tally must not
|
|
114
|
+
be all ONE family (a depth-displacement page and a particles-everywhere
|
|
115
|
+
page are equally monotone); (b) across BUILDS, don't reach for the same
|
|
116
|
+
family every time — the choice ledger records each build's set-piece
|
|
117
|
+
family, and repeating the last build's is the reflex the entropy draw
|
|
118
|
+
exists to break. The same bar applies to prop/item cutouts' §1.5 behaviors: a
|
|
119
|
+
prop whose rotation/settle can be mistaken for a static product image
|
|
120
|
+
has failed its dimensional kit — its motion must be readable at a
|
|
121
|
+
glance.
|
|
122
|
+
- **Edit the asset, don't just place it.** Generation is step one; the pipeline
|
|
123
|
+
(§1) continues with real editing — grade/duotone to the palette, crop to the
|
|
124
|
+
blueprint's aspect, cut video to the loop point, extract posters and frame
|
|
125
|
+
sequences, composite masks/mattes (ffmpeg/sharp or your image tools). An
|
|
126
|
+
asset that arrives on the page exactly as the generator emitted it usually
|
|
127
|
+
reads as wallpaper.
|
|
14
128
|
- **No bare media at dial ≥ 7.** Every meaningful image/video gets three
|
|
15
129
|
decisions: an **entrance** (how it arrives — reveal, wipe, materialize), an
|
|
16
130
|
**idle** (what it does at rest — loop, drift, ken-burns, nothing-on-purpose),
|
|
@@ -58,6 +172,70 @@ When the plan calls for generated media, produce it BEFORE section code
|
|
|
58
172
|
A 40MB hero loop fails the plan even if it's beautiful.
|
|
59
173
|
- Textures too: grain tiles, masks, mattes, displacement maps — generate them
|
|
60
174
|
instead of hand-rolling SVG (which is banned, DESIGN.md §7).
|
|
175
|
+
- **Asset manifest (`.dreative/assets.json`) — generation is expensive; never
|
|
176
|
+
pay twice.** Before generating anything, read the manifest; an entry whose
|
|
177
|
+
prompt/aspect/grade matches the need means REUSE the file, don't regenerate.
|
|
178
|
+
After each generation+edit, append one entry:
|
|
179
|
+
`{ "file": "assets/hero-loop.mp4", "kind": "video-loop", "prompt": "<the
|
|
180
|
+
exact generation prompt>", "aspect": "16:9", "grade": "warm tungsten, deep
|
|
181
|
+
green shadows", "poster": "assets/hero-poster.webp", "bytes": 2400000 }`.
|
|
182
|
+
A re-run, a mockup→build transition, or a resumed session regenerates only
|
|
183
|
+
what the manifest doesn't already have.
|
|
184
|
+
|
|
185
|
+
## 1.5 Custom props (isolated compositional elements)
|
|
186
|
+
|
|
187
|
+
Distinct from hero/gallery media (§1-2, which fill a frame): a **prop** is a
|
|
188
|
+
small, isolated object — a single coffee bean, a steam wisp, a leaf, a bottle,
|
|
189
|
+
an icon-scale object — used as scattered COMPOSITION around content, not as
|
|
190
|
+
the content itself. Props are what make a page feel art-directed rather than
|
|
191
|
+
stocked with rectangles; they're cheap to generate/build and reused as a
|
|
192
|
+
recurring motif across sections (the visual equivalent of a signature element,
|
|
193
|
+
motion.md's terms).
|
|
194
|
+
|
|
195
|
+
Two flavors — pick per section from the blueprint, they can mix on one page:
|
|
196
|
+
|
|
197
|
+
- **Cutout image props**: with no image-gen tool, source instead of generate —
|
|
198
|
+
a verified real photo of the subject, matted to transparency (rembg / sharp /
|
|
199
|
+
ImageMagick if available); if no photo source and no matting path exists, the
|
|
200
|
+
prop is cut, never approximated with coded organic geometry (3d.md §3 rung 4).
|
|
201
|
+
When generating: generate on a transparent background — prompt
|
|
202
|
+
explicitly ("isolated on pure transparent background, studio product
|
|
203
|
+
lighting, no backdrop, no shadow baked in") and REQUEST alpha-channel PNG
|
|
204
|
+
output. **Verify the alpha is real**, not a white/checkerboard fill the
|
|
205
|
+
model painted in: sample a corner pixel programmatically or view at 100%
|
|
206
|
+
over a colored backdrop — a prop with a faint white halo is a failed
|
|
207
|
+
generation, regenerate or matte it out (rembg/similar if available). Add a
|
|
208
|
+
drop shadow / contact shadow yourself in CSS (`filter: drop-shadow(...)`),
|
|
209
|
+
never bake it into the generation — a baked shadow breaks when the prop
|
|
210
|
+
moves or the section behind it changes color.
|
|
211
|
+
- **3D props**: when a prop lives inside a WebGL scene, the DEFAULT is still a
|
|
212
|
+
cutout image — on a billboard plane per 3d.md §3 rung 2 (alpha-tested plane,
|
|
213
|
+
parallax + damped rotation + contact shadow), which is photoreal by
|
|
214
|
+
construction. Coded geometry is reserved for ABSTRACT prop shapes (shards,
|
|
215
|
+
ribbons, orbs-as-design-objects) and must carry a real textured material per
|
|
216
|
+
`experimental.md` §1 (generated albedo + bump/roughness map, rim light,
|
|
217
|
+
environment reflection) — never model an organic real object (bean, leaf,
|
|
218
|
+
bottle…) from primitives; 3d.md §3 bans it. Either flavor is reusable: the
|
|
219
|
+
SAME prop instanced multiple times (different scale/rotation) reads as a
|
|
220
|
+
coherent motif, not repetition.
|
|
221
|
+
|
|
222
|
+
Placement and behavior:
|
|
223
|
+
|
|
224
|
+
- Compose as a **floating layer** (§2's floating-media technique) around
|
|
225
|
+
content: corners, margins, trailing a section's edge — never covering the
|
|
226
|
+
content's readable area. 3-6 instances per page is a motif; more reads as
|
|
227
|
+
clutter.
|
|
228
|
+
- Give props real behavior, same floors as any media (§0): idle drift/rotate,
|
|
229
|
+
parallax depth differential, and at least one response (cursor-follow with
|
|
230
|
+
lag, scroll-linked rotation, hover nudge, scatter-and-reform on scroll
|
|
231
|
+
velocity). A prop that just sits pinned in a corner is decoration nobody
|
|
232
|
+
asked for; a prop that visibly reacts is what sells the "crafted" feel.
|
|
233
|
+
- One prop VOCABULARY per page — pick one subject family (all beans/leaves/
|
|
234
|
+
steam, not a random mix of unrelated objects) and one behavior language, the
|
|
235
|
+
same discipline as §0's "one treatment vocabulary" rule.
|
|
236
|
+
- Record each in the asset manifest (§1) with `"kind": "prop-image"` or
|
|
237
|
+
`"kind": "prop-3d"` — props get reused across sections, never regenerated
|
|
238
|
+
per-section.
|
|
61
239
|
|
|
62
240
|
## 2. DOM-tier treatments (no WebGL — the budget vocabulary)
|
|
63
241
|
|
|
@@ -142,10 +320,115 @@ blueprint like a signature element, and stamp it consistently (§0).
|
|
|
142
320
|
- **Shatter/scatter**: media as an instanced tile grid (WebGL) that explodes
|
|
143
321
|
along scroll velocity and reassembles at rest — the §3 plane system with a
|
|
144
322
|
per-instance offset uniform; cap tiles ≤ 400.
|
|
323
|
+
- **Image tornado / vortex**: 8-20 image cards on a helical path (WebGL
|
|
324
|
+
planes, or DOM: `rotateY` + translate on a cylinder via per-card
|
|
325
|
+
`--angle`), scroll progress spins and tightens/loosens the helix; cards
|
|
326
|
+
face the camera (billboard) or shear with velocity. Entry/exit: cards fly
|
|
327
|
+
in from scatter, settle into the vortex, then one card breaks out and
|
|
328
|
+
expands into the next section's hero. Gallery/archive/portfolio registers;
|
|
329
|
+
damp the spin (never raw-set), cap DPR, poster fallback.
|
|
330
|
+
- **Disintegration on scroll/click**: the image dissolves into particles that
|
|
331
|
+
drift away along scroll direction — WebGL: draw the texture as a point grid
|
|
332
|
+
(one point per NxN texel block, ≤ 10k), scroll/click drives `uProgress`
|
|
333
|
+
which displaces points along noise + directional velocity while alpha
|
|
334
|
+
fades; reverse the uniform to reassemble. Budget DOM version: the image
|
|
335
|
+
sliced into a coarse tile grid, tiles translate/rotate/fade with staggered
|
|
336
|
+
randomized offsets. Click-to-destroy variants pair with a rebuild on
|
|
337
|
+
scroll-back — destruction must be reversible, content is never lost.
|
|
338
|
+
- **Pixel assembly on scroll**: the reverse of disintegration as an ENTRANCE —
|
|
339
|
+
the image begins as scattered pixel blocks/particles (WebGL point grid ≤10k,
|
|
340
|
+
or DOM: a coarse tile grid at randomized scatter positions/rotations) and
|
|
341
|
+
scroll progress converges them into the finished picture; `uProgress` lerps
|
|
342
|
+
each point from its noise-scattered origin to its texel home, alpha ramping
|
|
343
|
+
up, optionally staggered radially or along a directional sweep. Pair with
|
|
344
|
+
the headline resolving in the same beat. Scroll-back re-scatters
|
|
345
|
+
(reversible). Variants: assemble from RGB-split ghosts converging, from
|
|
346
|
+
mosaic chunks sharpening (§2 pixel swap driven per-tile), or from another
|
|
347
|
+
image's dispersed particles (image A dissolves → its particles re-form as
|
|
348
|
+
image B: a particle CROSSFADE between chapters).
|
|
349
|
+
- **Pixel sort / smear on velocity**: scroll velocity smears the image's
|
|
350
|
+
pixels along one axis (shader: offset UV lookup by per-column noise ×
|
|
351
|
+
velocity, or stretch bright bands glitch-style), decaying to sharp at rest
|
|
352
|
+
— agitation that answers the visitor's speed. Digital/editorial registers.
|
|
353
|
+
- **Halftone/ASCII materialize**: media enters as its own halftone dots,
|
|
354
|
+
scanlines, or character grid and resolves to the photograph on scroll or
|
|
355
|
+
in-view — resolution as narrative. Budget: CSS `mask` with a dot pattern
|
|
356
|
+
scaling down; full: a LUT/threshold shader ramping cell size to zero.
|
|
357
|
+
- **Living overlay**: a shader/canvas layer ON TOP of the media that reacts
|
|
358
|
+
while the image stays legible beneath — flowfield streaks along the
|
|
359
|
+
subject's edges, scanline/glitch bursts on scroll velocity, a displacement
|
|
360
|
+
ripple radiating from the cursor, halftone dots that swell near the
|
|
361
|
+
pointer. The overlay is the same §3 plane sampling the same texture —
|
|
362
|
+
never a second copy of the asset.
|
|
145
363
|
- **Print develop**: media enters as paper-white → exposure/contrast/duotone
|
|
146
364
|
ramps to full grade (CSS `filter` keyframes or a LUT shader), timed with
|
|
147
365
|
the headline reveal. Photography/portfolio registers.
|
|
148
366
|
|
|
367
|
+
### The exploration protocol (run it before choosing anything)
|
|
368
|
+
|
|
369
|
+
The catalogs in this file are calibration, not a menu — the failure mode they
|
|
370
|
+
create is pattern-matching to the nearest listed effect. At dial ≥ 7, before
|
|
371
|
+
committing the media column of the blueprint, generate **three candidate
|
|
372
|
+
treatments that do not appear verbatim in this file**, each derived from the
|
|
373
|
+
brand's world (what does this subject physically DO? beans pour and tumble;
|
|
374
|
+
fabric folds and drapes; ink bleeds; glass refracts; records spin; steam
|
|
375
|
+
rises). Write the three candidates + the pick into the plan file with one
|
|
376
|
+
line each on construction cost. Pick the boldest one that clears §5's floors
|
|
377
|
+
and the register — if all three are weaker than a §2.5 exotic, use the
|
|
378
|
+
exotic, but the exploration must have happened. A media plan assembled purely
|
|
379
|
+
from listed effects, with no rejected invention on record, is minimum-effort
|
|
380
|
+
compliance.
|
|
381
|
+
|
|
382
|
+
### Exploration catalog (further constructions — steal the mechanics, reskin the idea)
|
|
383
|
+
|
|
384
|
+
Images beyond the frame:
|
|
385
|
+
|
|
386
|
+
- **Physics gallery**: images as draggable/throwable bodies (Rapier 2D or
|
|
387
|
+
a spring sim) that collide, settle, and stack; scroll shakes the pile.
|
|
388
|
+
- **Infinite drag canvas**: a 2D plane of scattered media the visitor pans
|
|
389
|
+
through (drag + inertia), items waking (scale/unblur/play) near the
|
|
390
|
+
viewport center — the exploration-museum pattern.
|
|
391
|
+
- **Image as terrain**: the photo's luminance drives vertex displacement on
|
|
392
|
+
a plane — the image becomes a relief the camera glides over on scroll.
|
|
393
|
+
- **Fake-3D depth parallax**: one still + a (generated or estimated) depth
|
|
394
|
+
map; UV offset by depth × cursor/gyro = a photo with real parallax inside.
|
|
395
|
+
- **Cursor echo trail**: moving the cursor across a gallery leaves a decaying
|
|
396
|
+
trail of image fragments/duplicates that fade behind it.
|
|
397
|
+
- **Collage assembly**: a section's imagery enters as scattered scraps
|
|
398
|
+
(rotated, layered, torn edges) that scroll pulls into a composed collage —
|
|
399
|
+
the reverse of disintegration.
|
|
400
|
+
- **Lens/magnifier**: a draggable optic over a large image or dense contact
|
|
401
|
+
sheet, refracting (WebGL) or scaling (CSS) what's beneath.
|
|
402
|
+
|
|
403
|
+
Video beyond autoplay:
|
|
404
|
+
|
|
405
|
+
- **Scrub-as-transition**: a 1-2s generated clip scrubbed by route/section
|
|
406
|
+
transition progress — the page change IS the video (door opens, liquid
|
|
407
|
+
pours, light sweeps).
|
|
408
|
+
- **Video-lit scene**: sample the playing video's average/dominant color per
|
|
409
|
+
frame (offscreen canvas) and drive ambient page tint/glow from it — the
|
|
410
|
+
video becomes the room's light source.
|
|
411
|
+
- **Timeline flipbook**: N generated stills of one subject across time/states
|
|
412
|
+
flipped by scroll — a bean roasting darker, a garment assembling — the
|
|
413
|
+
narrative version of a scrub sequence.
|
|
414
|
+
|
|
415
|
+
Props beyond floating (§1.5 behaviors, upgraded):
|
|
416
|
+
|
|
417
|
+
- **Flocking swarms**: 20-80 instanced prop cutouts with boids/noise motion
|
|
418
|
+
that scatter from the cursor and reform into a loose formation (or the
|
|
419
|
+
brand mark's silhouette) at rest.
|
|
420
|
+
- **Pour/emit systems**: props emitted from a source object (beans from a
|
|
421
|
+
bag, petals from a stem) on scroll or click, falling with gravity + drag,
|
|
422
|
+
settling into a pile that persists per session.
|
|
423
|
+
- **Props as UI**: the prop IS the control — a bean that drags along a
|
|
424
|
+
roast-level slider, a bottle that tilts to pour the page to the next
|
|
425
|
+
section. One per page; must keep an obvious conventional equivalent.
|
|
426
|
+
|
|
427
|
+
Same law as §2.5: every construction here still clears §5's floors, earns one
|
|
428
|
+
sentence of communication value, and the §0 set-piece count (one by default;
|
|
429
|
+
a justified second at award) — an exploration catalog is not permission to
|
|
430
|
+
ship five spectacles.
|
|
431
|
+
|
|
149
432
|
Discipline stays the law: the composed treatment must still clear §5's floors,
|
|
150
433
|
DESIGN.md §6's "one sentence of communication value", and one-signature-
|
|
151
434
|
per-page — an inventive effect stamped on every image is as loud as a marquee
|
|
@@ -154,7 +437,15 @@ on every section.
|
|
|
154
437
|
## 3. WebGL tier — the media plane (the unseen.co mechanic)
|
|
155
438
|
|
|
156
439
|
When dial ≥ 8 or cinematic/immersive is active, media renders THROUGH the
|
|
157
|
-
canvas so shaders can touch it.
|
|
440
|
+
canvas so shaders can touch it. **At award-site ambition this section is a
|
|
441
|
+
REQUIREMENT, not an option**: the hero image and at least one gallery/section
|
|
442
|
+
image set must be live media planes whose shader visibly responds to scroll
|
|
443
|
+
(velocity distortion, dissolve, RGB split, curvature — pick from §2.5) — a
|
|
444
|
+
page whose images all sit in flat DOM rectangles has not met the tier, no
|
|
445
|
+
matter how much 3D floats around them. Verification must prove it: sample a
|
|
446
|
+
plane's driven uniform (e.g. `uVelocity`, `uProgress`) or its rect-synced
|
|
447
|
+
transform during a scripted scroll and record two differing values in
|
|
448
|
+
verify.md. The core pattern, in order:
|
|
158
449
|
|
|
159
450
|
1. **Sync planes to DOM rects.** Real `<img>`/`<video>` elements stay in the
|
|
160
451
|
document (a11y, SEO, layout, fallback) but render invisible
|
|
@@ -182,6 +473,63 @@ effects on the plane); reduced-motion and WebGL-failure both fall back to
|
|
|
182
473
|
simply un-hiding the DOM media (set `opacity: 1`) — this fallback must be
|
|
183
474
|
wired, not theoretical, and it's the first thing runtime verification checks.
|
|
184
475
|
|
|
476
|
+
## 3.5 Going INSIDE the media (immersion recipes)
|
|
477
|
+
|
|
478
|
+
The strongest media moment on the modern web is not looking AT an image —
|
|
479
|
+
it's the camera going INTO it: the photo stops being a rectangle on a page
|
|
480
|
+
and becomes, briefly, the space the visitor is in. These are the recipes,
|
|
481
|
+
cheapest first; at dial ≥ 8 with a canvas, prefer one of these as (or inside)
|
|
482
|
+
the set-piece over any flat treatment:
|
|
483
|
+
|
|
484
|
+
1. **The portal dive (DOM tier — no WebGL needed).** Pin the section; scroll
|
|
485
|
+
scales the image from framed rectangle past 100% of the viewport while a
|
|
486
|
+
`clip-path` aperture opens, until its interior IS the background — and the
|
|
487
|
+
next section's content fades in already "inside" it (its palette sampled
|
|
488
|
+
from the image's deep tones so the world feels continuous). Reverse on
|
|
489
|
+
scroll-back. Layer 2-3 depth children (see recipe 3) inside the frame and
|
|
490
|
+
the dive reads as truly spatial, not as a zoom.
|
|
491
|
+
2. **The depth-map dive (WebGL, the real thing).** Get a depth map for the
|
|
492
|
+
image: generate one (prompt the image tool for "depth map of this scene,
|
|
493
|
+
white near black far" alongside the still), or approximate from luminance/
|
|
494
|
+
a vertical gradient for scenes with obvious near-ground/far-sky structure.
|
|
495
|
+
Subdivided plane (~128×128), vertex shader displaces z by depth × uDolly;
|
|
496
|
+
scroll drives the camera INTO the displaced relief (dolly + slight fov
|
|
497
|
+
ease) while pointer shifts a ±3-5° parallax. Near pixels slide past the
|
|
498
|
+
camera edges as you enter — that edge-slide is what sells "inside".
|
|
499
|
+
Occlusion artifacts at the silhouette are hidden with fog/vignette matched
|
|
500
|
+
to the image's palette.
|
|
501
|
+
3. **The diorama (matted layers).** Cut the image into 2-4 real layers
|
|
502
|
+
(subject / midground / backdrop — matte with the §1.5 cutout pipeline, or
|
|
503
|
+
generate the layers separately in the same prompt world). Place them at
|
|
504
|
+
real z-depths (WebGL planes or CSS `translateZ` with perspective on the
|
|
505
|
+
parent) and move the camera between them on scroll: passing a foreground
|
|
506
|
+
layer's edge as it exits the frame is the moment the brain accepts depth.
|
|
507
|
+
The generated-layers path beats matting: ask the image tool for the same
|
|
508
|
+
scene as "foreground elements only, transparent background" + "empty
|
|
509
|
+
background plate".
|
|
510
|
+
4. **The particle fly-through.** Build the image as a point cloud (§2.5
|
|
511
|
+
disintegration budget: ≤ 10k points sampled from the texture, point size
|
|
512
|
+
by luminance). Scroll doesn't just dissolve it — it drives the camera
|
|
513
|
+
THROUGH the cloud: points ahead grow, pass the camera plane, and exit
|
|
514
|
+
behind (kill/respawn them past z=camera). Halfway through, the cloud
|
|
515
|
+
re-forms into the NEXT image — one continuous flight from picture to
|
|
516
|
+
picture is a set-piece by itself.
|
|
517
|
+
5. **The scrub-dive (video/frames).** A scroll-scrubbed frame sequence
|
|
518
|
+
(generate-sequence, or frames extracted from video via ffmpeg) whose
|
|
519
|
+
camera already moves INTO the scene (prompt the generation that way:
|
|
520
|
+
"dolly forward into…"); pin the section, map scroll → frame index
|
|
521
|
+
(preload + draw to a canvas, never seek a `<video>` per frame), and the
|
|
522
|
+
visitor's scroll finger literally walks the camera in. Exit the pin at
|
|
523
|
+
the deepest frame into a section graded to that frame's palette.
|
|
524
|
+
|
|
525
|
+
Wiring rules: these are still media planes — DOM element stays for a11y and
|
|
526
|
+
the fallback is the graded flat image (§3's rules apply unchanged). ONE dive
|
|
527
|
+
per page (it's a set-piece-class moment; two dives cheapen both). The dive
|
|
528
|
+
target must be an image whose composition has actual depth to enter (a
|
|
529
|
+
corridor, a room, a landscape, machinery receding) — prompt/choose the asset
|
|
530
|
+
for that; diving into a flat-lit product shot reads as a zoom, which is the
|
|
531
|
+
failure this section replaces.
|
|
532
|
+
|
|
185
533
|
## 4. Choosing the treatment (the reasoning frame)
|
|
186
534
|
|
|
187
535
|
Per media element, walk this in one line each — it's the media ledger the plan
|
|
@@ -105,6 +105,29 @@ tell. Instead:
|
|
|
105
105
|
with `view-transition-name` so they morph across routes. Feature-gate; fall back
|
|
106
106
|
to instant navigation, not a JS fade.
|
|
107
107
|
|
|
108
|
+
## 5.5 Velocity & physical feel (what makes motion feel ALIVE, dial ≥ 6)
|
|
109
|
+
|
|
110
|
+
Static easings play back; physical motion RESPONDS. The difference between a
|
|
111
|
+
tweened page and a top-tier one is that top-tier motion carries momentum:
|
|
112
|
+
|
|
113
|
+
- **Scroll velocity as an input.** Track smoothed velocity (Lenis exposes it;
|
|
114
|
+
else lerp `(scrollY - last) / dt`) and drive secondary properties from it:
|
|
115
|
+
skew images/cards ±2-4° along the scroll axis, stretch letter-spacing or
|
|
116
|
+
scaleY on display type a few %, increase a shader's blur/chromatic-
|
|
117
|
+
aberration/RGB-split uniform with speed. Everything eases back to rest via
|
|
118
|
+
the same lerp when scrolling stops — the settle IS the effect.
|
|
119
|
+
- **Inertia and release.** Anything draggable keeps momentum on release
|
|
120
|
+
(Motion's `dragMomentum`, GSAP InertiaPlugin, or a manual velocity fling
|
|
121
|
+
with friction) and settles with an overshoot spring, never a hard stop.
|
|
122
|
+
A drag that stops dead on mouseup feels like a slideshow.
|
|
123
|
+
- **Lag as depth.** Layered elements follow the scroll/cursor with different
|
|
124
|
+
lerp factors (0.05-0.15 spread) so the composition visibly re-stacks in
|
|
125
|
+
motion — cheap, GPU-light, reads as physicality on every pointer move.
|
|
126
|
+
- **One motion signature per build.** Pick the personality once — a named
|
|
127
|
+
easing family (e.g. `expo.out` + one overshoot) OR one spring config — and
|
|
128
|
+
use it everywhere; mixed default eases read as assembled-from-snippets.
|
|
129
|
+
`linear` only for marquees/orbits; never ship a default ease unexamined.
|
|
130
|
+
|
|
108
131
|
## 6. Performance and accessibility (non-negotiable)
|
|
109
132
|
|
|
110
133
|
- Transform/opacity only in hot paths; promote animating layers sparingly
|
|
@@ -223,7 +246,11 @@ A motion request is fulfilled only if the final code contains, verifiably
|
|
|
223
246
|
|
|
224
247
|
Before reporting done, list which inventory items shipped and where (element +
|
|
225
248
|
trigger). "The page has hover states" does not clear dial 7+. If a listed item
|
|
226
|
-
was deliberately cut, say so and why. This inventory is
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
249
|
+
was deliberately cut, say so and why. This inventory is a **hard gate**, not a
|
|
250
|
+
checklist: the SKILL.md verification pass fails the task on any dial-appropriate
|
|
251
|
+
item that is neither proven running nor logged as a deliberate cut with a
|
|
252
|
+
reason — an incomplete inventory means keep building, not ship with a caveat.
|
|
253
|
+
The runtime stage must PROVE the items run (transforms changing, triggers
|
|
254
|
+
firing, console clean), not just find them in the source. On mobile, grade
|
|
255
|
+
against the shifted dial (mobile.md: desktop N ≈ mobile N−2), not the desktop
|
|
256
|
+
list.
|