dreative 0.2.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.
@@ -6,6 +6,7 @@ const SKILL_SIGNATURES = {
6
6
  interaction: /\b(micro[- ]?interaction|hover (effect|state)s?|cursor|magnetic|tilt|spotlight|glow|ripple|tactile|interactive|draggable)\b/i,
7
7
  immersive: /\b(immersive|award[- ]?(site|winning)|awwwards|spatial( (transition|nav(igation)?))?|scene[- ]?based|world|page[- ]transitions?|camera (move|travel|path)|preloader|scroll (journey|story|as travel)|explorable|experience site|epic\.net)\b/i,
8
8
  cinematic: /\b(cinematic|experiential|unseen\.co|fluid (sim(ulation)?|distortion)|gpgpu|drag[- ]to[- ]explore|click ?(&|and) ?hold|film grain|graded|velocity[- ]reactive|sound design|ambient (audio|sound))\b/i,
9
+ refined: /\b(clean (and )?(modern|professional)|modern clean|business (site|website|use)|corporate|professional look|premium (minimal|clean)|dtc|d2c|e[- ]?commerce|ecommerce|shopify|maswitzerland|lovvelavva|not (too )?(flashy|animated)|calm|understated)\b/i,
9
10
  };
10
11
  function detectSkills(texts) {
11
12
  const hay = texts.filter(Boolean).join(" \n ");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dreative",
3
- "version": "0.2.0",
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": {
@@ -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,13 +378,78 @@ 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
329
447
  user asks for meaningful change ("redesign", "make it modern", "make it look like
330
448
  <reference site>", "change it entirely") and the depth is ambiguous, present this
331
449
  ladder as explicit options (one short question, plain labels) and wait for the
332
- answer — do NOT silently default to the shallowest rung:
450
+ answer — do NOT silently default to the shallowest rung. Bundle the specialist
451
+ skill picker (SKILL.md) into the same question so the user answers depth and
452
+ treatments in one pass:
333
453
 
334
454
  1. **Restyle** — tokens only: color, type, spacing, radius, shadows, motion
335
455
  polish. Markup and structure untouched. Right for "refresh the look".
@@ -385,3 +505,97 @@ the output is not done.
385
505
  14. Every block id from the layout appears as `data-dreative-id` (design-page only).
386
506
  15. Dark mode (when in scope): semantic-token swap, surface-lightness depth,
387
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.
513
+
514
+ ## 13. Mobile & touch adaptation (how ambitious effects degrade)
515
+
516
+ Ambitious designs die on phones first. Every effect gets an explicit mobile
517
+ strategy DECIDED AT DESIGN TIME, not patched after. The rule of thumb: touch
518
+ devices get a *different good design*, never a broken half-version of the
519
+ desktop one.
520
+
521
+ **Pointer effects** (cursor followers, magnetic pull, spotlight, tilt, hover
522
+ reveals): gate ALL of them behind `@media (hover: hover) and (pointer: fine)`.
523
+ On touch, whatever hover revealed must be visible by default or reachable by
524
+ tap — never lost. Custom cursors simply don't exist on touch; don't ship their
525
+ DOM/listeners there.
526
+
527
+ **Pinned/scrubbed sections**: pinning is fragile on mobile (URL-bar resize
528
+ fires viewport changes mid-pin; iOS momentum scroll skips scrub frames).
529
+ Strategies in preference order: (1) keep the pin but shorten it (≤ 1.5
530
+ viewports) and drive it with `position: sticky`, never JS pinning; (2) unpin —
531
+ the same content as stacked sections with simple in-view reveals;
532
+ (3) `ScrollTrigger.matchMedia()` / a `matchMedia` branch that swaps the whole
533
+ choreography. Never let a desktop pin length ride on a phone.
534
+
535
+ **Parallax & depth layers**: halve the differential on small screens (8-15% →
536
+ 4-7%) or drop to zero; small viewports make parallax read as jitter. Layered
537
+ depth scenes collapse to 2 layers max.
538
+
539
+ **Drag-to-explore / spatial navigation**: on touch, drag conflicts with native
540
+ scroll. Either give the pannable surface a dedicated full-screen mode entered
541
+ by tap (with a visible close), or replace it with a swipeable carousel /
542
+ plain scrolling index. The conventional index route (immersive.md's escape
543
+ hatch) becomes the PRIMARY route on mobile, not the fallback.
544
+
545
+ **WebGL/canvas**: assume the phone GPU is 5-10× weaker and thermally throttled.
546
+ Tier at boot (`devicePixelRatio` capped at 2, sim resolution halved,
547
+ post-processing off) or swap the sim for a pre-rendered video loop / poster.
548
+ `deviceMemory`/first-dropped-frames checks pick the tier; a visible "reduce
549
+ effects" toggle when the brief allows.
550
+
551
+ **Layout & ergonomics floor** (extends checklist §12.12): tap targets ≥ 44px
552
+ with ≥ 8px gaps; primary actions in thumb reach (bottom half) on app-register
553
+ mobile; `100dvh` not `100vh`; no horizontal body scroll at 320px; type scale
554
+ clamps DOWN gracefully (hero ≥ 2rem, body stays ≥ 16px — iOS zooms inputs
555
+ under 16px); sticky navs shrink rather than stack; test the three widths 320 /
556
+ 768 / 1280 mentally before responding.
557
+
558
+ **Motion budget on mobile**: entrance choreography total ≤ 600ms (vs 900ms
559
+ desktop), at most 1 scroll-driven sequence per page, marquees pause when
560
+ off-screen. Battery is a design constraint: continuous rAF loops must idle
561
+ when nothing animates.
562
+
563
+ ## 14. Typography sourcing (kill the Inter-everywhere default)
564
+
565
+ The reflex-reject list (§3) says what NOT to reach for; this is where to reach
566
+ instead. All fonts below are free (Google Fonts or Fontshare/ITF). The
567
+ commercial fonts real award sites use — verified: unseen.co sets **Saol
568
+ Display Light/Italic + Neue Montreal**; unseen's Blossom lab sets **SangBleu
569
+ Serif + PP Neue Montreal**; capsul-in-pro sets **Messina Sans** — are the
570
+ targets; the pairings below are their honest free stand-ins, not lookalikes of
571
+ each other.
572
+
573
+ Per aesthetic register (display / body):
574
+
575
+ - **Cinematic & experimental** (unseen-like): light editorial serif with a
576
+ true italic for display — `Boska`, `Sentient`, or `Gelasio Light Italic` —
577
+ over a neutral grotesk body — `Switzer`, `Hanken Grotesk`. Mixing italic
578
+ serif words INTO a grotesk headline is the genre move (unseen does exactly
579
+ this). Mono microtype for HUD labels: `Fragment Mono` or `Martian Mono`.
580
+ - **Minimal / premium product**: one grotesk family carrying everything —
581
+ `General Sans`, `Switzer`, or `Schibsted Grotesk` in 3-4 weights. The
582
+ Neue Montreal / Messina Sans stand-in tier. Tight display tracking
583
+ (−0.02 to −0.04em), no second family.
584
+ - **Editorial / luxury**: `Zodiak` or `Besley` display over `Hanken Grotesk`
585
+ or `Switzer` body; small-caps eyebrows tracked +0.08em. (Reach here only
586
+ when §3's serif discipline is satisfied.)
587
+ - **Bold / brutalist / campaign**: `Clash Display` or `Cabinet Grotesk` (black
588
+ weights) display over `Switzer`/`General Sans` body; `Bricolage Grotesque`
589
+ when some warmth is wanted.
590
+ - **Playful / consumer** (lovvelavva-like DTC): `Cabinet Grotesk` or `Gambetta`
591
+ display, rounded moments via weight and spacing — NOT a rounded font —
592
+ over `Hanken Grotesk` body.
593
+ - **Corporate trust / clean business**: `Switzer` or system stack; Inter is
594
+ legitimate here (§3). Differentiate through scale contrast and spacing,
595
+ not font novelty.
596
+
597
+ Rules: still run §3's selection procedure — this list feeds step 3, it does
598
+ not replace the brand-voice reasoning. Self-host via Fontshare/google-webfonts
599
+ downloads (`font-display: swap`, preload the display weight only). Never ship
600
+ more than 2 families / ~5 weight files. If the brief names a commercial font
601
+ the project already licenses, use the real thing.
@@ -7,14 +7,25 @@ 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.
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
+ - **motion** — scroll animations, staggered entrances, parallax, kinetic type
12
+ - **interaction** — micro-interactions: hover states, magnetic buttons, cursor effects, tactile feedback
13
+ - **3d** — WebGL / three.js scenes, shader backgrounds, 3D product showcases
14
+ - **immersive** — award-site feel: the page becomes a spatial world, scroll-as-journey, page transitions
15
+ - **cinematic** — dark, shader-graded experiential look: fluid/particle surfaces, drag-to-explore, sound
16
+ - **refined** — premium clean business look: whitespace, photography, calm minimal motion (the professional pole)
17
+ Plus a "none — plain design doctrine only" option. Skip the question only when the user already named the treatments or the request is trivially a restyle; read each chosen `skills/<name>.md` before designing.
11
18
  - **Mode B — Visual round-trip (only when asked).** The user explicitly wants the visual editor ("open dreative", "let me edit visually"). Flow: **extract → baseline → serve requests → finish → apply**. Be token-frugal at every step: read only the files you need, never re-read the whole app, and keep JSON compact.
12
19
 
13
20
  Everything below §0 describes Mode B; the design doctrine paragraphs apply to both modes.
14
21
 
15
22
  **Design quality is a hard requirement.** `DESIGN.md` (same folder as this file) is the design doctrine. Read it ONCE before servicing the first `propose-skeletons`, `propose-variants`, `design-page`, or `edit-element` request, keep it in mind for all later ones, and run its pre-flight checklist (§12) before every respond. Requests may carry a `brief` object (aesthetic preset + vibe + dials set by the user in the UI); when present it is the user's explicit direction and overrides doctrine defaults. Before writing any `design-page` code, state (to yourself, one line) the register, the design read, and the signature element — if you cannot name all three, you are about to produce the generic default; stop and commit first.
16
23
 
17
- **Specialist skills.** The `skills/` folder next to this file holds expert playbooks for advanced work: `motion.md` (animation & scroll choreography), `3d.md` (WebGL/three.js/shaders), `interaction.md` (micro-interactions & effect craft), `immersive.md` (award-site worlds, spatial page transitions, scroll-as-journey), `cinematic.md` (dark shader-graded experiential interfaces: fluid/particle surfaces, drag-to-explore, click & hold, sound design — opt-in aesthetic). All are universal: they apply directly to any codebase in Mode A; the editor is never required. When a request's `plan.skills` lists names, read each listed `skills/<name>.md` ONCE before writing code (then keep it in mind, like DESIGN.md); when `plan.sections[].skills` tags a section, that section gets that treatment (e.g. "this hero has 3d"). If the brief/prompt clearly calls for one of these but the plan missed it, read it anyway. If a listed file isn't installed, proceed on DESIGN.md alone and note it to the user (`dreative install-skill` installs all).
24
+ **Specialist skills.** The `skills/` folder next to this file holds expert playbooks for advanced work: `motion.md` (animation & scroll choreography), `3d.md` (WebGL/three.js/shaders), `interaction.md` (micro-interactions & effect craft), `immersive.md` (award-site worlds, spatial page transitions, scroll-as-journey), `cinematic.md` (dark shader-graded experiential interfaces: fluid/particle surfaces, drag-to-explore, click & hold, sound design — opt-in aesthetic), `refined.md` (premium clean business/DTC/e-commerce: restraint, photography, whitespace — the calm pole). All are universal: they apply directly to any codebase in Mode A; the editor is never required. When a request's `plan.skills` lists names, read each listed `skills/<name>.md` ONCE before writing code (then keep it in mind, like DESIGN.md); when `plan.sections[].skills` tags a section, that section gets that treatment (e.g. "this hero has 3d"). If the brief/prompt clearly calls for one of these but the plan missed it, read it anyway. If a listed file isn't installed, proceed on DESIGN.md alone and note it to the user (`dreative install-skill` installs all).
25
+
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
+
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.
18
29
 
19
30
  ## 0. Setup
20
31
 
@@ -150,6 +150,15 @@ All of 3d.md §7 and immersive.md §6, plus:
150
150
  Branding 5…); butterfly/petal particles drift through; HUD = wordmark
151
151
  top-left, Index/Projects/Contact top-right, globe "world" button bottom-center,
152
152
  © year bottom-right. Heavy uniform film grain glues all of it together.
153
+ - **Single-flower lab page (verified on unseen.co/labs/blossom)**: the minimal
154
+ form of the genre — one WebGL subject (a blooming particle flower) on one
155
+ canvas, Lenis smooth scroll, headlines split into `overflow-hidden` line
156
+ masks (`splittext--line`) sliding up on arrival, and a two-family type system
157
+ (light serif with true italics — SangBleu-style — mixed into a neutral
158
+ grotesk). No drag, no sound, no HUD maximalism: one subject + line-mask type
159
+ + smooth scroll already reads as the genre. Start here; add §2 gestures only
160
+ if the brief earns them. (unseen.co's own home additionally runs a
161
+ `webgl-rain` particle layer over the scene — weather as grade texture.)
153
162
  - **Particle identity page**: brand mark as 50k particles that disperse on
154
163
  pointer force and reform; sections change the formation target; scroll
155
164
  velocity agitates; reduced-motion = the formed mark as a still.
@@ -161,6 +170,51 @@ All of 3d.md §7 and immersive.md §6, plus:
161
170
  on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
162
171
  the right call below motion dial 8 or on content-heavy sites.
163
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
+
164
218
  ## 7. Changing an existing site into this
165
219
 
166
220
  Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
@@ -30,7 +30,10 @@ intentional. Decide up front:
30
30
  No metaphor = you'll produce disconnected effects. The metaphor decides what
31
31
  transitions, camera moves, and layout make sense — everything below serves it.
32
32
  - Immersive sites still need an **escape hatch**: visible menu with plain links,
33
- working back button, deep-linkable routes. Lost visitors close tabs.
33
+ working back button, deep-linkable routes. Lost visitors close tabs. On touch
34
+ devices the escape hatch becomes the PRIMARY route (DESIGN.md §13): drag/
35
+ spatial navigation conflicts with native scroll, so mobile gets the index-list
36
+ world view or a swipe carousel, with the full world behind an explicit tap-in.
34
37
 
35
38
  ## 1. Architecture: one persistent stage
36
39
 
@@ -5,6 +5,8 @@ for hover effects, cursor work, tilt, glow, "make it feel alive/tactile/premium"
5
5
  It EXTENDS DESIGN.md §6/§9/§10 — every ban there still stands (no hover-scale on
6
6
  `<img>`, custom cursors only on explicit request, one marquee max). This skill is
7
7
  about the last 5% of feel: small, physical, consistent responses to input.
8
+ DESIGN.md §13 governs the touch story: everything pointer-driven here is
9
+ fine-pointer-only, and whatever hover reveals must be reachable by tap.
8
10
  If an effect needs different markup (wrappers, layers, split spans), follow
9
11
  DESIGN.md §11's transformation-depth ladder — offer the restructure and, once
10
12
  confirmed, change the structure rather than approximating the effect in CSS.
@@ -5,6 +5,8 @@ animation, parallax, scroll storytelling, kinetic type, or "cinematic" feel.
5
5
  It EXTENDS DESIGN.md §6 (which still applies: 100/300/500 durations, ease-out
6
6
  exponential curves, reduced-motion fallbacks, no scroll listeners, no bounce).
7
7
  This file is about doing ambitious motion WELL, not about adding more of it.
8
+ Every effect here needs a mobile strategy per DESIGN.md §13 (shorter pins,
9
+ halved parallax, 600ms mobile entrance budget) — decide it at design time.
8
10
  If the requested motion needs structure the current markup can't express (pinned
9
11
  sections, split text, persistent stages), use DESIGN.md §11's transformation-depth
10
12
  ladder: offer restructure as an option and, once confirmed, rebuild the markup —
@@ -127,6 +129,14 @@ tell. Instead:
127
129
  ~60-90px/s), masked edges with `mask-image: linear-gradient`.
128
130
  - **Scrub showcase**: sticky canvas/image sequence, `useScroll` on the wrapper,
129
131
  map progress to frame index / rotation; preload frames; ≤ 2.5 viewports tall.
132
+ - **Canvas product story** (capsul-in-pro.com's form): a single-product launch
133
+ page as one scroll-scrubbed narrative — the product renders on a full-page
134
+ canvas (image-sequence or WebGL) and scroll drives its assembly/rotation
135
+ while short copy beats fade in at fixed progress stops; the site ships as
136
+ one bundled app with explicit portrait/landscape variants (it gates on
137
+ orientation rather than half-working in both). Copy the shape: one subject,
138
+ one scrubbed timeline, copy anchored to progress ranges, per-orientation
139
+ choreography decided up front.
130
140
  - **Text on a path** (verified on epic.net): a manifesto paragraph flows along a
131
141
  curved SVG path (`<textPath>` or per-word transforms sampled from a curve) and
132
142
  relaxes toward straight lines as scroll progress advances — the curve
@@ -135,3 +145,78 @@ tell. Instead:
135
145
  ("PLAY VIDEO ⟲") slowly rotates around the pointer while it's over the media
136
146
  region — SVG `<textPath>` on a circle, damped position follow, constant
137
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.
@@ -0,0 +1,99 @@
1
+ # Dreative Specialist Skill — Refined Clean Business
2
+
3
+ Load this file when `plan.skills` includes `refined`, or the brief/prompt asks
4
+ for a "clean modern business site", premium-but-calm marketing, DTC/e-commerce
5
+ polish, "professional, not flashy", or names references like ch.maswitzerland.com
6
+ or lovvelavva.com. This is the OPPOSITE pole from immersive/cinematic: quality
7
+ expressed through restraint — spacing, photography, and type doing all the work,
8
+ with motion barely above zero. Most real client work lands here; treat it as a
9
+ craft discipline, not the absence of one.
10
+
11
+ It EXTENDS DESIGN.md (everything applies; this file tightens the dials). It does
12
+ NOT stack with `immersive`/`cinematic` — those are different registers. It pairs
13
+ well with a light dose of `interaction` (press states, underline draws) and the
14
+ first tier of `motion` (one hero sequence, 2-3 in-view reveals).
15
+
16
+ ## 0. The register: expensive silence
17
+
18
+ What separates premium-clean from generic-clean is not any element — it's the
19
+ ratios:
20
+
21
+ - **Whitespace is the brand.** Section padding 96-160px desktop / 56-80px
22
+ mobile; content max-width 1200-1320px with WIDE outer gutters; one idea per
23
+ viewport. If a section feels empty, that's the look working — resist filling.
24
+ - **Photography carries the emotion.** Real product/lifestyle imagery, art-
25
+ directed to one consistent grade (one light temperature, one background
26
+ family). Full-bleed image sections alternate with contained text sections —
27
+ the rhythm image / text / image IS the page structure. Never decorate around
28
+ weak imagery; demand or generate better imagery instead.
29
+ - **Type does hierarchy, color stays out of the way.** Near-monochrome palette:
30
+ warm or cool neutral family + ONE accent used almost exclusively on the
31
+ primary CTA and links. Backgrounds shift between 2-3 tints of the neutral
32
+ (e.g. white / #f6f5f2 / #111) to separate sections without borders.
33
+ - **Motion whispers.** Motion dial effectively ≤ 4: fade-rise entrances
34
+ (300-400ms, once), a sticky nav that gains a hairline+blur, underline draws,
35
+ press states. No parallax beyond 4%, no pinning, no canvas. A single
36
+ restrained signature (a slow ken-burns on the hero image, or a marquee of
37
+ press logos) is the ceiling.
38
+
39
+ ## 1. Page anatomy (marketing/DTC form)
40
+
41
+ The proven skeleton — vary the composition per DESIGN.md §5, not the order
42
+ logic:
43
+
44
+ 1. **Hero**: one full-width image or split layout; headline ≤ 8 words stating
45
+ the value in plain language; one CTA. No feature bullets in the hero.
46
+ 2. **Credibility strip**: press/client logos, real marks, grayscale or
47
+ single-tint (lovvelavva runs Forbes/Women's Health/Real Simple here —
48
+ this section converts and belongs high on DTC pages).
49
+ 3. **Value sections** (2-4): alternating image/text, each making ONE claim
50
+ with 1-2 sentences of support. Icons only if custom-drawn; three-generic-
51
+ icon-cards is the tell this register must avoid most.
52
+ 4. **Product/collection grid**: large images, generous gaps (24-32px), minimal
53
+ card chrome — image, name, price/one-liner; hover = image swap or subtle
54
+ zoom-crop INSIDE a fixed frame (no card growth).
55
+ 5. **Social proof**: 1-3 real testimonials with names/photos, editorial layout
56
+ (big quote type), never a 3-card testimonial row.
57
+ 6. **Closing CTA**: calm full-width section, one sentence, one button.
58
+ 7. **Footer**: structured, generous, quiet — the footer's polish is a trust
59
+ signal in this register; give it real columns, legal, newsletter.
60
+
61
+ E-commerce specifics: sticky add-to-cart on product pages (mobile bottom bar),
62
+ price always visible, shipping/returns reassurance near the CTA, cart as a
63
+ slide-over drawer not a page.
64
+
65
+ ## 2. The discovery-grid variant (cosmos.so-like)
66
+
67
+ For content/discovery products (galleries, moodboards, catalogs): near-zero
68
+ chrome around a masonry/justified image grid; dark or paper-white surface;
69
+ images at native aspect ratios (never uniform crops); hover = slight lift +
70
+ metadata fade-in on top of the image; infinite scroll with a sentinel loader;
71
+ the search/filter bar is the only persistent UI. The product IS the grid —
72
+ navigation, branding, and controls stay almost invisible until needed.
73
+
74
+ ## 3. What "modern" means here (2024+, not 2016 flat)
75
+
76
+ - Hairline borders (1px, 8-12% alpha) instead of shadows for structure; the
77
+ 2-3 stacked tinted shadows (interaction.md §3) reserved for genuinely
78
+ floating elements (dropdowns, drawers).
79
+ - Larger type than feels safe: body 17-18px on marketing pages, display
80
+ clamped 2.5-4.5rem, tight leading. Small timid type is the #1 dated tell.
81
+ - Radius system: one value family — either near-square (2-4px, editorial/
82
+ luxury) or soft (12-16px, DTC/consumer) — never mixed.
83
+ - Buttons: solid accent primary + quiet text-link secondary. Pill shape only
84
+ in the consumer/DTC variant. No outlined-button armies.
85
+ - Real `<img>`/`<picture>` with proper aspect-ratio boxes; no CSS-drawn
86
+ product mockups; `object-fit: cover` with art-directed focal points.
87
+
88
+ ## 4. Guardrails
89
+
90
+ - If you're adding an effect to make a section interesting, the section's
91
+ content or imagery is the problem — fix that instead.
92
+ - No gradient meshes, no glassmorphism cards, no floating blob backgrounds,
93
+ no emoji in UI copy: all instantly cheapen this register.
94
+ - Accessibility floor is easy here — don't squander it: AA contrast on the
95
+ tinted neutrals (test the #767676-gray-on-white trap), visible focus,
96
+ semantic landmarks.
97
+ - Performance IS the aesthetic: LCP image preloaded, fonts ≤ 2 files,
98
+ zero animation libraries unless motion is actually used — a clean site
99
+ that loads instantly reads as more premium than any effect.