@stylecrib/cli 0.0.0-stage → 0.3.2

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 (348) hide show
  1. package/README.md +163 -2
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +7182 -0
  25. package/package.json +69 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/.anchor-render.png +0 -0
  38. package/themes/arc-stack/THEME.md +125 -0
  39. package/themes/arc-stack/audit.log.jsonl +6 -0
  40. package/themes/arc-stack/dismissals.jsonl +3 -0
  41. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  42. package/themes/arc-stack/theme.yml +153 -0
  43. package/themes/arc-stack/tokens.ts +29 -0
  44. package/themes/architectural/THEME.md +102 -0
  45. package/themes/architectural/tokens.ts +159 -0
  46. package/themes/atelier-radiance/THEME.md +93 -0
  47. package/themes/atelier-radiance/audit.log.jsonl +1 -0
  48. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  49. package/themes/atelier-radiance/theme.yml +130 -0
  50. package/themes/atelier-radiance/tokens.ts +29 -0
  51. package/themes/automotive-ev/THEME.md +87 -0
  52. package/themes/automotive-ev/tokens.ts +183 -0
  53. package/themes/automotive-luxury/THEME.md +88 -0
  54. package/themes/automotive-luxury/tokens.ts +175 -0
  55. package/themes/baby-modern/THEME.md +79 -0
  56. package/themes/baby-modern/tokens.ts +184 -0
  57. package/themes/banking-gravity/THEME.md +171 -0
  58. package/themes/banking-gravity/tokens.ts +169 -0
  59. package/themes/beauty-clean/THEME.md +92 -0
  60. package/themes/beauty-clean/tokens.ts +176 -0
  61. package/themes/beauty-luxury/THEME.md +96 -0
  62. package/themes/beauty-luxury/tokens.ts +178 -0
  63. package/themes/bento-modular/.anchor-render.png +0 -0
  64. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  65. package/themes/bento-modular/THEME.md +80 -0
  66. package/themes/bento-modular/audit.log.jsonl +3 -0
  67. package/themes/bento-modular/dismissals.jsonl +1 -0
  68. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  69. package/themes/bento-modular/theme.yml +83 -0
  70. package/themes/bento-modular/tokens.ts +27 -0
  71. package/themes/bookstore-indie/THEME.md +78 -0
  72. package/themes/bookstore-indie/tokens.ts +147 -0
  73. package/themes/brutalist/THEME.md +96 -0
  74. package/themes/brutalist/tokens.ts +151 -0
  75. package/themes/business-tiles/THEME.md +141 -0
  76. package/themes/business-tiles/tokens.ts +178 -0
  77. package/themes/cabana-poster/THEME.md +158 -0
  78. package/themes/cabana-poster/audit.log.jsonl +1 -0
  79. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  80. package/themes/cabana-poster/theme.yml +221 -0
  81. package/themes/cabana-poster/tokens.ts +34 -0
  82. package/themes/case-panel/THEME.md +126 -0
  83. package/themes/case-panel/audit.log.jsonl +2 -0
  84. package/themes/case-panel/tailwind.snippet.ts +15 -0
  85. package/themes/case-panel/theme.yml +153 -0
  86. package/themes/case-panel/tokens.ts +28 -0
  87. package/themes/cinematic-dark/THEME.md +97 -0
  88. package/themes/cinematic-dark/tokens.ts +195 -0
  89. package/themes/classic-car/THEME.md +86 -0
  90. package/themes/classic-car/tokens.ts +173 -0
  91. package/themes/cloud-friendly/THEME.md +152 -0
  92. package/themes/cloud-friendly/tokens.ts +181 -0
  93. package/themes/community-niche/THEME.md +102 -0
  94. package/themes/community-niche/tokens.ts +177 -0
  95. package/themes/corporate-grid/THEME.md +154 -0
  96. package/themes/corporate-grid/tokens.ts +182 -0
  97. package/themes/couture-luxury/THEME.md +85 -0
  98. package/themes/couture-luxury/tokens.ts +146 -0
  99. package/themes/creator-social/THEME.md +131 -0
  100. package/themes/creator-social/tokens.ts +249 -0
  101. package/themes/crypto-onchain/THEME.md +100 -0
  102. package/themes/crypto-onchain/tokens.ts +207 -0
  103. package/themes/cycling-brand/THEME.md +78 -0
  104. package/themes/cycling-brand/tokens.ts +185 -0
  105. package/themes/dating-friendly/THEME.md +102 -0
  106. package/themes/dating-friendly/tokens.ts +178 -0
  107. package/themes/dense-utility/THEME.md +85 -0
  108. package/themes/dense-utility/tokens.ts +155 -0
  109. package/themes/devtool-cli/THEME.md +100 -0
  110. package/themes/devtool-cli/tokens.ts +195 -0
  111. package/themes/devtool-docs/THEME.md +105 -0
  112. package/themes/devtool-docs/tokens.ts +177 -0
  113. package/themes/editorial/THEME.md +129 -0
  114. package/themes/editorial/audit.log.jsonl +2 -0
  115. package/themes/editorial/tailwind.snippet.ts +15 -0
  116. package/themes/editorial/theme.yml +173 -0
  117. package/themes/editorial/tokens.ts +29 -0
  118. package/themes/education-formal/THEME.md +154 -0
  119. package/themes/education-formal/audit.log.jsonl +1 -0
  120. package/themes/education-formal/tailwind.snippet.ts +15 -0
  121. package/themes/education-formal/theme.yml +186 -0
  122. package/themes/education-formal/tokens.ts +29 -0
  123. package/themes/education-warm/THEME.md +91 -0
  124. package/themes/education-warm/tokens.ts +185 -0
  125. package/themes/ember-poster/README.md +79 -0
  126. package/themes/ember-poster/THEME.md +101 -0
  127. package/themes/ember-poster/audit.log.jsonl +17 -0
  128. package/themes/ember-poster/package.json +34 -0
  129. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  130. package/themes/ember-poster/theme.yml +109 -0
  131. package/themes/ember-poster/tokens.ts +27 -0
  132. package/themes/enterprise-cloud/THEME.md +139 -0
  133. package/themes/enterprise-cloud/tokens.ts +179 -0
  134. package/themes/enterprise-tech/.anchor-render.png +0 -0
  135. package/themes/enterprise-tech/THEME.md +167 -0
  136. package/themes/enterprise-tech/audit.log.jsonl +1 -0
  137. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  138. package/themes/enterprise-tech/theme.yml +202 -0
  139. package/themes/enterprise-tech/tokens.ts +29 -0
  140. package/themes/ev-charging/THEME.md +94 -0
  141. package/themes/ev-charging/tokens.ts +185 -0
  142. package/themes/farm-direct/THEME.md +92 -0
  143. package/themes/farm-direct/tokens.ts +180 -0
  144. package/themes/fintech-card/THEME.md +96 -0
  145. package/themes/fintech-card/tokens.ts +191 -0
  146. package/themes/fintech-trust/THEME.md +94 -0
  147. package/themes/fintech-trust/tokens.ts +192 -0
  148. package/themes/food-blog/THEME.md +98 -0
  149. package/themes/food-blog/tokens.ts +183 -0
  150. package/themes/forum-classic/THEME.md +100 -0
  151. package/themes/forum-classic/tokens.ts +168 -0
  152. package/themes/fresh-plate/.anchor-render.png +0 -0
  153. package/themes/fresh-plate/THEME.md +144 -0
  154. package/themes/fresh-plate/audit.log.jsonl +2 -0
  155. package/themes/fresh-plate/dismissals.jsonl +3 -0
  156. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  157. package/themes/fresh-plate/theme.yml +189 -0
  158. package/themes/fresh-plate/tokens.ts +30 -0
  159. package/themes/furniture-modern/THEME.md +94 -0
  160. package/themes/furniture-modern/tokens.ts +176 -0
  161. package/themes/gaming-esports/THEME.md +146 -0
  162. package/themes/gaming-esports/tokens.ts +199 -0
  163. package/themes/gaming-streamer/THEME.md +139 -0
  164. package/themes/gaming-streamer/tokens.ts +201 -0
  165. package/themes/glassmorphic-modern/THEME.md +119 -0
  166. package/themes/glassmorphic-modern/tokens.ts +174 -0
  167. package/themes/government-civic/THEME.md +138 -0
  168. package/themes/government-civic/tokens.ts +164 -0
  169. package/themes/gym-chain/THEME.md +79 -0
  170. package/themes/gym-chain/tokens.ts +196 -0
  171. package/themes/healthcare-bright/THEME.md +95 -0
  172. package/themes/healthcare-bright/tokens.ts +184 -0
  173. package/themes/home-decor/THEME.md +94 -0
  174. package/themes/home-decor/tokens.ts +177 -0
  175. package/themes/hotel-boutique/THEME.md +110 -0
  176. package/themes/hotel-boutique/tokens.ts +179 -0
  177. package/themes/hyperminimal-mono/THEME.md +91 -0
  178. package/themes/hyperminimal-mono/tokens.ts +150 -0
  179. package/themes/indie-art-game/THEME.md +107 -0
  180. package/themes/indie-art-game/tokens.ts +216 -0
  181. package/themes/insurance-legacy/THEME.md +101 -0
  182. package/themes/insurance-legacy/tokens.ts +182 -0
  183. package/themes/insurance-modern/THEME.md +103 -0
  184. package/themes/insurance-modern/tokens.ts +192 -0
  185. package/themes/kaiju-reveal/THEME.md +97 -0
  186. package/themes/kaiju-reveal/tokens.ts +185 -0
  187. package/themes/kinetic-data/THEME.md +172 -0
  188. package/themes/kinetic-data/audit.log.jsonl +1 -0
  189. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  190. package/themes/kinetic-data/theme.yml +207 -0
  191. package/themes/kinetic-data/tokens.ts +30 -0
  192. package/themes/kinetic-headline/.anchor-render.png +0 -0
  193. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  194. package/themes/kinetic-headline/THEME.md +78 -0
  195. package/themes/kinetic-headline/audit.log.jsonl +4 -0
  196. package/themes/kinetic-headline/dismissals.jsonl +1 -0
  197. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  198. package/themes/kinetic-headline/theme.yml +81 -0
  199. package/themes/kinetic-headline/tokens.ts +26 -0
  200. package/themes/law-firm/THEME.md +108 -0
  201. package/themes/law-firm/tokens.ts +158 -0
  202. package/themes/lawtech-modern/THEME.md +107 -0
  203. package/themes/lawtech-modern/tokens.ts +192 -0
  204. package/themes/linkedin-pro/THEME.md +102 -0
  205. package/themes/linkedin-pro/tokens.ts +174 -0
  206. package/themes/logistics-modern/THEME.md +94 -0
  207. package/themes/logistics-modern/tokens.ts +187 -0
  208. package/themes/magazine-glossy/THEME.md +74 -0
  209. package/themes/magazine-glossy/tokens.ts +158 -0
  210. package/themes/marker-mag/THEME.md +128 -0
  211. package/themes/marker-mag/audit.log.jsonl +1 -0
  212. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  213. package/themes/marker-mag/theme.yml +159 -0
  214. package/themes/marker-mag/tokens.ts +27 -0
  215. package/themes/marketplace-modern/THEME.md +135 -0
  216. package/themes/marketplace-modern/tokens.ts +186 -0
  217. package/themes/marketplace-vintage/THEME.md +110 -0
  218. package/themes/marketplace-vintage/tokens.ts +185 -0
  219. package/themes/maximalist/THEME.md +96 -0
  220. package/themes/maximalist/tokens.ts +168 -0
  221. package/themes/mid-century/THEME.md +109 -0
  222. package/themes/mid-century/tokens.ts +162 -0
  223. package/themes/motorcycle-brand/THEME.md +86 -0
  224. package/themes/motorcycle-brand/tokens.ts +174 -0
  225. package/themes/museum/THEME.md +83 -0
  226. package/themes/museum/tokens.ts +147 -0
  227. package/themes/music-streaming/THEME.md +101 -0
  228. package/themes/music-streaming/tokens.ts +187 -0
  229. package/themes/music-vinyl/THEME.md +98 -0
  230. package/themes/music-vinyl/tokens.ts +167 -0
  231. package/themes/nature-distilled/.anchor-render.png +0 -0
  232. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  233. package/themes/nature-distilled/THEME.md +81 -0
  234. package/themes/nature-distilled/audit.log.jsonl +2 -0
  235. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  236. package/themes/nature-distilled/theme.yml +91 -0
  237. package/themes/nature-distilled/tokens.ts +26 -0
  238. package/themes/news-tabloid/THEME.md +72 -0
  239. package/themes/news-tabloid/tokens.ts +158 -0
  240. package/themes/news-tech/THEME.md +75 -0
  241. package/themes/news-tech/tokens.ts +149 -0
  242. package/themes/newsletter/THEME.md +82 -0
  243. package/themes/newsletter/tokens.ts +138 -0
  244. package/themes/newspaper-classic/THEME.md +74 -0
  245. package/themes/newspaper-classic/tokens.ts +159 -0
  246. package/themes/nonprofit-arts/THEME.md +78 -0
  247. package/themes/nonprofit-arts/tokens.ts +157 -0
  248. package/themes/nonprofit-warm/THEME.md +105 -0
  249. package/themes/nonprofit-warm/tokens.ts +188 -0
  250. package/themes/outdoor-adventure/THEME.md +113 -0
  251. package/themes/outdoor-adventure/tokens.ts +181 -0
  252. package/themes/overland-broadside/THEME.md +119 -0
  253. package/themes/overland-broadside/audit.log.jsonl +1 -0
  254. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  255. package/themes/overland-broadside/theme.yml +138 -0
  256. package/themes/overland-broadside/tokens.ts +27 -0
  257. package/themes/performance-engineered/THEME.md +162 -0
  258. package/themes/performance-engineered/audit.log.jsonl +1 -0
  259. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  260. package/themes/performance-engineered/theme.yml +193 -0
  261. package/themes/performance-engineered/tokens.ts +29 -0
  262. package/themes/pet-food/THEME.md +78 -0
  263. package/themes/pet-food/tokens.ts +185 -0
  264. package/themes/pharma-clinical/THEME.md +164 -0
  265. package/themes/pharma-clinical/audit.log.jsonl +1 -0
  266. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  267. package/themes/pharma-clinical/theme.yml +201 -0
  268. package/themes/pharma-clinical/tokens.ts +29 -0
  269. package/themes/pill-editorial/THEME.md +125 -0
  270. package/themes/pill-editorial/audit.log.jsonl +1 -0
  271. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  272. package/themes/pill-editorial/theme.yml +168 -0
  273. package/themes/pill-editorial/tokens.ts +31 -0
  274. package/themes/podcast-warm/THEME.md +103 -0
  275. package/themes/podcast-warm/tokens.ts +192 -0
  276. package/themes/publisher-indie/THEME.md +78 -0
  277. package/themes/publisher-indie/tokens.ts +148 -0
  278. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  279. package/themes/raw-concrete/THEME.md +76 -0
  280. package/themes/raw-concrete/audit.log.jsonl +10 -0
  281. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  282. package/themes/raw-concrete/theme.yml +88 -0
  283. package/themes/raw-concrete/tokens.ts +27 -0
  284. package/themes/realestate-luxury/THEME.md +94 -0
  285. package/themes/realestate-luxury/tokens.ts +169 -0
  286. package/themes/realestate-marketplace/THEME.md +106 -0
  287. package/themes/realestate-marketplace/tokens.ts +183 -0
  288. package/themes/restaurant-modern/THEME.md +109 -0
  289. package/themes/restaurant-modern/tokens.ts +172 -0
  290. package/themes/runway-fashion/THEME.md +99 -0
  291. package/themes/runway-fashion/tokens.ts +167 -0
  292. package/themes/saturday-morning/THEME.md +117 -0
  293. package/themes/saturday-morning/tokens.ts +281 -0
  294. package/themes/schema.ts +235 -0
  295. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  296. package/themes/signal-dark/THEME.md +107 -0
  297. package/themes/signal-dark/tokens.ts +181 -0
  298. package/themes/soft-modern/THEME.md +91 -0
  299. package/themes/soft-modern/tokens.ts +166 -0
  300. package/themes/solar-residential/THEME.md +92 -0
  301. package/themes/solar-residential/tokens.ts +176 -0
  302. package/themes/sports-league/THEME.md +180 -0
  303. package/themes/sports-league/audit.log.jsonl +1 -0
  304. package/themes/sports-league/tailwind.snippet.ts +15 -0
  305. package/themes/sports-league/theme.yml +213 -0
  306. package/themes/sports-league/tokens.ts +32 -0
  307. package/themes/stadium-sport/THEME.md +114 -0
  308. package/themes/stadium-sport/tokens.ts +187 -0
  309. package/themes/streetwear-hype/THEME.md +100 -0
  310. package/themes/streetwear-hype/tokens.ts +174 -0
  311. package/themes/studio-architect/THEME.md +108 -0
  312. package/themes/studio-architect/tokens.ts +162 -0
  313. package/themes/studio-photographer/THEME.md +88 -0
  314. package/themes/studio-photographer/tokens.ts +164 -0
  315. package/themes/team-kanban/.anchor-render.png +0 -0
  316. package/themes/team-kanban/THEME.md +167 -0
  317. package/themes/team-kanban/audit.log.jsonl +2 -0
  318. package/themes/team-kanban/dismissals.jsonl +1 -0
  319. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  320. package/themes/team-kanban/theme.yml +209 -0
  321. package/themes/team-kanban/tokens.ts +35 -0
  322. package/themes/telehealth-modern/THEME.md +95 -0
  323. package/themes/telehealth-modern/tokens.ts +197 -0
  324. package/themes/tourism-board/THEME.md +111 -0
  325. package/themes/tourism-board/tokens.ts +173 -0
  326. package/themes/toys-modern/THEME.md +79 -0
  327. package/themes/toys-modern/tokens.ts +200 -0
  328. package/themes/travel-luxury/THEME.md +95 -0
  329. package/themes/travel-luxury/tokens.ts +162 -0
  330. package/themes/vacation-rental/THEME.md +105 -0
  331. package/themes/vacation-rental/tokens.ts +174 -0
  332. package/themes/vault-reel/THEME.md +134 -0
  333. package/themes/vault-reel/audit.log.jsonl +3 -0
  334. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  335. package/themes/vault-reel/theme.yml +167 -0
  336. package/themes/vault-reel/tokens.ts +30 -0
  337. package/themes/vet-modern/THEME.md +79 -0
  338. package/themes/vet-modern/tokens.ts +194 -0
  339. package/themes/web3-restraint/THEME.md +87 -0
  340. package/themes/web3-restraint/tokens.ts +154 -0
  341. package/themes/wellness-active/THEME.md +102 -0
  342. package/themes/wellness-active/tokens.ts +203 -0
  343. package/themes/wellness-spa/THEME.md +93 -0
  344. package/themes/wellness-spa/tokens.ts +173 -0
  345. package/themes/y2k-chrome/THEME.md +118 -0
  346. package/themes/y2k-chrome/tokens.ts +249 -0
  347. package/themes/yoga-studio/THEME.md +76 -0
  348. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,158 @@
1
+ # Nature-Distilled — Build Brief
2
+
3
+ > The contract this theme ships with. Read at commit time by the
4
+ > brief-enforcer subagent; handed to Claude Code via the Copy-for-Claude
5
+ > button on the theme detail page.
6
+
7
+ ---
8
+
9
+ ## MANDATORY BUILD DIRECTIVE — you MUST
10
+
11
+ 1. **Hold the warm cream ground at `#EDE4D3`** on the light canvas.
12
+ Never the Claude-cream tell `#F4F1EA`. Never pure white. On dark
13
+ canvas invert to warm charcoal `#3D3226` bg + cream ink.
14
+ 2. **Use terra `#A6714E` STRUCTURALLY, never as a CTA button color.**
15
+ Terra is: the initial drop-cap on the hero H1, the hairline divider
16
+ under the hero, per-region tile top-rules, structural underlines.
17
+ Buttons are walnut on cream, terra bordered ghost, or accent bg.
18
+ 3. **Set the hero display in Fraunces serif** at `clamp(3rem, 7vw,
19
+ 6rem)`, weight 500, tracking -0.015em. Line-height 1.02. Body copy
20
+ in Hanken Grotesk / Inter at 17px line-height 1.55.
21
+ 4. **Olive-green mono `#6B7256` for sourcing chrome** — batch numbers
22
+ ("Batch 104"), region labels ("Oaxaca"), journal author bylines
23
+ ("Nia Ortiz · 8 min read"). This is the ONE place mono lives.
24
+ Never mono-caps eyebrows.
25
+ 5. **Terra initial cap on the hero H1** — the first letter of the
26
+ headline is in terra, weight 600, otherwise the headline is in
27
+ walnut ink `#3D3226`. This is the register-defining move.
28
+ 6. **Real Pexels photos** for the hero (aged wood or artisan hands),
29
+ sourcing tiles (3 region shots), journal cards (3 field photos),
30
+ and studio still. No SVG stand-ins. Photos: warm-toned, still-life
31
+ or artisan-context, never generic stock.
32
+
33
+ ---
34
+
35
+ ## SLOP-BLOCKLIST — you MUST NOT
36
+
37
+ - **Terra used as a CTA button fill color.** Terra is structural only.
38
+ A terra-fill button reads as decorative and breaks the register.
39
+ - **Mono-caps decorative eyebrows** (`SOURCING · REGIONS`, `BATCH 104`
40
+ at fingerprint `textTransform: uppercase` + `letterSpacing ≥ 0.14em`
41
+ at `fontSize < 20px`). Real content labels like `Batch 104-a` on a
42
+ product card are content, not eyebrow chrome.
43
+ - **`№` / N.º / no. / vol. ornaments.**
44
+ - **Roman-numeral copyright** (`MMXXVI`).
45
+ - **Cold gray body copy.** The register is warm-black `#3D3226` on
46
+ cream, or warm cream on charcoal. NEVER `#0F0F0F` or `#FFFFFF` or
47
+ any 0° hue neutral.
48
+ - **Sunset/sunrise gradient backdrops** — this theme uses grain
49
+ overlay, not gradients.
50
+ - **Vague trust copy:** hand-crafted, thoughtfully-made, considered.
51
+ This theme's whole register IS handcrafted — SHOW it via named
52
+ makers + origin postcodes, don't SAY it.
53
+ - **Attribution of influence in visible copy** — Aesop, The Ordinary,
54
+ Patagonia, Kinfolk can be studied but never NAMED.
55
+ - **Auto-advancing anything.** No sliders, no ticker, no cycling
56
+ headline words.
57
+ - **3-pillar identical feature grids.** Region tiles are 3-wide but
58
+ each tile has DIFFERENT internal composition (photo aspect,
59
+ material name, story length).
60
+
61
+ ---
62
+
63
+ ## CHROME INVENTORY — the allow-list
64
+
65
+ - **Sticky palette + canvas picker strip** — meta-UI, sentence-case
66
+ body font.
67
+ - **Masthead nav** — Fraunces "Ochre & Ash" wordmark (weight 600 at
68
+ 22px, letter-spacing -0.01em) + 4 nav items (body font, 14px,
69
+ walnut) + "Cart (0)" link (body font, walnut).
70
+ - **Grain-textured hero band** — SVG-filter fractal noise at
71
+ `mixBlendMode: multiply` (dark canvas: `screen`), opacity 0.7,
72
+ revealed on IntersectionObserver.
73
+ - **Hero H1 with terra drop-cap** — Fraunces 500 at clamp(3rem, 7vw,
74
+ 6rem), first letter in terra weight 600, rest in walnut ink.
75
+ - **Terra hairline divider** — 1px terra, 80px wide, between H1 and
76
+ body copy.
77
+ - **Walnut-filled CTA button** — walnut bg `#3D3226`, cream text,
78
+ padding 14px 24px, no radius, body font 15px weight 500. THIS is
79
+ the primary button style. Never terra-filled.
80
+ - **Full-bleed hero photograph** — 16:8 or 21:9, warm-toned, natural
81
+ materials.
82
+ - **Product tile grid (4-up)** — each tile: 4:5 photo, batch chip
83
+ (mono olive), product name (Fraunces 500 at 18px), tag (italic
84
+ body), price. NEVER add a hover animation.
85
+ - **Sourcing region tile (3-up)** — 3:2 photo + batch chip + region
86
+ name (Fraunces H3) + material italic + terra 32px hairline + prose.
87
+ - **Journal card (3-up)** — 3:2 photo + Fraunces title (22px) + mono
88
+ olive byline (`Nia Ortiz · 8 min read`).
89
+ - **Studio manifesto band** — surface-cream bg, 2-col: photo 4:5 +
90
+ Fraunces H2 + 2 body paragraphs.
91
+ - **Newsletter capture** — center-aligned Fraunces H2 + body + one-row
92
+ email input + walnut submit button.
93
+ - **Cream footer** — brand + one-liner + 3 link columns (mono olive
94
+ column labels are permitted here as content — they're footer nav
95
+ headings, not decorative eyebrows).
96
+
97
+ ---
98
+
99
+ ## SIGNATURE MOVES — verbs, not adjectives
100
+
101
+ - **Reveal the grain overlay on scroll** using IntersectionObserver at
102
+ threshold 0.3 — opacity 0 → 0.7 over 400ms cubic-bezier. Cream
103
+ paper texture is the visual grounding.
104
+ - **Drop-cap the hero's first letter in terra** — this is the ONE
105
+ structural use of terra above the hairline. If the drop-cap isn't
106
+ there, the theme is broken.
107
+ - **Batch every product with a mono olive chip** — `Batch 104-b`.
108
+ This IS the theme's slow-goods signature.
109
+ - **Alternate 60/40 splits for the sourcing regions** — each region
110
+ tile keeps photo-left OR photo-top, but every alternate section
111
+ through the page swaps side. Never render three regions in a
112
+ uniform grid.
113
+ - **Italic Fraunces for product tags** ("50ml", "180mm", "Set of two")
114
+ — italic Fraunces at 13px in warm walnut. This is how the theme
115
+ reads as slow-goods and not modern-DTC.
116
+ - **The batch letter is six letters a year, no offers** — the
117
+ newsletter copy IS the theme's product-voice signature.
118
+
119
+ ---
120
+
121
+ ## COLOR TOKENS
122
+
123
+ **Light canvas** — `cream: #EDE4D3` / `surfaceCream: #F5EFE0` /
124
+ `walnut: #3D3226` (ink) / body / mute / footer copy.
125
+
126
+ **Dark canvas** — `bg: #3D3226` (warm charcoal) / `surface: #4E4235` /
127
+ `ink: #F5EFE0` / mute.
128
+
129
+ **Structural** — `terra: #A6714E` (drop-cap, hairlines, dividers).
130
+
131
+ **Sourcing chrome** — `olive: #6B7256` (batch chips, footer column
132
+ labels, journal bylines).
133
+
134
+ ---
135
+
136
+ ## TYPOGRAPHY
137
+
138
+ - **Display:** Fraunces (fallback Playfair Display, Georgia).
139
+ Weight 500 default, 600 for the drop-cap. Tracking -0.015em.
140
+ - **Body:** Hanken Grotesk (fallback Inter), 17px, line-height 1.55.
141
+ - **Mono:** JetBrains Mono / IBM Plex Mono, 11px, `color: olive`,
142
+ letter-spacing 0.16-0.20em. ONLY for batch chips, region labels,
143
+ journal bylines, footer column labels, and the palette picker.
144
+
145
+ ---
146
+
147
+ ## SECTION SKELETON
148
+
149
+ 1. Sticky palette + canvas picker.
150
+ 2. Masthead nav.
151
+ 3. Grain-textured hero with terra drop-cap.
152
+ 4. Full-bleed hero photograph.
153
+ 5. Featured products (4-up batch).
154
+ 6. Sourcing regions (3-up).
155
+ 7. Journal / field reports (3-up).
156
+ 8. Studio manifesto (2-col: portrait + copy).
157
+ 9. Batch-letter newsletter capture.
158
+ 10. Cream footer band.
@@ -0,0 +1,81 @@
1
+ # Nature Distilled
2
+
3
+ > Earthy grounded warmth — skin, wood, and soil tones anchor a light surface with tactile depth. Trustworthy without being sterile.
4
+
5
+ **Slug:** `nature-distilled` — **Surface:** web — **Density:** airy
6
+
7
+ ## Influence
8
+
9
+ The Ordinary skincare (sand + walnut layering), Aesop packaging (warm earth on cream), Cotopaxi (natural texture over flat), Field Notes (warm paper + olive accent), Patagonia storytelling (organic photography).
10
+
11
+ ## Signature move
12
+
13
+ Grain texture overlay on hero imagery (subtle noise, 8-12% opacity)
14
+ + walnut ink on cream surface (never terracotta — that's the AI tell).
15
+ Serif display type at generous size, one olive-green secondary used
16
+ sparingly for sourcing/attribution chrome, and a single terra accent
17
+ #A6714E used STRUCTURALLY (a section divider, an initial cap) not
18
+ as the safe cream+terra button color.
19
+
20
+ ## Palette
21
+
22
+ - **bg:** `#EDE4D3`
23
+ - **surface:** `#F5EFE0`
24
+ - **ink:** `#3D3226`
25
+ - **accent:** `#A6714E`
26
+ - **secondary:** `#6B7256`
27
+
28
+ ## Typography
29
+
30
+ - **Display:** Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em
31
+ - **Body:** Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display.
32
+ - **Mono:** JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body.
33
+ - **Scale:** 1.333 (perfect fourth — organic contrast, doesn't feel measured)
34
+
35
+ ## Motion
36
+
37
+ One texture-in reveal on scroll — grain overlay fades in over the hero
38
+ image at 400ms ease-out when the hero enters viewport. Nothing else
39
+ moves. No card hover animation, no CTA glow, no scroll parallax.
40
+ Warmth comes from PALETTE and TEXTURE, never from motion.
41
+
42
+
43
+ ## Imagery
44
+
45
+ Warm organic photography — hands working material, wood grain,
46
+ earth-toned still life. Slight desaturation (85-90%), warm color-cast.
47
+ Grain overlay when the image is a hero. Illustration if used is
48
+ botanical line-art in walnut ink. NO stock photography of "hands
49
+ reaching," NO gradient overlays.
50
+
51
+ ## Best for
52
+
53
+ - Skincare and beauty brands with an earth-conscious register
54
+ - Craft goods (ceramics, textiles, furniture, small-batch food)
55
+ - Sustainability-focused DTC and mission-driven consumer brands
56
+ - Warm-editorial magazines and lifestyle publishing
57
+ - Wellness and wine brands that want depth without going full luxury
58
+
59
+ ## Reject if
60
+
61
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
62
+
63
+ - #D97757 or any terracotta accent as the primary CTA / decoration — that IS the Claude-cream tell (R-CLAUDE-CREAM in slop-blocklist)
64
+ - Pure #FFFFFF background — the register is warm cream, never sterile white
65
+ - shadow-md or drop-shadow on cards — depth comes from grain texture, not shadow bloom
66
+ - Cold gray body text — ink is #3D3226 walnut, never #64748b slate-gray
67
+ - Gradient overlays on hero photography — grain overlay is the technique, not gradients
68
+ - Sans-serif display (this register requires the Fraunces optical-serif contrast)
69
+ - Rounded button corners greater than 8px — softer than brutalism but not pill-shaped
70
+ - Bright saturated accents — walnut/terra/olive stay muted (saturation <45%)
71
+ - Two accent colors visible simultaneously beyond the walnut-ink + one earthy accent
72
+
73
+ ## Banned defaults (inherited + theme-specific)
74
+
75
+ - claude-cream (#F4F1EA + serif + #D97757)
76
+ - void+acid (near-black bg + single bright acid-green or vermilion accent)
77
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
78
+ - tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
79
+ - uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
80
+ - cream-plus-terra (any hex within Lab 8 of #F4F1EA background paired with any hex within Lab 8 of #D97757 accent — the specific Claude-cream tell)
81
+ - sterile-nature (cream/white bg with cold gray body ink and one saturated green — the AI 'nature' default that reads as pharmacy, not craft)
@@ -0,0 +1,2 @@
1
+ {"slug":"nature-distilled","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:00.081Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:00.089Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:27.642Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:41.517Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T18:32:00.081Z"}
2
+ {"slug":"nature-distilled","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:14.404Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:14.413Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T22:52:14.413Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — anchor-compare skipped. Set the key to enable rubric grading."},"ran_at":"2026-07-03T22:52:17.614Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:52:14.404Z"}
@@ -0,0 +1,16 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: nature-distilled
3
+ export const natureDistilledTailwindExtend = {
4
+ colors: {
5
+ bg: "#EDE4D3",
6
+ surface: "#F5EFE0",
7
+ ink: "#3D3226",
8
+ accent: "#A6714E",
9
+ secondary: "#6B7256",
10
+ },
11
+ fontFamily: {
12
+ display: ["Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em"],
13
+ body: ["Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display."],
14
+ mono: ["JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body."],
15
+ },
16
+ };
@@ -0,0 +1,91 @@
1
+ # Base 34 Nature Distilled — Family D, Contemporary Web.
2
+ #
3
+ # Per BESPOKE_THEME_SYSTEM.md #34: earthy grounded warmth. Skin/wood/soil
4
+ # tones. Tactile, human, trustworthy. The spec explicitly says AVOID
5
+ # #D97757 on cream — anchor in walnut/olive instead. That's the exact
6
+ # Claude-cream tell R-CLAUDE-CREAM catches; Nature Distilled has to
7
+ # refuse it by construction.
8
+ #
9
+ # Theme #4 through the v2 harness. Chosen deliberately as a test: does
10
+ # the Family D rubric (written around Dark Premium's dark-ground signal-
11
+ # accent register) accept a LIGHT earthy theme in the same family?
12
+ # Prediction: anchor-compare may fire on surface-layering (rubric axis 1,
13
+ # looking for dark layered panels). That's a real finding about rubric
14
+ # breadth if it happens — surface it, don't paper over.
15
+ #
16
+ # Precedent: pet-food + zone-drift survivors, per SURVIVOR_MAPPING.md.
17
+
18
+ name: Nature Distilled
19
+ concept: Earthy grounded warmth — skin, wood, and soil tones anchor a light surface with tactile depth. Trustworthy without being sterile.
20
+ influence: The Ordinary skincare (sand + walnut layering), Aesop packaging (warm earth on cream), Cotopaxi (natural texture over flat), Field Notes (warm paper + olive accent), Patagonia storytelling (organic photography).
21
+
22
+ family: D
23
+ base_number: 34
24
+ render_url: http://localhost:5173/themes/nature-distilled
25
+
26
+ surface: web
27
+
28
+ typography:
29
+ display: Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em
30
+ body: Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display.
31
+ mono: JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body.
32
+ scale: 1.333 (perfect fourth — organic contrast, doesn't feel measured)
33
+
34
+ palette:
35
+ bg: "#EDE4D3"
36
+ surface: "#F5EFE0"
37
+ ink: "#3D3226"
38
+ accent: "#A6714E"
39
+ secondary: "#6B7256"
40
+
41
+ density: airy
42
+
43
+ motion: |
44
+ One texture-in reveal on scroll — grain overlay fades in over the hero
45
+ image at 400ms ease-out when the hero enters viewport. Nothing else
46
+ moves. No card hover animation, no CTA glow, no scroll parallax.
47
+ Warmth comes from PALETTE and TEXTURE, never from motion.
48
+
49
+ signature: |
50
+ Grain texture overlay on hero imagery (subtle noise, 8-12% opacity)
51
+ + walnut ink on cream surface (never terracotta — that's the AI tell).
52
+ Serif display type at generous size, one olive-green secondary used
53
+ sparingly for sourcing/attribution chrome, and a single terra accent
54
+ #A6714E used STRUCTURALLY (a section divider, an initial cap) not
55
+ as the safe cream+terra button color.
56
+
57
+ imagery: |
58
+ Warm organic photography — hands working material, wood grain,
59
+ earth-toned still life. Slight desaturation (85-90%), warm color-cast.
60
+ Grain overlay when the image is a hero. Illustration if used is
61
+ botanical line-art in walnut ink. NO stock photography of "hands
62
+ reaching," NO gradient overlays.
63
+
64
+ best_for:
65
+ - Skincare and beauty brands with an earth-conscious register
66
+ - Craft goods (ceramics, textiles, furniture, small-batch food)
67
+ - Sustainability-focused DTC and mission-driven consumer brands
68
+ - Warm-editorial magazines and lifestyle publishing
69
+ - Wellness and wine brands that want depth without going full luxury
70
+
71
+ avoid:
72
+ - "#D97757 or any terracotta accent as the primary CTA / decoration — that IS the Claude-cream tell (R-CLAUDE-CREAM in slop-blocklist)"
73
+ - "Pure #FFFFFF background — the register is warm cream, never sterile white"
74
+ - "shadow-md or drop-shadow on cards — depth comes from grain texture, not shadow bloom"
75
+ - "Cold gray body text — ink is #3D3226 walnut, never #64748b slate-gray"
76
+ - "Gradient overlays on hero photography — grain overlay is the technique, not gradients"
77
+ - "Sans-serif display (this register requires the Fraunces optical-serif contrast)"
78
+ - "Rounded button corners greater than 8px — softer than brutalism but not pill-shaped"
79
+ - "Bright saturated accents — walnut/terra/olive stay muted (saturation <45%)"
80
+ - "Two accent colors visible simultaneously beyond the walnut-ink + one earthy accent"
81
+
82
+ banned_defaults:
83
+ # Global blocklist from BESPOKE_THEME_SYSTEM.md
84
+ - "claude-cream (#F4F1EA + serif + #D97757)"
85
+ - "void+acid (near-black bg + single bright acid-green or vermilion accent)"
86
+ - "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
87
+ - "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
88
+ - "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
89
+ # Base-specific
90
+ - "cream-plus-terra (any hex within Lab 8 of #F4F1EA background paired with any hex within Lab 8 of #D97757 accent — the specific Claude-cream tell)"
91
+ - "sterile-nature (cream/white bg with cold gray body ink and one saturated green — the AI 'nature' default that reads as pharmacy, not craft)"
@@ -0,0 +1,26 @@
1
+ // Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
2
+
3
+ export const tokens = {
4
+ slug: "nature-distilled",
5
+ family: "D",
6
+ base: "34",
7
+ palette: {
8
+ "bg": "#EDE4D3",
9
+ "surface": "#F5EFE0",
10
+ "ink": "#3D3226",
11
+ "accent": "#A6714E",
12
+ "secondary": "#6B7256"
13
+ },
14
+ typography: {
15
+ "display": "Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em",
16
+ "body": "Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display.",
17
+ "mono": "JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body.",
18
+ "scale": "1.333 (perfect fourth — organic contrast, doesn't feel measured)"
19
+ },
20
+ surface: "web",
21
+ density: "airy",
22
+ motion: "One texture-in reveal on scroll — grain overlay fades in over the hero\nimage at 400ms ease-out when the hero enters viewport. Nothing else\nmoves. No card hover animation, no CTA glow, no scroll parallax.\nWarmth comes from PALETTE and TEXTURE, never from motion.\n",
23
+ signature: "Grain texture overlay on hero imagery (subtle noise, 8-12% opacity)\n+ walnut ink on cream surface (never terracotta — that's the AI tell).\nSerif display type at generous size, one olive-green secondary used\nsparingly for sourcing/attribution chrome, and a single terra accent\n#A6714E used STRUCTURALLY (a section divider, an initial cap) not\nas the safe cream+terra button color.\n",
24
+ } as const;
25
+
26
+ export type Tokens = typeof tokens;
@@ -0,0 +1,72 @@
1
+ # Design Direction — News-Tabloid
2
+
3
+ ## Ethos
4
+ Daily Mail sidebar-of-shame · NY Post wood-type front page · The Sun condensed screamer · Bild red-rule masthead · NY Daily News photo-density
5
+
6
+ ## Feel
7
+ Loud, condensed, photo-dense. Red masthead rule + black ink on near-white newsprint. Knockout-style condensed bold sans at oversized sizes screaming the headline. Stacks of headlines, grids of thumbnails, talker sidebars. The page is the noise. The opposite of editorial restraint — every inch carries shout.
8
+
9
+ ## Reference brands
10
+ - **Daily Mail** → sidebar-of-shame headline stack, photo-densest layout in news.
11
+ - **NY Post** → wood-type-condensed front-page screamer, all-caps shout.
12
+ - **The Sun** → red+black bold, white-on-red kicker chips.
13
+ - **Bild** → thick red masthead rule, sans-only display register.
14
+ - **NY Daily News** → tabloid headline tower, talker sidebar.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Brand tokens: `--ink`, `--tabloid-red`, `--exclusive-yellow`, `--newsprint`, `--rule-heavy`, `--chip-fill`. Foreground is nearly pure black (`hsl(0 0% 8%)`) — tabloid ink is screamer-ready, not editorial-warm.
18
+
19
+ Primary is **tabloid red** (`hsl(0 82% 48%)`) — saturated, used aggressively as masthead, kicker chips, and CTA fills. EXCLUSIVE-chip yellow (`hsl(48 100% 50%)`) is the second loud accent, used sparingly on top-story flags.
20
+
21
+ ## Typography
22
+ - **Display:** Oswald (Knockout-style condensed bold sans). Weights 500–700. The headline tower lives here, all-caps at oversized sizes.
23
+ - **Body:** Source Sans 3. 15px tight / `line-height: 1.45` — high density.
24
+ - **Mono:** JetBrains Mono. Timestamps, comment counts (`12,847 COMMENTS`), picture credits.
25
+
26
+ H1 uses `clamp(3rem, 9vw, 7rem)` — front-page screamer scale.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-7xl px-4 lg:px-8` — wide; photo grids and headline towers need the room.
30
+ - **Section padding:** hero `pt-10 pb-8 lg:pt-16 lg:pb-12`; default `py-12 lg:py-16`; tight `py-6 lg:py-10`. Tighter than every other direction.
31
+ - **Scale:** 2 4 6 8 10 12 16 20 24 32 48 64 — high density.
32
+
33
+ ## Color
34
+ No hex in components. The page is built from four colors: `--ink`, `--newsprint`, `--tabloid-red`, `--exclusive-yellow`. The combination is the brand.
35
+
36
+ ## Radius
37
+ `--radius: 0`. **Sharp corners only.** Pills disallowed — no soft chips. Tabloid chips are angular rects with heavy ink borders.
38
+
39
+ ## Shadows
40
+ None / utility-only. Two utilities: `.rule-heavy` (2px ink rule under section bars) and `.chip-shadow` (crude 2px / 2px offset shadow on EXCLUSIVE chips — newsprint-printing-press feel).
41
+
42
+ ## Motion
43
+ Two keyframes. `snap-in` (250ms) — fast snap entrance, no theatrical rise. `chip-flash` (800ms infinite) — flashes the BREAKING/EXCLUSIVE chip between red and yellow, used sparingly (single top story only). Honors `prefers-reduced-motion`.
44
+
45
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`.
46
+
47
+ ## Component patterns
48
+ - **Buttons:** solid-fill in `--tabloid-red` with white text + heavy `--ink` border. Bold condensed display font, all-caps. Secondary buttons invert: `--ink` fill + white text. No ghost buttons — tabloid commits to fill.
49
+ - **Cards:** thick 2px `--ink` border, no radius. White or `--newsprint` background. Oversized Oswald headline, colored kicker chip bar above. Padding tight (`p-3 lg:p-4`).
50
+ - **Inputs:** full box with 2px `--ink` border. Bold sans label above in caps. Focus shifts border to `--tabloid-red`.
51
+ - **CTA links:** filled rect in `--tabloid-red` or `--ink`, heavy border, all-caps. **Never a text-link CTA.**
52
+
53
+ ## Bespoke section
54
+ A headline tower of 8 stacked headlines (varying sizes — top story oversized, descending) + a 6-thumbnail photo grid with caption strips beneath each + a "Talkers" sidebar list (5 most-commented stories with comment-count mono badges). The tower uses BREAKING / EXCLUSIVE / SHOCK kicker chips in flashing colors. Composition is dense and packed — no white space breathing room.
55
+
56
+ ## Recommended rich media
57
+ Tabloid photography — paparazzi shots, court entrances, celebrity-with-coffee. High contrast, slight oversaturation. Thumbnails are tight 4:3 with bold caption strips beneath in white-on-black.
58
+
59
+ **AI tool recommendations:** Midjourney prompts like *"paparazzi long-lens, tabloid front page, harsh flash, high contrast"*. Avoid editorial portraiture (newspaper-classic / magazine-glossy territory). Use bold Knockout-style headlines as caption overlays.
60
+
61
+ **Avoid:** subtle photography, magazine-glossy lighting, drop shadows (the offset crude shadow is the only allowed shadow), pill chips, gradient backgrounds, any restrained palette.
62
+
63
+ ## Details
64
+ - **Selection:** `hsl(var(--exclusive-yellow) / 0.6)` — yellow highlighter.
65
+ - **Focus ring:** `2px solid hsl(var(--ring))` — thick, screamer-loud.
66
+ - **Scrollbar:** auto.
67
+
68
+ ## Exceptions
69
+ None yet.
70
+
71
+ ## Revisions
72
+ - Initial direction.
@@ -0,0 +1,158 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // Note: "news-tabloid" is not yet in the Direction["name"] enum.
4
+ // The schema is closed; until it is extended this file casts the name.
5
+
6
+ export const newsTabloid: Direction = {
7
+ name: "news-tabloid" as Direction["name"],
8
+ ethos: "Daily Mail sidebar-of-shame · NY Post wood-type front page · The Sun condensed screamer · Bild red-rule masthead · NY Daily News photo-density",
9
+ references: [
10
+ { brand: "Daily Mail", trait: "sidebar-of-shame headline stack, photo-densest layout in news" },
11
+ { brand: "NY Post", trait: "wood-type-condensed front-page screamer, all-caps shout" },
12
+ { brand: "The Sun", trait: "red+black bold, white-on-red kicker chips" },
13
+ { brand: "Bild", trait: "thick red masthead rule, sans-only display register" },
14
+ { brand: "NY Daily News", trait: "tabloid headline tower, talker sidebar" },
15
+ ],
16
+ feel:
17
+ "Loud, condensed, photo-dense. Red masthead rule + black ink on near-white newsprint. " +
18
+ "Knockout-style condensed bold sans at oversized sizes screaming the headline. " +
19
+ "Stacks of headlines, grids of thumbnails, talker sidebars. The page is the noise.",
20
+
21
+ fonts: {
22
+ display: {
23
+ family: "Oswald",
24
+ fallback: ["Knockout", "Bebas Neue", "Anton", "Impact", "Haettenschweiler", "sans-serif"],
25
+ from: "Knockout-style condensed bold sans — NY Post / Daily Mail front-page register",
26
+ googleFont: "Oswald",
27
+ weights: [500, 600, 700],
28
+ },
29
+ body: {
30
+ family: "Source Sans 3",
31
+ fallback: ["Helvetica Neue", "Helvetica", "Arial", "sans-serif"],
32
+ from: "tabloid body sans — dense, readable in narrow tabloid columns",
33
+ googleFont: "Source+Sans+3",
34
+ weights: [400, 600, 700],
35
+ },
36
+ mono: {
37
+ family: "JetBrains Mono",
38
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
39
+ from: "timestamps, comment counts, picture credits — newsroom wire-feed metadata",
40
+ googleFont: "JetBrains+Mono",
41
+ weights: [400, 700],
42
+ },
43
+ },
44
+
45
+ typography: {
46
+ headingTracking: "-0.005em",
47
+ bodyTracking: "0",
48
+ fontFeatureSettings: '"tnum", "ss01"',
49
+ h1ScaleClamp: "clamp(3rem, 9vw, 7rem)", // screamer — tabloid front-page scale
50
+ bodyBaseSize: "0.9375rem", // 15px — tight tabloid column
51
+ bodyLineHeight: "1.45",
52
+ },
53
+
54
+ colors: {
55
+ background: { hsl: "40 12% 96%", from: "near-white tabloid newsprint — slightly warm" },
56
+ foreground: { hsl: "0 0% 8%", from: "tabloid ink — nearly pure black, screamer-ready" },
57
+ card: { hsl: "0 0% 100%", from: "white card — sits brighter than the newsprint" },
58
+ popover: { hsl: "0 0% 100%", from: "white popover" },
59
+ primary: { hsl: "0 82% 48%", from: "tabloid red — The Sun / NY Post masthead and kicker chip" },
60
+ primaryForeground: { hsl: "0 0% 100%", from: "white on red" },
61
+ secondary: { hsl: "0 0% 12%", from: "near-black secondary — for inverted bars and chips" },
62
+ secondaryForeground: { hsl: "40 12% 96%", from: "newsprint on black" },
63
+ muted: { hsl: "40 8% 90%", from: "muted newsprint — quiet panels in a loud page" },
64
+ mutedForeground: { hsl: "0 0% 32%", from: "slate ink — timestamps, comment counts" },
65
+ accent: { hsl: "48 100% 50%", from: "EXCLUSIVE-chip yellow — Daily Mail tag accent" },
66
+ accentForeground: { hsl: "0 0% 8%", from: "ink on yellow" },
67
+ border: { hsl: "0 0% 22%", from: "thick rule — tabloid uses heavy rules to organize the shout" },
68
+ input: { hsl: "0 0% 22%", from: "same as border" },
69
+ ring: { hsl: "0 82% 48%", from: "primary red, focus" },
70
+ destructive: { hsl: "0 82% 40%", from: "deeper red — alert" },
71
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on alert" },
72
+ brand: {
73
+ ink: { hsl: "0 0% 8%", from: "= foreground; tabloid ink" },
74
+ "tabloid-red": { hsl: "0 82% 48%", from: "= primary; the canonical tabloid red" },
75
+ "exclusive-yellow": { hsl: "48 100% 50%", from: "= accent; EXCLUSIVE/BREAKING chip" },
76
+ newsprint: { hsl: "40 12% 96%", from: "= background; near-white newsprint" },
77
+ "rule-heavy": { hsl: "0 0% 22%", from: "= border; thick organizing rule" },
78
+ "chip-fill": { hsl: "0 0% 8%", from: "black chip for SHOCK / SCOOP labels" },
79
+ },
80
+ },
81
+
82
+ spacing: {
83
+ base: 4,
84
+ scale: [2, 4, 6, 8, 10, 12, 16, 20, 24, 32, 48, 64], // tight — high density
85
+ containerMax: "max-w-7xl", // wide — photo grids and headline towers need room
86
+ containerPadding: "px-4 lg:px-8",
87
+ sectionPadding: {
88
+ hero: "pt-10 pb-8 lg:pt-16 lg:pb-12",
89
+ default: "py-12 lg:py-16",
90
+ tight: "py-6 lg:py-10",
91
+ },
92
+ },
93
+
94
+ radius: {
95
+ base: "0", // sharp — no soft chips in tabloid
96
+ pillsAllowed: false,
97
+ },
98
+
99
+ shadows: {
100
+ style: "none",
101
+ utilities: {
102
+ "rule-heavy":
103
+ "0 2px 0 0 hsl(var(--ink))", // thick rule under section bars
104
+ "chip-shadow":
105
+ "2px 2px 0 0 hsl(var(--ink))", // crude offset shadow on EXCLUSIVE chips
106
+ },
107
+ },
108
+
109
+ motion: {
110
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
111
+ durations: {
112
+ reveal: 250, // snap — tabloid does not breathe
113
+ loop: 800, // flash chip
114
+ ambient: 20000,
115
+ },
116
+ keyframes: {
117
+ "snap-in": {
118
+ css:
119
+ "from { opacity: 0; transform: translateY(8px); }\n" +
120
+ "to { opacity: 1; transform: translateY(0); }",
121
+ defaultDuration: 250,
122
+ iteration: "once",
123
+ purpose: "section entrance — fast snap, no theatrical slow rise",
124
+ },
125
+ "chip-flash": {
126
+ css:
127
+ "0%, 100% { background-color: hsl(var(--tabloid-red)); color: hsl(0 0% 100%); }\n" +
128
+ "50% { background-color: hsl(var(--exclusive-yellow)); color: hsl(var(--ink)); }",
129
+ defaultDuration: 800,
130
+ iteration: "infinite",
131
+ purpose: "BREAKING/EXCLUSIVE chip color flash — used sparingly on top story only",
132
+ },
133
+ },
134
+ respectsReducedMotion: true,
135
+ },
136
+
137
+ density: "high",
138
+
139
+ patterns: {
140
+ button:
141
+ "Solid-fill in --tabloid-red with white text + heavy --ink border. Bold condensed display font, all-caps. " +
142
+ "Secondary buttons invert: --ink fill + white text. No ghost buttons — tabloid commits to fill.",
143
+ card:
144
+ "Thick 2px --ink border, no radius. Background is white or --newsprint. " +
145
+ "Headline in oversized Oswald, kicker chip in colored bar. Padding tight (p-3 lg:p-4).",
146
+ input:
147
+ "Full box with 2px --ink border. Bold sans label above in caps. Focus shifts border to --tabloid-red.",
148
+ cta:
149
+ "Filled rect in --tabloid-red or --ink. Heavy border. All-caps display font. Never a text-link CTA.",
150
+ },
151
+
152
+ details: {
153
+ selectionBg: "hsl(var(--exclusive-yellow) / 0.6)",
154
+ selectionFg: "hsl(var(--ink))",
155
+ focusRing: "2px solid hsl(var(--ring))",
156
+ scrollbarStyle: "auto",
157
+ },
158
+ };