howone 0.1.19 → 0.1.22

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 (293) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/LICENSE +21 -0
  3. package/templates/vite/.howone/skills/hallmark/README.md +147 -0
  4. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +201 -0
  5. package/templates/vite/.howone/skills/hallmark/SKILL.md +551 -0
  6. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +186 -0
  7. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  8. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  9. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  10. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  11. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  12. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  13. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  14. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  15. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +176 -0
  16. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +364 -0
  17. package/templates/vite/.howone/skills/hallmark/package.json +36 -0
  18. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +412 -0
  19. package/templates/vite/.howone/skills/hallmark/references/assets.md +399 -0
  20. package/templates/vite/.howone/skills/hallmark/references/color.md +95 -0
  21. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +256 -0
  22. package/templates/vite/.howone/skills/hallmark/references/components/c1-outlined-chip.md +12 -0
  23. package/templates/vite/.howone/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -0
  24. package/templates/vite/.howone/skills/hallmark/references/components/c3-typographic-link.md +8 -0
  25. package/templates/vite/.howone/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -0
  26. package/templates/vite/.howone/skills/hallmark/references/components/f1-bento-grid.md +20 -0
  27. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -0
  28. package/templates/vite/.howone/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -0
  29. package/templates/vite/.howone/skills/hallmark/references/components/f4-step-sequence.md +11 -0
  30. package/templates/vite/.howone/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -0
  31. package/templates/vite/.howone/skills/hallmark/references/components/f6-product-card-grid.md +41 -0
  32. package/templates/vite/.howone/skills/hallmark/references/components/ft1-mast-headed.md +13 -0
  33. package/templates/vite/.howone/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -0
  34. package/templates/vite/.howone/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -0
  35. package/templates/vite/.howone/skills/hallmark/references/components/ft4-dense-typographic.md +10 -0
  36. package/templates/vite/.howone/skills/hallmark/references/components/ft5-statement.md +21 -0
  37. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +19 -0
  38. package/templates/vite/.howone/skills/hallmark/references/components/ft7-newsletter-first.md +27 -0
  39. package/templates/vite/.howone/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -0
  40. package/templates/vite/.howone/skills/hallmark/references/components/h1-marquee.md +15 -0
  41. package/templates/vite/.howone/skills/hallmark/references/components/h2-split-diptych.md +15 -0
  42. package/templates/vite/.howone/skills/hallmark/references/components/h3-quote-led.md +11 -0
  43. package/templates/vite/.howone/skills/hallmark/references/components/h4-stat-led.md +14 -0
  44. package/templates/vite/.howone/skills/hallmark/references/components/h5-letter-hero.md +11 -0
  45. package/templates/vite/.howone/skills/hallmark/references/components/h6-photographic-fold.md +16 -0
  46. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -0
  47. package/templates/vite/.howone/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -0
  48. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -0
  49. package/templates/vite/.howone/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -0
  50. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -0
  51. package/templates/vite/.howone/skills/hallmark/references/components/n2-floating-chip.md +14 -0
  52. package/templates/vite/.howone/skills/hallmark/references/components/n3-side-rail.md +14 -0
  53. package/templates/vite/.howone/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -0
  54. package/templates/vite/.howone/skills/hallmark/references/components/n5-floating-pill.md +28 -0
  55. package/templates/vite/.howone/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -0
  56. package/templates/vite/.howone/skills/hallmark/references/components/n7-brutal-slab.md +22 -0
  57. package/templates/vite/.howone/skills/hallmark/references/components/n8-terminal-command.md +21 -0
  58. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -0
  59. package/templates/vite/.howone/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -0
  60. package/templates/vite/.howone/skills/hallmark/references/components/s2-hanging.md +13 -0
  61. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +19 -0
  62. package/templates/vite/.howone/skills/hallmark/references/components/s4-inline-no-break.md +11 -0
  63. package/templates/vite/.howone/skills/hallmark/references/components/s5-bottom-anchored.md +13 -0
  64. package/templates/vite/.howone/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -0
  65. package/templates/vite/.howone/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -0
  66. package/templates/vite/.howone/skills/hallmark/references/components/t3-single-huge-quote.md +11 -0
  67. package/templates/vite/.howone/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -0
  68. package/templates/vite/.howone/skills/hallmark/references/contract.md +24 -0
  69. package/templates/vite/.howone/skills/hallmark/references/copy.md +182 -0
  70. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +626 -0
  71. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +329 -0
  72. package/templates/vite/.howone/skills/hallmark/references/design-md.md +116 -0
  73. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +328 -0
  74. package/templates/vite/.howone/skills/hallmark/references/floating-nav.md +89 -0
  75. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +65 -0
  76. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +70 -0
  77. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +67 -0
  78. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +65 -0
  79. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +474 -0
  80. package/templates/vite/.howone/skills/hallmark/references/imagery-kit.md +170 -0
  81. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +207 -0
  82. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +111 -0
  83. package/templates/vite/.howone/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -0
  84. package/templates/vite/.howone/skills/hallmark/references/macrostructures/02-long-document.md +34 -0
  85. package/templates/vite/.howone/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -0
  86. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +32 -0
  87. package/templates/vite/.howone/skills/hallmark/references/macrostructures/05-workbench.md +32 -0
  88. package/templates/vite/.howone/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -0
  89. package/templates/vite/.howone/skills/hallmark/references/macrostructures/07-manifesto.md +32 -0
  90. package/templates/vite/.howone/skills/hallmark/references/macrostructures/08-photographic.md +34 -0
  91. package/templates/vite/.howone/skills/hallmark/references/macrostructures/09-quote-led.md +32 -0
  92. package/templates/vite/.howone/skills/hallmark/references/macrostructures/10-specimen.md +32 -0
  93. package/templates/vite/.howone/skills/hallmark/references/macrostructures/11-catalogue.md +23 -0
  94. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +23 -0
  95. package/templates/vite/.howone/skills/hallmark/references/macrostructures/13-index-first.md +23 -0
  96. package/templates/vite/.howone/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -0
  97. package/templates/vite/.howone/skills/hallmark/references/macrostructures/15-split-studio.md +23 -0
  98. package/templates/vite/.howone/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  99. package/templates/vite/.howone/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -0
  100. package/templates/vite/.howone/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -0
  101. package/templates/vite/.howone/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -0
  102. package/templates/vite/.howone/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -0
  103. package/templates/vite/.howone/skills/hallmark/references/macrostructures/21-component-playground.md +23 -0
  104. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +89 -0
  105. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +260 -0
  106. package/templates/vite/.howone/skills/hallmark/references/motion.md +109 -0
  107. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +49 -0
  108. package/templates/vite/.howone/skills/hallmark/references/responsive.md +138 -0
  109. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +205 -0
  110. package/templates/vite/.howone/skills/hallmark/references/structure.md +164 -0
  111. package/templates/vite/.howone/skills/hallmark/references/study.md +486 -0
  112. package/templates/vite/.howone/skills/hallmark/references/typography.md +243 -0
  113. package/templates/vite/.howone/skills/hallmark/references/verbs/audit.md +25 -0
  114. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +269 -0
  115. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +71 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +64 -0
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +240 -0
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +65 -0
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +105 -0
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +250 -0
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +64 -0
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +131 -0
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +240 -0
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +67 -0
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +86 -0
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +262 -0
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +63 -0
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +167 -0
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +457 -0
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +65 -0
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +159 -0
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +288 -0
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +64 -0
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +146 -0
  136. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +484 -0
  137. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +64 -0
  138. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +116 -0
  139. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +354 -0
  140. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +638 -0
  141. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +515 -0
  142. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +515 -0
  143. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +608 -0
  144. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +587 -0
  145. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +157 -0
  146. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  147. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  148. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  149. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  150. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  151. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  152. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  153. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  154. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  155. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  156. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  157. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  158. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  159. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  160. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  161. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  162. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  163. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  164. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  165. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  166. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  167. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  168. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  169. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +77 -0
  170. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +238 -0
  171. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +110 -0
  172. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +326 -0
  173. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +134 -0
  174. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +262 -0
  175. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +30 -0
  176. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +17 -0
  177. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +56 -0
  178. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +160 -0
  179. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +29 -0
  180. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +63 -0
  181. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +72 -0
  182. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +374 -0
  183. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +52 -0
  184. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +29 -0
  185. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +61 -0
  186. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +193 -0
  187. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +66 -0
  188. package/templates/vite/.howone/skills/hallmark/site/css/base.css +194 -0
  189. package/templates/vite/.howone/skills/hallmark/site/css/components.css +4886 -0
  190. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +2072 -0
  191. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +1129 -0
  192. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +475 -0
  193. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +1584 -0
  194. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +96 -0
  195. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +344 -0
  196. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +103 -0
  197. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +1103 -0
  198. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +83 -0
  199. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +368 -0
  200. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +133 -0
  201. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +1062 -0
  202. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +97 -0
  203. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +84 -0
  204. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +446 -0
  205. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +1087 -0
  206. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +101 -0
  207. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +359 -0
  208. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +1168 -0
  209. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +81 -0
  210. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +5 -0
  211. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +5 -0
  212. package/templates/vite/.howone/skills/hallmark/site/index.html +1043 -0
  213. package/templates/vite/.howone/skills/hallmark/site/js/main.js +1175 -0
  214. package/templates/vite/.howone/skills/hallmark/vercel.json +6 -0
  215. package/templates/vite/.howone/skills/howone-sdk/01-architect/01-app-generation.md +101 -0
  216. package/templates/vite/.howone/skills/howone-sdk/02-database/01-schema-design.md +147 -0
  217. package/templates/vite/.howone/skills/howone-sdk/02-database/02-schema-operations.md +96 -0
  218. package/templates/vite/.howone/skills/howone-sdk/02-database/03-data-access-patterns.md +172 -0
  219. package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/01-client-setup.md +3 -3
  220. package/templates/vite/.howone/skills/howone-sdk/{references/04-auth.md → 03-sdk/03-auth.md} +120 -3
  221. package/templates/vite/.howone/skills/howone-sdk/04-ai/.gitkeep +1 -0
  222. package/templates/vite/.howone/skills/howone-sdk/SKILL.md +67 -93
  223. package/templates/vite/.howone/skills/howone-sdk/agents/openai.yaml +3 -3
  224. package/templates/vite/.howone/skills/impeccable/SKILL.md +168 -0
  225. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
  226. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +190 -0
  227. package/templates/vite/.howone/skills/impeccable/reference/animate.md +175 -0
  228. package/templates/vite/.howone/skills/impeccable/reference/audit.md +133 -0
  229. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +113 -0
  230. package/templates/vite/.howone/skills/impeccable/reference/brand.md +118 -0
  231. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +174 -0
  232. package/templates/vite/.howone/skills/impeccable/reference/codex.md +105 -0
  233. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +106 -0
  234. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +105 -0
  235. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +154 -0
  236. package/templates/vite/.howone/skills/impeccable/reference/craft.md +123 -0
  237. package/templates/vite/.howone/skills/impeccable/reference/critique.md +273 -0
  238. package/templates/vite/.howone/skills/impeccable/reference/delight.md +302 -0
  239. package/templates/vite/.howone/skills/impeccable/reference/distill.md +111 -0
  240. package/templates/vite/.howone/skills/impeccable/reference/document.md +427 -0
  241. package/templates/vite/.howone/skills/impeccable/reference/extract.md +69 -0
  242. package/templates/vite/.howone/skills/impeccable/reference/harden.md +347 -0
  243. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +234 -0
  244. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +195 -0
  245. package/templates/vite/.howone/skills/impeccable/reference/layout.md +141 -0
  246. package/templates/vite/.howone/skills/impeccable/reference/live.md +622 -0
  247. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +109 -0
  248. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +234 -0
  249. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +258 -0
  250. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +130 -0
  251. package/templates/vite/.howone/skills/impeccable/reference/personas.md +179 -0
  252. package/templates/vite/.howone/skills/impeccable/reference/polish.md +242 -0
  253. package/templates/vite/.howone/skills/impeccable/reference/product.md +62 -0
  254. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +99 -0
  255. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +114 -0
  256. package/templates/vite/.howone/skills/impeccable/reference/shape.md +165 -0
  257. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +100 -0
  258. package/templates/vite/.howone/skills/impeccable/reference/teach.md +156 -0
  259. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +124 -0
  260. package/templates/vite/.howone/skills/impeccable/reference/typography.md +159 -0
  261. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +107 -0
  262. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  263. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +94 -0
  264. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +242 -0
  265. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +820 -0
  266. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +198 -0
  267. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +21 -0
  268. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  269. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +69 -0
  270. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +595 -0
  271. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +123 -0
  272. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +4860 -0
  273. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +75 -0
  274. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +18 -0
  275. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +446 -0
  276. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +200 -0
  277. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +48 -0
  278. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +838 -0
  279. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +254 -0
  280. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +47 -0
  281. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +632 -0
  282. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +247 -0
  283. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +141 -0
  284. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  285. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +214 -0
  286. package/templates/vite/AGENTS.md +2 -3
  287. package/templates/vite/package.json +1 -1
  288. /package/templates/vite/.howone/skills/howone-sdk/{references/08-manifest-codegen.md → 01-architect/02-manifest-codegen.md} +0 -0
  289. /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/02-entity-operations.md +0 -0
  290. /package/templates/vite/.howone/skills/howone-sdk/{references/06-react-integration.md → 03-sdk/04-react-integration.md} +0 -0
  291. /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/05-file-upload.md +0 -0
  292. /package/templates/vite/.howone/skills/howone-sdk/{references/07-raw-http.md → 03-sdk/06-raw-http.md} +0 -0
  293. /package/templates/vite/.howone/skills/howone-sdk/{references/03-ai-actions.md → 03-sdk/07-ai-action-calls.md} +0 -0
@@ -0,0 +1,2072 @@
1
+ /* Hallmark — sections (with per-theme structural overrides) */
2
+
3
+ /* — Page scaffold ——————————————————————————————————— */
4
+ .page {
5
+ max-width: var(--page-max);
6
+ margin-inline: auto;
7
+ display: grid;
8
+ gap: var(--section-gap);
9
+ /* No bottom padding — the colophon owns its own end-spacing.
10
+ A page-level bottom padding stacks on top of the footer's own
11
+ padding and reads as dead space below "Made by Together AI". */
12
+ padding-block: var(--space-2xl) 0;
13
+ padding-inline: var(--page-gutter);
14
+ }
15
+
16
+ /* — Slot — a region whose component archetype swaps per theme ————— */
17
+ .slot {
18
+ display: block;
19
+ min-height: 1px; /* keeps reveal animation valid before populated */
20
+ }
21
+
22
+ /* — Section container ——————————————————————————————— */
23
+ .section {
24
+ display: grid;
25
+ gap: var(--space-xl); /* tightened from 2xl in v0.9 — content sits closer to its head */
26
+ position: relative; /* anchors absolute children (hidden radios) */
27
+ }
28
+
29
+ /* Section head — single-column always. Section label stacks ABOVE
30
+ the title, separated by a small gap. No more 10rem fixed sidebar
31
+ that forced the section label ("ANTI-PATTERNS") to wrap on
32
+ themes that needed wider title columns. Section titles can grow
33
+ bigger now since they have full width. */
34
+ /* Single-column always — label sits ABOVE title across every theme.
35
+ No theme override should put the label in a left gutter (caused
36
+ uncomfortable wrapping + alignment drift between sections). */
37
+ .section__head,
38
+ [data-theme] .section__head {
39
+ display: grid;
40
+ grid-template-columns: 1fr !important;
41
+ gap: var(--space-sm);
42
+ padding-bottom: var(--section-head-gap);
43
+ border-bottom: var(--rule-hair) solid var(--color-rule-2);
44
+ }
45
+
46
+ /* Section label — small mono uppercase coordinate above the title.
47
+ Hard rule: never wrap. White-space: nowrap forces single-line at
48
+ every viewport. The label is short ("05 / Foundations") so this
49
+ is safe. */
50
+ .section-label,
51
+ .section__head .section-label {
52
+ white-space: nowrap;
53
+ }
54
+
55
+ .section__title {
56
+ font-family: var(--font-display);
57
+ font-weight: var(--display-weight, 400);
58
+ font-style: var(--display-style, normal);
59
+ font-size: clamp(2rem, 4vw + 0.5rem, 3.5rem);
60
+ line-height: var(--lh-tight);
61
+ letter-spacing: var(--tracking-display);
62
+ max-width: 28ch;
63
+ color: var(--color-ink);
64
+ font-optical-sizing: auto;
65
+ margin: 0;
66
+ }
67
+
68
+ /* Narrow viewports — let headings wrap freely + cap display sizes so
69
+ a long title fits at 320–480 px without being clipped by body's
70
+ overflow-x: hidden. */
71
+ @media (max-width: 30rem) {
72
+ .opening__title,
73
+ .hero__display {
74
+ font-size: clamp(1.75rem, 9vw, 2.75rem) !important;
75
+ max-width: 12ch;
76
+ overflow-wrap: break-word;
77
+ word-wrap: break-word;
78
+ hyphens: auto;
79
+ }
80
+ .section__title {
81
+ font-size: clamp(1.375rem, 5.5vw, 1.875rem) !important;
82
+ max-width: 100%;
83
+ overflow-wrap: break-word;
84
+ }
85
+ .hero__lede,
86
+ .opening__sub {
87
+ font-size: 1rem !important;
88
+ max-width: 100%;
89
+ }
90
+ }
91
+
92
+ /* — 01 · Opening ——————————————————————————————————— */
93
+ .opening {
94
+ display: grid;
95
+ grid-template-columns: 8fr 4fr;
96
+ gap: var(--space-2xl);
97
+ padding-block: var(--space-xl) var(--space-lg);
98
+ align-items: end;
99
+ }
100
+
101
+ @media (max-width: 60rem) {
102
+ .opening { grid-template-columns: 1fr; gap: var(--space-xl); align-items: start; }
103
+ }
104
+
105
+ .opening__eyebrow {
106
+ font-family: var(--font-label);
107
+ font-size: var(--text-xs);
108
+ letter-spacing: var(--tracking-label);
109
+ text-transform: uppercase;
110
+ color: var(--color-muted);
111
+ margin-bottom: var(--space-lg);
112
+ display: inline-flex;
113
+ align-items: center;
114
+ gap: 0.55em;
115
+ }
116
+
117
+ .opening__title {
118
+ font-family: var(--font-display);
119
+ font-weight: var(--display-weight, 400);
120
+ font-style: var(--display-style, normal);
121
+ font-size: var(--text-display);
122
+ line-height: var(--lh-tight);
123
+ letter-spacing: var(--tracking-display);
124
+ color: var(--color-ink);
125
+ max-width: 15ch;
126
+ font-optical-sizing: auto;
127
+ font-variation-settings:
128
+ "opsz" var(--display-optical, 144),
129
+ "SOFT" var(--display-soft, 0);
130
+ }
131
+
132
+ .opening__title em {
133
+ font-family: var(--font-serif);
134
+ font-style: italic;
135
+ font-weight: 400;
136
+ color: var(--color-ink);
137
+ }
138
+
139
+ .opening__sub {
140
+ font-family: var(--font-body);
141
+ font-weight: 400;
142
+ font-size: var(--text-md);
143
+ line-height: var(--lh-normal);
144
+ color: var(--color-ink-2);
145
+ max-width: 42ch;
146
+ margin-top: var(--space-lg);
147
+ }
148
+
149
+ .opening__aside {
150
+ display: grid;
151
+ gap: var(--space-md);
152
+ padding-top: var(--space-xl);
153
+ }
154
+
155
+ .opening__rule {
156
+ height: 0.5rem;
157
+ width: 3rem;
158
+ background: var(--color-accent);
159
+ }
160
+
161
+ .opening__cta {
162
+ display: grid;
163
+ gap: var(--space-sm);
164
+ padding-top: var(--space-md);
165
+ border-top: var(--rule-hair) solid var(--color-rule);
166
+ }
167
+
168
+ /* — 02 · Examples rail (full-bleed) ——————————————————— */
169
+ /* The rail escapes the page gutter on both sides so tiles can flow
170
+ past the max-width. The header above stays inside the gutter. */
171
+ .examples__intro {
172
+ font-family: var(--font-serif);
173
+ font-size: var(--text-md);
174
+ line-height: var(--lh-snug);
175
+ color: var(--color-ink-2);
176
+ max-width: 60ch;
177
+ margin: 0;
178
+ }
179
+
180
+
181
+ [data-theme="brutal"] .examples__intro,
182
+ [data-theme="manifesto"] .examples__intro,
183
+ [data-theme="terminal"] .examples__intro,
184
+ [data-theme="sport"] .examples__intro,
185
+ [data-theme="almanac"] .examples__intro {
186
+ font-family: var(--font-body);
187
+ font-style: normal;
188
+ }
189
+
190
+ .examples-rail {
191
+ display: flex;
192
+ gap: var(--space-lg);
193
+ overflow-x: auto;
194
+ overflow-y: visible;
195
+ scroll-snap-type: x mandatory;
196
+ /* Full-bleed: rail spans the full viewport. But the FIRST card
197
+ starts aligned with the page content (same left edge as the
198
+ section header), not flush against the viewport. As the user
199
+ scrolls horizontally, cards travel through the full bleed
200
+ including the viewport edges — only the initial position
201
+ respects the page's content gutter. */
202
+ width: 100vw;
203
+ margin-inline: calc(50% - 50vw);
204
+ --rail-edge: max(var(--page-gutter), calc((100vw - var(--page-max)) / 2 + var(--page-gutter)));
205
+ padding-inline: var(--rail-edge);
206
+ padding-block: var(--space-md) var(--space-lg);
207
+ scroll-padding-inline: var(--rail-edge);
208
+ scrollbar-width: none;
209
+ }
210
+ .examples-rail::-webkit-scrollbar { display: none; }
211
+
212
+ /* Reserve trailing whitespace inside the rail so the last card snaps
213
+ clean to the same content edge as the first. */
214
+ .examples-rail::after {
215
+ content: "";
216
+ flex: 0 0 var(--rail-edge);
217
+ }
218
+
219
+ /* — 03 · Without / With (parity panels, four pairs) ——————
220
+ The section holds four W/W pairs that swap based on which toggle
221
+ radio is :checked. Pure CSS, no JS.
222
+
223
+ Scroll-jump fix: the radio inputs sit in normal document flow
224
+ with zero size + opacity 0 (no position:absolute). When the user
225
+ clicks a label, the browser focuses the input — but because the
226
+ input is already in view (right above the toggle), no scroll
227
+ happens. Earlier versions used position:absolute which positioned
228
+ the input at top:0 of the viewport; clicking a label far below
229
+ would scroll the page back to the top. */
230
+ .vs-toggle__input {
231
+ /* Pulled out of the section's grid (otherwise each hidden radio plus each
232
+ hidden .vs panel adds a `var(--space-2xl)` phantom gap between the
233
+ section header and the first visible child). Anchored absolute inside
234
+ the section (which is position: relative) so focus doesn't scroll the
235
+ page back to the viewport top. */
236
+ position: absolute;
237
+ top: 0;
238
+ left: 0;
239
+ appearance: none;
240
+ -webkit-appearance: none;
241
+ width: 0;
242
+ height: 0;
243
+ margin: 0;
244
+ padding: 0;
245
+ border: 0;
246
+ outline: 0;
247
+ opacity: 0;
248
+ pointer-events: none;
249
+ }
250
+
251
+ .vs-toggle {
252
+ display: inline-flex;
253
+ flex-wrap: wrap;
254
+ align-items: center;
255
+ gap: 0;
256
+ padding: 0.25rem;
257
+ background: var(--color-paper-2);
258
+ border: 1px solid var(--color-rule);
259
+ border-radius: var(--radius-pill, 999px);
260
+ margin-block-end: var(--space-xl);
261
+ align-self: start;
262
+ max-width: 100%;
263
+ }
264
+
265
+ .vs-toggle__btn {
266
+ display: inline-flex;
267
+ align-items: center;
268
+ gap: 0.4em;
269
+ padding: 0.45rem 0.95rem;
270
+ font-family: var(--font-label);
271
+ font-size: var(--text-xs);
272
+ letter-spacing: var(--tracking-label);
273
+ text-transform: uppercase;
274
+ color: var(--color-muted);
275
+ cursor: pointer;
276
+ border-radius: var(--radius-pill, 999px);
277
+ transition: background-color var(--dur-micro) var(--ease-out),
278
+ color var(--dur-micro) var(--ease-out);
279
+ user-select: none;
280
+ white-space: nowrap;
281
+ }
282
+
283
+ .vs-toggle__btn:hover { color: var(--color-ink); }
284
+
285
+ .vs-toggle__num {
286
+ font-family: var(--font-mono);
287
+ font-size: 0.75em;
288
+ letter-spacing: 0.04em;
289
+ color: inherit;
290
+ opacity: 0.6;
291
+ font-feature-settings: "tnum";
292
+ }
293
+
294
+ .vs-toggle__label {
295
+ font-weight: 500;
296
+ }
297
+
298
+ /* Focus ring on whichever button corresponds to the focused input. */
299
+ #vs-notes:focus-visible ~ .vs-toggle .vs-toggle__btn[for="vs-notes"],
300
+ #vs-dashboard:focus-visible ~ .vs-toggle .vs-toggle__btn[for="vs-dashboard"],
301
+ #vs-pricing:focus-visible ~ .vs-toggle .vs-toggle__btn[for="vs-pricing"],
302
+ #vs-personal:focus-visible ~ .vs-toggle .vs-toggle__btn[for="vs-personal"] {
303
+ outline: 2px solid var(--color-focus);
304
+ outline-offset: 3px;
305
+ }
306
+
307
+ #vs-notes:checked ~ .vs-toggle .vs-toggle__btn[for="vs-notes"],
308
+ #vs-dashboard:checked ~ .vs-toggle .vs-toggle__btn[for="vs-dashboard"],
309
+ #vs-pricing:checked ~ .vs-toggle .vs-toggle__btn[for="vs-pricing"],
310
+ #vs-personal:checked ~ .vs-toggle .vs-toggle__btn[for="vs-personal"] {
311
+ background: var(--color-ink);
312
+ color: var(--color-paper);
313
+ }
314
+
315
+ #vs-notes:checked ~ .vs-toggle .vs-toggle__btn[for="vs-notes"] .vs-toggle__num,
316
+ #vs-dashboard:checked ~ .vs-toggle .vs-toggle__btn[for="vs-dashboard"] .vs-toggle__num,
317
+ #vs-pricing:checked ~ .vs-toggle .vs-toggle__btn[for="vs-pricing"] .vs-toggle__num,
318
+ #vs-personal:checked ~ .vs-toggle .vs-toggle__btn[for="vs-personal"] .vs-toggle__num {
319
+ opacity: 0.85;
320
+ }
321
+
322
+ .vs-pairs { display: contents; }
323
+
324
+ .vs {
325
+ display: none;
326
+ grid-template-columns: 1fr 1fr;
327
+ gap: var(--space-lg);
328
+ }
329
+
330
+ #vs-notes:checked ~ .vs-pairs .vs--notes,
331
+ #vs-dashboard:checked ~ .vs-pairs .vs--dashboard,
332
+ #vs-pricing:checked ~ .vs-pairs .vs--pricing,
333
+ #vs-personal:checked ~ .vs-pairs .vs--personal {
334
+ display: grid;
335
+ }
336
+
337
+ @media (max-width: 50rem) {
338
+ .vs { grid-template-columns: 1fr; }
339
+ }
340
+
341
+ .vs__col {
342
+ display: grid;
343
+ grid-template-rows: auto 1fr auto;
344
+ gap: var(--space-md);
345
+ }
346
+
347
+ .vs__head {
348
+ padding-bottom: var(--space-sm);
349
+ border-bottom: var(--rule-hair) solid var(--color-rule);
350
+ }
351
+
352
+ .vs__label {
353
+ font-family: var(--font-label);
354
+ font-size: var(--text-xs);
355
+ letter-spacing: var(--tracking-label);
356
+ text-transform: uppercase;
357
+ color: var(--color-muted);
358
+ }
359
+
360
+ .vs__caption {
361
+ font-family: var(--font-body);
362
+ font-size: var(--text-sm);
363
+ color: var(--color-neutral);
364
+ line-height: var(--lh-normal);
365
+ }
366
+
367
+ /* — 04 · Foundations mosaic ——————————————————————————
368
+ Auto-fit grid with feature cards (F/01 Type, F/02 Colour) and the
369
+ closing strip (F/08 Anti-patterns) spanning the full row for breathing
370
+ room on their richer illustrations. Other cards pack 2-3 per row
371
+ depending on viewport. */
372
+ .foundations {
373
+ display: grid;
374
+ grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
375
+ gap: var(--space-xl) var(--space-2xl);
376
+ }
377
+
378
+ .spec--feature,
379
+ .spec--strip {
380
+ grid-column: 1 / -1;
381
+ }
382
+
383
+ @media (max-width: 56rem) {
384
+ .foundations { grid-template-columns: 1fr; gap: 0; }
385
+ .spec--feature, .spec--strip { grid-column: auto; }
386
+ }
387
+
388
+ /* — 05 · Foundations as vertical list + active panel ———————
389
+ Five clickable names on the left; the active card's rule + visual
390
+ demo on the right. Pure CSS via :checked + sibling selectors —
391
+ the radios sit absolutely-positioned (out of flow, like the W/W
392
+ toggle radios). Fits in ~one viewport on desktop. */
393
+ .found-toggle__input {
394
+ position: absolute;
395
+ top: 0;
396
+ left: 0;
397
+ appearance: none;
398
+ -webkit-appearance: none;
399
+ width: 0;
400
+ height: 0;
401
+ margin: 0;
402
+ padding: 0;
403
+ border: 0;
404
+ outline: 0;
405
+ opacity: 0;
406
+ pointer-events: none;
407
+ }
408
+
409
+ .found-grid {
410
+ display: grid;
411
+ grid-template-columns: 14rem 1fr;
412
+ gap: var(--space-2xl);
413
+ align-items: start;
414
+ }
415
+
416
+ @media (max-width: 60rem) {
417
+ .found-grid {
418
+ grid-template-columns: 1fr;
419
+ gap: 0;
420
+ }
421
+ }
422
+
423
+ .found-nav {
424
+ list-style: none;
425
+ margin: 0;
426
+ padding: 0;
427
+ display: grid;
428
+ gap: 0;
429
+ border-block-start: var(--rule-hair) solid var(--color-rule);
430
+ }
431
+
432
+ .found-nav li { margin: 0; }
433
+
434
+ @media (max-width: 60rem) {
435
+ .found-nav { display: contents; }
436
+ }
437
+
438
+ /* — 05 · How it works ——————————————————————————————— */
439
+ .how { display: grid; gap: var(--space-xl); }
440
+
441
+ .step {
442
+ display: grid;
443
+ grid-template-columns: 3rem 1fr 2fr;
444
+ gap: var(--space-lg);
445
+ align-items: start;
446
+ padding-top: var(--space-lg);
447
+ border-top: var(--rule-hair) solid var(--color-rule);
448
+ }
449
+
450
+ @media (max-width: 50rem) {
451
+ .step { grid-template-columns: 1fr; gap: var(--space-sm); }
452
+ }
453
+
454
+ .step__num {
455
+ font-family: var(--font-label);
456
+ font-weight: 500;
457
+ font-size: var(--text-md);
458
+ color: var(--color-ink);
459
+ letter-spacing: 0.08em;
460
+ }
461
+
462
+ .step__head {
463
+ font-family: var(--font-display);
464
+ font-weight: var(--display-weight, 400);
465
+ font-style: var(--display-style, normal);
466
+ font-size: var(--text-lg);
467
+ line-height: var(--lh-snug);
468
+ letter-spacing: var(--tracking-tight);
469
+ color: var(--color-ink);
470
+ font-optical-sizing: auto;
471
+ }
472
+
473
+ .step__sub {
474
+ font-family: var(--font-body);
475
+ font-size: var(--text-sm);
476
+ color: var(--color-neutral);
477
+ margin-top: var(--space-xs);
478
+ max-width: 40ch;
479
+ line-height: var(--lh-normal);
480
+ }
481
+
482
+ .step__body { display: grid; gap: var(--space-sm); }
483
+
484
+ /* — 03 · Study — DNA extraction gallery —————————————————
485
+ Four tiles. Each pairs a video-shaped media slot (poster image
486
+ when no <source> is supplied, otherwise an autoplay-muted-loop
487
+ screen recording) with the structured 10-field DNA panel. The
488
+ panel is a tabular key/value layout — mono key, body value. */
489
+ .study__intro {
490
+ margin: 0 0 var(--space-2xl);
491
+ font-family: var(--font-serif);
492
+ font-size: var(--text-md);
493
+ line-height: var(--lh-snug);
494
+ color: var(--color-ink-2);
495
+ max-width: 60ch;
496
+ }
497
+
498
+ .study__intro code {
499
+ font-family: var(--font-mono);
500
+ font-style: normal;
501
+ font-size: 0.875em;
502
+ background: var(--color-paper-2);
503
+ padding: 0.05em 0.35em;
504
+ border: var(--rule-hair) solid var(--color-rule);
505
+ color: var(--color-ink);
506
+ }
507
+
508
+ [data-theme="brutal"] .study__intro,
509
+ [data-theme="manifesto"] .study__intro,
510
+ [data-theme="terminal"] .study__intro,
511
+ [data-theme="sport"] .study__intro,
512
+ [data-theme="almanac"] .study__intro,
513
+ [data-theme="quiet"] .study__intro,
514
+ [data-theme="bloom"] .study__intro {
515
+ font-family: var(--font-body);
516
+ font-style: normal;
517
+ }
518
+
519
+ .study-grid {
520
+ display: grid;
521
+ grid-template-columns: 1fr 1fr;
522
+ gap: var(--space-2xl) var(--space-xl);
523
+ }
524
+
525
+ @media (max-width: 60rem) {
526
+ .study-grid { grid-template-columns: 1fr; gap: var(--space-2xl); }
527
+ }
528
+
529
+ /* — 03 · Skills — five things Hallmark does ——————————————————
530
+ Vertical editorial list, scroll-only. No tabs, no carousel, no JS
531
+ state. Each row: roman numeral marginalia → title + lede → demo +
532
+ structured list. Each demo is structurally different from the others
533
+ on purpose — the section practises what the skill preaches. */
534
+
535
+ .skills__intro {
536
+ margin: 0 0 var(--space-2xl);
537
+ font-family: var(--font-serif);
538
+ font-size: var(--text-md);
539
+ line-height: var(--lh-snug);
540
+ color: var(--color-ink-2);
541
+ max-width: 60ch;
542
+ }
543
+
544
+ [data-theme="brutal"] .skills__intro,
545
+ [data-theme="manifesto"] .skills__intro,
546
+ [data-theme="terminal"] .skills__intro,
547
+ [data-theme="sport"] .skills__intro,
548
+ [data-theme="almanac"] .skills__intro,
549
+ [data-theme="quiet"] .skills__intro,
550
+ [data-theme="bloom"] .skills__intro,
551
+ [data-theme="riso"] .skills__intro {
552
+ font-family: var(--font-body);
553
+ font-style: normal;
554
+ }
555
+
556
+ .skills-list {
557
+ list-style: none;
558
+ margin: 0;
559
+ padding: 0;
560
+ display: grid;
561
+ gap: var(--space-3xl);
562
+ }
563
+
564
+ .skill-row {
565
+ display: grid;
566
+ gap: var(--space-lg);
567
+ }
568
+
569
+ .skill-row__head {
570
+ display: grid;
571
+ grid-template-columns: 1fr;
572
+ gap: var(--space-xs);
573
+ margin-block-end: var(--space-md);
574
+ }
575
+
576
+ .skill-row__head-body {
577
+ display: grid;
578
+ gap: var(--space-sm);
579
+ max-width: 64ch;
580
+ }
581
+
582
+ .skill-row__title {
583
+ font-family: var(--font-display);
584
+ font-size: clamp(1.4rem, 1.6vw + 0.6rem, 2rem);
585
+ font-weight: 500;
586
+ line-height: var(--lh-tight);
587
+ letter-spacing: var(--tracking-display);
588
+ color: var(--color-ink);
589
+ margin: 0;
590
+ display: flex;
591
+ align-items: baseline;
592
+ flex-wrap: wrap;
593
+ gap: 0.4em;
594
+ }
595
+
596
+ .skill-row__title-meta {
597
+ font-family: var(--font-serif);
598
+ font-weight: 400;
599
+ font-size: 0.5em;
600
+ letter-spacing: 0;
601
+ color: var(--color-muted);
602
+ }
603
+
604
+ [data-theme="brutal"] .skill-row__title-meta,
605
+ [data-theme="manifesto"] .skill-row__title-meta,
606
+ [data-theme="terminal"] .skill-row__title-meta,
607
+ [data-theme="sport"] .skill-row__title-meta,
608
+ [data-theme="almanac"] .skill-row__title-meta,
609
+ [data-theme="quiet"] .skill-row__title-meta,
610
+ [data-theme="bloom"] .skill-row__title-meta {
611
+ font-family: var(--font-mono);
612
+ font-style: normal;
613
+ text-transform: uppercase;
614
+ letter-spacing: 0.04em;
615
+ }
616
+
617
+ [data-theme="manifesto"] .skill-row__title,
618
+ [data-theme="brutal"] .skill-row__title {
619
+ text-transform: uppercase;
620
+ letter-spacing: var(--tracking-tight);
621
+ }
622
+
623
+ /* Skill-row lede matches the hero lede + examples intro: same role, same
624
+ typographic treatment per theme. All ledes are roman (no italic) — the
625
+ curly single-storey italic "a" was unanimously bad to read. */
626
+ .skill-row__lede {
627
+ font-family: var(--font-serif);
628
+ font-size: var(--text-md);
629
+ line-height: var(--lh-normal);
630
+ color: var(--color-ink-2);
631
+ margin: 0;
632
+ max-width: 60ch;
633
+ }
634
+
635
+ [data-theme="brutal"] .skill-row__lede,
636
+ [data-theme="manifesto"] .skill-row__lede,
637
+ [data-theme="terminal"] .skill-row__lede,
638
+ [data-theme="sport"] .skill-row__lede,
639
+ [data-theme="almanac"] .skill-row__lede,
640
+ [data-theme="studio"] .skill-row__lede,
641
+ [data-theme="quiet"] .skill-row__lede,
642
+ [data-theme="bloom"] .skill-row__lede,
643
+ [data-theme="aurora"] .skill-row__lede,
644
+ [data-theme="plume"] .skill-row__lede,
645
+ [data-theme="halo"] .skill-row__lede,
646
+ [data-theme="coral"] .skill-row__lede,
647
+ [data-theme="violet"] .skill-row__lede {
648
+ font-family: var(--font-body);
649
+ font-style: normal;
650
+ }
651
+
652
+ /* Studio: examples intro stays sans to match hero + verb ledes. */
653
+ [data-theme="studio"] .examples__intro {
654
+ font-family: var(--font-body);
655
+ font-style: normal;
656
+ }
657
+
658
+ .skill-row__lede strong {
659
+ font-weight: 600;
660
+ color: var(--color-ink);
661
+ }
662
+
663
+ .skill-row__body {
664
+ display: grid;
665
+ grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
666
+ gap: var(--space-xl);
667
+ align-items: start;
668
+ }
669
+
670
+ @media (max-width: 60rem) {
671
+ .skill-row__body {
672
+ grid-template-columns: 1fr;
673
+ gap: var(--space-lg);
674
+ }
675
+ }
676
+
677
+ /* Full-width body — no right info column. Used by Redesign so the
678
+ before/after diptych takes the whole row width. */
679
+ .skill-row__body--full {
680
+ grid-template-columns: 1fr;
681
+ }
682
+
683
+ .skill-row__demo {
684
+ position: relative;
685
+ margin: 0;
686
+ display: block;
687
+ }
688
+
689
+ .skill-row__demo img {
690
+ display: block;
691
+ width: 100%;
692
+ height: auto;
693
+ background: var(--color-paper-2);
694
+ }
695
+
696
+ /* Structured list to the right of each demo (reuses .dna__row from
697
+ .study-card__dna). Editorial card-on-paper container. */
698
+ .skill-row__list {
699
+ list-style: none;
700
+ margin: 0;
701
+ padding: var(--space-md) var(--space-lg);
702
+ display: grid;
703
+ gap: 0;
704
+ background: var(--color-paper);
705
+ border: var(--rule-card, 1px) solid var(--color-rule);
706
+ border-radius: var(--radius-card, 0);
707
+ }
708
+
709
+ [data-theme="atelier"] .skill-row__list,
710
+ [data-theme="salon"] .skill-row__list {
711
+ border: 0;
712
+ background: transparent;
713
+ padding: 0;
714
+ border-block-start: var(--rule-hair) solid var(--color-rule);
715
+ border-radius: 0;
716
+ }
717
+
718
+ [data-theme="brutal"] .skill-row__list,
719
+ [data-theme="manifesto"] .skill-row__list { border-width: 2px; }
720
+
721
+ .skill-row__list code {
722
+ font-family: var(--font-mono);
723
+ font-size: 0.8125em;
724
+ background: var(--color-paper-2);
725
+ padding: 0.05em 0.35em;
726
+ border: var(--rule-hair) solid var(--color-rule);
727
+ color: var(--color-ink);
728
+ }
729
+
730
+ /* Row I — Build demo: brief pill → arrow → output thumb stacked */
731
+ .skill-row__demo--build {
732
+ display: grid;
733
+ gap: var(--space-sm);
734
+ justify-items: start;
735
+ }
736
+
737
+ .brief-pill {
738
+ display: inline-block;
739
+ padding: var(--space-xs) var(--space-md);
740
+ background: var(--color-paper-2);
741
+ border: var(--rule-hair) solid var(--color-rule);
742
+ border-radius: 999px;
743
+ font-family: var(--font-mono);
744
+ font-size: var(--text-xs);
745
+ color: var(--color-ink-2);
746
+ max-width: 100%;
747
+ }
748
+
749
+ [data-theme="brutal"] .brief-pill,
750
+ [data-theme="manifesto"] .brief-pill,
751
+ [data-theme="terminal"] .brief-pill,
752
+ [data-theme="newsprint"] .brief-pill,
753
+ [data-theme="atelier"] .brief-pill {
754
+ border-radius: 0;
755
+ font-style: normal;
756
+ }
757
+
758
+ .brief-arrow {
759
+ font-family: var(--font-mono);
760
+ font-size: var(--text-md);
761
+ color: var(--color-rule-2);
762
+ user-select: none;
763
+ padding-inline-start: var(--space-md);
764
+ }
765
+
766
+ .brief-output {
767
+ display: block;
768
+ width: 100%;
769
+ aspect-ratio: 16 / 10;
770
+ overflow: hidden;
771
+ border: var(--rule-card, 1px) solid var(--color-rule);
772
+ }
773
+
774
+ .brief-output img,
775
+ .brief-output video {
776
+ display: block;
777
+ width: 100%;
778
+ height: 100%;
779
+ object-fit: cover;
780
+ object-position: top left;
781
+ }
782
+
783
+ /* — Per-theme .brief-output framing —————————————————————————
784
+ The same demo media reads differently when the FRAME reacts to the
785
+ theme. Border weight, corner style, optional shadow, optional
786
+ per-theme caption. Frame, not content. */
787
+
788
+ /* HARD EDGES + heavier border. */
789
+ [data-theme="brutal"] .brief-output {
790
+ border: 2px solid var(--color-ink);
791
+ border-radius: 0;
792
+ }
793
+ [data-theme="manifesto"] .brief-output {
794
+ border: 3px solid var(--color-ink);
795
+ border-radius: 0;
796
+ }
797
+ [data-theme="terminal"] .brief-output {
798
+ border: 1px solid var(--color-accent);
799
+ border-radius: 0;
800
+ box-shadow: inset 0 0 0 1px color-mix(in oklch, var(--color-accent) 25%, transparent);
801
+ }
802
+ [data-theme="newsprint"] .brief-output {
803
+ border: 2px double var(--color-ink);
804
+ border-radius: 0;
805
+ }
806
+ [data-theme="editorial"] .brief-output {
807
+ border: 0.5px solid var(--color-rule);
808
+ border-radius: 0;
809
+ }
810
+
811
+ /* SLIGHT-RADIUS group (4–6px). */
812
+ [data-theme="sport"] .brief-output {
813
+ border: 1.5px solid var(--color-accent);
814
+ border-radius: 4px;
815
+ }
816
+ [data-theme="almanac"] .brief-output {
817
+ border: 1px solid var(--color-rule);
818
+ border-radius: 4px;
819
+ }
820
+ [data-theme="garden"] .brief-output {
821
+ border: 1px solid var(--color-rule);
822
+ border-radius: 6px;
823
+ }
824
+ [data-theme="halo"] .brief-output {
825
+ border: 1px solid var(--color-rule-2);
826
+ border-radius: 6px;
827
+ box-shadow: 0 0 0 1px color-mix(in oklch, var(--color-accent) 22%, transparent),
828
+ 0 0 32px -8px color-mix(in oklch, var(--color-accent) 28%, transparent);
829
+ }
830
+ [data-theme="violet"] .brief-output {
831
+ border: 1px solid var(--color-rule);
832
+ border-radius: 6px;
833
+ }
834
+ [data-theme="studio"] .brief-output {
835
+ border: 0.5px solid var(--color-rule-2);
836
+ border-radius: 6px;
837
+ }
838
+
839
+ /* SOFT-CARD group (8–14px). */
840
+ [data-theme="quiet"] .brief-output { border-radius: 8px; }
841
+ [data-theme="coral"] .brief-output { border-radius: 8px; }
842
+ [data-theme="aurora"] .brief-output {
843
+ border: 1px solid var(--color-rule-2);
844
+ border-radius: 12px;
845
+ box-shadow: 0 0 24px -10px color-mix(in oklch, var(--color-accent) 35%, transparent);
846
+ }
847
+ [data-theme="plume"] .brief-output {
848
+ border: 1px solid var(--color-rule);
849
+ border-radius: 12px;
850
+ }
851
+ [data-theme="bloom"] .brief-output {
852
+ border: 1px solid var(--color-rule);
853
+ border-radius: 14px;
854
+ box-shadow: 0 6px 24px -14px color-mix(in oklch, var(--color-accent) 22%, transparent);
855
+ }
856
+
857
+ /* Atelier / Salon / Linen — hairline only, no radius, optional caption. */
858
+ [data-theme="atelier"] .brief-output,
859
+ [data-theme="salon"] .brief-output,
860
+ [data-theme="linen"] .brief-output {
861
+ border: 1px solid var(--color-rule-2);
862
+ border-radius: 0;
863
+ }
864
+
865
+ /* Riso — duotone offset shadow, hard 0 radius. */
866
+ [data-theme="riso"] .brief-output {
867
+ border: 2px solid var(--color-ink);
868
+ border-radius: 0;
869
+ box-shadow: 3px 3px 0 var(--color-accent-2, var(--color-accent));
870
+ }
871
+
872
+ /* Midnight — inner glow ring on dark paper. */
873
+ [data-theme="midnight"] .brief-output {
874
+ border: 1px solid var(--color-rule-2);
875
+ box-shadow: inset 0 0 0 1px color-mix(in oklch, var(--color-paper) 25%, transparent);
876
+ }
877
+
878
+
879
+ /* Row III — Audit demo: a CSS-only inline slop hero. Built deliberately
880
+ to LOOK like every default AI hero — purple-pink gradient, centered,
881
+ Inter, ✨ badge, gradient pill CTA. Lives outside theme tokens
882
+ intentionally — it's the negative example. The checklist on the
883
+ right names every tell + its fix. */
884
+ .skill-row__demo--audit { aspect-ratio: 16 / 10; }
885
+
886
+ .audit-slop {
887
+ position: relative;
888
+ width: 100%;
889
+ height: 100%;
890
+ display: grid;
891
+ place-items: center;
892
+ text-align: center;
893
+ background: linear-gradient(135deg, #a855f7 0%, #ec4899 55%, #f59e0b 100%);
894
+ border-radius: 14px;
895
+ overflow: hidden;
896
+ font-family: "Inter", system-ui, sans-serif;
897
+ color: #ffffff;
898
+ /* Deliberate AI-hero clichés: gradient corners, centered, Inter. */
899
+ }
900
+
901
+ .audit-slop::before {
902
+ content: "";
903
+ position: absolute;
904
+ inset: -20%;
905
+ background: radial-gradient(circle at 30% 20%, rgba(255,255,255,0.18) 0%, transparent 50%),
906
+ radial-gradient(circle at 80% 80%, rgba(255,255,255,0.10) 0%, transparent 60%);
907
+ pointer-events: none;
908
+ }
909
+
910
+ .audit-slop__inner {
911
+ position: relative;
912
+ display: grid;
913
+ gap: 0.6rem;
914
+ justify-items: center;
915
+ padding: var(--space-md);
916
+ max-width: 28ch;
917
+ }
918
+
919
+ .audit-slop__badge {
920
+ display: inline-block;
921
+ padding: 0.22rem 0.7rem;
922
+ font-family: "Inter", system-ui, sans-serif;
923
+ font-size: 0.625rem;
924
+ font-weight: 600;
925
+ letter-spacing: 0.06em;
926
+ text-transform: uppercase;
927
+ color: #ffffff;
928
+ background: rgba(255,255,255,0.18);
929
+ border: 1px solid rgba(255,255,255,0.28);
930
+ border-radius: 999px;
931
+ backdrop-filter: blur(6px);
932
+ -webkit-backdrop-filter: blur(6px);
933
+ }
934
+
935
+ .audit-slop__title {
936
+ margin: 0;
937
+ font-family: "Inter", system-ui, sans-serif;
938
+ font-weight: 700;
939
+ font-size: clamp(1.1rem, 2.4vw + 0.4rem, 2rem);
940
+ line-height: 1.1;
941
+ letter-spacing: -0.025em;
942
+ background: linear-gradient(135deg, #ffffff 0%, rgba(255,255,255,0.78) 100%);
943
+ -webkit-background-clip: text;
944
+ -webkit-text-fill-color: transparent;
945
+ background-clip: text;
946
+ }
947
+
948
+ .audit-slop__lede {
949
+ margin: 0;
950
+ font-family: "Inter", system-ui, sans-serif;
951
+ font-size: 0.8125rem;
952
+ font-weight: 400;
953
+ line-height: 1.4;
954
+ color: rgba(255,255,255,0.92);
955
+ }
956
+
957
+ .audit-slop__cta {
958
+ display: inline-block;
959
+ margin-block-start: 0.4rem;
960
+ padding: 0.55rem 1.1rem;
961
+ font-family: "Inter", system-ui, sans-serif;
962
+ font-size: 0.75rem;
963
+ font-weight: 600;
964
+ letter-spacing: 0.005em;
965
+ background: linear-gradient(135deg, #ffffff 0%, #fef3c7 100%);
966
+ color: #6b21a8;
967
+ border-radius: 999px;
968
+ user-select: none;
969
+ }
970
+
971
+ /* Caption above the slop card — frames the gradient as a quoted artifact, not
972
+ a card competing with the page. Mono caps, theme-coloured. */
973
+ .audit-slop__caption {
974
+ display: block;
975
+ margin: 0 0 var(--space-sm) 0;
976
+ font-family: var(--font-label);
977
+ font-size: var(--text-xs);
978
+ letter-spacing: var(--tracking-label);
979
+ text-transform: uppercase;
980
+ color: var(--color-muted);
981
+ }
982
+
983
+ /* Tint the slop card down on dark / charged themes so it stops winning the
984
+ visual contest against the surrounding theme. The card still reads as AI
985
+ slop — purpose retained. */
986
+ [data-theme="midnight"] .audit-slop,
987
+ [data-theme="manifesto"] .audit-slop,
988
+ [data-theme="halo"] .audit-slop,
989
+ [data-theme="aurora"] .audit-slop,
990
+ [data-theme="riso"] .audit-slop,
991
+ [data-theme="terminal"] .audit-slop,
992
+ [data-theme="brutal"] .audit-slop {
993
+ filter: saturate(0.55) brightness(0.82);
994
+ }
995
+
996
+ /* Audit checklist — replaces the old 4-row info panel. Each row reads:
997
+ ✗ <problem> → <fix>. Slop is muted; fix is ink. */
998
+ .audit-check {
999
+ list-style: none;
1000
+ margin: 0;
1001
+ padding: var(--space-md) var(--space-lg);
1002
+ display: grid;
1003
+ gap: 0;
1004
+ background: var(--color-paper);
1005
+ border: var(--rule-card, 1px) solid var(--color-rule);
1006
+ }
1007
+
1008
+ [data-theme="atelier"] .audit-check,
1009
+ [data-theme="salon"] .audit-check {
1010
+ border: 0;
1011
+ background: transparent;
1012
+ padding: 0;
1013
+ border-block-start: var(--rule-hair) solid var(--color-rule);
1014
+ }
1015
+
1016
+ [data-theme="brutal"] .audit-check,
1017
+ [data-theme="manifesto"] .audit-check { border-width: 2px; }
1018
+
1019
+ .audit-check__row {
1020
+ display: grid;
1021
+ grid-template-columns: 1.2rem 1fr 1.2rem 1fr;
1022
+ gap: 0.6rem;
1023
+ align-items: baseline;
1024
+ padding-block: var(--space-sm);
1025
+ border-block-end: var(--rule-hair) solid var(--color-rule);
1026
+ font-size: 0.8125rem;
1027
+ line-height: 1.4;
1028
+ }
1029
+
1030
+ .audit-check__row:last-child { border-block-end: 0; }
1031
+
1032
+ .audit-check__cross {
1033
+ font-family: var(--font-mono);
1034
+ font-weight: 600;
1035
+ color: var(--color-accent);
1036
+ text-align: center;
1037
+ }
1038
+
1039
+ .audit-check__problem {
1040
+ font-family: var(--font-body);
1041
+ color: var(--color-muted);
1042
+ text-decoration: line-through;
1043
+ text-decoration-thickness: 1px;
1044
+ text-decoration-color: var(--color-rule-2);
1045
+ }
1046
+
1047
+ .audit-check__arrow {
1048
+ font-family: var(--font-mono);
1049
+ color: var(--color-rule-2);
1050
+ text-align: center;
1051
+ }
1052
+
1053
+ .audit-check__fix {
1054
+ font-family: var(--font-body);
1055
+ color: var(--color-ink);
1056
+ font-weight: 500;
1057
+ }
1058
+
1059
+ @media (max-width: 36rem) {
1060
+ .audit-check__row {
1061
+ grid-template-columns: 1.2rem 1fr;
1062
+ gap: 0.4rem 0.6rem;
1063
+ }
1064
+ .audit-check__arrow { display: none; }
1065
+ .audit-check__fix {
1066
+ grid-column: 2;
1067
+ font-size: 0.875rem;
1068
+ }
1069
+ }
1070
+
1071
+ /* Rows IV & V — Diptych: before / after side-by-side thumbnails */
1072
+ .skill-row__demo--diptych {
1073
+ display: grid;
1074
+ grid-template-columns: 1fr 1fr;
1075
+ gap: var(--space-sm);
1076
+ margin: 0;
1077
+ }
1078
+
1079
+ .diptych__half {
1080
+ margin: 0;
1081
+ display: grid;
1082
+ gap: var(--space-xs);
1083
+ }
1084
+
1085
+ .diptych__half > .fig-corners {
1086
+ display: block;
1087
+ aspect-ratio: 16 / 10;
1088
+ overflow: hidden;
1089
+ border: var(--rule-hair) solid var(--color-rule);
1090
+ }
1091
+
1092
+ .diptych__half img,
1093
+ .diptych__half video {
1094
+ display: block;
1095
+ width: 100%;
1096
+ height: 100%;
1097
+ object-fit: cover;
1098
+ object-position: top left;
1099
+ }
1100
+
1101
+ .diptych__cap {
1102
+ font-family: var(--font-label);
1103
+ font-size: var(--text-xs);
1104
+ letter-spacing: var(--tracking-label);
1105
+ text-transform: uppercase;
1106
+ color: var(--color-muted);
1107
+ font-feature-settings: "tnum";
1108
+ }
1109
+
1110
+ .diptych__half[data-state="after"] .diptych__cap {
1111
+ color: var(--color-accent);
1112
+ }
1113
+
1114
+ @media (max-width: 48rem) {
1115
+ .skill-row__demo--diptych {
1116
+ grid-template-columns: 1fr;
1117
+ gap: var(--space-md);
1118
+ }
1119
+ }
1120
+
1121
+ /* — 06 · Install pane ——————————————————————————————
1122
+ A single bordered "manual page" card with three numbered rows —
1123
+ I · Run, II · In, III · Then. Replaces the old 4-card grid. The
1124
+ pane uses theme tokens for colour/border/typography so it adapts
1125
+ when T cycles themes. */
1126
+ .install-pane {
1127
+ display: grid;
1128
+ border: var(--rule-card, 1px) solid var(--color-rule);
1129
+ border-radius: var(--radius-card, 0);
1130
+ background: var(--color-paper);
1131
+ box-shadow: var(--shadow-card, none);
1132
+ overflow: hidden;
1133
+ }
1134
+
1135
+ .install-pane__row {
1136
+ display: grid;
1137
+ grid-template-columns: 9rem 1fr;
1138
+ gap: var(--space-xl);
1139
+ padding: var(--space-xl) var(--space-2xl);
1140
+ align-items: start;
1141
+ }
1142
+
1143
+ .install-pane__row + .install-pane__row {
1144
+ border-block-start: var(--rule-hair) solid var(--color-rule);
1145
+ }
1146
+
1147
+ @media (max-width: 50rem) {
1148
+ .install-pane__row {
1149
+ grid-template-columns: 1fr;
1150
+ gap: var(--space-md);
1151
+ padding: var(--space-lg);
1152
+ }
1153
+ }
1154
+
1155
+ /* — Before / After Hallmark ————————————————————————————
1156
+ Two screenshots side by side — the same prompt, run two ways. The
1157
+ "before" panel is what Sonnet 4.6 alone produces; the "after" is
1158
+ the same model with Hallmark loaded. The shared prompt sits above. */
1159
+ .ba__prompt {
1160
+ margin: 0 0 var(--space-2xl);
1161
+ padding: var(--space-md) var(--space-lg);
1162
+ background: var(--color-paper-2);
1163
+ border: var(--rule-hair) solid var(--color-rule);
1164
+ font-family: var(--font-mono);
1165
+ font-size: var(--text-sm);
1166
+ color: var(--color-ink-2);
1167
+ line-height: 1.4;
1168
+ font-feature-settings: "tnum";
1169
+ overflow: hidden;
1170
+ text-overflow: ellipsis;
1171
+ white-space: nowrap;
1172
+ border-radius: var(--radius-input, 0);
1173
+ max-width: 100%;
1174
+ }
1175
+ .ba__prompt-mark {
1176
+ color: var(--color-accent);
1177
+ font-weight: 500;
1178
+ margin-inline-end: 0.5em;
1179
+ }
1180
+
1181
+ .ba {
1182
+ display: grid;
1183
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1184
+ gap: var(--space-xl);
1185
+ }
1186
+
1187
+ @media (max-width: 56rem) {
1188
+ .ba { grid-template-columns: 1fr; gap: var(--space-2xl); }
1189
+ }
1190
+
1191
+ .ba__panel {
1192
+ margin: 0;
1193
+ display: grid;
1194
+ gap: var(--space-md);
1195
+ }
1196
+
1197
+ .ba__panel-label {
1198
+ margin: 0;
1199
+ font-family: var(--font-label);
1200
+ font-size: var(--text-xs);
1201
+ letter-spacing: var(--tracking-label);
1202
+ text-transform: uppercase;
1203
+ color: var(--color-muted);
1204
+ }
1205
+
1206
+ .ba__panel-tag {
1207
+ display: inline-block;
1208
+ padding: 0.3rem 0.75rem;
1209
+ border: var(--rule-hair) solid var(--color-rule-2);
1210
+ border-radius: 999px;
1211
+ background: var(--color-paper);
1212
+ color: var(--color-ink-2);
1213
+ letter-spacing: var(--tracking-label);
1214
+ }
1215
+
1216
+ .ba__panel-tag--accent {
1217
+ background: var(--color-ink);
1218
+ color: var(--color-paper);
1219
+ border-color: var(--color-ink);
1220
+ }
1221
+
1222
+ .ba__frame {
1223
+ display: block;
1224
+ aspect-ratio: 16 / 10;
1225
+ overflow: hidden;
1226
+ border: var(--rule-hair) solid var(--color-rule);
1227
+ background: var(--color-paper-2);
1228
+ border-radius: var(--radius-card, 0);
1229
+ }
1230
+
1231
+ .ba__frame img {
1232
+ width: 100%;
1233
+ height: 100%;
1234
+ object-fit: cover;
1235
+ object-position: center;
1236
+ display: block;
1237
+ }
1238
+
1239
+ .ba__panel-cap {
1240
+ margin: 0;
1241
+ font-family: var(--font-serif);
1242
+ font-size: var(--text-md);
1243
+ line-height: var(--lh-snug);
1244
+ color: var(--color-ink-2);
1245
+ max-width: 48ch;
1246
+ }
1247
+
1248
+ [data-theme="brutal"] .ba__panel-cap,
1249
+ [data-theme="manifesto"] .ba__panel-cap,
1250
+ [data-theme="terminal"] .ba__panel-cap,
1251
+ [data-theme="sport"] .ba__panel-cap,
1252
+ [data-theme="almanac"] .ba__panel-cap,
1253
+ [data-theme="quiet"] .ba__panel-cap,
1254
+ [data-theme="bloom"] .ba__panel-cap {
1255
+ font-family: var(--font-body);
1256
+ }
1257
+
1258
+ /* — 07 · Footer ————————————————————————————————————— */
1259
+ /* The "Powered by" accent dot — used by the editorial colophon. */
1260
+ .foot__powered-mark {
1261
+ display: inline-flex;
1262
+ align-items: center;
1263
+ gap: 0.4em;
1264
+ color: var(--color-ink);
1265
+ font-weight: 500;
1266
+ letter-spacing: 0.12em;
1267
+ text-transform: uppercase;
1268
+ font-size: var(--text-xs);
1269
+ }
1270
+
1271
+ .foot__powered-mark::before {
1272
+ content: "";
1273
+ width: 0.55em;
1274
+ height: 0.55em;
1275
+ background: var(--color-accent);
1276
+ }
1277
+
1278
+ /* — Dimension callout ——————————————————————————————— */
1279
+ .dim {
1280
+ display: inline-flex;
1281
+ align-items: center;
1282
+ gap: 0.5em;
1283
+ font-family: var(--font-label);
1284
+ font-size: var(--text-xs);
1285
+ letter-spacing: var(--tracking-label);
1286
+ text-transform: uppercase;
1287
+ color: var(--color-muted);
1288
+ }
1289
+
1290
+ /* ════════════════════════════════════════════════════════════ */
1291
+ /* STRUCTURAL FINGERPRINTS — per-theme overrides */
1292
+ /* Each theme picks distinct values across six axes: */
1293
+ /* heading placement · body composition · divider · button */
1294
+ /* · image · reveal */
1295
+ /* ════════════════════════════════════════════════════════════ */
1296
+
1297
+ /* ── ATELIER — generous spacing, narrow measure, left-aligned ─── */
1298
+ [data-theme="atelier"] .opening {
1299
+ grid-template-columns: 1fr;
1300
+ padding-block: var(--space-3xl) var(--space-xl);
1301
+ }
1302
+ [data-theme="atelier"] .opening__title {
1303
+ max-width: 16ch;
1304
+ }
1305
+ [data-theme="atelier"] .opening__sub {
1306
+ margin-top: var(--space-xl);
1307
+ }
1308
+ [data-theme="atelier"] .opening__aside {
1309
+ display: none;
1310
+ }
1311
+ [data-theme="atelier"] .section__head {
1312
+ grid-template-columns: 1fr;
1313
+ border-bottom: 0;
1314
+ padding-bottom: var(--space-2xl);
1315
+ }
1316
+ /* Negative space carries the rhythm — no rules between sections. */
1317
+ [data-theme="atelier"] .section + .section {
1318
+ padding-block-start: var(--space-3xl);
1319
+ }
1320
+ [data-theme="atelier"] .section__title {
1321
+ max-width: 22ch;
1322
+ }
1323
+ [data-theme="atelier"] .foundations {
1324
+ grid-template-columns: 1fr;
1325
+ max-width: 38rem;
1326
+ }
1327
+ [data-theme="atelier"] .spec {
1328
+ border-top: 0;
1329
+ border-bottom: var(--rule-hair) solid var(--color-rule);
1330
+ padding: var(--space-2xl) 0;
1331
+ }
1332
+ [data-theme="atelier"] .spec__head {
1333
+ gap: var(--space-md);
1334
+ }
1335
+ [data-theme="atelier"] .step {
1336
+ grid-template-columns: 1fr;
1337
+ }
1338
+ [data-theme="atelier"] .vs { grid-template-columns: 1fr; border: 0; }
1339
+ [data-theme="atelier"] .vs__col:first-child {
1340
+ border-right: 0;
1341
+ border-bottom: var(--rule-hair) solid var(--color-rule-2);
1342
+ }
1343
+
1344
+ /* ── NEWSPRINT — bottom-aligned head, multi-column body, double rule, drop cap ── */
1345
+ [data-theme="newsprint"] .opening {
1346
+ grid-template-columns: 1fr;
1347
+ border-top: 4px double var(--color-ink);
1348
+ border-bottom: 1px solid var(--color-ink);
1349
+ padding-block: var(--space-md);
1350
+ align-items: start;
1351
+ }
1352
+ [data-theme="newsprint"] .opening__aside {
1353
+ border-top: var(--rule-hair) solid var(--color-rule);
1354
+ margin-top: var(--space-md);
1355
+ padding-top: var(--space-md);
1356
+ }
1357
+ [data-theme="newsprint"] .opening__title {
1358
+ max-width: none;
1359
+ font-weight: 700;
1360
+ margin-block: var(--space-md);
1361
+ }
1362
+ [data-theme="newsprint"] .opening__sub {
1363
+ column-count: 2;
1364
+ column-gap: 2.5rem;
1365
+ column-rule: 0.5px solid var(--color-rule-2);
1366
+ hyphens: auto;
1367
+ text-align: justify;
1368
+ max-width: none;
1369
+ margin-top: var(--space-md);
1370
+ }
1371
+ /* Signature drop cap — first letter of the lede */
1372
+ [data-theme="newsprint"] .opening__sub::first-letter {
1373
+ font-family: var(--font-display);
1374
+ font-weight: 700;
1375
+ font-size: 4.2em;
1376
+ line-height: 0.85;
1377
+ float: left;
1378
+ margin: 0.08em 0.12em 0 0;
1379
+ color: var(--color-accent);
1380
+ }
1381
+ @media (max-width: 50rem) {
1382
+ [data-theme="newsprint"] .opening__sub { column-count: 1; }
1383
+ }
1384
+ [data-theme="newsprint"] .section__head {
1385
+ grid-template-columns: 1fr;
1386
+ border-bottom: 1px solid var(--color-ink);
1387
+ padding-block: 0.5rem;
1388
+ align-items: baseline;
1389
+ }
1390
+ [data-theme="newsprint"] .foundations {
1391
+ grid-template-columns: repeat(3, 1fr);
1392
+ column-gap: var(--space-xl);
1393
+ row-gap: 0;
1394
+ }
1395
+ @media (max-width: 70rem) {
1396
+ [data-theme="newsprint"] .foundations { grid-template-columns: repeat(2, 1fr); }
1397
+ }
1398
+ @media (max-width: 50rem) {
1399
+ [data-theme="newsprint"] .foundations { grid-template-columns: 1fr; }
1400
+ }
1401
+ [data-theme="newsprint"] .spec {
1402
+ border-top: 1px solid var(--color-ink);
1403
+ padding: var(--space-lg) 0;
1404
+ }
1405
+
1406
+ /* ── TERMINAL — inline `>` headings, mono everywhere ────────── */
1407
+ [data-theme="terminal"] .opening {
1408
+ grid-template-columns: 1fr;
1409
+ padding-block: var(--space-xl) var(--space-md);
1410
+ }
1411
+ [data-theme="terminal"] .opening__aside {
1412
+ display: grid;
1413
+ grid-template-columns: 1fr;
1414
+ padding-top: var(--space-md);
1415
+ border-top: var(--rule-hair) dashed var(--color-rule-2);
1416
+ }
1417
+ [data-theme="terminal"] .opening__title {
1418
+ text-transform: uppercase;
1419
+ font-weight: 500;
1420
+ letter-spacing: 0.02em;
1421
+ max-width: none;
1422
+ }
1423
+ [data-theme="terminal"] .opening__title::before {
1424
+ content: "$ ";
1425
+ color: var(--color-accent);
1426
+ }
1427
+ [data-theme="terminal"] .opening__title em {
1428
+ font-family: var(--font-display);
1429
+ font-style: normal;
1430
+ text-decoration: underline;
1431
+ text-decoration-color: var(--color-accent);
1432
+ text-underline-offset: 0.15em;
1433
+ }
1434
+ [data-theme="terminal"] .section__head {
1435
+ grid-template-columns: 1fr;
1436
+ border-bottom: var(--rule-hair) dashed var(--color-rule-2);
1437
+ }
1438
+ [data-theme="terminal"] .section__title {
1439
+ text-transform: uppercase;
1440
+ letter-spacing: 0.04em;
1441
+ font-weight: 500;
1442
+ }
1443
+ [data-theme="terminal"] .section__title::before {
1444
+ content: "// ";
1445
+ color: var(--color-accent);
1446
+ }
1447
+ [data-theme="terminal"] .opening__rule {
1448
+ height: 1rem;
1449
+ width: 0.6rem;
1450
+ background: var(--color-accent);
1451
+ animation: blink 1.05s steps(2) infinite;
1452
+ }
1453
+ @keyframes blink { 50% { opacity: 0; } }
1454
+ [data-theme="terminal"] .step__num::before { content: "[ "; color: var(--color-accent); }
1455
+ [data-theme="terminal"] .step__num::after { content: " ]"; color: var(--color-accent); }
1456
+
1457
+ /* ── MANIFESTO — full-bleed, ALL CAPS, colour blocks ────────── */
1458
+ [data-theme="manifesto"] .opening {
1459
+ grid-template-columns: 1fr;
1460
+ padding-block: var(--space-2xl) var(--space-xl);
1461
+ }
1462
+ [data-theme="manifesto"] .opening__aside { display: none; }
1463
+ [data-theme="manifesto"] .opening__title {
1464
+ text-transform: uppercase;
1465
+ font-weight: 800;
1466
+ max-width: 11ch;
1467
+ font-style: normal;
1468
+ }
1469
+ [data-theme="manifesto"] .opening__title em {
1470
+ font-family: var(--font-display);
1471
+ font-style: normal;
1472
+ font-weight: 800;
1473
+ background: var(--color-accent);
1474
+ color: var(--color-paper);
1475
+ padding: 0 0.12em;
1476
+ box-decoration-break: clone;
1477
+ -webkit-box-decoration-break: clone;
1478
+ }
1479
+ [data-theme="manifesto"] .opening__sub {
1480
+ text-transform: uppercase;
1481
+ font-weight: 500;
1482
+ letter-spacing: 0.02em;
1483
+ max-width: 56ch;
1484
+ }
1485
+ [data-theme="manifesto"] .section__head {
1486
+ grid-template-columns: 1fr;
1487
+ border-bottom: 3px solid var(--color-ink);
1488
+ padding-bottom: var(--space-sm);
1489
+ }
1490
+ [data-theme="manifesto"] .section__title {
1491
+ text-transform: uppercase;
1492
+ max-width: 18ch;
1493
+ font-weight: 800;
1494
+ }
1495
+ [data-theme="manifesto"] .step { border-top: 3px solid var(--color-ink); }
1496
+
1497
+ /* Manifesto — oversized declarative phrases punctuate the rhythm
1498
+ between sections. Cycles through 3 statements via :nth-of-type. */
1499
+ [data-theme="manifesto"] .section + .section::before {
1500
+ display: block;
1501
+ margin: var(--space-3xl) 0 var(--space-2xl);
1502
+ padding-block: var(--space-md);
1503
+ border-block: 4px solid var(--color-ink);
1504
+ font-family: var(--font-display);
1505
+ font-size: clamp(2rem, 5vw, 4rem);
1506
+ line-height: 0.95;
1507
+ letter-spacing: -0.02em;
1508
+ text-transform: uppercase;
1509
+ color: var(--color-ink);
1510
+ text-align: center;
1511
+ }
1512
+ [data-theme="manifesto"] .section:nth-of-type(3)::before { content: "WE DO NOT REPEAT."; }
1513
+ [data-theme="manifesto"] .section:nth-of-type(4)::before { content: "TYPE FIRST."; }
1514
+ [data-theme="manifesto"] .section:nth-of-type(5)::before { content: "NO GRADIENTS."; }
1515
+ [data-theme="manifesto"] .section:nth-of-type(6)::before { content: "DEFAULT IS THE ENEMY."; }
1516
+ [data-theme="manifesto"] .section:nth-of-type(7)::before { content: "EVERY DECISION VISIBLE."; }
1517
+ [data-theme="manifesto"] .section:nth-of-type(8)::before { content: "THE PAGE IS A POSITION."; }
1518
+
1519
+ /* ── SALON — italic display, fleuron divider, left-aligned ───── */
1520
+ [data-theme="salon"] .opening {
1521
+ grid-template-columns: 1fr;
1522
+ padding-block: var(--space-3xl) var(--space-xl);
1523
+ }
1524
+ [data-theme="salon"] .opening__title {
1525
+ font-style: italic;
1526
+ font-weight: 400;
1527
+ max-width: 14ch;
1528
+ }
1529
+ [data-theme="salon"] .opening__title em {
1530
+ font-style: normal;
1531
+ font-family: var(--font-display);
1532
+ }
1533
+ [data-theme="salon"] .opening__sub {
1534
+ margin-top: var(--space-xl);
1535
+ font-family: var(--font-serif);
1536
+ font-style: italic;
1537
+ }
1538
+ [data-theme="salon"] .opening__aside { display: none; }
1539
+ [data-theme="salon"] .section__head {
1540
+ grid-template-columns: 1fr;
1541
+ border-bottom: 0;
1542
+ padding-bottom: var(--space-md);
1543
+ }
1544
+ [data-theme="salon"] .section__head::after {
1545
+ content: "❦";
1546
+ display: block;
1547
+ color: var(--color-accent);
1548
+ font-size: 1.2rem;
1549
+ margin-top: var(--space-md);
1550
+ font-family: var(--font-serif);
1551
+ }
1552
+ [data-theme="salon"] .foundations {
1553
+ grid-template-columns: 1fr;
1554
+ max-width: 36rem;
1555
+ }
1556
+
1557
+ /* ── LINEN — hanging headings, two-column asymmetric, woven texture ─── */
1558
+ [data-theme="linen"] .opening { grid-template-columns: 7fr 5fr; gap: var(--space-3xl); }
1559
+ /* Section heads hang the label in a left gutter, title in the body column.
1560
+ Reads like a printed manuscript margin note + heading. */
1561
+ [data-theme="linen"] .section__head {
1562
+ grid-template-columns: 1fr;
1563
+ gap: var(--space-sm);
1564
+ border-bottom: 0;
1565
+ padding-bottom: 0;
1566
+ }
1567
+ [data-theme="linen"] .section__title { margin-bottom: var(--space-2xl); }
1568
+ [data-theme="linen"] .section-label { margin-bottom: var(--space-sm); }
1569
+ [data-theme="linen"] .foundations {
1570
+ grid-template-columns: 5fr 7fr;
1571
+ gap: var(--space-xl) var(--space-2xl);
1572
+ }
1573
+ @media (max-width: 56rem) { [data-theme="linen"] .foundations { grid-template-columns: 1fr; } }
1574
+ [data-theme="linen"] .spec { border-top: 0; border-bottom: var(--rule-hair) solid var(--color-rule); }
1575
+
1576
+ /* Signature: barely-visible woven texture — checkerboard at 3% opacity */
1577
+ html[data-theme="linen"] body {
1578
+ background-image:
1579
+ linear-gradient(45deg, oklch(20% 0.025 90 / 0.018) 25%, transparent 25%, transparent 75%, oklch(20% 0.025 90 / 0.018) 75%),
1580
+ linear-gradient(45deg, oklch(20% 0.025 90 / 0.018) 25%, transparent 25%, transparent 75%, oklch(20% 0.025 90 / 0.018) 75%);
1581
+ background-size: 6px 6px;
1582
+ background-position: 0 0, 3px 3px;
1583
+ }
1584
+
1585
+ /* ── ALMANAC — sticky labels, 3-col equal, dense, faint grid bg ────── */
1586
+ /* Signature: faint vertical grid running the full page (graph-paper) */
1587
+ html[data-theme="almanac"] body {
1588
+ background-image:
1589
+ linear-gradient(to right, oklch(38% 0.018 240 / 0.05) 0, oklch(38% 0.018 240 / 0.05) 1px, transparent 1px);
1590
+ background-size: calc(100% / 12) 100%;
1591
+ background-attachment: fixed;
1592
+ }
1593
+
1594
+ [data-theme="almanac"] .section__head {
1595
+ position: sticky;
1596
+ /* Dock BELOW the .banner (sticky top:0, height: var(--banner-height)).
1597
+ Both elements are sticky; without this offset, the section head bleeds
1598
+ over the banner because both start at top:0. */
1599
+ top: var(--banner-height);
1600
+ /* --z-sticky (200) sits beneath --z-sticky-nav (300) so the banner
1601
+ out-paints the section head even when their boxes overlap mid-scroll. */
1602
+ z-index: var(--z-sticky);
1603
+ background: var(--color-paper);
1604
+ /* Solid paper background (no transparency) so the 12-column body grid
1605
+ visible behind doesn't show through during the scroll transition. */
1606
+ padding-block: var(--space-sm);
1607
+ border-bottom: 1px solid var(--color-ink);
1608
+ grid-template-columns: 1fr;
1609
+ gap: var(--space-sm);
1610
+ }
1611
+ [data-theme="almanac"] .section__title { font-size: var(--text-xl); }
1612
+ /* Almanac calls itself indexed — push the §-number into every section label. */
1613
+ [data-theme="almanac"] .section-label::before {
1614
+ content: "§ ";
1615
+ color: var(--color-accent);
1616
+ font-feature-settings: "tnum";
1617
+ }
1618
+ [data-theme="almanac"] .foundations {
1619
+ grid-template-columns: repeat(3, 1fr);
1620
+ gap: 0;
1621
+ border-left: var(--rule-hair) solid var(--color-rule);
1622
+ }
1623
+ @media (max-width: 70rem) {
1624
+ [data-theme="almanac"] .foundations { grid-template-columns: repeat(2, 1fr); }
1625
+ }
1626
+ @media (max-width: 50rem) {
1627
+ [data-theme="almanac"] .foundations { grid-template-columns: 1fr; border-left: 0; }
1628
+ }
1629
+ [data-theme="almanac"] .spec {
1630
+ border-top: 0;
1631
+ border-right: var(--rule-hair) solid var(--color-rule);
1632
+ padding: var(--space-md) var(--space-md);
1633
+ }
1634
+ [data-theme="almanac"] .opening { grid-template-columns: 6fr 6fr; }
1635
+ [data-theme="almanac"] .opening__title { max-width: 18ch; }
1636
+
1637
+ /* ── SPORT — italic display, asymmetric spans, bleed-colour ── */
1638
+ [data-theme="sport"] .opening {
1639
+ grid-template-columns: 9fr 3fr;
1640
+ align-items: end;
1641
+ padding-block: var(--space-2xl) var(--space-xl);
1642
+ }
1643
+ [data-theme="sport"] .opening__title {
1644
+ font-style: italic;
1645
+ font-weight: 700;
1646
+ text-transform: uppercase;
1647
+ max-width: 14ch;
1648
+ }
1649
+ [data-theme="sport"] .opening__title em {
1650
+ font-family: var(--font-display);
1651
+ font-style: italic;
1652
+ color: var(--color-accent);
1653
+ font-weight: 700;
1654
+ }
1655
+ [data-theme="sport"] .opening__sub { font-weight: 500; }
1656
+ [data-theme="sport"] .section__head {
1657
+ grid-template-columns: 1fr;
1658
+ border-bottom: 2px solid var(--color-rule-2);
1659
+ padding-bottom: var(--space-md);
1660
+ }
1661
+ [data-theme="sport"] .section__title {
1662
+ font-style: italic;
1663
+ font-weight: 700;
1664
+ text-transform: uppercase;
1665
+ letter-spacing: -0.02em;
1666
+ }
1667
+ [data-theme="sport"] .foundations {
1668
+ grid-template-columns: 7fr 5fr;
1669
+ gap: var(--space-xl) var(--space-2xl);
1670
+ }
1671
+ @media (max-width: 56rem) { [data-theme="sport"] .foundations { grid-template-columns: 1fr; } }
1672
+ [data-theme="sport"] .spec { border-top: var(--rule-hair) solid var(--color-rule-2); }
1673
+ [data-theme="sport"] .step__num {
1674
+ font-style: italic;
1675
+ color: var(--color-accent);
1676
+ font-weight: 700;
1677
+ }
1678
+
1679
+ /* ── BRUTAL existing — augment with structural overrides ───── */
1680
+ [data-theme="brutal"] .opening__title em {
1681
+ font-style: normal;
1682
+ text-decoration: underline;
1683
+ text-decoration-thickness: 4px;
1684
+ text-underline-offset: 0.12em;
1685
+ text-decoration-color: var(--color-accent);
1686
+ }
1687
+ [data-theme="brutal"] .section__head {
1688
+ border-bottom: 3px solid var(--color-ink);
1689
+ }
1690
+
1691
+ /* ── GARDEN existing — augment ──────────────────────────────── */
1692
+ [data-theme="garden"] .section__head {
1693
+ grid-template-columns: 1fr;
1694
+ border-bottom: 0;
1695
+ padding-bottom: var(--space-lg);
1696
+ }
1697
+ [data-theme="garden"] .section__title { margin-top: var(--space-md); }
1698
+ [data-theme="garden"] .foundations { grid-template-columns: 5fr 7fr; }
1699
+ @media (max-width: 56rem) { [data-theme="garden"] .foundations { grid-template-columns: 1fr; } }
1700
+
1701
+ /* ── MIDNIGHT existing — numbered display style ─────────────── */
1702
+ [data-theme="midnight"] .section-label .num {
1703
+ color: var(--color-accent);
1704
+ }
1705
+ [data-theme="midnight"] .opening__title em {
1706
+ font-family: var(--font-serif);
1707
+ font-style: italic;
1708
+ color: var(--color-accent);
1709
+ }
1710
+
1711
+ /* — 04 · Anti-patterns — Slop, by name ——————————————————
1712
+ Five-row editorial list: number · slop name (struck-through,
1713
+ muted) · fix label + body (clean, ink). Side-by-side typography
1714
+ so the contrast IS the design. Hairline rules between rows. */
1715
+
1716
+ .anti__intro {
1717
+ margin: 0 0 var(--space-2xl);
1718
+ font-family: var(--font-serif);
1719
+ font-size: var(--text-md);
1720
+ line-height: var(--lh-snug);
1721
+ color: var(--color-ink-2);
1722
+ max-width: 60ch;
1723
+ }
1724
+
1725
+ [data-theme="brutal"] .anti__intro,
1726
+ [data-theme="manifesto"] .anti__intro,
1727
+ [data-theme="terminal"] .anti__intro,
1728
+ [data-theme="sport"] .anti__intro,
1729
+ [data-theme="almanac"] .anti__intro,
1730
+ [data-theme="quiet"] .anti__intro,
1731
+ [data-theme="bloom"] .anti__intro,
1732
+ [data-theme="riso"] .anti__intro {
1733
+ font-family: var(--font-body);
1734
+ font-style: normal;
1735
+ }
1736
+
1737
+ .anti__intro code {
1738
+ font-family: var(--font-mono);
1739
+ font-style: normal;
1740
+ font-size: 0.875em;
1741
+ background: var(--color-paper-2);
1742
+ padding: 0.05em 0.35em;
1743
+ border: var(--rule-hair) solid var(--color-rule);
1744
+ color: var(--color-ink);
1745
+ }
1746
+
1747
+ .anti-list {
1748
+ list-style: none;
1749
+ margin: 0;
1750
+ padding: 0;
1751
+ display: grid;
1752
+ gap: 0;
1753
+ }
1754
+
1755
+ .anti-row {
1756
+ display: grid;
1757
+ grid-template-columns: 3.5rem minmax(0, 1.3fr) minmax(0, 1fr);
1758
+ gap: var(--space-xl);
1759
+ padding-block: var(--space-xl);
1760
+ border-block-start: var(--rule-hair) solid var(--color-rule);
1761
+ align-items: start;
1762
+ }
1763
+
1764
+ .anti-row:first-child {
1765
+ border-block-start: 0;
1766
+ padding-block-start: 0;
1767
+ }
1768
+
1769
+ @media (max-width: 60rem) {
1770
+ .anti-row {
1771
+ grid-template-columns: 1fr;
1772
+ gap: var(--space-md);
1773
+ }
1774
+ }
1775
+
1776
+ .anti-row__num {
1777
+ margin: 0;
1778
+ font-family: var(--font-mono);
1779
+ font-size: var(--text-xs);
1780
+ letter-spacing: var(--tracking-label);
1781
+ text-transform: uppercase;
1782
+ color: var(--color-muted);
1783
+ padding-block-start: 0.45em;
1784
+ font-feature-settings: "tnum" 1;
1785
+ }
1786
+
1787
+ .anti-row__name {
1788
+ margin: 0 0 var(--space-sm) 0;
1789
+ font-family: var(--font-display);
1790
+ font-style: italic;
1791
+ font-weight: var(--display-weight, 500);
1792
+ font-size: clamp(1.25rem, 1.5vw + 0.75rem, 1.75rem);
1793
+ line-height: var(--lh-tight);
1794
+ letter-spacing: var(--tracking-tight);
1795
+ color: var(--color-rule-2);
1796
+ text-decoration: line-through;
1797
+ text-decoration-thickness: 1px;
1798
+ text-decoration-color: var(--color-rule-2);
1799
+ font-optical-sizing: auto;
1800
+ }
1801
+
1802
+ [data-theme="brutal"] .anti-row__name,
1803
+ [data-theme="manifesto"] .anti-row__name,
1804
+ [data-theme="sport"] .anti-row__name {
1805
+ text-transform: uppercase;
1806
+ font-style: normal;
1807
+ }
1808
+
1809
+ [data-theme="terminal"] .anti-row__name {
1810
+ font-family: var(--font-mono);
1811
+ font-style: normal;
1812
+ }
1813
+
1814
+ .anti-row__desc {
1815
+ margin: 0;
1816
+ font-family: var(--font-serif);
1817
+ font-size: 0.9375rem;
1818
+ line-height: var(--lh-relaxed);
1819
+ color: var(--color-muted);
1820
+ max-width: 50ch;
1821
+ }
1822
+
1823
+ [data-theme="brutal"] .anti-row__desc,
1824
+ [data-theme="manifesto"] .anti-row__desc,
1825
+ [data-theme="terminal"] .anti-row__desc,
1826
+ [data-theme="sport"] .anti-row__desc,
1827
+ [data-theme="almanac"] .anti-row__desc,
1828
+ [data-theme="quiet"] .anti-row__desc,
1829
+ [data-theme="bloom"] .anti-row__desc {
1830
+ font-family: var(--font-body);
1831
+ font-style: normal;
1832
+ }
1833
+
1834
+ .anti-row__fix-label {
1835
+ margin: 0 0 var(--space-2xs) 0;
1836
+ font-family: var(--font-label);
1837
+ font-size: var(--text-xs);
1838
+ letter-spacing: var(--tracking-label);
1839
+ text-transform: uppercase;
1840
+ color: var(--color-accent);
1841
+ font-feature-settings: "tnum";
1842
+ }
1843
+
1844
+ .anti-row__fix-body {
1845
+ margin: 0;
1846
+ font-family: var(--font-body);
1847
+ font-size: var(--text-base);
1848
+ line-height: var(--lh-relaxed);
1849
+ color: var(--color-ink);
1850
+ max-width: 45ch;
1851
+ }
1852
+
1853
+ /* — 05 · Foundations — eight compact cards in a 4×2 desktop grid.
1854
+ Each card pairs a hand-drawn monoline SVG (currentColor stroke,
1855
+ theme-aware) with a one-word title and a single line of body
1856
+ copy. Stacks cleanly on mobile. */
1857
+
1858
+ .found__intro {
1859
+ margin: 0 0 var(--space-2xl);
1860
+ font-family: var(--font-serif);
1861
+ font-size: var(--text-md);
1862
+ line-height: var(--lh-snug);
1863
+ color: var(--color-ink-2);
1864
+ max-width: 60ch;
1865
+ }
1866
+
1867
+ [data-theme="brutal"] .found__intro,
1868
+ [data-theme="manifesto"] .found__intro,
1869
+ [data-theme="terminal"] .found__intro,
1870
+ [data-theme="sport"] .found__intro,
1871
+ [data-theme="almanac"] .found__intro,
1872
+ [data-theme="quiet"] .found__intro,
1873
+ [data-theme="bloom"] .found__intro,
1874
+ [data-theme="riso"] .found__intro {
1875
+ font-family: var(--font-body);
1876
+ font-style: normal;
1877
+ }
1878
+
1879
+ /* Foundations cards — explicit per-card right + bottom borders so
1880
+ every column gap renders crisp at every theme + viewport. The
1881
+ prior gap-as-border pattern (gap: 0.5px, parent bg showing
1882
+ through) sub-pixel-rounded inconsistently — col 2/3 gaps
1883
+ sometimes vanished. The new approach uses real 1px borders on
1884
+ each card, parent gives top + left, cards give right + bottom.
1885
+ Result: every divider renders. */
1886
+ .found-cards {
1887
+ list-style: none;
1888
+ margin: 0;
1889
+ padding: 0;
1890
+ display: grid;
1891
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1892
+ border-block-start: 1px solid var(--color-rule);
1893
+ border-inline-start: 1px solid var(--color-rule);
1894
+ }
1895
+
1896
+ .found-card {
1897
+ background: var(--color-paper);
1898
+ padding: var(--space-lg) var(--space-md);
1899
+ display: grid;
1900
+ gap: var(--space-sm);
1901
+ align-content: start;
1902
+ min-height: 12rem;
1903
+ border-block-end: 1px solid var(--color-rule);
1904
+ border-inline-end: 1px solid var(--color-rule);
1905
+ }
1906
+
1907
+ .found-card__icon {
1908
+ display: block;
1909
+ width: 48px;
1910
+ height: 48px;
1911
+ color: var(--color-ink);
1912
+ margin-block-end: var(--space-xs);
1913
+ }
1914
+
1915
+ .found-card__icon svg {
1916
+ display: block;
1917
+ width: 100%;
1918
+ height: 100%;
1919
+ }
1920
+
1921
+ .found-card__name {
1922
+ margin: 0;
1923
+ font-family: var(--font-display);
1924
+ font-weight: var(--display-weight, 500);
1925
+ font-style: var(--display-style, normal);
1926
+ font-size: var(--text-lg);
1927
+ line-height: var(--lh-tight);
1928
+ letter-spacing: var(--tracking-tight);
1929
+ color: var(--color-ink);
1930
+ font-optical-sizing: auto;
1931
+ }
1932
+
1933
+ [data-theme="manifesto"] .found-card__name,
1934
+ [data-theme="brutal"] .found-card__name,
1935
+ [data-theme="sport"] .found-card__name {
1936
+ text-transform: uppercase;
1937
+ }
1938
+
1939
+ [data-theme="terminal"] .found-card__name {
1940
+ font-family: var(--font-mono);
1941
+ font-style: normal;
1942
+ }
1943
+
1944
+ .found-card__body {
1945
+ margin: 0;
1946
+ font-family: var(--font-body);
1947
+ font-size: 0.875rem;
1948
+ line-height: var(--lh-relaxed);
1949
+ color: var(--color-ink-2);
1950
+ max-width: 28ch;
1951
+ }
1952
+
1953
+ [data-theme="atelier"] .found-card,
1954
+ [data-theme="salon"] .found-card {
1955
+ background: transparent;
1956
+ border-inline-end: 0;
1957
+ border-block-end: var(--rule-hair) dashed var(--color-rule);
1958
+ }
1959
+
1960
+ [data-theme="atelier"] .found-cards,
1961
+ [data-theme="salon"] .found-cards {
1962
+ background: transparent;
1963
+ border: 0;
1964
+ border-block-start: var(--rule-hair) solid var(--color-rule);
1965
+ padding-block-start: var(--space-md);
1966
+ }
1967
+
1968
+ @media (max-width: 60rem) {
1969
+ .found-cards {
1970
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1971
+ }
1972
+ }
1973
+
1974
+ @media (max-width: 36rem) {
1975
+ .found-cards {
1976
+ grid-template-columns: 1fr;
1977
+ }
1978
+ .found-card { min-height: auto; }
1979
+ }
1980
+
1981
+ /* — Section pull-arrow ————————————————————————————————————
1982
+ Editorial "continued on p. 12" cue at the end of each section.
1983
+ Italic serif label + arrow, biased left or right per section
1984
+ for rhythm. Hover nudges the arrow forward. Pulls the eye into
1985
+ the next section instead of stopping cold. */
1986
+
1987
+ /* — Interlude — full-bleed typographic moment between sections —
1988
+ One declarative phrase set in the active theme's display face,
1989
+ centered on a contrasting paper band. Punctuates the scroll;
1990
+ resets attention before the next section. Zero motion, pure type. */
1991
+ .interlude {
1992
+ margin-inline: calc(-1 * var(--page-gutter));
1993
+ padding-block: var(--space-3xl);
1994
+ padding-inline: var(--page-gutter);
1995
+ background: var(--color-paper-2);
1996
+ border-block: var(--rule-hair) solid var(--color-rule);
1997
+ display: grid;
1998
+ place-items: center;
1999
+ text-align: center;
2000
+ }
2001
+
2002
+ .interlude__phrase {
2003
+ margin: 0;
2004
+ font-family: var(--font-display);
2005
+ font-weight: var(--display-weight, 500);
2006
+ font-style: var(--display-style, normal);
2007
+ font-size: clamp(2.25rem, 6vw + 1rem, 5rem);
2008
+ line-height: var(--lh-tight);
2009
+ letter-spacing: var(--tracking-display);
2010
+ color: var(--color-ink);
2011
+ font-optical-sizing: auto;
2012
+ max-width: 22ch;
2013
+ /* Long-word safety inherited from base.css */
2014
+ }
2015
+
2016
+ .interlude__phrase em {
2017
+ font-style: italic;
2018
+ /* Accent itself, not accent-ink: this <em> sits on the paper band,
2019
+ not on an accent fill. --color-accent-ink is "text over accent",
2020
+ which is paper-coloured on most themes and disappears here. */
2021
+ color: var(--color-accent);
2022
+ font-weight: 500;
2023
+ }
2024
+
2025
+ [data-theme="brutal"] .interlude__phrase,
2026
+ [data-theme="manifesto"] .interlude__phrase,
2027
+ [data-theme="sport"] .interlude__phrase {
2028
+ text-transform: uppercase;
2029
+ letter-spacing: -0.01em;
2030
+ }
2031
+
2032
+ [data-theme="brutal"] .interlude__phrase em,
2033
+ [data-theme="manifesto"] .interlude__phrase em,
2034
+ [data-theme="sport"] .interlude__phrase em {
2035
+ font-style: normal;
2036
+ color: var(--color-accent);
2037
+ }
2038
+
2039
+ [data-theme="terminal"] .interlude__phrase {
2040
+ font-family: var(--font-mono);
2041
+ }
2042
+
2043
+ [data-theme="terminal"] .interlude__phrase em {
2044
+ font-style: normal;
2045
+ color: var(--color-accent);
2046
+ }
2047
+
2048
+ @media (max-width: 48rem) {
2049
+ .interlude { padding-block: var(--space-2xl); }
2050
+ }
2051
+
2052
+ /* ──────────────────────────────────────────────────────────────
2053
+ Mobile collapse — section-head one-column on narrow viewports.
2054
+ Many themes override `.section__head`'s `grid-template-columns`
2055
+ (e.g. sport: 6rem 1fr · atelier: custom · linen: 6rem 1fr · …).
2056
+ Per-theme overrides have specificity (0, 2, 0); the original
2057
+ mobile collapse rule was (0, 1, 0) and lost the cascade — the
2058
+ fixed-column heads stayed 2-column on mobile, causing the title
2059
+ to overlap the section label (most visible on Sport: italic
2060
+ Anton title wrapped onto the "02 / EXAMPLES" label).
2061
+
2062
+ This rule restores single-column collapse with matching
2063
+ specificity so it wins source-order against every per-theme
2064
+ head override above. Keep this block last in the file. */
2065
+ @media (max-width: 48rem) {
2066
+ [data-theme] .section__head {
2067
+ grid-template-columns: 1fr;
2068
+ gap: var(--space-md);
2069
+ align-items: start;
2070
+ }
2071
+ }
2072
+