hoomanjs 1.46.0 → 1.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -18
- package/dist/acp/acp-agent.d.ts +42 -0
- package/dist/acp/acp-agent.js +336 -47
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/approvals.js +11 -10
- package/dist/acp/approvals.js.map +1 -1
- package/dist/acp/browser.d.ts +9 -0
- package/dist/acp/browser.js +23 -0
- package/dist/acp/browser.js.map +1 -0
- package/dist/acp/meta/vscode.d.ts +8 -7
- package/dist/acp/meta/vscode.js +10 -11
- package/dist/acp/meta/vscode.js.map +1 -1
- package/dist/acp/session-config.d.ts +2 -2
- package/dist/acp/session-config.js +24 -20
- package/dist/acp/session-config.js.map +1 -1
- package/dist/acp/sessions/store.d.ts +3 -3
- package/dist/acp/utils/tool-kind.js +8 -6
- package/dist/acp/utils/tool-kind.js.map +1 -1
- package/dist/chat/app.js +91 -11
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/approvals.js +3 -0
- package/dist/chat/approvals.js.map +1 -1
- package/dist/chat/components/ApprovalPrompt.js +15 -25
- package/dist/chat/components/ApprovalPrompt.js.map +1 -1
- package/dist/chat/components/BackgroundJobsPanel.d.ts +10 -0
- package/dist/chat/components/BackgroundJobsPanel.js +15 -0
- package/dist/chat/components/BackgroundJobsPanel.js.map +1 -0
- package/dist/chat/components/BottomChrome.d.ts +6 -1
- package/dist/chat/components/BottomChrome.js +3 -2
- package/dist/chat/components/BottomChrome.js.map +1 -1
- package/dist/chat/components/ChromePicker.d.ts +7 -2
- package/dist/chat/components/ChromePicker.js +18 -2
- package/dist/chat/components/ChromePicker.js.map +1 -1
- package/dist/chat/components/Composer.js +3 -2
- package/dist/chat/components/Composer.js.map +1 -1
- package/dist/chat/components/DownloadPanel.js +2 -1
- package/dist/chat/components/DownloadPanel.js.map +1 -1
- package/dist/chat/components/EmptyChatBanner.js +2 -1
- package/dist/chat/components/EmptyChatBanner.js.map +1 -1
- package/dist/chat/components/PromptInput.js +2 -1
- package/dist/chat/components/PromptInput.js.map +1 -1
- package/dist/chat/components/QuestionPrompt.js +5 -4
- package/dist/chat/components/QuestionPrompt.js.map +1 -1
- package/dist/chat/components/QueuedPrompts.js +3 -2
- package/dist/chat/components/QueuedPrompts.js.map +1 -1
- package/dist/chat/components/ReasoningStrip.js +2 -1
- package/dist/chat/components/ReasoningStrip.js.map +1 -1
- package/dist/chat/components/RetryEvent.js +2 -1
- package/dist/chat/components/RetryEvent.js.map +1 -1
- package/dist/chat/components/SelectPicker.js +2 -1
- package/dist/chat/components/SelectPicker.js.map +1 -1
- package/dist/chat/components/ShellToolEvent.d.ts +12 -0
- package/dist/chat/components/ShellToolEvent.js +94 -0
- package/dist/chat/components/ShellToolEvent.js.map +1 -0
- package/dist/chat/components/SlashCommands.js +2 -1
- package/dist/chat/components/SlashCommands.js.map +1 -1
- package/dist/chat/components/Spinner.js +2 -1
- package/dist/chat/components/Spinner.js.map +1 -1
- package/dist/chat/components/StatusBar.js +19 -15
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/chat/components/ThinkingStatus.js +2 -1
- package/dist/chat/components/ThinkingStatus.js.map +1 -1
- package/dist/chat/components/ThoughtEvent.js +2 -1
- package/dist/chat/components/ThoughtEvent.js.map +1 -1
- package/dist/chat/components/TodoPanel.js +2 -1
- package/dist/chat/components/TodoPanel.js.map +1 -1
- package/dist/chat/components/ToolEvent.d.ts +2 -1
- package/dist/chat/components/ToolEvent.js +9 -2
- package/dist/chat/components/ToolEvent.js.map +1 -1
- package/dist/chat/components/ToolEventFileResult.js +8 -7
- package/dist/chat/components/ToolEventFileResult.js.map +1 -1
- package/dist/chat/components/Transcript.d.ts +4 -2
- package/dist/chat/components/Transcript.js +4 -4
- package/dist/chat/components/Transcript.js.map +1 -1
- package/dist/chat/components/markdown/BlockRenderer.js +3 -2
- package/dist/chat/components/markdown/BlockRenderer.js.map +1 -1
- package/dist/chat/components/markdown/CodeBlock.js +3 -2
- package/dist/chat/components/markdown/CodeBlock.js.map +1 -1
- package/dist/chat/components/markdown/InlineRenderer.js +6 -5
- package/dist/chat/components/markdown/InlineRenderer.js.map +1 -1
- package/dist/chat/components/shared.js +7 -6
- package/dist/chat/components/shared.js.map +1 -1
- package/dist/chat/types.d.ts +7 -0
- package/dist/cli.js +162 -44
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.js +46 -29
- package/dist/configure/app.js.map +1 -1
- package/dist/configure/components/BusyScreen.js +2 -1
- package/dist/configure/components/BusyScreen.js.map +1 -1
- package/dist/configure/components/MenuScreen.js +3 -2
- package/dist/configure/components/MenuScreen.js.map +1 -1
- package/dist/configure/components/PromptForm.js +2 -1
- package/dist/configure/components/PromptForm.js.map +1 -1
- package/dist/configure/components/SelectMenuItem.js +4 -3
- package/dist/configure/components/SelectMenuItem.js.map +1 -1
- package/dist/configure/utils.js +4 -3
- package/dist/configure/utils.js.map +1 -1
- package/dist/core/agent/default-retry-strategy.js +46 -12
- package/dist/core/agent/default-retry-strategy.js.map +1 -1
- package/dist/core/agent/gitignore-guard-plugin.js +17 -2
- package/dist/core/agent/gitignore-guard-plugin.js.map +1 -1
- package/dist/core/agent/index.js +38 -7
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/approvals/allowlist.js +1 -0
- package/dist/core/approvals/allowlist.js.map +1 -1
- package/dist/core/approvals/intervention.d.ts +10 -2
- package/dist/core/approvals/intervention.js +46 -8
- package/dist/core/approvals/intervention.js.map +1 -1
- package/dist/core/config.d.ts +9 -2
- package/dist/core/config.js +8 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/mcp/oauth/service.js +2 -2
- package/dist/core/mcp/oauth/service.js.map +1 -1
- package/dist/core/models/bedrock.js +6 -0
- package/dist/core/models/bedrock.js.map +1 -1
- package/dist/core/models/groq.js +34 -14
- package/dist/core/models/groq.js.map +1 -1
- package/dist/core/models/minimax.js +1 -1
- package/dist/core/models/minimax.js.map +1 -1
- package/dist/core/models/types.d.ts +10 -2
- package/dist/core/models/types.js +1 -0
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/modes/definitions.d.ts +4 -2
- package/dist/core/modes/definitions.js +77 -9
- package/dist/core/modes/definitions.js.map +1 -1
- package/dist/core/modes/index.d.ts +1 -1
- package/dist/core/modes/index.js +1 -1
- package/dist/core/modes/index.js.map +1 -1
- package/dist/core/modes/registry.js +4 -9
- package/dist/core/modes/registry.js.map +1 -1
- package/dist/core/modes/schema.d.ts +1 -1
- package/dist/core/modes/schema.js +1 -1
- package/dist/core/modes/schema.js.map +1 -1
- package/dist/core/prompts/agents/{review.md → code-review.md} +2 -2
- package/dist/core/prompts/agents/design-review.md +35 -0
- package/dist/core/prompts/agents/{test-investigator.md → quality-analyst.md} +2 -2
- package/dist/core/prompts/modes/agent.md +2 -0
- package/dist/core/prompts/modes/ask.md +2 -2
- package/dist/core/prompts/modes/design.md +37 -0
- package/dist/core/prompts/modes/plan.md +5 -5
- package/dist/core/prompts/{runtime.js → runtime/agents.js} +2 -2
- package/dist/core/prompts/runtime/agents.js.map +1 -0
- package/dist/core/prompts/runtime/design.d.ts +11 -0
- package/dist/core/prompts/runtime/design.js +78 -0
- package/dist/core/prompts/runtime/design.js.map +1 -0
- package/dist/core/prompts/{session-mode-appendix.js → session-mode.js} +1 -1
- package/dist/core/prompts/session-mode.js.map +1 -0
- package/dist/core/prompts/static/ask-user.md +3 -2
- package/dist/core/prompts/static/fetch.md +2 -1
- package/dist/core/prompts/static/filesystem.md +2 -1
- package/dist/core/prompts/static/shell.md +21 -1
- package/dist/core/prompts/static/subagents.md +2 -1
- package/dist/core/prompts/static/switch-mode.md +10 -0
- package/dist/core/prompts/system.d.ts +1 -0
- package/dist/core/prompts/system.js +11 -3
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/shell/index.d.ts +7 -0
- package/dist/core/shell/index.js +6 -0
- package/dist/core/shell/index.js.map +1 -0
- package/dist/core/shell/manager.d.ts +23 -0
- package/dist/core/shell/manager.js +604 -0
- package/dist/core/shell/manager.js.map +1 -0
- package/dist/core/shell/output-buffer.d.ts +30 -0
- package/dist/core/shell/output-buffer.js +116 -0
- package/dist/core/shell/output-buffer.js.map +1 -0
- package/dist/core/shell/registry.d.ts +5 -0
- package/dist/core/shell/registry.js +24 -0
- package/dist/core/shell/registry.js.map +1 -0
- package/dist/core/{tools/shell.d.ts → shell/terminal-backend.d.ts} +20 -18
- package/dist/core/shell/terminal-backend.js +18 -0
- package/dist/core/shell/terminal-backend.js.map +1 -0
- package/dist/core/shell/tools.d.ts +41 -0
- package/dist/core/{tools/shell.js → shell/tools.js} +186 -11
- package/dist/core/shell/tools.js.map +1 -0
- package/dist/core/shell/types.d.ts +95 -0
- package/dist/core/shell/types.js +2 -0
- package/dist/core/shell/types.js.map +1 -0
- package/dist/core/skills/built-in/hooman-config/SKILL.md +30 -35
- package/dist/core/skills/built-in/hooman-config/search.md +5 -3
- package/dist/core/skills/built-in/hooman-design/SKILL.md +97 -0
- package/dist/core/skills/built-in/hooman-design/assets/article-shell.html +87 -0
- package/dist/core/skills/built-in/hooman-design/assets/auth-shell.html +143 -0
- package/dist/core/skills/built-in/hooman-design/assets/business-card-shell.html +112 -0
- package/dist/core/skills/built-in/hooman-design/assets/contact-shell.html +181 -0
- package/dist/core/skills/built-in/hooman-design/assets/dashboard-shell.html +90 -0
- package/dist/core/skills/built-in/hooman-design/assets/data-table-shell.html +114 -0
- package/dist/core/skills/built-in/hooman-design/assets/deck-shell.html +187 -0
- package/dist/core/skills/built-in/hooman-design/assets/dialog-shell.html +98 -0
- package/dist/core/skills/built-in/hooman-design/assets/email-shell.html +101 -0
- package/dist/core/skills/built-in/hooman-design/assets/empty-state-shell.html +92 -0
- package/dist/core/skills/built-in/hooman-design/assets/flyer-shell.html +168 -0
- package/dist/core/skills/built-in/hooman-design/assets/invite-shell.html +167 -0
- package/dist/core/skills/built-in/hooman-design/assets/landing-shell.html +184 -0
- package/dist/core/skills/built-in/hooman-design/assets/mobile-frame-shell.html +109 -0
- package/dist/core/skills/built-in/hooman-design/assets/newsletter-shell.html +141 -0
- package/dist/core/skills/built-in/hooman-design/assets/onboarding-shell.html +131 -0
- package/dist/core/skills/built-in/hooman-design/assets/pricing-shell.html +160 -0
- package/dist/core/skills/built-in/hooman-design/assets/prototype-shell.html +83 -0
- package/dist/core/skills/built-in/hooman-design/assets/resume-shell.html +228 -0
- package/dist/core/skills/built-in/hooman-design/assets/settings-shell.html +196 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/botanical-calm.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/copper-ledger.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/editorial-ink.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/fintech-clear.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/harbor-navy.css +35 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/midnight-editorial.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/night-console.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/paper-mono.css +35 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/signal-mono.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/soft-product.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/swiss-grid.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/warm-atelier.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/waitlist-shell.html +139 -0
- package/dist/core/skills/built-in/hooman-design/craft/accessibility-baseline.md +32 -0
- package/dist/core/skills/built-in/hooman-design/craft/anti-ai-slop.md +27 -0
- package/dist/core/skills/built-in/hooman-design/craft/color-surfaces.md +45 -0
- package/dist/core/skills/built-in/hooman-design/craft/data-viz.md +24 -0
- package/dist/core/skills/built-in/hooman-design/craft/deck-slides.md +46 -0
- package/dist/core/skills/built-in/hooman-design/craft/forms-validation.md +35 -0
- package/dist/core/skills/built-in/hooman-design/craft/iconography.md +19 -0
- package/dist/core/skills/built-in/hooman-design/craft/layout-overflow.md +31 -0
- package/dist/core/skills/built-in/hooman-design/craft/motion.md +41 -0
- package/dist/core/skills/built-in/hooman-design/craft/print.md +37 -0
- package/dist/core/skills/built-in/hooman-design/craft/responsive.md +30 -0
- package/dist/core/skills/built-in/hooman-design/craft/spacing-density.md +46 -0
- package/dist/core/skills/built-in/hooman-design/craft/state-coverage.md +21 -0
- package/dist/core/skills/built-in/hooman-design/craft/typography.md +73 -0
- package/dist/core/skills/built-in/hooman-design/directions.md +115 -0
- package/dist/core/skills/built-in/hooman-design/references/artifact-layout.md +15 -0
- package/dist/core/skills/built-in/hooman-design/references/export.md +47 -0
- package/dist/core/skills/built-in/hooman-design/references/workflow.md +80 -0
- package/dist/core/skills/built-in/hooman-mcp/SKILL.md +2 -2
- package/dist/core/state/llm-modality.d.ts +13 -0
- package/dist/core/state/llm-modality.js +19 -0
- package/dist/core/state/llm-modality.js.map +1 -0
- package/dist/core/state/plan.d.ts +1 -1
- package/dist/core/state/plan.js +1 -1
- package/dist/core/state/shell-jobs.d.ts +9 -0
- package/dist/core/state/shell-jobs.js +20 -0
- package/dist/core/state/shell-jobs.js.map +1 -0
- package/dist/core/state/tool-approvals.d.ts +12 -9
- package/dist/core/state/tool-approvals.js +94 -52
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/state/turn-boundaries.d.ts +33 -0
- package/dist/core/state/turn-boundaries.js +49 -0
- package/dist/core/state/turn-boundaries.js.map +1 -0
- package/dist/core/subagents/index.d.ts +1 -1
- package/dist/core/subagents/index.js +1 -1
- package/dist/core/subagents/registry.js +15 -6
- package/dist/core/subagents/registry.js.map +1 -1
- package/dist/core/subagents/tool.d.ts +8 -2
- package/dist/core/subagents/tool.js +93 -44
- package/dist/core/subagents/tool.js.map +1 -1
- package/dist/core/theme.d.ts +14 -0
- package/dist/core/theme.js +14 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/tools/ask-user.d.ts +1 -1
- package/dist/core/tools/ask-user.js +1 -1
- package/dist/core/tools/export.d.ts +8 -0
- package/dist/core/tools/export.js +202 -0
- package/dist/core/tools/export.js.map +1 -0
- package/dist/core/tools/fetch.d.ts +2 -0
- package/dist/core/tools/fetch.js +92 -55
- package/dist/core/tools/fetch.js.map +1 -1
- package/dist/core/tools/filesystem.d.ts +2 -1
- package/dist/core/tools/filesystem.js +38 -4
- package/dist/core/tools/filesystem.js.map +1 -1
- package/dist/core/tools/index.d.ts +3 -2
- package/dist/core/tools/index.js +3 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/preview.d.ts +10 -0
- package/dist/core/tools/preview.js +147 -0
- package/dist/core/tools/preview.js.map +1 -0
- package/dist/core/tools/switch-mode.d.ts +6 -0
- package/dist/core/tools/switch-mode.js +188 -0
- package/dist/core/tools/switch-mode.js.map +1 -0
- package/dist/core/tools/web-search.js +176 -0
- package/dist/core/tools/web-search.js.map +1 -1
- package/dist/core/utils/browser.d.ts +8 -1
- package/dist/core/utils/browser.js +17 -1
- package/dist/core/utils/browser.js.map +1 -1
- package/dist/core/utils/export-design.d.ts +40 -0
- package/dist/core/utils/export-design.js +188 -0
- package/dist/core/utils/export-design.js.map +1 -0
- package/dist/core/utils/export-figma.d.ts +17 -0
- package/dist/core/utils/export-figma.js +189 -0
- package/dist/core/utils/export-figma.js.map +1 -0
- package/dist/core/utils/export-sketch.d.ts +11 -0
- package/dist/core/utils/export-sketch.js +456 -0
- package/dist/core/utils/export-sketch.js.map +1 -0
- package/dist/core/utils/fig-archive.d.ts +47 -0
- package/dist/core/utils/fig-archive.js +181 -0
- package/dist/core/utils/fig-archive.js.map +1 -0
- package/dist/core/utils/metadata.d.ts +30 -0
- package/dist/core/utils/metadata.js +122 -0
- package/dist/core/utils/metadata.js.map +1 -1
- package/dist/core/utils/models-prefetch.d.ts +53 -0
- package/dist/core/utils/models-prefetch.js +469 -0
- package/dist/core/utils/models-prefetch.js.map +1 -0
- package/dist/core/utils/onboarding-config.d.ts +48 -0
- package/dist/core/utils/onboarding-config.js +373 -0
- package/dist/core/utils/onboarding-config.js.map +1 -0
- package/dist/core/utils/paths.d.ts +9 -7
- package/dist/core/utils/paths.js +12 -10
- package/dist/core/utils/paths.js.map +1 -1
- package/dist/core/utils/preview-server.d.ts +20 -0
- package/dist/core/utils/preview-server.js +212 -0
- package/dist/core/utils/preview-server.js.map +1 -0
- package/dist/core/utils/search-probe.d.ts +19 -0
- package/dist/core/utils/search-probe.js +165 -0
- package/dist/core/utils/search-probe.js.map +1 -0
- package/dist/core/utils/seeds/empty-slides.deck +0 -0
- package/dist/core/utils/url-safety.d.ts +2 -0
- package/dist/core/utils/url-safety.js +47 -0
- package/dist/core/utils/url-safety.js.map +1 -0
- package/dist/core/utils/zstd.d.ts +6 -0
- package/dist/core/utils/zstd.js +39 -0
- package/dist/core/utils/zstd.js.map +1 -0
- package/dist/exec/approvals.js +5 -5
- package/dist/exec/approvals.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/onboarding/app.d.ts +5 -0
- package/dist/onboarding/app.js +255 -0
- package/dist/onboarding/app.js.map +1 -0
- package/dist/onboarding/index.d.ts +5 -0
- package/dist/onboarding/index.js +27 -0
- package/dist/onboarding/index.js.map +1 -0
- package/package.json +16 -3
- package/dist/core/prompts/runtime.js.map +0 -1
- package/dist/core/prompts/session-mode-appendix.js.map +0 -1
- package/dist/core/prompts/static/planning.md +0 -3
- package/dist/core/tools/plan.d.ts +0 -5
- package/dist/core/tools/plan.js +0 -150
- package/dist/core/tools/plan.js.map +0 -1
- package/dist/core/tools/shell.js.map +0 -1
- /package/dist/core/prompts/{runtime.d.ts → runtime/agents.d.ts} +0 -0
- /package/dist/core/prompts/{session-mode-appendix.d.ts → session-mode.d.ts} +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* Direction tokens — signal-mono */
|
|
2
|
+
:root {
|
|
3
|
+
--bg: #111111;
|
|
4
|
+
--surface: #1a1a1a;
|
|
5
|
+
--surface-2: #222222;
|
|
6
|
+
--ink: #fafafa;
|
|
7
|
+
--muted: #a3a3a3;
|
|
8
|
+
--border: #333333;
|
|
9
|
+
--accent: #ffe600;
|
|
10
|
+
--accent-soft: #2a2800;
|
|
11
|
+
--accent-ink: #111111;
|
|
12
|
+
--danger: #ff4d4d;
|
|
13
|
+
--success: #b8f25a;
|
|
14
|
+
--warning: #ffe600;
|
|
15
|
+
--focus: #ffe600;
|
|
16
|
+
--overlay: rgb(0 0 0 / 0.7);
|
|
17
|
+
--shadow: none;
|
|
18
|
+
--font-display: system-ui, -apple-system, sans-serif;
|
|
19
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
20
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
21
|
+
--radius: 0;
|
|
22
|
+
--leading-body: 1.4;
|
|
23
|
+
--tracking-caps: 0.1em;
|
|
24
|
+
--text-body: 1rem;
|
|
25
|
+
--text-small: 0.875rem;
|
|
26
|
+
--space-1: 0.25rem;
|
|
27
|
+
--space-2: 0.5rem;
|
|
28
|
+
--space-3: 0.75rem;
|
|
29
|
+
--space-4: 1rem;
|
|
30
|
+
--space-5: 1.5rem;
|
|
31
|
+
--space-6: 2rem;
|
|
32
|
+
--space-7: 3rem;
|
|
33
|
+
--space-8: 4rem;
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* Direction tokens — soft-product (prefer brand hue over default blue when brief provides one). */
|
|
2
|
+
:root {
|
|
3
|
+
--bg: #fafafa;
|
|
4
|
+
--surface: #ffffff;
|
|
5
|
+
--surface-2: #f4f4f5;
|
|
6
|
+
--ink: #18181b;
|
|
7
|
+
--muted: #71717a;
|
|
8
|
+
--border: #ececec;
|
|
9
|
+
--accent: #2563eb;
|
|
10
|
+
--accent-soft: #e8effc;
|
|
11
|
+
--accent-ink: #ffffff;
|
|
12
|
+
--danger: #dc2626;
|
|
13
|
+
--success: #16a34a;
|
|
14
|
+
--warning: #ca8a04;
|
|
15
|
+
--focus: #2563eb;
|
|
16
|
+
--overlay: rgb(24 24 27 / 0.4);
|
|
17
|
+
--shadow: 0 1px 2px rgb(24 24 27 / 0.05);
|
|
18
|
+
--font-display: system-ui, -apple-system, sans-serif;
|
|
19
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
20
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
21
|
+
--radius: 0.5rem;
|
|
22
|
+
--leading-body: 1.55;
|
|
23
|
+
--tracking-caps: 0.05em;
|
|
24
|
+
--text-body: 1.0625rem;
|
|
25
|
+
--text-small: 0.875rem;
|
|
26
|
+
--space-1: 0.25rem;
|
|
27
|
+
--space-2: 0.5rem;
|
|
28
|
+
--space-3: 0.75rem;
|
|
29
|
+
--space-4: 1rem;
|
|
30
|
+
--space-5: 1.5rem;
|
|
31
|
+
--space-6: 2rem;
|
|
32
|
+
--space-7: 3rem;
|
|
33
|
+
--space-8: 4rem;
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* Direction tokens — swiss-grid */
|
|
2
|
+
:root {
|
|
3
|
+
--bg: #ffffff;
|
|
4
|
+
--surface: #ffffff;
|
|
5
|
+
--surface-2: #f5f5f5;
|
|
6
|
+
--ink: #0a0a0a;
|
|
7
|
+
--muted: #525252;
|
|
8
|
+
--border: #e5e5e5;
|
|
9
|
+
--accent: #c8102e;
|
|
10
|
+
--accent-soft: #fce8eb;
|
|
11
|
+
--accent-ink: #ffffff;
|
|
12
|
+
--danger: #c8102e;
|
|
13
|
+
--success: #0a0a0a;
|
|
14
|
+
--warning: #a16207;
|
|
15
|
+
--focus: #0a0a0a;
|
|
16
|
+
--overlay: rgb(10 10 10 / 0.5);
|
|
17
|
+
--shadow: none;
|
|
18
|
+
--font-display: system-ui, -apple-system, sans-serif;
|
|
19
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
20
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
21
|
+
--radius: 0;
|
|
22
|
+
--leading-body: 1.45;
|
|
23
|
+
--tracking-caps: 0.08em;
|
|
24
|
+
--text-body: 0.9375rem;
|
|
25
|
+
--text-small: 0.8125rem;
|
|
26
|
+
--space-1: 0.25rem;
|
|
27
|
+
--space-2: 0.5rem;
|
|
28
|
+
--space-3: 0.75rem;
|
|
29
|
+
--space-4: 1rem;
|
|
30
|
+
--space-5: 1.5rem;
|
|
31
|
+
--space-6: 2rem;
|
|
32
|
+
--space-7: 3rem;
|
|
33
|
+
--space-8: 4rem;
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* Direction tokens — warm-atelier */
|
|
2
|
+
:root {
|
|
3
|
+
--bg: #f4efe6;
|
|
4
|
+
--surface: #fffaf2;
|
|
5
|
+
--surface-2: #ebe3d6;
|
|
6
|
+
--ink: #2c241b;
|
|
7
|
+
--muted: #6b5e4f;
|
|
8
|
+
--border: #ddd2c2;
|
|
9
|
+
--accent: #c45c26;
|
|
10
|
+
--accent-soft: #f3e0d4;
|
|
11
|
+
--accent-ink: #fffaf2;
|
|
12
|
+
--danger: #9b2c2c;
|
|
13
|
+
--success: #3d6b4f;
|
|
14
|
+
--warning: #b45309;
|
|
15
|
+
--focus: #c45c26;
|
|
16
|
+
--overlay: rgb(44 36 27 / 0.48);
|
|
17
|
+
--shadow: 0 1px 2px rgb(44 36 27 / 0.08);
|
|
18
|
+
--font-display: Georgia, "Times New Roman", ui-serif, serif;
|
|
19
|
+
--font-body: "Segoe UI", system-ui, sans-serif;
|
|
20
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
21
|
+
--radius: 0.375rem;
|
|
22
|
+
--leading-body: 1.55;
|
|
23
|
+
--tracking-caps: 0.07em;
|
|
24
|
+
--text-body: 1rem;
|
|
25
|
+
--text-small: 0.875rem;
|
|
26
|
+
--space-1: 0.25rem;
|
|
27
|
+
--space-2: 0.5rem;
|
|
28
|
+
--space-3: 0.75rem;
|
|
29
|
+
--space-4: 1rem;
|
|
30
|
+
--space-5: 1.5rem;
|
|
31
|
+
--space-6: 2rem;
|
|
32
|
+
--space-7: 3rem;
|
|
33
|
+
--space-8: 4rem;
|
|
34
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Waitlist</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #f8fafc;
|
|
10
|
+
--ink: #0f172a;
|
|
11
|
+
--muted: #64748b;
|
|
12
|
+
--accent: #0f766e;
|
|
13
|
+
--surface: #ffffff;
|
|
14
|
+
--border: #e2e8f0;
|
|
15
|
+
--danger: #b91c1c;
|
|
16
|
+
--font-display: system-ui, -apple-system, sans-serif;
|
|
17
|
+
--font-body: system-ui, -apple-system, sans-serif;
|
|
18
|
+
}
|
|
19
|
+
* {
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
}
|
|
22
|
+
body {
|
|
23
|
+
margin: 0;
|
|
24
|
+
min-height: 100vh;
|
|
25
|
+
display: grid;
|
|
26
|
+
place-items: center;
|
|
27
|
+
font-family: var(--font-body);
|
|
28
|
+
background: var(--bg);
|
|
29
|
+
color: var(--ink);
|
|
30
|
+
padding: 1.5rem;
|
|
31
|
+
}
|
|
32
|
+
.card {
|
|
33
|
+
width: min(100%, 26rem);
|
|
34
|
+
text-align: center;
|
|
35
|
+
background: var(--surface);
|
|
36
|
+
border: 1px solid var(--border);
|
|
37
|
+
border-radius: 0.375rem;
|
|
38
|
+
padding: 2rem 1.5rem;
|
|
39
|
+
}
|
|
40
|
+
.kicker {
|
|
41
|
+
margin: 0 0 0.75rem;
|
|
42
|
+
font-size: 0.75rem;
|
|
43
|
+
letter-spacing: 0.08em;
|
|
44
|
+
text-transform: uppercase;
|
|
45
|
+
color: var(--accent);
|
|
46
|
+
font-weight: 600;
|
|
47
|
+
}
|
|
48
|
+
h1 {
|
|
49
|
+
font-family: var(--font-display);
|
|
50
|
+
font-size: clamp(1.5rem, 3vw, 1.85rem);
|
|
51
|
+
letter-spacing: -0.02em;
|
|
52
|
+
margin: 0 0 0.5rem;
|
|
53
|
+
line-height: 1.2;
|
|
54
|
+
}
|
|
55
|
+
.lede {
|
|
56
|
+
margin: 0 0 1.5rem;
|
|
57
|
+
color: var(--muted);
|
|
58
|
+
font-size: 0.9375rem;
|
|
59
|
+
line-height: 1.5;
|
|
60
|
+
}
|
|
61
|
+
form {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
gap: 0.65rem;
|
|
65
|
+
text-align: left;
|
|
66
|
+
}
|
|
67
|
+
label {
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
gap: 0.35rem;
|
|
71
|
+
font-size: 0.8125rem;
|
|
72
|
+
font-weight: 600;
|
|
73
|
+
}
|
|
74
|
+
input {
|
|
75
|
+
font: inherit;
|
|
76
|
+
padding: 0.65rem 0.75rem;
|
|
77
|
+
border: 1px solid var(--border);
|
|
78
|
+
border-radius: 0.375rem;
|
|
79
|
+
}
|
|
80
|
+
input:focus-visible {
|
|
81
|
+
outline: 2px solid var(--accent);
|
|
82
|
+
outline-offset: 1px;
|
|
83
|
+
}
|
|
84
|
+
.btn {
|
|
85
|
+
margin-top: 0.25rem;
|
|
86
|
+
padding: 0.7rem 1rem;
|
|
87
|
+
border: 0;
|
|
88
|
+
border-radius: 0.375rem;
|
|
89
|
+
background: var(--accent);
|
|
90
|
+
color: #fff;
|
|
91
|
+
font: inherit;
|
|
92
|
+
font-weight: 600;
|
|
93
|
+
cursor: pointer;
|
|
94
|
+
}
|
|
95
|
+
.btn:focus-visible {
|
|
96
|
+
outline: 2px solid var(--ink);
|
|
97
|
+
outline-offset: 2px;
|
|
98
|
+
}
|
|
99
|
+
.error {
|
|
100
|
+
color: var(--danger);
|
|
101
|
+
font-size: 0.8125rem;
|
|
102
|
+
font-weight: 400;
|
|
103
|
+
}
|
|
104
|
+
.social {
|
|
105
|
+
margin: 1rem 0 0;
|
|
106
|
+
font-size: 0.8125rem;
|
|
107
|
+
color: var(--muted);
|
|
108
|
+
}
|
|
109
|
+
[hidden] {
|
|
110
|
+
display: none !important;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
</head>
|
|
114
|
+
<body>
|
|
115
|
+
<main class="card">
|
|
116
|
+
<p class="kicker">Early access</p>
|
|
117
|
+
<h1>Join the waitlist</h1>
|
|
118
|
+
<p class="lede">
|
|
119
|
+
One clear promise for what they get when invited. No fake “spots left”.
|
|
120
|
+
</p>
|
|
121
|
+
<form>
|
|
122
|
+
<label>
|
|
123
|
+
Work email
|
|
124
|
+
<input type="email" name="email" autocomplete="email" required />
|
|
125
|
+
<span class="error" hidden>Enter a valid email.</span>
|
|
126
|
+
</label>
|
|
127
|
+
<label>
|
|
128
|
+
Company
|
|
129
|
+
<span style="font-weight: 400; color: var(--muted)">(optional)</span>
|
|
130
|
+
<input name="company" autocomplete="organization" />
|
|
131
|
+
</label>
|
|
132
|
+
<button class="btn" type="submit">Request invite</button>
|
|
133
|
+
</form>
|
|
134
|
+
<p class="social">
|
|
135
|
+
We’ll email only about access. Replace with real policy.
|
|
136
|
+
</p>
|
|
137
|
+
</main>
|
|
138
|
+
</body>
|
|
139
|
+
</html>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Accessibility baseline
|
|
2
|
+
|
|
3
|
+
Target **WCAG 2.2 AA** as the working floor.
|
|
4
|
+
|
|
5
|
+
## Contrast
|
|
6
|
+
|
|
7
|
+
| Pair | Minimum |
|
|
8
|
+
| ----------------------------------- | ------- |
|
|
9
|
+
| Normal text | 4.5:1 |
|
|
10
|
+
| Large text (≥24 px / ≥18.5 px bold) | 3:1 |
|
|
11
|
+
| UI components / graphics | 3:1 |
|
|
12
|
+
| Focus vs adjacent | 3:1 |
|
|
13
|
+
|
|
14
|
+
## Structure
|
|
15
|
+
|
|
16
|
+
- One `h1` per view; heading levels do not skip
|
|
17
|
+
- Buttons are `<button>`; links are `<a href>`
|
|
18
|
+
- Form controls have visible labels (`<label for>`)
|
|
19
|
+
- Images that convey meaning have `alt`; decorative images `alt=""`
|
|
20
|
+
- Focus visible on all interactive controls; do not remove outlines without a replacement
|
|
21
|
+
|
|
22
|
+
## Interaction
|
|
23
|
+
|
|
24
|
+
- Hit targets ≥24×24 px (prefer 44×44 on touch)
|
|
25
|
+
- Do not rely on color alone for status
|
|
26
|
+
- Motion: respect `prefers-reduced-motion`
|
|
27
|
+
- Keyboard: all primary actions reachable without a pointer
|
|
28
|
+
|
|
29
|
+
## Language
|
|
30
|
+
|
|
31
|
+
- Set `<html lang="...">`
|
|
32
|
+
- Error text names the field and how to fix it
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Anti-AI-slop rules
|
|
2
|
+
|
|
3
|
+
Concrete rules that distinguish shipped product design from default LLM output.
|
|
4
|
+
|
|
5
|
+
## Must-fix (P0)
|
|
6
|
+
|
|
7
|
+
1. **Default Tailwind indigo as accent** — `#6366f1`, `#4f46e5`, `#4338ca`, `#3730a3`, `#8b5cf6`, `#7c3aed`, `#a855f7`. Use `DESIGN.md` / direction accent instead.
|
|
8
|
+
2. **Two-stop "trust" gradient on the hero** — purple→blue, blue→cyan, indigo→pink. Prefer flat surfaces + intentional type.
|
|
9
|
+
3. **Emoji as feature icons** — no `✨` `🚀` `🎯` `⚡` `🔥` `💡` as icons. Use monoline SVG with `currentColor`.
|
|
10
|
+
4. **Generic Inter/Roboto display when a direction binds a serif** — honor `--font-display`.
|
|
11
|
+
5. **Rounded card + colored left-border accent** — the canonical AI dashboard tile. Drop radius or the left border.
|
|
12
|
+
6. **Invented metrics** — "10× faster", "99.9% uptime". Use real numbers or labelled placeholders.
|
|
13
|
+
7. **Filler copy** — `lorem ipsum`, `feature one / two / three`, `placeholder text`.
|
|
14
|
+
|
|
15
|
+
## Should-fix (P1)
|
|
16
|
+
|
|
17
|
+
- Stock Unsplash / placehold.co / picsum heroes
|
|
18
|
+
- More than ~12 raw hex values outside `:root`
|
|
19
|
+
- Accent color used 6+ times on one screen (cap ~2 visible uses)
|
|
20
|
+
- Identical "Hero → Features → Pricing → FAQ → CTA" with no variation
|
|
21
|
+
|
|
22
|
+
## Polish (P2)
|
|
23
|
+
|
|
24
|
+
- Decorative blob / wave backgrounds with no meaning
|
|
25
|
+
- Perfect symmetry with no visual tension — vary density across sections
|
|
26
|
+
|
|
27
|
+
Aim for ~80% proven patterns + ~20% distinctive choice (one bold type/color move, specific microcopy, one memorable micro-interaction).
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Color and surfaces craft rules
|
|
2
|
+
|
|
3
|
+
`DESIGN.md` / directions own the palette. This file governs how surfaces behave.
|
|
4
|
+
|
|
5
|
+
## Roles (name them in `:root`)
|
|
6
|
+
|
|
7
|
+
| Role | Purpose |
|
|
8
|
+
| -------------------------------------- | -------------------------------------------------------- |
|
|
9
|
+
| `--bg` | Page / slide canvas |
|
|
10
|
+
| `--surface` | Raised panel / card |
|
|
11
|
+
| `--surface-2` | Nested elevation (use sparingly) |
|
|
12
|
+
| `--ink` | Primary text |
|
|
13
|
+
| `--muted` | Secondary text (still ≥ 4.5:1 on `--bg` / `--surface`) |
|
|
14
|
+
| `--border` | Hairlines, dividers |
|
|
15
|
+
| `--accent` | Primary action / sparse emphasis |
|
|
16
|
+
| `--accent-soft` | Tinted chip / selected row / soft badge fill |
|
|
17
|
+
| `--accent-ink` | Text/icon on solid `--accent` |
|
|
18
|
+
| `--danger` / `--success` / `--warning` | Status only |
|
|
19
|
+
| `--focus` | Focus ring / outline (often matches accent) |
|
|
20
|
+
| `--overlay` | Modal / dialog scrim |
|
|
21
|
+
| `--shadow` | Optional elevation (`none` when borders carry structure) |
|
|
22
|
+
| `--leading-body` / `--tracking-caps` | Body leading + ALL CAPS tracking |
|
|
23
|
+
| `--text-body` / `--text-small` | Default body / small sizes |
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
1. **Flat first** — prefer solid fills over gradients. If a gradient exists, one subtle stop pair max, never as the only brand signal.
|
|
28
|
+
2. **Accent budget** — ~2 strong accent moments per screen/slide (CTA + one highlight). Links can use a quieter tint.
|
|
29
|
+
3. **Borders over shadows** for structure in product UI; soft shadows only when elevation must read on a busy canvas.
|
|
30
|
+
4. **No raw hex sprawl** — new colors go in `:root`; components reference tokens.
|
|
31
|
+
5. **Dark surfaces** — raise with border + slight luminance step, not heavy white glow.
|
|
32
|
+
6. **Status color** — pair with icon or label; never color alone.
|
|
33
|
+
|
|
34
|
+
## Contrast quick checks
|
|
35
|
+
|
|
36
|
+
- Body on `--bg` / `--surface`: ≥ 4.5:1
|
|
37
|
+
- Muted text: still readable; if it fails, lighten/darken `--muted`, don’t shrink type to “fix” it
|
|
38
|
+
- Accent-on-accent text (e.g. white on teal): verify large and small sizes
|
|
39
|
+
|
|
40
|
+
## Anti-patterns
|
|
41
|
+
|
|
42
|
+
- Purple/indigo default stacks when direction specifies otherwise
|
|
43
|
+
- Glassmorphism stacks (blur + translucency + border + shadow)
|
|
44
|
+
- Every card a different pastel wash
|
|
45
|
+
- Light gray text on colored badges that fails AA
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Data visualization craft rules
|
|
2
|
+
|
|
3
|
+
Charts exist to answer a question — not to decorate a dashboard.
|
|
4
|
+
|
|
5
|
+
## Must
|
|
6
|
+
|
|
7
|
+
1. **Real or labelled data** — if numbers are placeholders, mark them (`Sample`, `Fixture`) — never invent “+340% MoM”.
|
|
8
|
+
2. **One question per chart** — title states the takeaway.
|
|
9
|
+
3. **Axes and units** — labelled; don’t hide scale tricks.
|
|
10
|
+
4. **Color** — categorical ≤ 5–6 hues from the direction palette; sequential for magnitude; never rainbow defaults.
|
|
11
|
+
5. **Non-color cues** — pattern, labels, or shape when status matters (a11y).
|
|
12
|
+
|
|
13
|
+
## Prefer
|
|
14
|
+
|
|
15
|
+
- Simple bar / line / sparklines over 3D, donut stacks, or dual-axis confusion
|
|
16
|
+
- Tables when precision > trend
|
|
17
|
+
- Empty and loading treatments for chart panels (`state-coverage.md`)
|
|
18
|
+
|
|
19
|
+
## Avoid
|
|
20
|
+
|
|
21
|
+
- Chart.js / Recharts defaults with purple fills when the direction forbids them
|
|
22
|
+
- Pie charts with >4 slices
|
|
23
|
+
- Animating every redraw
|
|
24
|
+
- Dashboards that are only charts with no written insight
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Deck / slide craft rules
|
|
2
|
+
|
|
3
|
+
For HTML decks under `.hooman/design/<slug>/` with `[data-slide]`.
|
|
4
|
+
|
|
5
|
+
## Frame
|
|
6
|
+
|
|
7
|
+
- Each slide is a **fixed frame**: typically `width: 100vw; height: 100vh` (or 1280×720 logical for export fidelity)
|
|
8
|
+
- Content lives in an inner stack with **safe padding** (≥ 6–8% of the short side, or `--space-7` / `--space-8`)
|
|
9
|
+
- Use `display: flex; flex-direction: column;` on the slide; put scrollable regions only inside a designated body that still fits the frame
|
|
10
|
+
|
|
11
|
+
## Chrome
|
|
12
|
+
|
|
13
|
+
Reserve bands so body copy never collides:
|
|
14
|
+
|
|
15
|
+
| Band | Typical content |
|
|
16
|
+
| ------ | --------------------------------------------------- |
|
|
17
|
+
| Top | Section kicker, confidentiality, logo wordmark |
|
|
18
|
+
| Body | Title, lede, cards/grid |
|
|
19
|
+
| Bottom | Source line, slide index `03 / 08`, footer wordmark |
|
|
20
|
+
|
|
21
|
+
Bottom chrome height is sacred — titles and cards must clear it.
|
|
22
|
+
|
|
23
|
+
## One job per slide
|
|
24
|
+
|
|
25
|
+
- One headline idea; supporting copy ≤ ~2 short paragraphs or a tight list
|
|
26
|
+
- Prefer 2–3 cards over 6 cramped tiles
|
|
27
|
+
- If content does not fit after type/spacing pass: **split the slide**
|
|
28
|
+
|
|
29
|
+
## Type on slides
|
|
30
|
+
|
|
31
|
+
- Display titles: `clamp()` with a **max** that still fits with chrome (often ≤ ~3.2rem at 720p-class frames)
|
|
32
|
+
- Body on slides often 15–18 px; avoid marketing-site 24 px body inside a fixed frame
|
|
33
|
+
- ALL CAPS kickers: tracking `0.08em`+
|
|
34
|
+
|
|
35
|
+
## Capture / export
|
|
36
|
+
|
|
37
|
+
- Mark every slide root `[data-slide]`
|
|
38
|
+
- Run `export_design` (`format: "images"`) → `launch_subagent` (`kind: "design-review"`, binary) before delivery `export_design` (`pdf` / `images-to-pdf` / `pptx` / `figma` / `figma-deck` / `sketch`)
|
|
39
|
+
- Prefer `figma-deck` when the handoff is Figma Slides; `sketch` when the handoff is Sketch; PDF/PPTX when the handoff is print/share-only. All of `figma` / `figma-deck` / `sketch` / `pptx` are screenshot-backed.
|
|
40
|
+
- Fix P0 overflow/overlap before calling export
|
|
41
|
+
|
|
42
|
+
## Anti-patterns
|
|
43
|
+
|
|
44
|
+
- Long scrolling “slides” that are really pages (breaks PPTX pagination)
|
|
45
|
+
- Absolute-positioned footers over flex content without padding-bottom compensation
|
|
46
|
+
- Decorative full-bleed images that crush text contrast
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Forms and validation craft rules
|
|
2
|
+
|
|
3
|
+
Forms are products. Treat every field as a state machine.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
- Visible `<label for>` (or wrapping label) on every control
|
|
8
|
+
- Group related fields with `<fieldset>` / `<legend>` when it helps
|
|
9
|
+
- One primary submit; secondary actions are quieter
|
|
10
|
+
- Preserve user input on error — never wipe the form
|
|
11
|
+
|
|
12
|
+
## Validation timing
|
|
13
|
+
|
|
14
|
+
| Moment | Behavior |
|
|
15
|
+
| ------------ | ------------------------------------------- |
|
|
16
|
+
| Untouched | No error chrome |
|
|
17
|
+
| Blur (dirty) | Validate that field |
|
|
18
|
+
| Submit | Validate all; focus first invalid |
|
|
19
|
+
| Pending | Disable submit; show progress on the button |
|
|
20
|
+
|
|
21
|
+
## Messages
|
|
22
|
+
|
|
23
|
+
- Name the field and how to fix it (“Email needs an @ domain”)
|
|
24
|
+
- Place errors adjacent to the field (`aria-describedby`)
|
|
25
|
+
- Don’t rely on color alone — icon or text prefix
|
|
26
|
+
|
|
27
|
+
## Layout
|
|
28
|
+
|
|
29
|
+
- Single column for auth / checkout unless desktop comparison needs two
|
|
30
|
+
- Consistent label → control → hint/error vertical rhythm (`--space-2` / `--space-3`)
|
|
31
|
+
- Password / OTP: support paste; show show/hide when useful
|
|
32
|
+
|
|
33
|
+
## States to prototype
|
|
34
|
+
|
|
35
|
+
Empty, filled, focus, error, disabled, read-only, pending submit — at least show error + pending slots in HTML shells (`hidden` toggles are fine).
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Iconography craft rules
|
|
2
|
+
|
|
3
|
+
Icons support meaning; they are not decoration filler.
|
|
4
|
+
|
|
5
|
+
## Rules
|
|
6
|
+
|
|
7
|
+
1. **One system per artifact** — monoline SVG with `currentColor`, consistent viewBox (prefer `0 0 24 24`), 1.5–2 px stroke.
|
|
8
|
+
2. **No emoji as icons** — see `anti-ai-slop.md`.
|
|
9
|
+
3. **Optical size** — UI icons 16–20 px; marketing feature icons 24–32 px; never mix scales in one row without intent.
|
|
10
|
+
4. **Align to type** — center icons on the text cap-height of adjacent labels; use flex `align-items: center` + gap from the spacing scale.
|
|
11
|
+
5. **Accessible name** — decorative icons: `aria-hidden="true"`. Meaningful icons without visible text: `aria-label` on the control.
|
|
12
|
+
6. **Touch** — icon-only buttons still need ≥24×24 px hit target (prefer 44×44 on touch).
|
|
13
|
+
|
|
14
|
+
## Anti-patterns
|
|
15
|
+
|
|
16
|
+
- Random Lucide + Heroicons + emoji in one screen
|
|
17
|
+
- Filled + outlined mixed without hierarchy
|
|
18
|
+
- Colored icons that fail contrast on the surface
|
|
19
|
+
- Icon grids of 6+ “features” with generic metaphors (rocket, lightning, target)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Layout overflow craft rules
|
|
2
|
+
|
|
3
|
+
Visual QA exists because source review cannot see these failures. Treat them as **P0 Must-fix**.
|
|
4
|
+
|
|
5
|
+
## Must-fix (P0)
|
|
6
|
+
|
|
7
|
+
1. **Text clipped by a fixed box** — descenders or last lines cut at `overflow: hidden`, card bottoms, or slide edges.
|
|
8
|
+
2. **Overlapping layers** — headings through footers, body through badges, counters through copy, absolute chrome over content.
|
|
9
|
+
3. **Fixed slide / viewport height with unbounded content** — `[data-slide]` at `100vh` / `100dvh` must fit **all** content with padding; shrink type, reduce blocks, or split slides — never let content spill.
|
|
10
|
+
4. **Insufficient padding to chrome** — content closer than ~24–32 px to slide header, footer, or page counter.
|
|
11
|
+
5. **Flex/grid children that cannot shrink** — long words / URLs without `overflow-wrap` / `min-width: 0`.
|
|
12
|
+
|
|
13
|
+
## Should-fix (P1)
|
|
14
|
+
|
|
15
|
+
- Cards with uneven internal padding (cramped bottom, airy top)
|
|
16
|
+
- Multi-column rows where one cell wraps into another’s badge/meta
|
|
17
|
+
- Sticky headers that cover focused content when scrolled
|
|
18
|
+
- `line-clamp` without a real truncation strategy (tooltip / expand)
|
|
19
|
+
|
|
20
|
+
## Deck / fixed-frame checklist
|
|
21
|
+
|
|
22
|
+
Before capture:
|
|
23
|
+
|
|
24
|
+
- [ ] Every `[data-slide]` content fits inside padding box at target viewport (default 1280×720 capture)
|
|
25
|
+
- [ ] Footer / kicker / `01 / 08` never intersect body type
|
|
26
|
+
- [ ] Card grids use consistent gaps; no badge-on-text collisions
|
|
27
|
+
- [ ] Large display type has room for descenders + next element
|
|
28
|
+
|
|
29
|
+
## After capture
|
|
30
|
+
|
|
31
|
+
Read every `reviews/*.png` with `binary: true`. If any P0 appears, fix CSS/structure and re-capture — do not export.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Motion craft rules
|
|
2
|
+
|
|
3
|
+
Motion supports hierarchy; it is not decoration.
|
|
4
|
+
|
|
5
|
+
## Defaults
|
|
6
|
+
|
|
7
|
+
- Duration: 120–200 ms for UI chrome; 200–320 ms for larger layout shifts
|
|
8
|
+
- Easing: `cubic-bezier(0.2, 0.8, 0.2, 1)` or `ease-out` — avoid bounce/elastic on product UI
|
|
9
|
+
- Prefer opacity + transform (`translate` / `scale`) over layout-thrashing properties
|
|
10
|
+
|
|
11
|
+
## Must respect
|
|
12
|
+
|
|
13
|
+
```css
|
|
14
|
+
@media (prefers-reduced-motion: reduce) {
|
|
15
|
+
*,
|
|
16
|
+
*::before,
|
|
17
|
+
*::after {
|
|
18
|
+
animation-duration: 0.01ms !important;
|
|
19
|
+
animation-iteration-count: 1 !important;
|
|
20
|
+
transition-duration: 0.01ms !important;
|
|
21
|
+
scroll-behavior: auto !important;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Allowed
|
|
27
|
+
|
|
28
|
+
- Focus / hover state transitions on controls
|
|
29
|
+
- Subtle enter for toasts, dialogs, drawers
|
|
30
|
+
- Progress indicators that communicate wait time
|
|
31
|
+
|
|
32
|
+
## Avoid
|
|
33
|
+
|
|
34
|
+
- Continuous decorative loops (floating blobs, shimmer forever on static marketing)
|
|
35
|
+
- Parallax that fights scroll reading
|
|
36
|
+
- Auto-playing carousels without pause/controls
|
|
37
|
+
- Motion as the only way to notice a state change
|
|
38
|
+
|
|
39
|
+
## Decks
|
|
40
|
+
|
|
41
|
+
Keep slide transitions minimal or none in HTML preview (scroll / snap is enough). Export screenshots are static — do not rely on animation to hide overflow.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Print craft rules
|
|
2
|
+
|
|
3
|
+
For one-pagers, handouts, and PDF via print CSS (not only screenshot PDF).
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```css
|
|
8
|
+
@page {
|
|
9
|
+
size: A4;
|
|
10
|
+
margin: 16mm;
|
|
11
|
+
}
|
|
12
|
+
@media print {
|
|
13
|
+
.no-print {
|
|
14
|
+
display: none !important;
|
|
15
|
+
}
|
|
16
|
+
a[href]::after {
|
|
17
|
+
content: none; /* or show URL deliberately */
|
|
18
|
+
}
|
|
19
|
+
body {
|
|
20
|
+
background: #fff;
|
|
21
|
+
color: #000;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
|
|
28
|
+
1. **Ink-friendly** — flat blacks/grays; avoid large dark fills that waste toner unless brand requires it.
|
|
29
|
+
2. **Page breaks** — `break-inside: avoid` on cards/figures; keep heading with following paragraph.
|
|
30
|
+
3. **Hide chrome** — nav, sticky CTAs, cookie banners: `.no-print`.
|
|
31
|
+
4. **Links** — either visible URL footnotes or clean text; don’t dump raw URLs after every word.
|
|
32
|
+
5. **Decks** — prefer `export_design` with `format: "images-to-pdf"` or `"pptx"` for print/share, or `format: "figma-deck"` / `"sketch"` / `"figma"` for screenshot-backed Figma/Sketch handoffs; `format: "pdf"` (Chromium print) is for document-like HTML.
|
|
33
|
+
6. **Print shells** — start from `resume-shell`, `business-card-shell`, `invite-shell`, or `flyer-shell` when the brief is a CV, card, invite, or handout.
|
|
34
|
+
|
|
35
|
+
## Check
|
|
36
|
+
|
|
37
|
+
Print-preview once (or export) before calling the artifact done when the deliverable is a PDF handout.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Responsive craft rules
|
|
2
|
+
|
|
3
|
+
Design for a primary viewport, then prove the critical breakpoints.
|
|
4
|
+
|
|
5
|
+
## Breakpoints (suggested)
|
|
6
|
+
|
|
7
|
+
| Name | Width | Use |
|
|
8
|
+
| ---- | ------- | ----------------------------------------- |
|
|
9
|
+
| `sm` | ≥640px | Comfortable phone landscape / large phone |
|
|
10
|
+
| `md` | ≥768px | Tablet / split nav |
|
|
11
|
+
| `lg` | ≥1024px | Desktop shell |
|
|
12
|
+
| `xl` | ≥1280px | Wide marketing / dashboards |
|
|
13
|
+
|
|
14
|
+
Pick **one** primary (usually `lg` for product, `sm` for mobile-frame shells) and test one step down.
|
|
15
|
+
|
|
16
|
+
## Patterns
|
|
17
|
+
|
|
18
|
+
- Fluid type with `clamp()` for display; fixed steps for dense UI
|
|
19
|
+
- Grid → single column before cards crush (`minmax(0, 1fr)` + `min-width: 0`)
|
|
20
|
+
- Nav: collapse to disclosure / bottom bar rather than microscopic links
|
|
21
|
+
- Decks: fixed `[data-slide]` frames are **not** responsive documents — design at capture size (e.g. 1280×720); don’t pretend mobile reflow
|
|
22
|
+
|
|
23
|
+
## Touch vs pointer
|
|
24
|
+
|
|
25
|
+
- Comfortable hit targets on small viewports
|
|
26
|
+
- Hover-only affordances need a non-hover equivalent
|
|
27
|
+
|
|
28
|
+
## Check
|
|
29
|
+
|
|
30
|
+
Before capture on multi-breakpoint prototypes, resize once to the secondary width and fix overflow — then re-capture the primary.
|