howone 0.1.28 → 0.1.30

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 (224) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/SKILL.md +48 -42
  3. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +12 -6
  4. package/templates/vite/.howone/skills/hallmark/references/assets.md +7 -0
  5. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +19 -10
  6. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +1 -1
  7. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +1 -1
  8. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +1 -1
  9. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +1 -1
  10. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +1 -1
  11. package/templates/vite/.howone/skills/hallmark/references/components/n11-mega-menu.md +40 -0
  12. package/templates/vite/.howone/skills/hallmark/references/components/n12-banner-retract.md +34 -0
  13. package/templates/vite/.howone/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
  14. package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
  15. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +1 -1
  16. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +2 -2
  17. package/templates/vite/.howone/skills/hallmark/references/copy.md +8 -8
  18. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +2 -2
  19. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +50 -12
  20. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +1 -1
  21. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +11 -7
  22. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +6 -4
  23. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +10 -6
  24. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +15 -10
  25. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +13 -12
  26. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +2 -1
  27. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +4 -3
  28. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +3 -1
  29. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +1 -1
  30. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +1 -1
  31. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +1 -3
  32. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +12 -12
  33. package/templates/vite/.howone/skills/hallmark/references/responsive.md +8 -8
  34. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +72 -85
  35. package/templates/vite/.howone/skills/hallmark/references/structure.md +9 -13
  36. package/templates/vite/.howone/skills/hallmark/references/study.md +40 -17
  37. package/templates/vite/.howone/skills/hallmark/references/themes/carnival.md +301 -0
  38. package/templates/vite/.howone/skills/hallmark/references/themes/cobalt.md +146 -0
  39. package/templates/vite/.howone/skills/hallmark/references/themes/hum.md +403 -0
  40. package/templates/vite/.howone/skills/hallmark/references/themes/lumen.md +478 -0
  41. package/templates/vite/.howone/skills/hallmark/references/typography.md +3 -3
  42. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +1 -1
  43. package/templates/vite/.howone/skills/howone/03-sdk/07-ai-action-calls.md +28 -86
  44. package/templates/vite/.howone/skills/howone/03-sdk/09-workflow-execute-sse.md +105 -0
  45. package/templates/vite/.howone/skills/howone/04-ai/03-ai-sdk-handoff.md +15 -13
  46. package/templates/vite/.howone/skills/howone/SKILL.md +2 -2
  47. package/templates/vite/package.json +1 -1
  48. package/templates/vite/.howone/skills/hallmark/LICENSE +0 -21
  49. package/templates/vite/.howone/skills/hallmark/README.md +0 -147
  50. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +0 -201
  51. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +0 -186
  52. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  53. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  54. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  55. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  56. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  57. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  58. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  59. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  60. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +0 -176
  61. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +0 -364
  62. package/templates/vite/.howone/skills/hallmark/package.json +0 -36
  63. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  64. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +0 -71
  65. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +0 -64
  66. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +0 -240
  67. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +0 -65
  68. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +0 -105
  69. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +0 -250
  70. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +0 -64
  71. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +0 -131
  72. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +0 -240
  73. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +0 -67
  74. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +0 -86
  75. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +0 -262
  76. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +0 -63
  77. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +0 -167
  78. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +0 -457
  79. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +0 -65
  80. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +0 -159
  81. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +0 -288
  82. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +0 -64
  83. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +0 -146
  84. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +0 -484
  85. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +0 -64
  86. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +0 -116
  87. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +0 -354
  88. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +0 -638
  89. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +0 -515
  90. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +0 -515
  91. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +0 -608
  92. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +0 -587
  93. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +0 -157
  94. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  95. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  96. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  97. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  98. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  99. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  100. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  101. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  102. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  103. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  104. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  105. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  106. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  107. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  108. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  109. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  110. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  111. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  112. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  113. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  114. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  115. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +0 -77
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +0 -238
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +0 -110
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +0 -326
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +0 -134
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +0 -262
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +0 -30
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +0 -17
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +0 -56
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +0 -160
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +0 -29
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +0 -63
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +0 -72
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +0 -374
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +0 -52
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +0 -29
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +0 -61
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +0 -193
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +0 -66
  136. package/templates/vite/.howone/skills/hallmark/site/css/base.css +0 -194
  137. package/templates/vite/.howone/skills/hallmark/site/css/components.css +0 -4886
  138. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +0 -2072
  139. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +0 -1129
  140. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +0 -475
  141. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +0 -1584
  142. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +0 -96
  143. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +0 -344
  144. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +0 -103
  145. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +0 -1103
  146. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +0 -83
  147. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +0 -368
  148. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +0 -133
  149. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +0 -1062
  150. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +0 -97
  151. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +0 -84
  152. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +0 -446
  153. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +0 -1087
  154. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +0 -101
  155. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +0 -359
  156. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +0 -1168
  157. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +0 -81
  158. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +0 -5
  159. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +0 -5
  160. package/templates/vite/.howone/skills/hallmark/site/index.html +0 -1043
  161. package/templates/vite/.howone/skills/hallmark/site/js/main.js +0 -1175
  162. package/templates/vite/.howone/skills/hallmark/vercel.json +0 -6
  163. package/templates/vite/.howone/skills/impeccable/SKILL.md +0 -168
  164. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +0 -101
  165. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +0 -190
  166. package/templates/vite/.howone/skills/impeccable/reference/animate.md +0 -175
  167. package/templates/vite/.howone/skills/impeccable/reference/audit.md +0 -133
  168. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +0 -113
  169. package/templates/vite/.howone/skills/impeccable/reference/brand.md +0 -118
  170. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +0 -174
  171. package/templates/vite/.howone/skills/impeccable/reference/codex.md +0 -105
  172. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +0 -106
  173. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +0 -105
  174. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +0 -154
  175. package/templates/vite/.howone/skills/impeccable/reference/craft.md +0 -123
  176. package/templates/vite/.howone/skills/impeccable/reference/critique.md +0 -273
  177. package/templates/vite/.howone/skills/impeccable/reference/delight.md +0 -302
  178. package/templates/vite/.howone/skills/impeccable/reference/distill.md +0 -111
  179. package/templates/vite/.howone/skills/impeccable/reference/document.md +0 -427
  180. package/templates/vite/.howone/skills/impeccable/reference/extract.md +0 -69
  181. package/templates/vite/.howone/skills/impeccable/reference/harden.md +0 -347
  182. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +0 -234
  183. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +0 -195
  184. package/templates/vite/.howone/skills/impeccable/reference/layout.md +0 -141
  185. package/templates/vite/.howone/skills/impeccable/reference/live.md +0 -622
  186. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +0 -109
  187. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +0 -234
  188. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +0 -258
  189. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +0 -130
  190. package/templates/vite/.howone/skills/impeccable/reference/personas.md +0 -179
  191. package/templates/vite/.howone/skills/impeccable/reference/polish.md +0 -242
  192. package/templates/vite/.howone/skills/impeccable/reference/product.md +0 -62
  193. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +0 -99
  194. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +0 -114
  195. package/templates/vite/.howone/skills/impeccable/reference/shape.md +0 -165
  196. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +0 -100
  197. package/templates/vite/.howone/skills/impeccable/reference/teach.md +0 -156
  198. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +0 -124
  199. package/templates/vite/.howone/skills/impeccable/reference/typography.md +0 -159
  200. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +0 -107
  201. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +0 -284
  202. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +0 -94
  203. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +0 -242
  204. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +0 -820
  205. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +0 -198
  206. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +0 -21
  207. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +0 -110
  208. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +0 -69
  209. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +0 -595
  210. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +0 -123
  211. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +0 -4860
  212. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +0 -75
  213. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +0 -18
  214. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +0 -446
  215. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +0 -200
  216. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +0 -48
  217. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +0 -838
  218. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +0 -254
  219. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +0 -47
  220. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +0 -632
  221. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +0 -247
  222. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +0 -141
  223. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
  224. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +0 -214
@@ -0,0 +1,34 @@
1
+ ### N12 · Announcement banner + retracting nav
2
+ A coloured promo **banner** stacked above one real nav. On scroll-down the banner slides up and retracts, leaving a single clean nav docked to the top; on scroll-up it slides back. A dismiss × removes the banner for good (its height zeroes so no gap is left). Apple-style coupled bars, but the top tier is a *banner*, not a second nav — the colour contrast is what stops it reading as "two navs".
3
+ *Use when:* there's a genuine, time-bound announcement (a launch, a sale, free shipping) worth a persistent strip, over a product/marketing page. Great for stat-led or commerce pages.
4
+ *Don't confuse with:* a static announcement bar that never moves (fine, but not N12); N1b (single bar, no banner).
5
+
6
+ ```html
7
+ <header class="nav" id="nav">
8
+ <div class="nav__banner" id="banner">
9
+ <p class="nav__banner-text"><span class="nav__banner-spark"></span> New — <b>shared habits</b>. <a class="nav__banner-link">Try it →</a></p>
10
+ <button class="nav__banner-x" id="banner-x" aria-label="Dismiss"><span></span></button>
11
+ </div>
12
+ <div class="nav__bar"><div class="nav__bar-inner">
13
+ <a class="nav__brand">Tally</a>
14
+ <nav class="nav__links">…</nav>
15
+ <a class="btn btn--accent">Start</a>
16
+ </div></div>
17
+ </header>
18
+ ```
19
+ ```css
20
+ :root { --banner-h: 42px; --bar-h: 64px; }
21
+ .nav { position: fixed; inset: 0 0 auto; z-index: 500; transform: translateY(0); transition: transform 320ms var(--ease-out); }
22
+ .nav.is-compact { transform: translateY(calc(var(--banner-h) * -1)); } /* banner hides, bar docks to top */
23
+ .nav.is-dismissed { transform: none; }
24
+ .nav.is-dismissed .nav__banner { display: none; }
25
+ .nav__banner { height: var(--banner-h); display: flex; align-items: center; justify-content: center;
26
+ background: linear-gradient(100deg, var(--color-accent), var(--color-accent-deep)); color: var(--color-paper); }
27
+ /* content clears both at rest; zero --banner-h on dismiss so calc() reflows with no gap */
28
+ .demo-hero { padding-top: calc(var(--banner-h) + var(--bar-h) + 4rem); }
29
+ ```
30
+ *JS:* track scroll direction — past ~48px going down → `.is-compact`; going up → remove it; near top → always show. Dismiss × sets `--banner-h: 0px` (via `documentElement.style`) and adds `.is-dismissed`.
31
+
32
+ **Knobs** — *Banner fill:* solid accent · gradient (default) · tint+ink · *Dismiss:* yes (default) · none · *Bar scroll:* sticky (default) · also-frosts · *Banner content:* promo · status · countdown.
33
+ *Anti-pattern:* never make the top tier a second set of nav links — that's the "two nav bars" smell the banner exists to avoid. Keep the banner one line, one link, one dismiss. Don't animate banner height directly (janky); translate the whole `.nav` and zero the height only on dismiss.
34
+ *Mobile:* banner text truncates / drops the leading glyph; nav links collapse; the Buy/primary CTA stays.
@@ -0,0 +1,39 @@
1
+ ### N13 · Inline ⌘K search pill
2
+ A **visible** search pill sits inline in the bar — placeholder text plus a `⌘K` kbd hint — alongside (not replacing) the links. Click it, or press ⌘K / Ctrl K, to open a spotlight modal with grouped, keyboard-navigable results. The opposite of N4 (which *hides* nav behind the shortcut): here the affordance is on the surface for newcomers, with the shortcut for power users. Tailwind, Linear, Raycast, docs sites.
3
+ *Use when:* the product is search-heavy or docs-heavy and search is a primary action (dev tools, music/library apps, large content sites).
4
+ *Don't confuse with:* N4 (no visible nav, ⌘K only); a plain search icon that just focuses an input in place.
5
+
6
+ ```html
7
+ <header class="nav" id="nav"><div class="nav__inner">
8
+ <a class="nav__brand">Crank</a>
9
+ <button class="searchpill" id="searchpill" aria-label="Search (⌘K)">
10
+ <span class="searchpill__ico"></span><span class="searchpill__text">Search docs…</span>
11
+ <span class="searchpill__kbd"><kbd>⌘</kbd><kbd>K</kbd></span>
12
+ </button>
13
+ <nav class="nav__right"><a class="nav__link">Docs</a><a class="btn btn--accent">Start</a></nav>
14
+ </div></header>
15
+ <div class="cmdk" id="cmdk" aria-hidden="true">
16
+ <div class="cmdk__backdrop" data-close></div>
17
+ <div class="cmdk__panel" role="dialog" aria-modal="true">
18
+ <div class="cmdk__field"><span class="cmdk__field-ico"></span><input id="cmdk-input" placeholder="Search docs…"><kbd>esc</kbd></div>
19
+ <div class="cmdk__results"><p class="cmdk__group">Suggested</p><button class="cmdk__item is-active">…</button></div>
20
+ <div class="cmdk__foot"><span><kbd>↑</kbd><kbd>↓</kbd> navigate</span><span><kbd>↵</kbd> open</span><span><kbd>esc</kbd> close</span></div>
21
+ </div>
22
+ </div>
23
+ ```
24
+ ```css
25
+ .searchpill { display: flex; align-items: center; gap: 0.6rem; height: 40px; padding: 0 0.55rem 0 0.85rem;
26
+ background: var(--color-paper-2); border: 1px solid var(--color-rule); border-radius: 999px; color: var(--color-muted);
27
+ transition: border-color 200ms, box-shadow 200ms; }
28
+ .searchpill:hover { border-color: var(--color-rule-2); box-shadow: 0 4px 16px -10px oklch(0% 0 0 / 0.3); }
29
+ .cmdk { position: fixed; inset: 0; z-index: 700; opacity: 0; visibility: hidden; transition: opacity 200ms, visibility 200ms; }
30
+ .cmdk.is-open { opacity: 1; visibility: visible; }
31
+ .cmdk__panel { position: absolute; top: 14vh; left: 50%; transform: translateX(-50%) translateY(-8px) scale(0.98);
32
+ width: min(560px, calc(100vw - 2rem)); transition: transform 240ms var(--ease-spring); }
33
+ .cmdk.is-open .cmdk__panel { transform: translateX(-50%) translateY(0) scale(1); }
34
+ ```
35
+ *JS:* ⌘K / Ctrl K toggles, Esc closes, backdrop-click closes, ↑/↓ move the active item, Enter selects, focus the input on open and lock body scroll.
36
+
37
+ **Knobs** — *Pill placement:* centred (default) · right-of-brand · *Result groups:* flat · grouped (default) · *Footer hints:* shown (default) · hidden · *Open trigger:* pill+⌘K (default) · ⌘K only (→ that's N4, not N13).
38
+ *Anti-pattern:* don't fake the modal with a `<div>` that traps no focus and ignores Esc — if you ship the pill you ship the keyboard model. The pill must look like search (icon + placeholder), not a generic button.
39
+ *Mobile:* the pill collapses to a search icon; the modal goes full-height sheet.
@@ -0,0 +1,35 @@
1
+ ### N1b · Canonical SaaS three-section
2
+ Wordmark hard-left · a centred cluster of 4–6 links (some opening hover dropdowns) · a sign-in text link + filled CTA hard-right. The dominant marketing-nav of 2024–26 (Stripe, Linear, Vercel, Figma, Notion, PostHog). The structural opposite of N1's *minimal* two-link variant — this one is dense and balanced.
3
+ *Use when:* a SaaS / product / dev-tool page with several real destinations and a clear primary action. The default reach for modern-minimal and (Hum-styled) playful product pages.
4
+ *Don't confuse with:* N1a (wordmark + 2 links, no centre cluster); N5 (detached pill); N11 (mega-menu panels, not small dropdowns).
5
+
6
+ ```html
7
+ <header class="nav"><div class="nav__inner">
8
+ <a class="nav__brand">Conduit</a>
9
+ <nav class="nav__center">
10
+ <div class="nav__item nav__item--menu">
11
+ <button class="nav__link" aria-expanded="false">Product <span class="nav__caret"></span></button>
12
+ <div class="nav__dropdown"><a class="nav__dropitem"><b>Gateway</b><i>one endpoint</i></a></div>
13
+ </div>
14
+ <a class="nav__link">Docs</a><a class="nav__link">Pricing</a>
15
+ </nav>
16
+ <div class="nav__right"><a class="btn btn--text">Sign in</a><a class="btn btn--accent">Start</a></div>
17
+ </div></header>
18
+ ```
19
+ ```css
20
+ .nav { position: fixed; inset: 0 0 auto; z-index: 500; background: transparent; border-bottom: 1px solid transparent;
21
+ transition: background 240ms, border-color 240ms, box-shadow 240ms; }
22
+ .nav.is-scrolled { background: color-mix(in oklch, var(--color-paper) 72%, transparent);
23
+ backdrop-filter: blur(18px) saturate(160%); border-bottom-color: var(--color-rule); box-shadow: 0 8px 28px -18px oklch(0% 0 0 / 0.4); }
24
+ .nav__inner { max-width: var(--page-max); margin: 0 auto; padding-inline: var(--page-gutter); height: 64px;
25
+ display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
26
+ .nav__brand { justify-self: start; } .nav__center { justify-self: center; display: flex; gap: 0.35rem; } .nav__right { justify-self: end; }
27
+ .nav__dropdown { position: absolute; opacity: 0; visibility: hidden; transform: translateY(-6px) scale(0.98);
28
+ transition: opacity 200ms, transform 220ms var(--ease-spring), visibility 200ms; }
29
+ .nav__item--menu:hover .nav__dropdown, .nav__item--menu:focus-within .nav__dropdown { opacity: 1; visibility: visible; transform: none; }
30
+ ```
31
+
32
+ **Knobs** — *Centre links:* 3 · 4 · 5–6 · *Dropdowns:* none · 1 · 2 · *Scroll state:* frost-on-scroll (default) · always-solid · transparent-fixed · *CTA pair:* sign-in + fill · fill only.
33
+ *Scroll behaviour (default):* transparent at rest over the hero, frosts (blur backdrop + hairline border + soft shadow) past ~24px, and tightens height ~8px. Always rAF-throttle the scroll handler.
34
+ *Anti-pattern:* don't let the centre cluster collide with brand/CTA — if it can't sit centred with breathing room, drop to 3 links or route to N1a. Never ship a dropdown that opens on click only with no hover/focus affordance.
35
+ *Mobile:* hide `.nav__center` below ~900px; brand + CTA (or hamburger) remain.
@@ -1,6 +1,6 @@
1
1
  ### N9 · Edge-aligned minimal
2
2
  Wordmark hard-left, single CTA hard-right, vast empty space between, no link row at all. The *absence* is the design — Apple product pages, Carl Hauser, luxury sites.
3
- *Use when:* the page is luxury / quiet / Atelier / Salon and the brand earns the silence.
3
+ *Use when:* the page is luxury / quiet / Atelier / Garden and the brand earns the silence.
4
4
  *Don't confuse with:* N1 Wordmark + 2 links (which fills the middle).
5
5
 
6
6
  ```html
@@ -11,9 +11,9 @@ Heading remains in viewport while content scrolls beneath. Orientation aid.
11
11
  ```
12
12
  ```css
13
13
  /* If the page has a sticky top nav, offset by its height so the sticky
14
- head docks BENEATH it instead of bleeding over (slop-test gate 68).
14
+ head docks BENEATH it instead of bleeding over (slop-test gate 56).
15
15
  Use --z-sticky (in-page) so the nav's --z-sticky-nav out-paints it. */
16
16
  .head-sticky { position: sticky; top: var(--banner-height, 0px); background: var(--color-paper); padding-block: var(--space-sm); border-bottom: 1px solid var(--color-ink); z-index: var(--z-sticky); }
17
17
  ```
18
18
 
19
- **Sticky pairing rule:** if the page emits a sticky `<header>` / `<nav>` / `.banner` (anything with `position: sticky; top: 0`), you MUST also declare `--banner-height` (a px value matching the nav's height) and `--z-sticky-nav` (≥ 1 above `--z-sticky`) in `tokens.css`. The S3 recipe above pulls both. Without those tokens the section head paints over the nav during scroll — see slop-test gate 68.
19
+ **Sticky pairing rule:** if the page emits a sticky `<header>` / `<nav>` / `.banner` (anything with `position: sticky; top: 0`), you MUST also declare `--banner-height` (a px value matching the nav's height) and `--z-sticky-nav` (≥ 1 above `--z-sticky`) in `tokens.css`. The S3 recipe above pulls both. Without those tokens the section head paints over the nav during scroll — see slop-test gate 56.
@@ -105,7 +105,7 @@ Three voice patterns: *poetic restraint*, *passion via enumeration*, *vulnerabil
105
105
  - *"Design engineer creating software that makes people feel something."* — rauno.me — emotional outcome over feature list; "feel something" avoids genre cliché
106
106
  - *"All I want to do is build websites. Typography, motion design, copywriting, performance — the web is an endless medium of opportunity."* — paco.me — passion via enumeration; vulnerability ("scratched the surface")
107
107
  - *"I craft UI demos that explore the power of the web and help others sharpen their skills."* — jhey.dev — names the verb (*craft*), names the audience (*others*)
108
- - *"Soft, but exact."* — Hallmark Plume — two short adjectives, one comma, full stop
108
+ - *"Soft, but exact."* — Hallmark Hum — two short adjectives, one comma, full stop
109
109
  - *"This page is soft because the surface should be soft. The rules underneath are not."* — pairs claim with refusal
110
110
 
111
111
  ### Technical
@@ -127,9 +127,9 @@ Three voice patterns: *heritage with specifics*, *refusal as sophistication*, *n
127
127
 
128
128
  - *"The world's most acclaimed creative collective, where 23 partners work independently and collaboratively to shape the future of design."* — pentagram.com — heritage (implied longevity), named scale (23 partners)
129
129
  - *"By appointment."* — atelier-style — refusal as gatekeeping
130
- - *"A salon for the senses."* — Hallmark Salon — single nominal phrase, comma-free
131
- - *"A page should arrive like a person — composed, deliberate, in good clothes."* — Hallmark Salon — analogy treats the page as social
132
- - *"With pleasure, you are most welcome."* — Hallmark Salon salutation — formal address
130
+ - *"A study in the senses."* — Hallmark Atelier — single nominal phrase, comma-free
131
+ - *"A page should arrive like a person — composed, deliberate, in good clothes."* — Hallmark Atelier — analogy treats the page as social
132
+ - *"With pleasure, you are most welcome."* — Hallmark Editorial salutation — formal address
133
133
  - *"Restraint, repeated, becomes a signature."* — Hallmark Atelier — three commas, four words, philosophical
134
134
  - *"A studied hand."* — three words; the determiner does the work
135
135
  - *"A small, opinionated craftsmanship engine that argues with your AI assistant on your behalf — and wins."* — Hallmark Atelier — names the role precisely, embraces the conflict
@@ -151,12 +151,12 @@ Three voice patterns: *analogy via pop-culture*, *food/sensory metaphor*, *antic
151
151
 
152
152
  Three voice patterns: *extreme abbreviation*, *principle as opening*, *refusal of marketing language*.
153
153
 
154
- - *"Hello."* — Hallmark Quiet salutation — one word; the period is the design
155
- - *"This is a page that doesn't try."* — Quiet — declares the position openly
154
+ - *"Hello."* — Hallmark Coral salutation — one word; the period is the design
155
+ - *"This is a page that doesn't try."* — Coral — declares the position openly
156
156
  - *"Things Become Other Things."* — craigmod.com — three words; treats brand as essay title
157
157
  - *"Lightness above weightiness, elevate everyone you encounter."* — craigmod.com — principle-first positioning
158
- - *"A quiet skill."* — Hallmark Quiet — three words; the article is doing work
159
- - *"Software can be soft and exact at once. That's the trick."* — Hallmark Plume — names the contradiction, names the resolution
158
+ - *"A quiet skill."* — Hallmark Coral — three words; the article is doing work
159
+ - *"Software can be soft and exact at once. That's the trick."* — Hallmark Hum — names the contradiction, names the resolution
160
160
  - *"One HTML file."* — Anya (test 06) footer — three words; the count is the boast
161
161
  - *"This page doesn't move."* — names the design decision openly
162
162
 
@@ -350,7 +350,7 @@ The Lottie Tell, version 2026: a generic LottieFiles pull where pure CSS would h
350
350
  **Brief:** "Build a landing page for a small bakery in Lisbon."
351
351
 
352
352
  **Step 2 (macrostructure):** Long Document — the bakery is a story-led brand, not a SaaS product.
353
- **Step 3 (theme):** Linen — warm-paper, prose-led, intimate.
353
+ **Step 3 (theme):** Atelier — warm-paper, prose-led, intimate.
354
354
  **Step 4 (enrichment):** E5 Custom Illustration Centerpiece. Tier B (hand-built SVG).
355
355
 
356
356
  **The output:**
@@ -362,7 +362,7 @@ A 60-line SVG of a single loaf, three paths (crust + crumb + scoring marks), pos
362
362
  * H5 hero: Letter (intimate salutation + 2-paragraph body)
363
363
  * enrichment: E5 Custom Illustration · craft: tier-B SVG (60 lines)
364
364
  * animation: @property --rise (6s, alternate) + stroke-dasharray draw-on
365
- * theme: Linen · accent: warm-amber ~3% · studied: no
365
+ * theme: Atelier · accent: warm-amber ~3% · studied: no
366
366
  */
367
367
  ```
368
368
 
@@ -1,13 +1,17 @@
1
1
  # Custom theme — protocol
2
2
 
3
- Loaded only when the user has opted into the **custom** theme route in Step 1 of the Design flow. Custom produces a **complete OKLCH palette + free-font pairing tuned to this brief** a one-off theme written inline into the page's `:root`, not a permanent catalog entry.
3
+ Loaded only when the user has opted into the **custom** theme route in Step 1 of the Design flow. Custom is **made-to-measure for one brief**, written inline into the page's `:root`, never a permanent catalog entry. It spans a **spectrum of depth**: at its lightest, a complete OKLCH palette + free-font pairing tuned to the brief while keeping Hallmark's structures (the *combination* is per-brief); at its fullest **bespoke** — the page's *structure and composition* are designed from first principles too, bound to no catalog theme, genre, or macrostructure. One route, chosen depth.
4
4
 
5
- **The freedom is the combination, not the rules.** Every constraint in [`color.md`](color.md), [`typography.md`](typography.md), and [`anti-patterns.md`](anti-patterns.md) still applies. The 65 slop-test gates fire unchanged. The Step 5 preview block surfaces the palette + pairing in plain text *before* any code is emitted, so the user can redirect.
5
+ **The freedom is the combination — and, at the bespoke depth, the whole structure — but never the floor.** Every constraint in [`color.md`](color.md), [`typography.md`](typography.md), and [`anti-patterns.md`](anti-patterns.md) still applies, and **every slop-test gate fires unchanged at every depth** — the gates are the floor that never moves. The Step 5 preview surfaces the palette + pairing (plus the bespoke structure, when there is one) in plain text *before* any code is emitted, so the user can redirect.
6
6
 
7
- ## Two words, plain English
7
+ ## Two routes, plain English
8
8
 
9
- - **catalog** — the named-theme catalogue. Hallmark's 22 themes (Specimen, Atelier, Brutal, Salon, Newsprint, Linen, Studio, Manifesto, Terminal, Midnight, Almanac, Garden, Quiet, Riso, Sport, Bloom, Coral, Violet, Aurora, Halo, Plume, Editorial). Each one is a fixed combination of paper-band, display-style, and accent-hue. The rotation rule cycles through them so two consecutive runs don't read alike. **This is the default.** Most briefs use it.
10
- - **custom** — made-to-measure. A one-off palette + font pairing constructed specifically for one brief. The skill builds the OKLCH values, picks fonts, and stamps the page — but does **not** extend the catalog with a new theme. The rules behind the catalog (paper L bands, accent chroma caps, font ban list, slop-test gates) all still apply; only the *combination* is per-brief.
9
+ - **catalog** — the named-theme catalogue. Hallmark's 20 themes (Specimen, Midnight, Brutal, Garden, Atelier, Newsprint, Terminal, Manifesto, Almanac, Sport, Studio, Riso, Bloom, Coral, Cobalt, Aurora, Editorial, Carnival, Lumen, Hum). Each one is a fixed combination of paper-band, display-style, and accent-hue. The rotation rule cycles through them so two consecutive runs don't read alike. **This is the default.** Most briefs use it.
10
+ - **custom** — made-to-measure, at the depth the brief needs:
11
+ - **Tuned** — a one-off OKLCH palette + font pairing built for one brief, *keeping* Hallmark's structures, archetypes, and macrostructures. The rules (paper L bands, accent chroma caps, font ban list, all slop-test gates) still apply; only the *combination* is per-brief.
12
+ - **Bespoke** — when the brief's *structure itself* is the ask, custom goes further and designs the whole page from first principles — its own palette, type, **and** composition — dropping the catalog's structures too, floored only by the universal slop-test gates. Same route, deeper end. See **§ Bespoke depth** below.
13
+
14
+ Either way, custom does **not** extend the catalog with a permanent theme.
11
15
 
12
16
  ## When to surface this fork — Step 1 trigger signals
13
17
 
@@ -15,12 +19,13 @@ Hallmark must **not** offer catalog-vs-custom on every prompt. That's friction,
15
19
 
16
20
  1. **Explicit ask** — the user types `custom`, "custom theme", "tailored to our brand", "make it ours", "something unique", "play around with the colors and fonts", "I want my own palette".
17
21
  2. **Named brand colour** — the user gives a specific anchor colour as a hex / OKLCH / brand name. Example: "use our terracotta", "the brand red is hex #c0392b", "anchor on sea-blue".
18
- 3. **Multi-attribute aesthetic the catalog can't carry** — three or more vibe words pointing at a specific, off-catalog feel. Examples: "moss, lichen, soft pink, herbal" / "sun-drenched, market-day, carbon-black" / "late-night, neon, brutalist deli". Compare against the 22 catalog themes; if no single catalog theme is within one axis-step of the vibe, fire the fork. **One adjective ("warm", "technical", "playful") is not a signal — that's a tone, the catalog already carries it.**
22
+ 3. **Multi-attribute aesthetic the catalog can't carry** — three or more vibe words pointing at a specific, off-catalog feel. Examples: "moss, lichen, soft pink, herbal" / "sun-drenched, market-day, carbon-black" / "late-night, neon, brutalist deli". Compare against the 20 catalog themes; if no single catalog theme is within one axis-step of the vibe, fire the fork. **One adjective ("warm", "technical", "playful") is not a signal — that's a tone, the catalog already carries it.**
19
23
  4. **Brand-mood reference attached** — the user attaches a colour swatch, a moodboard, a Pantone chip. (If they attach a *page* screenshot, route to `study` instead; custom is for brand colour / mood, study is for design DNA.)
24
+ 5. **A singular structural vision** (→ the *bespoke* depth) — the brief names a *structure or composition*, not just a palette/mood: "no theme / from scratch / fully bespoke / ignore the catalog / art-direct it", or a one-of-a-kind page-shape the macrostructure catalog has no entry for (a scroll-assembling poem, a ticket-shaped page, an interactive periodic table). Routes to custom's **bespoke depth** (§ Bespoke depth below). A palette or mood that's merely off-catalog is *tuned* custom, not bespoke.
20
25
 
21
26
  If any signal fires, ask one short follow-up before picking a theme:
22
27
 
23
- > *"This brief reads like a custom palette would fit better than the 22 named themes. Want me to construct a custom OKLCH palette + free-font pairing tuned to <one-line summary of the vibe>, or stay on the catalog for variety + speed?"*
28
+ > *"This brief reads like a custom palette would fit better than the 20 named themes. Want me to construct a custom OKLCH palette + free-font pairing tuned to <one-line summary of the vibe>, or stay on the catalog for variety + speed?"*
24
29
 
25
30
  Wait for the user to answer. If they say custom (or yes / go) → continue this protocol from § A. If they say catalog (or no / stay catalog) → drop the fork and proceed with the catalog route. **Default to catalog** — silence routes to catalog, not custom.
26
31
 
@@ -42,6 +47,39 @@ If the user gives just two or three words ("sun-drenched"), proceed; the recipe
42
47
 
43
48
  ---
44
49
 
50
+ ## § Bespoke depth — custom that designs the whole page
51
+
52
+ Most custom runs are *tuned* (a palette + pairing on Hallmark's existing structures). **Bespoke** is the deep end, fired by signal 5: the brief's *structure itself* is the ask and no catalog shape fits. At this depth custom designs the page from first principles — palette, type, **and** composition — and the only thing it inherits is the floor.
53
+
54
+ Confirm the route once (same discipline as any custom — default to catalog on silence), then take **one** input: *"the direction in a sentence or two — what should this page feel like and do that an off-the-shelf theme wouldn't?"*
55
+
56
+ **It drops** (only at this depth):
57
+ - the named-theme tokens — write the palette inline for this page only (§ B still governs *how*);
58
+ - the genre cluster routing — no editorial / atmospheric / modern-minimal / playful archetype defaults;
59
+ - the fixed macrostructure + archetype catalog — compose the page's structure for the brief; a novel hero, nav, or section is *encouraged* when it serves the idea;
60
+ - the diversification rotation — bespoke is a one-off (like studied-DNA), though it shouldn't clone a recent bespoke run.
61
+
62
+ **It keeps** — the non-negotiable floor, identical to tuned custom:
63
+ - **every universal slop-test gate** ([`slop-test.md`](slop-test.md)) — the guarantee that survives the freedom;
64
+ - accessibility & contrast (APCA / WCAG), a visible `:focus-visible`, `prefers-reduced-motion`, semantic landmarks, alt text;
65
+ - the **font ban-list** (Gate 1) and free-baseline-only discipline (§ C);
66
+ - **OKLCH palette discipline** (§ B) — tinted neutrals, no pure `#000`/`#fff`, accent kept to a signal unless the concept earns more;
67
+ - one orchestrated motion; the Step 5 preview before code; the Step 6 stamp + log.
68
+
69
+ **Process:** read the brief + the one-line direction → design the *system and the one central move* (the idea that makes it not-a-template) → run the gates *as you compose* → surface the preview (palette, type, structure, central idea) → build, stamp, log. Bespoke is **more** design judgment, not less — a bespoke page that reads generic, or trips a gate, has failed; re-design.
70
+
71
+ **Stamp (bespoke runs):**
72
+ ```css
73
+ /* Hallmark · route: custom (bespoke) · structure: <one-line shape> · idea: "<central move>"
74
+ * paper: oklch(...) · accent: oklch(...) · display: <font> · body: <font>
75
+ * axes: <paper-band> / <display-style> / <accent-hue> · gates: all-pass · studied: no
76
+ */
77
+ ```
78
+
79
+ **Bespoke is rare.** Most briefs are catalog; some are tuned custom; few are bespoke. Reaching for bespoke on a vanilla brief is over-reach — route to catalog.
80
+
81
+ ---
82
+
45
83
  ## § B · Palette construction
46
84
 
47
85
  Build the palette in this order. Each step cites the rule it's obeying — do not restate the rule, just apply it.
@@ -95,9 +133,9 @@ These are not arbitrary. The L-step gives the palette **typographic depth** with
95
133
 
96
134
  ### B.7 · Verification
97
135
 
98
- - **Gate 8** (no pure #000 / #fff base): paper and ink both have chroma > 0. Pass.
99
- - **Gate 24** (no zero-chroma neutrals): every grey has chroma ≥ 0.005. Pass.
100
- - **Gate 25** (accent ≤ 5 % footprint): plan the accent's role on the page (active state, one wordmark dot, one CTA fill). Don't carpet a section in accent.
136
+ - **Gate 7** (no pure #000 / #fff base): paper and ink both have chroma > 0. Pass.
137
+ - **Gate 22** (no zero-chroma neutrals): every grey has chroma ≥ 0.005. Pass.
138
+ - **Gate 23** (accent ≤ 5 % footprint): plan the accent's role on the page (active state, one wordmark dot, one CTA fill). Don't carpet a section in accent.
101
139
 
102
140
  ---
103
141
 
@@ -213,7 +251,7 @@ Custom runs extend the existing schema with a `theme_axes` field and an optional
213
251
  "brief": "Coffeebox · subscription" }
214
252
  ```
215
253
 
216
- Catalog entries continue to record `theme: <name>` and skip `theme_axes` (the catalog's axes are looked up from [`tokens.css`](../../site/css/tokens.css)). Step 2.5 logic uses the same diversification check on both — for catalog entries it reads the axes from tokens.css; for custom entries it reads them from the entry.
254
+ Catalog entries continue to record `theme: <name>` and skip `theme_axes` (the catalog's axes are looked up from [`tokens.css`](../../../site/css/tokens.css)). Step 2.5 logic uses the same diversification check on both — for catalog entries it reads the axes from tokens.css; for custom entries it reads them from the entry.
217
255
 
218
256
  When rotating, **a custom run that follows another custom run must differ on at least one axis from the previous custom** — same rule as catalog-vs-catalog. A custom run that follows a catalog run must differ on at least one axis from the catalog's axes. The diversification rule is theme-route-blind.
219
257
 
@@ -321,7 +359,7 @@ The vibe names two hues: *moss* (greenish, ~140°) and *soft pink* (warm, ~350°
321
359
  ## What custom does **not** do (worth restating)
322
360
 
323
361
  1. **Does not invent themes that ignore the rules.** Every paper L band, accent chroma cap, neutral-tinting requirement, font ban, and slop-test gate carries forward. The freedom is the *combination* — not the rules.
324
- 2. **Does not save themes for reuse.** A custom run is per-output. The skill does not write back to [`tokens.css`](../../site/css/tokens.css). If the user wants a permanent theme, they paste the custom palette into tokens.css themselves and name it.
362
+ 2. **Does not save themes for reuse.** A custom run is per-output. The skill does not write back to [`tokens.css`](../../../site/css/tokens.css). If the user wants a permanent theme, they paste the custom palette into tokens.css themselves and name it.
325
363
  3. **Does not ask multiple follow-up questions.** One vibe answer (+ optional anchor) is enough. The audience/use/tone from Step 1 plus the brief plus the macrostructure pick already give the model 80 % of the signal.
326
364
  4. **Does not relax the diversification rule.** Custom entries declare their three axes the same way catalog entries do; the rotation rule fires on both, theme-route-blind.
327
365
  5. **Does not bypass the Step 5 preview.** The custom palette + pairing surface in plain text *before* any code is emitted, so the user can redirect early.
@@ -116,7 +116,7 @@ Or, if the project uses a CSS bundler / framework that doesn't honour bare `@imp
116
116
  }
117
117
  ```
118
118
 
119
- **Worked example — modern-minimal theme (Quiet-like):**
119
+ **Worked example — modern-minimal theme (austere, pure-white):**
120
120
 
121
121
  ```css
122
122
  :root {
@@ -8,33 +8,35 @@ Brief mentions any of: *AI tool, generative, music, video, image, voice, late-ni
8
8
 
9
9
  ## Themes that belong
10
10
 
11
- `Bloom` (canonical), `Midnight`, `Terminal`. Three dark-paper themes; the rotation walks them when atmospheric is active.
11
+ `Bloom` (canonical light-paper), `Midnight`, `Terminal`, `Aurora`, `Lumen`. Five themes; the rotation walks them when atmospheric is active.
12
+
13
+ `Lumen` is the premium AI-tool register — Modal / Anthropic / Together / ElevenLabs / Cluely / Adept / Granola. One focal CSS artefact + classical italic-serif headline + mono technical eyebrow. **Two palette drops** (Night Foundry — dark amber-gold, emits; Day Foundry — light indigo, refracts). The only atmospheric theme with a serif display and the only one whose canvas treatment is one *built* artefact rather than two diffuse blooms.
12
14
 
13
15
  ## Voice
14
16
 
15
17
  - **Display** — Geist Sans 600 or similar weighty sans, plain English, no ornament. Letter-spacing tight (`-0.03em` or tighter).
16
18
  - **Body** — same family, 400. Light grey on dark (`oklch(86% 0.008 40)`).
17
- - **Accent** — single warm hue (orange / amber / red / pink). Used in radial-gradient blooms on the canvas, on focus rings, on small tags. Never on display text (that's gate 5 universal — gradient text stays banned).
19
+ - **Accent** — single warm hue (orange / amber / red / pink). Used in radial-gradient blooms on the canvas, on focus rings, on small tags. Never on display text (that's gate 2 universal — gradient text stays banned).
18
20
  - **Layout** — centred or near-centred heroes. The canvas itself is the design; the type sits on top of an atmospheric ground.
19
21
  - **Motion** — fade-in only. No slide, no bounce. The atmosphere does the work.
20
22
  - **Copy tone** — direct, slightly poetic, specific. *"Make a house song about quitting your job."* is the calibration.
21
23
 
22
24
  ## What this genre allows
23
25
 
24
- - **Radial-gradient bloom** on the body background — up to two blooms, each ~20–30 % footprint, fixed-attached, no animation. Gate 31 universal is loosened here.
25
- - **Centred heroes** — gate 7 universal is loosened. The canvas frames the type.
26
+ - **Radial-gradient bloom** on the body background — up to two blooms, each ~20–30 % footprint, fixed-attached, no animation. Gate 29 universal is loosened here.
27
+ - **Centred heroes** — gate 6 universal is loosened. The canvas frames the type.
26
28
  - **Pill-rounded CTAs** with accent fill — confident, not pastel.
27
29
  - **Glow shadows** on hover (cards lift toward the user with a soft warm shadow).
28
30
  - **Larger expressive type** — display can hit 6 rem (`clamp(3rem, 6vw + 1rem, 6rem)`).
29
31
 
30
32
  ## What this genre disallows
31
33
 
32
- - **Light-paper aesthetics** — the canvas is dark. Don't sneak white sections in.
33
- - **Italic serif body** — atmospheric stays sans top-to-bottom.
34
+ - **Light-paper aesthetics** — the *default* canvas is dark. Bloom and Lumen's Day Foundry are the documented light-paper exceptions; both still emit/refract light from a focal canvas treatment. Don't sneak white sections into a dark-paper build.
35
+ - **Italic in headers** — banned globally (a top AI tell). Atmospheric display is roman; Lumen ships Instrument Serif as a **roman** headline face, with the verb landmark carried by accent colour + a drawn underline, never italics. Body stays Geist Sans.
34
36
  - **Hairlines** — atmospheric uses elevated cards (`paper-2`, `paper-3`) instead of hairline-on-paper.
35
37
  - **Multiple accent hues** — one warm bloom + one secondary (pink/red) is the maximum. No teal-and-amber juggling.
36
38
  - **Glassmorphism** — banned. Atmospheric is *atmospheric*, not glass.
37
- - **Gradient text** — gate 5 universal. Stays banned.
39
+ - **Gradient text** — gate 2 universal. Stays banned.
38
40
 
39
41
  ## Voice fixtures
40
42
 
@@ -43,6 +45,8 @@ Brief mentions any of: *AI tool, generative, music, video, image, voice, late-ni
43
45
  - *"A canvas, then a tool."*
44
46
  - *"Generate, refine, ship — between Tuesday and Wednesday."*
45
47
  - *"The instrument is dark. The output is yours."*
48
+ - *"Built to think in real time."* — Lumen voice; the verb is the landmark via accent colour + underline, never italics.
49
+ - *"A single primitive that scales down to zero."* — Lumen voice; technical, declarative.
46
50
 
47
51
  ## Nav and footer voice
48
52
 
@@ -10,11 +10,13 @@ Default. Pick editorial when the brief does not name a specialised aesthetic —
10
10
 
11
11
  ## Themes that belong
12
12
 
13
- `Specimen`, `Newsprint`, `Atelier`, `Garden`, `Salon`, `Linen`, `Almanac`, `Studio`, `Riso`, `Sport`, `Brutal`, `Manifesto`. Twelve themes — plenty of variety inside the genre.
13
+ `Specimen`, `Newsprint`, `Atelier`, `Garden`, `Almanac`, `Studio`, `Riso`, `Sport`, `Brutal`, `Manifesto`, `Editorial`, `Carnival`. Twelve themes — plenty of variety inside the genre.
14
+
15
+ `Carnival` is the loud-maximalist editorial register — Dropout TV / Fly.io / Stones Throw / Third Man Records. Duo-tone accent system (mustard + oxblood), chunky variable display, decorative ornaments, hard-offset shadows. The loud sibling to Riso / Manifesto / Brutal.
14
16
 
15
17
  ## Voice
16
18
 
17
- - **Display** — italic serif, condensed sans, or display-heavy. Not Inter. Not Geist. The weight commits to an extreme (300 or 700+).
19
+ - **Display** — roman serif, condensed sans, or display-heavy. Not Inter. Not Geist. The weight commits to an extreme (300 or 700+). Italic is body-emphasis only — never the header face (global rule).
18
20
  - **Body** — workhorse serif (Newsreader, Cormorant) or a plain non-default sans (The Future, Söhne). Readable at 45–75 ch.
19
21
  - **Accent** — single warm or cool hue, used at < 5 % of any viewport.
20
22
  - **Layout** — asymmetric. Hairlines, not card borders. Generous whitespace.
@@ -35,11 +37,11 @@ Default. Pick editorial when the brief does not name a specialised aesthetic —
35
37
  The universal slop-test gates apply, plus these editorial-specific bans:
36
38
 
37
39
  - **Pill-rounded buttons** with gradient fill — pill is fine, gradient on a pill is not.
38
- - **Centred-everything heroes** (gate 7 universal). Editorial heroes are left-biased or asymmetric.
40
+ - **Centred-everything heroes** (gate 6 universal). Editorial heroes are left-biased or asymmetric.
39
41
  - **Card-in-card** layouts (gate 4 universal).
40
42
  - **Three-column equal-icon-tile feature grid** (gate 3 universal).
41
43
  - **Glassmorphism** — never; the medium is paper, not glass.
42
- - **Pure black or pure white** as paper or ink (gate 8). Tint everything toward the anchor.
44
+ - **Pure black or pure white** as paper or ink (gate 7). Tint everything toward the anchor.
43
45
 
44
46
  ## Voice fixtures
45
47
 
@@ -8,7 +8,11 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
8
8
 
9
9
  ## Themes that belong
10
10
 
11
- `Quiet` (canonical). Future themes can be added to this genre anything monochrome or near-monochrome with Geist / Inter-class sans display and pill CTAs.
11
+ `Coral` (canonical) warm-grey paper, single warm coral accent, Geist throughout, soft pill CTAs. The "Stripe-not-Linear" warmth.
12
+
13
+ `Cobalt` — the cool dev-tool / API / docs register (the GitBook + Firecrawl school, executed **cobalt-on-light, not orange**). Cool engineered near-white paper, one electric cobalt signal accent, Space Grotesk display + Inter body + JetBrains Mono code, ruler-drawn hairlines, tight 6 px radii, a bordered ⌘K nav, and a live code/API request–response hero. The technical, instrument-panel sibling to Coral's warmth — the rotation walks Coral ⇄ Cobalt when modern-minimal is active.
14
+
15
+ The two differ on every axis a glance registers: Coral is warm-grey + coral + Geist + pills; Cobalt is cool-white + electric blue + Space Grotesk/mono + tight-radius bordered controls. Future themes can join this genre too — anything monochrome or near-monochrome with an Inter-class sans display and a single restrained accent.
12
16
 
13
17
  ## Voice
14
18
 
@@ -22,8 +26,8 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
22
26
  ## What this genre allows
23
27
 
24
28
  - **Pill-rounded CTAs** — both filled and outlined. Black-filled primary + white-outlined secondary is the canonical pair.
25
- - **Pure white paper** (`#fff` / `oklch(100% 0 0)`) — gate 8 is loosened here.
26
- - **Zero-chroma neutrals** — gate 24 is loosened here. The Stripe / ElevenLabs school is monochrome by design.
29
+ - **Pure white paper** (`#fff` / `oklch(100% 0 0)`) — gate 7 is loosened here.
30
+ - **Zero-chroma neutrals** — gate 22 is loosened here. The Stripe / ElevenLabs school is monochrome by design.
27
31
  - **Two-column hero with title-left + paragraph-right** — explicitly canonical for this genre.
28
32
  - **Refined card surface** with very subtle border (`oklch(91% 0 0)`) and 8 px radius.
29
33
  - **Large, tight-set displays** (`clamp(2.5rem, 5vw + 0.5rem, 4.75rem)`).
@@ -34,8 +38,8 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
34
38
  - **Hairline-everything** — borders are thin but visible, not the editorial 0.5 px hairline aesthetic.
35
39
  - **Asymmetric prose columns** — modern-minimal aligns left, justified to a regular grid.
36
40
  - **Drop caps, fleurons, ornament** — none of it.
37
- - **Bouncy / overshoot easings** — gate 13 universal applies strictly here.
38
- - **Gradient text** — gate 5 universal. Stays banned.
41
+ - **Bouncy / overshoot easings** — gate 12 universal applies strictly here.
42
+ - **Gradient text** — gate 2 universal. Stays banned.
39
43
  - **Glassmorphism** — banned.
40
44
 
41
45
  ## Voice fixtures
@@ -52,7 +56,7 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
52
56
  - **Acceptable also:** N1 Wordmark + 2 links (when destinations are genuinely minimal); N9 Edge-aligned minimal (when the brand earns the silence).
53
57
  - **Default footer:** Ft2 Inline single line — wordmark + tagline + tiny credit, hairline rule above. Restrained.
54
58
  - **Acceptable also:** Ft1 Mast-headed; Ft5 Statement (when the page wants a closing line).
55
- - **Banned for modern-minimal:** N6 Newspaper masthead (editorial vocabulary); N7 Brutal slab (fights the restraint); Ft8 Marquee scroll (kinetic, wrong voice); Ft3 Index columns at full saturation (the AI-footer fingerprint — gate 52).
59
+ - **Banned for modern-minimal:** N6 Newspaper masthead (editorial vocabulary); N7 Brutal slab (fights the restraint); Ft8 Marquee scroll (kinetic, wrong voice); Ft3 Index columns at full saturation (the AI-footer fingerprint — gate 43).
56
60
 
57
61
  See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
58
62
 
@@ -8,7 +8,9 @@ Brief mentions any of: *fun, consumer, casual, family, kids, friendly, approacha
8
8
 
9
9
  ## Themes that belong
10
10
 
11
- `Plume` (canonical). The genre is small intentionallyplayful is easy to overdo.
11
+ `Hum` (vibrant, alive) is the genre's canonical theme the post-Brilliant-alive register: multi-accent cream + pear + cyan + coral, mandatory motion, a single character moment. Pick it when the brief wants "feels alive in the room with you." For the quieter, more restrained end of friendly "friendly but soft" rather than "alive" — reach instead for modern-minimal (Coral): a single low-chroma accent on warm paper, smooth easings, motion optional.
12
+
13
+ `Hum` is the catalog's only **rounded-sans-multi-accent** theme — it relaxes several playful defaults: bouncy spring easings are allowed (and canonical) on its primary CTA, accent chroma goes higher than 0.16, and motion is mandatory not optional. It answers a specific brief: a learning platform for curious adults, a daily-curiosity app, a habit tracker with character — products that should feel warm and alive, not merely tidy.
12
14
 
13
15
  ## Voice
14
16
 
@@ -29,20 +31,23 @@ Brief mentions any of: *fun, consumer, casual, family, kids, friendly, approacha
29
31
 
30
32
  ## What this genre disallows
31
33
 
32
- - **Saturated consumer-app pinks / purples** — colour stays low chroma even if friendly.
34
+ - **Saturated consumer-app pinks / purples** — playful keeps chroma low by default. **Hum is the documented exception** — pear-yellow at chroma 0.18, sky-cyan at 0.18, coral at 0.24 are allowed and canonical for Hum builds only.
33
35
  - **Emoji-as-decoration** — emoji can appear in copy ("we built X 🌱") but never as visual ornament replacing iconography.
34
- - **Comic Sans, Comic Neue, anything that signals "we're zany"** — playful stays sophisticated.
35
- - **Bouncy / overshoot easings** — gate 13 universal. Even playful uses smooth easings.
36
+ - **Comic Sans, Comic Neue, anything that signals "we're zany"** — playful stays sophisticated, even at full vibrancy.
37
+ - **Bouncy / overshoot easings** — playful uses smooth easings by default. **Hum is the documented exception** — spring overshoot (`cubic-bezier(0.34, 1.56, 0.64, 1)`) is canonical on the primary CTA and character moment (one each per page).
36
38
  - **Glassmorphism** — banned across all genres.
37
- - **Gradient text** — gate 5 universal. Stays banned.
39
+ - **Gradient text** — gate 2 universal. Stays banned.
38
40
 
39
41
  ## Voice fixtures
40
42
 
41
- - *"Made for teams who write together."*
42
- - *"Soft, but exact."*
43
- - *"Software can be soft and exact at once. That's the trick."*
44
- - *"For the people who keep things tidy."*
45
- - *"A small tool, gently opinionated."*
43
+ - *"Made for teams who write together."* — Hum voice
44
+ - *"Soft, but exact."* — Hum voice
45
+ - *"Software can be soft and exact at once. That's the trick."* — Hum voice
46
+ - *"A small tool, gently opinionated."* — Hum voice
47
+ - *"Your daily 30-second curio."* — Hum voice
48
+ - *"Get really good at one thing this quarter."* — Hum voice
49
+ - *"Notice yourself, in 30 seconds."* — Hum voice
50
+ - *"Learn something genuinely new today."* — Hum voice
46
51
 
47
52
  ## Nav and footer voice
48
53
 
@@ -68,7 +68,7 @@ If the brief contains explicit visual cues, pick from this map:
68
68
  • "bakery", "kitchen", "café", "atelier" + craft brief → E5 custom illustration (Tier B SVG)
69
69
  • "agency", "studio", "portfolio" → E8 photography or no enrichment
70
70
  • "manifesto", "essay", "book", "letter" → no enrichment (typography only)
71
- Quiet theme picked → no enrichment (the theme IS restraint)
71
+ Coral theme picked → no enrichment (the theme IS restraint)
72
72
 
73
73
  Else if the brief is genuinely ambiguous, ask one question:
74
74
  "Want me to add a demo video, an illustration, or keep it
@@ -99,7 +99,7 @@ A display headline left, a demo video right, and the rightmost ~10–20 % of the
99
99
  - Aspect ratio (16/10 · 16/9 · 4/3)
100
100
  - Frame treatment (hairline 1 px frame · browser chrome · none)
101
101
 
102
- **Example.** Tracejam (SaaS observability — see [`site/_tests/05-tracejam-saas/`](../../site/_tests/05-tracejam-saas/)). Display headline left ("Distributed tracing that explains itself."); hand-built CSS-art trace waterfall right, tilted -0.4°, extending 12 vw past the viewport's right edge. Aspect 16/10. Hairline frame. **Not a real video** — the mockup is custom-built CSS at Tier A (rectangles on a percentage grid simulating a flame chart). Mobile (< 60 rem): drop the clip, stack vertically.
102
+ **Example.** Tracejam (SaaS observability — see [`site/_tests/05-tracejam-saas/`](../../../site/_tests/05-tracejam-saas/)). Display headline left ("Distributed tracing that explains itself."); hand-built CSS-art trace waterfall right, tilted -0.4°, extending 12 vw past the viewport's right edge. Aspect 16/10. Hairline frame. **Not a real video** — the mockup is custom-built CSS at Tier A (rectangles on a percentage grid simulating a flame chart). Mobile (< 60 rem): drop the clip, stack vertically.
103
103
 
104
104
  ```html
105
105
  <section class="hero hero--clipped">
@@ -204,7 +204,7 @@ A hand-built SVG (the default, Tier B) or a generated raster (Tier C, when chara
204
204
  - Animation (none · loop · scroll-linked)
205
205
  - Scale (small accent · dominant)
206
206
 
207
- **Example.** Maple Street Bread (bakery — see [`site/_tests/03-maple-bakery/`](../../site/_tests/03-maple-bakery/)). Letter-style hero copy left ("Saturday, 6:14 a.m. The dough went in at midnight."), 60-line hand-built SVG loaf right, 3 paths (body, shade, score-marks). Animated with `@property --rise` for a subtle 4 px breathing-loop over 6 s, alternating; the score-marks draw themselves on first paint via `stroke-dasharray`. Tier B, dominant scale, animation: loop. Reduced-motion fallback is a static keyframe.
207
+ **Example.** Maple Street Bread (bakery — see [`site/_tests/03-maple-bakery/`](../../../site/_tests/03-maple-bakery/)). Letter-style hero copy left ("Saturday, 6:14 a.m. The dough went in at midnight."), 60-line hand-built SVG loaf right, 3 paths (body, shade, score-marks). Animated with `@property --rise` for a subtle 4 px breathing-loop over 6 s, alternating; the score-marks draw themselves on first paint via `stroke-dasharray`. Tier B, dominant scale, animation: loop. Reduced-motion fallback is a static keyframe.
208
208
 
209
209
  For *how* to build a hand-drawn loaf in 60 lines of SVG and animate its breath with `@property`, see [`custom-craft.md`](custom-craft.md) — there's a full bakery worked example, plus four more recipes (workflow diagram, mascot, architectural diagram, botanical accent).
210
210
 
@@ -227,7 +227,7 @@ A small custom-built loop — an orbiting dot, a breathing rectangle, an animate
227
227
  A two-colour CSS gradient at low chroma, overlaid with SVG `<feTurbulence>` grain at < 0.1 opacity. *Not* aurora; *not* purple-to-cyan mesh; *not* floating orbs. The point is *texture you can barely see* — paper-quality, not decoration.
228
228
 
229
229
  *Use when:* the page would feel synthetic with a flat surface.
230
- *Avoid when:* the theme already has a paper feel (Specimen, Linen, Riso). Doubling the grain is muddy.
230
+ *Avoid when:* the theme already has a paper feel (Specimen, Atelier, Riso). Doubling the grain is muddy.
231
231
 
232
232
  **Knobs:**
233
233
  - Gradient direction (45° / 135° / radial)
@@ -358,10 +358,10 @@ hero?.addEventListener('pointermove', (e) => {
358
358
 
359
359
  ### HP4 · Decorative-numeral
360
360
 
361
- A huge edition number / year / chapter glyph set in display-italic in a hero corner. The numeral *means something* — issue 22, year 2026, chapter 03, version 0.8. Reads as editorial · salon · newsprint · almanac.
361
+ A huge edition number / year / chapter glyph set in display-italic in a hero corner. The numeral *means something* — issue 22, year 2026, chapter 03, version 0.8. Reads as editorial · newsprint · almanac.
362
362
 
363
363
  *Use when:* the page genuinely has an edition / issue / chapter / version semantic — magazines, journals, archived work, dated essays.
364
- *Avoid when:* the numeral has no semantic anchor. A random "42" in the corner reads as decoration, which is slop (see slop-test gate 55).
364
+ *Avoid when:* the numeral has no semantic anchor. A random "42" in the corner reads as decoration, which is slop (see slop-test gate 45).
365
365
 
366
366
  ```html
367
367
  <header class="hero hero--num">
@@ -385,9 +385,10 @@ A huge edition number / year / chapter glyph set in display-italic in a hero cor
385
385
 
386
386
  Every hero — enriched or not, polished or not — obeys these rules.
387
387
 
388
- - **Footprint.** The hero takes 70–90 % of the first viewport's height — no more, no less. `min-height: 100vh / 100dvh` is the AI fingerprint (gate 7); a hero that's only 20 % of the viewport feels like a header. Aim for `min-height: clamp(60vh, 75dvh, 88dvh)` and let content settle inside.
389
- - **Asymmetric padding.** `padding-block-end` 1.3× `padding-block-start`. The hero sits *into* the page; symmetric padding floats. Slop-test gate 54 enforces this.
390
- - **Never centre everything.** Eyebrow + title + lede + CTA all stacked centred is the AI fingerprint. Pick at most *two* centred elements; break alignment for the others. Gate 53 enforces this. Centred-narrow heroes are admissible only when the genre is editorial / salon / atelier *and* the eyebrow or CTA breaks alignment.
388
+ - **Footprint.** The hero takes 70–90 % of the first viewport's height — no more, no less. `min-height: 100vh / 100dvh` is the AI fingerprint (gate 6); a hero that's only 20 % of the viewport feels like a header. Aim for `min-height: clamp(60vh, 75dvh, 88dvh)` and let content settle inside.
389
+ - **Fit the fold — content, not just the box.** The Footprint rule caps the hero's *height*; this caps its *content*. On a 13″ laptop (~800 px tall) the eyebrow + headline + lede + primary CTA must all be visible **without scrolling**. When they aren't, it's almost always wasted vertical space — an oversized display `clamp()` max, display line-height near 1.2, a 3-line lede, or `padding-block` bloat. Pull the clamp max down, set display line-height 1.0–1.1, hold the lede to ~2 lines, trim the padding. **Right-size, don't cramp** — a hero that already fits needs no shrinking, and this never means tiny type or no whitespace. Slop-test gate 44 enforces this.
390
+ - **Asymmetric padding.** `padding-block-end` 1.3× `padding-block-start`. The hero sits *into* the page; symmetric padding floats. Slop-test gate 44 enforces this.
391
+ - **Never centre everything.** Eyebrow + title + lede + CTA all stacked centred is the AI fingerprint. Pick at most *two* centred elements; break alignment for the others. Gate 6 enforces this. Centred-narrow heroes are admissible only when the genre is editorial / atelier *and* the eyebrow or CTA breaks alignment.
391
392
  - **Entrance animation.** Pick one of {fade, sweep, none} per element — never both fade *and* sweep on the same element. Duration ≤ 220 ms. Disable on `prefers-reduced-motion: reduce`. Cross-reference the "One orchestrated reveal per page" rule below.
392
393
  - **Headline typography.** Prefer one display weight + tight tracking (-0.02em to -0.04em) over default 0; line-height 0.95–1.05 for display, never 1.2 (which inherits the body line-height and reads as un-set type). Avoid two display weights on the same headline (a `<strong>` in a different weight inside the title is AI's idea of "emphasis"; pick one weight, let the words carry).
393
394
  - **One polish pattern, max.** HP1–HP4 are mutually exclusive on a single hero. A vertical rail *and* a marquee-overflow *and* a cursor spotlight *and* a decorative numeral on one hero is a panic attack. Pick one.
@@ -438,7 +439,7 @@ Every question must answer *yes* before the enrichment ships. If any answer is *
438
439
  5. If illustration: built or generated with intent? **Not picked from a Lottie library as a shortcut?**
439
440
  6. If background: under one accent colour at < 5 % footprint? (Aurora and mesh-gradients fail this.)
440
441
  7. Does it survive being deleted? (If the hero still works without it, it earned its place. If the hero collapses without it, you propped weak typography on a crutch.)
441
- 8. Does its tone match the page's tone? (Risograph illustration on a Brutal page = wrong. Hand-drawn doodle on a Workbench developer-tool page = wrong. Three.js bloom on a Quiet page = wrong.)
442
+ 8. Does its tone match the page's tone? (Risograph illustration on a Brutal page = wrong. Hand-drawn doodle on a Workbench developer-tool page = wrong. Three.js bloom on a Coral page = wrong.)
442
443
 
443
444
  The slop test ([`SKILL.md`](../SKILL.md) §5) carries four binary gates that mirror these questions; the audit verb runs them.
444
445
 
@@ -454,7 +455,7 @@ When you ship enrichment, the macrostructure stamp records the choice:
454
455
  * polish: HP3 Cursor-spotlight (scoped to hero, reduced-motion fallback pinned at 50%/30%)
455
456
  * nav: N5 Floating pill · footer: Ft5 Statement
456
457
  * craft: tier-A CSS art (no real video — pure custom-built mockup)
457
- * theme: Linen · accent: steel-blue ~3% · studied: no
458
+ * theme: Newsprint · accent: steel-blue ~3% · studied: no
458
459
  */
459
460
  ```
460
461
 
@@ -468,7 +469,7 @@ This signals to future Hallmark runs (and to the audit verb) what was chosen and
468
469
 
469
470
  - **Defaulting to E5 illustration on every brief.** Most heroes don't want an illustration. Reach for E0 (typography only) first; reach for E1–E4 when there's a *thing* to show; reach for E5 only when illustration genuinely matches the tone.
470
471
  - **Using a stock Lottie checkmark as the hero animation.** That's tier E used to skip tiers A–D. Build the checkmark in pure CSS (`stroke-dasharray` animated to draw the tick); it's 8 lines.
471
- - **Adding a grain background everywhere.** Grain is a treatment, not a default. Half the existing themes already carry texture (Riso, Linen, Specimen). Don't double up.
472
+ - **Adding a grain background everywhere.** Grain is a treatment, not a default. Half the existing themes already carry texture (Riso, Atelier, Specimen). Don't double up.
472
473
  - **Treating the abstract background as the hero.** It isn't. The headline is. The background is paper.
473
474
  - **Shipping the unmodified Storyset SVG.** That's tier D ungrounded — the library look. Customise the colour to your anchor hue at minimum; recompose if you can.
474
475
  - **A clipped-edge video on mobile.** The clip reads as broken on a 375-px viewport. Always collapse to stacked at < 60 rem.