claude-code-workflow 7.2.26 → 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-arch-opt/SKILL.md +1 -1
- package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
- package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
- package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-coordinate/SKILL.md +4 -3
- package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
- package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
- package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
- package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -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-lifecycle-v4/SKILL.md +1 -1
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
- package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
- 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-perf-opt/SKILL.md +1 -1
- package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
- package/.claude/skills/team-testing/SKILL.md +1 -1
- package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
- package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-testing/roles/executor/role.md +3 -1
- 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,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
role: verifier
|
|
3
|
+
prefix: VERIFY
|
|
4
|
+
inner_loop: false
|
|
5
|
+
message_types: [verify_passed, verify_failed, fix_required, error]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Verification & Regression Check
|
|
9
|
+
|
|
10
|
+
Before/after comparison verification. Re-scan fixed code against same 8 dimensions, calculate improvement, detect regressions. Acts as Critic in the optimizer<->verifier Generator-Critic loop.
|
|
11
|
+
|
|
12
|
+
## Phase 2: Context & Artifact Loading
|
|
13
|
+
|
|
14
|
+
| Input | Source | Required |
|
|
15
|
+
|-------|--------|----------|
|
|
16
|
+
| Original scan report | <session>/scan/scan-report.md | Yes |
|
|
17
|
+
| Fix log | <session>/optimization/fix-log.md | Yes |
|
|
18
|
+
| .msg/meta.json | <session>/wisdom/.msg/meta.json | Yes |
|
|
19
|
+
| Anti-patterns catalog | specs/anti-patterns.md | Yes |
|
|
20
|
+
| Design standards | specs/design-standards.md | Yes |
|
|
21
|
+
| Scoring guide | specs/scoring-guide.md | Yes |
|
|
22
|
+
|
|
23
|
+
1. Extract session path from task description
|
|
24
|
+
2. Read original scan report: parse before-scores per dimension and issue inventory
|
|
25
|
+
3. Read fix log: parse all fixes applied and files modified
|
|
26
|
+
4. Read specs for scoring reference
|
|
27
|
+
|
|
28
|
+
## Phase 3: Verification
|
|
29
|
+
|
|
30
|
+
### Step 1: Re-scan Fixed Code
|
|
31
|
+
|
|
32
|
+
Apply the same 8-dimension scan as the scanner role (reference roles/scanner/role.md Phase 3) to the current state of files. Use identical checklist items and scoring criteria.
|
|
33
|
+
|
|
34
|
+
If Chrome DevTools available:
|
|
35
|
+
- Take screenshots at same 3 viewports (mobile 375px, tablet 768px, desktop 1440px)
|
|
36
|
+
- Save to `<session>/evidence/after-mobile.png`, `after-tablet.png`, `after-desktop.png`
|
|
37
|
+
|
|
38
|
+
### Step 2: Calculate Score Delta
|
|
39
|
+
|
|
40
|
+
For each dimension, compare before and after:
|
|
41
|
+
|
|
42
|
+
| Dimension | Before | After | Delta | Status |
|
|
43
|
+
|-----------|--------|-------|-------|--------|
|
|
44
|
+
| 1. Anti-Patterns | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
45
|
+
| 2. Color Quality | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
46
|
+
| 3. Typography | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
47
|
+
| 4. Spacing/Layout | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
48
|
+
| 5. Motion | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
49
|
+
| 6. Interaction States | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
50
|
+
| 7. Visual Hierarchy | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
51
|
+
| 8. Responsive | X/4 | Y/4 | +/-N | improved/same/regressed |
|
|
52
|
+
| **Total** | X/32 | Y/32 | +/-N | |
|
|
53
|
+
|
|
54
|
+
### Step 3: Regression Detection
|
|
55
|
+
|
|
56
|
+
Check for NEW issues not present in original scan report:
|
|
57
|
+
|
|
58
|
+
| Check | Method |
|
|
59
|
+
|-------|--------|
|
|
60
|
+
| New issues introduced | Compare current issue inventory against original. Any issue not in original = regression |
|
|
61
|
+
| Score dropped | Any dimension score lower than before = regression |
|
|
62
|
+
| Positive findings broken | Items from original "Positive Findings" no longer hold |
|
|
63
|
+
| Build broken | Modified files have syntax errors or lint failures |
|
|
64
|
+
|
|
65
|
+
Classify regressions:
|
|
66
|
+
- **Critical**: Score dropped in any dimension, WCAG AA violation introduced, build broken
|
|
67
|
+
- **Non-critical**: New minor issues introduced but overall score improved
|
|
68
|
+
|
|
69
|
+
### Step 4: Determine Signal
|
|
70
|
+
|
|
71
|
+
| Condition | Signal |
|
|
72
|
+
|-----------|--------|
|
|
73
|
+
| No regressions AND total score >= before score | `verify_passed` |
|
|
74
|
+
| Non-critical regressions AND total score improved | `verify_failed` (fixable) |
|
|
75
|
+
| Critical regressions OR total score dropped | `fix_required` (urgent) |
|
|
76
|
+
|
|
77
|
+
## Phase 4: Generate Verification Report
|
|
78
|
+
|
|
79
|
+
Output: `<session>/verification/verify-report.md`
|
|
80
|
+
|
|
81
|
+
```markdown
|
|
82
|
+
# Verification Report
|
|
83
|
+
|
|
84
|
+
## Verdict: <PASSED | FAILED | FIX REQUIRED>
|
|
85
|
+
|
|
86
|
+
## Score Comparison
|
|
87
|
+
|
|
88
|
+
| Dimension | Before | After | Delta |
|
|
89
|
+
|-----------|--------|-------|-------|
|
|
90
|
+
| 1. Anti-Patterns | X/4 | Y/4 | +N |
|
|
91
|
+
| 2. Color Quality | X/4 | Y/4 | +N |
|
|
92
|
+
| 3. Typography | X/4 | Y/4 | +N |
|
|
93
|
+
| 4. Spacing/Layout | X/4 | Y/4 | +N |
|
|
94
|
+
| 5. Motion | X/4 | Y/4 | +N |
|
|
95
|
+
| 6. Interaction States | X/4 | Y/4 | +N |
|
|
96
|
+
| 7. Visual Hierarchy | X/4 | Y/4 | +N |
|
|
97
|
+
| 8. Responsive | X/4 | Y/4 | +N |
|
|
98
|
+
| **Total** | **X/32** | **Y/32** | **+N** |
|
|
99
|
+
|
|
100
|
+
## Before Rating: <rating-band> -> After Rating: <rating-band>
|
|
101
|
+
|
|
102
|
+
## Regressions Found
|
|
103
|
+
<list of regressions with location, severity, description>
|
|
104
|
+
<or "None" if clean>
|
|
105
|
+
|
|
106
|
+
## Remaining Issues
|
|
107
|
+
<issues from original scan that were NOT fixed>
|
|
108
|
+
|
|
109
|
+
## Improvements
|
|
110
|
+
<per-dimension improvement details>
|
|
111
|
+
|
|
112
|
+
## Screenshots
|
|
113
|
+
- Before: <session>/evidence/before-*.png
|
|
114
|
+
- After: <session>/evidence/after-*.png
|
|
115
|
+
<or "Chrome DevTools not available" if no screenshots>
|
|
116
|
+
|
|
117
|
+
## Metadata
|
|
118
|
+
- Original scan: <session>/scan/scan-report.md
|
|
119
|
+
- Fix log: <session>/optimization/fix-log.md
|
|
120
|
+
- GC round: <round number>
|
|
121
|
+
- Timestamp: <ISO timestamp>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
After writing the report, send signal-appropriate message:
|
|
125
|
+
|
|
126
|
+
**If verify_passed**:
|
|
127
|
+
```
|
|
128
|
+
mcp__ccw-tools__team_msg(session_id, role="verifier", type="verify_passed", content="Verification passed. Score: before X/32 -> after Y/32 (+N). No regressions.")
|
|
129
|
+
SendMessage(participant="coordinator", message="[verifier] VERIFY-001 passed. Score: X/32 -> Y/32 (+N). No regressions. Report: <session>/verification/verify-report.md")
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**If verify_failed**:
|
|
133
|
+
```
|
|
134
|
+
mcp__ccw-tools__team_msg(session_id, role="verifier", type="verify_failed", content="Verification failed. N non-critical regressions found. Score: X/32 -> Y/32.")
|
|
135
|
+
SendMessage(participant="coordinator", message="[verifier] VERIFY-001 failed. N regressions (non-critical). Score: X/32 -> Y/32. Report: <session>/verification/verify-report.md")
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**If fix_required**:
|
|
139
|
+
```
|
|
140
|
+
mcp__ccw-tools__team_msg(session_id, role="verifier", type="fix_required", content="Fix required. N critical regressions. Score dropped: X/32 -> Y/32.")
|
|
141
|
+
SendMessage(participant="coordinator", message="[verifier] VERIFY-001 fix_required. N critical regressions. Score: X/32 -> Y/32 (DROPPED). Report: <session>/verification/verify-report.md")
|
|
142
|
+
```
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Anti-Pattern Catalog
|
|
2
|
+
|
|
3
|
+
Complete catalog of UI design anti-patterns from Impeccable's design audit knowledge. Used by scanner for detection and optimizer for remediation.
|
|
4
|
+
|
|
5
|
+
## The AI Slop Test
|
|
6
|
+
|
|
7
|
+
> "If you showed this to someone and said 'AI made this,' would they believe you immediately? If yes, that is the problem."
|
|
8
|
+
|
|
9
|
+
AI-generated UIs share recognizable fingerprints. These are not inherently bad techniques -- they become problems when used as defaults without intentional design decisions. The issue is not the technique itself but the lack of thought behind it.
|
|
10
|
+
|
|
11
|
+
## AI Slop Tells (20 Items)
|
|
12
|
+
|
|
13
|
+
### 1. AI Color Palette
|
|
14
|
+
**Pattern**: Cyan-on-dark (#00d4ff, #06b6d4), purple-to-blue gradients (#8b5cf6 to #3b82f6), neon accents on dark backgrounds.
|
|
15
|
+
**Why it is a tell**: Every AI model defaults to the same "futuristic" palette. It signals zero design intent.
|
|
16
|
+
**Detection**: Search for cyan/purple/neon values on dark backgrounds. Check if palette could be from any Tailwind dark template.
|
|
17
|
+
**Severity**: P1
|
|
18
|
+
|
|
19
|
+
### 2. Gradient Text for Impact
|
|
20
|
+
**Pattern**: `background-clip: text` + gradient applied to metrics, headings, or hero text.
|
|
21
|
+
**Why it is a tell**: AI uses gradient text as a crutch to make numbers and titles feel "premium." Real typography achieves emphasis through weight, size, and space.
|
|
22
|
+
**Detection**: Search for `background-clip: text` or `-webkit-background-clip: text`.
|
|
23
|
+
**Severity**: P1
|
|
24
|
+
|
|
25
|
+
### 3. Default Dark Mode with Glowing Accents
|
|
26
|
+
**Pattern**: Dark background (gray-900/950) as default with glowing/neon accent colors. No light mode offered or light mode is an afterthought.
|
|
27
|
+
**Why it is a tell**: Dark mode with glow effects requires no real color decisions. It hides contrast problems and creates false sophistication.
|
|
28
|
+
**Detection**: Check default theme. If dark with glow `box-shadow` or neon colors, flag it.
|
|
29
|
+
**Severity**: P2
|
|
30
|
+
|
|
31
|
+
### 4. Glassmorphism Everywhere
|
|
32
|
+
**Pattern**: `backdrop-filter: blur()`, glass cards, glow borders (`box-shadow: 0 0 Xpx <color>`), used decoratively on multiple components.
|
|
33
|
+
**Why it is a tell**: Glassmorphism is a valid technique for specific use cases (overlays, elevated surfaces). AI applies it everywhere as the default "modern" aesthetic.
|
|
34
|
+
**Detection**: Count instances of `backdrop-filter: blur`. If > 2 components use it without functional reason, flag.
|
|
35
|
+
**Severity**: P1
|
|
36
|
+
|
|
37
|
+
### 5. Hero Metric Layout
|
|
38
|
+
**Pattern**: Big number (32-48px) + small label underneath + supporting stats in a row + gradient accent or colored bar.
|
|
39
|
+
**Why it is a tell**: This is the universal "AI dashboard" template. Every AI-generated analytics page uses this exact layout.
|
|
40
|
+
**Detection**: Pattern match for large-number + small-label structures repeated in a metrics row/grid.
|
|
41
|
+
**Severity**: P2
|
|
42
|
+
|
|
43
|
+
### 6. Identical Card Grids
|
|
44
|
+
**Pattern**: Same-sized cards with icon + heading + body text repeated 3-6 times in a grid. Equal width, equal height, equal spacing.
|
|
45
|
+
**Why it is a tell**: Real content varies in importance. AI treats all items as equally important because it has no content strategy.
|
|
46
|
+
**Detection**: Grid of 3+ cards with identical structure and sizing. No featured/hero card.
|
|
47
|
+
**Severity**: P2
|
|
48
|
+
|
|
49
|
+
### 7. Nested Cards
|
|
50
|
+
**Pattern**: Cards inside cards. `.card > .card-body > .inner-card`. Multiple layers of bordered containers.
|
|
51
|
+
**Why it is a tell**: AI nests containers to create visual "depth." It actually creates noise and makes hierarchy unclear.
|
|
52
|
+
**Detection**: Search for elements with border/shadow inside elements with border/shadow. Two levels of containment.
|
|
53
|
+
**Severity**: P2
|
|
54
|
+
|
|
55
|
+
### 8. Generic Fonts
|
|
56
|
+
**Pattern**: Inter, Roboto, Arial, Open Sans, Lato, Montserrat, system-ui used as primary font without intentional choice.
|
|
57
|
+
**Why it is a tell**: These are defaults. AI picks them because they are safe. Safe means forgettable.
|
|
58
|
+
**Detection**: Check `font-family` declarations. If primary font is in the generic list, flag.
|
|
59
|
+
**Severity**: P2
|
|
60
|
+
|
|
61
|
+
### 9. Rounded Rectangles with Generic Drop Shadows
|
|
62
|
+
**Pattern**: `border-radius: 8-16px` combined with `box-shadow: 0 1-4px 6-24px rgba(0,0,0,0.05-0.15)` on every container.
|
|
63
|
+
**Why it is a tell**: The "safe shape." Every AI output uses this exact combination because it is never wrong -- but never distinctive either.
|
|
64
|
+
**Detection**: Count elements with both border-radius (8-16px range) and generic box-shadow. If > 5, flag.
|
|
65
|
+
**Severity**: P3
|
|
66
|
+
|
|
67
|
+
### 10. Large Icons Above Every Heading
|
|
68
|
+
**Pattern**: 24-48px icons with rounded corners or colored backgrounds placed above every heading or card title.
|
|
69
|
+
**Why it is a tell**: AI uses icons as visual filler. Real design uses icons sparingly where they aid comprehension.
|
|
70
|
+
**Detection**: Pattern match for icon elements directly above heading elements. If repeated 3+ times, flag.
|
|
71
|
+
**Severity**: P2
|
|
72
|
+
|
|
73
|
+
### 11. One-Side Border Accent
|
|
74
|
+
**Pattern**: `border-left: 3-4px solid <accent-color>` or `border-top` used as the primary accent technique on cards/containers.
|
|
75
|
+
**Why it is a tell**: Lazy accent. It is a shortcut to add "personality" without making real design decisions.
|
|
76
|
+
**Detection**: Search for `border-left: [2-5]px solid` or `border-top: [2-5]px solid` with accent colors.
|
|
77
|
+
**Severity**: P3
|
|
78
|
+
|
|
79
|
+
### 12. Decorative Sparklines
|
|
80
|
+
**Pattern**: Tiny charts, mini-graphs, or trend indicators that look sophisticated but convey no actionable data. Often in card corners.
|
|
81
|
+
**Why it is a tell**: AI adds charts to appear data-driven. If the chart has no axis labels, no values, and no interaction, it is decoration.
|
|
82
|
+
**Detection**: Small SVG/canvas charts (<100px) without labels, tooltips, or legends.
|
|
83
|
+
**Severity**: P2
|
|
84
|
+
|
|
85
|
+
### 13. Bounce/Elastic Easing
|
|
86
|
+
**Pattern**: `cubic-bezier(0.68, -0.55, 0.265, 1.55)`, spring animations, or any easing that overshoots.
|
|
87
|
+
**Why it is a tell**: Bounce easing was trendy circa 2015. AI still defaults to it for "playfulness." It feels dated and tacky in modern UI.
|
|
88
|
+
**Detection**: Search for cubic-bezier with negative values or spring keyword.
|
|
89
|
+
**Severity**: P2
|
|
90
|
+
|
|
91
|
+
### 14. Redundant Copy
|
|
92
|
+
**Pattern**: Intro paragraphs that restate the heading. "Welcome to your Dashboard. This is your dashboard where you can see..."
|
|
93
|
+
**Why it is a tell**: AI generates text to fill space. Real UX uses headings as the message and body for additional context only.
|
|
94
|
+
**Detection**: Compare heading text with first paragraph. If >50% word overlap, flag.
|
|
95
|
+
**Severity**: P3
|
|
96
|
+
|
|
97
|
+
### 15. All Buttons Primary
|
|
98
|
+
**Pattern**: Every button is filled/primary color. No ghost buttons, text links, outline buttons, or secondary variants.
|
|
99
|
+
**Why it is a tell**: AI makes everything important. Real design creates hierarchy: 1 primary, 1-2 secondary, rest tertiary.
|
|
100
|
+
**Detection**: Check button variants. If all buttons have same fill/color treatment, flag.
|
|
101
|
+
**Severity**: P1
|
|
102
|
+
|
|
103
|
+
### 16. Everything Centered
|
|
104
|
+
**Pattern**: `text-align: center` or `justify-content: center` / `align-items: center` on most content blocks including body text.
|
|
105
|
+
**Why it is a tell**: Centering is the safe choice. Real design uses left-alignment for readability, centering only for specific elements (headings, hero).
|
|
106
|
+
**Detection**: Count centered text blocks. If body text is centered, flag. If > 60% of content sections are centered, flag.
|
|
107
|
+
**Severity**: P2
|
|
108
|
+
|
|
109
|
+
### 17. Same Spacing Everywhere
|
|
110
|
+
**Pattern**: Identical padding/margin on all cards, sections, and components. No variation in spacing rhythm.
|
|
111
|
+
**Why it is a tell**: AI applies uniform spacing because it has no sense of content grouping or visual rhythm.
|
|
112
|
+
**Detection**: Extract all padding/margin values. If > 70% are the same value, flag.
|
|
113
|
+
**Severity**: P2
|
|
114
|
+
|
|
115
|
+
### 18. Monospace as Tech Aesthetic
|
|
116
|
+
**Pattern**: Monospace font (Fira Code, JetBrains Mono, Source Code Pro) used for non-code content to appear "techy."
|
|
117
|
+
**Why it is a tell**: AI equates monospace with "developer tool" aesthetic. Real design uses monospace only for actual code.
|
|
118
|
+
**Detection**: Monospace `font-family` on non-`<code>`, non-`<pre>` elements.
|
|
119
|
+
**Severity**: P3
|
|
120
|
+
|
|
121
|
+
### 19. Modal Overuse
|
|
122
|
+
**Pattern**: Modals for confirmations, settings changes, form entries, when inline editing, drawers, or expandable sections would work.
|
|
123
|
+
**Why it is a tell**: Modals are AI's default "interaction" pattern because they are self-contained. Real UX considers context loss and flow interruption.
|
|
124
|
+
**Detection**: Count modal/dialog components. If > 3 modals for non-critical actions, flag.
|
|
125
|
+
**Severity**: P3
|
|
126
|
+
|
|
127
|
+
### 20. Pure Black or Pure White
|
|
128
|
+
**Pattern**: `#000000` or `#ffffff` used as primary background/text colors without any tint.
|
|
129
|
+
**Why it is a tell**: Pure black and white create harsh contrast and feel sterile. Real design tints toward a brand hue.
|
|
130
|
+
**Detection**: Search for `#000`, `#000000`, `rgb(0,0,0)`, `#fff`, `#ffffff`, `rgb(255,255,255)` in styles.
|
|
131
|
+
**Severity**: P1
|
|
132
|
+
|
|
133
|
+
## Scoring Guide
|
|
134
|
+
|
|
135
|
+
| Score | Tells Present | Label |
|
|
136
|
+
|-------|---------------|-------|
|
|
137
|
+
| 0 | 5+ tells | AI Slop Gallery |
|
|
138
|
+
| 1 | 3-4 tells | Heavy AI Influence |
|
|
139
|
+
| 2 | 1-2 tells | Some AI Tells |
|
|
140
|
+
| 3 | Subtle traces only | Mostly Clean |
|
|
141
|
+
| 4 | Zero tells, distinctive | Genuinely Intentional |
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
# Design Standards
|
|
2
|
+
|
|
3
|
+
Impeccable's positive design standards. These are the target state -- what good looks like. Used by scanner for scoring (how close to ideal) and optimizer as fix targets.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Color
|
|
8
|
+
|
|
9
|
+
### Principles
|
|
10
|
+
- Use **OKLCH** for perceptually uniform palettes. Colors at the same lightness actually look the same lightness
|
|
11
|
+
- Tint neutrals toward brand hue (chroma 0.005-0.01). Never pure gray
|
|
12
|
+
- **60-30-10 rule**: 60% neutral, 30% secondary/supporting, 10% accent
|
|
13
|
+
- Semantic token hierarchy: primitive -> semantic -> component tokens
|
|
14
|
+
- Never pure black (`#000`) or pure white (`#fff`). Always tint
|
|
15
|
+
|
|
16
|
+
### Color Token Structure
|
|
17
|
+
```
|
|
18
|
+
--color-primary oklch(0.55 0.2 250)
|
|
19
|
+
--color-primary-hover oklch(0.50 0.22 250)
|
|
20
|
+
--color-primary-active oklch(0.45 0.22 250)
|
|
21
|
+
|
|
22
|
+
--color-neutral-50 oklch(0.98 0.005 250) /* near-white, brand tinted */
|
|
23
|
+
--color-neutral-100 oklch(0.95 0.005 250)
|
|
24
|
+
--color-neutral-200 oklch(0.90 0.007 250)
|
|
25
|
+
--color-neutral-300 oklch(0.80 0.007 250)
|
|
26
|
+
--color-neutral-400 oklch(0.65 0.008 250)
|
|
27
|
+
--color-neutral-500 oklch(0.50 0.008 250)
|
|
28
|
+
--color-neutral-600 oklch(0.40 0.008 250)
|
|
29
|
+
--color-neutral-700 oklch(0.30 0.008 250)
|
|
30
|
+
--color-neutral-800 oklch(0.20 0.010 250)
|
|
31
|
+
--color-neutral-900 oklch(0.13 0.010 250)
|
|
32
|
+
--color-neutral-950 oklch(0.08 0.010 250) /* near-black, brand tinted */
|
|
33
|
+
|
|
34
|
+
--color-success oklch(0.65 0.18 145)
|
|
35
|
+
--color-warning oklch(0.75 0.15 85)
|
|
36
|
+
--color-error oklch(0.55 0.22 25)
|
|
37
|
+
--color-info oklch(0.60 0.15 250)
|
|
38
|
+
|
|
39
|
+
--color-surface var(--color-neutral-50)
|
|
40
|
+
--color-surface-raised var(--color-neutral-100)
|
|
41
|
+
--color-surface-overlay var(--color-neutral-900 / 0.5)
|
|
42
|
+
|
|
43
|
+
--color-text-primary var(--color-neutral-900)
|
|
44
|
+
--color-text-secondary var(--color-neutral-600)
|
|
45
|
+
--color-text-muted var(--color-neutral-400)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Contrast Requirements (WCAG AA)
|
|
49
|
+
- Normal text (<18px / <24px bold): 4.5:1 minimum
|
|
50
|
+
- Large text (>=18px / >=24px bold): 3:1 minimum
|
|
51
|
+
- UI components and graphical objects: 3:1 minimum
|
|
52
|
+
- Focus indicators: 3:1 against adjacent colors
|
|
53
|
+
|
|
54
|
+
### Text on Colored Backgrounds
|
|
55
|
+
- Never gray text on colored backgrounds (looks washed out)
|
|
56
|
+
- Use shade of the background color, or white/dark with transparency
|
|
57
|
+
- `color-mix(in oklch, var(--bg-color) 30%, black)` for text on colored surfaces
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Typography
|
|
62
|
+
|
|
63
|
+
### Font Selection
|
|
64
|
+
Avoid: Inter, Roboto, Open Sans, Lato, Montserrat, Arial (overused defaults).
|
|
65
|
+
|
|
66
|
+
Recommended alternatives by category:
|
|
67
|
+
- **Sans-serif body**: Instrument Sans, Plus Jakarta Sans, DM Sans, Geist, General Sans
|
|
68
|
+
- **Sans-serif display**: Space Grotesk, Manrope, Outfit, Satoshi, Clash Display
|
|
69
|
+
- **Serif display**: Fraunces, Playfair Display 2, Source Serif 4
|
|
70
|
+
- **Monospace (code only)**: Geist Mono, JetBrains Mono, Fira Code
|
|
71
|
+
|
|
72
|
+
### Modular Type Scale
|
|
73
|
+
Choose one ratio and apply consistently:
|
|
74
|
+
|
|
75
|
+
| Ratio | Name | Scale (base 16px) |
|
|
76
|
+
|-------|------|--------------------|
|
|
77
|
+
| 1.125 | Major Second | 16, 18, 20.25, 22.78, 25.63 |
|
|
78
|
+
| 1.200 | Minor Third | 16, 19.2, 23.04, 27.65, 33.18 |
|
|
79
|
+
| 1.250 | Major Third | 16, 20, 25, 31.25, 39.06 |
|
|
80
|
+
| 1.333 | Perfect Fourth | 16, 21.33, 28.43, 37.9, 50.52 |
|
|
81
|
+
| 1.500 | Perfect Fifth | 16, 24, 36, 54, 81 |
|
|
82
|
+
|
|
83
|
+
### Fluid Sizing
|
|
84
|
+
Use `clamp()` for display text:
|
|
85
|
+
```css
|
|
86
|
+
--text-xs: 0.75rem; /* 12px, fixed */
|
|
87
|
+
--text-sm: 0.875rem; /* 14px, fixed */
|
|
88
|
+
--text-base: 1rem; /* 16px, body */
|
|
89
|
+
--text-lg: 1.125rem; /* 18px */
|
|
90
|
+
--text-xl: clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem); /* 20-24px */
|
|
91
|
+
--text-2xl: clamp(1.5rem, 1.2rem + 1vw, 2rem); /* 24-32px */
|
|
92
|
+
--text-3xl: clamp(1.875rem, 1.4rem + 1.5vw, 2.5rem); /* 30-40px */
|
|
93
|
+
--text-4xl: clamp(2.25rem, 1.5rem + 2.5vw, 3.5rem); /* 36-56px */
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Line Height & Spacing
|
|
97
|
+
- Body text: `line-height: 1.5` (24px at 16px base)
|
|
98
|
+
- Headings: `line-height: 1.2` (tighter)
|
|
99
|
+
- Small text / captions: `line-height: 1.6`
|
|
100
|
+
- Reading width: `max-width: 65ch` (range: 45-75ch)
|
|
101
|
+
|
|
102
|
+
### Loading
|
|
103
|
+
- `font-display: swap` on all custom fonts
|
|
104
|
+
- Provide `size-adjust`, `ascent-override`, `descent-override` on fallback for minimal CLS
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Spacing
|
|
109
|
+
|
|
110
|
+
### 4pt Base Scale
|
|
111
|
+
```css
|
|
112
|
+
--space-0: 0;
|
|
113
|
+
--space-1: 0.25rem; /* 4px */
|
|
114
|
+
--space-2: 0.5rem; /* 8px */
|
|
115
|
+
--space-3: 0.75rem; /* 12px */
|
|
116
|
+
--space-4: 1rem; /* 16px */
|
|
117
|
+
--space-5: 1.25rem; /* 20px */
|
|
118
|
+
--space-6: 1.5rem; /* 24px */
|
|
119
|
+
--space-8: 2rem; /* 32px */
|
|
120
|
+
--space-10: 2.5rem; /* 40px */
|
|
121
|
+
--space-12: 3rem; /* 48px */
|
|
122
|
+
--space-16: 4rem; /* 64px */
|
|
123
|
+
--space-24: 6rem; /* 96px */
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Rhythm
|
|
127
|
+
- **Tight**: 4-8px within component groups (e.g., label + input, icon + text)
|
|
128
|
+
- **Comfortable**: 16-24px between related items (e.g., list items, form fields)
|
|
129
|
+
- **Generous**: 48-96px between major sections (e.g., page sections, content blocks)
|
|
130
|
+
|
|
131
|
+
Monotonous spacing (same value everywhere) = no rhythm = boring. Vary spacing intentionally.
|
|
132
|
+
|
|
133
|
+
### Layout Principles
|
|
134
|
+
- Use `gap` instead of `margin` for sibling spacing
|
|
135
|
+
- Cards only when content is truly distinct and actionable. Not everything needs a card
|
|
136
|
+
- Flatten nested cards -- use spacing + subtle dividers instead
|
|
137
|
+
- Container queries (`@container`) for component-level responsive
|
|
138
|
+
- Touch targets: minimum 44x44px for all interactive elements
|
|
139
|
+
- Optical adjustments: visually center, not mathematically center (e.g., play button in circle needs right offset)
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Motion
|
|
144
|
+
|
|
145
|
+
### Property Rules
|
|
146
|
+
- **Animate ONLY**: `transform`, `opacity`, `clip-path`, `background-color`, `color`, `border-color`, `box-shadow`, `filter`
|
|
147
|
+
- **NEVER animate**: `width`, `height`, `top`, `left`, `right`, `bottom`, `margin`, `padding` (triggers layout)
|
|
148
|
+
|
|
149
|
+
### Easing
|
|
150
|
+
- **Default (ease-out-quart)**: `cubic-bezier(0.25, 1, 0.5, 1)` -- decelerates naturally
|
|
151
|
+
- **Enter (ease-out)**: `cubic-bezier(0, 0, 0.25, 1)` -- elements arrive and settle
|
|
152
|
+
- **Exit (ease-in)**: `cubic-bezier(0.5, 0, 0.75, 0)` -- elements accelerate away
|
|
153
|
+
- **NEVER**: `ease` (default), `linear` (mechanical), bounce/elastic (dated)
|
|
154
|
+
|
|
155
|
+
### Duration Scale
|
|
156
|
+
```css
|
|
157
|
+
--duration-instant: 100ms; /* tooltip show, ripple */
|
|
158
|
+
--duration-fast: 150ms; /* button hover, focus ring */
|
|
159
|
+
--duration-normal: 250ms; /* dropdown open, tab switch */
|
|
160
|
+
--duration-slow: 400ms; /* modal open, sidebar slide */
|
|
161
|
+
--duration-entrance: 500ms; /* page entrance, hero animation */
|
|
162
|
+
--duration-complex: 800ms; /* complex sequence, page transition */
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- Exit = 75% of entrance duration
|
|
166
|
+
- Feedback (hover, active, focus): 100-150ms maximum
|
|
167
|
+
- State change: 200-300ms
|
|
168
|
+
- Layout change: 300-500ms
|
|
169
|
+
|
|
170
|
+
### Stagger
|
|
171
|
+
- Max visible items to stagger: 10
|
|
172
|
+
- Total stagger duration: max 500ms
|
|
173
|
+
- Formula: `animation-delay: calc(var(--index) * 50ms)`
|
|
174
|
+
- Cap: `animation-delay: min(calc(var(--index) * 50ms), 500ms)`
|
|
175
|
+
|
|
176
|
+
### Reduced Motion
|
|
177
|
+
**Required** -- affects ~35% of adults over 40:
|
|
178
|
+
```css
|
|
179
|
+
@media (prefers-reduced-motion: reduce) {
|
|
180
|
+
*,
|
|
181
|
+
*::before,
|
|
182
|
+
*::after {
|
|
183
|
+
animation-duration: 0.01ms !important;
|
|
184
|
+
animation-iteration-count: 1 !important;
|
|
185
|
+
transition-duration: 0.01ms !important;
|
|
186
|
+
scroll-behavior: auto !important;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### will-change
|
|
192
|
+
- Do NOT set in CSS (wastes GPU memory permanently)
|
|
193
|
+
- Add via JS on `pointerenter` / `focusin`
|
|
194
|
+
- Remove on `animationend` / `transitionend`
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Interaction States
|
|
199
|
+
|
|
200
|
+
### The 8 Required States
|
|
201
|
+
|
|
202
|
+
Every interactive element must define:
|
|
203
|
+
|
|
204
|
+
| State | CSS | Visual Change |
|
|
205
|
+
|-------|-----|---------------|
|
|
206
|
+
| Default | -- | Base appearance |
|
|
207
|
+
| Hover | `:hover` (wrap in `@media(hover:hover)`) | Subtle background/opacity change |
|
|
208
|
+
| Focus | `:focus-visible` | Focus ring: 2px solid accent, offset 2px |
|
|
209
|
+
| Active | `:active` | Scale down (0.97) or darker background |
|
|
210
|
+
| Disabled | `[disabled], [aria-disabled="true"]` | Opacity 0.5, cursor not-allowed |
|
|
211
|
+
| Loading | `[aria-busy="true"]` | Spinner/skeleton, disable interaction |
|
|
212
|
+
| Error | `[aria-invalid="true"]` | Red border, error message below |
|
|
213
|
+
| Success | custom class/attribute | Green check, success message |
|
|
214
|
+
|
|
215
|
+
### Focus Ring Specification
|
|
216
|
+
```css
|
|
217
|
+
:focus-visible {
|
|
218
|
+
outline: 2px solid var(--color-primary);
|
|
219
|
+
outline-offset: 2px;
|
|
220
|
+
border-radius: inherit;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* Only remove outline for mouse clicks */
|
|
224
|
+
:focus:not(:focus-visible) {
|
|
225
|
+
outline: none;
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Focus ring contrast: 3:1 minimum against all adjacent colors.
|
|
230
|
+
|
|
231
|
+
### Form Labels
|
|
232
|
+
- Always provide visible `<label>` elements
|
|
233
|
+
- Placeholders are hints, NOT labels (they disappear)
|
|
234
|
+
- Use `aria-labelledby` or `aria-label` for icon-only buttons
|
|
235
|
+
- Error messages: `aria-describedby` linking input to error text
|
|
236
|
+
|
|
237
|
+
### Touch Targets
|
|
238
|
+
- Minimum: 44x44px (WCAG 2.5.5 AAA) / 24x24px (WCAG 2.5.8 AA minimum)
|
|
239
|
+
- Use padding to increase hit area without changing visual size
|
|
240
|
+
- Minimum 8px gap between adjacent targets
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Visual Hierarchy
|
|
245
|
+
|
|
246
|
+
### Squint Test
|
|
247
|
+
Blur the page (or squint). You should immediately identify:
|
|
248
|
+
1. The most important element (usually primary heading or CTA)
|
|
249
|
+
2. The second most important element
|
|
250
|
+
3. Clear groupings of related content
|
|
251
|
+
|
|
252
|
+
If everything looks the same when blurred, hierarchy has failed.
|
|
253
|
+
|
|
254
|
+
### Hierarchy Tools (use 2-3 together)
|
|
255
|
+
| Tool | Effect |
|
|
256
|
+
|------|--------|
|
|
257
|
+
| Size | Larger = more important. 3:1 ratio between major levels |
|
|
258
|
+
| Weight | Bold vs regular vs light. Maximum 2 weights per page |
|
|
259
|
+
| Color | Saturated vs muted. Primary color for emphasis |
|
|
260
|
+
| Space | More surrounding space = more important |
|
|
261
|
+
| Position | Top-left reads first (in LTR). Above fold > below fold |
|
|
262
|
+
| Contrast | High contrast = more important. Low contrast recedes |
|
|
263
|
+
|
|
264
|
+
### Primary Action Rule
|
|
265
|
+
- Only 1 primary CTA per viewport
|
|
266
|
+
- Primary: filled button, highest contrast, most saturated
|
|
267
|
+
- Secondary: outline/ghost button
|
|
268
|
+
- Tertiary: text link, no background
|
|
269
|
+
|
|
270
|
+
### Progressive Disclosure
|
|
271
|
+
- Show summary first, detail on demand
|
|
272
|
+
- Expandable sections, "show more," detail panels
|
|
273
|
+
- Do not dump all information at once
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Responsive Design
|
|
278
|
+
|
|
279
|
+
### Breakpoints
|
|
280
|
+
```css
|
|
281
|
+
/* Mobile first */
|
|
282
|
+
--bp-sm: 640px; /* Small tablets */
|
|
283
|
+
--bp-md: 768px; /* Tablets */
|
|
284
|
+
--bp-lg: 1024px; /* Laptops */
|
|
285
|
+
--bp-xl: 1280px; /* Desktops */
|
|
286
|
+
--bp-2xl: 1536px; /* Large screens */
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Fluid Design Principles
|
|
290
|
+
- Use `%`, `vw`, `fr`, `min()`, `max()`, `clamp()` instead of fixed `px` widths
|
|
291
|
+
- `max-width` instead of `width` for containers
|
|
292
|
+
- Grid with `fr` units for responsive layouts
|
|
293
|
+
- Container queries (`@container`) for component-level responsiveness
|
|
294
|
+
|
|
295
|
+
### Mobile Requirements
|
|
296
|
+
- Minimum text: 14px (0.875rem), prefer 16px for body
|
|
297
|
+
- Touch targets: 44x44px minimum
|
|
298
|
+
- No horizontal scroll at >= 320px viewport
|
|
299
|
+
- Must have `<meta name="viewport" content="width=device-width, initial-scale=1">`
|
|
300
|
+
- Images: `max-width: 100%; height: auto`
|
|
301
|
+
|
|
302
|
+
### Adapt, Don't Hide
|
|
303
|
+
- Content should be restructured for smaller screens, not hidden
|
|
304
|
+
- Stack horizontal layouts vertically
|
|
305
|
+
- Use accordion/tabs for complex content
|
|
306
|
+
- Simplify navigation (hamburger, bottom nav)
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## UX Writing
|
|
311
|
+
|
|
312
|
+
### Button Labels
|
|
313
|
+
- NEVER: "OK", "Submit", "Yes", "No" (generic)
|
|
314
|
+
- ALWAYS: verb + object — "Save changes", "Create account", "Delete message"
|
|
315
|
+
- Destructive: name the destruction + count — "Delete 5 items"
|
|
316
|
+
|
|
317
|
+
### Error Messages
|
|
318
|
+
Formula: what happened + why + how to fix
|
|
319
|
+
- "Password must be 8+ characters with a number" not "Invalid password"
|
|
320
|
+
- Never blame user, never use codes alone
|
|
321
|
+
- Preserve user input on error
|
|
322
|
+
|
|
323
|
+
### Empty States
|
|
324
|
+
Acknowledge + explain value + provide action
|
|
325
|
+
- "No projects yet. Create your first project to start collaborating. [Create project]"
|
|
326
|
+
|
|
327
|
+
### Loading Text
|
|
328
|
+
- Specific: "Saving your draft..." not "Loading..."
|
|
329
|
+
- Multi-step: "Uploading (2 of 5 files)..."
|
|
330
|
+
|
|
331
|
+
### Consistency
|
|
332
|
+
- One term per concept (delete/remove → pick one)
|
|
333
|
+
- Same icon for same action everywhere
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Dark Mode (when present)
|
|
338
|
+
|
|
339
|
+
### Rules
|
|
340
|
+
- NOT inverted light mode — requires deliberate design
|
|
341
|
+
- **Surface hierarchy**: lighter surfaces = higher elevation
|
|
342
|
+
- Base: `oklch(0.10-0.15 0.01 <hue>)`
|
|
343
|
+
- Raised: `oklch(0.18-0.22 0.01 <hue>)`
|
|
344
|
+
- Overlay: `oklch(0.24-0.28 0.01 <hue>)`
|
|
345
|
+
- **Font weight**: reduce by 1 step (600→500, 500→400) — light text on dark looks heavier
|
|
346
|
+
- **Accent colors**: desaturate — reduce OKLCH chroma by 0.05-0.10 from light theme values
|
|
347
|
+
- Never: pure black `#000` background
|
|
348
|
+
|
|
349
|
+
### Dangerous Combinations
|
|
350
|
+
| Combination | Problem | Fix |
|
|
351
|
+
|-------------|---------|-----|
|
|
352
|
+
| Gray on colored bg | Washed out | Use shade of bg color or white with opacity |
|
|
353
|
+
| Red + Green adjacent | Color blindness | Add icons/patterns |
|
|
354
|
+
| Yellow on white | Invisible | Use dark amber |
|
|
355
|
+
| Thin light text on images | Unpredictable contrast | Text shadow or overlay |
|
|
356
|
+
| Saturated on dark | Visual vibration | Desaturate chroma |
|