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,362 @@
|
|
|
1
|
+
# Interaction Pattern Catalog
|
|
2
|
+
|
|
3
|
+
Reference patterns for common interactive components. Each pattern defines the core interaction model, browser APIs, state machine, animation approach, and accessibility requirements.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Glass Terminal Pattern
|
|
8
|
+
|
|
9
|
+
Split-view layout with frosted glass effect, tab navigation, and command input simulation.
|
|
10
|
+
|
|
11
|
+
**Core Interaction**:
|
|
12
|
+
- Tab-based view switching (2-4 panels)
|
|
13
|
+
- Command input field with syntax-highlighted output
|
|
14
|
+
- Frosted glass background via `backdrop-filter: blur()`
|
|
15
|
+
- Resize-aware layout via ResizeObserver
|
|
16
|
+
|
|
17
|
+
**State Machine**:
|
|
18
|
+
```
|
|
19
|
+
[idle] --(tab-click)--> [switching]
|
|
20
|
+
[switching] --(transition-end)--> [idle]
|
|
21
|
+
[idle] --(input-focus)--> [input-active]
|
|
22
|
+
[input-active] --(Enter)--> [processing]
|
|
23
|
+
[processing] --(output-ready)--> [idle]
|
|
24
|
+
[input-active] --(Escape)--> [idle]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Browser APIs**: ResizeObserver, CSS backdrop-filter, CSS custom properties
|
|
28
|
+
|
|
29
|
+
**Animation**:
|
|
30
|
+
- Tab switch: opacity crossfade (200ms, ease-out), GPU-only
|
|
31
|
+
- Output appear: translateY(10px)->0 + opacity (300ms, ease-out)
|
|
32
|
+
- Cursor blink: CSS animation (1s steps(2))
|
|
33
|
+
|
|
34
|
+
**CSS Key Properties**:
|
|
35
|
+
```css
|
|
36
|
+
.glass-terminal {
|
|
37
|
+
backdrop-filter: blur(12px) saturate(180%);
|
|
38
|
+
-webkit-backdrop-filter: blur(12px) saturate(180%);
|
|
39
|
+
background: rgba(255, 255, 255, 0.1);
|
|
40
|
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Accessibility**:
|
|
45
|
+
- role="tablist" + role="tab" + role="tabpanel"
|
|
46
|
+
- aria-selected on active tab
|
|
47
|
+
- Arrow keys navigate tabs, Enter/Space activates
|
|
48
|
+
- Input field: role="textbox", aria-label
|
|
49
|
+
- Output: aria-live="polite" for new content
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Split Compare Pattern
|
|
54
|
+
|
|
55
|
+
Before/after overlay with draggable divider for visual comparison.
|
|
56
|
+
|
|
57
|
+
**Core Interaction**:
|
|
58
|
+
- Draggable vertical divider splits two overlapping images/views
|
|
59
|
+
- Pointer events for drag with Lerp interpolation (speed: 0.15)
|
|
60
|
+
- clip-path animation reveals before/after content
|
|
61
|
+
- Touch-friendly with full pointer event support
|
|
62
|
+
|
|
63
|
+
**State Machine**:
|
|
64
|
+
```
|
|
65
|
+
[idle] --(pointerenter)--> [hover]
|
|
66
|
+
[hover] --(pointerdown on divider)--> [dragging]
|
|
67
|
+
[hover] --(pointerleave)--> [idle]
|
|
68
|
+
[dragging] --(pointermove)--> [dragging] (update position)
|
|
69
|
+
[dragging] --(pointerup)--> [settling]
|
|
70
|
+
[settling] --(lerp-complete)--> [idle]
|
|
71
|
+
[any] --(focus + ArrowLeft/Right)--> [keyboard-adjusting]
|
|
72
|
+
[keyboard-adjusting] --(keyup)--> [idle]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Browser APIs**: Pointer Events, CSS clip-path, ResizeObserver, requestAnimationFrame
|
|
76
|
+
|
|
77
|
+
**Animation**:
|
|
78
|
+
- Divider follow: Lerp `current += (target - current) * 0.15` per frame
|
|
79
|
+
- Clip-path update: `clip-path: inset(0 0 0 ${position}%)` on after layer
|
|
80
|
+
- Settle: natural Lerp deceleration to final position
|
|
81
|
+
- Hover hint: divider scale(1.1) + glow (200ms, ease-out)
|
|
82
|
+
|
|
83
|
+
**CSS Key Properties**:
|
|
84
|
+
```css
|
|
85
|
+
.split-compare__after {
|
|
86
|
+
clip-path: inset(0 0 0 var(--split-position, 50%));
|
|
87
|
+
transition: none; /* JS-driven via lerp */
|
|
88
|
+
}
|
|
89
|
+
.split-compare__divider {
|
|
90
|
+
cursor: col-resize;
|
|
91
|
+
touch-action: none; /* prevent scroll during drag */
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Keyboard**:
|
|
96
|
+
- Tab to divider element (tabindex="0")
|
|
97
|
+
- ArrowLeft/ArrowRight: move divider 2% per keypress
|
|
98
|
+
- Home/End: move to 0%/100%
|
|
99
|
+
|
|
100
|
+
**Accessibility**:
|
|
101
|
+
- role="slider", aria-valuenow, aria-valuemin="0", aria-valuemax="100"
|
|
102
|
+
- aria-label="Image comparison slider"
|
|
103
|
+
- Keyboard step: 2%, large step (PageUp/PageDown): 10%
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Scroll-Snap Gallery Pattern
|
|
108
|
+
|
|
109
|
+
Horizontal scroll with CSS scroll-snap, navigation controls, and active item detection.
|
|
110
|
+
|
|
111
|
+
**Core Interaction**:
|
|
112
|
+
- CSS scroll-snap-type: x mandatory on container
|
|
113
|
+
- scroll-snap-align: start on children
|
|
114
|
+
- Touch-friendly: native momentum scrolling
|
|
115
|
+
- Navigation dots/arrows update with IntersectionObserver
|
|
116
|
+
- Keyboard: ArrowLeft/ArrowRight navigate between items
|
|
117
|
+
|
|
118
|
+
**State Machine**:
|
|
119
|
+
```
|
|
120
|
+
[idle] --(scroll-start)--> [scrolling]
|
|
121
|
+
[scrolling] --(scroll-end)--> [snapped]
|
|
122
|
+
[snapped] --(intersection-change)--> [idle] (update active)
|
|
123
|
+
[idle] --(arrow-click)--> [navigating]
|
|
124
|
+
[navigating] --(scrollTo-complete)--> [idle]
|
|
125
|
+
[idle] --(keyboard-arrow)--> [navigating]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Browser APIs**: CSS scroll-snap, IntersectionObserver, Element.scrollTo(), Pointer Events
|
|
129
|
+
|
|
130
|
+
**Animation**:
|
|
131
|
+
- Scroll: native CSS scroll-snap (browser-handled, smooth)
|
|
132
|
+
- Active dot: scale(1) -> scale(1.3) + opacity change (200ms, ease-out)
|
|
133
|
+
- Item entry: opacity 0->1 as intersection threshold crossed (CSS transition)
|
|
134
|
+
- Arrow hover: translateX(+-2px) (150ms, ease-out)
|
|
135
|
+
|
|
136
|
+
**CSS Key Properties**:
|
|
137
|
+
```css
|
|
138
|
+
.gallery__track {
|
|
139
|
+
display: flex;
|
|
140
|
+
overflow-x: auto;
|
|
141
|
+
scroll-snap-type: x mandatory;
|
|
142
|
+
scroll-behavior: smooth;
|
|
143
|
+
-webkit-overflow-scrolling: touch;
|
|
144
|
+
scrollbar-width: none; /* Firefox */
|
|
145
|
+
}
|
|
146
|
+
.gallery__track::-webkit-scrollbar { display: none; }
|
|
147
|
+
.gallery__item {
|
|
148
|
+
scroll-snap-align: start;
|
|
149
|
+
flex: 0 0 100%; /* or 80% for peek */
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**IntersectionObserver Config**:
|
|
154
|
+
```javascript
|
|
155
|
+
new IntersectionObserver(entries => {
|
|
156
|
+
entries.forEach(entry => {
|
|
157
|
+
if (entry.isIntersecting) updateActiveItem(entry.target);
|
|
158
|
+
});
|
|
159
|
+
}, { root: trackElement, threshold: 0.5 });
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Accessibility**:
|
|
163
|
+
- role="region", aria-label="Image gallery"
|
|
164
|
+
- role="group" on each item, aria-roledescription="slide"
|
|
165
|
+
- aria-label="Slide N of M" on each item
|
|
166
|
+
- Navigation: role="tablist" on dots, role="tab" on each dot
|
|
167
|
+
- ArrowLeft/ArrowRight between items, Home/End to first/last
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Scroll Reveal Pattern
|
|
172
|
+
|
|
173
|
+
Elements animate into view as user scrolls, using IntersectionObserver with staggered delays.
|
|
174
|
+
|
|
175
|
+
**Core Interaction**:
|
|
176
|
+
- IntersectionObserver with threshold: 0.1 triggers entry animation
|
|
177
|
+
- data-reveal attribute marks revealable elements
|
|
178
|
+
- Staggered delay: index * 80ms for grouped items
|
|
179
|
+
- GPU-only: translateY(20px)->0 + opacity 0->1
|
|
180
|
+
- One-shot: element stays visible after reveal
|
|
181
|
+
|
|
182
|
+
**State Machine**:
|
|
183
|
+
```
|
|
184
|
+
[hidden] --(intersection: entering)--> [revealing]
|
|
185
|
+
[revealing] --(animation-end)--> [visible]
|
|
186
|
+
[visible] -- (terminal state, no transition out)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Browser APIs**: IntersectionObserver, CSS transitions, requestAnimationFrame
|
|
190
|
+
|
|
191
|
+
**Animation**:
|
|
192
|
+
- Entry: translateY(20px) -> translateY(0) + opacity 0->1
|
|
193
|
+
- Duration: 400ms
|
|
194
|
+
- Easing: cubic-bezier(0.16, 1, 0.3, 1)
|
|
195
|
+
- Stagger: CSS custom property `--reveal-delay: calc(var(--reveal-index) * 80ms)`
|
|
196
|
+
- Reduced motion: opacity-only crossfade (200ms)
|
|
197
|
+
|
|
198
|
+
**CSS Key Properties**:
|
|
199
|
+
```css
|
|
200
|
+
[data-reveal] {
|
|
201
|
+
opacity: 0;
|
|
202
|
+
transform: translateY(20px);
|
|
203
|
+
transition: opacity 400ms cubic-bezier(0.16, 1, 0.3, 1),
|
|
204
|
+
transform 400ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
205
|
+
transition-delay: var(--reveal-delay, 0ms);
|
|
206
|
+
}
|
|
207
|
+
[data-reveal="visible"] {
|
|
208
|
+
opacity: 1;
|
|
209
|
+
transform: translateY(0);
|
|
210
|
+
}
|
|
211
|
+
@media (prefers-reduced-motion: reduce) {
|
|
212
|
+
[data-reveal] {
|
|
213
|
+
transform: none;
|
|
214
|
+
transition: opacity 200ms ease;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**IntersectionObserver Config**:
|
|
220
|
+
```javascript
|
|
221
|
+
new IntersectionObserver(entries => {
|
|
222
|
+
entries.forEach(entry => {
|
|
223
|
+
if (entry.isIntersecting) {
|
|
224
|
+
entry.target.dataset.reveal = 'visible';
|
|
225
|
+
observer.unobserve(entry.target); // one-shot
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}, { threshold: 0.1 });
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Accessibility**:
|
|
232
|
+
- Content must be accessible in DOM before reveal (no display:none)
|
|
233
|
+
- Use opacity + transform only (content readable by screen readers at all times)
|
|
234
|
+
- aria-hidden NOT used (content is always in accessibility tree)
|
|
235
|
+
- Stagger delay < 500ms total to avoid perception of broken page
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Lens/Overlay Pattern
|
|
240
|
+
|
|
241
|
+
Magnification overlay that follows pointer position over an image or content area.
|
|
242
|
+
|
|
243
|
+
**Core Interaction**:
|
|
244
|
+
- Circular/rectangular lens follows pointer over source content
|
|
245
|
+
- Magnified view rendered via CSS transform: scale() on background
|
|
246
|
+
- Lens positioned via transform: translate() (GPU-only)
|
|
247
|
+
- Toggle on click/tap, follow on pointermove
|
|
248
|
+
|
|
249
|
+
**State Machine**:
|
|
250
|
+
```
|
|
251
|
+
[inactive] --(click/tap on source)--> [active]
|
|
252
|
+
[active] --(pointermove)--> [active] (update lens position)
|
|
253
|
+
[active] --(click/tap)--> [inactive]
|
|
254
|
+
[active] --(pointerleave)--> [inactive]
|
|
255
|
+
[active] --(Escape)--> [inactive]
|
|
256
|
+
[inactive] --(Enter/Space on source)--> [active-keyboard]
|
|
257
|
+
[active-keyboard] --(Arrow keys)--> [active-keyboard] (move lens)
|
|
258
|
+
[active-keyboard] --(Escape)--> [inactive]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Browser APIs**: Pointer Events, CSS transform, CSS clip-path/border-radius, requestAnimationFrame
|
|
262
|
+
|
|
263
|
+
**Animation**:
|
|
264
|
+
- Lens appear: opacity 0->1 + scale(0.8)->scale(1) (200ms, ease-out)
|
|
265
|
+
- Lens follow: Lerp position tracking (speed: 0.2)
|
|
266
|
+
- Lens dismiss: opacity 1->0 + scale(1)->scale(0.9) (150ms, ease-in)
|
|
267
|
+
|
|
268
|
+
**CSS Key Properties**:
|
|
269
|
+
```css
|
|
270
|
+
.lens__overlay {
|
|
271
|
+
position: absolute;
|
|
272
|
+
width: 150px;
|
|
273
|
+
height: 150px;
|
|
274
|
+
border-radius: 50%;
|
|
275
|
+
overflow: hidden;
|
|
276
|
+
pointer-events: none;
|
|
277
|
+
transform: translate(var(--lens-x), var(--lens-y));
|
|
278
|
+
will-change: transform;
|
|
279
|
+
}
|
|
280
|
+
.lens__magnified {
|
|
281
|
+
transform: scale(var(--lens-zoom, 2));
|
|
282
|
+
transform-origin: var(--lens-origin-x) var(--lens-origin-y);
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Accessibility**:
|
|
287
|
+
- Source: role="img" with descriptive aria-label
|
|
288
|
+
- Lens toggle: aria-expanded on source element
|
|
289
|
+
- Keyboard: Enter/Space to activate, Arrow keys to pan, Escape to dismiss
|
|
290
|
+
- Screen reader: aria-live="polite" announces zoom state changes
|
|
291
|
+
- Not essential content: decorative enhancement, base content always visible
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Lightbox Pattern
|
|
296
|
+
|
|
297
|
+
Full-viewport overlay for content viewing with background dim and entry animation.
|
|
298
|
+
|
|
299
|
+
**Core Interaction**:
|
|
300
|
+
- Click/tap thumbnail opens full-viewport overlay
|
|
301
|
+
- Background dim via backdrop-filter + background overlay
|
|
302
|
+
- Scale-up entry animation from thumbnail position
|
|
303
|
+
- Dismiss: click outside, Escape key, close button
|
|
304
|
+
- Focus trap: Tab cycles within lightbox
|
|
305
|
+
- Scroll lock on body while open
|
|
306
|
+
|
|
307
|
+
**State Machine**:
|
|
308
|
+
```
|
|
309
|
+
[closed] --(click thumbnail)--> [opening]
|
|
310
|
+
[opening] --(animation-end)--> [open]
|
|
311
|
+
[open] --(click-outside / Escape / close-btn)--> [closing]
|
|
312
|
+
[closing] --(animation-end)--> [closed]
|
|
313
|
+
[open] --(ArrowLeft)--> [navigating-prev]
|
|
314
|
+
[open] --(ArrowRight)--> [navigating-next]
|
|
315
|
+
[navigating-*] --(content-loaded)--> [open]
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Browser APIs**: CSS backdrop-filter, Focus trap (manual), CSS transitions, Pointer Events
|
|
319
|
+
|
|
320
|
+
**Animation**:
|
|
321
|
+
- Open: scale(0.85)->scale(1) + opacity 0->1 (300ms, cubic-bezier(0.16,1,0.3,1))
|
|
322
|
+
- Close: scale(1)->scale(0.95) + opacity 1->0 (200ms, ease-in)
|
|
323
|
+
- Backdrop: opacity 0->1 (250ms, ease-out)
|
|
324
|
+
- Navigation: translateX crossfade between items (250ms)
|
|
325
|
+
|
|
326
|
+
**CSS Key Properties**:
|
|
327
|
+
```css
|
|
328
|
+
.lightbox__backdrop {
|
|
329
|
+
position: fixed;
|
|
330
|
+
inset: 0;
|
|
331
|
+
background: rgba(0, 0, 0, 0.8);
|
|
332
|
+
backdrop-filter: blur(4px);
|
|
333
|
+
z-index: 1000;
|
|
334
|
+
}
|
|
335
|
+
.lightbox__content {
|
|
336
|
+
transform: scale(var(--lb-scale, 0.85));
|
|
337
|
+
opacity: var(--lb-opacity, 0);
|
|
338
|
+
transition: transform 300ms cubic-bezier(0.16, 1, 0.3, 1),
|
|
339
|
+
opacity 300ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
340
|
+
}
|
|
341
|
+
.lightbox--open .lightbox__content {
|
|
342
|
+
--lb-scale: 1;
|
|
343
|
+
--lb-opacity: 1;
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Focus Trap Implementation**:
|
|
348
|
+
```javascript
|
|
349
|
+
// On open: store trigger, move focus to first focusable in lightbox
|
|
350
|
+
// On Tab: cycle within lightbox (first <-> last focusable)
|
|
351
|
+
// On close: restore focus to original trigger element
|
|
352
|
+
// Prevent body scroll: document.body.style.overflow = 'hidden'
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Accessibility**:
|
|
356
|
+
- role="dialog", aria-modal="true", aria-label="Image viewer"
|
|
357
|
+
- Close button: aria-label="Close lightbox"
|
|
358
|
+
- Focus trap: Tab cycles within dialog
|
|
359
|
+
- Escape dismisses
|
|
360
|
+
- ArrowLeft/ArrowRight for gallery navigation
|
|
361
|
+
- aria-live="polite" announces current item "Image N of M"
|
|
362
|
+
- Scroll lock: prevent background scroll while open
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Pipeline Definitions
|
|
2
|
+
|
|
3
|
+
Interactive craft pipeline modes and task registry.
|
|
4
|
+
|
|
5
|
+
## Pipeline Modes
|
|
6
|
+
|
|
7
|
+
| Mode | Description | Task Count |
|
|
8
|
+
|------|-------------|------------|
|
|
9
|
+
| single | Single component: research -> interaction design -> build -> a11y test | 4 tasks |
|
|
10
|
+
| gallery | Gallery: base component + scroll container, two build phases | 6 tasks |
|
|
11
|
+
| page | Full page: parallel component builds after single interaction design | 3 + N tasks |
|
|
12
|
+
|
|
13
|
+
## Single Pipeline Task Registry
|
|
14
|
+
|
|
15
|
+
| Task ID | Role | blockedBy | Description |
|
|
16
|
+
|---------|------|-----------|-------------|
|
|
17
|
+
| RESEARCH-001 | researcher | [] | Interaction inventory, browser API audit, pattern reference |
|
|
18
|
+
| INTERACT-001 | interaction-designer | [RESEARCH-001] | State machine, event flow, gesture spec, animation choreography |
|
|
19
|
+
| BUILD-001 | builder | [INTERACT-001] | Vanilla JS + CSS component: ES module, GPU animations, touch-aware |
|
|
20
|
+
| A11Y-001 | a11y-tester | [BUILD-001] | Keyboard, screen reader, reduced motion, focus, contrast audit |
|
|
21
|
+
|
|
22
|
+
## Gallery Pipeline Task Registry
|
|
23
|
+
|
|
24
|
+
| Task ID | Role | blockedBy | Description |
|
|
25
|
+
|---------|------|-----------|-------------|
|
|
26
|
+
| RESEARCH-001 | researcher | [] | Interaction patterns for base component + gallery container |
|
|
27
|
+
| INTERACT-001 | interaction-designer | [RESEARCH-001] | Base component interaction blueprint |
|
|
28
|
+
| BUILD-001 | builder | [INTERACT-001] | Base component implementation |
|
|
29
|
+
| INTERACT-002 | interaction-designer | [BUILD-001] | Gallery/scroll-snap container blueprint |
|
|
30
|
+
| BUILD-002 | builder | [INTERACT-002] | Gallery container + navigation implementation |
|
|
31
|
+
| A11Y-001 | a11y-tester | [BUILD-002] | Full gallery accessibility audit |
|
|
32
|
+
|
|
33
|
+
## Page Pipeline Task Registry
|
|
34
|
+
|
|
35
|
+
| Task ID | Role | blockedBy | Description |
|
|
36
|
+
|---------|------|-----------|-------------|
|
|
37
|
+
| RESEARCH-001 | researcher | [] | Interaction patterns for all page sections |
|
|
38
|
+
| INTERACT-001 | interaction-designer | [RESEARCH-001] | Blueprints for all interactive sections |
|
|
39
|
+
| BUILD-001 | builder | [INTERACT-001] | Section 1 component |
|
|
40
|
+
| BUILD-002 | builder | [INTERACT-001] | Section 2 component |
|
|
41
|
+
| ... | builder | [INTERACT-001] | Additional sections (parallel) |
|
|
42
|
+
| BUILD-00N | builder | [INTERACT-001] | Section N component |
|
|
43
|
+
| A11Y-001 | a11y-tester | [BUILD-001..N] | Full page accessibility audit |
|
|
44
|
+
|
|
45
|
+
## Quality Gate (A11y Checkpoint)
|
|
46
|
+
|
|
47
|
+
| Checkpoint | Task | Condition | Action |
|
|
48
|
+
|------------|------|-----------|--------|
|
|
49
|
+
| A11Y Gate | A11Y-001 completes | 0 critical, 0 high | Pipeline complete |
|
|
50
|
+
| A11Y GC Loop | A11Y-* completes | Critical or high issues | Create BUILD-fix task, new A11Y task (max 2 rounds) |
|
|
51
|
+
|
|
52
|
+
## GC Loop Behavior
|
|
53
|
+
|
|
54
|
+
| Signal | Condition | Action |
|
|
55
|
+
|--------|-----------|--------|
|
|
56
|
+
| a11y_passed | 0 critical, 0 high | GC converged -> pipeline complete |
|
|
57
|
+
| a11y_result | 0 critical, high > 0 | gc_rounds < max -> create BUILD-fix task |
|
|
58
|
+
| fix_required | critical > 0 | gc_rounds < max -> create BUILD-fix task (CRITICAL) |
|
|
59
|
+
| Any | gc_rounds >= max | Escalate to user: accept / try one more / terminate |
|
|
60
|
+
|
|
61
|
+
## Parallel Spawn Rules
|
|
62
|
+
|
|
63
|
+
| Mode | After | Spawn Behavior |
|
|
64
|
+
|------|-------|----------------|
|
|
65
|
+
| single | Sequential | One task at a time |
|
|
66
|
+
| gallery | Sequential | One task at a time |
|
|
67
|
+
| page | INTERACT-001 | Spawn BUILD-001..N in parallel (CP-3 fan-out) |
|
|
68
|
+
| page | All BUILD complete | Spawn A11Y-001 |
|
|
69
|
+
|
|
70
|
+
## Collaboration Patterns
|
|
71
|
+
|
|
72
|
+
| Pattern | Roles | Description |
|
|
73
|
+
|---------|-------|-------------|
|
|
74
|
+
| CP-1 Linear Pipeline | All | Base sequential flow for single/gallery modes |
|
|
75
|
+
| CP-2 Review-Fix | builder <-> a11y-tester | GC loop with max 2 rounds |
|
|
76
|
+
| CP-3 Parallel Fan-out | builder (multiple) | Page mode: multiple BUILD tasks in parallel |
|
|
77
|
+
|
|
78
|
+
## Output Artifacts
|
|
79
|
+
|
|
80
|
+
| Task | Output Path |
|
|
81
|
+
|------|-------------|
|
|
82
|
+
| RESEARCH-001 | <session>/research/*.json |
|
|
83
|
+
| INTERACT-* | <session>/interaction/blueprints/*.md |
|
|
84
|
+
| BUILD-* | <session>/build/components/*.js + *.css |
|
|
85
|
+
| A11Y-* | <session>/a11y/a11y-audit-*.md |
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"team_name": "interactive-craft",
|
|
3
|
+
"team_display_name": "Interactive Craft",
|
|
4
|
+
"description": "Interactive component team with vanilla JS + CSS. Research -> interaction design -> build -> a11y test.",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
|
|
7
|
+
"roles": {
|
|
8
|
+
"coordinator": {
|
|
9
|
+
"task_prefix": null,
|
|
10
|
+
"responsibility": "Scope assessment, pipeline orchestration, GC loop control between builder and a11y-tester",
|
|
11
|
+
"message_types": ["task_unblocked", "a11y_checkpoint", "fix_required", "error", "shutdown"]
|
|
12
|
+
},
|
|
13
|
+
"researcher": {
|
|
14
|
+
"task_prefix": "RESEARCH",
|
|
15
|
+
"responsibility": "Interaction pattern analysis, browser API audit, reference pattern collection",
|
|
16
|
+
"message_types": ["research_ready", "research_progress", "error"]
|
|
17
|
+
},
|
|
18
|
+
"interaction-designer": {
|
|
19
|
+
"task_prefix": "INTERACT",
|
|
20
|
+
"responsibility": "State machine design, event flow mapping, gesture specification, animation choreography",
|
|
21
|
+
"message_types": ["blueprint_ready", "blueprint_revision", "blueprint_progress", "error"]
|
|
22
|
+
},
|
|
23
|
+
"builder": {
|
|
24
|
+
"task_prefix": "BUILD",
|
|
25
|
+
"inner_loop": true,
|
|
26
|
+
"responsibility": "Vanilla JS + CSS component implementation, progressive enhancement, GPU-only animations",
|
|
27
|
+
"message_types": ["build_ready", "build_revision", "build_progress", "error"]
|
|
28
|
+
},
|
|
29
|
+
"a11y-tester": {
|
|
30
|
+
"task_prefix": "A11Y",
|
|
31
|
+
"responsibility": "Keyboard navigation, screen reader, reduced motion, focus management, contrast testing",
|
|
32
|
+
"message_types": ["a11y_passed", "a11y_result", "fix_required", "error"]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
"pipelines": {
|
|
37
|
+
"single": {
|
|
38
|
+
"description": "Single component: research -> interaction design -> build -> a11y test",
|
|
39
|
+
"task_chain": ["RESEARCH-001", "INTERACT-001", "BUILD-001", "A11Y-001"],
|
|
40
|
+
"complexity": "low"
|
|
41
|
+
},
|
|
42
|
+
"gallery": {
|
|
43
|
+
"description": "Gallery with base component + scroll container: two build phases",
|
|
44
|
+
"task_chain": [
|
|
45
|
+
"RESEARCH-001",
|
|
46
|
+
"INTERACT-001", "BUILD-001",
|
|
47
|
+
"INTERACT-002", "BUILD-002",
|
|
48
|
+
"A11Y-001"
|
|
49
|
+
],
|
|
50
|
+
"complexity": "medium"
|
|
51
|
+
},
|
|
52
|
+
"page": {
|
|
53
|
+
"description": "Full interactive page with parallel component builds",
|
|
54
|
+
"task_chain": [
|
|
55
|
+
"RESEARCH-001",
|
|
56
|
+
"INTERACT-001",
|
|
57
|
+
"BUILD-001..N (parallel)",
|
|
58
|
+
"A11Y-001"
|
|
59
|
+
],
|
|
60
|
+
"parallel_stage": "BUILD-001..N",
|
|
61
|
+
"complexity": "high"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
"innovation_patterns": {
|
|
66
|
+
"generator_critic": {
|
|
67
|
+
"generator": "builder",
|
|
68
|
+
"critic": "a11y-tester",
|
|
69
|
+
"max_rounds": 2,
|
|
70
|
+
"convergence": "a11y.critical_count === 0 && a11y.high_count === 0",
|
|
71
|
+
"escalation": "Coordinator intervenes after max rounds"
|
|
72
|
+
},
|
|
73
|
+
"shared_memory": {
|
|
74
|
+
"file": "shared-memory.json",
|
|
75
|
+
"fields": {
|
|
76
|
+
"researcher": ["interaction_inventory", "browser_apis"],
|
|
77
|
+
"interaction-designer": ["state_machines", "event_flows"],
|
|
78
|
+
"builder": ["component_registry", "implementation_decisions"],
|
|
79
|
+
"a11y-tester": ["audit_history"]
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"dynamic_pipeline": {
|
|
83
|
+
"criteria": {
|
|
84
|
+
"single": "scope.component_count <= 1",
|
|
85
|
+
"gallery": "scope.has_gallery || scope.has_scroll_collection",
|
|
86
|
+
"page": "scope.is_full_page || scope.section_count > 2"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"parallel_fanout": {
|
|
90
|
+
"pattern": "CP-3",
|
|
91
|
+
"description": "Multiple BUILD tasks spawned in parallel after single INTERACT blueprint",
|
|
92
|
+
"trigger": "page mode after INTERACT-001 completes",
|
|
93
|
+
"fallback": "If parallel fails, coordinator falls back to sequential execution"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
"session_dirs": {
|
|
98
|
+
"base": ".workflow/.team/IC-{slug}-{YYYY-MM-DD}/",
|
|
99
|
+
"research": "research/",
|
|
100
|
+
"interaction": "interaction/blueprints/",
|
|
101
|
+
"build": "build/components/",
|
|
102
|
+
"a11y": "a11y/",
|
|
103
|
+
"messages": ".workflow/.team-msg/{team-name}/"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Vanilla Constraints
|
|
2
|
+
|
|
3
|
+
Zero-dependency rules for all interactive components built by this team. These constraints are non-negotiable and apply to every BUILD task output.
|
|
4
|
+
|
|
5
|
+
## Dependency Rules
|
|
6
|
+
|
|
7
|
+
| Rule | Requirement |
|
|
8
|
+
|------|-------------|
|
|
9
|
+
| No npm packages | Zero `import` from node_modules or CDN URLs |
|
|
10
|
+
| No build tools required | Components run directly via `<script type="module">` |
|
|
11
|
+
| No framework dependency | No React, Vue, Svelte, Angular, jQuery, etc. |
|
|
12
|
+
| No CSS preprocessor | No Sass, Less, PostCSS, Tailwind -- pure CSS only |
|
|
13
|
+
| No bundler required | No webpack, Vite, Rollup, esbuild in critical path |
|
|
14
|
+
|
|
15
|
+
## JavaScript Rules
|
|
16
|
+
|
|
17
|
+
| Rule | Requirement |
|
|
18
|
+
|------|-------------|
|
|
19
|
+
| ES modules only | `export class`, `export function`, `import` syntax |
|
|
20
|
+
| Class-based components | Private fields (#), constructor(element, options) |
|
|
21
|
+
| No inline styles from JS | Set CSS custom properties or toggle CSS classes |
|
|
22
|
+
| No document.write | Use DOM APIs (createElement, append, etc.) |
|
|
23
|
+
| No eval or innerHTML | Use textContent or DOM construction |
|
|
24
|
+
| requestAnimationFrame | All animation loops use rAF, not setInterval |
|
|
25
|
+
| Pointer Events primary | Use pointer events; touch events as fallback only |
|
|
26
|
+
| Cleanup required | destroy() method disconnects all observers/listeners |
|
|
27
|
+
| Auto-init pattern | `document.querySelectorAll('[data-component]')` on load |
|
|
28
|
+
|
|
29
|
+
## CSS Rules
|
|
30
|
+
|
|
31
|
+
| Rule | Requirement |
|
|
32
|
+
|------|-------------|
|
|
33
|
+
| Custom properties | All configurable values as CSS custom properties |
|
|
34
|
+
| No inline styles | JS sets `--custom-prop` values, not style.left/top |
|
|
35
|
+
| State via data attributes | `[data-state="active"]`, not inline style changes |
|
|
36
|
+
| GPU-only animations | `transform` and `opacity` ONLY in transitions/animations |
|
|
37
|
+
| No layout animations | Never animate `width`, `height`, `top`, `left`, `margin`, `padding` |
|
|
38
|
+
| will-change on animated | Hint browser for animated elements |
|
|
39
|
+
| Reduced motion | `@media (prefers-reduced-motion: reduce)` with instant fallback |
|
|
40
|
+
| focus-visible | `:focus-visible` for keyboard-only focus indicators |
|
|
41
|
+
| Responsive | Min touch target 44x44px on mobile, use @media breakpoints |
|
|
42
|
+
|
|
43
|
+
## Progressive Enhancement
|
|
44
|
+
|
|
45
|
+
| Rule | Requirement |
|
|
46
|
+
|------|-------------|
|
|
47
|
+
| Content without JS | Base content visible and readable without JavaScript |
|
|
48
|
+
| CSS-only fallback | Essential layout works with CSS alone |
|
|
49
|
+
| No-JS class | Optional `[data-js-enabled]` class for JS-enhanced styles |
|
|
50
|
+
| Semantic HTML base | Use appropriate elements (button, a, nav, dialog) |
|
|
51
|
+
|
|
52
|
+
## Performance Budget
|
|
53
|
+
|
|
54
|
+
| Metric | Budget |
|
|
55
|
+
|--------|--------|
|
|
56
|
+
| Frame time | < 5ms per frame (leaves room for browser work in 16ms budget) |
|
|
57
|
+
| Interaction response | < 50ms from input to visual feedback |
|
|
58
|
+
| Animation jank | 0 frames dropped at 60fps for GPU-composited animations |
|
|
59
|
+
| Observer callbacks | < 1ms per IntersectionObserver/ResizeObserver callback |
|
|
60
|
+
| Component init | < 100ms from constructor to interactive |
|
|
61
|
+
| Memory | No detached DOM nodes after destroy() |
|
|
62
|
+
| Listeners | All removed in destroy(), no orphaned listeners |
|
|
63
|
+
|
|
64
|
+
## Forbidden Patterns
|
|
65
|
+
|
|
66
|
+
| Pattern | Why |
|
|
67
|
+
|---------|-----|
|
|
68
|
+
| `element.style.left = ...` | Forces layout recalc, not GPU composited |
|
|
69
|
+
| `element.offsetWidth` in animation loop | Forces synchronous layout (reflow) |
|
|
70
|
+
| `setInterval` for animation | Not synced to display refresh rate |
|
|
71
|
+
| `setTimeout` for animation | Not synced to display refresh rate |
|
|
72
|
+
| `innerHTML = userContent` | XSS vector |
|
|
73
|
+
| Passive: false on scroll/touch without need | Blocks scrolling performance |
|
|
74
|
+
| `!important` in component CSS | Breaks cascade, unmaintainable |
|
|
75
|
+
| Global CSS selectors (tag-only) | Leaks styles outside component scope |
|
|
76
|
+
|
|
77
|
+
## File Output Convention
|
|
78
|
+
|
|
79
|
+
| File | Purpose | Location |
|
|
80
|
+
|------|---------|----------|
|
|
81
|
+
| `{name}.js` | ES module component class | `<session>/build/components/` |
|
|
82
|
+
| `{name}.css` | Component styles with custom properties | `<session>/build/components/` |
|
|
83
|
+
| `demo.html` | Optional: standalone demo page | `<session>/build/components/` |
|