command-code 0.26.16 → 0.26.17
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 +2 -0
- package/dist/index.mjs +26 -26
- package/package.json +2 -1
- package/skills/design/SKILL.md +388 -0
- package/skills/design/references/border.md +155 -0
- package/skills/design/references/button.md +192 -0
- package/skills/design/references/checkup.md +160 -0
- package/skills/design/references/color.md +166 -0
- package/skills/design/references/create.md +287 -0
- package/skills/design/references/design-html.md +225 -0
- package/skills/design/references/finish.md +153 -0
- package/skills/design/references/interaction.md +168 -0
- package/skills/design/references/layout.md +158 -0
- package/skills/design/references/motion.md +202 -0
- package/skills/design/references/redesign.md +186 -0
- package/skills/design/references/refine.md +193 -0
- package/skills/design/references/relayout.md +197 -0
- package/skills/design/references/report-html.md +116 -0
- package/skills/design/references/responsive.md +179 -0
- package/skills/design/references/review.md +162 -0
- package/skills/design/references/setup.md +119 -0
- package/skills/design/references/shadow.md +137 -0
- package/skills/design/references/smell.md +197 -0
- package/skills/design/references/surface.md +163 -0
- package/skills/design/references/tokenize.md +124 -0
- package/skills/design/references/typeset.md +170 -0
- package/skills/design/references/voice.md +183 -0
- package/skills/design/references/writing.md +152 -0
- package/vsix/commandcode-vscode.vsix +0 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Smell: `/design smell`
|
|
2
|
+
|
|
3
|
+
I use smell to catch generic design before it spreads. This is not a broad review. It is a detector for reflex, template, and generated sameness.
|
|
4
|
+
|
|
5
|
+
When a surface smells wrong, I fix the category reflex first. Cosmetic edits do not remove the odor.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Composition Smell
|
|
10
|
+
|
|
11
|
+
I check whether the composition came from the work or from habit.
|
|
12
|
+
|
|
13
|
+
Monitor smell: status hidden inside equal cards, alerts without priority, live data treated as static decoration.
|
|
14
|
+
|
|
15
|
+
Operate smell: tools far from objects, no inspector, no command surface, no fast feedback.
|
|
16
|
+
|
|
17
|
+
Compare smell: comparison forced into unrelated cards, missing alignment, weak filters, unstable scan paths.
|
|
18
|
+
|
|
19
|
+
Configure smell: settings scattered by visual balance instead of dependency and consequence.
|
|
20
|
+
|
|
21
|
+
Learn smell: sections arranged as feature tiles when the user needs a path.
|
|
22
|
+
|
|
23
|
+
Decide smell: too many equal calls to action, proof buried below ornament.
|
|
24
|
+
|
|
25
|
+
Explore smell: search, filters, results, and backtracking treated as afterthoughts.
|
|
26
|
+
|
|
27
|
+
Centered grid is not automatically wrong. It is wrong when it has no work-pattern reason to exist.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Prompt Drift Smell
|
|
32
|
+
|
|
33
|
+
I treat prompt drift as a severe smell.
|
|
34
|
+
|
|
35
|
+
Wrong name, recycled logo mark, reused headline structure, inherited proof object, generic visual artifact, and domain objects from an unrelated brief all mean the design is not listening.
|
|
36
|
+
|
|
37
|
+
The fix is not copy editing. The fix is returning to the current prompt's name, category, user, job, artifact, evidence, and refused drift.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Evidence Bar
|
|
42
|
+
|
|
43
|
+
`/design smell` names generic design tells from the actual surface. It does not invent odor.
|
|
44
|
+
|
|
45
|
+
At minimum, I identify the visible pattern, the reflex behind it, why it weakens this specific brief, and the right mode to fix it.
|
|
46
|
+
|
|
47
|
+
If a smell is only a suspicion, I mark it as a suspicion. I do not report it as observed.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## What Smell Means
|
|
52
|
+
|
|
53
|
+
A smell is a choice that looks unchosen.
|
|
54
|
+
|
|
55
|
+
It may be competent. It may even be accessible. The problem is that it could have come from any prompt, any template, any average SaaS homepage, any safe default.
|
|
56
|
+
|
|
57
|
+
I look for the moment where the design stopped making project-specific decisions.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## The Odors I Track
|
|
62
|
+
|
|
63
|
+
**Tech gradient**: blue-violet, indigo-cyan, and purple-to-teal glossy energy plastered on heroes, CTAs, cards, or text. The visual shorthand for "AI startup."
|
|
64
|
+
|
|
65
|
+
**Generic tech hue**: blue-purple as the primary identity for anything vaguely technical or software-adjacent.
|
|
66
|
+
|
|
67
|
+
**Feature tile grid**: icon, heading, one sentence, repeated in a uniform grid until the section stops meaning anything. Every card equal, nothing prioritized.
|
|
68
|
+
|
|
69
|
+
**Accent rail**: a colored stripe on one side of cards or callouts added to simulate structure. Decoration pretending to be organization.
|
|
70
|
+
|
|
71
|
+
**Unearned blur**: frosted glass panels applied because the surface never committed to a depth system.
|
|
72
|
+
|
|
73
|
+
**Stat monument**: an oversized number cluster filling space where a real product story belongs.
|
|
74
|
+
|
|
75
|
+
**Icon topper**: a rounded-square icon placed above every section heading with no function beyond filling the template.
|
|
76
|
+
|
|
77
|
+
**Bounce everywhere**: motion that turns every interaction into a toy. Elastic easing applied because it was available.
|
|
78
|
+
|
|
79
|
+
**Default type**: a common family used with no voice, no scale, no reason. The font that appeared because no choice was made.
|
|
80
|
+
|
|
81
|
+
**Center stack**: everything aligned to the safe middle because no composition decision was made.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## The Domain Default Trap
|
|
86
|
+
|
|
87
|
+
I ask whether the visual direction could be guessed from the industry.
|
|
88
|
+
|
|
89
|
+
A note-taking app as cream and rounded sans. A developer tool as dark with terminal mono. A health product as white and calm blue. A legal platform as navy and serif. A food app as warm orange. A payments product as clean white with green accents.
|
|
90
|
+
|
|
91
|
+
If the answer was obvious before I opened the page, the design has not found itself yet.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## What I Look For Instead
|
|
96
|
+
|
|
97
|
+
The design needs at least a few real decisions:
|
|
98
|
+
|
|
99
|
+
- A color strategy that is not the domain's first reflex
|
|
100
|
+
- Type with a reason
|
|
101
|
+
- A composition that chooses tension, rigor, image, or editorial pacing
|
|
102
|
+
- Imagery or visual material tied to the subject
|
|
103
|
+
- Motion that reveals character or state
|
|
104
|
+
- Copy with a specific voice
|
|
105
|
+
- An interaction or detail that could only belong here
|
|
106
|
+
|
|
107
|
+
Unexpected is not automatically good. But a page with nothing unexpected is usually forgettable.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## How I Judge Severity
|
|
112
|
+
|
|
113
|
+
I treat faint smells as cleanup. I treat clustered smells as identity failure.
|
|
114
|
+
|
|
115
|
+
A single generic icon card can be replaced. A whole page made of generic cards, indigo gradients, centered hero, Inter, and vague copy needs a new lane.
|
|
116
|
+
|
|
117
|
+
If the smell is structural, I do not patch. I change the direction.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## What I Do After Finding Smell
|
|
122
|
+
|
|
123
|
+
I name the dominant smell. I identify the root reflex. Then I pick the right design tool.
|
|
124
|
+
|
|
125
|
+
- Color reflex goes to recolor
|
|
126
|
+
- Type reflex goes to typeset
|
|
127
|
+
- Composition reflex goes to relayout or redesign
|
|
128
|
+
- Generic brand lane goes to voice or redesign
|
|
129
|
+
- Missing state and interaction smell goes to interaction
|
|
130
|
+
- Unclear copy goes to writing
|
|
131
|
+
|
|
132
|
+
If the design smells generated in several systems at once, redesign is usually cleaner than incremental repair.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Scoring
|
|
137
|
+
|
|
138
|
+
Smell uses a `/10` score. The score is **inverted** — finding nothing is perfect.
|
|
139
|
+
|
|
140
|
+
| Tells found | Score |
|
|
141
|
+
|---|---|
|
|
142
|
+
| 0 | 10/10 — CLEAN |
|
|
143
|
+
| 1–2 | 7–8/10 — FAINT |
|
|
144
|
+
| 3–4 | 5–6/10 — PRESENT |
|
|
145
|
+
| 5–6 | 3–4/10 — STRONG |
|
|
146
|
+
| 7+ | 0–2/10 — IDENTITY FAILURE |
|
|
147
|
+
|
|
148
|
+
**MAX_SCORE = 10.** Use `/10` as the denominator in the report template. When zero tells are found, the score is `10/10` and the verdict is CLEAN. Never output `0/10` to mean "no smells detected."
|
|
149
|
+
|
|
150
|
+
The heuristics table in the report uses 10 rows (one per odor tracked). Each row scores `1` if the odor is absent, `0` if detected.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Report Boundary
|
|
155
|
+
|
|
156
|
+
Smell always produces two report artifacts:
|
|
157
|
+
|
|
158
|
+
- `.commandcode/design/smell-report.md`
|
|
159
|
+
- `.commandcode/design/smell-report.html`
|
|
160
|
+
|
|
161
|
+
**Important Rule for Generating HTML Report:**
|
|
162
|
+
|
|
163
|
+
- **Use the following template structure** [report-html.md](report-html.md) to generate `smell-report.html`:
|
|
164
|
+
- Do not change the visual design. Only fill in the content.
|
|
165
|
+
|
|
166
|
+
These are the only report artifacts smell creates.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## What I Refuse
|
|
171
|
+
|
|
172
|
+
- Calling a design clean because it passes technical checks
|
|
173
|
+
- Reporting a smell I cannot point to
|
|
174
|
+
- Treating personal taste as evidence of generated design
|
|
175
|
+
- Fixing an AI gradient by choosing a different AI gradient
|
|
176
|
+
- Treating Inter as wrong when it is clearly intentional
|
|
177
|
+
- Treating all centered layouts as bad when symmetry is the right lane
|
|
178
|
+
- Adding decoration to hide generic structure
|
|
179
|
+
- Creating extra report artifacts beyond `smell-report.md` and `smell-report.html`
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## How I Know The Smell Is Gone
|
|
184
|
+
|
|
185
|
+
- Every named smell maps to a visible choice
|
|
186
|
+
- The palette cannot be guessed from the domain alone
|
|
187
|
+
- The type has a project-specific reason
|
|
188
|
+
- The composition is not the median generated landing page
|
|
189
|
+
- Repeated sections have hierarchy and variation
|
|
190
|
+
- The strongest visual idea belongs to this brief
|
|
191
|
+
- A stranger would not immediately say the page was generated
|
|
192
|
+
- `smell-report.md` and `smell-report.html` both exist
|
|
193
|
+
|
|
194
|
+
STRICT RULE — NEVER BREAK THIS
|
|
195
|
+
Always create .commandcode/design/smell-report.md and
|
|
196
|
+
.commandcode/design/smell-report.html. Do not create any other report,
|
|
197
|
+
summary, analysis file, or extra documentation.
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Surface `/design surface`
|
|
2
|
+
|
|
3
|
+
Product design serves the work. The user is not here to admire the interface. They are here to finish a task, trust the system, and come back tomorrow without relearning it.
|
|
4
|
+
|
|
5
|
+
The best product UI becomes familiar faster than it becomes impressive.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Discipline files
|
|
10
|
+
|
|
11
|
+
Surface drives the product hardening pass — consult these for correct execution when each dimension comes up, not as separate passes to layer on:
|
|
12
|
+
|
|
13
|
+
- [button.md](button.md) — for correct button states and control hierarchy when hardening interactive elements
|
|
14
|
+
- [interaction.md](interaction.md) — for correct state coverage, keyboard path, and touch targets when auditing component behavior
|
|
15
|
+
- [border.md](border.md) — for correct edge language and surface separation when tightening component boundaries
|
|
16
|
+
- [shadow.md](shadow.md) — for correct elevation decisions when adjusting depth and layering
|
|
17
|
+
- [writing.md](writing.md) — for correct label, error, and empty state copy when hardening operator-facing text
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Composition Starts With The Operator's Job
|
|
22
|
+
|
|
23
|
+
I name the operator's task before choosing structure.
|
|
24
|
+
|
|
25
|
+
Monitor: expose status, alerts, trends, and freshness.
|
|
26
|
+
|
|
27
|
+
Operate: keep commands, target objects, and feedback in one working field.
|
|
28
|
+
|
|
29
|
+
Compare: preserve columns, labels, filters, and scan paths.
|
|
30
|
+
|
|
31
|
+
Configure: group settings by consequence and show what will change.
|
|
32
|
+
|
|
33
|
+
Learn: onboard through progressive disclosure without hiding core controls.
|
|
34
|
+
|
|
35
|
+
Decide: surface proof, risk, tradeoffs, and the next safe action.
|
|
36
|
+
|
|
37
|
+
Explore: support search, filter, sort, and reversible browsing.
|
|
38
|
+
|
|
39
|
+
Product composition is not decoration. It is workflow made visible.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Hardening Bar
|
|
44
|
+
|
|
45
|
+
`/design surface` hardens the working surface. It is not a visual polish pass.
|
|
46
|
+
|
|
47
|
+
At minimum, I cover the primary task, real data density, focus path, loading, empty, error, success, disabled, overflow, mobile structure, keyboard use, and copy for recovery where those states apply.
|
|
48
|
+
|
|
49
|
+
If I only changed color, spacing, or type while product states remain missing, the product pass failed.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## The Register
|
|
54
|
+
|
|
55
|
+
I use this file for app UIs, dashboards, admin panels, settings, authenticated routes, tools, tables, forms, editors, and operational screens.
|
|
56
|
+
|
|
57
|
+
In product, familiarity can be a feature. Surprise has to earn its place.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## What Good Feels Like
|
|
62
|
+
|
|
63
|
+
An experienced operator should open the screen for the eleventh time that day and move without hesitation.
|
|
64
|
+
|
|
65
|
+
Controls stay where they are expected. Labels use the same nouns. Rows keep stable density. Primary actions are obvious. Secondary actions are reachable but not loud.
|
|
66
|
+
|
|
67
|
+
If the user pauses because the UI is clever, I made the wrong trade.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Type
|
|
72
|
+
|
|
73
|
+
I usually pick one strong sans or the system stack. Product labels, tables, settings, and forms do not need display type.
|
|
74
|
+
|
|
75
|
+
Scale stays compressed. Weight, color, and spacing carry hierarchy with size. Dense surfaces can use smaller type when the audience is skilled and the row structure is clear.
|
|
76
|
+
|
|
77
|
+
Numbers align. Tables deserve tabular figures. Metadata deserves restraint.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Color
|
|
82
|
+
|
|
83
|
+
Product color has three jobs.
|
|
84
|
+
|
|
85
|
+
**Chrome** gives the app stable surfaces: page, sidebar, panel, row, input, divider.
|
|
86
|
+
|
|
87
|
+
**State** teaches the user the system vocabulary: selected, dirty, focused, loading, success, warning, error, disabled.
|
|
88
|
+
|
|
89
|
+
**Primary action** gets the strongest accent. If everything is accented, no action is primary.
|
|
90
|
+
|
|
91
|
+
Product starts restrained. A welcome flow or onboarding moment can carry more color. The working surface gets calmer after login.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Components
|
|
96
|
+
|
|
97
|
+
Every interactive component needs its real life, not just its resting state.
|
|
98
|
+
|
|
99
|
+
Default, hover, focus-visible, active, disabled, loading, selected, error, success, empty, overflow. Some components use all of these. Some use fewer. None get to ignore the states they can enter.
|
|
100
|
+
|
|
101
|
+
Same control, same vocabulary. If two save buttons look unrelated, one is wrong.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Density
|
|
106
|
+
|
|
107
|
+
Product surfaces breathe less than marketing. Density is not clutter when the relationships are clear.
|
|
108
|
+
|
|
109
|
+
Rows, panels, filters, toolbars, and tables should fit the work. Power users often need more on screen, not more air. Comfortable and compact modes can be a real feature.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Motion
|
|
114
|
+
|
|
115
|
+
Product motion is short and functional.
|
|
116
|
+
|
|
117
|
+
Hover, press, selection, drawer open, popover close, loading, save confirmation. That is enough. No page-load ceremony. No scrolling performance. No animation that delays the task.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## What Product Can Own
|
|
122
|
+
|
|
123
|
+
- System fonts
|
|
124
|
+
- Standard navigation
|
|
125
|
+
- Tables with many rows
|
|
126
|
+
- Predictable sidebars and tabs
|
|
127
|
+
- Keyboard shortcuts
|
|
128
|
+
- Monochrome charts with one emphasized series
|
|
129
|
+
- Dense but organized screens
|
|
130
|
+
- Repetition, when repetition teaches the system
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## What I Refuse
|
|
135
|
+
|
|
136
|
+
- Display fonts in labels, tables, or form controls
|
|
137
|
+
- Calling visual polish product hardening
|
|
138
|
+
- Leaving real data, error, empty, loading, or overflow states untested
|
|
139
|
+
- Marketing hero motion inside a working app
|
|
140
|
+
- Custom controls that lose native keyboard behavior
|
|
141
|
+
- Modals for long forms that need a route
|
|
142
|
+
- Five gray scales across one product
|
|
143
|
+
- Accent color on cancel, secondary, decorative, and inactive elements
|
|
144
|
+
- Custom scrollbars that make scrolling harder
|
|
145
|
+
- Cleverness where predictability would build trust
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## How I Know Product UI Works
|
|
150
|
+
|
|
151
|
+
- The surface survives real data and real states
|
|
152
|
+
- The primary task is clear without reading instructions
|
|
153
|
+
- Focus, loading, error, empty, and success states exist
|
|
154
|
+
- A keyboard user can complete the core flow
|
|
155
|
+
- Tables and dense data stay aligned and scannable
|
|
156
|
+
- Mobile layout changes structure rather than hiding work
|
|
157
|
+
- The same pattern means the same thing across screens
|
|
158
|
+
- The interface feels calmer the more often it is used
|
|
159
|
+
|
|
160
|
+
STRICT RULE — NEVER BREAK THIS
|
|
161
|
+
Do not create report.md, any kind of report, summary, analysis file,
|
|
162
|
+
or extra documentation. This applies every time this file is used.
|
|
163
|
+
Generate no reports unless explicitly asked.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Design System: Tokenize `/design tokenize`
|
|
2
|
+
|
|
3
|
+
Tokenize turns repeated design decisions into shared language. I extract what has proven itself. I do not invent a system because one component happened to look reusable.
|
|
4
|
+
|
|
5
|
+
Consolidation, not invention.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Composition Tokens
|
|
10
|
+
|
|
11
|
+
I tokenize composition only after I understand the work pattern it serves.
|
|
12
|
+
|
|
13
|
+
Monitor tokens include status strips, alert rows, metric clusters, feed items, and drill-down panels.
|
|
14
|
+
|
|
15
|
+
Operate tokens include command bars, tool groups, canvases, inspectors, selection states, and feedback surfaces.
|
|
16
|
+
|
|
17
|
+
Compare tokens include tables, matrices, pinned headers, row actions, bulk controls, and ranking patterns.
|
|
18
|
+
|
|
19
|
+
Configure tokens include field groups, dependency notes, previews, summaries, and commit bars.
|
|
20
|
+
|
|
21
|
+
Learn tokens include article sections, progress markers, examples, walkthrough cards, and completion states.
|
|
22
|
+
|
|
23
|
+
Decide tokens include proof blocks, risk notes, trust markers, and primary action zones.
|
|
24
|
+
|
|
25
|
+
Explore tokens include filters, chips, result rows, maps, galleries, and detail drawers.
|
|
26
|
+
|
|
27
|
+
I do not extract a repeated centered-card composition unless it is genuinely the product's language.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Extraction Bar
|
|
32
|
+
|
|
33
|
+
`/design tokenize` changes the implementation. It is not a naming wishlist.
|
|
34
|
+
|
|
35
|
+
At minimum, I identify repeated decisions, create or update the reusable tokens/components that belong in the project, migrate at least one real usage when safe, and verify the old behavior still works.
|
|
36
|
+
|
|
37
|
+
If I only list suggested tokens or component names, tokenizing failed unless the user explicitly asked for planning only.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## When I Tokenize
|
|
42
|
+
|
|
43
|
+
I need repetition with the same intent.
|
|
44
|
+
|
|
45
|
+
Three repeated components with the same job. Several hard-coded values that mean the same thing. Multiple versions of one control drifting apart. A repeated composition pattern. A repeated behavior, animation, typography style, or state treatment.
|
|
46
|
+
|
|
47
|
+
Similarity is not enough. Two things that look alike but serve different purposes may need to stay separate.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## What I Look For
|
|
52
|
+
|
|
53
|
+
**Components**: buttons, cards, inputs, modals, rows, badges, tabs, dropdowns, empty states, form fields.
|
|
54
|
+
|
|
55
|
+
**Tokens**: color roles, spacing roles, radii, shadows, type styles, motion timing, z layers.
|
|
56
|
+
|
|
57
|
+
**Compositions**: toolbar groups, form rows, page shells, list-detail layouts, table headers, onboarding empties.
|
|
58
|
+
|
|
59
|
+
**Behavior**: loading patterns, disclosure, keyboard handling, validation, drag, selection, overlay logic.
|
|
60
|
+
|
|
61
|
+
The best candidates reduce future decisions without hiding important variation.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Naming
|
|
66
|
+
|
|
67
|
+
I name by meaning, not value.
|
|
68
|
+
|
|
69
|
+
Primary action, danger text, panel border, section gap, input radius, tooltip layer. These names survive value changes. Names like blue-500 or spacing-16 only help when they are primitives in a larger system.
|
|
70
|
+
|
|
71
|
+
Semantic names belong where components consume them. Primitive names belong deeper in the foundation.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Component Extraction
|
|
76
|
+
|
|
77
|
+
I extract the smallest useful API.
|
|
78
|
+
|
|
79
|
+
The component should match existing project conventions, support the states already needed, keep accessibility built in, and avoid prop sprawl. Variants come from real use, not imagination.
|
|
80
|
+
|
|
81
|
+
I migrate carefully. Old behavior must survive. Visual regressions are not acceptable payment for abstraction.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Token Extraction
|
|
86
|
+
|
|
87
|
+
Values become tokens when they represent a reusable decision.
|
|
88
|
+
|
|
89
|
+
One-off values can stay local. Repeated values with the same meaning become tokens. Repeated values with different meanings should not share a token just because the number matches.
|
|
90
|
+
|
|
91
|
+
The goal is fewer arbitrary choices in future work.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## What I Refuse
|
|
96
|
+
|
|
97
|
+
- Extracting before a pattern is proven
|
|
98
|
+
- Listing token ideas without applying them
|
|
99
|
+
- Creating unused tokens or components
|
|
100
|
+
- Creating a generic component so flexible it means nothing
|
|
101
|
+
- Tokenizing every number
|
|
102
|
+
- Replacing clear local code with opaque abstraction
|
|
103
|
+
- Breaking existing APIs during migration
|
|
104
|
+
- Ignoring accessibility in extracted controls
|
|
105
|
+
- Creating documentation files as part of tokenizing
|
|
106
|
+
- Markdown reports
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## How I Know Tokenize Worked
|
|
111
|
+
|
|
112
|
+
- Tokens or components are actually used by real UI
|
|
113
|
+
- Unused abstractions were not introduced
|
|
114
|
+
- Repetition is reduced without losing intent
|
|
115
|
+
- Names explain roles
|
|
116
|
+
- Components match project conventions
|
|
117
|
+
- States and accessibility are preserved
|
|
118
|
+
- Old duplicate code is removed only after migration is complete
|
|
119
|
+
- Future screens have fewer arbitrary design decisions to make
|
|
120
|
+
|
|
121
|
+
STRICT RULE — NEVER BREAK THIS
|
|
122
|
+
Do not create report.md, any kind of report, summary, analysis file,
|
|
123
|
+
or extra documentation. This applies every time this file is used.
|
|
124
|
+
Generate no reports unless explicitly asked.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Typography: `/design typeset`
|
|
2
|
+
|
|
3
|
+
I use type to make thought visible. Fonts are only one part of it. The real work is rhythm, hierarchy, measure, voice, loading behavior, and the tiny details that make reading feel effortless.
|
|
4
|
+
|
|
5
|
+
Most generic design starts with a default font and a timid scale. I start with the content and the distance from the reader.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Type Follows Composition
|
|
10
|
+
|
|
11
|
+
The work pattern decides how type behaves.
|
|
12
|
+
|
|
13
|
+
Monitor screens need labels, deltas, timestamps, thresholds, and compact hierarchy.
|
|
14
|
+
|
|
15
|
+
Operate screens need tool names, object names, status text, shortcuts, and fast confirmation.
|
|
16
|
+
|
|
17
|
+
Compare screens need aligned numbers, durable headers, scannable row text, and steady labels.
|
|
18
|
+
|
|
19
|
+
Configure screens need field labels, helper text, validation, section titles, and summary language.
|
|
20
|
+
|
|
21
|
+
Learn screens need long-form rhythm, generous measure, clear headings, and progress markers.
|
|
22
|
+
|
|
23
|
+
Decide screens need a strong claim, proof hierarchy, objections, and one action label.
|
|
24
|
+
|
|
25
|
+
Explore screens need search language, filters, tags, result titles, and metadata that can be skimmed.
|
|
26
|
+
|
|
27
|
+
I do not force a marketing type scale onto product work or a product type scale onto brand memory.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## System Bar
|
|
32
|
+
|
|
33
|
+
`/design typeset` creates or repairs a type system. It is not a font-size tweak.
|
|
34
|
+
|
|
35
|
+
At minimum, I apply readable body text, a clear heading scale, durable labels, button text, form text, metadata, empty/error/loading copy, line-height, measure, weight contrast, and responsive behavior.
|
|
36
|
+
|
|
37
|
+
If I change fonts, I verify the font is actually loaded or available. A font name in a style value does not count if the browser falls back silently.
|
|
38
|
+
|
|
39
|
+
Changing only the hero headline or one paragraph is not enough unless the user explicitly asked for that one element.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## What Type Must Do
|
|
44
|
+
|
|
45
|
+
Type has three jobs.
|
|
46
|
+
|
|
47
|
+
- Make the page understandable at a glance
|
|
48
|
+
- Make the content comfortable to read
|
|
49
|
+
- Give the surface a voice that matches its register
|
|
50
|
+
|
|
51
|
+
If a type choice does not help one of those jobs, I replace it.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Reading Distance
|
|
56
|
+
|
|
57
|
+
I do not assume body text is fine because it is a common size. Phone, laptop, monitor, and TV are different reading situations.
|
|
58
|
+
|
|
59
|
+
Short, close interfaces can run tighter. Large displays and long reading contexts need more size, more line-height, and more controlled measure. Product UI can be dense. Brand display can be loud. Body copy still needs mercy.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Content Length Rules The Measure
|
|
64
|
+
|
|
65
|
+
I match line-height and width to the text itself.
|
|
66
|
+
|
|
67
|
+
Microcopy wants tight leading and fast recognition. Short-form text wants two clean lines at most. Paragraphs want a comfortable measure, usually around the classic readable band. Long-form wants more air, not more decoration.
|
|
68
|
+
|
|
69
|
+
If a paragraph sprawls across the viewport, the layout is asking the reader to do the designer's work.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Font Choice
|
|
74
|
+
|
|
75
|
+
For brand work, I use the physical-object method. I name the brand as a thing I can hold or see: a museum caption, a club flyer, a diner receipt, a technical manual, a ceramic stamp, a field notebook. Then I pick type that belongs to that object.
|
|
76
|
+
|
|
77
|
+
I ask whether the font choice carries any project-specific reason. A font that appears in every second launched product signals nothing — it just means the decision was not made. The brand already owns it, or it was the path of least resistance.
|
|
78
|
+
|
|
79
|
+
That test applies to whatever family is currently over-used. The answer changes over time; the question does not.
|
|
80
|
+
|
|
81
|
+
For product work, a strong system stack or one well-tuned sans is often the best choice. Product type should help operators move fast. It does not need a costume.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Pairing & Font System
|
|
86
|
+
|
|
87
|
+
Add a second family only when it creates real contrast in structure, proportion, texture, or voice.
|
|
88
|
+
|
|
89
|
+
**The non-obvious truth:** One well-chosen font in multiple weights (Regular, Medium, Semibold, Bold + Italics) creates cleaner hierarchy than two competing faces. Only add a second font when you need genuine contrast.
|
|
90
|
+
|
|
91
|
+
**Bad pairing patterns:**
|
|
92
|
+
- Two similar geometric sans (tension without hierarchy)
|
|
93
|
+
- Fonts that compete for the same visual space
|
|
94
|
+
- A third font with no distinct job
|
|
95
|
+
**The pairing check:**
|
|
96
|
+
- Does the display font differ from body in x-height, stroke contrast, or width?
|
|
97
|
+
- Does each family serve a distinct job (headline vs body vs UI)?
|
|
98
|
+
- Would removing one font break the visual system?
|
|
99
|
+
If any answer is no, use one family with stronger weights instead.
|
|
100
|
+
|
|
101
|
+
**Three-font system (when justified):**
|
|
102
|
+
- **Display/Heading:** Bold personality, high contrast (serif, geometric, custom)
|
|
103
|
+
- **Body/Paragraph:** High readability, moderate x-height, comfortable at small sizes (humanist sans, system stack, text serif)
|
|
104
|
+
- **UI/Badge:** Compact, clear at small sizes, tabular numerals (condensed sans, mono, or body with tighter tracking)
|
|
105
|
+
Use three fonts only when each serves a visibly distinct purpose. Most work is better served by two fonts or one strong family.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Hierarchy
|
|
110
|
+
|
|
111
|
+
Each text block needs a clear chain: hook, bridge, detail. More levels create fog. Fewer levels flatten the message.
|
|
112
|
+
|
|
113
|
+
Hierarchy can come from size, weight, color, position, spacing, and casing. Size alone is crude. The best systems combine two or three dimensions and keep the rest quiet.
|
|
114
|
+
|
|
115
|
+
Brand pages can use dramatic jumps. Product surfaces use compressed steps with weight and color doing more of the work.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Dark Surfaces
|
|
120
|
+
|
|
121
|
+
Light type on dark backgrounds needs compensation. It reads thinner in some ways and brighter in others. I give it more line-height, a touch more spacing when needed, and a weight that feels optically correct.
|
|
122
|
+
|
|
123
|
+
I test it with real content, not a perfect headline.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Details I Do Not Skip
|
|
128
|
+
|
|
129
|
+
- Tabular numbers for data, metrics, prices, and aligned values
|
|
130
|
+
- Balanced heading wraps where support exists
|
|
131
|
+
- Better paragraph wraps where support exists
|
|
132
|
+
- Small caps only when the font actually supports them
|
|
133
|
+
- Extra tracking for short all-caps labels
|
|
134
|
+
- No decorative faces for body text
|
|
135
|
+
- No widows, orphaned single words, or ugly rivers in important prose
|
|
136
|
+
- Font loading that avoids obvious layout shift
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## What I Refuse
|
|
141
|
+
|
|
142
|
+
- Choosing the first trendy family that fits the category
|
|
143
|
+
- Calling one headline resize a typography pass
|
|
144
|
+
- Naming a font that is not actually loaded or available
|
|
145
|
+
- A flat scale where everything is almost the same size
|
|
146
|
+
- Body text wider than comfortable reading allows
|
|
147
|
+
- All-caps paragraphs
|
|
148
|
+
- Display fonts in product labels
|
|
149
|
+
- A third font with no distinct job
|
|
150
|
+
- Tiny mobile text to preserve a desktop layout
|
|
151
|
+
- Broken fallback metrics that make text jump
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## How I Know The Type Is Working
|
|
156
|
+
|
|
157
|
+
- Type changes appear across real content, not only the hero
|
|
158
|
+
- The loaded or available font matches the claimed type choice
|
|
159
|
+
- The primary message reads before the decoration
|
|
160
|
+
- Body text can be read without effort
|
|
161
|
+
- The type voice matches the surface register
|
|
162
|
+
- Numbers align cleanly
|
|
163
|
+
- Headings break with intention
|
|
164
|
+
- The system works with long strings and short labels
|
|
165
|
+
- The page would still feel designed if color disappeared
|
|
166
|
+
|
|
167
|
+
STRICT RULE — NEVER BREAK THIS
|
|
168
|
+
Do not create report.md, any kind of report, summary, analysis file,
|
|
169
|
+
or extra documentation. This applies every time this file is used.
|
|
170
|
+
Generate no reports unless explicitly asked.
|