dreative 0.5.0 → 0.5.2

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.
Files changed (48) hide show
  1. package/README.md +49 -27
  2. package/dist/cli/audit.js +206 -0
  3. package/dist/cli/audit.test.js +79 -0
  4. package/dist/cli/docsCheck.js +163 -0
  5. package/dist/cli/docsCheck.test.js +8 -0
  6. package/dist/cli/index.js +81 -8
  7. package/dist/server/preview.js +73 -73
  8. package/dist/server/store.js +11 -0
  9. package/dist/shared/artifacts.js +162 -0
  10. package/dist/shared/design.js +42 -22
  11. package/dist/shared/ruleSystem.js +130 -0
  12. package/dist/shared/ruleSystem.test.js +187 -0
  13. package/dist/shared/skillSystem.js +173 -0
  14. package/dist/shared/skillSystem.test.js +110 -0
  15. package/dist/ui/assets/{index--vztc_MR.js → index-CKwmbx2j.js} +13 -13
  16. package/dist/ui/index.html +12 -12
  17. package/package.json +5 -3
  18. package/skill/dreative/DESIGN.md +290 -95
  19. package/skill/dreative/PLAN.md +462 -71
  20. package/skill/dreative/SKILL.md +230 -126
  21. package/skill/dreative/frameworks/nextjs.md +13 -0
  22. package/skill/dreative/frameworks/react-vite.md +12 -0
  23. package/skill/dreative/frameworks/styling.md +14 -0
  24. package/skill/dreative/frameworks/sveltekit.md +10 -0
  25. package/skill/dreative/frameworks/vue-nuxt.md +12 -0
  26. package/skill/dreative/recipes/3d-recipes.md +44 -0
  27. package/skill/dreative/recipes/cinematic-recipes.md +19 -0
  28. package/skill/dreative/recipes/immersive-recipes.md +18 -0
  29. package/skill/dreative/recipes/media-recipes.md +60 -0
  30. package/skill/dreative/recipes/motion-recipes.md +44 -0
  31. package/skill/dreative/references/ARTIFACTS.md +180 -0
  32. package/skill/dreative/references/REFLEX_FONTS.json +44 -0
  33. package/skill/dreative/references/RULES.json +186 -0
  34. package/skill/dreative/references/SKILL_CONTRACT.md +30 -0
  35. package/skill/dreative/references/TIERS.md +42 -0
  36. package/skill/dreative/schemas/plan.schema.json +241 -0
  37. package/skill/dreative/schemas/verify.schema.json +61 -0
  38. package/skill/dreative/skills/3d.md +94 -157
  39. package/skill/dreative/skills/cinematic.md +56 -232
  40. package/skill/dreative/skills/experimental.md +111 -0
  41. package/skill/dreative/skills/immersive.md +61 -223
  42. package/skill/dreative/skills/interaction.md +9 -1
  43. package/skill/dreative/skills/media.md +135 -216
  44. package/skill/dreative/skills/mobile.md +128 -117
  45. package/skill/dreative/skills/motion.md +89 -229
  46. package/skill/dreative/skills/refined.md +116 -102
  47. package/skill/dreative/skills/ux.md +155 -144
  48. package/dist/server/ai.js +0 -177
@@ -1,13 +1,13 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Dreative</title>
7
- <script type="module" crossorigin src="/assets/index--vztc_MR.js"></script>
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Dreative</title>
7
+ <script type="module" crossorigin src="/assets/index-CKwmbx2j.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-y0gVjC7u.css">
9
- </head>
10
- <body>
11
- <div id="root"></div>
12
- </body>
13
- </html>
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dreative",
3
- "version": "0.5.0",
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.",
3
+ "version": "0.5.2",
4
+ "description": "Frontend design skill for coding CLIs with typed planning, specialist treatments, verification, and an optional visual editor.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "dreative": "dist/cli/index.js"
@@ -14,7 +14,9 @@
14
14
  "build": "npm run build:server && npm run build:ui",
15
15
  "prepublishOnly": "npm run build",
16
16
  "build:server": "tsc -p tsconfig.json",
17
- "build:ui": "vite build",
17
+ "build:ui": "vite build",
18
+ "test": "npm run build:server && node --test dist/shared/*.test.js dist/cli/*.test.js",
19
+ "docs-check": "npm run build:server && node dist/cli/index.js docs-check",
18
20
  "dev": "concurrently \"tsx watch src/cli/index.ts --no-open\" \"vite\"",
19
21
  "start": "node dist/cli/index.js"
20
22
  },
@@ -2,8 +2,8 @@
2
2
 
3
3
  You MUST read this file before servicing any `propose-skeletons`, `propose-variants`,
4
4
  `design-page`, or `edit-element` request, and run §12 before every respond. It exists
5
- because LLM-designed UIs converge on one templated look. Every rule corrects a known
6
- model default; none is a suggestion. Requests may carry a `plan` (Dreative's
5
+ because LLM-designed UIs converge on one templated look. Every rule corrects a known
6
+ model default, but its category determines how it governs. Requests may carry a `plan` (Dreative's
7
7
  pre-computed decision: dials, per-section layout families, budgets, lints) — execute
8
8
  the plan, apply this doctrine to everything the plan doesn't specify. When
9
9
  `plan.skills` names specialist skills (`motion`, `3d`, `interaction`, `immersive`,
@@ -11,6 +11,17 @@ the plan, apply this doctrine to everything the plan doesn't specify. When
11
11
  `skills/<name>.md` files extend this doctrine for that request — read them first;
12
12
  where they go deeper than a section here, they win.
13
13
 
14
+ Rules use the three categories in `references/RULES.json`. **Hard gates** cover
15
+ objective failures—preservation, functionality, mobile/reduced motion, content
16
+ visibility, spatial integrity, organic-subject honesty, fallbacks, assets, and
17
+ real verification—and cannot be waived. **Evidence-backed defaults** are proven
18
+ remedies for repeated dogfood failures; follow them or declare a planning-time
19
+ alternative with measurable criteria and runtime evidence. **Creative
20
+ provocations** force divergent exploration but do not become shipment checklists.
21
+ When attention is scarce, hard gates outrank defaults, and defaults outrank
22
+ stylistic preference—but a page that only clears gates and shows no point of
23
+ view is still a failure of this file.
24
+
14
25
  ## 1. Register: the first decision
15
26
 
16
27
  Every page is one of two registers. Misclassifying it is the biggest single error.
@@ -48,21 +59,145 @@ Then run three tests on your intended output; restart if any fails:
48
59
  3. **Competitor sentence**: describe what you're about to build as a competitor would
49
60
  describe theirs. If the sentence fits the modal page in the category, restart.
50
61
 
51
- ### The working process: commit before code
52
-
53
- Never design by accretion. Two passes:
54
-
55
- 1. **Commit** — before any code, write a compact spec: 4-6 named colors (hex/OKLCH),
62
+ ### The working process: explore, commit, review — before code
63
+
64
+ Never design by accretion, and never commit to the first concept. Three passes:
65
+
66
+ 1. **Explore** — sketch THREE genuinely divergent concepts, one line each:
67
+ palette strategy + type voice + signature element + hero thesis. Different
68
+ families of idea, not three shades of one (if two concepts share a palette
69
+ strategy or signature type, they are one concept — replace one). The slop
70
+ tests below are filters: they reject bad ideas but never generate better
71
+ ones; this pass is where a better idea gets a chance to exist. Pick one,
72
+ and record the two rejects with a one-line reason in the plan file
73
+ (PLAN.md §4).
74
+
75
+ **The entropy draw (before sketching, at expressive/award ambition).** Your
76
+ "random" pick is your reflex — the same fonts, the same hero move, run
77
+ after run. So the variance comes from OUTSIDE your head: roll a real random
78
+ number (`node -e "console.log(1+require('crypto').randomInt(20))"`, or
79
+ `$RANDOM % 20 + 1`, or read digits off `date +%N`) and record the literal
80
+ command AND its output in plan.md. The roll picks one **provocation** from
81
+ the table below; at least ONE of the three explore concepts must take it
82
+ literally. If that concept wins, the provocation becomes a candidate;
83
+ experimental delivery selects only the strongest two or three peaks instead
84
+ of forcing every candidate to ship. Roll a second number (1–6) to pick a **forced-rotation
85
+ axis** — 1 palette strategy · 2 type voice · 3 hero concept · 4 nav/page
86
+ architecture · 5 signature driver · 6 set-piece family — and that axis must
87
+ differ from anything in your ledger's last 3 entries AND from the most
88
+ obvious genre default. One re-roll is allowed per table if the result is
89
+ genuinely incompatible with the brief or usability — record both rolls and
90
+ the reason. A plan file with no recorded roll at expressive+ is incomplete.
91
+
92
+ **Provocation table (roll 1–20):**
93
+ 1. The hero image is not a rectangle.
94
+ 2. One image behaves like a physical object — mass, drag, inertia, release.
95
+ 3. Type and imagery share one depth space; one passes through the other.
96
+ 4. The page has a light source, and media visibly responds to it.
97
+ 5. Scroll does something besides move the page down in one section.
98
+ 6. The cursor is an instrument from the subject's world and acts on media.
99
+ 7. One section is traversed by dragging, not scrolling.
100
+ 8. An image disassembles into what it is physically made of.
101
+ 9. Media leaks outside its frame and touches the UI around it.
102
+ 10. Something never stops moving, slowly, for the whole visit.
103
+ 11. The visitor's behavior (speed, hesitation, return) changes an element.
104
+ 12. Two media assets visibly react to each other.
105
+ 13. A transition destroys something that reassembles as something else.
106
+ 14. The palette of a chapter is sampled live from the media on screen.
107
+ 15. One interaction hands the visitor control they didn't expect to have.
108
+ 16. Something pulses to an invisible rhythm, like sound with the audio cut.
109
+ 17. The signature element recurs at three scales/roles across the page.
110
+ 18. An ordinary control (button, input, nav) is built from the scene itself.
111
+ 19. One moment of true depth: layers visibly separate and re-stack.
112
+ 20. The final section answers the hero — a visual callback with a twist.
113
+ 2. **Commit** — write the winner as a compact spec: 4-6 named colors (hex/OKLCH),
56
114
  2+ type roles with actual font names, a one-sentence layout description per
57
- section, and ONE **signature element** the single memorable move (an
58
- interaction, a typographic device, a composition) that carries the page's
59
- distinctiveness. Spend your boldness there; keep everything around it disciplined
60
- and quiet. Ground choices in the subject's world: its materials, instruments,
61
- artifacts, and vernacular ("a coffee brand's world: burlap, roast curves,
62
- thermometers, cupping notes") not in web-design tropes.
63
- 2. **Review**test the spec against the slop tests below. If any part could apply
115
+ section, the **compositional spine** (§5), the page's ACTUAL hero headline
116
+ plus 2-3 section headlines written in the brand's voice (copy precedes
117
+ layout type and composition are designed around real words, never
118
+ lorem-shaped assumptions; §8 governs the writing), and ONE **signature
119
+ element** with a mini-spec of its own: what it is, what drives it
120
+ (scroll / cursor / time / data), and why it could only belong to THIS brand
121
+ (subject-world grounding)plus a novelty check: seen on a template, or in
122
+ your own ledger (below)? Invent again. Spend your boldness there; keep
123
+ everything around it disciplined and quiet. Ground choices in the subject's
124
+ world: its materials, instruments, artifacts, and vernacular ("a coffee
125
+ brand's world: burlap, roast curves, thermometers, cupping notes") — not in
126
+ web-design tropes.
127
+ 3. **Review** — test the spec against the slop tests below. If any part could apply
64
128
  to any similar project, revise that part. Only then build.
65
129
 
130
+ **The choice ledger (anti-self-similarity across projects).** Slop tests can't
131
+ see your own history — repeating yourself project after project is a
132
+ monoculture of one. A global ledger at `~/.dreative/ledger.md` records one
133
+ line per completed build: date · project · display/body fonts · palette
134
+ strategy + hue · signature-element type · hero concept. During the commit
135
+ pass, read it if it exists: anything in the new spec that repeats an axis
136
+ from the last 3 entries is now YOUR reflex — rework that axis. After
137
+ verification, append this build's line (create the file if missing). The
138
+ ledger is also a taste memory: when the user gives a verdict on a shipped
139
+ build ("the hero feels generic", "too much motion"), append it to that
140
+ build's entry as a one-line `lesson:` — and the commit pass reads lessons
141
+ alongside choices, so the same critique never has to be given twice.
142
+
143
+ **No-media builds: structure IS the media.** When a build ships zero
144
+ imagery (no image-gen tool, product register, or the user chose
145
+ placeholders), the ambition tier does NOT tier down — it transfers whole
146
+ onto layout, type, and motion, and this is where no-media builds die: the
147
+ executor, with no assets to arrange, collapses to the one layout it knows
148
+ (a vertical list of rounded cards in a centered column) and ships slop that
149
+ its own plan didn't describe. Hard rules for any expressive+ no-media build:
150
+
151
+ 1. **The compositional spine must survive to the screenshot.** Whatever
152
+ bespoke structure the plan named (a strip rack, a ledger, a switchboard,
153
+ a timetable) must be RECOGNIZABLE as that thing in the shipped page — its
154
+ physical vocabulary built for real: the holder edge, the notch, the rail,
155
+ the perforation, the column rules. If a stranger shown the screenshot and
156
+ the blueprint's layout-family words couldn't match them, the build
157
+ restyled a card list and called it the spine — that is a depth-honesty
158
+ failure (§11), not a detail.
159
+ 2. **≥ 2 bespoke drawn/procedural artifacts.** With no photography, the page
160
+ earns visual richness from things MADE for it: a live canvas (meter,
161
+ field, trace), custom SVG structure (rules, notches, connectors, dials —
162
+ drawn, not icon-font), procedural texture/grain, a data-driven ornament.
163
+ A no-media page whose only visuals are borders and border-radius has no
164
+ media plan at all.
165
+ 3. **Type does structural work.** Multi-scale composition (oversized
166
+ numerals/designators against small mono metadata), real hierarchy per §6
167
+ — not one font-size row layout repeated N times.
168
+ 4. **Motion budget spends on the structure**, not on entrance fades: the
169
+ spine's own physicality (things racked, tossed, slid, stamped) is the
170
+ choreography. Motion.md's inventory applies at full dial.
171
+ 5. **A live rendered layer is required at award tier.** No imagery does not
172
+ mean no rendering: the page ships at least one WebGL/canvas system doing
173
+ real graphic work — a particle field, procedural texture/flowfield,
174
+ shader-lit surface, a data-driven instrument that never stops — plus
175
+ dimensional motion somewhere real (CSS 3D card physicality, depth-layered
176
+ parallax, a lit WebGL surface). A no-media award page with zero rendered
177
+ pixels is a text document with transitions. Vocabulary to draw from
178
+ (subject-grounded, not decorative): oscilloscope/waveform traces driven by
179
+ real events · topographic contour lines drifting · dot-matrix/LED field
180
+ that spells live state · plexus line-network connecting related items ·
181
+ isometric grid that lights under the cursor · scan sweep across data
182
+ rows · ASCII/character rain in the brand's glyphs · particle flow along
183
+ the layout's own rails · generative engraving borders · a physical sim
184
+ (springs, gravity) on the UI's actual objects.
185
+ 6. **Layout creativity means spatial composition, not relocated chrome.**
186
+ Moving the nav to the bottom, a novel tab bar, an unusual dock — that is
187
+ furniture rearrangement, and if it's the build's ONLY inventive move the
188
+ build failed. The invention must live in how the CONTENT is composed:
189
+ asymmetric multi-scale grids, overlapping planes, diagonal/rotated flow,
190
+ sections that share edges and interlock — while staying rigorously
191
+ modern and clean (generous space, disciplined alignment, few colors).
192
+ "Clean" and "insane motion" are the same build: calm composition,
193
+ spectacular behavior.
194
+
195
+ The slop tests above apply to the RENDERED page: "dark theme + rounded
196
+ cards + one accent color" fails the competitor sentence for every no-media
197
+ product tool at once — and shipped exactly that once (user verdict on
198
+ record: "pure ai slop… I would not want something like that again"). Treat
199
+ these rules as a shipped-failure postmortem, not theory.
200
+
66
201
  **Hero thesis:** open with the most characteristic thing in the subject's world —
67
202
  a headline, an image, a live demo, an interactive moment. Whatever form fits.
68
203
 
@@ -87,20 +222,27 @@ a headline, an image, a live demo, an interactive moment. Whatever form fits.
87
222
 
88
223
  ## 3. Typography
89
224
 
90
- **Font selection procedure (brand register, never skip):**
91
- 1. Write three physical-object brand-voice words ("warm, mechanical, opinionated" —
92
- never "modern" or "elegant").
93
- 2. List the three fonts you'd reach for by reflex. Reject any on the ban list below.
94
- 3. Pick for the brand as a physical object (museum caption, 1970s terminal manual,
95
- concert poster, mid-century receipt). Reject the first thing that "looks designy".
96
- 4. If the final pick matches the original reflex, start over.
97
-
98
- **Reflex-reject fonts (training-data defaults, banned as defaults):** Fraunces,
99
- Newsreader, Lora, Crimson (all), Playfair Display, Cormorant (all), Syne, IBM Plex
100
- (all), Space Mono, Space Grotesk, Inter, DM Sans/Serif, Outfit, Plus Jakarta Sans,
101
- Instrument Sans/Serif. Inter/system stacks ARE legitimate in the product register
102
- and for trust briefs. When an existing app already uses one, identity-preservation
103
- wins keep it.
225
+ **Font selection procedure (brand register, never skip):**
226
+ 1. Write three physical-object brand-voice words ("warm, mechanical, opinionated" —
227
+ never "modern" or "elegant").
228
+ 2. Read the last three display fonts from the design ledger and generate at least
229
+ three candidates for this brand, including continuity candidates when an
230
+ existing identity or design system matters.
231
+ 3. Mark candidates found in `references/REFLEX_FONTS.json`. A reflex font is not
232
+ bad or prohibited; it is a frequently unexamined choice that needs a specific
233
+ reason if it wins.
234
+ 4. Pick for the brand as a physical object (museum caption, 1970s terminal manual,
235
+ concert poster, mid-century receipt), supplied reference, product metrics,
236
+ language coverage, variable-font capability, or performance constraint.
237
+ 5. Record candidates and the winner in `plan.fontDecision`. If the winner is a
238
+ reflex font, record the concrete justification and at least one registry
239
+ category in `reasonKinds`. If it repeats one of the last three display fonts,
240
+ add a stronger repeat justification.
241
+
242
+ Valid reflex-font reason: "Inter is already embedded throughout this authenticated
243
+ product, preserves its density metrics and translated layout, and changing it
244
+ would damage brand continuity." Invalid reason: "Inter looks clean and modern."
245
+ The goal is to stop reflex selection, not to declare common fonts inherently bad.
104
246
 
105
247
  **Serif discipline:** "creative/premium brief = serif" is the most-tested AI tell.
106
248
  Default is sans display. Serif only when the brief is genuinely editorial/luxury/
@@ -175,6 +317,16 @@ When redesigning an extracted app, its `theme` colors are the brand — preserve
175
317
 
176
318
  ## 5. Layout
177
319
 
320
+ **Compositional spine (brand register, whenever variance > 4 or ambition is
321
+ expressive+).** Color and type get selection procedures; composition deserves
322
+ one too — the rules below only bound a layout, they don't give it a point of
323
+ view. Before applying them, derive ONE structural idea from a physical
324
+ artifact in the subject's world and let it organize the page: a vinyl label's
325
+ concentric rings → a radial hero; a boarding pass's rule structure → the
326
+ page grid; a contact sheet → the gallery; a cupping form → the comparison
327
+ table. Name artifact → idea in the commit spec (§2). The memorable award
328
+ sites win on composition, not decoration; this is where that happens.
329
+
178
330
  **Hard rules (failing any = broken work):**
179
331
  - Hero fits the initial viewport: headline ≤ 2 lines, subtext ≤ 20 words, CTA visible
180
332
  without scroll, top padding ≤ pt-24. 4-line headline is a font-size error. Max 4
@@ -260,65 +412,53 @@ library (Phosphor/Radix/Tabler/HugeIcons; Lucide only on request), one strokeWid
260
412
  globally. Logo walls: real SVG marks (`https://cdn.simpleicons.org/<slug>`) or
261
413
  generated monograms — logos only, no category captions, below the hero.
262
414
 
263
- ### Generated media (probe your environment, then use it)
264
-
265
- Before designing, check what media generation your environment actually offers —
266
- image-gen tools, video-gen tools, or a CLI that can produce them — and treat any
267
- capability found as a first-class design material, not a nice-to-have:
268
-
269
- - **Images**: generate hero photography, product/context shots, and textures at
270
- the section's exact aspect ratio, prompted for the brand's physical subject
271
- and the page's light temperature so they grade into the palette. Generate the
272
- grain tile and any masks/mattes too instead of hand-rolling SVG.
273
- - **Video**: a generated 5–10s seamless loop is one of the biggest single UI
274
- upgrades available use it as: a hero background (muted, `autoplay loop
275
- playsinline`, poster frame, `prefers-reduced-motion` swaps to the poster);
276
- the budget "living surface" (a pre-rendered fluid/particle/atmosphere loop
277
- instead of a GPGPU sim cinematic.md's budget recipe); hover-preview loops
278
- on work cards; or an image-sequence for scroll-scrubbed narratives (export
279
- frames, scrub per motion.md).
280
- - **Integrate with motion, don't just embed** a raw `<video>`/`<img>` dropped
281
- in a section is not the treatment. Generated media enters the page THROUGH the
282
- motion system; pick 1–2 treatments per page from this vocabulary (or invent in
283
- its spirit), matched to the register:
284
- - **Pixel/dither reveal**: video or image materializes from coarse blocks —
285
- a shader that lerps sample resolution from ~24px mosaic to full res (or a
286
- stepped `image-rendering: pixelated` downscale swap for the budget path),
287
- driven by scroll progress or hover. Reads as digital-craft; dark-tech and
288
- editorial registers.
289
- - **Floating media**: images hover in depth with slow damped drift (±6-10px,
290
- 4-8s loops, each at a different phase), subtle parallax by depth layer, and
291
- a soft contact shadow — the immersive "paper sheets in space" look without
292
- WebGL. Cap at 3-5 floaters per view.
293
- - **Mask-shaped video**: the loop plays inside display type (`background-clip:
294
- text` / SVG mask on a 10vw+ headline), an arch/circle clip-path, or the
295
- brand mark the video becomes typography/identity rather than a rectangle.
296
- - **Scroll-scrubbed sequence**: generated frames scrubbed by scroll for
297
- assemble/morph/rotate narratives (motion.md's canvas product story).
298
- - **Velocity-touched media**: scroll/drag velocity stretches, RGB-splits, or
299
- ripples the media plane for a beat, settling with damped decay
300
- (cinematic.md §2) needs the WebGL media-plane sync.
301
- - **Hover-woken loops**: stills that crossfade into their video loop on
302
- hover/focus (240ms), pause + rewind-to-poster on leave; works as generated
303
- "living thumbnails" on work/product cards.
304
- - **Curtain/split reveal**: media enters behind a 2-4 panel wipe or an
305
- expanding inset clip (`clip-path: inset(40% 30%) → inset(0)`), timed with
306
- the section's line-mask type reveal so image and headline arrive as one
307
- choreographed beat.
308
- Whatever the treatment, honor the floors: reduced-motion gets the poster
309
- frame, hover treatments have focus equivalents, and the effect is justified
310
- in one sentence like any other motion (§6).
311
- - Discipline: same rationing as everything else — one video loop per view,
312
- compress hard (H.264/AV1, ≤ 2–4MB per loop, no audio track), lazy-load below
313
- the fold, and never let generated media replace REAL product screenshots or
314
- the client's actual photography when those exist.
315
- - If no generation capability exists, say so and fall back down the §7 priority
316
- list — never fake a video with a div animation.
317
- - `skills/media.md` is this section's deep dive: the production pipeline
318
- (prompting for the page's light, compression targets, frame sequences), the
319
- full DOM-tier and WebGL media-plane treatment vocabulary, and the
320
- entrance/idle/response reasoning frame. Read it whenever generated media or
321
- motion-integrated imagery ships.
415
+ ### Generated media (probe your environment, then use it)
416
+
417
+ Before designing, check what media generation your environment actually offers —
418
+ image-gen tools, video-gen tools, or a CLI that can produce them — and treat any
419
+ capability found as a first-class design material, not a nice-to-have. Generate
420
+ for the section's exact ratio, physical subject, and light temperature. Preserve
421
+ real product screenshots and supplied photography when they are authoritative.
422
+
423
+ Do not choose a media treatment from a catalog here. First record three original
424
+ brand-native concepts in `conceptExploration`; then read `skills/media.md` for
425
+ principles. Open `recipes/media-recipes.md` only afterward for feasibility,
426
+ implementation, performance, or fallback guidance, and log that access in
427
+ `recipeAccess`. A raw `<video>` or `<img>` is not a treatment: the chosen media
428
+ system must develop the concept and retain poster/static, focus/touch, reduced-
429
+ motion, low-power, and loading fallbacks. If generation is unavailable, use the
430
+ §7 source priority instead of simulating media with decorative divs.
431
+
432
+ ### Surface & light material identity for every layer
433
+
434
+ Flat untreated hex fills are the loudest AI tell after Inter-everywhere: real
435
+ designed surfaces are MADE of something and sit under a light. At expressive+
436
+ ambition every major surface (page background, hero, cards/panels, media
437
+ frames) carries at least one deliberate material cue, and the page declares
438
+ ONE light direction that everything obeys:
439
+
440
+ - **Grain/noise** — a 1-3% opacity tileable PNG/WebP noise overlay (one shared
441
+ asset; never `feTurbulence`) kills gradient banding and digital
442
+ flatness; vary its intensity by section as part of the pacing curve.
443
+ - **Light consistency**pick the light's direction once; every shadow,
444
+ edge-highlight, gradient hotspot, and 3D/scene light agrees with it. Tint
445
+ shadows toward the background hue (never pure black); give elevated
446
+ elements a subtle top edge-light (1px inset highlight) on dark themes.
447
+ - **Gradients are graded, not defaulted** two neighbouring hues from the
448
+ palette with a noise/dither pass, or a radial hotspot placed where the
449
+ light is; never the template diagonal of two loud complementaries.
450
+ - **Depth is layered, not dropped** combine a tinted ambient shadow + a
451
+ tighter contact shadow instead of one big blur; `backdrop-filter` glass
452
+ only where content actually passes beneath it.
453
+ - **Type can be a surface too** one display moment per page may carry
454
+ material (image/video masked into headline glyphs via `background-clip`,
455
+ a light sweep, foil/emboss shading) when the register supports it; body
456
+ text never does.
457
+
458
+ Clean registers (refined/product/brutalist) obey the same physics with
459
+ quieter amplitudes — grain nearly invisible, shadows tighter, no masked
460
+ type the discipline is identical, only the volume changes. "Clean" is a
461
+ designed material choice, never the absence of one.
322
462
 
323
463
  ## 8. Content and copy
324
464
 
@@ -375,6 +515,23 @@ product-register page and any redesign touching navigation, forms, or state.
375
515
  elements (animate the card's border/background/shadow instead).
376
516
  - Headline text that overflows its container at any breakpoint — test the actual
377
517
  copy; the viewport is part of the design.
518
+ - **The generic SaaS-template hero, banned by name.** Dark navy/purple
519
+ background with a soft color-blob (pink→orange or purple→blue) behind bold
520
+ sans headline ("We Make Brands Shine" register), an orange/pink gradient
521
+ pill CTA next to a ghost-outline secondary button, and a plain top nav —
522
+ this exact composition is what every ungrounded LLM defaults to and reads
523
+ as a template regardless of copy. If the in-progress design converges on
524
+ this (gradient-blob backdrop + gradient-pill CTA + generic bold claim
525
+ headline), stop and change at least the background treatment, the CTA
526
+ material, and the headline's specific claim before continuing.
527
+ - **Zero leaked tool/placeholder artifacts in shipped output, ever, no
528
+ exceptions.** Things like `[Image #1]`, `[Image: source: ...]`, `<image
529
+ placeholder>`, alt-text strings, markdown image syntax, or any other
530
+ tool/generation-pipeline token must never render as visible text/alt/aria
531
+ content on the page — this is the single most obvious "an LLM built this"
532
+ tell there is. Before shipping, grep the built output for `\[Image`,
533
+ `placeholder`, and any literal file paths from the generation pipeline; a
534
+ hit is a shipped bug, not a minor cosmetic issue.
378
535
 
379
536
  ## 11. Redesign and preservation (extracted apps)
380
537
 
@@ -510,7 +667,10 @@ rules for whatever the user said to keep (routes, legal copy, form semantics).
510
667
  Mentally verify; fix failures, then respond. If a box cannot be honestly ticked,
511
668
  the output is not done.
512
669
 
513
- 0. Commit pass done: named palette, named fonts, one signature element, subject-
670
+ 0. Explore + commit passes done: three divergent concepts sketched (rejects
671
+ recorded in the plan file), named palette, named fonts, real headlines
672
+ written, compositional spine named (when §5 requires it), signature element
673
+ with mini-spec + novelty check, choice ledger consulted (§2), subject-
514
674
  grounded. The quality floor (responsive to mobile, visible keyboard focus,
515
675
  reduced motion) is built silently — never announced in copy or comments.
516
676
  1. Register named (brand/product); design read stated; brief and plan obeyed.
@@ -518,8 +678,9 @@ the output is not done.
518
678
  3. Zero em/en-dashes visible. Zero banned tells from §10.
519
679
  4. One accent + one tinted-neutral family + one theme + one radius system + one
520
680
  icon family, locked page-wide; matches sibling pages of this project.
521
- 5. Fonts: not on the reflex-reject list (or justified by existing brand); scale
522
- ratio committed; body ≥16px at 45-75ch; caps tracked; data tabular.
681
+ 5. Fonts: three candidates considered; registry matches marked; any reflex winner
682
+ has a specific registered reason; scale ratio committed; body ≥16px at
683
+ 45-75ch; caps tracked; data tabular.
523
684
  6. Every CTA/form/placeholder passes WCAG AA; no CTA wraps; no duplicate CTA intent.
524
685
  7. Hero: ≤2-line headline, ≤20-word subtext, ≤4 elements, real visual, CTA above
525
686
  fold; centered only if variance ≤ 4 or manifesto brief.
@@ -609,10 +770,11 @@ desktop), at most 1 scroll-driven sequence per page, marquees pause when
609
770
  off-screen. Battery is a design constraint: continuous rAF loops must idle
610
771
  when nothing animates.
611
772
 
612
- ## 14. Typography sourcing (kill the Inter-everywhere default)
613
-
614
- The reflex-reject list (§3) says what NOT to reach for; this is where to reach
615
- instead. All fonts below are free (Google Fonts or Fontshare/ITF). The
773
+ ## 14. Typography sourcing (escape the first reflex)
774
+
775
+ Use this section only after the brand-register exercise in §3 has produced
776
+ several candidates; it is a sourcing aid, not a rejection or approved-font list.
777
+ All fonts below are free (Google Fonts or Fontshare/ITF). The
616
778
  commercial fonts real award sites use — verified: unseen.co sets **Saol
617
779
  Display Light/Italic + Neue Montreal**; unseen's Blossom lab sets **SangBleu
618
780
  Serif + PP Neue Montreal**; capsul-in-pro sets **Messina Sans** — are the
@@ -644,7 +806,12 @@ Per aesthetic register (display / body):
644
806
  not font novelty.
645
807
 
646
808
  Rules: still run §3's selection procedure — this list feeds step 3, it does
647
- not replace the brand-voice reasoning. Self-host via Fontshare/google-webfonts
809
+ not replace the brand-voice reasoning. **The named fonts are worked examples
810
+ of the procedure, not a menu**: a closed replacement list just becomes the new
811
+ monoculture one tier deeper. Any font here that appears in your choice
812
+ ledger's last 3 entries (§2) is now YOUR reflex — reject it in step 2 like the
813
+ banned list and run the procedure again; the same rotation duty applies to
814
+ §4's alternative palettes. Self-host via Fontshare/google-webfonts
648
815
  downloads (`font-display: swap`, preload the display weight only). Never ship
649
816
  more than 2 families / ~5 weight files. If the brief names a commercial font
650
817
  the project already licenses, use the real thing.
@@ -663,6 +830,34 @@ put it in flow. Decoration layers (glows, grain, orbs, canvas backgrounds) are
663
830
  `absolute inset-0 -z-10 pointer-events-none` — below content, never intercepting
664
831
  clicks, never between the user and a control.
665
832
 
833
+ **Persistent/traveling scene objects get a TRAVEL MAP.** Any element that
834
+ survives across sections — a fixed canvas object, a scroll-morphing prop, a
835
+ signature that "recurs" down the page — must have a scripted state PER
836
+ SECTION written in the plan blueprint: position, scale, opacity at each
837
+ chapter, chosen so it NEVER rests over a headline, body text, or control at
838
+ any scroll position (including mid-transition — occlusion while traveling
839
+ between keyframes counts). `pointer-events: none` solves clicks, not
840
+ reading: a decorative object visually covering words is a hard fail even
841
+ when clicks pass through. When a section's layout leaves no safe berth, the
842
+ object exits (fades/scales out) and re-enters at the next chapter — an
843
+ object with no scripted berth for a section defaults to HIDDEN there, not
844
+ to floating wherever the scroll math happens to park it.
845
+
846
+ **Dominant abstract objects must survive the "what is it?" test.** A large
847
+ abstract signature (orb, core, monolith) earns its prominence only if a
848
+ stranger reads it as either a nameable thing or deliberate scene
849
+ architecture (a horizon, an instrument, a frame). If the honest answer is
850
+ "a dark ball with rings," reduce it: shrink it to an accent, anchor it into
851
+ the composition (consistent berth, edges lit by the page's light, cropped
852
+ by a frame ON PURPOSE), or replace it with imagery. Ambiguity at accent
853
+ scale is intrigue; ambiguity at hero scale is confusion. The test is judged
854
+ from the SCREENSHOT, not from the plan's prose: naming the object "eclipse",
855
+ "thermal horizon", or "roast core" in the plan does not make a translucent
856
+ sphere read as one — if the verify screenshot shows a ball floating over a
857
+ photo, it fails regardless of what the plan swore it wasn't. At hero scale
858
+ the answer must be a nameable thing (see 3d.md §2: generic abstract forms are
859
+ supporting-only and can never be the promoted signature object).
860
+
666
861
  **Interactive elements never overlap other interactive elements.** Not at any
667
862
  breakpoint, not mid-animation, not after a toast appears. Two clickable things
668
863
  occupying the same pixels is an automatic fail — one of them is unreachable.