@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
|
-
# Menu (Dropdown / Context Menu)
|
|
1
|
+
# Menu (Dropdown / Context Menu) - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Radix UI, WAI-ARIA APG, Carbon, Atlassian, Material 3, Polaris
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A menu presents a list of actions or options in a temporary overlay anchored to a trigger element. It differs from a Select/Combobox (which chooses a value)
|
|
10
|
+
A menu presents a list of actions or options in a temporary overlay anchored to a trigger element. It differs from a Select/Combobox (which chooses a value) - a menu executes commands or navigates. Use a Dropdown Menu for trigger-button scenarios; use a Context Menu for right-click/long-press on an element. *(Radix DropdownMenu, Carbon OverflowMenu, Atlassian DropdownMenu, WAI-ARIA APG Menu agree: menus are action lists, not value selectors)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -29,7 +29,7 @@ A menu presents a list of actions or options in a temporary overlay anchored to
|
|
|
29
29
|
| Trigger | Yes | `<button>` with `aria-haspopup="menu"` + `aria-expanded` |
|
|
30
30
|
| Menu container | Yes | `role="menu"` + `aria-labelledby` pointing to trigger |
|
|
31
31
|
| Menu item | Yes | `role="menuitem"` on each action |
|
|
32
|
-
| Separator | No | `role="separator"`
|
|
32
|
+
| Separator | No | `role="separator"` - groups related items |
|
|
33
33
|
| Checkbox item | No | `role="menuitemcheckbox"` + `aria-checked` |
|
|
34
34
|
| Radio item | No | `role="menuitemradio"` + `aria-checked`; group in `role="group"` |
|
|
35
35
|
| Sub-menu trigger | No | `role="menuitem"` + `aria-haspopup="menu"` + `aria-expanded` |
|
|
@@ -56,7 +56,7 @@ A menu presents a list of actions or options in a temporary overlay anchored to
|
|
|
56
56
|
|
|
57
57
|
| State | Trigger | Visual | ARIA |
|
|
58
58
|
|-------|---------|--------|------|
|
|
59
|
-
| closed |
|
|
59
|
+
| closed | - | Trigger visible; overlay hidden | `aria-expanded="false"` on trigger |
|
|
60
60
|
| open | Click trigger | Overlay visible; first item focused | `aria-expanded="true"` on trigger |
|
|
61
61
|
| item-hover / focus | Arrow keys or pointer | Item highlight (8% overlay) | `tabindex="-1"` managed via roving tabindex |
|
|
62
62
|
| item-disabled | `disabled` prop | 38% opacity, cursor: default | `aria-disabled="true"` on item |
|
|
@@ -82,12 +82,12 @@ A menu presents a list of actions or options in a temporary overlay anchored to
|
|
|
82
82
|
|
|
83
83
|
## Typography
|
|
84
84
|
|
|
85
|
-
- Item label: body-sm (13–14px), weight 400
|
|
85
|
+
- Item label: body-sm (13–14px), weight 400 - not bold; action labels read as text, not controls
|
|
86
86
|
- Destructive items: same weight, color token `--color-text-danger`
|
|
87
87
|
- Keyboard shortcut hints: body-xs (11–12px), muted color, right-aligned, `aria-hidden="true"`
|
|
88
88
|
- Truncate item labels with `text-overflow: ellipsis`; never wrap item text
|
|
89
89
|
|
|
90
|
-
Cross-link: `reference/typography.md`
|
|
90
|
+
Cross-link: `reference/typography.md` - body-sm scale
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
@@ -98,7 +98,7 @@ Cross-link: `reference/typography.md` — body-sm scale
|
|
|
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/menu-button/ - W3C - 2024*
|
|
102
102
|
|
|
103
103
|
| Key | Action |
|
|
104
104
|
|-----|--------|
|
|
@@ -115,14 +115,14 @@ Cross-link: `reference/typography.md` — body-sm scale
|
|
|
115
115
|
|
|
116
116
|
### Accessibility Rules
|
|
117
117
|
|
|
118
|
-
- Menu MUST open on click only
|
|
118
|
+
- Menu MUST open on click only - never on hover for primary open (hover may preview sub-menus)
|
|
119
119
|
- All items MUST be reachable by keyboard; no mouse-only items
|
|
120
120
|
- Focus returns to the trigger element when the menu closes
|
|
121
|
-
- Keyboard shortcut labels (e.g. "⌘K") are `aria-hidden="true"`
|
|
121
|
+
- Keyboard shortcut labels (e.g. "⌘K") are `aria-hidden="true"` - the shortcut must be registered separately
|
|
122
122
|
- `role="separator"` dividers are not focusable
|
|
123
123
|
- Disabled items use `aria-disabled="true"` (keep focusable so AT users know the option exists)
|
|
124
124
|
|
|
125
|
-
Cross-link: `reference/accessibility.md`
|
|
125
|
+
Cross-link: `reference/accessibility.md` - focus management, roving tabindex
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
@@ -135,9 +135,9 @@ Cross-link: `reference/accessibility.md` — focus management, roving tabindex
|
|
|
135
135
|
| Item highlight | 80ms | ease-out | Background color transition only |
|
|
136
136
|
| Sub-menu enter | 120ms | ease-out | Same as menu enter |
|
|
137
137
|
|
|
138
|
-
**BAN**: `transition: all` on menu items
|
|
138
|
+
**BAN**: `transition: all` on menu items - triggers layout thrash on width changes.
|
|
139
139
|
|
|
140
|
-
Cross-link: `reference/motion.md`
|
|
140
|
+
Cross-link: `reference/motion.md` - overlay entry pattern, BAN-04
|
|
141
141
|
|
|
142
142
|
---
|
|
143
143
|
|
|
@@ -145,15 +145,15 @@ Cross-link: `reference/motion.md` — overlay entry pattern, BAN-04
|
|
|
145
145
|
|
|
146
146
|
### Do
|
|
147
147
|
- Use `role="menu"` + `role="menuitem"` for all action menus *(WAI-ARIA APG)*
|
|
148
|
-
- Group related items with `role="separator"`
|
|
148
|
+
- Group related items with `role="separator"` - keep groups ≤ 7 items *(Carbon, Atlassian)*
|
|
149
149
|
- Return focus to the trigger on close *(WAI-ARIA APG)*
|
|
150
150
|
- Use `role="menuitemcheckbox"` for persistent toggle states *(Radix, Material 3)*
|
|
151
151
|
|
|
152
152
|
### Don't
|
|
153
|
-
- Don't open the menu on hover as the primary interaction
|
|
154
|
-
- Don't exceed 2 levels of sub-menus
|
|
155
|
-
- Don't put form controls (inputs, sliders) inside a menu
|
|
156
|
-
- Don't use `<div>` items without `role="menuitem"`
|
|
153
|
+
- Don't open the menu on hover as the primary interaction - keyboard users can't discover hover *(WCAG 1.3.3)*
|
|
154
|
+
- Don't exceed 2 levels of sub-menus - deeply nested menus are cognitively expensive *(Atlassian, Carbon)*
|
|
155
|
+
- Don't put form controls (inputs, sliders) inside a menu - use a Popover instead *(WAI-ARIA APG)*
|
|
156
|
+
- Don't use `<div>` items without `role="menuitem"` - invisible to screen readers *(WAI-ARIA)*
|
|
157
157
|
|
|
158
158
|
---
|
|
159
159
|
|
|
@@ -161,7 +161,7 @@ Cross-link: `reference/motion.md` — overlay entry pattern, BAN-04
|
|
|
161
161
|
|
|
162
162
|
| Anti-pattern | Entry |
|
|
163
163
|
|--------------|-------|
|
|
164
|
-
| BAN-04 | `transition: all` on interactive elements
|
|
164
|
+
| BAN-04 | `transition: all` on interactive elements - `reference/anti-patterns.md#ban-04` |
|
|
165
165
|
|
|
166
166
|
---
|
|
167
167
|
|
|
@@ -207,6 +207,6 @@ grep -rn 'role="menu"' src/ | grep -v 'aria-labelledby\|aria-label'
|
|
|
207
207
|
</div>
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
-
**Why it fails**: No `role="menu"` or `role="menuitem"`
|
|
210
|
+
**Why it fails**: No `role="menu"` or `role="menuitem"` - screen readers cannot announce this as a menu; items are not keyboard-navigable; no arrow-key navigation; trigger lacks `aria-haspopup` and `aria-expanded`.
|
|
211
211
|
**Grep detection**: `grep -rn '<div.*onclick\|<div.*onClick' src/ | grep -i 'menu\|dropdown'`
|
|
212
212
|
**Fix**: Use `<ul role="menu">` with `<li role="menuitem" tabindex="-1">` items, or a headless menu primitive (Radix DropdownMenu, Downshift).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Modal / Dialog
|
|
1
|
+
# Modal / Dialog - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Radix UI Dialog, WAI-ARIA APG, Material 3, Atlassian, Carbon, Mantine, shadcn/ui, Fluent 2
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A modal dialog is a blocking overlay that requires user interaction before returning to the main content. It is rendered in a portal above the page, traps keyboard focus within itself, prevents interaction with the background, and closes on Escape. Use modals sparingly
|
|
10
|
+
A modal dialog is a blocking overlay that requires user interaction before returning to the main content. It is rendered in a portal above the page, traps keyboard focus within itself, prevents interaction with the background, and closes on Escape. Use modals sparingly - they interrupt flow. Prefer inline feedback or slide-out drawers for non-critical workflows. *(Material 3, Atlassian, Polaris all advise modal restraint)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -50,7 +50,7 @@ A modal dialog is a blocking overlay that requires user interaction before retur
|
|
|
50
50
|
| Scrollable content | Body scrolls; header/footer sticky | All |
|
|
51
51
|
|
|
52
52
|
**Norm** (≥6/18): Escape closes; backdrop click may close (configurable); focus trapped inside.
|
|
53
|
-
**Diverge**: backdrop-click-to-close
|
|
53
|
+
**Diverge**: backdrop-click-to-close - Material 3 and shadcn default to close; Atlassian and Carbon recommend NOT closing on backdrop click to prevent accidental dismissal of forms.
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
@@ -71,12 +71,12 @@ A modal dialog is a blocking overlay that requires user interaction before retur
|
|
|
71
71
|
| sm | 400px | 80vh | Confirm dialogs |
|
|
72
72
|
| md (default) | 560px | 80vh | Standard |
|
|
73
73
|
| lg | 720px | 90vh | Complex forms |
|
|
74
|
-
| full | 100vw/100vh |
|
|
74
|
+
| full | 100vw/100vh | - | Mobile sheet pattern |
|
|
75
75
|
|
|
76
76
|
Padding: 24px (header/footer), 24px (body horizontal), 20px (body vertical).
|
|
77
77
|
Body scroll: `overflow-y: auto` with `overscroll-behavior: contain`.
|
|
78
78
|
|
|
79
|
-
Cross-link: `reference/surfaces.md`
|
|
79
|
+
Cross-link: `reference/surfaces.md` - concentric radius, elevation (shadow-as-border)
|
|
80
80
|
|
|
81
81
|
---
|
|
82
82
|
|
|
@@ -95,7 +95,7 @@ Cross-link: `reference/surfaces.md` — concentric radius, elevation (shadow-as-
|
|
|
95
95
|
|
|
96
96
|
### Keyboard Contract
|
|
97
97
|
|
|
98
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
98
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ - W3C - 2024*
|
|
99
99
|
|
|
100
100
|
| Key | Action |
|
|
101
101
|
|-----|--------|
|
|
@@ -106,13 +106,13 @@ Cross-link: `reference/surfaces.md` — concentric radius, elevation (shadow-as-
|
|
|
106
106
|
### Focus Management
|
|
107
107
|
|
|
108
108
|
1. **On open**: focus moves to the first focusable element inside the dialog (or to the dialog itself if no focusable children)
|
|
109
|
-
2. **While open**: Tab/Shift+Tab cycle only within the dialog
|
|
109
|
+
2. **While open**: Tab/Shift+Tab cycle only within the dialog - focus MUST NOT leave the dialog
|
|
110
110
|
3. **On close**: focus MUST return to the element that triggered the dialog open
|
|
111
111
|
|
|
112
112
|
### Accessibility Rules
|
|
113
113
|
|
|
114
|
-
- `aria-modal="true"` MUST be set
|
|
115
|
-
- Dialog title MUST have an `id` referenced by `aria-labelledby`
|
|
114
|
+
- `aria-modal="true"` MUST be set - tells AT to ignore background content (supplement with `inert` attribute on background for browsers without full `aria-modal` support)
|
|
115
|
+
- Dialog title MUST have an `id` referenced by `aria-labelledby` - screen reader announces "Dialog: [title]" on open
|
|
116
116
|
- `role="alertdialog"` for confirmation dialogs where the user must respond (delete confirmations, logout confirmation)
|
|
117
117
|
- Scroll-lock: prevent `<body>` scroll when dialog is open (`overflow: hidden` on `<body>`)
|
|
118
118
|
- Portal: render dialog in `document.body` to escape stacking context issues (z-index isolation)
|
|
@@ -126,10 +126,10 @@ Cross-link: `reference/surfaces.md` — concentric radius, elevation (shadow-as-
|
|
|
126
126
|
| Backdrop fade in | 200ms | ease-out | opacity 0→0.5 |
|
|
127
127
|
| Dialog enter | 200ms | ease-out | scale 0.95→1 + fade |
|
|
128
128
|
| Dialog exit | 150ms | ease-in | scale 1→0.95 + fade |
|
|
129
|
-
| Backdrop fade out | 150ms | ease-in |
|
|
129
|
+
| Backdrop fade out | 150ms | ease-in | - |
|
|
130
130
|
|
|
131
131
|
Use `AnimatePresence` (Framer Motion) or `data-state` + CSS for mount/unmount animation.
|
|
132
|
-
Cross-link: `reference/motion.md`
|
|
132
|
+
Cross-link: `reference/motion.md` - `AnimatePresence initial={false}`, `prefers-reduced-motion`
|
|
133
133
|
|
|
134
134
|
---
|
|
135
135
|
|
|
@@ -142,10 +142,10 @@ Cross-link: `reference/motion.md` — `AnimatePresence initial={false}`, `prefer
|
|
|
142
142
|
- Set `overflow:hidden` on `<body>` to prevent background scroll *(Material 3, Carbon)*
|
|
143
143
|
|
|
144
144
|
### Don't
|
|
145
|
-
- Don't close on backdrop click for dialogs with form input
|
|
146
|
-
- Don't use `role="dialog"` without `aria-labelledby`
|
|
147
|
-
- Don't use `display:none` to hide a dialog
|
|
148
|
-
- Don't stack more than 2 dialogs
|
|
145
|
+
- Don't close on backdrop click for dialogs with form input - data loss risk *(Atlassian, Carbon)*
|
|
146
|
+
- Don't use `role="dialog"` without `aria-labelledby` - dialog is announced without a name *(WAI-ARIA APG)*
|
|
147
|
+
- Don't use `display:none` to hide a dialog - use DOM removal or `hidden` attribute for correct AT behavior *(WAI-ARIA APG)*
|
|
148
|
+
- Don't stack more than 2 dialogs - use a single dialog with internal step navigation *(Material 3, Atlassian)*
|
|
149
149
|
|
|
150
150
|
---
|
|
151
151
|
|
|
@@ -205,6 +205,6 @@ grep -rn 'modal.*open\|isOpen.*modal' src/ | grep -v 'overflow\|scroll-lock\|bod
|
|
|
205
205
|
</div>
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
-
**Why it fails**: No `role="dialog"`, no `aria-modal`, no `aria-labelledby`
|
|
208
|
+
**Why it fails**: No `role="dialog"`, no `aria-modal`, no `aria-labelledby` - screen readers cannot announce the dialog name or suppress background content. Tab escapes the modal. Escape does nothing.
|
|
209
209
|
**Grep detection**: `grep -rn 'class.*modal\|class.*dialog' src/ | grep -v 'role=\|aria-'`
|
|
210
210
|
**Fix**: Use Radix `<Dialog>` or implement WAI-ARIA dialog pattern with `role="dialog"`, `aria-modal="true"`, `aria-labelledby`, focus trap, Escape handler, and portal rendering.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Navbar (Top Navigation Bar)
|
|
1
|
+
# Navbar (Top Navigation Bar) - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Polaris, Atlassian, Primer, UUPM (app-interface, MIT)
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation
|
|
@@ -22,7 +22,7 @@ A navbar is the primary horizontal navigation surface at the top of an applicati
|
|
|
22
22
|
|
|
23
23
|
| Part | Required | Notes |
|
|
24
24
|
|------|----------|-------|
|
|
25
|
-
| `<header>` wrapper | Yes | `role="banner"`
|
|
25
|
+
| `<header>` wrapper | Yes | `role="banner"` - one per page |
|
|
26
26
|
| `<nav>` | Yes | `role="navigation"` + `aria-label="Primary"` |
|
|
27
27
|
| Skip-to-main link | Yes | First focusable element; `href="#main-content"`; visible on focus |
|
|
28
28
|
| Logo / home link | Yes | `<a href="/">` with `aria-label="[App name] home"` |
|
|
@@ -53,10 +53,10 @@ A navbar is the primary horizontal navigation surface at the top of an applicati
|
|
|
53
53
|
|
|
54
54
|
| State | Trigger | Visual | ARIA |
|
|
55
55
|
|-------|---------|--------|------|
|
|
56
|
-
| default |
|
|
57
|
-
| scrolled | scroll > 0 | `box-shadow` bottom border appears |
|
|
58
|
-
| nav-item-hover | pointer over item | underline or bg highlight |
|
|
59
|
-
| nav-item-focus | keyboard focus | 2px focus-visible ring |
|
|
56
|
+
| default | - | Full nav visible, no shadow | - |
|
|
57
|
+
| scrolled | scroll > 0 | `box-shadow` bottom border appears | - |
|
|
58
|
+
| nav-item-hover | pointer over item | underline or bg highlight | - |
|
|
59
|
+
| nav-item-focus | keyboard focus | 2px focus-visible ring | - |
|
|
60
60
|
| nav-item-active | current route | `font-weight: 600` + indicator underline or pill | `aria-current="page"` |
|
|
61
61
|
| mobile-collapsed | viewport < breakpoint | Nav items hidden; hamburger visible | `aria-expanded="false"` on hamburger |
|
|
62
62
|
| mobile-expanded | hamburger activated | Nav items shown as vertical list | `aria-expanded="true"` on hamburger |
|
|
@@ -81,9 +81,9 @@ Mobile breakpoint: collapse at ≤768px (Carbon, Polaris); ≤960px for complex
|
|
|
81
81
|
- Nav item labels: body-sm to body-md (13–15px), weight 500 for active, 400 for inactive
|
|
82
82
|
- Active item visual distinction must not rely on color alone (add font-weight or underline indicator)
|
|
83
83
|
- Secondary action icons: 20px, with `aria-label` on each button
|
|
84
|
-
- Skip link text: `body-sm`, matches surrounding text
|
|
84
|
+
- Skip link text: `body-sm`, matches surrounding text - it only needs to be visible on focus
|
|
85
85
|
|
|
86
|
-
Cross-link: `reference/typography.md`
|
|
86
|
+
Cross-link: `reference/typography.md` - body scale, weight tokens
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -94,7 +94,7 @@ Cross-link: `reference/typography.md` — body scale, weight tokens
|
|
|
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/landmark-regions/ - W3C - 2024*
|
|
98
98
|
|
|
99
99
|
| Key | Action |
|
|
100
100
|
|-----|--------|
|
|
@@ -105,13 +105,13 @@ Cross-link: `reference/typography.md` — body scale, weight tokens
|
|
|
105
105
|
|
|
106
106
|
### Accessibility Rules
|
|
107
107
|
|
|
108
|
-
- `<nav>` MUST have `aria-label="Primary"`
|
|
109
|
-
- Skip-to-main link MUST be the first focusable element on the page
|
|
110
|
-
- Active nav item MUST use `aria-current="page"`
|
|
111
|
-
- Hamburger button MUST have `aria-expanded` and `aria-controls`
|
|
108
|
+
- `<nav>` MUST have `aria-label="Primary"` - multiple `<nav>` landmarks on a page must all be distinctly labelled
|
|
109
|
+
- Skip-to-main link MUST be the first focusable element on the page - keyboard users need to bypass repetitive nav
|
|
110
|
+
- Active nav item MUST use `aria-current="page"` - color alone is insufficient for AT users
|
|
111
|
+
- Hamburger button MUST have `aria-expanded` and `aria-controls` - AT users need to know the nav state
|
|
112
112
|
- `role="banner"` MUST appear only once per page (one `<header>` at page level)
|
|
113
113
|
|
|
114
|
-
Cross-link: `reference/accessibility.md`
|
|
114
|
+
Cross-link: `reference/accessibility.md` - landmark regions, skip navigation
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
@@ -124,9 +124,9 @@ Cross-link: `reference/accessibility.md` — landmark regions, skip navigation
|
|
|
124
124
|
| Mobile menu close | 150ms | ease-in | Collapse |
|
|
125
125
|
| Transparent → opaque on scroll | 200ms | ease-out | Background-color transition |
|
|
126
126
|
|
|
127
|
-
**BAN**: Animating navbar height on scroll
|
|
127
|
+
**BAN**: Animating navbar height on scroll - causes layout reflow and jank on every scroll event.
|
|
128
128
|
|
|
129
|
-
Cross-link: `reference/motion.md`
|
|
129
|
+
Cross-link: `reference/motion.md` - layout-affecting transitions
|
|
130
130
|
|
|
131
131
|
---
|
|
132
132
|
|
|
@@ -139,9 +139,9 @@ Cross-link: `reference/motion.md` — layout-affecting transitions
|
|
|
139
139
|
- Manage z-index explicitly on sticky navbars to prevent overlap issues *(Material 3, Carbon)*
|
|
140
140
|
|
|
141
141
|
### Don't
|
|
142
|
-
- Don't use multiple unlabelled `<nav>` landmarks
|
|
142
|
+
- Don't use multiple unlabelled `<nav>` landmarks - screen reader users can't distinguish them *(WCAG 4.1.2)*
|
|
143
143
|
- Don't rely on color alone to indicate the active nav item *(WCAG 1.4.1)*
|
|
144
|
-
- Don't put more than 7 primary nav items
|
|
144
|
+
- Don't put more than 7 primary nav items - overwhelming and hard to scan *(Carbon, Polaris HIG)*
|
|
145
145
|
- Don't use `position: fixed` on mobile without accounting for virtual keyboard displacement
|
|
146
146
|
|
|
147
147
|
---
|
|
@@ -150,7 +150,7 @@ Cross-link: `reference/motion.md` — layout-affecting transitions
|
|
|
150
150
|
|
|
151
151
|
| Anti-pattern | Entry |
|
|
152
152
|
|--------------|-------|
|
|
153
|
-
| BAN-04 | `transition: all` on interactive elements
|
|
153
|
+
| BAN-04 | `transition: all` on interactive elements - `reference/anti-patterns.md#ban-04` |
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Pagination
|
|
1
|
+
# Pagination - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Carbon, Polaris, Atlassian, Mantine, Material 3, UUPM (app-interface, MIT)
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation
|
|
@@ -53,12 +53,12 @@ Pagination divides a large dataset into discrete pages and provides controls to
|
|
|
53
53
|
|
|
54
54
|
| State | Trigger | Visual | ARIA |
|
|
55
55
|
|-------|---------|--------|------|
|
|
56
|
-
| default |
|
|
57
|
-
| current-page |
|
|
56
|
+
| default | - | All buttons enabled except current page | - |
|
|
57
|
+
| current-page | - | Filled/highlighted button | `aria-current="page"` |
|
|
58
58
|
| prev-disabled | page = 1 | Previous button dimmed | `disabled` or `aria-disabled="true"` |
|
|
59
59
|
| next-disabled | page = last | Next button dimmed | `disabled` or `aria-disabled="true"` |
|
|
60
|
-
| button-hover | pointer over | 8% overlay |
|
|
61
|
-
| button-focus | keyboard focus | 2px focus-visible ring |
|
|
60
|
+
| button-hover | pointer over | 8% overlay | - |
|
|
61
|
+
| button-focus | keyboard focus | 2px focus-visible ring | - |
|
|
62
62
|
| loading | page change in flight | Spinner overlay on content; buttons retain focus | `aria-busy="true"` on results region |
|
|
63
63
|
|
|
64
64
|
---
|
|
@@ -84,7 +84,7 @@ Pagination divides a large dataset into discrete pages and provides controls to
|
|
|
84
84
|
- Results summary: body-sm, `color: --text-subtle`
|
|
85
85
|
- Per-page label: label-sm (12px), always visible above or beside the select
|
|
86
86
|
|
|
87
|
-
Cross-link: `reference/typography.md`
|
|
87
|
+
Cross-link: `reference/typography.md` - body-sm, label scale
|
|
88
88
|
|
|
89
89
|
---
|
|
90
90
|
|
|
@@ -95,7 +95,7 @@ Cross-link: `reference/typography.md` — body-sm, label scale
|
|
|
95
95
|
|
|
96
96
|
### Keyboard Contract
|
|
97
97
|
|
|
98
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
98
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/landmark-regions/ - W3C - 2024*
|
|
99
99
|
|
|
100
100
|
| Key | Action |
|
|
101
101
|
|-----|--------|
|
|
@@ -105,14 +105,14 @@ Cross-link: `reference/typography.md` — body-sm, label scale
|
|
|
105
105
|
|
|
106
106
|
### Accessibility Rules
|
|
107
107
|
|
|
108
|
-
- `aria-label="Pagination"` MUST be on the `<nav>`
|
|
109
|
-
- `aria-current="page"` MUST be on the currently active page button
|
|
108
|
+
- `aria-label="Pagination"` MUST be on the `<nav>` - distinguishes from other navigation landmarks on the page
|
|
109
|
+
- `aria-current="page"` MUST be on the currently active page button - screen readers announce "Page 3, current"
|
|
110
110
|
- Previous button on page 1 and Next button on last page MUST use `disabled` or `aria-disabled="true"` + visually dimmed
|
|
111
111
|
- `aria-label` on each page number button ("Page 1", "Page 2") prevents screen readers from just announcing the number alone
|
|
112
112
|
- Results summary text MUST use `aria-live="polite"` so screen reader users hear the count update after page change
|
|
113
|
-
- Per-page `<select>` MUST have a visible `<label>`
|
|
113
|
+
- Per-page `<select>` MUST have a visible `<label>` - not just a placeholder
|
|
114
114
|
|
|
115
|
-
Cross-link: `reference/accessibility.md`
|
|
115
|
+
Cross-link: `reference/accessibility.md` - aria-current, landmark labelling, live regions
|
|
116
116
|
|
|
117
117
|
---
|
|
118
118
|
|
|
@@ -124,9 +124,9 @@ Cross-link: `reference/accessibility.md` — aria-current, landmark labelling, l
|
|
|
124
124
|
| Page change content transition | 150ms | ease-out | Fade the results region; managed by page, not pagination |
|
|
125
125
|
| Ellipsis expand (if interactive) | 120ms | ease-out | Reveal hidden page buttons |
|
|
126
126
|
|
|
127
|
-
**BAN**: Do not animate the pagination bar itself when a page changes
|
|
127
|
+
**BAN**: Do not animate the pagination bar itself when a page changes - only the content region transitions.
|
|
128
128
|
|
|
129
|
-
Cross-link: `reference/motion.md`
|
|
129
|
+
Cross-link: `reference/motion.md` - content region transitions
|
|
130
130
|
|
|
131
131
|
---
|
|
132
132
|
|
|
@@ -139,10 +139,10 @@ Cross-link: `reference/motion.md` — content region transitions
|
|
|
139
139
|
- Show a results summary ("Showing 51–75 of 587") near the pagination controls *(Carbon, Polaris)*
|
|
140
140
|
|
|
141
141
|
### Don't
|
|
142
|
-
- Don't use `<a href>` with pushState without `aria-current`
|
|
143
|
-
- Don't show more than 7 page buttons without ellipsis truncation
|
|
144
|
-
- Don't disable the Previous/Next buttons with only visual styling
|
|
145
|
-
- Don't place pagination at the top only
|
|
142
|
+
- Don't use `<a href>` with pushState without `aria-current` - screen readers won't know which page is current *(WAI-ARIA)*
|
|
143
|
+
- Don't show more than 7 page buttons without ellipsis truncation - visually overwhelming *(Carbon, Mantine)*
|
|
144
|
+
- Don't disable the Previous/Next buttons with only visual styling - use `disabled` attr or `aria-disabled` *(WCAG 1.4.3)*
|
|
145
|
+
- Don't place pagination at the top only - bottom placement is expected; both positions is acceptable *(Polaris, Carbon)*
|
|
146
146
|
|
|
147
147
|
---
|
|
148
148
|
|
|
@@ -150,7 +150,7 @@ Cross-link: `reference/motion.md` — content region transitions
|
|
|
150
150
|
|
|
151
151
|
| Anti-pattern | Entry |
|
|
152
152
|
|--------------|-------|
|
|
153
|
-
| BAN-07 | Missing `aria-current` on active navigation items
|
|
153
|
+
| BAN-07 | Missing `aria-current` on active navigation items - `reference/anti-patterns.md#ban-07` |
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Popover
|
|
1
|
+
# Popover - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Radix UI Popover, Floating UI, Mantine, Atlassian, WAI-ARIA APG, shadcn/ui, Carbon, Material 3
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -48,7 +48,7 @@ A popover is an anchored overlay that appears beside a trigger element, containi
|
|
|
48
48
|
| Inline picker | Date, color, emoji picker | Material 3, Mantine |
|
|
49
49
|
|
|
50
50
|
**Norm** (≥5/18): Escape closes; outside-click closes; arrow pointer indicates anchor.
|
|
51
|
-
**Diverge**: focus trap
|
|
51
|
+
**Diverge**: focus trap - Radix Popover does NOT trap focus (non-modal); Radix Dialog DOES. Use Dialog-pattern when content isolation is required.
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
@@ -64,7 +64,7 @@ A popover is an anchored overlay that appears beside a trigger element, containi
|
|
|
64
64
|
|
|
65
65
|
## Positioning
|
|
66
66
|
|
|
67
|
-
*Per Floating UI
|
|
67
|
+
*Per Floating UI - https://floating-ui.com - MIT - 2024*
|
|
68
68
|
|
|
69
69
|
| Property | Recommended Value | Notes |
|
|
70
70
|
|----------|-------------------|-------|
|
|
@@ -97,7 +97,7 @@ Positioning must update on scroll and resize (`autoUpdate` from Floating UI).
|
|
|
97
97
|
|
|
98
98
|
### Keyboard Contract
|
|
99
99
|
|
|
100
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
100
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/ (non-modal variant) - W3C - 2024*
|
|
101
101
|
|
|
102
102
|
| Key | Action |
|
|
103
103
|
|-----|--------|
|
|
@@ -112,7 +112,7 @@ Positioning must update on scroll and resize (`autoUpdate` from Floating UI).
|
|
|
112
112
|
- When popover is dismissed, focus MUST return to the trigger element
|
|
113
113
|
- Non-modal popover: Tab MAY leave the popover (focus is not trapped)
|
|
114
114
|
- Modal popover (form isolation): add `role="dialog"` + `aria-modal="true"` + focus trap
|
|
115
|
-
- Popover with interactive content: do NOT use `role="tooltip"`
|
|
115
|
+
- Popover with interactive content: do NOT use `role="tooltip"` - tooltip cannot contain interactive elements
|
|
116
116
|
|
|
117
117
|
---
|
|
118
118
|
|
|
@@ -122,25 +122,25 @@ Positioning must update on scroll and resize (`autoUpdate` from Floating UI).
|
|
|
122
122
|
|------------|----------|--------|-------|
|
|
123
123
|
| Open | 120ms | ease-out | scale 0.95→1 + fade; origin at trigger |
|
|
124
124
|
| Close | 80ms | ease-in | fade only |
|
|
125
|
-
| Position update | 0ms |
|
|
125
|
+
| Position update | 0ms | - | No animation on reposition (prevents jank on scroll) |
|
|
126
126
|
|
|
127
|
-
Cross-link: `reference/motion.md`
|
|
127
|
+
Cross-link: `reference/motion.md` - `AnimatePresence`, `data-state` trigger for CSS transitions
|
|
128
128
|
|
|
129
129
|
---
|
|
130
130
|
|
|
131
131
|
## Do / Don't
|
|
132
132
|
|
|
133
133
|
### Do
|
|
134
|
-
- Use Floating UI or equivalent for positioning
|
|
134
|
+
- Use Floating UI or equivalent for positioning - manual positioning breaks on scroll and viewport edge *(Radix, Mantine, shadcn)*
|
|
135
135
|
- Dismiss on outside-click AND Escape *(WAI-ARIA APG, Radix, all systems)*
|
|
136
136
|
- Return focus to trigger on close *(WAI-ARIA APG)*
|
|
137
137
|
- Auto-flip and auto-shift so popover stays in viewport *(Floating UI)*
|
|
138
138
|
|
|
139
139
|
### Don't
|
|
140
|
-
- Don't use `role="tooltip"` for popovers with interactive content
|
|
141
|
-
- Don't position with `position: absolute` without a Floating UI
|
|
142
|
-
- Don't make popovers wider than 360px
|
|
143
|
-
- Don't auto-open popovers on hover
|
|
140
|
+
- Don't use `role="tooltip"` for popovers with interactive content - tooltip has a different contract *(WAI-ARIA APG)*
|
|
141
|
+
- Don't position with `position: absolute` without a Floating UI - it will misalign on scroll *(Floating UI docs)*
|
|
142
|
+
- Don't make popovers wider than 360px - use a modal for complex content *(Atlassian, Carbon)*
|
|
143
|
+
- Don't auto-open popovers on hover - use tooltip for hover-triggered content *(Radix, WAI-ARIA APG)*
|
|
144
144
|
|
|
145
145
|
---
|
|
146
146
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Progress
|
|
1
|
+
# Progress - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon (ProgressIndicator), Polaris, Mantine
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -33,8 +33,8 @@ A progress indicator communicates the status of an ongoing operation. Determinat
|
|
|
33
33
|
|------|----------|-------|
|
|
34
34
|
| Track | Yes | Background rail (linear) or ring background (circular) |
|
|
35
35
|
| Fill / indicator | Yes | Foreground showing progress amount |
|
|
36
|
-
| Label (visually hidden ok) | Yes | `aria-label` or `aria-labelledby`
|
|
37
|
-
| Value text | No | Rendered percentage (e.g. "45%")
|
|
36
|
+
| Label (visually hidden ok) | Yes | `aria-label` or `aria-labelledby` - describes what is loading |
|
|
37
|
+
| Value text | No | Rendered percentage (e.g. "45%") - supplement to ARIA value |
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
@@ -70,7 +70,7 @@ A progress indicator communicates the status of an ongoing operation. Determinat
|
|
|
70
70
|
| Size | Height | Notes |
|
|
71
71
|
|------|--------|-------|
|
|
72
72
|
| sm | 4px (default) | Decorative; thin above content |
|
|
73
|
-
| md | 8px | Accessible minimum
|
|
73
|
+
| md | 8px | Accessible minimum - recommended when bar is the primary indicator |
|
|
74
74
|
| lg | 12px | High-emphasis; file upload, step progress |
|
|
75
75
|
|
|
76
76
|
**Circular**
|
|
@@ -87,11 +87,11 @@ A progress indicator communicates the status of an ongoing operation. Determinat
|
|
|
87
87
|
|
|
88
88
|
## Typography
|
|
89
89
|
|
|
90
|
-
- Value label (if shown): numeric-sm (12px/tabular-nums)
|
|
91
|
-
- Associated label (if visible): body-sm (14px/400)
|
|
90
|
+
- Value label (if shown): numeric-sm (12px/tabular-nums) - percentage readability
|
|
91
|
+
- Associated label (if visible): body-sm (14px/400) - describes what is loading
|
|
92
92
|
- Do not truncate the associated label; use a visually-hidden version if space is constrained
|
|
93
93
|
|
|
94
|
-
Cross-link: `reference/typography.md`
|
|
94
|
+
Cross-link: `reference/typography.md` - tabular-nums for percentage values
|
|
95
95
|
|
|
96
96
|
---
|
|
97
97
|
|
|
@@ -102,7 +102,7 @@ Cross-link: `reference/typography.md` — tabular-nums for percentage values
|
|
|
102
102
|
|
|
103
103
|
### Keyboard Contract
|
|
104
104
|
|
|
105
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
105
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/meter/ - W3C - 2024*
|
|
106
106
|
|
|
107
107
|
| Key | Action |
|
|
108
108
|
|-----|--------|
|
|
@@ -112,14 +112,14 @@ Progress indicators are read-only status elements. They receive no keyboard focu
|
|
|
112
112
|
|
|
113
113
|
### Accessibility Rules
|
|
114
114
|
|
|
115
|
-
- `aria-label` or `aria-labelledby` MUST describe what is loading (e.g. "Uploading file", "Loading results")
|
|
115
|
+
- `aria-label` or `aria-labelledby` MUST describe what is loading (e.g. "Uploading file", "Loading results") - a bare `role="progressbar"` with no label is announced as empty *(WAI-ARIA APG)*
|
|
116
116
|
- Determinate bars MUST include `aria-valuenow` matching the current integer percentage *(WAI-ARIA APG)*
|
|
117
117
|
- Indeterminate bars MUST omit `aria-valuenow` and instead set `aria-valuetext="Loading"` or similar *(WAI-ARIA APG)*
|
|
118
118
|
- `aria-valuemin` and `aria-valuemax` MUST be present on all progress bars (default 0 and 100)
|
|
119
|
-
- Indeterminate animation MUST respect `prefers-reduced-motion`
|
|
119
|
+
- Indeterminate animation MUST respect `prefers-reduced-motion` - reduce to opacity pulse or static indicator *(WCAG 2.3.3)*
|
|
120
120
|
- Color contrast of fill vs. track MUST meet 3:1 minimum for non-text UI components *(WCAG 1.4.11)*
|
|
121
121
|
|
|
122
|
-
Cross-link: `reference/accessibility.md`
|
|
122
|
+
Cross-link: `reference/accessibility.md` - `prefers-reduced-motion`, WCAG 1.4.11
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
@@ -132,9 +132,9 @@ Cross-link: `reference/accessibility.md` — `prefers-reduced-motion`, WCAG 1.4.
|
|
|
132
132
|
| Circular spin | 1.2s | linear | Single full rotation per cycle |
|
|
133
133
|
| Complete → remove | 400ms | ease-in | Brief hold at 100% then fade/collapse |
|
|
134
134
|
|
|
135
|
-
**BAN**: Bouncing or elasticity on indeterminate loop
|
|
135
|
+
**BAN**: Bouncing or elasticity on indeterminate loop - communicates false progress rhythm. Do not use `transition: all` (catches color changes during theme swap).
|
|
136
136
|
|
|
137
|
-
Cross-link: `reference/motion.md`
|
|
137
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: replace sweep with opacity 0.5→1 pulse
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
@@ -143,14 +143,14 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: replace sweep wi
|
|
|
143
143
|
### Do
|
|
144
144
|
- Always provide `aria-label` describing what is loading *(WAI-ARIA APG)*
|
|
145
145
|
- Use `aria-valuenow` on determinate variants and omit on indeterminate *(WAI-ARIA APG)*
|
|
146
|
-
- Use 8px+ height for standalone linear bars
|
|
146
|
+
- Use 8px+ height for standalone linear bars - 4px bars lack sufficient touch and visual target *(Carbon)*
|
|
147
147
|
- Transition fill smoothly (300ms ease-out) when value updates *(Material 3, Mantine)*
|
|
148
148
|
|
|
149
149
|
### Don't
|
|
150
|
-
- Don't use `aria-valuenow` on indeterminate bars
|
|
151
|
-
- Don't show a spinner (circular indeterminate) when content shape is known
|
|
152
|
-
- Don't remove the progress bar the instant it hits 100%
|
|
153
|
-
- Don't animate with infinite bounce
|
|
150
|
+
- Don't use `aria-valuenow` on indeterminate bars - it implies a known value *(WAI-ARIA APG)*
|
|
151
|
+
- Don't show a spinner (circular indeterminate) when content shape is known - use Skeleton instead *(Carbon, Polaris)*
|
|
152
|
+
- Don't remove the progress bar the instant it hits 100% - hold briefly so the completion is registered *(Material 3)*
|
|
153
|
+
- Don't animate with infinite bounce - implies bouncing progress rhythm *(Carbon, Mantine)*
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|