@hegemonart/get-design-done 1.42.0 → 1.44.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 +1126 -1038
- package/README.md +159 -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 +9 -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/harness-freshness.cjs +59 -0
- package/scripts/lib/health-mirror/index.cjs +27 -0
- package/scripts/lib/manifest/harnesses.json +280 -14
- package/scripts/lib/manifest/prose-denylist.json +1 -1
- package/scripts/lib/manifest/schemas/harnesses.schema.json +32 -0
- package/sdk/mcp/gdd-mcp/server.js +125 -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
|
-
# Card
|
|
1
|
+
# Card - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Polaris, Carbon, Atlassian, Mantine, shadcn/ui, Ant Design, Fluent 2
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A card is a contained surface that groups related information and actions. It is a visual container, not a navigation element by default
|
|
10
|
+
A card is a contained surface that groups related information and actions. It is a visual container, not a navigation element by default - only make the entire card clickable when the primary action is navigation and there is a single dominant action. Mixed-content cards with multiple actions should not be entirely clickable. *(Material 3, Polaris, Carbon all agree on this boundary)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -48,7 +48,7 @@ A card is a contained surface that groups related information and actions. It is
|
|
|
48
48
|
| Compact | Dense layout; no media | Carbon, Fluent |
|
|
49
49
|
|
|
50
50
|
**Norm** (≥5/18): outlined or elevated; ≤2 actions per card.
|
|
51
|
-
**Diverge**: elevation vs. outline
|
|
51
|
+
**Diverge**: elevation vs. outline - both are valid; use elevated for content that needs to float (dashboards), outlined for dense lists (tables of cards).
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
@@ -56,10 +56,10 @@ A card is a contained surface that groups related information and actions. It is
|
|
|
56
56
|
|
|
57
57
|
| State | Trigger | Visual | ARIA/HTML |
|
|
58
58
|
|-------|---------|--------|-----------|
|
|
59
|
-
| default |
|
|
60
|
-
| hover (clickable) | pointer | Shadow deepens or border darkens |
|
|
61
|
-
| focus (clickable) | keyboard | 2px focus ring on outer card |
|
|
62
|
-
| active (clickable) | mousedown | Scale 0.99 |
|
|
59
|
+
| default | - | Resting surface | - |
|
|
60
|
+
| hover (clickable) | pointer | Shadow deepens or border darkens | - |
|
|
61
|
+
| focus (clickable) | keyboard | 2px focus ring on outer card | - |
|
|
62
|
+
| active (clickable) | mousedown | Scale 0.99 | - |
|
|
63
63
|
| selected | programmatic | Border + background tint | `aria-selected="true"` |
|
|
64
64
|
| loading | async content | Skeleton placeholder | `aria-busy="true"` |
|
|
65
65
|
| disabled | programmatic | 38% opacity | `aria-disabled="true"` |
|
|
@@ -77,7 +77,7 @@ A card is a contained surface that groups related information and actions. It is
|
|
|
77
77
|
| Max width | 480px (typical) | Grid controls actual width; max-width is a guideline |
|
|
78
78
|
| Gap between cards | 16px (sm grid), 24px (md grid) | |
|
|
79
79
|
|
|
80
|
-
Cross-link: `reference/surfaces.md`
|
|
80
|
+
Cross-link: `reference/surfaces.md` - concentric radius, 3-layer shadow formula, elevation tokens
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -96,14 +96,14 @@ Cross-link: `reference/surfaces.md` — concentric radius, 3-layer shadow formul
|
|
|
96
96
|
|
|
97
97
|
### Clickable Card Rules
|
|
98
98
|
|
|
99
|
-
*Per WAI-ARIA APG link + button patterns
|
|
99
|
+
*Per WAI-ARIA APG link + button patterns - W3C - 2024*
|
|
100
100
|
|
|
101
101
|
| Invocation | Element | Key |
|
|
102
102
|
|------------|---------|-----|
|
|
103
103
|
| Navigate to new page | `<a href>` wrapping or inside card | Enter |
|
|
104
104
|
| Trigger action in context | `<button>` wrapping or inside card | Enter, Space |
|
|
105
105
|
|
|
106
|
-
- **Do not wrap an entire card in `<a>` if it contains other interactive elements** (links, buttons inside)
|
|
106
|
+
- **Do not wrap an entire card in `<a>` if it contains other interactive elements** (links, buttons inside) - nested interactive elements are inaccessible by keyboard
|
|
107
107
|
- Use the "card with primary action + secondary actions" pattern: one `<a>` stretched via `::after` pseudo-element to fill the card; secondary action buttons sit above in stacking context
|
|
108
108
|
|
|
109
109
|
### Accessibility Rules
|
|
@@ -123,7 +123,7 @@ Cross-link: `reference/surfaces.md` — concentric radius, 3-layer shadow formul
|
|
|
123
123
|
| press scale | 80ms | ease | 1→0.99 (subtle; card is large) |
|
|
124
124
|
| skeleton shimmer | 1.5s | linear loop | Respect `prefers-reduced-motion` |
|
|
125
125
|
|
|
126
|
-
Cross-link: `reference/motion.md`
|
|
126
|
+
Cross-link: `reference/motion.md` - Skeleton shimmer pattern, `prefers-reduced-motion`
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
@@ -139,7 +139,7 @@ Cross-link: `reference/motion.md` — Skeleton shimmer pattern, `prefers-reduced
|
|
|
139
139
|
- Don't wrap the entire card in `<a>` if it contains other interactive elements *(WAI-ARIA APG)*
|
|
140
140
|
- Don't use `<div>` as a clickable card without `role="button"` or `role="link"` + keyboard handler *(WAI-ARIA APG)*
|
|
141
141
|
- Don't place the entire card title in a plain `<span>` when it could be `<h2>/<h3>` *(Atlassian, Carbon)*
|
|
142
|
-
- Don't use more than 2 primary actions per card
|
|
142
|
+
- Don't use more than 2 primary actions per card - extract to a detail view *(Material 3, Polaris)*
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
@@ -197,4 +197,4 @@ grep -rn 'class.*card' src/ | xargs grep -L 'h[1-6]\|aria-label' 2>/dev/null
|
|
|
197
197
|
|
|
198
198
|
**Why it fails**: Nested `<button>` inside `<a>` is invalid HTML. Keyboard users pressing Tab inside the link may reach the button, but Enter on the button may also trigger the link. Screen reader behavior is unpredictable.
|
|
199
199
|
**Grep detection**: `grep -rn '<a.*href' src/ | xargs grep -l '<button' 2>/dev/null`
|
|
200
|
-
**Fix**: Use the stretched-link pattern
|
|
200
|
+
**Fix**: Use the stretched-link pattern - `<h3><a href="/product/42">Product Name</a></h3>` with `::after { position: absolute; inset: 0; }` on the `<a>`, and position the "Add to cart" button above via `position: relative; z-index: 1`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Checkbox
|
|
1
|
+
# Checkbox - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Polaris, Ant Design, WAI-ARIA APG, Mantine, Chakra UI, Atlassian
|
|
4
4
|
**Wave**: 1 · **Category**: Inputs
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A checkbox allows the user to select or deselect a binary option, or to represent an indeterminate state (partially selected group). Checkboxes are independent
|
|
10
|
+
A checkbox allows the user to select or deselect a binary option, or to represent an indeterminate state (partially selected group). Checkboxes are independent - selecting one does not affect others. Use radio buttons for mutually exclusive choices within a group. Always group related checkboxes in a `<fieldset>` with a `<legend>`.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -31,7 +31,7 @@ Group:
|
|
|
31
31
|
| Part | Required | Notes |
|
|
32
32
|
|------|----------|-------|
|
|
33
33
|
| Input / control | Yes | Native `<input type="checkbox">` preferred |
|
|
34
|
-
| Label | Yes | `<label for="id">`
|
|
34
|
+
| Label | Yes | `<label for="id">` - click zone includes label text |
|
|
35
35
|
| Fieldset + legend | Yes (group) | Required when ≥2 related checkboxes |
|
|
36
36
|
| Helper text | No | Below label; `aria-describedby` |
|
|
37
37
|
| Error message | Conditional | Field-level or group-level |
|
|
@@ -49,8 +49,8 @@ Group:
|
|
|
49
49
|
| Group | ≥2 checkboxes in `<fieldset>` | All |
|
|
50
50
|
| With description | Label + helper text below | Material 3, Polaris, Carbon |
|
|
51
51
|
|
|
52
|
-
**Norm** (≥6/18): indeterminate state is a visual-only UI state
|
|
53
|
-
**Diverge**: size
|
|
52
|
+
**Norm** (≥6/18): indeterminate state is a visual-only UI state - the underlying `checked` value is still boolean; set via DOM `.indeterminate` property, not HTML attribute.
|
|
53
|
+
**Diverge**: size - Material 3 uses 18px; Carbon 16px; Polaris 16px; Ant 14–16px. 16px is the de-facto norm.
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
@@ -61,8 +61,8 @@ Group:
|
|
|
61
61
|
| unchecked | default | Empty box | `aria-checked="false"` |
|
|
62
62
|
| checked | user interaction | Checkmark | `aria-checked="true"` |
|
|
63
63
|
| indeterminate | set via JS | Dash / minus | `aria-checked="mixed"` |
|
|
64
|
-
| hover | pointer over | Box border darkens |
|
|
65
|
-
| focus | keyboard | 2px focus ring around box |
|
|
64
|
+
| hover | pointer over | Box border darkens | - |
|
|
65
|
+
| focus | keyboard | 2px focus ring around box | - |
|
|
66
66
|
| disabled unchecked | `disabled` | 38% opacity | `aria-disabled="true"` |
|
|
67
67
|
| disabled checked | `disabled` | 38% opacity + check | `aria-disabled="true"` |
|
|
68
68
|
| error | validation | Red box border | `aria-invalid="true"` |
|
|
@@ -79,14 +79,14 @@ Group:
|
|
|
79
79
|
| Group item spacing | 8px vertical between items | *(Carbon, Material 3)* |
|
|
80
80
|
| Indentation (nested) | 24px | When showing hierarchical groups |
|
|
81
81
|
|
|
82
|
-
Cross-link: `reference/surfaces.md`
|
|
82
|
+
Cross-link: `reference/surfaces.md` - hit-area pseudo-element pattern (44×44px minimum touch target)
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
86
86
|
## Typography
|
|
87
87
|
|
|
88
|
-
- Label: 14px/400; same weight as body
|
|
89
|
-
- Legend: 14px/500 or 12px/600 uppercase
|
|
88
|
+
- Label: 14px/400; same weight as body - checkboxes are options, not headings
|
|
89
|
+
- Legend: 14px/500 or 12px/600 uppercase - distinguishes group from items
|
|
90
90
|
- Helper/error: 12px/400
|
|
91
91
|
|
|
92
92
|
---
|
|
@@ -98,20 +98,20 @@ Cross-link: `reference/surfaces.md` — hit-area pseudo-element pattern (44×44p
|
|
|
98
98
|
|
|
99
99
|
### Keyboard Contract
|
|
100
100
|
|
|
101
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
101
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/ - W3C - 2024*
|
|
102
102
|
|
|
103
103
|
| Key | Action |
|
|
104
104
|
|-----|--------|
|
|
105
105
|
| Tab | Moves focus to the checkbox |
|
|
106
106
|
| Space | Toggles the checkbox state (checked / unchecked / indeterminate) |
|
|
107
107
|
|
|
108
|
-
Within a group: Tab moves between checkboxes (not arrow keys
|
|
108
|
+
Within a group: Tab moves between checkboxes (not arrow keys - checkboxes are independent).
|
|
109
109
|
|
|
110
110
|
### Accessibility Rules
|
|
111
111
|
|
|
112
|
-
- Label MUST be associated via `<label for="id">`
|
|
113
|
-
- `<fieldset>` + `<legend>` MUST wrap every group of related checkboxes
|
|
114
|
-
- Indeterminate state MUST be set via JS `.indeterminate = true`
|
|
112
|
+
- Label MUST be associated via `<label for="id">` - clicking the label must toggle the checkbox
|
|
113
|
+
- `<fieldset>` + `<legend>` MUST wrap every group of related checkboxes - the legend provides group context to screen readers
|
|
114
|
+
- Indeterminate state MUST be set via JS `.indeterminate = true` - there is no HTML attribute; `aria-checked="mixed"` must be set simultaneously on `role="checkbox"` elements
|
|
115
115
|
- Disabled checkboxes: use native `disabled` attribute for form semantics; `aria-disabled="true"` if the element must remain in tab order (e.g. with explanatory tooltip)
|
|
116
116
|
- Error state: `aria-invalid="true"` on the control; group-level error on the `<fieldset>` via `aria-describedby`
|
|
117
117
|
|
|
@@ -125,7 +125,7 @@ Within a group: Tab moves between checkboxes (not arrow keys — checkboxes are
|
|
|
125
125
|
| indeterminate dash | 120ms | ease | Width animation of dash element |
|
|
126
126
|
| hover border | 80ms | ease | Border colour only |
|
|
127
127
|
|
|
128
|
-
Cross-link: `reference/motion.md`
|
|
128
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip path animation, show fill instantly
|
|
129
129
|
|
|
130
130
|
---
|
|
131
131
|
|
|
@@ -138,10 +138,10 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip path animat
|
|
|
138
138
|
- Align label text to the top of the control in multiline label scenarios *(Carbon)*
|
|
139
139
|
|
|
140
140
|
### Don't
|
|
141
|
-
- Don't use checkboxes for mutually exclusive options
|
|
141
|
+
- Don't use checkboxes for mutually exclusive options - use radio buttons *(Material 3, Carbon, Polaris)*
|
|
142
142
|
- Don't use a custom `<div>` checkbox without `role="checkbox"` and keyboard handler *(WAI-ARIA APG)*
|
|
143
|
-
- Don't set `aria-checked="mixed"` via HTML attribute
|
|
144
|
-
- Don't rely on colour alone for checked state
|
|
143
|
+
- Don't set `aria-checked="mixed"` via HTML attribute - it must be set dynamically *(WAI-ARIA APG)*
|
|
144
|
+
- Don't rely on colour alone for checked state - always include a visible checkmark *(WCAG 1.4.1)*
|
|
145
145
|
|
|
146
146
|
---
|
|
147
147
|
|
|
@@ -195,7 +195,7 @@ grep -rn 'indeterminate' src/ | grep 'setAttribute\|attr(' | grep '"true"'
|
|
|
195
195
|
</div>
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
**Why it fails**: Screen readers announce each option without the group context ("Email
|
|
198
|
+
**Why it fails**: Screen readers announce each option without the group context ("Email - checkbox") - users don't know what these options belong to without reading surrounding text.
|
|
199
199
|
**Grep detection**: `grep -B5 'type="checkbox"' src/ | grep -v 'fieldset\|role="group"'`
|
|
200
200
|
**Fix**:
|
|
201
201
|
```html
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Chip / Tag
|
|
1
|
+
# Chip / Tag - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Atlassian, Mantine
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A chip (or tag) is a compact, interactive label that represents an attribute, filter, or selection. It is commonly used for multi-select filter interfaces, tag-input fields (user-generated labels), one-time suggestion prompts, and static display labels. Each variant has distinct interaction semantics
|
|
10
|
+
A chip (or tag) is a compact, interactive label that represents an attribute, filter, or selection. It is commonly used for multi-select filter interfaces, tag-input fields (user-generated labels), one-time suggestion prompts, and static display labels. Each variant has distinct interaction semantics - filter chips toggle on/off, input chips are removable, suggestion chips trigger a one-time action, and display chips are static. *(Material 3, Carbon, Atlassian, Mantine agree on the four-variant taxonomy)*
|
|
11
11
|
|
|
12
12
|
*UUPM app-interface: filter chips in search/filter UIs and tag input patterns (MIT attribution)*
|
|
13
13
|
|
|
@@ -51,13 +51,13 @@ A chip (or tag) is a compact, interactive label that represents an attribute, fi
|
|
|
51
51
|
|
|
52
52
|
| State | Trigger | Visual | ARIA |
|
|
53
53
|
|-------|---------|--------|------|
|
|
54
|
-
| default |
|
|
55
|
-
| hover | pointer over chip | Background tint (+8%) |
|
|
56
|
-
| focus | keyboard focus on chip | focus-visible ring (2px) |
|
|
54
|
+
| default | - | Rest fill + label | - |
|
|
55
|
+
| hover | pointer over chip | Background tint (+8%) | - |
|
|
56
|
+
| focus | keyboard focus on chip | focus-visible ring (2px) | - |
|
|
57
57
|
| selected (filter) | click / Enter / Space | Filled background; checkmark icon | `aria-pressed="true"` |
|
|
58
58
|
| unselected (filter) | click / Enter / Space | Outline style | `aria-pressed="false"` |
|
|
59
59
|
| disabled | `disabled` / `aria-disabled` | 38% opacity; cursor not-allowed | `aria-disabled="true"` |
|
|
60
|
-
| remove focus | Tab to × button | Focus ring on × |
|
|
60
|
+
| remove focus | Tab to × button | Focus ring on × | - |
|
|
61
61
|
|
|
62
62
|
---
|
|
63
63
|
|
|
@@ -79,11 +79,11 @@ A chip (or tag) is a compact, interactive label that represents an attribute, fi
|
|
|
79
79
|
|
|
80
80
|
## Typography
|
|
81
81
|
|
|
82
|
-
- Label: body-sm (13–14px/400)
|
|
83
|
-
- No bold weight
|
|
82
|
+
- Label: body-sm (13–14px/400) - same scale as form labels
|
|
83
|
+
- No bold weight - chip label is a tag, not a heading or CTA
|
|
84
84
|
- Truncate with ellipsis only when chip is in a fixed-width container; prefer wrapping chip set to natural width
|
|
85
85
|
|
|
86
|
-
Cross-link: `reference/typography.md`
|
|
86
|
+
Cross-link: `reference/typography.md` - body-sm definition
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -94,7 +94,7 @@ Cross-link: `reference/typography.md` — body-sm definition
|
|
|
94
94
|
|
|
95
95
|
### Keyboard Contract
|
|
96
96
|
|
|
97
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
97
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/listbox/ - W3C - 2024*
|
|
98
98
|
|
|
99
99
|
| Key | Action |
|
|
100
100
|
|-----|--------|
|
|
@@ -106,14 +106,14 @@ Cross-link: `reference/typography.md` — body-sm definition
|
|
|
106
106
|
|
|
107
107
|
### Accessibility Rules
|
|
108
108
|
|
|
109
|
-
- Filter chip used as standalone toggle MUST have `aria-pressed="true|false"`
|
|
109
|
+
- Filter chip used as standalone toggle MUST have `aria-pressed="true|false"` - absence means screen readers cannot report toggle state *(WAI-ARIA APG)*
|
|
110
110
|
- Filter chips inside a multi-select group SHOULD use `role="option"` inside `role="listbox"` with `aria-multiselectable="true"` *(WAI-ARIA APG)*
|
|
111
|
-
- Remove button MUST have an independent `aria-label` describing what it removes: `aria-label="Remove Python tag"`
|
|
111
|
+
- Remove button MUST have an independent `aria-label` describing what it removes: `aria-label="Remove Python tag"` - the × glyph alone is not an accessible name *(WAI-ARIA APG, Material 3)*
|
|
112
112
|
- Remove button MUST be a separate focusable element, NOT a click handler on the chip label *(Carbon, Atlassian)*
|
|
113
113
|
- Touch target for remove button MUST be ≥ 32×32px via padding even if the visual × is 16–20px *(WCAG 2.5.5)*
|
|
114
|
-
- Display chips have no role
|
|
114
|
+
- Display chips have no role - they are presentational; if they carry meaningful status, use `role="status"` or integrate into an Alert *(Atlassian Lozenge guidance)*
|
|
115
115
|
|
|
116
|
-
Cross-link: `reference/accessibility.md`
|
|
116
|
+
Cross-link: `reference/accessibility.md` - `aria-pressed`, `listbox`, touch targets
|
|
117
117
|
|
|
118
118
|
---
|
|
119
119
|
|
|
@@ -126,9 +126,9 @@ Cross-link: `reference/accessibility.md` — `aria-pressed`, `listbox`, touch ta
|
|
|
126
126
|
| Chip add (expand width) | 150ms | ease-out | Width expands from 0 |
|
|
127
127
|
| Hover background | 80ms | ease-out | Subtle tint only |
|
|
128
128
|
|
|
129
|
-
**BAN**: Full-page reflow animation when removing a chip
|
|
129
|
+
**BAN**: Full-page reflow animation when removing a chip - collapse width inline; do not shift unrelated page sections. Do not use `transition: all` (catches unintended border/shadow changes).
|
|
130
130
|
|
|
131
|
-
Cross-link: `reference/motion.md`
|
|
131
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip width animation, instant add/remove
|
|
132
132
|
|
|
133
133
|
---
|
|
134
134
|
|
|
@@ -141,10 +141,10 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip width anima
|
|
|
141
141
|
- Ensure touch target ≥ 32px height; extend remove button via padding *(WCAG 2.5.5)*
|
|
142
142
|
|
|
143
143
|
### Don't
|
|
144
|
-
- Don't put filter chips without `aria-pressed`
|
|
145
|
-
- Don't use the same click handler for chip label and remove
|
|
146
|
-
- Don't truncate chip label in narrow containers without a tooltip
|
|
147
|
-
- Don't use display chips for dynamic statuses that change
|
|
144
|
+
- Don't put filter chips without `aria-pressed` - screen readers cannot report selected state *(WAI-ARIA APG)*
|
|
145
|
+
- Don't use the same click handler for chip label and remove - remove must be independently focusable *(Carbon, Atlassian)*
|
|
146
|
+
- Don't truncate chip label in narrow containers without a tooltip - truncated tags lose meaning *(Polaris, Mantine)*
|
|
147
|
+
- Don't use display chips for dynamic statuses that change - use Alert or Badge instead *(Atlassian)*
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Command Palette
|
|
1
|
+
# Command Palette - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Linear, Raycast, Radix CMDK, GitHub Primer, UUPM (app-interface, MIT)
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation & Data
|
|
@@ -64,7 +64,7 @@ A command palette is a keyboard-first global launcher that lets users search acr
|
|
|
64
64
|
|
|
65
65
|
| State | Trigger | Visual | ARIA |
|
|
66
66
|
|-------|---------|--------|------|
|
|
67
|
-
| closed |
|
|
67
|
+
| closed | - | Dialog hidden | - |
|
|
68
68
|
| open | Cmd/Ctrl+K | Dialog visible; input focused | `aria-expanded="true"` on combobox |
|
|
69
69
|
| empty | no query | Placeholder or recent items | `aria-expanded="true"` |
|
|
70
70
|
| searching | typing | Results update in real-time | `aria-live="polite"` on results region |
|
|
@@ -97,7 +97,7 @@ A command palette is a keyboard-first global launcher that lets users search acr
|
|
|
97
97
|
- Section heading: label-xs (11px), uppercase, weight 600, `color: --text-subtle`, `aria-hidden="true"` if role="group" handles it
|
|
98
98
|
- Keyboard shortcut hints: label-xs (11px), `color: --text-subtle`, right-aligned, `aria-hidden="true"`
|
|
99
99
|
|
|
100
|
-
Cross-link: `reference/typography.md`
|
|
100
|
+
Cross-link: `reference/typography.md` - body-md, label scale
|
|
101
101
|
|
|
102
102
|
---
|
|
103
103
|
|
|
@@ -108,7 +108,7 @@ Cross-link: `reference/typography.md` — body-md, label scale
|
|
|
108
108
|
|
|
109
109
|
### Keyboard Contract
|
|
110
110
|
|
|
111
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
111
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/combobox/ and https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ - W3C - 2024*
|
|
112
112
|
|
|
113
113
|
| Key | Action |
|
|
114
114
|
|-----|--------|
|
|
@@ -123,14 +123,14 @@ Cross-link: `reference/typography.md` — body-md, label scale
|
|
|
123
123
|
|
|
124
124
|
### Accessibility Rules
|
|
125
125
|
|
|
126
|
-
- Dialog MUST have `aria-modal="true"`
|
|
126
|
+
- Dialog MUST have `aria-modal="true"` - prevents AT from reading content outside the palette
|
|
127
127
|
- `role="combobox"` input MUST have `aria-controls` pointing to the `role="listbox"` `id`
|
|
128
128
|
- `aria-live="polite"` on the results region ensures AT announces result count changes and empty state
|
|
129
129
|
- Focus MUST be trapped within the dialog while it is open (Tab/Shift+Tab cycle inside)
|
|
130
130
|
- On close, focus MUST return to the element that triggered the palette (not body)
|
|
131
|
-
- Keyboard shortcut hints (`⌘K`, `↵`) MUST be `aria-hidden="true"`
|
|
131
|
+
- Keyboard shortcut hints (`⌘K`, `↵`) MUST be `aria-hidden="true"` - the shortcut must be registered separately
|
|
132
132
|
|
|
133
|
-
Cross-link: `reference/accessibility.md`
|
|
133
|
+
Cross-link: `reference/accessibility.md` - dialog focus trap, combobox pattern, live regions
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -144,9 +144,9 @@ Cross-link: `reference/accessibility.md` — dialog focus trap, combobox pattern
|
|
|
144
144
|
| Backdrop fade in | 150ms | ease-out | Opacity 0→0.5 |
|
|
145
145
|
| Item selection flash | 80ms | ease-out | Brief fill before execute |
|
|
146
146
|
|
|
147
|
-
**BAN**: Do not animate result item reordering as the user types
|
|
147
|
+
**BAN**: Do not animate result item reordering as the user types - causes visual instability and is disorienting for AT users with animations enabled.
|
|
148
148
|
|
|
149
|
-
Cross-link: `reference/motion.md`
|
|
149
|
+
Cross-link: `reference/motion.md` - dialog entry, BAN-04
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
@@ -159,10 +159,10 @@ Cross-link: `reference/motion.md` — dialog entry, BAN-04
|
|
|
159
159
|
- Use `role="group"` + `aria-label` for result sections *(WAI-ARIA APG, Linear, Raycast)*
|
|
160
160
|
|
|
161
161
|
### Don't
|
|
162
|
-
- Don't build a custom overlay without `role="dialog"` + `aria-modal`
|
|
163
|
-
- Don't omit `aria-controls` on the combobox
|
|
164
|
-
- Don't open on hover or auto-focus
|
|
165
|
-
- Don't dismiss on every Escape keypress inside nested command flows
|
|
162
|
+
- Don't build a custom overlay without `role="dialog"` + `aria-modal` - screen readers will read background content *(WCAG 1.3.1)*
|
|
163
|
+
- Don't omit `aria-controls` on the combobox - AT cannot associate input with results *(WAI-ARIA APG combobox)*
|
|
164
|
+
- Don't open on hover or auto-focus - Cmd/Ctrl+K is the expected trigger *(Linear, Raycast convention)*
|
|
165
|
+
- Don't dismiss on every Escape keypress inside nested command flows - first Escape should exit sub-level, second closes palette *(Raycast, Linear)*
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
@@ -170,7 +170,7 @@ Cross-link: `reference/motion.md` — dialog entry, BAN-04
|
|
|
170
170
|
|
|
171
171
|
| Anti-pattern | Entry |
|
|
172
172
|
|--------------|-------|
|
|
173
|
-
| BAN-04 | `transition: all` on results list
|
|
173
|
+
| BAN-04 | `transition: all` on results list - `reference/anti-patterns.md#ban-04` |
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -223,6 +223,6 @@ grep -rn 'command.*palette\|cmd.*results\|cmdk' src/ | grep 'results\|listbox' |
|
|
|
223
223
|
</div>
|
|
224
224
|
```
|
|
225
225
|
|
|
226
|
-
**Why it fails**: No `role="dialog"`
|
|
226
|
+
**Why it fails**: No `role="dialog"` - AT does not treat this as a modal, and screen readers continue reading background content; no focus trap; input lacks `role="combobox"` and `aria-controls`; results have no `role="listbox"`; items have no `role="option"` or `aria-selected`; no `aria-live` region for result updates.
|
|
227
227
|
**Grep detection**: `grep -rn 'command.*palette\|cmdk\|command-menu' src/ | grep '<div' | grep -v 'role='`
|
|
228
228
|
**Fix**: Use `role="dialog"` + `aria-modal="true"` on the overlay; implement focus trap; add `role="combobox"` + `aria-controls` to input; add `role="listbox"` to results container; add `role="option"` + `aria-selected` to each item; add `aria-live="polite"` to results region.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Date Picker
|
|
1
|
+
# Date Picker - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon Design System, Atlassian Design System, Mantine DatePicker
|
|
4
4
|
**Wave**: 5 · **Category**: Advanced
|
|
@@ -31,7 +31,7 @@ Range variant adds a second input field for end date.
|
|
|
31
31
|
| Part | Required | Notes |
|
|
32
32
|
|------|----------|-------|
|
|
33
33
|
| Text input | Yes | Shows selected date; accepts direct keyboard entry |
|
|
34
|
-
| Format hint label | Yes | Visible "MM/DD/YYYY" supplement
|
|
34
|
+
| Format hint label | Yes | Visible "MM/DD/YYYY" supplement - NOT placeholder only |
|
|
35
35
|
| Calendar trigger button | Yes | Opens/closes popover; `aria-label="Open calendar"` |
|
|
36
36
|
| Popover (dialog) | Yes | `role="dialog"` + `aria-modal="true"` + focus trap |
|
|
37
37
|
| Month navigation | Yes | Previous/next month buttons; keyboard Page Up/Down |
|
|
@@ -59,13 +59,13 @@ Range variant adds a second input field for end date.
|
|
|
59
59
|
|
|
60
60
|
| State | Trigger | Visual | ARIA |
|
|
61
61
|
|-------|---------|--------|------|
|
|
62
|
-
| default |
|
|
62
|
+
| default | - | Resting input + trigger icon | - |
|
|
63
63
|
| open | Trigger click or input focus + Enter | Popover visible, focus moves inside | `aria-expanded="true"` on trigger |
|
|
64
|
-
| day hover | Pointer over day | Background highlight |
|
|
65
|
-
| day focus | Keyboard navigation | Focus-visible ring on day button |
|
|
64
|
+
| day hover | Pointer over day | Background highlight | - |
|
|
65
|
+
| day focus | Keyboard navigation | Focus-visible ring on day button | - |
|
|
66
66
|
| day selected | Enter/Space or click | Filled background (brand color) | `aria-pressed="true"` on day button |
|
|
67
|
-
| range-in-progress | Start selected, end not yet | Partial fill from start |
|
|
68
|
-
| range-complete | Both start and end selected | Full highlight between dates |
|
|
67
|
+
| range-in-progress | Start selected, end not yet | Partial fill from start | - |
|
|
68
|
+
| range-complete | Both start and end selected | Full highlight between dates | - |
|
|
69
69
|
| disabled date | Date excluded by min/max/filter | Muted; `tabindex="-1"` | `aria-disabled="true"` on day button |
|
|
70
70
|
| error | Invalid date typed | Red border + error message | `aria-invalid="true"` on input |
|
|
71
71
|
|
|
@@ -82,7 +82,7 @@ Range variant adds a second input field for end date.
|
|
|
82
82
|
**Norm**: 288px popover width fits a standard 7-column month grid with comfortable padding *(Carbon, Mantine)*.
|
|
83
83
|
Day cells must be ≥32px to meet minimum touch-target guidance; prefer 40px for mixed pointer/touch contexts.
|
|
84
84
|
|
|
85
|
-
Cross-link: `reference/surfaces.md`
|
|
85
|
+
Cross-link: `reference/surfaces.md` - minimum 44×44px accessible tap target via padding.
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -91,9 +91,9 @@ Cross-link: `reference/surfaces.md` — minimum 44×44px accessible tap target v
|
|
|
91
91
|
- Input text: body-md weight 400; monospace or tabular-nums variant for date digits aids alignment
|
|
92
92
|
- Day numbers: body-sm, center-aligned within cell
|
|
93
93
|
- Month/year header: body-md weight 600
|
|
94
|
-
- Format hint ("MM/DD/YYYY"): caption-sm, secondary color
|
|
94
|
+
- Format hint ("MM/DD/YYYY"): caption-sm, secondary color - attached as visible `<label>` supplement or `<span aria-hidden="true">` paired with `aria-describedby` on the input
|
|
95
95
|
|
|
96
|
-
Cross-link: `reference/typography.md`
|
|
96
|
+
Cross-link: `reference/typography.md` - tabular-nums for date/time fields.
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
@@ -104,7 +104,7 @@ Cross-link: `reference/typography.md` — tabular-nums for date/time fields.
|
|
|
104
104
|
|
|
105
105
|
### Keyboard Contract
|
|
106
106
|
|
|
107
|
-
*Adapted from WAI-ARIA APG
|
|
107
|
+
*Adapted from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ and grid pattern - W3C - 2024*
|
|
108
108
|
|
|
109
109
|
| Key | Action |
|
|
110
110
|
|-----|--------|
|
|
@@ -122,7 +122,7 @@ Cross-link: `reference/typography.md` — tabular-nums for date/time fields.
|
|
|
122
122
|
|
|
123
123
|
### Accessibility Rules
|
|
124
124
|
|
|
125
|
-
- Calendar popover MUST use `role="dialog"` + `aria-modal="true"`
|
|
125
|
+
- Calendar popover MUST use `role="dialog"` + `aria-modal="true"` - do not use a plain `<div>` overlay
|
|
126
126
|
- Focus MUST be trapped inside the open calendar; Escape closes and returns focus to the trigger
|
|
127
127
|
- Each selectable day MUST be a `<button>` (or element with `role="button"`) so keyboard and AT users can activate it
|
|
128
128
|
- Date format hint MUST be visible text, not only a placeholder (placeholder disappears on input and is not consistently announced)
|
|
@@ -130,7 +130,7 @@ Cross-link: `reference/typography.md` — tabular-nums for date/time fields.
|
|
|
130
130
|
- Range variant: announce selected range via `aria-label` on day buttons (e.g., `aria-label="April 15, 2025, start of range"`)
|
|
131
131
|
- Mobile: provide native `<input type="date">` fallback when touch device detected or user preference set
|
|
132
132
|
|
|
133
|
-
Cross-link: `reference/accessibility.md`
|
|
133
|
+
Cross-link: `reference/accessibility.md` - focus-trap pattern, dialog role requirements.
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -144,9 +144,9 @@ Cross-link: `reference/accessibility.md` — focus-trap pattern, dialog role req
|
|
|
144
144
|
| Day selection | 80ms | ease-out | Fill background color |
|
|
145
145
|
| Range fill | 150ms | ease-out | Animate fill between dates |
|
|
146
146
|
|
|
147
|
-
**BAN**: Do not animate the calendar grid with a full-page slide
|
|
147
|
+
**BAN**: Do not animate the calendar grid with a full-page slide - disorienting for keyboard users navigating by month.
|
|
148
148
|
|
|
149
|
-
Cross-link: `reference/motion.md`
|
|
149
|
+
Cross-link: `reference/motion.md` - reduced-motion: omit slide, keep instant day selection.
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
@@ -155,14 +155,14 @@ Cross-link: `reference/motion.md` — reduced-motion: omit slide, keep instant d
|
|
|
155
155
|
### Do
|
|
156
156
|
- Show the date format as visible text ("MM/DD/YYYY") near the input *(Carbon, Atlassian)*
|
|
157
157
|
- Ensure keyboard users can navigate the entire calendar without a pointer *(WAI-ARIA APG)*
|
|
158
|
-
- Allow direct text entry in the input field
|
|
158
|
+
- Allow direct text entry in the input field - some users know the date and do not need the calendar *(Mantine, Carbon)*
|
|
159
159
|
- Support locale-aware first day of week (Sunday vs. Monday) and locale month/day names *(Material 3, Mantine)*
|
|
160
160
|
|
|
161
161
|
### Don't
|
|
162
|
-
- Don't use `<table>` with click-only cells
|
|
163
|
-
- Don't use placeholder text alone to convey the date format
|
|
164
|
-
- Don't trap focus permanently
|
|
165
|
-
- Don't omit the native `<input type="date">` for mobile
|
|
162
|
+
- Don't use `<table>` with click-only cells - add `role="grid"` and full keyboard navigation *(WCAG 2.1 §2.1.1)*
|
|
163
|
+
- Don't use placeholder text alone to convey the date format - placeholder vanishes on input *(Carbon, Atlassian)*
|
|
164
|
+
- Don't trap focus permanently - Escape must always close the popover and restore focus *(WAI-ARIA APG)*
|
|
165
|
+
- Don't omit the native `<input type="date">` for mobile - custom calendars are unusable on small touch screens *(Material 3)*
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
@@ -170,8 +170,8 @@ Cross-link: `reference/motion.md` — reduced-motion: omit slide, keep instant d
|
|
|
170
170
|
|
|
171
171
|
| Anti-pattern | Entry |
|
|
172
172
|
|--------------|-------|
|
|
173
|
-
| BAN-07 | Placeholder as only label/hint
|
|
174
|
-
| BAN-12 | Custom overlay without focus trap
|
|
173
|
+
| BAN-07 | Placeholder as only label/hint - `reference/anti-patterns.md#ban-07` |
|
|
174
|
+
| BAN-12 | Custom overlay without focus trap - `reference/anti-patterns.md#ban-12` |
|
|
175
175
|
|
|
176
176
|
---
|
|
177
177
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Drawer / Sheet
|
|
1
|
+
# Drawer / Sheet - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Polaris (Sheet), Carbon, Atlassian, Mantine, shadcn/ui, Headless UI, Apple HIG
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A drawer (or sheet) is a panel that slides in from an edge of the viewport. It is less disruptive than a modal for workflows that benefit from co-existing with the background
|
|
10
|
+
A drawer (or sheet) is a panel that slides in from an edge of the viewport. It is less disruptive than a modal for workflows that benefit from co-existing with the background - detail panels, navigation menus, filter sidebars, multi-step flows. Like a modal, it traps focus and requires Escape to close. Unlike a modal, the backdrop is optional and can be semi-transparent. *(Material 3, Carbon, Polaris all position drawer as less disruptive than modal)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -55,13 +55,13 @@ Bottom sheet (mobile):
|
|
|
55
55
|
| Partial height | 60–80vh, overlays | Mobile bottom sheet | Apple HIG, Material 3 |
|
|
56
56
|
|
|
57
57
|
**Norm** (≥5/18): right-side is default; bottom sheet for mobile.
|
|
58
|
-
**Diverge**: backdrop-click-to-close
|
|
58
|
+
**Diverge**: backdrop-click-to-close - same debate as modal; for navigation drawers, backdrop click should close; for form/detail drawers, configurable.
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
62
62
|
## States
|
|
63
63
|
|
|
64
|
-
Same as Modal/Dialog
|
|
64
|
+
Same as Modal/Dialog - see `modal-dialog.md`. Key differences:
|
|
65
65
|
|
|
66
66
|
| State | Drawer-specific |
|
|
67
67
|
|-------|-----------------|
|
|
@@ -80,7 +80,7 @@ Same as Modal/Dialog — see `modal-dialog.md`. Key differences:
|
|
|
80
80
|
| Bottom sheet | 60–100vh | Drag handle at 12px × 36px |
|
|
81
81
|
| Padding | 20–24px | Match modal padding |
|
|
82
82
|
|
|
83
|
-
Cross-link: `reference/surfaces.md`
|
|
83
|
+
Cross-link: `reference/surfaces.md` - shadow on drawer edge (unilateral shadow)
|
|
84
84
|
|
|
85
85
|
---
|
|
86
86
|
|
|
@@ -94,21 +94,21 @@ Cross-link: `reference/surfaces.md` — shadow on drawer edge (unilateral shadow
|
|
|
94
94
|
|
|
95
95
|
## Keyboard & Accessibility
|
|
96
96
|
|
|
97
|
-
> **WAI-ARIA role**: `dialog` (same as modal
|
|
97
|
+
> **WAI-ARIA role**: `dialog` (same as modal - drawer is a type of dialog)
|
|
98
98
|
> **Required attributes**: `aria-modal="true"`, `aria-labelledby` (title id)
|
|
99
99
|
|
|
100
100
|
### Keyboard Contract
|
|
101
101
|
|
|
102
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
102
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ - W3C - 2024*
|
|
103
103
|
|
|
104
104
|
Same Tab/Shift+Tab/Escape contract as modal (see `modal-dialog.md`).
|
|
105
105
|
|
|
106
106
|
### Drawer-specific Accessibility Rules
|
|
107
107
|
|
|
108
|
-
- Focus trap: MUST trap focus inside the drawer while open
|
|
108
|
+
- Focus trap: MUST trap focus inside the drawer while open - same as modal
|
|
109
109
|
- On open: focus moves to first focusable element (or close button if no primary action)
|
|
110
110
|
- On close: focus MUST return to the element that triggered the drawer open
|
|
111
|
-
- Navigation drawer (`role="navigation"`): if the drawer IS the main nav, use `role="navigation"` + `aria-label="Main"` instead of `role="dialog"`; different keyboard contract (no focus trap
|
|
111
|
+
- Navigation drawer (`role="navigation"`): if the drawer IS the main nav, use `role="navigation"` + `aria-label="Main"` instead of `role="dialog"`; different keyboard contract (no focus trap - it IS a landmark)
|
|
112
112
|
- Background `inert`: set `inert` attribute (or equivalent) on background content when drawer is open
|
|
113
113
|
|
|
114
114
|
---
|
|
@@ -123,23 +123,23 @@ Same Tab/Shift+Tab/Escape contract as modal (see `modal-dialog.md`).
|
|
|
123
123
|
| Backdrop fade | 200ms | ease | opacity 0→0.4 |
|
|
124
124
|
|
|
125
125
|
Swipe-to-close (bottom sheet): detect `pointerup` with velocity + displacement threshold.
|
|
126
|
-
Cross-link: `reference/motion.md`
|
|
126
|
+
Cross-link: `reference/motion.md` - spring bounce=0, `prefers-reduced-motion` (disable slide, instant toggle)
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
130
130
|
## Do / Don't
|
|
131
131
|
|
|
132
132
|
### Do
|
|
133
|
-
- Trap focus inside the drawer when open
|
|
133
|
+
- Trap focus inside the drawer when open - same rule as modal *(WAI-ARIA APG)*
|
|
134
134
|
- Return focus to the trigger element on close *(WAI-ARIA APG, Radix, Mantine)*
|
|
135
135
|
- Use right-side drawer for content-detail panels; left-side for navigation *(Material 3, Carbon)*
|
|
136
136
|
- Support swipe-to-close on bottom sheets for mobile *(Apple HIG, Material 3)*
|
|
137
137
|
|
|
138
138
|
### Don't
|
|
139
|
-
- Don't use `role="navigation"` for content drawers
|
|
139
|
+
- Don't use `role="navigation"` for content drawers - only for navigation-purpose drawers *(WAI-ARIA APG)*
|
|
140
140
|
- Don't let Tab escape the drawer while it's open *(WAI-ARIA APG)*
|
|
141
141
|
- Don't disable background scroll without setting `overflow:hidden` on body *(all systems)*
|
|
142
|
-
- Don't slide from top for content
|
|
142
|
+
- Don't slide from top for content - top drawers conflict with browser UI and notifications *(Material 3)*
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|