@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,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,10 @@
1
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T07:49:34.733Z"}],"overall":"PASS","ran_at":"2026-07-03T07:49:34.733Z"}
2
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T07:54:56.618Z"},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T07:54:56.625Z"}],"overall":"PASS","ran_at":"2026-07-03T07:54:56.618Z"}
3
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T07:55:58.958Z"},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T07:55:58.965Z"}],"overall":"PASS","ran_at":"2026-07-03T07:55:58.958Z"}
4
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T07:59:21.722Z"},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T07:59:55.854Z"}],"overall":"PASS","ran_at":"2026-07-03T07:59:21.722Z"}
5
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:10.642Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:10.650Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T15:57:10.650Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T15:57:10.642Z"}
6
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:10.955Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":false,"failures":[{"rule":"REG-0001","severity":"block","evidence":"#0000EE in palette within 5 of #0000EE — regressed pattern: Synthetic test — matches raw-concrete's accent, expect BLOCK"}]},"ran_at":"2026-07-03T15:57:10.964Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T15:57:10.955Z"}
7
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:11.255Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:11.266Z","dismissed":[{"rule":"REG-0001","severity":"block","evidence":"#0000EE in palette within 5 of #0000EE — regressed pattern: Synthetic test — matches raw-concrete's accent, expect BLOCK","dismissed":true,"dismissal":{"scope":"this_run","reason":"Synthetic test — removing after verification","dismissed_at":"2026-07-03T15:57:11.111Z"}}]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T15:57:11.266Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T15:57:11.255Z"}
8
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:11.398Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T15:57:11.410Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T15:57:11.410Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T15:57:11.398Z"}
9
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T16:48:54.397Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T16:48:54.405Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T16:49:24.697Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family A has no golden-set anchor yet — anchor-compare skipped (per Mat's Path B decision, families A+G bootstrap from their own first-authored theme)."},"ran_at":"2026-07-03T16:49:24.698Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T16:48:54.397Z"}
10
+ {"slug":"raw-concrete","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:07.650Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:07.658Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T22:52:07.658Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family A has no golden-set anchor yet — anchor-compare skipped (per Mat's Path B decision, families A+G bootstrap from their own first-authored theme)."},"ran_at":"2026-07-03T22:52:07.659Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:52:07.650Z"}
@@ -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
+ };
@@ -0,0 +1,88 @@
1
+ # Base 06 Raw Concrete — the first flagship theme authored under the v2 arc.
2
+ #
3
+ # Per SURVIVOR_MAPPING.md, Family A (Art & Design Movements) has zero
4
+ # survivor precedent. Raw Concrete is chosen as theme #1 specifically
5
+ # because its signature move is "unstyled honesty" — default link colors,
6
+ # visible borders, exposed structure. That's hard to slop up: the failure
7
+ # mode is over-styling, not under-styling. Good forcing function for a
8
+ # harness whose gates are looking for slop patterns.
9
+ #
10
+ # See site/design-system/BESPOKE_THEME_SYSTEM.md #06 for the source
11
+ # entry. This file expands that one line into the full YAML schema.
12
+
13
+ name: Raw Concrete
14
+ concept: Web brutalism — system defaults weaponized, honest structure, monospace throughout.
15
+ influence: Web brutalism (brutalistwebsites.com era). Kate Moross print, Vitalik's blog, the original Craigslist, arxiv.org paper listings.
16
+
17
+ # v2 metadata — for anchor-compare + regression-scan scoping.
18
+ family: A
19
+ base_number: 6
20
+
21
+ # Where the theme renders live. anchor-compare fetches this URL and
22
+ # passes the rendered screenshot to Director for grading. Anchor-compare
23
+ # is skipped for Family A + G in MVP (no survivor precedent) but the URL
24
+ # is here so the site-integration path is stable across families.
25
+ render_url: http://localhost:5173/themes/raw-concrete
26
+
27
+ surface: web
28
+
29
+ typography:
30
+ display: Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this
31
+ body: same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px
32
+ mono: same as display and body — the whole theme is monospace, one family, three weights
33
+ scale: 1.2 (minor third — deliberately shallow contrast; body and heading feel close)
34
+
35
+ palette:
36
+ bg: "#FFFFFF"
37
+ surface: "#FFFFFF"
38
+ ink: "#000000"
39
+ accent: "#0000EE" # default browser link blue — used as-is, not "our brand blue"
40
+ secondary: "#C0C0C0" # default table border gray
41
+ visited: "#551A8B" # default visited link purple — used as-is
42
+
43
+ density: dense
44
+
45
+ motion: none — no transitions, no scroll reveals, no hover animations. The absence IS the register.
46
+
47
+ signature: |
48
+ Every link is `#0000EE`. Every visited link is `#551A8B`. Every border is a
49
+ `1px solid #C0C0C0` hairline. No border-radius anywhere — every corner is
50
+ 90°. No box-shadow ever. Tables render as tables (visible cell borders).
51
+ Buttons look like `<button>` elements pre-CSS. Underlines on links stay.
52
+ The composition is unmistakably "the browser did this, not a designer."
53
+
54
+ imagery: |
55
+ Photographs render at native aspect ratio with a 1px black border and no
56
+ cropping. No filters, no gradients, no vignettes. Illustrations are ASCII
57
+ or single-color line drawings. No 3D, no rendered shapes, no icons beyond
58
+ what unicode provides.
59
+
60
+ best_for:
61
+ - Personal blogs (Vitalik-register)
62
+ - Academic paper listings (arxiv-register)
63
+ - Indie developer portfolios that want to feel earned
64
+ - Manifestos and long-form essays
65
+ - Art projects that trade on refusal-of-polish
66
+ - Craigslist-shaped marketplaces
67
+
68
+ avoid:
69
+ - "Border-radius greater than 0px anywhere on the page"
70
+ - "Any box-shadow — hover, focus, or decorative"
71
+ - "CSS transitions or animations of any kind"
72
+ - "Prettified link colors — links must render as browser-default #0000EE"
73
+ - "Sans-serif or serif faces — monospace only, one family throughout"
74
+ - "Rounded buttons or pill-shaped controls"
75
+ - "Gradient backgrounds or gradient text"
76
+ - "Icon fonts or SVG icons — unicode symbols only (▲ ▼ · × → ←)"
77
+ - "Padding standardization — deliberately inconsistent, exposed structure"
78
+ - "Hover states other than the browser default underline / link-color-change"
79
+
80
+ banned_defaults:
81
+ # Global blocklist (inherited from BESPOKE_THEME_SYSTEM.md's global slop-blocklist)
82
+ - "claude-cream (#F4F1EA + serif + #D97757)"
83
+ - "void+acid (near-black bg + single bright acid-green or vermilion accent)"
84
+ - "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
85
+ - "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
86
+ - "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
87
+ # Base-specific: Raw Concrete has its OWN slop failure mode
88
+ - "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,27 @@
1
+ // Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
2
+
3
+ export const tokens = {
4
+ slug: "raw-concrete",
5
+ family: "A",
6
+ base: "06",
7
+ palette: {
8
+ "bg": "#FFFFFF",
9
+ "surface": "#FFFFFF",
10
+ "ink": "#000000",
11
+ "accent": "#0000EE",
12
+ "secondary": "#C0C0C0",
13
+ "visited": "#551A8B"
14
+ },
15
+ typography: {
16
+ "display": "Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this",
17
+ "body": "same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px",
18
+ "mono": "same as display and body — the whole theme is monospace, one family, three weights",
19
+ "scale": "1.2 (minor third — deliberately shallow contrast; body and heading feel close)"
20
+ },
21
+ surface: "web",
22
+ density: "dense",
23
+ motion: "none — no transitions, no scroll reveals, no hover animations. The absence IS the register.",
24
+ signature: "Every link is `#0000EE`. Every visited link is `#551A8B`. Every border is a\n`1px solid #C0C0C0` hairline. No border-radius anywhere — every corner is\n90°. No box-shadow ever. Tables render as tables (visible cell borders).\nButtons look like `<button>` elements pre-CSS. Underlines on links stay.\nThe composition is unmistakably \"the browser did this, not a designer.\"\n",
25
+ } as const;
26
+
27
+ export type Tokens = typeof tokens;
@@ -0,0 +1,94 @@
1
+ # Design Direction — Realestate-Luxury
2
+
3
+ ## Ethos
4
+ Sotheby's cream listing-book · Compass deep navy · Modern House serif · The Agency cinematic listings · 1stDibs editorial luxury
5
+
6
+ ## Feel
7
+ An eight-figure listing book delivered through the browser. Deep cream backgrounds carry full-bleed property cinematography, high-contrast serif headlines name the address as if it were a chapter title, and a single deep navy accent does all the interaction work. Burgundy is the second luxury accent — focus rings, selection, the occasional vertical rule on a spec table. Reads as a bound real estate catalog, not as a marketplace search experience.
8
+
9
+ ## Reference brands
10
+ - **Sotheby's Realty** → cream paper + Cormorant-feel serif + listing-as-portrait photography. The headline IS the address; the photograph IS the listing.
11
+ - **Compass** → deep navy mark + clean sans + structured global search. Navy is the canonical action color; nothing else competes.
12
+ - **Modern House (London)** → cream + serif + architectural full-bleed photography. The page is a quiet frame for the property.
13
+ - **The Agency** → deep cream + restrained nav + cinematic listing reels. Motion is slow ken-burns over stills, never UI animation for its own sake.
14
+ - **1stDibs Estate** → warm cream + editorial serif + provenance copy. Long-form descriptive prose is welcome — the listing has a story.
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 **deep cream** (background) → **lifted cream** (card) → **deeper cream** (secondary/muted/accent). Depth comes from hairline borders on a warm hairline color, never from drop shadows or fill differentiation. Pure white is forbidden — `--paper`/`--cream` replace it; pure black is forbidden — `--navy-ink` replaces it.
20
+
21
+ Brand tokens: `--cream`, `--cream-deep`, `--navy`, `--navy-ink`, `--burgundy`, `--brass`. Primary is deep navy. Burgundy is reserved for focus, selection, and the occasional editorial rule. Brass is reserved for hardware-feeling accents — spec-table rules, divider dots — never as a button face.
22
+
23
+ ## Typography
24
+ - **Display:** Cormorant Garamond (Sotheby's listing-book serif feel). h1–h4. Tracking `-0.012em` — Garalde display wants near-zero, just shy of it.
25
+ - **Body:** Inter (Compass clean sans). Body base **17px** with **line-height 1.65** — catalog-comfortable, never marketplace-dense.
26
+ - **Mono:** JetBrains Mono. Price, lot size, sqft, MLS number, dateline. Always `font-variant-numeric: tabular-nums` so prices align column-wise.
27
+
28
+ H1 uses `clamp(2.75rem, 7vw, 6rem)` — the address-as-title scale. Font features: `"liga"`, `"dlig"`, `"tnum"`, `"ss01"` — discretionary ligatures on the display serif, tabular numerics on body and mono.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-7xl px-6 lg:px-12` — wide enough for full-bleed photography and 21:9 hero stills, with generous outer gutters.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-24 pb-20 lg:pt-32 lg:pb-28`
34
+ - Default: `py-20 lg:py-32`
35
+ - Tight: `py-12 lg:py-20`
36
+ - **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 96 128. No arbitrary spacing. Density tier is **low** — catalog breathing, never marketplace density.
37
+
38
+ ## Color
39
+ No hex in component files. All color via tokens. Opacity via `/N` modifier. White and pure black are forbidden — `--cream` and `--navy-ink` replace them. The palette is intentionally small: cream, navy, burgundy, brass, and the cream-family neutrals. If a designer needs a new color, the answer is almost always a wider use of one of the six brand tokens, not a new one.
40
+
41
+ ## Radius
42
+ `--radius: 0`. **Sharp corners only.** Pills are disallowed (`pillsAllowed: false`) — they read marketplace. Every listing card, every input, every button has catalog-page corners.
43
+
44
+ ## Shadows
45
+ **Minimal.** Two utilities:
46
+ - `.hairline-bottom` — `inset 0 -1px 0 hsl(var(--border))`, the divider rule between listing sections.
47
+ - `.shadow-listing` — `0 1px 2px hsl(var(--navy-ink) / 0.04), 0 8px 24px hsl(var(--navy-ink) / 0.06)`, used only on listing-card hover.
48
+
49
+ No glows. No colored shadows. The cream paper absorbs depth gracefully through hairlines and full-bleed photography.
50
+
51
+ ## Motion
52
+ Three keyframes:
53
+ - `fade-rise` — 1000ms opacity + 20px translate, the standard entrance. Slow on purpose: catalog pacing.
54
+ - `ken-burns` — 32000ms infinite scale + translate on hero stills, the architectural camera push.
55
+ - `underline-sweep` — 600ms scaleX 0→1 from left origin, the text-link hover.
56
+
57
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — wrapped in a media query in every motion utility. **No marquee. No parallax. No UI bounce. No glow pulse.** This direction does not perform.
58
+
59
+ ## Component patterns
60
+ - **Buttons:** Text-link CTAs by default, navy color, underline-sweep on hover. Solid-fill is reserved for the single hero action per page — navy bg, cream text, sharp corners. Secondary actions are hairline-outlined ghost buttons in navy. **No pill shapes. No burgundy buttons** — burgundy is focus-only.
61
+ - **Cards:** Sharp 0 corners, hairline border on `--cream` card surface. Internal padding `p-8 lg:p-12`. Listing cards lead with full-width photography (4:5 portrait or 3:2 landscape), address in Cormorant display, spec line in mono. Hover lifts to `shadow-listing`.
62
+ - **Inputs:** Border-bottom only (1px `--border`) on the cream surface. No full box. Label sits above in mono-uppercase, tracking `0.12em`. Focus shifts border to burgundy.
63
+ - **CTA links:** Text-link with underline-sweep for the catalog body. Solid navy rectangle for the single hero CTA (Request Viewing). **Never a pill, never a gradient, never a glow.**
64
+
65
+ ## Recommended rich media
66
+ Realestate-Luxury is a photography-driven language. The lead asset on any listing is **environmental architectural photography, color-graded toward Architectural Digest warmth** — golden-hour interior light, cool blue-grey exterior shadow, no HDR halos, no overly-corrected verticals. Real estate hero stills should feel like Helene Binet or Iwan Baan, not like MLS phone photography.
67
+
68
+ Twilight exteriors are the canonical hero treatment — lights on inside, sky still holding cobalt, no people in frame. Interior shots are staged and styled (a single book on the bench, a vase of olive branches, never a family photo). Drone aerials are welcome for estates with land; never use drone footage of suburban subdivisions — it reads marketplace.
69
+
70
+ **AI tool recommendations:** **Midjourney v6+** with prompts like *"architectural photography, twilight exterior, Iwan Baan style, warm interior light, cobalt sky, medium format, 50mm, no people"* for hero stills; *"interior architectural photography, AD magazine, golden hour, Hasselblad, natural light, styled interior"* for interiors. Avoid Midjourney's default "luxury real estate" prompt — it produces glossy, over-saturated McMansion renders. Explicitly prompt for medium format and architectural authorship.
71
+
72
+ **Aspect ratios:** 21:9 cinematic for the hero (full-bleed, the cinematic real-estate frame); 4:5 portrait for vertical environmental shots; 3:2 for inline catalog photography. **Never 1:1 square** — that reads Instagram listing, not catalog.
73
+
74
+ **Video:** A single autoplay-muted hero reel of the property is welcome — slow drone push, slow interior tracking, 18–24 second loop. No music in autoplay. Full property tour videos sit behind a play-button poster image. ≤6 MB per hero loop, H.265 or AV1.
75
+
76
+ **Performance:** hero image ≤180 KB AVIF at 2400w; inline catalog photography ≤120 KB at 1600w. LCP under 2.2s with hero image — if it slips, optimize the image; do not strip the photography.
77
+
78
+ **Avoid:** MLS-style 14-photo carousels (marketplace territory), red SOLD overlays (Redfin territory), price-drop badges (marketplace territory), virtual-tour glasses iconography (gimmicky), AI-generated "luxury homes" (the uncanny-valley grass tells), drone footage of cookie-cutter subdivisions.
79
+
80
+ **Accessibility:** alt-text describes the property as a Sotheby's catalog would — *"Hudson Valley farmhouse with limestone exterior, cedar-shingle roof, and a maple grove descending to the river at golden hour"*. Address + property type alone is not enough.
81
+
82
+ ## Component families
83
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. First likely families: listing-card, spec-table, agent-attribution, neighborhood-frame.
84
+
85
+ ## Details
86
+ - **Selection:** `hsl(var(--brand-burgundy) / 0.22)` background, foreground text. Burgundy doing its second-accent job.
87
+ - **Focus ring:** `1px solid hsl(var(--ring))` — thin burgundy. Quiet, considered, never a 2px blue web-app ring.
88
+ - **Scrollbar:** thin.
89
+
90
+ ## Exceptions
91
+ 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.
92
+
93
+ ## Revisions
94
+ - Initial direction, generated at install time.