agemon 0.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +983 -30
- package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
- package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
- package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
- package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
- package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
- package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
- package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
- package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
- package/assets/skills/design/agemon-design/LICENSE +21 -0
- package/assets/skills/design/agemon-design/NOTICE.md +43 -0
- package/assets/skills/design/agemon-design/SKILL.md +128 -0
- package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
- package/assets/skills/design/agemon-design/references/actions.md +215 -0
- package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
- package/assets/skills/design/agemon-design/references/brief.md +190 -0
- package/assets/skills/design/agemon-design/references/color.md +216 -0
- package/assets/skills/design/agemon-design/references/components.md +91 -0
- package/assets/skills/design/agemon-design/references/copy.md +300 -0
- package/assets/skills/design/agemon-design/references/core-rules.md +166 -0
- package/assets/skills/design/agemon-design/references/craft-intent.md +162 -0
- package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
- package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
- package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
- package/assets/skills/design/agemon-design/references/forms.md +192 -0
- package/assets/skills/design/agemon-design/references/heuristics.md +319 -0
- package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
- package/assets/skills/design/agemon-design/references/layout.md +236 -0
- package/assets/skills/design/agemon-design/references/loops.md +155 -0
- package/assets/skills/design/agemon-design/references/metadata.md +98 -0
- package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
- package/assets/skills/design/agemon-design/references/motion.md +434 -0
- package/assets/skills/design/agemon-design/references/personas.md +206 -0
- package/assets/skills/design/agemon-design/references/preset-dashboard.md +109 -0
- package/assets/skills/design/agemon-design/references/preset-editorial.md +94 -0
- package/assets/skills/design/agemon-design/references/preset-minimal.md +93 -0
- package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
- package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
- package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
- package/assets/skills/design/agemon-design/references/recipe-landing.md +120 -0
- package/assets/skills/design/agemon-design/references/responsive.md +168 -0
- package/assets/skills/design/agemon-design/references/review.md +340 -0
- package/assets/skills/design/agemon-design/references/routing.md +143 -0
- package/assets/skills/design/agemon-design/references/sound.md +150 -0
- package/assets/skills/design/agemon-design/references/spec.md +123 -0
- package/assets/skills/design/agemon-design/references/stack.md +522 -0
- package/assets/skills/design/agemon-design/references/stage-assets.md +106 -0
- package/assets/skills/design/agemon-design/references/stage-build.md +46 -0
- package/assets/skills/design/agemon-design/references/stage-critique.md +34 -0
- package/assets/skills/design/agemon-design/references/stage-directions.md +44 -0
- package/assets/skills/design/agemon-design/references/stage-intake.md +34 -0
- package/assets/skills/design/agemon-design/references/stage-verify.md +44 -0
- package/assets/skills/design/agemon-design/references/state-design.md +188 -0
- package/assets/skills/design/agemon-design/references/tells-2026-11.md +32 -0
- package/assets/skills/design/agemon-design/references/themes.md +233 -0
- package/assets/skills/design/agemon-design/references/third-party-licenses.md +323 -0
- package/assets/skills/design/agemon-design/references/tokens.md +350 -0
- package/assets/skills/design/agemon-design/references/typography.md +248 -0
- package/assets/skills/design/agemon-design/scripts/audit-page.js +532 -0
- package/assets/skills/design/agemon-design/scripts/check-source.mjs +358 -0
- package/assets/skills/design/agemon-design/scripts/deal.mjs +231 -0
- package/assets/skills/design/agemon-design/scripts/inventory.mjs +676 -0
- package/assets/skills/essentials/web-design-guidelines/LICENSE +21 -0
- package/assets/skills/essentials/web-design-guidelines/NOTICE.md +14 -0
- package/assets/skills/essentials/web-design-guidelines/SKILL.md +18 -0
- package/assets/skills/essentials/web-design-guidelines/references/guidelines.md +184 -0
- package/assets/skills/essentials/writing-guidelines/LICENSE +21 -0
- package/assets/skills/essentials/writing-guidelines/NOTICE.md +14 -0
- package/assets/skills/essentials/writing-guidelines/SKILL.md +18 -0
- package/assets/skills/essentials/writing-guidelines/references/guidelines.md +250 -0
- package/assets/skills/founder/agemon-founder-board/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-board/NOTICE.md +11 -0
- package/assets/skills/founder/agemon-founder-board/SKILL.md +111 -0
- package/assets/skills/founder/agemon-founder-board/lenses.md +84 -0
- package/assets/skills/founder/agemon-founder-brand/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-brand/NOTICE.md +12 -0
- package/assets/skills/founder/agemon-founder-brand/SKILL.md +77 -0
- package/assets/skills/founder/agemon-founder-cfo/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-cfo/NOTICE.md +12 -0
- package/assets/skills/founder/agemon-founder-cfo/SKILL.md +109 -0
- package/assets/skills/founder/agemon-founder-cfo/example.json +27 -0
- package/assets/skills/founder/agemon-founder-cfo/unit_economics.py +270 -0
- package/assets/skills/founder/agemon-founder-competitors/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-competitors/NOTICE.md +12 -0
- package/assets/skills/founder/agemon-founder-competitors/SKILL.md +84 -0
- package/assets/skills/founder/agemon-founder-consumer/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-consumer/NOTICE.md +11 -0
- package/assets/skills/founder/agemon-founder-consumer/SKILL.md +126 -0
- package/assets/skills/founder/agemon-founder-consumer/customer.example.json +34 -0
- package/assets/skills/founder/agemon-founder-consumer/panel.py +424 -0
- package/assets/skills/founder/agemon-founder-consumer/pitch.example.md +3 -0
- package/assets/skills/founder/agemon-founder-launch/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-launch/NOTICE.md +11 -0
- package/assets/skills/founder/agemon-founder-launch/SKILL.md +65 -0
- package/assets/skills/founder/agemon-founder-marketing/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-marketing/NOTICE.md +11 -0
- package/assets/skills/founder/agemon-founder-marketing/SKILL.md +80 -0
- package/assets/skills/founder/agemon-founder-offer/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-offer/NOTICE.md +11 -0
- package/assets/skills/founder/agemon-founder-offer/SKILL.md +75 -0
- package/assets/skills/founder/agemon-founder-ops/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-ops/NOTICE.md +12 -0
- package/assets/skills/founder/agemon-founder-ops/SKILL.md +77 -0
- package/assets/skills/founder/agemon-founder-plan/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-plan/NOTICE.md +11 -0
- package/assets/skills/founder/agemon-founder-plan/SKILL.md +88 -0
- package/assets/skills/founder/agemon-founder-plan/compile.py +178 -0
- package/assets/skills/founder/agemon-founder-pricing/LICENSE +21 -0
- package/assets/skills/founder/agemon-founder-pricing/NOTICE.md +12 -0
- package/assets/skills/founder/agemon-founder-pricing/SKILL.md +92 -0
- package/assets/skills/founder/agemon-founder-pricing/van_westendorp.py +172 -0
- package/assets/skills/geo-seo/geo/LICENSE +21 -0
- package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
- package/assets/skills/geo-seo/geo/SKILL.md +145 -0
- package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
- package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
- package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
- package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
- package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
- package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
- package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
- package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
- package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
- package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
- package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
- package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
- package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
- package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
- package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
- package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
- package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
- package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
- package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
- package/assets/skills/output-style/agemon-adhd/LICENSE +21 -0
- package/assets/skills/output-style/agemon-adhd/NOTICE.md +13 -0
- package/assets/skills/output-style/agemon-adhd/SKILL.md +138 -0
- package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
- package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
- package/assets/skills/security/agemon-security/LICENSE +21 -0
- package/assets/skills/security/agemon-security/NOTICE.md +8 -0
- package/assets/skills/security/agemon-security/SKILL.md +356 -0
- package/assets/skills/security/agemon-security-audit/AI-AND-LLM.md +83 -0
- package/assets/skills/security/agemon-security-audit/ATTACK-CLASSES.md +130 -0
- package/assets/skills/security/agemon-security-audit/CLIENT-SIDE.md +83 -0
- package/assets/skills/security/agemon-security-audit/CLOUD-AND-DEPLOYMENT.md +86 -0
- package/assets/skills/security/agemon-security-audit/DATA-ISOLATION-AND-LIFECYCLE.md +84 -0
- package/assets/skills/security/agemon-security-audit/DESKTOP-MOBILE-AND-LOCAL-IPC.md +89 -0
- package/assets/skills/security/agemon-security-audit/HUNTING.md +251 -0
- package/assets/skills/security/agemon-security-audit/LICENSE +21 -0
- package/assets/skills/security/agemon-security-audit/MEMORY-SAFETY-AND-BINARY.md +101 -0
- package/assets/skills/security/agemon-security-audit/NOTICE.md +12 -0
- package/assets/skills/security/agemon-security-audit/PROTOCOLS-RPC-AND-MESSAGING.md +81 -0
- package/assets/skills/security/agemon-security-audit/RECONNAISSANCE.md +156 -0
- package/assets/skills/security/agemon-security-audit/RESOURCE-EXHAUSTION-AND-AVAILABILITY.md +78 -0
- package/assets/skills/security/agemon-security-audit/SKILL.md +192 -0
- package/assets/skills/security/agemon-security-audit/SUPPLY-CHAIN-AND-RELEASE.md +73 -0
- package/assets/skills/security/agemon-security-audit/VALIDATION-AND-REPORTING.md +186 -0
- package/assets/skills/security/agemon-security-audit/WEB-PROTOCOL-AND-AUTH.md +105 -0
- package/assets/skills/security/agemon-security-audit/report-schema.json +461 -0
- package/assets/skills/security/agemon-security-audit/validate-coverage-ledger.cjs +872 -0
- package/assets/skills/security/agemon-security-audit/validate-findings.cjs +773 -0
- package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
- package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
- package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
- package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
- package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
- package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
- package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
- package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
- package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
- package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
- package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
- package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
- package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
- package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
- package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
- package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
- package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
- package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
- package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
- package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
- package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
- package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
- package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
- package/assets/skills/workflow/agemon-brainstorming/LICENSE +21 -0
- package/assets/skills/workflow/agemon-brainstorming/NOTICE.md +14 -0
- package/assets/skills/workflow/agemon-brainstorming/SKILL.md +287 -0
- package/assets/skills/workflow/agemon-brainstorming/builder-check-prompt.md +23 -0
- package/assets/skills/workflow/agemon-dispatching-parallel-agents/LICENSE +21 -0
- package/assets/skills/workflow/agemon-dispatching-parallel-agents/NOTICE.md +13 -0
- package/assets/skills/workflow/agemon-dispatching-parallel-agents/SKILL.md +167 -0
- package/assets/skills/workflow/agemon-executing-plans/LICENSE +21 -0
- package/assets/skills/workflow/agemon-executing-plans/NOTICE.md +15 -0
- package/assets/skills/workflow/agemon-executing-plans/SKILL.md +322 -0
- package/assets/skills/workflow/agemon-executing-plans/scripts/task-done +55 -0
- package/assets/skills/workflow/agemon-executing-plans/scripts/task-start +32 -0
- package/assets/skills/workflow/agemon-finishing-a-development-branch/LICENSE +21 -0
- package/assets/skills/workflow/agemon-finishing-a-development-branch/NOTICE.md +13 -0
- package/assets/skills/workflow/agemon-finishing-a-development-branch/SKILL.md +225 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/LICENSE +21 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/NOTICE.md +15 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/SKILL.md +339 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/code-reviewer.md +198 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/implementer-prompt.md +154 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/re-review-prompt.md +116 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/batching.md +11 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/cannot-verify.md +10 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/final-review.md +49 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/fix-loop.md +77 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/handling-reports.md +15 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/preflight.md +26 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/resuming.md +12 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/role-scout.md +18 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/references/role-worker.md +19 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/scripts/review-package +64 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/scripts/sdd-repo +54 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/scripts/sdd-workspace +110 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/scripts/task-brief +108 -0
- package/assets/skills/workflow/agemon-subagent-driven-development/task-reviewer-prompt.md +209 -0
- package/assets/skills/workflow/agemon-test-driven-development/LICENSE +21 -0
- package/assets/skills/workflow/agemon-test-driven-development/NOTICE.md +14 -0
- package/assets/skills/workflow/agemon-test-driven-development/SKILL.md +330 -0
- package/assets/skills/workflow/agemon-test-driven-development/writing-good-tests.md +198 -0
- package/assets/skills/workflow/agemon-using-git-worktrees/LICENSE +21 -0
- package/assets/skills/workflow/agemon-using-git-worktrees/NOTICE.md +13 -0
- package/assets/skills/workflow/agemon-using-git-worktrees/SKILL.md +167 -0
- package/assets/skills/workflow/agemon-writing-plans/LICENSE +21 -0
- package/assets/skills/workflow/agemon-writing-plans/NOTICE.md +13 -0
- package/assets/skills/workflow/agemon-writing-plans/SKILL.md +204 -0
- package/assets/tools/code-review-graph-constraints.txt +1418 -0
- package/assets/tools/package-lock.json +111 -0
- package/assets/tools/package.json +6 -0
- package/dist/chunk-ZZBF3GOV.js +3451 -0
- package/dist/chunk-ZZBF3GOV.js.map +1 -0
- package/dist/fake-subprocess-IV4ML77S.js +636 -0
- package/dist/fake-subprocess-IV4ML77S.js.map +1 -0
- package/dist/index.js +23836 -1945
- package/dist/index.js.map +1 -1
- package/package.json +37 -17
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Component Contracts
|
|
2
|
+
|
|
3
|
+
Anatomy-level rules for the workhorse components: buttons, menus, modals, search, cards, nav. Surface-level composition lives in the recipes; form fields live in [forms.md](forms.md); metric cards and tables in [dashboard.md](dashboard.md). This file is the layer below: what makes an individual component read as designed.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Buttons
|
|
8
|
+
|
|
9
|
+
**Anatomy:**
|
|
10
|
+
|
|
11
|
+
- Horizontal padding ≈ 2× vertical padding. Floors: 16px horizontal, 10px vertical. Equal padding on all sides makes a button read as a tile, not an action.
|
|
12
|
+
- Heights: 44-48px on touch, 32-40px acceptable on desktop-only surfaces. **Why:** pointer precision — a mouse hits a 32px target reliably; a thumb doesn't. **When it breaks:** any desktop surface that also ships to touch (most do) — then 44px is the floor everywhere. Hit-area expansion for smaller visuals: [accessibility.md](accessibility.md).
|
|
13
|
+
- Label 14-17px. Check the height/font pair for clean vertical centering: a 32px button with 17px text can't center on whole pixels — pick value pairs whose difference is even, or the label sits visibly off-center.
|
|
14
|
+
- Inline groups order left→right by importance, and every state (default, hover, pressed, loading, disabled) is distinguishable without being a costume change — one property shift per state transition is usually enough.
|
|
15
|
+
|
|
16
|
+
**Icon placement carries meaning:**
|
|
17
|
+
|
|
18
|
+
- Icon **left** of label = aids scanning, communicates the action type at a glance (add, edit, download).
|
|
19
|
+
- Icon **right** of label = consequence or destination ("Log out →", "Continue →", external-link marker).
|
|
20
|
+
- Don't decorate with an icon that repeats the label without adding either.
|
|
21
|
+
|
|
22
|
+
**Depth:** flat or one subtle shadow pair ([layout.md](layout.md)). Gradient fills and inner shadows on buttons are expressive opt-ins for branded marketing surfaces — inside the product they read as 2015. Anti-slop rules apply.
|
|
23
|
+
|
|
24
|
+
**Tiers and their contracts:**
|
|
25
|
+
|
|
26
|
+
- One primary per context — two solid CTAs in one view is a tie, and ties stall. Secondary = outline at ≥3:1 contrast (a light-gray outline button is indistinguishable from disabled). Tertiary = text + underline — the underline is an accessibility requirement for color-blind recognition, not decoration.
|
|
27
|
+
- **Avoid disabled buttons.** They can't explain themselves, give nothing on press, and assistive tech often skips them. Alternatives, in order: keep enabled and validate on press with errors; remove the action and say why; lock icon + explanation on press. If one survives anyway, pair it with visible inline text saying what unlocks it.
|
|
28
|
+
- Icon weight matches text weight, icon size matches text size; if an icon overpowers its label, fix it with a lighter stroke, not a washed-out color.
|
|
29
|
+
|
|
30
|
+
**Destructive actions — friction proportional to blast radius:**
|
|
31
|
+
|
|
32
|
+
- Low (recoverable, undo exists): act immediately + undo toast. Friction here is rude.
|
|
33
|
+
- Medium (recoverable with effort): confirmation dialog with verb buttons + the affected items named and highlighted.
|
|
34
|
+
- High (irreversible, shared, or bulk): confirmation + explicit acknowledgment — type the resource name or tick a checkbox before the destructive button activates. A misclick must not be able to complete the flow.
|
|
35
|
+
- Destructive buttons get LOW visual prominence (tertiary/outline) in the normal UI — prominence belongs to the actions you want repeated. Inside the confirm dialog the destructive verb is the filled one, in the danger color.
|
|
36
|
+
|
|
37
|
+
## Text Links
|
|
38
|
+
|
|
39
|
+
- **The link affordance is exclusive.** Underline + link color mean "this navigates" — nothing else gets that costume. A colored, underlined heading that isn't a link is a broken promise; an icon styled like a button that does nothing is the same lie. Decoration must never impersonate function.
|
|
40
|
+
- Inline links inside body text need the underline (color alone fails color-blind users); standalone links in chrome (nav, footers) may drop it when context already signals interactivity.
|
|
41
|
+
|
|
42
|
+
## Icon Labels
|
|
43
|
+
|
|
44
|
+
- **Prefer a visible text label next to icons.** Only universally-learned glyphs survive alone (search, close, play); everything else is a guess that costs a tap to verify. Icon-only buttons require `aria-label` + tooltip as the floor ([accessibility.md](accessibility.md)) — but visible labels beat both.
|
|
45
|
+
|
|
46
|
+
## Menus & Dropdowns
|
|
47
|
+
|
|
48
|
+
- **≤5 options: don't use a dropdown.** Radios or a visible segmented control — one less click, options scannable without interaction. The dropdown earns its collapse only past ~5 (6-10 still favors radios when vertical space allows; >10 wants type-ahead — full selection ladder in [forms.md](forms.md) Field Layout).
|
|
49
|
+
- **Long lists get a scroll container with an affordance:** visible scrollbar plus the last visible item partially cut by the container edge or faded. A list that ends exactly at the container edge looks complete — users never scroll. Cutting an item mid-row is the strongest "there's more" signal available.
|
|
50
|
+
- **Very long lists (countries, currencies, assignees) escalate to a searchable sheet/popover** — type-ahead beats scrolling past ~20 items, especially on mobile.
|
|
51
|
+
- Multi-select: each selected option visibly marked in the list + a one-step "clear all". Nested options: signal children before expansion (chevron, count).
|
|
52
|
+
- Power-user menus show keyboard shortcuts inline, right-aligned, in muted mono — see the Command composition in [recipe-dashboard.md](recipe-dashboard.md).
|
|
53
|
+
- On low-contrast minimal surfaces, an open menu needs a hairline stroke and/or shadow pair to separate from the page — whitespace alone can't establish the overlay plane.
|
|
54
|
+
|
|
55
|
+
## Modals
|
|
56
|
+
|
|
57
|
+
- **A modal is for decisions that interrupt for good reason** — destructive confirmations, flows that must not lose context. Minor errors and notices stay inline. If putting a task in a modal adds steps versus doing it in-flow, it doesn't belong in a modal.
|
|
58
|
+
- **Three ways out, always:** visible close button, an explicit cancel action, and overlay click (escape key too — [accessibility.md](accessibility.md) focus-trap rules).
|
|
59
|
+
- **Confirmation buttons are verbs, never Yes/No.** "Delete project" / "Cancel" — the button restates the consequence. Yes/No forces re-reading the question, and a negatively-phrased question ("Don't you want to keep…?") plus Yes/No produces wrong clicks under time pressure.
|
|
60
|
+
- Multi-step flows inside a modal show progress (step count). If the flow grows past ~3 steps, question the modal — promote to a page.
|
|
61
|
+
|
|
62
|
+
## Search
|
|
63
|
+
|
|
64
|
+
- Input ≥44px tall with a defined boundary (border or fill) — a search field users can't find is a navigation failure.
|
|
65
|
+
- Placeholder shows example queries or the dominant content type ("Search projects, people, docs…"), not the word "Search" the icon already says.
|
|
66
|
+
- Type-ahead suggestions as the user types; recent searches with individual remove + clear-all when the product is revisit-heavy.
|
|
67
|
+
- **The no-results state is a fork, not a wall:** show spelling-adjacent alternatives, popular queries, or a scoped-search escape ("search all workspaces instead"). A bare "no results found" ends the session — design it like any other empty state ([state-design.md](state-design.md)).
|
|
68
|
+
|
|
69
|
+
## Cards (content cards)
|
|
70
|
+
|
|
71
|
+
Metric cards have their own contract in [dashboard.md](dashboard.md). For content/preview cards in grids:
|
|
72
|
+
|
|
73
|
+
- **Variable-length content must not break grid rhythm.** Either clamp text (line-clamp + optional tooltip for the full string) or set a shared min-height per row. Mixed card heights in one grid read as unfinished.
|
|
74
|
+
- Identical image aspect ratio across every card in the grid — one off-ratio image breaks the set.
|
|
75
|
+
- Card CTA at the bottom (the reading endpoint), with hover + active states on desktop and a full-card tap target on touch.
|
|
76
|
+
- Internal padding 16-24px; grid gap 16-40px scaled by [VISUAL_DENSITY]. Multi-column grids want short content; single-column (mobile) tolerates longer — the card is the whole viewport there.
|
|
77
|
+
|
|
78
|
+
## Navigation (top bar)
|
|
79
|
+
|
|
80
|
+
- Logo top-left links home. Universal recovery convention — breaking it strands lost users.
|
|
81
|
+
- Active page visibly marked; hover states on every link.
|
|
82
|
+
- One CTA in the nav, visually distinct from both the plain links and the page's own primary CTA — three levels that must not tie.
|
|
83
|
+
- **Sticky nav needs a plane separator once content scrolls under it:** 1px hairline at low contrast, or backdrop blur (20-32px) over a 50-80% opacity fill. Without it the nav and content occupy the same visual plane and collide.
|
|
84
|
+
- **Transparent/blurred navs must be contrast-checked against every background they'll scroll over** — the hero may pass and the white section below fail. Provide a scrolled variant (solid fill) that activates past the hero.
|
|
85
|
+
- Overflow: collapse low-priority links into a "More" menu or push them to the footer; never shrink the type to fit.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Cross-Refs
|
|
90
|
+
|
|
91
|
+
[forms.md](forms.md) inputs and validation · [accessibility.md](accessibility.md) hit areas, focus, keyboard · [dashboard.md](dashboard.md) metric cards, tables, toolbars · [state-design.md](state-design.md) empty/error states · [motion.md](motion.md) state-transition timing
|
|
@@ -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,166 @@
|
|
|
1
|
+
# Core rules
|
|
2
|
+
|
|
3
|
+
The detail behind the hard rules in [SKILL.md](../SKILL.md). Load this when building or reviewing a whole surface. Brand and brief always win over anything here; the accessibility floor wins over both.
|
|
4
|
+
|
|
5
|
+
## Knobs (ask during Discovery, 1-10)
|
|
6
|
+
|
|
7
|
+
Knobs are **fallback defaults applied only when the user declines to specify**. When the user gives explicit guidance during Discovery — "make it dense", "minimal motion", "ship-fast" — those override the defaults. Knobs are not a starting position; they are a graceful fallback.
|
|
8
|
+
|
|
9
|
+
- **CRAFT_LEVEL** (default 7) — refinement depth. 3 ships fast, 9 is pixel-perfect.
|
|
10
|
+
- **MOTION_INTENSITY** (default 5) — 1 = hover only, 10 = scroll-triggered, magnetic, page transitions.
|
|
11
|
+
- **VISUAL_DENSITY** (default 5) — 1 = whitespace-heavy editorial, 10 = dashboard-dense.
|
|
12
|
+
- **DESIGN_VARIANCE** (default by surface — see [craft-intent.md](craft-intent.md)) — 1 = symmetric/safe layout, 10 = experimental composition. Dashboards default 4; landings 7; portfolios 8. Gates layout risk separately from density.
|
|
13
|
+
|
|
14
|
+
Behavior: **CRAFT_LEVEL 8+** → run Polish Pass ([review.md](review.md)). **≤4** → skip it. **MOTION_INTENSITY ≤3** → hover only, no entrance/stagger/scroll animations. **4-7** → standard entrances + hover, one scroll reveal max per section. **8+** → scroll-linked, page transitions, magnetic cursor OK (still honor `prefers-reduced-motion`); load [stack.md](stack.md) if user opts in. **VISUAL_DENSITY ≤3** → wide spacing, 1-2 items/row. **8+** → dashboard-dense ([dashboard.md](dashboard.md)). **DESIGN_VARIANCE ≤4** → symmetric grids, safe product layouts. **5-7** → split heroes, alternating rows, one layout break. **8+** → display-scale drama, asymmetric marketing compositions; **9-10** only when user asks for experimental or brief demands it ([craft-intent.md](craft-intent.md)).
|
|
15
|
+
|
|
16
|
+
## Quick Start: Top 12
|
|
17
|
+
|
|
18
|
+
The rules that make the biggest difference between "AI-generated" and "designed by a human":
|
|
19
|
+
|
|
20
|
+
0. **Read before assuming** — never default accent, font, or style. Analyze the project, then ask as [stage-intake.md](stage-intake.md) says. In a non-interactive run, proceed and log assumptions. Use Knob defaults only when the user declines to specify or nobody can answer.
|
|
21
|
+
1. **Sentence case by default** — uppercase = template. Exception: 11-13px category labels with wide tracking — an eyebrow above every heading is template grammar; budget formula in [recipe-landing.md](recipe-landing.md) (Eyebrow budget).
|
|
22
|
+
2. **Commit to a palette strategy that fits the subject** — mostly-neutral with one accent is one option, not the default; the brief and brand decide ([color.md](color.md) Commitment Axis). NEVER *default* to blue — if your brand is blue, that's different.
|
|
23
|
+
3. **Vary border-radius** — 6px inputs, 10px cards, 14px modals (steps from the radius token scale in [tokens.md](tokens.md)); uniform radii look stamped out.
|
|
24
|
+
4. **Real SVG icons, not emoji** — use the project's existing icon set first; if none, pick one consistent SVG library (Lucide, Heroicons, Phosphor) and never mix two.
|
|
25
|
+
5. **Tight letter-spacing on large headings** — `tracking-tight` or `-0.02em`+ above 24px.
|
|
26
|
+
6. **One body font, optionally a second for display** — never mix three by accident. Use the project's fonts. With none, choose from the brief's subject and say why; a font you reach for on every project is a default, not a choice.
|
|
27
|
+
7. **Layered shadows over flat borders** — ambient + direct light.
|
|
28
|
+
8. **Exit faster than enter** — ~75% of entrance duration.
|
|
29
|
+
9. **Plain secondary text for comparisons** — "+12.5% from last month", not a colored pill.
|
|
30
|
+
10. **Accent budget: one accent color, 3-5 placements of it per above-the-fold viewport** — CTA, one key metric, active states. **Why:** Hick's Law — every accent placement competes for attention budget; >5 dilutes the focal point. Modals and overlays count as their own viewport.
|
|
31
|
+
11. **Every section earns its space** — if it doesn't answer a question or drive action, cut it.
|
|
32
|
+
12. **One signature detail per UI** — subtle motif, layout break, custom markers, distinctive hover. When building a whole surface (`/agemon-design build`), pick and **build** it in the first pass ([craft-intent.md](craft-intent.md)) — not only at polish.
|
|
33
|
+
|
|
34
|
+
> **Before writing ANY code:** For non-trivial projects, check for a design brief and token set first (`/agemon-design brief`, `/agemon-design tokens`) — durable artifacts beat per-session re-derivation. Then run [stage-intake.md](stage-intake.md) and [stage-assets.md](stage-assets.md). Use existing tokens if any token system is present. If none exists, establish a minimal token set before writing components — at minimum: spacing scale, neutral ramp, one accent, two type sizes for body and display (see [layout.md](layout.md) and [color.md](color.md)). If preferences are missing, follow [stage-intake.md](stage-intake.md).
|
|
35
|
+
|
|
36
|
+
## Core Rules
|
|
37
|
+
|
|
38
|
+
### The Anti-Slop Test
|
|
39
|
+
|
|
40
|
+
Before shipping any UI, ask: "If someone said AI made this, would they believe it immediately?" If yes, start over.
|
|
41
|
+
|
|
42
|
+
**Critical (immediately reads as AI):**
|
|
43
|
+
- Identical card grids (icon + heading + text, 3-6x repeated)
|
|
44
|
+
- ALL CAPS on headings, labels, tables, nav, buttons (exception: 11-13px category labels)
|
|
45
|
+
- Purple/cyan gradient everything
|
|
46
|
+
- Emoji as feature icons
|
|
47
|
+
- Bounce/elastic easing curves
|
|
48
|
+
- Glassmorphism on dark + neon accents
|
|
49
|
+
|
|
50
|
+
**Major (designers notice):**
|
|
51
|
+
- Colored pills on trend percentages — use plain secondary text
|
|
52
|
+
- Thick colored left/top borders on cards — use elevation or bg tint
|
|
53
|
+
- Uniform border-radius on everything — vary by element
|
|
54
|
+
- Gradient text on hero metrics
|
|
55
|
+
- Vertical bar charts for time-series — use area/line (horizontal bars OK for categorical)
|
|
56
|
+
- `transition: all` — list specific properties
|
|
57
|
+
- Decorative glow as primary affordance
|
|
58
|
+
- Soft blurry gradient blobs/orbs
|
|
59
|
+
- Generic CTAs ("Learn more", "Click here") — be specific
|
|
60
|
+
- Walls of text — no landing section > 2-3 sentences
|
|
61
|
+
- "OR" divider in caps between auth options — lowercase it: "or with email"
|
|
62
|
+
- Full-bleed saturated brand panel beside a sign-in form — tinted neutral surface with one proof asset ([recipe-auth.md](recipe-auth.md))
|
|
63
|
+
- Uppercase tracked eyebrow above every section heading — ration to max 1 per 3 sections; one deliberate kicker is voice, one per section is template grammar
|
|
64
|
+
- Numbered section eyebrows ("01 · About", "02 / Process") — numbers earn their place only when content is a real ordered sequence
|
|
65
|
+
- Scroll cues ("Scroll to explore", ↓ arrows) — the fold composition should imply continuation, not label it
|
|
66
|
+
- Two CTA labels with the same intent on one page ("Get in touch" + "Let's talk") — one label per intent, reused everywhere
|
|
67
|
+
- Fake product screenshots built from styled `<div>` rectangles — use a real screenshot, a real mini component, or editorial imagery; never a div mockup
|
|
68
|
+
- Logo walls as plain text wordmarks — use real SVG marks; for invented brands, a simple monogram mark, never a styled `<span>`
|
|
69
|
+
- Carousels without narrative purpose — a carousel earns its place only when order tells a story (steps, timeline); as a "fit more stuff" device it hides content and reads as template
|
|
70
|
+
- App UI built from stacked cards instead of a real layout — cards are for peer items in a collection; wrapping every section in a rounded card is avoidance of layout decisions
|
|
71
|
+
- Em-dash flood in UI strings — 3+ em dashes in visible copy is prose grammar leaking into interface grammar; restructure with periods, colons, or separate elements
|
|
72
|
+
|
|
73
|
+
**Minor** (polish that separates good from great — full list in [review.md](review.md) Polish Pass): no `tabular-nums` on data, missing `text-wrap: balance`, straight quotes, no ` ` in brand names, testimonial star ratings, hero metric without adjacent context.
|
|
74
|
+
|
|
75
|
+
### The Craft Test (What TO Do)
|
|
76
|
+
|
|
77
|
+
Anti-slop says what to avoid. Craft says what to aim for.
|
|
78
|
+
|
|
79
|
+
**General craft:**
|
|
80
|
+
- One accent, 3-5 placements per above-the-fold viewport. Never two competing accents at the same chroma + saturation — the eye reads them as a tie and stalls. Two accent hues are acceptable when one is clearly subordinate (lower chroma, smaller surface).
|
|
81
|
+
- White backgrounds with barely-there borders or whitespace. Numbers large, undecorated, `tabular-nums`.
|
|
82
|
+
- Comparisons plain secondary text. One chart color at different opacities. Area fill fades ~15% → 0%.
|
|
83
|
+
- Functional color only — dots for status, flags for countries. Real content, not placeholders.
|
|
84
|
+
|
|
85
|
+
**Landing pages** (detail in [inspiration.md](inspiration.md)):
|
|
86
|
+
- Hero — center is fine if asymmetric supporting elements break the symmetry (offset badges, staggered social proof, side-weighted graphics). Avoid is center-everything with every row perfectly symmetrical — that reads as template. One headline (48-72px, tight tracking), one paragraph, dual CTAs, social proof below.
|
|
87
|
+
- Features: 2-3 asymmetric rows with real visuals (chart, timeline, funnel). NEVER uniform 3-column icon grids.
|
|
88
|
+
- Sections breathe: 80-160px between majors, varied for rhythm (dense products sit low, editorial high — production range in [inspiration.md](inspiration.md)). Every section answers one question.
|
|
89
|
+
- Prefer specific metrics over vague praise ("Build times 7m → 40s" beats "trusted by thousands").
|
|
90
|
+
|
|
91
|
+
**Dashboards** (detail in [dashboard.md](dashboard.md)):
|
|
92
|
+
- Sidebar: subtle bg tint, NOT full dark (common AI pattern).
|
|
93
|
+
- Metric cards: primary gets accent tint; others neutral. Sparklines only where a trend is the question the card answers. NEVER identical colored top borders.
|
|
94
|
+
- At least 3 content types per dashboard viewport (e.g., chart + table + metric). **Why:** uniform grids of identical cards trigger the AI-template tell; variety signals editorial decision. Chart type matches data story (area/horizontal bar/sparkline). Never pie or 3D.
|
|
95
|
+
|
|
96
|
+
### When Rules Break
|
|
97
|
+
|
|
98
|
+
Every rule above has a context where it inverts. Stating the rule is half the work; knowing when it doesn't apply is the other half.
|
|
99
|
+
|
|
100
|
+
- **"Never ALL CAPS on headings"** — small category labels (10-13px) with positive tracking are an exception in editorial layouts. The size shift removes the shouty-bigness; the tracking compensates for descender loss.
|
|
101
|
+
- **"One accent only"** — multi-tenant dashboards (where each tenant has its own brand) and editorial sites with explicit color systems are exceptions. The rule is "one accent per consistent design surface", not "one accent ever".
|
|
102
|
+
- **"Avoid pie charts"** — for two-segment proportional comparisons (e.g., used vs. free storage on a single device), a donut with center label is acceptable. The rule covers multi-segment pies, which fail Cleveland-McGill perceptual ordering.
|
|
103
|
+
- **"No emoji as feature icons"** — affordance contexts where emoji are user content (reactions, message-thread emoji rosters) are not slop, they are content. The rule covers decorative emoji standing in for designed icons.
|
|
104
|
+
- **"Never gradient text on metrics"** — branded marketing pages can use gradient on a single hero metric where the gradient is the brand expression, not decoration. Inside-the-product metrics still follow the rule.
|
|
105
|
+
- **"Never mix three typefaces"** — deliberate three-family type systems (display serif + body sans + mono for data/code) are standard in editorial and data-heavy products. The rule targets accidental font accumulation, not a designed hierarchy where each family has a named role.
|
|
106
|
+
|
|
107
|
+
**The general principle:** every rule encodes a default that prevents the most common failure mode. When the context inverts the failure mode, the rule may invert too. The work is recognizing the inversion, not memorizing exceptions.
|
|
108
|
+
|
|
109
|
+
### Convergence
|
|
110
|
+
|
|
111
|
+
Actions can iterate until their stated checks pass rather than producing a single-shot output. Never fake a render; report honestly what was and was not checked. See [loops.md](loops.md).
|
|
112
|
+
|
|
113
|
+
### Self-Correction
|
|
114
|
+
|
|
115
|
+
When the user corrects design output — "not like that", "I don't like this", "always do X here", "never Z", or a reversal that reads as a standing preference — record it as a **learned constraint** in the brief (section 6). Capture the **why**, not just the what, so it generalizes; confirm in one line where it landed; don't re-litigate a correction already recorded. Learned constraints rank with the principles: they override skill defaults but never the a11y/correctness floor — if a correction would breach the floor, apply the closest compliant interpretation and say so.
|
|
116
|
+
|
|
117
|
+
This is project-scoped and lives in the brief by design — agemon-design is a UI skill, not a general memory engine. Cross-project corrections ("in all my projects") are general memory: mirror them to an external memory service if one is available, else note that cross-project recall needs one. Full behavior → [brief.md](brief.md) (Self-Correction).
|
|
118
|
+
|
|
119
|
+
### Animation Decision Ladder
|
|
120
|
+
|
|
121
|
+
> **Should this animate?** → High-frequency? No. Not communicating hierarchy/state/space? Cut it. Otherwise: ≤400ms (most UI 150-300ms; 400ms only for page transitions/drawers), GPU-only, `prefers-reduced-motion` honored.
|
|
122
|
+
|
|
123
|
+
Full ladder, easing, springs, stagger, interaction contract → [motion.md](motion.md) (**Decision Ladder**).
|
|
124
|
+
|
|
125
|
+
### Design Rules (core)
|
|
126
|
+
|
|
127
|
+
Layered shadows (ambient + direct). Semi-transparent borders + shadows for crisp edges. Hue-consistent borders/shadows/text on colored surfaces. APCA over WCAG 2. Interactions increase contrast. `color-scheme` + `theme-color` match theme. OKLCH for scales. Full detail in [layout.md](layout.md) and [color.md](color.md).
|
|
128
|
+
|
|
129
|
+
## Review Format (Required)
|
|
130
|
+
|
|
131
|
+
When reviewing UI code, use a markdown table. Never use "Before:"/"After:" on separate lines.
|
|
132
|
+
|
|
133
|
+
| Before | After | Why |
|
|
134
|
+
| --- | --- | --- |
|
|
135
|
+
| `transition: all 300ms` | `transition: opacity 200ms ease-out` | `all` animates unintended things |
|
|
136
|
+
| No focus-visible style | `focus-visible:ring-2 ring-offset-2` | Keyboard users need visible focus |
|
|
137
|
+
| `color: gray` for disabled | `opacity: 0.5` + `cursor: not-allowed` | Multiple signals, not just color |
|
|
138
|
+
|
|
139
|
+
Prioritize findings by impact:
|
|
140
|
+
1. **Critical** — blocks usability/a11y (missing focus, broken keyboard nav, no reduced-motion)
|
|
141
|
+
2. **High-impact** — immediately noticeable (wrong font, default blue, identical card grids, no hover states)
|
|
142
|
+
3. **Quick wins** — big polish (tabular-nums, letter-spacing, curly quotes, ` `)
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Quick Decision Frameworks
|
|
147
|
+
|
|
148
|
+
### Should This Animate?
|
|
149
|
+
|
|
150
|
+
| Frequency | Decision |
|
|
151
|
+
|-----------|----------|
|
|
152
|
+
| High (keyboard, toggles, typing) | No animation. Speed is the feature. |
|
|
153
|
+
| Medium (hover, list nav) | Minimal — under 150ms or remove |
|
|
154
|
+
| Low (modals, page transitions) | Standard — 200-300ms, clear purpose |
|
|
155
|
+
| One-time (onboarding) | Can be expressive — tell a story |
|
|
156
|
+
|
|
157
|
+
### Motion Budget
|
|
158
|
+
|
|
159
|
+
| Element | Budget |
|
|
160
|
+
|---------|--------|
|
|
161
|
+
| Color/opacity | 100-150ms |
|
|
162
|
+
| Small UI (tooltips, dropdowns) | 150-200ms |
|
|
163
|
+
| Medium UI (modals, panels) | 200-300ms |
|
|
164
|
+
| Large UI (page transitions, drawers) | 300-400ms |
|
|
165
|
+
|
|
166
|
+
Full easing curves, spring configs, stagger rules, and interaction rules → [motion.md](motion.md).
|