@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,103 @@
1
+ # Design Direction — Podcast-Warm
2
+
3
+ ## Ethos
4
+ Overcast warm orange · Pocket Casts deep red · Castro deep teal-green · Goodpods community warmth · Snipd purple clip-cards
5
+
6
+ ## Feel
7
+ Warm off-white canvas, generously rounded chrome, oversized artwork tiles in a subscribed-shows grid. Friendly secondary palette of teal-green and clip-card purple. The independent-listener counterpoint to Spotify's cold corporate dark — this surface feels like a curated shelf of shows, not a streaming dashboard. The page is a library, not a player.
8
+
9
+ ## Reference brands
10
+ - **Overcast** → warm orange accent with friendly system sans and soft cards. The independent-listener default.
11
+ - **Pocket Casts** → deep red action color with smooth animations and warm surfaces. Considered library-management UX.
12
+ - **Castro** → deep teal-green chrome with a friendly, library-shelf feel. Inbox-style queue.
13
+ - **Goodpods** → community-warm Plus Jakarta Sans, recommendation-led layout. Social discovery.
14
+ - **Snipd** → purple clip-cards and friendly AI-generated chapter chrome. Clip-as-share-unit.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
18
+
19
+ Surface stack is **warm-cream** (background, HSL `32 30% 96%` — library-shelf cream) → **white card** (`0 0% 100%`) → **deeper cream** (secondary/muted). Depth comes from soft warm shadows on cards lifted above the cream canvas — the cards feel like physical tiles on a shelf.
20
+
21
+ Brand tokens: `--overcast-orange` (primary, the canonical play color), `--castro-teal` (accent, friendly secondary), `--pocketcasts-red` (subscribed/badge accent), `--snipd-purple` (clip-card chrome), `--goodpods-pink` (recommendation highlight), `--warm-cream`, `--shelf-brown`. Primary is `--overcast-orange` — used for all play affordances and the hero subscribe CTA.
22
+
23
+ ## Typography
24
+ - **Display:** Plus Jakarta Sans (Goodpods display). Friendly geometric humanist, soft terminals — podcast-app warm. Tracking `-0.015em`.
25
+ - **Body:** Inter (Overcast/Pocket Casts system-feel sans). Neutral, screen-comfortable for episode descriptions. Body base **16px** with **line-height 1.6**.
26
+ - **Mono:** JetBrains Mono. Episode runtimes, chapter timestamps, playback speed — tabular numerics.
27
+
28
+ H1 uses `clamp(2.25rem, 6vw, 4.5rem)` — friendly hero scale, not cinematic-large. Font features: `"ss01"`, `"cv11"`, `"tnum"`.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-6xl px-5 lg:px-8` — wide enough for a four-column subscribed-shows grid but not as wide as music-streaming.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-20 pb-14 lg:pt-32 lg:pb-20`
34
+ - Default: `py-16 lg:py-24`
35
+ - Tight: `py-10 lg:py-14`
36
+ - **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128. No arbitrary spacing.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token. Pure white is reserved for `--card` only — the warm-cream canvas is the default page surface. Pure black is forbidden — `--shelf-brown` (warm brown-ink) replaces it.
40
+
41
+ **Overcast orange is the canonical play color.** Castro-teal is the friendly secondary used for "Subscribed" toggles, category chips, and hover accents — it is the only place teal-green appears. Pocket-casts-red is reserved for "Subscribed" badges and library-management accents — never a CTA color. Snipd-purple sits on clip-cards and AI-summary chrome only. Goodpods-pink is for recommendation-card highlights only.
42
+
43
+ ## Radius
44
+ `--radius: 1rem`. **Generously rounded — the warm-chrome signal.** Pills are core (`pillsAllowed: true`): category chips, subscribe toggles, playback-speed selectors, search input all use `rounded-full`. Icon buttons use `1rem`. Cards use `1rem`. The rounding is the warm signal.
45
+
46
+ ## Shadows
47
+ **Soft style.** Three utilities:
48
+ - `.tile-soft` — show-artwork tile lift; warm soft drop in `--shelf-brown` at low opacity, never colored
49
+ - `.tile-lift` — hover state; the tile rises with a deeper soft shadow
50
+ - `.subscribe-glow` — hero subscribe button warm glow in overcast-orange, single instance per page
51
+
52
+ Shadows are always warm (cast from `--shelf-brown` brown-ink), never neutral gray. This is the "tile on a wooden shelf" lighting model.
53
+
54
+ ## Motion
55
+ Five keyframes, all friendly:
56
+ - `tile-rise` (500ms once) — show-tile entrance, staggered across grid, gentle rise
57
+ - `subscribe-pop` (400ms once) — subscribe-button click feedback, friendly pop, never on play/pause
58
+ - `play-bar-bounce` (1800ms infinite) — now-playing mini-bar gentle bounce, present but unobtrusive
59
+ - `chapter-progress` (1200ms once) — chapter-marker fill animation on episode-page chapter list
60
+ - `tile-shimmer` (2400ms infinite) — featured-show artwork shimmer overlay, used only on the hero featured tile
61
+
62
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — every motion utility wrapped in a media query.
63
+
64
+ ## Component patterns
65
+ - **Buttons:** primary play action is a SOLID `rounded-full` overcast-orange button with white play glyph. Subscribe toggle is a pill: outlined Castro-teal when "Subscribe", filled when "Subscribed". Secondary controls (queue, share, download) are ghost icon buttons with 1rem radius. Tertiary text-link CTAs use `--shelf-brown` foreground with underline-on-hover.
66
+ - **Cards:** show-tile is the canonical card — square artwork at 1:1, generously rounded (1rem), with title and host below, lifted by `.tile-soft` shadow that grows to `.tile-lift` on hover. Episode cards use `bg-card` (white) on cream background, `p-5 lg:p-6`, with chapter-list inside when expanded. **No card uses cream fill** — cards always sit above the canvas in white.
67
+ - **Inputs:** pill-shape (`rounded-full`) input with `bg-card`, 1px `--border`, leading icon. Focus ring is 2px overcast-orange. Filter chips are `rounded-full` pills in `bg-secondary` with shelf-brown foreground; selected state shifts to castro-teal fill with white text.
68
+ - **CTA links:** hero subscribe / listen CTA is a solid overcast-orange pill with white label, wrapped in `subscribe-glow`. App Store / Play Store badges for cross-platform CTAs. Tertiary links are foreground with underline-on-hover — **never colored text-only**.
69
+
70
+ ## Recommended rich media
71
+ Podcast-warm leans on **square show artwork** as the hero asset — the same way a podcast-app library shelf does. Cover art at 1:1 aspect with generous rounding sits everywhere from a 48×48 row thumbnail to a full hero feature tile.
72
+
73
+ Lead media is **square show artwork at 1:1 aspect, minimum 1400×1400 source** (the iTunes/Apple Podcasts spec) displayed at any size. Behind a hero featured show, a subtle blurred-and-warmed copy of the artwork can sit as backdrop — but lighter and softer than the music-streaming equivalent. Host photography is appropriate as a secondary asset on show-detail pages; use **4:5 portrait** with warm color grading.
74
+
75
+ **AI tool recommendations:** for placeholder show artwork, **Midjourney** with prompts like *"square podcast cover art, [topic] aesthetic, friendly geometric illustration, warm palette, rounded shapes"* — explicitly avoid microphone or headphone clichés. **Flux** for friendly editorial illustrations of hosts or topics. **Recraft** for spot illustrations in show-notes and chapter summaries.
76
+
77
+ **Aspect ratios:** 1:1 square for show artwork (canonical, matches all podcast directories). 4:5 portrait for host photography. 16:9 for video-podcast trailers only. Never 21:9 (cinematic, wrong feel).
78
+
79
+ **Video:** video podcasts are user-initiated only, never autoplay. Embedded player uses the same warm chrome with overcast-orange play button. Trailers and clips (Snipd-style) get the purple clip-card treatment with `--snipd-purple` accent.
80
+
81
+ **Chapter art:** when episodes have per-chapter artwork, show it at 1:1 with the same `tile-soft` shadow language. Chapter progress bars use `chapter-progress` keyframe with `--overcast-orange` fill.
82
+
83
+ **Clip cards:** Snipd-style highlighted-quote cards use `--snipd-purple` border-left rule, white card body, mono timestamp, and shelf-brown quote text. Treat them as a distinct card variant — never mix with regular episode chrome.
84
+
85
+ **Performance:** show artwork thumbnails ≤30 KB AVIF at 600w; hero tiles ≤120 KB at 1400w. Blurhash placeholders during load — `tile-rise` covers the transition. LCP under 2s with hero featured tile.
86
+
87
+ **Avoid:** generic microphone/headphone stock photography (every podcast app uses this — it's the laziest possible visual), dark moody host photography (cinematic territory), gradient backgrounds (soft-modern territory), glassmorphic player chrome, AI-generated hosts with uncanny faces, lens flare, decorative SVG ornament beyond the warm rounded chrome.
88
+
89
+ **Accessibility:** show artwork always has alt-text in *"[Show name] cover art"* format. Subscribed-state toggle has `aria-pressed` reflecting state. Chapter list is a proper `<ol>` with timestamps as `<time>` elements. Play-bar bounce animation has `aria-hidden="true"`.
90
+
91
+ ## Component families
92
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. Expected first families: `ShowTile`, `EpisodeCard`, `SubscribeButton`, `ChapterList`, `ClipCard`.
93
+
94
+ ## Details
95
+ - **Selection:** `hsl(var(--overcast-orange) / 0.28)` background, foreground text.
96
+ - **Focus ring:** `2px solid hsl(var(--overcast-orange))`. Matches primary play action.
97
+ - **Scrollbar:** thin.
98
+
99
+ ## Exceptions
100
+ None yet. When an intentional one-of-one violation lands, add it here with the reason. The Director's consistency pass lists all exceptions for human review.
101
+
102
+ ## Revisions
103
+ - Initial direction, generated at install time.
@@ -0,0 +1,192 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const podcastWarm: Direction = {
4
+ name: "podcast-warm",
5
+ ethos:
6
+ "Overcast warm orange · Pocket Casts deep red · Castro deep teal-green · Goodpods community warmth · Snipd purple clip-cards",
7
+ references: [
8
+ { brand: "Overcast", trait: "warm orange accent with friendly system sans and soft cards" },
9
+ { brand: "Pocket Casts", trait: "deep red action color with smooth animations and warm surfaces" },
10
+ { brand: "Castro", trait: "deep teal-green chrome with a friendly, library-shelf feel" },
11
+ { brand: "Goodpods", trait: "community-warm Plus Jakarta Sans, recommendation-led layout" },
12
+ { brand: "Snipd", trait: "purple clip-cards and friendly AI-generated chapter chrome" },
13
+ ],
14
+ feel:
15
+ "Warm off-white canvas, generously rounded chrome, oversized artwork tiles in a subscribed-shows " +
16
+ "grid. Friendly secondary palette of teal-green and clip-card purple. The independent-listener counterpoint " +
17
+ "to Spotify's cold corporate dark — this surface feels like a curated shelf of shows, not a streaming dashboard.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Plus Jakarta Sans",
22
+ fallback: ["Manrope", "Inter", "system-ui", "-apple-system", "sans-serif"],
23
+ from: "Goodpods display sans — friendly geometric humanist, soft terminals, podcast-app warm",
24
+ googleFont: "Plus+Jakarta+Sans",
25
+ weights: [500, 600, 700, 800],
26
+ },
27
+ body: {
28
+ family: "Inter",
29
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
30
+ from: "Overcast/Pocket Casts system-feel sans — neutral, screen-comfortable for episode descriptions",
31
+ googleFont: "Inter",
32
+ weights: [400, 500, 600],
33
+ },
34
+ mono: {
35
+ family: "JetBrains Mono",
36
+ fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
37
+ from: "episode runtimes, chapter timestamps, playback speed — tabular numerics",
38
+ googleFont: "JetBrains+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.015em",
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"ss01", "cv11", "tnum"',
47
+ h1ScaleClamp: "clamp(2.25rem, 6vw, 4.5rem)", // friendly hero scale — not cinematic-large
48
+ bodyBaseSize: "1rem", // 16px — episode description comfort
49
+ bodyLineHeight: "1.6",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "32 30% 96%", from: "warm off-white canvas — Overcast paper, library-shelf cream" },
54
+ foreground: { hsl: "24 20% 16%", from: "warm dark brown-ink — never pure black on warm cream" },
55
+ card: { hsl: "0 0% 100%", from: "show-tile and episode card — pure white on cream, friendly lift" },
56
+ popover: { hsl: "0 0% 100%", from: "menu and tooltip surface — same as card with stronger shadow" },
57
+ primary: { hsl: "18 88% 56%", from: "Overcast warm orange — the canonical 'Play' action across the player" },
58
+ primaryForeground: { hsl: "0 0% 100%", from: "white on Overcast orange" },
59
+ secondary: { hsl: "32 24% 92%", from: "deeper warm cream — quiet panels inside friendly pages" },
60
+ secondaryForeground: { hsl: "24 20% 16%", from: "brown-ink on deeper cream" },
61
+ muted: { hsl: "32 20% 90%", from: "muted surface — playlist row hover, soft dividers" },
62
+ mutedForeground: { hsl: "24 12% 42%", from: "episode-meta secondary text — duration, dateline, host name" },
63
+ accent: { hsl: "168 52% 38%", from: "Castro teal-green hover/selection accent — the warm secondary" },
64
+ accentForeground: { hsl: "0 0% 100%", from: "white on Castro teal-green" },
65
+ border: { hsl: "32 18% 84%", from: "soft warm border — softer than editorial hairline, friendlier" },
66
+ input: { hsl: "32 18% 84%", from: "same as border — input chrome uses the soft border language" },
67
+ ring: { hsl: "18 88% 56%", from: "Overcast orange focus ring — matches primary play action" },
68
+ destructive: { hsl: "356 70% 50%", from: "remove-from-queue red — distinct from Pocket Casts brand red below" },
69
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on destructive red" },
70
+ brand: {
71
+ "overcast-orange": { hsl: "18 88% 56%", from: "= primary; Overcast warm orange, canonical play color" },
72
+ "pocketcasts-red": { hsl: "356 78% 52%", from: "Pocket Casts deep red — secondary brand accent for 'Subscribed' badges" },
73
+ "castro-teal": { hsl: "168 52% 38%", from: "= accent; Castro deep teal-green, friendly category color" },
74
+ "snipd-purple": { hsl: "266 70% 60%", from: "Snipd clip-card purple — used on chapter clips and AI-summary chrome" },
75
+ "goodpods-pink": { hsl: "338 75% 65%", from: "Goodpods community pink — recommendation-card highlight" },
76
+ "warm-cream": { hsl: "32 30% 96%", from: "= background; warm off-white canvas, also a semantic token" },
77
+ "shelf-brown": { hsl: "24 20% 16%", from: "= foreground; warm brown-ink, also semantic for library-shelf chrome" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128], // medium — friendly breathing, room for cards
84
+ containerMax: "max-w-6xl",
85
+ containerPadding: "px-5 lg:px-8",
86
+ sectionPadding: {
87
+ hero: "pt-20 pb-14 lg:pt-32 lg:pb-20",
88
+ default: "py-16 lg:py-24",
89
+ tight: "py-10 lg:py-14",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "1rem", // generously rounded — the warm-chrome signal
95
+ pillsAllowed: true, // pills are core: category chips, subscribe toggles, play-speed selectors
96
+ },
97
+
98
+ shadows: {
99
+ style: "soft",
100
+ utilities: {
101
+ "tile-soft":
102
+ "0 1px 2px hsl(24 20% 16% / 0.06), " +
103
+ "0 8px 24px hsl(24 20% 16% / 0.08)", // show-artwork tile lift — warm, soft, never glossy
104
+ "tile-lift":
105
+ "0 4px 8px hsl(24 20% 16% / 0.08), " +
106
+ "0 16px 40px hsl(24 20% 16% / 0.12)", // hover state — the tile rises on hover
107
+ "subscribe-glow":
108
+ "0 0 0 2px hsl(var(--overcast-orange) / 0.25), " +
109
+ "0 8px 24px hsl(var(--overcast-orange) / 0.2)", // hero subscribe button warm glow
110
+ },
111
+ },
112
+
113
+ motion: {
114
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
115
+ durations: {
116
+ reveal: 500, // friendly, immediate — not slow-editorial, not snap-app
117
+ loop: 1800, // play-bar bounce, chapter-progress pulse
118
+ ambient: 8000, // slow tile-shimmer on featured shows
119
+ },
120
+ keyframes: {
121
+ "tile-rise": {
122
+ css:
123
+ "from { opacity: 0; transform: translateY(16px); }\n" +
124
+ "to { opacity: 1; transform: translateY(0); }",
125
+ defaultDuration: 500,
126
+ iteration: "once",
127
+ purpose: "show-tile entrance — staggered across grid, gentle rise",
128
+ },
129
+ "subscribe-pop": {
130
+ css:
131
+ "0% { transform: scale(1); }\n" +
132
+ "40% { transform: scale(1.08); }\n" +
133
+ "100% { transform: scale(1); }",
134
+ defaultDuration: 400,
135
+ iteration: "once",
136
+ purpose: "subscribe-button click feedback — friendly pop, never on play/pause",
137
+ },
138
+ "play-bar-bounce": {
139
+ css:
140
+ "0%, 100% { transform: translateY(0); }\n" +
141
+ "50% { transform: translateY(-4px); }",
142
+ defaultDuration: 1800,
143
+ iteration: "infinite",
144
+ purpose: "now-playing mini-bar gentle bounce — present but unobtrusive",
145
+ },
146
+ "chapter-progress": {
147
+ css:
148
+ "from { transform: scaleX(0); }\n" +
149
+ "to { transform: scaleX(1); }",
150
+ defaultDuration: 1200,
151
+ iteration: "once",
152
+ purpose: "chapter-marker fill animation on episode-page chapter list",
153
+ },
154
+ "tile-shimmer": {
155
+ css:
156
+ "0% { background-position: -150% 0; }\n" +
157
+ "100% { background-position: 150% 0; }",
158
+ defaultDuration: 2400,
159
+ iteration: "infinite",
160
+ purpose: "featured-show artwork shimmer overlay — used only on the hero featured tile",
161
+ },
162
+ },
163
+ respectsReducedMotion: true,
164
+ },
165
+
166
+ density: "medium",
167
+
168
+ patterns: {
169
+ button:
170
+ "Primary play action is a SOLID rounded-full overcast-orange button with white play glyph. " +
171
+ "Subscribe toggle is a pill: outlined Castro-teal when 'subscribe', filled when 'subscribed'. " +
172
+ "Secondary controls (queue, share, download) are ghost icon buttons with 1rem radius. " +
173
+ "Tertiary text-link CTAs use shelf-brown foreground with underline-on-hover.",
174
+ card:
175
+ "Show-tile is the canonical card — square artwork at 1:1, generously rounded (1rem), with title and host below, lifted by .tile-soft shadow that grows to .tile-lift on hover. " +
176
+ "Episode cards use bg-card (white) on cream background, p-5 lg:p-6, with chapter-list inside when expanded. " +
177
+ "No card uses cream fill — cards always sit above the canvas in white.",
178
+ input:
179
+ "Pill-shape (rounded-full) input with bg-card, 1px --border, leading icon. " +
180
+ "Focus ring is 2px overcast-orange. Filter chips are rounded-full pills in bg-secondary with shelf-brown foreground; selected state shifts to castro-teal fill with white text.",
181
+ cta:
182
+ "Hero subscribe / listen CTA is a solid overcast-orange pill with white label, wrapped in subscribe-glow utility. " +
183
+ "App Store / Play Store badges for cross-platform CTAs. Tertiary links are foreground with underline-on-hover — never colored text-only.",
184
+ },
185
+
186
+ details: {
187
+ selectionBg: "hsl(var(--overcast-orange) / 0.28)",
188
+ selectionFg: "hsl(var(--foreground))",
189
+ focusRing: "2px solid hsl(var(--overcast-orange))",
190
+ scrollbarStyle: "thin",
191
+ },
192
+ };
@@ -0,0 +1,78 @@
1
+ # Design Direction — Publisher-Indie
2
+
3
+ ## Ethos
4
+ Coffee House Press structured catalogue · Graywolf serif gravity · New Directions modernist pedigree · Tin House quarterly discipline · Two Dollar Radio small-press risk
5
+
6
+ ## Feel
7
+ An independent literary publisher's spring catalogue. Deep cream paper, Source Serif throughout, forthcoming-titles listed with ISBN and pub-date the way a trade catalogue does. Color is almost absent — a single ink-navy used for series markers. Author headshots are tight black-and-white portraits, never marketing shots. The page reads with literary-fiction gravity, not bookstore warmth and not museum austerity — somewhere between.
8
+
9
+ ## Reference brands
10
+ - **Coffee House Press** → structured catalogue list. Deep cream. Source Serif.
11
+ - **Graywolf Press** → literary-fiction gravity, formal serif, ISBN-forward.
12
+ - **New Directions** → modernist pedigree, numbered series, restrained color.
13
+ - **Tin House** → quarterly publishing rhythm, masthead-style author bios.
14
+ - **Two Dollar Radio** → small-press risk, hand-set catalogue feel.
15
+
16
+ ## Tokens
17
+ Surface stack is **catalogue cream** (background) → **lighter cream** (card) → **deeper cream** (secondary/muted/accent). Hairline borders are warm gray (slightly cream-biased, never neutral). Brand tokens: `--ink`, `--cream`, `--ink-navy`, `--oxblood`.
18
+
19
+ Primary is `--ink-navy`. Reserved for series markers, focus ring, and the single 'Subscribe' CTA. Oxblood is reserved for the fiction-genre tag — never elsewhere.
20
+
21
+ ## Typography
22
+ - **Display:** Source Serif Pro (Graywolf / Coffee House catalogue serif). h1–h4.
23
+ - **Body:** Source Serif Pro — single-family discipline. Body 17px / 1.68.
24
+ - **Mono:** IBM Plex Mono. ISBN, pub-date, trim size — trade-catalogue mono.
25
+
26
+ H1 uses `clamp(2.25rem, 5vw, 4.25rem)`. Forthcoming titles use the display serif italic at body+1 — like a catalogue subhead.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-5xl px-6 lg:px-12` — catalogue spread width.
30
+ - **Sections:** hero `pt-24 pb-16 lg:pt-40 lg:pb-24`; default `py-20 lg:py-28`; tight `py-12 lg:py-18`.
31
+ - **Scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128.
32
+
33
+ ## Color
34
+ No hex. Tokens only. Ink-navy is the only color used as fill (Subscribe button); everywhere else it's a hover state or a series-marker accent. Oxblood is reserved for the fiction-genre tag only. Cream and ink dominate every surface.
35
+
36
+ ## Radius
37
+ `--radius: 0`. Sharp corners — catalogue pages are sharp. Pills disallowed.
38
+
39
+ ## Shadows
40
+ **Minimal.** Two utilities: `.hairline-bottom` and `.catalogue-rule` (rules above + below for a listing row).
41
+
42
+ ## Motion
43
+ Single keyframe: `fade-rise` (opacity + 20px translate, 1100ms). Print-publication settle. `prefers-reduced-motion` honored.
44
+
45
+ ## Component patterns
46
+ - **Buttons:** text-link CTAs with ink-navy on hover. 'Subscribe' is the single solid-fill — ink-navy bg + cream text.
47
+ - **Cards:** hairline rules top + bottom, no fill differentiation. Padding `p-7 lg:p-10`. Title in display serif italic; author in roman; metadata in mono.
48
+ - **Inputs:** border-bottom only (1px ink). Label above in mono uppercase.
49
+ - **CTA links:** ink → ink-navy on hover. Never a chip, never a gradient.
50
+
51
+ ## Recommended rich media
52
+ Author portraits, black-and-white, tight crops — the way a publisher's catalogue shoots its authors. Environmental but not lifestyle: writer at a desk, on a porch, in a library. Never red-carpet, never event-PR. Cover plates are flat scans on cream paper, the way trade catalogues print them. Never 3D book mockups, never floating-cover renders.
53
+
54
+ **AI tool recommendations:** **Midjourney / Flux** for portraits: *"black-and-white author portrait, environmental, soft window light, 50mm, Tri-X grain"*. For covers: *"book cover photographed flat on cream paper, neutral overhead lighting"*. Avoid AI gradients and "book stack" hero compositions.
55
+
56
+ **Aspect ratios:** 4:5 portrait (author convention), 2:3 (cover convention). Never 16:9.
57
+
58
+ **Captions** in mono. Format: *"Author Name · Forthcoming Title (Spring 2026) · ISBN 978-x-xxxxxx-xx-x"*.
59
+
60
+ **Avoid:** marketing-style author shots, 3D book renders, gradients, decorative SVG, lifestyle stock.
61
+
62
+ **Accessibility:** alt-text describes the portrait and the work — *"Black-and-white portrait: Catherine Lacey at her writing desk, facing window light."*
63
+
64
+ ## Component families
65
+ - `ForthcomingTitle` family — list row with date + title + author + genre tag + ISBN.
66
+ - `AuthorBio` family — portrait + name + recent title + 2-sentence bio.
67
+ - `Subscription` family — tier card (NYRB-Subscription style, never SaaS pricing pillars).
68
+
69
+ ## Details
70
+ - **Selection:** `hsl(var(--primary) / 0.18)` — ink-navy wash.
71
+ - **Focus ring:** `1px solid hsl(var(--ring))`.
72
+ - **Scrollbar:** thin.
73
+
74
+ ## Exceptions
75
+ None yet.
76
+
77
+ ## Revisions
78
+ - Initial direction.
@@ -0,0 +1,148 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const publisherIndie: Direction = {
4
+ name: "publisher-indie" as Direction["name"],
5
+ ethos:
6
+ "Coffee House Press structured catalogue · Graywolf serif gravity · New Directions modernist pedigree · Tin House quarterly discipline · Two Dollar Radio risk",
7
+ references: [
8
+ { brand: "Coffee House Press", trait: "structured catalogue list, deep cream, Source Serif" },
9
+ { brand: "Graywolf Press", trait: "literary-fiction gravity, formal serif, ISBN-forward listing" },
10
+ { brand: "New Directions", trait: "modernist pedigree, numbered series, restrained color" },
11
+ { brand: "Tin House", trait: "quarterly publishing rhythm, masthead-style author bios" },
12
+ { brand: "Two Dollar Radio", trait: "small-press risk, hand-set catalogue feel" },
13
+ ],
14
+ feel:
15
+ "An independent literary publisher's spring catalogue. Deep cream paper, Source Serif throughout, " +
16
+ "forthcoming-titles listed with ISBN and pub-date the way a trade catalogue does. " +
17
+ "Color is almost absent — a single ink-navy used for series markers. Author headshots are tight " +
18
+ "black-and-white portraits, never marketing shots.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Source Serif Pro",
23
+ fallback: ["Source Serif 4", "Cormorant Garamond", "Georgia", "serif"],
24
+ from: "Graywolf / Coffee House catalogue serif — modern transitional, readable at small sizes",
25
+ googleFont: "Source+Serif+Pro",
26
+ weights: [400, 600, 700],
27
+ },
28
+ body: {
29
+ family: "Source Serif Pro",
30
+ fallback: ["Source Serif 4", "Cormorant Garamond", "Georgia", "serif"],
31
+ from: "single-family discipline — body in the same serif, smaller, lighter",
32
+ googleFont: "Source+Serif+Pro",
33
+ weights: [400, 600],
34
+ },
35
+ mono: {
36
+ family: "IBM Plex Mono",
37
+ fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "ISBN, pub-date, trim size — trade-catalogue mono, slightly warmer than JetBrains",
39
+ googleFont: "IBM+Plex+Mono",
40
+ weights: [400, 500],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.012em",
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"tnum", "calt", "kern"',
48
+ h1ScaleClamp: "clamp(2.25rem, 5vw, 4.25rem)",
49
+ bodyBaseSize: "1.0625rem",
50
+ bodyLineHeight: "1.68",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "36 28% 92%", from: "deep cream catalogue stock — Coffee House / Graywolf" },
55
+ foreground: { hsl: "220 22% 14%", from: "ink-navy black — printer's ink, never pure" },
56
+ card: { hsl: "36 32% 95%", from: "lighter cream — book-listing surface" },
57
+ popover: { hsl: "36 32% 95%", from: "matches card" },
58
+ primary: { hsl: "220 50% 28%", from: "series-marker ink-navy — New Directions numbered-series feel" },
59
+ primaryForeground: { hsl: "36 28% 92%", from: "cream on ink-navy" },
60
+ secondary: { hsl: "36 22% 87%", from: "deeper cream — catalogue divider, masthead row" },
61
+ secondaryForeground: { hsl: "220 22% 14%", from: "ink on deeper cream" },
62
+ muted: { hsl: "36 22% 87%", from: "same as secondary" },
63
+ mutedForeground: { hsl: "220 12% 38%", from: "trade-catalogue gray — pub-dates, ISBNs" },
64
+ accent: { hsl: "36 20% 84%", from: "hover surface — cream deeper still" },
65
+ accentForeground: { hsl: "220 22% 14%", from: "ink on hover" },
66
+ border: { hsl: "30 12% 76%", from: "catalogue-page hairline, slightly warmer than gray" },
67
+ input: { hsl: "30 12% 76%", from: "same as border" },
68
+ ring: { hsl: "220 50% 28%", from: "ink-navy — focus" },
69
+ destructive: { hsl: "8 60% 42%", from: "out-of-print indicator" },
70
+ destructiveForeground: { hsl: "36 28% 92%", from: "cream on destructive" },
71
+ brand: {
72
+ ink: { hsl: "220 22% 14%", from: "printer's ink — semantic foreground" },
73
+ cream: { hsl: "36 28% 92%", from: "catalogue cream — semantic background" },
74
+ "ink-navy": { hsl: "220 50% 28%", from: "series-marker navy — also semantic primary" },
75
+ oxblood: { hsl: "0 45% 28%", from: "fiction-mark oxblood, used for fiction genre tag only" },
76
+ },
77
+ },
78
+
79
+ spacing: {
80
+ base: 4,
81
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
82
+ containerMax: "max-w-5xl",
83
+ containerPadding: "px-6 lg:px-12",
84
+ sectionPadding: {
85
+ hero: "pt-24 pb-16 lg:pt-40 lg:pb-24",
86
+ default: "py-20 lg:py-28",
87
+ tight: "py-12 lg:py-18",
88
+ },
89
+ },
90
+
91
+ radius: {
92
+ base: "0",
93
+ pillsAllowed: false,
94
+ },
95
+
96
+ shadows: {
97
+ style: "minimal",
98
+ utilities: {
99
+ "hairline-bottom":
100
+ "0 1px 0 0 hsl(var(--border))",
101
+ "catalogue-rule":
102
+ "0 1px 0 0 hsl(var(--border)), inset 0 1px 0 0 hsl(var(--border))",
103
+ },
104
+ },
105
+
106
+ motion: {
107
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
108
+ durations: {
109
+ reveal: 1100,
110
+ loop: 4000,
111
+ ambient: 30000,
112
+ },
113
+ keyframes: {
114
+ "fade-rise": {
115
+ css:
116
+ "from { opacity: 0; transform: translateY(20px); }\n" +
117
+ "to { opacity: 1; transform: translateY(0); }",
118
+ defaultDuration: 1100,
119
+ iteration: "once",
120
+ purpose: "catalogue section entrance — print-publication settle",
121
+ },
122
+ },
123
+ respectsReducedMotion: true,
124
+ },
125
+
126
+ density: "medium",
127
+
128
+ patterns: {
129
+ button:
130
+ "Text-link CTAs with ink-navy on hover; 'Subscribe' is the single solid-fill — ink-navy bg + cream text. " +
131
+ "Pills disallowed — catalogue listings are rectangular.",
132
+ card:
133
+ "Hairline rules top + bottom, no fill differentiation from page. Padding p-7 lg:p-10. " +
134
+ "Title in display serif italic; author in display serif roman; metadata (ISBN, pub-date) in mono.",
135
+ input:
136
+ "Border-bottom only (1px ink). Label above in mono uppercase, small.",
137
+ cta:
138
+ "Text-link with ink, hover transitions to ink-navy. Never a chip. " +
139
+ "'Subscribe' is the single exception — solid ink-navy rectangle with cream text.",
140
+ },
141
+
142
+ details: {
143
+ selectionBg: "hsl(var(--primary) / 0.18)",
144
+ selectionFg: "hsl(var(--foreground))",
145
+ focusRing: "1px solid hsl(var(--ring))",
146
+ scrollbarStyle: "thin",
147
+ },
148
+ };