@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
|
-
# Stepper / Wizard
|
|
1
|
+
# Stepper / Wizard - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Carbon (ProgressIndicator + StepNavigation), Material 3 Stepper, Atlassian Design System, Mantine Stepper
|
|
4
4
|
**Wave**: 5 · **Category**: Advanced
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
10
10
|
|
|
11
|
-
A Stepper (or Wizard) guides users through a sequential multi-step flow
|
|
11
|
+
A Stepper (or Wizard) guides users through a sequential multi-step flow - onboarding, checkout, multi-page forms, settings setup. It communicates how many steps exist, which step is current, which are complete, and which are upcoming. Unlike Tabs (free navigation), a linear Stepper enforces order: the user must complete the current step before advancing. *(Carbon, Material 3, Atlassian, Mantine agree: step indicator list + content area + explicit Next/Back buttons is the canonical wizard pattern.)*
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -59,7 +59,7 @@ Actions:
|
|
|
59
59
|
|
|
60
60
|
| State | Trigger | Visual | ARIA |
|
|
61
61
|
|-------|---------|--------|------|
|
|
62
|
-
| upcoming | Step not yet reached | Muted circle/number, secondary text color |
|
|
62
|
+
| upcoming | Step not yet reached | Muted circle/number, secondary text color | - |
|
|
63
63
|
| current | Active step | Brand-color filled circle; bold label | `aria-current="step"` |
|
|
64
64
|
| completed | Step passed + valid | Check icon; full-opacity; clickable if non-linear | `aria-label="Step N: [name] - completed"` |
|
|
65
65
|
| error | Step has validation errors | Error color circle; error icon | `aria-label="Step N: [name] - has errors"` |
|
|
@@ -77,7 +77,7 @@ Actions:
|
|
|
77
77
|
|
|
78
78
|
**Norm**: Step circles 32px default *(Carbon, Mantine)*. Horizontal spacing between steps should scale with the available width so the indicator spans the container. Connector line is centered between circles.
|
|
79
79
|
|
|
80
|
-
Cross-link: `reference/surfaces.md`
|
|
80
|
+
Cross-link: `reference/surfaces.md` - minimum 44×44px touch target for clickable step indicators.
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -86,9 +86,9 @@ Cross-link: `reference/surfaces.md` — minimum 44×44px touch target for clicka
|
|
|
86
86
|
- Step label: body-sm (completed/upcoming) → body-sm weight 600 (current)
|
|
87
87
|
- Step number/icon inside circle: caption-sm, center-aligned
|
|
88
88
|
- Step description (optional sub-label): caption-sm, secondary color
|
|
89
|
-
- Action buttons: body-md, weight 500
|
|
89
|
+
- Action buttons: body-md, weight 500 - same as standard button spec
|
|
90
90
|
|
|
91
|
-
Cross-link: `reference/typography.md`
|
|
91
|
+
Cross-link: `reference/typography.md` - label weight change for current state.
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
@@ -99,27 +99,27 @@ Cross-link: `reference/typography.md` — label weight change for current state.
|
|
|
99
99
|
|
|
100
100
|
### Keyboard Contract
|
|
101
101
|
|
|
102
|
-
*Derived from WAI-ARIA APG list and button patterns
|
|
102
|
+
*Derived from WAI-ARIA APG list and button patterns - https://www.w3.org/WAI/ARIA/apg/ - W3C - 2024*
|
|
103
103
|
|
|
104
104
|
| Key | Action |
|
|
105
105
|
|-----|--------|
|
|
106
106
|
| Tab | Move focus through interactive elements: clickable completed steps (non-linear), Back button, Next/Submit button |
|
|
107
107
|
| Enter / Space | Activate focused Back, Next, Submit button; activate clickable completed step (non-linear) |
|
|
108
|
-
| (No arrow-key navigation) | Steps are NOT tabs
|
|
108
|
+
| (No arrow-key navigation) | Steps are NOT tabs - do not implement roving tabindex / arrow-key navigation between steps |
|
|
109
109
|
|
|
110
110
|
Steps are NOT `role="tab"` and do not use the tab keyboard pattern. Upcoming steps are not focusable in linear mode. Only completed steps are interactive (and focusable) in non-linear mode.
|
|
111
111
|
|
|
112
112
|
### Accessibility Rules
|
|
113
113
|
|
|
114
|
-
- Step indicators MUST use `role="list"` + `role="listitem"`
|
|
115
|
-
- Current step MUST have `aria-current="step"`
|
|
114
|
+
- Step indicators MUST use `role="list"` + `role="listitem"` - not `role="tablist"` + `role="tab"` (tabs allow free navigation; wizard steps do not)
|
|
115
|
+
- Current step MUST have `aria-current="step"` - this is the correct token (not `aria-selected` or `aria-checked`)
|
|
116
116
|
- Completed steps in non-linear mode MUST be `<button>` elements (or have `role="button"` + `tabindex="0"`) with `aria-label` including the step name and "completed" state
|
|
117
|
-
- Step connector lines MUST be `aria-hidden="true"`
|
|
117
|
+
- Step connector lines MUST be `aria-hidden="true"` - they are purely decorative
|
|
118
118
|
- Validate current step before allowing Next; display inline error messages with `aria-describedby` associations
|
|
119
|
-
- "Next", "Back", and "Submit" MUST be explicit text labels
|
|
119
|
+
- "Next", "Back", and "Submit" MUST be explicit text labels - do not use icon-only navigation buttons
|
|
120
120
|
- Announce step transitions via `aria-live="polite"` on the content region header (e.g., "Step 2 of 4: Profile")
|
|
121
121
|
|
|
122
|
-
Cross-link: `reference/accessibility.md`
|
|
122
|
+
Cross-link: `reference/accessibility.md` - aria-current values, list semantics.
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
@@ -132,25 +132,25 @@ Cross-link: `reference/accessibility.md` — aria-current values, list semantics
|
|
|
132
132
|
| Error state appear | 150ms | ease-out | Circle color change + icon fade in |
|
|
133
133
|
| Back navigation | 200ms | ease-in-out | Slide right (reverse direction) |
|
|
134
134
|
|
|
135
|
-
**BAN**: Do not use the same slide direction for both forward and backward step navigation
|
|
135
|
+
**BAN**: Do not use the same slide direction for both forward and backward step navigation - direction must be consistent with the mental model (forward = left, backward = right).
|
|
136
136
|
|
|
137
|
-
Cross-link: `reference/motion.md`
|
|
137
|
+
Cross-link: `reference/motion.md` - reduced-motion: skip slide; cross-fade content area only.
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
141
141
|
## Do / Don't
|
|
142
142
|
|
|
143
143
|
### Do
|
|
144
|
-
- Use `role="list"` for the step indicator
|
|
144
|
+
- Use `role="list"` for the step indicator - steps are a list, not a tab set *(WAI-ARIA APG, Carbon)*
|
|
145
145
|
- Set `aria-current="step"` on the active step *(WAI-ARIA spec §aria-current)*
|
|
146
146
|
- Validate the current step before advancing and show inline errors *(Carbon, Atlassian)*
|
|
147
|
-
- Label Back/Next/Submit buttons explicitly
|
|
147
|
+
- Label Back/Next/Submit buttons explicitly - not icons or chevrons *(Material 3, Carbon, Mantine)*
|
|
148
148
|
|
|
149
149
|
### Don't
|
|
150
|
-
- Don't use `role="tablist"` for steps
|
|
151
|
-
- Don't allow jumping to future unvisited steps in linear mode
|
|
152
|
-
- Don't use `aria-selected` on steps
|
|
153
|
-
- Don't omit the Back button
|
|
150
|
+
- Don't use `role="tablist"` for steps - tabs allow free navigation; wizard steps are ordered and gated *(diverges from all 4 systems)*
|
|
151
|
+
- Don't allow jumping to future unvisited steps in linear mode - breaks the sequential contract *(Carbon, Atlassian)*
|
|
152
|
+
- Don't use `aria-selected` on steps - `aria-current="step"` is the correct token *(WAI-ARIA spec)*
|
|
153
|
+
- Don't omit the Back button - users must be able to correct previous steps *(Material 3, Atlassian)*
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|
|
@@ -158,8 +158,8 @@ Cross-link: `reference/motion.md` — reduced-motion: skip slide; cross-fade con
|
|
|
158
158
|
|
|
159
159
|
| Anti-pattern | Entry |
|
|
160
160
|
|--------------|-------|
|
|
161
|
-
| BAN-14 | Stepper using role="tablist"
|
|
162
|
-
| BAN-07 | Missing aria-current on active step
|
|
161
|
+
| BAN-14 | Stepper using role="tablist" - semantically incorrect navigation model - `reference/anti-patterns.md#ban-14` |
|
|
162
|
+
| BAN-07 | Missing aria-current on active step - `reference/anti-patterns.md#ban-07` |
|
|
163
163
|
|
|
164
164
|
---
|
|
165
165
|
|
|
@@ -215,6 +215,6 @@ grep -rn 'wizard.*next\|stepper.*next\|wizard.*back\|stepper.*back' src/ | grep
|
|
|
215
215
|
</ul>
|
|
216
216
|
```
|
|
217
217
|
|
|
218
|
-
**Why it fails**: `role="tablist"` implies that all tabs are independently activatable and content switches freely
|
|
218
|
+
**Why it fails**: `role="tablist"` implies that all tabs are independently activatable and content switches freely - this is correct for Tabs but wrong for a wizard where steps are gated. AT users expect arrow-key navigation between tabs; in a wizard this would allow jumping to uncompleted future steps. `aria-selected` is the tab token; the correct token for a wizard is `aria-current="step"`.
|
|
219
219
|
**Grep detection**: `grep -rn 'role="tablist"' src/ | grep -i 'step\|wizard'`
|
|
220
220
|
**Fix**: Replace `<ul role="tablist">` with `<ol role="list">` (ordered list signals sequence), each `<li>` with `role="listitem"`, remove `aria-selected`, and add `aria-current="step"` to the current step. Make only completed steps keyboard-focusable (as `<button>`) in non-linear mode; upcoming steps are not interactive.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Switch
|
|
1
|
+
# Switch - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Apple HIG, Material 3, Radix UI, Spectrum (Adobe), Polaris, Fluent 2, Mantine, shadcn/ui
|
|
4
4
|
**Wave**: 1 · **Category**: Inputs
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A switch (toggle) represents an immediate binary action
|
|
10
|
+
A switch (toggle) represents an immediate binary action - changes take effect without a confirm step, like enabling dark mode or activating a feature. It differs from a checkbox in this immediacy: a checkbox is a form option submitted later; a switch acts now. Do not use a switch inside a form that requires a submit button to apply changes. *(Apple HIG, Material 3, Polaris all distinguish switch from checkbox this way)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -41,7 +41,7 @@ Label ← visible text describing the setting
|
|
|
41
41
|
| Large | 32px height | Material 3, Apple HIG |
|
|
42
42
|
|
|
43
43
|
**Norm** (≥5/18): label appears to the left of the switch (LTR); toggle is right-aligned.
|
|
44
|
-
**Diverge**: thumb icon vs. bare thumb
|
|
44
|
+
**Diverge**: thumb icon vs. bare thumb - Material 3 adds check icon on ON, x on OFF; most others use bare thumb. Bare is simpler and more portable across themes.
|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|
|
@@ -51,8 +51,8 @@ Label ← visible text describing the setting
|
|
|
51
51
|
|-------|--------|------|
|
|
52
52
|
| OFF (unchecked) | Thumb left, track muted | `aria-checked="false"` |
|
|
53
53
|
| ON (checked) | Thumb right, track colored | `aria-checked="true"` |
|
|
54
|
-
| hover | Thumb scale up slightly (1.1×) |
|
|
55
|
-
| focus | 2px focus ring around track |
|
|
54
|
+
| hover | Thumb scale up slightly (1.1×) | - |
|
|
55
|
+
| focus | 2px focus ring around track | - |
|
|
56
56
|
| disabled OFF | 38% opacity, thumb left | `aria-disabled="true"` |
|
|
57
57
|
| disabled ON | 38% opacity, thumb right | `aria-disabled="true"` |
|
|
58
58
|
|
|
@@ -66,17 +66,17 @@ Label ← visible text describing the setting
|
|
|
66
66
|
| md (default) | 44×24px | 20px | 44×44px |
|
|
67
67
|
| lg | 52×28px | 24px | 48×48px |
|
|
68
68
|
|
|
69
|
-
Track radius: `border-radius: 9999px` (pill shape
|
|
69
|
+
Track radius: `border-radius: 9999px` (pill shape - all 8 systems agree).
|
|
70
70
|
Thumb travel: track width − thumb diameter − (2 × inset padding ≈ 2px).
|
|
71
71
|
|
|
72
|
-
Cross-link: `reference/surfaces.md`
|
|
72
|
+
Cross-link: `reference/surfaces.md` - concentric radius rule does NOT apply here (pill shape is intentional, not nested radius)
|
|
73
73
|
|
|
74
74
|
---
|
|
75
75
|
|
|
76
76
|
## Typography
|
|
77
77
|
|
|
78
78
|
- Label: 14px/400 body weight; not distinguished from surrounding text
|
|
79
|
-
- State text (optional): 10–11px/600 uppercase inside track
|
|
79
|
+
- State text (optional): 10–11px/600 uppercase inside track - ensure ≥4.5:1 contrast against track colour
|
|
80
80
|
|
|
81
81
|
---
|
|
82
82
|
|
|
@@ -87,7 +87,7 @@ Cross-link: `reference/surfaces.md` — concentric radius rule does NOT apply he
|
|
|
87
87
|
|
|
88
88
|
### Keyboard Contract
|
|
89
89
|
|
|
90
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
90
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/switch/ - W3C - 2024*
|
|
91
91
|
|
|
92
92
|
| Key | Action |
|
|
93
93
|
|-----|--------|
|
|
@@ -96,9 +96,9 @@ Cross-link: `reference/surfaces.md` — concentric radius rule does NOT apply he
|
|
|
96
96
|
|
|
97
97
|
### Accessibility Rules
|
|
98
98
|
|
|
99
|
-
- `role="switch"` with `aria-checked="true/false"`
|
|
99
|
+
- `role="switch"` with `aria-checked="true/false"` - not `role="checkbox"` (different semantic contract; switch implies immediate action)
|
|
100
100
|
- Label MUST be associated: `<label>` with `for` on the switch element, or `aria-label`/`aria-labelledby`
|
|
101
|
-
- State text ("ON"/"OFF") inside the track is a visual enhancement only
|
|
101
|
+
- State text ("ON"/"OFF") inside the track is a visual enhancement only - it MUST NOT be the sole accessible name
|
|
102
102
|
- Disabled: use `aria-disabled="true"` (not native `disabled` attr) if keyboard focus should remain (e.g. to explain why it's disabled via tooltip)
|
|
103
103
|
- Announce state change via `aria-live="polite"` if switching triggers a significant UI change distant from the control
|
|
104
104
|
|
|
@@ -113,7 +113,7 @@ Cross-link: `reference/surfaces.md` — concentric radius rule does NOT apply he
|
|
|
113
113
|
| Thumb scale on hover | 80ms | ease | 1→1.1× scale |
|
|
114
114
|
| Press scale | 80ms | ease | 1→0.96× (canonical press scale) |
|
|
115
115
|
|
|
116
|
-
Cross-link: `reference/motion.md`
|
|
116
|
+
Cross-link: `reference/motion.md` - spring bounce=0 canonical values, canonical scale-on-press 0.96
|
|
117
117
|
|
|
118
118
|
---
|
|
119
119
|
|
|
@@ -121,15 +121,15 @@ Cross-link: `reference/motion.md` — spring bounce=0 canonical values, canonica
|
|
|
121
121
|
|
|
122
122
|
### Do
|
|
123
123
|
- Use `role="switch"` not `role="checkbox"` for toggle-with-immediate-effect *(WAI-ARIA APG, Radix)*
|
|
124
|
-
- Animate the thumb sliding
|
|
124
|
+
- Animate the thumb sliding - static snap removes the "toggle" affordance *(Apple HIG, Material 3)*
|
|
125
125
|
- Place label to the left of the switch in LTR layouts *(Apple HIG, Material 3, Polaris)*
|
|
126
|
-
- Apply changes immediately on toggle
|
|
126
|
+
- Apply changes immediately on toggle - no submit button required *(Apple HIG, Polaris)*
|
|
127
127
|
|
|
128
128
|
### Don't
|
|
129
|
-
- Don't use a switch inside a form where the user must click "Save"
|
|
130
|
-
- Don't rely on track colour alone to communicate state (colour blind users)
|
|
131
|
-
- Don't use the same `aria-label` for ON and OFF states
|
|
132
|
-
- Don't animate thumb with `transition: all`
|
|
129
|
+
- Don't use a switch inside a form where the user must click "Save" - use a checkbox *(Apple HIG, Polaris)*
|
|
130
|
+
- Don't rely on track colour alone to communicate state (colour blind users) - add icon or label *(Spectrum, Material 3)*
|
|
131
|
+
- Don't use the same `aria-label` for ON and OFF states - screen readers read the current state via `aria-checked` *(WAI-ARIA APG)*
|
|
132
|
+
- Don't animate thumb with `transition: all` - it catches border-radius changes and causes thumb deformation *(BAN-04)*
|
|
133
133
|
|
|
134
134
|
---
|
|
135
135
|
|
|
@@ -137,7 +137,7 @@ Cross-link: `reference/motion.md` — spring bounce=0 canonical values, canonica
|
|
|
137
137
|
|
|
138
138
|
| Anti-pattern | Entry |
|
|
139
139
|
|--------------|-------|
|
|
140
|
-
| BAN-04 | `transition: all`
|
|
140
|
+
| BAN-04 | `transition: all` - `reference/anti-patterns.md#ban-04` |
|
|
141
141
|
| Checkbox semantics for immediate-action toggle | `reference/anti-patterns.md` |
|
|
142
142
|
|
|
143
143
|
---
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Table (Data Table / Data Grid)
|
|
1
|
+
# Table (Data Table / Data Grid) - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Carbon DataTable, Polaris DataTable, Atlassian DynamicTable, Ant Design Table, UUPM (app-interface, MIT)
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation & Data
|
|
@@ -63,15 +63,15 @@ A data table presents structured, comparable information in rows and columns. It
|
|
|
63
63
|
|
|
64
64
|
| State | Trigger | Visual | ARIA |
|
|
65
65
|
|-------|---------|--------|------|
|
|
66
|
-
| default |
|
|
67
|
-
| row-hover | pointer over row | Subtle row highlight (4% overlay) |
|
|
66
|
+
| default | - | Alternating row colors or border separators | - |
|
|
67
|
+
| row-hover | pointer over row | Subtle row highlight (4% overlay) | - |
|
|
68
68
|
| row-selected | checkbox checked | Row highlight; checkbox filled | `aria-selected="true"` on `<tr>` |
|
|
69
69
|
| header-sort-asc | sort click | Arrow indicator up; column highlight | `aria-sort="ascending"` on `<th>` |
|
|
70
70
|
| header-sort-desc | sort click again | Arrow indicator down | `aria-sort="descending"` on `<th>` |
|
|
71
71
|
| header-sort-none | default or reset | No indicator | `aria-sort="none"` on sortable `<th>` |
|
|
72
|
-
| header-focus | keyboard focus on sortable `<th>` | 2px focus-visible ring |
|
|
72
|
+
| header-focus | keyboard focus on sortable `<th>` | 2px focus-visible ring | - |
|
|
73
73
|
| loading | data fetch | Skeleton rows or spinner overlay | `aria-busy="true"` on table or container |
|
|
74
|
-
| empty | no results | Empty state illustration + message |
|
|
74
|
+
| empty | no results | Empty state illustration + message | - |
|
|
75
75
|
|
|
76
76
|
---
|
|
77
77
|
|
|
@@ -92,10 +92,10 @@ Virtualise rows when `rowCount > 200`; use TanStack Virtual or react-virtual.
|
|
|
92
92
|
|
|
93
93
|
- Column header: body-sm or label-sm (12–13px), weight 600, `color: --text-secondary`
|
|
94
94
|
- Cell text: body-sm (13–14px), weight 400
|
|
95
|
-
- Numeric cells: `font-variant-numeric: tabular-nums`
|
|
95
|
+
- Numeric cells: `font-variant-numeric: tabular-nums` - column values align on decimal point
|
|
96
96
|
- Truncation: `text-overflow: ellipsis` on cells with `max-width`; tooltip reveals full value on hover
|
|
97
97
|
|
|
98
|
-
Cross-link: `reference/typography.md`
|
|
98
|
+
Cross-link: `reference/typography.md` - tabular-nums, body-sm
|
|
99
99
|
|
|
100
100
|
---
|
|
101
101
|
|
|
@@ -106,7 +106,7 @@ Cross-link: `reference/typography.md` — tabular-nums, body-sm
|
|
|
106
106
|
|
|
107
107
|
### Keyboard Contract
|
|
108
108
|
|
|
109
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
109
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/grid/ - W3C - 2024*
|
|
110
110
|
|
|
111
111
|
| Key | Action (role="grid") |
|
|
112
112
|
|-----|---------------------|
|
|
@@ -123,14 +123,14 @@ Cross-link: `reference/typography.md` — tabular-nums, body-sm
|
|
|
123
123
|
|
|
124
124
|
### Accessibility Rules
|
|
125
125
|
|
|
126
|
-
- ALL `<th>` column headers MUST have `scope="col"`
|
|
126
|
+
- ALL `<th>` column headers MUST have `scope="col"` - missing scope breaks AT table navigation
|
|
127
127
|
- Sortable `<th>` elements MUST have `aria-sort` with value `ascending`, `descending`, or `none`
|
|
128
|
-
- Selected rows MUST use `aria-selected="true"` on `<tr>`
|
|
128
|
+
- Selected rows MUST use `aria-selected="true"` on `<tr>` - CSS class alone is invisible to AT
|
|
129
129
|
- `<table>` MUST have a `<caption>` or `aria-label` to announce the table's purpose
|
|
130
130
|
- The responsive scroll wrapper MUST have `tabindex="0"` so keyboard users can scroll horizontally
|
|
131
131
|
- `role="grid"` enables cell-level arrow-key navigation; use only when cells contain interactive controls
|
|
132
132
|
|
|
133
|
-
Cross-link: `reference/accessibility.md`
|
|
133
|
+
Cross-link: `reference/accessibility.md` - table semantics, grid pattern
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -144,25 +144,25 @@ Cross-link: `reference/accessibility.md` — table semantics, grid pattern
|
|
|
144
144
|
| Expandable row open | 150ms | ease-out | Height expand |
|
|
145
145
|
| Skeleton shimmer | 1500ms | linear loop | Loading placeholder |
|
|
146
146
|
|
|
147
|
-
**BAN**: Do not animate `width` on table columns
|
|
147
|
+
**BAN**: Do not animate `width` on table columns - causes full table relayout on every frame.
|
|
148
148
|
|
|
149
|
-
Cross-link: `reference/motion.md`
|
|
149
|
+
Cross-link: `reference/motion.md` - layout-affecting transitions, skeleton shimmer
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
153
153
|
## Do / Don't
|
|
154
154
|
|
|
155
155
|
### Do
|
|
156
|
-
- Add `scope="col"` to every `<th>`
|
|
157
|
-
- Use `aria-sort` on sortable headers
|
|
156
|
+
- Add `scope="col"` to every `<th>` - screen readers use this to announce column context *(WAI-ARIA, Carbon)*
|
|
157
|
+
- Use `aria-sort` on sortable headers - not just a visual arrow icon *(Carbon, Polaris, Atlassian)*
|
|
158
158
|
- Use `tabindex="0"` on horizontal scroll wrapper for keyboard accessibility *(WCAG 2.1.1)*
|
|
159
|
-
- Virtualise rows at > 200 items
|
|
159
|
+
- Virtualise rows at > 200 items - prevents browser paint lag *(Carbon, Ant)*
|
|
160
160
|
|
|
161
161
|
### Don't
|
|
162
|
-
- Don't build a "table" with `<div>` elements and no ARIA grid roles
|
|
163
|
-
- Don't use `aria-sort` on non-sortable columns
|
|
164
|
-
- Don't place `overflow-x: auto` on `<table>` directly
|
|
165
|
-
- Don't use `display: contents` on `<thead>/<tbody>/<tr>`
|
|
162
|
+
- Don't build a "table" with `<div>` elements and no ARIA grid roles - invisible to AT *(WCAG 1.3.1)*
|
|
163
|
+
- Don't use `aria-sort` on non-sortable columns - misleads users into clicking non-interactive headers *(WAI-ARIA)*
|
|
164
|
+
- Don't place `overflow-x: auto` on `<table>` directly - wrap in a `<div>` with `tabindex="0"` *(WCAG 2.1.1)*
|
|
165
|
+
- Don't use `display: contents` on `<thead>/<tbody>/<tr>` - breaks AT table parsing *(WCAG 1.3.1)*
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
@@ -170,7 +170,7 @@ Cross-link: `reference/motion.md` — layout-affecting transitions, skeleton shi
|
|
|
170
170
|
|
|
171
171
|
| Anti-pattern | Entry |
|
|
172
172
|
|--------------|-------|
|
|
173
|
-
| BAN-04 | `transition: all` on table cells
|
|
173
|
+
| BAN-04 | `transition: all` on table cells - `reference/anti-patterns.md#ban-04` |
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Tabs
|
|
1
|
+
# Tabs - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: WAI-ARIA APG, Radix UI, Carbon, Mantine, Material 3, Chakra UI, Atlassian, Fluent 2
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -51,7 +51,7 @@ Vertical tabs (sidebar):
|
|
|
51
51
|
| Icon + label | Icon above or beside label | Material 3, Carbon |
|
|
52
52
|
|
|
53
53
|
**Norm** (≥6/18): arrow keys navigate between tabs; Tab key moves to active panel content.
|
|
54
|
-
**Diverge**: automatic vs. manual activation
|
|
54
|
+
**Diverge**: automatic vs. manual activation - automatic (arrow key selects immediately) vs. manual (arrow key moves focus, Enter selects). WAI-ARIA APG recommends manual for complex panels; Radix defaults to automatic.
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
@@ -96,7 +96,7 @@ Vertical tabs (sidebar):
|
|
|
96
96
|
|
|
97
97
|
### Keyboard Contract
|
|
98
98
|
|
|
99
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
99
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/tabs/ - W3C - 2024*
|
|
100
100
|
|
|
101
101
|
| Key | Action |
|
|
102
102
|
|-----|--------|
|
|
@@ -116,12 +116,12 @@ Vertical tabs (sidebar):
|
|
|
116
116
|
|
|
117
117
|
### Accessibility Rules
|
|
118
118
|
|
|
119
|
-
- Only the selected tab has `tabindex="0"`
|
|
119
|
+
- Only the selected tab has `tabindex="0"` - all other tabs have `tabindex="-1"` (roving tabindex pattern)
|
|
120
120
|
- `tablist` MUST have a label: `aria-label="[Section name]"` or `aria-labelledby`
|
|
121
121
|
- Inactive panels MUST be hidden with `hidden` attribute (not just CSS) so AT skips them
|
|
122
122
|
- Panel SHOULD have `tabindex="0"` to allow focusing the panel after Tab from the tablist
|
|
123
123
|
- Icon-only tabs MUST have `aria-label` on the tab element
|
|
124
|
-
- Linked tabs (tabs that change URL): use `role="link"` semantics or native `<a>` within tab
|
|
124
|
+
- Linked tabs (tabs that change URL): use `role="link"` semantics or native `<a>` within tab - but note this changes the keyboard contract
|
|
125
125
|
|
|
126
126
|
---
|
|
127
127
|
|
|
@@ -133,23 +133,23 @@ Vertical tabs (sidebar):
|
|
|
133
133
|
| Panel fade | 150ms | ease | Crossfade between panels |
|
|
134
134
|
| Scroll reveal | 200ms | ease | When scrolling to new active tab in overflow |
|
|
135
135
|
|
|
136
|
-
Cross-link: `reference/motion.md`
|
|
136
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: disable indicator slide + panel fade
|
|
137
137
|
|
|
138
138
|
---
|
|
139
139
|
|
|
140
140
|
## Do / Don't
|
|
141
141
|
|
|
142
142
|
### Do
|
|
143
|
-
- Use roving tabindex
|
|
143
|
+
- Use roving tabindex - `tabindex="0"` on selected, `tabindex="-1"` on all others *(WAI-ARIA APG)*
|
|
144
144
|
- Navigate with arrow keys between tabs, not Tab key *(WAI-ARIA APG)*
|
|
145
145
|
- Label the tablist with `aria-label` or `aria-labelledby` *(WAI-ARIA APG)*
|
|
146
146
|
- Hide inactive panels with `hidden` attribute so AT skips them *(WAI-ARIA APG)*
|
|
147
147
|
|
|
148
148
|
### Don't
|
|
149
|
-
- Don't use Tab key to navigate between tabs
|
|
150
|
-
- Don't show all tab panel content simultaneously
|
|
151
|
-
- Don't use more than 7 tabs in a horizontal tab strip
|
|
152
|
-
- Don't use tabs for steps that must be completed in order
|
|
149
|
+
- Don't use Tab key to navigate between tabs - Tab moves in/out of the tablist *(WAI-ARIA APG)*
|
|
150
|
+
- Don't show all tab panel content simultaneously - defeats the purpose of tabs *(all systems)*
|
|
151
|
+
- Don't use more than 7 tabs in a horizontal tab strip - prefer a select or dropdown for overflow *(Carbon, Atlassian)*
|
|
152
|
+
- Don't use tabs for steps that must be completed in order - use a stepper *(Material 3, Atlassian)*
|
|
153
153
|
|
|
154
154
|
---
|
|
155
155
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Toast / Snackbar
|
|
1
|
+
# Toast / Snackbar - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Radix UI Toast, Material 3 (Snackbar), Polaris (Toast), Carbon (Notification Toast)
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -52,7 +52,7 @@ A toast (snackbar) is a transient, non-blocking notification that appears briefl
|
|
|
52
52
|
|-------|---------|--------|------|
|
|
53
53
|
| entering | mount | Slide-in from bottom-right + fade-in, 200ms ease-out | Live region populated |
|
|
54
54
|
| visible | auto | Full opacity, static position | `role="status"` or `role="alert"` |
|
|
55
|
-
| hover / focus | pointer/keyboard | Auto-dismiss timer paused |
|
|
55
|
+
| hover / focus | pointer/keyboard | Auto-dismiss timer paused | - |
|
|
56
56
|
| exiting | dismiss / timeout | Slide-out + fade-out, 150ms ease-in | Removed from DOM |
|
|
57
57
|
| queued | >3 toasts active | Off-screen; waits for visible slot | Not yet in DOM |
|
|
58
58
|
|
|
@@ -75,11 +75,11 @@ A toast (snackbar) is a transient, non-blocking notification that appears briefl
|
|
|
75
75
|
|
|
76
76
|
## Typography
|
|
77
77
|
|
|
78
|
-
- Message: body-sm (14px/400)
|
|
79
|
-
- Action label: label-sm (13px/500)
|
|
80
|
-
- No wrapping beyond 2 lines
|
|
78
|
+
- Message: body-sm (14px/400) - same as body to ensure readability at a glance
|
|
79
|
+
- Action label: label-sm (13px/500) - slightly heavier to signal interactivity
|
|
80
|
+
- No wrapping beyond 2 lines - if message exceeds 2 lines, use Alert instead
|
|
81
81
|
|
|
82
|
-
Cross-link: `reference/typography.md`
|
|
82
|
+
Cross-link: `reference/typography.md` - body-sm, label-sm definitions
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
@@ -90,7 +90,7 @@ Cross-link: `reference/typography.md` — body-sm, label-sm definitions
|
|
|
90
90
|
|
|
91
91
|
### Keyboard Contract
|
|
92
92
|
|
|
93
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
93
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/alert/ - W3C - 2024*
|
|
94
94
|
|
|
95
95
|
| Key | Action |
|
|
96
96
|
|-----|--------|
|
|
@@ -102,14 +102,14 @@ Toast container itself is not focusable. Only interactive children (action, dism
|
|
|
102
102
|
|
|
103
103
|
### Accessibility Rules
|
|
104
104
|
|
|
105
|
-
- `role="alert"` on warning/error toasts causes immediate announcement by screen readers
|
|
106
|
-
- `role="status"` on info/success uses a polite live region
|
|
107
|
-
- The live region container MUST be present in the DOM before the toast text is injected
|
|
108
|
-
- Dismiss button MUST have `aria-label="Dismiss notification"` or similar
|
|
109
|
-
- Auto-dismiss timer MUST pause when the toast is hovered or focused *(WCAG 2.2.1
|
|
105
|
+
- `role="alert"` on warning/error toasts causes immediate announcement by screen readers - do NOT use for info/success (too noisy)
|
|
106
|
+
- `role="status"` on info/success uses a polite live region - announced at next opportunity
|
|
107
|
+
- The live region container MUST be present in the DOM before the toast text is injected - injecting `role="alert"` dynamically may not announce *(WCAG 4.1.3)*
|
|
108
|
+
- Dismiss button MUST have `aria-label="Dismiss notification"` or similar - the ✕ icon alone is not an accessible name
|
|
109
|
+
- Auto-dismiss timer MUST pause when the toast is hovered or focused *(WCAG 2.2.1 - Timing Adjustable)*
|
|
110
110
|
- Error toasts MUST either be persistent or have an explicit dismiss mechanism *(Polaris, Carbon)*
|
|
111
111
|
|
|
112
|
-
Cross-link: `reference/accessibility.md`
|
|
112
|
+
Cross-link: `reference/accessibility.md` - live-regions section
|
|
113
113
|
|
|
114
114
|
---
|
|
115
115
|
|
|
@@ -121,9 +121,9 @@ Cross-link: `reference/accessibility.md` — live-regions section
|
|
|
121
121
|
| Exit (slide-out + fade) | 150ms | ease-in | Reverse direction on dismiss |
|
|
122
122
|
| Stack reflow | 150ms | ease-out | Other toasts shift position when one exits |
|
|
123
123
|
|
|
124
|
-
**BAN**: Bouncing or spring physics on enter
|
|
124
|
+
**BAN**: Bouncing or spring physics on enter - toast is informational, not celebratory. Avoid `transition: all` (catches layout shifts during stack reflow).
|
|
125
125
|
|
|
126
|
-
Cross-link: `reference/motion.md`
|
|
126
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip slide, use fade-only at 100ms
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
@@ -136,10 +136,10 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip slide, use
|
|
|
136
136
|
- Keep message text ≤80 characters; use action button for follow-up *(Material 3, Polaris)*
|
|
137
137
|
|
|
138
138
|
### Don't
|
|
139
|
-
- Don't use toast for errors that require user action
|
|
140
|
-
- Don't stack more than 3 toasts
|
|
141
|
-
- Don't put more than one action in a toast
|
|
142
|
-
- Don't rely on toast alone for critical status
|
|
139
|
+
- Don't use toast for errors that require user action - use a modal or alert *(Material 3, Carbon)*
|
|
140
|
+
- Don't stack more than 3 toasts - queue the rest *(Radix, Polaris)*
|
|
141
|
+
- Don't put more than one action in a toast - use a modal for complex decisions *(Material 3)*
|
|
142
|
+
- Don't rely on toast alone for critical status - supplement with in-page feedback *(Carbon)*
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Tooltip
|
|
1
|
+
# Tooltip - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: WAI-ARIA APG, Radix UI, Material 3, Carbon, Mantine, Fluent 2, Atlassian, Apple HIG
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -43,7 +43,7 @@ A tooltip is a small, non-interactive label that appears on hover or keyboard fo
|
|
|
43
43
|
| Light | Light background | Mantine (inverted) |
|
|
44
44
|
|
|
45
45
|
**Norm** (≥7/18): 300ms show delay, 0ms hide; max-width 240px; never interactive content.
|
|
46
|
-
**Diverge**: delay duration
|
|
46
|
+
**Diverge**: delay duration - Carbon recommends 100ms for toolbars; WAI-ARIA APG recommends ≤500ms. 300ms is the safe default.
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
@@ -72,8 +72,8 @@ A tooltip is a small, non-interactive label that appears on hover or keyboard fo
|
|
|
72
72
|
|
|
73
73
|
## Typography
|
|
74
74
|
|
|
75
|
-
- 12px/400
|
|
76
|
-
- No bold, no headings inside tooltip
|
|
75
|
+
- 12px/400 - tooltip text is supplemental; smaller weight and size distinguish it from primary content
|
|
76
|
+
- No bold, no headings inside tooltip - it is a single line of text (≤60 chars preferred)
|
|
77
77
|
- Multi-line: allowed if content genuinely requires it; still no interactive elements
|
|
78
78
|
|
|
79
79
|
---
|
|
@@ -81,11 +81,11 @@ A tooltip is a small, non-interactive label that appears on hover or keyboard fo
|
|
|
81
81
|
## Keyboard & Accessibility
|
|
82
82
|
|
|
83
83
|
> **WAI-ARIA role**: `tooltip`
|
|
84
|
-
> **Trigger attributes**: `aria-describedby="tooltip-id"`
|
|
84
|
+
> **Trigger attributes**: `aria-describedby="tooltip-id"` - links the supplemental label
|
|
85
85
|
|
|
86
86
|
### Keyboard Contract
|
|
87
87
|
|
|
88
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
88
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/ - W3C - 2024*
|
|
89
89
|
|
|
90
90
|
| Key | Action |
|
|
91
91
|
|-----|--------|
|
|
@@ -97,11 +97,11 @@ Tooltip does NOT receive focus. It is purely a visual label attached to the trig
|
|
|
97
97
|
|
|
98
98
|
### Accessibility Rules
|
|
99
99
|
|
|
100
|
-
- Trigger MUST have `aria-describedby` pointing to the tooltip's `id`
|
|
101
|
-
- Tooltip is `role="tooltip"`
|
|
102
|
-
- Tooltip MUST appear on keyboard focus, not only on hover
|
|
103
|
-
- Do NOT put interactive content inside a tooltip
|
|
104
|
-
- Do NOT use tooltip as the only accessible name for a control
|
|
100
|
+
- Trigger MUST have `aria-describedby` pointing to the tooltip's `id` - screen readers read tooltip content as supplemental description
|
|
101
|
+
- Tooltip is `role="tooltip"` - NOT `role="dialog"` (no interactivity, no focus trap)
|
|
102
|
+
- Tooltip MUST appear on keyboard focus, not only on hover - keyboard-only users need access too *(WCAG 1.3.3, 2.1.1)*
|
|
103
|
+
- Do NOT put interactive content inside a tooltip - use Popover (`reference/components/popover.md`)
|
|
104
|
+
- Do NOT use tooltip as the only accessible name for a control - use `aria-label` on the trigger instead; tooltip supplements, not replaces, the accessible name
|
|
105
105
|
- Escape MUST dismiss the tooltip without removing focus from the trigger *(WAI-ARIA APG)*
|
|
106
106
|
|
|
107
107
|
---
|
|
@@ -112,25 +112,25 @@ Tooltip does NOT receive focus. It is purely a visual label attached to the trig
|
|
|
112
112
|
|------------|----------|--------|-------|
|
|
113
113
|
| Show | 100ms | ease-out | Fade only; no scale (too flashy for a label) |
|
|
114
114
|
| Hide | 80ms | ease | Fade only; immediate on Escape |
|
|
115
|
-
| Delay | 300ms |
|
|
115
|
+
| Delay | 300ms | - | CSS `transition-delay` or JS timeout |
|
|
116
116
|
|
|
117
|
-
Cross-link: `reference/motion.md`
|
|
117
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip fade, instant show/hide
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
121
121
|
## Do / Don't
|
|
122
122
|
|
|
123
123
|
### Do
|
|
124
|
-
- Show on keyboard focus AND hover
|
|
124
|
+
- Show on keyboard focus AND hover - not hover-only *(WAI-ARIA APG, WCAG 2.1.1)*
|
|
125
125
|
- Use `aria-describedby` to link trigger to tooltip *(WAI-ARIA APG)*
|
|
126
|
-
- Limit tooltip content to ≤60 chars
|
|
126
|
+
- Limit tooltip content to ≤60 chars - longer content belongs in a popover *(Carbon, Material 3)*
|
|
127
127
|
- Apply 300ms show delay to prevent accidental triggers while cursor passes *(WAI-ARIA APG, Carbon)*
|
|
128
128
|
|
|
129
129
|
### Don't
|
|
130
|
-
- Don't put interactive elements inside a tooltip *(WAI-ARIA APG
|
|
131
|
-
- Don't use tooltip as the only accessible name
|
|
132
|
-
- Don't trigger tooltip on click
|
|
133
|
-
- Don't use tooltip for critical information
|
|
130
|
+
- Don't put interactive elements inside a tooltip *(WAI-ARIA APG - this makes it a popover)*
|
|
131
|
+
- Don't use tooltip as the only accessible name - `aria-describedby` supplements, not replaces, `aria-label` *(WAI-ARIA APG)*
|
|
132
|
+
- Don't trigger tooltip on click - use a popover *(Radix, WAI-ARIA APG)*
|
|
133
|
+
- Don't use tooltip for critical information - it's supplemental; users on touch devices may miss it *(Material 3, Polaris)*
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|