@ericrisco/rsc 3.1.4 → 3.3.0
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 +7 -6
- package/manifest.json +17 -68
- package/package.json +6 -1
- package/scripts/design-upstream.js +92 -0
- package/scripts/doctor.js +0 -24
- package/scripts/lib/default-skill-floor.js +5 -1
- package/scripts/lib/domains.js +2 -2
- package/scripts/lib/recommend.js +1 -3
- package/scripts/lib/retired-skills.js +7 -1
- package/skills/design/IMPECCABLE-LICENSE.txt +191 -0
- package/skills/design/SKILL.md +79 -328
- package/skills/design/THIRD_PARTY.md +26 -0
- package/skills/design/engine/LICENSE +21 -0
- package/skills/design/engine/RUN.md +515 -0
- package/skills/design/engine/UPSTREAM.json +4 -0
- package/skills/design/engine/assets/app.css +216 -0
- package/skills/design/engine/assets/base.css +105 -0
- package/skills/design/engine/assets/base.js +37 -0
- package/skills/design/engine/assets/charts.js +617 -0
- package/skills/design/engine/assets/scenes/stage.css +28 -0
- package/skills/design/engine/assets/scenes/stage.js +133 -0
- package/skills/design/engine/library/app.json +1327 -0
- package/skills/design/engine/library/directions.json +1078 -0
- package/skills/design/engine/library/heroes.json +1086 -0
- package/skills/design/engine/library/motions.json +92 -0
- package/skills/design/engine/library/palettes.json +1485 -0
- package/skills/design/engine/library/photos.json +7240 -0
- package/skills/design/engine/library/sections.json +4429 -0
- package/skills/design/engine/library/sites.json +8350 -0
- package/skills/design/engine/library/type.json +2024 -0
- package/skills/design/engine/references/app-screens.md +1199 -0
- package/skills/design/engine/references/colour.md +141 -0
- package/skills/design/engine/references/copy.md +177 -0
- package/skills/design/engine/references/critique.md +182 -0
- package/skills/design/engine/references/imagery.md +791 -0
- package/skills/design/engine/references/layout.md +292 -0
- package/skills/design/engine/references/motion.md +980 -0
- package/skills/design/engine/references/research.md +356 -0
- package/skills/design/engine/references/scenes.md +174 -0
- package/skills/design/engine/references/tells.md +115 -0
- package/skills/design/engine/references/type.md +170 -0
- package/skills/design/engine/scripts/assets.mjs +865 -0
- package/skills/design/engine/scripts/draw.mjs +584 -0
- package/skills/design/engine/scripts/inspect.mjs +303 -0
- package/skills/design/engine/scripts/lib/app-draw.mjs +203 -0
- package/skills/design/engine/scripts/lib/cdp.mjs +248 -0
- package/skills/design/engine/scripts/lib/probe.mjs +909 -0
- package/skills/design/engine/scripts/lib/rules.mjs +243 -0
- package/skills/design/engine/scripts/lint.mjs +119 -0
- package/skills/design/engine/scripts/scenes.mjs +124 -0
- package/skills/design/evals/cases.yaml +35 -46
- package/skills/design/references/design-md.md +49 -0
- package/skills/design/references/finish-review.md +46 -0
- package/skills/design/references/modes.md +51 -0
- package/skills/expo/SKILL.md +3 -4
- package/skills/marketing/references/landing-copy.md +2 -2
- package/skills/react/SKILL.md +2 -2
- package/skills/react-native/SKILL.md +3 -3
- package/skills/swift-ios/SKILL.md +1 -1
- package/skills/ui-engineering/SKILL.md +3 -4
- package/skills/ui-engineering/evals/cases.yaml +2 -2
- package/skills/variant-explorer/SKILL.md +4 -4
- package/skills/variant-explorer/evals/cases.yaml +1 -1
- package/targets/clone-bootstrap.mjs +1 -1
- package/scripts/lib/design-identity.js +0 -117
- package/scripts/lib/starting-point.js +0 -314
- package/skills/design/evals/README.md +0 -53
- package/skills/design/references/ai-tells.md +0 -75
- package/skills/design/references/brand-grounding.md +0 -197
- package/skills/design/references/copywriting-frameworks.md +0 -138
- package/skills/design/references/design-systems.md +0 -49
- package/skills/design/references/inspiration-sources.md +0 -96
- package/skills/design/references/landing-anatomy-and-cro.md +0 -202
- package/skills/design/references/motion-and-interaction.md +0 -232
- package/skills/design/references/research-method.md +0 -154
- package/skills/design/references/signature-and-craft.md +0 -148
- package/skills/design/references/starting-point.md +0 -75
- package/skills/design/references/trends-2026.md +0 -80
- package/skills/design/references/visual-system.md +0 -237
- package/skills/design/scripts/verify.sh +0 -357
- package/skills/design-dna/PROMPT.md +0 -211
- package/skills/design-dna/SKILL.md +0 -162
- package/skills/design-dna/design-dna.schema.json +0 -230
- package/skills/design-dna/evals/README.md +0 -64
- package/skills/design-dna/evals/cases.yaml +0 -68
- package/skills/design-dna/references/method.md +0 -436
- package/skills/design-dna/scripts/emit.py +0 -164
- package/skills/design-dna/templates/PROMPT.md.tmpl +0 -42
- package/skills/design-dna/templates/SKILL.md.tmpl +0 -42
- package/skills/design-dna/templates/check.py.tmpl +0 -143
- package/skills/design-loop/SKILL.md +0 -160
- package/skills/design-loop/evals/README.md +0 -56
- package/skills/design-loop/evals/cases.yaml +0 -60
- package/skills/motion-craft/SKILL.md +0 -125
- package/skills/motion-craft/evals/cases.yaml +0 -38
- package/skills/motion-craft/scripts/verify.sh +0 -75
package/skills/design/SKILL.md
CHANGED
|
@@ -1,360 +1,111 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design
|
|
3
|
-
description: "Use when designing or
|
|
4
|
-
tags: [design,
|
|
5
|
-
recommends: [
|
|
6
|
-
profiles: [full]
|
|
3
|
+
description: "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT component state (ui-engineering)."
|
|
4
|
+
tags: [design, ui, ux, landing, dashboard, frontend, taste]
|
|
5
|
+
recommends: [landing-copy, ui-engineering, accessibility, brand-identity, nextjs]
|
|
6
|
+
profiles: [minimal, core, full]
|
|
7
7
|
origin: risco
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# design
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
`../motion-craft/SKILL.md`'s; how a piece of interface should be BUILT — boundaries, state, the
|
|
15
|
-
loading and empty and error states — is `../ui-engineering/SKILL.md`'s. When a request could belong to
|
|
16
|
-
several of those, start from the one that owns the decision, not the one that owns the file. The motion reference in
|
|
17
|
-
this skill defers its mechanics to them rather than restating them.
|
|
12
|
+
A model left to design picks the average of every page it has seen. This skill takes those
|
|
13
|
+
decisions away from the model and makes it look at what it built.
|
|
18
14
|
|
|
15
|
+
- **A script deals the direction.** You choose among researched directions; you never invent one.
|
|
16
|
+
- **The idea comes from the subject,** not from the category.
|
|
17
|
+
- **Real pictures and full content,** never empty space dressed as restraint.
|
|
18
|
+
- **A real browser measures the page** at three widths. A `FAIL` means it is not done.
|
|
19
|
+
- **You look at the screenshots,** fix the worst, and look again.
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
The engine is [taste-skill](https://github.com/Leonxlnx/taste-skill) (MIT), shipped unmodified in
|
|
22
|
+
`engine/`. The modes, the fresh review and the design record adapt
|
|
23
|
+
[impeccable](https://github.com/pbakaus/impeccable) by Paul Bakaus (Apache-2.0). Credits and what
|
|
24
|
+
changed: `THIRD_PARTY.md`.
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
## 0. Name the surface and its mode
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
Decide before anything else. The mode is chosen from the surface, not from the product.
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
A design with no brand behind it is a guess, and a guess defaults to your AI-generic prior. That is why this gate is a hard stop rather than a warning: **an incomplete brand study blocks the work.**
|
|
29
|
-
|
|
30
|
-
Follow the harness 02-DOCS convention (brand study = wiki articles under `02-DOCS/wiki/brand/`, raw inputs under `02-DOCS/raw/brand/`, linked from root `CLAUDE.md`):
|
|
31
|
-
|
|
32
|
-
1. **Locate the brand study.** Read the project root `CLAUDE.md` and look for a `## Brand & voice` section pointing into `02-DOCS/wiki/brand/...`. If present, read those articles.
|
|
33
|
-
2. **If the link is MISSING, or the brand study is ABSENT or INCOMPLETE** (any checklist dimension empty), STOP. Do not design yet. Ask the user the targeted question script — **ONE focused batch at a time**, not a wall of questions — until every dimension in the completeness checklist is filled (→ `references/brand-grounding.md`). Write/update the brand study into `02-DOCS/wiki/brand/` (and paste any raw inputs the user gives — screenshots, existing palettes, competitor lists — into `02-DOCS/raw/brand/`), following the wiki article format, update `wiki/index.md` + `wiki/log.md`, and add/update a `## Brand & voice` section in the root `CLAUDE.md` linking to it (create `CLAUDE.md` if absent).
|
|
34
|
-
3. **Only once the brand study exists and is sufficient, proceed** — and cite which brand articles drove which decisions in your output (e.g. "palette from `02-DOCS/wiki/brand/visual-identity.md`").
|
|
35
|
-
|
|
36
|
-
The completeness checklist spans visual identity (OKLCH color system, type pairing & scale, logo, imagery/illustration mood, density, radius/shadow/motion personality), reference/inspiration sites the user loves, layout preferences, dark-mode stance, accessibility & performance constraints, and brand voice/positioning (so copy and design agree). Full checklist + exact question script → `references/brand-grounding.md`.
|
|
37
|
-
|
|
38
|
-
**When a dimension has no answer** — the non-technical default, and the reason this gate used to be impassable: do not invent one and do not wave the STOP through. `references/starting-point.md` is how a starting point gets proposed instead: what the project already owns is checked first, the value comes from a reference you opened and measured, and it is written marked `propuesto` — which does **not** count as complete until the user confirms it.
|
|
39
|
-
|
|
40
|
-
The order is: **brand grounding → trend research → build.**
|
|
41
|
-
|
|
42
|
-
## Pick a direction first
|
|
43
|
-
|
|
44
|
-
Fill the direction brief before you write a single line of markup:
|
|
45
|
-
|
|
46
|
-
```text
|
|
47
|
-
DIRECTION BRIEF (fill before coding)
|
|
48
|
-
1. Purpose .......... what job does this interface do, in one sentence?
|
|
49
|
-
2. Audience ......... who repeats this workflow; what do they scan first?
|
|
50
|
-
3. Tone ............. pick: utilitarian | editorial | playful | industrial | refined | technical | minimal | dense | calm
|
|
51
|
-
4. Memorable detail . the ONE idea that makes it feel intentional (not a gradient)
|
|
52
|
-
5. Constraints ...... framework, a11y, perf budget, existing design system/tokens
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Then map the project type to composition, density, and motion budget. Density and composition follow the audience and the job, not a template — a SaaS operations tool should be dense, quiet, and scannable.
|
|
56
|
-
|
|
57
|
-
| Project type | Composition | Density | Motion budget |
|
|
30
|
+
| Mode | The visitor… | Surfaces | Run |
|
|
58
31
|
| --- | --- | --- | --- |
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
| E-commerce | Product grid, fast PDP | Medium | Micro-interactions on add-to-cart |
|
|
64
|
-
| Docs | Sidebar + reading column | Calm, 65ch measure | Near-zero |
|
|
65
|
-
|
|
66
|
-
## Research-first protocol
|
|
67
|
-
|
|
68
|
-
Trends churn quarterly and your built-in aesthetic prior is the median of every AI template ever scraped. Never prescribe from stale memory; counter it with a loop:
|
|
69
|
-
|
|
70
|
-
1. Define 2–3 reference archetypes from the DIRECTION BRIEF (e.g. "Linear-grade dev tool, dark, type-led").
|
|
71
|
-
2. Browse the dated registry in `references/inspiration-sources.md` — whole pages to beat, SaaS and conversion surfaces, real product flows (Mobbin, Page Flows), single patterns, and the design systems that are specification rather than inspiration — plus the tier-1 sites (Linear, Stripe, Vercel, Cursor, Resend). Every entry there carries a verification date; `godly.website` now redirects to `recent.design`, which is exactly why the list is dated and not inline.
|
|
72
|
-
3. WebFetch 3–5 exemplars, prompting each for type, color, layout, motion, and copy voice — concrete details, not adjectives.
|
|
73
|
-
4. Extract a pattern table from what they share and where they differ.
|
|
74
|
-
5. Synthesize a one-paragraph DESIGN DIRECTION with citations (which URL contributed what).
|
|
75
|
-
6. Only THEN build; re-check the result against the references in QA.
|
|
76
|
-
|
|
77
|
-
Re-research per project — trends churn, competitors moved, and the domain dictates the reference set. Whenever the brand study lacks aesthetic direction or the user asks for "modern" / "2026" / "premium", run this loop, fold the findings into the output **with citations + dates**, and refresh `references/trends-2026.md`. Full loop, source map, and synthesis template → `references/research-method.md`. Current snapshot (dated, cited) → `references/trends-2026.md`.
|
|
78
|
-
|
|
79
|
-
## From competent to premium (the part that earns the score)
|
|
80
|
-
|
|
81
|
-
Obeying every constraint gets you to *competent* — a page that ships and passes review. It does NOT get you to premium, because every constraint catches an *absence* (no missing `<h1>`, contrast passes), while premium is a *presence*: a point of view. Competent-but-generic is the default failure mode of under-specified design output. Close it with four deliberate moves, in order, before and during the build:
|
|
82
|
-
|
|
83
|
-
1. **Choose a visual concept.** One sentence the whole page answers to — `[feeling] + [structural metaphor] for [audience doing job]` (e.g. "quiet instrument-panel precision for ops engineers"). Drawn from the brand study + research exemplars, never your prior. If you cannot name what makes this surface different from the median SaaS page, you have no concept yet, and the output will default to generic.
|
|
84
|
-
2. **Manufacture the ONE signature element** the brief asks for — the thing you'd describe first to a friend. Pick exactly one from a real vocabulary, biased by domain: a hero that *demonstrates not describes* (live terminal / real chart / actual diff), an owned type moment, a structural signature (asymmetric split, horizontal feature rail, editorial index), a material signature (hairline grid, one grain pass, duotone), a motion signature, or a real-number/proof signature. Never default to "a gradient". It must be true to the product, and cite the research exemplar that inspired it.
|
|
85
|
-
3. **Force scale contrast.** Generic pages are tonally flat — headline, titles, body all within ~1.5×. Make the hero dominant **3–5× the body**, demote eyebrows/labels/metadata smaller and quieter than feels comfortable, and allow **one focal point per viewport**. If a section feels flat, add contrast, not elements.
|
|
86
|
-
4. **Give the page rhythm.** Ten identical `py-24` white card-grid sections read as one stripe. Vary format (full-bleed vs. contained, alternate media sides), background (a dark section between light ones anchors a CTA), density (a breathing statement after a dense grid), and container idiom (not everything is a bordered card). Inter-section gap > intra-section gap, padding stepping on the scale.
|
|
87
|
-
|
|
88
|
-
Then, **before claiming done, run the senior-designer crit** and make at least one concrete change as a result: What is the one idea here (name it in a sentence)? Would this place on Awwwards/Godly or just pass review? What is the single most generic element right now — and replace it. Where does the eye land first, and is that what should win? If the logo were removed, would anyone know whose product this is? Does every section earn its place, or is one there out of habit (cut it)?
|
|
89
|
-
|
|
90
|
-
Concept formula, signature vocabulary, scale/rhythm rules, the crit, and a worked generic→signature dev-tool hero → `references/signature-and-craft.md`.
|
|
91
|
-
|
|
92
|
-
## Visual system in 90 seconds
|
|
93
|
-
|
|
94
|
-
Copy-pasteable foundation. Tokens once, consume everywhere — design tokens, never magic numbers.
|
|
95
|
-
|
|
96
|
-
- Tailwind v4 `@theme` block (OKLCH): tokens become CSS vars and utilities automatically — no `tailwind.config.js`.
|
|
97
|
-
- Type scale via `next/font` (one display + one text face) plus a fluid `clamp()` ladder.
|
|
98
|
-
- Spacing, radius, and shadow are tokens too, never inline numbers.
|
|
99
|
-
- The rule: arbitrary hex + random px = Bad; token references = Good.
|
|
100
|
-
|
|
101
|
-
```css
|
|
102
|
-
/* Good — Tailwind v4 @theme: OKLCH palette, tokens become CSS vars + utilities */
|
|
103
|
-
@import "tailwindcss";
|
|
104
|
-
@theme {
|
|
105
|
-
--color-bg: oklch(0.99 0 0);
|
|
106
|
-
--color-fg: oklch(0.21 0.01 256);
|
|
107
|
-
--color-muted: oklch(0.55 0.01 256);
|
|
108
|
-
--color-brand-500: oklch(0.62 0.19 256);
|
|
109
|
-
--color-brand-600: oklch(0.55 0.19 256);
|
|
110
|
-
--font-display: "Geist", ui-sans-serif, system-ui, sans-serif;
|
|
111
|
-
--font-text: "Inter", ui-sans-serif, system-ui, sans-serif;
|
|
112
|
-
--radius-card: 0.875rem;
|
|
113
|
-
--shadow-card: 0 1px 2px oklch(0 0 0 / 0.06), 0 8px 24px oklch(0 0 0 / 0.08);
|
|
114
|
-
--ease-out: cubic-bezier(0.22, 1, 0.36, 1);
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
```html
|
|
119
|
-
<!-- Bad — magic hex + arbitrary px, no system -->
|
|
120
|
-
<div style="background:#5b54ff;border-radius:13px;padding:17px">…</div>
|
|
121
|
-
<!-- Good — token-driven utilities -->
|
|
122
|
-
<div class="bg-brand-500 rounded-card p-4">…</div>
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
Full token system, type scale, OKLCH ramp, bento, glass → `references/visual-system.md`.
|
|
126
|
-
|
|
127
|
-
## Landing page build recipe ("the brutal landing")
|
|
32
|
+
| **Persuade** | decides and acts | landing, marketing, product site, pricing, event, local business | `engine/RUN.md`, the page run |
|
|
33
|
+
| **Experience** | is inside the work | portfolio, gallery, showcase | `engine/RUN.md`, the page run |
|
|
34
|
+
| **Operate** | completes a task | dashboard, admin, settings, inbox, editor | `engine/references/app-screens.md` |
|
|
35
|
+
| **Read** | understands something | docs, guide, article, changelog | the page run, under the Read rules |
|
|
128
36
|
|
|
129
|
-
|
|
37
|
+
What each mode allows and refuses: [references/modes.md](references/modes.md).
|
|
130
38
|
|
|
131
|
-
1.
|
|
132
|
-
2. **Social-proof strip** — borrow credibility immediately (logos, a hard metric).
|
|
133
|
-
3. **Problem / agitation** — name the pain in the reader's words.
|
|
134
|
-
4. **Solution** — show the product doing the job.
|
|
135
|
-
5. **Features → benefits (bento)** — translate each capability into an outcome.
|
|
136
|
-
6. **Objection handling** — preempt the top reason they won't buy.
|
|
137
|
-
7. **Pricing** — anchor, highlight one tier, default to annual.
|
|
138
|
-
8. **FAQ** — answer the real blockers, not filler.
|
|
139
|
-
9. **Final CTA** — one clear action, value on the button.
|
|
140
|
-
10. **Footer** — navigation, legal, trust signals.
|
|
39
|
+
## 1. Brand first, when there is one
|
|
141
40
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
41
|
+
Look for an existing identity before dealing anything: `02-DOCS/wiki/brand/`, a `DESIGN.md` in the
|
|
42
|
+
repo, or a coherent identity already in the code. If one exists, its colours and faces win: pass
|
|
43
|
+
`--keep palette,type` to the draw and take only the composition. If none exists, do not stop to
|
|
44
|
+
interview the user about brand; the draw is how a starting point is made.
|
|
145
45
|
|
|
146
|
-
|
|
147
|
-
return (
|
|
148
|
-
<main>
|
|
149
|
-
<section className="mx-auto max-w-5xl px-6 pt-24 text-center">
|
|
150
|
-
<h1 className="text-balance text-5xl font-semibold tracking-tight md:text-6xl">
|
|
151
|
-
Ship the change in an afternoon, not a sprint
|
|
152
|
-
</h1>
|
|
153
|
-
<p className="mx-auto mt-5 max-w-xl text-pretty text-lg text-fg/70">
|
|
154
|
-
Concrete benefit, who it is for, and why now — no hype.
|
|
155
|
-
</p>
|
|
156
|
-
<a
|
|
157
|
-
href="#start"
|
|
158
|
-
className="mt-8 inline-flex min-h-11 items-center rounded-card bg-brand-500 px-6 font-medium text-white transition-colors hover:bg-brand-600"
|
|
159
|
-
>
|
|
160
|
-
Start free
|
|
161
|
-
</a>
|
|
162
|
-
<Image
|
|
163
|
-
src="/hero.avif"
|
|
164
|
-
alt="Product dashboard showing a one-click deploy"
|
|
165
|
-
width={1200}
|
|
166
|
-
height={720}
|
|
167
|
-
priority
|
|
168
|
-
className="mt-16 rounded-card shadow-card"
|
|
169
|
-
/>
|
|
170
|
-
</section>
|
|
171
|
-
</main>
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
```
|
|
46
|
+
## 2. Run the engine
|
|
175
47
|
|
|
176
|
-
|
|
48
|
+
Follow [`engine/RUN.md`](engine/RUN.md) step by step. Read it whole before starting. In its commands,
|
|
49
|
+
`<skill>` is this skill's `engine/` folder. Nothing in it is optional:
|
|
177
50
|
|
|
178
|
-
|
|
51
|
+
1. Brief and inventory (eight to twelve things only this client has).
|
|
52
|
+
2. The argument: one claim per section; no claim, no section.
|
|
53
|
+
3. Deal three directions with `draw.mjs`, choose one against the inventory, write why.
|
|
54
|
+
4. The idea sentence, the competitor test, and one live thing.
|
|
55
|
+
5. The whole copy deck before markup. Never invent proof: customers, quotes, numbers, logos.
|
|
56
|
+
6. Build still: tokens, hero, sections, at least four real pictures (`assets.mjs`), the live thing.
|
|
57
|
+
7. Gate: `lint.mjs`, then `inspect.mjs` at 1440, 768 and 390. Zero `FAIL`.
|
|
58
|
+
8. Look: open every screenshot, critique with `engine/references/critique.md`. At most three rounds.
|
|
59
|
+
9. Move: the motion layer, then inspect again.
|
|
179
60
|
|
|
180
|
-
|
|
61
|
+
For a single component or section inside an existing design, skip the draw, inherit the system,
|
|
62
|
+
and still run the gate.
|
|
181
63
|
|
|
182
|
-
|
|
183
|
-
- Headline formula slots: outcome + timeframe; "X without Y"; the job-to-be-done.
|
|
184
|
-
- Framework picker: PAS for pain-aware cold traffic; AIDA for broad / top-of-funnel; FAB/JTBD for feature → benefit translation.
|
|
185
|
-
- CTA: put the value on the button ("Start free", "Get my estimate"), never "Submit".
|
|
64
|
+
## 3. Fresh review
|
|
186
65
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
66
|
+
The builder believes its own page. When the gate passes, hand the screenshots to a reviewer with no
|
|
67
|
+
history of this conversation (a fresh subagent where the harness has one). It returns one of four
|
|
68
|
+
words: `recapture`, `rebuild`, `fix` or `ship`. Act on the word. The packet and the checks:
|
|
69
|
+
[references/finish-review.md](references/finish-review.md).
|
|
191
70
|
|
|
192
|
-
|
|
71
|
+
## 4. Record the system
|
|
193
72
|
|
|
194
|
-
|
|
73
|
+
A new or replaced visual system is written to `DESIGN.md` at the project root, from what was built,
|
|
74
|
+
so later edits keep the look. Format: [references/design-md.md](references/design-md.md). Extending
|
|
75
|
+
an existing surface does not rewrite it.
|
|
195
76
|
|
|
196
|
-
##
|
|
77
|
+
## When the browser cannot run
|
|
197
78
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
- `prefers-reduced-motion` is required, not optional.
|
|
203
|
-
- Scroll-driven via native CSS `animation-timeline: view()` FIRST (no JS, no CLS) before any JS library.
|
|
79
|
+
`inspect.mjs` and `scenes.mjs` need Node 22+ and an installed Chrome, Edge or Chromium. Without them:
|
|
80
|
+
run `lint.mjs` (Node 18+), take screenshots with any browser tool you have, critique those, and
|
|
81
|
+
write in the report: **"inspector not run: <reason>"**. Never report a gate as passed that did not
|
|
82
|
+
run. Without network, draw the pictures and say the open collections could not be searched.
|
|
204
83
|
|
|
205
|
-
|
|
206
|
-
/* Good — native scroll-driven reveal, zero JS, explicit @supports fallback */
|
|
207
|
-
.reveal { opacity: 1; } /* default visible: no scroll-timeline support => never hidden */
|
|
208
|
-
@supports (animation-timeline: view()) {
|
|
209
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
210
|
-
.reveal {
|
|
211
|
-
animation: reveal linear both;
|
|
212
|
-
animation-timeline: view();
|
|
213
|
-
animation-range: entry 0% cover 30%;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
@keyframes reveal {
|
|
218
|
-
from { opacity: 0; translate: 0 16px; }
|
|
219
|
-
to { opacity: 1; translate: 0 0; }
|
|
220
|
-
}
|
|
221
|
-
```
|
|
84
|
+
## Report
|
|
222
85
|
|
|
223
|
-
|
|
86
|
+
Say briefly: the surface and mode; the direction dealt (name and seed) and any redraw with its
|
|
87
|
+
reason; the idea sentence and the live thing; the inspector result per width, or that it did not
|
|
88
|
+
run; the reviewer's word; every found picture with its credit; sample content to replace before
|
|
89
|
+
launch. Do not claim a check you did not run.
|
|
224
90
|
|
|
225
|
-
##
|
|
91
|
+
## Hand-offs
|
|
226
92
|
|
|
227
|
-
|
|
93
|
+
- The words on a conversion page → `../landing-copy/SKILL.md`.
|
|
94
|
+
- Component boundaries, state, loading and error behaviour → `../ui-engineering/SKILL.md`.
|
|
95
|
+
- WCAG conformance work → `../accessibility/SKILL.md`.
|
|
96
|
+
- A full brand system (logo, print colours, usage rules) → `../brand-identity/SKILL.md`.
|
|
97
|
+
- The App Router build → `../nextjs/SKILL.md`.
|
|
98
|
+
- A hero that is a pre-rendered camera flight in video, scrubbed by scroll → `../scroll-film/SKILL.md`.
|
|
228
99
|
|
|
229
|
-
|
|
230
|
-
| --- | --- | --- |
|
|
231
|
-
| Nested radius | Same radius parent + child | `outer = inner + padding` (concentric) |
|
|
232
|
-
| Shadows | One hard `0 4px 8px #000` | Layered transparent OKLCH shadows |
|
|
233
|
-
| Separation | Heavy drop shadow everywhere | Hairline 1px border first, shadow only for lift |
|
|
234
|
-
| Headings | Ragged wrap | `text-wrap: balance` |
|
|
235
|
-
| Body / captions | Orphan last word | `text-wrap: pretty` |
|
|
236
|
-
| Numbers/prices | Width jitters | `font-variant-numeric: tabular-nums` |
|
|
237
|
-
| Images | Edge blurs into bg | 1px neutral `outline`, `outline-offset: -1px` |
|
|
238
|
-
| Glass | `backdrop-blur` on everything | Blur + 1px hairline + subtle noise, sparingly |
|
|
100
|
+
## Files
|
|
239
101
|
|
|
240
|
-
|
|
241
|
-
html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
|
|
242
|
-
img { outline: 1px solid oklch(0 0 0 / 0.1); outline-offset: -1px; }
|
|
243
|
-
.price { font-variant-numeric: tabular-nums; }
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
Depth recipes, glass, noise, concentric math → `references/visual-system.md`.
|
|
247
|
-
|
|
248
|
-
## The three locks, and who checks them
|
|
249
|
-
|
|
250
|
-
A long page generated in passes drifts against itself. Three things must be **one** thing for
|
|
251
|
-
the whole page, and they are not preferences — a page that breaks one of them is defective:
|
|
252
|
-
|
|
253
|
-
1. **Theme lock.** One theme for the page (light, dark, or auto). No section flipping to
|
|
254
|
-
inverted halfway down because it looked good alone.
|
|
255
|
-
2. **Accent lock.** One accent, used identically in every section. **This one is judgement**:
|
|
256
|
-
deciding which token is the accent needs to read the system's intent, so no script claims
|
|
257
|
-
to check it — you do, before you claim done.
|
|
258
|
-
3. **Radius lock.** One radius system. Four different `rounded-*` scales in one tree means
|
|
259
|
-
there is no system, and `scripts/verify.sh` counts them.
|
|
260
|
-
|
|
261
|
-
## The tells the script owns, and the ones you own
|
|
262
|
-
|
|
263
|
-
`scripts/verify.sh` carries a **registry of mechanical tells** and reports each with file and
|
|
264
|
-
line: dashes in rendered copy, scroll cues, numbered eyebrows, build stamps on marketing
|
|
265
|
-
pages, unstable viewport heights, middot chains, hype words, plus counted ratios (eyebrows
|
|
266
|
-
against sections, double-bordered rows, radius scales). Run it; do not re-derive that list
|
|
267
|
-
from memory, and do not treat its silence as a design review.
|
|
268
|
-
|
|
269
|
-
What it cannot see is the other half: fabricated substance (a product UI built from divs,
|
|
270
|
-
invented photo credits, the Jane Doe cast), decoration posing as information, labels that say
|
|
271
|
-
nothing, and composition habits like three identical feature cards. That half is
|
|
272
|
-
`references/ai-tells.md`, and it is read with your eyes on the page.
|
|
273
|
-
|
|
274
|
-
When the brief corresponds to an official, maintained design system rather than an aesthetic —
|
|
275
|
-
UK or US public sector, Shopify admin, Carbon, Atlassian, Primer, Fluent — install the
|
|
276
|
-
official package instead of approximating it: `references/design-systems.md`.
|
|
277
|
-
|
|
278
|
-
## Anti-patterns
|
|
279
|
-
|
|
280
|
-
| Rationalization | Reality / Fix |
|
|
102
|
+
| File | What |
|
|
281
103
|
| --- | --- |
|
|
282
|
-
|
|
|
283
|
-
|
|
|
284
|
-
|
|
|
285
|
-
|
|
|
286
|
-
|
|
|
287
|
-
|
|
|
288
|
-
|
|
|
289
|
-
|
|
|
290
|
-
| "`transition: all` is convenient" | It animates layout props → jank. List exact properties. |
|
|
291
|
-
|
|
292
|
-
## Quick reference
|
|
293
|
-
|
|
294
|
-
Accessibility and Core Web Vitals are **design constraints, not post-launch tuning** — violating one is a defect, not a style choice. **WCAG 2.2 AA:** 4.5:1 text contrast (3:1 large text / UI), visible focus, `prefers-reduced-motion` honored. Target size: 24×24px is the AA floor (SC 2.5.8 Target Size (Minimum)); 44×44px is the recommended quality bar (Apple HIG / pointer comfort) — aim for 44, never ship below 24. **Core Web Vitals:** LCP < 2.5s, INP < 200ms, CLS < 0.1. (INP replaced FID in March 2024 — measure INP.)
|
|
295
|
-
|
|
296
|
-
| Lever | Default | Token / where |
|
|
297
|
-
| --- | --- | --- |
|
|
298
|
-
| Type scale ratio | 1.25 | modular scale |
|
|
299
|
-
| Body size | 16–18px | `--font-text` |
|
|
300
|
-
| Line-height | 1.5 body / 1.1 display | per element |
|
|
301
|
-
| Spacing base | 4 / 8px | Tailwind spacing |
|
|
302
|
-
| Color allocation | 60-30-10 | bg / fg / brand |
|
|
303
|
-
| Text contrast | ≥ 4.5:1 (3:1 large) | verify with checker |
|
|
304
|
-
| Card radius | 0.875rem | `--radius-card` |
|
|
305
|
-
| Touch target | 44×44px recommended; 24×24px AA floor (SC 2.5.8) | `min-h-11` |
|
|
306
|
-
| Enter / exit motion | 250ms / 150ms | `--ease-out` |
|
|
307
|
-
| LCP | < 2.5s | `next/image priority` |
|
|
308
|
-
| INP | < 200ms | compositor-only motion |
|
|
309
|
-
| CLS | < 0.1 | reserved space, `next/font` |
|
|
310
|
-
| Hero | passes 5s test | value prop above fold |
|
|
311
|
-
|
|
312
|
-
## Design-review QA checklist
|
|
313
|
-
|
|
314
|
-
Run before claiming done. Same checks `scripts/verify.sh` falls back to.
|
|
315
|
-
|
|
316
|
-
- [ ] Value prop legible in 5 seconds above the fold.
|
|
317
|
-
- [ ] Text contrast ≥ 4.5:1 (3:1 for large text / UI).
|
|
318
|
-
- [ ] Visible focus state on all interactive elements.
|
|
319
|
-
- [ ] Touch targets 44×44px (recommended); never below the 24×24px WCAG 2.2 AA floor (SC 2.5.8).
|
|
320
|
-
- [ ] `prefers-reduced-motion` honored.
|
|
321
|
-
- [ ] Exactly one `<h1>` on the page.
|
|
322
|
-
- [ ] Semantic landmarks present (`header`/`nav`/`main`/`section`/`footer`).
|
|
323
|
-
- [ ] LCP image has `priority`.
|
|
324
|
-
- [ ] Fonts use `next/font` (no CLS / FOUT swap shift).
|
|
325
|
-
- [ ] No `transition: all` / `transition-all`.
|
|
326
|
-
- [ ] Tokens used (no magic hex / px).
|
|
327
|
-
- [ ] Ban-list words absent from copy.
|
|
328
|
-
- [ ] Text fits at 360px and desktop without overflow.
|
|
329
|
-
- [ ] Empty / loading / hover / error states designed.
|
|
330
|
-
|
|
331
|
-
Automate → `scripts/verify.sh` (runs Lighthouse if a dev server is up, else static grep checks + this list).
|
|
332
|
-
|
|
333
|
-
### Optional: graded visual-audit rubric (0–10)
|
|
334
|
-
|
|
335
|
-
The checklist above is pass/fail. When the user asks for a *design review*, a *critique*, or a quality grade — or when you want to argue a surface is genuinely premium rather than merely compliant — score these 11 dimensions 0–10 and report the weighted total. Pass/fail tells you it ships; the rubric tells you how good it is.
|
|
336
|
-
|
|
337
|
-
| # | Dimension | What a 10 looks like | Weight |
|
|
338
|
-
| --- | --- | --- | --- |
|
|
339
|
-
| 1 | First impression & value clarity | Passes the 5s test instantly; product shown, not a gradient | 1.5 |
|
|
340
|
-
| 2 | Concept & signature | A nameable visual concept; one distinctive, domain-true signature element; logo-removed it's still recognizably this product, not a template | 1.5 |
|
|
341
|
-
| 3 | Typographic craft | Modular scale, ≤2 families, balanced headings, 45–75ch measure, tabular numerals; deliberate 3–5× scale contrast | 1.0 |
|
|
342
|
-
| 4 | Color & contrast | Disciplined 60-30-10 OKLCH system, all text ≥ 4.5:1, dark mode via token swap | 1.0 |
|
|
343
|
-
| 5 | Layout, spacing & rhythm | Consistent 4/8px scale, intentional asymmetry/bento, clear focal point; sections vary in format/background/density, not one repeated stripe | 1.0 |
|
|
344
|
-
| 6 | Hierarchy & scannability | Eye lands in the right order; one primary action per viewport | 1.0 |
|
|
345
|
-
| 7 | Depth & detail polish | Concentric radius, layered shadows, hairline borders, restrained glass | 1.0 |
|
|
346
|
-
| 8 | Motion quality | Purposeful only, compositor-only props, reduced-motion + `@supports` guards | 1.0 |
|
|
347
|
-
| 9 | Accessibility | Landmarks, one `<h1>`, visible focus, 24px+ targets (44 ideal), no motion-only meaning | 1.0 |
|
|
348
|
-
| 10 | Performance (CWV) | LCP < 2.5s, INP < 200ms, CLS < 0.1; LCP image `priority`, `next/font` | 1.0 |
|
|
349
|
-
| 11 | Copy & brand fidelity | Benefit-led, specific, ban-list clean, voice matches the `02-DOCS/wiki/brand/` study | 0.5 |
|
|
350
|
-
|
|
351
|
-
Score = Σ(dimension × weight), max 115 (normalize to /100 by ×100/115 if you want a percentage). **Bands (on the /115 raw total):** < 69 ships generic — redo; 69–91 competent but improvable — name the lowest two and fix; 92–108 premium; 109+ award-tier. (These are the prior 60/80/95-per-100 cutoffs rescaled to 115.) A surface that scores well on every constraint dimension but low on #1–2 is the classic "competent but generic" result — fix concept and signature first, it has the most leverage. For each dimension below 8, give one concrete, actionable fix (not "improve spacing" but "section padding jumps 48→96px with no 64px step — add `py-16` on mobile"). Cite the brand article or trend source that sets the bar where relevant.
|
|
352
|
-
|
|
353
|
-
## Recording the decisions (02-DOCS)
|
|
354
|
-
|
|
355
|
-
Two records, both indexed in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer to it), both read first on every use so outputs stay consistent with them:
|
|
356
|
-
|
|
357
|
-
- The **brand study** at `02-DOCS/wiki/brand/` — the hard gate above: missing or incomplete → ask until complete before designing.
|
|
358
|
-
- The **design-system decisions** at `02-DOCS/wiki/stack/design.md` — the chosen tokens (color/OKLCH, type scale, spacing, radius, shadow, motion), the 2026 direction picked, and the reference sites. Recorded, not gated; create/update it as decisions are made. **Read it before fixing type and palette on a new surface**, and either reuse what is there or state why you are departing — otherwise every surface of the project drifts into a different design. (Across *different* projects this record cannot help: it lives inside each one. Distrusting your own second default is the only guard there — see the repetition note in `references/ai-tells.md`.)
|
|
359
|
-
|
|
360
|
-
The wiki article protocol both follow is `../harness/SKILL.md`'s.
|
|
104
|
+
| `engine/RUN.md` | The run, the house rules and the laws of the craft. |
|
|
105
|
+
| `engine/references/` | App screens, type, colour, layout, imagery, motion, scenes, copy, critique, tells, research. |
|
|
106
|
+
| `engine/scripts/` | `draw`, `assets`, `lint`, `inspect`, `scenes`. |
|
|
107
|
+
| `engine/library/` | The data the draw reads. Never read it whole; use the script. |
|
|
108
|
+
| `engine/UPSTREAM.json` | Which upstream versions are shipped here. |
|
|
109
|
+
| [references/modes.md](references/modes.md) | The four modes. |
|
|
110
|
+
| [references/finish-review.md](references/finish-review.md) | The fresh reviewer. |
|
|
111
|
+
| [references/design-md.md](references/design-md.md) | The `DESIGN.md` record. |
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Third-party work in this skill
|
|
2
|
+
|
|
3
|
+
## taste-skill: the engine
|
|
4
|
+
|
|
5
|
+
- **Source:** https://github.com/Leonxlnx/taste-skill (`skills/taste-skill`). The exact commit and
|
|
6
|
+
version shipped are in `engine/UPSTREAM.json`.
|
|
7
|
+
- **Licence:** MIT, Copyright (c) 2026 Leonxlnx. Full text: `engine/LICENSE`.
|
|
8
|
+
- **What is here:** `engine/scripts/`, `engine/library/`, `engine/assets/` and
|
|
9
|
+
`engine/references/`, copied unmodified. `engine/RUN.md` is the upstream `SKILL.md` with its YAML
|
|
10
|
+
front matter removed so it is not discovered as a second skill; the text is unchanged.
|
|
11
|
+
- **Data inside:** `library/photos.json` lists Lorem Picsum IDs (photographs from Unsplash, under
|
|
12
|
+
the Unsplash licence); `library/sites.json` describes studied sites from One Page Love and
|
|
13
|
+
Awwwards and copies none of them; `library/type.json` links Fontshare and Google Fonts.
|
|
14
|
+
- **Updating:** `npm run design:upstream` reports a newer upstream version. Bringing it in means
|
|
15
|
+
copying a reviewed checkout over `engine/` (`--sync`), never an automatic download.
|
|
16
|
+
|
|
17
|
+
## impeccable: modes, fresh review, the design record
|
|
18
|
+
|
|
19
|
+
- **Source:** https://github.com/pbakaus/impeccable by Paul Bakaus. Version in `engine/UPSTREAM.json`.
|
|
20
|
+
- **Licence:** Apache-2.0, Copyright 2025 Paul Bakaus. Full text: `IMPECCABLE-LICENSE.txt`.
|
|
21
|
+
- **What is here:** no code. `references/modes.md`, `references/finish-review.md` and
|
|
22
|
+
`references/design-md.md` are adaptations of impeccable's `reference/mode-*.md`,
|
|
23
|
+
`agents/impeccable-finish-reviewer.md` and `reference/document.md`. **Modified:** rewritten,
|
|
24
|
+
shortened, and pointed at taste-skill's inspector and screenshots instead of impeccable's
|
|
25
|
+
detector, comps and build phases.
|
|
26
|
+
- impeccable's NOTICE concerns its iOS and Android references, which are not used here.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Leonxlnx
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|