@kensaurus/skills 0.0.0-stage → 2.1.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 +53 -0
- package/.claude-plugin/plugin.json +40 -0
- package/.cursor-plugin/plugin.json +38 -0
- package/.mcp.json +28 -0
- package/CHANGELOG.md +1790 -0
- package/LICENSE +21 -0
- package/LICENSE-APACHE +62 -0
- package/NOTICE +13 -0
- package/README.md +821 -2
- package/SECURITY.md +55 -0
- package/agents/code-reviewer.md +60 -0
- package/agents/completion-judge.md +89 -0
- package/agents/db-migrator.md +125 -0
- package/agents/debugger.md +47 -0
- package/agents/deploy-checker.md +100 -0
- package/agents/perf-monitor.md +74 -0
- package/assets/favicon.png +0 -0
- package/assets/logo-light.png +0 -0
- package/assets/logo.png +0 -0
- package/assets/logo.svg +6 -0
- package/assets/og.png +0 -0
- package/bin/install.mjs +1127 -0
- package/bin/kenji.js +2 -0
- package/commands/adr.md +17 -0
- package/commands/aeo-plan.md +18 -0
- package/commands/arch-boundaries.md +17 -0
- package/commands/aso-plan.md +18 -0
- package/commands/auth-flows.md +19 -0
- package/commands/backup-plan.md +17 -0
- package/commands/burndown-full.md +25 -0
- package/commands/capacitor-plan.md +18 -0
- package/commands/codemod-safety.md +22 -0
- package/commands/commit.md +18 -0
- package/commands/complete-everything.md +40 -0
- package/commands/cost-plan.md +19 -0
- package/commands/deadcode-plan.md +26 -0
- package/commands/deadcode.md +32 -0
- package/commands/debug-issue.md +17 -0
- package/commands/deps-plan.md +18 -0
- package/commands/docs-plan.md +17 -0
- package/commands/doctrine.md +19 -0
- package/commands/error-plan.md +19 -0
- package/commands/feedback-to-closure.md +36 -0
- package/commands/fix-issue.md +76 -0
- package/commands/gate-logic.md +26 -0
- package/commands/green-repo.md +36 -0
- package/commands/grill-me.md +19 -0
- package/commands/gtm-plan.md +21 -0
- package/commands/gtm-weekly.md +17 -0
- package/commands/gtm.md +22 -0
- package/commands/handoff.md +15 -0
- package/commands/housekeep-backlog.md +18 -0
- package/commands/housekeep-files.md +22 -0
- package/commands/housekeep-gates.md +18 -0
- package/commands/instant-nav.md +11 -0
- package/commands/integrity-plan.md +19 -0
- package/commands/launch-kit.md +16 -0
- package/commands/mcp-guide.md +40 -0
- package/commands/mobile-plan.md +19 -0
- package/commands/native-rn-monorepo/README.md +78 -0
- package/commands/native-rn-monorepo/android-build.md +26 -0
- package/commands/native-rn-monorepo/android-install.md +32 -0
- package/commands/native-rn-monorepo/android-logcat.md +37 -0
- package/commands/native-rn-monorepo/ios-ci-logs.md +56 -0
- package/commands/native-rn-monorepo/ios-ci-status.md +52 -0
- package/commands/native-rn-monorepo/ios-ci-trigger.md +59 -0
- package/commands/native-rn-monorepo/rn-reset.md +50 -0
- package/commands/native-rn-monorepo/rn-ship-ios.md +67 -0
- package/commands/native-rn-monorepo/rn-verify.md +53 -0
- package/commands/perf-plan.md +18 -0
- package/commands/plan-mode.md +74 -0
- package/commands/pr.md +16 -0
- package/commands/pricing-plan.md +20 -0
- package/commands/privacy-plan.md +18 -0
- package/commands/readability.md +12 -0
- package/commands/readme.md +15 -0
- package/commands/refactor.md +15 -0
- package/commands/release-prep.md +17 -0
- package/commands/research.md +25 -0
- package/commands/responsive-audit.md +21 -0
- package/commands/review-code.md +18 -0
- package/commands/rls-plan.md +18 -0
- package/commands/secrets-plan.md +18 -0
- package/commands/security-plan.md +19 -0
- package/commands/ship-and-observe.md +36 -0
- package/commands/skill-conflicts.md +19 -0
- package/commands/slop-plan.md +18 -0
- package/commands/stub-plan.md +18 -0
- package/commands/test-mutation.md +16 -0
- package/commands/test-plan.md +17 -0
- package/commands/test.md +29 -0
- package/commands/thirdparty-web-interface-guidelines.md +185 -0
- package/commands/uiux-plan.md +18 -0
- package/commands/uiux.md +45 -0
- package/commands/update-deps.md +21 -0
- package/commands/validation-plan.md +19 -0
- package/commands-portable/fix-issue.md +72 -0
- package/commands-portable/plan-mode.md +92 -0
- package/commands-portable/research.md +91 -0
- package/docs/screenshots/README.md +5 -0
- package/docs/screenshots/audit-dark.png +0 -0
- package/docs/screenshots/build-dark.png +0 -0
- package/docs/screenshots/grill-dark.png +0 -0
- package/docs/screenshots/hero-dark.png +0 -0
- package/docs/screenshots/hero-light.png +0 -0
- package/docs/screenshots/ship-dark.png +0 -0
- package/docs/screenshots/src/showcase.html +320 -0
- package/hooks/completion-gate.mjs +258 -0
- package/hooks/cursor-hooks.json +13 -0
- package/hooks/hooks.json +15 -0
- package/install.sh +21 -0
- package/llms.txt +40 -0
- package/mcp/README.md +266 -0
- package/mcp/VERSIONS.md +41 -0
- package/mcp/mcp-full.json.template +124 -0
- package/mcp/mcp.json.template +29 -0
- package/mcp/pinned-versions.json +27 -0
- package/package.json +94 -4
- package/rules/approved-plan-execution.mdc +65 -0
- package/rules/full-stack-ship-discipline.mdc +37 -0
- package/rules/native-rn-monorepo/README.md +63 -0
- package/rules/native-rn-monorepo/_project.mdc +69 -0
- package/rules/native-rn-monorepo/native-android.mdc +72 -0
- package/rules/native-rn-monorepo/native-ios.mdc +61 -0
- package/rules/native-rn-monorepo/react-native-js.mdc +78 -0
- package/rules/native-rn-monorepo/web.mdc +60 -0
- package/rules/project-starter/components.mdc +54 -0
- package/rules/project-starter/data-fetching.mdc +77 -0
- package/rules/project-starter/git.mdc +41 -0
- package/rules/project-starter/supabase.mdc +37 -0
- package/rules/project-starter/tailwind.mdc +48 -0
- package/rules/project-starter/typescript.mdc +36 -0
- package/rules/project-starter/web-performance.mdc +42 -0
- package/rules/senior-engineer.mdc +30 -0
- package/rules/shell-first-search.mdc +19 -0
- package/rules/skill-workflows.mdc +35 -0
- package/rules/verification-before-completion.mdc +57 -0
- package/skills/audit-accessibility/SKILL.md +441 -0
- package/skills/audit-agent-speed/SKILL.md +181 -0
- package/skills/audit-agent-speed/scripts/stop-typecheck.mjs +151 -0
- package/skills/audit-analytics/SKILL.md +138 -0
- package/skills/audit-auth-flows/SKILL.md +267 -0
- package/skills/audit-backend-architecture/SKILL.md +266 -0
- package/skills/audit-backend-architecture/references/patterns.md +386 -0
- package/skills/audit-bundle-size/SKILL.md +295 -0
- package/skills/audit-cicd/SKILL.md +218 -0
- package/skills/audit-code-quality/SKILL.md +314 -0
- package/skills/audit-code-review/SKILL.md +289 -0
- package/skills/audit-codemod-safety/SKILL.md +159 -0
- package/skills/audit-db-schema/SKILL.md +465 -0
- package/skills/audit-db-schema/references/details.md +110 -0
- package/skills/audit-doctrine/SKILL.md +189 -0
- package/skills/audit-env-parity/SKILL.md +133 -0
- package/skills/audit-fe-api/SKILL.md +458 -0
- package/skills/audit-gate-logic/SKILL.md +219 -0
- package/skills/audit-i18n/SKILL.md +339 -0
- package/skills/audit-infra-cost/SKILL.md +142 -0
- package/skills/audit-langfuse-llm/SKILL.md +468 -0
- package/skills/audit-langfuse-llm/references/details.md +226 -0
- package/skills/audit-llm-security/SKILL.md +147 -0
- package/skills/audit-monetization-iap/SKILL.md +137 -0
- package/skills/audit-payment-system/SKILL.md +268 -0
- package/skills/audit-payment-system/references/checklist.md +283 -0
- package/skills/audit-performance/SKILL.md +383 -0
- package/skills/audit-performance/references/loading-priority-2026.md +81 -0
- package/skills/audit-realworld/SKILL.md +287 -0
- package/skills/audit-registry-listing/SKILL.md +122 -0
- package/skills/audit-resilience/SKILL.md +153 -0
- package/skills/audit-responsive/SKILL.md +221 -0
- package/skills/audit-responsive/references/checklist.md +166 -0
- package/skills/audit-security/SKILL.md +289 -0
- package/skills/audit-skill-conflicts/SKILL.md +178 -0
- package/skills/audit-ui-states/SKILL.md +146 -0
- package/skills/audit-uiux-design-system/SKILL.md +475 -0
- package/skills/audit-uiux-design-system/references/details.md +71 -0
- package/skills/audit-ux/SKILL.md +381 -0
- package/skills/audit-ux/references/details.md +245 -0
- package/skills/audit-ux-journeys/SKILL.md +215 -0
- package/skills/audit-ux-journeys/references/checklist.md +179 -0
- package/skills/backend-db-performance/SKILL.md +441 -0
- package/skills/backend-error-handling/SKILL.md +489 -0
- package/skills/backend-error-handling/references/details.md +58 -0
- package/skills/backend-observability/SKILL.md +88 -0
- package/skills/backend-patterns/SKILL.md +499 -0
- package/skills/backend-patterns/references/architecture-patterns.md +298 -0
- package/skills/backend-realtime/SKILL.md +403 -0
- package/skills/backend-realtime/references/patterns.md +74 -0
- package/skills/burndown-full/SKILL.md +174 -0
- package/skills/complete-everything/SKILL.md +295 -0
- package/skills/data-pipeline/SKILL.md +109 -0
- package/skills/data-visualization/SKILL.md +488 -0
- package/skills/debug-error/SKILL.md +322 -0
- package/skills/debug-fe-be-integration/SKILL.md +459 -0
- package/skills/debug-sentry-monitor/SKILL.md +497 -0
- package/skills/debug-sentry-monitor/references/details.md +165 -0
- package/skills/deploy-npm/SKILL.md +394 -0
- package/skills/deploy-npm/references/example-mushi-mushi.md +52 -0
- package/skills/deploy-verify/SKILL.md +489 -0
- package/skills/design-api/SKILL.md +379 -0
- package/skills/design-canvas/SKILL.md +155 -0
- package/skills/design-email/SKILL.md +370 -0
- package/skills/design-frontend/SKILL.md +143 -0
- package/skills/design-generative-art/SKILL.md +474 -0
- package/skills/design-mobile-first/SKILL.md +506 -0
- package/skills/design-motion/SKILL.md +333 -0
- package/skills/design-motion/references/delight-interactions.md +191 -0
- package/skills/design-prd/SKILL.md +443 -0
- package/skills/design-system/SKILL.md +457 -0
- package/skills/design-theme/SKILL.md +226 -0
- package/skills/design-theme/themes/tsumagoi-ranch.md +150 -0
- package/skills/docs-adr/SKILL.md +168 -0
- package/skills/docs-coauthor/SKILL.md +368 -0
- package/skills/docs-comparison-pages/SKILL.md +117 -0
- package/skills/docs-domain-modeling/SKILL.md +97 -0
- package/skills/docs-launch-kit/SKILL.md +139 -0
- package/skills/docs-writer/SKILL.md +469 -0
- package/skills/enhance-agent-guardrails/SKILL.md +164 -0
- package/skills/enhance-arch-boundaries/SKILL.md +154 -0
- package/skills/enhance-capacitor-ui/SKILL.md +463 -0
- package/skills/enhance-capacitor-ui/references/details.md +750 -0
- package/skills/enhance-email-deliverability/SKILL.md +143 -0
- package/skills/enhance-growth-loops/SKILL.md +122 -0
- package/skills/enhance-lifecycle-email/SKILL.md +130 -0
- package/skills/enhance-motion/SKILL.md +193 -0
- package/skills/enhance-onboarding/SKILL.md +148 -0
- package/skills/enhance-pwa/SKILL.md +303 -0
- package/skills/enhance-readability/SKILL.md +146 -0
- package/skills/enhance-readme/SKILL.md +496 -0
- package/skills/enhance-readme/package-lock.json +187 -0
- package/skills/enhance-readme/package.json +17 -0
- package/skills/enhance-readme/scripts/generate-readme-blocks.mjs +199 -0
- package/skills/enhance-readme/scripts/record-readme-tour.mjs +442 -0
- package/skills/enhance-skill-prompts/SKILL.md +167 -0
- package/skills/enhance-skill-prompts/references/exemplar-audit-auth-flows.md +311 -0
- package/skills/enhance-ux-laws/SKILL.md +409 -0
- package/skills/enhance-web-conversion/SKILL.md +155 -0
- package/skills/enhance-web-forms/SKILL.md +154 -0
- package/skills/enhance-web-instant-nav/SKILL.md +138 -0
- package/skills/enhance-web-instant-nav/references/bfcache-blockers.md +23 -0
- package/skills/enhance-web-instant-nav/references/early-hints.md +33 -0
- package/skills/enhance-web-instant-nav/references/speculation-rules.md +44 -0
- package/skills/enhance-web-landing/SKILL.md +459 -0
- package/skills/enhance-web-landing/references/details.md +773 -0
- package/skills/enhance-web-redesign/SKILL.md +228 -0
- package/skills/enhance-web-seo/SKILL.md +276 -0
- package/skills/enhance-web-ui/SKILL.md +473 -0
- package/skills/enhance-web-ui/references/details.md +674 -0
- package/skills/enhance-web-ux/HEURISTICS.md +248 -0
- package/skills/enhance-web-ux/PATTERNS.md +375 -0
- package/skills/enhance-web-ux/SKILL.md +464 -0
- package/skills/enhance-web-ux/examples.md +222 -0
- package/skills/enhance-web-ux/references/details.md +406 -0
- package/skills/enhance-web-web3d/SKILL.md +397 -0
- package/skills/enhance-web-web3d/references/css-canvas-effects.md +180 -0
- package/skills/handoff/SKILL.md +66 -0
- package/skills/housekeep-backlog/SKILL.md +149 -0
- package/skills/housekeep-dead-code/SKILL.md +387 -0
- package/skills/housekeep-dead-code/references/ratchet-ci.md +205 -0
- package/skills/housekeep-dead-code/references/supabase-hygiene.md +152 -0
- package/skills/housekeep-design/SKILL.md +207 -0
- package/skills/housekeep-files/SKILL.md +220 -0
- package/skills/housekeep-files/references/naming-and-catalog.md +86 -0
- package/skills/housekeep-files/scripts/housekeep-files.ps1 +360 -0
- package/skills/housekeep-files/scripts/housekeep-files.sh +238 -0
- package/skills/housekeep-gates/SKILL.md +174 -0
- package/skills/iterate-agent-harness/SKILL.md +137 -0
- package/skills/iterate-gtm-weekly/SKILL.md +103 -0
- package/skills/iterate-post-launch/SKILL.md +292 -0
- package/skills/meta-mcp-builder/SKILL.md +313 -0
- package/skills/meta-skill-creator/SKILL.md +304 -0
- package/skills/mobile-capacitor-platform/SKILL.md +103 -0
- package/skills/mobile-emulator-start/SKILL.md +296 -0
- package/skills/mobile-emulator-test/SKILL.md +491 -0
- package/skills/mobile-emulator-test/references/details.md +478 -0
- package/skills/mobile-rn-performance/SKILL.md +107 -0
- package/skills/mobile-rn-screen/SKILL.md +476 -0
- package/skills/mobile-rn-screen/references/details.md +785 -0
- package/skills/mushi-health/SKILL.md +206 -0
- package/skills/mushi-integration/SKILL.md +257 -0
- package/skills/plan-aeo-readiness/SKILL.md +166 -0
- package/skills/plan-antislop/SKILL.md +281 -0
- package/skills/plan-aso/SKILL.md +149 -0
- package/skills/plan-backup-dr/SKILL.md +131 -0
- package/skills/plan-capacitor-hardening/SKILL.md +217 -0
- package/skills/plan-data-integrity/SKILL.md +187 -0
- package/skills/plan-dead-code/SKILL.md +386 -0
- package/skills/plan-dead-code/references/knip-config.md +214 -0
- package/skills/plan-dead-code/references/output-templates.md +133 -0
- package/skills/plan-dead-code/references/preservation-contract.md +50 -0
- package/skills/plan-dead-code/references/residue-greps.md +84 -0
- package/skills/plan-dependency-provenance/SKILL.md +200 -0
- package/skills/plan-docs-sync/SKILL.md +143 -0
- package/skills/plan-docs-sync/references/drift-taxonomy.md +43 -0
- package/skills/plan-docs-sync/references/output-templates.md +33 -0
- package/skills/plan-docs-sync/references/preservation-contract.md +17 -0
- package/skills/plan-error-handling/SKILL.md +205 -0
- package/skills/plan-gtm/SKILL.md +276 -0
- package/skills/plan-gtm/references/benchmarks-2026.md +183 -0
- package/skills/plan-input-validation/SKILL.md +179 -0
- package/skills/plan-llm-cost-guardrails/SKILL.md +176 -0
- package/skills/plan-mobile-readiness/SKILL.md +171 -0
- package/skills/plan-perf-audit/SKILL.md +145 -0
- package/skills/plan-perf-audit/references/audit-scope.md +51 -0
- package/skills/plan-perf-audit/references/output-templates.md +33 -0
- package/skills/plan-perf-audit/references/preservation-contract.md +13 -0
- package/skills/plan-pricing/SKILL.md +173 -0
- package/skills/plan-privacy-compliance/SKILL.md +148 -0
- package/skills/plan-rls-audit/SKILL.md +231 -0
- package/skills/plan-secrets-audit/SKILL.md +181 -0
- package/skills/plan-security-audit/SKILL.md +168 -0
- package/skills/plan-security-audit/references/output-templates.md +36 -0
- package/skills/plan-security-audit/references/owasp-supabase-scope.md +55 -0
- package/skills/plan-security-audit/references/preservation-contract.md +18 -0
- package/skills/plan-stub-checker/SKILL.md +216 -0
- package/skills/plan-stub-checker/references/detection-methodology.md +75 -0
- package/skills/plan-stub-checker/references/detection-taxonomy.md +34 -0
- package/skills/plan-stub-checker/references/output-templates.md +63 -0
- package/skills/plan-stub-checker/references/preservation-contract.md +24 -0
- package/skills/plan-test-coverage/SKILL.md +170 -0
- package/skills/plan-test-coverage/references/methodology.md +54 -0
- package/skills/plan-test-coverage/references/output-templates.md +34 -0
- package/skills/plan-test-coverage/references/preservation-contract.md +15 -0
- package/skills/plan-uiux-unification/SKILL.md +230 -0
- package/skills/plan-uiux-unification/references/output-templates.md +67 -0
- package/skills/plan-uiux-unification/references/phase-workbook.md +85 -0
- package/skills/plan-uiux-unification/references/preservation-contract.md +24 -0
- package/skills/protocol-browser-anti-stall/SKILL.md +211 -0
- package/skills/protocol-browser-anti-stall/references/mcp-to-cli-map.md +113 -0
- package/skills/protocol-browser-anti-stall/references/playwright-session-coordination.md +170 -0
- package/skills/research/SKILL.md +422 -0
- package/skills/test-exploratory/SKILL.md +165 -0
- package/skills/test-exploratory/references/charter-template.md +29 -0
- package/skills/test-load/SKILL.md +126 -0
- package/skills/test-mutation/SKILL.md +160 -0
- package/skills/test-playwright/SKILL.md +354 -0
- package/skills/test-qa/SKILL.md +364 -0
- package/skills/test-qa/references/details.md +268 -0
- package/skills/test-red-team/SKILL.md +386 -0
- package/skills/test-red-team/references/owasp-attack-checklist.md +193 -0
- package/skills/test-unit/SKILL.md +259 -0
- package/skills/test-unit/references/details.md +267 -0
- package/skills/test-visual-regression/SKILL.md +132 -0
- package/skills/thirdparty-emil-design-eng/ATTRIBUTION.md +20 -0
- package/skills/thirdparty-emil-design-eng/SKILL.md +21 -0
- package/skills/thirdparty-emil-design-eng/references/emil-design-eng.md +676 -0
- package/skills/thirdparty-ui-ux-pro-max/ATTRIBUTION.md +22 -0
- package/skills/thirdparty-ui-ux-pro-max/SKILL.md +304 -0
- package/skills/thirdparty-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/thirdparty-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/thirdparty-ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/thirdparty-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/thirdparty-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/thirdparty-ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/thirdparty-ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/thirdparty-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/thirdparty-ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/thirdparty-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/thirdparty-ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/thirdparty-web-interface-guidelines/ATTRIBUTION.md +23 -0
- package/skills/thirdparty-web-interface-guidelines/SKILL.md +190 -0
- package/skills/workflow-build-feature/SKILL.md +118 -0
- package/skills/workflow-coding-discipline/SKILL.md +140 -0
- package/skills/workflow-environment-ready/SKILL.md +128 -0
- package/skills/workflow-feature-flag/SKILL.md +262 -0
- package/skills/workflow-feedback-to-closure/SKILL.md +165 -0
- package/skills/workflow-fix-and-ship/SKILL.md +136 -0
- package/skills/workflow-git-commit/SKILL.md +200 -0
- package/skills/workflow-green-repo/SKILL.md +166 -0
- package/skills/workflow-grilling/SKILL.md +73 -0
- package/skills/workflow-gtm/SKILL.md +153 -0
- package/skills/workflow-housekeep/SKILL.md +453 -0
- package/skills/workflow-housekeep/references/templates.md +109 -0
- package/skills/workflow-launch-ready/SKILL.md +145 -0
- package/skills/workflow-merge-conflicts/SKILL.md +62 -0
- package/skills/workflow-onboard/SKILL.md +99 -0
- package/skills/workflow-parallel-agents/SKILL.md +164 -0
- package/skills/workflow-pr/SKILL.md +197 -0
- package/skills/workflow-quality-gate/SKILL.md +147 -0
- package/skills/workflow-refactor/SKILL.md +274 -0
- package/skills/workflow-release-prep/SKILL.md +207 -0
- package/skills/workflow-ship-and-observe/SKILL.md +164 -0
- package/skills/workflow-spec-tdd/SKILL.md +141 -0
- package/skills/workflow-spec-tdd/references/spec-template.md +126 -0
- package/skills/workflow-spec-tdd/references/tdd-patterns.md +167 -0
- package/skills-cursor/babysit/SKILL.md +17 -0
- package/skills-cursor/canvas/SKILL.md +142 -0
- package/skills-cursor/canvas/sdk/canvas-tokens.d.ts +235 -0
- package/skills-cursor/canvas/sdk/chart-primitives.d.ts +200 -0
- package/skills-cursor/canvas/sdk/dag-layout.d.ts +102 -0
- package/skills-cursor/canvas/sdk/diff-view.d.ts +130 -0
- package/skills-cursor/canvas/sdk/form-primitives.d.ts +194 -0
- package/skills-cursor/canvas/sdk/hooks.d.ts +117 -0
- package/skills-cursor/canvas/sdk/index.d.ts +47 -0
- package/skills-cursor/canvas/sdk/theme.d.ts +61 -0
- package/skills-cursor/canvas/sdk/todo-list.d.ts +49 -0
- package/skills-cursor/canvas/sdk/ui-primitives.d.ts +549 -0
- package/skills-cursor/canvas/sdk/ui-primitives.test.d.ts +2 -0
- package/skills-cursor/create-hook/SKILL.md +238 -0
- package/skills-cursor/create-rule/SKILL.md +185 -0
- package/skills-cursor/create-skill/SKILL.md +269 -0
- package/skills-cursor/create-skill/references/authoring-guide.md +182 -0
- package/skills-cursor/create-subagent/SKILL.md +228 -0
- package/skills-cursor/migrate-to-skills/SKILL.md +121 -0
- package/skills-cursor/shell/SKILL.md +22 -0
- package/skills-cursor/split-to-prs/SKILL.md +47 -0
- package/skills-cursor/statusline/SKILL.md +193 -0
- package/skills-cursor/update-cli-config/SKILL.md +85 -0
- package/skills-cursor/update-cursor-settings/SKILL.md +137 -0
- package/skills.sh.json +297 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Enhancement Walkthroughs
|
|
2
|
+
|
|
3
|
+
Real-world before/after enhancements that follow the SKILL.md workflow. Each walkthrough is
|
|
4
|
+
short and shows how RECON → LIVE → PAIN → HEURISTIC → PRIMITIVE → IMPLEMENT → VERIFY plays
|
|
5
|
+
out on a concrete page.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Example 1 — `/files` (file explorer)
|
|
10
|
+
|
|
11
|
+
### Step 1 — Recon
|
|
12
|
+
|
|
13
|
+
- **Workflow position:** central document hub. Users land here from notifications,
|
|
14
|
+
reimbursement, tax-filing, and from the global breadcrumb.
|
|
15
|
+
- **Primary task:** find a file or folder, then either open it, link it to an entry,
|
|
16
|
+
or download.
|
|
17
|
+
- **Data domain:** `UploadedFile`, `Folder`, `TreeItem`. Files carry `aiData`,
|
|
18
|
+
`confirmedData`, `fileMetadata`. Folders carry `description`, `linkedDocumentTitle`,
|
|
19
|
+
`linkedDocumentType`, `isDocumentLinked`.
|
|
20
|
+
- **Adjacent screens:** `/notifications`, `/reimbursement`, `/tax-compliance`.
|
|
21
|
+
- **Component tree:**
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
<FileManagementPage>
|
|
25
|
+
├── <PageHeader> — title, breadcrumbs, summary KPIs
|
|
26
|
+
├── <Toolbar> — search, "+フォルダ", "アップロード", "通知書ZIP"
|
|
27
|
+
└── <FolderManagement>
|
|
28
|
+
└── <TreeNode> — file or folder row
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- **Primitives available:** `Badge`, `Button`, `AnimatedButton`, `Tooltip`, `Card`.
|
|
32
|
+
Tokens: `signal-warn`, `signal-out`, `signal-in`, `ai`, `ai-soft`, `brand`, `muted`.
|
|
33
|
+
Helpers: `getFileIcon`, `getFileStatus`, `getFolderFileCount`, `formatFileSize`,
|
|
34
|
+
`formatFileCount`.
|
|
35
|
+
|
|
36
|
+
### Step 2 — Live (3 viewports)
|
|
37
|
+
|
|
38
|
+
| Viewport | Observation |
|
|
39
|
+
|----------|-------------|
|
|
40
|
+
| 1440 | Toolbar fits, but every folder uses the same blue `<Folder>` icon. `金額` and `サイズ` columns are blank for all folder rows. |
|
|
41
|
+
| 1024 | `通知書ZIP` button label competes for space; about to wrap. Always-on hint row "☐ チェックで選択 / Shift+クリック / Ctrl+A" repeats above every list. |
|
|
42
|
+
| 800 | Toolbar buttons wrap to 2 lines. Category labels (`経費`, `通知書`) wrap under names. |
|
|
43
|
+
| Expand notice folder | `未処理` status badge inside 64px column wraps to `未処` / `理`. |
|
|
44
|
+
|
|
45
|
+
### Step 3 — Pain inventory
|
|
46
|
+
|
|
47
|
+
| # | Source | Pain | Viewport |
|
|
48
|
+
|---|--------|------|----------|
|
|
49
|
+
| 1 | user | "Hard to see which were document link" | all |
|
|
50
|
+
| 2 | user | "Which folder had AI analysis" | all |
|
|
51
|
+
| 3 | user | "Which folder were linked to other document types" | all |
|
|
52
|
+
| 4 | user | Buttons overflow text in 2 lines | 1024 |
|
|
53
|
+
| 5 | live | All folder icons identical | all |
|
|
54
|
+
| 6 | live | Empty `金額` / `サイズ` columns for folder rows | desktop |
|
|
55
|
+
| 7 | live | `未処理` badge wraps to 2 lines | desktop |
|
|
56
|
+
| 8 | live | Always-on hint row consumes vertical space | all |
|
|
57
|
+
| 9 | live | Date duplicated (under name AND in column) | all |
|
|
58
|
+
| 10 | live | Empty (0件) folders look identical to populated ones | all |
|
|
59
|
+
|
|
60
|
+
### Step 4 — Heuristic mapping
|
|
61
|
+
|
|
62
|
+
| # | Heuristic | Why |
|
|
63
|
+
|---|-----------|-----|
|
|
64
|
+
| 1, 3, 5 | #1 Visibility, #6 Recognition, #2 Match Real World, Miller's | linked / categorised state hidden in label text |
|
|
65
|
+
| 2 | #1 Visibility, Tesler's | AI is an expensive async result rendered invisibly |
|
|
66
|
+
| 4, 7 | #4 Consistency, Fitts's | Japanese 2-character labels in a fixed column without nowrap |
|
|
67
|
+
| 6, 9 | #8 Minimalist | empty / duplicate cells fight for attention |
|
|
68
|
+
| 8 | #6 Recognition, #8 Minimalist | repeating affordance hint = recall, wastes a row forever |
|
|
69
|
+
| 10 | #8 Minimalist | populated rows should dominate |
|
|
70
|
+
|
|
71
|
+
### Step 5 — Primitive match
|
|
72
|
+
|
|
73
|
+
| # | Fix | Primitive / token |
|
|
74
|
+
|---|-----|-------------------|
|
|
75
|
+
| 1, 5 | category-aware icon + chip | new `getFolderCategory` helper → `Badge` + `lucide-react` icons + tone tokens |
|
|
76
|
+
| 2 | AI chip | `Badge`-style chip with `bg-ai-soft text-ai` |
|
|
77
|
+
| 3 | linked-document chip | `Link2` icon + `bg-signal-in/10 text-signal-in` |
|
|
78
|
+
| 4 | toolbar buttons | `whitespace-nowrap flex-shrink-0`, progressive `md:inline / lg:inline` labels, Tooltip with full label |
|
|
79
|
+
| 6 | folder aggregates | new `getFolderAggregates` → cells render `formatJpy` + `formatBytesShort` |
|
|
80
|
+
| 7 | non-wrapping status | pass `whitespace-nowrap` per call site, widen status column 64→78 |
|
|
81
|
+
| 8 | drop hint, add `?` tooltip | `Tooltip` on column header |
|
|
82
|
+
| 9 | drop inline date | delete inline date in `TreeNode` |
|
|
83
|
+
| 10 | dim empty folders | `opacity-70` |
|
|
84
|
+
|
|
85
|
+
### Step 6 — Plan
|
|
86
|
+
|
|
87
|
+
| Pri | File | Change | Risk |
|
|
88
|
+
|-----|------|--------|------|
|
|
89
|
+
| 1 | `helpers/get-folder-category.tsx` (NEW) | category → `{ Icon, label, tone }` | low |
|
|
90
|
+
| 2 | `helpers/get-folder-utils.tsx` | add `getFolderAggregates(files, folderId)` | low |
|
|
91
|
+
| 3 | `components/tree-node.tsx` | use category icon, drop empty cells, AI chip, nowrap | med |
|
|
92
|
+
| 4 | `components/folder-management.tsx` | drop hint row, retitle columns, sticky `?` | low |
|
|
93
|
+
| 5 | `pages/file-management-page.tsx` | toolbar nowrap + progressive labels | low |
|
|
94
|
+
| 6 | `tree-node.tsx` (grid) | status column 64→78, count 60→56 | low |
|
|
95
|
+
|
|
96
|
+
### Step 7 — Implement
|
|
97
|
+
|
|
98
|
+
Land helpers first; component refactor next; page-level toolbar last. After each diff,
|
|
99
|
+
lint the touched files (ReadLints in Cursor; the repo's lint script in Claude Code). Comment the *intent* only — e.g.:
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
// Status column widened 64→78px so stacked AI+status chips never collide
|
|
103
|
+
// with the count column. Count column tightened 60→56px to compensate.
|
|
104
|
+
export const FILE_ROW_GRID_COLS = "… sm:grid-cols-[… 78px 56px 28px]"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Step 8 — Verify
|
|
108
|
+
|
|
109
|
+
Re-screenshot at 1440 / 1024 / 800. Click into the same notice folder. Confirm:
|
|
110
|
+
|
|
111
|
+
- folder icons differentiated by category
|
|
112
|
+
- AI / 未処理 / 連携 chips inline on rows
|
|
113
|
+
- toolbar buttons single-line at all widths (icon-only at narrow)
|
|
114
|
+
- status badges single-line; AI + 未処理 stacked vertically when both present
|
|
115
|
+
- empty folders at `opacity-70`
|
|
116
|
+
- always-on hint replaced by `?` tooltip; live hint only when selecting
|
|
117
|
+
|
|
118
|
+
### Step 9 — Write-up table
|
|
119
|
+
|
|
120
|
+
| Pain | Heuristic | Fix | Primitive |
|
|
121
|
+
|------|-----------|-----|-----------|
|
|
122
|
+
| Hard to see linked-document folders | #1, #6 | `Link2` chip + linked tone | `Badge`, `signal-in` |
|
|
123
|
+
| Which folders had AI | #1 | inline `AI` chip on folder + file | `Badge`, `ai`/`ai-soft` |
|
|
124
|
+
| Generic folder icons | #6, #2 | `getFolderCategory` per-domain icon + tone | helper + Lucide |
|
|
125
|
+
| Toolbar wrap | #4, Fitts's | `whitespace-nowrap` + progressive labels | `Button` + `Tooltip` |
|
|
126
|
+
| Empty `金額` / `サイズ` | #8 | folder aggregates | `getFolderAggregates` |
|
|
127
|
+
| Status badge wrap | #4 | `whitespace-nowrap` + widened column | `Badge` + grid |
|
|
128
|
+
| Always-on hint row | #6, #8 | `?` tooltip; live hint only when selecting | `Tooltip` |
|
|
129
|
+
| Empty folders compete | #8 | `opacity-70` | utility class |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Example 2 — `/notifications` zip viewer (single notice)
|
|
134
|
+
|
|
135
|
+
### Step 1 — Recon
|
|
136
|
+
|
|
137
|
+
- **Workflow position:** terminal — user opens a single notification document received
|
|
138
|
+
from e-Gov / e-Tax / eLTAX.
|
|
139
|
+
- **Primary task:** read the notice content; understand which file inside the zip is
|
|
140
|
+
the meaningful one.
|
|
141
|
+
- **Data domain:** `Notice` with attached files (`xml`, `xsl`, `kagami` cover sheet,
|
|
142
|
+
`zip` original). `xsl` files contain the styled view; `xml` files contain the data.
|
|
143
|
+
- **Adjacent screens:** `/notifications` list (back), `/files` (where the zip is stored).
|
|
144
|
+
|
|
145
|
+
### Step 2 — Live
|
|
146
|
+
|
|
147
|
+
| Viewport | Observation |
|
|
148
|
+
|----------|-------------|
|
|
149
|
+
| 1440 | Single document panel takes full width. The other zip files are nowhere visible. Clicking on `kagami.xsl` triggers download instead of view. |
|
|
150
|
+
| 1024 | Same — no way to navigate between files inside the zip. |
|
|
151
|
+
| 800 | Same. |
|
|
152
|
+
|
|
153
|
+
### Step 3 — Pain
|
|
154
|
+
|
|
155
|
+
| # | Pain |
|
|
156
|
+
|---|------|
|
|
157
|
+
| 1 | Other files in the zip are invisible — user can't browse them |
|
|
158
|
+
| 2 | Click on .xsl/.xml/.zip downloads instead of previewing |
|
|
159
|
+
| 3 | XML / XSL preview is raw monospace dump — unreadable |
|
|
160
|
+
| 4 | Labels `適用結果`, `成形結果` are jargon — user doesn't understand which to read |
|
|
161
|
+
|
|
162
|
+
### Step 4 — Heuristic
|
|
163
|
+
|
|
164
|
+
| # | Heuristic | Why |
|
|
165
|
+
|---|-----------|-----|
|
|
166
|
+
| 1 | #1 Visibility, #6 Recognition | siblings inside the zip are hidden |
|
|
167
|
+
| 2 | #2 Match Real World | a "view" intent should not download |
|
|
168
|
+
| 3 | #8 Minimalist, #4 Consistency | raw dump is not human-friendly |
|
|
169
|
+
| 4 | #2 Match Real World | engineering jargon in a user surface |
|
|
170
|
+
|
|
171
|
+
### Step 5 — Primitive match
|
|
172
|
+
|
|
173
|
+
| # | Fix | Primitive |
|
|
174
|
+
|---|-----|-----------|
|
|
175
|
+
| 1 | left tree-list of all files inside the zip | `TreeView` primitive (or extend `<FolderManagement>`) |
|
|
176
|
+
| 2 | inline reader instead of download | `<NoticeFileReadableView>` component |
|
|
177
|
+
| 3 | XSL-styled rendering for `.xml`+`.xsl`, syntax-highlighted for raw `.xml` | use `xslt-processor` or `xmldom`; primitives: `<CodeBlock>` for fallback |
|
|
178
|
+
| 4 | rename labels `適用結果`→`通知書(読みやすく整形)`, `成形結果`→… | content fix |
|
|
179
|
+
|
|
180
|
+
### Step 6 — Plan
|
|
181
|
+
|
|
182
|
+
| Pri | File | Change |
|
|
183
|
+
|-----|------|--------|
|
|
184
|
+
| 1 | `notice-file-tree.tsx` (NEW) | left-panel tree of files inside zip |
|
|
185
|
+
| 2 | `notice-file-readable-view.tsx` (NEW) | inline reader component |
|
|
186
|
+
| 3 | `notice-detail-panel.tsx` | merge tree + reader, drop download-on-click |
|
|
187
|
+
| 4 | (content) | rename jargon labels |
|
|
188
|
+
|
|
189
|
+
### Step 7 — Implement
|
|
190
|
+
|
|
191
|
+
(Already shipped in the codebase — see `src/features/notice-document/components/`.)
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Template — Use This for Future Enhancements
|
|
196
|
+
|
|
197
|
+
When this skill runs, end the session with a write-up in this format. The user should be
|
|
198
|
+
able to scan it in 30 seconds:
|
|
199
|
+
|
|
200
|
+
```markdown
|
|
201
|
+
## Enhanced /<route>
|
|
202
|
+
|
|
203
|
+
### What changed
|
|
204
|
+
- [primitive] [behaviour change] — heuristic #N
|
|
205
|
+
- …
|
|
206
|
+
|
|
207
|
+
### Files changed
|
|
208
|
+
- `<path>` — [one-line purpose]
|
|
209
|
+
|
|
210
|
+
### Verified
|
|
211
|
+
- 1440 / 1024 / 800 viewport screenshots — no wrap, no overflow, no collision
|
|
212
|
+
- Lint clean
|
|
213
|
+
- Console clean
|
|
214
|
+
|
|
215
|
+
### Pain → Heuristic → Fix
|
|
216
|
+
| Pain | Heuristic | Fix | Primitive |
|
|
217
|
+
|------|-----------|-----|-----------|
|
|
218
|
+
| … | … | … | … |
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Add the latest enhancement here (Example 3, 4, …) every time this skill ships changes,
|
|
222
|
+
so future runs can mine concrete past patterns.
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
### 5b — Primitive-First Patch Decision
|
|
2
|
+
|
|
3
|
+
Before writing the diff, decide: **does this bug live at the leaf I'm
|
|
4
|
+
looking at, or at a wrapper / token / helper higher up?** Use this
|
|
5
|
+
decision tree:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Is the bug visible on more than one page / route / row?
|
|
9
|
+
├── Yes → Walk UP the component tree from the broken leaf.
|
|
10
|
+
│ Find the first wrapper / helper / token that hosts the bug.
|
|
11
|
+
│ Search for other consumers of that wrapper.
|
|
12
|
+
│ If consumers ≥ 3 → fix at the wrapper (with a backward-compatible
|
|
13
|
+
│ prop / opt-in behaviour / new default).
|
|
14
|
+
│ If consumers ≤ 2 → fix at each call site, but file a TODO to
|
|
15
|
+
│ extract the wrapper when a 3rd consumer appears.
|
|
16
|
+
└── No → Fix at the consumer. But still ask: "what shape of bug would
|
|
17
|
+
appear if a 2nd consumer reused this pattern?" Document it.
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Concrete cues that the wrapper is broken (not the leaf):
|
|
21
|
+
|
|
22
|
+
- Same primitive used N times, only some sites display the bug → **the
|
|
23
|
+
bug is in a *combination* of wrapper default + consumer assumption**.
|
|
24
|
+
Fix by making the consumer assumption explicit (new prop) and changing
|
|
25
|
+
the default to match the common case.
|
|
26
|
+
- The leaf has `w-full` / `min-w-0` / `flex-1` already and is *still*
|
|
27
|
+
collapsing → the wrapper is content-sizing the leaf. Patch the wrapper.
|
|
28
|
+
- The leaf has correct semantic tokens but renders monochromatically →
|
|
29
|
+
the *token scale* is too faint for the product tier. Bump the token,
|
|
30
|
+
not the leaf.
|
|
31
|
+
- A `min-h` / `aspect-ratio` floor reserves space for content the leaf
|
|
32
|
+
doesn't have → the wrapper's *layout contract* assumes rich content.
|
|
33
|
+
Patch the wrapper to make the floor conditional.
|
|
34
|
+
|
|
35
|
+
Anti-pattern (do not do this): adding `!w-full` / `!min-h-0` / inline
|
|
36
|
+
overrides to one specific site to force-fix the page you're looking at.
|
|
37
|
+
The bug lives on every other consumer page — you've just hidden it
|
|
38
|
+
locally.
|
|
39
|
+
|
|
40
|
+
**Document the why in a code comment on the wrapper change.** Future
|
|
41
|
+
enhancers must understand *why* the prop / default exists, or they will
|
|
42
|
+
revert it. Comment template:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
// `block` makes the Tooltip wrapper a full-width flex column so a child
|
|
46
|
+
// `w-full` button actually fills its grid cell. Without this, the wrapper
|
|
47
|
+
// defaults to `inline-flex` and every stat tile shrinks to content width,
|
|
48
|
+
// leaving huge gaps in the 3-up grid (visible bug on /account → This Week
|
|
49
|
+
// before this fix). Repro: 3 StatExplainer tiles in `grid-cols-3 gap-2`
|
|
50
|
+
// — measure rect widths, expect uniform thirds.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Step 6 — ENHANCEMENT PLAN (the deliverable)
|
|
56
|
+
|
|
57
|
+
A single, reviewable table. Order by impact / risk:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
| Pri | File | Change | Heuristic | Risk |
|
|
61
|
+
|-----|------|--------|-----------|------|
|
|
62
|
+
| 1 | helpers/get-folder-category.tsx (NEW) | category → {icon, label, tone} | #2,#6 | low |
|
|
63
|
+
| 2 | helpers/get-folder-aggregates.tsx (NEW) | files[] + folderId → { count, ai, ¥, bytes } | #1,#8 | low |
|
|
64
|
+
| 3 | components/tree-node.tsx | use category icon + chips, drop empty cells | #1,#6,#8 | med |
|
|
65
|
+
| 4 | components/folder-management.tsx | drop hint row, retitle columns | #6,#8 | low |
|
|
66
|
+
| 5 | pages/<route>.tsx | toolbar nowrap + progressive labels | #4,#8 | low |
|
|
67
|
+
| 6 | components/ui/badge.tsx | (optional) add `whitespace-nowrap` to base | #4 | med |
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
For each row also note: edge cases, what to test, what NOT to touch.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 7 — IMPLEMENT (smallest possible diffs)
|
|
75
|
+
|
|
76
|
+
Rules during implementation:
|
|
77
|
+
|
|
78
|
+
1. **Helper-first**. Land helpers (pure functions, no JSX) before touching the component
|
|
79
|
+
that uses them. They're easier to lint, test, and review.
|
|
80
|
+
2. **One concern per edit**. If a single diff changes layout AND data AND tokens, split it.
|
|
81
|
+
3. **Data contract before decoration**. If the enhancement depends on status,
|
|
82
|
+
progress, ownership, counts, validation, permissions, or timestamps, wire it
|
|
83
|
+
to the existing backend/schema/API or add the smallest durable field/helper
|
|
84
|
+
needed. Do not create mock arrays or fake visual state to make the screen
|
|
85
|
+
look richer.
|
|
86
|
+
4. **Comment the WHY only**. Code that says "added `whitespace-nowrap`" is noise; a comment
|
|
87
|
+
that says "Japanese 2-character labels in a 64px column wrap to 2 lines without nowrap"
|
|
88
|
+
is gold. Future you (or another agent) won't undo it.
|
|
89
|
+
5. **Use semantic tokens**. `bg-signal-warn/10 text-signal-warn` not `bg-orange-100 text-orange-700`.
|
|
90
|
+
Honour any "do NOT pair bg-X with text-X" warnings on the primitives you use.
|
|
91
|
+
6. **No new colours, no new sizes, no new radii.** If you reach for one, you missed step 1d.
|
|
92
|
+
7. **Empty / zero-state de-emphasis.** Apply `opacity-70` or a `muted` variant to rows with
|
|
93
|
+
zero children / zero amount / zero activity. Don't hide them — the user still needs them
|
|
94
|
+
in the count, but they shouldn't fight for attention.
|
|
95
|
+
8. **Density gradient via Tailwind breakpoints.** Show full labels at `lg:`, abbreviate at
|
|
96
|
+
`md:`, icon-only at default. Never let a label wrap.
|
|
97
|
+
9. **Stack tight columns vertically.** A 64-78px status column with TWO chips (AI + status)
|
|
98
|
+
stacks vertically (`flex-col gap-0.5`) — never horizontally.
|
|
99
|
+
10. **Match colour saturation to product tier.** Tier A/B (vibrant /
|
|
100
|
+
consumer / learning / lifestyle) needs `/15–/25` tints with `/30–/40`
|
|
101
|
+
rings to read as semantic categories at a squint. Tier C/D
|
|
102
|
+
(productive / data-dense) keeps `/5–/10` for restraint. Tier mismatch
|
|
103
|
+
= monochromatic / washed-out feel even when every token is correct.
|
|
104
|
+
See *Domain Colour Tier* in `enhance-web-ui` SKILL.md.
|
|
105
|
+
11. **Make conditional slots collapse when empty.** Any optional region
|
|
106
|
+
(`media`, `aside`, `cover`, `eyebrow`, `secondaryCTA`) must drop its
|
|
107
|
+
wrapper or its `min-h` floor when its content is sparse. Reserve
|
|
108
|
+
space only at densities where the slot will be filled. Inline
|
|
109
|
+
sparse data into the action row instead of letting it float in a
|
|
110
|
+
half-empty card.
|
|
111
|
+
12. **Delete duplicate datums; replace with complementary data.** When
|
|
112
|
+
the same number/word/status appears twice in one fold, keep the
|
|
113
|
+
most actionable placement and replace the others with a sibling
|
|
114
|
+
datum (streak, "vs last week", reviews-due, etc.). Each delete is
|
|
115
|
+
a hierarchy upgrade for what stays.
|
|
116
|
+
13. **Override third-party inline styles explicitly.** Headless data-grid
|
|
117
|
+
libraries (TanStack Table, AG-Grid, MUI DataGrid, Chakra DataTable,
|
|
118
|
+
react-table) emit inline `style={{ width: header.getSize() + 'px' }}`
|
|
119
|
+
on every `<th>` / `<td>` from a JS API. Inline styles beat scoped
|
|
120
|
+
CSS unless you use one of: (a) `!important` on the property, (b)
|
|
121
|
+
`table-layout: fixed` on the parent table so intrinsic widths are
|
|
122
|
+
ignored, or (c) drive widths through CSS variables that your rule
|
|
123
|
+
overwrites. Apply at **every viewport**, not just the one you tested.
|
|
124
|
+
Verify via DevTools `Computed → width`: your rule must not appear
|
|
125
|
+
crossed-out at 1440 / 1024 / 800. Same gotcha applies to MUI Tabs,
|
|
126
|
+
Mantine SegmentedControl, Chart.js / D3 default sizing, etc. — any
|
|
127
|
+
library that injects layout from JS.
|
|
128
|
+
14. **Calm chrome before touching content.** If the brief includes chrome
|
|
129
|
+
(header / breadcrumb / tab / dock / sidebar / toolbar) the first move
|
|
130
|
+
is **subtraction**: strip backgrounds → borders → tints → fills, in
|
|
131
|
+
that order, until chrome reads as a tonal recess that frames content.
|
|
132
|
+
For active states, prefer micro-indicators (underline, M3 32×16 pill
|
|
133
|
+
on icon, count-badge tint, font-weight bump) over full-cell fills —
|
|
134
|
+
see "Heavy Active State" pattern + Hidden Failure Modes H1, H3 in
|
|
135
|
+
`enhance-web-ui`. On root / index routes, actively suppress the
|
|
136
|
+
breadcrumb / context row — the dock active indicator + page H1
|
|
137
|
+
already answer "where am I?", and the breadcrumb on root is pure
|
|
138
|
+
tautology (Failure Mode H2 / S13).
|
|
139
|
+
15. **Audit the brand-color budget per zone.** Before adding a brand-tinted
|
|
140
|
+
surface (border / fill / ring / text in the brand color) anywhere in
|
|
141
|
+
chrome, count existing brand-tinted surfaces in that visual zone. If
|
|
142
|
+
≥ 1 already exists for non-CTA reasons (a brand-bordered home icon,
|
|
143
|
+
a brand-tinted breadcrumb chip, a brand-tinted tab background),
|
|
144
|
+
**demote it** to neutral typography first. The brand color is
|
|
145
|
+
finite — spend it on the action the user came to take, status chips
|
|
146
|
+
that *carry* meaning, and the active micro-indicator only.
|
|
147
|
+
16. **Set aria-current parity with the visual active state.** Whenever
|
|
148
|
+
you paint an active tab / nav link / breadcrumb crumb / dock cell,
|
|
149
|
+
also set `aria-current="page"` (or `aria-selected="true"` for tabs).
|
|
150
|
+
Visual + AT treatment must agree; keyboard and screen-reader users
|
|
151
|
+
depend on it. Grep for active-state classNames; for each, confirm
|
|
152
|
+
the same JSX node carries the matching ARIA attribute.
|
|
153
|
+
|
|
154
|
+
After every meaningful edit:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
Lint the modified files (ReadLints in Cursor; the repo's lint script in Claude Code) — fix anything you introduced.
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Step 8 — VERIFY (the same three viewports, before/after)
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
Re-screenshot at 1440 × 900, 1024 × 700, 800 × 700.
|
|
166
|
+
Click into the same representative items as step 2b.
|
|
167
|
+
Check: no wrap, no overflow, no collision, no jarring state change, console clean.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
If any pain from step 3 still shows visually, do not declare done. Iterate.
|
|
171
|
+
|
|
172
|
+
### 8b — Re-run the silent-bug gates
|
|
173
|
+
|
|
174
|
+
Screenshots prove the surface; the gates from Step 2.5 prove the
|
|
175
|
+
underlying contract. After each enhancement, re-run:
|
|
176
|
+
|
|
177
|
+
| Gate | What to re-check | Pass criterion |
|
|
178
|
+
|------|------------------|----------------|
|
|
179
|
+
| Uniformity | rect widths of every repeated tile group you fixed | `widthSpan ≤ 1px` per group |
|
|
180
|
+
| Conditional slot | sparse / zero-state render of every slot you touched | no `min-h` reservation > 1.5× actual content height |
|
|
181
|
+
| Dup-datum | each fold of the page | every datum (number, word, status) appears exactly once |
|
|
182
|
+
| Category squint | desktop screenshot at 10–15px Gaussian blur | tier-A/B: distinct colour blobs per category. tier-C/D: near-uniform achromatic with saturated alerts only |
|
|
183
|
+
| Wrapper-fix consumers | every other consumer of any wrapper you patched | same wrapper, different page, no regression |
|
|
184
|
+
|
|
185
|
+
A passed silent-bug gate is *worth more than a clean screenshot*: it
|
|
186
|
+
prevents the bug class from re-appearing on adjacent pages your future
|
|
187
|
+
enhancers never thought to check.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Step 9 — WRITE-UP
|
|
192
|
+
|
|
193
|
+
Use the template in `examples.md`. Each user-facing pain gets:
|
|
194
|
+
|
|
195
|
+
- a one-line **before** description
|
|
196
|
+
- the **NN/g heuristic** it violated
|
|
197
|
+
- the **primitive / token** used in the fix
|
|
198
|
+
- the **after** behaviour
|
|
199
|
+
- a small screenshot or code reference
|
|
200
|
+
|
|
201
|
+
Keep the message structured so the user can scan it in 30 seconds.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Heuristic Mapping Cheat Sheet (quick reference)
|
|
206
|
+
|
|
207
|
+
| Symptom on screen | Likely NN/g heuristic |
|
|
208
|
+
|-------------------|------------------------|
|
|
209
|
+
| Async result invisible (AI ran, link made, file processed) | #1 Visibility of System Status |
|
|
210
|
+
| Domain term feels engineering-y (`fileStatus=unlinked`) | #2 Match Real World |
|
|
211
|
+
| No way to undo / cancel / back out | #3 User Control & Freedom |
|
|
212
|
+
| Two pages style the same thing differently | #4 Consistency & Standards |
|
|
213
|
+
| Destructive action with no confirm; mis-keyable forms | #5 Error Prevention |
|
|
214
|
+
| All items look identical, must read names to find one | #6 Recognition over Recall |
|
|
215
|
+
| No keyboard shortcut, no bulk action, no saved filters | #7 Flexibility & Efficiency |
|
|
216
|
+
| Empty columns, repeating hints, decorative chrome | #8 Aesthetic & Minimalist |
|
|
217
|
+
| Error messages with codes, no suggested next step | #9 Help Users Recover |
|
|
218
|
+
| Onboarding with no in-context help, opaque controls | #10 Help & Documentation |
|
|
219
|
+
| Active tab/dock/nav painted heavier than siblings (full-cell wash) | #4 Consistency + NN/g *Navigation: You Are Here* (too loud) |
|
|
220
|
+
| Same word ("Home") echoed in breadcrumb + dock + H1 on root route | #8 Aesthetic & Minimalist (chrome tautology) |
|
|
221
|
+
| Brand color on chrome chips dilutes the actual primary CTA | NN/g *Visual Hierarchy* (every brand-tinted thing claims primacy) |
|
|
222
|
+
| Card-on-card chip (`bg-card border` on a `bg-muted` row) | #4 Consistency, #8 Minimalist (one elevation per row) |
|
|
223
|
+
| Hover-only row action with no touch fallback | #6 Recognition over Recall, #7 Flexibility (silent on touch) |
|
|
224
|
+
| Library inline `width` beats your CSS at one viewport but not another | #4 Consistency (rule loses specificity war) |
|
|
225
|
+
| Column with 44px content reserves 150px while sibling truncates | #8 Aesthetic & Minimalist (allocation mismatch) |
|
|
226
|
+
|
|
227
|
+
### Silent-bug → heuristic shortcuts
|
|
228
|
+
|
|
229
|
+
| Silent-bug class (Step 3b) | Likely NN/g heuristic | Why |
|
|
230
|
+
|----------------------------|------------------------|-----|
|
|
231
|
+
| Wrapper-collapsed tiles | #4 Consistency, #8 Minimalist | hit area unstable across rows; whitespace doesn't communicate grouping |
|
|
232
|
+
| Dead conditional slot | #8 Aesthetic & Minimalist | reserved space competes with focal content but holds no signal |
|
|
233
|
+
| Information duplication per fold | #8 Aesthetic & Minimalist | every duplicate steals attention from primary copy |
|
|
234
|
+
| Monochromatic surface (tier mismatch) | #1 Visibility, #6 Recognition | category signal hidden in the design-token scale |
|
|
235
|
+
| Left-anchored stack (no horizontal balance) | #4 Consistency | uniform layout hides true content hierarchy |
|
|
236
|
+
| Generic icon stack | #2 Match real world, #6 Recognition | mental categories collapse; user must read every name |
|
|
237
|
+
|
|
238
|
+
For depth on each heuristic and the supporting Laws of UX, read `HEURISTICS.md`.
|
|
239
|
+
For specific anti-patterns and their replacements, read `PATTERNS.md`.
|
|
240
|
+
For complete before/after enhancement examples, read `examples.md`.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Quick Sanity Checks Before You Stop
|
|
245
|
+
|
|
246
|
+
- [ ] Product tier identified (A/B/C/D) and applied consistently
|
|
247
|
+
- [ ] Every change cites a heuristic in the write-up
|
|
248
|
+
- [ ] No new colour / spacing / radius value invented
|
|
249
|
+
- [ ] No new top-level primitive invented
|
|
250
|
+
- [ ] No mock/dead/rogue UI state introduced
|
|
251
|
+
- [ ] Feedback indicators are backed by real schema/API/domain state
|
|
252
|
+
- [ ] **DOM uniformity gate passed**: rect widths within 1px on every
|
|
253
|
+
repeated tile group fixed
|
|
254
|
+
- [ ] **Conditional-slot zero-state gate passed**: no slot reserves >1.5×
|
|
255
|
+
its actual content height on mobile
|
|
256
|
+
- [ ] **Dup-datum gate passed**: no datum (number, word, status) appears
|
|
257
|
+
more than once per fold
|
|
258
|
+
- [ ] **Category-squint gate passed**: tier-A/B → distinct colour blobs;
|
|
259
|
+
tier-C/D → near-uniform achromatic
|
|
260
|
+
- [ ] All labels stay on one line at 800 / 1024 / 1440
|
|
261
|
+
- [ ] Empty / zero-state rows are visually de-emphasised
|
|
262
|
+
- [ ] No always-on instruction row that repeats affordance text
|
|
263
|
+
- [ ] Async results (AI, link, error) are visible inline as chips, not behind a click
|
|
264
|
+
- [ ] **Repeating bug → patched at the wrapper / token / helper, not the
|
|
265
|
+
consumer** (with intent comment on why)
|
|
266
|
+
|
|
267
|
+
### Hidden-failure-mode audit (the difficult-to-spot ones)
|
|
268
|
+
- [ ] **S11 Library specificity**: every responsive table/grid CSS rule was
|
|
269
|
+
verified at all 3 viewports via DevTools `Computed → width`; the
|
|
270
|
+
rule is *not* crossed-out by inline `style.width` from the
|
|
271
|
+
data-grid library at any viewport.
|
|
272
|
+
- [ ] **S12 Active-state mass**: bounding box of active tab / dock cell /
|
|
273
|
+
nav item ≈ bounding box of inactive sibling (within ~15 % painted
|
|
274
|
+
area). No active sibling reads as "weirdly big" at the squint test.
|
|
275
|
+
- [ ] **S13 Chrome tautology**: on root / index routes, the page name does
|
|
276
|
+
not appear in ≥ 2 chrome zones. Suppress the breadcrumb / context
|
|
277
|
+
row when redundant with the page H1 + dock active indicator.
|
|
278
|
+
- [ ] **S14 Card-on-card**: no chip with `bg-card border` sits on a row
|
|
279
|
+
whose own background is already a tonal recess. One elevation per row.
|
|
280
|
+
- [ ] **S15 Hover-only affordance**: every hover-revealed action has a
|
|
281
|
+
tap-only fallback below the pointer breakpoint
|
|
282
|
+
(`focus-within:opacity-100` or always-visible at `<sm`).
|
|
283
|
+
- [ ] **S16 Brand-color budget**: ≤ 1 brand-tinted surface per visual zone
|
|
284
|
+
excluding the active micro-indicator and meaningful status chips.
|
|
285
|
+
- [ ] **S17 Hit area vs visual chrome**: 44 px touch targets achieved via
|
|
286
|
+
invisible negative-margin extension, not by inflating the visual
|
|
287
|
+
chrome (no `w-11 h-11 bg-card border` icon buttons).
|
|
288
|
+
- [ ] **S18 Responsive visibility**: column-meta `hideBelowMd` flags and
|
|
289
|
+
className breakpoints are not inverted (no column appearing at `sm`
|
|
290
|
+
and disappearing at `md+`).
|
|
291
|
+
- [ ] **aria-current parity**: every visually-active nav / tab / dock /
|
|
292
|
+
breadcrumb item carries the matching `aria-current` /
|
|
293
|
+
`aria-selected` attribute.
|
|
294
|
+
- [ ] **S19 wrapper-collapsed tiles** (Step 2.5a / 3b S1): rendered
|
|
295
|
+
widths of every repeated tile group are within 1 px of each other.
|
|
296
|
+
No `inline-flex` / `inline-block` ancestor between grid cell and
|
|
297
|
+
tile is silently shrinking the children.
|
|
298
|
+
- [ ] **S20 dead conditional slot** (Step 2.5b / 3b S2): every optional
|
|
299
|
+
region tested with sparse / zero-state content; no slot reserves
|
|
300
|
+
`min-h` > 1.5× actual content height on mobile.
|
|
301
|
+
- [ ] **S21 information duplication per fold** (Step 2.5c / 3b S3): each
|
|
302
|
+
datum (number, word, status, date) appears exactly once per
|
|
303
|
+
viewport fold; duplicates deleted or replaced with complementary
|
|
304
|
+
data.
|
|
305
|
+
- [ ] **S22 monochromatic surface / domain-tier mismatch** (Step 2.5d /
|
|
306
|
+
3b S4): category-squint at 10–15 px blur shows distinct colour
|
|
307
|
+
blobs (tier A/B) or near-uniform achromatic with status-only
|
|
308
|
+
colour (tier C/D).
|
|
309
|
+
- [ ] **S23 left-anchored stacked cards** (Step 3b S5): every stacked
|
|
310
|
+
card has at least one right-anchored piece of metadata tied to
|
|
311
|
+
data — no decorative right-side icons.
|
|
312
|
+
|
|
313
|
+
### Repo health
|
|
314
|
+
- [ ] Lint passes on every modified file
|
|
315
|
+
- [ ] Three-viewport screenshots show no wrap / overflow / collision
|
|
316
|
+
- [ ] Write-up table maps each pain → heuristic → primitive → file → after
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## When NOT to Use This Skill
|
|
321
|
+
|
|
322
|
+
- The user wants a **report only** (no code changes) → use `audit-ux` or
|
|
323
|
+
`audit-uiux-design-system`
|
|
324
|
+
- The user wants to **build a brand new feature** from scratch → use `design-frontend`
|
|
325
|
+
- The change is a single-line **bug fix** with no UX dimension → just fix it
|
|
326
|
+
- The user wants a **README / marketing page** prettied up → use `enhance-readme`
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Companion Files
|
|
331
|
+
|
|
332
|
+
- [`HEURISTICS.md`](HEURISTICS.md) — NN/g 10 + Laws of UX, condensed
|
|
333
|
+
- [`PATTERNS.md`](PATTERNS.md) — anti-pattern → replacement library
|
|
334
|
+
- [`examples.md`](examples.md) — complete before / after enhancement walkthroughs
|
|
335
|
+
- [`enhance-web-ui` SKILL.md](../../enhance-web-ui/SKILL.md) — companion
|
|
336
|
+
artistic/composition skill. The §"Hidden Failure Modes" section there
|
|
337
|
+
enumerates H1–H12 with detection probes and fix shapes that this skill's
|
|
338
|
+
S11–S18 reference. Read both together when feedback is vague-but-visceral
|
|
339
|
+
("clunky", "atrocious", "wasted space", "incoherent height").
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Research Anchors (for the new failure-mode rules)
|
|
344
|
+
|
|
345
|
+
- **Linear — A calmer interface for a product in motion (2025)**: the
|
|
346
|
+
canonical reference for the *Calm Chrome* rule. Names the principle
|
|
347
|
+
"structure should be felt, not seen"; chrome recedes, content
|
|
348
|
+
takes precedence. <https://linear.app/now/behind-the-latest-design-refresh>
|
|
349
|
+
- **Material 3 — NavigationBar spec**: active indicator is a 64×32
|
|
350
|
+
`cornerFull` pill in `SecondaryContainer` color wrapping the **icon**,
|
|
351
|
+
not the cell. Reference for the *Heavy Active State* fix shape (S12).
|
|
352
|
+
<https://m3.material.io/components/navigation-bar/overview>
|
|
353
|
+
- **NN/g — Navigation: You Are Here**: prominence (color, weight, offset)
|
|
354
|
+
must be present, but not so loud it competes with content. Reference
|
|
355
|
+
for active-state tuning. <https://www.nngroup.com/articles/navigation-you-are-here/>
|
|
356
|
+
- **NN/g — Visual Hierarchy in UX**: contrast/scale/grouping create rank;
|
|
357
|
+
the squint test reveals real (vs intended) hierarchy. Reference for the
|
|
358
|
+
brand-color-budget audit (S16).
|
|
359
|
+
<https://www.nngroup.com/articles/visual-hierarchy-ux-definition/>
|
|
360
|
+
- **TanStack Table — Column Sizing Guide** + **Issue #5870**:
|
|
361
|
+
`header.getSize()` emits inline `style={{ width }}` per cell that beats
|
|
362
|
+
unscoped CSS unless `!important` or `table-layout: fixed`. Same gotcha
|
|
363
|
+
applies to AG-Grid, MUI DataGrid, Chakra DataTable, and most headless
|
|
364
|
+
data-grid libraries. Canonical reference for S11.
|
|
365
|
+
<https://tanstack.com/table/v8/docs/guide/column-sizing>
|
|
366
|
+
- **Adam Argyle (Chrome DevRel) — 3 Unintuitive CSS Layout Solutions**:
|
|
367
|
+
the `min-width: 0` / `min-height: 0` / `flex-shrink: 0` /
|
|
368
|
+
`repeat(N, minmax(0, 1fr))` recipe for grid/flex children that won't
|
|
369
|
+
shrink or fill evenly. Canonical reference for S19 (wrapper-collapsed
|
|
370
|
+
tiles). <https://nerdy.dev/3-unintuitive-layout-solutions>
|
|
371
|
+
- **Playwright — Locator boundingBox / evaluateAll**: programmatic API
|
|
372
|
+
for measuring rendered widths across repeated elements (the DOM
|
|
373
|
+
uniformity gate in §2.5a). Same pattern works in DevTools console
|
|
374
|
+
with `getBoundingClientRect()`.
|
|
375
|
+
<https://playwright.dev/docs/locators>
|
|
376
|
+
- **YOOtheme Pro — Collapsing Layouts**: explicit "collapsing cascade"
|
|
377
|
+
contract for editorial layouts — element collapses if empty → column
|
|
378
|
+
collapses if all elements collapsed → row collapses → section
|
|
379
|
+
collapses. Reference for S20 (dead conditional slot).
|
|
380
|
+
<https://yootheme.com/support/yootheme-pro/wordpress/collapsing-layouts>
|
|
381
|
+
- **NN/g — Defer Secondary Content for Mobile**: first screen ruthlessly
|
|
382
|
+
focused on the minimum information needed; duplication is a
|
|
383
|
+
wall-of-text by another name. Reference for S21 (information
|
|
384
|
+
duplication per fold).
|
|
385
|
+
<https://www.nngroup.com/articles/defer-secondary-content-for-mobile>
|
|
386
|
+
- **NN/g — Content Dispersion (design-mobile-first on desktop)**: stretching
|
|
387
|
+
design-mobile-first patterns wastes space on wide viewports; the inverse
|
|
388
|
+
failure is dense conditional slots wasting space on narrow viewports.
|
|
389
|
+
Reference for S20.
|
|
390
|
+
<https://www.nngroup.com/articles/content-dispersion/>
|
|
391
|
+
- **Duolingo — Core Tabs Redesign + Gamification as Design Language**:
|
|
392
|
+
reference for tier-A vibrant semantic palettes (green=correct,
|
|
393
|
+
red=hearts, orange=streak, yellow=XP, purple=premium). Each colour
|
|
394
|
+
carries a system meaning; muted palettes undermine the playful tone.
|
|
395
|
+
Reference for S22 (monochromatic surface).
|
|
396
|
+
<https://blog.duolingo.com/core-tabs-redesign/>
|
|
397
|
+
- **Stripe / Vitality / ColorArchive — SaaS Dashboard Color**: reference
|
|
398
|
+
for tier-D restraint — 60-30-10 rule, semantic colour reserved for
|
|
399
|
+
status, achromatic chrome. The other end of the same axis as
|
|
400
|
+
Duolingo. Use to diagnose whether you're applying tier-D tints to a
|
|
401
|
+
tier-A product (the "monochromatic" failure).
|
|
402
|
+
<https://vitalitydesignsystem.com/foundations/colour/>
|
|
403
|
+
- **Figma — 2026 Web Design Trends**: vibrant maximalist palettes
|
|
404
|
+
returning, especially for lifestyle / youth / learning brands.
|
|
405
|
+
Validates the *Domain Colour Tier* framing in `enhance-web-ui`.
|
|
406
|
+
<https://www.figma.com/resource-library/web-design-trends/>
|