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.
- package/README.md +49 -27
- package/dist/cli/audit.js +206 -0
- package/dist/cli/audit.test.js +79 -0
- package/dist/cli/docsCheck.js +163 -0
- package/dist/cli/docsCheck.test.js +8 -0
- package/dist/cli/index.js +81 -8
- package/dist/server/preview.js +73 -73
- package/dist/server/store.js +11 -0
- package/dist/shared/artifacts.js +162 -0
- package/dist/shared/design.js +42 -22
- package/dist/shared/ruleSystem.js +130 -0
- package/dist/shared/ruleSystem.test.js +187 -0
- package/dist/shared/skillSystem.js +173 -0
- package/dist/shared/skillSystem.test.js +110 -0
- package/dist/ui/assets/{index--vztc_MR.js → index-CKwmbx2j.js} +13 -13
- package/dist/ui/index.html +12 -12
- package/package.json +5 -3
- package/skill/dreative/DESIGN.md +290 -95
- package/skill/dreative/PLAN.md +462 -71
- package/skill/dreative/SKILL.md +230 -126
- package/skill/dreative/frameworks/nextjs.md +13 -0
- package/skill/dreative/frameworks/react-vite.md +12 -0
- package/skill/dreative/frameworks/styling.md +14 -0
- package/skill/dreative/frameworks/sveltekit.md +10 -0
- package/skill/dreative/frameworks/vue-nuxt.md +12 -0
- package/skill/dreative/recipes/3d-recipes.md +44 -0
- package/skill/dreative/recipes/cinematic-recipes.md +19 -0
- package/skill/dreative/recipes/immersive-recipes.md +18 -0
- package/skill/dreative/recipes/media-recipes.md +60 -0
- package/skill/dreative/recipes/motion-recipes.md +44 -0
- package/skill/dreative/references/ARTIFACTS.md +180 -0
- package/skill/dreative/references/REFLEX_FONTS.json +44 -0
- package/skill/dreative/references/RULES.json +186 -0
- package/skill/dreative/references/SKILL_CONTRACT.md +30 -0
- package/skill/dreative/references/TIERS.md +42 -0
- package/skill/dreative/schemas/plan.schema.json +241 -0
- package/skill/dreative/schemas/verify.schema.json +61 -0
- package/skill/dreative/skills/3d.md +94 -157
- package/skill/dreative/skills/cinematic.md +56 -232
- package/skill/dreative/skills/experimental.md +111 -0
- package/skill/dreative/skills/immersive.md +61 -223
- package/skill/dreative/skills/interaction.md +9 -1
- package/skill/dreative/skills/media.md +135 -216
- package/skill/dreative/skills/mobile.md +128 -117
- package/skill/dreative/skills/motion.md +89 -229
- package/skill/dreative/skills/refined.md +116 -102
- package/skill/dreative/skills/ux.md +155 -144
- package/dist/server/ai.js +0 -177
package/dist/ui/index.html
CHANGED
|
@@ -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
|
|
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.
|
|
4
|
-
"description": "
|
|
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
|
},
|
package/skill/dreative/DESIGN.md
CHANGED
|
@@ -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
|
|
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.
|
|
54
|
-
|
|
55
|
-
1. **
|
|
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,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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.
|
|
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:
|
|
522
|
-
ratio committed; body ≥16px at
|
|
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 (
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
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.
|
|
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.
|