@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,4 +1,4 @@
|
|
|
1
|
-
# Accordion
|
|
1
|
+
# Accordion - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: WAI-ARIA APG, Radix UI, Carbon, Chakra UI, Material 3, Mantine, shadcn/ui, Atlassian
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
An accordion is a vertically stacked set of headers that each reveal or conceal an associated section of content when activated. It reduces visual clutter by hiding content that is not immediately relevant. The header MUST be a button (or have `role="button"`)
|
|
10
|
+
An accordion is a vertically stacked set of headers that each reveal or conceal an associated section of content when activated. It reduces visual clutter by hiding content that is not immediately relevant. The header MUST be a button (or have `role="button"`) - users must be able to activate sections by keyboard. *(WAI-ARIA APG, Radix, Carbon all agree)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -47,7 +47,7 @@ An accordion is a vertically stacked set of headers that each reveal or conceal
|
|
|
47
47
|
| With icon | Leading icon per header | Carbon, Atlassian |
|
|
48
48
|
|
|
49
49
|
**Norm** (≥5/18): chevron icon rotates on open (180°); panel animates height.
|
|
50
|
-
**Diverge**: single-open vs. multi-open
|
|
50
|
+
**Diverge**: single-open vs. multi-open - Radix defaults to multi-open (more flexible); Material 3 defaults to single-open (simpler UX). Multi-open is safer for long FAQ pages where users may want to compare sections.
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
@@ -57,8 +57,8 @@ An accordion is a vertically stacked set of headers that each reveal or conceal
|
|
|
57
57
|
|-------|---------|--------|------|
|
|
58
58
|
| collapsed | default | Panel hidden | `aria-expanded="false"` on button |
|
|
59
59
|
| expanded | button activated | Panel visible | `aria-expanded="true"` on button |
|
|
60
|
-
| hover | pointer over header | Header background tint |
|
|
61
|
-
| focus | keyboard | 2px focus ring on button |
|
|
60
|
+
| hover | pointer over header | Header background tint | - |
|
|
61
|
+
| focus | keyboard | 2px focus ring on button | - |
|
|
62
62
|
| disabled | programmatic | 38% opacity; non-interactive | `aria-disabled="true"` on button |
|
|
63
63
|
|
|
64
64
|
---
|
|
@@ -77,7 +77,7 @@ An accordion is a vertically stacked set of headers that each reveal or conceal
|
|
|
77
77
|
|
|
78
78
|
## Typography
|
|
79
79
|
|
|
80
|
-
- Header: 14–16px/500
|
|
80
|
+
- Header: 14–16px/500 - slightly heavier than panel body
|
|
81
81
|
- Panel body: 14px/400
|
|
82
82
|
- Disabled header: same size, 38% opacity
|
|
83
83
|
|
|
@@ -91,7 +91,7 @@ An accordion is a vertically stacked set of headers that each reveal or conceal
|
|
|
91
91
|
|
|
92
92
|
### Keyboard Contract
|
|
93
93
|
|
|
94
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
94
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/accordion/ - W3C - 2024*
|
|
95
95
|
|
|
96
96
|
| Key | Action |
|
|
97
97
|
|-----|--------|
|
|
@@ -107,12 +107,12 @@ Arrow/Home/End navigation is optional; Tab navigation between headers is always
|
|
|
107
107
|
|
|
108
108
|
### Accessibility Rules
|
|
109
109
|
|
|
110
|
-
- Header MUST be wrapped in an `<h2>`–`<h6>` tag to maintain document outline
|
|
111
|
-
- The trigger MUST be a `<button>` (or `role="button"`)
|
|
110
|
+
- Header MUST be wrapped in an `<h2>`–`<h6>` tag to maintain document outline - the heading level should match the surrounding page hierarchy
|
|
111
|
+
- The trigger MUST be a `<button>` (or `role="button"`) - `<div>` headers are inaccessible by keyboard
|
|
112
112
|
- `aria-expanded` MUST be on the trigger button, not the panel
|
|
113
|
-
- Panel SHOULD have `role="region"` + `aria-labelledby` referencing the trigger button id
|
|
113
|
+
- Panel SHOULD have `role="region"` + `aria-labelledby` referencing the trigger button id - this creates a named region for landmark navigation
|
|
114
114
|
- `role="region"` should be omitted if there are more than 6 accordions (too many regions = noisy landmark nav)
|
|
115
|
-
- Avoid `display:none` for the panel in open state
|
|
115
|
+
- Avoid `display:none` for the panel in open state - use `hidden` or height animation
|
|
116
116
|
|
|
117
117
|
---
|
|
118
118
|
|
|
@@ -131,7 +131,7 @@ Arrow/Home/End navigation is optional; Tab navigation between headers is always
|
|
|
131
131
|
.panel > div { overflow: hidden; }
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
Cross-link: `reference/motion.md`
|
|
134
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip height animation, instant toggle
|
|
135
135
|
|
|
136
136
|
---
|
|
137
137
|
|
|
@@ -140,13 +140,13 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip height anim
|
|
|
140
140
|
### Do
|
|
141
141
|
- Wrap header triggers in proper heading tags (`<h2>`–`<h6>`) *(WAI-ARIA APG, Carbon)*
|
|
142
142
|
- Use `aria-expanded` on the trigger button, not on the panel *(WAI-ARIA APG)*
|
|
143
|
-
- Animate height with `grid-template-rows` trick
|
|
143
|
+
- Animate height with `grid-template-rows` trick - no JS height measurement needed *(CSS-only pattern)*
|
|
144
144
|
- Support Tab navigation between accordion headers at minimum *(WAI-ARIA APG)*
|
|
145
145
|
|
|
146
146
|
### Don't
|
|
147
147
|
- Don't use `<div>` as the accordion header without `role="button"` *(WAI-ARIA APG)*
|
|
148
|
-
- Don't use `display:none` to hide the panel in collapsed state if you want animation
|
|
149
|
-
- Don't use `role="region"` for more than 6 accordions
|
|
148
|
+
- Don't use `display:none` to hide the panel in collapsed state if you want animation - use CSS grid trick *(CSS pattern)*
|
|
149
|
+
- Don't use `role="region"` for more than 6 accordions - excessive landmarks harm screen reader navigation *(WAI-ARIA APG note)*
|
|
150
150
|
- Don't auto-close other panels in a "single-open" accordion without announcing the change *(Atlassian)*
|
|
151
151
|
|
|
152
152
|
---
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Alert / Banner
|
|
1
|
+
# Alert / Banner - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3 (Banner), Carbon (InlineNotification), Polaris (Banner), Atlassian (SectionMessage)
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
An alert (inline notification or banner) is a persistent in-page message that communicates status, warnings, or errors relevant to the current context. Unlike Toast, it does not auto-dismiss
|
|
10
|
+
An alert (inline notification or banner) is a persistent in-page message that communicates status, warnings, or errors relevant to the current context. Unlike Toast, it does not auto-dismiss - it remains visible until the user dismisses it or the underlying condition resolves. Use alert for messages that require acknowledgement or that must remain visible for reference. *(Material 3, Carbon, Polaris, Atlassian agree: alert = persistent inline feedback)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -43,7 +43,7 @@ An alert (inline notification or banner) is a persistent in-page message that co
|
|
|
43
43
|
| Warning | Amber; potentially harmful condition; `role="alert"` assertive | All |
|
|
44
44
|
| Error | Red; failure or blocking condition; `role="alert"` assertive | All |
|
|
45
45
|
|
|
46
|
-
**Norm** (≥4/18 systems agree): four-variant semantic model (info/success/warning/error) with matching color, icon, and role. Icon is REQUIRED
|
|
46
|
+
**Norm** (≥4/18 systems agree): four-variant semantic model (info/success/warning/error) with matching color, icon, and role. Icon is REQUIRED - color alone violates WCAG 1.4.1.
|
|
47
47
|
**Diverge**: Atlassian names this "SectionMessage" and omits dismiss; Carbon always includes an X; Polaris supports titled and untitled variants; Material 3 "Banner" supports one CTA only.
|
|
48
48
|
|
|
49
49
|
---
|
|
@@ -53,8 +53,8 @@ An alert (inline notification or banner) is a persistent in-page message that co
|
|
|
53
53
|
| State | Trigger | Visual | ARIA |
|
|
54
54
|
|-------|---------|--------|------|
|
|
55
55
|
| visible | render | Full opacity, inline position | `role="alert"` or `role="status"` |
|
|
56
|
-
| hover | pointer over action | Action underline / background change |
|
|
57
|
-
| focus | keyboard on action/dismiss | focus-visible ring on button |
|
|
56
|
+
| hover | pointer over action | Action underline / background change | - |
|
|
57
|
+
| focus | keyboard on action/dismiss | focus-visible ring on button | - |
|
|
58
58
|
| dismissed | click dismiss button | Collapsed / removed | Removed from DOM |
|
|
59
59
|
|
|
60
60
|
---
|
|
@@ -78,11 +78,11 @@ An alert (inline notification or banner) is a persistent in-page message that co
|
|
|
78
78
|
|
|
79
79
|
## Typography
|
|
80
80
|
|
|
81
|
-
- Title: label-md (14px/600)
|
|
82
|
-
- Message: body-sm (14px/400)
|
|
83
|
-
- Action: label-sm (13px/500)
|
|
81
|
+
- Title: label-md (14px/600) - gives quick scannable context for complex errors
|
|
82
|
+
- Message: body-sm (14px/400) - readable at inline scale
|
|
83
|
+
- Action: label-sm (13px/500) - matches action button label weight
|
|
84
84
|
|
|
85
|
-
Cross-link: `reference/typography.md`
|
|
85
|
+
Cross-link: `reference/typography.md` - body-sm, label-md definitions
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -93,7 +93,7 @@ Cross-link: `reference/typography.md` — body-sm, label-md definitions
|
|
|
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/alert/ - W3C - 2024*
|
|
97
97
|
|
|
98
98
|
| Key | Action |
|
|
99
99
|
|-----|--------|
|
|
@@ -105,14 +105,14 @@ The alert container itself is not focusable. Child buttons follow standard butto
|
|
|
105
105
|
|
|
106
106
|
### Accessibility Rules
|
|
107
107
|
|
|
108
|
-
- Icon MUST be `aria-hidden="true"`
|
|
109
|
-
- Color MUST NOT be the sole differentiator between variants
|
|
110
|
-
- `role="alert"` causes immediate assertion by screen readers
|
|
111
|
-
- `role="status"` uses a polite live region
|
|
108
|
+
- Icon MUST be `aria-hidden="true"` - the icon is decorative reinforcement; the `role` and text carry the semantic meaning *(WCAG 1.4.1)*
|
|
109
|
+
- Color MUST NOT be the sole differentiator between variants - icon shape and text label must also differ *(WCAG 1.4.1)*
|
|
110
|
+
- `role="alert"` causes immediate assertion by screen readers - only use for error and warning severity
|
|
111
|
+
- `role="status"` uses a polite live region - appropriate for info and success
|
|
112
112
|
- Dismiss button MUST have `aria-label` (e.g. `aria-label="Dismiss warning"`) *(WAI-ARIA APG)*
|
|
113
|
-
- Do NOT auto-dismiss alerts
|
|
113
|
+
- Do NOT auto-dismiss alerts - that is Toast's job; alert stays until explicitly dismissed *(Carbon, Polaris)*
|
|
114
114
|
|
|
115
|
-
Cross-link: `reference/accessibility.md`
|
|
115
|
+
Cross-link: `reference/accessibility.md` - live-regions, color-contrast sections
|
|
116
116
|
|
|
117
117
|
---
|
|
118
118
|
|
|
@@ -122,27 +122,27 @@ Cross-link: `reference/accessibility.md` — live-regions, color-contrast sectio
|
|
|
122
122
|
|------------|----------|--------|-------|
|
|
123
123
|
| Enter (height expand + fade) | 200ms | ease-out | Pushes content down; avoids position:fixed |
|
|
124
124
|
| Exit (height collapse + fade) | 150ms | ease-in | Content reflows up as alert closes |
|
|
125
|
-
| Icon entrance | 0ms |
|
|
125
|
+
| Icon entrance | 0ms | - | No animation on icon; immediate |
|
|
126
126
|
|
|
127
|
-
**BAN**: Slide-in from edge (reserve for Toast). Alert is inline
|
|
127
|
+
**BAN**: Slide-in from edge (reserve for Toast). Alert is inline - it should feel like content appearing, not a notification arriving.
|
|
128
128
|
|
|
129
|
-
Cross-link: `reference/motion.md`
|
|
129
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip height animation, instant show/hide
|
|
130
130
|
|
|
131
131
|
---
|
|
132
132
|
|
|
133
133
|
## Do / Don't
|
|
134
134
|
|
|
135
135
|
### Do
|
|
136
|
-
- Always include an icon matching the semantic variant *(WCAG 1.4.1
|
|
136
|
+
- Always include an icon matching the semantic variant *(WCAG 1.4.1 - color not sole differentiator)*
|
|
137
137
|
- Use `role="alert"` for warning/error (assertive) and `role="status"` for info/success (polite) *(WAI-ARIA APG)*
|
|
138
138
|
- Keep alert visible until the condition is resolved or user dismisses *(Carbon, Polaris)*
|
|
139
139
|
- Use full-width for page-level alerts; rounded inline for component-level *(Material 3, Carbon)*
|
|
140
140
|
|
|
141
141
|
### Don't
|
|
142
|
-
- Don't auto-dismiss alerts
|
|
143
|
-
- Don't use color alone to distinguish severity
|
|
144
|
-
- Don't stack more than 2 alerts in the same section
|
|
145
|
-
- Don't use `role="alert"` for info/success
|
|
142
|
+
- Don't auto-dismiss alerts - use Toast for transient messages *(Material 3, Carbon)*
|
|
143
|
+
- Don't use color alone to distinguish severity - always include an icon and text label *(WCAG 1.4.1)*
|
|
144
|
+
- Don't stack more than 2 alerts in the same section - consolidate into a single summary *(Polaris)*
|
|
145
|
+
- Don't use `role="alert"` for info/success - overly assertive announcements desensitize users *(WAI-ARIA APG)*
|
|
146
146
|
|
|
147
147
|
---
|
|
148
148
|
|
|
@@ -193,6 +193,6 @@ grep -rn 'alert--error\|alert--warning\|alert-error\|alert-warning' src/ | grep
|
|
|
193
193
|
</div>
|
|
194
194
|
```
|
|
195
195
|
|
|
196
|
-
**Why it fails**: No `role="alert"` so screen readers do not announce the error message. Color class alone distinguishes severity
|
|
196
|
+
**Why it fails**: No `role="alert"` so screen readers do not announce the error message. Color class alone distinguishes severity - users with color blindness or high-contrast themes cannot distinguish this from a neutral message. No icon provides a shape-based cue.
|
|
197
197
|
**Grep detection**: `grep -rn 'class.*alert--error\|class.*alert-error' src/ | grep -v 'role='`
|
|
198
198
|
**Fix**: Add `role="alert"`, include an error icon with `aria-hidden="true"`, and ensure the variant is communicated through text or visually-hidden label in addition to color.
|
|
@@ -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
|
|