claude-code-workflow 7.2.27 → 7.2.28
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/.ccw/specs/architecture-constraints.md +5 -0
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
- package/.claude/skills/investigate/SKILL.md +110 -0
- package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
- package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
- package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
- package/.claude/skills/investigate/phases/04-implementation.md +139 -0
- package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
- package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
- package/.claude/skills/investigate/specs/iron-law.md +101 -0
- package/.claude/skills/security-audit/SKILL.md +125 -0
- package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
- package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
- package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
- package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
- package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
- package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
- package/.claude/skills/ship/SKILL.md +105 -0
- package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
- package/.claude/skills/ship/phases/02-code-review.md +137 -0
- package/.claude/skills/ship/phases/03-version-bump.md +171 -0
- package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
- package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
- package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
- package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
- package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.claude/skills/team-motion-design/SKILL.md +129 -0
- package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
- package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
- package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
- package/.claude/skills/team-ui-polish/SKILL.md +127 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
- package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
- package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
- package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
- package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.claude/skills/team-uidesign/SKILL.md +6 -1
- package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
- package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
- package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
- package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
- package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
- package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
- package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
- package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
- package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
- package/.claude/skills/team-ux-improve/SKILL.md +3 -0
- package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
- package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
- package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
- package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
- package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
- package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
- package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
- package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
- package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
- package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
- package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
- package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
- package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/.codex/skills/investigate/agents/investigator.md +392 -0
- package/.codex/skills/investigate/orchestrator.md +362 -0
- package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
- package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
- package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
- package/.codex/skills/investigate/phases/04-implementation.md +195 -0
- package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
- package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
- package/.codex/skills/security-audit/orchestrator.md +384 -0
- package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
- package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
- package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
- package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
- package/.codex/skills/ship/agents/ship-operator.md +318 -0
- package/.codex/skills/ship/orchestrator.md +426 -0
- package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
- package/.codex/skills/ship/phases/02-code-review.md +228 -0
- package/.codex/skills/ship/phases/03-version-bump.md +259 -0
- package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
- package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
- package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
- package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
- package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.codex/skills/team-motion-design/SKILL.md +222 -0
- package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
- package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
- package/.codex/skills/team-ui-polish/SKILL.md +218 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
- package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
- package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
- package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
- package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/README.md +8 -0
- package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
- package/ccw/dist/core/hooks/hook-templates.js +114 -1
- package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +34 -0
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +2 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +105 -105
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# UX Writing Standards
|
|
2
|
+
|
|
3
|
+
Guidelines for all text content in UI components. From Impeccable's UX writing reference.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Button Labels
|
|
8
|
+
|
|
9
|
+
- **NEVER**: "OK", "Submit", "Yes", "No", "Cancel" (generic)
|
|
10
|
+
- **ALWAYS**: verb + object — "Save changes", "Create account", "Delete message"
|
|
11
|
+
- Destructive actions: name the destruction + show count — "Delete 5 items" not "Delete selected"
|
|
12
|
+
- Primary CTA: specific benefit — "Start free trial" not "Get started"
|
|
13
|
+
|
|
14
|
+
## Error Messages
|
|
15
|
+
|
|
16
|
+
Formula: (1) What happened + (2) Why + (3) How to fix
|
|
17
|
+
|
|
18
|
+
| Type | Template |
|
|
19
|
+
|------|----------|
|
|
20
|
+
| Format | "{Field} must be {format}. Example: {example}" |
|
|
21
|
+
| Required | "{Field} is required to {reason}" |
|
|
22
|
+
| Permission | "You don't have access to {resource}. Contact {who} for access" |
|
|
23
|
+
| Network | "Couldn't reach the server. Check your connection and try again" |
|
|
24
|
+
| Server | "Something went wrong on our end. Try again in a few minutes" |
|
|
25
|
+
|
|
26
|
+
- Never blame user: "Please enter..." not "You entered..."
|
|
27
|
+
- Never use codes alone: "Error 404" → "Page not found"
|
|
28
|
+
- Be specific: "Password must be 8+ characters with a number" not "Invalid password"
|
|
29
|
+
|
|
30
|
+
## Empty States
|
|
31
|
+
|
|
32
|
+
Three components: (1) Acknowledge + (2) Explain value + (3) Provide action
|
|
33
|
+
|
|
34
|
+
| Context | Example |
|
|
35
|
+
|---------|---------|
|
|
36
|
+
| First use | "No projects yet. Create your first project to get started. [Create project]" |
|
|
37
|
+
| Search | "No results for '{query}'. Try a different search term or [browse all]" |
|
|
38
|
+
| Filtered | "No items match these filters. [Clear filters]" |
|
|
39
|
+
| Error | "Couldn't load items. [Try again]" |
|
|
40
|
+
|
|
41
|
+
## Loading States
|
|
42
|
+
|
|
43
|
+
- Be specific: "Saving your draft..." not "Loading..."
|
|
44
|
+
- Multi-step: show progress — "Uploading (2 of 5 files)..."
|
|
45
|
+
- Duration hint: "This usually takes about 30 seconds"
|
|
46
|
+
|
|
47
|
+
## Confirmation Dialogs
|
|
48
|
+
|
|
49
|
+
- Use sparingly — prefer undo over confirm
|
|
50
|
+
- Title: what will happen — "Delete this project?"
|
|
51
|
+
- Body: consequences — "This will permanently delete 12 files. This can't be undone."
|
|
52
|
+
- Buttons: specific — "Delete project" / "Keep project" (not OK/Cancel)
|
|
53
|
+
|
|
54
|
+
## Voice & Tone
|
|
55
|
+
|
|
56
|
+
- **Voice**: consistent brand personality (professional/friendly/technical — choose one)
|
|
57
|
+
- **Tone**: adapts to moment — cheerful for success, empathetic for errors, neutral for routine
|
|
58
|
+
- Keep consistent: same word for same concept everywhere (delete/remove/trash → pick one)
|
|
59
|
+
|
|
60
|
+
## Form Instructions
|
|
61
|
+
|
|
62
|
+
- Show format with placeholder: `placeholder="john@example.com"`
|
|
63
|
+
- Explain non-obvious fields with helper text below label
|
|
64
|
+
- Mark optional fields (not required ones) — most fields should be required
|
|
65
|
+
- Group related fields with clear section headers
|
|
66
|
+
|
|
67
|
+
## Translation Planning
|
|
68
|
+
|
|
69
|
+
| Language | Length vs English |
|
|
70
|
+
|----------|------------------|
|
|
71
|
+
| German | +30% |
|
|
72
|
+
| French | +20% |
|
|
73
|
+
| Finnish | +30-40% |
|
|
74
|
+
| Chinese | -30% |
|
|
75
|
+
| Japanese | -10-20% |
|
|
76
|
+
|
|
77
|
+
- Design for longest language (German)
|
|
78
|
+
- Never truncate translated text — allow wrapping
|
|
79
|
+
- Avoid idioms and cultural references in source text
|
|
80
|
+
|
|
81
|
+
## Redundant Copy Detection
|
|
82
|
+
|
|
83
|
+
- Don't repeat visible information (heading ≠ first paragraph)
|
|
84
|
+
- Labels describe the field, not restate the value
|
|
85
|
+
- Tooltips add information, not repeat the label
|
|
86
|
+
- If heading says it all, skip the intro paragraph
|
|
@@ -98,6 +98,9 @@ Execute built-in Phase 1 (task discovery) -> role Phase 2-4 -> built-in Phase 5
|
|
|
98
98
|
## Specs Reference
|
|
99
99
|
|
|
100
100
|
- [specs/pipelines.md](specs/pipelines.md) — Pipeline definitions and task registry
|
|
101
|
+
- [specs/design-standards.md](specs/design-standards.md) — Impeccable visual design standards
|
|
102
|
+
- [specs/anti-patterns.md](specs/anti-patterns.md) — AI slop detection catalog (20 items)
|
|
103
|
+
- [specs/heuristics.md](specs/heuristics.md) — Nielsen's 10 usability heuristics evaluation framework
|
|
101
104
|
|
|
102
105
|
## Session Directory
|
|
103
106
|
|
|
@@ -101,6 +101,36 @@ const handleSubmit = async () => {
|
|
|
101
101
|
| Text input for folder path | Add directory picker: `<input type="file" webkitdirectory />` |
|
|
102
102
|
| No validation | Add validation rules and error messages |
|
|
103
103
|
|
|
104
|
+
### Visual Design Solutions
|
|
105
|
+
|
|
106
|
+
Reference `specs/design-standards.md` for target standards.
|
|
107
|
+
|
|
108
|
+
| Issue | Solution Design |
|
|
109
|
+
|-------|-----------------|
|
|
110
|
+
| Pure black/white | Define OKLCH neutral scale tinted toward brand hue (chroma 0.005-0.01) |
|
|
111
|
+
| Generic fonts | Select from: Instrument Sans, Plus Jakarta Sans, DM Sans, Space Grotesk, Fraunces |
|
|
112
|
+
| No modular scale | Choose ratio (1.200 or 1.250), derive all sizes from base 16px |
|
|
113
|
+
| Missing fluid sizing | Apply clamp() to display sizes (xl+): `clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem)` |
|
|
114
|
+
| All buttons primary | Define: primary (filled), secondary (outline/ghost), tertiary (text link) |
|
|
115
|
+
| Monotonous spacing | Apply 4pt scale with rhythm: tight (4-8px), comfortable (16-24px), generous (48-96px) |
|
|
116
|
+
| Nested cards | Flatten: remove inner card, use spacing + subtle border-bottom divider |
|
|
117
|
+
| Layout animations | Replace with transform: translateX/Y/scale + opacity transitions |
|
|
118
|
+
| No reduced-motion | Add global `@media (prefers-reduced-motion: reduce)` reset |
|
|
119
|
+
| Missing focus-visible | Add `:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px }` |
|
|
120
|
+
| Bounce easing | Replace with ease-out-quart: `cubic-bezier(0.25, 1, 0.5, 1)` |
|
|
121
|
+
| Missing interaction states | Define all 8 states per component with CSS selectors and ARIA attributes |
|
|
122
|
+
|
|
123
|
+
### UX Writing Solutions
|
|
124
|
+
|
|
125
|
+
| Issue | Solution |
|
|
126
|
+
|-------|----------|
|
|
127
|
+
| Generic button labels | Replace with verb+object: "Save changes", "Create project", "Delete 3 items" |
|
|
128
|
+
| Error without guidance | Apply formula: what happened + why + how to fix. Template per error type |
|
|
129
|
+
| Empty state without action | Three parts: acknowledge → explain value → provide action button |
|
|
130
|
+
| Loading text generic | Be specific: "Saving your draft..." not "Loading..." Show progress for multi-step |
|
|
131
|
+
| Confirmation too generic | Title: what will happen. Body: consequences. Buttons: specific actions (not OK/Cancel) |
|
|
132
|
+
| Redundant copy | Remove intro paragraph if heading is self-explanatory. Labels ≠ values |
|
|
133
|
+
|
|
104
134
|
## Phase 4: Design Document Generation
|
|
105
135
|
|
|
106
136
|
1. Generate implementation guide for each issue and write to `<session>/artifacts/design-guide.md`
|
|
@@ -69,6 +69,20 @@ For each issue from scan report:
|
|
|
69
69
|
| No error handling | Missing catch block | Add try/catch with error state |
|
|
70
70
|
| Race condition | Multiple concurrent requests | Add request cancellation or debounce |
|
|
71
71
|
|
|
72
|
+
### Visual Design Diagnosis
|
|
73
|
+
|
|
74
|
+
| Pattern | Root Cause | Fix Strategy |
|
|
75
|
+
|---------|------------|--------------|
|
|
76
|
+
| Pure black/white colors | No intentional color system | Introduce OKLCH palette with tinted neutrals |
|
|
77
|
+
| Generic font usage | Default font selection | Replace with distinctive alternatives from recommended list |
|
|
78
|
+
| Missing interaction states | Incomplete component design | Add all 8 states per Impeccable spec |
|
|
79
|
+
| Layout animations | Wrong animation properties | Switch to transform + opacity, add will-change via JS |
|
|
80
|
+
| No reduced-motion | Accessibility oversight | Add @media (prefers-reduced-motion: reduce) global query |
|
|
81
|
+
| All buttons primary | No hierarchy design | Establish primary/secondary/tertiary button system |
|
|
82
|
+
| Monotonous spacing | No spacing system | Implement 4pt scale with rhythm variation |
|
|
83
|
+
| Nested cards | Over-containment | Flatten to spacing + dividers |
|
|
84
|
+
| Missing focus-visible | Outdated focus handling | Replace :focus with :focus-visible, add ring spec |
|
|
85
|
+
|
|
72
86
|
## Phase 4: Diagnosis Report
|
|
73
87
|
|
|
74
88
|
1. Generate root cause analysis for each issue and write to `<session>/artifacts/diagnosis.md`
|
|
@@ -87,7 +101,8 @@ If new root cause patterns discovered:
|
|
|
87
101
|
pattern_types: {
|
|
88
102
|
state_management: <count>,
|
|
89
103
|
event_binding: <count>,
|
|
90
|
-
async_handling: <count
|
|
104
|
+
async_handling: <count>,
|
|
105
|
+
visual_design: <count>
|
|
91
106
|
}
|
|
92
107
|
})
|
|
93
108
|
```
|
|
@@ -63,6 +63,48 @@ Scan strategy:
|
|
|
63
63
|
| Input without validation | Form input without validation rules | Low |
|
|
64
64
|
| Missing file selector | Text input for file/folder path without picker | Medium |
|
|
65
65
|
|
|
66
|
+
### Visual Design Scanning
|
|
67
|
+
|
|
68
|
+
In addition to interaction issues, scan for visual design quality problems.
|
|
69
|
+
Reference `specs/design-standards.md` and `specs/anti-patterns.md`.
|
|
70
|
+
|
|
71
|
+
| Category | Detection Pattern | Severity |
|
|
72
|
+
|----------|-------------------|----------|
|
|
73
|
+
| AI color palette | Cyan (#00d4ff, #06b6d4), purple-blue gradients on dark | High |
|
|
74
|
+
| Pure black/white | #000, #fff, rgb(0,0,0), rgb(255,255,255) as primary colors | High |
|
|
75
|
+
| Generic font | Inter, Roboto, Open Sans, Arial as primary font-family | Medium |
|
|
76
|
+
| All buttons primary | Every button has same fill treatment, no hierarchy | High |
|
|
77
|
+
| Nested cards | border/shadow inside border/shadow containers | Medium |
|
|
78
|
+
| No focus-visible | Using :focus or outline:none without :focus-visible | High |
|
|
79
|
+
| Layout animations | Animating width/height/margin/padding | Medium |
|
|
80
|
+
| No reduced-motion | Missing @media(prefers-reduced-motion) | Medium |
|
|
81
|
+
| Bounce easing | cubic-bezier with negative values, spring/bounce | Medium |
|
|
82
|
+
| Monotonous spacing | >70% same padding/margin value | Low |
|
|
83
|
+
| Missing 8 states | Interactive elements with <5 defined states | Medium |
|
|
84
|
+
| Glassmorphism overuse | backdrop-filter:blur on >2 components | Medium |
|
|
85
|
+
| Generic button labels | "OK", "Submit", "Yes/No", "Cancel" without specific verb+object | Medium |
|
|
86
|
+
| Error messages without fix guidance | Error shows "Something went wrong" with no next step | High |
|
|
87
|
+
| Empty states without action | Data list shows "No data" without create/import action | Medium |
|
|
88
|
+
| Redundant copy | Heading text repeated in first paragraph (>50% word overlap) | Low |
|
|
89
|
+
|
|
90
|
+
### Heuristic UX Scanning
|
|
91
|
+
|
|
92
|
+
Apply Nielsen's 10 usability heuristics as a structured scan checklist.
|
|
93
|
+
Reference: `specs/heuristics.md`
|
|
94
|
+
|
|
95
|
+
| Heuristic | What to Check | Severity |
|
|
96
|
+
|-----------|---------------|----------|
|
|
97
|
+
| Visibility of system status | Loading indicators, progress bars, state feedback, timestamps | High |
|
|
98
|
+
| Match between system and real world | Jargon-free labels, familiar metaphors, logical ordering | Medium |
|
|
99
|
+
| User control and freedom | Undo/redo, back navigation, cancel actions, escape from modals | High |
|
|
100
|
+
| Consistency and standards | Same terms/icons for same actions, platform conventions | Medium |
|
|
101
|
+
| Error prevention | Confirmation for destructive actions, input validation, disable invalid options | High |
|
|
102
|
+
| Recognition over recall | Visible options, recent items, search suggestions, breadcrumbs | Medium |
|
|
103
|
+
| Flexibility and efficiency | Keyboard shortcuts, power-user features, bulk actions | Low |
|
|
104
|
+
| Aesthetic and minimalist design | Information density, noise reduction, visual hierarchy | Medium |
|
|
105
|
+
| Help users recover from errors | Error messages with fix guidance (what+why+fix), retry options | High |
|
|
106
|
+
| Help and documentation | Tooltips, onboarding, contextual help, empty states with guidance | Low |
|
|
107
|
+
|
|
66
108
|
For each component file:
|
|
67
109
|
1. Read file content
|
|
68
110
|
2. Scan for interaction patterns using Grep
|
|
@@ -73,7 +115,7 @@ For each component file:
|
|
|
73
115
|
## Phase 4: Issue Report Generation
|
|
74
116
|
|
|
75
117
|
1. Classify issues by severity (High/Medium/Low)
|
|
76
|
-
2. Group by category (unresponsive, missing feedback, state issues, input UX)
|
|
118
|
+
2. Group by category (unresponsive, missing feedback, state issues, input UX, visual design)
|
|
77
119
|
3. Generate structured report and write to `<session>/artifacts/scan-report.md`
|
|
78
120
|
4. Share state via team_msg:
|
|
79
121
|
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# AI Slop Detection Catalog
|
|
2
|
+
|
|
3
|
+
20 visual anti-patterns commonly produced by AI code generation. Use during scanning to flag design quality issues.
|
|
4
|
+
|
|
5
|
+
### 1. AI Color Palette
|
|
6
|
+
- **Pattern**: Cyan (#00d4ff, #06b6d4), purple-blue gradients on dark backgrounds as default aesthetic
|
|
7
|
+
- **Detection**: Search for cyan/teal hex values, linear-gradient with blue-purple stops on dark bg
|
|
8
|
+
- **Severity**: P1
|
|
9
|
+
|
|
10
|
+
### 2. Gradient Text
|
|
11
|
+
- **Pattern**: `background-clip: text` + `-webkit-text-fill-color: transparent` on headings or metric values
|
|
12
|
+
- **Detection**: Grep for `background-clip:\s*text` or `-webkit-background-clip:\s*text`
|
|
13
|
+
- **Severity**: P1
|
|
14
|
+
|
|
15
|
+
### 3. Default Dark Mode + Glow
|
|
16
|
+
- **Pattern**: Dark background (#0a0a0a, #111) with neon accent colors and box-shadow glow effects
|
|
17
|
+
- **Detection**: Dark bg colors + box-shadow with colored spread on interactive elements
|
|
18
|
+
- **Severity**: P2
|
|
19
|
+
|
|
20
|
+
### 4. Glassmorphism Everywhere
|
|
21
|
+
- **Pattern**: `backdrop-filter: blur()` applied to more than 2 components
|
|
22
|
+
- **Detection**: Count occurrences of `backdrop-filter:\s*blur` across components
|
|
23
|
+
- **Severity**: P1
|
|
24
|
+
|
|
25
|
+
### 5. Hero Metric Layout
|
|
26
|
+
- **Pattern**: Large number + small label arranged in card grid, dashboard-style metrics as default layout
|
|
27
|
+
- **Detection**: Pattern of large font-size number + small text label repeated 3+ times in grid
|
|
28
|
+
- **Severity**: P2
|
|
29
|
+
|
|
30
|
+
### 6. Identical Card Grids
|
|
31
|
+
- **Pattern**: 3+ cards with identical size, structure, and visual weight
|
|
32
|
+
- **Detection**: Repeated card components with same dimensions and no visual differentiation
|
|
33
|
+
- **Severity**: P2
|
|
34
|
+
|
|
35
|
+
### 7. Nested Cards
|
|
36
|
+
- **Pattern**: Border/shadow container inside another border/shadow container
|
|
37
|
+
- **Detection**: Card component rendered inside another card component, nested border-radius + box-shadow
|
|
38
|
+
- **Severity**: P2
|
|
39
|
+
|
|
40
|
+
### 8. Generic Fonts
|
|
41
|
+
- **Pattern**: Inter, Roboto, Open Sans, Lato, Montserrat, Arial as primary font-family
|
|
42
|
+
- **Detection**: Grep font-family declarations for generic font names
|
|
43
|
+
- **Severity**: P2
|
|
44
|
+
|
|
45
|
+
### 9. Rounded Rect + Generic Shadow
|
|
46
|
+
- **Pattern**: `border-radius: 8-16px` + `box-shadow: 0 1-4px ...` on more than 5 elements
|
|
47
|
+
- **Detection**: Count elements with both border-radius and box-shadow, flag if >5
|
|
48
|
+
- **Severity**: P3
|
|
49
|
+
|
|
50
|
+
### 10. Large Icons Above Every Heading
|
|
51
|
+
- **Pattern**: Decorative icon/emoji placed above section headings, repeated 3+ times
|
|
52
|
+
- **Detection**: Icon component or SVG immediately preceding heading elements, 3+ occurrences
|
|
53
|
+
- **Severity**: P2
|
|
54
|
+
|
|
55
|
+
### 11. One-Side Border Accent
|
|
56
|
+
- **Pattern**: `border-left: 3-4px solid <accent>` as visual accent on cards/sections
|
|
57
|
+
- **Detection**: Grep for `border-left:\s*\d+px\s+solid` repeated across components
|
|
58
|
+
- **Severity**: P3
|
|
59
|
+
|
|
60
|
+
### 12. Decorative Sparklines
|
|
61
|
+
- **Pattern**: Tiny inline charts without axis labels, data values, or interactive tooltips
|
|
62
|
+
- **Detection**: Small chart components (<100px height) without label/tooltip props
|
|
63
|
+
- **Severity**: P2
|
|
64
|
+
|
|
65
|
+
### 13. Bounce/Elastic Easing
|
|
66
|
+
- **Pattern**: `cubic-bezier` with negative control point values, spring/bounce animation keywords
|
|
67
|
+
- **Detection**: Grep for `cubic-bezier\([^)]*-` or animation names containing bounce/spring/elastic
|
|
68
|
+
- **Severity**: P2
|
|
69
|
+
|
|
70
|
+
### 14. Redundant Copy
|
|
71
|
+
- **Pattern**: Heading text restated in immediately following body paragraph with >50% word overlap
|
|
72
|
+
- **Detection**: Compare heading text with first paragraph text for word overlap
|
|
73
|
+
- **Severity**: P3
|
|
74
|
+
|
|
75
|
+
### 15. All Buttons Primary
|
|
76
|
+
- **Pattern**: Every button uses same filled/accent treatment, no visual hierarchy
|
|
77
|
+
- **Detection**: All button variants resolve to same background-color, no secondary/tertiary variants
|
|
78
|
+
- **Severity**: P1
|
|
79
|
+
|
|
80
|
+
### 16. Everything Centered
|
|
81
|
+
- **Pattern**: Body text centered (`text-align: center`), more than 60% of sections centered
|
|
82
|
+
- **Detection**: Count `text-align: center` on non-heading, non-hero elements
|
|
83
|
+
- **Severity**: P2
|
|
84
|
+
|
|
85
|
+
### 17. Same Spacing Everywhere
|
|
86
|
+
- **Pattern**: >70% of padding/margin values are identical (e.g., all `p-4` or `p-6`)
|
|
87
|
+
- **Detection**: Extract padding/margin values, check distribution uniformity
|
|
88
|
+
- **Severity**: P2
|
|
89
|
+
|
|
90
|
+
### 18. Monospace as Tech Aesthetic
|
|
91
|
+
- **Pattern**: Monospace font applied to non-code elements (headings, labels, navigation)
|
|
92
|
+
- **Detection**: `font-family: monospace` or code font on non-`<code>`/`<pre>` elements
|
|
93
|
+
- **Severity**: P3
|
|
94
|
+
|
|
95
|
+
### 19. Modal Overuse
|
|
96
|
+
- **Pattern**: More than 3 modal dialogs for non-critical interactions (settings, confirmations, info)
|
|
97
|
+
- **Detection**: Count modal/dialog component usages, check trigger context
|
|
98
|
+
- **Severity**: P3
|
|
99
|
+
|
|
100
|
+
### 20. Pure Black/White
|
|
101
|
+
- **Pattern**: #000, #fff, rgb(0,0,0), rgb(255,255,255) as primary background or text colors
|
|
102
|
+
- **Detection**: Grep for exact #000, #fff, rgb(0,0,0), rgb(255,255,255) in color/background properties
|
|
103
|
+
- **Severity**: P1
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Visual Design Standards
|
|
2
|
+
|
|
3
|
+
Reference for visual design quality detection. Scanner and diagnoser use these standards to identify design issues.
|
|
4
|
+
|
|
5
|
+
## Color Standards
|
|
6
|
+
|
|
7
|
+
- **OKLCH** for perceptually uniform palettes
|
|
8
|
+
- **Tinted neutrals**: chroma 0.005-0.01, never pure gray (#808080) or pure black/white (#000, #fff)
|
|
9
|
+
- **60-30-10 rule**: 60% neutral, 30% secondary, 10% accent
|
|
10
|
+
- **WCAG AA contrast**: normal text 4.5:1, large text 3:1, UI components 3:1
|
|
11
|
+
- **Text on colored backgrounds**: use `color-mix(in oklch, ...)` not gray text
|
|
12
|
+
|
|
13
|
+
## Typography Standards
|
|
14
|
+
|
|
15
|
+
- **Avoid generic fonts**: Inter, Roboto, Open Sans, Lato, Montserrat, Arial
|
|
16
|
+
- **Modular scale** (choose one ratio consistently): 1.125, 1.200, 1.250, 1.333
|
|
17
|
+
- **Fluid sizing**: `clamp()` for display text (xl and above)
|
|
18
|
+
- **Line height**: body 1.5, headings 1.2, small text 1.6
|
|
19
|
+
- **Reading width**: `max-width: 65ch`
|
|
20
|
+
- **Font loading**: `font-display: swap`
|
|
21
|
+
|
|
22
|
+
## Spacing Standards
|
|
23
|
+
|
|
24
|
+
- **4pt base scale**: 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96 px
|
|
25
|
+
- **Rhythm variation**: tight (4-8px), comfortable (16-24px), generous (48-96px)
|
|
26
|
+
- **Sibling spacing**: `gap` over `margin`
|
|
27
|
+
- **No nested cards**. Touch targets: 44x44px min
|
|
28
|
+
|
|
29
|
+
## Motion Standards
|
|
30
|
+
|
|
31
|
+
- **Animate ONLY**: transform, opacity, clip-path, background-color, color, box-shadow, filter
|
|
32
|
+
- **NEVER animate**: width, height, top, left, margin, padding
|
|
33
|
+
- **Easing**: ease-out-quart `cubic-bezier(0.25, 1, 0.5, 1)` default. No bounce/elastic/linear
|
|
34
|
+
- **Duration**: instant 100ms, fast 150ms, normal 250ms, slow 400ms
|
|
35
|
+
- **Reduced motion**: `@media (prefers-reduced-motion: reduce)` REQUIRED
|
|
36
|
+
|
|
37
|
+
## 8 Interaction States
|
|
38
|
+
|
|
39
|
+
| State | CSS | Requirement |
|
|
40
|
+
|-------|-----|-------------|
|
|
41
|
+
| Default | -- | Base appearance |
|
|
42
|
+
| Hover | `:hover` in `@media(hover:hover)` | Subtle change |
|
|
43
|
+
| Focus | `:focus-visible` | 2px solid accent, offset 2px, 3:1 contrast |
|
|
44
|
+
| Active | `:active` | Scale(0.97) or darker |
|
|
45
|
+
| Disabled | `[disabled]` | Opacity 0.5 |
|
|
46
|
+
| Loading | `[aria-busy]` | Spinner/skeleton |
|
|
47
|
+
| Error | `[aria-invalid]` | Red border + message |
|
|
48
|
+
| Success | custom | Green check |
|
|
49
|
+
|
|
50
|
+
## Visual Hierarchy
|
|
51
|
+
|
|
52
|
+
- **Squint test**: blur page, identify top 2 elements + groupings
|
|
53
|
+
- **1 primary CTA** per viewport
|
|
54
|
+
- **Progressive disclosure**: reveal complexity on demand
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Nielsen's 10 Usability Heuristics
|
|
2
|
+
|
|
3
|
+
Structured evaluation framework for UX scanning. Score each 0-4.
|
|
4
|
+
|
|
5
|
+
## 1. Visibility of System Status
|
|
6
|
+
The system should always keep users informed about what is going on.
|
|
7
|
+
- Loading indicators for async operations (> 200ms)
|
|
8
|
+
- Progress bars for multi-step processes
|
|
9
|
+
- State feedback (saved, syncing, error)
|
|
10
|
+
- Timestamps on data ("Updated 5 minutes ago")
|
|
11
|
+
- Active state indicators (selected tab, current page)
|
|
12
|
+
|
|
13
|
+
## 2. Match Between System and Real World
|
|
14
|
+
Speak the user's language, not technical jargon.
|
|
15
|
+
- Labels use familiar words (not internal terms)
|
|
16
|
+
- Icons match real-world metaphors
|
|
17
|
+
- Information appears in natural/logical order
|
|
18
|
+
- Dates, numbers, currencies in locale format
|
|
19
|
+
|
|
20
|
+
## 3. User Control and Freedom
|
|
21
|
+
Users need a clearly marked "emergency exit."
|
|
22
|
+
- Undo/redo for destructive or complex actions
|
|
23
|
+
- Back/cancel navigation always available
|
|
24
|
+
- Escape key closes modals/popovers
|
|
25
|
+
- Clear way to deselect, clear filters, reset
|
|
26
|
+
|
|
27
|
+
## 4. Consistency and Standards
|
|
28
|
+
Same words and actions should mean the same thing.
|
|
29
|
+
- One term per concept (delete/remove/trash → pick one)
|
|
30
|
+
- Same icon for same action across pages
|
|
31
|
+
- Follow platform conventions (links underlined, × means close)
|
|
32
|
+
- Consistent placement of actions (save always top-right, etc.)
|
|
33
|
+
|
|
34
|
+
## 5. Error Prevention
|
|
35
|
+
Better to prevent errors than show good error messages.
|
|
36
|
+
- Confirmation for destructive actions (with undo preferred)
|
|
37
|
+
- Input validation on blur (not just submit)
|
|
38
|
+
- Disable invalid options (gray out, not hide)
|
|
39
|
+
- Type-ahead/autocomplete for known-value fields
|
|
40
|
+
- Character counts for limited fields
|
|
41
|
+
|
|
42
|
+
## 6. Recognition Rather Than Recall
|
|
43
|
+
Minimize user memory load.
|
|
44
|
+
- Show options visibly (don't require memorization)
|
|
45
|
+
- Recent items, favorites, search suggestions
|
|
46
|
+
- Breadcrumbs for navigation context
|
|
47
|
+
- Inline help/tooltips for non-obvious fields
|
|
48
|
+
- Persistent important info (don't hide behind clicks)
|
|
49
|
+
|
|
50
|
+
## 7. Flexibility and Efficiency of Use
|
|
51
|
+
Accelerators for power users without confusing beginners.
|
|
52
|
+
- Keyboard shortcuts for frequent actions
|
|
53
|
+
- Bulk actions (select all, batch edit)
|
|
54
|
+
- Customizable views/layouts
|
|
55
|
+
- Search/filter as primary navigation for large datasets
|
|
56
|
+
|
|
57
|
+
## 8. Aesthetic and Minimalist Design
|
|
58
|
+
Every extra unit of information competes with relevant units.
|
|
59
|
+
- Remove decorative elements that don't aid comprehension
|
|
60
|
+
- Progressive disclosure (summary → detail on demand)
|
|
61
|
+
- Visual hierarchy: clear primary, secondary, tertiary
|
|
62
|
+
- Information density appropriate for use case
|
|
63
|
+
|
|
64
|
+
## 9. Help Users Recognize, Diagnose, and Recover from Errors
|
|
65
|
+
Error messages should be expressed in plain language.
|
|
66
|
+
- Formula: what happened + why + how to fix
|
|
67
|
+
- No error codes without explanation
|
|
68
|
+
- Suggest specific corrective action
|
|
69
|
+
- Preserve user input on error (don't clear forms)
|
|
70
|
+
- Retry option for network/server errors
|
|
71
|
+
|
|
72
|
+
## 10. Help and Documentation
|
|
73
|
+
Easy to search, focused on user's task.
|
|
74
|
+
- Contextual help (tooltips, info icons)
|
|
75
|
+
- Onboarding for first-time users
|
|
76
|
+
- Empty states with guidance and action
|
|
77
|
+
- Keyboard shortcut reference
|
|
78
|
+
- FAQ/search for complex features
|
|
79
|
+
|
|
80
|
+
## Severity Scale
|
|
81
|
+
|
|
82
|
+
| Rating | Description |
|
|
83
|
+
|--------|-------------|
|
|
84
|
+
| 0 | Not a usability problem |
|
|
85
|
+
| 1 | Cosmetic — fix if time permits |
|
|
86
|
+
| 2 | Minor — low priority fix |
|
|
87
|
+
| 3 | Major — important to fix, high priority |
|
|
88
|
+
| 4 | Catastrophe — must fix before release |
|
|
@@ -4,14 +4,46 @@
|
|
|
4
4
|
- Buttons without loading states during async operations
|
|
5
5
|
- Missing error handling with user feedback
|
|
6
6
|
- State changes without visual updates
|
|
7
|
-
- Double-click vulnerabilities
|
|
8
|
-
|
|
9
|
-
## State Issues
|
|
10
|
-
- Stale data after mutations
|
|
11
|
-
- Race conditions in async operations
|
|
12
|
-
- Missing rollback for failed optimistic updates
|
|
13
|
-
|
|
14
|
-
## Feedback Issues
|
|
7
|
+
- Double-click vulnerabilities (missing debounce)
|
|
8
|
+
- No disabled state during processing
|
|
15
9
|
- Silent failures without user notification
|
|
16
10
|
- Generic error messages without actionable guidance
|
|
17
11
|
- Missing confirmation for destructive actions
|
|
12
|
+
- No empty state placeholder for data lists
|
|
13
|
+
- Input without validation rules or inline feedback
|
|
14
|
+
|
|
15
|
+
## State Management Issues
|
|
16
|
+
- Stale data after mutations (direct array/object mutation)
|
|
17
|
+
- Race conditions in async operations (no cancellation)
|
|
18
|
+
- Missing rollback for failed optimistic updates
|
|
19
|
+
- Stale closure capturing old state value
|
|
20
|
+
- Missing loading/error/success state tracking
|
|
21
|
+
|
|
22
|
+
## Visual Design Anti-Patterns (AI Slop)
|
|
23
|
+
- AI Color Palette: cyan-on-dark, purple gradients (zero design intent)
|
|
24
|
+
- Gradient text: background-clip: text as emphasis crutch
|
|
25
|
+
- Glassmorphism everywhere: backdrop-filter as default aesthetic
|
|
26
|
+
- All Buttons Primary: no visual hierarchy, every button filled
|
|
27
|
+
- Pure Black/White: #000/#fff without tint (harsh, sterile)
|
|
28
|
+
- Generic fonts: Inter, Roboto as defaults (forgettable)
|
|
29
|
+
- Identical card grids: all items same visual weight
|
|
30
|
+
- Nested cards: cards inside cards creating noise
|
|
31
|
+
- Same spacing everywhere: no rhythm variation
|
|
32
|
+
- Bounce/elastic easing: dated animation feel
|
|
33
|
+
- Everything centered: including body text
|
|
34
|
+
|
|
35
|
+
## Motion Issues
|
|
36
|
+
- Layout animations (width/height/margin/padding triggers)
|
|
37
|
+
- No reduced-motion query (@media prefers-reduced-motion)
|
|
38
|
+
- CSS will-change set permanently (GPU waste)
|
|
39
|
+
- ease/linear as default easing (unnatural)
|
|
40
|
+
- Stagger exceeding 500ms total
|
|
41
|
+
|
|
42
|
+
## Accessibility Issues
|
|
43
|
+
- outline: none without :focus-visible replacement
|
|
44
|
+
- Missing :focus-visible (using bare :focus)
|
|
45
|
+
- Color-only state indication
|
|
46
|
+
- Touch targets < 44px
|
|
47
|
+
- No skip links
|
|
48
|
+
- Placeholder used as label
|
|
49
|
+
- Missing aria-describedby for error messages
|
|
@@ -1,14 +1,34 @@
|
|
|
1
1
|
# State Management Patterns
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
## Reactive Update Rules
|
|
4
|
+
- NEVER mutate arrays/objects directly
|
|
5
|
+
- React: use spread operator, filter/map for new references
|
|
6
|
+
- Vue: use ref() for primitives, reactive() for objects, computed() for derived
|
|
7
|
+
- Always trigger re-render through proper state API
|
|
8
|
+
|
|
9
|
+
## Async State Pattern
|
|
10
|
+
```
|
|
11
|
+
const [data, setData] = useState(null);
|
|
12
|
+
const [loading, setLoading] = useState(false);
|
|
13
|
+
const [error, setError] = useState(null);
|
|
14
|
+
|
|
15
|
+
// Always: loading -> success/error -> cleanup
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Race Condition Prevention
|
|
19
|
+
- AbortController for fetch cancellation
|
|
20
|
+
- Debounce for search/filter inputs (250-500ms)
|
|
21
|
+
- Latest-wins pattern for concurrent requests
|
|
22
|
+
- Disable trigger during processing
|
|
23
|
+
|
|
24
|
+
## Optimistic Updates
|
|
25
|
+
- Update UI immediately
|
|
26
|
+
- Track pending state
|
|
27
|
+
- Rollback on failure with error notification
|
|
28
|
+
- Never lose user data silently
|
|
29
|
+
|
|
30
|
+
## Form State
|
|
31
|
+
- Controlled inputs (React) / v-model (Vue)
|
|
32
|
+
- Validation on blur + on submit
|
|
33
|
+
- Error clearing on re-input
|
|
34
|
+
- Dirty tracking for unsaved changes warning
|
|
@@ -1,16 +1,40 @@
|
|
|
1
1
|
# UI Feedback Patterns
|
|
2
2
|
|
|
3
3
|
## Loading States
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
-
|
|
4
|
+
- Button: set disabled + aria-busy="true", show spinner, restore on complete
|
|
5
|
+
- Page: skeleton screens (prefer over spinners for content areas)
|
|
6
|
+
- Inline: progress indicator for multi-step operations
|
|
7
|
+
- Duration: show loading after 200ms delay (avoid flash for fast operations)
|
|
7
8
|
|
|
8
|
-
## Error
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
9
|
+
## Error States
|
|
10
|
+
- Form: inline validation with aria-invalid + aria-describedby
|
|
11
|
+
- API: toast/snackbar for non-blocking, inline for blocking errors
|
|
12
|
+
- Error message: specific, actionable (not "Something went wrong")
|
|
13
|
+
- Visual: red border on input, error icon, error text below
|
|
12
14
|
|
|
13
|
-
## Success
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
15
|
+
## Success States
|
|
16
|
+
- Form submit: success message + next action guidance
|
|
17
|
+
- CRUD: optimistic update with subtle confirmation
|
|
18
|
+
- Duration: success message visible 3-5 seconds
|
|
19
|
+
|
|
20
|
+
## Empty States
|
|
21
|
+
- Data list: illustration + message + primary action
|
|
22
|
+
- Search: "No results" + suggestions
|
|
23
|
+
- First use: onboarding guidance
|
|
24
|
+
|
|
25
|
+
## Focus Feedback
|
|
26
|
+
- :focus-visible only (not bare :focus)
|
|
27
|
+
- Ring: 2px solid accent, offset 2px
|
|
28
|
+
- Contrast: 3:1 against adjacent colors
|
|
29
|
+
- Custom for dark backgrounds: lighter ring color
|
|
30
|
+
|
|
31
|
+
## Hover Feedback
|
|
32
|
+
- Wrap in @media(hover:hover) for touch safety
|
|
33
|
+
- Subtle: background opacity change or slight color shift
|
|
34
|
+
- Duration: 100-150ms transition
|
|
35
|
+
- Cursor: pointer for clickable, not-allowed for disabled
|
|
36
|
+
|
|
37
|
+
## Active Feedback
|
|
38
|
+
- Scale: transform: scale(0.97) for physical feel
|
|
39
|
+
- Or: darker background shade
|
|
40
|
+
- Duration: instant (< 50ms feel)
|