dreative 0.3.0 → 0.3.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dreative",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Layout-first visual editor skill for coding CLIs: extract your app's UI into editable wireframes, tweak with drag-drop + ref images, then the agent applies the diff back to your code.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/skill/dreative/DESIGN.md
CHANGED
|
@@ -259,6 +259,61 @@ library (Phosphor/Radix/Tabler/HugeIcons; Lucide only on request), one strokeWid
|
|
|
259
259
|
globally. Logo walls: real SVG marks (`https://cdn.simpleicons.org/<slug>`) or
|
|
260
260
|
generated monograms — logos only, no category captions, below the hero.
|
|
261
261
|
|
|
262
|
+
### Generated media (probe your environment, then use it)
|
|
263
|
+
|
|
264
|
+
Before designing, check what media generation your environment actually offers —
|
|
265
|
+
image-gen tools, video-gen tools, or a CLI that can produce them — and treat any
|
|
266
|
+
capability found as a first-class design material, not a nice-to-have:
|
|
267
|
+
|
|
268
|
+
- **Images**: generate hero photography, product/context shots, and textures at
|
|
269
|
+
the section's exact aspect ratio, prompted for the brand's physical subject
|
|
270
|
+
and the page's light temperature so they grade into the palette. Generate the
|
|
271
|
+
grain tile and any masks/mattes too instead of hand-rolling SVG.
|
|
272
|
+
- **Video**: a generated 5–10s seamless loop is one of the biggest single UI
|
|
273
|
+
upgrades available — use it as: a hero background (muted, `autoplay loop
|
|
274
|
+
playsinline`, poster frame, `prefers-reduced-motion` swaps to the poster);
|
|
275
|
+
the budget "living surface" (a pre-rendered fluid/particle/atmosphere loop
|
|
276
|
+
instead of a GPGPU sim — cinematic.md's budget recipe); hover-preview loops
|
|
277
|
+
on work cards; or an image-sequence for scroll-scrubbed narratives (export
|
|
278
|
+
frames, scrub per motion.md).
|
|
279
|
+
- **Integrate with motion, don't just embed** — a raw `<video>`/`<img>` dropped
|
|
280
|
+
in a section is not the treatment. Generated media enters the page THROUGH the
|
|
281
|
+
motion system; pick 1–2 treatments per page from this vocabulary (or invent in
|
|
282
|
+
its spirit), matched to the register:
|
|
283
|
+
- **Pixel/dither reveal**: video or image materializes from coarse blocks —
|
|
284
|
+
a shader that lerps sample resolution from ~24px mosaic to full res (or a
|
|
285
|
+
stepped `image-rendering: pixelated` downscale swap for the budget path),
|
|
286
|
+
driven by scroll progress or hover. Reads as digital-craft; dark-tech and
|
|
287
|
+
editorial registers.
|
|
288
|
+
- **Floating media**: images hover in depth with slow damped drift (±6-10px,
|
|
289
|
+
4-8s loops, each at a different phase), subtle parallax by depth layer, and
|
|
290
|
+
a soft contact shadow — the immersive "paper sheets in space" look without
|
|
291
|
+
WebGL. Cap at 3-5 floaters per view.
|
|
292
|
+
- **Mask-shaped video**: the loop plays inside display type (`background-clip:
|
|
293
|
+
text` / SVG mask on a 10vw+ headline), an arch/circle clip-path, or the
|
|
294
|
+
brand mark — the video becomes typography/identity rather than a rectangle.
|
|
295
|
+
- **Scroll-scrubbed sequence**: generated frames scrubbed by scroll for
|
|
296
|
+
assemble/morph/rotate narratives (motion.md's canvas product story).
|
|
297
|
+
- **Velocity-touched media**: scroll/drag velocity stretches, RGB-splits, or
|
|
298
|
+
ripples the media plane for a beat, settling with damped decay
|
|
299
|
+
(cinematic.md §2) — needs the WebGL media-plane sync.
|
|
300
|
+
- **Hover-woken loops**: stills that crossfade into their video loop on
|
|
301
|
+
hover/focus (240ms), pause + rewind-to-poster on leave; works as generated
|
|
302
|
+
"living thumbnails" on work/product cards.
|
|
303
|
+
- **Curtain/split reveal**: media enters behind a 2-4 panel wipe or an
|
|
304
|
+
expanding inset clip (`clip-path: inset(40% 30%) → inset(0)`), timed with
|
|
305
|
+
the section's line-mask type reveal so image and headline arrive as one
|
|
306
|
+
choreographed beat.
|
|
307
|
+
Whatever the treatment, honor the floors: reduced-motion gets the poster
|
|
308
|
+
frame, hover treatments have focus equivalents, and the effect is justified
|
|
309
|
+
in one sentence like any other motion (§6).
|
|
310
|
+
- Discipline: same rationing as everything else — one video loop per view,
|
|
311
|
+
compress hard (H.264/AV1, ≤ 2–4MB per loop, no audio track), lazy-load below
|
|
312
|
+
the fold, and never let generated media replace REAL product screenshots or
|
|
313
|
+
the client's actual photography when those exist.
|
|
314
|
+
- If no generation capability exists, say so and fall back down the §7 priority
|
|
315
|
+
list — never fake a video with a div animation.
|
|
316
|
+
|
|
262
317
|
## 8. Content and copy
|
|
263
318
|
|
|
264
319
|
≤ 8-word section headlines, ≤ 25-word subtext, one copy register per page, quotes
|
|
@@ -323,6 +378,69 @@ recomposition → full replacement only when unsalvageable. Honor existing
|
|
|
323
378
|
accessibility wins and analytics hooks. Preserve prior element-level edits when
|
|
324
379
|
`previousFile` is set.
|
|
325
380
|
|
|
381
|
+
### The preservation contract (mandatory for ANY redesign of existing code)
|
|
382
|
+
|
|
383
|
+
Redesigns fail catastrophically in one specific way: the agent rebuilds the page
|
|
384
|
+
from its mental image of it and silently drops what it forgot — links, ids, form
|
|
385
|
+
fields, whole features. Doctrine prose does not prevent this; only a mechanical
|
|
386
|
+
before/after check does. The contract protects **content and function**, never
|
|
387
|
+
structure — a restructure/reimagine still rebuilds markup, components, and
|
|
388
|
+
routing as drastically as the rung demands.
|
|
389
|
+
|
|
390
|
+
**Step 1 — Manifest (before editing anything).** Per page/view being redesigned,
|
|
391
|
+
read the ORIGINAL source and write a manifest file (scratch or
|
|
392
|
+
`.dreative/preserve/<page>.json`) enumerating:
|
|
393
|
+
|
|
394
|
+
- **Links & routes**: every `href` / `to` / `router.push` / `navigate` target.
|
|
395
|
+
- **Interactive elements**: every button/menu/toggle/input with its handler or
|
|
396
|
+
action (name + one line of what it does), every form with its field names,
|
|
397
|
+
types, validation, and submit target.
|
|
398
|
+
- **Identity hooks**: every `id`, `data-*` attribute, `aria-*` label, analytics
|
|
399
|
+
hook, test id, and anchor target. These are external contracts — other code,
|
|
400
|
+
CSS, tests, and deep links point at them.
|
|
401
|
+
- **Visible text**: every heading, label, button caption, tooltip, empty-state,
|
|
402
|
+
and legal string (verbatim).
|
|
403
|
+
- **Data views & states**: every list/table/feed and what feeds it (API call,
|
|
404
|
+
prop, store), every conditional view — tabs, modals, auth states, wizard
|
|
405
|
+
steps, loading/empty/error branches.
|
|
406
|
+
- **Public API**: the component's exports, props, and context it consumes —
|
|
407
|
+
callers must not break.
|
|
408
|
+
|
|
409
|
+
**Step 2 — Redesign at the confirmed rung.** Every manifest entry must land
|
|
410
|
+
somewhere in the new code. Restructuring means an entry may MOVE (a tab becomes
|
|
411
|
+
a section, a sidebar item becomes a command-palette entry, a table becomes
|
|
412
|
+
cards) — moving is encouraged; vanishing is a bug. If the new design has no room
|
|
413
|
+
for something, relocate it (overflow menu, secondary view, settings page) —
|
|
414
|
+
never delete a feature to make a layout work. Rewriting copy is allowed only at
|
|
415
|
+
the reimagine rung or on explicit request, and each rewrite is logged as
|
|
416
|
+
intentional.
|
|
417
|
+
|
|
418
|
+
**Step 3 — Verify mechanically (not by vibes).** After writing the new code,
|
|
419
|
+
walk the manifest item by item and grep the new source for each link target,
|
|
420
|
+
handler/action, id/data-attribute, field name, visible string, and data view.
|
|
421
|
+
Anything unmatched is either fixed on the spot or listed as an intentional
|
|
422
|
+
change with a reason. Then report a **preservation ledger** to the user:
|
|
423
|
+
"kept 14/14 links, 9/9 actions, 6/6 form fields, all 4 tab views; moved the
|
|
424
|
+
sort dropdown into the toolbar; rewrote 2 headings (reimagine rung)". A
|
|
425
|
+
redesign without a ledger is not done.
|
|
426
|
+
|
|
427
|
+
**Step 4 — Render check.** Every data view and conditional state that rendered
|
|
428
|
+
before must render after: open (or mentally walk) each tab/modal/state, not
|
|
429
|
+
just the default view. A page that "looks designed" but shows an empty shell
|
|
430
|
+
where a table used to be is a failed redesign regardless of how good the hero
|
|
431
|
+
looks.
|
|
432
|
+
|
|
433
|
+
### Motion is a deliverable, not a garnish
|
|
434
|
+
|
|
435
|
+
When the user asked for motion/animation (explicitly, or by picking the motion /
|
|
436
|
+
interaction / immersive / cinematic skills), shipped motion is verified like a
|
|
437
|
+
feature: before declaring done, name the specific animations implemented (which
|
|
438
|
+
element, which trigger, which duration/ease) and confirm they exist in the code
|
|
439
|
+
and appear in the self-critique screenshots. "The design system implies motion"
|
|
440
|
+
does not count; entrance choreography, scroll behavior, and micro-interactions
|
|
441
|
+
must be literally present. If zero animations survive to the final code, the
|
|
442
|
+
request was not fulfilled — go back and add them before reporting done.
|
|
443
|
+
|
|
326
444
|
### The transformation-depth ladder (offer it, then execute it)
|
|
327
445
|
|
|
328
446
|
A redesign request has a depth, and styling is only the shallowest rung. When the
|
|
@@ -387,6 +505,11 @@ the output is not done.
|
|
|
387
505
|
14. Every block id from the layout appears as `data-dreative-id` (design-page only).
|
|
388
506
|
15. Dark mode (when in scope): semantic-token swap, surface-lightness depth,
|
|
389
507
|
desaturated accents, tested both modes.
|
|
508
|
+
16. Redesign of existing code: preservation manifest written BEFORE editing;
|
|
509
|
+
every link, id, handler, form field, visible string, data view, and
|
|
510
|
+
conditional state verified present (or logged as intentional) in the new
|
|
511
|
+
code; preservation ledger reported. If motion skills were chosen, the
|
|
512
|
+
implemented animations are named and present in the code.
|
|
390
513
|
|
|
391
514
|
## 13. Mobile & touch adaptation (how ambitious effects degrade)
|
|
392
515
|
|
package/skill/dreative/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Frontend design skill + optional visual round-trip editor. Use for
|
|
|
7
7
|
|
|
8
8
|
You (the coding agent) are the intelligence. Dreative has **two modes**:
|
|
9
9
|
|
|
10
|
-
- **Mode A — Direct design (default).** The user asks you to design, redesign, restyle, animate, or build UI. Read `DESIGN.md` (and any specialist `skills/<name>.md` the work calls for — motion, 3d, interaction), then design/edit the real code directly. No server, no extraction, no wireframes. When you finish, add one closing note: *"Tip: run `dreative start` / say 'open dreative' if you want to tweak this visually — I'll extract the pages into an editable canvas."* That's the only place the editor should come up; never force the round-trip on a plain design request. **Depth first:** when the request implies more than a fresh coat of paint ("redesign", "change it entirely", "make it like <reference site>"), present DESIGN.md §11's transformation-depth ladder (restyle → re-layout → restructure → reimagine) as explicit options and let the user pick BEFORE designing; a confirmed restructure/reimagine means rebuilding markup, component trees, and routing for real — never just editing stylesheets on the old skeleton. **Skill picker:** in the same pre-design question (use the agent's structured question tool, e.g. AskUserQuestion, multi-select), offer the specialist skills with a one-line plain-language description each so the user chooses the treatments they want — recommend the ones the request obviously implies and mark them "(Recommended)":
|
|
10
|
+
- **Mode A — Direct design (default).** The user asks you to design, redesign, restyle, animate, or build UI. Read `DESIGN.md` (and any specialist `skills/<name>.md` the work calls for — motion, 3d, interaction), then design/edit the real code directly. No server, no extraction, no wireframes. When you finish, add one closing note: *"Tip: run `dreative start` / say 'open dreative' if you want to tweak this visually — I'll extract the pages into an editable canvas."* That's the only place the editor should come up; never force the round-trip on a plain design request. **Depth first:** when the request implies more than a fresh coat of paint ("redesign", "change it entirely", "make it like <reference site>"), present DESIGN.md §11's transformation-depth ladder (restyle → re-layout → restructure → reimagine) as explicit options and let the user pick BEFORE designing; a confirmed restructure/reimagine means rebuilding markup, component trees, and routing for real — never just editing stylesheets on the old skeleton. **Preservation contract (non-negotiable when redesigning existing code):** BEFORE editing any existing page, build the preservation manifest per DESIGN.md §11 (every link, id/data-attribute, handler, form field, visible string, data view, and conditional state — tabs, modals, auth branches); AFTER redesigning, mechanically verify each entry survives in the new code and report the preservation ledger. Restructure moves things; it never loses them. **Real motion engineering:** when motion/3d/immersive/cinematic treatments are chosen, deliver them with the proper libraries per the skill files (GSAP + ScrollTrigger, Lenis, `motion/react`, three.js/R3F) — actually add the dependencies to the project (`npm i gsap lenis` etc.), wire providers/render loops, and build the choreography. A static page with a few CSS transitions does not fulfill a motion request; the target is unseen.co-grade coordinated animation, the shipped result must clear the motion-dial inventory in `skills/motion.md` §9, and the self-critique pass must name the specific animations shipped. **Generated media:** probe your environment for image/video generation tools before designing and use them per DESIGN.md §7 — generated hero imagery, textures, and especially seamless video loops (hero backgrounds, pre-rendered living surfaces, hover previews) integrated into the motion system are among the highest-impact upgrades available. **Skill picker:** in the same pre-design question (use the agent's structured question tool, e.g. AskUserQuestion, multi-select), offer the specialist skills with a one-line plain-language description each so the user chooses the treatments they want — recommend the ones the request obviously implies and mark them "(Recommended)":
|
|
11
11
|
- **motion** — scroll animations, staggered entrances, parallax, kinetic type
|
|
12
12
|
- **interaction** — micro-interactions: hover states, magnetic buttons, cursor effects, tactile feedback
|
|
13
13
|
- **3d** — WebGL / three.js scenes, shader backgrounds, 3D product showcases
|
|
@@ -25,7 +25,7 @@ Everything below §0 describes Mode B; the design doctrine paragraphs apply to b
|
|
|
25
25
|
|
|
26
26
|
**References the user gives you.** If the user attaches screenshots/images, read them with your image tools and treat them as the visual target (extract palette, type feel, layout family, motion cues from any described behavior). If the user names reference URLs, fetch them (browser tools if available, else web fetch of the HTML — look at real script/font/class evidence, not just the text) and distill what specifically to borrow before designing; never guess at a named reference from memory alone when you can look.
|
|
27
27
|
|
|
28
|
-
**Self-critique pass (Mode A, required before declaring done).** Doctrine at write-time is weaker than judgment at review-time. After implementing a design: run the app and screenshot the result (browser tools / the project's dev server) at desktop AND ~390px mobile width, then grade the screenshots against this rubric — (1) would a stranger name the brand's register and audience from one glance? (2) does it pass DESIGN.md §2's slop tests *as rendered* (not as intended)? (3) is the signature element actually visible and working? (4) any overflow, contrast failure, unloaded font/image, or motion jank? (5) does mobile hold up per DESIGN.md §13? Fix what fails and re-check once. If you cannot screenshot (no browser available), say so explicitly and walk the rendered DOM/CSS mentally against the same rubric — never silently skip the pass.
|
|
28
|
+
**Self-critique pass (Mode A, required before declaring done).** Doctrine at write-time is weaker than judgment at review-time. After implementing a design: run the app and screenshot the result (browser tools / the project's dev server) at desktop AND ~390px mobile width, then grade the screenshots against this rubric — (1) would a stranger name the brand's register and audience from one glance? (2) does it pass DESIGN.md §2's slop tests *as rendered* (not as intended)? (3) is the signature element actually visible and working? (4) any overflow, contrast failure, unloaded font/image, or motion jank? (5) does mobile hold up per DESIGN.md §13? (6) preservation ledger clean — every link, action, form field, text string, and tab/modal/state from the manifest present or logged as intentional? (7) if motion treatments were chosen: are the animation libraries actually installed and imported, and can you name ≥3 specific shipped animations (element + trigger + duration) visible in the running page? Fix what fails and re-check once. If you cannot screenshot (no browser available), say so explicitly and walk the rendered DOM/CSS mentally against the same rubric — never silently skip the pass.
|
|
29
29
|
|
|
30
30
|
## 0. Setup
|
|
31
31
|
|
|
@@ -170,6 +170,51 @@ All of 3d.md §7 and immersive.md §6, plus:
|
|
|
170
170
|
on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
|
|
171
171
|
the right call below motion dial 8 or on content-heavy sites.
|
|
172
172
|
|
|
173
|
+
## 6.5 The unseen.co replication blueprint (build order)
|
|
174
|
+
|
|
175
|
+
When the brief is "make it like unseen.co" (or this genre at dial 9–10), build
|
|
176
|
+
in THIS order — each layer works before the next starts. Do not attempt it as
|
|
177
|
+
one monolithic rewrite; do not stop after step 2 and call it done.
|
|
178
|
+
|
|
179
|
+
**Manifest:** `npm i gsap lenis three @react-three/fiber @react-three/drei
|
|
180
|
+
@react-three/postprocessing` (React) or `gsap lenis three` (vanilla/OGL).
|
|
181
|
+
Wire Lenis + ScrollTrigger per motion.md §8 first.
|
|
182
|
+
|
|
183
|
+
**Layer stack (bottom → top):** persistent WebGL canvas (fixed, full-viewport)
|
|
184
|
+
→ real DOM content (the accessible document) → HUD chrome (fixed corners) →
|
|
185
|
+
grain overlay → custom cursor. Each is its own component/layer mounted in the
|
|
186
|
+
root layout, outside the router swap point (immersive.md §1).
|
|
187
|
+
|
|
188
|
+
1. **Smooth scroll + type system.** Lenis running, line-mask reveals on every
|
|
189
|
+
heading (motion.md §8), the two-family type mix (grotesk + true-italic
|
|
190
|
+
serif accents in one headline), numbered HUD chrome (`01 Index`…). The page
|
|
191
|
+
should already feel 60% of the genre with zero WebGL.
|
|
192
|
+
2. **The living surface.** One canvas, one simulation family (§1). Start with
|
|
193
|
+
the highest effort/impact ratio: a shader plane with fbm + domain-warp fed
|
|
194
|
+
by palette uniforms and damped `uMouse` velocity (3d.md §4), or the
|
|
195
|
+
pre-rendered-video budget path (§6). Grain overlay goes in now — it glues
|
|
196
|
+
DOM and canvas into one graded image.
|
|
197
|
+
3. **Scroll = camera.** Tall scroll container drives a camera dolly / scene
|
|
198
|
+
progress via damped scrub (immersive.md §4). Section copy floats in at
|
|
199
|
+
progress stops. This is the "one continuous shot" that separates the genre
|
|
200
|
+
from a parallax page.
|
|
201
|
+
4. **Media through the surface.** Sync DOM image/work-card rects to texture
|
|
202
|
+
planes in the canvas (measure with `getBoundingClientRect` on resize +
|
|
203
|
+
scroll, don't guess) so hover/velocity distortion touches them; keep the
|
|
204
|
+
real DOM images underneath for a11y/fallback (§1). Velocity-reactive
|
|
205
|
+
stretch/RGB-split on scroll flicks, hard-clamped (§2).
|
|
206
|
+
5. **Gestures + cursor.** Pick 2–3 from §2 (drag-to-explore, click & hold,
|
|
207
|
+
cursor-as-instrument), each labeled, each with a keyboard/boring
|
|
208
|
+
equivalent. Custom cursor: one dot, damped follow, contextual labels.
|
|
209
|
+
6. **Doors and passages.** Preloader (real progress, choreographed reveal into
|
|
210
|
+
the idling scene — immersive.md §2), entry gate if sound ships (§3), route
|
|
211
|
+
transitions driven by the simulation (§4).
|
|
212
|
+
7. **The floor.** Reduced-motion still frame, degrade ladder, contrast scrim,
|
|
213
|
+
mobile strategy (poster or halved sim), pause on hidden (§5).
|
|
214
|
+
|
|
215
|
+
Ship checkpoint after every layer: run it, screenshot it, keep it working.
|
|
216
|
+
A failed step 4 must not take down steps 1–3.
|
|
217
|
+
|
|
173
218
|
## 7. Changing an existing site into this
|
|
174
219
|
|
|
175
220
|
Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
|
|
@@ -145,3 +145,78 @@ tell. Instead:
|
|
|
145
145
|
("PLAY VIDEO ⟲") slowly rotates around the pointer while it's over the media
|
|
146
146
|
region — SVG `<textPath>` on a circle, damped position follow, constant
|
|
147
147
|
rotation. Replaces the play button; fine pointers only, real button fallback.
|
|
148
|
+
|
|
149
|
+
## 8. Setup blueprints — install and WIRE the stack (do not skip)
|
|
150
|
+
|
|
151
|
+
Doctrine without dependencies ships a static page. When this skill is active,
|
|
152
|
+
actually add the libraries to the project and wire them before designing
|
|
153
|
+
sections. Pick the stack per §0, then:
|
|
154
|
+
|
|
155
|
+
**GSAP + ScrollTrigger + Lenis (brand pages, the unseen.co-family stack):**
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
npm i gsap lenis
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
// one module, imported once at app root (e.g. src/lib/motion.ts)
|
|
163
|
+
import gsap from "gsap";
|
|
164
|
+
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
|
165
|
+
import Lenis from "lenis";
|
|
166
|
+
|
|
167
|
+
gsap.registerPlugin(ScrollTrigger);
|
|
168
|
+
export const lenis = new Lenis({ lerp: 0.1, smoothWheel: true });
|
|
169
|
+
lenis.on("scroll", ScrollTrigger.update);
|
|
170
|
+
gsap.ticker.add((t) => lenis.raf(t * 1000));
|
|
171
|
+
gsap.ticker.lagSmoothing(0);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
React: run that inside a `useEffect` in a `<SmoothScroll>` provider mounted in
|
|
175
|
+
the root layout (destroy on unmount); Next.js needs `"use client"` on it.
|
|
176
|
+
ONE Lenis instance, ONE gsap ticker — never per-component.
|
|
177
|
+
|
|
178
|
+
**motion/react (React product+brand):** `npm i motion` — import from
|
|
179
|
+
`"motion/react"`. Shared transition vocabulary in one exported object
|
|
180
|
+
(`export const spring = { type: "spring", stiffness: 300, damping: 30 }`), used
|
|
181
|
+
everywhere; `MotionConfig reducedMotion="user"` at the root.
|
|
182
|
+
|
|
183
|
+
**Easing tokens (either stack):** commit page-wide —
|
|
184
|
+
`expo.out` / `cubic-bezier(0.16, 1, 0.3, 1)` for entrances/reveals,
|
|
185
|
+
`power2.inOut` for scrubbed/camera moves, springs for interactive. Define once
|
|
186
|
+
(gsap defaults via `gsap.defaults({ ease: "expo.out" })` or CSS custom
|
|
187
|
+
property `--ease-out-expo`), reference everywhere.
|
|
188
|
+
|
|
189
|
+
**Line-mask headline reveal (the canonical premium move, copy this shape):**
|
|
190
|
+
|
|
191
|
+
```jsx
|
|
192
|
+
// each line: <div class="overflow-hidden"><div class="line">…</div></div>
|
|
193
|
+
gsap.set(".line", { yPercent: 110 });
|
|
194
|
+
gsap.to(".line", {
|
|
195
|
+
yPercent: 0, duration: 0.9, ease: "expo.out", stagger: 0.08,
|
|
196
|
+
scrollTrigger: { trigger: el, start: "top 80%", once: true },
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Use GSAP `SplitText` (free) with `type: "lines", mask: "lines"` instead of
|
|
201
|
+
hand-wrapping when available; `aria-label` the original string per §4.
|
|
202
|
+
|
|
203
|
+
## 9. Definition of done — the shipped-motion inventory
|
|
204
|
+
|
|
205
|
+
A motion request is fulfilled only if the final code contains, verifiably
|
|
206
|
+
(grep the imports, name the elements):
|
|
207
|
+
|
|
208
|
+
- **Dial 4–6 (product/calm brand):** composed hero entrance timeline (§2), the
|
|
209
|
+
three global feel constants (interaction.md §0), 1–2 `whileInView`/triggered
|
|
210
|
+
section reveals, animated states (loading/success). No smooth scroll.
|
|
211
|
+
- **Dial 7–8 (expressive brand):** all of the above PLUS Lenis smooth scroll,
|
|
212
|
+
line-mask headline reveals on hero + section headings, one scrubbed scroll
|
|
213
|
+
sequence (pin, parallax system, or progress-bound narrative), one signature
|
|
214
|
+
pointer effect (interaction.md §1), and a page/route transition treatment.
|
|
215
|
+
- **Dial 9–10 (award-site):** all of the above PLUS the immersive.md or
|
|
216
|
+
cinematic.md architecture actually built (persistent stage/canvas, preloader
|
|
217
|
+
choreography, spatial or sim-driven route transitions, custom cursor).
|
|
218
|
+
|
|
219
|
+
Before reporting done, list which inventory items shipped and where (element +
|
|
220
|
+
trigger). "The page has hover states" does not clear dial 7+. If a listed item
|
|
221
|
+
was deliberately cut, say so and why. This inventory is what the SKILL.md
|
|
222
|
+
self-critique pass checks against.
|