@hegemonart/get-design-done 1.42.0 → 1.43.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +1080 -1038
- package/README.md +157 -155
- package/SKILL.md +42 -42
- package/agents/README.md +53 -53
- package/agents/a11y-mapper.md +3 -3
- package/agents/component-benchmark-harvester.md +8 -8
- package/agents/component-benchmark-synthesizer.md +11 -11
- package/agents/component-taxonomy-mapper.md +5 -5
- package/agents/compose-executor.md +25 -25
- package/agents/conflict-resolver.md +8 -8
- package/agents/cost-forecaster.md +12 -12
- package/agents/decision-journal-exporter.md +5 -5
- package/agents/design-advisor.md +19 -19
- package/agents/design-assumptions-analyzer.md +16 -16
- package/agents/design-auditor.md +39 -39
- package/agents/design-authority-watcher.md +28 -28
- package/agents/design-component-generator.md +27 -27
- package/agents/design-context-builder.md +66 -66
- package/agents/design-context-checker-gate.md +5 -5
- package/agents/design-context-checker.md +20 -20
- package/agents/design-discussant.md +23 -23
- package/agents/design-doc-writer.md +12 -12
- package/agents/design-executor.md +38 -38
- package/agents/design-figma-writer.md +31 -31
- package/agents/design-fixer.md +27 -27
- package/agents/design-integration-checker-gate.md +5 -5
- package/agents/design-integration-checker.md +29 -29
- package/agents/design-paper-writer.md +14 -14
- package/agents/design-pattern-mapper.md +9 -9
- package/agents/design-pencil-writer.md +12 -12
- package/agents/design-phase-researcher.md +14 -14
- package/agents/design-plan-checker.md +13 -13
- package/agents/design-planner.md +24 -24
- package/agents/design-reflector.md +48 -48
- package/agents/design-research-synthesizer.md +21 -21
- package/agents/design-start-writer.md +7 -7
- package/agents/design-update-checker.md +8 -8
- package/agents/design-verifier-gate.md +5 -5
- package/agents/design-verifier.md +80 -80
- package/agents/ds-generator.md +14 -14
- package/agents/ds-migration-planner.md +12 -12
- package/agents/email-executor.md +26 -26
- package/agents/experiment-result-ingester.md +10 -10
- package/agents/flutter-executor.md +28 -28
- package/agents/gdd-graph-refresh.md +10 -10
- package/agents/gdd-intel-updater.md +11 -11
- package/agents/gdd-learnings-extractor.md +2 -2
- package/agents/motion-mapper.md +8 -8
- package/agents/motion-verifier.md +16 -16
- package/agents/pdf-executor.md +27 -27
- package/agents/perf-analyzer.md +20 -20
- package/agents/pr-commenter.md +24 -24
- package/agents/prototype-gate.md +29 -29
- package/agents/quality-gate-runner.md +21 -21
- package/agents/rollout-coordinator.md +8 -8
- package/agents/swift-executor.md +41 -41
- package/agents/ticket-sync-agent.md +19 -19
- package/agents/token-mapper.md +6 -6
- package/agents/user-research-synthesizer.md +13 -13
- package/agents/visual-hierarchy-mapper.md +2 -2
- package/dist/claude-code/.claude/skills/add-backlog/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +20 -20
- package/dist/claude-code/.claude/skills/audit/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/benchmark/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/brief/SKILL.md +20 -20
- package/dist/claude-code/.claude/skills/budget/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +6 -6
- package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +5 -5
- package/dist/claude-code/.claude/skills/check-update/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/compare/SKILL.md +15 -15
- package/dist/claude-code/.claude/skills/compare/compare-rubric.md +17 -17
- package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/connections/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +76 -76
- package/dist/claude-code/.claude/skills/continue/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/darkmode/SKILL.md +17 -17
- package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +7 -7
- package/dist/claude-code/.claude/skills/debug/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +12 -12
- package/dist/claude-code/.claude/skills/design/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/design/design-procedure.md +23 -23
- package/dist/claude-code/.claude/skills/discover/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/discover/discover-procedure.md +18 -18
- package/dist/claude-code/.claude/skills/discuss/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/do/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/explore/SKILL.md +21 -21
- package/dist/claude-code/.claude/skills/explore/explore-procedure.md +48 -48
- package/dist/claude-code/.claude/skills/export/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/fast/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/figma-write/SKILL.md +6 -6
- package/dist/claude-code/.claude/skills/graphify/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/health/SKILL.md +16 -16
- package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +3 -3
- package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +6 -6
- package/dist/claude-code/.claude/skills/help/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/map/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/migrate/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +16 -16
- package/dist/claude-code/.claude/skills/new-project/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/next/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/note/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/optimize/SKILL.md +15 -15
- package/dist/claude-code/.claude/skills/pause/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +39 -39
- package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +14 -14
- package/dist/claude-code/.claude/skills/peers/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/plan/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/plan/plan-procedure.md +24 -24
- package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/progress/SKILL.md +15 -15
- package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +22 -22
- package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +19 -19
- package/dist/claude-code/.claude/skills/quick/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/reflect/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +11 -11
- package/dist/claude-code/.claude/skills/report-issue/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +27 -27
- package/dist/claude-code/.claude/skills/resume/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/roi/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/router/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +6 -6
- package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +9 -9
- package/dist/claude-code/.claude/skills/router/router-rules.md +7 -7
- package/dist/claude-code/.claude/skills/scan/SKILL.md +16 -16
- package/dist/claude-code/.claude/skills/scan/scan-procedure.md +42 -42
- package/dist/claude-code/.claude/skills/settings/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/ship/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/sketch/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/spike/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/start/SKILL.md +8 -8
- package/dist/claude-code/.claude/skills/start/start-procedure.md +9 -9
- package/dist/claude-code/.claude/skills/stats/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/style/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +12 -12
- package/dist/claude-code/.claude/skills/synthesize/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/timeline/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/todo/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/update/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +17 -17
- package/dist/claude-code/.claude/skills/verify/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/verify/verify-procedure.md +34 -34
- package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +8 -8
- package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +4 -4
- package/package.json +5 -2
- package/reference/DEPRECATIONS.md +10 -10
- package/reference/STATE-TEMPLATE.md +26 -26
- package/reference/accessibility.md +13 -13
- package/reference/adr-format.md +13 -13
- package/reference/ai-native-tool-interface.md +5 -5
- package/reference/anti-patterns.md +9 -9
- package/reference/architecture-vocabulary.md +31 -31
- package/reference/audit-scoring.md +13 -13
- package/reference/authority-feeds.md +36 -36
- package/reference/bandit-integration.md +25 -25
- package/reference/brand-voice.md +36 -36
- package/reference/capability-gap-stage-gate.md +20 -20
- package/reference/checklists.md +26 -26
- package/reference/cli-localization.md +13 -13
- package/reference/codex-tools.md +2 -2
- package/reference/color-theory.md +28 -28
- package/reference/component-authoring.md +4 -4
- package/reference/components/README.md +13 -13
- package/reference/components/TEMPLATE.md +13 -13
- package/reference/components/accordion.md +15 -15
- package/reference/components/alert.md +25 -25
- package/reference/components/badge.md +18 -18
- package/reference/components/breadcrumbs.md +24 -24
- package/reference/components/button.md +21 -21
- package/reference/components/card.md +13 -13
- package/reference/components/checkbox.md +20 -20
- package/reference/components/chip.md +20 -20
- package/reference/components/command-palette.md +15 -15
- package/reference/components/date-picker.md +22 -22
- package/reference/components/drawer.md +13 -13
- package/reference/components/file-upload.md +22 -22
- package/reference/components/input.md +18 -18
- package/reference/components/label.md +25 -25
- package/reference/components/link.md +19 -19
- package/reference/components/list.md +17 -17
- package/reference/components/menu.md +19 -19
- package/reference/components/modal-dialog.md +16 -16
- package/reference/components/navbar.md +19 -19
- package/reference/components/pagination.md +18 -18
- package/reference/components/popover.md +12 -12
- package/reference/components/progress.md +18 -18
- package/reference/components/radio.md +17 -17
- package/reference/components/rich-text-editor.md +24 -24
- package/reference/components/select-combobox.md +16 -16
- package/reference/components/sidebar.md +15 -15
- package/reference/components/skeleton.md +20 -20
- package/reference/components/slider.md +20 -20
- package/reference/components/stepper.md +24 -24
- package/reference/components/switch.md +19 -19
- package/reference/components/table.md +21 -21
- package/reference/components/tabs.md +11 -11
- package/reference/components/toast.md +19 -19
- package/reference/components/tooltip.md +19 -19
- package/reference/components/tree.md +17 -17
- package/reference/composition.md +38 -38
- package/reference/config-schema.md +37 -37
- package/reference/context-md-format.md +9 -9
- package/reference/contrast-advanced.md +29 -29
- package/reference/conversational-ui.md +17 -17
- package/reference/cost-governance.md +14 -14
- package/reference/css-grid-layout.md +8 -8
- package/reference/cycle-handoff-preamble.md +3 -3
- package/reference/data-visualization.md +67 -67
- package/reference/debugger-philosophy.md +5 -5
- package/reference/design-system-guidance.md +21 -21
- package/reference/design-systems-catalog.md +20 -20
- package/reference/design-variants.md +11 -11
- package/reference/domains/civic-patterns.md +10 -10
- package/reference/domains/finance-patterns.md +9 -9
- package/reference/domains/gaming-patterns.md +9 -9
- package/reference/domains/healthcare-patterns.md +11 -11
- package/reference/ds-bootstrap-rubric.md +13 -13
- package/reference/email-design.md +22 -22
- package/reference/emotional-design.md +10 -10
- package/reference/error-recovery.md +11 -11
- package/reference/export-formats.md +7 -7
- package/reference/figma-sandbox.md +6 -6
- package/reference/first-principles.md +10 -10
- package/reference/form-patterns.md +26 -26
- package/reference/framer-motion-patterns.md +49 -49
- package/reference/gdd-runtime-audit.md +17 -17
- package/reference/gdd-threat-model.md +44 -44
- package/reference/gemini-tools.md +3 -3
- package/reference/gestalt.md +24 -24
- package/reference/heuristics.md +32 -32
- package/reference/i18n.md +44 -44
- package/reference/iconography.md +24 -24
- package/reference/image-optimization.md +14 -14
- package/reference/information-architecture.md +47 -47
- package/reference/intel-schema.md +1 -1
- package/reference/known-failure-modes.md +37 -37
- package/reference/meta-rules.md +5 -5
- package/reference/migrations/material-3-to-4.md +17 -17
- package/reference/migrations/mui-v6.md +16 -16
- package/reference/migrations/shadcn-v2.md +25 -25
- package/reference/migrations/tailwind-v4.md +21 -21
- package/reference/model-prices.md +3 -3
- package/reference/model-tiers.md +40 -40
- package/reference/motion-advanced.md +21 -21
- package/reference/motion-easings.md +29 -29
- package/reference/motion-interpolate.md +1 -1
- package/reference/motion-spring.md +13 -13
- package/reference/motion-transition-taxonomy.md +34 -34
- package/reference/motion.md +31 -31
- package/reference/multi-author-model.md +13 -13
- package/reference/native-platforms.md +28 -28
- package/reference/notification-routing.md +6 -6
- package/reference/onboarding-progressive-disclosure.md +32 -32
- package/reference/openrouter-tier-mapping.md +8 -8
- package/reference/palette-catalog.md +37 -37
- package/reference/parallelism-rules.md +20 -20
- package/reference/peer-cli-capabilities.md +14 -14
- package/reference/peer-protocols.md +21 -21
- package/reference/perf-budget.md +21 -21
- package/reference/performance.md +22 -22
- package/reference/platforms.md +51 -51
- package/reference/pr-review-integration.md +7 -7
- package/reference/prices/antigravity.md +3 -3
- package/reference/prices/augment.md +3 -3
- package/reference/prices/claude.md +2 -2
- package/reference/prices/cline.md +4 -4
- package/reference/prices/codebuddy.md +3 -3
- package/reference/prices/codex.md +2 -2
- package/reference/prices/copilot.md +3 -3
- package/reference/prices/cursor.md +3 -3
- package/reference/prices/gemini.md +2 -2
- package/reference/prices/kilo.md +3 -3
- package/reference/prices/opencode.md +4 -4
- package/reference/prices/qwen.md +2 -2
- package/reference/prices/trae.md +3 -3
- package/reference/prices/windsurf.md +3 -3
- package/reference/prices.openrouter.md +5 -5
- package/reference/print-design.md +36 -36
- package/reference/priority-matrix.md +2 -2
- package/reference/project-skills-guide.md +3 -3
- package/reference/proportion-systems.md +23 -23
- package/reference/pseudonymization-rules.md +30 -30
- package/reference/retrieval-contract.md +14 -14
- package/reference/review-format.md +7 -7
- package/reference/rollout-coordination.md +10 -10
- package/reference/rtl-cjk-cultural.md +39 -39
- package/reference/runtime-models.md +28 -28
- package/reference/shared-preamble.md +26 -26
- package/reference/skill-authoring-contract.md +16 -16
- package/reference/skill-placeholders.md +3 -3
- package/reference/start-interview.md +10 -10
- package/reference/style-vocabulary.md +25 -25
- package/reference/surfaces.md +4 -4
- package/reference/ticket-sync.md +9 -9
- package/reference/typography.md +64 -64
- package/reference/user-research.md +54 -54
- package/reference/variable-fonts-loading.md +15 -15
- package/reference/visual-hierarchy-layout.md +41 -41
- package/scripts/lib/manifest/prose-denylist.json +1 -1
- package/skills/add-backlog/SKILL.md +3 -3
- package/skills/analyze-dependencies/SKILL.md +10 -10
- package/skills/apply-reflections/SKILL.md +13 -13
- package/skills/apply-reflections/apply-reflections-procedure.md +20 -20
- package/skills/audit/SKILL.md +7 -7
- package/skills/bandit-status/SKILL.md +7 -7
- package/skills/benchmark/SKILL.md +7 -7
- package/skills/bootstrap-ds/SKILL.md +10 -10
- package/skills/brief/SKILL.md +20 -20
- package/skills/budget/SKILL.md +4 -4
- package/skills/cache-manager/SKILL.md +6 -6
- package/skills/cache-manager/cache-policy.md +5 -5
- package/skills/check-update/SKILL.md +5 -5
- package/skills/compare/SKILL.md +15 -15
- package/skills/compare/compare-rubric.md +17 -17
- package/skills/complete-cycle/SKILL.md +5 -5
- package/skills/connections/SKILL.md +11 -11
- package/skills/connections/connections-onboarding.md +76 -76
- package/skills/continue/SKILL.md +2 -2
- package/skills/darkmode/SKILL.md +17 -17
- package/skills/darkmode/darkmode-audit-procedure.md +7 -7
- package/skills/debug/SKILL.md +3 -3
- package/skills/debug/debug-feedback-loops.md +12 -12
- package/skills/design/SKILL.md +12 -12
- package/skills/design/design-procedure.md +23 -23
- package/skills/discover/SKILL.md +7 -7
- package/skills/discover/discover-procedure.md +18 -18
- package/skills/discuss/SKILL.md +12 -12
- package/skills/do/SKILL.md +1 -1
- package/skills/explore/SKILL.md +21 -21
- package/skills/explore/explore-procedure.md +48 -48
- package/skills/export/SKILL.md +9 -9
- package/skills/extract-learnings/SKILL.md +5 -5
- package/skills/fast/SKILL.md +7 -7
- package/skills/figma-extract/SKILL.md +11 -11
- package/skills/figma-write/SKILL.md +6 -6
- package/skills/graphify/SKILL.md +4 -4
- package/skills/health/SKILL.md +16 -16
- package/skills/health/health-mcp-detection.md +3 -3
- package/skills/health/health-skill-length-report.md +6 -6
- package/skills/help/SKILL.md +1 -1
- package/skills/list-assumptions/SKILL.md +4 -4
- package/skills/map/SKILL.md +12 -12
- package/skills/migrate/SKILL.md +5 -5
- package/skills/new-cycle/SKILL.md +2 -2
- package/skills/new-cycle/milestone-completeness-rubric.md +16 -16
- package/skills/new-project/SKILL.md +1 -1
- package/skills/next/SKILL.md +5 -5
- package/skills/note/SKILL.md +1 -1
- package/skills/openrouter-status/SKILL.md +4 -4
- package/skills/optimize/SKILL.md +15 -15
- package/skills/pause/SKILL.md +5 -5
- package/skills/peer-cli-add/SKILL.md +11 -11
- package/skills/peer-cli-add/peer-cli-protocol.md +39 -39
- package/skills/peer-cli-customize/SKILL.md +14 -14
- package/skills/peers/SKILL.md +4 -4
- package/skills/plan/SKILL.md +13 -13
- package/skills/plan/plan-procedure.md +24 -24
- package/skills/plant-seed/SKILL.md +4 -4
- package/skills/pr-branch/SKILL.md +2 -2
- package/skills/progress/SKILL.md +15 -15
- package/skills/quality-gate/SKILL.md +22 -22
- package/skills/quality-gate/threat-modeling.md +19 -19
- package/skills/quick/SKILL.md +5 -5
- package/skills/reapply-patches/SKILL.md +7 -7
- package/skills/reflect/SKILL.md +3 -3
- package/skills/reflect/procedures/capability-gap-scan.md +11 -11
- package/skills/report-issue/SKILL.md +5 -5
- package/skills/report-issue/report-issue-procedure.md +27 -27
- package/skills/resume/SKILL.md +9 -9
- package/skills/review-backlog/SKILL.md +3 -3
- package/skills/review-decisions/SKILL.md +3 -3
- package/skills/roi/SKILL.md +5 -5
- package/skills/rollout-status/SKILL.md +4 -4
- package/skills/router/SKILL.md +11 -11
- package/skills/router/capability-gap-emitter.md +6 -6
- package/skills/router/router-pick-emitter.md +9 -9
- package/skills/router/router-rules.md +7 -7
- package/skills/scan/SKILL.md +16 -16
- package/skills/scan/scan-procedure.md +42 -42
- package/skills/settings/SKILL.md +2 -2
- package/skills/ship/SKILL.md +7 -7
- package/skills/sketch/SKILL.md +10 -10
- package/skills/sketch-wrap-up/SKILL.md +12 -12
- package/skills/skill-manifest/SKILL.md +5 -5
- package/skills/spike/SKILL.md +7 -7
- package/skills/spike-wrap-up/SKILL.md +13 -13
- package/skills/start/SKILL.md +8 -8
- package/skills/start/start-procedure.md +9 -9
- package/skills/stats/SKILL.md +5 -5
- package/skills/style/SKILL.md +12 -12
- package/skills/style/style-doc-procedure.md +12 -12
- package/skills/synthesize/SKILL.md +10 -10
- package/skills/timeline/SKILL.md +4 -4
- package/skills/todo/SKILL.md +3 -3
- package/skills/turn-closeout/SKILL.md +10 -10
- package/skills/unlock-decision/SKILL.md +3 -3
- package/skills/update/SKILL.md +9 -9
- package/skills/using-gdd/SKILL.md +17 -17
- package/skills/verify/SKILL.md +13 -13
- package/skills/verify/verify-procedure.md +34 -34
- package/skills/warm-cache/SKILL.md +8 -8
- package/skills/watch-authorities/SKILL.md +9 -9
- package/skills/zoom-out/SKILL.md +4 -4
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Data Visualization
|
|
1
|
+
# Data Visualization - Chart Selection and Best Practices
|
|
2
2
|
|
|
3
|
-
Source: nextlevelbuilder/ui-ux-pro-max-skill (MIT)
|
|
3
|
+
Source: nextlevelbuilder/ui-ux-pro-max-skill (MIT) - data/charts.csv
|
|
4
4
|
|
|
5
|
-
Charts are not decorations
|
|
5
|
+
Charts are not decorations - they are arguments. Every chart type encodes a specific analytical claim, and choosing the wrong encoding forces the reader to decode the wrong claim. This reference provides decision rules for selecting chart types, configuring them accessibly, and avoiding the most common misuses.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## 1. Chart-Choice Matrix
|
|
9
|
+
## 1. Chart-Choice Matrix - Decision Framework
|
|
10
10
|
|
|
11
11
|
Every chart serves one of six analytical purposes: **comparison** (how do values rank against each other?), **composition** (how does a whole break into parts?), **distribution** (how are values spread?), **relationship** (do two or more variables correlate or influence each other?), **trend** (how does a value change over time?), or **geographic** (how does a value vary by location?). Identifying the purpose before choosing a chart eliminates most bad chart decisions.
|
|
12
12
|
|
|
@@ -14,10 +14,10 @@ Every chart serves one of six analytical purposes: **comparison** (how do values
|
|
|
14
14
|
|
|
15
15
|
| Chart type | When to use | When to avoid |
|
|
16
16
|
|---|---|---|
|
|
17
|
-
| Bar (vertical) | Comparing discrete categories; up to ~15 categories | When category labels are long
|
|
18
|
-
| Bar (horizontal) | Long category labels; ranked lists; > 8 categories | When comparing time series
|
|
17
|
+
| Bar (vertical) | Comparing discrete categories; up to ~15 categories | When category labels are long - they collide |
|
|
18
|
+
| Bar (horizontal) | Long category labels; ranked lists; > 8 categories | When comparing time series - use line instead |
|
|
19
19
|
| Bullet | Comparing a value against a target range (KPI context) | For more than ~8 metrics on one screen |
|
|
20
|
-
| Slope | Showing how two time points changed relative to each other; showing rank reversal | More than two time points
|
|
20
|
+
| Slope | Showing how two time points changed relative to each other; showing rank reversal | More than two time points - use a line chart |
|
|
21
21
|
|
|
22
22
|
### Composition
|
|
23
23
|
|
|
@@ -25,7 +25,7 @@ Every chart serves one of six analytical purposes: **comparison** (how do values
|
|
|
25
25
|
|---|---|---|
|
|
26
26
|
| Pie | Part-of-whole with ≤ 5 slices; slices differ substantially in size | > 5 categories; comparing slice sizes precisely |
|
|
27
27
|
| Donut | Same as pie; center space holds a summary number (total, %) | Any context where the center number distracts from part-whole reading |
|
|
28
|
-
| Stacked Bar | Part-of-whole across multiple categories or time points | When the interior segments (not just the bottom) need to be compared
|
|
28
|
+
| Stacked Bar | Part-of-whole across multiple categories or time points | When the interior segments (not just the bottom) need to be compared - interior comparison is unreliable |
|
|
29
29
|
| Treemap | Hierarchical part-of-whole; sizes span orders of magnitude | Showing change over time; fewer than ~8 leaf nodes (bar is clearer) |
|
|
30
30
|
| Sunburst | Hierarchical part-of-whole when hierarchy depth matters (2-3 levels) | More than 3 hierarchy levels; when labels must be legible for all segments |
|
|
31
31
|
| Waterfall | How a starting value reaches an ending value through additions and subtractions | Non-sequential cumulative data; when intermediate steps have no story value |
|
|
@@ -34,52 +34,52 @@ Every chart serves one of six analytical purposes: **comparison** (how do values
|
|
|
34
34
|
|
|
35
35
|
| Chart type | When to use | When to avoid |
|
|
36
36
|
|---|---|---|
|
|
37
|
-
| Histogram | Shape of a single continuous variable's distribution | Comparing two distributions directly
|
|
38
|
-
| Box Plot | Comparing distributions across groups; showing median, IQR, outliers | Audiences unfamiliar with statistical notation
|
|
39
|
-
| Violin Plot | Same as box plot, but when the shape of the distribution matters (bimodal, skewed) | Small samples (n < 30)
|
|
40
|
-
| Heatmap | Distribution of a value across two categorical dimensions; calendar patterns | When precise values matter
|
|
37
|
+
| Histogram | Shape of a single continuous variable's distribution | Comparing two distributions directly - use overlaid density or faceted charts |
|
|
38
|
+
| Box Plot | Comparing distributions across groups; showing median, IQR, outliers | Audiences unfamiliar with statistical notation - explain quartiles in the chart subtitle |
|
|
39
|
+
| Violin Plot | Same as box plot, but when the shape of the distribution matters (bimodal, skewed) | Small samples (n < 30) - the smoothed density curve is misleading |
|
|
40
|
+
| Heatmap | Distribution of a value across two categorical dimensions; calendar patterns | When precise values matter - heatmap encodes value via color, which is imprecise |
|
|
41
41
|
|
|
42
42
|
### Relationship
|
|
43
43
|
|
|
44
44
|
| Chart type | When to use | When to avoid |
|
|
45
45
|
|---|---|---|
|
|
46
|
-
| Scatter | Correlation between two continuous variables | Overplotting with > 5,000 points
|
|
47
|
-
| Bubble | Three-variable relationship where the third variable is proportional in magnitude | When bubble areas differ < 2×
|
|
48
|
-
| Chord | Flows or relationships between the same set of entities (e.g., trade between countries) | Directed flows where magnitude matters
|
|
46
|
+
| Scatter | Correlation between two continuous variables | Overplotting with > 5,000 points - use hexbin or density contours instead |
|
|
47
|
+
| Bubble | Three-variable relationship where the third variable is proportional in magnitude | When bubble areas differ < 2× - the size difference is imperceptible |
|
|
48
|
+
| Chord | Flows or relationships between the same set of entities (e.g., trade between countries) | Directed flows where magnitude matters - Sankey is clearer |
|
|
49
49
|
| Sankey | Directed flows between nodes; volume is encoded in link width | Cyclic flows; more than ~10 nodes (hairball effect) |
|
|
50
|
-
| Network/Force-directed | Topology of connections between nodes; cluster detection | Quantifying relationships
|
|
50
|
+
| Network/Force-directed | Topology of connections between nodes; cluster detection | Quantifying relationships - edge weight is visually unreliable |
|
|
51
51
|
|
|
52
52
|
### Trend
|
|
53
53
|
|
|
54
54
|
| Chart type | When to use | When to avoid |
|
|
55
55
|
|---|---|---|
|
|
56
|
-
| Line | Single or multiple continuous values over time | Unordered categorical data
|
|
57
|
-
| Area | Cumulative volume over time; emphasis on magnitude not rate of change | Multiple series with overlapping areas
|
|
56
|
+
| Line | Single or multiple continuous values over time | Unordered categorical data - use bar |
|
|
57
|
+
| Area | Cumulative volume over time; emphasis on magnitude not rate of change | Multiple series with overlapping areas - use line chart with fills instead |
|
|
58
58
|
| Sparkline | Compact trend indicator embedded in a table or KPI card | Any context requiring axis labels or precise value reading |
|
|
59
|
-
| Candlestick | OHLC financial data; price range and direction per period | Non-financial time series
|
|
59
|
+
| Candlestick | OHLC financial data; price range and direction per period | Non-financial time series - the OHLC convention is opaque to general audiences |
|
|
60
60
|
|
|
61
61
|
### Progress/Goal
|
|
62
62
|
|
|
63
63
|
| Chart type | When to use | When to avoid |
|
|
64
64
|
|---|---|---|
|
|
65
|
-
| Gauge | Single KPI versus a target or threshold; dashboard hero metric | Multiple gauges side by side
|
|
65
|
+
| Gauge | Single KPI versus a target or threshold; dashboard hero metric | Multiple gauges side by side - comparison is very hard with radial encodings |
|
|
66
66
|
| Funnel | Conversion or attrition across sequential stages | Stages that are not strictly sequential or mutually exclusive |
|
|
67
67
|
|
|
68
68
|
### Geographic
|
|
69
69
|
|
|
70
70
|
| Chart type | When to use | When to avoid |
|
|
71
71
|
|---|---|---|
|
|
72
|
-
| Geographic / Choropleth | Value distribution across geographic regions; regional comparison | When region size distorts perception
|
|
72
|
+
| Geographic / Choropleth | Value distribution across geographic regions; regional comparison | When region size distorts perception - large low-population regions dominate (use cartogram instead) |
|
|
73
73
|
|
|
74
74
|
### Project Timelines
|
|
75
75
|
|
|
76
76
|
| Chart type | When to use | When to avoid |
|
|
77
77
|
|---|---|---|
|
|
78
|
-
| Gantt | Task scheduling, duration, and dependency visualization over time | Real-time progress tracking without frequent data updates
|
|
78
|
+
| Gantt | Task scheduling, duration, and dependency visualization over time | Real-time progress tracking without frequent data updates - stale Gantt charts mislead |
|
|
79
79
|
|
|
80
80
|
---
|
|
81
81
|
|
|
82
|
-
## 2. Complete Chart Catalog (25 Types
|
|
82
|
+
## 2. Complete Chart Catalog (25 Types - GDD Decision Format)
|
|
83
83
|
|
|
84
84
|
### Comparison
|
|
85
85
|
|
|
@@ -87,13 +87,13 @@ Every chart serves one of six analytical purposes: **comparison** (how do values
|
|
|
87
87
|
Use a vertical bar chart when comparing discrete, unordered categories and the category labels fit horizontally beneath each bar. It is the default choice for most categorical comparison tasks because readers compare bar heights intuitively from a shared baseline. Recommended library: Recharts `<BarChart>` for React. Never use when you have more than 15 categories or when the chart width cannot accommodate all labels without rotation.
|
|
88
88
|
|
|
89
89
|
**Bar (Horizontal)**
|
|
90
|
-
Use a horizontal bar chart when category labels are long (> 15 characters), when rankings are the story, or when you have more than 8 categories. Horizontal orientation gives labels room to breathe and makes rank order easy to read top-to-bottom. Recommended library: Recharts `<BarChart layout="vertical">` for React. Never use when your data represents a time series
|
|
90
|
+
Use a horizontal bar chart when category labels are long (> 15 characters), when rankings are the story, or when you have more than 8 categories. Horizontal orientation gives labels room to breathe and makes rank order easy to read top-to-bottom. Recommended library: Recharts `<BarChart layout="vertical">` for React. Never use when your data represents a time series - line charts handle ordered time data far better.
|
|
91
91
|
|
|
92
92
|
**Bullet Chart**
|
|
93
|
-
Use a bullet chart when you need to show a single measure against one or more qualitative thresholds (poor / satisfactory / good) and a target marker, typically in a KPI or performance dashboard. It was designed by Stephen Few as a compact replacement for gauges and meter charts. Recommended library: Nivo `@nivo/bullet` for React. Never use when the audience needs to compare more than eight metrics simultaneously
|
|
93
|
+
Use a bullet chart when you need to show a single measure against one or more qualitative thresholds (poor / satisfactory / good) and a target marker, typically in a KPI or performance dashboard. It was designed by Stephen Few as a compact replacement for gauges and meter charts. Recommended library: Nivo `@nivo/bullet` for React. Never use when the audience needs to compare more than eight metrics simultaneously - the encoding becomes too dense.
|
|
94
94
|
|
|
95
95
|
**Slope Chart**
|
|
96
|
-
Use a slope chart when you want to show how values changed between exactly two time points and which entities rose, fell, or crossed each other. The crossing lines make rank reversal immediately visible. Recommended library: D3 with a custom `line` generator in React. Never use when you have more than two time points or more than ~10 entities
|
|
96
|
+
Use a slope chart when you want to show how values changed between exactly two time points and which entities rose, fell, or crossed each other. The crossing lines make rank reversal immediately visible. Recommended library: D3 with a custom `line` generator in React. Never use when you have more than two time points or more than ~10 entities - the chart becomes unreadable.
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
@@ -106,91 +106,91 @@ Use a pie chart when showing how a whole divides into parts, the parts are mutua
|
|
|
106
106
|
Use a donut chart in the same scenarios as a pie chart, with the added benefit that the hollow center can display a summary value (total, percentage of the largest segment, or a label). The reduced ink in the center slightly improves the legibility of the arc. Recommended library: Recharts `<PieChart>` with `innerRadius` set for React. Never use when the center callout number would distract from the part-whole message or when the chart is very small.
|
|
107
107
|
|
|
108
108
|
**Stacked Bar Chart**
|
|
109
|
-
Use a stacked bar chart when you need to show both total magnitude and part-of-whole composition across multiple groups or time points simultaneously. The bottom segment is comparable across groups; interior segments are not
|
|
109
|
+
Use a stacked bar chart when you need to show both total magnitude and part-of-whole composition across multiple groups or time points simultaneously. The bottom segment is comparable across groups; interior segments are not - readers cannot align them to a common baseline. Recommended library: Recharts `<BarChart>` with `stackId` for React. Never use when comparing the sizes of interior stack segments is the primary analytical task.
|
|
110
110
|
|
|
111
111
|
**Treemap**
|
|
112
|
-
Use a treemap when showing hierarchical composition and sizes span a wide range
|
|
112
|
+
Use a treemap when showing hierarchical composition and sizes span a wide range - the nested rectangles make relative size comparisons across magnitudes legible at a glance. Treemaps handle dozens to hundreds of leaf nodes without becoming unreadable, provided the labels are sized to fit. Recommended library: Nivo `@nivo/treemap` for React. Never use when the data has fewer than eight leaf nodes (a bar chart communicates the same information with less decoding effort) or when showing change over time.
|
|
113
113
|
|
|
114
114
|
**Sunburst**
|
|
115
115
|
Use a sunburst chart when hierarchical part-of-whole data has two or three meaningful levels and the reader needs to trace the contribution of sub-categories to their parent. Each ring represents one level of the hierarchy. Recommended library: Nivo `@nivo/sunburst` for React. Never use when hierarchy depth exceeds three levels, as inner rings become too small to label legibly and the chart degrades into an art object.
|
|
116
116
|
|
|
117
117
|
**Waterfall Chart**
|
|
118
|
-
Use a waterfall chart when explaining how an initial value reaches a final value through a series of positive and negative contributions
|
|
118
|
+
Use a waterfall chart when explaining how an initial value reaches a final value through a series of positive and negative contributions - profit-and-loss bridges, budget variance analysis, and step-by-step change attribution are the canonical use cases. Each bar floats from the accumulated prior value. Recommended library: Recharts with custom `<Bar>` using transparent bottom segments to create the floating effect, or Nivo `@nivo/bar` for React. Never use when the intermediate steps are not sequentially meaningful or when the audience cannot tolerate the decoding effort of floating bars.
|
|
119
119
|
|
|
120
120
|
---
|
|
121
121
|
|
|
122
122
|
### Distribution
|
|
123
123
|
|
|
124
124
|
**Histogram**
|
|
125
|
-
Use a histogram when revealing the shape of a single continuous variable's distribution
|
|
125
|
+
Use a histogram when revealing the shape of a single continuous variable's distribution - whether it is normal, skewed, bimodal, or has outliers. The key design choice is bin width: too few bins hides structure; too many bins creates noise. Recommended library: Nivo `@nivo/bar` with manually computed bins, or Victory `<VictoryHistogram>` for React. Never use when comparing two distributions on the same axis - overlapping histograms are hard to read; use a ridgeline or faceted approach instead.
|
|
126
126
|
|
|
127
127
|
**Box Plot**
|
|
128
|
-
Use a box plot (box-and-whisker) when comparing the distribution of a continuous variable across multiple groups. It summarizes median, interquartile range (IQR), and outliers in a compact glyph that scales to dozens of groups. Recommended library: Victory `<VictoryBoxPlot>` for React. Never use with audiences unfamiliar with statistical notation
|
|
128
|
+
Use a box plot (box-and-whisker) when comparing the distribution of a continuous variable across multiple groups. It summarizes median, interquartile range (IQR), and outliers in a compact glyph that scales to dozens of groups. Recommended library: Victory `<VictoryBoxPlot>` for React. Never use with audiences unfamiliar with statistical notation - always include a subtitle that explains that the box spans the middle 50% of values.
|
|
129
129
|
|
|
130
130
|
**Violin Plot**
|
|
131
|
-
Treat a violin plot as an enhanced box plot that additionally shows the full density shape of the distribution via a mirrored kernel density estimate. Use it when the distribution shape is the analytical point
|
|
131
|
+
Treat a violin plot as an enhanced box plot that additionally shows the full density shape of the distribution via a mirrored kernel density estimate. Use it when the distribution shape is the analytical point - bimodality, heavy tails, or gaps in the data that a box plot's five-number summary would hide. Recommended library: D3 with a custom density estimate rendered as a `<path>` in React. Never use with samples smaller than 30 observations - the smoothed curve implies precision the data does not support.
|
|
132
132
|
|
|
133
133
|
**Heatmap**
|
|
134
|
-
Use a heatmap when showing the distribution of a value across two categorical dimensions simultaneously
|
|
134
|
+
Use a heatmap when showing the distribution of a value across two categorical dimensions simultaneously - website traffic by hour and day of week, gene expression across samples and conditions, or feature correlation matrices. Color encodes the value; spatial position encodes the two categories. Recommended library: Nivo `@nivo/heatmap` for React. Never use when the audience needs to read precise values - color is an imprecise channel; pair with tooltips or an adjacent data table.
|
|
135
135
|
|
|
136
136
|
---
|
|
137
137
|
|
|
138
138
|
### Relationship
|
|
139
139
|
|
|
140
140
|
**Scatter Plot**
|
|
141
|
-
Use a scatter plot when investigating correlation, clustering, or outliers between two continuous variables. Each point represents one observation; position encodes both values against shared axes. Recommended library: Recharts `<ScatterChart>` for React. Never use when overplotting obscures the pattern
|
|
141
|
+
Use a scatter plot when investigating correlation, clustering, or outliers between two continuous variables. Each point represents one observation; position encodes both values against shared axes. Recommended library: Recharts `<ScatterChart>` for React. Never use when overplotting obscures the pattern - with more than 5,000 points, switch to a hexbin aggregation or 2D density contour chart.
|
|
142
142
|
|
|
143
143
|
**Bubble Chart**
|
|
144
|
-
Use a bubble chart when a third continuous variable can be meaningfully encoded as the area of each scatter point
|
|
144
|
+
Use a bubble chart when a third continuous variable can be meaningfully encoded as the area of each scatter point - market share plus revenue plus growth rate, for example. Area encoding is less precise than position, so the third variable should be the least precise claim in the story. Recommended library: Recharts `<ScatterChart>` with a custom dot renderer for React. Never use when the range of the third variable is less than 2× - the size difference is imperceptible and the extra encoding adds confusion without insight.
|
|
145
145
|
|
|
146
146
|
**Chord Diagram**
|
|
147
|
-
Use a chord diagram when showing bidirectional flows or relationships between members of the same set
|
|
147
|
+
Use a chord diagram when showing bidirectional flows or relationships between members of the same set - migration between cities, trade flows between countries, or co-occurrence between categories. The arc length encodes the total flow for each node; the chord width encodes the flow between two specific nodes. Recommended library: D3 `d3-chord` with custom React SVG rendering. Never use when the flows are directed and their asymmetry is the story - Sankey handles directed flows with visible volume much more clearly.
|
|
148
148
|
|
|
149
149
|
**Sankey Diagram**
|
|
150
|
-
Use a Sankey diagram when showing directed flows with volume through a network of nodes
|
|
150
|
+
Use a Sankey diagram when showing directed flows with volume through a network of nodes - user journey funnels, energy systems, budget allocations, and supply chain flows are classic cases. Link width is proportional to flow volume. Recommended library: Nivo `@nivo/sankey` for React. Never use with cyclic flows or more than approximately ten nodes - the diagram quickly becomes a hairball that defeats the purpose of the visualization.
|
|
151
151
|
|
|
152
152
|
**Network / Force-Directed Graph**
|
|
153
|
-
Use a force-directed network graph when the topology of connections between entities is the story
|
|
153
|
+
Use a force-directed network graph when the topology of connections between entities is the story - who is connected to whom, cluster structure, centrality, and isolated nodes. Force simulation positions densely connected clusters near each other. Recommended library: D3 `d3-force` with custom React SVG for full control. Never use when you need to compare edge weights or node values precisely - quantitative encoding via edge thickness or node size is unreliable in a force layout.
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|
|
157
157
|
### Trend
|
|
158
158
|
|
|
159
159
|
**Line Chart**
|
|
160
|
-
Use a line chart when showing how one or more continuous values change over an ordered time series. The connecting line implies continuity between measurements, so only use it when intermediate values would logically exist. Recommended library: Recharts `<LineChart>` for React. Never use for unordered categorical data
|
|
160
|
+
Use a line chart when showing how one or more continuous values change over an ordered time series. The connecting line implies continuity between measurements, so only use it when intermediate values would logically exist. Recommended library: Recharts `<LineChart>` for React. Never use for unordered categorical data - a bar chart is correct when there is no meaningful order between data points.
|
|
161
161
|
|
|
162
162
|
**Area Chart**
|
|
163
|
-
Use an area chart when the cumulative volume or magnitude beneath the line is part of the story
|
|
163
|
+
Use an area chart when the cumulative volume or magnitude beneath the line is part of the story - total revenue over time, cumulative downloads, or stacked contribution of multiple series. Filling the area below the line emphasizes quantity more than rate of change. Recommended library: Recharts `<AreaChart>` for React. Never use with multiple overlapping series that share the same baseline - the overlaps become confusing; use a line chart with area fills per series that do not overlap, or switch to a stacked area.
|
|
164
164
|
|
|
165
165
|
**Sparkline**
|
|
166
|
-
Use a sparkline as a compact inline trend indicator embedded within a table cell, a KPI card, or dense prose
|
|
166
|
+
Use a sparkline as a compact inline trend indicator embedded within a table cell, a KPI card, or dense prose - the shape of the trend is the signal, not individual values. They are designed to be read without axes or labels. Recommended library: Recharts `<LineChart>` at very small dimensions with all axes and padding removed, or Victory `<VictoryLine>` for React. Never use when the reader needs to identify specific values, compare two sparklines precisely, or understand the scale of the change.
|
|
167
167
|
|
|
168
168
|
**Candlestick Chart**
|
|
169
|
-
Use a candlestick chart for financial OHLC (open, high, low, close) data where the price range and direction within each period are both meaningful
|
|
169
|
+
Use a candlestick chart for financial OHLC (open, high, low, close) data where the price range and direction within each period are both meaningful - daily stock prices, hourly crypto trades, and options expiry analysis. The body color (typically green/red) encodes whether the close was above or below the open. Recommended library: a specialized financial library such as `lightweight-charts` (TradingView), or D3 with custom React SVG for full control. Never use for non-financial time series where the OHLC convention would confuse general audiences who do not know the encoding.
|
|
170
170
|
|
|
171
171
|
---
|
|
172
172
|
|
|
173
173
|
### Progress / Goal
|
|
174
174
|
|
|
175
175
|
**Gauge Chart**
|
|
176
|
-
Use a gauge (also called a dial or speedometer chart) for a single KPI that has a meaningful threshold or target
|
|
176
|
+
Use a gauge (also called a dial or speedometer chart) for a single KPI that has a meaningful threshold or target - CPU usage, customer satisfaction score, or a completion percentage. The radial encoding is immediately legible to general audiences as a progress metaphor. Recommended library: Nivo `@nivo/pie` with a semi-circle clipping mask, or a custom D3 arc in React. Never use for multiple gauges displayed side by side - radial comparison is cognitively expensive; use a bullet chart array instead.
|
|
177
177
|
|
|
178
178
|
**Funnel Chart**
|
|
179
|
-
Use a funnel chart when showing attrition or conversion across a fixed sequence of stages
|
|
179
|
+
Use a funnel chart when showing attrition or conversion across a fixed sequence of stages - e-commerce checkout steps, sales pipeline stages, or onboarding flows. Each stage is narrower than the previous, encoding drop-off volume. Recommended library: Nivo `@nivo/funnel` for React. Never use when the stages are not strictly sequential, not mutually exclusive, or when users can re-enter earlier stages - the funnel metaphor implies a one-way flow and will mislead.
|
|
180
180
|
|
|
181
181
|
---
|
|
182
182
|
|
|
183
183
|
### Geographic
|
|
184
184
|
|
|
185
185
|
**Geographic / Choropleth Map**
|
|
186
|
-
Use a choropleth map when comparing a statistical variable across geographic regions
|
|
186
|
+
Use a choropleth map when comparing a statistical variable across geographic regions - unemployment by county, election results by state, or population density by country. Color encodes the variable; spatial position provides geographic context. Recommended library: D3 with `d3-geo` projections and TopoJSON boundary data, or Nivo `@nivo/geo` for React. Never use when large low-population regions visually dominate the map while small high-population regions are barely visible - this is a known perceptual bias of choropleths; consider a cartogram or a bar chart with a small map inset.
|
|
187
187
|
|
|
188
188
|
---
|
|
189
189
|
|
|
190
190
|
### Project Timelines
|
|
191
191
|
|
|
192
192
|
**Gantt Chart**
|
|
193
|
-
Use a Gantt chart when visualizing task scheduling, durations, dependencies, and resource allocation across a project timeline. Horizontal bars represent task duration; vertical position groups tasks by resource or phase. Recommended library: custom D3 rendering or specialized libraries such as `react-google-charts` (Gantt type) for React. Never use when the underlying data is not kept current
|
|
193
|
+
Use a Gantt chart when visualizing task scheduling, durations, dependencies, and resource allocation across a project timeline. Horizontal bars represent task duration; vertical position groups tasks by resource or phase. Recommended library: custom D3 rendering or specialized libraries such as `react-google-charts` (Gantt type) for React. Never use when the underlying data is not kept current - a stale Gantt chart actively misleads stakeholders about project status.
|
|
194
194
|
|
|
195
195
|
---
|
|
196
196
|
|
|
@@ -198,7 +198,7 @@ Use a Gantt chart when visualizing task scheduling, durations, dependencies, and
|
|
|
198
198
|
|
|
199
199
|
Approximately 8% of males and 0.5% of females have some form of color vision deficiency. Using a color-blind-safe palette is not optional for any chart that reaches a general audience.
|
|
200
200
|
|
|
201
|
-
### Okabe-Ito (Categorical
|
|
201
|
+
### Okabe-Ito (Categorical - 8 colors)
|
|
202
202
|
|
|
203
203
|
Developed by Masataka Okabe and Kei Ito and published in "Color Universal Design (CUD): How to make figures and presentations that are friendly to colorblind people" (J-Stage, 2008). This palette is distinguishable under all major types of color vision deficiency: deuteranopia, protanopia, tritanopia, and achromatopsia.
|
|
204
204
|
|
|
@@ -215,19 +215,19 @@ Developed by Masataka Okabe and Kei Ito and published in "Color Universal Design
|
|
|
215
215
|
|
|
216
216
|
Use Okabe-Ito as the default categorical palette for all new charts unless a client brand palette takes precedence. When brand colors are required, simulate deuteranopia using tools such as Coblis or Viz Palette before shipping.
|
|
217
217
|
|
|
218
|
-
### Viridis (Sequential
|
|
218
|
+
### Viridis (Sequential - Continuous)
|
|
219
219
|
|
|
220
|
-
Viridis is a perceptually uniform sequential colormap developed by Nathaniel Smith and Stefan van der Walt for matplotlib (SciPy 2015). It is safe for deuteranopia and protanopia, prints legibly in greyscale, and is monotonically increasing in perceived brightness
|
|
220
|
+
Viridis is a perceptually uniform sequential colormap developed by Nathaniel Smith and Stefan van der Walt for matplotlib (SciPy 2015). It is safe for deuteranopia and protanopia, prints legibly in greyscale, and is monotonically increasing in perceived brightness - meaning that higher values are always visually distinct from lower values. Use Viridis for heatmaps, choropleths, and any continuous sequential data.
|
|
221
221
|
|
|
222
|
-
CSS custom property suggestion: use the `viridis` scale from the `d3-scale-chromatic` package
|
|
222
|
+
CSS custom property suggestion: use the `viridis` scale from the `d3-scale-chromatic` package - `d3.scaleSequential(d3.interpolateViridis)`.
|
|
223
223
|
|
|
224
|
-
### Cividis (Sequential
|
|
224
|
+
### Cividis (Sequential - Blue-Yellow Optimized)
|
|
225
225
|
|
|
226
226
|
Cividis is a variant of Viridis specifically optimized for blue-yellow (tritanopia) color blindness, developed by Jamie Nuñez, Christopher Anderton, and Ryan Renslow (PLOS ONE, 2018). It transitions from dark blue through grey to yellow and is designed to appear nearly identical to individuals with and without color vision deficiency. Use Cividis when your audience includes users with tritanopia, or as a general-purpose alternative to Viridis.
|
|
227
227
|
|
|
228
228
|
CSS: `d3.scaleSequential(d3.interpolateCividis)` from `d3-scale-chromatic`.
|
|
229
229
|
|
|
230
|
-
### Plasma (Sequential
|
|
230
|
+
### Plasma (Sequential - High Contrast)
|
|
231
231
|
|
|
232
232
|
Plasma is a high-contrast perceptually uniform sequential palette that transitions from dark purple through bright orange-yellow. Use Plasma for sequential data where Viridis reads as too green-dominant or where high contrast between low and high values is needed in print. It is safe for deuteranopia and protanopia.
|
|
233
233
|
|
|
@@ -244,9 +244,9 @@ CSS: `d3.scaleSequential(d3.interpolatePlasma)` from `d3-scale-chromatic`.
|
|
|
244
244
|
The pie chart is the most misused chart type in business contexts. These rules are non-negotiable.
|
|
245
245
|
|
|
246
246
|
- **Use pie only for part-of-whole data with five or fewer slices.** The human visual system is reliable at reading pie slices only when the slices are few and substantially different in size. Beyond five slices, switch to a horizontal bar chart sorted by value.
|
|
247
|
-
- **Never use 3D pie charts.** The perspective projection warps the apparent size of slices
|
|
247
|
+
- **Never use 3D pie charts.** The perspective projection warps the apparent size of slices - a slice in the foreground appears larger than an identical slice in the background. A 3D pie chart is not a stylistic choice; it is a lie about the data. Remove it from any design system component library.
|
|
248
248
|
- **For more than five categories, use a bar chart or treemap.** A horizontal bar chart sorted descending gives every category a position on a shared baseline and is orders of magnitude more readable than a twelve-slice pie.
|
|
249
|
-
- **Label slices directly when there are five or fewer slices.** Place the label and value inside or adjacent to each slice. Legends force the reader to shuttle their eyes back and forth between the legend and the chart
|
|
249
|
+
- **Label slices directly when there are five or fewer slices.** Place the label and value inside or adjacent to each slice. Legends force the reader to shuttle their eyes back and forth between the legend and the chart - this is cognitive overhead that direct labeling eliminates. When slices are too small to label directly, use a leader line.
|
|
250
250
|
|
|
251
251
|
---
|
|
252
252
|
|
|
@@ -256,25 +256,25 @@ Axes are the scaffolding of interpretation. Misusing them is one of the most com
|
|
|
256
256
|
|
|
257
257
|
### Zero Baseline
|
|
258
258
|
|
|
259
|
-
Always start bar chart and area chart Y-axes at zero. A bar whose height encodes a value depends entirely on that bar's length relative to the baseline
|
|
259
|
+
Always start bar chart and area chart Y-axes at zero. A bar whose height encodes a value depends entirely on that bar's length relative to the baseline - truncating the baseline inflates the visual difference between bars. A chart showing two bars of 98 and 99 that is truncated to start at 97 makes them appear vastly different; starting at zero makes them appear nearly identical, which is the truth. This rule is absolute for bar and area charts.
|
|
260
260
|
|
|
261
261
|
### Line Chart Truncation Exception
|
|
262
262
|
|
|
263
|
-
Line charts showing change over time may truncate the Y axis when the absolute values are large but the change is small and meaningful
|
|
263
|
+
Line charts showing change over time may truncate the Y axis when the absolute values are large but the change is small and meaningful - for example, a body temperature chart ranging from 36.0°C to 38.5°C is more useful than one ranging from 0°C to 40°C. **When you truncate a line chart Y-axis, you must include a break indicator (⁃⁃) on the axis to signal that the baseline is not zero.** Without the break indicator, the chart misleads.
|
|
264
264
|
|
|
265
265
|
### Dual Y-Axis
|
|
266
266
|
|
|
267
|
-
Avoid dual Y-axis charts. A dual Y-axis allows the designer to manipulate the apparent correlation between two variables by independently scaling each axis
|
|
267
|
+
Avoid dual Y-axis charts. A dual Y-axis allows the designer to manipulate the apparent correlation between two variables by independently scaling each axis - any two unrelated trends can be made to appear correlated. There is almost always a better alternative: separate charts sharing an X-axis (small multiples), an index chart normalizing both series to 100 at a common start point, or a scatter plot if correlation is what you are trying to show.
|
|
268
268
|
|
|
269
269
|
### Log Scale
|
|
270
270
|
|
|
271
|
-
A logarithmic scale is valid and appropriate when data spans multiple orders of magnitude
|
|
271
|
+
A logarithmic scale is valid and appropriate when data spans multiple orders of magnitude - population by country, income distribution, or exponential growth curves. A log scale compresses the high end and expands the low end, making growth rates comparable across the full range. **Always label a log-scale axis explicitly as "log scale."** Readers who do not notice they are looking at a log axis will dramatically misread the rate of change between data points.
|
|
272
272
|
|
|
273
273
|
---
|
|
274
274
|
|
|
275
275
|
## 6. Annotation Patterns
|
|
276
276
|
|
|
277
|
-
Annotations are the editorial layer of a chart
|
|
277
|
+
Annotations are the editorial layer of a chart - they tell the reader which data points are most important and why.
|
|
278
278
|
|
|
279
279
|
### Direct Labeling vs. Legend
|
|
280
280
|
|
|
@@ -282,7 +282,7 @@ Direct labeling on the chart is more readable than a legend when the chart has f
|
|
|
282
282
|
|
|
283
283
|
### Callouts for Notable Data Points
|
|
284
284
|
|
|
285
|
-
Use callout annotations to mark data points with editorial significance
|
|
285
|
+
Use callout annotations to mark data points with editorial significance - a record high or low, a policy change, an anomaly, a product launch, or an external event that explains a discontinuity. A callout typically consists of a small circle or dot on the data point, a leader line, and a text label. Callout text should be **one sentence maximum**, left-aligned on the callout, and written in plain language that states what happened, not what the reader can already see ("Revenue fell 22% in March after the supply chain disruption" is useful; "Value decreases here" is not).
|
|
286
286
|
|
|
287
287
|
### Annotation Placement
|
|
288
288
|
|
|
@@ -296,11 +296,11 @@ Data visualizations present unique accessibility challenges because they communi
|
|
|
296
296
|
|
|
297
297
|
### Data Table Alternative
|
|
298
298
|
|
|
299
|
-
Always provide a data table as an accessible alternative to complex charts. WCAG 1.1.1 (Level A) requires non-text content to have a text alternative that presents the same information. For a line chart, this means an HTML `<table>` with the same data used to generate the chart
|
|
299
|
+
Always provide a data table as an accessible alternative to complex charts. WCAG 1.1.1 (Level A) requires non-text content to have a text alternative that presents the same information. For a line chart, this means an HTML `<table>` with the same data used to generate the chart - it can be visually hidden and shown on demand, included below the chart, or linked as a download. The chart title and description should also be conveyed in the chart's `<title>` and `<desc>` SVG elements or in an `aria-label` on the chart container.
|
|
300
300
|
|
|
301
301
|
### ARIA Live Regions for Dynamic Charts
|
|
302
302
|
|
|
303
|
-
Charts that update in real time
|
|
303
|
+
Charts that update in real time - stock price tickers, live analytics dashboards, server monitoring - must use ARIA live regions to announce changes to screen reader users. Set `aria-live="polite"` on a visually hidden element that receives a text update each time the chart data changes. Use `aria-live="assertive"` only for urgent alerts (threshold breach, system failure). Avoid updating the live region more than once every few seconds, as rapid updates interrupt screen reader speech.
|
|
304
304
|
|
|
305
305
|
### Keyboard Navigation
|
|
306
306
|
|
|
@@ -308,17 +308,17 @@ Interactive charts that support brushing, zooming, or selecting data ranges must
|
|
|
308
308
|
|
|
309
309
|
### Sonification
|
|
310
310
|
|
|
311
|
-
Sonification
|
|
311
|
+
Sonification - encoding data as sound (pitch, tempo, or timbre) - is an experimental but promising alternative for screen reader users who cannot interpret visual charts even with text alternatives. Libraries such as Highcharts Sonification Studio and Astronify provide this capability. Sonification is not currently a WCAG requirement, but it is worth noting for products that serve visually impaired users as a primary audience. Do not substitute sonification for a data table; provide both.
|
|
312
312
|
|
|
313
313
|
---
|
|
314
314
|
|
|
315
315
|
## 8. Dashboard Patterns
|
|
316
316
|
|
|
317
|
-
A dashboard is a collection of charts, and the design principles that apply to individual charts apply with compounding force to dashboards
|
|
317
|
+
A dashboard is a collection of charts, and the design principles that apply to individual charts apply with compounding force to dashboards - bad individual chart choices become bad dashboard experiences.
|
|
318
318
|
|
|
319
319
|
### Overview First, Filter Late, Drill Down
|
|
320
320
|
|
|
321
|
-
Follow Shneiderman's Visual Information-Seeking Mantra: **overview first, zoom and filter, then details on demand.** The dashboard's first view should give the reader the big picture
|
|
321
|
+
Follow Shneiderman's Visual Information-Seeking Mantra: **overview first, zoom and filter, then details on demand.** The dashboard's first view should give the reader the big picture - total performance, trend direction, anomalies. Filtering controls (date range, segment selector) narrow the overview. Drill-down links or expandable panels reveal underlying detail. Reversing this order - starting with granular data - overwhelms users and prevents them from forming a correct mental model of the system.
|
|
322
322
|
|
|
323
323
|
### KPI Cards Above the Fold
|
|
324
324
|
|
|
@@ -326,8 +326,8 @@ The most important single number belongs above the fold as a KPI card. A well-de
|
|
|
326
326
|
|
|
327
327
|
### Progressive Disclosure
|
|
328
328
|
|
|
329
|
-
Structure dashboard information in three layers: **summary** (KPI cards and headline charts above the fold), **detail** (supporting charts visible on scroll), and **raw data** (accessible via a link, export, or drill-down table). This mirrors how users actually read dashboards
|
|
329
|
+
Structure dashboard information in three layers: **summary** (KPI cards and headline charts above the fold), **detail** (supporting charts visible on scroll), and **raw data** (accessible via a link, export, or drill-down table). This mirrors how users actually read dashboards - most users stop at the summary layer most of the time; power users drill into detail; analysts need the raw data. Putting all three layers on the same screen simultaneously creates visual noise for the majority of users.
|
|
330
330
|
|
|
331
331
|
### Cognitive Load Budget
|
|
332
332
|
|
|
333
|
-
Apply a strict cognitive load budget above the fold: **no more than five distinct visual elements** (KPI cards, charts, filter controls) should compete for attention in the initial viewport. Every additional element above five increases cognitive load non-linearly
|
|
333
|
+
Apply a strict cognitive load budget above the fold: **no more than five distinct visual elements** (KPI cards, charts, filter controls) should compete for attention in the initial viewport. Every additional element above five increases cognitive load non-linearly - users experience "dashboard blindness" and stop reading the dashboard at all. If you have eight KPIs, group them into two rows of four with clear visual hierarchy that directs attention to the top two. If you have twelve charts, use tabs or sections to reveal them progressively rather than displaying them simultaneously.
|
|
@@ -8,7 +8,7 @@ A design bug is a gap between what the design says (DESIGN-PLAN.md goals, D-XX d
|
|
|
8
8
|
|
|
9
9
|
2. **One variable at a time.** Change one thing, re-measure. Multiple simultaneous changes make causation impossible to determine and usually bury the true culprit.
|
|
10
10
|
|
|
11
|
-
3. **Persistent state.** Write findings to `.design/DEBUG.md` after each investigation step. A killed debug session resumes from the last checkpoint
|
|
11
|
+
3. **Persistent state.** Write findings to `.design/DEBUG.md` after each investigation step. A killed debug session resumes from the last checkpoint - your future self should be able to read the file and pick up mid-thought.
|
|
12
12
|
|
|
13
13
|
4. **Design decisions are ground truth.** If D-XX says "primary = #3B82F6" and the rendered color is #000, that is a bug regardless of intent, aesthetics, or taste. The decision trail is the spec.
|
|
14
14
|
|
|
@@ -26,7 +26,7 @@ Written to `.design/DEBUG.md` with one `##` section per session. Each section co
|
|
|
26
26
|
|
|
27
27
|
## Red Flags
|
|
28
28
|
|
|
29
|
-
- "It works for me" without a measurement
|
|
30
|
-
- Fixing a symptom without isolating the cause
|
|
31
|
-
- Editing a global token to fix one component
|
|
32
|
-
- Skipping the DEBUG.md write-up because "it's obvious now"
|
|
29
|
+
- "It works for me" without a measurement - no. Measure.
|
|
30
|
+
- Fixing a symptom without isolating the cause - the bug will return somewhere else.
|
|
31
|
+
- Editing a global token to fix one component - blast radius.
|
|
32
|
+
- Skipping the DEBUG.md write-up because "it's obvious now" - future-you will disagree.
|
|
@@ -6,21 +6,21 @@ A design system is not a component library. A component library is a collection
|
|
|
6
6
|
|
|
7
7
|
## Token Versioning and Deprecation Policy
|
|
8
8
|
|
|
9
|
-
Design tokens are an API. Like any API, they must be versioned, because the components and applications that consume them will break if tokens are renamed or removed without notice. Treating tokens as implementation details
|
|
9
|
+
Design tokens are an API. Like any API, they must be versioned, because the components and applications that consume them will break if tokens are renamed or removed without notice. Treating tokens as implementation details - things that can be changed quietly - is the single most common cause of unexpected visual regressions in design systems.
|
|
10
10
|
|
|
11
11
|
**Semantic versioning for token APIs:** Token changes should follow SemVer semantics. Adding a new token is a minor release. Changing a token's value (e.g., updating `--color-brand-primary` from `#1a73e8` to `#1557b0`) is a minor release if the semantic meaning is preserved, or a major release if it changes the intent. Renaming or removing a token is always a major release.
|
|
12
12
|
|
|
13
13
|
**Deprecation warnings before removal:** A token should never be removed without a deprecation period of at least one major version. During the deprecation period, the old token continues to work but emits a warning in development mode (or in Figma via variable mode annotation). The deprecation notice must include the replacement token and a migration date. Consumers who are warned well in advance can migrate on their own timeline; consumers who are surprised by breakage lose trust in the system.
|
|
14
14
|
|
|
15
|
-
**Migration guides required:** Every major release that removes or renames tokens must include a migration guide. The guide must list every changed token, its old name, its new name, and a search-and-replace pattern that can be applied programmatically. A migration that requires consumers to manually discover what changed is not a migration
|
|
15
|
+
**Migration guides required:** Every major release that removes or renames tokens must include a migration guide. The guide must list every changed token, its old name, its new name, and a search-and-replace pattern that can be applied programmatically. A migration that requires consumers to manually discover what changed is not a migration - it is a breakage.
|
|
16
16
|
|
|
17
|
-
**Never rename without aliasing:** When a token must be renamed
|
|
17
|
+
**Never rename without aliasing:** When a token must be renamed - because the original name violated naming conventions, was ambiguous, or referred to a value rather than a purpose - the old name must be preserved as an alias pointing to the new name. The alias is deprecated and removed in the next major release after a documented migration window. This rule exists because token names propagate into codebases at scale: a rename without aliasing breaks every downstream consumer simultaneously.
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
21
|
## Multi-Brand Token Architecture
|
|
22
22
|
|
|
23
|
-
A multi-brand token architecture allows a single component library to support multiple brand expressions
|
|
23
|
+
A multi-brand token architecture allows a single component library to support multiple brand expressions - different color palettes, typography scales, and spacing densities - without forking the component code. The architecture achieves this through three distinct token layers, each with a specific responsibility.
|
|
24
24
|
|
|
25
25
|
### Base Layer (Primitives)
|
|
26
26
|
|
|
@@ -33,7 +33,7 @@ Examples:
|
|
|
33
33
|
- `--space-8: 8px`
|
|
34
34
|
- `--font-size-16: 16px`
|
|
35
35
|
|
|
36
|
-
**See:** [`./proportion-systems.md`](./proportion-systems.md) for the whole-UI proportion system covering 4pt/8pt/√2 baseline grids, baseline-grid lock, vertical rhythm, and modular relationships across type / spacing / sizing / radius scales
|
|
36
|
+
**See:** [`./proportion-systems.md`](./proportion-systems.md) for the whole-UI proportion system covering 4pt/8pt/√2 baseline grids, baseline-grid lock, vertical rhythm, and modular relationships across type / spacing / sizing / radius scales - the primitive tokens above are the codified output of that system.
|
|
37
37
|
|
|
38
38
|
Primitive tokens should never be used directly in component code. They exist only to feed the semantic layer. This constraint is essential: if components reference primitive tokens directly, you lose the ability to theme them without modifying component code.
|
|
39
39
|
|
|
@@ -51,7 +51,7 @@ Theme switching works by replacing the semantic layer. In practice, each brand d
|
|
|
51
51
|
|
|
52
52
|
### Component Layer (Scoped Tokens)
|
|
53
53
|
|
|
54
|
-
The component layer scopes semantic tokens to specific component contexts. Component-layer tokens exist because some components need values that differ from their semantic parents in specific states, variants, or sizes
|
|
54
|
+
The component layer scopes semantic tokens to specific component contexts. Component-layer tokens exist because some components need values that differ from their semantic parents in specific states, variants, or sizes - but those differences should still be expressed as token relationships, not hardcoded values.
|
|
55
55
|
|
|
56
56
|
Examples:
|
|
57
57
|
- `--button-bg-primary: var(--color-interactive-default)`
|
|
@@ -69,7 +69,7 @@ The token architecture is only valuable if it can be consumed by all the platfor
|
|
|
69
69
|
|
|
70
70
|
**Style Dictionary** is the standard open-source tool for token transformation. It reads a JSON or YAML token definition and transforms it into CSS custom properties, iOS Swift constants, Android XML resources, or any other format through a configurable pipeline. Style Dictionary is the right choice for most organizations because it is well-documented, widely adopted, and extensible. The transform pipeline should be version-controlled alongside the token definitions.
|
|
71
71
|
|
|
72
|
-
**Tokens Studio (Figma plugin)** enables the design-to-code handoff by syncing Figma variables and styles to a JSON format that Style Dictionary can consume. When Tokens Studio is integrated with the CI pipeline
|
|
72
|
+
**Tokens Studio (Figma plugin)** enables the design-to-code handoff by syncing Figma variables and styles to a JSON format that Style Dictionary can consume. When Tokens Studio is integrated with the CI pipeline - so that token changes in Figma trigger a transform and publish cycle - the design-to-code gap closes. Designers change tokens in Figma; engineers receive the updated CSS variables in the next publish. Without this integration, token values diverge between design and code, which is the root cause of most "the design says one thing but the code does another" defects.
|
|
73
73
|
|
|
74
74
|
**Terrazzo** provides advanced token transform capabilities for organizations with complex multi-platform, multi-brand requirements. It handles cases that Style Dictionary handles awkwardly: mathematically derived scales (e.g., a spacing scale generated from a base value), conditional token resolution (different values for different contexts), and schema validation at the token definition level.
|
|
75
75
|
|
|
@@ -77,17 +77,17 @@ The token architecture is only valuable if it can be consumed by all the platfor
|
|
|
77
77
|
|
|
78
78
|
## Semantic-Layer Design
|
|
79
79
|
|
|
80
|
-
The semantic layer is the design system's most consequential architectural decision. Naming tokens by value
|
|
80
|
+
The semantic layer is the design system's most consequential architectural decision. Naming tokens by value - `--color-red`, `--color-blue-700`, `--font-size-14` - produces a token API that is fragile under theming and misleading to consumers. Naming tokens by purpose produces an API that survives brand evolution, makes component intent explicit, and is safe to search and audit.
|
|
81
81
|
|
|
82
82
|
**The cardinal rule:** Name tokens by PURPOSE, not by VALUE.
|
|
83
83
|
|
|
84
|
-
Wrong: `--color-red` (a value name
|
|
85
|
-
Right: `--color-surface-danger` (a purpose name
|
|
84
|
+
Wrong: `--color-red` (a value name - breaks if the brand switches to orange for danger)
|
|
85
|
+
Right: `--color-surface-danger` (a purpose name - survives any palette change)
|
|
86
86
|
|
|
87
|
-
Wrong: `--font-size-14` (a value name
|
|
88
|
-
Right: `--font-size-caption` (a purpose name
|
|
87
|
+
Wrong: `--font-size-14` (a value name - breaks if the scale changes)
|
|
88
|
+
Right: `--font-size-caption` (a purpose name - survives a scale adjustment)
|
|
89
89
|
|
|
90
|
-
**Tokens should survive theme changes without rename.** A token that must be renamed every time the palette changes is not a semantic token
|
|
90
|
+
**Tokens should survive theme changes without rename.** A token that must be renamed every time the palette changes is not a semantic token - it is a named value. The test: if you change the value of `--color-surface-danger` from red to orange, does the name still accurately describe its purpose? If yes, the name is semantic. If no, the name was value-based.
|
|
91
91
|
|
|
92
92
|
**Hierarchical naming:** Semantic tokens should follow a consistent naming convention that expresses category, role, and variant:
|
|
93
93
|
|
|
@@ -112,11 +112,11 @@ This convention makes the token vocabulary predictable: anyone who knows the con
|
|
|
112
112
|
|
|
113
113
|
Component APIs are the contract between the design system and its consumers. An inconsistent or poorly designed API creates confusion, increases adoption friction, and makes migration painful. These conventions should be enforced in code review and documented in every component's API reference.
|
|
114
114
|
|
|
115
|
-
**The `size` prop:** Always use named sizes
|
|
115
|
+
**The `size` prop:** Always use named sizes - `sm`, `md`, `lg` - never raw pixel values. Pixel values expose implementation details and break the abstraction. Named sizes allow the design system to change the underlying pixel values across a version without requiring component consumers to update their code. `xs` and `xl` are acceptable additions when genuinely needed; avoid open-ended numeric scales that invite inconsistency.
|
|
116
116
|
|
|
117
|
-
**The `variant` prop:** Use a fixed vocabulary: `primary`, `secondary`, `ghost`, `destructive`. Additional variants should be exceptional and documented with rationale. Never create variants that duplicate semantic roles (e.g., `danger` alongside `destructive`)
|
|
117
|
+
**The `variant` prop:** Use a fixed vocabulary: `primary`, `secondary`, `ghost`, `destructive`. Additional variants should be exceptional and documented with rationale. Never create variants that duplicate semantic roles (e.g., `danger` alongside `destructive`) - this fragments the vocabulary and creates consumer confusion about which to use.
|
|
118
118
|
|
|
119
|
-
**Never expose internal implementation details as props.** A component whose API includes `backgroundColor`, `borderRadius`, or `fontWeight` props is not a component
|
|
119
|
+
**Never expose internal implementation details as props.** A component whose API includes `backgroundColor`, `borderRadius`, or `fontWeight` props is not a component - it is a styled div. Internal visual properties should be determined by the component's variant and size, expressed through tokens. If a consumer needs visual customization beyond the declared variants, the appropriate tool is either a new variant (with a contribution RFC) or composition, not an escape hatch prop.
|
|
120
120
|
|
|
121
121
|
---
|
|
122
122
|
|
|
@@ -128,9 +128,9 @@ A design system without governance is a suggestion library. Governance is what t
|
|
|
128
128
|
|
|
129
129
|
**Voting quorum for breaking changes:** Changes that remove or rename tokens, alter component API signatures, or change default visual behavior require a minimum quorum of token stakeholders (typically design leads and engineering leads from all consuming products) to review and approve. The quorum threshold and voting period should be documented and consistent. This prevents one team's urgency from creating breakage for other teams.
|
|
130
130
|
|
|
131
|
-
**Single-owner per component:** Every component must have a named owner
|
|
131
|
+
**Single-owner per component:** Every component must have a named owner - a person who is responsible for its API, its documentation, its accessibility compliance, and its migration support. Ownerless components decay: they accumulate inconsistencies, miss accessibility regressions, and fall behind the token system evolution. Ownership should transfer explicitly when team members change roles.
|
|
132
132
|
|
|
133
|
-
**Design and engineering sign-off both required:** No component ships without explicit sign-off from both the design lead (verifying that it matches the designed spec and has appropriate variant coverage) and the engineering lead (verifying that the API is correct, the implementation is idiomatic, and the tests cover the declared states). This dual sign-off is not bureaucracy
|
|
133
|
+
**Design and engineering sign-off both required:** No component ships without explicit sign-off from both the design lead (verifying that it matches the designed spec and has appropriate variant coverage) and the engineering lead (verifying that the API is correct, the implementation is idiomatic, and the tests cover the declared states). This dual sign-off is not bureaucracy - it is the minimal process that prevents the design-code gap from re-opening on every release.
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -152,7 +152,7 @@ The documentation standard for every component requires all of the following:
|
|
|
152
152
|
|
|
153
153
|
**Code example:** A minimal, copy-paste-ready code example for the most common usage. Consumers should be able to get to a correct implementation in under two minutes.
|
|
154
154
|
|
|
155
|
-
**Accessibility notes:** The ARIA role, relevant ARIA attributes, keyboard interaction pattern, and focus management behavior. This section is not optional
|
|
155
|
+
**Accessibility notes:** The ARIA role, relevant ARIA attributes, keyboard interaction pattern, and focus management behavior. This section is not optional - every interactive component has accessibility requirements that cannot be inferred from the visual design alone.
|
|
156
156
|
|
|
157
157
|
---
|
|
158
158
|
|
|
@@ -164,10 +164,10 @@ Design systems evolve through recognizable maturity stages. Understanding where
|
|
|
164
164
|
Components are built per project with no shared library. Each application makes its own visual decisions about color, typography, and spacing. There is no coordination mechanism, no shared vocabulary, and no reuse. Visual inconsistency across products is structural, not accidental. The cost of this level is paid in designer and engineer time spent rediscovering the same decisions on every project.
|
|
165
165
|
|
|
166
166
|
### Level 1: Shared UI Kit
|
|
167
|
-
A Figma component library exists and is used by designers. Components have documented variants and states in Figma. There is no code counterpart
|
|
167
|
+
A Figma component library exists and is used by designers. Components have documented variants and states in Figma. There is no code counterpart - developers implement from designs directly. The design-to-code gap is the defining problem at this level: the Figma library and the code diverge over time because there is no synchronization mechanism.
|
|
168
168
|
|
|
169
169
|
### Level 2: Component Library
|
|
170
|
-
Coded components exist and are shared across applications as a package. The library has basic documentation. There are no design tokens
|
|
170
|
+
Coded components exist and are shared across applications as a package. The library has basic documentation. There are no design tokens - visual values are hardcoded in component styles. Theming is not possible without forking the library. The code-to-design gap is still present because Figma and code are not synchronized.
|
|
171
171
|
|
|
172
172
|
### Level 3: Token-Driven
|
|
173
173
|
Design tokens exist in both Figma and code, synchronized through an automated pipeline (Tokens Studio + Style Dictionary). A semantic layer separates component implementations from raw values. Basic theming is possible by swapping the semantic layer. This is the first level where multi-brand support becomes practical. Most organizations that have invested in a design system are at Level 2 or approaching Level 3.
|