@hegemonart/get-design-done 1.41.5 → 1.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +1120 -1029
- package/README.md +158 -154
- package/SKILL.md +42 -42
- package/agents/README.md +53 -53
- package/agents/a11y-mapper.md +3 -3
- package/agents/component-benchmark-harvester.md +8 -8
- package/agents/component-benchmark-synthesizer.md +11 -11
- package/agents/component-taxonomy-mapper.md +5 -5
- package/agents/compose-executor.md +25 -25
- package/agents/conflict-resolver.md +8 -8
- package/agents/cost-forecaster.md +12 -12
- package/agents/decision-journal-exporter.md +5 -5
- package/agents/design-advisor.md +19 -19
- package/agents/design-assumptions-analyzer.md +16 -16
- package/agents/design-auditor.md +39 -39
- package/agents/design-authority-watcher.md +28 -28
- package/agents/design-component-generator.md +27 -27
- package/agents/design-context-builder.md +66 -66
- package/agents/design-context-checker-gate.md +5 -5
- package/agents/design-context-checker.md +20 -20
- package/agents/design-discussant.md +23 -23
- package/agents/design-doc-writer.md +12 -12
- package/agents/design-executor.md +38 -38
- package/agents/design-figma-writer.md +31 -31
- package/agents/design-fixer.md +27 -27
- package/agents/design-integration-checker-gate.md +5 -5
- package/agents/design-integration-checker.md +29 -29
- package/agents/design-paper-writer.md +14 -14
- package/agents/design-pattern-mapper.md +9 -9
- package/agents/design-pencil-writer.md +12 -12
- package/agents/design-phase-researcher.md +14 -14
- package/agents/design-plan-checker.md +13 -13
- package/agents/design-planner.md +24 -24
- package/agents/design-reflector.md +48 -48
- package/agents/design-research-synthesizer.md +21 -21
- package/agents/design-start-writer.md +7 -7
- package/agents/design-update-checker.md +8 -8
- package/agents/design-verifier-gate.md +5 -5
- package/agents/design-verifier.md +80 -80
- package/agents/ds-generator.md +14 -14
- package/agents/ds-migration-planner.md +12 -12
- package/agents/email-executor.md +26 -26
- package/agents/experiment-result-ingester.md +10 -10
- package/agents/flutter-executor.md +28 -28
- package/agents/gdd-graph-refresh.md +10 -10
- package/agents/gdd-intel-updater.md +11 -11
- package/agents/gdd-learnings-extractor.md +2 -2
- package/agents/motion-mapper.md +8 -8
- package/agents/motion-verifier.md +16 -16
- package/agents/pdf-executor.md +27 -27
- package/agents/perf-analyzer.md +20 -20
- package/agents/pr-commenter.md +24 -24
- package/agents/prototype-gate.md +29 -29
- package/agents/quality-gate-runner.md +21 -21
- package/agents/rollout-coordinator.md +8 -8
- package/agents/swift-executor.md +41 -41
- package/agents/ticket-sync-agent.md +19 -19
- package/agents/token-mapper.md +6 -6
- package/agents/user-research-synthesizer.md +13 -13
- package/agents/visual-hierarchy-mapper.md +2 -2
- package/dist/claude-code/.claude/skills/add-backlog/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +170 -0
- package/dist/claude-code/.claude/skills/audit/SKILL.md +79 -0
- package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +94 -0
- package/dist/claude-code/.claude/skills/benchmark/SKILL.md +65 -0
- package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +43 -0
- package/dist/claude-code/.claude/skills/brief/SKILL.md +128 -0
- package/dist/claude-code/.claude/skills/budget/SKILL.md +45 -0
- package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +66 -0
- package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +126 -0
- package/dist/claude-code/.claude/skills/check-update/SKILL.md +98 -0
- package/dist/claude-code/.claude/skills/compare/SKILL.md +82 -0
- package/dist/claude-code/.claude/skills/compare/compare-rubric.md +171 -0
- package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +81 -0
- package/dist/claude-code/.claude/skills/connections/SKILL.md +71 -0
- package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +608 -0
- package/dist/claude-code/.claude/skills/continue/SKILL.md +24 -0
- package/dist/claude-code/.claude/skills/darkmode/SKILL.md +76 -0
- package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +258 -0
- package/dist/claude-code/.claude/skills/debug/SKILL.md +41 -0
- package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +119 -0
- package/dist/claude-code/.claude/skills/design/SKILL.md +99 -0
- package/dist/claude-code/.claude/skills/design/design-procedure.md +304 -0
- package/dist/claude-code/.claude/skills/discover/SKILL.md +72 -0
- package/dist/claude-code/.claude/skills/discover/discover-procedure.md +222 -0
- package/dist/claude-code/.claude/skills/discuss/SKILL.md +96 -0
- package/dist/claude-code/.claude/skills/do/SKILL.md +45 -0
- package/dist/claude-code/.claude/skills/explore/SKILL.md +105 -0
- package/dist/claude-code/.claude/skills/explore/explore-procedure.md +267 -0
- package/dist/claude-code/.claude/skills/export/SKILL.md +30 -0
- package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +98 -0
- package/dist/claude-code/.claude/skills/fast/SKILL.md +91 -0
- package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +64 -0
- package/dist/claude-code/.claude/skills/figma-write/SKILL.md +39 -0
- package/dist/claude-code/.claude/skills/graphify/SKILL.md +49 -0
- package/dist/claude-code/.claude/skills/health/SKILL.md +99 -0
- package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +44 -0
- package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +69 -0
- package/dist/claude-code/.claude/skills/help/SKILL.md +87 -0
- package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +61 -0
- package/dist/claude-code/.claude/skills/locale/SKILL.md +51 -0
- package/dist/claude-code/.claude/skills/map/SKILL.md +89 -0
- package/dist/claude-code/.claude/skills/migrate/SKILL.md +70 -0
- package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +37 -0
- package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +87 -0
- package/dist/claude-code/.claude/skills/new-project/SKILL.md +53 -0
- package/dist/claude-code/.claude/skills/next/SKILL.md +68 -0
- package/dist/claude-code/.claude/skills/note/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +86 -0
- package/dist/claude-code/.claude/skills/optimize/SKILL.md +97 -0
- package/dist/claude-code/.claude/skills/pause/SKILL.md +77 -0
- package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +88 -0
- package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +161 -0
- package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +90 -0
- package/dist/claude-code/.claude/skills/peers/SKILL.md +96 -0
- package/dist/claude-code/.claude/skills/plan/SKILL.md +105 -0
- package/dist/claude-code/.claude/skills/plan/plan-procedure.md +278 -0
- package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +32 -0
- package/dist/claude-code/.claude/skills/progress/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +90 -0
- package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +101 -0
- package/dist/claude-code/.claude/skills/quick/SKILL.md +44 -0
- package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +32 -0
- package/dist/claude-code/.claude/skills/recall/SKILL.md +75 -0
- package/dist/claude-code/.claude/skills/reflect/SKILL.md +85 -0
- package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +120 -0
- package/dist/claude-code/.claude/skills/report-issue/SKILL.md +53 -0
- package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +120 -0
- package/dist/claude-code/.claude/skills/resume/SKILL.md +93 -0
- package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +46 -0
- package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +42 -0
- package/dist/claude-code/.claude/skills/roi/SKILL.md +54 -0
- package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +35 -0
- package/dist/claude-code/.claude/skills/router/SKILL.md +89 -0
- package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +65 -0
- package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +78 -0
- package/dist/claude-code/.claude/skills/router/router-rules.md +84 -0
- package/dist/claude-code/.claude/skills/scan/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/scan/scan-procedure.md +732 -0
- package/dist/claude-code/.claude/skills/settings/SKILL.md +87 -0
- package/dist/claude-code/.claude/skills/ship/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/sketch/SKILL.md +78 -0
- package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +79 -0
- package/dist/claude-code/.claude/skills/spike/SKILL.md +67 -0
- package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +86 -0
- package/dist/claude-code/.claude/skills/start/SKILL.md +67 -0
- package/dist/claude-code/.claude/skills/start/start-procedure.md +115 -0
- package/dist/claude-code/.claude/skills/stats/SKILL.md +51 -0
- package/dist/claude-code/.claude/skills/style/SKILL.md +71 -0
- package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +150 -0
- package/dist/claude-code/.claude/skills/synthesize/SKILL.md +94 -0
- package/dist/claude-code/.claude/skills/timeline/SKILL.md +66 -0
- package/dist/claude-code/.claude/skills/todo/SKILL.md +64 -0
- package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/undo/SKILL.md +31 -0
- package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +54 -0
- package/dist/claude-code/.claude/skills/update/SKILL.md +56 -0
- package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +78 -0
- package/dist/claude-code/.claude/skills/verify/SKILL.md +113 -0
- package/dist/claude-code/.claude/skills/verify/verify-procedure.md +512 -0
- package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +81 -0
- package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +82 -0
- package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +26 -0
- package/package.json +8 -2
- package/reference/DEPRECATIONS.md +21 -7
- package/reference/STATE-TEMPLATE.md +26 -26
- package/reference/accessibility.md +13 -13
- package/reference/adr-format.md +13 -13
- package/reference/ai-native-tool-interface.md +5 -5
- package/reference/anti-patterns.md +9 -9
- package/reference/architecture-vocabulary.md +31 -31
- package/reference/audit-scoring.md +13 -13
- package/reference/authority-feeds.md +36 -36
- package/reference/bandit-integration.md +25 -25
- package/reference/brand-voice.md +36 -36
- package/reference/capability-gap-stage-gate.md +20 -20
- package/reference/checklists.md +26 -26
- package/reference/cli-localization.md +13 -13
- package/reference/codex-tools.md +2 -2
- package/reference/color-theory.md +28 -28
- package/reference/component-authoring.md +4 -4
- package/reference/components/README.md +13 -13
- package/reference/components/TEMPLATE.md +13 -13
- package/reference/components/accordion.md +15 -15
- package/reference/components/alert.md +25 -25
- package/reference/components/badge.md +18 -18
- package/reference/components/breadcrumbs.md +24 -24
- package/reference/components/button.md +21 -21
- package/reference/components/card.md +13 -13
- package/reference/components/checkbox.md +20 -20
- package/reference/components/chip.md +20 -20
- package/reference/components/command-palette.md +15 -15
- package/reference/components/date-picker.md +22 -22
- package/reference/components/drawer.md +13 -13
- package/reference/components/file-upload.md +22 -22
- package/reference/components/input.md +18 -18
- package/reference/components/label.md +25 -25
- package/reference/components/link.md +19 -19
- package/reference/components/list.md +17 -17
- package/reference/components/menu.md +19 -19
- package/reference/components/modal-dialog.md +16 -16
- package/reference/components/navbar.md +19 -19
- package/reference/components/pagination.md +18 -18
- package/reference/components/popover.md +12 -12
- package/reference/components/progress.md +18 -18
- package/reference/components/radio.md +17 -17
- package/reference/components/rich-text-editor.md +24 -24
- package/reference/components/select-combobox.md +16 -16
- package/reference/components/sidebar.md +15 -15
- package/reference/components/skeleton.md +20 -20
- package/reference/components/slider.md +20 -20
- package/reference/components/stepper.md +24 -24
- package/reference/components/switch.md +19 -19
- package/reference/components/table.md +21 -21
- package/reference/components/tabs.md +11 -11
- package/reference/components/toast.md +19 -19
- package/reference/components/tooltip.md +19 -19
- package/reference/components/tree.md +17 -17
- package/reference/composition.md +38 -38
- package/reference/config-schema.md +37 -37
- package/reference/context-md-format.md +9 -9
- package/reference/contrast-advanced.md +29 -29
- package/reference/conversational-ui.md +17 -17
- package/reference/cost-governance.md +14 -14
- package/reference/css-grid-layout.md +8 -8
- package/reference/cycle-handoff-preamble.md +3 -3
- package/reference/data-visualization.md +67 -67
- package/reference/debugger-philosophy.md +5 -5
- package/reference/design-system-guidance.md +21 -21
- package/reference/design-systems-catalog.md +20 -20
- package/reference/design-variants.md +11 -11
- package/reference/domains/civic-patterns.md +10 -10
- package/reference/domains/finance-patterns.md +9 -9
- package/reference/domains/gaming-patterns.md +9 -9
- package/reference/domains/healthcare-patterns.md +11 -11
- package/reference/ds-bootstrap-rubric.md +13 -13
- package/reference/email-design.md +22 -22
- package/reference/emotional-design.md +10 -10
- package/reference/error-recovery.md +11 -11
- package/reference/export-formats.md +7 -7
- package/reference/figma-sandbox.md +6 -6
- package/reference/first-principles.md +10 -10
- package/reference/form-patterns.md +26 -26
- package/reference/framer-motion-patterns.md +49 -49
- package/reference/gdd-runtime-audit.md +17 -17
- package/reference/gdd-threat-model.md +44 -44
- package/reference/gemini-tools.md +3 -3
- package/reference/gestalt.md +24 -24
- package/reference/heuristics.md +32 -32
- package/reference/i18n.md +44 -44
- package/reference/iconography.md +24 -24
- package/reference/image-optimization.md +14 -14
- package/reference/information-architecture.md +47 -47
- package/reference/intel-schema.md +1 -1
- package/reference/known-failure-modes.md +37 -37
- package/reference/meta-rules.md +5 -5
- package/reference/migrations/material-3-to-4.md +17 -17
- package/reference/migrations/mui-v6.md +16 -16
- package/reference/migrations/shadcn-v2.md +25 -25
- package/reference/migrations/tailwind-v4.md +21 -21
- package/reference/model-prices.md +3 -3
- package/reference/model-tiers.md +40 -40
- package/reference/motion-advanced.md +21 -21
- package/reference/motion-easings.md +29 -29
- package/reference/motion-interpolate.md +1 -1
- package/reference/motion-spring.md +13 -13
- package/reference/motion-transition-taxonomy.md +34 -34
- package/reference/motion.md +31 -31
- package/reference/multi-author-model.md +13 -13
- package/reference/native-platforms.md +28 -28
- package/reference/notification-routing.md +6 -6
- package/reference/onboarding-progressive-disclosure.md +32 -32
- package/reference/openrouter-tier-mapping.md +8 -8
- package/reference/palette-catalog.md +37 -37
- package/reference/parallelism-rules.md +20 -20
- package/reference/peer-cli-capabilities.md +14 -14
- package/reference/peer-protocols.md +21 -21
- package/reference/perf-budget.md +21 -21
- package/reference/performance.md +22 -22
- package/reference/platforms.md +51 -51
- package/reference/pr-review-integration.md +7 -7
- package/reference/prices/antigravity.md +3 -3
- package/reference/prices/augment.md +3 -3
- package/reference/prices/claude.md +2 -2
- package/reference/prices/cline.md +4 -4
- package/reference/prices/codebuddy.md +3 -3
- package/reference/prices/codex.md +2 -2
- package/reference/prices/copilot.md +3 -3
- package/reference/prices/cursor.md +3 -3
- package/reference/prices/gemini.md +2 -2
- package/reference/prices/kilo.md +3 -3
- package/reference/prices/opencode.md +4 -4
- package/reference/prices/qwen.md +2 -2
- package/reference/prices/trae.md +3 -3
- package/reference/prices/windsurf.md +3 -3
- package/reference/prices.openrouter.md +5 -5
- package/reference/print-design.md +36 -36
- package/reference/priority-matrix.md +2 -2
- package/reference/project-skills-guide.md +3 -3
- package/reference/proportion-systems.md +23 -23
- package/reference/pseudonymization-rules.md +30 -30
- package/reference/registry.json +7 -0
- package/reference/retrieval-contract.md +14 -14
- package/reference/review-format.md +7 -7
- package/reference/rollout-coordination.md +10 -10
- package/reference/rtl-cjk-cultural.md +39 -39
- package/reference/runtime-models.md +28 -28
- package/reference/shared-preamble.md +26 -26
- package/reference/skill-authoring-contract.md +16 -16
- package/reference/skill-placeholders.md +71 -0
- package/reference/start-interview.md +10 -10
- package/reference/style-vocabulary.md +25 -25
- package/reference/surfaces.md +4 -4
- package/reference/ticket-sync.md +9 -9
- package/reference/typography.md +64 -64
- package/reference/user-research.md +54 -54
- package/reference/variable-fonts-loading.md +15 -15
- package/reference/visual-hierarchy-layout.md +41 -41
- package/scripts/lib/build/factory.cjs +62 -0
- package/scripts/lib/build/harness-configs.cjs +64 -0
- package/scripts/lib/manifest/prose-denylist.json +1 -1
- package/sdk/cli/commands/build.ts +106 -0
- package/sdk/cli/index.js +84 -2
- package/sdk/cli/index.ts +7 -0
- package/skills/add-backlog/SKILL.md +3 -3
- package/skills/analyze-dependencies/SKILL.md +10 -10
- package/skills/apply-reflections/SKILL.md +13 -13
- package/skills/apply-reflections/apply-reflections-procedure.md +20 -20
- package/skills/audit/SKILL.md +7 -7
- package/skills/bandit-status/SKILL.md +7 -7
- package/skills/benchmark/SKILL.md +7 -7
- package/skills/bootstrap-ds/SKILL.md +10 -10
- package/skills/brief/SKILL.md +20 -20
- package/skills/budget/SKILL.md +4 -4
- package/skills/cache-manager/SKILL.md +6 -6
- package/skills/cache-manager/cache-policy.md +5 -5
- package/skills/check-update/SKILL.md +5 -5
- package/skills/compare/SKILL.md +15 -15
- package/skills/compare/compare-rubric.md +17 -17
- package/skills/complete-cycle/SKILL.md +5 -5
- package/skills/connections/SKILL.md +11 -11
- package/skills/connections/connections-onboarding.md +76 -76
- package/skills/continue/SKILL.md +2 -2
- package/skills/darkmode/SKILL.md +17 -17
- package/skills/darkmode/darkmode-audit-procedure.md +7 -7
- package/skills/debug/SKILL.md +3 -3
- package/skills/debug/debug-feedback-loops.md +12 -12
- package/skills/design/SKILL.md +12 -12
- package/skills/design/design-procedure.md +23 -23
- package/skills/discover/SKILL.md +7 -7
- package/skills/discover/discover-procedure.md +18 -18
- package/skills/discuss/SKILL.md +12 -12
- package/skills/do/SKILL.md +1 -1
- package/skills/explore/SKILL.md +21 -21
- package/skills/explore/explore-procedure.md +48 -48
- package/skills/export/SKILL.md +9 -9
- package/skills/extract-learnings/SKILL.md +5 -5
- package/skills/fast/SKILL.md +7 -7
- package/skills/figma-extract/SKILL.md +11 -11
- package/skills/figma-write/SKILL.md +6 -6
- package/skills/graphify/SKILL.md +4 -4
- package/skills/health/SKILL.md +16 -16
- package/skills/health/health-mcp-detection.md +3 -3
- package/skills/health/health-skill-length-report.md +6 -6
- package/skills/help/SKILL.md +1 -1
- package/skills/list-assumptions/SKILL.md +4 -4
- package/skills/map/SKILL.md +12 -12
- package/skills/migrate/SKILL.md +5 -5
- package/skills/new-cycle/SKILL.md +2 -2
- package/skills/new-cycle/milestone-completeness-rubric.md +16 -16
- package/skills/new-project/SKILL.md +1 -1
- package/skills/next/SKILL.md +5 -5
- package/skills/note/SKILL.md +1 -1
- package/skills/openrouter-status/SKILL.md +4 -4
- package/skills/optimize/SKILL.md +15 -15
- package/skills/pause/SKILL.md +5 -5
- package/skills/peer-cli-add/SKILL.md +11 -11
- package/skills/peer-cli-add/peer-cli-protocol.md +39 -39
- package/skills/peer-cli-customize/SKILL.md +14 -14
- package/skills/peers/SKILL.md +4 -4
- package/skills/plan/SKILL.md +13 -13
- package/skills/plan/plan-procedure.md +24 -24
- package/skills/plant-seed/SKILL.md +4 -4
- package/skills/pr-branch/SKILL.md +2 -2
- package/skills/progress/SKILL.md +15 -15
- package/skills/quality-gate/SKILL.md +22 -22
- package/skills/quality-gate/threat-modeling.md +19 -19
- package/skills/quick/SKILL.md +5 -5
- package/skills/reapply-patches/SKILL.md +7 -7
- package/skills/reflect/SKILL.md +3 -3
- package/skills/reflect/procedures/capability-gap-scan.md +11 -11
- package/skills/report-issue/SKILL.md +5 -5
- package/skills/report-issue/report-issue-procedure.md +27 -27
- package/skills/resume/SKILL.md +9 -9
- package/skills/review-backlog/SKILL.md +3 -3
- package/skills/review-decisions/SKILL.md +3 -3
- package/skills/roi/SKILL.md +5 -5
- package/skills/rollout-status/SKILL.md +4 -4
- package/skills/router/SKILL.md +11 -11
- package/skills/router/capability-gap-emitter.md +6 -6
- package/skills/router/router-pick-emitter.md +9 -9
- package/skills/router/router-rules.md +7 -7
- package/skills/scan/SKILL.md +16 -16
- package/skills/scan/scan-procedure.md +42 -42
- package/skills/settings/SKILL.md +2 -2
- package/skills/ship/SKILL.md +7 -7
- package/skills/sketch/SKILL.md +10 -10
- package/skills/sketch-wrap-up/SKILL.md +12 -12
- package/skills/skill-manifest/SKILL.md +5 -5
- package/skills/spike/SKILL.md +7 -7
- package/skills/spike-wrap-up/SKILL.md +13 -13
- package/skills/start/SKILL.md +8 -8
- package/skills/start/start-procedure.md +9 -9
- package/skills/stats/SKILL.md +5 -5
- package/skills/style/SKILL.md +12 -12
- package/skills/style/style-doc-procedure.md +12 -12
- package/skills/synthesize/SKILL.md +10 -10
- package/skills/timeline/SKILL.md +4 -4
- package/skills/todo/SKILL.md +3 -3
- package/skills/turn-closeout/SKILL.md +10 -10
- package/skills/unlock-decision/SKILL.md +3 -3
- package/skills/update/SKILL.md +9 -9
- package/skills/using-gdd/SKILL.md +17 -17
- package/skills/verify/SKILL.md +13 -13
- package/skills/verify/verify-procedure.md +34 -34
- package/skills/warm-cache/SKILL.md +8 -8
- package/skills/watch-authorities/SKILL.md +9 -9
- package/skills/zoom-out/SKILL.md +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Chip / Tag
|
|
1
|
+
# Chip / Tag - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon, Atlassian, Mantine
|
|
4
4
|
**Wave**: 3 · **Category**: Feedback
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A chip (or tag) is a compact, interactive label that represents an attribute, filter, or selection. It is commonly used for multi-select filter interfaces, tag-input fields (user-generated labels), one-time suggestion prompts, and static display labels. Each variant has distinct interaction semantics
|
|
10
|
+
A chip (or tag) is a compact, interactive label that represents an attribute, filter, or selection. It is commonly used for multi-select filter interfaces, tag-input fields (user-generated labels), one-time suggestion prompts, and static display labels. Each variant has distinct interaction semantics - filter chips toggle on/off, input chips are removable, suggestion chips trigger a one-time action, and display chips are static. *(Material 3, Carbon, Atlassian, Mantine agree on the four-variant taxonomy)*
|
|
11
11
|
|
|
12
12
|
*UUPM app-interface: filter chips in search/filter UIs and tag input patterns (MIT attribution)*
|
|
13
13
|
|
|
@@ -51,13 +51,13 @@ A chip (or tag) is a compact, interactive label that represents an attribute, fi
|
|
|
51
51
|
|
|
52
52
|
| State | Trigger | Visual | ARIA |
|
|
53
53
|
|-------|---------|--------|------|
|
|
54
|
-
| default |
|
|
55
|
-
| hover | pointer over chip | Background tint (+8%) |
|
|
56
|
-
| focus | keyboard focus on chip | focus-visible ring (2px) |
|
|
54
|
+
| default | - | Rest fill + label | - |
|
|
55
|
+
| hover | pointer over chip | Background tint (+8%) | - |
|
|
56
|
+
| focus | keyboard focus on chip | focus-visible ring (2px) | - |
|
|
57
57
|
| selected (filter) | click / Enter / Space | Filled background; checkmark icon | `aria-pressed="true"` |
|
|
58
58
|
| unselected (filter) | click / Enter / Space | Outline style | `aria-pressed="false"` |
|
|
59
59
|
| disabled | `disabled` / `aria-disabled` | 38% opacity; cursor not-allowed | `aria-disabled="true"` |
|
|
60
|
-
| remove focus | Tab to × button | Focus ring on × |
|
|
60
|
+
| remove focus | Tab to × button | Focus ring on × | - |
|
|
61
61
|
|
|
62
62
|
---
|
|
63
63
|
|
|
@@ -79,11 +79,11 @@ A chip (or tag) is a compact, interactive label that represents an attribute, fi
|
|
|
79
79
|
|
|
80
80
|
## Typography
|
|
81
81
|
|
|
82
|
-
- Label: body-sm (13–14px/400)
|
|
83
|
-
- No bold weight
|
|
82
|
+
- Label: body-sm (13–14px/400) - same scale as form labels
|
|
83
|
+
- No bold weight - chip label is a tag, not a heading or CTA
|
|
84
84
|
- Truncate with ellipsis only when chip is in a fixed-width container; prefer wrapping chip set to natural width
|
|
85
85
|
|
|
86
|
-
Cross-link: `reference/typography.md`
|
|
86
|
+
Cross-link: `reference/typography.md` - body-sm definition
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -94,7 +94,7 @@ Cross-link: `reference/typography.md` — body-sm definition
|
|
|
94
94
|
|
|
95
95
|
### Keyboard Contract
|
|
96
96
|
|
|
97
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
97
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/listbox/ - W3C - 2024*
|
|
98
98
|
|
|
99
99
|
| Key | Action |
|
|
100
100
|
|-----|--------|
|
|
@@ -106,14 +106,14 @@ Cross-link: `reference/typography.md` — body-sm definition
|
|
|
106
106
|
|
|
107
107
|
### Accessibility Rules
|
|
108
108
|
|
|
109
|
-
- Filter chip used as standalone toggle MUST have `aria-pressed="true|false"`
|
|
109
|
+
- Filter chip used as standalone toggle MUST have `aria-pressed="true|false"` - absence means screen readers cannot report toggle state *(WAI-ARIA APG)*
|
|
110
110
|
- Filter chips inside a multi-select group SHOULD use `role="option"` inside `role="listbox"` with `aria-multiselectable="true"` *(WAI-ARIA APG)*
|
|
111
|
-
- Remove button MUST have an independent `aria-label` describing what it removes: `aria-label="Remove Python tag"`
|
|
111
|
+
- Remove button MUST have an independent `aria-label` describing what it removes: `aria-label="Remove Python tag"` - the × glyph alone is not an accessible name *(WAI-ARIA APG, Material 3)*
|
|
112
112
|
- Remove button MUST be a separate focusable element, NOT a click handler on the chip label *(Carbon, Atlassian)*
|
|
113
113
|
- Touch target for remove button MUST be ≥ 32×32px via padding even if the visual × is 16–20px *(WCAG 2.5.5)*
|
|
114
|
-
- Display chips have no role
|
|
114
|
+
- Display chips have no role - they are presentational; if they carry meaningful status, use `role="status"` or integrate into an Alert *(Atlassian Lozenge guidance)*
|
|
115
115
|
|
|
116
|
-
Cross-link: `reference/accessibility.md`
|
|
116
|
+
Cross-link: `reference/accessibility.md` - `aria-pressed`, `listbox`, touch targets
|
|
117
117
|
|
|
118
118
|
---
|
|
119
119
|
|
|
@@ -126,9 +126,9 @@ Cross-link: `reference/accessibility.md` — `aria-pressed`, `listbox`, touch ta
|
|
|
126
126
|
| Chip add (expand width) | 150ms | ease-out | Width expands from 0 |
|
|
127
127
|
| Hover background | 80ms | ease-out | Subtle tint only |
|
|
128
128
|
|
|
129
|
-
**BAN**: Full-page reflow animation when removing a chip
|
|
129
|
+
**BAN**: Full-page reflow animation when removing a chip - collapse width inline; do not shift unrelated page sections. Do not use `transition: all` (catches unintended border/shadow changes).
|
|
130
130
|
|
|
131
|
-
Cross-link: `reference/motion.md`
|
|
131
|
+
Cross-link: `reference/motion.md` - `prefers-reduced-motion`: skip width animation, instant add/remove
|
|
132
132
|
|
|
133
133
|
---
|
|
134
134
|
|
|
@@ -141,10 +141,10 @@ Cross-link: `reference/motion.md` — `prefers-reduced-motion`: skip width anima
|
|
|
141
141
|
- Ensure touch target ≥ 32px height; extend remove button via padding *(WCAG 2.5.5)*
|
|
142
142
|
|
|
143
143
|
### Don't
|
|
144
|
-
- Don't put filter chips without `aria-pressed`
|
|
145
|
-
- Don't use the same click handler for chip label and remove
|
|
146
|
-
- Don't truncate chip label in narrow containers without a tooltip
|
|
147
|
-
- Don't use display chips for dynamic statuses that change
|
|
144
|
+
- Don't put filter chips without `aria-pressed` - screen readers cannot report selected state *(WAI-ARIA APG)*
|
|
145
|
+
- Don't use the same click handler for chip label and remove - remove must be independently focusable *(Carbon, Atlassian)*
|
|
146
|
+
- Don't truncate chip label in narrow containers without a tooltip - truncated tags lose meaning *(Polaris, Mantine)*
|
|
147
|
+
- Don't use display chips for dynamic statuses that change - use Alert or Badge instead *(Atlassian)*
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Command Palette
|
|
1
|
+
# Command Palette - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Linear, Raycast, Radix CMDK, GitHub Primer, UUPM (app-interface, MIT)
|
|
4
4
|
**Wave**: 4 · **Category**: Navigation & Data
|
|
@@ -64,7 +64,7 @@ A command palette is a keyboard-first global launcher that lets users search acr
|
|
|
64
64
|
|
|
65
65
|
| State | Trigger | Visual | ARIA |
|
|
66
66
|
|-------|---------|--------|------|
|
|
67
|
-
| closed |
|
|
67
|
+
| closed | - | Dialog hidden | - |
|
|
68
68
|
| open | Cmd/Ctrl+K | Dialog visible; input focused | `aria-expanded="true"` on combobox |
|
|
69
69
|
| empty | no query | Placeholder or recent items | `aria-expanded="true"` |
|
|
70
70
|
| searching | typing | Results update in real-time | `aria-live="polite"` on results region |
|
|
@@ -97,7 +97,7 @@ A command palette is a keyboard-first global launcher that lets users search acr
|
|
|
97
97
|
- Section heading: label-xs (11px), uppercase, weight 600, `color: --text-subtle`, `aria-hidden="true"` if role="group" handles it
|
|
98
98
|
- Keyboard shortcut hints: label-xs (11px), `color: --text-subtle`, right-aligned, `aria-hidden="true"`
|
|
99
99
|
|
|
100
|
-
Cross-link: `reference/typography.md`
|
|
100
|
+
Cross-link: `reference/typography.md` - body-md, label scale
|
|
101
101
|
|
|
102
102
|
---
|
|
103
103
|
|
|
@@ -108,7 +108,7 @@ Cross-link: `reference/typography.md` — body-md, label scale
|
|
|
108
108
|
|
|
109
109
|
### Keyboard Contract
|
|
110
110
|
|
|
111
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
111
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/combobox/ and https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ - W3C - 2024*
|
|
112
112
|
|
|
113
113
|
| Key | Action |
|
|
114
114
|
|-----|--------|
|
|
@@ -123,14 +123,14 @@ Cross-link: `reference/typography.md` — body-md, label scale
|
|
|
123
123
|
|
|
124
124
|
### Accessibility Rules
|
|
125
125
|
|
|
126
|
-
- Dialog MUST have `aria-modal="true"`
|
|
126
|
+
- Dialog MUST have `aria-modal="true"` - prevents AT from reading content outside the palette
|
|
127
127
|
- `role="combobox"` input MUST have `aria-controls` pointing to the `role="listbox"` `id`
|
|
128
128
|
- `aria-live="polite"` on the results region ensures AT announces result count changes and empty state
|
|
129
129
|
- Focus MUST be trapped within the dialog while it is open (Tab/Shift+Tab cycle inside)
|
|
130
130
|
- On close, focus MUST return to the element that triggered the palette (not body)
|
|
131
|
-
- Keyboard shortcut hints (`⌘K`, `↵`) MUST be `aria-hidden="true"`
|
|
131
|
+
- Keyboard shortcut hints (`⌘K`, `↵`) MUST be `aria-hidden="true"` - the shortcut must be registered separately
|
|
132
132
|
|
|
133
|
-
Cross-link: `reference/accessibility.md`
|
|
133
|
+
Cross-link: `reference/accessibility.md` - dialog focus trap, combobox pattern, live regions
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -144,9 +144,9 @@ Cross-link: `reference/accessibility.md` — dialog focus trap, combobox pattern
|
|
|
144
144
|
| Backdrop fade in | 150ms | ease-out | Opacity 0→0.5 |
|
|
145
145
|
| Item selection flash | 80ms | ease-out | Brief fill before execute |
|
|
146
146
|
|
|
147
|
-
**BAN**: Do not animate result item reordering as the user types
|
|
147
|
+
**BAN**: Do not animate result item reordering as the user types - causes visual instability and is disorienting for AT users with animations enabled.
|
|
148
148
|
|
|
149
|
-
Cross-link: `reference/motion.md`
|
|
149
|
+
Cross-link: `reference/motion.md` - dialog entry, BAN-04
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
@@ -159,10 +159,10 @@ Cross-link: `reference/motion.md` — dialog entry, BAN-04
|
|
|
159
159
|
- Use `role="group"` + `aria-label` for result sections *(WAI-ARIA APG, Linear, Raycast)*
|
|
160
160
|
|
|
161
161
|
### Don't
|
|
162
|
-
- Don't build a custom overlay without `role="dialog"` + `aria-modal`
|
|
163
|
-
- Don't omit `aria-controls` on the combobox
|
|
164
|
-
- Don't open on hover or auto-focus
|
|
165
|
-
- Don't dismiss on every Escape keypress inside nested command flows
|
|
162
|
+
- Don't build a custom overlay without `role="dialog"` + `aria-modal` - screen readers will read background content *(WCAG 1.3.1)*
|
|
163
|
+
- Don't omit `aria-controls` on the combobox - AT cannot associate input with results *(WAI-ARIA APG combobox)*
|
|
164
|
+
- Don't open on hover or auto-focus - Cmd/Ctrl+K is the expected trigger *(Linear, Raycast convention)*
|
|
165
|
+
- Don't dismiss on every Escape keypress inside nested command flows - first Escape should exit sub-level, second closes palette *(Raycast, Linear)*
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
@@ -170,7 +170,7 @@ Cross-link: `reference/motion.md` — dialog entry, BAN-04
|
|
|
170
170
|
|
|
171
171
|
| Anti-pattern | Entry |
|
|
172
172
|
|--------------|-------|
|
|
173
|
-
| BAN-04 | `transition: all` on results list
|
|
173
|
+
| BAN-04 | `transition: all` on results list - `reference/anti-patterns.md#ban-04` |
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -223,6 +223,6 @@ grep -rn 'command.*palette\|cmd.*results\|cmdk' src/ | grep 'results\|listbox' |
|
|
|
223
223
|
</div>
|
|
224
224
|
```
|
|
225
225
|
|
|
226
|
-
**Why it fails**: No `role="dialog"`
|
|
226
|
+
**Why it fails**: No `role="dialog"` - AT does not treat this as a modal, and screen readers continue reading background content; no focus trap; input lacks `role="combobox"` and `aria-controls`; results have no `role="listbox"`; items have no `role="option"` or `aria-selected`; no `aria-live` region for result updates.
|
|
227
227
|
**Grep detection**: `grep -rn 'command.*palette\|cmdk\|command-menu' src/ | grep '<div' | grep -v 'role='`
|
|
228
228
|
**Fix**: Use `role="dialog"` + `aria-modal="true"` on the overlay; implement focus trap; add `role="combobox"` + `aria-controls` to input; add `role="listbox"` to results container; add `role="option"` + `aria-selected` to each item; add `aria-live="polite"` to results region.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Date Picker
|
|
1
|
+
# Date Picker - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Carbon Design System, Atlassian Design System, Mantine DatePicker
|
|
4
4
|
**Wave**: 5 · **Category**: Advanced
|
|
@@ -31,7 +31,7 @@ Range variant adds a second input field for end date.
|
|
|
31
31
|
| Part | Required | Notes |
|
|
32
32
|
|------|----------|-------|
|
|
33
33
|
| Text input | Yes | Shows selected date; accepts direct keyboard entry |
|
|
34
|
-
| Format hint label | Yes | Visible "MM/DD/YYYY" supplement
|
|
34
|
+
| Format hint label | Yes | Visible "MM/DD/YYYY" supplement - NOT placeholder only |
|
|
35
35
|
| Calendar trigger button | Yes | Opens/closes popover; `aria-label="Open calendar"` |
|
|
36
36
|
| Popover (dialog) | Yes | `role="dialog"` + `aria-modal="true"` + focus trap |
|
|
37
37
|
| Month navigation | Yes | Previous/next month buttons; keyboard Page Up/Down |
|
|
@@ -59,13 +59,13 @@ Range variant adds a second input field for end date.
|
|
|
59
59
|
|
|
60
60
|
| State | Trigger | Visual | ARIA |
|
|
61
61
|
|-------|---------|--------|------|
|
|
62
|
-
| default |
|
|
62
|
+
| default | - | Resting input + trigger icon | - |
|
|
63
63
|
| open | Trigger click or input focus + Enter | Popover visible, focus moves inside | `aria-expanded="true"` on trigger |
|
|
64
|
-
| day hover | Pointer over day | Background highlight |
|
|
65
|
-
| day focus | Keyboard navigation | Focus-visible ring on day button |
|
|
64
|
+
| day hover | Pointer over day | Background highlight | - |
|
|
65
|
+
| day focus | Keyboard navigation | Focus-visible ring on day button | - |
|
|
66
66
|
| day selected | Enter/Space or click | Filled background (brand color) | `aria-pressed="true"` on day button |
|
|
67
|
-
| range-in-progress | Start selected, end not yet | Partial fill from start |
|
|
68
|
-
| range-complete | Both start and end selected | Full highlight between dates |
|
|
67
|
+
| range-in-progress | Start selected, end not yet | Partial fill from start | - |
|
|
68
|
+
| range-complete | Both start and end selected | Full highlight between dates | - |
|
|
69
69
|
| disabled date | Date excluded by min/max/filter | Muted; `tabindex="-1"` | `aria-disabled="true"` on day button |
|
|
70
70
|
| error | Invalid date typed | Red border + error message | `aria-invalid="true"` on input |
|
|
71
71
|
|
|
@@ -82,7 +82,7 @@ Range variant adds a second input field for end date.
|
|
|
82
82
|
**Norm**: 288px popover width fits a standard 7-column month grid with comfortable padding *(Carbon, Mantine)*.
|
|
83
83
|
Day cells must be ≥32px to meet minimum touch-target guidance; prefer 40px for mixed pointer/touch contexts.
|
|
84
84
|
|
|
85
|
-
Cross-link: `reference/surfaces.md`
|
|
85
|
+
Cross-link: `reference/surfaces.md` - minimum 44×44px accessible tap target via padding.
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -91,9 +91,9 @@ Cross-link: `reference/surfaces.md` — minimum 44×44px accessible tap target v
|
|
|
91
91
|
- Input text: body-md weight 400; monospace or tabular-nums variant for date digits aids alignment
|
|
92
92
|
- Day numbers: body-sm, center-aligned within cell
|
|
93
93
|
- Month/year header: body-md weight 600
|
|
94
|
-
- Format hint ("MM/DD/YYYY"): caption-sm, secondary color
|
|
94
|
+
- Format hint ("MM/DD/YYYY"): caption-sm, secondary color - attached as visible `<label>` supplement or `<span aria-hidden="true">` paired with `aria-describedby` on the input
|
|
95
95
|
|
|
96
|
-
Cross-link: `reference/typography.md`
|
|
96
|
+
Cross-link: `reference/typography.md` - tabular-nums for date/time fields.
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
@@ -104,7 +104,7 @@ Cross-link: `reference/typography.md` — tabular-nums for date/time fields.
|
|
|
104
104
|
|
|
105
105
|
### Keyboard Contract
|
|
106
106
|
|
|
107
|
-
*Adapted from WAI-ARIA APG
|
|
107
|
+
*Adapted from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ and grid pattern - W3C - 2024*
|
|
108
108
|
|
|
109
109
|
| Key | Action |
|
|
110
110
|
|-----|--------|
|
|
@@ -122,7 +122,7 @@ Cross-link: `reference/typography.md` — tabular-nums for date/time fields.
|
|
|
122
122
|
|
|
123
123
|
### Accessibility Rules
|
|
124
124
|
|
|
125
|
-
- Calendar popover MUST use `role="dialog"` + `aria-modal="true"`
|
|
125
|
+
- Calendar popover MUST use `role="dialog"` + `aria-modal="true"` - do not use a plain `<div>` overlay
|
|
126
126
|
- Focus MUST be trapped inside the open calendar; Escape closes and returns focus to the trigger
|
|
127
127
|
- Each selectable day MUST be a `<button>` (or element with `role="button"`) so keyboard and AT users can activate it
|
|
128
128
|
- Date format hint MUST be visible text, not only a placeholder (placeholder disappears on input and is not consistently announced)
|
|
@@ -130,7 +130,7 @@ Cross-link: `reference/typography.md` — tabular-nums for date/time fields.
|
|
|
130
130
|
- Range variant: announce selected range via `aria-label` on day buttons (e.g., `aria-label="April 15, 2025, start of range"`)
|
|
131
131
|
- Mobile: provide native `<input type="date">` fallback when touch device detected or user preference set
|
|
132
132
|
|
|
133
|
-
Cross-link: `reference/accessibility.md`
|
|
133
|
+
Cross-link: `reference/accessibility.md` - focus-trap pattern, dialog role requirements.
|
|
134
134
|
|
|
135
135
|
---
|
|
136
136
|
|
|
@@ -144,9 +144,9 @@ Cross-link: `reference/accessibility.md` — focus-trap pattern, dialog role req
|
|
|
144
144
|
| Day selection | 80ms | ease-out | Fill background color |
|
|
145
145
|
| Range fill | 150ms | ease-out | Animate fill between dates |
|
|
146
146
|
|
|
147
|
-
**BAN**: Do not animate the calendar grid with a full-page slide
|
|
147
|
+
**BAN**: Do not animate the calendar grid with a full-page slide - disorienting for keyboard users navigating by month.
|
|
148
148
|
|
|
149
|
-
Cross-link: `reference/motion.md`
|
|
149
|
+
Cross-link: `reference/motion.md` - reduced-motion: omit slide, keep instant day selection.
|
|
150
150
|
|
|
151
151
|
---
|
|
152
152
|
|
|
@@ -155,14 +155,14 @@ Cross-link: `reference/motion.md` — reduced-motion: omit slide, keep instant d
|
|
|
155
155
|
### Do
|
|
156
156
|
- Show the date format as visible text ("MM/DD/YYYY") near the input *(Carbon, Atlassian)*
|
|
157
157
|
- Ensure keyboard users can navigate the entire calendar without a pointer *(WAI-ARIA APG)*
|
|
158
|
-
- Allow direct text entry in the input field
|
|
158
|
+
- Allow direct text entry in the input field - some users know the date and do not need the calendar *(Mantine, Carbon)*
|
|
159
159
|
- Support locale-aware first day of week (Sunday vs. Monday) and locale month/day names *(Material 3, Mantine)*
|
|
160
160
|
|
|
161
161
|
### Don't
|
|
162
|
-
- Don't use `<table>` with click-only cells
|
|
163
|
-
- Don't use placeholder text alone to convey the date format
|
|
164
|
-
- Don't trap focus permanently
|
|
165
|
-
- Don't omit the native `<input type="date">` for mobile
|
|
162
|
+
- Don't use `<table>` with click-only cells - add `role="grid"` and full keyboard navigation *(WCAG 2.1 §2.1.1)*
|
|
163
|
+
- Don't use placeholder text alone to convey the date format - placeholder vanishes on input *(Carbon, Atlassian)*
|
|
164
|
+
- Don't trap focus permanently - Escape must always close the popover and restore focus *(WAI-ARIA APG)*
|
|
165
|
+
- Don't omit the native `<input type="date">` for mobile - custom calendars are unusable on small touch screens *(Material 3)*
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
@@ -170,8 +170,8 @@ Cross-link: `reference/motion.md` — reduced-motion: omit slide, keep instant d
|
|
|
170
170
|
|
|
171
171
|
| Anti-pattern | Entry |
|
|
172
172
|
|--------------|-------|
|
|
173
|
-
| BAN-07 | Placeholder as only label/hint
|
|
174
|
-
| BAN-12 | Custom overlay without focus trap
|
|
173
|
+
| BAN-07 | Placeholder as only label/hint - `reference/anti-patterns.md#ban-07` |
|
|
174
|
+
| BAN-12 | Custom overlay without focus trap - `reference/anti-patterns.md#ban-12` |
|
|
175
175
|
|
|
176
176
|
---
|
|
177
177
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Drawer / Sheet
|
|
1
|
+
# Drawer / Sheet - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Material 3, Polaris (Sheet), Carbon, Atlassian, Mantine, shadcn/ui, Headless UI, Apple HIG
|
|
4
4
|
**Wave**: 2 · **Category**: Containers
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
A drawer (or sheet) is a panel that slides in from an edge of the viewport. It is less disruptive than a modal for workflows that benefit from co-existing with the background
|
|
10
|
+
A drawer (or sheet) is a panel that slides in from an edge of the viewport. It is less disruptive than a modal for workflows that benefit from co-existing with the background - detail panels, navigation menus, filter sidebars, multi-step flows. Like a modal, it traps focus and requires Escape to close. Unlike a modal, the backdrop is optional and can be semi-transparent. *(Material 3, Carbon, Polaris all position drawer as less disruptive than modal)*
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -55,13 +55,13 @@ Bottom sheet (mobile):
|
|
|
55
55
|
| Partial height | 60–80vh, overlays | Mobile bottom sheet | Apple HIG, Material 3 |
|
|
56
56
|
|
|
57
57
|
**Norm** (≥5/18): right-side is default; bottom sheet for mobile.
|
|
58
|
-
**Diverge**: backdrop-click-to-close
|
|
58
|
+
**Diverge**: backdrop-click-to-close - same debate as modal; for navigation drawers, backdrop click should close; for form/detail drawers, configurable.
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
62
62
|
## States
|
|
63
63
|
|
|
64
|
-
Same as Modal/Dialog
|
|
64
|
+
Same as Modal/Dialog - see `modal-dialog.md`. Key differences:
|
|
65
65
|
|
|
66
66
|
| State | Drawer-specific |
|
|
67
67
|
|-------|-----------------|
|
|
@@ -80,7 +80,7 @@ Same as Modal/Dialog — see `modal-dialog.md`. Key differences:
|
|
|
80
80
|
| Bottom sheet | 60–100vh | Drag handle at 12px × 36px |
|
|
81
81
|
| Padding | 20–24px | Match modal padding |
|
|
82
82
|
|
|
83
|
-
Cross-link: `reference/surfaces.md`
|
|
83
|
+
Cross-link: `reference/surfaces.md` - shadow on drawer edge (unilateral shadow)
|
|
84
84
|
|
|
85
85
|
---
|
|
86
86
|
|
|
@@ -94,21 +94,21 @@ Cross-link: `reference/surfaces.md` — shadow on drawer edge (unilateral shadow
|
|
|
94
94
|
|
|
95
95
|
## Keyboard & Accessibility
|
|
96
96
|
|
|
97
|
-
> **WAI-ARIA role**: `dialog` (same as modal
|
|
97
|
+
> **WAI-ARIA role**: `dialog` (same as modal - drawer is a type of dialog)
|
|
98
98
|
> **Required attributes**: `aria-modal="true"`, `aria-labelledby` (title id)
|
|
99
99
|
|
|
100
100
|
### Keyboard Contract
|
|
101
101
|
|
|
102
|
-
*Quoted verbatim from WAI-ARIA APG
|
|
102
|
+
*Quoted verbatim from WAI-ARIA APG - https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/ - W3C - 2024*
|
|
103
103
|
|
|
104
104
|
Same Tab/Shift+Tab/Escape contract as modal (see `modal-dialog.md`).
|
|
105
105
|
|
|
106
106
|
### Drawer-specific Accessibility Rules
|
|
107
107
|
|
|
108
|
-
- Focus trap: MUST trap focus inside the drawer while open
|
|
108
|
+
- Focus trap: MUST trap focus inside the drawer while open - same as modal
|
|
109
109
|
- On open: focus moves to first focusable element (or close button if no primary action)
|
|
110
110
|
- On close: focus MUST return to the element that triggered the drawer open
|
|
111
|
-
- Navigation drawer (`role="navigation"`): if the drawer IS the main nav, use `role="navigation"` + `aria-label="Main"` instead of `role="dialog"`; different keyboard contract (no focus trap
|
|
111
|
+
- Navigation drawer (`role="navigation"`): if the drawer IS the main nav, use `role="navigation"` + `aria-label="Main"` instead of `role="dialog"`; different keyboard contract (no focus trap - it IS a landmark)
|
|
112
112
|
- Background `inert`: set `inert` attribute (or equivalent) on background content when drawer is open
|
|
113
113
|
|
|
114
114
|
---
|
|
@@ -123,23 +123,23 @@ Same Tab/Shift+Tab/Escape contract as modal (see `modal-dialog.md`).
|
|
|
123
123
|
| Backdrop fade | 200ms | ease | opacity 0→0.4 |
|
|
124
124
|
|
|
125
125
|
Swipe-to-close (bottom sheet): detect `pointerup` with velocity + displacement threshold.
|
|
126
|
-
Cross-link: `reference/motion.md`
|
|
126
|
+
Cross-link: `reference/motion.md` - spring bounce=0, `prefers-reduced-motion` (disable slide, instant toggle)
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
130
130
|
## Do / Don't
|
|
131
131
|
|
|
132
132
|
### Do
|
|
133
|
-
- Trap focus inside the drawer when open
|
|
133
|
+
- Trap focus inside the drawer when open - same rule as modal *(WAI-ARIA APG)*
|
|
134
134
|
- Return focus to the trigger element on close *(WAI-ARIA APG, Radix, Mantine)*
|
|
135
135
|
- Use right-side drawer for content-detail panels; left-side for navigation *(Material 3, Carbon)*
|
|
136
136
|
- Support swipe-to-close on bottom sheets for mobile *(Apple HIG, Material 3)*
|
|
137
137
|
|
|
138
138
|
### Don't
|
|
139
|
-
- Don't use `role="navigation"` for content drawers
|
|
139
|
+
- Don't use `role="navigation"` for content drawers - only for navigation-purpose drawers *(WAI-ARIA APG)*
|
|
140
140
|
- Don't let Tab escape the drawer while it's open *(WAI-ARIA APG)*
|
|
141
141
|
- Don't disable background scroll without setting `overflow:hidden` on body *(all systems)*
|
|
142
|
-
- Don't slide from top for content
|
|
142
|
+
- Don't slide from top for content - top drawers conflict with browser UI and notifications *(Material 3)*
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# File Upload
|
|
1
|
+
# File Upload - Benchmark Spec
|
|
2
2
|
|
|
3
3
|
**Harvested from**: Polaris (DropZone), Carbon (FileUploader), Atlassian Design System, Material 3
|
|
4
4
|
**Wave**: 5 · **Category**: Advanced
|
|
@@ -34,7 +34,7 @@ File list (appears after selection):
|
|
|
34
34
|
| Part | Required | Notes |
|
|
35
35
|
|------|----------|-------|
|
|
36
36
|
| Drop zone container | Yes | Dashed border; drag-over changes fill + border color |
|
|
37
|
-
| `<input type="file">` | Yes | MUST be accessible (not `display:none`)
|
|
37
|
+
| `<input type="file">` | Yes | MUST be accessible (not `display:none`) - keyboard fallback |
|
|
38
38
|
| Browse trigger button | Yes | Visually activates the file input; must be a `<button>` or `<label>` |
|
|
39
39
|
| File list | Yes (when files selected) | Per-file name, size, status, progress bar, remove button |
|
|
40
40
|
| Progress bar | Yes (during upload) | `role="progressbar"` + `aria-valuenow` per file or overall |
|
|
@@ -62,11 +62,11 @@ File list (appears after selection):
|
|
|
62
62
|
|
|
63
63
|
| State | Trigger | Visual | ARIA |
|
|
64
64
|
|-------|---------|--------|------|
|
|
65
|
-
| default |
|
|
65
|
+
| default | - | Dashed border, instructional text | - |
|
|
66
66
|
| drag-over | File dragged over zone | Filled background + solid border color change | `aria-dropeffect="copy"` (deprecated but still useful) |
|
|
67
|
-
| drag-invalid | Wrong file type dragged over | Error border color; tooltip/message |
|
|
67
|
+
| drag-invalid | Wrong file type dragged over | Error border color; tooltip/message | - |
|
|
68
68
|
| uploading | File being sent | Per-file progress bar animating | `aria-valuenow` on progressbar |
|
|
69
|
-
| upload-done | Transfer complete | Check icon; status text "Done" |
|
|
69
|
+
| upload-done | Transfer complete | Check icon; status text "Done" | - |
|
|
70
70
|
| upload-error | Transfer failed | Error icon; error message per file | `aria-live="assertive"` error region |
|
|
71
71
|
| disabled | `disabled` prop | 38% opacity; drag events ignored | `aria-disabled="true"` on zone |
|
|
72
72
|
|
|
@@ -80,9 +80,9 @@ File list (appears after selection):
|
|
|
80
80
|
| md (default) | 128px | 8px | 14px |
|
|
81
81
|
| lg | 200px | 12px | 16px |
|
|
82
82
|
|
|
83
|
-
**Norm**: Drop zone should be large enough that it is comfortably hittable
|
|
83
|
+
**Norm**: Drop zone should be large enough that it is comfortably hittable - 128px minimum height for default. File list rows are 48–56px tall for accessible remove-button target size *(Carbon, Polaris)*.
|
|
84
84
|
|
|
85
|
-
Cross-link: `reference/surfaces.md`
|
|
85
|
+
Cross-link: `reference/surfaces.md` - minimum 44×44px touch targets for remove buttons.
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -94,7 +94,7 @@ Cross-link: `reference/surfaces.md` — minimum 44×44px touch targets for remov
|
|
|
94
94
|
- File size: caption-sm, secondary color
|
|
95
95
|
- Status text (Done / Error): caption-sm, success or error semantic color
|
|
96
96
|
|
|
97
|
-
Cross-link: `reference/typography.md`
|
|
97
|
+
Cross-link: `reference/typography.md` - truncation rules.
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
@@ -105,12 +105,12 @@ Cross-link: `reference/typography.md` — truncation rules.
|
|
|
105
105
|
|
|
106
106
|
### Keyboard Contract
|
|
107
107
|
|
|
108
|
-
*Derived from native `<input type="file">` behavior and WAI-ARIA APG button pattern
|
|
108
|
+
*Derived from native `<input type="file">` behavior and WAI-ARIA APG button pattern - W3C - 2024*
|
|
109
109
|
|
|
110
110
|
| Key | Action |
|
|
111
111
|
|-----|--------|
|
|
112
112
|
| Tab | Move focus to browse button / file input |
|
|
113
|
-
| Enter / Space | Activate browse button
|
|
113
|
+
| Enter / Space | Activate browse button - opens native file picker dialog |
|
|
114
114
|
| Tab (in file list) | Move through file items and remove buttons |
|
|
115
115
|
| Enter / Space (on remove button) | Remove file from list |
|
|
116
116
|
|
|
@@ -118,15 +118,15 @@ Drag-and-drop is pointer-only; keyboard users MUST be able to complete the entir
|
|
|
118
118
|
|
|
119
119
|
### Accessibility Rules
|
|
120
120
|
|
|
121
|
-
- `<input type="file">` MUST NOT use `display:none` or `visibility:hidden`
|
|
121
|
+
- `<input type="file">` MUST NOT use `display:none` or `visibility:hidden` - use `opacity:0` positioned absolutely with dimensions matching the trigger, OR keep a visible file input alongside the drop zone
|
|
122
122
|
- The browse trigger MUST be a `<button>` or `<label for="file-input">` so it is keyboard-focusable and activates the input
|
|
123
|
-
- Remove buttons MUST have `aria-label="Remove [filename]"`
|
|
124
|
-
- Upload errors MUST be announced via `aria-live="assertive"`
|
|
123
|
+
- Remove buttons MUST have `aria-label="Remove [filename]"` - an icon-only ✕ with no accessible name fails AT users
|
|
124
|
+
- Upload errors MUST be announced via `aria-live="assertive"` - do not rely solely on visual indicators
|
|
125
125
|
- Progress bars MUST keep `aria-valuenow` updated throughout upload
|
|
126
126
|
- `accept` attribute MUST match the visible allowed-types hint text so users are not surprised by rejection
|
|
127
127
|
- File list additions/removals should be announced via `aria-live="polite"` on the list container
|
|
128
128
|
|
|
129
|
-
Cross-link: `reference/accessibility.md`
|
|
129
|
+
Cross-link: `reference/accessibility.md` - aria-live regions, accessible file input patterns.
|
|
130
130
|
|
|
131
131
|
---
|
|
132
132
|
|
|
@@ -140,9 +140,9 @@ Cross-link: `reference/accessibility.md` — aria-live regions, accessible file
|
|
|
140
140
|
| Progress bar fill | continuous | linear | Matches upload byte progress |
|
|
141
141
|
| Upload complete tick | 200ms | ease-out | Check icon draw animation |
|
|
142
142
|
|
|
143
|
-
**BAN**: Do not animate progress bar with CSS only at a fixed pace
|
|
143
|
+
**BAN**: Do not animate progress bar with CSS only at a fixed pace - progress MUST reflect actual upload percentage via `aria-valuenow`.
|
|
144
144
|
|
|
145
|
-
Cross-link: `reference/motion.md`
|
|
145
|
+
Cross-link: `reference/motion.md` - reduced-motion: skip slide/collapse animations; keep progress bar updates.
|
|
146
146
|
|
|
147
147
|
---
|
|
148
148
|
|
|
@@ -155,10 +155,10 @@ Cross-link: `reference/motion.md` — reduced-motion: skip slide/collapse animat
|
|
|
155
155
|
- Announce upload errors via `aria-live="assertive"` *(WCAG 2.1 §4.1.3 Status Messages)*
|
|
156
156
|
|
|
157
157
|
### Don't
|
|
158
|
-
- Don't use `display:none` on the file input
|
|
159
|
-
- Don't omit the `accept` hint text
|
|
160
|
-
- Don't show only drag-drop UI with no browse button
|
|
161
|
-
- Don't use a generic `aria-label="Remove"` on remove buttons
|
|
158
|
+
- Don't use `display:none` on the file input - keyboard and AT users cannot trigger the picker *(WCAG 2.1 §2.1.1)*
|
|
159
|
+
- Don't omit the `accept` hint text - users should know allowed types before selecting *(Polaris, Carbon)*
|
|
160
|
+
- Don't show only drag-drop UI with no browse button - drag is inaccessible to keyboard users *(Carbon, Atlassian)*
|
|
161
|
+
- Don't use a generic `aria-label="Remove"` on remove buttons - AT users cannot identify which file *(Carbon)*
|
|
162
162
|
|
|
163
163
|
---
|
|
164
164
|
|
|
@@ -166,8 +166,8 @@ Cross-link: `reference/motion.md` — reduced-motion: skip slide/collapse animat
|
|
|
166
166
|
|
|
167
167
|
| Anti-pattern | Entry |
|
|
168
168
|
|--------------|-------|
|
|
169
|
-
| BAN-08 | File input hidden with display:none
|
|
170
|
-
| BAN-13 | Icon-only action button without aria-label
|
|
169
|
+
| BAN-08 | File input hidden with display:none - keyboard inaccessible - `reference/anti-patterns.md#ban-08` |
|
|
170
|
+
| BAN-13 | Icon-only action button without aria-label - `reference/anti-patterns.md#ban-13` |
|
|
171
171
|
|
|
172
172
|
---
|
|
173
173
|
|