ai-developer-skill-os 7.0.2 → 7.5.1
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/.agents/AGENTS.md +44 -88
- package/.agents/CHANGELOG.md +70 -0
- package/.agents/LICENSE +21 -0
- package/.agents/README.md +100 -0
- package/.agents/docs/CHI_TIET_SKILLS.md +126 -0
- package/.agents/docs/GOVERNANCE.md +40 -0
- package/.agents/docs/HUONG_DAN_SU_DUNG.md +120 -0
- package/.agents/docs/SPEC.md +87 -0
- package/.agents/docs/adr/0001-intent-based-architecture.md +19 -0
- package/.agents/docs/adr/0002-kernel-freeze.md +21 -0
- package/.agents/docs/adr/0003-risk-based-verification.md +20 -0
- package/.agents/docs/adr/0004-progressive-evidence.md +19 -0
- package/.agents/docs/skill-classification.md +25 -0
- package/.agents/skills/qk-access-policy/SKILL.md +179 -0
- package/.agents/skills/qk-ai-builder/SKILL.md +215 -0
- package/.agents/skills/qk-api-lifecycle/SKILL.md +176 -0
- package/.agents/skills/qk-bug-resolution/SKILL.md +307 -0
- package/.agents/skills/qk-context-loader/SKILL.md +218 -0
- package/.agents/skills/qk-data-lifecycle/SKILL.md +192 -0
- package/.agents/skills/qk-db-optimizer/SKILL.md +196 -0
- package/.agents/skills/qk-docs/SKILL.md +198 -0
- package/.agents/skills/qk-engineering-standard/SKILL.md +351 -0
- package/.agents/skills/qk-engineering-standard/rules/backend.md +122 -0
- package/.agents/skills/qk-engineering-standard/rules/database.md +3 -0
- package/.agents/skills/qk-engineering-standard/rules/frontend.md +152 -0
- package/.agents/skills/qk-engineering-standard/rules/security.md +3 -0
- package/.agents/skills/qk-engineering-standard/rules/testing.md +3 -0
- package/.agents/skills/qk-fe-api-integration/SKILL.md +326 -0
- package/.agents/skills/qk-feature-delivery/SKILL.md +305 -0
- package/.agents/skills/qk-help/SKILL.md +193 -0
- package/.agents/skills/qk-orchestrator/SKILL.md +278 -0
- package/.agents/skills/qk-orchestrator/references/routing-table.md +78 -0
- package/.agents/skills/qk-production-release/SKILL.md +284 -0
- package/.agents/skills/qk-project-bootstrap/SKILL.md +235 -0
- package/.agents/skills/qk-project-health/SKILL.md +199 -0
- package/.agents/skills/qk-project-memory/SKILL.md +218 -0
- package/.agents/skills/qk-system-evolution/SKILL.md +281 -0
- package/.agents/skills/qk-ui-audit/SKILL.md +315 -0
- package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +136 -0
- package/.agents/skills/qk-ui-builder/SKILL.md +446 -0
- package/.agents/skills/qk-ui-builder/references/anti-patterns.md +295 -0
- package/.agents/skills/qk-ui-builder/references/color.md +115 -0
- package/.agents/skills/qk-ui-builder/references/component-cookbook.md +1194 -0
- package/.agents/skills/qk-ui-builder/references/copy.md +250 -0
- package/.agents/skills/qk-ui-builder/references/interaction-and-states.md +115 -0
- package/.agents/skills/qk-ui-builder/references/layout-and-space.md +111 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/02-long-document.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +51 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/05-workbench.md +44 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +51 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/08-photographic.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/12-letter.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/13-index-first.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +51 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +45 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures.md +38 -0
- package/.agents/skills/qk-ui-builder/references/motion.md +95 -0
- package/.agents/skills/qk-ui-builder/references/responsive.md +115 -0
- package/.agents/skills/qk-ui-builder/references/slop-test.md +135 -0
- package/.agents/skills/qk-ui-builder/references/structure.md +280 -0
- package/.agents/skills/qk-ui-builder/references/themes/atmospheric.md +53 -0
- package/.agents/skills/qk-ui-builder/references/themes/carnival.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/cobalt.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/editorial.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/garden.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/hum.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/lumen.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/midnight.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/modern-minimal.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/playful.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/specimen.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/terminal.md +52 -0
- package/.agents/skills/qk-ui-builder/references/typography.md +129 -0
- package/.agents/skills/qk-ui-system-builder/SKILL.md +221 -0
- package/.agents/skills/qk-validation-gate/SKILL.md +359 -0
- package/.agents/skills.json +819 -0
- package/.github/workflows/ci.yml +1 -1
- package/CHANGELOG.md +2 -1
- package/CLAUDE.md +110 -0
- package/README.md +52 -10
- package/add_lang.js +21 -0
- package/add_lang.py +25 -0
- package/add_sections.py +53 -0
- package/bin/install.js +225 -170
- package/bin/lint.js +123 -0
- package/docs/CHI_TIET_SKILLS.md +27 -26
- package/docs/HUONG_DAN_SU_DUNG.md +3 -3
- package/docs/SPEC.md +70 -20
- package/framework/decision-primitives.md +2 -1
- package/framework/skill-schema.md +310 -0
- package/package.json +16 -5
- package/patch.js +15 -0
- package/patch.py +89 -0
- package/patch2.py +83 -0
- package/skills/_archive_old_skills/qk-accessibility-audit/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-agent-orchestrator/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-api-integration/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-auth-security/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-backend-architecture/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-bug-fix/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-component-generator/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-context-manager/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-database-engineer/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-deployment/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-design-system/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-form-builder/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-frontend-architecture/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-frontend-debug/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-frontend-performance/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-frontend-testing/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-git-engineer/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-help/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-migration/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-project-audit/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-refactor/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-state-management/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-table-crud-generator/SKILL.md +1 -0
- package/skills/_archive_old_skills/qk-ui-builder/SKILL.md +1 -0
- package/skills/_template/SKILL.md +239 -0
- package/skills/qk-access-policy/SKILL.md +180 -39
- package/skills/qk-ai-builder/SKILL.md +216 -40
- package/skills/qk-api-lifecycle/SKILL.md +177 -46
- package/skills/qk-bug-resolution/SKILL.md +308 -46
- package/skills/qk-context-loader/SKILL.md +219 -43
- package/skills/qk-data-lifecycle/SKILL.md +193 -44
- package/skills/qk-db-optimizer/SKILL.md +197 -41
- package/skills/qk-docs/SKILL.md +199 -40
- package/skills/qk-engineering-standard/SKILL.md +352 -42
- package/skills/qk-fe-api-integration/SKILL.md +327 -55
- package/skills/qk-feature-delivery/SKILL.md +306 -48
- package/skills/qk-help/SKILL.md +179 -23
- package/skills/qk-orchestrator/SKILL.md +279 -42
- package/skills/qk-orchestrator/references/routing-table.md +78 -0
- package/skills/qk-production-release/SKILL.md +285 -41
- package/skills/qk-project-bootstrap/SKILL.md +236 -38
- package/skills/qk-project-health/SKILL.md +200 -40
- package/skills/qk-project-memory/SKILL.md +219 -40
- package/skills/qk-system-evolution/SKILL.md +282 -40
- package/skills/qk-ui-audit/SKILL.md +316 -42
- package/skills/qk-ui-audit/references/anti-slop-checklist.md +136 -0
- package/skills/qk-ui-builder/SKILL.md +447 -0
- package/skills/qk-ui-builder/references/anti-patterns.md +295 -0
- package/skills/qk-ui-builder/references/color.md +115 -0
- package/skills/qk-ui-builder/references/component-cookbook.md +1194 -0
- package/skills/qk-ui-builder/references/copy.md +250 -0
- package/skills/qk-ui-builder/references/interaction-and-states.md +115 -0
- package/skills/qk-ui-builder/references/layout-and-space.md +111 -0
- package/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +48 -0
- package/skills/qk-ui-builder/references/macrostructures/02-long-document.md +50 -0
- package/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +51 -0
- package/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +49 -0
- package/skills/qk-ui-builder/references/macrostructures/05-workbench.md +44 -0
- package/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +50 -0
- package/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +51 -0
- package/skills/qk-ui-builder/references/macrostructures/08-photographic.md +50 -0
- package/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +50 -0
- package/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +49 -0
- package/skills/qk-ui-builder/references/macrostructures/12-letter.md +49 -0
- package/skills/qk-ui-builder/references/macrostructures/13-index-first.md +49 -0
- package/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +48 -0
- package/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +48 -0
- package/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +51 -0
- package/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +48 -0
- package/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +48 -0
- package/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +50 -0
- package/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +48 -0
- package/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +45 -0
- package/skills/qk-ui-builder/references/macrostructures.md +38 -0
- package/skills/qk-ui-builder/references/motion.md +95 -0
- package/skills/qk-ui-builder/references/responsive.md +115 -0
- package/skills/qk-ui-builder/references/slop-test.md +135 -0
- package/skills/qk-ui-builder/references/structure.md +280 -0
- package/skills/qk-ui-builder/references/themes/atmospheric.md +53 -0
- package/skills/qk-ui-builder/references/themes/carnival.md +52 -0
- package/skills/qk-ui-builder/references/themes/cobalt.md +52 -0
- package/skills/qk-ui-builder/references/themes/editorial.md +52 -0
- package/skills/qk-ui-builder/references/themes/garden.md +52 -0
- package/skills/qk-ui-builder/references/themes/hum.md +52 -0
- package/skills/qk-ui-builder/references/themes/lumen.md +52 -0
- package/skills/qk-ui-builder/references/themes/midnight.md +52 -0
- package/skills/qk-ui-builder/references/themes/modern-minimal.md +52 -0
- package/skills/qk-ui-builder/references/themes/playful.md +52 -0
- package/skills/qk-ui-builder/references/themes/specimen.md +52 -0
- package/skills/qk-ui-builder/references/themes/terminal.md +52 -0
- package/skills/qk-ui-builder/references/typography.md +129 -0
- package/skills/qk-ui-system-builder/SKILL.md +222 -43
- package/skills/qk-validation-gate/SKILL.md +360 -40
- package/skills.json +815 -825
- package/specs/fixtures/user-payload.json +12 -0
- package/specs/regressions/api-integration-null-fields.yaml +19 -0
- package/temp_fix.js +61 -0
- package/tests/registry.test.js +1 -1
- package/update_template.js +28 -0
- package/skills/qk-design-to-code/SKILL.md +0 -46
- package/skills/qk-policy-engine/SKILL.md +0 -39
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# UI Copy Rules
|
|
2
|
+
|
|
3
|
+
Microcopy is the small bits of text that guide, inform, and reassure users. Good copy is invisible; bad copy creates friction.
|
|
4
|
+
|
|
5
|
+
## Button Labels
|
|
6
|
+
|
|
7
|
+
**Rule:** Verb-first, 1-3 words. Start with the action the user takes.
|
|
8
|
+
|
|
9
|
+
**Good:**
|
|
10
|
+
- Save changes
|
|
11
|
+
- Delete account
|
|
12
|
+
- Upload file
|
|
13
|
+
- Send message
|
|
14
|
+
- Continue to payment
|
|
15
|
+
|
|
16
|
+
**Bad:**
|
|
17
|
+
- Submission (noun, not verb)
|
|
18
|
+
- Click here (generic)
|
|
19
|
+
- Yes / No (without context)
|
|
20
|
+
- Submit your information here (too long)
|
|
21
|
+
|
|
22
|
+
**Guidelines:**
|
|
23
|
+
- Use imperative verbs: Save, Delete, Upload, Send, Continue
|
|
24
|
+
- Avoid articles: "Save" not "Save the changes"
|
|
25
|
+
- Match case to surrounding UI (usually sentence case)
|
|
26
|
+
- For destructive actions, include the object: "Delete file" not just "Delete"
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Error Messages
|
|
31
|
+
|
|
32
|
+
**Rule:** What happened + how to fix. Two sentences max.
|
|
33
|
+
|
|
34
|
+
**Formula:**
|
|
35
|
+
1. State the problem clearly
|
|
36
|
+
2. Provide a specific solution
|
|
37
|
+
|
|
38
|
+
**Good:**
|
|
39
|
+
- "Email address is invalid. Please include an @ symbol."
|
|
40
|
+
- "Password must be at least 8 characters. Try adding a number."
|
|
41
|
+
- "Connection lost. Check your internet and try again."
|
|
42
|
+
|
|
43
|
+
**Bad:**
|
|
44
|
+
- "Error 500" (technical, unhelpful)
|
|
45
|
+
- "Something went wrong" (vague)
|
|
46
|
+
- "Invalid input" (no fix guidance)
|
|
47
|
+
- "Please try again later" (no context)
|
|
48
|
+
|
|
49
|
+
**Guidelines:**
|
|
50
|
+
- Never blame the user ("You entered...")
|
|
51
|
+
- Use plain language, not technical jargon
|
|
52
|
+
- Include actionable next steps
|
|
53
|
+
- Keep it concise: 1-2 sentences
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Placeholder Text
|
|
58
|
+
|
|
59
|
+
**Rule:** Example, not instruction. Show what good looks like, don't tell users what to do.
|
|
60
|
+
|
|
61
|
+
**Good:**
|
|
62
|
+
- "you@example.com" (email input)
|
|
63
|
+
- "12/25/2024" (date input)
|
|
64
|
+
- "Project description..." (textarea)
|
|
65
|
+
- "Search by name or email..." (search input)
|
|
66
|
+
|
|
67
|
+
**Bad:**
|
|
68
|
+
- "Enter your email address" (instruction, redundant with label)
|
|
69
|
+
- "Type here..." (no helpful example)
|
|
70
|
+
- "Required" (states the obvious)
|
|
71
|
+
- "Your full name" (duplicates label)
|
|
72
|
+
|
|
73
|
+
**Guidelines:**
|
|
74
|
+
- Use actual example values
|
|
75
|
+
- Show format for structured data (dates, phone numbers)
|
|
76
|
+
- Avoid repeating the label text
|
|
77
|
+
- Placeholder disappears on focus, so it must be self-explanatory
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## CTAs (Call to Action)
|
|
82
|
+
|
|
83
|
+
**Rule:** Specific, not generic. Tell users exactly what they get.
|
|
84
|
+
|
|
85
|
+
**Good:**
|
|
86
|
+
- Start free trial
|
|
87
|
+
- Download whitepaper
|
|
88
|
+
- Book a demo
|
|
89
|
+
- Get started
|
|
90
|
+
- Create account
|
|
91
|
+
- Upgrade to Pro
|
|
92
|
+
|
|
93
|
+
**Bad:**
|
|
94
|
+
- Submit (generic, no value)
|
|
95
|
+
- Click here (no context)
|
|
96
|
+
- Learn more (vague destination)
|
|
97
|
+
- Sign up (missing context: "Sign up for free")
|
|
98
|
+
- Get started (missing context: what are they starting?)
|
|
99
|
+
|
|
100
|
+
**Guidelines:**
|
|
101
|
+
- Include the value proposition: "Start free trial" not "Submit"
|
|
102
|
+
- Be specific about the outcome: "Download report" not "Continue"
|
|
103
|
+
- Avoid ambiguity: "Create account" not "Join us"
|
|
104
|
+
- Match CTA intensity to action weight (primary vs secondary)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Ban List
|
|
109
|
+
|
|
110
|
+
These phrases are forbidden in UI copy:
|
|
111
|
+
|
|
112
|
+
### Absolutely Banned
|
|
113
|
+
- "Lorem ipsum" — placeholder text in production
|
|
114
|
+
- "Click here" — generic link text
|
|
115
|
+
- "Read more" — lazy, no context
|
|
116
|
+
- "Learn more" — vague, no value proposition
|
|
117
|
+
- "Submit" — generic, no action clarity
|
|
118
|
+
- "John Doe" / "Jane Smith" — fake names
|
|
119
|
+
- "Test User" — lazy placeholder data
|
|
120
|
+
- "Coming soon" — broken promise
|
|
121
|
+
- "Under construction" — unprofessional
|
|
122
|
+
- "TBD" — visible planning state
|
|
123
|
+
- "Error 404" — technical error without guidance
|
|
124
|
+
- "Something went wrong" — unhelpful error
|
|
125
|
+
- "Please try again later" — no context or fix
|
|
126
|
+
|
|
127
|
+
### Contextual Bans
|
|
128
|
+
- "Welcome to our website" — generic, no value
|
|
129
|
+
- "Thank you for your submission" — assumes success before validation
|
|
130
|
+
- "We value your feedback" — insincere, no action
|
|
131
|
+
- "Powered by AI" — unless AI is a selling point
|
|
132
|
+
- "Best in class" — unsubstantiated claim
|
|
133
|
+
- "Seamless" — meaningless buzzword
|
|
134
|
+
- "Synergy" — meaningless buzzword
|
|
135
|
+
- "Leverage" — pretentious verb
|
|
136
|
+
- "Robust" — vague adjective
|
|
137
|
+
- "Cutting-edge" — cliché
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Tone Guidelines
|
|
142
|
+
|
|
143
|
+
**Voice:** Confident, clear, helpful. Not overly casual or corporate.
|
|
144
|
+
|
|
145
|
+
**Person:** Second person ("you") for user actions. First person plural ("we") for company statements. Avoid third person.
|
|
146
|
+
|
|
147
|
+
**Length:** Short for actions, longer for explanations. Buttons: 1-3 words. Headlines: 2-8 words. Body: 1-3 sentences.
|
|
148
|
+
|
|
149
|
+
**Jargon:** Avoid unless audience is technical. If jargon is necessary, define it on first use.
|
|
150
|
+
|
|
151
|
+
**Humor:** Use sparingly. Only in error states, empty states, or onboarding. Never in critical flows or legal text.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Accessibility Copy
|
|
156
|
+
|
|
157
|
+
**Alt Text:** Describe the image content, not "image of" or "photo of."
|
|
158
|
+
- Good: "Bar chart showing 40% increase in sales"
|
|
159
|
+
- Bad: "Image" or "Chart"
|
|
160
|
+
|
|
161
|
+
**ARIA Labels:** Be specific and contextual.
|
|
162
|
+
- Good: `aria-label="Close dialog"`
|
|
163
|
+
- Bad: `aria-label="Button"`
|
|
164
|
+
|
|
165
|
+
**Link Text:** Descriptive, not generic.
|
|
166
|
+
- Good: "View pricing plans"
|
|
167
|
+
- Bad: "Click here"
|
|
168
|
+
|
|
169
|
+
**Form Labels:** Clear and concise.
|
|
170
|
+
- Good: "Email address"
|
|
171
|
+
- Bad: "Please enter your email address in the field below"
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Validation States
|
|
176
|
+
|
|
177
|
+
**Success:**
|
|
178
|
+
- "Changes saved"
|
|
179
|
+
- "Account created"
|
|
180
|
+
- "File uploaded"
|
|
181
|
+
|
|
182
|
+
**Error:**
|
|
183
|
+
- "Invalid email address. Example: you@company.com"
|
|
184
|
+
- "Password must include a number and special character"
|
|
185
|
+
- "Connection failed. Please try again."
|
|
186
|
+
|
|
187
|
+
**Warning:**
|
|
188
|
+
- "You have unsaved changes. Leave without saving?"
|
|
189
|
+
- "Your session expires in 5 minutes"
|
|
190
|
+
|
|
191
|
+
**Info:**
|
|
192
|
+
- "New features available. Refresh to see updates."
|
|
193
|
+
- "Your trial ends in 3 days"
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Empty States
|
|
198
|
+
|
|
199
|
+
**No Data:**
|
|
200
|
+
- "No projects yet. Create your first project to get started."
|
|
201
|
+
- "No messages. Start a conversation with your team."
|
|
202
|
+
|
|
203
|
+
**No Search Results:**
|
|
204
|
+
- "No results for 'query'. Try different keywords or clear filters."
|
|
205
|
+
- "We couldn't find anything matching your search."
|
|
206
|
+
|
|
207
|
+
**Error States:**
|
|
208
|
+
- "Something went wrong on our end. Refresh the page or contact support if it persists."
|
|
209
|
+
- "Unable to load data. Check your connection and try again."
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Confirmation Messages
|
|
214
|
+
|
|
215
|
+
**Destructive Actions:**
|
|
216
|
+
- "Are you sure you want to delete this project? This cannot be undone."
|
|
217
|
+
- "Deactivate account? You will lose access to all projects."
|
|
218
|
+
|
|
219
|
+
**Success Actions:**
|
|
220
|
+
- "Account created! Check your email to verify."
|
|
221
|
+
- "File uploaded successfully."
|
|
222
|
+
|
|
223
|
+
**Conditional Actions:**
|
|
224
|
+
- "You have unsaved changes. Save before leaving?"
|
|
225
|
+
- "Discard draft? Your changes will be lost."
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Legal & Compliance
|
|
230
|
+
|
|
231
|
+
**Privacy:**
|
|
232
|
+
- "We use cookies to improve your experience. [Accept] [Settings]"
|
|
233
|
+
- "By signing up, you agree to our Terms and Privacy Policy."
|
|
234
|
+
|
|
235
|
+
**Consent:**
|
|
236
|
+
- "Send me emails with product updates and offers." (opt-in)
|
|
237
|
+
- "I agree to the Terms of Service." (required)
|
|
238
|
+
|
|
239
|
+
**Age:**
|
|
240
|
+
- "You must be 18 or older to create an account."
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Measurement
|
|
245
|
+
|
|
246
|
+
Copy is done when:
|
|
247
|
+
- Users complete tasks without reading the full text
|
|
248
|
+
- Error messages reduce support tickets
|
|
249
|
+
- CTAs have measurable click-through rates
|
|
250
|
+
- No placeholder text remains in production
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Interaction & States
|
|
2
|
+
|
|
3
|
+
Foundational rules for interactive element states. Every interactive control must define a complete, accessible state set — not just default and hover.
|
|
4
|
+
|
|
5
|
+
## The 8 States
|
|
6
|
+
|
|
7
|
+
Every interactive component should account for:
|
|
8
|
+
|
|
9
|
+
1. **default** — resting, ready to interact.
|
|
10
|
+
2. **hover** — pointer is over (pointer devices only).
|
|
11
|
+
3. **focus** — keyboard / programmatic focus.
|
|
12
|
+
4. **active** — being pressed/clicked.
|
|
13
|
+
5. **disabled** — not interactive, clearly shown.
|
|
14
|
+
6. **loading** — work in progress, feedback given.
|
|
15
|
+
7. **error** — invalid input or failed action, with message.
|
|
16
|
+
8. **success** — completed action, confirmed.
|
|
17
|
+
|
|
18
|
+
```css
|
|
19
|
+
.btn { /* default */ }
|
|
20
|
+
.btn:hover { background: var(--color-accent-hover); }
|
|
21
|
+
.btn:focus-visible { /* focus ring */ }
|
|
22
|
+
.btn:active { transform: translateY(1px); }
|
|
23
|
+
.btn:disabled { /* disabled */ }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Focus: Visible Ring
|
|
27
|
+
|
|
28
|
+
Always provide a visible focus indicator. **Never** use `outline: none` without a replacement. Use `:focus-visible` so mouse users aren't spammed but keyboard users are clearly shown.
|
|
29
|
+
|
|
30
|
+
```css
|
|
31
|
+
.btn:focus { outline: none; } /* remove default */
|
|
32
|
+
.btn:focus-visible {
|
|
33
|
+
outline: 2px solid var(--color-accent);
|
|
34
|
+
outline-offset: 2px;
|
|
35
|
+
/* or a ring via box-shadow */
|
|
36
|
+
box-shadow: 0 0 0 3px oklch(55% 0.16 250 / 0.4);
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The focus ring must meet 3:1 contrast against adjacent colors.
|
|
41
|
+
|
|
42
|
+
## Disabled: Not Opacity-Only
|
|
43
|
+
|
|
44
|
+
A disabled control must combine **reduced opacity** with **`cursor: not-allowed`** and remain non-interactive. Opacity alone is insufficient and confusing.
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
.btn:disabled,
|
|
48
|
+
.btn[aria-disabled="true"] {
|
|
49
|
+
opacity: 0.5;
|
|
50
|
+
cursor: not-allowed;
|
|
51
|
+
pointer-events: none; /* or guard in JS */
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Also dim/hide associated helper text appropriately, and keep the control in the a11y tree (use `aria-disabled` rather than removing the element).
|
|
56
|
+
|
|
57
|
+
## Loading: Skeleton or Spinner
|
|
58
|
+
|
|
59
|
+
While awaiting data or an action, show a **skeleton** or **spinner** — never bare "Loading..." text.
|
|
60
|
+
|
|
61
|
+
```css
|
|
62
|
+
/* Skeleton shimmer */
|
|
63
|
+
.skeleton {
|
|
64
|
+
background: linear-gradient(90deg, var(--color-surface) 25%, var(--color-border) 50%, var(--color-surface) 75%);
|
|
65
|
+
background-size: 200% 100%;
|
|
66
|
+
animation: shimmer 1.2s ease-in-out infinite;
|
|
67
|
+
border-radius: 6px;
|
|
68
|
+
}
|
|
69
|
+
@keyframes shimmer { to { background-position: -200% 0; } }
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<!-- Button loading: keep label, add spinner, disable -->
|
|
74
|
+
<button class="btn" disabled aria-busy="true">
|
|
75
|
+
<span class="spinner" aria-hidden="true"></span> Saving
|
|
76
|
+
</button>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
For data regions, render skeleton placeholders preserving layout to avoid shift (see motion.md: no layout animation).
|
|
80
|
+
|
|
81
|
+
## Error: Clear Message + Retry
|
|
82
|
+
|
|
83
|
+
Error states must surface a **human-readable message** and, when recoverable, a **retry / fix action**.
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<div class="field error">
|
|
87
|
+
<label for="email">Email</label>
|
|
88
|
+
<input id="email" aria-invalid="true" aria-describedby="email-err" />
|
|
89
|
+
<p id="email-err" class="error-msg">Enter a valid email like name@example.com.</p>
|
|
90
|
+
</div>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.field.error input { border-color: var(--color-error); }
|
|
95
|
+
.error-msg { color: var(--color-error); font-size: var(--text-sm); }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Convey error with more than color (icon + text) for accessibility.
|
|
99
|
+
|
|
100
|
+
## Success
|
|
101
|
+
|
|
102
|
+
Confirm completed actions with a brief, non-blocking indicator. Keep it subtle and auto-dismiss where appropriate.
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
.toast.success { background: var(--color-success); color: oklch(99% 0 0); }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Practical Checklist
|
|
109
|
+
|
|
110
|
+
- [ ] All 8 states defined per interactive component.
|
|
111
|
+
- [ ] Focus uses `:focus-visible` ring, no naked `outline: none`.
|
|
112
|
+
- [ ] Disabled = opacity + `cursor: not-allowed` + inert.
|
|
113
|
+
- [ ] Loading uses skeleton/spinner, not text-only.
|
|
114
|
+
- [ ] Error shows message + retry and isn't color-only.
|
|
115
|
+
- [ ] Success confirmation is present and subtle.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Layout & Space
|
|
2
|
+
|
|
3
|
+
Foundational rules for grids, spacing rhythm, and structural layout. The goal is predictable, maintainable layouts built from flow and flex/grid — never magic numbers or absolute offsets.
|
|
4
|
+
|
|
5
|
+
## 4pt Base Spacing Scale
|
|
6
|
+
|
|
7
|
+
All spacing derives from a **4px base**. Use only these steps. Do not use arbitrary values like `7px`, `13px`, `23px`.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
4px --space-1 tight (icon gaps, inline)
|
|
11
|
+
8px --space-2 small (label→control)
|
|
12
|
+
12px --space-3 control padding, list gaps
|
|
13
|
+
16px --space-4 default gap between elements
|
|
14
|
+
20px --space-5 card internal padding
|
|
15
|
+
24px --space-6 section internal padding
|
|
16
|
+
32px --space-8 gap between related blocks
|
|
17
|
+
40px --space-10 large block separation
|
|
18
|
+
48px --space-12 section separation
|
|
19
|
+
64px --space-16 major section separation
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```css
|
|
23
|
+
:root {
|
|
24
|
+
--space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem;
|
|
25
|
+
--space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem;
|
|
26
|
+
--space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem;
|
|
27
|
+
--space-16: 4rem;
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Grid & Flexbox (NO Absolute Positioning)
|
|
32
|
+
|
|
33
|
+
Lay out with **CSS Grid** and **Flexbox**. Do not use `position: absolute` / `position: fixed` for structural layout (overlays, tooltips, and sticky headers are the only exceptions, and they must be scoped).
|
|
34
|
+
|
|
35
|
+
```css
|
|
36
|
+
/* Page shell */
|
|
37
|
+
.container {
|
|
38
|
+
width: 100%;
|
|
39
|
+
max-width: 1200px;
|
|
40
|
+
margin-inline: auto;
|
|
41
|
+
padding-inline: var(--space-6);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Responsive card grid */
|
|
45
|
+
.grid {
|
|
46
|
+
display: grid;
|
|
47
|
+
grid-template-columns: repeat(auto-fill, minmax(0, 1fr));
|
|
48
|
+
gap: var(--space-6);
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```css
|
|
53
|
+
/* Inline control row */
|
|
54
|
+
.row {
|
|
55
|
+
display: flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
gap: var(--space-3);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Minimum Whitespace Between Sections
|
|
62
|
+
|
|
63
|
+
Maintain **at least 16px** (`--space-4`) of separation between distinct sections; prefer `--space-12`/`--space-16` between major page sections.
|
|
64
|
+
|
|
65
|
+
```css
|
|
66
|
+
section + section { margin-top: var(--space-12); }
|
|
67
|
+
.card { padding: var(--space-5); }
|
|
68
|
+
.stack > * + * { margin-top: var(--space-4); } /* vertical rhythm */
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Max Content Width
|
|
72
|
+
|
|
73
|
+
- **Desktop:** cap content at **1200px**, centered.
|
|
74
|
+
- **Mobile:** content is **100%** width (minus safe padding). Never force desktop widths onto small screens.
|
|
75
|
+
|
|
76
|
+
```css
|
|
77
|
+
.container { max-width: 1200px; width: 100%; }
|
|
78
|
+
@media (max-width: 640px) {
|
|
79
|
+
.container { max-width: 100%; padding-inline: var(--space-4); }
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## No "Margin: Auto Soup"
|
|
84
|
+
|
|
85
|
+
Do not scatter `margin: auto` to push elements around. Centralize alignment through flex/grid `justify-content` / `align-items` / `gap`. `margin-inline: auto` is permitted **only** for the top-level `.container` centering.
|
|
86
|
+
|
|
87
|
+
```css
|
|
88
|
+
/* Bad: fighting the layout with auto margins */
|
|
89
|
+
.sidebar { margin-left: auto; margin-right: 12px; }
|
|
90
|
+
|
|
91
|
+
/* Good: let the grid place it */
|
|
92
|
+
.layout { display: grid; grid-template-columns: 240px 1fr; gap: var(--space-8); }
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Stack Utility Pattern
|
|
96
|
+
|
|
97
|
+
Prefer an explicit vertical stack helper over chained margins.
|
|
98
|
+
|
|
99
|
+
```css
|
|
100
|
+
.stack { display: flex; flex-direction: column; }
|
|
101
|
+
.stack-4 > * + * { margin-top: var(--space-4); }
|
|
102
|
+
.stack-6 > * + * { margin-top: var(--space-6); }
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Practical Checklist
|
|
106
|
+
|
|
107
|
+
- [ ] All spacing uses the 4pt scale tokens.
|
|
108
|
+
- [ ] Layout via grid/flex; no absolute positioning for structure.
|
|
109
|
+
- [ ] ≥16px between sections; major sections use larger gaps.
|
|
110
|
+
- [ ] Desktop max 1200px, mobile 100%.
|
|
111
|
+
- [ ] No scattered `margin: auto` hacks.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# 01 — Bento Grid
|
|
2
|
+
|
|
3
|
+
**Fingerprint:** asymmetric grid, mixed card sizes, icon-led sections, no equal-height rows.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
+-------+-------+
|
|
9
|
+
| | |
|
|
10
|
+
| A | B |
|
|
11
|
+
| | |
|
|
12
|
+
+---+---+-------+
|
|
13
|
+
| C | D |
|
|
14
|
+
+---+---+-------+
|
|
15
|
+
| E |
|
|
16
|
+
+-----------------+
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- Card A: hero metric or primary action (spans 2 cols on desktop)
|
|
22
|
+
- Card B: secondary metric or visual
|
|
23
|
+
- Card C: tertiary content
|
|
24
|
+
- Card D: tertiary content
|
|
25
|
+
- Card E: full-width footer or CTA
|
|
26
|
+
|
|
27
|
+
## Typography
|
|
28
|
+
|
|
29
|
+
- Heading: display style from theme
|
|
30
|
+
- Body: body font from theme
|
|
31
|
+
- Metric numbers: tabular-nums, display weight
|
|
32
|
+
|
|
33
|
+
## Spacing
|
|
34
|
+
|
|
35
|
+
- Grid gap: `--space-6` (24px)
|
|
36
|
+
- Card padding: `--space-5` (20px)
|
|
37
|
+
- Inner padding: `--space-4` (16px)
|
|
38
|
+
|
|
39
|
+
## Anti-Patterns
|
|
40
|
+
|
|
41
|
+
- ❌ 3 equal columns
|
|
42
|
+
- ❌ Card-in-card
|
|
43
|
+
- ❌ All cards same height
|
|
44
|
+
|
|
45
|
+
## Theme Affinity
|
|
46
|
+
|
|
47
|
+
- ✅ Cobalt, Carnival, Lumen
|
|
48
|
+
- ⚠️ Hum (needs more whitespace)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 02 — Long Document
|
|
2
|
+
|
|
3
|
+
**Fingerprint:** single-column long scroll, generous line length control, anchored section nav, docs/blogs.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
+---------------------+
|
|
9
|
+
| Sticky Title Bar |
|
|
10
|
+
+------+--------------+
|
|
11
|
+
| TOC | Content |
|
|
12
|
+
| Nav | (headings, |
|
|
13
|
+
| | paragraphs|
|
|
14
|
+
| | code, img)|
|
|
15
|
+
| | |
|
|
16
|
+
+------+--------------+
|
|
17
|
+
| Footer / Pager |
|
|
18
|
+
+---------------------+
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Rules
|
|
22
|
+
|
|
23
|
+
- Content column: max-width 70ch, centered within reading area
|
|
24
|
+
- TOC: sticky, scrollspy active section highlight
|
|
25
|
+
- Headings: sequential h2/h3 hierarchy, no skipped levels
|
|
26
|
+
- Code blocks: full-width within column, syntax highlighted
|
|
27
|
+
- Support reading progress bar at top
|
|
28
|
+
|
|
29
|
+
## Typography
|
|
30
|
+
|
|
31
|
+
- Heading: display or editorial serif from theme
|
|
32
|
+
- Body: body font, 18px base for reading comfort
|
|
33
|
+
- Code: mono, 14px
|
|
34
|
+
|
|
35
|
+
## Spacing
|
|
36
|
+
|
|
37
|
+
- Content padding: `--space-8` (32px)
|
|
38
|
+
- Paragraph spacing: `--space-4` (16px)
|
|
39
|
+
- Section gap: `--space-10` (40px)
|
|
40
|
+
|
|
41
|
+
## Anti-Patterns
|
|
42
|
+
|
|
43
|
+
- ❌ Multi-column body text
|
|
44
|
+
- ❌ Full-bleed images breaking reading rhythm
|
|
45
|
+
- ❌ Missing table of contents on long pages
|
|
46
|
+
|
|
47
|
+
## Theme Affinity
|
|
48
|
+
|
|
49
|
+
- ✅ Hum, Lumen
|
|
50
|
+
- ⚠️ Carnival (needs restraint on decoration)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 03 — Marquee Hero
|
|
2
|
+
|
|
3
|
+
**Fingerprint:** full-width hero, motion/marquee or autoplay carousel, high-contrast headline, marketing.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
+---------------------------+
|
|
9
|
+
| Nav (transparent) |
|
|
10
|
+
+---------------------------+
|
|
11
|
+
| |
|
|
12
|
+
| BIG HEADLINE |
|
|
13
|
+
| subhead + CTA |
|
|
14
|
+
| |
|
|
15
|
+
| [==== marquee =====] |
|
|
16
|
+
| [ scroll / carousel ] |
|
|
17
|
+
+---------------------------+
|
|
18
|
+
| Trust logos / stats |
|
|
19
|
+
+---------------------------+
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Rules
|
|
23
|
+
|
|
24
|
+
- Hero: full viewport-ish height (min 70vh) on desktop
|
|
25
|
+
- Marquee: infinite horizontal scroll or autoplay carousel, pausable on hover
|
|
26
|
+
- Headline: one dominant message, max 2 lines
|
|
27
|
+
- CTA: primary action, high contrast against hero bg
|
|
28
|
+
- Respect `prefers-reduced-motion` (disable auto-animation)
|
|
29
|
+
|
|
30
|
+
## Typography
|
|
31
|
+
|
|
32
|
+
- Heading: display style, largest scale in system
|
|
33
|
+
- Subhead: body or medium weight, muted
|
|
34
|
+
- Marquee text: mono or uppercase label
|
|
35
|
+
|
|
36
|
+
## Spacing
|
|
37
|
+
|
|
38
|
+
- Hero padding: `--space-10` (40px)
|
|
39
|
+
- Marquee height: 64px
|
|
40
|
+
- CTA margin-top: `--space-6` (24px)
|
|
41
|
+
|
|
42
|
+
## Anti-Patterns
|
|
43
|
+
|
|
44
|
+
- ❌ Multiple competing CTAs
|
|
45
|
+
- ❌ Autoplay that can't be paused
|
|
46
|
+
- ❌ Hero text low contrast over image
|
|
47
|
+
|
|
48
|
+
## Theme Affinity
|
|
49
|
+
|
|
50
|
+
- ✅ Carnival, Cobalt
|
|
51
|
+
- ❌ Hum (too understated for hero theater)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 04 — Stat-Led
|
|
2
|
+
|
|
3
|
+
**Fingerprint:** metrics-first, big numbers above the fold, analytics dashboards, KPI summaries.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
+---------------------------+
|
|
9
|
+
| Title + Date Range |
|
|
10
|
+
+------+------+------+------+
|
|
11
|
+
| KPI | KPI | KPI | KPI |
|
|
12
|
+
| 123 | 45% | 8.2 | 99 |
|
|
13
|
+
+------+------+------+------+
|
|
14
|
+
| Primary Chart / Table |
|
|
15
|
+
| (trend, breakdown) |
|
|
16
|
+
+---------------------------+
|
|
17
|
+
| Secondary charts row |
|
|
18
|
+
+---------------------------+
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Rules
|
|
22
|
+
|
|
23
|
+
- KPI row: 4 cards on desktop, 2 on tablet, 1 on mobile
|
|
24
|
+
- Each KPI: value (display), label (muted), delta (up/down color)
|
|
25
|
+
- Primary chart: spans full width below KPIs
|
|
26
|
+
- Delta: green for positive, red for negative, semantic colors only
|
|
27
|
+
|
|
28
|
+
## Typography
|
|
29
|
+
|
|
30
|
+
- Heading: display weight, tabular-nums for values
|
|
31
|
+
- KPI value: largest scale, tabular-nums
|
|
32
|
+
- Labels: 13px muted uppercase
|
|
33
|
+
|
|
34
|
+
## Spacing
|
|
35
|
+
|
|
36
|
+
- KPI gap: `--space-4` (16px)
|
|
37
|
+
- Card padding: `--space-5` (20px)
|
|
38
|
+
- Section gap: `--space-6` (24px)
|
|
39
|
+
|
|
40
|
+
## Anti-Patterns
|
|
41
|
+
|
|
42
|
+
- ❌ Decorative number animation without context
|
|
43
|
+
- ❌ Mixing units without labels
|
|
44
|
+
- ❌ Charts without axis or legend
|
|
45
|
+
|
|
46
|
+
## Theme Affinity
|
|
47
|
+
|
|
48
|
+
- ✅ Cobalt, Lumen
|
|
49
|
+
- ⚠️ Hum (needs stronger number contrast)
|