@hegemonart/get-design-done 1.41.5 → 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 +1120 -1029
- package/README.md +158 -154
- 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 +48 -0
- package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +170 -0
- package/dist/claude-code/.claude/skills/audit/SKILL.md +79 -0
- package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +94 -0
- package/dist/claude-code/.claude/skills/benchmark/SKILL.md +65 -0
- package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +43 -0
- package/dist/claude-code/.claude/skills/brief/SKILL.md +128 -0
- package/dist/claude-code/.claude/skills/budget/SKILL.md +45 -0
- package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +66 -0
- package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +126 -0
- package/dist/claude-code/.claude/skills/check-update/SKILL.md +98 -0
- package/dist/claude-code/.claude/skills/compare/SKILL.md +82 -0
- package/dist/claude-code/.claude/skills/compare/compare-rubric.md +171 -0
- package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +81 -0
- package/dist/claude-code/.claude/skills/connections/SKILL.md +71 -0
- package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +608 -0
- package/dist/claude-code/.claude/skills/continue/SKILL.md +24 -0
- package/dist/claude-code/.claude/skills/darkmode/SKILL.md +76 -0
- package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +258 -0
- package/dist/claude-code/.claude/skills/debug/SKILL.md +41 -0
- package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +119 -0
- package/dist/claude-code/.claude/skills/design/SKILL.md +99 -0
- package/dist/claude-code/.claude/skills/design/design-procedure.md +304 -0
- package/dist/claude-code/.claude/skills/discover/SKILL.md +72 -0
- package/dist/claude-code/.claude/skills/discover/discover-procedure.md +222 -0
- package/dist/claude-code/.claude/skills/discuss/SKILL.md +96 -0
- package/dist/claude-code/.claude/skills/do/SKILL.md +45 -0
- package/dist/claude-code/.claude/skills/explore/SKILL.md +105 -0
- package/dist/claude-code/.claude/skills/explore/explore-procedure.md +267 -0
- package/dist/claude-code/.claude/skills/export/SKILL.md +30 -0
- package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +98 -0
- package/dist/claude-code/.claude/skills/fast/SKILL.md +91 -0
- package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +64 -0
- package/dist/claude-code/.claude/skills/figma-write/SKILL.md +39 -0
- package/dist/claude-code/.claude/skills/graphify/SKILL.md +49 -0
- package/dist/claude-code/.claude/skills/health/SKILL.md +99 -0
- package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +44 -0
- package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +69 -0
- package/dist/claude-code/.claude/skills/help/SKILL.md +87 -0
- package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +61 -0
- package/dist/claude-code/.claude/skills/locale/SKILL.md +51 -0
- package/dist/claude-code/.claude/skills/map/SKILL.md +89 -0
- package/dist/claude-code/.claude/skills/migrate/SKILL.md +70 -0
- package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +37 -0
- package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +87 -0
- package/dist/claude-code/.claude/skills/new-project/SKILL.md +53 -0
- package/dist/claude-code/.claude/skills/next/SKILL.md +68 -0
- package/dist/claude-code/.claude/skills/note/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +86 -0
- package/dist/claude-code/.claude/skills/optimize/SKILL.md +97 -0
- package/dist/claude-code/.claude/skills/pause/SKILL.md +77 -0
- package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +88 -0
- package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +161 -0
- package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +90 -0
- package/dist/claude-code/.claude/skills/peers/SKILL.md +96 -0
- package/dist/claude-code/.claude/skills/plan/SKILL.md +105 -0
- package/dist/claude-code/.claude/skills/plan/plan-procedure.md +278 -0
- package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +32 -0
- package/dist/claude-code/.claude/skills/progress/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +90 -0
- package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +101 -0
- package/dist/claude-code/.claude/skills/quick/SKILL.md +44 -0
- package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +32 -0
- package/dist/claude-code/.claude/skills/recall/SKILL.md +75 -0
- package/dist/claude-code/.claude/skills/reflect/SKILL.md +85 -0
- package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +120 -0
- package/dist/claude-code/.claude/skills/report-issue/SKILL.md +53 -0
- package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +120 -0
- package/dist/claude-code/.claude/skills/resume/SKILL.md +93 -0
- package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +46 -0
- package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +42 -0
- package/dist/claude-code/.claude/skills/roi/SKILL.md +54 -0
- package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +35 -0
- package/dist/claude-code/.claude/skills/router/SKILL.md +89 -0
- package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +65 -0
- package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +78 -0
- package/dist/claude-code/.claude/skills/router/router-rules.md +84 -0
- package/dist/claude-code/.claude/skills/scan/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/scan/scan-procedure.md +732 -0
- package/dist/claude-code/.claude/skills/settings/SKILL.md +87 -0
- package/dist/claude-code/.claude/skills/ship/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/sketch/SKILL.md +78 -0
- package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +79 -0
- package/dist/claude-code/.claude/skills/spike/SKILL.md +67 -0
- package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +86 -0
- package/dist/claude-code/.claude/skills/start/SKILL.md +67 -0
- package/dist/claude-code/.claude/skills/start/start-procedure.md +115 -0
- package/dist/claude-code/.claude/skills/stats/SKILL.md +51 -0
- package/dist/claude-code/.claude/skills/style/SKILL.md +71 -0
- package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +150 -0
- package/dist/claude-code/.claude/skills/synthesize/SKILL.md +94 -0
- package/dist/claude-code/.claude/skills/timeline/SKILL.md +66 -0
- package/dist/claude-code/.claude/skills/todo/SKILL.md +64 -0
- package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/undo/SKILL.md +31 -0
- package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +54 -0
- package/dist/claude-code/.claude/skills/update/SKILL.md +56 -0
- package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +78 -0
- package/dist/claude-code/.claude/skills/verify/SKILL.md +113 -0
- package/dist/claude-code/.claude/skills/verify/verify-procedure.md +512 -0
- package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +81 -0
- package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +82 -0
- package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +26 -0
- package/package.json +8 -2
- package/reference/DEPRECATIONS.md +21 -7
- 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/registry.json +7 -0
- 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 +71 -0
- 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/build/factory.cjs +62 -0
- package/scripts/lib/build/harness-configs.cjs +64 -0
- package/scripts/lib/manifest/prose-denylist.json +1 -1
- package/sdk/cli/commands/build.ts +106 -0
- package/sdk/cli/index.js +84 -2
- package/sdk/cli/index.ts +7 -0
- 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,4 +1,4 @@
|
|
|
1
|
-
# Badge
|
|
1
|
+
# Badge - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Polaris, Carbon, Radix
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A badge is a compact numeric counter or status indicator overlaid on or beside a parent element (icon, avatar, button) to communicate a count (unread messages, notification count) or status (online, offline, busy). It is purely decorative
|
|
10
|
+
A badge is a compact numeric counter or status indicator overlaid on or beside a parent element (icon, avatar, button) to communicate a count (unread messages, notification count) or status (online, offline, busy). It is purely decorative - the accessible count or status is surfaced through the parent element's `aria-label`. *(Material 3, Polaris, Carbon, Radix agree: badge is decorative; parent carries accessible state)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -36,7 +36,7 @@ A badge is a compact numeric counter or status indicator overlaid on or beside a
|
|
|
36
36
|
| Badge element | Yes | Pill or circle shape containing count or dot |
|
|
37
37
|
| Count / label text | Conditional | Present for count/icon variants; absent for dot |
|
|
38
38
|
| Parent element | Yes (for attached) | Carries `aria-label` with accessible count |
|
|
39
|
-
| Dot indicator | No | Status dot variant
|
|
39
|
+
| Dot indicator | No | Status dot variant - no number, pure color/shape |
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -70,7 +70,7 @@ A badge is a compact numeric counter or status indicator overlaid on or beside a
|
|
|
70
70
|
|---------|-----------|-----------|-----------|-------|
|
|
71
71
|
| Count (sm) | 16px | 16px (= height) | 10px/500 | Single digit fills circle |
|
|
72
72
|
| Count (md) | 20px | 20px (= height) | 12px/500 | Two-digit + "99+" |
|
|
73
|
-
| Dot | 8px | 8px |
|
|
73
|
+
| Dot | 8px | 8px | - | No text; absolute top-right |
|
|
74
74
|
|
|
75
75
|
- **Shape**: pill when width > height; circle when width = height (single digit)
|
|
76
76
|
- **Position** (attached): `position: absolute; top: -4px; right: -4px` relative to parent
|
|
@@ -82,11 +82,11 @@ A badge is a compact numeric counter or status indicator overlaid on or beside a
|
|
|
82
82
|
|
|
83
83
|
## Typography
|
|
84
84
|
|
|
85
|
-
- Count text: 10–12px / 500 (medium weight)
|
|
85
|
+
- Count text: 10–12px / 500 (medium weight) - legible at small scale
|
|
86
86
|
- No wrapping; never truncate count text; use "99+" cap instead
|
|
87
|
-
- Letter-spacing: 0
|
|
87
|
+
- Letter-spacing: 0 - tight spacing at 10–12px scale
|
|
88
88
|
|
|
89
|
-
Cross-link: `reference/typography.md`
|
|
89
|
+
Cross-link: `reference/typography.md` - small label scale (10–12px)
|
|
90
90
|
|
|
91
91
|
---
|
|
92
92
|
|
|
@@ -97,7 +97,7 @@ Cross-link: `reference/typography.md` — small label scale (10–12px)
|
|
|
97
97
|
|
|
98
98
|
### Keyboard Contract
|
|
99
99
|
|
|
100
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
100
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/ - W3C - 2024*
|
|
101
101
|
|
|
102
102
|
| Key | Action |
|
|
103
103
|
|-----|--------|
|
|
@@ -107,14 +107,14 @@ Badge never receives focus. It is a purely visual overlay. All keyboard interact
|
|
|
107
107
|
|
|
108
108
|
### Accessibility Rules
|
|
109
109
|
|
|
110
|
-
- Badge element itself MUST have `aria-hidden="true"`
|
|
110
|
+
- Badge element itself MUST have `aria-hidden="true"` - screen readers should not announce the badge number separately; they read it as part of the parent's `aria-label`
|
|
111
111
|
- Parent element MUST have an `aria-label` that includes the count: `aria-label="Messages, 3 unread"` *(WAI-ARIA APG, Material 3)*
|
|
112
|
-
- Parent `aria-label` MUST be updated dynamically when count changes
|
|
113
|
-
- Zero badge: if badge is hidden at zero, remove it from DOM (or `display: none`)
|
|
112
|
+
- Parent `aria-label` MUST be updated dynamically when count changes - use `aria-live` on the parent if the count changes while the page is rendered *(WCAG 4.1.3)*
|
|
113
|
+
- Zero badge: if badge is hidden at zero, remove it from DOM (or `display: none`) - do NOT leave it with empty text in the DOM *(Polaris)*
|
|
114
114
|
- Dot variant: parent `aria-label` MUST include the status: `aria-label="User profile, status: online"` *(Radix)*
|
|
115
|
-
- Never rely on badge color alone to communicate status
|
|
115
|
+
- Never rely on badge color alone to communicate status - include text in parent `aria-label` *(WCAG 1.4.1)*
|
|
116
116
|
|
|
117
|
-
Cross-link: `reference/accessibility.md`
|
|
117
|
+
Cross-link: `reference/accessibility.md` - dynamic label updates, aria-live
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
@@ -126,9 +126,9 @@ Cross-link: `reference/accessibility.md` — dynamic label updates, aria-live
|
|
|
126
126
|
| Badge appear | 100ms | ease-out | Fade + scale from 0.5 |
|
|
127
127
|
| Badge disappear (at zero) | 80ms | ease-in | Fade + scale to 0 |
|
|
128
128
|
|
|
129
|
-
**BAN**: Continuous bounce animation on badge
|
|
129
|
+
**BAN**: Continuous bounce animation on badge - implies urgency and is distracting; one-shot pulse on value change is acceptable.
|
|
130
130
|
|
|
131
|
-
Cross-link: `reference/motion.md`
|
|
131
|
+
Cross-link: `reference/motion.md` - scale-in/scale-out; `prefers-reduced-motion`: skip all badge animation
|
|
132
132
|
|
|
133
133
|
---
|
|
134
134
|
|
|
@@ -142,9 +142,9 @@ Cross-link: `reference/motion.md` — scale-in/scale-out; `prefers-reduced-motio
|
|
|
142
142
|
|
|
143
143
|
### Don't
|
|
144
144
|
- Don't surface badge count only through color (dot badge without parent label) *(WCAG 1.4.1)*
|
|
145
|
-
- Don't put interactive content in a badge
|
|
146
|
-
- Don't animate badge continuously
|
|
147
|
-
- Don't use badge text as the only accessible notification
|
|
145
|
+
- Don't put interactive content in a badge - it is always decorative *(Material 3, Carbon)*
|
|
146
|
+
- Don't animate badge continuously - one-shot pulse on value change only *(Polaris)*
|
|
147
|
+
- Don't use badge text as the only accessible notification - always update parent `aria-label` *(WAI-ARIA APG)*
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Breadcrumbs
|
|
1
|
+
# Breadcrumbs - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: WAI-ARIA APG, Carbon, Polaris, Material 3, Atlassian
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A breadcrumb trail shows a user's location within a hierarchical navigation structure, providing a supplemental path back to any ancestor page. It is not primary navigation
|
|
10
|
+
A breadcrumb trail shows a user's location within a hierarchical navigation structure, providing a supplemental path back to any ancestor page. It is not primary navigation - the current page is always the last item and is never a link. Breadcrumbs are most valuable in deep hierarchies (> 2 levels) and information-dense applications. *(WAI-ARIA APG breadcrumb pattern, Carbon, Polaris, Material 3, Atlassian all define breadcrumb as a supplemental location indicator)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -26,7 +26,7 @@ A breadcrumb trail shows a user's location within a hierarchical navigation stru
|
|
|
26
26
|
| Part | Required | Notes |
|
|
27
27
|
|------|----------|-------|
|
|
28
28
|
| `<nav>` container | Yes | `role="navigation"` + `aria-label="Breadcrumb"` |
|
|
29
|
-
| `<ol>` list | Yes | Ordered list
|
|
29
|
+
| `<ol>` list | Yes | Ordered list - sequence matters |
|
|
30
30
|
| `<li>` items | Yes | One per level in the path |
|
|
31
31
|
| Ancestor links | Yes | `<a href>` pointing to each ancestor URL |
|
|
32
32
|
| Current page | Yes | Plain text `<span>` (not a link) + `aria-current="page"` |
|
|
@@ -45,7 +45,7 @@ A breadcrumb trail shows a user's location within a hierarchical navigation stru
|
|
|
45
45
|
| Large / heading-inline | Larger type, sits beside or below a page title | Polaris, Atlassian |
|
|
46
46
|
|
|
47
47
|
**Norm** (≥4 systems agree): separator is `aria-hidden`; current page uses `aria-current="page"`; last item is never a link.
|
|
48
|
-
**Diverge**: Polaris uses `>` as separator; Carbon uses `/`; Material 3 uses `›` (chevron). All are acceptable
|
|
48
|
+
**Diverge**: Polaris uses `>` as separator; Carbon uses `/`; Material 3 uses `›` (chevron). All are acceptable - choose to match your product's visual language.
|
|
49
49
|
|
|
50
50
|
---
|
|
51
51
|
|
|
@@ -53,10 +53,10 @@ A breadcrumb trail shows a user's location within a hierarchical navigation stru
|
|
|
53
53
|
|
|
54
54
|
| State | Trigger | Visual | ARIA |
|
|
55
55
|
|-------|---------|--------|------|
|
|
56
|
-
| default |
|
|
57
|
-
| link-hover | pointer over ancestor | Underline or color shift |
|
|
58
|
-
| link-focus | keyboard focus on ancestor | 2px focus-visible ring |
|
|
59
|
-
| current |
|
|
56
|
+
| default | - | Ancestor links + muted separator + current page text | - |
|
|
57
|
+
| link-hover | pointer over ancestor | Underline or color shift | - |
|
|
58
|
+
| link-focus | keyboard focus on ancestor | 2px focus-visible ring | - |
|
|
59
|
+
| current | - | No underline; muted or bold treatment; not clickable | `aria-current="page"` |
|
|
60
60
|
| truncated | path > 4 levels | Middle items hidden; "…" button shown | `aria-label="Show full path"` on ellipsis button |
|
|
61
61
|
|
|
62
62
|
---
|
|
@@ -80,9 +80,9 @@ A breadcrumb trail shows a user's location within a hierarchical navigation stru
|
|
|
80
80
|
- Ancestor links: body-sm, weight 400, `color: --text-link`; underline on hover
|
|
81
81
|
- Current page: body-sm, weight 500 or 600 (bold for emphasis), `color: --text-primary`; no underline
|
|
82
82
|
- Separator: body-sm, `color: --text-subtle`, `aria-hidden="true"`
|
|
83
|
-
- Do not use uppercase or letter-spacing on breadcrumb items
|
|
83
|
+
- Do not use uppercase or letter-spacing on breadcrumb items - they should read as natural path segments
|
|
84
84
|
|
|
85
|
-
Cross-link: `reference/typography.md`
|
|
85
|
+
Cross-link: `reference/typography.md` - body-sm, link color tokens
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -93,7 +93,7 @@ Cross-link: `reference/typography.md` — body-sm, link color tokens
|
|
|
93
93
|
|
|
94
94
|
### Keyboard Contract
|
|
95
95
|
|
|
96
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
96
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/ - W3C - 2024*
|
|
97
97
|
|
|
98
98
|
| Key | Action |
|
|
99
99
|
|-----|--------|
|
|
@@ -103,13 +103,13 @@ Cross-link: `reference/typography.md` — body-sm, link color tokens
|
|
|
103
103
|
|
|
104
104
|
### Accessibility Rules
|
|
105
105
|
|
|
106
|
-
- `aria-current="page"` MUST be on the last item (current page)
|
|
107
|
-
- Separators MUST be `aria-hidden="true"`
|
|
108
|
-
- The current page item MUST NOT be a link
|
|
106
|
+
- `aria-current="page"` MUST be on the last item (current page) - this is the primary AT signal
|
|
107
|
+
- Separators MUST be `aria-hidden="true"` - screen readers should announce "Home, Products, Widget Pro" not "Home › Products › Widget Pro"
|
|
108
|
+
- The current page item MUST NOT be a link - it is the user's current location
|
|
109
109
|
- `<ol>` conveys that order matters; do not use `<ul>` or a `<div>` list
|
|
110
110
|
- `aria-label="Breadcrumb"` distinguishes this nav from primary/secondary navigation landmarks
|
|
111
111
|
|
|
112
|
-
Cross-link: `reference/accessibility.md`
|
|
112
|
+
Cross-link: `reference/accessibility.md` - aria-current, landmark labelling
|
|
113
113
|
|
|
114
114
|
---
|
|
115
115
|
|
|
@@ -120,25 +120,25 @@ Cross-link: `reference/accessibility.md` — aria-current, landmark labelling
|
|
|
120
120
|
| Ellipsis expand | 150ms | ease-out | Reveal hidden items inline |
|
|
121
121
|
| Ellipsis collapse | 120ms | ease-in | Hide middle items |
|
|
122
122
|
|
|
123
|
-
**BAN**: Do not animate the breadcrumb trail on route change
|
|
123
|
+
**BAN**: Do not animate the breadcrumb trail on route change - route transitions are the page's responsibility, not the breadcrumb's.
|
|
124
124
|
|
|
125
|
-
Cross-link: `reference/motion.md`
|
|
125
|
+
Cross-link: `reference/motion.md` - layout transitions
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
129
129
|
## Do / Don't
|
|
130
130
|
|
|
131
131
|
### Do
|
|
132
|
-
- Use `<ol>` for the list
|
|
133
|
-
- Mark the current page with `aria-current="page"`
|
|
132
|
+
- Use `<ol>` for the list - order is meaningful in a hierarchical path *(WAI-ARIA APG)*
|
|
133
|
+
- Mark the current page with `aria-current="page"` - not just a CSS class *(WAI-ARIA APG, Atlassian)*
|
|
134
134
|
- Hide separators with `aria-hidden="true"` *(WAI-ARIA APG, Carbon, Polaris)*
|
|
135
135
|
- Truncate middle items (not first/last) when path exceeds 4 levels *(Carbon, Polaris, Atlassian)*
|
|
136
136
|
|
|
137
137
|
### Don't
|
|
138
|
-
- Don't make the current page item a link
|
|
139
|
-
- Don't include separator text inside link labels
|
|
140
|
-
- Don't use breadcrumbs as the only navigation method
|
|
141
|
-
- Don't truncate the root or current page items
|
|
138
|
+
- Don't make the current page item a link - it creates a circular self-referential link *(WAI-ARIA APG)*
|
|
139
|
+
- Don't include separator text inside link labels - `aria-hidden` the separator element, not the link *(WAI-ARIA APG)*
|
|
140
|
+
- Don't use breadcrumbs as the only navigation method - they supplement; primary nav is required *(Material 3, Polaris)*
|
|
141
|
+
- Don't truncate the root or current page items - users need anchoring context at both ends *(Carbon, Atlassian)*
|
|
142
142
|
|
|
143
143
|
---
|
|
144
144
|
|
|
@@ -146,7 +146,7 @@ Cross-link: `reference/motion.md` — layout transitions
|
|
|
146
146
|
|
|
147
147
|
| Anti-pattern | Entry |
|
|
148
148
|
|--------------|-------|
|
|
149
|
-
| BAN-07 | Missing `aria-current` on active navigation items
|
|
149
|
+
| BAN-07 | Missing `aria-current` on active navigation items - `reference/anti-patterns.md#ban-07` |
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Button
|
|
1
|
+
# Button - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Polaris, Carbon, Fluent 2, Radix, shadcn/ui, Primer, Atlassian
|
|
4
4
|
**Wave**: 1 · **Category**: Inputs
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A button triggers a discrete action in the current context
|
|
10
|
+
A button triggers a discrete action in the current context - submitting a form, opening a dialog, executing a command. It is not a navigation element (use Link for href-based navigation). Buttons have an explicit visual affordance of clickability and must communicate their current state (loading, disabled) clearly. *(Material 3, Carbon, Polaris agree: button = action trigger, not navigation)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -42,7 +42,7 @@ A button triggers a discrete action in the current context — submitting a form
|
|
|
42
42
|
| Link-style | Looks like link, behaves as button | Carbon, Primer |
|
|
43
43
|
|
|
44
44
|
**Norm** (≥6/18 systems agree): primary/secondary/ghost hierarchy; one primary per viewport section.
|
|
45
|
-
**Diverge**: "tertiary" naming (Material 3) vs. "ghost" (Carbon) vs. "plain" (Polaris)
|
|
45
|
+
**Diverge**: "tertiary" naming (Material 3) vs. "ghost" (Carbon) vs. "plain" (Polaris) - same visual intent, different labels.
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
@@ -50,15 +50,15 @@ A button triggers a discrete action in the current context — submitting a form
|
|
|
50
50
|
|
|
51
51
|
| State | Trigger | Visual | ARIA |
|
|
52
52
|
|-------|---------|--------|------|
|
|
53
|
-
| default |
|
|
54
|
-
| hover | pointer over | 8% overlay (light) / 8% overlay (dark) |
|
|
55
|
-
| focus | keyboard focus | 2px focus-visible ring, 2px offset |
|
|
56
|
-
| active / pressed | mousedown / Space / Enter | 12% overlay; scale 0.96 |
|
|
53
|
+
| default | - | Resting fill/border | - |
|
|
54
|
+
| hover | pointer over | 8% overlay (light) / 8% overlay (dark) | - |
|
|
55
|
+
| focus | keyboard focus | 2px focus-visible ring, 2px offset | - |
|
|
56
|
+
| active / pressed | mousedown / Space / Enter | 12% overlay; scale 0.96 | - |
|
|
57
57
|
| disabled | `disabled` attr | 38% opacity; cursor: not-allowed | `disabled` attr |
|
|
58
58
|
| loading | async action in flight | Spinner, `aria-busy="true"` | `aria-busy="true"` |
|
|
59
59
|
|
|
60
60
|
**Norm**: 96% scale on press (Material 3, shadcn, Carbon confirm). 38% opacity for disabled (Material 3 spec).
|
|
61
|
-
**Diverge**: hover overlay vs. background tint
|
|
61
|
+
**Diverge**: hover overlay vs. background tint - systems use either approach; overlay is more theme-portable.
|
|
62
62
|
|
|
63
63
|
---
|
|
64
64
|
|
|
@@ -71,17 +71,17 @@ A button triggers a discrete action in the current context — submitting a form
|
|
|
71
71
|
| lg | 48px | 24px | 96px | 16px/500 |
|
|
72
72
|
|
|
73
73
|
**Norm**: 40px default height (Carbon, Polaris, Fluent all confirm). Min-width prevents single-character buttons.
|
|
74
|
-
Cross-link: `reference/surfaces.md`
|
|
74
|
+
Cross-link: `reference/surfaces.md` - hit-area rule (minimum 44×44px accessible tap target via padding, not height).
|
|
75
75
|
|
|
76
76
|
---
|
|
77
77
|
|
|
78
78
|
## Typography
|
|
79
79
|
|
|
80
|
-
- Weight: 500 (medium)
|
|
80
|
+
- Weight: 500 (medium) - not bold; distinguishes from body text without being heavy *(Material 3, Carbon)*
|
|
81
81
|
- Letter-spacing: +0.01em for sm/md, 0 for lg
|
|
82
|
-
- No text truncation
|
|
82
|
+
- No text truncation - resize button or use icon-only variant; truncated button labels break affordance
|
|
83
83
|
|
|
84
|
-
Cross-link: `reference/typography.md`
|
|
84
|
+
Cross-link: `reference/typography.md` - tabular-nums rule (use on loading counters, not labels)
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
@@ -92,7 +92,7 @@ Cross-link: `reference/typography.md` — tabular-nums rule (use on loading coun
|
|
|
92
92
|
|
|
93
93
|
### Keyboard Contract
|
|
94
94
|
|
|
95
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
95
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/button/ - W3C - 2024*
|
|
96
96
|
|
|
97
97
|
| Key | Action |
|
|
98
98
|
|-----|--------|
|
|
@@ -101,7 +101,7 @@ Cross-link: `reference/typography.md` — tabular-nums rule (use on loading coun
|
|
|
101
101
|
|
|
102
102
|
### Accessibility Rules
|
|
103
103
|
|
|
104
|
-
- Icon-only buttons MUST have `aria-label` or `aria-labelledby`
|
|
104
|
+
- Icon-only buttons MUST have `aria-label` or `aria-labelledby` - a tooltip is not a substitute
|
|
105
105
|
- Loading state: set `aria-busy="true"` and disable pointer events; announce completion via `aria-live`
|
|
106
106
|
- Disabled: use native `disabled` attribute (not `aria-disabled`) unless button must remain focusable for tooltip explanation
|
|
107
107
|
- Never use `<div>` or `<a>` as a button trigger without `role="button"` and keyboard handlers
|
|
@@ -119,9 +119,9 @@ Cross-link: `reference/accessibility.md`
|
|
|
119
119
|
| press scale (0.96) | 80ms | ease-in | Immediate tactile feedback |
|
|
120
120
|
| loading spinner in | 150ms | ease-out | Replaces or overlays label |
|
|
121
121
|
|
|
122
|
-
**BAN**: `transition: all`
|
|
122
|
+
**BAN**: `transition: all` - catches width change on loading and causes layout jank.
|
|
123
123
|
|
|
124
|
-
Cross-link: `reference/motion.md`
|
|
124
|
+
Cross-link: `reference/motion.md` - canonical scale-on-press 0.96, BAN-04 (`transition: all`)
|
|
125
125
|
|
|
126
126
|
---
|
|
127
127
|
|
|
@@ -134,10 +134,10 @@ Cross-link: `reference/motion.md` — canonical scale-on-press 0.96, BAN-04 (`tr
|
|
|
134
134
|
- Maintain 8px minimum spacing between adjacent buttons *(Carbon, Fluent)*
|
|
135
135
|
|
|
136
136
|
### Don't
|
|
137
|
-
- Don't use a button for navigation to another page
|
|
138
|
-
- Don't disable a button without explaining why
|
|
139
|
-
- Don't use "Click here" or "Submit" as labels
|
|
140
|
-
- Don't truncate button labels
|
|
137
|
+
- Don't use a button for navigation to another page - use `<a href>` (Link) *(Carbon, Primer)*
|
|
138
|
+
- Don't disable a button without explaining why - prefer showing error state after submission *(Polaris)*
|
|
139
|
+
- Don't use "Click here" or "Submit" as labels - be specific about the action *(Polaris, Carbon)*
|
|
140
|
+
- Don't truncate button labels - buttons must fit their content *(Fluent, Atlassian)*
|
|
141
141
|
|
|
142
142
|
---
|
|
143
143
|
|
|
@@ -145,7 +145,7 @@ Cross-link: `reference/motion.md` — canonical scale-on-press 0.96, BAN-04 (`tr
|
|
|
145
145
|
|
|
146
146
|
| Anti-pattern | Entry |
|
|
147
147
|
|--------------|-------|
|
|
148
|
-
| BAN-04 | `transition: all` on interactive elements
|
|
148
|
+
| BAN-04 | `transition: all` on interactive elements - `reference/anti-patterns.md#ban-04` |
|
|
149
149
|
|
|
150
150
|
---
|
|
151
151
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Card
|
|
1
|
+
# Card - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Polaris, Carbon, Atlassian, Mantine, shadcn/ui, Ant Design, Fluent 2
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A card is a contained surface that groups related information and actions. It is a visual container, not a navigation element by default
|
|
10
|
+
A card is a contained surface that groups related information and actions. It is a visual container, not a navigation element by default - only make the entire card clickable when the primary action is navigation and there is a single dominant action. Mixed-content cards with multiple actions should not be entirely clickable. *(Material 3, Polaris, Carbon all agree on this boundary)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -48,7 +48,7 @@ A card is a contained surface that groups related information and actions. It is
|
|
|
48
48
|
| Compact | Dense layout; no media | Carbon, Fluent |
|
|
49
49
|
|
|
50
50
|
**Norm** (≥5/18): outlined or elevated; ≤2 actions per card.
|
|
51
|
-
**Diverge**: elevation vs. outline
|
|
51
|
+
**Diverge**: elevation vs. outline - both are valid; use elevated for content that needs to float (dashboards), outlined for dense lists (tables of cards).
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
@@ -56,10 +56,10 @@ A card is a contained surface that groups related information and actions. It is
|
|
|
56
56
|
|
|
57
57
|
| State | Trigger | Visual | ARIA/HTML |
|
|
58
58
|
|-------|---------|--------|-----------|
|
|
59
|
-
| default |
|
|
60
|
-
| hover (clickable) | pointer | Shadow deepens or border darkens |
|
|
61
|
-
| focus (clickable) | keyboard | 2px focus ring on outer card |
|
|
62
|
-
| active (clickable) | mousedown | Scale 0.99 |
|
|
59
|
+
| default | - | Resting surface | - |
|
|
60
|
+
| hover (clickable) | pointer | Shadow deepens or border darkens | - |
|
|
61
|
+
| focus (clickable) | keyboard | 2px focus ring on outer card | - |
|
|
62
|
+
| active (clickable) | mousedown | Scale 0.99 | - |
|
|
63
63
|
| selected | programmatic | Border + background tint | `aria-selected="true"` |
|
|
64
64
|
| loading | async content | Skeleton placeholder | `aria-busy="true"` |
|
|
65
65
|
| disabled | programmatic | 38% opacity | `aria-disabled="true"` |
|
|
@@ -77,7 +77,7 @@ A card is a contained surface that groups related information and actions. It is
|
|
|
77
77
|
| Max width | 480px (typical) | Grid controls actual width; max-width is a guideline |
|
|
78
78
|
| Gap between cards | 16px (sm grid), 24px (md grid) | |
|
|
79
79
|
|
|
80
|
-
Cross-link: `reference/surfaces.md`
|
|
80
|
+
Cross-link: `reference/surfaces.md` - concentric radius, 3-layer shadow formula, elevation tokens
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -96,14 +96,14 @@ Cross-link: `reference/surfaces.md` — concentric radius, 3-layer shadow formul
|
|
|
96
96
|
|
|
97
97
|
### Clickable Card Rules
|
|
98
98
|
|
|
99
|
-
*Per WAI-ARIA APG link + button patterns
|
|
99
|
+
*Per WAI-ARIA APG link + button patterns - W3C - 2024*
|
|
100
100
|
|
|
101
101
|
| Invocation | Element | Key |
|
|
102
102
|
|------------|---------|-----|
|
|
103
103
|
| Navigate to new page | `<a href>` wrapping or inside card | Enter |
|
|
104
104
|
| Trigger action in context | `<button>` wrapping or inside card | Enter, Space |
|
|
105
105
|
|
|
106
|
-
- **Do not wrap an entire card in `<a>` if it contains other interactive elements** (links, buttons inside)
|
|
106
|
+
- **Do not wrap an entire card in `<a>` if it contains other interactive elements** (links, buttons inside) - nested interactive elements are inaccessible by keyboard
|
|
107
107
|
- Use the "card with primary action + secondary actions" pattern: one `<a>` stretched via `::after` pseudo-element to fill the card; secondary action buttons sit above in stacking context
|
|
108
108
|
|
|
109
109
|
### Accessibility Rules
|
|
@@ -123,7 +123,7 @@ Cross-link: `reference/surfaces.md` — concentric radius, 3-layer shadow formul
|
|
|
123
123
|
| press scale | 80ms | ease | 1→0.99 (subtle; card is large) |
|
|
124
124
|
| skeleton shimmer | 1.5s | linear loop | Respect `prefers-reduced-motion` |
|
|
125
125
|
|
|
126
|
-
Cross-link: `reference/motion.md`
|
|
126
|
+
Cross-link: `reference/motion.md` - Skeleton shimmer pattern, `prefers-reduced-motion`
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
@@ -139,7 +139,7 @@ Cross-link: `reference/motion.md` — Skeleton shimmer pattern, `prefers-reduced
|
|
|
139
139
|
- Don't wrap the entire card in `<a>` if it contains other interactive elements *(WAI-ARIA APG)*
|
|
140
140
|
- Don't use `<div>` as a clickable card without `role="button"` or `role="link"` + keyboard handler *(WAI-ARIA APG)*
|
|
141
141
|
- Don't place the entire card title in a plain `<span>` when it could be `<h2>/<h3>` *(Atlassian, Carbon)*
|
|
142
|
-
- Don't use more than 2 primary actions per card
|
|
142
|
+
- Don't use more than 2 primary actions per card - extract to a detail view *(Material 3, Polaris)*
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
@@ -197,4 +197,4 @@ grep -rn 'class.*card' src/ | xargs grep -L 'h[1-6]\|aria-label' 2>/dev/null
|
|
|
197
197
|
|
|
198
198
|
**Why it fails**: Nested `<button>` inside `<a>` is invalid HTML. Keyboard users pressing Tab inside the link may reach the button, but Enter on the button may also trigger the link. Screen reader behavior is unpredictable.
|
|
199
199
|
**Grep detection**: `grep -rn '<a.*href' src/ | xargs grep -l '<button' 2>/dev/null`
|
|
200
|
-
**Fix**: Use the stretched-link pattern
|
|
200
|
+
**Fix**: Use the stretched-link pattern - `<h3><a href="/product/42">Product Name</a></h3>` with `::after { position: absolute; inset: 0; }` on the `<a>`, and position the "Add to cart" button above via `position: relative; z-index: 1`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Checkbox
|
|
1
|
+
# Checkbox - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Polaris, Ant Design, WAI-ARIA APG, Mantine, Chakra UI, Atlassian
|
|
4
4
|
**Wave**: 1 · **Category**: Inputs
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A checkbox allows the user to select or deselect a binary option, or to represent an indeterminate state (partially selected group). Checkboxes are independent
|
|
10
|
+
A checkbox allows the user to select or deselect a binary option, or to represent an indeterminate state (partially selected group). Checkboxes are independent - selecting one does not affect others. Use radio buttons for mutually exclusive choices within a group. Always group related checkboxes in a `<fieldset>` with a `<legend>`.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -31,7 +31,7 @@ Group:
|
|
|
31
31
|
| Part | Required | Notes |
|
|
32
32
|
|------|----------|-------|
|
|
33
33
|
| Input / control | Yes | Native `<input type="checkbox">` preferred |
|
|
34
|
-
| Label | Yes | `<label for="id">`
|
|
34
|
+
| Label | Yes | `<label for="id">` - click zone includes label text |
|
|
35
35
|
| Fieldset + legend | Yes (group) | Required when ≥2 related checkboxes |
|
|
36
36
|
| Helper text | No | Below label; `aria-describedby` |
|
|
37
37
|
| Error message | Conditional | Field-level or group-level |
|
|
@@ -49,8 +49,8 @@ Group:
|
|
|
49
49
|
| Group | ≥2 checkboxes in `<fieldset>` | All |
|
|
50
50
|
| With description | Label + helper text below | Material 3, Polaris, Carbon |
|
|
51
51
|
|
|
52
|
-
**Norm** (≥6/18): indeterminate state is a visual-only UI state
|
|
53
|
-
**Diverge**: size
|
|
52
|
+
**Norm** (≥6/18): indeterminate state is a visual-only UI state - the underlying `checked` value is still boolean; set via DOM `.indeterminate` property, not HTML attribute.
|
|
53
|
+
**Diverge**: size - Material 3 uses 18px; Carbon 16px; Polaris 16px; Ant 14–16px. 16px is the de-facto norm.
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
@@ -61,8 +61,8 @@ Group:
|
|
|
61
61
|
| unchecked | default | Empty box | `aria-checked="false"` |
|
|
62
62
|
| checked | user interaction | Checkmark | `aria-checked="true"` |
|
|
63
63
|
| indeterminate | set via JS | Dash / minus | `aria-checked="mixed"` |
|
|
64
|
-
| hover | pointer over | Box border darkens |
|
|
65
|
-
| focus | keyboard | 2px focus ring around box |
|
|
64
|
+
| hover | pointer over | Box border darkens | - |
|
|
65
|
+
| focus | keyboard | 2px focus ring around box | - |
|
|
66
66
|
| disabled unchecked | `disabled` | 38% opacity | `aria-disabled="true"` |
|
|
67
67
|
| disabled checked | `disabled` | 38% opacity + check | `aria-disabled="true"` |
|
|
68
68
|
| error | validation | Red box border | `aria-invalid="true"` |
|
|
@@ -79,14 +79,14 @@ Group:
|
|
|
79
79
|
| Group item spacing | 8px vertical between items | *(Carbon, Material 3)* |
|
|
80
80
|
| Indentation (nested) | 24px | When showing hierarchical groups |
|
|
81
81
|
|
|
82
|
-
Cross-link: `reference/surfaces.md`
|
|
82
|
+
Cross-link: `reference/surfaces.md` - hit-area pseudo-element pattern (44×44px minimum touch target)
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
86
86
|
## Typography
|
|
87
87
|
|
|
88
|
-
- Label: 14px/400; same weight as body
|
|
89
|
-
- Legend: 14px/500 or 12px/600 uppercase
|
|
88
|
+
- Label: 14px/400; same weight as body - checkboxes are options, not headings
|
|
89
|
+
- Legend: 14px/500 or 12px/600 uppercase - distinguishes group from items
|
|
90
90
|
- Helper/error: 12px/400
|
|
91
91
|
|
|
92
92
|
---
|
|
@@ -98,20 +98,20 @@ Cross-link: `reference/surfaces.md` — hit-area pseudo-element pattern (44×44p
|
|
|
98
98
|
|
|
99
99
|
### Keyboard Contract
|
|
100
100
|
|
|
101
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
101
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/ - W3C - 2024*
|
|
102
102
|
|
|
103
103
|
| Key | Action |
|
|
104
104
|
|-----|--------|
|
|
105
105
|
| Tab | Moves focus to the checkbox |
|
|
106
106
|
| Space | Toggles the checkbox state (checked / unchecked / indeterminate) |
|
|
107
107
|
|
|
108
|
-
Within a group: Tab moves between checkboxes (not arrow keys
|
|
108
|
+
Within a group: Tab moves between checkboxes (not arrow keys - checkboxes are independent).
|
|
109
109
|
|
|
110
110
|
### Accessibility Rules
|
|
111
111
|
|
|
112
|
-
- Label MUST be associated via `<label for="id">`
|
|
113
|
-
- `<fieldset>` + `<legend>` MUST wrap every group of related checkboxes
|
|
114
|
-
- Indeterminate state MUST be set via JS `.indeterminate = true`
|
|
112
|
+
- Label MUST be associated via `<label for="id">` - clicking the label must toggle the checkbox
|
|
113
|
+
- `<fieldset>` + `<legend>` MUST wrap every group of related checkboxes - the legend provides group context to screen readers
|
|
114
|
+
- Indeterminate state MUST be set via JS `.indeterminate = true` - there is no HTML attribute; `aria-checked="mixed"` must be set simultaneously on `role="checkbox"` elements
|
|
115
115
|
- Disabled checkboxes: use native `disabled` attribute for form semantics; `aria-disabled="true"` if the element must remain in tab order (e.g. with explanatory tooltip)
|
|
116
116
|
- Error state: `aria-invalid="true"` on the control; group-level error on the `<fieldset>` via `aria-describedby`
|
|
117
117
|
|
|
@@ -125,7 +125,7 @@ Within a group: Tab moves between checkboxes (not arrow keys — checkboxes are
|
|
|
125
125
|
| indeterminate dash | 120ms | ease | Width animation of dash element |
|
|
126
126
|
| hover border | 80ms | ease | Border colour only |
|
|
127
127
|
|
|
128
|
-
Cross-link: `reference/motion.md`
|
|
128
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip path animation, show fill instantly
|
|
129
129
|
|
|
130
130
|
---
|
|
131
131
|
|
|
@@ -138,10 +138,10 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip path animat
|
|
|
138
138
|
- Align label text to the top of the control in multiline label scenarios *(Carbon)*
|
|
139
139
|
|
|
140
140
|
### Don't
|
|
141
|
-
- Don't use checkboxes for mutually exclusive options
|
|
141
|
+
- Don't use checkboxes for mutually exclusive options - use radio buttons *(Material 3, Carbon, Polaris)*
|
|
142
142
|
- Don't use a custom `<div>` checkbox without `role="checkbox"` and keyboard handler *(WAI-ARIA APG)*
|
|
143
|
-
- Don't set `aria-checked="mixed"` via HTML attribute
|
|
144
|
-
- Don't rely on colour alone for checked state
|
|
143
|
+
- Don't set `aria-checked="mixed"` via HTML attribute - it must be set dynamically *(WAI-ARIA APG)*
|
|
144
|
+
- Don't rely on colour alone for checked state - always include a visible checkmark *(WCAG 1.4.1)*
|
|
145
145
|
|
|
146
146
|
---
|
|
147
147
|
|
|
@@ -195,7 +195,7 @@ grep -rn 'indeterminate' src/ | grep 'setAttribute\|attr(' | grep '"true"'
|
|
|
195
195
|
</div>
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
**Why it fails**: Screen readers announce each option without the group context ("Email
|
|
198
|
+
**Why it fails**: Screen readers announce each option without the group context ("Email - checkbox") - users don't know what these options belong to without reading surrounding text.
|
|
199
199
|
**Grep detection**: `grep -B5 'type="checkbox"' src/ | grep -v 'fieldset\|role="group"'`
|
|
200
200
|
**Fix**:
|
|
201
201
|
```html
|