agemon 0.1.0 → 6.0.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.
Files changed (144) hide show
  1. package/README.md +732 -28
  2. package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
  3. package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
  4. package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
  5. package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
  6. package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
  7. package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
  8. package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
  9. package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
  10. package/assets/skills/design/agemon-design/LICENSE +21 -0
  11. package/assets/skills/design/agemon-design/NOTICE.md +9 -0
  12. package/assets/skills/design/agemon-design/SKILL.md +391 -0
  13. package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
  14. package/assets/skills/design/agemon-design/references/agents.md +63 -0
  15. package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
  16. package/assets/skills/design/agemon-design/references/brief.md +186 -0
  17. package/assets/skills/design/agemon-design/references/color.md +216 -0
  18. package/assets/skills/design/agemon-design/references/components.md +91 -0
  19. package/assets/skills/design/agemon-design/references/copy.md +300 -0
  20. package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
  21. package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
  22. package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
  23. package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
  24. package/assets/skills/design/agemon-design/references/forms.md +192 -0
  25. package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
  26. package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
  27. package/assets/skills/design/agemon-design/references/layout.md +236 -0
  28. package/assets/skills/design/agemon-design/references/loops.md +155 -0
  29. package/assets/skills/design/agemon-design/references/metadata.md +98 -0
  30. package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
  31. package/assets/skills/design/agemon-design/references/motion.md +434 -0
  32. package/assets/skills/design/agemon-design/references/personas.md +206 -0
  33. package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
  34. package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
  35. package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
  36. package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
  37. package/assets/skills/design/agemon-design/references/responsive.md +168 -0
  38. package/assets/skills/design/agemon-design/references/review.md +340 -0
  39. package/assets/skills/design/agemon-design/references/sound.md +150 -0
  40. package/assets/skills/design/agemon-design/references/spec.md +123 -0
  41. package/assets/skills/design/agemon-design/references/stack.md +522 -0
  42. package/assets/skills/design/agemon-design/references/state-design.md +188 -0
  43. package/assets/skills/design/agemon-design/references/themes.md +229 -0
  44. package/assets/skills/design/agemon-design/references/tokens.md +350 -0
  45. package/assets/skills/design/agemon-design/references/typography.md +246 -0
  46. package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
  47. package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
  48. package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
  49. package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
  50. package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
  51. package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
  52. package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
  53. package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
  54. package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
  55. package/assets/skills/geo-seo/geo/LICENSE +21 -0
  56. package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
  57. package/assets/skills/geo-seo/geo/SKILL.md +145 -0
  58. package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
  59. package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
  60. package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
  61. package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
  62. package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
  63. package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
  64. package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
  65. package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
  66. package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
  67. package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
  68. package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
  69. package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
  70. package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
  71. package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
  72. package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
  73. package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
  74. package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
  75. package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
  76. package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
  77. package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
  78. package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
  79. package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
  80. package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
  81. package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
  82. package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
  83. package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
  84. package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
  85. package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
  86. package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
  87. package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
  88. package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
  89. package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
  90. package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
  91. package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
  92. package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
  93. package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
  94. package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
  95. package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
  96. package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
  97. package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
  98. package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
  99. package/assets/skills/security/agemon-security/LICENSE +21 -0
  100. package/assets/skills/security/agemon-security/NOTICE.md +8 -0
  101. package/assets/skills/security/agemon-security/SKILL.md +356 -0
  102. package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
  103. package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
  104. package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
  105. package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
  106. package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
  107. package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
  108. package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
  109. package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
  110. package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
  111. package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
  112. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
  113. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
  114. package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
  115. package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
  116. package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
  117. package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
  118. package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
  119. package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
  120. package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
  121. package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
  122. package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
  123. package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
  124. package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
  125. package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
  126. package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
  127. package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
  128. package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
  129. package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
  130. package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
  131. package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
  132. package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
  133. package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
  134. package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
  135. package/assets/tools/code-review-graph-constraints.txt +1418 -0
  136. package/assets/tools/package-lock.json +111 -0
  137. package/assets/tools/package.json +6 -0
  138. package/dist/chunk-5LATHJYU.js +4026 -0
  139. package/dist/chunk-5LATHJYU.js.map +1 -0
  140. package/dist/fake-subprocess-2BETWZVZ.js +666 -0
  141. package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
  142. package/dist/index.js +21101 -1956
  143. package/dist/index.js.map +1 -1
  144. package/package.json +30 -17
@@ -0,0 +1,300 @@
1
+ # UX Copy & Writing
2
+
3
+ Voice, tone, reading level, terminology, inclusive language, locale handling, and tactical microcopy (errors, empty states, CTAs). Clear, human interface writing.
4
+
5
+ ---
6
+
7
+ ## Voice vs Tone
8
+
9
+ **Voice is constant. Tone varies.** Voice is the product's personality — how it sounds whether you're reading onboarding, an error, or a paywall. Tone is how that voice adjusts to context: warmer in onboarding, restrained in success, explicit in destructive confirms. A product with a consistent voice but responsive tone reads as designed; a product with shifting voice reads as written by 12 people.
10
+
11
+ ### Voice Matrix
12
+
13
+ Pick three axes. Lock a position on each. Deviations are deliberate (brand campaigns, April Fools), never accidental.
14
+
15
+ | Axis | Endpoints | What to lock down |
16
+ |------|-----------|-------------------|
17
+ | Formality | Formal ↔ Casual | Pick a position; document with one sample sentence at the chosen point and one at each extreme |
18
+ | Reverence | Reverent ↔ Irreverent | Reverent treats the user task as serious; irreverent allows wit and acknowledges absurdity. Pick one. |
19
+ | Expertise | Expert ↔ Beginner-friendly | Expert assumes vocabulary; beginner-friendly defines on first use. Mixed within a product is acceptable when the surfaces serve different audiences. |
20
+
21
+ Document the positions. "Casual-but-respectful, beginner-friendly, mildly irreverent" is a brief a writer can execute against. "Friendly" is not.
22
+
23
+ ### Tone by Context
24
+
25
+ Voice is fixed; tone moves along these contexts. Each row below assumes a default voice of "casual-professional, beginner-friendly, restrained."
26
+
27
+ | Context | Tone | Example |
28
+ |---------|------|---------|
29
+ | Onboarding | Warm + specific | "Let's get your first project in. Takes 60 seconds." |
30
+ | Error — user-recoverable | Honest + actionable | "We couldn't save your draft. Retry, or copy the error for support: `abc-123`." |
31
+ | Error — system outage | Honest + transparent | "Search is down. We're investigating. Your data is safe." |
32
+ | Success | Restrained | "Changes saved." — not "Amazing work!" |
33
+ | Destructive confirm | Explicit about consequences | "Delete 3 items? You'll have 30 days to restore them from Trash." |
34
+ | Empty state | Action-oriented | "No integrations yet. Connect Slack, GitHub, or Linear to get started." |
35
+ | Paywall / limit | Informational, not shaming | "You're at 5/5 free projects. Upgrade to create more." |
36
+ | Danger zone (settings) | Neutral + precise | "Deleting the workspace removes all 47 projects and invalidates all API keys." |
37
+ | Waiting / latency | Honest about duration | "Generating report. Usually 20-40 seconds." |
38
+
39
+ **Never:** exclamation points on errors. Emoji in enterprise contexts. Celebratory copy on routine saves.
40
+
41
+ ---
42
+
43
+ ## Reading Level
44
+
45
+ Target ~8th-grade reading level (Flesch-Kincaid ~70+, grade ~8). Rules of thumb:
46
+
47
+ - Sentences ≤ 20 words.
48
+ - Paragraphs ≤ 3 sentences.
49
+ - Concrete nouns over abstractions ("invoice" beats "billing artifact").
50
+ - Active voice ("You signed in" beats "Sign-in was completed").
51
+ - One idea per sentence.
52
+ - **Front-load.** The key word or fact opens the sentence, heading, and notification — readers and screen-reader users decide whether to continue from the first words. Inverted pyramid for blocks: conclusion → support → background.
53
+ - **Abbreviations are a tax.** Spell terms out; if an acronym must repeat, define it on first use ("estimated arrival (ETA)") and stay consistent after.
54
+
55
+ **Example rewrite:**
56
+
57
+ | Before (grade 14) | After (grade 7) |
58
+ |-------------------|-----------------|
59
+ | "Upon successful authentication, users will be redirected to their personalized dashboard interface." | "You'll see your dashboard after you sign in." |
60
+ | "In the event that the operation is unsuccessful, please re-attempt the transmission." | "If it fails, try again." |
61
+ | "Configuration modifications will be persisted upon form submission." | "Your changes save when you click Save." |
62
+
63
+ Automate: [hemingwayapp.com](https://hemingwayapp.com/) for spot checks; the [`flesch` npm package](https://www.npmjs.com/package/flesch) for build-time linting. `write-good` (npm) flags weasel words, passive voice, lexical illusions. `alex` (npm) is an inclusive-language linter.
64
+
65
+ ---
66
+
67
+ ## Terminology Consistency
68
+
69
+ Every product needs a glossary. Same concept → same word, everywhere.
70
+
71
+ **Common pitfalls:**
72
+ - `user` / `member` / `account` / `seat` — pick one per concept and stick.
73
+ - `project` / `workspace` / `board` — pick one per level of hierarchy.
74
+ - `delete` / `remove` / `archive` / `trash` — these mean different things; don't alias.
75
+ - `sign in` / `log in` — both are standard; pick one and never mix.
76
+ - `save` / `publish` / `update` — same action under three names in three surfaces is a finding.
77
+
78
+ **Red flag:** in a review, grep the codebase for every verb on every button. If `Save` / `Update` / `Apply` appear on forms that do the same thing, file it.
79
+
80
+ ---
81
+
82
+ ## Inclusive Language
83
+
84
+ Swap the loaded term for the neutral one. Keep the list tight — don't moralize, just fix.
85
+
86
+ | Replace | With |
87
+ |---------|------|
88
+ | blacklist / whitelist | blocklist / allowlist |
89
+ | master / slave | primary / replica |
90
+ | sanity check | quick check |
91
+ | grandfathered | legacy |
92
+ | he / she (generic) | they |
93
+ | manhours / manpower | work hours / team capacity |
94
+ | man-in-the-middle | on-path attack |
95
+ | dummy value | placeholder value |
96
+ | first-class citizen | fully supported |
97
+
98
+ Don't soften to the point of vagueness — "on-path attack" is still precise; "bad thing happens in network" is not.
99
+
100
+ ---
101
+
102
+ ## Locale-Aware Strings
103
+
104
+ Rules agents routinely ignore. Every one is shippable to production the day the product adds a second locale.
105
+
106
+ - **Dates.** `Intl.DateTimeFormat(locale, options)`. Never hardcode `MM/DD/YYYY` unless the audience is exclusively US. Use `new Date().toLocaleDateString(locale, { dateStyle: 'medium' })` for user-facing dates.
107
+ - **Numbers and currency.** `Intl.NumberFormat(locale, { style: 'currency', currency })`. Decimal and thousands separators differ: `1,234.56` (US) vs `1.234,56` (DE) vs `1 234,56` (FR).
108
+ - **Plurals.** `Intl.PluralRules(locale)`. English has 2 forms; Russian has 3; Arabic has 6. Never `n === 1 ? "1 item" : n + " items"` — breaks in Polish, Arabic, Welsh.
109
+ - **Length tolerance.** German ≈ 1.3× English; Russian ≈ 1.2×; Chinese ≈ 0.5×. Don't fix widths to English copy. Test with `de-DE` pseudo-locale.
110
+ - **RTL readiness.** Use logical CSS properties (`margin-inline-start`, `padding-inline-end`, `border-inline-start`), not `margin-left`. `dir="rtl"` at the root should flip the UI without additional CSS.
111
+ - **Time zones.** Store UTC, display in the user's zone. Never assume server time is user time. Use `Intl.DateTimeFormat(locale, { timeZone })`.
112
+ - **Sorting.** `Intl.Collator(locale)` — alphabetical order is locale-dependent (Swedish sorts `å` after `z`, German doesn't).
113
+
114
+ ---
115
+
116
+ ## Core Principles (Tactical)
117
+
118
+ 1. **Be specific**: "Enter email" not "Enter value"
119
+ 2. **Be concise**: Cut unnecessary words (don't sacrifice clarity)
120
+ 3. **Be active**: "Save changes" not "Changes will be saved"
121
+ 4. **Be human**: "Something went wrong" not "System error encountered"
122
+ 5. **Be helpful**: Tell users what to do, not just what happened
123
+ 6. **Be consistent**: Same terms throughout — don't vary for variety
124
+
125
+ ---
126
+
127
+ ## CTAs & Buttons
128
+
129
+ **Verb + noun.** Never `Submit`, `OK`, `Click here`, `Continue`.
130
+
131
+ | Generic | Specific |
132
+ |---------|----------|
133
+ | Submit | Create project |
134
+ | OK | Got it |
135
+ | Continue | Next: billing |
136
+ | Click here | Download invoice (PDF, 84KB) |
137
+ | Delete | Delete workspace |
138
+
139
+ - Describe the action specifically (verb + noun). Active voice.
140
+ - **Destructive actions include the object:** "Delete `project-alpha`" — user confirms the thing, not a generic verb. Typing the name for irreversible operations is the gold standard.
141
+ - **Action reveals consequence.** "Send invite" tells the user exactly what happens. "Submit form" does not.
142
+ - **One primary per view section** — solid for primary, outline/ghost for secondary.
143
+ - **Disabled states explain why** — not just grayed out, never rely on color alone.
144
+ - **One label per intent, page-wide.** "Get in touch", "Contact us", and "Let's talk" on the same page are one action wearing three names — each variant dilutes the conversion path. Pick one label per intent (contact, signup, view-work) and reuse it in nav, hero, and footer. Same for "Try free" / "Get started" / "Sign up free".
145
+ - **CTA labels fit one line at desktop.** A primary CTA that wraps to two lines is broken — shorten the label (≤3 words for primaries) or widen the button; never constrain a CTA's width artificially.
146
+ - **An action keeps its name through the whole flow.** The button that says "Publish" produces a toast that says "Published" — not "Success!" or "Your post is live". Confirmation dialogs, progress states, and completion messages all conjugate the same verb the trigger used. Interface vocabulary is signposting; renaming an action mid-flow makes the user re-verify they did the right thing.
147
+
148
+ ---
149
+
150
+ ## Numbers & Control Labels
151
+
152
+ - Numerals, never spelled out: "245", not "two hundred forty-five" — numerals have distinct shapes and scan faster. Group thousands ("12,400"); huge numbers go hybrid ("1 billion", "2.4M") so nobody counts zeros.
153
+ - Form labels drop possessives: "Email", not "My email" or "Your email" — the possessive adds a word and an ambiguity (whose?).
154
+ - Button labels are verb + noun ("Save post", "Delete message"): readable out of context, which is exactly how screen-reader users jumping between controls hear them.
155
+ - **Fake-precise numbers are a tell.** "92%", "4.1×", "13.4 lb" either come from real data (brief, brand, public metrics), are explicitly labeled as sample data, or get cut. Invented engineering precision the brand never claimed reads as fabricated the moment anyone checks.
156
+
157
+ ---
158
+
159
+ ## Copy Self-Audit (before any surface ships)
160
+
161
+ Re-read **every visible string** — headlines, eyebrows, button labels, body copy, captions, alt text, footer, error messages. Flag and rewrite anything that is:
162
+
163
+ - **Grammatically broken** or has an unclear referent ("we plan to stay that way" with no antecedent).
164
+ - **Forced cleverness** — wordplay that doesn't track, mock-poetic labels ("Field notes", "On our desks", "Loose plates" for a testimonials section), performative humility ("Quietly trusted by…"). Use the plain functional label: "Testimonials", "Trusted by", "Latest writing".
165
+ - **Generic step scaffolding** — "Step 1 / Step 2 / Step 3", "Phase 01". The step's verb is the label: "Install", "Configure", "Ship".
166
+ - **Separator flooding** — ration the middle dot to one per metadata line ("foo · bar · baz · qux" is a tell; use line breaks or columns). Avoid the em-dash in UI strings (labels, buttons, captions) — restructure with a period, comma, or colon instead.
167
+
168
+ If a string might not make sense, replace it with a plain functional sentence. Boring copy beats broken-clever copy every time.
169
+
170
+ ---
171
+
172
+ ## Error Messages
173
+
174
+ Three parts, in order: **what happened** + **why** + **what to do**.
175
+
176
+ - "Upload failed. The file is 62MB; the limit is 50MB. Try compressing it or splitting into parts."
177
+ - "We couldn't reach the server. Your internet looks offline. We'll retry automatically when you're back online."
178
+ - "Can't create the project. The name `beta` is already taken in this workspace. Try another name."
179
+
180
+ **Missing pieces = bad error.** "Something went wrong" has none. "Invalid input" has only the first.
181
+
182
+ ### Rules
183
+ - Explain what went wrong in plain language
184
+ - Suggest how to fix it
185
+ - Don't blame the user
186
+ - Include examples when helpful
187
+ - Link to help/support if applicable
188
+
189
+ **Bad**: "Error 403: Forbidden" → **Good**: "You don't have permission to view this page. Contact your admin for access."
190
+ **Bad**: "Invalid input" → **Good**: "Email addresses need an @ symbol. Try: name@example.com"
191
+
192
+ ---
193
+
194
+ ## Empty States
195
+
196
+ **Bad**: "No items" → **Good**: "No projects yet. Create your first project to get started."
197
+
198
+ - Explain why it's empty (if not obvious)
199
+ - Show next action clearly
200
+ - Make it welcoming, not a dead-end
201
+
202
+ ---
203
+
204
+ ## Loading & Success States
205
+
206
+ **Loading** — Bad: "Loading..." (for 30+ seconds). Good: "Analyzing your data... this usually takes 30-60 seconds."
207
+ - Set expectations, explain what's happening, show progress, offer "Cancel".
208
+
209
+ **Success** — Bad: "Success". Good: "Settings saved! Your changes will take effect immediately."
210
+ - Confirm what happened, explain what's next, be brief but complete.
211
+
212
+ ---
213
+
214
+ ## Confirmation Dialogs
215
+
216
+ **Bad**: "Are you sure?" → **Good**: "Delete 'Project Alpha'? This can't be undone."
217
+
218
+ - State the specific action
219
+ - Explain consequences (especially destructive)
220
+ - Clear button labels ("Delete project" not "Yes")
221
+ - Only for risky actions
222
+
223
+ ---
224
+
225
+ ## Form Labels & Microcopy
226
+
227
+ - Clear, specific labels (not generic placeholders)
228
+ - Placeholders are examples, not labels — labels exist separately, placeholders end with `…`
229
+ - Explain why you're asking (when not obvious)
230
+ - Instructions before the field, not after
231
+ - Never use placeholders as the only labels
232
+
233
+ **Tooltips** — Bad: "This is the username field". Good: "Choose a username. You can change this later in Settings."
234
+ - Add value (don't repeat the label), answer "What is this?" or "Why?", inline help first, tooltips as last resort.
235
+
236
+ ---
237
+
238
+ ## Formatting Rules
239
+
240
+ - **Ellipsis for loading/follow-ups**: "Loading…", "Rename…"
241
+ - **Use `…` character** not three dots `...`
242
+ - **Curly quotes**: " " not " "
243
+ - **Non-breaking spaces**: `10 MB`, `⌘ K`
244
+ - **Numerals for counts**: "8 deployments" not "eight deployments"
245
+ - **Active voice**: "Install the CLI" not "The CLI will be installed"
246
+ - **Default to positive language**: encourage, don't blame
247
+ - **`<title>` reflects current context**
248
+
249
+ ---
250
+
251
+ ## Content & States
252
+
253
+ Every UI must design for the full range of content and states, not just the happy path:
254
+
255
+ - **Design all states**: empty, sparse, dense, error, loading, success
256
+ - **Skeletons mirror final content** exactly — prevent layout shift
257
+ - **No dead ends** — always offer next step or recovery
258
+ - **Empty states** guide toward action, not just "nothing here"
259
+ - **Accessible names** exist even when visuals omit labels
260
+ - **Resilient to user-generated content**: short, average, very long
261
+
262
+ ---
263
+
264
+ ## Banned Patterns (Dark UX)
265
+
266
+ UX sins, not style choices.
267
+
268
+ - **Confirmshaming.** "No thanks, I don't care about security." Ship: "No thanks" as a plain link.
269
+ - **Fake urgency.** "Only 2 seats left!" when it's always 2. Ship: real counters or no counter.
270
+ - **Fake scarcity.** "87% of users upgraded" with no source. Ship: named, verifiable stats or omit.
271
+ - **Roach motel.** Easy signup, impossible cancellation. Ship: cancel in the same number of clicks as signup.
272
+ - **Dark toggles.** Opt-in checkboxes pre-checked for marketing emails. Ship: unchecked by default, unambiguous label.
273
+ - **Bait-and-switch pricing.** "$9/mo" that's actually "$9/mo, billed $108 annually, with a $29 setup fee." Ship: the total visible at decision time.
274
+
275
+ ---
276
+
277
+ ## Never
278
+
279
+ - Use jargon without explanation
280
+ - Blame users
281
+ - Be vague without specifics
282
+ - Use passive voice unnecessarily
283
+ - Use humor for errors (be empathetic)
284
+ - Assume technical knowledge
285
+ - Vary terminology (pick one term, stick with it)
286
+ - Repeat information (headers restating intros)
287
+ - Use placeholders as the only labels
288
+ - Exclamation points on errors
289
+ - Celebratory copy on routine saves
290
+
291
+ ---
292
+
293
+ ## Sources
294
+
295
+ - Nielsen, J. "How Users Read on the Web." Nielsen Norman Group.
296
+ - Mailchimp Content Style Guide — [styleguide.mailchimp.com](https://styleguide.mailchimp.com/).
297
+ - Shopify Polaris — Content Guidelines.
298
+ - Atlassian Design System — Writing Style.
299
+ - Flesch, R. "A New Readability Yardstick." *Journal of Applied Psychology*, 1948.
300
+ - Unicode CLDR — locale data for dates, numbers, plurals.
@@ -0,0 +1,160 @@
1
+ # Craft Intent — Read, Variance, Signature
2
+
3
+ Load on every `/craft`, default Build mode, and when the user asks for a full surface without naming a command. This file is the **generative front door** — declare intent before writing code.
4
+
5
+ ---
6
+
7
+ ## 1. Craft Read (mandatory before code)
8
+
9
+ Before tokens or layout, output **one line** the user can react to:
10
+
11
+ > **Craft Read:** *[surface kind] for [audience], [product | marketing] language, [theme/accent hint], variance [N], signature bet: [choice].*
12
+
13
+ **Infer from:** page/app kind, vibe words ("minimal", "editorial", "dense", "playful"), references the user named, existing brand tokens, audience.
14
+
15
+ **Examples:**
16
+
17
+ - *Craft Read: B2B ops dashboard for finance admins, product language, Graphite + teal accent, variance 4, signature bet: hero metric card with sparkline.*
18
+ - *Craft Read: devtool launch page for technical buyers, marketing language, Porcelain + indigo, variance 7, signature bet: product screenshot cropped at fold with floating proof card.*
19
+ - *Craft Read: designer portfolio for hiring managers, marketing language, editorial type, variance 8, signature bet: kinetic display headline with italic emphasis in same family.*
20
+
21
+ If the brief is ambiguous, ask **one** clarifying question — never a questionnaire. If inferable, declare the Craft Read and proceed.
22
+
23
+ **Anti-default discipline:** Generated design without a committed read clusters into three defaults — (1) warm cream background (~`#F4F1EA`) + serif display + terracotta/brass accent; (2) near-black background + one bright acid-green or vermilion accent; (3) broadsheet layout — hairline rules, zero border-radius, dense columns. Each is legitimate only *when the brief asks for it*, never as a default answer to "no brand direction" — same goes for purple mesh gradients, symmetric three-icon-card heroes, full-black sidebars, and Inter-on-everything without a reason.
24
+
25
+ **Second-order check (marketing surfaces):** name the aesthetic lane before building ("editorial type", "terminal-dark devtool", "warm-craft artisan"), then ask if someone could guess it from the domain alone — "devtool → dark mode + mono" is the first reflex, "AI tool that's not-purple → editorial serif restraint" is the same reflex one tier deeper. If the lane, or any default above, is guessable from the category, rework it until it isn't — the brand's specifics should pick the lane, not the category. Self-test: "would a similar brief for a *different* brand in this category produce this same plan?" If yes for any axis, that's a reflex, not a decision — revise it and state what changed.
26
+
27
+ ---
28
+
29
+ ## 2. DESIGN_VARIANCE knob (1–10)
30
+
31
+ Separate from **VISUAL_DENSITY** (how much fits) and **CRAFT_LEVEL** (how refined). Variance controls **layout risk and creative amplitude**.
32
+
33
+ | Variance | Product surfaces | Marketing surfaces |
34
+ |----------|------------------|-------------------|
35
+ | **1–3** | Symmetric grids, safe hierarchy | Centered hero OK only with asymmetric support |
36
+ | **4–6** | Split layouts, metric hierarchy, one layout break | Split/bento heroes, alternating feature rows |
37
+ | **7–8** | Strong typographic moments in shell (empty state, onboarding) | Asymmetric offsets, scroll-linked logo strip, display scale drama |
38
+ | **9–10** | Rare — one experimental shell moment only | Kinetic type, scroll choreography — **explicit brief or user asks "experimental"** |
39
+
40
+ **Defaults when user doesn't specify:**
41
+
42
+ | Surface | Default variance |
43
+ |---------|------------------|
44
+ | Dashboard, settings, auth, tables | **4** |
45
+ | Landing (live product) | **7** |
46
+ | Landing (waitlist / pre-launch) | **6** |
47
+ | Portfolio, case-study, launch event | **8** |
48
+
49
+ `/bolder` raises variance (+1–2, cap 10) and motion (+1, cap 10). `/quieter` lowers both. Honor `prefers-reduced-motion` always.
50
+
51
+ ---
52
+
53
+ ## 3. Signature bet (mandatory — not polish-gated)
54
+
55
+ Every `/craft` ships **exactly one** memorable decision, chosen at plan time and built in Step 3 — not deferred to `/polish`.
56
+
57
+ ### Product surfaces (pick one)
58
+
59
+ 1. Custom empty-state motif (simple SVG tied to domain)
60
+ 2. Distinctive nav active indicator (left bar, pill, or dot) — system-wide
61
+ 3. Welcome / first-run panel — dismissible, value-focused
62
+ 4. Primary table row hover (subtle lift + shadow on the main table only)
63
+ 5. Command palette or keyboard hint (`⌘K`) when search/actions warrant it
64
+
65
+ ### Auth surfaces (pick one — load [recipe-auth.md](recipe-auth.md))
66
+
67
+ 1. Panel proof asset — one believable metric + sparkline **or** one attributed quote (not both)
68
+ 2. Trust footer line — compliance / data residency in tertiary text at panel foot
69
+ 3. Domain-specific welcome line — verb tied to product ("Pick up where you left off"), not generic filler
70
+ 4. Real provider marks on SSO row — equal-weight neutral outlines, no fake icons
71
+ 5. Subtle panel motif — simple SVG tied to domain on the tinted panel only
72
+
73
+ ### Marketing surfaces (pick one)
74
+
75
+ 1. Hero crop — product visual cut mid-element at fold edge
76
+ 2. Floating proof card over screenshot (metric, notification)
77
+ 3. Custom section marker (FIG label, domain icon motif)
78
+ 4. Distinctive CTA copy — specific verb, not "Get started"
79
+ 5. One scroll moment — logo strip or restrained headline entrance (variance ≥7)
80
+
81
+ Name the bet in the Craft Read. Build it in the first pass.
82
+
83
+ ---
84
+
85
+ ## 4. Product surface patterns (apps, dashboards, settings)
86
+
87
+ Apply on dashboard, auth, settings, onboarding, admin — load with [recipe-dashboard.md](recipe-dashboard.md).
88
+
89
+ **Shell:** Tinted sidebar (not full black). Active nav = accent/10 + accent text. Page header row: title + context + primary action aligned.
90
+
91
+ **Data:** One hero metric (larger, accent tint); secondaries neutral. Sparklines in KPI cards where trends matter. Table rows with context (avatar, status dot, proportion bar) — not plain grids. Ghost buttons in filter toolbars; primary CTA lives outside the toolbar.
92
+
93
+ **Type & color:** `tabular-nums` on numbers. Sentence case on nav and headers. Tinted surfaces (`accent/5` on primary card). Semantic green/red only when the domain expects it.
94
+
95
+ **Motion:** Optimistic UI where saves matter. Skeletons match final layout. `:active` micro-push (`scale(0.98)`). One staggered entrance per section max, `once: true`.
96
+
97
+ **States:** Empty states with icon + one sentence + CTA. Errors with retry/copy path. Onboarding checklists 3–5 steps, dismissible.
98
+
99
+ **Avoid in product shells:** scroll pinning, kinetic body copy, mesh backgrounds behind tables, glass on dense forms, decorative carousels.
100
+
101
+ **Ecosystem briefs use the official system.** When the brief names a platform with a mandated or expected design system, install and use the official package and its tokens instead of hand-rolling a lookalike — recreating a known system's CSS by hand is both more work and instantly off. One system per project; don't mix component libraries in the same tree.
102
+
103
+ Naming the platform is not enough to act on. Install what the row says:
104
+
105
+ | Brief reads as… | Install | Ships as |
106
+ |---|---|---|
107
+ | Microsoft 365 / Fluent-flavoured | `@fluentui/react-components` | React |
108
+ | Atlassian-suite companion | `@atlaskit/button`, `@atlaskit/textfield`, … | React, one package per component |
109
+ | Shopify app or admin surface | `@shopify/polaris` | React |
110
+ | Material-flavoured product | `@material/web` | Web components — any framework |
111
+ | IBM-style B2B / enterprise analytics | `@carbon/react` | React (`@carbon/styles` for the CSS alone) |
112
+ | Salesforce / Lightning | `@salesforce-ux/design-system` | CSS — any framework |
113
+ | Adobe-flavoured | `@adobe/react-spectrum` | React |
114
+ | GitHub-flavoured developer tooling | `@primer/react` | React (`@primer/primitives` for tokens alone) |
115
+ | UK public sector | `govuk-frontend` | Plain CSS + JS |
116
+ | US federal / state service | `@uswds/uswds` | Plain CSS + JS |
117
+
118
+ Check the third column against the project before adding a dependency. Most of these ship as React and installing one into a Vue, Svelte or Angular codebase is worse than hand-rolling: take the system's tokens and CSS instead, which is the part that makes it recognisable. Atlassian has no meta-package — install the components the surface actually uses.
119
+
120
+ No row matches → this rule does not apply. Proceed with the normal token flow rather than reaching for the nearest big component library.
121
+
122
+ ---
123
+
124
+ ## 5. Marketing surface patterns (landings, portfolios)
125
+
126
+ Apply on landing, portfolio, waitlist — load with [recipe-landing.md](recipe-landing.md) and [inspiration.md](inspiration.md) hero archetypes.
127
+
128
+ **Composition:** Pick one hero archetype (product-forward, message-forward, proof-forward, bento, editorial figure, social proof strip). **No two adjacent sections share the same layout.**
129
+
130
+ **Type:** Display 48–80px H1, tight tracking, sentence case. Font pairing from theme preset or brief — body + optional display. Emphasize with italic/bold **same family**, not random serif injection.
131
+
132
+ **Color:** Pick a commitment strategy first ([color.md](color.md) Commitment Axis — restrained / committed / full palette / drenched, gated by variance); default restrained: 90% neutral + one accent; rotate accent family when no brand (indigo, teal, rose, amber, forest). No default warm-beige + brass "premium" palette unless the brief names it.
133
+
134
+ **Imagery:** marketing surfaces are visual products, not text-only pages — asset priority order, the div-built-screenshot ban, and the logo-wall rule live in [recipe-landing.md](recipe-landing.md) (Imagery is not optional).
135
+
136
+ **Motion:** Hero stagger 50–80ms; one scroll reveal per section; multi-property hover on **one** featured block. No bounce, confetti, or idle float. Every animation must answer "what does this communicate?" in one sentence (hierarchy, sequence, feedback, state change) — "it looked cool" fails.
137
+
138
+ **Portfolio:** Variable grid aspects; one hero project above fold; asymmetric about/contact — not centered template.
139
+
140
+ ---
141
+
142
+ ## 6. Rotation (when no brand direction)
143
+
144
+ Rotate **one axis per build** so outputs don't converge:
145
+
146
+ | Axis | Pool (pick 1) |
147
+ |------|----------------|
148
+ | Theme preset | Graphite, Porcelain, Signal, Carbon — [themes.md](themes.md) |
149
+ | Accent family | indigo, teal, rose, amber, forest (OKLCH-safe) |
150
+ | Signature bet | from §3 lists |
151
+
152
+ Declare the axis in the Craft Read so the user can say "warmer accent" on iteration.
153
+
154
+ **Premium/artisan briefs must rotate palette families** — the default warm-beige + brass + espresso "premium" look is a convergence tell the moment the brief doesn't name those colors. Full family list and the never-twice-in-a-row rule: [themes.md](themes.md) Premium palette families.
155
+
156
+ ---
157
+
158
+ ## Cross-refs
159
+
160
+ [recipe-dashboard.md](recipe-dashboard.md) · [recipe-landing.md](recipe-landing.md) · [recipe-auth.md](recipe-auth.md) · [inspiration.md](inspiration.md) · [themes.md](themes.md) · [dashboard.md](dashboard.md) · [review.md](review.md)
@@ -0,0 +1,131 @@
1
+ # Dashboard Patterns
2
+
3
+ Detailed guidance for building data-heavy dashboards that feel designed, not generated.
4
+
5
+ ## Layout Structure
6
+
7
+ A dashboard needs a sidebar + main content area. The sidebar is the navigation spine.
8
+
9
+ **Sidebar navigation:**
10
+ - Subtle background tint (e.g., `background: #f8fafc` / Tailwind: `bg-slate-50`, or `background: #030712` / Tailwind: `bg-gray-950`) — NOT full black unless Dark Premium style. A dark sidebar is a common AI pattern; prefer a subtle tint that complements the content area.
11
+ - Muted nav text that brightens on hover/active. Active item gets accent background at low opacity (`background: oklch(var(--accent) / 0.1)` / Tailwind: `bg-accent/10`) + accent text.
12
+ - Brand/logo at top, user profile at bottom.
13
+ - `aria-label="Main navigation"` on `<nav>`, `aria-current="page"` on active item.
14
+ - `overscroll-behavior: contain` on the sidebar if it scrolls independently.
15
+
16
+ **Main content area:**
17
+ - Filter/toolbar row at the top: ghost buttons for filters, active state uses accent bg at low opacity. Always include a date range selector for any time-series surface. **Why:** time-series data without an interactive range silently encodes the assumption that the default window is correct — when it isn't (and it usually isn't for power users), the dashboard becomes a screenshot. **When it breaks:** real-time monitoring surfaces with a fixed last-N-minutes window — the range is the affordance, not the picker.
18
+ - Content grid below filters: metric cards → charts → tables/lists.
19
+ - Minimum 3 different content types visible per viewport (e.g., metric cards + chart + table).
20
+
21
+ ## Metric Card Hierarchy
22
+
23
+ Never show 4+ identical metric cards. Differentiate the primary metric. **Why:** a uniform grid of equal-weight cards triggers the AI-template tell — variety signals editorial decision; uniformity signals defaulted-out. It also fails the squint test: the eye can't lock on a primary at first glance. **How to differentiate:** primary card gets accent tint, slightly larger number, optional sparkline; secondaries are neutral with smaller type. See Signal-to-Noise Hierarchy section below.
24
+
25
+ **Primary metric card:**
26
+ - Accent-tinted background (`background: oklch(var(--accent) / 0.05)` / Tailwind: `bg-accent/5`) with accent-colored number, OR solid accent background with white text.
27
+ - Slightly larger number (36px vs 28px for others).
28
+
29
+ **Secondary metric cards:**
30
+ - White background, subtle border (`1px solid oklch(92% 0.005 250)`).
31
+ - Black number, secondary-color label.
32
+
33
+ **All metric cards should include:**
34
+ - Sparklines: 32px tall, polyline SVG, accent color with faded fill underneath.
35
+ - Change text: "+2,149 from last month" in `var(--text-tertiary)`. **Never green arrows for positive, red for negative.** **Why:** color implies judgment that may not match user context — a 30% increase in costs is "positive" by sign and "bad" by goal; the green arrow encodes the wrong story. Render the magnitude in neutral and let the user's interpretation supply meaning. **When it breaks:** financial trading surfaces where positive/negative is universally tied to goal (gains green, losses red is the domain convention) — match the user's domain, don't fight it.
36
+ - Label: sentence case, 12-13px, `font-weight: 500`, secondary color.
37
+ - Value: 28-36px, `font-weight: 700`, `font-variant-numeric: tabular-nums`, `letter-spacing: -0.02em`.
38
+ - NO colored top/left borders. NO colored change text. NO arrow icons next to percentages.
39
+
40
+ ## Chart Type Decision Matrix
41
+
42
+ | Data story | Best chart | Why | Avoid |
43
+ |-----------|-----------|-----|-------|
44
+ | Trend over time | Area chart with gradient fill | Shows direction + volume | Vertical bar chart |
45
+ | Comparing categories | Horizontal bar chart | Labels are readable, easy to scan | Vertical bar with rotated labels |
46
+ | Comparing discrete values | Vertical bar chart | Natural for small sets (3-7 items) | Too many bars (>8) |
47
+ | Part-of-whole | Donut/ring chart (use sparingly) | Center text shows total | Pie chart — harder to compare |
48
+ | Inline trend in a card | Sparkline (32px polyline) | Minimal, contextual | Full chart crammed into a card |
49
+ | Conversion/funnel | Progressive bars with stage labels | Shows drop-off clearly | Donut chart |
50
+ | Never use | — | — | Pie charts, 3D charts of any kind |
51
+
52
+ **Why never pie charts:** Cleveland-McGill perceptual hierarchy ranks angle (pie) below position (bar). Humans compare bar lengths to within a few percent; pie wedges fail at 4+ slices. **Why never 3D:** depth occludes data points and foreshortens position-based comparison. No 2D chart benefits from a third dimension. **When a two-segment donut is acceptable:** a donut with center label for binary proportions (used vs free, paid vs free) — only one comparison to make.
53
+
54
+ ## Chart Styling
55
+
56
+ - **Single accent hue at varying opacities** for multi-series: `accent/100`, `accent/60`, `accent/30`. **Never rainbow colors.** **Why:** hue does not encode ordering — readers can't rank red vs green by magnitude. Single-hue opacity ramps preserve perceptual ordering and remain colorblind-safe. See `dataviz.md` for full palette guidance.
57
+ - **Gradient fill underneath area lines**: line at full opacity, fill fades from ~15% at line to 0% at bottom.
58
+ - **Label placement**: axis labels in secondary text, 11-12px. Data point labels only on hover (tooltip), not permanently displayed.
59
+ - **Grid lines**: horizontal only, very subtle (`border-color: oklch(95% 0 0)` / Tailwind: `border-gray-100`). No vertical grid lines.
60
+ - **No chart chrome**: skip legends when there's only one series. Put context in the card title instead.
61
+
62
+ ## Data Tables
63
+
64
+ Tables are the workhorse of dashboards. Make them earn their space.
65
+
66
+ - **Row context**: tiny avatars (24px), colored status dots (6px, not badges), flag icons, or proportion bars. Plain text tables feel like spreadsheets.
67
+ - **Status indicators**: small colored dots (6-8px) inline with text. "Active" with a green dot, not a green badge/pill. The dot conveys status; the text provides the label. Badges add visual noise and are an AI-slop pattern.
68
+ - **Proportion bars**: show relative values as width-proportional bars within cells. More visual than raw numbers.
69
+ - **Row hover**: subtle background highlight (`background: #f9fafb` / Tailwind: `hover:bg-gray-50`).
70
+ - **Headers**: sentence case, `font-weight: 500`, secondary color. **Never uppercase table headers.** **Why:** uppercase removes the lowercase letterforms that aid scan-pattern recognition; readers process uppercase ~13-20% slower than sentence case (Tinker 1969). Uppercase also reads as decorative-template, not data-functional.
71
+ - **Alignment**: text left, numbers right, status center.
72
+ - **Wrap every table in `overflow-x: auto`.** Horizontal, not `overflow-y` and not `overflow-hidden`. **Why:** a table is the one layout that cannot reflow — columns have minimum content widths, so at ~320px it either clips at the viewport edge or forces the whole page to scroll sideways. Vertical overflow solves a different problem and leaves this one intact.
73
+ - **Put `position: sticky; top: 0` on `thead` past ~15 rows.** **Why:** once the header scrolls out of view every cell below it is an unlabelled string, and the user scrolls back up to remember which column is which. On an operator surface the table *is* the product, so this is not polish.
74
+ - **Virtualize past 200 rows.** **Why:** every row is DOM the browser lays out, styles, and paints on each scroll frame — a 2,000-row table blows the 16ms budget before any of your CSS is at fault, and the fix is never "optimize the row component". Render a window (TanStack Virtual, `react-window`) or paginate. **When it breaks:** the table must be Cmd+F-searchable or printable in full — then paginate instead of virtualizing, since a virtual window hides rows from find-in-page.
75
+ - **`scrollbar-gutter: stable` on every scroll container.** **Why:** on overlay-scrollbar platforms the track appears only on scroll, and the content reflows by its width at that moment — column edges jump the instant the user touches the wheel. Reserving the gutter costs nothing and removes the shift.
76
+
77
+ ## Filter & Toolbar Patterns
78
+
79
+ - Ghost buttons for all filter controls — **never solid primary buttons in a toolbar.** **Why:** a toolbar holds 5-15 tertiary actions (filter, sort, group, export, refresh). Each solid primary button competes for the user's primary-action attention budget; the dashboard's actual primary action (drill-in, edit, alert config) gets buried. Hick's Law applied to visual weight.
80
+ - Active filter state: accent background at low opacity + accent text, or subtle border change.
81
+ - Group related filters visually. Date range selector deserves more prominence (slightly larger or separated).
82
+ - "Reset filters" appears only when filters are active, as a text link — not a button.
83
+
84
+ ## Content Density
85
+
86
+ Dashboards value density over breathing room (opposite of landing pages).
87
+
88
+ - Metric cards: tight padding (16-20px), not the generous 32-48px of landing page cards.
89
+ - Charts: minimize whitespace around the chart area. The data should fill the container.
90
+ - Tables: compact row height (40-48px). Dense but scannable.
91
+ - A dashboard should show enough data that a user can make a decision without scrolling. If the first viewport is just 4 large metric cards, you've wasted space.
92
+ - Aim for: 3-4 metric cards + at least one chart + start of a table/list — all above the fold.
93
+
94
+ ---
95
+
96
+ ## Signal-to-Noise Hierarchy
97
+
98
+ The most common AI-generated dashboard failure isn't any single bad choice — it's that every KPI, every chart, every card looks equally important. The user doesn't know where to look. Signal-to-noise hierarchy is the fix.
99
+
100
+ ### Tiers
101
+
102
+ **Tier 1 — The hero metric.** One per dashboard. The number that answers "am I winning today?". Largest visual weight. Accent color is allowed here, and here only. Trend indicator adjacent (up/down + delta). Context micro-text below: "vs last 7 days" or "of monthly quota."
103
+
104
+ **Tier 2 — Supporting metrics (2-4).** The breakdown of the hero — if the hero is revenue, supports are revenue by channel, by region, by segment. Neutral colors. Smaller type. Grouped visually with the hero (shared container, aligned baseline).
105
+
106
+ **Tier 3 — Context (0-3 charts).** Trends, time series, comparisons. Chart type matches data shape (see `dataviz.md` and the Chart Type Decision Matrix above). Sparklines for micro-context inside cards. No large charts competing with the hero's visual weight.
107
+
108
+ **Tier 4 — Deep-dive.** Tables, filters, raw data. Accessible but not crowding the viewport. Often collapsed by default, or lives on a separate tab / route. The user drills in when they need it.
109
+
110
+ ### The anti-pattern: "grid of 8 KPI cards with equal weight"
111
+
112
+ Every card the same size, same color, same layout → the user's eye has nowhere to land → the user scrolls looking for meaning → the user leaves. This is the single most recognizable AI-generated dashboard shape.
113
+
114
+ ### The rule
115
+
116
+ One hero. 2-4 supports. Context behind. Deep-dive one click away. Test by squinting at the dashboard: your eye should land on ONE thing first. If it lands everywhere, the hierarchy is broken.
117
+
118
+ ### Ranking decisions to document per dashboard
119
+
120
+ Before building, answer these:
121
+
122
+ - **What's the hero metric for this surface?** Different for exec view (revenue) vs operator view (tickets open) vs customer view (usage vs limit). See `personas.md` to ground this in concrete archetypes.
123
+ - **What supporting metrics contextualize the hero?** The 2-4 that make the hero actionable, not the 8 you could show.
124
+ - **What's deep-dive, not surface?** Everything the user needs once a week, not once a minute.
125
+ - **Who's the user and what decision are they making in the next 60 seconds?** If you can't name the decision, the dashboard has no job.
126
+
127
+ ### Cross-references
128
+
129
+ - `dataviz.md` — chart selection by data shape; Cleveland-McGill perceptual hierarchy (position-on-common-scale is most accurate — use it for the hero).
130
+ - `heuristics.md` — Cleveland-McGill PASS/FAIL, Hick's Law for filter/nav choices.
131
+ - `personas.md` — concrete user archetypes to ground "who's the user" in reality, not abstraction.