@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
|
-
# Radio
|
|
1
|
+
# Radio - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Fluent 2, Mantine, WAI-ARIA APG, Polaris, Ant Design, Chakra UI
|
|
4
4
|
**Wave**: 1 · **Category**: Inputs
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A radio button represents one option within a mutually exclusive group. Selecting one radio button deselects all others in the same group. Always wrap radio buttons in a `<fieldset>` + `<legend>` and group them with the same `name` attribute. Never use a single radio button
|
|
10
|
+
A radio button represents one option within a mutually exclusive group. Selecting one radio button deselects all others in the same group. Always wrap radio buttons in a `<fieldset>` + `<legend>` and group them with the same `name` attribute. Never use a single radio button - it creates an unresettable state. Use a checkbox for binary choices.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -44,7 +44,7 @@ A radio button represents one option within a mutually exclusive group. Selectin
|
|
|
44
44
|
| Button group | Segmented-control appearance | Material 3, Fluent 2, Carbon |
|
|
45
45
|
|
|
46
46
|
**Norm** (≥6/18): vertical stacking default; horizontal allowed for ≤3 short labels.
|
|
47
|
-
**Diverge**: button-group vs. radio-card
|
|
47
|
+
**Diverge**: button-group vs. radio-card - visual styling differs but keyboard contract is identical.
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
@@ -52,10 +52,10 @@ A radio button represents one option within a mutually exclusive group. Selectin
|
|
|
52
52
|
|
|
53
53
|
| State | Trigger | Visual | ARIA |
|
|
54
54
|
|-------|---------|--------|------|
|
|
55
|
-
| unselected | default | Empty circle |
|
|
55
|
+
| unselected | default | Empty circle | - |
|
|
56
56
|
| selected | user interaction / programmatic | Filled dot | `checked` attr |
|
|
57
|
-
| hover | pointer over | Circle border darkens |
|
|
58
|
-
| focus | keyboard (Tab into group) | 2px focus ring on currently selected / first |
|
|
57
|
+
| hover | pointer over | Circle border darkens | - |
|
|
58
|
+
| focus | keyboard (Tab into group) | 2px focus ring on currently selected / first | - |
|
|
59
59
|
| disabled | `disabled` attr | 38% opacity | `aria-disabled="true"` |
|
|
60
60
|
| error | group-level | Red border on legend/container | `aria-describedby` on `<fieldset>` |
|
|
61
61
|
|
|
@@ -71,14 +71,14 @@ A radio button represents one option within a mutually exclusive group. Selectin
|
|
|
71
71
|
| Item spacing (vertical) | 8–12px | *(Carbon: 8px, Material 3: 8px)* |
|
|
72
72
|
| Touch target | 44×44px via pseudo-element | `reference/surfaces.md` |
|
|
73
73
|
|
|
74
|
-
Cross-link: `reference/surfaces.md`
|
|
74
|
+
Cross-link: `reference/surfaces.md` - hit-area pseudo-element pattern
|
|
75
75
|
|
|
76
76
|
---
|
|
77
77
|
|
|
78
78
|
## Typography
|
|
79
79
|
|
|
80
|
-
- Label: 14px/400
|
|
81
|
-
- Legend: 14px/500 or 12px/600 uppercase
|
|
80
|
+
- Label: 14px/400 - same as body; option is a choice, not a heading
|
|
81
|
+
- Legend: 14px/500 or 12px/600 uppercase - distinct from option labels
|
|
82
82
|
- Helper/error: 12px/400
|
|
83
83
|
|
|
84
84
|
---
|
|
@@ -91,7 +91,7 @@ Cross-link: `reference/surfaces.md` — hit-area pseudo-element pattern
|
|
|
91
91
|
|
|
92
92
|
### Keyboard Contract
|
|
93
93
|
|
|
94
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
94
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/radio/ - W3C - 2024*
|
|
95
95
|
|
|
96
96
|
| Key | Action |
|
|
97
97
|
|-----|--------|
|
|
@@ -105,10 +105,10 @@ Cross-link: `reference/surfaces.md` — hit-area pseudo-element pattern
|
|
|
105
105
|
|
|
106
106
|
### Accessibility Rules
|
|
107
107
|
|
|
108
|
-
- `<fieldset>` + `<legend>` MUST wrap the entire group
|
|
108
|
+
- `<fieldset>` + `<legend>` MUST wrap the entire group - legend text is prepended to each option announcement
|
|
109
109
|
- All radios in a group MUST share the same `name` attribute
|
|
110
|
-
- Tab focuses the selected radio (or first, if none selected)
|
|
111
|
-
- Never use a single radio button
|
|
110
|
+
- Tab focuses the selected radio (or first, if none selected) - arrow keys navigate within the group
|
|
111
|
+
- Never use a single radio button - it creates a state the user cannot unset; use a checkbox
|
|
112
112
|
- Error state applies to the group: `aria-describedby` on the `<fieldset>` or `role="radiogroup"` container
|
|
113
113
|
- `required`: apply to all radios in the group or use `aria-required` on the group container
|
|
114
114
|
|
|
@@ -122,7 +122,7 @@ Cross-link: `reference/surfaces.md` — hit-area pseudo-element pattern
|
|
|
122
122
|
| Deselect | 80ms | ease | Dot scale 1→0 |
|
|
123
123
|
| Hover border | 80ms | ease | Border colour only |
|
|
124
124
|
|
|
125
|
-
Cross-link: `reference/motion.md`
|
|
125
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip dot animation, show fill instantly
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
@@ -132,11 +132,11 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip dot animati
|
|
|
132
132
|
- Always use `<fieldset>` + `<legend>` for the group *(WAI-ARIA APG, Carbon, Polaris)*
|
|
133
133
|
- Use the same `name` attribute for all radios in a group *(HTML spec, all systems)*
|
|
134
134
|
- Pre-select a default option where appropriate to reduce cognitive load *(Material 3, Polaris)*
|
|
135
|
-
- Use arrow keys to navigate within a group
|
|
135
|
+
- Use arrow keys to navigate within a group - Tab moves to the group, not each item *(WAI-ARIA APG)*
|
|
136
136
|
|
|
137
137
|
### Don't
|
|
138
|
-
- Don't use a single radio button
|
|
139
|
-
- Don't use radio buttons for mutually exclusive options that require confirmation
|
|
138
|
+
- Don't use a single radio button - use a checkbox instead *(Material 3, Carbon, WAI-ARIA APG)*
|
|
139
|
+
- Don't use radio buttons for mutually exclusive options that require confirmation - use a select *(Polaris)*
|
|
140
140
|
- Don't mix radio and checkbox styles in the same group *(Carbon, Polaris)*
|
|
141
141
|
- Don't require the user to make a selection before seeing other page content (premature required state) *(Polaris)*
|
|
142
142
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Rich-Text Editor
|
|
1
|
+
# Rich-Text Editor - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Tiptap/ProseMirror, Lexical (Meta), Slate.js, Atlassian Fabric Editor
|
|
4
4
|
**Wave**: 5 · **Category**: Advanced
|
|
@@ -30,7 +30,7 @@ A Rich-Text Editor (RTE) provides WYSIWYG content authoring with inline formatti
|
|
|
30
30
|
| Editable area | Yes | `contenteditable="true"` + `role="textbox"` + `aria-multiline="true"` |
|
|
31
31
|
| Toolbar | Yes (for formatting) | `role="toolbar"` + `aria-label`; groups via `role="group"` |
|
|
32
32
|
| Toolbar buttons | Yes | `role="button"`; toggle buttons add `aria-pressed` |
|
|
33
|
-
| Placeholder | No | CSS `[data-placeholder]::before`
|
|
33
|
+
| Placeholder | No | CSS `[data-placeholder]::before` - NOT HTML attribute |
|
|
34
34
|
| Mention list | No | `role="listbox"` floating suggestion list triggered by `@` |
|
|
35
35
|
| Character count | No | `aria-live="polite"` updated region |
|
|
36
36
|
| Read-only overlay | No | `contenteditable="false"` + `aria-readonly="true"` |
|
|
@@ -56,10 +56,10 @@ A Rich-Text Editor (RTE) provides WYSIWYG content authoring with inline formatti
|
|
|
56
56
|
|
|
57
57
|
| State | Trigger | Visual | ARIA |
|
|
58
58
|
|-------|---------|--------|------|
|
|
59
|
-
| default |
|
|
60
|
-
| focused | Click or Tab into editable area | Focus ring on editable container |
|
|
59
|
+
| default | - | Cursor; toolbar buttons at rest | - |
|
|
60
|
+
| focused | Click or Tab into editable area | Focus ring on editable container | - |
|
|
61
61
|
| toolbar button active | Text with formatting selected | `aria-pressed="true"` on toggle button | `aria-pressed="true"` |
|
|
62
|
-
| placeholder | No content in editable area | Placeholder text via CSS ::before |
|
|
62
|
+
| placeholder | No content in editable area | Placeholder text via CSS ::before | - |
|
|
63
63
|
| read-only | `readOnly` prop | No cursor change; grayed toolbar | `aria-readonly="true"`, `contenteditable="false"` |
|
|
64
64
|
| disabled | `disabled` prop | 38% opacity; no interaction | `aria-disabled="true"` |
|
|
65
65
|
| mention-open | `@` typed | Floating listbox appears | `role="listbox"` visible |
|
|
@@ -77,18 +77,18 @@ A Rich-Text Editor (RTE) provides WYSIWYG content authoring with inline formatti
|
|
|
77
77
|
|
|
78
78
|
**Norm**: Editor area grows with content (auto-height); enforce max-height with overflow scroll if needed. Toolbar buttons follow button-sm/md sizing with 8px gaps between groups *(Atlassian, Tiptap)*.
|
|
79
79
|
|
|
80
|
-
Cross-link: `reference/surfaces.md`
|
|
80
|
+
Cross-link: `reference/surfaces.md` - toolbar button hit targets.
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
84
84
|
## Typography
|
|
85
85
|
|
|
86
86
|
- Editor content: body-md, line-height 1.6 for readable long-form text
|
|
87
|
-
- Heading 1: 2em; Heading 2: 1.5em; Heading 3: 1.25em
|
|
87
|
+
- Heading 1: 2em; Heading 2: 1.5em; Heading 3: 1.25em - relative to editor base font
|
|
88
88
|
- Code blocks: monospace, 0.9em, background token surface-code
|
|
89
89
|
- Placeholder text: same size/font as body, secondary color via CSS
|
|
90
90
|
|
|
91
|
-
Cross-link: `reference/typography.md`
|
|
91
|
+
Cross-link: `reference/typography.md` - heading scale, code font stack.
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
@@ -99,7 +99,7 @@ Cross-link: `reference/typography.md` — heading scale, code font stack.
|
|
|
99
99
|
|
|
100
100
|
### Keyboard Contract
|
|
101
101
|
|
|
102
|
-
*Derived from WAI-ARIA APG toolbar pattern
|
|
102
|
+
*Derived from WAI-ARIA APG toolbar pattern - https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/ - W3C - 2024, and standard contenteditable browser behavior*
|
|
103
103
|
|
|
104
104
|
| Key | Action |
|
|
105
105
|
|-----|--------|
|
|
@@ -120,15 +120,15 @@ Cross-link: `reference/typography.md` — heading scale, code font stack.
|
|
|
120
120
|
|
|
121
121
|
### Accessibility Rules
|
|
122
122
|
|
|
123
|
-
- Editable area MUST have `role="textbox"`
|
|
124
|
-
- `aria-multiline="true"` MUST be set
|
|
123
|
+
- Editable area MUST have `role="textbox"` - bare `contenteditable` is announced as a generic region by most AT
|
|
124
|
+
- `aria-multiline="true"` MUST be set - announces correct Enter-key behavior to screen readers
|
|
125
125
|
- Toolbar toggle buttons (bold, italic, lists) MUST use `aria-pressed="true/false"` to reflect current selection state
|
|
126
|
-
- Placeholder MUST use CSS `[data-placeholder]::before` content
|
|
127
|
-
- Keyboard shortcuts MUST be documented in a tooltip or help section
|
|
128
|
-
- Read-only: set both `contenteditable="false"` AND `aria-readonly="true"`
|
|
126
|
+
- Placeholder MUST use CSS `[data-placeholder]::before` content - not a `placeholder` HTML attribute on contenteditable (screen readers read it incorrectly or not at all)
|
|
127
|
+
- Keyboard shortcuts MUST be documented in a tooltip or help section - not assumed
|
|
128
|
+
- Read-only: set both `contenteditable="false"` AND `aria-readonly="true"` - contenteditable="false" alone is insufficient for AT
|
|
129
129
|
- Mention listbox MUST use `role="listbox"` with `role="option"` items; focused option uses `aria-selected="true"`
|
|
130
130
|
|
|
131
|
-
Cross-link: `reference/accessibility.md`
|
|
131
|
+
Cross-link: `reference/accessibility.md` - contenteditable accessibility, toolbar pattern.
|
|
132
132
|
|
|
133
133
|
---
|
|
134
134
|
|
|
@@ -142,9 +142,9 @@ Cross-link: `reference/accessibility.md` — contenteditable accessibility, tool
|
|
|
142
142
|
| Bubble toolbar appear | 150ms | ease-out | Fade in above selection |
|
|
143
143
|
| Bubble toolbar dismiss | 80ms | ease-in | Fade out on deselect |
|
|
144
144
|
|
|
145
|
-
**BAN**: Do not animate text reflow on formatting changes
|
|
145
|
+
**BAN**: Do not animate text reflow on formatting changes - typing performance is critical; any CSS transition on editor content causes visual jitter.
|
|
146
146
|
|
|
147
|
-
Cross-link: `reference/motion.md`
|
|
147
|
+
Cross-link: `reference/motion.md` - reduced-motion: remove mention list slide; keep instant formatting toggle.
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
@@ -157,9 +157,9 @@ Cross-link: `reference/motion.md` — reduced-motion: remove mention list slide;
|
|
|
157
157
|
- Document keyboard shortcuts in a tooltip or accessible help dialog *(Atlassian Fabric Editor)*
|
|
158
158
|
|
|
159
159
|
### Don't
|
|
160
|
-
- Don't use bare `contenteditable` without `role="textbox"`
|
|
161
|
-
- Don't omit `aria-pressed` on toggle buttons
|
|
162
|
-
- Don't use a `placeholder` HTML attribute on contenteditable
|
|
160
|
+
- Don't use bare `contenteditable` without `role="textbox"` - AT announces it as a generic landmark *(diverges from all 4 systems)*
|
|
161
|
+
- Don't omit `aria-pressed` on toggle buttons - AT users cannot determine current formatting state *(WAI-ARIA APG)*
|
|
162
|
+
- Don't use a `placeholder` HTML attribute on contenteditable - it is not a valid attribute and screen reader behavior is undefined *(MDN, Tiptap docs)*
|
|
163
163
|
- Don't suppress `outline` on the editable area without a custom focus-visible ring *(WCAG 2.4.7)*
|
|
164
164
|
|
|
165
165
|
---
|
|
@@ -168,8 +168,8 @@ Cross-link: `reference/motion.md` — reduced-motion: remove mention list slide;
|
|
|
168
168
|
|
|
169
169
|
| Anti-pattern | Entry |
|
|
170
170
|
|--------------|-------|
|
|
171
|
-
| BAN-06 | contenteditable without role="textbox"
|
|
172
|
-
| BAN-04 | transition: all on editor content causing reflow jank
|
|
171
|
+
| BAN-06 | contenteditable without role="textbox" - `reference/anti-patterns.md#ban-06` |
|
|
172
|
+
| BAN-04 | transition: all on editor content causing reflow jank - `reference/anti-patterns.md#ban-04` |
|
|
173
173
|
|
|
174
174
|
---
|
|
175
175
|
|
|
@@ -181,7 +181,7 @@ Cross-link: `reference/motion.md` — reduced-motion: remove mention list slide;
|
|
|
181
181
|
| Toolbar toggle buttons need aria-pressed | WAI-ARIA APG toolbar pattern |
|
|
182
182
|
| Placeholder via CSS ::before, not HTML attribute | Tiptap docs, Atlassian Fabric Editor |
|
|
183
183
|
| Mention list uses role="listbox" + role="option" | Tiptap mention extension, Lexical mention plugin |
|
|
184
|
-
| Ctrl/Cmd+B/I/U keyboard shortcuts are standard | Lexical, Tiptap, Slate
|
|
184
|
+
| Ctrl/Cmd+B/I/U keyboard shortcuts are standard | Lexical, Tiptap, Slate - all implement these |
|
|
185
185
|
|
|
186
186
|
Full system URLs: `connections/design-corpora.md`
|
|
187
187
|
|
|
@@ -221,6 +221,6 @@ grep -rn 'mention\|@mention\|MentionList' src/ | grep -v 'role="listbox"'
|
|
|
221
221
|
</div>
|
|
222
222
|
```
|
|
223
223
|
|
|
224
|
-
**Why it fails**: (1) Bare `contenteditable` is announced by most AT as a generic region, not a text input
|
|
224
|
+
**Why it fails**: (1) Bare `contenteditable` is announced by most AT as a generic region, not a text input - users do not know they can type. (2) `placeholder` is not a valid HTML attribute on `<div>` - screen readers do not announce it. (3) Toolbar buttons have no `aria-pressed` - AT cannot determine if bold/italic is currently active. (4) `document.execCommand` is deprecated.
|
|
225
225
|
**Grep detection**: `grep -rn 'contenteditable="true"' src/ | grep -v 'role="textbox"'`
|
|
226
226
|
**Fix**: Add `role="textbox"` + `aria-multiline="true"` + `aria-label="Post body"` to the editable div; implement placeholder via CSS `[data-empty]::before { content: attr(data-placeholder) }`; add `aria-pressed="true/false"` to toolbar toggle buttons; use a modern editor library (Tiptap, Lexical) instead of execCommand.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Select / Combobox
|
|
1
|
+
# Select / Combobox - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Radix UI, WAI-ARIA APG, Carbon, Headless UI, Mantine, Material 3, Ant Design, shadcn/ui
|
|
4
4
|
**Wave**: 1 · **Category**: Inputs
|
|
@@ -44,14 +44,14 @@ Label *
|
|
|
44
44
|
|
|
45
45
|
| Variant | Description | Systems |
|
|
46
46
|
|---------|-------------|---------|
|
|
47
|
-
| Native select | `<select>`
|
|
47
|
+
| Native select | `<select>` - minimal, accessible, no custom styling | All (as baseline) |
|
|
48
48
|
| Custom select | Styled trigger + listbox; no filter | Radix, Carbon, shadcn |
|
|
49
49
|
| Combobox | Trigger + text filter + listbox | Radix, Mantine, Headless UI, Ant |
|
|
50
50
|
| Multi-select | Multiple `aria-selected="true"` options; tag display | Mantine, Ant, Carbon |
|
|
51
51
|
| Async / searchable | Options loaded on query; loading state in listbox | Mantine, Ant, shadcn |
|
|
52
52
|
|
|
53
53
|
**Norm** (≥5/18): custom select must replicate native keyboard behavior exactly.
|
|
54
|
-
**Diverge**: tag vs. chip display for multi-select
|
|
54
|
+
**Diverge**: tag vs. chip display for multi-select - Mantine uses tags, Ant uses chips, Carbon uses checkboxes in dropdown. Checkbox approach is most accessible (state is visible without removing focus from listbox).
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
@@ -59,7 +59,7 @@ Label *
|
|
|
59
59
|
|
|
60
60
|
| State | Trigger | Visual | ARIA |
|
|
61
61
|
|-------|---------|--------|------|
|
|
62
|
-
| default |
|
|
62
|
+
| default | - | Resting trigger | `aria-expanded="false"` |
|
|
63
63
|
| open | trigger activated | Dropdown visible | `aria-expanded="true"` |
|
|
64
64
|
| option hovered | pointer | Option highlighted | `aria-activedescendant` updated |
|
|
65
65
|
| option selected | Enter / click | Checkmark or filled circle | `aria-selected="true"` |
|
|
@@ -78,7 +78,7 @@ Label *
|
|
|
78
78
|
| md (default) | 40px | 36px | 16px |
|
|
79
79
|
| lg | 48px | 44px | 16px |
|
|
80
80
|
|
|
81
|
-
Max dropdown height: 240px with internal scroll
|
|
81
|
+
Max dropdown height: 240px with internal scroll - prevents viewport overflow without pagination.
|
|
82
82
|
Option min-height: 36px (md) for touch targets *(Material 3, Polaris)*
|
|
83
83
|
|
|
84
84
|
---
|
|
@@ -87,7 +87,7 @@ Option min-height: 36px (md) for touch targets *(Material 3, Polaris)*
|
|
|
87
87
|
|
|
88
88
|
- Trigger value: same weight/size as input (14px/400)
|
|
89
89
|
- Option text: 14px/400; selected option: 14px/500
|
|
90
|
-
- Group label: 11px/600 uppercase, muted colour
|
|
90
|
+
- Group label: 11px/600 uppercase, muted colour - not an option, not focusable
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
@@ -96,9 +96,9 @@ Option min-height: 36px (md) for touch targets *(Material 3, Polaris)*
|
|
|
96
96
|
> **WAI-ARIA role**: `combobox` on trigger (select pattern); `listbox` on dropdown; `option` on items
|
|
97
97
|
> **Required attributes**: `aria-expanded`, `aria-haspopup="listbox"`, `aria-controls` (trigger→listbox), `aria-activedescendant` (updated on option focus)
|
|
98
98
|
|
|
99
|
-
### Keyboard Contract
|
|
99
|
+
### Keyboard Contract - Select (Listbox Pattern)
|
|
100
100
|
|
|
101
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
101
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/listbox/ - W3C - 2024*
|
|
102
102
|
|
|
103
103
|
| Key | Action |
|
|
104
104
|
|-----|--------|
|
|
@@ -112,9 +112,9 @@ Option min-height: 36px (md) for touch targets *(Material 3, Polaris)*
|
|
|
112
112
|
| Tab | Closes listbox; moves focus to next element |
|
|
113
113
|
| Printable character | (Type-ahead) Moves focus to next option starting with typed character |
|
|
114
114
|
|
|
115
|
-
### Keyboard Contract
|
|
115
|
+
### Keyboard Contract - Combobox
|
|
116
116
|
|
|
117
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
117
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/combobox/ - W3C - 2024*
|
|
118
118
|
|
|
119
119
|
| Key | Action |
|
|
120
120
|
|-----|--------|
|
|
@@ -128,7 +128,7 @@ Option min-height: 36px (md) for touch targets *(Material 3, Polaris)*
|
|
|
128
128
|
|
|
129
129
|
### Accessibility Rules
|
|
130
130
|
|
|
131
|
-
- `aria-activedescendant` on trigger MUST update as options are highlighted
|
|
131
|
+
- `aria-activedescendant` on trigger MUST update as options are highlighted - screen readers follow this, not DOM focus
|
|
132
132
|
- Options must have unique `id` attributes (for `aria-activedescendant` reference)
|
|
133
133
|
- Grouping: `role="group"` with `aria-label` wrapping grouped `role="option"` items
|
|
134
134
|
- Empty state: announce via `aria-live="polite"` region when filter returns no results
|
|
@@ -144,7 +144,7 @@ Option min-height: 36px (md) for touch targets *(Material 3, Polaris)*
|
|
|
144
144
|
| Dropdown close | 80ms | ease-in | Fade only |
|
|
145
145
|
| Option highlight | 60ms | ease | Background colour only |
|
|
146
146
|
|
|
147
|
-
Cross-link: `reference/motion.md`
|
|
147
|
+
Cross-link: `reference/motion.md` - `AnimatePresence` pattern for mount/unmount
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
@@ -157,9 +157,9 @@ Cross-link: `reference/motion.md` — `AnimatePresence` pattern for mount/unmoun
|
|
|
157
157
|
- Limit dropdown height to ~6–8 options; add scroll for more *(Carbon, Material 3)*
|
|
158
158
|
|
|
159
159
|
### Don't
|
|
160
|
-
- Don't close the dropdown on every keystroke in combobox mode
|
|
161
|
-
- Don't use a select for navigation
|
|
162
|
-
- Don't disable scroll inside the listbox
|
|
160
|
+
- Don't close the dropdown on every keystroke in combobox mode - only on selection or Escape *(WAI-ARIA APG)*
|
|
161
|
+
- Don't use a select for navigation - use a nav + router *(Carbon, Primer)*
|
|
162
|
+
- Don't disable scroll inside the listbox - virtualise instead for large lists *(Mantine, Ant)*
|
|
163
163
|
- Don't place interactive elements (links, buttons) inside `role="option"` *(WAI-ARIA APG)*
|
|
164
164
|
|
|
165
165
|
---
|
|
@@ -168,7 +168,7 @@ Cross-link: `reference/motion.md` — `AnimatePresence` pattern for mount/unmoun
|
|
|
168
168
|
|
|
169
169
|
| Anti-pattern | Entry |
|
|
170
170
|
|--------------|-------|
|
|
171
|
-
| Custom select without ARIA | `reference/anti-patterns.md`
|
|
171
|
+
| Custom select without ARIA | `reference/anti-patterns.md` - ARIA role omission pattern |
|
|
172
172
|
|
|
173
173
|
---
|
|
174
174
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Sidebar (Collapsible Side Navigation Panel)
|
|
1
|
+
# Sidebar (Collapsible Side Navigation Panel) - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Polaris, Atlassian, UUPM (app-interface, MIT)
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A sidebar provides persistent or collapsible secondary navigation along the vertical axis of an application. In expanded state it shows icon + label; in collapsed state it shows icon only (with a tooltip). It is distinct from a Drawer (which is a modal overlay
|
|
10
|
+
A sidebar provides persistent or collapsible secondary navigation along the vertical axis of an application. In expanded state it shows icon + label; in collapsed state it shows icon only (with a tooltip). It is distinct from a Drawer (which is a modal overlay - see `drawer.md`) and from a Navbar (primary horizontal navigation). Use a sidebar for application-level section switching and hierarchical settings navigation. *(Material 3 Navigation Drawer, Carbon UI Shell Left Nav, Atlassian SideNavigation, Polaris Navigation agree)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -59,9 +59,9 @@ A sidebar provides persistent or collapsible secondary navigation along the vert
|
|
|
59
59
|
|-------|---------|--------|------|
|
|
60
60
|
| expanded | default or toggle | Full width, labels visible | `aria-expanded="true"` on toggle |
|
|
61
61
|
| collapsed | toggle click | Icon-only, labels hidden | `aria-expanded="false"` on toggle |
|
|
62
|
-
| item-default |
|
|
63
|
-
| item-hover | pointer over | 8% overlay |
|
|
64
|
-
| item-focus | keyboard focus | 2px focus-visible ring |
|
|
62
|
+
| item-default | - | Resting fill | - |
|
|
63
|
+
| item-hover | pointer over | 8% overlay | - |
|
|
64
|
+
| item-focus | keyboard focus | 2px focus-visible ring | - |
|
|
65
65
|
| item-active | current route | Filled pill or left indicator bar | `aria-current="page"` |
|
|
66
66
|
| subsection-open | button click | Children visible; chevron rotated 180° | `aria-expanded="true"` on section button |
|
|
67
67
|
| subsection-closed | button click | Children hidden | `aria-expanded="false"` on section button |
|
|
@@ -74,7 +74,7 @@ A sidebar provides persistent or collapsible secondary navigation along the vert
|
|
|
74
74
|
|-------|-------|-------------|----------------|
|
|
75
75
|
| Expanded | 240–280px | 40px | 16px |
|
|
76
76
|
| Collapsed | 48–64px | 40px | 12px (centered icon) |
|
|
77
|
-
| Sub-item indent |
|
|
77
|
+
| Sub-item indent | - | 36px | 32px (16px base + 16px indent) |
|
|
78
78
|
|
|
79
79
|
**Norm**: 240px expanded width (Carbon, Atlassian, Polaris). 40px item height matches button defaults.
|
|
80
80
|
|
|
@@ -84,10 +84,10 @@ A sidebar provides persistent or collapsible secondary navigation along the vert
|
|
|
84
84
|
|
|
85
85
|
- Nav item label: body-sm (13–14px), weight 400; active item weight 500 or 600
|
|
86
86
|
- Sub-section heading (if present): label-xs (11–12px), uppercase, weight 600, `color: --text-subtle`
|
|
87
|
-
- Tooltip: body-xs (11–12px)
|
|
88
|
-
- Never truncate nav item labels
|
|
87
|
+
- Tooltip: body-xs (11–12px) - concise, matches item label exactly in collapsed state
|
|
88
|
+
- Never truncate nav item labels - resize the sidebar or abbreviate the label intentionally
|
|
89
89
|
|
|
90
|
-
Cross-link: `reference/typography.md`
|
|
90
|
+
Cross-link: `reference/typography.md` - label scale, body-sm
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
@@ -98,7 +98,7 @@ Cross-link: `reference/typography.md` — label scale, body-sm
|
|
|
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/disclosure/ - W3C - 2024*
|
|
102
102
|
|
|
103
103
|
| Key | Action |
|
|
104
104
|
|-----|--------|
|
|
@@ -116,7 +116,7 @@ Cross-link: `reference/typography.md` — label scale, body-sm
|
|
|
116
116
|
- In collapsed state, each icon-only item MUST have a tooltip AND `aria-label` (tooltip is not a substitute for accessible name)
|
|
117
117
|
- `aria-current="page"` MUST be present on the currently active item
|
|
118
118
|
|
|
119
|
-
Cross-link: `reference/accessibility.md`
|
|
119
|
+
Cross-link: `reference/accessibility.md` - landmark labelling, disclosure pattern
|
|
120
120
|
|
|
121
121
|
---
|
|
122
122
|
|
|
@@ -130,9 +130,9 @@ Cross-link: `reference/accessibility.md` — landmark labelling, disclosure patt
|
|
|
130
130
|
| Chevron rotate | 150ms | ease-in-out | 0° → 180° on open |
|
|
131
131
|
| Label fade in | 100ms | ease-out | Delay until width ≥ 140px to prevent overlap |
|
|
132
132
|
|
|
133
|
-
**BAN**: Animating sidebar width using `transition: all`
|
|
133
|
+
**BAN**: Animating sidebar width using `transition: all` - catches unrelated property changes and causes jank.
|
|
134
134
|
|
|
135
|
-
Cross-link: `reference/motion.md`
|
|
135
|
+
Cross-link: `reference/motion.md` - layout transitions, BAN-04
|
|
136
136
|
|
|
137
137
|
---
|
|
138
138
|
|
|
@@ -145,7 +145,7 @@ Cross-link: `reference/motion.md` — layout transitions, BAN-04
|
|
|
145
145
|
- Use `aria-expanded` on sub-section toggles *(WAI-ARIA APG disclosure pattern)*
|
|
146
146
|
|
|
147
147
|
### Don't
|
|
148
|
-
- Don't use `<a href="#">` for items that don't navigate
|
|
148
|
+
- Don't use `<a href="#">` for items that don't navigate - breaks bookmark/open-in-new-tab expectations *(Carbon, WAI-ARIA)*
|
|
149
149
|
- Don't hide sub-items with `display: none` without also removing them from tab order *(WCAG 2.1.1)*
|
|
150
150
|
- Don't use the same `aria-label` on both sidebar nav and top navbar *(WAI-ARIA landmark uniqueness)*
|
|
151
151
|
- Don't collapse the sidebar below 44px touch target width on mobile *(WCAG 2.5.5)*
|
|
@@ -156,7 +156,7 @@ Cross-link: `reference/motion.md` — layout transitions, BAN-04
|
|
|
156
156
|
|
|
157
157
|
| Anti-pattern | Entry |
|
|
158
158
|
|--------------|-------|
|
|
159
|
-
| BAN-04 | `transition: all` on interactive elements
|
|
159
|
+
| BAN-04 | `transition: all` on interactive elements - `reference/anti-patterns.md#ban-04` |
|
|
160
160
|
|
|
161
161
|
---
|
|
162
162
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Skeleton
|
|
1
|
+
# Skeleton - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Polaris, Carbon, Atlassian, Mantine
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A skeleton screen is a loading placeholder that mirrors the shape of the content it will replace
|
|
10
|
+
A skeleton screen is a loading placeholder that mirrors the shape of the content it will replace - text lines, images, cards, avatars. It reduces perceived wait time by showing the structural layout before real data arrives, preventing the jarring reflow that occurs when content suddenly appears. Use skeleton when the content shape is known; use an indeterminate spinner or progress bar when shape is unknown. *(Polaris, Carbon, Atlassian, Mantine agree: skeleton = shape-matched placeholder, not generic spinner)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -67,18 +67,18 @@ A skeleton screen is a loading placeholder that mirrors the shape of the content
|
|
|
67
67
|
| Image block | Match target image aspect ratio | 16:9, 1:1, 4:3 common |
|
|
68
68
|
| Gap between text lines | 8px | Matches body line-height rhythm |
|
|
69
69
|
|
|
70
|
-
**Norm**: Match exact pixel dimensions of the content being replaced
|
|
70
|
+
**Norm**: Match exact pixel dimensions of the content being replaced - layout shift score is zero when skeleton matches final content size *(Polaris, Mantine)*.
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
74
|
## Typography
|
|
75
75
|
|
|
76
|
-
Skeleton shapes are purely visual
|
|
76
|
+
Skeleton shapes are purely visual - no typography content. However:
|
|
77
77
|
- Text-line height should match the `line-height` of the real text it replaces
|
|
78
78
|
- Heading skeleton height should match the heading's `font-size` + leading
|
|
79
|
-
- Do NOT use placeholder text ("Loading…") inside skeleton shapes
|
|
79
|
+
- Do NOT use placeholder text ("Loading…") inside skeleton shapes - use `aria-label` on the container instead
|
|
80
80
|
|
|
81
|
-
Cross-link: `reference/typography.md`
|
|
81
|
+
Cross-link: `reference/typography.md` - line-height scale for matching skeleton dimensions
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -89,7 +89,7 @@ Cross-link: `reference/typography.md` — line-height scale for matching skeleto
|
|
|
89
89
|
|
|
90
90
|
### Keyboard Contract
|
|
91
91
|
|
|
92
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
92
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/ - W3C - 2024*
|
|
93
93
|
|
|
94
94
|
| Key | Action |
|
|
95
95
|
|-----|--------|
|
|
@@ -99,13 +99,13 @@ Skeleton elements must not receive focus. The container is not focusable unless
|
|
|
99
99
|
|
|
100
100
|
### Accessibility Rules
|
|
101
101
|
|
|
102
|
-
- Every skeleton shape element MUST have `aria-hidden="true"`
|
|
102
|
+
- Every skeleton shape element MUST have `aria-hidden="true"` - blank shapes announced by screen readers ("image", "text") confuse users *(Polaris, Carbon)*
|
|
103
103
|
- The container MUST have `aria-busy="true"` while loading, set to `false` (or removed) when content appears *(WAI-ARIA APG)*
|
|
104
|
-
- The container MUST have `aria-label="Loading…"` or equivalent
|
|
105
|
-
- Do NOT use skeleton as the only loading indicator for screen reader users
|
|
106
|
-
- Shimmer animation MUST be suppressed under `prefers-reduced-motion`
|
|
104
|
+
- The container MUST have `aria-label="Loading…"` or equivalent - this is what screen readers announce while `aria-busy="true"` *(WAI-ARIA APG)*
|
|
105
|
+
- Do NOT use skeleton as the only loading indicator for screen reader users - announce loading state via live region if the transition is programmatic *(Carbon)*
|
|
106
|
+
- Shimmer animation MUST be suppressed under `prefers-reduced-motion` - use static fill instead *(WCAG 2.3.3)*
|
|
107
107
|
|
|
108
|
-
Cross-link: `reference/accessibility.md`
|
|
108
|
+
Cross-link: `reference/accessibility.md` - `aria-busy`, `prefers-reduced-motion`
|
|
109
109
|
|
|
110
110
|
---
|
|
111
111
|
|
|
@@ -114,15 +114,15 @@ Cross-link: `reference/accessibility.md` — `aria-busy`, `prefers-reduced-motio
|
|
|
114
114
|
| Transition | Duration | Easing | Notes |
|
|
115
115
|
|------------|----------|--------|-------|
|
|
116
116
|
| Shimmer sweep | 1.5s | ease-in-out | 130° gradient: transparent → surface-highlight → transparent |
|
|
117
|
-
| Loop delay | 0.5s |
|
|
117
|
+
| Loop delay | 0.5s | - | Pause between sweeps to avoid strobing |
|
|
118
118
|
| Skeleton → content | 200ms | ease-out | Fade-in real content over skeleton |
|
|
119
119
|
|
|
120
|
-
Shimmer gradient direction: 130 degrees (roughly top-left to bottom-right)
|
|
120
|
+
Shimmer gradient direction: 130 degrees (roughly top-left to bottom-right) - matches natural reading direction.
|
|
121
121
|
Background: `surface-variant` token (slightly darker than background surface, lighter than border).
|
|
122
122
|
|
|
123
|
-
**BAN**: High-contrast shimmer (e.g. white → gray on dark)
|
|
123
|
+
**BAN**: High-contrast shimmer (e.g. white → gray on dark) - too visually noisy. Do NOT use spinner animation inside a skeleton shape. Under `prefers-reduced-motion`, remove the sweep entirely and use static fill.
|
|
124
124
|
|
|
125
|
-
Cross-link: `reference/motion.md`
|
|
125
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: static fill, no gradient sweep
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
@@ -135,10 +135,10 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: static fill, no
|
|
|
135
135
|
- Set `aria-busy="true"` + `aria-label="Loading…"` on the container *(WAI-ARIA APG)*
|
|
136
136
|
|
|
137
137
|
### Don't
|
|
138
|
-
- Don't use a spinner when content shape is known
|
|
139
|
-
- Don't use strong contrast for shimmer
|
|
140
|
-
- Don't animate shimmer under `prefers-reduced-motion`
|
|
141
|
-
- Don't add visible "Loading…" text inside skeleton shapes
|
|
138
|
+
- Don't use a spinner when content shape is known - skeleton is always preferred for layout-bearing slots *(Carbon, Polaris)*
|
|
139
|
+
- Don't use strong contrast for shimmer - use `surface-variant` (low contrast) *(Atlassian, Mantine)*
|
|
140
|
+
- Don't animate shimmer under `prefers-reduced-motion` - use static fill *(WCAG 2.3.3)*
|
|
141
|
+
- Don't add visible "Loading…" text inside skeleton shapes - put it on the container via `aria-label` *(Carbon)*
|
|
142
142
|
|
|
143
143
|
---
|
|
144
144
|
|