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.
Files changed (340) hide show
  1. package/README.md +44 -18
  2. package/dist/acp/acp-agent.d.ts +42 -0
  3. package/dist/acp/acp-agent.js +336 -47
  4. package/dist/acp/acp-agent.js.map +1 -1
  5. package/dist/acp/approvals.js +11 -10
  6. package/dist/acp/approvals.js.map +1 -1
  7. package/dist/acp/browser.d.ts +9 -0
  8. package/dist/acp/browser.js +23 -0
  9. package/dist/acp/browser.js.map +1 -0
  10. package/dist/acp/meta/vscode.d.ts +8 -7
  11. package/dist/acp/meta/vscode.js +10 -11
  12. package/dist/acp/meta/vscode.js.map +1 -1
  13. package/dist/acp/session-config.d.ts +2 -2
  14. package/dist/acp/session-config.js +24 -20
  15. package/dist/acp/session-config.js.map +1 -1
  16. package/dist/acp/sessions/store.d.ts +3 -3
  17. package/dist/acp/utils/tool-kind.js +8 -6
  18. package/dist/acp/utils/tool-kind.js.map +1 -1
  19. package/dist/chat/app.js +91 -11
  20. package/dist/chat/app.js.map +1 -1
  21. package/dist/chat/approvals.js +3 -0
  22. package/dist/chat/approvals.js.map +1 -1
  23. package/dist/chat/components/ApprovalPrompt.js +15 -25
  24. package/dist/chat/components/ApprovalPrompt.js.map +1 -1
  25. package/dist/chat/components/BackgroundJobsPanel.d.ts +10 -0
  26. package/dist/chat/components/BackgroundJobsPanel.js +15 -0
  27. package/dist/chat/components/BackgroundJobsPanel.js.map +1 -0
  28. package/dist/chat/components/BottomChrome.d.ts +6 -1
  29. package/dist/chat/components/BottomChrome.js +3 -2
  30. package/dist/chat/components/BottomChrome.js.map +1 -1
  31. package/dist/chat/components/ChromePicker.d.ts +7 -2
  32. package/dist/chat/components/ChromePicker.js +18 -2
  33. package/dist/chat/components/ChromePicker.js.map +1 -1
  34. package/dist/chat/components/Composer.js +3 -2
  35. package/dist/chat/components/Composer.js.map +1 -1
  36. package/dist/chat/components/DownloadPanel.js +2 -1
  37. package/dist/chat/components/DownloadPanel.js.map +1 -1
  38. package/dist/chat/components/EmptyChatBanner.js +2 -1
  39. package/dist/chat/components/EmptyChatBanner.js.map +1 -1
  40. package/dist/chat/components/PromptInput.js +2 -1
  41. package/dist/chat/components/PromptInput.js.map +1 -1
  42. package/dist/chat/components/QuestionPrompt.js +5 -4
  43. package/dist/chat/components/QuestionPrompt.js.map +1 -1
  44. package/dist/chat/components/QueuedPrompts.js +3 -2
  45. package/dist/chat/components/QueuedPrompts.js.map +1 -1
  46. package/dist/chat/components/ReasoningStrip.js +2 -1
  47. package/dist/chat/components/ReasoningStrip.js.map +1 -1
  48. package/dist/chat/components/RetryEvent.js +2 -1
  49. package/dist/chat/components/RetryEvent.js.map +1 -1
  50. package/dist/chat/components/SelectPicker.js +2 -1
  51. package/dist/chat/components/SelectPicker.js.map +1 -1
  52. package/dist/chat/components/ShellToolEvent.d.ts +12 -0
  53. package/dist/chat/components/ShellToolEvent.js +94 -0
  54. package/dist/chat/components/ShellToolEvent.js.map +1 -0
  55. package/dist/chat/components/SlashCommands.js +2 -1
  56. package/dist/chat/components/SlashCommands.js.map +1 -1
  57. package/dist/chat/components/Spinner.js +2 -1
  58. package/dist/chat/components/Spinner.js.map +1 -1
  59. package/dist/chat/components/StatusBar.js +19 -15
  60. package/dist/chat/components/StatusBar.js.map +1 -1
  61. package/dist/chat/components/ThinkingStatus.js +2 -1
  62. package/dist/chat/components/ThinkingStatus.js.map +1 -1
  63. package/dist/chat/components/ThoughtEvent.js +2 -1
  64. package/dist/chat/components/ThoughtEvent.js.map +1 -1
  65. package/dist/chat/components/TodoPanel.js +2 -1
  66. package/dist/chat/components/TodoPanel.js.map +1 -1
  67. package/dist/chat/components/ToolEvent.d.ts +2 -1
  68. package/dist/chat/components/ToolEvent.js +9 -2
  69. package/dist/chat/components/ToolEvent.js.map +1 -1
  70. package/dist/chat/components/ToolEventFileResult.js +8 -7
  71. package/dist/chat/components/ToolEventFileResult.js.map +1 -1
  72. package/dist/chat/components/Transcript.d.ts +4 -2
  73. package/dist/chat/components/Transcript.js +4 -4
  74. package/dist/chat/components/Transcript.js.map +1 -1
  75. package/dist/chat/components/markdown/BlockRenderer.js +3 -2
  76. package/dist/chat/components/markdown/BlockRenderer.js.map +1 -1
  77. package/dist/chat/components/markdown/CodeBlock.js +3 -2
  78. package/dist/chat/components/markdown/CodeBlock.js.map +1 -1
  79. package/dist/chat/components/markdown/InlineRenderer.js +6 -5
  80. package/dist/chat/components/markdown/InlineRenderer.js.map +1 -1
  81. package/dist/chat/components/shared.js +7 -6
  82. package/dist/chat/components/shared.js.map +1 -1
  83. package/dist/chat/types.d.ts +7 -0
  84. package/dist/cli.js +162 -44
  85. package/dist/cli.js.map +1 -1
  86. package/dist/configure/app.js +46 -29
  87. package/dist/configure/app.js.map +1 -1
  88. package/dist/configure/components/BusyScreen.js +2 -1
  89. package/dist/configure/components/BusyScreen.js.map +1 -1
  90. package/dist/configure/components/MenuScreen.js +3 -2
  91. package/dist/configure/components/MenuScreen.js.map +1 -1
  92. package/dist/configure/components/PromptForm.js +2 -1
  93. package/dist/configure/components/PromptForm.js.map +1 -1
  94. package/dist/configure/components/SelectMenuItem.js +4 -3
  95. package/dist/configure/components/SelectMenuItem.js.map +1 -1
  96. package/dist/configure/utils.js +4 -3
  97. package/dist/configure/utils.js.map +1 -1
  98. package/dist/core/agent/default-retry-strategy.js +46 -12
  99. package/dist/core/agent/default-retry-strategy.js.map +1 -1
  100. package/dist/core/agent/gitignore-guard-plugin.js +17 -2
  101. package/dist/core/agent/gitignore-guard-plugin.js.map +1 -1
  102. package/dist/core/agent/index.js +38 -7
  103. package/dist/core/agent/index.js.map +1 -1
  104. package/dist/core/approvals/allowlist.js +1 -0
  105. package/dist/core/approvals/allowlist.js.map +1 -1
  106. package/dist/core/approvals/intervention.d.ts +10 -2
  107. package/dist/core/approvals/intervention.js +46 -8
  108. package/dist/core/approvals/intervention.js.map +1 -1
  109. package/dist/core/config.d.ts +9 -2
  110. package/dist/core/config.js +8 -4
  111. package/dist/core/config.js.map +1 -1
  112. package/dist/core/index.d.ts +2 -2
  113. package/dist/core/mcp/oauth/service.js +2 -2
  114. package/dist/core/mcp/oauth/service.js.map +1 -1
  115. package/dist/core/models/bedrock.js +6 -0
  116. package/dist/core/models/bedrock.js.map +1 -1
  117. package/dist/core/models/groq.js +34 -14
  118. package/dist/core/models/groq.js.map +1 -1
  119. package/dist/core/models/minimax.js +1 -1
  120. package/dist/core/models/minimax.js.map +1 -1
  121. package/dist/core/models/types.d.ts +10 -2
  122. package/dist/core/models/types.js +1 -0
  123. package/dist/core/models/types.js.map +1 -1
  124. package/dist/core/modes/definitions.d.ts +4 -2
  125. package/dist/core/modes/definitions.js +77 -9
  126. package/dist/core/modes/definitions.js.map +1 -1
  127. package/dist/core/modes/index.d.ts +1 -1
  128. package/dist/core/modes/index.js +1 -1
  129. package/dist/core/modes/index.js.map +1 -1
  130. package/dist/core/modes/registry.js +4 -9
  131. package/dist/core/modes/registry.js.map +1 -1
  132. package/dist/core/modes/schema.d.ts +1 -1
  133. package/dist/core/modes/schema.js +1 -1
  134. package/dist/core/modes/schema.js.map +1 -1
  135. package/dist/core/prompts/agents/{review.md → code-review.md} +2 -2
  136. package/dist/core/prompts/agents/design-review.md +35 -0
  137. package/dist/core/prompts/agents/{test-investigator.md → quality-analyst.md} +2 -2
  138. package/dist/core/prompts/modes/agent.md +2 -0
  139. package/dist/core/prompts/modes/ask.md +2 -2
  140. package/dist/core/prompts/modes/design.md +37 -0
  141. package/dist/core/prompts/modes/plan.md +5 -5
  142. package/dist/core/prompts/{runtime.js → runtime/agents.js} +2 -2
  143. package/dist/core/prompts/runtime/agents.js.map +1 -0
  144. package/dist/core/prompts/runtime/design.d.ts +11 -0
  145. package/dist/core/prompts/runtime/design.js +78 -0
  146. package/dist/core/prompts/runtime/design.js.map +1 -0
  147. package/dist/core/prompts/{session-mode-appendix.js → session-mode.js} +1 -1
  148. package/dist/core/prompts/session-mode.js.map +1 -0
  149. package/dist/core/prompts/static/ask-user.md +3 -2
  150. package/dist/core/prompts/static/fetch.md +2 -1
  151. package/dist/core/prompts/static/filesystem.md +2 -1
  152. package/dist/core/prompts/static/shell.md +21 -1
  153. package/dist/core/prompts/static/subagents.md +2 -1
  154. package/dist/core/prompts/static/switch-mode.md +10 -0
  155. package/dist/core/prompts/system.d.ts +1 -0
  156. package/dist/core/prompts/system.js +11 -3
  157. package/dist/core/prompts/system.js.map +1 -1
  158. package/dist/core/shell/index.d.ts +7 -0
  159. package/dist/core/shell/index.js +6 -0
  160. package/dist/core/shell/index.js.map +1 -0
  161. package/dist/core/shell/manager.d.ts +23 -0
  162. package/dist/core/shell/manager.js +604 -0
  163. package/dist/core/shell/manager.js.map +1 -0
  164. package/dist/core/shell/output-buffer.d.ts +30 -0
  165. package/dist/core/shell/output-buffer.js +116 -0
  166. package/dist/core/shell/output-buffer.js.map +1 -0
  167. package/dist/core/shell/registry.d.ts +5 -0
  168. package/dist/core/shell/registry.js +24 -0
  169. package/dist/core/shell/registry.js.map +1 -0
  170. package/dist/core/{tools/shell.d.ts → shell/terminal-backend.d.ts} +20 -18
  171. package/dist/core/shell/terminal-backend.js +18 -0
  172. package/dist/core/shell/terminal-backend.js.map +1 -0
  173. package/dist/core/shell/tools.d.ts +41 -0
  174. package/dist/core/{tools/shell.js → shell/tools.js} +186 -11
  175. package/dist/core/shell/tools.js.map +1 -0
  176. package/dist/core/shell/types.d.ts +95 -0
  177. package/dist/core/shell/types.js +2 -0
  178. package/dist/core/shell/types.js.map +1 -0
  179. package/dist/core/skills/built-in/hooman-config/SKILL.md +30 -35
  180. package/dist/core/skills/built-in/hooman-config/search.md +5 -3
  181. package/dist/core/skills/built-in/hooman-design/SKILL.md +97 -0
  182. package/dist/core/skills/built-in/hooman-design/assets/article-shell.html +87 -0
  183. package/dist/core/skills/built-in/hooman-design/assets/auth-shell.html +143 -0
  184. package/dist/core/skills/built-in/hooman-design/assets/business-card-shell.html +112 -0
  185. package/dist/core/skills/built-in/hooman-design/assets/contact-shell.html +181 -0
  186. package/dist/core/skills/built-in/hooman-design/assets/dashboard-shell.html +90 -0
  187. package/dist/core/skills/built-in/hooman-design/assets/data-table-shell.html +114 -0
  188. package/dist/core/skills/built-in/hooman-design/assets/deck-shell.html +187 -0
  189. package/dist/core/skills/built-in/hooman-design/assets/dialog-shell.html +98 -0
  190. package/dist/core/skills/built-in/hooman-design/assets/email-shell.html +101 -0
  191. package/dist/core/skills/built-in/hooman-design/assets/empty-state-shell.html +92 -0
  192. package/dist/core/skills/built-in/hooman-design/assets/flyer-shell.html +168 -0
  193. package/dist/core/skills/built-in/hooman-design/assets/invite-shell.html +167 -0
  194. package/dist/core/skills/built-in/hooman-design/assets/landing-shell.html +184 -0
  195. package/dist/core/skills/built-in/hooman-design/assets/mobile-frame-shell.html +109 -0
  196. package/dist/core/skills/built-in/hooman-design/assets/newsletter-shell.html +141 -0
  197. package/dist/core/skills/built-in/hooman-design/assets/onboarding-shell.html +131 -0
  198. package/dist/core/skills/built-in/hooman-design/assets/pricing-shell.html +160 -0
  199. package/dist/core/skills/built-in/hooman-design/assets/prototype-shell.html +83 -0
  200. package/dist/core/skills/built-in/hooman-design/assets/resume-shell.html +228 -0
  201. package/dist/core/skills/built-in/hooman-design/assets/settings-shell.html +196 -0
  202. package/dist/core/skills/built-in/hooman-design/assets/tokens/botanical-calm.css +34 -0
  203. package/dist/core/skills/built-in/hooman-design/assets/tokens/copper-ledger.css +34 -0
  204. package/dist/core/skills/built-in/hooman-design/assets/tokens/editorial-ink.css +34 -0
  205. package/dist/core/skills/built-in/hooman-design/assets/tokens/fintech-clear.css +34 -0
  206. package/dist/core/skills/built-in/hooman-design/assets/tokens/harbor-navy.css +35 -0
  207. package/dist/core/skills/built-in/hooman-design/assets/tokens/midnight-editorial.css +34 -0
  208. package/dist/core/skills/built-in/hooman-design/assets/tokens/night-console.css +34 -0
  209. package/dist/core/skills/built-in/hooman-design/assets/tokens/paper-mono.css +35 -0
  210. package/dist/core/skills/built-in/hooman-design/assets/tokens/signal-mono.css +34 -0
  211. package/dist/core/skills/built-in/hooman-design/assets/tokens/soft-product.css +34 -0
  212. package/dist/core/skills/built-in/hooman-design/assets/tokens/swiss-grid.css +34 -0
  213. package/dist/core/skills/built-in/hooman-design/assets/tokens/warm-atelier.css +34 -0
  214. package/dist/core/skills/built-in/hooman-design/assets/waitlist-shell.html +139 -0
  215. package/dist/core/skills/built-in/hooman-design/craft/accessibility-baseline.md +32 -0
  216. package/dist/core/skills/built-in/hooman-design/craft/anti-ai-slop.md +27 -0
  217. package/dist/core/skills/built-in/hooman-design/craft/color-surfaces.md +45 -0
  218. package/dist/core/skills/built-in/hooman-design/craft/data-viz.md +24 -0
  219. package/dist/core/skills/built-in/hooman-design/craft/deck-slides.md +46 -0
  220. package/dist/core/skills/built-in/hooman-design/craft/forms-validation.md +35 -0
  221. package/dist/core/skills/built-in/hooman-design/craft/iconography.md +19 -0
  222. package/dist/core/skills/built-in/hooman-design/craft/layout-overflow.md +31 -0
  223. package/dist/core/skills/built-in/hooman-design/craft/motion.md +41 -0
  224. package/dist/core/skills/built-in/hooman-design/craft/print.md +37 -0
  225. package/dist/core/skills/built-in/hooman-design/craft/responsive.md +30 -0
  226. package/dist/core/skills/built-in/hooman-design/craft/spacing-density.md +46 -0
  227. package/dist/core/skills/built-in/hooman-design/craft/state-coverage.md +21 -0
  228. package/dist/core/skills/built-in/hooman-design/craft/typography.md +73 -0
  229. package/dist/core/skills/built-in/hooman-design/directions.md +115 -0
  230. package/dist/core/skills/built-in/hooman-design/references/artifact-layout.md +15 -0
  231. package/dist/core/skills/built-in/hooman-design/references/export.md +47 -0
  232. package/dist/core/skills/built-in/hooman-design/references/workflow.md +80 -0
  233. package/dist/core/skills/built-in/hooman-mcp/SKILL.md +2 -2
  234. package/dist/core/state/llm-modality.d.ts +13 -0
  235. package/dist/core/state/llm-modality.js +19 -0
  236. package/dist/core/state/llm-modality.js.map +1 -0
  237. package/dist/core/state/plan.d.ts +1 -1
  238. package/dist/core/state/plan.js +1 -1
  239. package/dist/core/state/shell-jobs.d.ts +9 -0
  240. package/dist/core/state/shell-jobs.js +20 -0
  241. package/dist/core/state/shell-jobs.js.map +1 -0
  242. package/dist/core/state/tool-approvals.d.ts +12 -9
  243. package/dist/core/state/tool-approvals.js +94 -52
  244. package/dist/core/state/tool-approvals.js.map +1 -1
  245. package/dist/core/state/turn-boundaries.d.ts +33 -0
  246. package/dist/core/state/turn-boundaries.js +49 -0
  247. package/dist/core/state/turn-boundaries.js.map +1 -0
  248. package/dist/core/subagents/index.d.ts +1 -1
  249. package/dist/core/subagents/index.js +1 -1
  250. package/dist/core/subagents/registry.js +15 -6
  251. package/dist/core/subagents/registry.js.map +1 -1
  252. package/dist/core/subagents/tool.d.ts +8 -2
  253. package/dist/core/subagents/tool.js +93 -44
  254. package/dist/core/subagents/tool.js.map +1 -1
  255. package/dist/core/theme.d.ts +14 -0
  256. package/dist/core/theme.js +14 -0
  257. package/dist/core/theme.js.map +1 -0
  258. package/dist/core/tools/ask-user.d.ts +1 -1
  259. package/dist/core/tools/ask-user.js +1 -1
  260. package/dist/core/tools/export.d.ts +8 -0
  261. package/dist/core/tools/export.js +202 -0
  262. package/dist/core/tools/export.js.map +1 -0
  263. package/dist/core/tools/fetch.d.ts +2 -0
  264. package/dist/core/tools/fetch.js +92 -55
  265. package/dist/core/tools/fetch.js.map +1 -1
  266. package/dist/core/tools/filesystem.d.ts +2 -1
  267. package/dist/core/tools/filesystem.js +38 -4
  268. package/dist/core/tools/filesystem.js.map +1 -1
  269. package/dist/core/tools/index.d.ts +3 -2
  270. package/dist/core/tools/index.js +3 -2
  271. package/dist/core/tools/index.js.map +1 -1
  272. package/dist/core/tools/preview.d.ts +10 -0
  273. package/dist/core/tools/preview.js +147 -0
  274. package/dist/core/tools/preview.js.map +1 -0
  275. package/dist/core/tools/switch-mode.d.ts +6 -0
  276. package/dist/core/tools/switch-mode.js +188 -0
  277. package/dist/core/tools/switch-mode.js.map +1 -0
  278. package/dist/core/tools/web-search.js +176 -0
  279. package/dist/core/tools/web-search.js.map +1 -1
  280. package/dist/core/utils/browser.d.ts +8 -1
  281. package/dist/core/utils/browser.js +17 -1
  282. package/dist/core/utils/browser.js.map +1 -1
  283. package/dist/core/utils/export-design.d.ts +40 -0
  284. package/dist/core/utils/export-design.js +188 -0
  285. package/dist/core/utils/export-design.js.map +1 -0
  286. package/dist/core/utils/export-figma.d.ts +17 -0
  287. package/dist/core/utils/export-figma.js +189 -0
  288. package/dist/core/utils/export-figma.js.map +1 -0
  289. package/dist/core/utils/export-sketch.d.ts +11 -0
  290. package/dist/core/utils/export-sketch.js +456 -0
  291. package/dist/core/utils/export-sketch.js.map +1 -0
  292. package/dist/core/utils/fig-archive.d.ts +47 -0
  293. package/dist/core/utils/fig-archive.js +181 -0
  294. package/dist/core/utils/fig-archive.js.map +1 -0
  295. package/dist/core/utils/metadata.d.ts +30 -0
  296. package/dist/core/utils/metadata.js +122 -0
  297. package/dist/core/utils/metadata.js.map +1 -1
  298. package/dist/core/utils/models-prefetch.d.ts +53 -0
  299. package/dist/core/utils/models-prefetch.js +469 -0
  300. package/dist/core/utils/models-prefetch.js.map +1 -0
  301. package/dist/core/utils/onboarding-config.d.ts +48 -0
  302. package/dist/core/utils/onboarding-config.js +373 -0
  303. package/dist/core/utils/onboarding-config.js.map +1 -0
  304. package/dist/core/utils/paths.d.ts +9 -7
  305. package/dist/core/utils/paths.js +12 -10
  306. package/dist/core/utils/paths.js.map +1 -1
  307. package/dist/core/utils/preview-server.d.ts +20 -0
  308. package/dist/core/utils/preview-server.js +212 -0
  309. package/dist/core/utils/preview-server.js.map +1 -0
  310. package/dist/core/utils/search-probe.d.ts +19 -0
  311. package/dist/core/utils/search-probe.js +165 -0
  312. package/dist/core/utils/search-probe.js.map +1 -0
  313. package/dist/core/utils/seeds/empty-slides.deck +0 -0
  314. package/dist/core/utils/url-safety.d.ts +2 -0
  315. package/dist/core/utils/url-safety.js +47 -0
  316. package/dist/core/utils/url-safety.js.map +1 -0
  317. package/dist/core/utils/zstd.d.ts +6 -0
  318. package/dist/core/utils/zstd.js +39 -0
  319. package/dist/core/utils/zstd.js.map +1 -0
  320. package/dist/exec/approvals.js +5 -5
  321. package/dist/exec/approvals.js.map +1 -1
  322. package/dist/index.d.ts +11 -5
  323. package/dist/index.js +8 -5
  324. package/dist/index.js.map +1 -1
  325. package/dist/onboarding/app.d.ts +5 -0
  326. package/dist/onboarding/app.js +255 -0
  327. package/dist/onboarding/app.js.map +1 -0
  328. package/dist/onboarding/index.d.ts +5 -0
  329. package/dist/onboarding/index.js +27 -0
  330. package/dist/onboarding/index.js.map +1 -0
  331. package/package.json +16 -3
  332. package/dist/core/prompts/runtime.js.map +0 -1
  333. package/dist/core/prompts/session-mode-appendix.js.map +0 -1
  334. package/dist/core/prompts/static/planning.md +0 -3
  335. package/dist/core/tools/plan.d.ts +0 -5
  336. package/dist/core/tools/plan.js +0 -150
  337. package/dist/core/tools/plan.js.map +0 -1
  338. package/dist/core/tools/shell.js.map +0 -1
  339. /package/dist/core/prompts/{runtime.d.ts → runtime/agents.d.ts} +0 -0
  340. /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.