@stylecrib/cli 0.3.1 → 0.3.3

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 (314) 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 +1606 -467
  25. package/package.json +12 -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/THEME.md +125 -0
  38. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  39. package/themes/arc-stack/theme.yml +153 -0
  40. package/themes/arc-stack/tokens.ts +29 -0
  41. package/themes/architectural/THEME.md +102 -0
  42. package/themes/architectural/tokens.ts +159 -0
  43. package/themes/atelier-radiance/THEME.md +93 -0
  44. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  45. package/themes/atelier-radiance/theme.yml +130 -0
  46. package/themes/atelier-radiance/tokens.ts +29 -0
  47. package/themes/automotive-ev/THEME.md +87 -0
  48. package/themes/automotive-ev/tokens.ts +183 -0
  49. package/themes/automotive-luxury/THEME.md +88 -0
  50. package/themes/automotive-luxury/tokens.ts +175 -0
  51. package/themes/baby-modern/THEME.md +79 -0
  52. package/themes/baby-modern/tokens.ts +184 -0
  53. package/themes/banking-gravity/THEME.md +171 -0
  54. package/themes/banking-gravity/tokens.ts +169 -0
  55. package/themes/beauty-clean/THEME.md +92 -0
  56. package/themes/beauty-clean/tokens.ts +176 -0
  57. package/themes/beauty-luxury/THEME.md +96 -0
  58. package/themes/beauty-luxury/tokens.ts +178 -0
  59. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  60. package/themes/bento-modular/THEME.md +80 -0
  61. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  62. package/themes/bento-modular/theme.yml +83 -0
  63. package/themes/bento-modular/tokens.ts +27 -0
  64. package/themes/bookstore-indie/THEME.md +78 -0
  65. package/themes/bookstore-indie/tokens.ts +147 -0
  66. package/themes/brutalist/THEME.md +96 -0
  67. package/themes/brutalist/tokens.ts +151 -0
  68. package/themes/business-tiles/THEME.md +141 -0
  69. package/themes/business-tiles/tokens.ts +178 -0
  70. package/themes/cabana-poster/THEME.md +158 -0
  71. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  72. package/themes/cabana-poster/theme.yml +221 -0
  73. package/themes/cabana-poster/tokens.ts +34 -0
  74. package/themes/case-panel/THEME.md +126 -0
  75. package/themes/case-panel/tailwind.snippet.ts +15 -0
  76. package/themes/case-panel/theme.yml +153 -0
  77. package/themes/case-panel/tokens.ts +28 -0
  78. package/themes/cinematic-dark/THEME.md +97 -0
  79. package/themes/cinematic-dark/tokens.ts +195 -0
  80. package/themes/classic-car/THEME.md +86 -0
  81. package/themes/classic-car/tokens.ts +173 -0
  82. package/themes/cloud-friendly/THEME.md +152 -0
  83. package/themes/cloud-friendly/tokens.ts +181 -0
  84. package/themes/community-niche/THEME.md +102 -0
  85. package/themes/community-niche/tokens.ts +177 -0
  86. package/themes/corporate-grid/THEME.md +154 -0
  87. package/themes/corporate-grid/tokens.ts +182 -0
  88. package/themes/couture-luxury/THEME.md +85 -0
  89. package/themes/couture-luxury/tokens.ts +146 -0
  90. package/themes/creator-social/THEME.md +131 -0
  91. package/themes/creator-social/tokens.ts +249 -0
  92. package/themes/crypto-onchain/THEME.md +100 -0
  93. package/themes/crypto-onchain/tokens.ts +207 -0
  94. package/themes/cycling-brand/THEME.md +78 -0
  95. package/themes/cycling-brand/tokens.ts +185 -0
  96. package/themes/dating-friendly/THEME.md +102 -0
  97. package/themes/dating-friendly/tokens.ts +178 -0
  98. package/themes/dense-utility/THEME.md +85 -0
  99. package/themes/dense-utility/tokens.ts +155 -0
  100. package/themes/devtool-cli/THEME.md +100 -0
  101. package/themes/devtool-cli/tokens.ts +195 -0
  102. package/themes/devtool-docs/THEME.md +105 -0
  103. package/themes/devtool-docs/tokens.ts +177 -0
  104. package/themes/editorial/THEME.md +129 -0
  105. package/themes/editorial/tailwind.snippet.ts +15 -0
  106. package/themes/editorial/theme.yml +173 -0
  107. package/themes/editorial/tokens.ts +29 -0
  108. package/themes/education-formal/THEME.md +154 -0
  109. package/themes/education-formal/tailwind.snippet.ts +15 -0
  110. package/themes/education-formal/theme.yml +186 -0
  111. package/themes/education-formal/tokens.ts +29 -0
  112. package/themes/education-warm/THEME.md +91 -0
  113. package/themes/education-warm/tokens.ts +185 -0
  114. package/themes/ember-poster/README.md +79 -0
  115. package/themes/ember-poster/THEME.md +101 -0
  116. package/themes/ember-poster/package.json +34 -0
  117. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  118. package/themes/ember-poster/theme.yml +109 -0
  119. package/themes/ember-poster/tokens.ts +27 -0
  120. package/themes/enterprise-cloud/THEME.md +139 -0
  121. package/themes/enterprise-cloud/tokens.ts +179 -0
  122. package/themes/enterprise-tech/THEME.md +167 -0
  123. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  124. package/themes/enterprise-tech/theme.yml +202 -0
  125. package/themes/enterprise-tech/tokens.ts +29 -0
  126. package/themes/ev-charging/THEME.md +94 -0
  127. package/themes/ev-charging/tokens.ts +185 -0
  128. package/themes/farm-direct/THEME.md +92 -0
  129. package/themes/farm-direct/tokens.ts +180 -0
  130. package/themes/fintech-card/THEME.md +96 -0
  131. package/themes/fintech-card/tokens.ts +191 -0
  132. package/themes/fintech-trust/THEME.md +94 -0
  133. package/themes/fintech-trust/tokens.ts +192 -0
  134. package/themes/food-blog/THEME.md +98 -0
  135. package/themes/food-blog/tokens.ts +183 -0
  136. package/themes/forum-classic/THEME.md +100 -0
  137. package/themes/forum-classic/tokens.ts +168 -0
  138. package/themes/fresh-plate/THEME.md +144 -0
  139. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  140. package/themes/fresh-plate/theme.yml +189 -0
  141. package/themes/fresh-plate/tokens.ts +30 -0
  142. package/themes/furniture-modern/THEME.md +94 -0
  143. package/themes/furniture-modern/tokens.ts +176 -0
  144. package/themes/gaming-esports/THEME.md +146 -0
  145. package/themes/gaming-esports/tokens.ts +199 -0
  146. package/themes/gaming-streamer/THEME.md +139 -0
  147. package/themes/gaming-streamer/tokens.ts +201 -0
  148. package/themes/glassmorphic-modern/THEME.md +119 -0
  149. package/themes/glassmorphic-modern/tokens.ts +174 -0
  150. package/themes/government-civic/THEME.md +138 -0
  151. package/themes/government-civic/tokens.ts +164 -0
  152. package/themes/gym-chain/THEME.md +79 -0
  153. package/themes/gym-chain/tokens.ts +196 -0
  154. package/themes/healthcare-bright/THEME.md +95 -0
  155. package/themes/healthcare-bright/tokens.ts +184 -0
  156. package/themes/home-decor/THEME.md +94 -0
  157. package/themes/home-decor/tokens.ts +177 -0
  158. package/themes/hotel-boutique/THEME.md +110 -0
  159. package/themes/hotel-boutique/tokens.ts +179 -0
  160. package/themes/hyperminimal-mono/THEME.md +91 -0
  161. package/themes/hyperminimal-mono/tokens.ts +150 -0
  162. package/themes/indie-art-game/THEME.md +107 -0
  163. package/themes/indie-art-game/tokens.ts +216 -0
  164. package/themes/insurance-legacy/THEME.md +101 -0
  165. package/themes/insurance-legacy/tokens.ts +182 -0
  166. package/themes/insurance-modern/THEME.md +103 -0
  167. package/themes/insurance-modern/tokens.ts +192 -0
  168. package/themes/kaiju-reveal/THEME.md +97 -0
  169. package/themes/kaiju-reveal/tokens.ts +185 -0
  170. package/themes/kinetic-data/THEME.md +172 -0
  171. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  172. package/themes/kinetic-data/theme.yml +207 -0
  173. package/themes/kinetic-data/tokens.ts +30 -0
  174. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  175. package/themes/kinetic-headline/THEME.md +78 -0
  176. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  177. package/themes/kinetic-headline/theme.yml +81 -0
  178. package/themes/kinetic-headline/tokens.ts +26 -0
  179. package/themes/law-firm/THEME.md +108 -0
  180. package/themes/law-firm/tokens.ts +158 -0
  181. package/themes/lawtech-modern/THEME.md +107 -0
  182. package/themes/lawtech-modern/tokens.ts +192 -0
  183. package/themes/linkedin-pro/THEME.md +102 -0
  184. package/themes/linkedin-pro/tokens.ts +174 -0
  185. package/themes/logistics-modern/THEME.md +94 -0
  186. package/themes/logistics-modern/tokens.ts +187 -0
  187. package/themes/magazine-glossy/THEME.md +74 -0
  188. package/themes/magazine-glossy/tokens.ts +158 -0
  189. package/themes/marker-mag/THEME.md +128 -0
  190. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  191. package/themes/marker-mag/theme.yml +159 -0
  192. package/themes/marker-mag/tokens.ts +27 -0
  193. package/themes/marketplace-modern/THEME.md +135 -0
  194. package/themes/marketplace-modern/tokens.ts +186 -0
  195. package/themes/marketplace-vintage/THEME.md +110 -0
  196. package/themes/marketplace-vintage/tokens.ts +185 -0
  197. package/themes/maximalist/THEME.md +96 -0
  198. package/themes/maximalist/tokens.ts +168 -0
  199. package/themes/mid-century/THEME.md +109 -0
  200. package/themes/mid-century/tokens.ts +162 -0
  201. package/themes/motorcycle-brand/THEME.md +86 -0
  202. package/themes/motorcycle-brand/tokens.ts +174 -0
  203. package/themes/museum/THEME.md +83 -0
  204. package/themes/museum/tokens.ts +147 -0
  205. package/themes/music-streaming/THEME.md +101 -0
  206. package/themes/music-streaming/tokens.ts +187 -0
  207. package/themes/music-vinyl/THEME.md +98 -0
  208. package/themes/music-vinyl/tokens.ts +167 -0
  209. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  210. package/themes/nature-distilled/THEME.md +81 -0
  211. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  212. package/themes/nature-distilled/theme.yml +91 -0
  213. package/themes/nature-distilled/tokens.ts +26 -0
  214. package/themes/news-tabloid/THEME.md +72 -0
  215. package/themes/news-tabloid/tokens.ts +158 -0
  216. package/themes/news-tech/THEME.md +75 -0
  217. package/themes/news-tech/tokens.ts +149 -0
  218. package/themes/newsletter/THEME.md +82 -0
  219. package/themes/newsletter/tokens.ts +138 -0
  220. package/themes/newspaper-classic/THEME.md +74 -0
  221. package/themes/newspaper-classic/tokens.ts +159 -0
  222. package/themes/nonprofit-arts/THEME.md +78 -0
  223. package/themes/nonprofit-arts/tokens.ts +157 -0
  224. package/themes/nonprofit-warm/THEME.md +105 -0
  225. package/themes/nonprofit-warm/tokens.ts +188 -0
  226. package/themes/outdoor-adventure/THEME.md +113 -0
  227. package/themes/outdoor-adventure/tokens.ts +181 -0
  228. package/themes/overland-broadside/THEME.md +119 -0
  229. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  230. package/themes/overland-broadside/theme.yml +138 -0
  231. package/themes/overland-broadside/tokens.ts +27 -0
  232. package/themes/performance-engineered/THEME.md +162 -0
  233. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  234. package/themes/performance-engineered/theme.yml +193 -0
  235. package/themes/performance-engineered/tokens.ts +29 -0
  236. package/themes/pet-food/THEME.md +78 -0
  237. package/themes/pet-food/tokens.ts +185 -0
  238. package/themes/pharma-clinical/THEME.md +164 -0
  239. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  240. package/themes/pharma-clinical/theme.yml +201 -0
  241. package/themes/pharma-clinical/tokens.ts +29 -0
  242. package/themes/pill-editorial/THEME.md +125 -0
  243. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  244. package/themes/pill-editorial/theme.yml +168 -0
  245. package/themes/pill-editorial/tokens.ts +31 -0
  246. package/themes/podcast-warm/THEME.md +103 -0
  247. package/themes/podcast-warm/tokens.ts +192 -0
  248. package/themes/publisher-indie/THEME.md +78 -0
  249. package/themes/publisher-indie/tokens.ts +148 -0
  250. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  251. package/themes/raw-concrete/THEME.md +76 -0
  252. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  253. package/themes/raw-concrete/theme.yml +88 -0
  254. package/themes/raw-concrete/tokens.ts +27 -0
  255. package/themes/realestate-luxury/THEME.md +94 -0
  256. package/themes/realestate-luxury/tokens.ts +169 -0
  257. package/themes/realestate-marketplace/THEME.md +106 -0
  258. package/themes/realestate-marketplace/tokens.ts +183 -0
  259. package/themes/restaurant-modern/THEME.md +109 -0
  260. package/themes/restaurant-modern/tokens.ts +172 -0
  261. package/themes/runway-fashion/THEME.md +99 -0
  262. package/themes/runway-fashion/tokens.ts +167 -0
  263. package/themes/saturday-morning/THEME.md +117 -0
  264. package/themes/saturday-morning/tokens.ts +281 -0
  265. package/themes/schema.ts +235 -0
  266. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  267. package/themes/signal-dark/THEME.md +107 -0
  268. package/themes/signal-dark/tokens.ts +181 -0
  269. package/themes/soft-modern/THEME.md +91 -0
  270. package/themes/soft-modern/tokens.ts +166 -0
  271. package/themes/solar-residential/THEME.md +92 -0
  272. package/themes/solar-residential/tokens.ts +176 -0
  273. package/themes/sports-league/THEME.md +180 -0
  274. package/themes/sports-league/tailwind.snippet.ts +15 -0
  275. package/themes/sports-league/theme.yml +213 -0
  276. package/themes/sports-league/tokens.ts +32 -0
  277. package/themes/stadium-sport/THEME.md +114 -0
  278. package/themes/stadium-sport/tokens.ts +187 -0
  279. package/themes/streetwear-hype/THEME.md +100 -0
  280. package/themes/streetwear-hype/tokens.ts +174 -0
  281. package/themes/studio-architect/THEME.md +108 -0
  282. package/themes/studio-architect/tokens.ts +162 -0
  283. package/themes/studio-photographer/THEME.md +88 -0
  284. package/themes/studio-photographer/tokens.ts +164 -0
  285. package/themes/team-kanban/THEME.md +167 -0
  286. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  287. package/themes/team-kanban/theme.yml +209 -0
  288. package/themes/team-kanban/tokens.ts +35 -0
  289. package/themes/telehealth-modern/THEME.md +95 -0
  290. package/themes/telehealth-modern/tokens.ts +197 -0
  291. package/themes/tourism-board/THEME.md +111 -0
  292. package/themes/tourism-board/tokens.ts +173 -0
  293. package/themes/toys-modern/THEME.md +79 -0
  294. package/themes/toys-modern/tokens.ts +200 -0
  295. package/themes/travel-luxury/THEME.md +95 -0
  296. package/themes/travel-luxury/tokens.ts +162 -0
  297. package/themes/vacation-rental/THEME.md +105 -0
  298. package/themes/vacation-rental/tokens.ts +174 -0
  299. package/themes/vault-reel/THEME.md +134 -0
  300. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  301. package/themes/vault-reel/theme.yml +167 -0
  302. package/themes/vault-reel/tokens.ts +30 -0
  303. package/themes/vet-modern/THEME.md +79 -0
  304. package/themes/vet-modern/tokens.ts +194 -0
  305. package/themes/web3-restraint/THEME.md +87 -0
  306. package/themes/web3-restraint/tokens.ts +154 -0
  307. package/themes/wellness-active/THEME.md +102 -0
  308. package/themes/wellness-active/tokens.ts +203 -0
  309. package/themes/wellness-spa/THEME.md +93 -0
  310. package/themes/wellness-spa/tokens.ts +173 -0
  311. package/themes/y2k-chrome/THEME.md +118 -0
  312. package/themes/y2k-chrome/tokens.ts +249 -0
  313. package/themes/yoga-studio/THEME.md +76 -0
  314. package/themes/yoga-studio/tokens.ts +163 -0
@@ -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
+ };
@@ -0,0 +1,157 @@
1
+ # Raw-Concrete — Build Brief
2
+
3
+ > The contract this theme ships with. Read at commit time by the
4
+ > brief-enforcer subagent; handed to Claude Code via the Copy-for-Claude
5
+ > button on the theme detail page.
6
+ >
7
+ > This theme is intentionally the LEAST polished theme in the library.
8
+ > Its whole register is refusing polish. That means several rules in
9
+ > the SLOP-BLOCKLIST are the OPPOSITE of what other themes forbid — do
10
+ > NOT smooth this one into a modern SaaS composition.
11
+
12
+ ---
13
+
14
+ ## MANDATORY BUILD DIRECTIVE — you MUST
15
+
16
+ 1. **Radius 0 everywhere.** No `borderRadius: 4`, no `12`, no `999`,
17
+ no pill CTAs. Every button, every card, every input is a square.
18
+ The palette picker corners are `borderRadius: 0` too.
19
+ 2. **Box-shadow `none` everywhere.** Every card, every button, every
20
+ div. Depth is suggested by 1px `#C0C0C0` hairline borders, nothing
21
+ else.
22
+ 3. **Monospace family throughout the body.** `Berkeley Mono`,
23
+ `JetBrains Mono`, `Menlo` — one family. Body copy in mono at 14px
24
+ line-height 1.5. Headings in mono at slightly larger sizes but same
25
+ family. No display sans, no display serif.
26
+ 4. **Native `#0000EE` link color** on light canvas, `#8CB4FF` on dark.
27
+ Never override link color to match the palette accent. That IS the
28
+ theme's brand register.
29
+ 5. **Native `#551A8B` visited-link color** (dark canvas: `#D0ADF0`).
30
+ Users must be able to tell what they've already read.
31
+ 6. **Section numbers as `[01]`, `[02]`, `[03]`.** Every h2 opens with a
32
+ square-bracketed section number. This is the arxiv-preprint tell.
33
+ 7. **All images have visible captions** with `<figcaption>` in the
34
+ format `**fig. N.** <sentence>`. Never a photo without a caption.
35
+ This is the arxiv-figure register.
36
+
37
+ ---
38
+
39
+ ## SLOP-BLOCKLIST — you MUST NOT
40
+
41
+ - **ANY border-radius > 0.** Pills, rounded cards, rounded buttons, all
42
+ banned. Fingerprint: `borderRadius: [1-9]` anywhere in the section.
43
+ - **ANY box-shadow.** Fingerprint: `boxShadow:` with a non-`none`
44
+ value. No drop shadow, no glow, no elevation.
45
+ - **ANY `transition:` on hover states.** Native links, native focus
46
+ rings, browser defaults only.
47
+ - **Sans-serif or serif display fonts.** No Inter, no Fraunces, no
48
+ Bricolage. Monospace only.
49
+ - **Override of the native link color.** The palette variant swaps
50
+ the LINK hue (that IS the theme's palette), but the CSS property
51
+ is always native link color, never a custom accent bg on a
52
+ span-as-link.
53
+ - **Underline REMOVAL from links.** Every link stays underlined.
54
+ - **Cycling headline words** or auto-advancing content.
55
+ - **Purple/indigo/pink gradient backgrounds.** No gradients at all.
56
+ - **CSS `filter:` treatments** on photos (no `brightness()`,
57
+ `contrast()`, `saturate()`). Photos rendered raw.
58
+ - **Section-numbered content presented as marketing feature cards.**
59
+ Section `[01] Recent posts` is a numbered LIST, not a card grid.
60
+ - **Roman-numeral copyright** (`MMXXVI`). Native `©` + Arabic year.
61
+ - **Attribution of influence in visible copy** — vitalik.eth.limo,
62
+ arxiv.org, brutalistwebsites.com are studied but NEVER NAMED in
63
+ slug, copy, or UI.
64
+
65
+ ---
66
+
67
+ ## CHROME INVENTORY — the allow-list
68
+
69
+ - **Sticky picker strip in native-link register** — canvas + link-color
70
+ pickers as underlined `[dark]` / `[light]` and `[default]` / `[kelp]`
71
+ bracket-prefixed links. NO button chrome. Body font (monospace).
72
+ - **Table-based masthead nav** — `<table>` with 1px borderCollapse.
73
+ Left cell: `raw-concrete.txt` in bold. Right cell: 5-6 nav items as
74
+ underlined links separated by ` · `.
75
+ - **Document masthead / [00] hero** — H1 in mono at 28px, weight 500;
76
+ 1-3 paragraphs of body prose with inline underlined links; maintained
77
+ by / last-modified / content-type meta line (content-level `·` is
78
+ allowed here — it's arxiv-native).
79
+ - **[N] Section headings** — h2 in mono at 18px, weight 500, prefixed
80
+ with `[01]`, `[02]`, etc. 1px underline via `borderBottom`.
81
+ - **Numbered `<ol>` post lists** — indent 24px, mono body 14px.
82
+ - **`<figure>` with photo + `<figcaption>`** — 1px black border on
83
+ image, caption below in mono 12px starting with `**fig. N.**`.
84
+ - **`<table>` for spec + archive** — `borderCollapse: collapse`, 1px
85
+ border on every cell, mono 13px content, no zebra striping.
86
+ - **`<blockquote>` for manifesto** — 3px left border, mono body 14px
87
+ in `normal` (not italic).
88
+ - **Native `<input type="email">` + `<button>` for the subscribe
89
+ section.** No custom styling beyond 1px black border, radius 0.
90
+ - **`©` copyright line in mono 12px.** No trademark ornaments.
91
+ - **Palette picker labels use body font (monospace), sentence-case,
92
+ no textTransform.**
93
+
94
+ ---
95
+
96
+ ## SIGNATURE MOVES — verbs, not adjectives
97
+
98
+ - **Number every section with `[NN]` in square brackets.** This is
99
+ the arxiv-preprint tell. The reader should feel they're reading a
100
+ document, not browsing an app.
101
+ - **Set every link in `#0000EE` on cream** (or `#8CB4FF` on dark).
102
+ Visited links go `#551A8B`. Users must be able to tell what they've
103
+ already read. This is the ONE color that varies per palette.
104
+ - **Wrap every image in `<figure>` with a `<figcaption>` starting
105
+ `fig. N.`** — never a bare `<img>`. If the image doesn't have a
106
+ caption, it doesn't belong on this theme.
107
+ - **Use `<table>` for tabular data** — the spec table AND the archive
108
+ year list are real `<table>` elements with visible cell borders.
109
+ Refuse a `grid-cols-*` grid; this is the native-web tell.
110
+ - **Render `<blockquote>` with a 3px left border** and mono body in
111
+ `fontStyle: "normal"` — NEVER italic. Italic blockquotes are the
112
+ Medium-blog register; the raw-concrete register is pre-CSS HTML.
113
+ - **Sign off the colophon with an honest `view-source` link** — the
114
+ footer's last three links are `rss` + `atom` + `view-source` +
115
+ `colophon`. That IS the register.
116
+
117
+ ---
118
+
119
+ ## COLOR TOKENS
120
+
121
+ **Light canvas** — `bg: #FFFFFF` / `ink: #000000` / `border: #C0C0C0`.
122
+ Native link `#0000EE`, visited `#551A8B`.
123
+
124
+ **Dark canvas** — `bg: #111111` / `ink: #E8E6E3` / `border: #404040`.
125
+ Native link (per browser default in dark UA): `#8CB4FF` / visited
126
+ `#D0ADF0`. This ISN'T pure black bg — the register is "dark browser
127
+ default," not black-void.
128
+
129
+ **Palette variant** — 10 link-color variants (default, kelp, vermilion,
130
+ aubergine, ochre, cobalt, moss, ink, hazard, cyan). Only link + visited
131
+ values change per palette. Everything else stays FIXED across variants.
132
+
133
+ ---
134
+
135
+ ## TYPOGRAPHY
136
+
137
+ - **Display / body / mono:** ONE family. Berkeley Mono (fallback
138
+ JetBrains Mono, Menlo, Courier New). No secondary font.
139
+ - **Sizes:** h1 = 28px weight 500; h2 = 18px weight 500 (with `[NN]`
140
+ prefix); body = 14px line-height 1.5; caption = 12px.
141
+
142
+ ---
143
+
144
+ ## SECTION SKELETON
145
+
146
+ 1. Sticky picker strip (native-link register).
147
+ 2. Table-based masthead nav.
148
+ 3. `[00]` Document masthead / hero.
149
+ 4. `[01]` Recent posts (numbered list).
150
+ 5. `[02]` Figures (3-up with captions).
151
+ 6. `[03]` Spec table.
152
+ 7. `[04]` Manifesto blockquote.
153
+ 8. `[05]` Fig. 4 full-bleed figure with caption.
154
+ 9. `[06]` Archive (year table).
155
+ 10. `[07]` Colophon (photo + text side-by-side).
156
+ 11. `[08]` Subscribe (native form).
157
+ 12. Footer with copyright + rss/atom/view-source/colophon links.
@@ -0,0 +1,76 @@
1
+ # Raw Concrete
2
+
3
+ > Web brutalism — system defaults weaponized, honest structure, monospace throughout.
4
+
5
+ **Slug:** `raw-concrete` — **Surface:** web — **Density:** dense
6
+
7
+ ## Influence
8
+
9
+ Web brutalism (brutalistwebsites.com era). Kate Moross print, Vitalik's blog, the original Craigslist, arxiv.org paper listings.
10
+
11
+ ## Signature move
12
+
13
+ Every link is `#0000EE`. Every visited link is `#551A8B`. Every border is a
14
+ `1px solid #C0C0C0` hairline. No border-radius anywhere — every corner is
15
+ 90°. No box-shadow ever. Tables render as tables (visible cell borders).
16
+ Buttons look like `<button>` elements pre-CSS. Underlines on links stay.
17
+ The composition is unmistakably "the browser did this, not a designer."
18
+
19
+ ## Palette
20
+
21
+ - **bg:** `#FFFFFF`
22
+ - **surface:** `#FFFFFF`
23
+ - **ink:** `#000000`
24
+ - **accent:** `#0000EE`
25
+ - **secondary:** `#C0C0C0`
26
+
27
+ ## Typography
28
+
29
+ - **Display:** Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this
30
+ - **Body:** same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px
31
+ - **Mono:** same as display and body — the whole theme is monospace, one family, three weights
32
+ - **Scale:** 1.2 (minor third — deliberately shallow contrast; body and heading feel close)
33
+
34
+ ## Motion
35
+
36
+ none — no transitions, no scroll reveals, no hover animations. The absence IS the register.
37
+
38
+ ## Imagery
39
+
40
+ Photographs render at native aspect ratio with a 1px black border and no
41
+ cropping. No filters, no gradients, no vignettes. Illustrations are ASCII
42
+ or single-color line drawings. No 3D, no rendered shapes, no icons beyond
43
+ what unicode provides.
44
+
45
+ ## Best for
46
+
47
+ - Personal blogs (Vitalik-register)
48
+ - Academic paper listings (arxiv-register)
49
+ - Indie developer portfolios that want to feel earned
50
+ - Manifestos and long-form essays
51
+ - Art projects that trade on refusal-of-polish
52
+ - Craigslist-shaped marketplaces
53
+
54
+ ## Reject if
55
+
56
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
57
+
58
+ - Border-radius greater than 0px anywhere on the page
59
+ - Any box-shadow — hover, focus, or decorative
60
+ - CSS transitions or animations of any kind
61
+ - Prettified link colors — links must render as browser-default #0000EE
62
+ - Sans-serif or serif faces — monospace only, one family throughout
63
+ - Rounded buttons or pill-shaped controls
64
+ - Gradient backgrounds or gradient text
65
+ - Icon fonts or SVG icons — unicode symbols only (▲ ▼ · × → ←)
66
+ - Padding standardization — deliberately inconsistent, exposed structure
67
+ - Hover states other than the browser default underline / link-color-change
68
+
69
+ ## Banned defaults (inherited + theme-specific)
70
+
71
+ - claude-cream (#F4F1EA + serif + #D97757)
72
+ - void+acid (near-black bg + single bright acid-green or vermilion accent)
73
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
74
+ - tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
75
+ - uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
76
+ - brutalism-as-decoration (visible borders + monospace applied as decoration to an otherwise polished SaaS layout — Raw Concrete must refuse polish structurally, not aesthetically)
@@ -0,0 +1,16 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: raw-concrete
3
+ export const rawConcreteTailwindExtend = {
4
+ colors: {
5
+ bg: "#FFFFFF",
6
+ surface: "#FFFFFF",
7
+ ink: "#000000",
8
+ accent: "#0000EE",
9
+ secondary: "#C0C0C0",
10
+ },
11
+ fontFamily: {
12
+ display: ["Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this"],
13
+ body: ["same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px"],
14
+ mono: ["same as display and body — the whole theme is monospace, one family, three weights"],
15
+ },
16
+ };