@kensaurus/skills 0.0.0-stage → 2.0.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 +1761 -0
- package/LICENSE +21 -0
- package/NOTICE +13 -0
- package/README.md +820 -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 +93 -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 +296 -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 +154 -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 +379 -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 +304 -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-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 +242 -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 +104 -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 +387 -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 +296 -0
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
### H5. Library-injected inline width beats your CSS rule
|
|
2
|
+
|
|
3
|
+
**Symptom:** "Column is squeezed and truncating important info while the
|
|
4
|
+
adjacent column has wasted space", "my responsive CSS isn't applying".
|
|
5
|
+
|
|
6
|
+
**Detection:** When using TanStack Table, AG-Grid, MUI DataGrid, Chakra
|
|
7
|
+
DataTable, react-table, or any headless data-grid, check whether the library
|
|
8
|
+
emits inline `style={{ width: ... }}` from `header.getSize()` /
|
|
9
|
+
`column.size`. Then check whether your overriding CSS rule uses `!important`
|
|
10
|
+
AND is unscoped (or scoped to the right viewport). Open DevTools → inspect
|
|
11
|
+
the `<th>` / `<td>` → look at "Computed → width" → if the value comes from
|
|
12
|
+
`element.style` and your rule shows as crossed-out, you've lost the
|
|
13
|
+
specificity war.
|
|
14
|
+
|
|
15
|
+
**Fix shape:** Three options, in order of preference:
|
|
16
|
+
1. Add `width: auto !important; max-width: none !important;` to your
|
|
17
|
+
`[data-priority="primary"]` (or equivalent) rule, scoped to **all
|
|
18
|
+
viewports** (no `@media` wrapper unless you mean it).
|
|
19
|
+
2. Set `table-layout: fixed` on the parent table so the browser ignores
|
|
20
|
+
per-cell intrinsic widths.
|
|
21
|
+
3. Drive the library via CSS variables (`style={{ "--col-width":
|
|
22
|
+
header.getSize() + "px" }}`) and have your priority rule overwrite the
|
|
23
|
+
variable, not the inline width.
|
|
24
|
+
|
|
25
|
+
### H6. Wasted-column / squeezed-column pair
|
|
26
|
+
|
|
27
|
+
**Symptom:** Same as H5 from the *user* perspective ("wasted space + truncation"),
|
|
28
|
+
but the cause may be your own column-def defaults, not a third-party
|
|
29
|
+
library.
|
|
30
|
+
|
|
31
|
+
**Detection:** For each table column, compute `reserved-width / max-content-width`.
|
|
32
|
+
If a column reserves ≥ 2.5× its widest content while a sibling column
|
|
33
|
+
truncates, the allocation is wrong. Easy probe: the user's "件数" (count)
|
|
34
|
+
column is 150 px wide for 2-digit numbers; the "書類" (name) column is
|
|
35
|
+
150 px wide for 30-char Japanese strings. Ratio: 7.5× vs 0.4×.
|
|
36
|
+
|
|
37
|
+
**Fix shape:** Add a `priority` axis to your column meta (`primary` | `meta`
|
|
38
|
+
| `action`) and a CSS cascade that says:
|
|
39
|
+
- `[data-priority="primary"]` → `width: auto !important` (gets the slack)
|
|
40
|
+
- `[data-priority="meta"]` → `width: 1% !important; white-space: nowrap`
|
|
41
|
+
(shrinks to content)
|
|
42
|
+
- `[data-priority="action"]` → fixed pixel width matching the icon button
|
|
43
|
+
(e.g. `40px`). Apply at every viewport, not just mobile.
|
|
44
|
+
|
|
45
|
+
### H7. Hover-only affordance on a touch device
|
|
46
|
+
|
|
47
|
+
**Symptom:** "I can't reach this button on my phone", silent because the user
|
|
48
|
+
didn't even know the button existed.
|
|
49
|
+
|
|
50
|
+
**Detection:** Grep for `group-hover:opacity-100`, `opacity-0 hover:opacity-100`,
|
|
51
|
+
`md:opacity-0`, or any pattern that hides an action behind hover. Check the
|
|
52
|
+
parent: does it have a touch fallback (`focus-within:opacity-100`,
|
|
53
|
+
`sm:opacity-0` only above the touch breakpoint, or always-visible on
|
|
54
|
+
`<sm`)?
|
|
55
|
+
|
|
56
|
+
**Fix shape:** Hover-reveal is acceptable only at `≥sm` (pointer breakpoint).
|
|
57
|
+
Below that, the action must be always-visible OR exposed via long-press /
|
|
58
|
+
swipe / a tap-to-open row menu. Pattern: `sm:opacity-0
|
|
59
|
+
sm:group-hover:opacity-100 focus-within:opacity-100`.
|
|
60
|
+
|
|
61
|
+
### H8. Hit-area baked into visual chrome
|
|
62
|
+
|
|
63
|
+
**Symptom:** "This icon button feels chunky / button-shaped" even though the
|
|
64
|
+
icon itself is fine.
|
|
65
|
+
|
|
66
|
+
**Detection:** Look for icon buttons that are `w-11 h-11` (44 px) with a
|
|
67
|
+
`bg-card border` chrome. The visual chrome is sized for the *touch target*,
|
|
68
|
+
not for the *icon's optical weight*. Result: a 14-px icon sits in a 44-px
|
|
69
|
+
bordered card, looking marooned.
|
|
70
|
+
|
|
71
|
+
**Fix shape:** Separate hit area from visual chrome:
|
|
72
|
+
- Visual: 24–28 px square, no border, hover-paint only.
|
|
73
|
+
- Hit area: extend invisibly via `min-h-11 min-w-11 -my-1.5 -mx-1.5` (or
|
|
74
|
+
the equivalent negative-margin trick for your stack). The thumb still
|
|
75
|
+
gets 44 px; the eye gets a calm icon.
|
|
76
|
+
|
|
77
|
+
### H9. Stale data-priority / hidden-on-mobile that no longer matches the column
|
|
78
|
+
|
|
79
|
+
**Symptom:** A column shows on desktop, disappears at tablet, then *reappears*
|
|
80
|
+
on mobile (or vice versa); user reports "missing column" or "duplicate info
|
|
81
|
+
on mobile".
|
|
82
|
+
|
|
83
|
+
**Detection:** Search for `hideOnMobile`, `hideBelowMd`, `mobile:hidden`,
|
|
84
|
+
`hidden md:table-cell`, etc., and confirm the breakpoints match the rest of
|
|
85
|
+
the responsive system. A column tagged `hideBelowMd: true` but rendered via
|
|
86
|
+
`sm:hidden` will appear on `sm` and disappear on `md+`, which is exactly
|
|
87
|
+
inverted.
|
|
88
|
+
|
|
89
|
+
**Fix shape:** Centralize the breakpoint axis in the column meta
|
|
90
|
+
(`hideBelowSm` | `hideBelowMd` | `hideBelowLg`) and have the renderer derive
|
|
91
|
+
the className from it, not vice versa. Audit by listing every column and
|
|
92
|
+
its visibility per viewport in a table; fix the inverted ones.
|
|
93
|
+
|
|
94
|
+
### H10. Active state has no `aria-current`
|
|
95
|
+
|
|
96
|
+
**Symptom:** Visual active state is correct but screen-reader users (and
|
|
97
|
+
keyboard-tab users) can't tell which item is current.
|
|
98
|
+
|
|
99
|
+
**Detection:** Grep for the active-state className pattern (e.g.
|
|
100
|
+
`text-brand`, `bg-brand-soft`, `data-state="active"`) and check the same
|
|
101
|
+
JSX node for `aria-current`. Missing on tabs / nav links / breadcrumb final
|
|
102
|
+
crumb / dock items = bug.
|
|
103
|
+
|
|
104
|
+
**Fix shape:** Add `aria-current="page"` to nav links / dock items / breadcrumb
|
|
105
|
+
final crumb, `aria-selected="true"` (and `role="tab"`) to tabs. The visual
|
|
106
|
+
treatment + ARIA must always agree.
|
|
107
|
+
|
|
108
|
+
### H11. Motion that fights motion
|
|
109
|
+
|
|
110
|
+
**Symptom:** Tab switch feels janky; sliding underline stutters; Framer
|
|
111
|
+
Motion enter animation overlaps a CSS transition.
|
|
112
|
+
|
|
113
|
+
**Detection:** Inspect the active-state element. If you have BOTH a
|
|
114
|
+
framer-motion `layoutId` shared element AND a CSS `transition: all 200ms`
|
|
115
|
+
on the same property, they fight. Same for `whileHover` + CSS `:hover`
|
|
116
|
+
transition on the same property.
|
|
117
|
+
|
|
118
|
+
**Fix shape:** One animation system per property. Prefer framer-motion
|
|
119
|
+
`layoutId` for layout-shared transitions; prefer CSS `transition-colors`
|
|
120
|
+
for color-only state changes. Never both. Always honor
|
|
121
|
+
`prefers-reduced-motion`.
|
|
122
|
+
|
|
123
|
+
### H12. Conditional slot reserves space for absent content
|
|
124
|
+
|
|
125
|
+
**Symptom:** "Card looks empty / has a giant gap", "this section feels
|
|
126
|
+
unbalanced".
|
|
127
|
+
|
|
128
|
+
**Detection:** Find any wrapper with `min-height` on a slot whose child is
|
|
129
|
+
optional (`media`, `aside`, `eyebrow`, `cover`, `secondaryCTA`,
|
|
130
|
+
`illustration`). Render the page in zero-state and check whether the
|
|
131
|
+
reserved space collapses. If the wrapper still occupies its `min-h`, the
|
|
132
|
+
slot is reserving space for content that may never arrive.
|
|
133
|
+
|
|
134
|
+
**Fix shape:** Either drop the wrapper when the child is null (`{child &&
|
|
135
|
+
<Wrapper>{child}</Wrapper>}`) or collapse the floor at narrow viewports
|
|
136
|
+
(`min-h-0 sm:min-h-40`). Never pay vertical real estate for absent content.
|
|
137
|
+
|
|
138
|
+
### H13. Wrapper-collapsed tiles (Tooltip / Slot inline-flex)
|
|
139
|
+
|
|
140
|
+
**Symptom:** "This week pills are weird", "tiles look small with huge
|
|
141
|
+
gaps between them", "the 3-up grid isn't filling the row". Visually:
|
|
142
|
+
3 (or 4) repeated tiles render at content-width, anchored
|
|
143
|
+
left/middle/right of their grid cells, with large gaps that the grid
|
|
144
|
+
template should not produce.
|
|
145
|
+
|
|
146
|
+
**Detection:** Programmatic, not visual — screenshots can hide this:
|
|
147
|
+
|
|
148
|
+
```js
|
|
149
|
+
// In the browser console / Playwright evaluate / playwright-cli
|
|
150
|
+
const tiles = [...document.querySelectorAll('<your-tile-selector>')]
|
|
151
|
+
.map(el => Math.round(el.getBoundingClientRect().width));
|
|
152
|
+
const span = Math.max(...tiles) - Math.min(...tiles);
|
|
153
|
+
console.table({ tiles, span });
|
|
154
|
+
// span > 1px on tiles in `grid-cols-N gap-N` === wrapper-collapse bug
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Then walk *up* the DOM from a leaf tile and `getComputedStyle(el).display`
|
|
158
|
+
each ancestor. The first one returning `inline-flex` / `inline-block` /
|
|
159
|
+
`inline` is the culprit. Common causes (any stack):
|
|
160
|
+
|
|
161
|
+
- A `Tooltip` / `Popover` / `Trigger` / `Slot` primitive defaults the
|
|
162
|
+
wrapper to `display: inline-flex` (Radix, Headless UI, custom).
|
|
163
|
+
- A grid template uses bare `1fr` (which is `minmax(auto, 1fr)`) and a
|
|
164
|
+
child has intrinsic content wider than the cell.
|
|
165
|
+
- A flex parent without `min-width: 0` lets a child's intrinsic content
|
|
166
|
+
size dictate the track width.
|
|
167
|
+
- An animation library (Framer Motion `m.div`, Reanimated, GSAP) injects
|
|
168
|
+
inline `display: inline-block` for transform performance.
|
|
169
|
+
- A `<Slot>` / `asChild` / `cloneElement` pattern where the inner
|
|
170
|
+
component drops `className` (so `w-full` is silently lost).
|
|
171
|
+
|
|
172
|
+
**Fix shape:** Patch the *wrapper*, not the leaf:
|
|
173
|
+
|
|
174
|
+
- Add a prop to the wrapper that lets the consumer opt into stretch
|
|
175
|
+
behaviour (`block`, `stretch`, `fillContainer`) and use it at the call
|
|
176
|
+
site. If most consumers want stretch, change the default and document
|
|
177
|
+
why in a code comment.
|
|
178
|
+
- Or: replace `grid-cols-N` with
|
|
179
|
+
`grid-cols-[repeat(N,minmax(0,1fr))]` so a single oversized child
|
|
180
|
+
can't blow out the track.
|
|
181
|
+
- Or: add `min-width: 0` to the grid item and `width: 100%` (or
|
|
182
|
+
`flex: 1 1 0`) to the inner element.
|
|
183
|
+
|
|
184
|
+
Verify with the same DOM probe — `widthSpan` must drop to `≤ 1px` after
|
|
185
|
+
the fix. See *Primitive-First Patch Rule* below for the propagation
|
|
186
|
+
playbook (one wrapper fix, N consumers fixed).
|
|
187
|
+
|
|
188
|
+
### H14. Information duplication per viewport fold
|
|
189
|
+
|
|
190
|
+
**Symptom:** "Wasted space", "feels padded", "this is the third time
|
|
191
|
+
I've seen 0/10 today on the same screen". Each instance is innocent on
|
|
192
|
+
its own; together they flatten hierarchy and signal that no rank was
|
|
193
|
+
applied.
|
|
194
|
+
|
|
195
|
+
**Detection:** For each viewport-height fold of the rendered page,
|
|
196
|
+
list every datum (number, percentage, status word, date, count) and how
|
|
197
|
+
many times it appears. Anything appearing ≥ 2× is a duplicate.
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
Fold 1 of /home @ 390×844:
|
|
201
|
+
- "0/10 words today" ×3 (eyebrow metric, action pill, footer strip)
|
|
202
|
+
- "0%" ×2 (action pill, Today metric tile)
|
|
203
|
+
- streak count "1d" ×2 (eyebrow metric, Streak tile)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Fix shape:** Pick the *most actionable* placement for each datum
|
|
207
|
+
(usually next to the primary CTA, or as the largest type in the focal
|
|
208
|
+
region) and delete every other instance. Replace the now-empty slots
|
|
209
|
+
with *complementary* data — if you kept the daily goal, replace
|
|
210
|
+
duplicates with streak count, reviews-due, or "vs last week"
|
|
211
|
+
trend. Each delete is a hierarchy upgrade for what stays.
|
|
212
|
+
|
|
213
|
+
Cite NN/g #8 (Aesthetic & Minimalist) in the write-up.
|
|
214
|
+
|
|
215
|
+
### H15. Monochromatic surface (domain-colour-tier mismatch)
|
|
216
|
+
|
|
217
|
+
**Symptom:** "Looks really weird and monochromatic", "feels
|
|
218
|
+
AI-generated", "color could be bolder". On a tier-A/B product (consumer,
|
|
219
|
+
gamified, learning, lifestyle — see *Domain Colour Tier* in §1.5), the
|
|
220
|
+
3-up of category tiles all read the same neutral hue when blurred, even
|
|
221
|
+
though every tile has a `tone` prop set.
|
|
222
|
+
|
|
223
|
+
**Detection:** Run the *category squint* (Step 3a):
|
|
224
|
+
|
|
225
|
+
1. Take a desktop screenshot.
|
|
226
|
+
2. Apply a 10–15px Gaussian blur (any image tool).
|
|
227
|
+
3. Look at the repeated tile group: should you see 3–4 distinct colour
|
|
228
|
+
blobs (tier A/B) or near-uniform achromatic with one alert pop (tier
|
|
229
|
+
C/D)?
|
|
230
|
+
4. Mismatch → token tints are the wrong tier for this product.
|
|
231
|
+
|
|
232
|
+
Generic cause: a `Card` / `Tile` / `MetricBox` primitive uses tints in
|
|
233
|
+
the `/5–/10` range (tier-D defaults). Faint enough to be "tasteful" on
|
|
234
|
+
a finance dashboard, far too faint for a learning app where colour *is*
|
|
235
|
+
the gamification signal (Duolingo: green=correct, red=hearts,
|
|
236
|
+
orange=streak…).
|
|
237
|
+
|
|
238
|
+
**Fix shape:** Identify the product tier (§1.5) and bump the token
|
|
239
|
+
scale to match:
|
|
240
|
+
|
|
241
|
+
- Tile background: `/5–/10` → `/15–/25` gradient.
|
|
242
|
+
- Tile ring: missing or `/10` → `ring-1 ring-<tone>/30` (separates
|
|
243
|
+
adjacent tiles even when blurred).
|
|
244
|
+
- Value text: neutral → `text-<tone>` (the number dominates the squint
|
|
245
|
+
test; colour the number, not just the icon).
|
|
246
|
+
- Icon background: `/10` → `bg-<tone>/25 ring-<tone>/40` so icons read
|
|
247
|
+
as semantic chips, not neutral glyphs.
|
|
248
|
+
- Reserve neutral surface for *zero-state* / disabled tiles only.
|
|
249
|
+
|
|
250
|
+
Patch at the primitive (token scale or shared tile component) so the
|
|
251
|
+
fix propagates — see *Primitive-First Patch Rule*.
|
|
252
|
+
|
|
253
|
+
### H16. Left-anchored stacked cards (no horizontal balance)
|
|
254
|
+
|
|
255
|
+
**Symptom:** "Everything stacked on top of each without any designer
|
|
256
|
+
thought, aligned to left", "feels templated", "no rhythm". Every card
|
|
257
|
+
is full-width, every label sits at the left edge, every metadata pill
|
|
258
|
+
sits below the title — no horizontal counter-weight.
|
|
259
|
+
|
|
260
|
+
**Detection:** Take a desktop or tablet screenshot. Mentally draw a
|
|
261
|
+
vertical line down the middle of each stacked card. If every card's
|
|
262
|
+
visual centre of gravity sits left of that line, you have a
|
|
263
|
+
left-anchored stack. Common cause: every primitive (`Card`, `Row`,
|
|
264
|
+
`ListItem`) renders its action / metadata under the title in a vertical
|
|
265
|
+
flow, never to the right.
|
|
266
|
+
|
|
267
|
+
**Fix shape:** Re-introduce horizontal weight (one move per card is
|
|
268
|
+
enough; doing all four creates noise):
|
|
269
|
+
|
|
270
|
+
- **Pin metadata right.** Move timestamp, count, status pill,
|
|
271
|
+
chevron, or category badge to the right edge via Gestalt common
|
|
272
|
+
region (`flex justify-between`).
|
|
273
|
+
- **Promote one card to split layout.** Image-left + text-right (or
|
|
274
|
+
reverse) at the densities that allow it.
|
|
275
|
+
- **Vary card height by importance.** Hero card 1.4×, secondary 1.0×,
|
|
276
|
+
metadata 0.6× — uniform height is what makes the stack feel
|
|
277
|
+
templated.
|
|
278
|
+
- **Replace one full-width card with a 2-up grid** of equal-importance
|
|
279
|
+
siblings — the grid breaks the single-column rhythm without removing
|
|
280
|
+
content.
|
|
281
|
+
|
|
282
|
+
Avoid: adding decorative right-side icons that aren't tied to data —
|
|
283
|
+
that's just visual noise. Right-anchored elements must carry meaning.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Pattern Library
|
|
288
|
+
|
|
289
|
+
### Crowded Card
|
|
290
|
+
|
|
291
|
+
Before: title, subtitle, description, status, stats, tags, actions all top-stacked.
|
|
292
|
+
|
|
293
|
+
After:
|
|
294
|
+
|
|
295
|
+
- Top: eyebrow + title + one useful line.
|
|
296
|
+
- Middle: media or breathing room.
|
|
297
|
+
- Bottom: stats/metadata in a separated footer band.
|
|
298
|
+
- Action: stable corner, footer, or detail drawer CTA.
|
|
299
|
+
|
|
300
|
+
### Dead Grid Space
|
|
301
|
+
|
|
302
|
+
Try:
|
|
303
|
+
|
|
304
|
+
- `grid-auto-flow: dense` / masonry-like placement if supported by the stack.
|
|
305
|
+
- Resize spans by content importance, not by project age or arbitrary order.
|
|
306
|
+
- Use wide cards for rich horizontal screenshots; portrait/device galleries for
|
|
307
|
+
mobile apps.
|
|
308
|
+
- Anchor content to top and metadata to bottom so empty space becomes rhythm.
|
|
309
|
+
|
|
310
|
+
### Hard Scroll Cut
|
|
311
|
+
|
|
312
|
+
Try:
|
|
313
|
+
|
|
314
|
+
- `mask-image: linear-gradient(...)` with `-webkit-mask-image`.
|
|
315
|
+
- Top/bottom "curtain" gradients matching the surface.
|
|
316
|
+
- Scroll shadows or slim progress rails.
|
|
317
|
+
- Extra padding so content is not permanently hidden under the fade.
|
|
318
|
+
|
|
319
|
+
### Flat Interaction
|
|
320
|
+
|
|
321
|
+
Try:
|
|
322
|
+
|
|
323
|
+
- 100-300ms ease-out feedback on direct actions.
|
|
324
|
+
- Slight lift/translate, underline draw, icon morph, or preview reveal.
|
|
325
|
+
- Motion that starts from the element the user acted on.
|
|
326
|
+
- Reduced-motion fallback that preserves state change without movement.
|
|
327
|
+
|
|
328
|
+
### Overexplained Page
|
|
329
|
+
|
|
330
|
+
Try:
|
|
331
|
+
|
|
332
|
+
- Keep only the highest-scent labels visible.
|
|
333
|
+
- Move explanation into tooltips, detail drawers, or empty-state education.
|
|
334
|
+
- Use progressive disclosure for advanced filters and rarely used controls.
|
|
335
|
+
|
|
336
|
+
### Heavy Active State (tabs, dock cells, sidebar items, breadcrumb)
|
|
337
|
+
|
|
338
|
+
Symptom: full-cell `bg-active` / `bg-brand-soft` background fill on the
|
|
339
|
+
active item makes it look 1.5× heavier than its inactive siblings, even
|
|
340
|
+
when layout dimensions are identical. User reports "highlight is weirdly
|
|
341
|
+
big", "heights are incoherent", "clunky".
|
|
342
|
+
|
|
343
|
+
Fix shape (pick by element type — same shape every time, generic across
|
|
344
|
+
stacks):
|
|
345
|
+
|
|
346
|
+
- **Tab row** → drop the cell background. Active = `text-<accent>` +
|
|
347
|
+
`font-semibold` + a 2 px accent underline at `bottom-0`. The count badge
|
|
348
|
+
tints to accent. Inactive padding === active padding.
|
|
349
|
+
- **Bottom dock cell** (Material 3 NavigationBar pattern) → drop the cell
|
|
350
|
+
background. Active = a `h-6 px-3 rounded-full bg-<accent>-soft` pill
|
|
351
|
+
wrapping ONLY the icon, plus `text-<accent> font-semibold` on the label.
|
|
352
|
+
Cell chrome stays neutral so the dock reads as a single calm strip.
|
|
353
|
+
- **Sidebar item** → drop the full-row background. Active = a leading 2 px
|
|
354
|
+
accent rail (`before:absolute before:left-0 before:w-0.5 before:bg-<accent>`)
|
|
355
|
+
+ `text-foreground font-medium`. Hover paints `bg-muted/40` (calm wash,
|
|
356
|
+
visually distinct from active).
|
|
357
|
+
- **Breadcrumb current crumb** → drop the bordered card chrome entirely.
|
|
358
|
+
Active = `text-foreground font-semibold` plain inline span +
|
|
359
|
+
`aria-current="page"`. The row's tonal recess is the only background.
|
|
360
|
+
|
|
361
|
+
Rule of thumb: if the active treatment increases the bounding box's
|
|
362
|
+
*painted area* by more than ~15 %, the user will read it as "clunky".
|
|
363
|
+
Material 3, Stripe Apps, Linear, and Vercel all obey this — when in doubt,
|
|
364
|
+
copy them.
|
|
365
|
+
|
|
366
|
+
### Wayfinding-on-Root Tautology
|
|
367
|
+
|
|
368
|
+
Symptom: on the root route (`/`, `/dashboard`, `/home`), the page name
|
|
369
|
+
appears 3+ times — breadcrumb chip says "Home", the dock has Home active,
|
|
370
|
+
the page H1 / greeting says "Home" — and the user calls it "atrocious" or
|
|
371
|
+
"redundant".
|
|
372
|
+
|
|
373
|
+
Fix shape:
|
|
374
|
+
|
|
375
|
+
- On the root path, suppress the entire breadcrumb / context row (e.g.
|
|
376
|
+
`showContextRow={false}` or gate at the layout: `pathname !== "/" &&
|
|
377
|
+
<BreadcrumbRow />`). The dock active indicator + the page's H1/greeting
|
|
378
|
+
already answer "where am I?".
|
|
379
|
+
- Breadcrumbs answer "how do I go up?" — at the root, there is no up, so
|
|
380
|
+
the row is dead weight.
|
|
381
|
+
- On nested pages, the breadcrumb earns its row again.
|
|
382
|
+
|
|
383
|
+
Generic rule: count how many chrome zones display the page name on the
|
|
384
|
+
current route. If ≥ 2 say the same word for the *current* page (excluding
|
|
385
|
+
the H1, which is the only authoritative one), the others are tautology.
|
|
386
|
+
|
|
387
|
+
> **Note on the failures formerly listed here.** "Wrapper-Collapsed
|
|
388
|
+
> Tiles", "Dead Conditional Slot", "Monochromatic Surface",
|
|
389
|
+
> "Information Duplication", and "Left-Anchored Stacked Cards" are now
|
|
390
|
+
> documented in *Hidden Failure Modes* (H12–H16) above — that section
|
|
391
|
+
> includes both detection probes (DOM measurement, blur tests, dup-datum
|
|
392
|
+
> scans, tier-mismatch checks) AND fix shapes. The Pattern Library is
|
|
393
|
+
> reserved for compositional patterns; failure modes with a "how to
|
|
394
|
+
> detect" component live in §Hidden Failure Modes.
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## Primitive-First Patch Rule
|
|
399
|
+
|
|
400
|
+
When a UI bug repeats across pages, tiles, rows, or routes, **patch the
|
|
401
|
+
primitive that hosts the bug, not every consumer**. This is the
|
|
402
|
+
single highest-leverage move available to an enhancer.
|
|
403
|
+
|
|
404
|
+
Workflow:
|
|
405
|
+
|
|
406
|
+
1. Find the bug live (e.g. tile widths uneven).
|
|
407
|
+
2. Walk *up* the component tree from the broken leaf. Stop at the first
|
|
408
|
+
wrapper with a `display`, `width`, `flex-shrink`, `aspect-ratio`,
|
|
409
|
+
`min-h`, or `slot` constraint that is forcing the bug.
|
|
410
|
+
3. Search for other call sites of that wrapper:
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
grep -r "<Tooltip" src/ | wc -l # how many sites are affected?
|
|
414
|
+
grep -r "<EditorialHero" src/ | wc -l
|
|
415
|
+
grep -r "asChild={" src/ui/<wrapper>/ # slot-pattern check
|
|
416
|
+
```
|
|
417
|
+
4. If 3+ sites use the same wrapper, the fix lives in the wrapper:
|
|
418
|
+
- Add a prop that lets the consumer opt into the correct behaviour
|
|
419
|
+
(`block`, `stretch`, `fillContainer`, `compact`) — never break
|
|
420
|
+
existing call sites.
|
|
421
|
+
- Pick a default that matches what most consumers actually want.
|
|
422
|
+
- Document the intent in a code comment — a future enhancer must
|
|
423
|
+
understand *why* the prop exists, not just *what* it does.
|
|
424
|
+
5. Verify with the *DOM uniformity gate* on at least two consumer
|
|
425
|
+
pages — same wrapper, different contexts.
|
|
426
|
+
|
|
427
|
+
Anti-pattern (do not do this): adding `w-full !w-[calc(100%-var(--gap))]`
|
|
428
|
+
to one specific tile to force-fix the visible page. The bug remains
|
|
429
|
+
everywhere else; you've just hidden it on the page you happened to look
|
|
430
|
+
at.
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## Visual Psychology Map
|
|
435
|
+
|
|
436
|
+
Use these as design justifications:
|
|
437
|
+
|
|
438
|
+
- **NN/g visual hierarchy**: use contrast, scale, and grouping to guide the eye.
|
|
439
|
+
- **NN/g heuristic #8**: maximize signal, minimize noise; clarity beats flourish.
|
|
440
|
+
- **Progressive disclosure**: defer secondary or advanced detail until needed.
|
|
441
|
+
- **Fitts's Law**: make important targets large, close, and stable.
|
|
442
|
+
- **Hick's Law**: reduce visible choices or stage them.
|
|
443
|
+
- **Proximity/Common Region**: group related elements with spacing or containers.
|
|
444
|
+
- **Aesthetic-usability effect**: polish can increase perceived trust, but only
|
|
445
|
+
when the UI remains clear.
|
|
446
|
+
- **Change blindness**: subtle motion can confirm state changes users might miss.
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## Motion Rules
|
|
451
|
+
|
|
452
|
+
- Direct feedback: 100-180ms.
|
|
453
|
+
- Small state change: 180-260ms.
|
|
454
|
+
- Drawer/modal/large spatial transition: 220-360ms.
|
|
455
|
+
- Prefer ease-out for entering/settling.
|
|
456
|
+
- Never animate layout so much that text being read moves unexpectedly.
|
|
457
|
+
- Avoid infinite motion except quiet status/progress.
|
|
458
|
+
- Always respect `prefers-reduced-motion` or the repo's motion abstraction.
|
|
459
|
+
|
|
460
|
+
Motion must answer at least one question:
|
|
461
|
+
|
|
462
|
+
- Did my action work?
|
|
463
|
+
- What changed?
|
|
464
|
+
- Where did this thing come from or go?
|
|
465
|
+
- What can I interact with?
|
|
466
|
+
- How far through this surface/process am I?
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## Implementation Rules
|
|
471
|
+
|
|
472
|
+
1. Change layout and information placement before color/motion.
|
|
473
|
+
2. Keep edits local to the page and existing primitives.
|
|
474
|
+
3. Use existing design tokens. Do not invent new colors/radii/shadows unless the
|
|
475
|
+
repo has no system.
|
|
476
|
+
4. Wire UI state to real backend/domain state. Do not add hardcoded counts,
|
|
477
|
+
fake statuses, placeholder progress, decorative badges, or mock cards unless
|
|
478
|
+
the user explicitly asks for a prototype.
|
|
479
|
+
5. When visual feedback needs data the frontend lacks, inspect the schema/API
|
|
480
|
+
boundary and add the smallest durable field or derived helper needed.
|
|
481
|
+
6. Add comments only for non-obvious design intent.
|
|
482
|
+
7. Prefer CSS/Tailwind composition over bespoke JS. Use JS only for stateful
|
|
483
|
+
scroll progress, measurement, or interaction state.
|
|
484
|
+
8. Avoid accessibility regressions: focus rings, keyboard access, color contrast,
|
|
485
|
+
readable text, and reduced motion must survive.
|
|
486
|
+
9. If adding masks/fades, ensure content remains reachable and not permanently
|
|
487
|
+
obscured at scroll boundaries.
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## Enhancement Plan Template
|
|
492
|
+
|
|
493
|
+
```
|
|
494
|
+
## UI Enhancement Plan
|
|
495
|
+
|
|
496
|
+
Current state:
|
|
497
|
+
- [What the page visually does now]
|
|
498
|
+
|
|
499
|
+
Content rank:
|
|
500
|
+
- Primary:
|
|
501
|
+
- Secondary:
|
|
502
|
+
- Metadata:
|
|
503
|
+
- Actions:
|
|
504
|
+
- Ambient:
|
|
505
|
+
|
|
506
|
+
Planned changes:
|
|
507
|
+
| Pain | Principle | Move | File |
|
|
508
|
+
|------|-----------|------|------|
|
|
509
|
+
| Text is crowded at top | hierarchy, proximity | pin metadata to bottom band | ... |
|
|
510
|
+
| Footer cuts content | continuity | add scroll fade + padding | ... |
|
|
511
|
+
| Grid has dead space | balance | resize spans + dense placement | ... |
|
|
512
|
+
|
|
513
|
+
Verification:
|
|
514
|
+
- 1440:
|
|
515
|
+
- 1024:
|
|
516
|
+
- 800:
|
|
517
|
+
- Reduced motion:
|
|
518
|
+
- Dark/light:
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## Quick Sanity Checks
|
|
524
|
+
|
|
525
|
+
- [ ] Domain colour tier identified (A/B/C/D) and applied consistently.
|
|
526
|
+
- [ ] Primary content is obvious at a *hierarchy squint* (first eye target).
|
|
527
|
+
- [ ] Tier A/B: categories distinguishable at a *category squint* (colour alone).
|
|
528
|
+
- [ ] Repeated tiles measured: rendered widths within 1px of each other.
|
|
529
|
+
- [ ] No wrapper between a grid cell and its child is `inline-flex` /
|
|
530
|
+
`inline-block` / content-width-only when it should fill.
|
|
531
|
+
- [ ] Every conditional slot (`media`, `aside`, `cover`) tested with sparse
|
|
532
|
+
/ zero-state content; no dead `min-h` floors on mobile.
|
|
533
|
+
- [ ] No datum (number, word, date, status) repeats inside one viewport
|
|
534
|
+
fold; duplicates either deleted or replaced with complementary data.
|
|
535
|
+
- [ ] At least one piece of right-anchored metadata per stacked card to
|
|
536
|
+
avoid left-alignment monotony.
|
|
537
|
+
- [ ] Metadata does not compete with headings.
|
|
538
|
+
- [ ] At most 2-3 type scales dominate the page.
|
|
539
|
+
- [ ] Related elements are grouped by proximity or common region.
|
|
540
|
+
- [ ] Empty space feels intentional, not accidental.
|
|
541
|
+
- [ ] Secondary details are progressively disclosed.
|
|
542
|
+
- [ ] Scroll/overflow edges are communicated, not chopped.
|
|
543
|
+
- [ ] Microinteractions have a purpose and respect reduced motion.
|
|
544
|
+
- [ ] No CTA wraps or changes hit-area shape across viewports.
|
|
545
|
+
- [ ] Repeating bug → patched at the primitive, not the consumer site.
|
|
546
|
+
|
|
547
|
+
### Hidden-failure-mode audit (run before declaring done)
|
|
548
|
+
- [ ] **H1 active-state mass**: active tab/dock/nav item's bounding box ≈
|
|
549
|
+
inactive sibling's (within ~15 % painted area). Squint test passes —
|
|
550
|
+
no sibling looks "weirdly big".
|
|
551
|
+
- [ ] **H2 chrome tautology**: on the current route, the page name appears
|
|
552
|
+
in ≤ 1 chrome zone (the H1 is canonical; everything else is suppressed
|
|
553
|
+
if it would echo the same word — especially on root / index pages).
|
|
554
|
+
- [ ] **H3 card-on-card**: no chip with `bg-card border` sits on a row that
|
|
555
|
+
already has a tonal recess. One elevation per row.
|
|
556
|
+
- [ ] **H4 brand-color budget**: ≤ 1 brand-tinted surface per visual zone
|
|
557
|
+
(the primary CTA), excluding status chips that *carry* meaning and
|
|
558
|
+
the active micro-indicator.
|
|
559
|
+
- [ ] **H5 library inline width** (TanStack Table, AG-Grid, MUI DataGrid,
|
|
560
|
+
Chakra, react-table) is explicitly overridden when your responsive CSS
|
|
561
|
+
rule needs to win — confirm via DevTools `Computed → width` that your
|
|
562
|
+
rule is not crossed-out at every viewport.
|
|
563
|
+
- [ ] **H6 column allocation**: no column reserves ≥ 2.5× its widest content
|
|
564
|
+
while a sibling truncates.
|
|
565
|
+
- [ ] **H7 hover-reveal touch fallback**: every hover-revealed action has a
|
|
566
|
+
tap-only fallback below the pointer breakpoint.
|
|
567
|
+
- [ ] **H8 hit area vs visual chrome**: 44 px touch targets achieved via
|
|
568
|
+
invisible negative-margin extension, not by inflating the visual
|
|
569
|
+
chrome (no `w-11 h-11 bg-card border` icon buttons).
|
|
570
|
+
- [ ] **H9 responsive visibility breakpoints** match across the column-meta
|
|
571
|
+
flag (`hideBelowMd`) and the className (`md:table-cell`) — no
|
|
572
|
+
inverted ranges.
|
|
573
|
+
- [ ] **H10 active state has aria-current** (`aria-current="page"` for nav,
|
|
574
|
+
`aria-selected="true"` for tabs); ARIA and visual treatment agree.
|
|
575
|
+
- [ ] **H11 motion systems don't fight** on the same property
|
|
576
|
+
(framer `layoutId` xor CSS `transition`).
|
|
577
|
+
- [ ] **H12 conditional slots** collapse to zero when their child is null.
|
|
578
|
+
- [ ] **H13 wrapper-collapsed tiles**: every repeated tile group's
|
|
579
|
+
`widthSpan ≤ 1px` (run the DOM probe in §3b). No ancestor between
|
|
580
|
+
grid cell and tile is `inline-flex` / `inline-block` /
|
|
581
|
+
content-width-only when it should fill.
|
|
582
|
+
- [ ] **H14 information duplication per fold**: no datum (number, word,
|
|
583
|
+
status) appears more than once inside any single viewport fold.
|
|
584
|
+
Duplicates either deleted or replaced with complementary data.
|
|
585
|
+
- [ ] **H15 monochromatic surface**: tier-A/B products show distinct
|
|
586
|
+
colour blobs per category at the 10–15 px blur test; tier-C/D
|
|
587
|
+
products show near-uniform achromatic surfaces with colour
|
|
588
|
+
reserved for status alerts only.
|
|
589
|
+
- [ ] **H16 left-anchored stack**: every stacked card has at least one
|
|
590
|
+
piece of right-anchored metadata (timestamp, count, chevron,
|
|
591
|
+
status pill, badge) tied to data — no decorative right-side icons.
|
|
592
|
+
|
|
593
|
+
### Repo health
|
|
594
|
+
- [ ] Lints/build/tests pass for touched files.
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## When Not To Use
|
|
599
|
+
|
|
600
|
+
- Pure workflow correctness, data modeling, or task usability: use
|
|
601
|
+
`enhance-web-ux` first.
|
|
602
|
+
- Pure design-token compliance audit: use `audit-uiux-design-system`.
|
|
603
|
+
- Report-only heuristic audit: use `audit-ux`.
|
|
604
|
+
- Brand-new product/page from scratch: use `design-frontend`.
|
|
605
|
+
|
|
606
|
+
---
|
|
607
|
+
|
|
608
|
+
## Research Anchors
|
|
609
|
+
|
|
610
|
+
- **NN/g — Visual Hierarchy**: contrast, scale, grouping, and whitespace
|
|
611
|
+
guide focus; squint with 5–10px blur to verify intended hierarchy.
|
|
612
|
+
<https://www.nngroup.com/articles/visual-hierarchy-ux-definition/>
|
|
613
|
+
- **NN/g — Defer Secondary Content for Mobile**: first screen ruthlessly
|
|
614
|
+
focused on the minimum information needed to communicate the top point;
|
|
615
|
+
duplication = wall-of-text by another name.
|
|
616
|
+
<https://www.nngroup.com/articles/defer-secondary-content-for-mobile>
|
|
617
|
+
- **NN/g — Content Dispersion (Mobile-First on Desktop)**: stretching
|
|
618
|
+
design-mobile-first patterns to wide viewports fragments related content;
|
|
619
|
+
same logic applies in reverse to dense conditional slots on mobile.
|
|
620
|
+
<https://www.nngroup.com/articles/content-dispersion/>
|
|
621
|
+
- **NN/g — 5 Principles of Visual Design**: scale, hierarchy, balance,
|
|
622
|
+
contrast, Gestalt — and why "no more than 3 different sizes".
|
|
623
|
+
<https://www.nngroup.com/articles/principles-visual-design/>
|
|
624
|
+
- **MDN — `min-content` / `auto` sizing**: grid/flex children have
|
|
625
|
+
intrinsic `min-width: auto`; explicitly set `min-width: 0` to release
|
|
626
|
+
it. The canonical fix for "tiles won't shrink/fill evenly".
|
|
627
|
+
- **Adam Argyle (Chrome DevRel) — Unintuitive CSS Layout Solutions**:
|
|
628
|
+
`min-height: 0`, `min-width: 0`, `flex-shrink: 0`, and
|
|
629
|
+
`repeat(auto-fill, minmax(min(10rem, 100%), 1fr))` — short, generic.
|
|
630
|
+
<https://nerdy.dev/3-unintuitive-layout-solutions>
|
|
631
|
+
- **Duolingo — Core Tabs Redesign + Gamification as Design Language**:
|
|
632
|
+
reference for tier-A vibrant semantic palettes (green=correct,
|
|
633
|
+
red=hearts, orange=streak…). Each colour carries a system meaning;
|
|
634
|
+
muted palettes undermine the tone.
|
|
635
|
+
<https://blog.duolingo.com/core-tabs-redesign/>
|
|
636
|
+
- **Stripe / Vitality / ColorArchive on SaaS dashboards**: reference for
|
|
637
|
+
tier-D restraint — 60-30-10 rule, semantic colour reserved for status,
|
|
638
|
+
achromatic chrome.
|
|
639
|
+
<https://vitalitydesignsystem.com/foundations/colour/>
|
|
640
|
+
- **Figma — 2026 Web Design Trends**: vibrant maximalist returning,
|
|
641
|
+
especially for lifestyle / youth / learning brands; supports the
|
|
642
|
+
domain-tier framing.
|
|
643
|
+
<https://www.figma.com/resource-library/web-design-trends/>
|
|
644
|
+
- **Linear — A calmer interface for a product in motion (2025)**: "structure
|
|
645
|
+
should be felt, not seen" — chrome recedes so content takes precedence;
|
|
646
|
+
borders softened, sidebars dimmed, icon backgrounds removed. Canonical
|
|
647
|
+
reference for the *Calm Chrome* critical rule and Hidden Failure Mode H2.
|
|
648
|
+
<https://linear.app/now/behind-the-latest-design-refresh>
|
|
649
|
+
- **Linear — How we redesigned the Linear UI part II**: tonal recess on the
|
|
650
|
+
inverted-L app chrome; harmonized header bars; LCH-based theme generation
|
|
651
|
+
to enforce consistent elevations. Reference for chrome calm-down work.
|
|
652
|
+
<https://linear.app/now/how-we-redesigned-the-linear-ui>
|
|
653
|
+
- **Material 3 — NavigationBar spec**: active indicator is a 64×32
|
|
654
|
+
`cornerFull` pill in `SecondaryContainer` color wrapping the icon — never
|
|
655
|
+
a full-cell fill (`ActiveIndicatorWidth = 64dp`,
|
|
656
|
+
`ActiveIndicatorHeight = 32dp`, `ActiveIndicatorShape = CornerFull`).
|
|
657
|
+
Canonical reference for Hidden Failure Mode H1 and the *Heavy Active
|
|
658
|
+
State* fix shape on bottom navigation.
|
|
659
|
+
<https://m3.material.io/components/navigation-bar/overview>
|
|
660
|
+
- **NN/g — Navigation: You Are Here**: prominence (color, weight, offset)
|
|
661
|
+
is how users locate themselves; many active-state designs are too
|
|
662
|
+
subtle (missed) or too loud (clunky). Reference for active-state tuning.
|
|
663
|
+
<https://www.nngroup.com/articles/navigation-you-are-here/>
|
|
664
|
+
- **NN/g — Button States**: enabled / disabled / hover / focus / pressed
|
|
665
|
+
must each be visually distinct *without* changing layout dimensions.
|
|
666
|
+
Reference for the active-mass-mismatch fix.
|
|
667
|
+
<https://www.nngroup.com/articles/button-states-communicate-interaction/>
|
|
668
|
+
- **TanStack Table — Column Sizing Guide** + **Issue #5870**: `header.getSize()`
|
|
669
|
+
emits inline `style={{ width }}` per cell that beats unscoped CSS unless
|
|
670
|
+
`!important` or `table-layout: fixed`. Same gotcha applies to AG-Grid,
|
|
671
|
+
MUI DataGrid, Chakra DataTable, and most headless data-grid libraries.
|
|
672
|
+
Canonical reference for Hidden Failure Mode H5 and H6.
|
|
673
|
+
<https://tanstack.com/table/v8/docs/guide/column-sizing>
|
|
674
|
+
- **MDN CSS masking**: gradient `mask-image` for soft edge fades.
|