@stylecrib/cli 0.3.1 → 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 +94 -9
  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 +1577 -463
  25. package/package.json +11 -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,75 @@
1
+ # Design Direction — News-Tech
2
+
3
+ ## Ethos
4
+ Stratechery long-form authority · The Information paywall gravity · Pragmatic Engineer technical depth · Ben Thompson essayist voice · Platformer independent-publisher restraint
5
+
6
+ ## Feel
7
+ Cream paper. Business-formal serif at modest sizes. The page wears its paid-newsletter authority quietly — no marketing chrome, no SaaS pricing pillars. A single feature article gets the masthead; subscriber tiers live inline in prose, not in a tile grid. Authority comes from byline gravity and content density.
8
+
9
+ ## Reference brands
10
+ - **Stratechery** → essayist single-author column, cream paper + business serif.
11
+ - **The Information** → paid-newsletter tier explanation, executive-interview row.
12
+ - **Pragmatic Engineer** → technical-depth feature articles, subscriber-tier breakdown.
13
+ - **Ben Thompson** → Daily Update, Stratechery Plus voice — authoritative analysis.
14
+ - **Platformer** → independent-publisher Substack restraint, sober palette.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Brand tokens: `--ink`, `--cream`, `--editorial-blue`, `--ink-soft`, `--subscriber-gold`. Foreground is a deep business-formal navy-black (`hsl(220 24% 14%)`); background is Stratechery cream (`hsl(38 24% 95%)`).
18
+
19
+ Primary is **editorial blue** (`hsl(215 55% 32%)`) — used for inline links and the single Subscribe CTA. `--subscriber-gold` (`hsl(36 60% 42%)`) is a subtle gold accent for paid-tier labels and "PLUS" marks beside bylines — never used as a button fill.
20
+
21
+ ## Typography
22
+ - **Display:** Lora (Stratechery-essay serif). Modest sizes — not magazine-grand. Tracking `-0.012em`.
23
+ - **Body:** Source Serif Pro. 17px / `line-height: 1.68` — essay-comfortable for 4000-word reads.
24
+ - **Mono:** JetBrains Mono. Datelines (`JUNE 24, 2026`), read-times (`14 MIN READ`), tag pills (`STRATEGY`, `ANTITRUST`), subscriber-tier labels.
25
+
26
+ H1 uses `clamp(2rem, 4.5vw, 3.5rem)` — modest essay-headline scale, deliberately *not* magazine.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-5xl px-6 lg:px-10` — wider than editorial (room for list rows and interview grid), narrower than tabloid.
30
+ - **Section padding:** hero `pt-16 pb-12 lg:pt-24 lg:pb-16`; default `py-16 lg:py-24`; tight `py-10 lg:py-14`.
31
+ - **Scale:** 4 6 8 12 16 20 24 32 40 48 64 96.
32
+
33
+ ## Color
34
+ No hex in components. Five tokens carry the entire page: ink, cream, editorial-blue, ink-soft, subscriber-gold.
35
+
36
+ ## Radius
37
+ `--radius: 0.125rem` — very subtle, business-formal. Sharp print convention softened just enough to feel modern web. Pills allowed *only* for tag labels (`STRATEGY` / `ANTITRUST` / `MARKETS`) — never for buttons.
38
+
39
+ ## Shadows
40
+ Minimal. Two utilities: `.panel-rule` (1px list-row divider) and `.tier-card` (inset rules above + below subscriber-tier panels). No drop shadows, no glows.
41
+
42
+ ## Motion
43
+ Single keyframe: `fade-rise` (700ms). The only entrance — restrained, business-formal. Easing `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored.
44
+
45
+ ## Component patterns
46
+ - **Buttons:** text-link CTAs in `--editorial-blue`, underline on hover. The single Subscribe is solid: `--editorial-blue` bg + `--cream` fg, 0.125rem radius. **No marketing-grade gradient buttons.**
47
+ - **Cards:** hairline top + bottom rule, no fill differentiation. Tag-pill chips in mono uppercase. Title in Lora, byline in mono small caps with `--subscriber-gold` "PLUS" mark for paid-tier authors.
48
+ - **Inputs:** border-bottom only. Email-capture is the canonical input — every page should make it findable.
49
+ - **CTA links:** text-link in `--editorial-blue`, underline on hover. **Never SaaS pricing pillars.**
50
+
51
+ ## Bespoke section
52
+ Three blocks composed as a paid-newsletter author page:
53
+ 1. **Subscription-feature card** — inline subscriber-tier explanation written as prose with two checklists ("Free" / "Plus"), not a 3-pillar SaaS pricing grid. Single Subscribe CTA + reassuring fine-print.
54
+ 2. **Recent articles list** — 5 rows, each: date (mono caps) · tag pill · title (Lora) · read-time (mono caps).
55
+ 3. **Executive-interview row** — 3 interviews: interviewee name + role, interviewer byline, mono-caps date and "PLUS" gold mark.
56
+
57
+ The composition refuses generic SaaS feature cards. Density and gravity — the page should look like *Stratechery's About page*, not like a startup landing page.
58
+
59
+ ## Recommended rich media
60
+ Sparse. The page is text-first. A single small headshot per executive-interview row is permitted (3:2, neutral background, professional photography). No hero photography on most pages. Charts and figures live in essay bodies — not on the landing.
61
+
62
+ **AI tool recommendations:** Avoid Midjourney for this direction. Headshots should be sourced from actual photography. Charts use simple SVG / line-only treatments — no 3D, no gradient, no glow.
63
+
64
+ **Avoid:** SaaS-pricing pillars, three-reasons grids, generic feature cards, gradient hero backgrounds, glassmorphic anything, marketing illustration, animated GIFs, drop shadows, oversized hero photos.
65
+
66
+ ## Details
67
+ - **Selection:** `hsl(var(--primary) / 0.18)`.
68
+ - **Focus ring:** `1px solid hsl(var(--ring))`.
69
+ - **Scrollbar:** thin.
70
+
71
+ ## Exceptions
72
+ None yet.
73
+
74
+ ## Revisions
75
+ - Initial direction.
@@ -0,0 +1,149 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // Note: "news-tech" 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 newsTech: Direction = {
7
+ name: "news-tech" as Direction["name"],
8
+ ethos: "Stratechery long-form authority · The Information paywall gravity · Pragmatic Engineer technical depth · Ben Thompson essayist voice · Platformer independent-publisher restraint",
9
+ references: [
10
+ { brand: "Stratechery", trait: "essayist single-author column, cream paper + business serif" },
11
+ { brand: "The Information", trait: "paid-newsletter tier explanation, executive-interview row" },
12
+ { brand: "Pragmatic Engineer", trait: "technical-depth feature articles, subscriber-tier breakdown" },
13
+ { brand: "Ben Thompson", trait: "Daily Update, Stratechery Plus voice — authoritative analysis" },
14
+ { brand: "Platformer", trait: "independent-publisher Substack restraint, sober palette" },
15
+ ],
16
+ feel:
17
+ "Cream paper. Business-formal serif at modest sizes. The page wears its paid-newsletter authority quietly — " +
18
+ "no marketing chrome, no SaaS pricing pillars. A single feature article gets the masthead; subscriber tiers " +
19
+ "live inline in prose, not in a tile grid. Authority comes from byline gravity and content density.",
20
+
21
+ fonts: {
22
+ display: {
23
+ family: "Lora",
24
+ fallback: ["Charter", "Source Serif Pro", "Georgia", "serif"],
25
+ from: "Stratechery/Pragmatic-Engineer essay-headline serif — business-formal, not editorial-grand",
26
+ googleFont: "Lora",
27
+ weights: [400, 500, 600, 700],
28
+ },
29
+ body: {
30
+ family: "Source Serif Pro",
31
+ fallback: ["Charter", "Iowan Old Style", "Georgia", "serif"],
32
+ from: "long-form business-prose serif — readable at 17px for 4000-word essays",
33
+ googleFont: "Source+Serif+Pro",
34
+ weights: [400, 600, 700],
35
+ },
36
+ mono: {
37
+ family: "JetBrains Mono",
38
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
39
+ from: "datelines, read-times, tag pills, subscriber-tier labels",
40
+ googleFont: "JetBrains+Mono",
41
+ weights: [400, 500, 600],
42
+ },
43
+ },
44
+
45
+ typography: {
46
+ headingTracking: "-0.012em",
47
+ bodyTracking: "0",
48
+ fontFeatureSettings: '"liga", "onum", "tnum"',
49
+ h1ScaleClamp: "clamp(2rem, 4.5vw, 3.5rem)", // modest — essay-headline scale, not magazine-cover
50
+ bodyBaseSize: "1.0625rem", // 17px essay-comfortable
51
+ bodyLineHeight: "1.68",
52
+ },
53
+
54
+ colors: {
55
+ background: { hsl: "38 24% 95%", from: "Stratechery cream paper stock — warm, business-formal" },
56
+ foreground: { hsl: "220 24% 14%", from: "deep ink — business-formal navy-black" },
57
+ card: { hsl: "38 26% 97%", from: "lighter cream card — subscriber-tier panels, executive-interview rows" },
58
+ popover: { hsl: "38 26% 97%", from: "same as card" },
59
+ primary: { hsl: "215 55% 32%", from: "Platformer/Stratechery deep editorial blue — link color and accent" },
60
+ primaryForeground: { hsl: "38 24% 95%", from: "cream on blue" },
61
+ secondary: { hsl: "38 18% 90%", from: "deeper cream — recent-articles list zebra rows" },
62
+ secondaryForeground: { hsl: "220 24% 14%", from: "ink on cream" },
63
+ muted: { hsl: "38 18% 90%", from: "same as secondary; differentiation by usage" },
64
+ mutedForeground: { hsl: "220 14% 38%", from: "slate ink — read-times, datelines, tag pills" },
65
+ accent: { hsl: "38 20% 88%", from: "hover surface — quiet" },
66
+ accentForeground: { hsl: "220 24% 14%", from: "ink on accent" },
67
+ border: { hsl: "220 14% 82%", from: "hairline rule — subscriber-tier panel divider" },
68
+ input: { hsl: "220 14% 82%", from: "same as border" },
69
+ ring: { hsl: "215 55% 32%", from: "primary blue, focus" },
70
+ destructive: { hsl: "0 60% 42%", from: "alert red — cancellation/warning, not a brand color" },
71
+ destructiveForeground: { hsl: "38 24% 95%", from: "cream on alert" },
72
+ brand: {
73
+ ink: { hsl: "220 24% 14%", from: "= foreground; deep business-formal ink" },
74
+ cream: { hsl: "38 24% 95%", from: "= background; Stratechery cream paper" },
75
+ "editorial-blue": { hsl: "215 55% 32%", from: "= primary; link/accent" },
76
+ "ink-soft": { hsl: "220 18% 26%", from: "secondary headings, executive-interview titles" },
77
+ "subscriber-gold": { hsl: "36 60% 42%", from: "subtle gold accent for paid-tier label, not for buttons" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96],
84
+ containerMax: "max-w-5xl", // wider than editorial — list rows + interview grid
85
+ containerPadding: "px-6 lg:px-10",
86
+ sectionPadding: {
87
+ hero: "pt-16 pb-12 lg:pt-24 lg:pb-16",
88
+ default: "py-16 lg:py-24",
89
+ tight: "py-10 lg:py-14",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "0.125rem", // very subtle — business-formal, not sharp print
95
+ pillsAllowed: true, // pills for tag labels (Strategy / Antitrust / Markets)
96
+ },
97
+
98
+ shadows: {
99
+ style: "minimal",
100
+ utilities: {
101
+ "panel-rule":
102
+ "0 1px 0 0 hsl(var(--border))", // list-row divider
103
+ "tier-card":
104
+ "0 1px 0 0 hsl(var(--border)) inset, 0 -1px 0 0 hsl(var(--border)) inset", // subscriber-tier panel rules
105
+ },
106
+ },
107
+
108
+ motion: {
109
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
110
+ durations: {
111
+ reveal: 700,
112
+ loop: 4000,
113
+ ambient: 20000,
114
+ },
115
+ keyframes: {
116
+ "fade-rise": {
117
+ css:
118
+ "from { opacity: 0; transform: translateY(12px); }\n" +
119
+ "to { opacity: 1; transform: translateY(0); }",
120
+ defaultDuration: 700,
121
+ iteration: "once",
122
+ purpose: "section entrance — restrained, business-formal",
123
+ },
124
+ },
125
+ respectsReducedMotion: true,
126
+ },
127
+
128
+ density: "medium",
129
+
130
+ patterns: {
131
+ button:
132
+ "Text-link CTAs in --editorial-blue with underline on hover. The single Subscribe CTA may be a solid --editorial-blue fill with --cream text. " +
133
+ "No marketing-grade gradient buttons — this is a paid-newsletter, not a SaaS landing page.",
134
+ card:
135
+ "Hairline top + bottom rule, no fill differentiation. Tag-pill chips in mono uppercase. " +
136
+ "Title in Lora display, byline in mono small caps with --subscriber-gold for paid-tier mark.",
137
+ input:
138
+ "Border-bottom only (1px --ink-soft). Label in mono small caps above. Email-capture is the canonical input.",
139
+ cta:
140
+ "Text-link in --editorial-blue, underline on hover. Subscribe is solid: --editorial-blue bg + --cream fg, modest 0.125rem radius.",
141
+ },
142
+
143
+ details: {
144
+ selectionBg: "hsl(var(--primary) / 0.18)",
145
+ selectionFg: "hsl(var(--foreground))",
146
+ focusRing: "1px solid hsl(var(--ring))",
147
+ scrollbarStyle: "thin",
148
+ },
149
+ };
@@ -0,0 +1,82 @@
1
+ # Design Direction — Newsletter
2
+
3
+ ## Ethos
4
+ Substack reading · Bear minimalism · The Browser typography · Granta editorial · Le Monde Diplomatique restraint · Pieter Levels essay-first plain page
5
+
6
+ ## Feel
7
+ Reading-first. Narrow column, serif body, warm paper background, generous vertical rhythm. The page is designed to be read top-to-bottom for 10 minutes, not scanned. Buttons are foreign here; almost everything is a text link.
8
+
9
+ This is the editorial direction's reading-first sibling — narrower, quieter, and serif-only. Where editorial mixes a display serif with a body sans, newsletter sets *everything* in the same family: the type is the design, and switching faces inside a reading layout breaks flow.
10
+
11
+ ## Reference brands
12
+ - **Substack** → the reading view, not the marketing site. Single column, serif, warm background, no chrome.
13
+ - **Bear blog (bearblog.dev)** → minimalism. The page is just the words.
14
+ - **The Browser (thebrowser.com)** → typography. A weekly essay digest that respects the reader's eye.
15
+ - **Granta** → editorial long-form. Pacing, captions, restraint with images.
16
+ - **Le Monde Diplomatique** → restraint. Ink on paper, no decoration.
17
+ - **Pieter Levels** → essay-first plain page. Indie, unembarrassed by simplicity.
18
+
19
+ ## Tokens
20
+ HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin. Surface stack is intentionally flat — `background`, `card`, and `secondary` all sit on the same warm paper, with `card` collapsed to the page itself. There is no card. Sections are separated by `.hairline-top` and vertical rhythm.
21
+
22
+ Brand tokens: `--ink`, `--paper`, `--ink-soft`, `--link-visited`. Primary is **deep navy** (`220 70% 30%`) — the NYT-link-blue heritage. It is, primarily, the link color. Visited links shift to `--link-visited` purple (`280 50% 35%`) — the traditional, intentional convention.
23
+
24
+ ## Typography
25
+ - **Display:** Lora. Same family as body — there is no separate display face. Tracking `-0.01em` (gentler than editorial's `-0.015em`; Lora is humanist).
26
+ - **Body:** Lora, **18px**, line-height **1.75**. Body paragraphs are `max-w-[64ch]` — never wider.
27
+ - **Mono:** JetBrains Mono. **Caption sizes only** — datelines, figure attributions, citations. Never used for body or headings.
28
+
29
+ H1 uses `clamp(2.25rem, 5vw, 3.75rem)` — narrower column means narrower headline. Font features: `"liga", "kern"` only; no stylistic alternates, because body and display share the face.
30
+
31
+ ## Spacing
32
+ - **Container:** `max-w-prose px-6 lg:px-8`. Body paragraphs are additionally `max-w-[64ch]`. A wide column kills a reading page.
33
+ - **Section padding tiers:**
34
+ - Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
35
+ - Default: `py-16 lg:py-24`
36
+ - Tight: `py-12 lg:py-16`
37
+ - **Allowed scale values:** 4 6 8 12 16 24 32 48 64 96 128. Note: no `20`, no `40`. The jump from 16 to 24 enforces the generous vertical rhythm.
38
+
39
+ ## Color
40
+ No hex anywhere. Pure white and pure black are forbidden — `--paper` and `--ink` replace them. Background is warmer and slightly more saturated than the editorial direction (`40 25% 95%` vs `36 25% 96%`) — closer to Substack and Granta stock than to Kinfolk. Foreground carries a slight blue bias (`220 18% 14%`) so the navy link color reads as a tonal shift, not a foreign accent.
41
+
42
+ ## Radius
43
+ `--radius: 0`. **Sharp corners only.** Pills disallowed (`pillsAllowed: false`) — print convention, no exception. The Subscribe button is also sharp.
44
+
45
+ ## Shadows
46
+ **None.** Single utility: `.hairline-top` (`inset 0 1px 0 0 hsl(var(--foreground) / 0.15)`) — a 1px border-top in foreground/15, used to separate sections. No drop shadows. No glows. No bottom borders either — top-only enforces a downward reading rhythm.
47
+
48
+ ## Motion
49
+ **Zero.** Newsletters do not animate. `keyframes: {}` is intentionally empty — there is nothing to suppress. `respectsReducedMotion: true` is honored as a contract, but the library ships no animations. If a future component needs motion, it does not belong in this direction.
50
+
51
+ ## Component patterns
52
+ - **Buttons:** text-link primary; underlined on hover only (default state is link-color text, no underline). The **Subscribe button is the ONLY filled rect on the page** — navy bg + paper text, sharp corners. No other buttons exist in this language.
53
+ - **Cards:** there is no card. Sections are separated by `.hairline-top` and vertical rhythm. If structure is needed, use a `<figure>` with a caption — not a bordered container.
54
+ - **Inputs:** border-bottom only (1px `--border`). Used almost exclusively by the Subscribe form. Placeholder italic, label above in `--ink-soft` mono.
55
+ - **CTAs:** text-link in `--primary` (navy). Underline on hover. Visited links shift to `--link-visited` (purple). Subscribe is the single exception.
56
+
57
+ ## Component families
58
+ None at install time. Long-form posts ship with `<article>`, `<h1>`/`<h2>`/`<h3>`, `<p>`, `<blockquote>`, `<figure>`/`<figcaption>`, `<a>` — and that is, deliberately, almost the whole vocabulary.
59
+
60
+ ## Recommended rich media
61
+ - **Cover:** single hero image per article (when used). Captioned figures within long-form. Occasional pull-quote photograph.
62
+ - **Photography style:** editorial portraiture, environmental shots, **never stock**.
63
+ - **AI tool recommendations:**
64
+ - **Midjourney / Flux** for illustrations and photographic compositions. Prompts like *"New Yorker magazine illustration, Pierre Mornet style"* for illustration; *"editorial portrait, Annie Leibovitz lighting, 50mm, slight grain"* for photography.
65
+ - **Recraft** for figurative line illustrations in the NYT op-ed style.
66
+ - For charts and diagrams, lean toward hand-drawn-style illustration over AI photorealism.
67
+ - **Aspect ratios:** 3:2 landscape (photographic standard) or 4:5 portrait for environmental subjects. **Never 16:9 widescreen** — cinematic, off-feel. **Avoid square 1:1** — Instagram-feel.
68
+ - **Captions:** every figure has a real caption, set in italic mono or sans. **Never a generic "Image: …" label.** The caption is part of the writing.
69
+ - **Performance:** hero ≤150 KB AVIF, inline figures ≤80 KB.
70
+ - **What to AVOID:** stock photography; dark moody product shots; video backgrounds (kills the reading flow); animated GIFs (visually noisy); AI-generated photos that look "off" (uncanny smile, weird hands, malformed jewellery).
71
+ - **Accessibility:** long-form figure alt-text — describe the photograph as if for a blind reader. Three to five words is not enough for editorial photography.
72
+
73
+ ## Details
74
+ - **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text.
75
+ - **Focus ring:** `1px solid hsl(var(--ring))`. Quiet — does not scream.
76
+ - **Scrollbar:** `auto` (default browser scrollbar). A reading page should not style its own chrome.
77
+
78
+ ## Exceptions
79
+ - **Subscribe button.** The single filled rect on the page, by design. Navy background, paper text, sharp corners. Justified because the act of subscribing is the one transaction a newsletter page asks for, and it has to be unmissable in a layout that otherwise has no buttons at all.
80
+
81
+ ## Revisions
82
+ - Initial direction, generated at install time.
@@ -0,0 +1,138 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const newsletter: Direction = {
4
+ name: "newsletter",
5
+ ethos:
6
+ "Substack reading · Bear minimalism · The Browser typography · Granta editorial · Le Monde Diplomatique restraint",
7
+ references: [
8
+ { brand: "Substack", trait: "reading view, not the marketing site" },
9
+ { brand: "Bear blog", trait: "minimalism — bearblog.dev" },
10
+ { brand: "The Browser", trait: "typography — thebrowser.com" },
11
+ { brand: "Granta", trait: "editorial long-form" },
12
+ { brand: "Le Monde Diplomatique", trait: "restraint" },
13
+ { brand: "Pieter Levels", trait: "essay-first plain page" },
14
+ ],
15
+ feel:
16
+ "Reading-first. Narrow column, serif body, warm paper background, generous " +
17
+ "vertical rhythm. The page is designed to be read top-to-bottom for 10 minutes, " +
18
+ "not scanned. Buttons are foreign here; almost everything is a text link.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Lora",
23
+ fallback: ["Iowan Old Style", "Charter", "Georgia", "serif"],
24
+ from: "Substack-feel serif — readable display weight, no decorative drama",
25
+ googleFont: "Lora",
26
+ weights: [400, 500, 600, 700],
27
+ },
28
+ body: {
29
+ family: "Lora",
30
+ fallback: ["Iowan Old Style", "Charter", "Georgia", "serif"],
31
+ from: "same family as display — the type is the design; mixing serifs in a reading layout breaks flow",
32
+ googleFont: "Lora",
33
+ weights: [400, 500, 600, 700],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "caption sizes only — datelines, citations, figure attributions",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.01em", // Lora is humanist; needs gentle tightening, not editorial's -0.015em
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"liga", "kern"', // ligatures + kerning; no stylistic alts — body and display share the face
48
+ h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)", // narrower column = narrower headline
49
+ bodyBaseSize: "1.125rem", // 18px — newsletters are read, not skimmed
50
+ bodyLineHeight: "1.75", // generous; an essay's pace
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "40 25% 95%", from: "warm paper — slightly more saturated cream than editorial" },
55
+ foreground: { hsl: "220 18% 14%", from: "deep ink, slight blue bias — Granta/LMD ink" },
56
+ card: { hsl: "40 25% 95%", from: "same as paper — no card surface in a reading layout" },
57
+ popover: { hsl: "40 22% 97%", from: "footnote/tooltip — one tier brighter than paper" },
58
+ primary: { hsl: "220 70% 30%", from: "deep navy — NYT-link-blue heritage; this is the link color" },
59
+ primaryForeground: { hsl: "40 25% 95%", from: "paper on navy — only used by the Subscribe button" },
60
+ secondary: { hsl: "40 18% 91%", from: "warm paper, one tier deeper — block-quote ground" },
61
+ secondaryForeground: { hsl: "220 18% 14%", from: "ink on warm paper" },
62
+ muted: { hsl: "40 18% 91%", from: "same as secondary; differentiation by usage, not color" },
63
+ mutedForeground: { hsl: "220 16% 28%", from: "ink-soft — bylines and meta" },
64
+ accent: { hsl: "40 20% 89%", from: "warm paper, deeper still — hover ground for link blocks" },
65
+ accentForeground: { hsl: "220 18% 14%", from: "ink on warm paper" },
66
+ border: { hsl: "220 14% 84%", from: "hairline — barely visible, the divider between sections" },
67
+ input: { hsl: "220 14% 84%", from: "same as border — only Subscribe input uses this" },
68
+ ring: { hsl: "220 70% 30%", from: "primary navy, used for focus only" },
69
+ destructive: { hsl: "0 55% 38%", from: "errata red — restrained, never alarm" },
70
+ destructiveForeground: { hsl: "40 25% 95%", from: "paper on errata" },
71
+ brand: {
72
+ ink: { hsl: "220 18% 14%", from: "the deep ink — also semantic foreground" },
73
+ paper: { hsl: "40 25% 95%", from: "the warm paper — also semantic background" },
74
+ "ink-soft": { hsl: "220 16% 28%", from: "bylines, datelines, meta — the secondary voice" },
75
+ "link-visited": { hsl: "280 50% 35%", from: "purple — traditional visited-link, intentional heritage" },
76
+ },
77
+ },
78
+
79
+ spacing: {
80
+ base: 4,
81
+ scale: [4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128], // extremely generous vertical rhythm — note the jump from 16 to 24, no 20
82
+ containerMax: "max-w-prose", // narrow reading column; body paragraphs max-w-[64ch]
83
+ containerPadding: "px-6 lg:px-8",
84
+ sectionPadding: {
85
+ hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
86
+ default: "py-16 lg:py-24",
87
+ tight: "py-12 lg:py-16",
88
+ },
89
+ },
90
+
91
+ radius: {
92
+ base: "0", // sharp — print convention
93
+ pillsAllowed: false,
94
+ },
95
+
96
+ shadows: {
97
+ style: "none",
98
+ utilities: {
99
+ "hairline-top":
100
+ "inset 0 1px 0 0 hsl(var(--foreground) / 0.15)", // 1px border-top in foreground/15 — the section divider
101
+ },
102
+ },
103
+
104
+ motion: {
105
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
106
+ durations: {
107
+ reveal: 0, // newsletters don't animate
108
+ loop: 0,
109
+ ambient: 0,
110
+ },
111
+ keyframes: {}, // intentionally empty — there is no motion in this language
112
+ respectsReducedMotion: true, // honored, though there's nothing to suppress
113
+ },
114
+
115
+ density: "low",
116
+
117
+ patterns: {
118
+ button:
119
+ "Text-link primary; underlined on hover only (default state is link-color text, no underline). " +
120
+ "The Subscribe button is the ONLY filled rect on the page — navy bg + paper text. No other buttons exist.",
121
+ card:
122
+ "There is no card. Sections are separated by `.hairline-top` and vertical rhythm. " +
123
+ "If structure is needed, use a `<figure>` with a caption — not a bordered container.",
124
+ input:
125
+ "Border-bottom only (1px `--border`). Used almost exclusively by the Subscribe form. " +
126
+ "Placeholder italic, label above in `--ink-soft` mono.",
127
+ cta:
128
+ "Text-link in `--primary` (navy). Underline on hover. Visited links shift to `--link-visited` (purple). " +
129
+ "Subscribe is the single exception — filled navy rect, paper text, sharp corners.",
130
+ },
131
+
132
+ details: {
133
+ selectionBg: "hsl(var(--primary) / 0.18)",
134
+ selectionFg: "hsl(var(--foreground))",
135
+ focusRing: "1px solid hsl(var(--ring))",
136
+ scrollbarStyle: "auto", // default browser scrollbar — a reading page should not style its own chrome
137
+ },
138
+ };
@@ -0,0 +1,74 @@
1
+ # Design Direction — Newspaper-Classic
2
+
3
+ ## Ethos
4
+ NYT Cheltenham · WaPo dignified daily · Le Monde five-column page · Guardian section ribbons · WSJ stipple authority
5
+
6
+ ## Feel
7
+ Cream newsprint stock with deep ink. Tall stately display serif headlines over a wide five-column page. Section nav reads like the top of a folded broadsheet; bylines and read-times sit in small-caps mono. Restrained red is reserved for the breaking-news ticker and the masthead rule — never for decoration.
8
+
9
+ ## Reference brands
10
+ - **The New York Times** → Cheltenham-style display serif, five-column front-page grid.
11
+ - **The Washington Post** → Democracy-Dies-in-Darkness gravitas, breaking-news ticker.
12
+ - **Le Monde** → broadsheet column rhythm, dateline as masthead anchor.
13
+ - **The Guardian** → section ribbons across the page top, byline grids.
14
+ - **The Wall Street Journal** → stippled portrait engravings, business-formal restraint.
15
+
16
+ ## Tokens
17
+ All tokens are HSL triples in `src/index.css`. Every token's `from:` names a brand origin. Brand tokens: `--ink`, `--newsprint`, `--ink-soft`, `--rule-strong`, `--ticker-red`, `--stipple`.
18
+
19
+ Surface stack: **newsprint cream** (background) → lighter cream (card) → deeper cream (secondary/muted/accent). Depth comes from rules, not from fill differentiation. The thick `--rule-strong` 3px line under the masthead is the single decorative move.
20
+
21
+ Primary is a **restrained masthead red** (NYT op-ed / WaPo breaking) — used on the ticker strip, the masthead rule, and section kicker labels. Never on body copy. Never on photos.
22
+
23
+ ## Typography
24
+ - **Display:** Playfair Display (Cheltenham-style display serif). h1–h4. Tracking `-0.018em` — broadsheet headlines need it tight.
25
+ - **Body:** Source Serif Pro (WaPo/Guardian body serif). 17px / `line-height: 1.62` — long-form readable.
26
+ - **Mono:** JetBrains Mono. Datelines, bylines (`BY JANE DOE`), read-times, section kickers — all uppercase, tracked.
27
+
28
+ H1 uses `clamp(2.5rem, 6.5vw, 5.25rem)`. Numbers always `tabular-nums`. Font features: `"liga", "onum", "tnum"`.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-6xl px-6 lg:px-10` — wide; five-column grids need the room.
32
+ - **Section padding:** hero `pt-16 pb-12 lg:pt-24 lg:pb-20`; default `py-16 lg:py-24`; tight `py-10 lg:py-14`.
33
+ - **Scale:** 4 6 8 12 16 20 24 32 40 48 64 96. No arbitrary spacing.
34
+
35
+ ## Color
36
+ No hex in components. White and pure black are forbidden — `--newsprint` and `--ink` replace them. Opacity via `/N` on the token.
37
+
38
+ ## Radius
39
+ `--radius: 0`. **Sharp corners only.** Pills disallowed — newsprint convention. Section ribbons are flat-fill rects.
40
+
41
+ ## Shadows
42
+ Minimal. Two utilities: `.rule-bottom` (1px column-divider rule) and `.rule-thick` (3px masthead rule). No drop shadows, no glows.
43
+
44
+ ## Motion
45
+ Two keyframes. `fade-rise` (800ms) is the only entrance. `ticker-scroll` (30,000ms infinite) drives the breaking-news ticker strip — slow horizontal crawl, honors `prefers-reduced-motion` by pausing.
46
+
47
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`.
48
+
49
+ ## Component patterns
50
+ - **Buttons:** text-link CTAs in `--ink`, underline on hover. The single masthead Subscribe is the only solid: `--ink` bg + `--newsprint` fg, sharp rect. Section ribbons are `--ticker-red` flat fills.
51
+ - **Cards:** top + bottom rules only, no side borders, no fill differentiation. Title in display serif, kicker in mono uppercase, byline in mono small caps. Padding `p-6 lg:p-8`.
52
+ - **Inputs:** border-bottom only (1px `--ink-soft`). Mono small-caps label above.
53
+ - **CTA links:** text-link in `--ink`, underline on hover. **Never a chip, never a pill.**
54
+
55
+ ## Bespoke section
56
+ Section-nav ribbon (Front / Politics / Business / Opinion / Style) + leading-story big card with kicker / headline / deck / byline + four secondary stories in a 4-column grid + a breaking-news ticker strip across the bottom. The ticker uses `--ticker-red` background with `--newsprint` text and the `BREAKING` chip in a contrast box. The grid never collapses to feature cards; it remains a newsprint front page.
57
+
58
+ ## Recommended rich media
59
+ Photography is photojournalistic — captured news moments, environmental portraits, courthouse steps. Color-grade for neutral newsprint reproduction (slight desaturation, true grays). One stipple-portrait engraving per page (WSJ heritage) is permitted for the lead op-ed byline.
60
+
61
+ **AI tool recommendations:** Midjourney prompts like *"photojournalism, Associated Press wire, 35mm, neutral color, slight grain"*. Avoid glossy editorial lighting (magazine-glossy territory) and avoid moody dark-mode lighting (cinematic territory). Aspect ratio 3:2 photographic standard.
62
+
63
+ **Avoid:** stock business photography, animated GIFs, gradient backgrounds, glassmorphic anything, any pill-shaped chip, drop shadows.
64
+
65
+ ## Details
66
+ - **Selection:** `hsl(var(--primary) / 0.2)` background, foreground text.
67
+ - **Focus ring:** `1px solid hsl(var(--ring))`.
68
+ - **Scrollbar:** thin.
69
+
70
+ ## Exceptions
71
+ None yet.
72
+
73
+ ## Revisions
74
+ - Initial direction.