@stylecrib/cli 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/README.md +94 -9
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +1577 -463
  25. package/package.json +11 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/.anchor-render.png +0 -0
  38. package/themes/arc-stack/THEME.md +125 -0
  39. package/themes/arc-stack/audit.log.jsonl +6 -0
  40. package/themes/arc-stack/dismissals.jsonl +3 -0
  41. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  42. package/themes/arc-stack/theme.yml +153 -0
  43. package/themes/arc-stack/tokens.ts +29 -0
  44. package/themes/architectural/THEME.md +102 -0
  45. package/themes/architectural/tokens.ts +159 -0
  46. package/themes/atelier-radiance/THEME.md +93 -0
  47. package/themes/atelier-radiance/audit.log.jsonl +1 -0
  48. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  49. package/themes/atelier-radiance/theme.yml +130 -0
  50. package/themes/atelier-radiance/tokens.ts +29 -0
  51. package/themes/automotive-ev/THEME.md +87 -0
  52. package/themes/automotive-ev/tokens.ts +183 -0
  53. package/themes/automotive-luxury/THEME.md +88 -0
  54. package/themes/automotive-luxury/tokens.ts +175 -0
  55. package/themes/baby-modern/THEME.md +79 -0
  56. package/themes/baby-modern/tokens.ts +184 -0
  57. package/themes/banking-gravity/THEME.md +171 -0
  58. package/themes/banking-gravity/tokens.ts +169 -0
  59. package/themes/beauty-clean/THEME.md +92 -0
  60. package/themes/beauty-clean/tokens.ts +176 -0
  61. package/themes/beauty-luxury/THEME.md +96 -0
  62. package/themes/beauty-luxury/tokens.ts +178 -0
  63. package/themes/bento-modular/.anchor-render.png +0 -0
  64. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  65. package/themes/bento-modular/THEME.md +80 -0
  66. package/themes/bento-modular/audit.log.jsonl +3 -0
  67. package/themes/bento-modular/dismissals.jsonl +1 -0
  68. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  69. package/themes/bento-modular/theme.yml +83 -0
  70. package/themes/bento-modular/tokens.ts +27 -0
  71. package/themes/bookstore-indie/THEME.md +78 -0
  72. package/themes/bookstore-indie/tokens.ts +147 -0
  73. package/themes/brutalist/THEME.md +96 -0
  74. package/themes/brutalist/tokens.ts +151 -0
  75. package/themes/business-tiles/THEME.md +141 -0
  76. package/themes/business-tiles/tokens.ts +178 -0
  77. package/themes/cabana-poster/THEME.md +158 -0
  78. package/themes/cabana-poster/audit.log.jsonl +1 -0
  79. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  80. package/themes/cabana-poster/theme.yml +221 -0
  81. package/themes/cabana-poster/tokens.ts +34 -0
  82. package/themes/case-panel/THEME.md +126 -0
  83. package/themes/case-panel/audit.log.jsonl +2 -0
  84. package/themes/case-panel/tailwind.snippet.ts +15 -0
  85. package/themes/case-panel/theme.yml +153 -0
  86. package/themes/case-panel/tokens.ts +28 -0
  87. package/themes/cinematic-dark/THEME.md +97 -0
  88. package/themes/cinematic-dark/tokens.ts +195 -0
  89. package/themes/classic-car/THEME.md +86 -0
  90. package/themes/classic-car/tokens.ts +173 -0
  91. package/themes/cloud-friendly/THEME.md +152 -0
  92. package/themes/cloud-friendly/tokens.ts +181 -0
  93. package/themes/community-niche/THEME.md +102 -0
  94. package/themes/community-niche/tokens.ts +177 -0
  95. package/themes/corporate-grid/THEME.md +154 -0
  96. package/themes/corporate-grid/tokens.ts +182 -0
  97. package/themes/couture-luxury/THEME.md +85 -0
  98. package/themes/couture-luxury/tokens.ts +146 -0
  99. package/themes/creator-social/THEME.md +131 -0
  100. package/themes/creator-social/tokens.ts +249 -0
  101. package/themes/crypto-onchain/THEME.md +100 -0
  102. package/themes/crypto-onchain/tokens.ts +207 -0
  103. package/themes/cycling-brand/THEME.md +78 -0
  104. package/themes/cycling-brand/tokens.ts +185 -0
  105. package/themes/dating-friendly/THEME.md +102 -0
  106. package/themes/dating-friendly/tokens.ts +178 -0
  107. package/themes/dense-utility/THEME.md +85 -0
  108. package/themes/dense-utility/tokens.ts +155 -0
  109. package/themes/devtool-cli/THEME.md +100 -0
  110. package/themes/devtool-cli/tokens.ts +195 -0
  111. package/themes/devtool-docs/THEME.md +105 -0
  112. package/themes/devtool-docs/tokens.ts +177 -0
  113. package/themes/editorial/THEME.md +129 -0
  114. package/themes/editorial/audit.log.jsonl +2 -0
  115. package/themes/editorial/tailwind.snippet.ts +15 -0
  116. package/themes/editorial/theme.yml +173 -0
  117. package/themes/editorial/tokens.ts +29 -0
  118. package/themes/education-formal/THEME.md +154 -0
  119. package/themes/education-formal/audit.log.jsonl +1 -0
  120. package/themes/education-formal/tailwind.snippet.ts +15 -0
  121. package/themes/education-formal/theme.yml +186 -0
  122. package/themes/education-formal/tokens.ts +29 -0
  123. package/themes/education-warm/THEME.md +91 -0
  124. package/themes/education-warm/tokens.ts +185 -0
  125. package/themes/ember-poster/README.md +79 -0
  126. package/themes/ember-poster/THEME.md +101 -0
  127. package/themes/ember-poster/audit.log.jsonl +17 -0
  128. package/themes/ember-poster/package.json +34 -0
  129. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  130. package/themes/ember-poster/theme.yml +109 -0
  131. package/themes/ember-poster/tokens.ts +27 -0
  132. package/themes/enterprise-cloud/THEME.md +139 -0
  133. package/themes/enterprise-cloud/tokens.ts +179 -0
  134. package/themes/enterprise-tech/.anchor-render.png +0 -0
  135. package/themes/enterprise-tech/THEME.md +167 -0
  136. package/themes/enterprise-tech/audit.log.jsonl +1 -0
  137. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  138. package/themes/enterprise-tech/theme.yml +202 -0
  139. package/themes/enterprise-tech/tokens.ts +29 -0
  140. package/themes/ev-charging/THEME.md +94 -0
  141. package/themes/ev-charging/tokens.ts +185 -0
  142. package/themes/farm-direct/THEME.md +92 -0
  143. package/themes/farm-direct/tokens.ts +180 -0
  144. package/themes/fintech-card/THEME.md +96 -0
  145. package/themes/fintech-card/tokens.ts +191 -0
  146. package/themes/fintech-trust/THEME.md +94 -0
  147. package/themes/fintech-trust/tokens.ts +192 -0
  148. package/themes/food-blog/THEME.md +98 -0
  149. package/themes/food-blog/tokens.ts +183 -0
  150. package/themes/forum-classic/THEME.md +100 -0
  151. package/themes/forum-classic/tokens.ts +168 -0
  152. package/themes/fresh-plate/.anchor-render.png +0 -0
  153. package/themes/fresh-plate/THEME.md +144 -0
  154. package/themes/fresh-plate/audit.log.jsonl +2 -0
  155. package/themes/fresh-plate/dismissals.jsonl +3 -0
  156. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  157. package/themes/fresh-plate/theme.yml +189 -0
  158. package/themes/fresh-plate/tokens.ts +30 -0
  159. package/themes/furniture-modern/THEME.md +94 -0
  160. package/themes/furniture-modern/tokens.ts +176 -0
  161. package/themes/gaming-esports/THEME.md +146 -0
  162. package/themes/gaming-esports/tokens.ts +199 -0
  163. package/themes/gaming-streamer/THEME.md +139 -0
  164. package/themes/gaming-streamer/tokens.ts +201 -0
  165. package/themes/glassmorphic-modern/THEME.md +119 -0
  166. package/themes/glassmorphic-modern/tokens.ts +174 -0
  167. package/themes/government-civic/THEME.md +138 -0
  168. package/themes/government-civic/tokens.ts +164 -0
  169. package/themes/gym-chain/THEME.md +79 -0
  170. package/themes/gym-chain/tokens.ts +196 -0
  171. package/themes/healthcare-bright/THEME.md +95 -0
  172. package/themes/healthcare-bright/tokens.ts +184 -0
  173. package/themes/home-decor/THEME.md +94 -0
  174. package/themes/home-decor/tokens.ts +177 -0
  175. package/themes/hotel-boutique/THEME.md +110 -0
  176. package/themes/hotel-boutique/tokens.ts +179 -0
  177. package/themes/hyperminimal-mono/THEME.md +91 -0
  178. package/themes/hyperminimal-mono/tokens.ts +150 -0
  179. package/themes/indie-art-game/THEME.md +107 -0
  180. package/themes/indie-art-game/tokens.ts +216 -0
  181. package/themes/insurance-legacy/THEME.md +101 -0
  182. package/themes/insurance-legacy/tokens.ts +182 -0
  183. package/themes/insurance-modern/THEME.md +103 -0
  184. package/themes/insurance-modern/tokens.ts +192 -0
  185. package/themes/kaiju-reveal/THEME.md +97 -0
  186. package/themes/kaiju-reveal/tokens.ts +185 -0
  187. package/themes/kinetic-data/THEME.md +172 -0
  188. package/themes/kinetic-data/audit.log.jsonl +1 -0
  189. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  190. package/themes/kinetic-data/theme.yml +207 -0
  191. package/themes/kinetic-data/tokens.ts +30 -0
  192. package/themes/kinetic-headline/.anchor-render.png +0 -0
  193. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  194. package/themes/kinetic-headline/THEME.md +78 -0
  195. package/themes/kinetic-headline/audit.log.jsonl +4 -0
  196. package/themes/kinetic-headline/dismissals.jsonl +1 -0
  197. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  198. package/themes/kinetic-headline/theme.yml +81 -0
  199. package/themes/kinetic-headline/tokens.ts +26 -0
  200. package/themes/law-firm/THEME.md +108 -0
  201. package/themes/law-firm/tokens.ts +158 -0
  202. package/themes/lawtech-modern/THEME.md +107 -0
  203. package/themes/lawtech-modern/tokens.ts +192 -0
  204. package/themes/linkedin-pro/THEME.md +102 -0
  205. package/themes/linkedin-pro/tokens.ts +174 -0
  206. package/themes/logistics-modern/THEME.md +94 -0
  207. package/themes/logistics-modern/tokens.ts +187 -0
  208. package/themes/magazine-glossy/THEME.md +74 -0
  209. package/themes/magazine-glossy/tokens.ts +158 -0
  210. package/themes/marker-mag/THEME.md +128 -0
  211. package/themes/marker-mag/audit.log.jsonl +1 -0
  212. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  213. package/themes/marker-mag/theme.yml +159 -0
  214. package/themes/marker-mag/tokens.ts +27 -0
  215. package/themes/marketplace-modern/THEME.md +135 -0
  216. package/themes/marketplace-modern/tokens.ts +186 -0
  217. package/themes/marketplace-vintage/THEME.md +110 -0
  218. package/themes/marketplace-vintage/tokens.ts +185 -0
  219. package/themes/maximalist/THEME.md +96 -0
  220. package/themes/maximalist/tokens.ts +168 -0
  221. package/themes/mid-century/THEME.md +109 -0
  222. package/themes/mid-century/tokens.ts +162 -0
  223. package/themes/motorcycle-brand/THEME.md +86 -0
  224. package/themes/motorcycle-brand/tokens.ts +174 -0
  225. package/themes/museum/THEME.md +83 -0
  226. package/themes/museum/tokens.ts +147 -0
  227. package/themes/music-streaming/THEME.md +101 -0
  228. package/themes/music-streaming/tokens.ts +187 -0
  229. package/themes/music-vinyl/THEME.md +98 -0
  230. package/themes/music-vinyl/tokens.ts +167 -0
  231. package/themes/nature-distilled/.anchor-render.png +0 -0
  232. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  233. package/themes/nature-distilled/THEME.md +81 -0
  234. package/themes/nature-distilled/audit.log.jsonl +2 -0
  235. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  236. package/themes/nature-distilled/theme.yml +91 -0
  237. package/themes/nature-distilled/tokens.ts +26 -0
  238. package/themes/news-tabloid/THEME.md +72 -0
  239. package/themes/news-tabloid/tokens.ts +158 -0
  240. package/themes/news-tech/THEME.md +75 -0
  241. package/themes/news-tech/tokens.ts +149 -0
  242. package/themes/newsletter/THEME.md +82 -0
  243. package/themes/newsletter/tokens.ts +138 -0
  244. package/themes/newspaper-classic/THEME.md +74 -0
  245. package/themes/newspaper-classic/tokens.ts +159 -0
  246. package/themes/nonprofit-arts/THEME.md +78 -0
  247. package/themes/nonprofit-arts/tokens.ts +157 -0
  248. package/themes/nonprofit-warm/THEME.md +105 -0
  249. package/themes/nonprofit-warm/tokens.ts +188 -0
  250. package/themes/outdoor-adventure/THEME.md +113 -0
  251. package/themes/outdoor-adventure/tokens.ts +181 -0
  252. package/themes/overland-broadside/THEME.md +119 -0
  253. package/themes/overland-broadside/audit.log.jsonl +1 -0
  254. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  255. package/themes/overland-broadside/theme.yml +138 -0
  256. package/themes/overland-broadside/tokens.ts +27 -0
  257. package/themes/performance-engineered/THEME.md +162 -0
  258. package/themes/performance-engineered/audit.log.jsonl +1 -0
  259. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  260. package/themes/performance-engineered/theme.yml +193 -0
  261. package/themes/performance-engineered/tokens.ts +29 -0
  262. package/themes/pet-food/THEME.md +78 -0
  263. package/themes/pet-food/tokens.ts +185 -0
  264. package/themes/pharma-clinical/THEME.md +164 -0
  265. package/themes/pharma-clinical/audit.log.jsonl +1 -0
  266. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  267. package/themes/pharma-clinical/theme.yml +201 -0
  268. package/themes/pharma-clinical/tokens.ts +29 -0
  269. package/themes/pill-editorial/THEME.md +125 -0
  270. package/themes/pill-editorial/audit.log.jsonl +1 -0
  271. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  272. package/themes/pill-editorial/theme.yml +168 -0
  273. package/themes/pill-editorial/tokens.ts +31 -0
  274. package/themes/podcast-warm/THEME.md +103 -0
  275. package/themes/podcast-warm/tokens.ts +192 -0
  276. package/themes/publisher-indie/THEME.md +78 -0
  277. package/themes/publisher-indie/tokens.ts +148 -0
  278. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  279. package/themes/raw-concrete/THEME.md +76 -0
  280. package/themes/raw-concrete/audit.log.jsonl +10 -0
  281. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  282. package/themes/raw-concrete/theme.yml +88 -0
  283. package/themes/raw-concrete/tokens.ts +27 -0
  284. package/themes/realestate-luxury/THEME.md +94 -0
  285. package/themes/realestate-luxury/tokens.ts +169 -0
  286. package/themes/realestate-marketplace/THEME.md +106 -0
  287. package/themes/realestate-marketplace/tokens.ts +183 -0
  288. package/themes/restaurant-modern/THEME.md +109 -0
  289. package/themes/restaurant-modern/tokens.ts +172 -0
  290. package/themes/runway-fashion/THEME.md +99 -0
  291. package/themes/runway-fashion/tokens.ts +167 -0
  292. package/themes/saturday-morning/THEME.md +117 -0
  293. package/themes/saturday-morning/tokens.ts +281 -0
  294. package/themes/schema.ts +235 -0
  295. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  296. package/themes/signal-dark/THEME.md +107 -0
  297. package/themes/signal-dark/tokens.ts +181 -0
  298. package/themes/soft-modern/THEME.md +91 -0
  299. package/themes/soft-modern/tokens.ts +166 -0
  300. package/themes/solar-residential/THEME.md +92 -0
  301. package/themes/solar-residential/tokens.ts +176 -0
  302. package/themes/sports-league/THEME.md +180 -0
  303. package/themes/sports-league/audit.log.jsonl +1 -0
  304. package/themes/sports-league/tailwind.snippet.ts +15 -0
  305. package/themes/sports-league/theme.yml +213 -0
  306. package/themes/sports-league/tokens.ts +32 -0
  307. package/themes/stadium-sport/THEME.md +114 -0
  308. package/themes/stadium-sport/tokens.ts +187 -0
  309. package/themes/streetwear-hype/THEME.md +100 -0
  310. package/themes/streetwear-hype/tokens.ts +174 -0
  311. package/themes/studio-architect/THEME.md +108 -0
  312. package/themes/studio-architect/tokens.ts +162 -0
  313. package/themes/studio-photographer/THEME.md +88 -0
  314. package/themes/studio-photographer/tokens.ts +164 -0
  315. package/themes/team-kanban/.anchor-render.png +0 -0
  316. package/themes/team-kanban/THEME.md +167 -0
  317. package/themes/team-kanban/audit.log.jsonl +2 -0
  318. package/themes/team-kanban/dismissals.jsonl +1 -0
  319. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  320. package/themes/team-kanban/theme.yml +209 -0
  321. package/themes/team-kanban/tokens.ts +35 -0
  322. package/themes/telehealth-modern/THEME.md +95 -0
  323. package/themes/telehealth-modern/tokens.ts +197 -0
  324. package/themes/tourism-board/THEME.md +111 -0
  325. package/themes/tourism-board/tokens.ts +173 -0
  326. package/themes/toys-modern/THEME.md +79 -0
  327. package/themes/toys-modern/tokens.ts +200 -0
  328. package/themes/travel-luxury/THEME.md +95 -0
  329. package/themes/travel-luxury/tokens.ts +162 -0
  330. package/themes/vacation-rental/THEME.md +105 -0
  331. package/themes/vacation-rental/tokens.ts +174 -0
  332. package/themes/vault-reel/THEME.md +134 -0
  333. package/themes/vault-reel/audit.log.jsonl +3 -0
  334. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  335. package/themes/vault-reel/theme.yml +167 -0
  336. package/themes/vault-reel/tokens.ts +30 -0
  337. package/themes/vet-modern/THEME.md +79 -0
  338. package/themes/vet-modern/tokens.ts +194 -0
  339. package/themes/web3-restraint/THEME.md +87 -0
  340. package/themes/web3-restraint/tokens.ts +154 -0
  341. package/themes/wellness-active/THEME.md +102 -0
  342. package/themes/wellness-active/tokens.ts +203 -0
  343. package/themes/wellness-spa/THEME.md +93 -0
  344. package/themes/wellness-spa/tokens.ts +173 -0
  345. package/themes/y2k-chrome/THEME.md +118 -0
  346. package/themes/y2k-chrome/tokens.ts +249 -0
  347. package/themes/yoga-studio/THEME.md +76 -0
  348. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,178 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // Note: "beauty-luxury" is not yet in the Direction["name"] enum.
4
+ // The schema is closed; until it is extended this file casts the name.
5
+ // All other fields fully validate.
6
+
7
+ export const beautyLuxury: Direction = {
8
+ name: "beauty-luxury" as Direction["name"],
9
+ ethos:
10
+ "La Mer cream-and-jade vault · Augustinus Bader clinical-restraint cream · Sisley apothecary serif · Guerlain Orchidée Impériale gilded glass · Vintner's Daughter botanical alchemy",
11
+ references: [
12
+ { brand: "La Mer", trait: "deep ocean cream jar + jade green seal + serif logotype" },
13
+ { brand: "Augustinus Bader", trait: "clinical white-on-cream + restrained navy + TFC8 minimalism" },
14
+ { brand: "Sisley Paris", trait: "old-world apothecary serif + cream + gold-leaf detailing" },
15
+ { brand: "Guerlain Orchidée Impériale", trait: "gilded glass jar + ivory + champagne gold + heritage seal" },
16
+ { brand: "Vintner's Daughter", trait: "botanical alchemy + ivory paper + sage + single-product reverence" },
17
+ ],
18
+ feel:
19
+ "Restrained luxury cosmetic. Ivory and cream surfaces hold a single SKU like a museum vitrine — " +
20
+ "champagne gold appears only on hairlines and seals, never as a fill. Italic serif tells the " +
21
+ "ingredient story; small-caps mono carries the technical lineage. The page reads like a Guerlain " +
22
+ "boutique window at dusk: ceremonial, withholding, expensive in its silence.",
23
+
24
+ fonts: {
25
+ display: {
26
+ family: "Cormorant Garamond",
27
+ fallback: ["EB Garamond", "Garamond", "Didot", "Georgia", "serif"],
28
+ from: "Sisley/Guerlain old-world apothecary serif — high-contrast, italic-first, ceremonial",
29
+ googleFont: "Cormorant+Garamond",
30
+ weights: [300, 400, 500],
31
+ },
32
+ body: {
33
+ family: "Cormorant",
34
+ fallback: ["EB Garamond", "Iowan Old Style", "Georgia", "serif"],
35
+ from: "La Mer/Vintner's Daughter body serif — luxury beauty rarely uses sans for body copy",
36
+ googleFont: "Cormorant",
37
+ weights: [400, 500],
38
+ },
39
+ mono: {
40
+ family: "JetBrains Mono",
41
+ fallback: ["Berkeley Mono", "ui-monospace", "monospace"],
42
+ from: "ingredient INCI, lot numbers, technical lineage — small-caps tracked-out instrument feel",
43
+ googleFont: "JetBrains+Mono",
44
+ weights: [400],
45
+ },
46
+ },
47
+
48
+ typography: {
49
+ headingTracking: "-0.005em", // high-contrast serif barely tightened — luxury sits near zero
50
+ bodyTracking: "0.01em",
51
+ fontFeatureSettings: '"liga", "dlig", "onum", "kern"', // old-style figures for prices, ligatures on
52
+ h1ScaleClamp: "clamp(2.25rem, 5.5vw, 4rem)",
53
+ bodyBaseSize: "1.0625rem", // 17px — slow reading column for ingredient stories
54
+ bodyLineHeight: "1.75", // generous — ceremonial pacing
55
+ },
56
+
57
+ colors: {
58
+ background: { hsl: "40 28% 95%", from: "Guerlain ivory — warm paper, slightly toasted, heritage feel" },
59
+ foreground: { hsl: "30 15% 16%", from: "Sisley deep earth ink — never pure black, holds gold accent" },
60
+ card: { hsl: "40 32% 97%", from: "lighter ivory — card lifts off the bg by half a tone, vitrine effect" },
61
+ popover: { hsl: "40 32% 97%", from: "same as card — popovers wear the lifted-ivory tone" },
62
+ primary: { hsl: "38 38% 52%", from: "Guerlain champagne gold — the canonical luxury accent, restrained" },
63
+ primaryForeground: { hsl: "40 28% 95%", from: "ivory on champagne gold — never white" },
64
+ secondary: { hsl: "40 24% 92%", from: "deeper ivory — secondary surface, one tone off bg" },
65
+ secondaryForeground: { hsl: "30 15% 16%", from: "earth ink on deeper ivory" },
66
+ muted: { hsl: "40 18% 88%", from: "stone-cream — muted backgrounds for technical-lineage zones" },
67
+ mutedForeground: { hsl: "30 10% 44%", from: "earth-gray — captions, ingredient names, lot numbers" },
68
+ accent: { hsl: "155 20% 88%", from: "La Mer jade-pale — accent tint, single-color counterpoint to gold" },
69
+ accentForeground: { hsl: "155 32% 22%", from: "deep jade on its pale tint" },
70
+ border: { hsl: "38 22% 80%", from: "warm hairline — visible on ivory, never harsh; champagne adjacent" },
71
+ input: { hsl: "38 22% 80%", from: "same as border — single hairline language" },
72
+ ring: { hsl: "38 38% 52%", from: "champagne gold, focus only — the luxury accent" },
73
+ destructive: { hsl: "8 50% 42%", from: "muted oxblood — recall/discontinued, never alarm red" },
74
+ destructiveForeground: { hsl: "40 28% 95%", from: "ivory on oxblood" },
75
+ brand: {
76
+ ivory: { hsl: "40 28% 95%", from: "= background; Guerlain heritage ivory paper" },
77
+ "ivory-deep": { hsl: "40 24% 92%", from: "secondary ivory — one tone deeper, panel surface" },
78
+ gold: { hsl: "38 38% 52%", from: "= primary; champagne gold — Guerlain Impériale seal, single luxury mark" },
79
+ "gold-deep": { hsl: "36 42% 38%", from: "darker champagne — engraved seal, hover, gradient anchor" },
80
+ jade: { hsl: "155 28% 32%", from: "La Mer deep jade — the single saturated counterpoint to gold" },
81
+ "jade-pale": { hsl: "155 20% 88%", from: "= accent; pale jade for restrained ingredient-tag tint" },
82
+ navy: { hsl: "215 35% 22%", from: "Augustinus Bader clinical navy — used once, on the lot-number block" },
83
+ ink: { hsl: "30 15% 16%", from: "= foreground; warm earth-ink, semantic for all body copy" },
84
+ },
85
+ },
86
+
87
+ spacing: {
88
+ base: 4,
89
+ scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160, 192], // sparse — luxury withholding
90
+ containerMax: "max-w-4xl", // narrow — boutique vitrine column, never splash
91
+ containerPadding: "px-6 lg:px-12",
92
+ sectionPadding: {
93
+ hero: "pt-32 pb-24 lg:pt-48 lg:pb-32",
94
+ default: "py-24 lg:py-40",
95
+ tight: "py-16 lg:py-24",
96
+ },
97
+ },
98
+
99
+ radius: {
100
+ base: "0", // sharp — La Mer, Guerlain, Sisley do not round; rounding reads app
101
+ pillsAllowed: false, // pills are app-language; tags are hairline-bounded small-caps
102
+ },
103
+
104
+ shadows: {
105
+ style: "minimal",
106
+ utilities: {
107
+ "shadow-vitrine":
108
+ "0 1px 0 hsl(38 22% 78%), 0 24px 60px hsl(30 15% 16% / 0.08)",
109
+ "shadow-gold-hairline":
110
+ "inset 0 0 0 1px hsl(38 38% 52% / 0.45)",
111
+ "shadow-quiet":
112
+ "0 1px 0 hsl(38 22% 80%)",
113
+ },
114
+ },
115
+
116
+ motion: {
117
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
118
+ durations: {
119
+ reveal: 1400, // slow — ceremonial pacing
120
+ loop: 0, // no looped motion
121
+ ambient: 28000, // single ambient ken-burns on hero product still
122
+ },
123
+ keyframes: {
124
+ "fade-rise": {
125
+ css:
126
+ "from { opacity: 0; transform: translateY(20px); }\n" +
127
+ "to { opacity: 1; transform: translateY(0); }",
128
+ defaultDuration: 1400,
129
+ iteration: "once",
130
+ purpose: "section entrance — slow, ceremonial, never abrupt",
131
+ },
132
+ "fade-in": {
133
+ css:
134
+ "from { opacity: 0; }\n" +
135
+ "to { opacity: 1; }",
136
+ defaultDuration: 1200,
137
+ iteration: "once",
138
+ purpose: "ingredient-story paragraph and product-shot entrance — opacity only",
139
+ },
140
+ "gold-sheen": {
141
+ css:
142
+ "0% { background-position: -200% 0; }\n" +
143
+ "100% { background-position: 200% 0; }",
144
+ defaultDuration: 4800,
145
+ iteration: "infinite",
146
+ purpose: "gold hairline-rule sheen on seal/monogram only — never on text, never on multiple elements",
147
+ },
148
+ },
149
+ respectsReducedMotion: true,
150
+ },
151
+
152
+ density: "low",
153
+
154
+ patterns: {
155
+ button:
156
+ "Text-link CTAs by default — earth-ink with hairline gold underline appearing on hover. " +
157
+ "Solid gold-fill is reserved for the single primary action per page (Reserve, Discover). " +
158
+ "No secondary solid buttons. No pills, no chips. Destructive is muted-oxblood text-link.",
159
+ card:
160
+ "No card chrome by default. When grouping is essential, hairline 1px gold-tinted border + " +
161
+ "ivory-deep bg + shadow-vitrine — a single vitrine per page. Internal padding p-10 lg:p-16. " +
162
+ "Title in Cormorant italic; body in Cormorant 400.",
163
+ input:
164
+ "Border-bottom only, 1px gold at 45% opacity. Ivory bg, no full box. " +
165
+ "Label sits above in small-caps mono with letter-spacing 0.28em. " +
166
+ "Focus = gold 1px underline, no glow. Placeholder italic, lowercase.",
167
+ cta:
168
+ "Primary CTA is a text-link with hairline gold underline. The single hero action per page " +
169
+ "may use a gold-fill rectangle with ivory text — once, never twice. All other actions are text-links.",
170
+ },
171
+
172
+ details: {
173
+ selectionBg: "hsl(var(--gold) / 0.22)",
174
+ selectionFg: "hsl(var(--foreground))",
175
+ focusRing: "1px solid hsl(var(--ring))",
176
+ scrollbarStyle: "thin",
177
+ },
178
+ };
@@ -0,0 +1,171 @@
1
+ # Bento-Modular — Build Brief
2
+
3
+ > The contract this theme ships with. Read at commit time by the
4
+ > brief-enforcer subagent; handed to Claude Code via the Copy-for-Claude
5
+ > button on the theme detail page.
6
+
7
+ ---
8
+
9
+ ## MANDATORY BUILD DIRECTIVE — you MUST
10
+
11
+ 1. **Hold the dark ground at `#0F0F12`** on dark canvas — cool
12
+ near-black, 240° hue bias. Tile surface `#1A1A1F`. Hover surface
13
+ `#22222A`. Never pure black. On light canvas: paper `#FAFAFA`,
14
+ tile `#FFFFFF`, hover `#F0F0F0`.
15
+ 2. **Surface luminance shift is the boundary.** Tiles have NO
16
+ borders and NO drop shadows. The boundary is the ~+3-5%
17
+ luminance step between bg and tile bg. This is the whole point
18
+ of the register.
19
+ 3. **Set tiles at `borderRadius: 12`** (12px). Never 4px, never 20px.
20
+ 12px is the Apple-iOS card radius that reads as premium-modern.
21
+ 4. **Asymmetric bento — six tiles at VARIED spans.** Use
22
+ `grid-template-columns: repeat(4, 1fr)` + `grid-auto-flow: dense`.
23
+ Tile spans are: `2×1`, `2×1`, `1×1`, `1×1`, `2×1`, `4×1`. NEVER
24
+ render 6 tiles all at the same size — that's the "Bootstrap card
25
+ grid" failure mode this theme was built to refuse.
26
+ 5. **Body font Hanken Grotesk / Inter, display font Neue Montreal.**
27
+ Mono font IBM Plex Mono ONLY for numeric metrics, CSS/code
28
+ samples, and token specimen labels. Never mono for decorative
29
+ headings.
30
+ 6. **Tabular figures** on every number in a metric tile —
31
+ `fontFeatureSettings: '"tnum"'`. Non-tabular metric numerals
32
+ break the register.
33
+
34
+ ---
35
+
36
+ ## SLOP-BLOCKLIST — you MUST NOT
37
+
38
+ - **Same-size tile grid.** If every tile has `gridColumn: span 1`
39
+ the theme has failed. Fingerprint: all tiles with identical
40
+ `gridColumn` and `gridRow` values.
41
+ - **`border: 1px solid` on tiles.** Depth is surface-luminance, not
42
+ hairlines. The ONE exception: the palette specimen's `#0F0F12`
43
+ sample swatch gets a hairline to be visible against the tile bg.
44
+ - **`boxShadow: 0 4px ...` or `shadow-md`** on tiles. Solid dropshadow
45
+ is banned. On the hover surface change from `#1A1A1F` → `#22222A`
46
+ IS the interaction.
47
+ - **Mono-caps decorative eyebrows** (`BENTO / SPECIMEN`, `THE PRODUCT`,
48
+ `CAPABILITIES`). CSS fingerprint: `textTransform: uppercase` +
49
+ `letterSpacing ≥ 0.14em` at `fontSize < 20px`. NOT permitted.
50
+ Tile inner labels use the `TileEyebrow` mono style in sentence-case
51
+ 10px letter-spacing 0.20em uppercase is banned — refactor to
52
+ sentence-case at 12px.
53
+ - **`TRUSTED BY` / `AS SEEN IN` / `COMPOSED BY TEAMS AT` wordmark
54
+ strips.** The `Composed by teams at Linear/Vercel/etc.` slop pattern
55
+ is banned.
56
+ - **Dot-metadata rows** (`ISSUE 04 · CHAPTER 03`, `EST. 2019`,
57
+ `12 MIN READ`).
58
+ - **3-pillar identical feature-card grids.** Bento IS the answer to
59
+ the 3-pillar grid; don't devolve back.
60
+ - **Purple/indigo/pink gradient backgrounds** on the bg or tiles.
61
+ The register is single-color surface + accent, no gradients.
62
+ - **Ticker bars**, cycling headline words, auto-advancing sliders.
63
+ - **Vague trust copy:** hand-crafted, thoughtfully-made, considered.
64
+ - **Roman-numeral copyright** (`MMXXVI`).
65
+ - **Attribution of influence in visible copy** — Apple, Vercel are
66
+ studied but never NAMED in slug, copy, or UI.
67
+
68
+ ---
69
+
70
+ ## CHROME INVENTORY — the allow-list
71
+
72
+ - **Sticky palette + canvas picker strip** — meta-UI, sentence-case
73
+ body font.
74
+ - **Masthead nav** — brand square (accent bg, 12px display) +
75
+ wordmark ("Facet" in Neue Montreal 600 at 17px, tracking -0.02em)
76
+ + 4 nav items (body font 14px) + accent-filled "Start free" pill
77
+ (radius 8px, accent bg + bg-color text).
78
+ - **Hero display H1** — Neue Montreal 600 at `clamp(3rem, 7vw, 6rem)`,
79
+ tracking -0.035em, one line-break, two lines max (`Six tiles.` +
80
+ `One idea each.`).
81
+ - **Asymmetric 6-tile bento** — 4-col grid at `grid-template-columns:
82
+ repeat(4, 1fr)`, gap 28px, `grid-auto-flow: dense`. Six tiles at
83
+ spans `2×1 / 2×1 / 1×1 / 1×1 / 2×1 / 4×1`.
84
+ - **Tile primitive** — `background: #1A1A1F`, `borderRadius: 12`,
85
+ `padding: 24`, `display: flex / flexDirection: column`,
86
+ `minHeight: 180`. Hover surface shifts to `#22222A`. NO border,
87
+ NO shadow.
88
+ - **Big-metric tile** — `<TileEyebrow>` in mono 10px sentence-case
89
+ color mute + display metric numeral in mono 92px tabular figures.
90
+ - **Chart-mini tile** — 8 bars, flex end-aligned, last bar in accent
91
+ color; delta below in `#30D158` (success green) mono 18px tabular.
92
+ - **Code-sample tile** — `<pre>` in IBM Plex Mono 11px
93
+ line-height 1.5, ink color, inline `<code>` for the highlighted
94
+ clause. Body inside tile uses `TileFooter` style (12px body font).
95
+ - **Full-bleed photo tile** — 2×1 or 4×1 span, `objectFit: cover`,
96
+ `borderRadius: 12`. NO caption card.
97
+ - **Palette specimen tile (4×1)** — bottom-full-width row showing
98
+ the 5 palette swatches with hex + label. The token label uses
99
+ mono 10px sentence-case (not caps).
100
+ - **Feature grid (2×2)** — 4 numbered features (`01`-`04` in mono
101
+ accent 12px), each in its own tile.
102
+ - **Testimonial + photo split** — 2-col, left column italic display
103
+ quote + attribution, right column photo tile.
104
+ - **3-tier pricing card row** — three tiles (radius 12px), middle
105
+ tier "featured" is accent-filled bg with bg-color text and
106
+ contrast CTA.
107
+ - **Bottom CTA** — center-aligned display H2 (72px) + accent-filled
108
+ button + one-line lede.
109
+ - **Footer** — 4-col grid (brand + 3 link columns), copyright line
110
+ in body 12px muted.
111
+
112
+ ---
113
+
114
+ ## SIGNATURE MOVES — verbs, not adjectives
115
+
116
+ - **Vary tile spans across the row.** Never 6 identical tiles.
117
+ Layout: `[2×1] [2×1]` / `[1×1] [1×1] [2×1]` / `[4×1]`. This is
118
+ what makes the register bento and not card-grid.
119
+ - **Shift tile background on hover from `#1A1A1F` to `#22222A`** —
120
+ 200ms ease. This is the ONLY interaction on the tile. No
121
+ translate, no shadow, no border. Surface luminance IS the feedback.
122
+ - **Set metric numerals in IBM Plex Mono at 92px with tabular
123
+ figures.** The big "6" in the hero tile IS the theme's signature.
124
+ Non-tabular figures break the alignment.
125
+ - **Use `grid-auto-flow: dense`** to pack tiles. Without it, the
126
+ asymmetric spans leave holes.
127
+ - **Accent the last bar in a mini-chart with the palette accent.**
128
+ Non-last bars in `#2F2F38` (neutral tile-mute). This is how the
129
+ mini-chart reads as "growth" without a text label.
130
+ - **Draw palette swatches as filled 20×20 squares with a 4px
131
+ radius** — matches the tile radius scaled down. Hex in mono
132
+ 11px, label in mono 9px sentence-case.
133
+
134
+ ---
135
+
136
+ ## COLOR TOKENS
137
+
138
+ **Dark canvas** — `bg: #0F0F12` / `tileBg: #1A1A1F` / `tileHoverBg:
139
+ #22222A` / `ink: #F5F5F7` / `muted: #8B8B96` / `success: #30D158`.
140
+
141
+ **Light canvas** — `bg: #FAFAFA` / `tileBg: #FFFFFF` / `tileHoverBg:
142
+ #F0F0F0` / `ink: #0F0F12` / `muted: #6E6E7A` / `success: #0E8A3E`.
143
+
144
+ **Accent** — per palette variant (10 product-brand hues; default
145
+ `electric` `#0A84FF` on dark, `#0A66D9` on light).
146
+
147
+ ---
148
+
149
+ ## TYPOGRAPHY
150
+
151
+ - **Display:** Neue Montreal (fallback Hanken Grotesk, Inter). Weight
152
+ 600, tracking -0.03em on hero, -0.02em on section H2.
153
+ - **Body:** Hanken Grotesk (fallback Inter), 15-17px, line-height
154
+ 1.5-1.55.
155
+ - **Mono:** IBM Plex Mono, 10-13px for metric numerals + code
156
+ specimens + palette hex + token labels. NEVER for decorative
157
+ section eyebrows.
158
+
159
+ ---
160
+
161
+ ## SECTION SKELETON
162
+
163
+ 1. Sticky palette + canvas picker.
164
+ 2. Masthead nav (brand + 4 items + accent CTA).
165
+ 3. Hero — asymmetric 6-tile bento (the signature move).
166
+ 4. Product hero photo — full-bleed 16:9.
167
+ 5. Feature grid (2×2 of numbered feature tiles).
168
+ 6. Testimonial + photo split.
169
+ 7. 3-tier pricing.
170
+ 8. Bottom CTA — big display + accent button.
171
+ 9. Footer.
@@ -0,0 +1,80 @@
1
+ # Bento Modular
2
+
3
+ > Asymmetric grid of self-contained tiles — mixed sizes, generous gutters, one idea per module.
4
+
5
+ **Slug:** `bento-modular` — **Surface:** web — **Density:** balanced
6
+
7
+ ## Influence
8
+
9
+ Apple iPhone product pages, Vercel dashboard, Linear /pricing, Notion inbox, Arc browser feature grids.
10
+
11
+ ## Signature move
12
+
13
+ Asymmetric grid of tiles at varied spans — a 4×4 or 6×6 conceptual grid
14
+ where individual tiles span 2×1, 2×2, 3×1, 1×2, etc. Each tile carries
15
+ ONE idea (a metric, a headline, a single product feature, a chart, a
16
+ quote). Corners are subtly rounded (12px). Gutters are generous (24-32px).
17
+ No tile has a border — the surface luminance shift IS the boundary.
18
+
19
+ ## Palette
20
+
21
+ - **bg:** `#0F0F12`
22
+ - **surface:** `#1A1A1F`
23
+ - **ink:** `#F5F5F7`
24
+ - **accent:** `#0A84FF`
25
+ - **secondary:** `#8B8B96`
26
+ - **signal:** `#30D158`
27
+
28
+ ## Typography
29
+
30
+ - **Display:** Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em
31
+ - **Body:** Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition.
32
+ - **Mono:** IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px.
33
+ - **Scale:** 1.25 (major third — controlled contrast so tiles feel varied without shouting)
34
+
35
+ ## Motion
36
+
37
+ Tile hover reveals a soft luminance lift (bg goes from #1A1A1F to
38
+ #22222A) with a 200ms ease. No card scale/translate on hover. Optional:
39
+ a single featured tile can carry ONE small motion moment (chart animating
40
+ in, number counter). Never more than one animated tile per screen.
41
+
42
+
43
+ ## Imagery
44
+
45
+ Product photography in individual tiles is fine — hero-crop style, filling
46
+ the tile. Charts and data viz can occupy their own tile. No decorative
47
+ imagery filling gutters. No background pattern behind tiles — the dark
48
+ ground is the composition.
49
+
50
+ ## Best for
51
+
52
+ - Product landing pages (Apple-style feature bentos)
53
+ - Analytics dashboards showcasing multiple metrics
54
+ - Feature-highlight pages for SaaS products
55
+ - Pitch decks — one bento per section
56
+ - Portfolio grids showing selected work at varied sizes
57
+
58
+ ## Reject if
59
+
60
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
61
+
62
+ - Uniform grid of same-size cards — that's a Bootstrap card grid, not bento
63
+ - Bordered tiles with 1px hairlines — the surface shift IS the boundary; borders read as cramped
64
+ - shadow-md or drop-shadow on tiles — kills the flat-luminance composition
65
+ - More than one animated tile per viewport — dilutes the featured moment
66
+ - Cramming tiles at consistent 240×240 sizes — negates the whole 'varied span' signature
67
+ - Rounded corners greater than 16px — bento tiles are subtly rounded (12px), not pill-shaped
68
+ - Secondary accent color beyond the one dominant hue (#0A84FF) plus optional #30D158 for success-state semantic ONLY
69
+ - Filled backgrounds inside tiles beyond the base surface color — no gradient tiles, no colored tiles
70
+ - Tile hover states beyond the luminance lift (no scale, no translate, no shadow bloom)
71
+
72
+ ## Banned defaults (inherited + theme-specific)
73
+
74
+ - claude-cream (#F4F1EA + serif + #D97757)
75
+ - void+acid (near-black bg + single bright acid-green or vermilion accent)
76
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
77
+ - tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
78
+ - uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
79
+ - bento-as-cards (same-size tiles + hairline borders + shadow-md — that's the safe SaaS card grid the bento was supposed to escape)
80
+ - shadow-bento (drop-shadows doing the layer separation instead of surface luminance — kills the composition)
@@ -0,0 +1,3 @@
1
+ {"slug":"bento-modular","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:04:02.335Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:04:02.343Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:04:28.910Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":false,"failures":[{"rule":"ANCHOR-02","severity":"block","evidence":"Accent restraint — Two accents visible simultaneously: a light/off-white 'view direction' button pill and a bright blue bar in the growth chart — no single dominant signal color like the anchor's yellow."}]},"ran_at":"2026-07-03T18:04:41.418Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T18:04:02.335Z"}
2
+ {"slug":"bento-modular","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:14:26.402Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:14:26.410Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:15:04.492Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:15:15.448Z","dismissed":[{"rule":"ANCHOR-02","severity":"block","evidence":"Accent restraint — A blue bar chart element appears in the Growth tile while the CTA button is white/off-white — no single confident accent color; the anchor uses only yellow.","dismissed":true,"dismissal":{"scope":"this_theme","reason":"Same site-chrome vs theme mismatch as kinetic-headline. Director sees the white 'view direction' button pill in the site's archetype-preview wrapper (ToolMockup CTA styling) as a second accent alongside bento-modular's #0A84FF. The bespoke BentoModularSections uses one accent (#0A84FF) consistently for chart bars, link underlines, and code-sample highlights. The site-chrome refactor (making archetype wrappers inherit palette from the theme) retires this dismissal for both themes.","dismissed_at":"2026-07-03T18:14:26.242Z"}}]}],"overall":"PASS","ran_at":"2026-07-03T18:14:26.402Z"}
3
+ {"slug":"bento-modular","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:11.196Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:11.206Z","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:11.206Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — anchor-compare skipped. Set the key to enable rubric grading."},"ran_at":"2026-07-03T22:52:14.309Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:52:11.196Z"}
@@ -0,0 +1 @@
1
+ {"finding_id":"ANCHOR-02","scope":"this_theme","reason":"Same site-chrome vs theme mismatch as kinetic-headline. Director sees the white 'view direction' button pill in the site's archetype-preview wrapper (ToolMockup CTA styling) as a second accent alongside bento-modular's #0A84FF. The bespoke BentoModularSections uses one accent (#0A84FF) consistently for chart bars, link underlines, and code-sample highlights. The site-chrome refactor (making archetype wrappers inherit palette from the theme) retires this dismissal for both themes.","dismissed_at":"2026-07-03T18:14:26.242Z","applied":false}
@@ -0,0 +1,17 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: bento-modular
3
+ export const bentoModularTailwindExtend = {
4
+ colors: {
5
+ bg: "#0F0F12",
6
+ surface: "#1A1A1F",
7
+ ink: "#F5F5F7",
8
+ accent: "#0A84FF",
9
+ secondary: "#8B8B96",
10
+ signal: "#30D158",
11
+ },
12
+ fontFamily: {
13
+ display: ["Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em"],
14
+ body: ["Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition."],
15
+ mono: ["IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px."],
16
+ },
17
+ };
@@ -0,0 +1,83 @@
1
+ # Base 31 Bento Modular — Family D, Contemporary Web.
2
+ #
3
+ # Per BESPOKE_THEME_SYSTEM.md #31: Apple-style bento grid. Mixed-size
4
+ # tiles at varied spans, each a self-contained module, one idea per tile,
5
+ # generous gutters. NOT a uniform card grid — asymmetry is the register.
6
+ #
7
+ # Theme #3 through the v2 harness. Third theme in Family D (signal-dark
8
+ # survivor as Dark Premium anchor; kinetic-headline as Base 32; this is
9
+ # Base 31). Precedent for bento authoring: team-kanban survivor.
10
+
11
+ name: Bento Modular
12
+ concept: Asymmetric grid of self-contained tiles — mixed sizes, generous gutters, one idea per module.
13
+ influence: Apple iPhone product pages, Vercel dashboard, Linear /pricing, Notion inbox, Arc browser feature grids.
14
+
15
+ family: D
16
+ base_number: 31
17
+ render_url: http://localhost:5173/themes/bento-modular
18
+
19
+ surface: web
20
+
21
+ typography:
22
+ display: Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em
23
+ body: Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition.
24
+ mono: IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px.
25
+ scale: 1.25 (major third — controlled contrast so tiles feel varied without shouting)
26
+
27
+ palette:
28
+ bg: "#0F0F12"
29
+ surface: "#1A1A1F"
30
+ ink: "#F5F5F7"
31
+ accent: "#0A84FF"
32
+ secondary: "#8B8B96"
33
+ signal: "#30D158"
34
+
35
+ density: balanced
36
+
37
+ motion: |
38
+ Tile hover reveals a soft luminance lift (bg goes from #1A1A1F to
39
+ #22222A) with a 200ms ease. No card scale/translate on hover. Optional:
40
+ a single featured tile can carry ONE small motion moment (chart animating
41
+ in, number counter). Never more than one animated tile per screen.
42
+
43
+ signature: |
44
+ Asymmetric grid of tiles at varied spans — a 4×4 or 6×6 conceptual grid
45
+ where individual tiles span 2×1, 2×2, 3×1, 1×2, etc. Each tile carries
46
+ ONE idea (a metric, a headline, a single product feature, a chart, a
47
+ quote). Corners are subtly rounded (12px). Gutters are generous (24-32px).
48
+ No tile has a border — the surface luminance shift IS the boundary.
49
+
50
+ imagery: |
51
+ Product photography in individual tiles is fine — hero-crop style, filling
52
+ the tile. Charts and data viz can occupy their own tile. No decorative
53
+ imagery filling gutters. No background pattern behind tiles — the dark
54
+ ground is the composition.
55
+
56
+ best_for:
57
+ - Product landing pages (Apple-style feature bentos)
58
+ - Analytics dashboards showcasing multiple metrics
59
+ - Feature-highlight pages for SaaS products
60
+ - Pitch decks — one bento per section
61
+ - Portfolio grids showing selected work at varied sizes
62
+
63
+ avoid:
64
+ - "Uniform grid of same-size cards — that's a Bootstrap card grid, not bento"
65
+ - "Bordered tiles with 1px hairlines — the surface shift IS the boundary; borders read as cramped"
66
+ - "shadow-md or drop-shadow on tiles — kills the flat-luminance composition"
67
+ - "More than one animated tile per viewport — dilutes the featured moment"
68
+ - "Cramming tiles at consistent 240×240 sizes — negates the whole 'varied span' signature"
69
+ - "Rounded corners greater than 16px — bento tiles are subtly rounded (12px), not pill-shaped"
70
+ - "Secondary accent color beyond the one dominant hue (#0A84FF) plus optional #30D158 for success-state semantic ONLY"
71
+ - "Filled backgrounds inside tiles beyond the base surface color — no gradient tiles, no colored tiles"
72
+ - "Tile hover states beyond the luminance lift (no scale, no translate, no shadow bloom)"
73
+
74
+ banned_defaults:
75
+ # Global blocklist from BESPOKE_THEME_SYSTEM.md
76
+ - "claude-cream (#F4F1EA + serif + #D97757)"
77
+ - "void+acid (near-black bg + single bright acid-green or vermilion accent)"
78
+ - "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
79
+ - "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
80
+ - "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
81
+ # Base-specific
82
+ - "bento-as-cards (same-size tiles + hairline borders + shadow-md — that's the safe SaaS card grid the bento was supposed to escape)"
83
+ - "shadow-bento (drop-shadows doing the layer separation instead of surface luminance — kills the composition)"
@@ -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: "bento-modular",
5
+ family: "D",
6
+ base: "31",
7
+ palette: {
8
+ "bg": "#0F0F12",
9
+ "surface": "#1A1A1F",
10
+ "ink": "#F5F5F7",
11
+ "accent": "#0A84FF",
12
+ "secondary": "#8B8B96",
13
+ "signal": "#30D158"
14
+ },
15
+ typography: {
16
+ "display": "Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em",
17
+ "body": "Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition.",
18
+ "mono": "IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px.",
19
+ "scale": "1.25 (major third — controlled contrast so tiles feel varied without shouting)"
20
+ },
21
+ surface: "web",
22
+ density: "balanced",
23
+ motion: "Tile hover reveals a soft luminance lift (bg goes from #1A1A1F to\n#22222A) with a 200ms ease. No card scale/translate on hover. Optional:\na single featured tile can carry ONE small motion moment (chart animating\nin, number counter). Never more than one animated tile per screen.\n",
24
+ signature: "Asymmetric grid of tiles at varied spans — a 4×4 or 6×6 conceptual grid\nwhere individual tiles span 2×1, 2×2, 3×1, 1×2, etc. Each tile carries\nONE idea (a metric, a headline, a single product feature, a chart, a\nquote). Corners are subtly rounded (12px). Gutters are generous (24-32px).\nNo tile has a border — the surface luminance shift IS the boundary.\n",
25
+ } as const;
26
+
27
+ export type Tokens = typeof tokens;
@@ -0,0 +1,78 @@
1
+ # Design Direction — Bookstore-Indie
2
+
3
+ ## Ethos
4
+ Strand 18 miles of books · Powell's stacked-card warmth · City Lights beat-poet pedigree · Three Lives neighborhood serif · Greenlight handwritten staff blurbs
5
+
6
+ ## Feel
7
+ Walking into a small neighborhood bookstore on a side street. Warm cream paper, generous body serif throughout, italic staff-blurbs that read like someone actually wrote them. The page is for readers, not customers — pick up the book, flip a few pages, find a hand-lettered shelf tag. Color is sparing; a single brick-red accent marks staff-picks and new arrivals.
8
+
9
+ ## Reference brands
10
+ - **Strand Bookstore** → warm cream, dense shelves, no marketing varnish.
11
+ - **Powell's City of Books** → color-coded room signage, handwritten staff blurbs.
12
+ - **City Lights** → literary-magazine serif, beat-poet austerity.
13
+ - **Three Lives & Co** → neighborhood-bookstore serif, single-window display.
14
+ - **Greenlight Bookstore** → Lora-feel body serif, staff-pick shelf as homepage.
15
+
16
+ ## Tokens
17
+ Surface stack is **paperback cream** (background) → **shelf-tag cream** (card) → **deeper cream** (secondary/muted). Hairline borders are wood-tone shelf-edges. Brand tokens: `--ink` (espresso brown), `--cream`, `--brick` (staff-pick stamp), `--sage` (event listings).
18
+
19
+ Primary is `--brick`. Reserved for staff-pick stamps, new-arrival markers, focus ring, and the single 'Buy local' CTA.
20
+
21
+ ## Typography
22
+ - **Display:** Lora (Greenlight / Three Lives book-cover serif feel). h1–h4.
23
+ - **Body:** Lora as well — same family, smaller, lighter weight. Single-family discipline is intentional: bookstores don't mix typefaces, books don't mix typefaces.
24
+ - **Mono:** JetBrains Mono. ISBNs, event times, shelf-tag numbers — receipt-tape feel.
25
+
26
+ Body 17px / 1.7. Reading is the point.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-5xl px-6 lg:px-10` — wider than editorial (room for a shelf of 6 books), narrower than cinematic.
30
+ - **Sections:** hero `pt-24 pb-14 lg:pt-36 lg:pb-20`; default `py-16 lg:py-24`; tight `py-10 lg:py-16`.
31
+ - **Scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96.
32
+
33
+ ## Color
34
+ No hex. Tokens only. Brick appears only on staff-pick stamps, hover states, focus, selection, and the buy-local CTA. Sage appears only on event listings (readings, signings) — never elsewhere.
35
+
36
+ ## Radius
37
+ `--radius: 0.125rem` — a hair of softness, the way a shelf-tag has a slightly trimmed corner. Pills disallowed.
38
+
39
+ ## Shadows
40
+ **Minimal.** Two utilities: `.hairline-bottom` and `.shelf-tag` (hairline border + hairline bottom, mimicking a tag pinned to a shelf edge).
41
+
42
+ ## Motion
43
+ Single keyframe: `fade-rise` (opacity + 16px translate, 1000ms). Page-turn pace. `prefers-reduced-motion` honored.
44
+
45
+ ## Component patterns
46
+ - **Buttons:** text-link CTAs with brick-on-hover. The single solid-fill is 'Buy local' / 'Order from us' — brick bg + cream text.
47
+ - **Cards:** hairline border, slight cream-tier shift. Padding `p-6 lg:p-8`. Title in display serif italic; author in display serif roman; staff blurb in body serif italic with a small mono attribution (`— Maya, since 2019`).
48
+ - **Inputs:** border-bottom only (1px ink).
49
+ - **CTA links:** ink → brick on hover. Never a chip.
50
+
51
+ ## Recommended rich media
52
+ Book covers — only. Each cover photographed flat against cream paper or on a wood shelf with neutral lighting. Author headshots are black-and-white, environmental (writing at a desk, not a press shot). Never lifestyle stock, never models reading, never decorative gradients.
53
+
54
+ **AI tool recommendations:** **Midjourney / Flux** for placeholder covers: *"book cover photographed flat on warm cream paper, neutral overhead lighting, slight shadow"*. Avoid AI-generated "book stack" hero images — they always have wrong proportions and uncanny text.
55
+
56
+ **Aspect ratios:** 3:4 portrait (book cover convention), 2:3 (slightly taller, also valid). Never 16:9.
57
+
58
+ **Captions:** italic body-serif, with the staff attribution. *"— Maya recommends, since 2019."*
59
+
60
+ **Avoid:** generic "person reading" stock, AI gradients, glassmorphic anything, animated GIFs.
61
+
62
+ **Accessibility:** alt-text describes the cover — *"Book cover: 'Trust' by Hernan Diaz, dark green with gold typography, paperback edition."*
63
+
64
+ ## Component families
65
+ - `StaffPick` family — book card with cover + title + author + italic blurb + signed attribution.
66
+ - `EventListing` family — date column + title + reader name + brief description.
67
+ - `BuyLocal` family — single callout with brick stamp.
68
+
69
+ ## Details
70
+ - **Selection:** `hsl(var(--primary) / 0.2)` — brick wash.
71
+ - **Focus ring:** `1px solid hsl(var(--ring))`.
72
+ - **Scrollbar:** thin.
73
+
74
+ ## Exceptions
75
+ None yet.
76
+
77
+ ## Revisions
78
+ - Initial direction.