@stylecrib/cli 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/README.md +94 -9
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +1606 -467
  25. package/package.json +12 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/THEME.md +125 -0
  38. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  39. package/themes/arc-stack/theme.yml +153 -0
  40. package/themes/arc-stack/tokens.ts +29 -0
  41. package/themes/architectural/THEME.md +102 -0
  42. package/themes/architectural/tokens.ts +159 -0
  43. package/themes/atelier-radiance/THEME.md +93 -0
  44. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  45. package/themes/atelier-radiance/theme.yml +130 -0
  46. package/themes/atelier-radiance/tokens.ts +29 -0
  47. package/themes/automotive-ev/THEME.md +87 -0
  48. package/themes/automotive-ev/tokens.ts +183 -0
  49. package/themes/automotive-luxury/THEME.md +88 -0
  50. package/themes/automotive-luxury/tokens.ts +175 -0
  51. package/themes/baby-modern/THEME.md +79 -0
  52. package/themes/baby-modern/tokens.ts +184 -0
  53. package/themes/banking-gravity/THEME.md +171 -0
  54. package/themes/banking-gravity/tokens.ts +169 -0
  55. package/themes/beauty-clean/THEME.md +92 -0
  56. package/themes/beauty-clean/tokens.ts +176 -0
  57. package/themes/beauty-luxury/THEME.md +96 -0
  58. package/themes/beauty-luxury/tokens.ts +178 -0
  59. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  60. package/themes/bento-modular/THEME.md +80 -0
  61. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  62. package/themes/bento-modular/theme.yml +83 -0
  63. package/themes/bento-modular/tokens.ts +27 -0
  64. package/themes/bookstore-indie/THEME.md +78 -0
  65. package/themes/bookstore-indie/tokens.ts +147 -0
  66. package/themes/brutalist/THEME.md +96 -0
  67. package/themes/brutalist/tokens.ts +151 -0
  68. package/themes/business-tiles/THEME.md +141 -0
  69. package/themes/business-tiles/tokens.ts +178 -0
  70. package/themes/cabana-poster/THEME.md +158 -0
  71. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  72. package/themes/cabana-poster/theme.yml +221 -0
  73. package/themes/cabana-poster/tokens.ts +34 -0
  74. package/themes/case-panel/THEME.md +126 -0
  75. package/themes/case-panel/tailwind.snippet.ts +15 -0
  76. package/themes/case-panel/theme.yml +153 -0
  77. package/themes/case-panel/tokens.ts +28 -0
  78. package/themes/cinematic-dark/THEME.md +97 -0
  79. package/themes/cinematic-dark/tokens.ts +195 -0
  80. package/themes/classic-car/THEME.md +86 -0
  81. package/themes/classic-car/tokens.ts +173 -0
  82. package/themes/cloud-friendly/THEME.md +152 -0
  83. package/themes/cloud-friendly/tokens.ts +181 -0
  84. package/themes/community-niche/THEME.md +102 -0
  85. package/themes/community-niche/tokens.ts +177 -0
  86. package/themes/corporate-grid/THEME.md +154 -0
  87. package/themes/corporate-grid/tokens.ts +182 -0
  88. package/themes/couture-luxury/THEME.md +85 -0
  89. package/themes/couture-luxury/tokens.ts +146 -0
  90. package/themes/creator-social/THEME.md +131 -0
  91. package/themes/creator-social/tokens.ts +249 -0
  92. package/themes/crypto-onchain/THEME.md +100 -0
  93. package/themes/crypto-onchain/tokens.ts +207 -0
  94. package/themes/cycling-brand/THEME.md +78 -0
  95. package/themes/cycling-brand/tokens.ts +185 -0
  96. package/themes/dating-friendly/THEME.md +102 -0
  97. package/themes/dating-friendly/tokens.ts +178 -0
  98. package/themes/dense-utility/THEME.md +85 -0
  99. package/themes/dense-utility/tokens.ts +155 -0
  100. package/themes/devtool-cli/THEME.md +100 -0
  101. package/themes/devtool-cli/tokens.ts +195 -0
  102. package/themes/devtool-docs/THEME.md +105 -0
  103. package/themes/devtool-docs/tokens.ts +177 -0
  104. package/themes/editorial/THEME.md +129 -0
  105. package/themes/editorial/tailwind.snippet.ts +15 -0
  106. package/themes/editorial/theme.yml +173 -0
  107. package/themes/editorial/tokens.ts +29 -0
  108. package/themes/education-formal/THEME.md +154 -0
  109. package/themes/education-formal/tailwind.snippet.ts +15 -0
  110. package/themes/education-formal/theme.yml +186 -0
  111. package/themes/education-formal/tokens.ts +29 -0
  112. package/themes/education-warm/THEME.md +91 -0
  113. package/themes/education-warm/tokens.ts +185 -0
  114. package/themes/ember-poster/README.md +79 -0
  115. package/themes/ember-poster/THEME.md +101 -0
  116. package/themes/ember-poster/package.json +34 -0
  117. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  118. package/themes/ember-poster/theme.yml +109 -0
  119. package/themes/ember-poster/tokens.ts +27 -0
  120. package/themes/enterprise-cloud/THEME.md +139 -0
  121. package/themes/enterprise-cloud/tokens.ts +179 -0
  122. package/themes/enterprise-tech/THEME.md +167 -0
  123. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  124. package/themes/enterprise-tech/theme.yml +202 -0
  125. package/themes/enterprise-tech/tokens.ts +29 -0
  126. package/themes/ev-charging/THEME.md +94 -0
  127. package/themes/ev-charging/tokens.ts +185 -0
  128. package/themes/farm-direct/THEME.md +92 -0
  129. package/themes/farm-direct/tokens.ts +180 -0
  130. package/themes/fintech-card/THEME.md +96 -0
  131. package/themes/fintech-card/tokens.ts +191 -0
  132. package/themes/fintech-trust/THEME.md +94 -0
  133. package/themes/fintech-trust/tokens.ts +192 -0
  134. package/themes/food-blog/THEME.md +98 -0
  135. package/themes/food-blog/tokens.ts +183 -0
  136. package/themes/forum-classic/THEME.md +100 -0
  137. package/themes/forum-classic/tokens.ts +168 -0
  138. package/themes/fresh-plate/THEME.md +144 -0
  139. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  140. package/themes/fresh-plate/theme.yml +189 -0
  141. package/themes/fresh-plate/tokens.ts +30 -0
  142. package/themes/furniture-modern/THEME.md +94 -0
  143. package/themes/furniture-modern/tokens.ts +176 -0
  144. package/themes/gaming-esports/THEME.md +146 -0
  145. package/themes/gaming-esports/tokens.ts +199 -0
  146. package/themes/gaming-streamer/THEME.md +139 -0
  147. package/themes/gaming-streamer/tokens.ts +201 -0
  148. package/themes/glassmorphic-modern/THEME.md +119 -0
  149. package/themes/glassmorphic-modern/tokens.ts +174 -0
  150. package/themes/government-civic/THEME.md +138 -0
  151. package/themes/government-civic/tokens.ts +164 -0
  152. package/themes/gym-chain/THEME.md +79 -0
  153. package/themes/gym-chain/tokens.ts +196 -0
  154. package/themes/healthcare-bright/THEME.md +95 -0
  155. package/themes/healthcare-bright/tokens.ts +184 -0
  156. package/themes/home-decor/THEME.md +94 -0
  157. package/themes/home-decor/tokens.ts +177 -0
  158. package/themes/hotel-boutique/THEME.md +110 -0
  159. package/themes/hotel-boutique/tokens.ts +179 -0
  160. package/themes/hyperminimal-mono/THEME.md +91 -0
  161. package/themes/hyperminimal-mono/tokens.ts +150 -0
  162. package/themes/indie-art-game/THEME.md +107 -0
  163. package/themes/indie-art-game/tokens.ts +216 -0
  164. package/themes/insurance-legacy/THEME.md +101 -0
  165. package/themes/insurance-legacy/tokens.ts +182 -0
  166. package/themes/insurance-modern/THEME.md +103 -0
  167. package/themes/insurance-modern/tokens.ts +192 -0
  168. package/themes/kaiju-reveal/THEME.md +97 -0
  169. package/themes/kaiju-reveal/tokens.ts +185 -0
  170. package/themes/kinetic-data/THEME.md +172 -0
  171. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  172. package/themes/kinetic-data/theme.yml +207 -0
  173. package/themes/kinetic-data/tokens.ts +30 -0
  174. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  175. package/themes/kinetic-headline/THEME.md +78 -0
  176. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  177. package/themes/kinetic-headline/theme.yml +81 -0
  178. package/themes/kinetic-headline/tokens.ts +26 -0
  179. package/themes/law-firm/THEME.md +108 -0
  180. package/themes/law-firm/tokens.ts +158 -0
  181. package/themes/lawtech-modern/THEME.md +107 -0
  182. package/themes/lawtech-modern/tokens.ts +192 -0
  183. package/themes/linkedin-pro/THEME.md +102 -0
  184. package/themes/linkedin-pro/tokens.ts +174 -0
  185. package/themes/logistics-modern/THEME.md +94 -0
  186. package/themes/logistics-modern/tokens.ts +187 -0
  187. package/themes/magazine-glossy/THEME.md +74 -0
  188. package/themes/magazine-glossy/tokens.ts +158 -0
  189. package/themes/marker-mag/THEME.md +128 -0
  190. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  191. package/themes/marker-mag/theme.yml +159 -0
  192. package/themes/marker-mag/tokens.ts +27 -0
  193. package/themes/marketplace-modern/THEME.md +135 -0
  194. package/themes/marketplace-modern/tokens.ts +186 -0
  195. package/themes/marketplace-vintage/THEME.md +110 -0
  196. package/themes/marketplace-vintage/tokens.ts +185 -0
  197. package/themes/maximalist/THEME.md +96 -0
  198. package/themes/maximalist/tokens.ts +168 -0
  199. package/themes/mid-century/THEME.md +109 -0
  200. package/themes/mid-century/tokens.ts +162 -0
  201. package/themes/motorcycle-brand/THEME.md +86 -0
  202. package/themes/motorcycle-brand/tokens.ts +174 -0
  203. package/themes/museum/THEME.md +83 -0
  204. package/themes/museum/tokens.ts +147 -0
  205. package/themes/music-streaming/THEME.md +101 -0
  206. package/themes/music-streaming/tokens.ts +187 -0
  207. package/themes/music-vinyl/THEME.md +98 -0
  208. package/themes/music-vinyl/tokens.ts +167 -0
  209. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  210. package/themes/nature-distilled/THEME.md +81 -0
  211. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  212. package/themes/nature-distilled/theme.yml +91 -0
  213. package/themes/nature-distilled/tokens.ts +26 -0
  214. package/themes/news-tabloid/THEME.md +72 -0
  215. package/themes/news-tabloid/tokens.ts +158 -0
  216. package/themes/news-tech/THEME.md +75 -0
  217. package/themes/news-tech/tokens.ts +149 -0
  218. package/themes/newsletter/THEME.md +82 -0
  219. package/themes/newsletter/tokens.ts +138 -0
  220. package/themes/newspaper-classic/THEME.md +74 -0
  221. package/themes/newspaper-classic/tokens.ts +159 -0
  222. package/themes/nonprofit-arts/THEME.md +78 -0
  223. package/themes/nonprofit-arts/tokens.ts +157 -0
  224. package/themes/nonprofit-warm/THEME.md +105 -0
  225. package/themes/nonprofit-warm/tokens.ts +188 -0
  226. package/themes/outdoor-adventure/THEME.md +113 -0
  227. package/themes/outdoor-adventure/tokens.ts +181 -0
  228. package/themes/overland-broadside/THEME.md +119 -0
  229. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  230. package/themes/overland-broadside/theme.yml +138 -0
  231. package/themes/overland-broadside/tokens.ts +27 -0
  232. package/themes/performance-engineered/THEME.md +162 -0
  233. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  234. package/themes/performance-engineered/theme.yml +193 -0
  235. package/themes/performance-engineered/tokens.ts +29 -0
  236. package/themes/pet-food/THEME.md +78 -0
  237. package/themes/pet-food/tokens.ts +185 -0
  238. package/themes/pharma-clinical/THEME.md +164 -0
  239. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  240. package/themes/pharma-clinical/theme.yml +201 -0
  241. package/themes/pharma-clinical/tokens.ts +29 -0
  242. package/themes/pill-editorial/THEME.md +125 -0
  243. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  244. package/themes/pill-editorial/theme.yml +168 -0
  245. package/themes/pill-editorial/tokens.ts +31 -0
  246. package/themes/podcast-warm/THEME.md +103 -0
  247. package/themes/podcast-warm/tokens.ts +192 -0
  248. package/themes/publisher-indie/THEME.md +78 -0
  249. package/themes/publisher-indie/tokens.ts +148 -0
  250. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  251. package/themes/raw-concrete/THEME.md +76 -0
  252. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  253. package/themes/raw-concrete/theme.yml +88 -0
  254. package/themes/raw-concrete/tokens.ts +27 -0
  255. package/themes/realestate-luxury/THEME.md +94 -0
  256. package/themes/realestate-luxury/tokens.ts +169 -0
  257. package/themes/realestate-marketplace/THEME.md +106 -0
  258. package/themes/realestate-marketplace/tokens.ts +183 -0
  259. package/themes/restaurant-modern/THEME.md +109 -0
  260. package/themes/restaurant-modern/tokens.ts +172 -0
  261. package/themes/runway-fashion/THEME.md +99 -0
  262. package/themes/runway-fashion/tokens.ts +167 -0
  263. package/themes/saturday-morning/THEME.md +117 -0
  264. package/themes/saturday-morning/tokens.ts +281 -0
  265. package/themes/schema.ts +235 -0
  266. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  267. package/themes/signal-dark/THEME.md +107 -0
  268. package/themes/signal-dark/tokens.ts +181 -0
  269. package/themes/soft-modern/THEME.md +91 -0
  270. package/themes/soft-modern/tokens.ts +166 -0
  271. package/themes/solar-residential/THEME.md +92 -0
  272. package/themes/solar-residential/tokens.ts +176 -0
  273. package/themes/sports-league/THEME.md +180 -0
  274. package/themes/sports-league/tailwind.snippet.ts +15 -0
  275. package/themes/sports-league/theme.yml +213 -0
  276. package/themes/sports-league/tokens.ts +32 -0
  277. package/themes/stadium-sport/THEME.md +114 -0
  278. package/themes/stadium-sport/tokens.ts +187 -0
  279. package/themes/streetwear-hype/THEME.md +100 -0
  280. package/themes/streetwear-hype/tokens.ts +174 -0
  281. package/themes/studio-architect/THEME.md +108 -0
  282. package/themes/studio-architect/tokens.ts +162 -0
  283. package/themes/studio-photographer/THEME.md +88 -0
  284. package/themes/studio-photographer/tokens.ts +164 -0
  285. package/themes/team-kanban/THEME.md +167 -0
  286. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  287. package/themes/team-kanban/theme.yml +209 -0
  288. package/themes/team-kanban/tokens.ts +35 -0
  289. package/themes/telehealth-modern/THEME.md +95 -0
  290. package/themes/telehealth-modern/tokens.ts +197 -0
  291. package/themes/tourism-board/THEME.md +111 -0
  292. package/themes/tourism-board/tokens.ts +173 -0
  293. package/themes/toys-modern/THEME.md +79 -0
  294. package/themes/toys-modern/tokens.ts +200 -0
  295. package/themes/travel-luxury/THEME.md +95 -0
  296. package/themes/travel-luxury/tokens.ts +162 -0
  297. package/themes/vacation-rental/THEME.md +105 -0
  298. package/themes/vacation-rental/tokens.ts +174 -0
  299. package/themes/vault-reel/THEME.md +134 -0
  300. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  301. package/themes/vault-reel/theme.yml +167 -0
  302. package/themes/vault-reel/tokens.ts +30 -0
  303. package/themes/vet-modern/THEME.md +79 -0
  304. package/themes/vet-modern/tokens.ts +194 -0
  305. package/themes/web3-restraint/THEME.md +87 -0
  306. package/themes/web3-restraint/tokens.ts +154 -0
  307. package/themes/wellness-active/THEME.md +102 -0
  308. package/themes/wellness-active/tokens.ts +203 -0
  309. package/themes/wellness-spa/THEME.md +93 -0
  310. package/themes/wellness-spa/tokens.ts +173 -0
  311. package/themes/y2k-chrome/THEME.md +118 -0
  312. package/themes/y2k-chrome/tokens.ts +249 -0
  313. package/themes/yoga-studio/THEME.md +76 -0
  314. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,183 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const realestateMarketplace: Direction = {
4
+ name: "realestate-marketplace",
5
+ ethos:
6
+ "Zillow listing-card grid · Redfin signal red · Apartments.com warm orange · Trulia friendly map · Streeteasy dense tabular",
7
+ references: [
8
+ { brand: "Zillow", trait: "deep blue brand mark + warm white + listing-card grid" },
9
+ { brand: "Redfin", trait: "signal red CTA + soft cards + structured filters" },
10
+ { brand: "Apartments.com", trait: "warm orange accent + density + photo-card volume" },
11
+ { brand: "Trulia", trait: "sand surface + friendly map UI + neighborhood scoring" },
12
+ { brand: "Streeteasy", trait: "NYC dense tabular listings + restrained chrome" },
13
+ ],
14
+ feel:
15
+ "Built for browsing two hundred listings on a Saturday. Warm white canvas, friendly geometric sans, " +
16
+ "a single signal-color CTA, and dense photo-card grids that hold up next to a half-screen map. " +
17
+ "Map and list co-exist; filters are first-class. Reads as marketplace tool, not as catalog.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Manrope",
22
+ fallback: ["Inter", "system-ui", "-apple-system", "Segoe UI", "sans-serif"],
23
+ from: "Zillow-adjacent geometric sans — friendly, confident on listing card titles",
24
+ googleFont: "Manrope",
25
+ weights: [500, 600, 700, 800],
26
+ },
27
+ body: {
28
+ family: "Inter",
29
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
30
+ from: "Redfin/Streeteasy clean sans — dense tabular comfort at small sizes",
31
+ googleFont: "Inter",
32
+ weights: [400, 500, 600, 700],
33
+ },
34
+ mono: {
35
+ family: "JetBrains Mono",
36
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
37
+ from: "tabular numerics for price/sqft/beds — listing-card spec line",
38
+ googleFont: "JetBrains+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.02em", // Manrope tightens for confident card titles
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"cv11", "ss01", "tnum"', // tabular-nums on by default for the price-grid
47
+ h1ScaleClamp: "clamp(2rem, 4.5vw, 3.25rem)", // restrained — the listings, not the H1, are the show
48
+ bodyBaseSize: "0.9375rem", // 15px — marketplace density
49
+ bodyLineHeight: "1.5",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "210 28% 99%", from: "Zillow warm white — faintly cool, marketplace canvas" },
54
+ foreground: { hsl: "215 32% 14%", from: "Zillow deep blue-ink — never pure black" },
55
+ card: { hsl: "0 0% 100%", from: "pure white listing card — lifts off the warm canvas" },
56
+ popover: { hsl: "0 0% 100%", from: "same as card — popover/menu surface" },
57
+ primary: { hsl: "215 78% 38%", from: "Zillow brand blue — primary action across filters and CTAs" },
58
+ primaryForeground: { hsl: "0 0% 100%", from: "white on Zillow blue" },
59
+ secondary: { hsl: "210 22% 95%", from: "Streeteasy cool gray panel — secondary surface for filter chrome" },
60
+ secondaryForeground: { hsl: "215 32% 18%", from: "blue-ink on cool gray" },
61
+ muted: { hsl: "210 20% 96%", from: "muted surface — table row stripes, secondary panels" },
62
+ mutedForeground: { hsl: "215 14% 42%", from: "marketplace meta — listing dateline, walkscore meta" },
63
+ accent: { hsl: "210 22% 92%", from: "hover surface — one tier under secondary, for table-row hover" },
64
+ accentForeground: { hsl: "215 32% 18%", from: "blue-ink on accent gray" },
65
+ border: { hsl: "210 16% 88%", from: "marketplace hairline — visible on white, supports the grid" },
66
+ input: { hsl: "210 16% 86%", from: "filter-input border, slightly stronger than the card border" },
67
+ ring: { hsl: "215 78% 38%", from: "= primary; focus ring is the brand blue" },
68
+ destructive: { hsl: "356 78% 48%", from: "Redfin signal red — Sold/Off-market badge tone" },
69
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on signal red" },
70
+ brand: {
71
+ "blue-zillow": { hsl: "215 78% 38%", from: "= primary; Zillow brand blue, the canonical action color" },
72
+ "blue-deep": { hsl: "215 82% 26%", from: "deeper blue — primary-hover, also map-pin selected state" },
73
+ "red-redfin": { hsl: "356 78% 48%", from: "Redfin signal red — Sold tag, urgent badges only" },
74
+ "orange-apt": { hsl: "22 92% 54%", from: "Apartments.com warm orange — New / Hot listing badge accent" },
75
+ "green-saved": { hsl: "152 56% 38%", from: "Trulia-adjacent saved/favorite confirmation green" },
76
+ "sand-warm": { hsl: "36 28% 96%", from: "Trulia warm sand — alt section background, neighborhood panels" },
77
+ "map-water": { hsl: "205 42% 86%", from: "map basemap water tone — calibrates the map UI" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 6, 8, 10, 12, 16, 20, 24, 28, 32, 40, 48, 64, 80], // high density — many steps
84
+ containerMax: "max-w-screen-2xl", // marketplace lives full-width for map+list split
85
+ containerPadding: "px-4 lg:px-6", // tighter — content is the point, not the gutter
86
+ sectionPadding: {
87
+ hero: "pt-12 pb-10 lg:pt-16 lg:pb-12",
88
+ default: "py-10 lg:py-16",
89
+ tight: "py-6 lg:py-10",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "0.5rem", // 8px — softer than utility, sharper than soft-modern
95
+ pillsAllowed: true, // filter pills, status chips, badge pills — marketplace staple
96
+ },
97
+
98
+ shadows: {
99
+ style: "soft",
100
+ utilities: {
101
+ "shadow-card":
102
+ "0 1px 2px hsl(215 32% 14% / 0.05), 0 2px 6px hsl(215 32% 14% / 0.04)",
103
+ "shadow-card-hover":
104
+ "0 2px 4px hsl(215 32% 14% / 0.06), 0 12px 24px hsl(215 32% 14% / 0.10)",
105
+ "shadow-mappin":
106
+ "0 2px 4px hsl(215 32% 14% / 0.18), 0 0 0 2px hsl(0 0% 100%)",
107
+ "shadow-filterbar":
108
+ "0 1px 0 hsl(var(--border)), 0 2px 8px hsl(215 32% 14% / 0.04)",
109
+ },
110
+ },
111
+
112
+ motion: {
113
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
114
+ durations: {
115
+ reveal: 240, // fast — marketplace must feel responsive
116
+ loop: 1600,
117
+ ambient: 12000,
118
+ },
119
+ keyframes: {
120
+ "fade-rise": {
121
+ css:
122
+ "from { opacity: 0; transform: translateY(8px); }\n" +
123
+ "to { opacity: 1; transform: translateY(0); }",
124
+ defaultDuration: 240,
125
+ iteration: "once",
126
+ purpose: "listing card / filter-result entrance — short, near-instant",
127
+ },
128
+ "card-lift": {
129
+ css:
130
+ "from { transform: translateY(0); box-shadow: 0 1px 2px hsl(215 32% 14% / 0.05); }\n" +
131
+ "to { transform: translateY(-2px); box-shadow: 0 12px 24px hsl(215 32% 14% / 0.10); }",
132
+ defaultDuration: 180,
133
+ iteration: "once",
134
+ purpose: "listing-card hover — confirms targetability on a dense grid",
135
+ },
136
+ "pin-drop": {
137
+ css:
138
+ "0% { opacity: 0; transform: translateY(-12px) scale(0.85); }\n" +
139
+ "60% { opacity: 1; transform: translateY(2px) scale(1.05); }\n" +
140
+ "100% { opacity: 1; transform: translateY(0) scale(1); }",
141
+ defaultDuration: 320,
142
+ iteration: "once",
143
+ purpose: "map pin reveal — feedback when a result lands on the map",
144
+ },
145
+ "skeleton-shimmer": {
146
+ css:
147
+ "0% { background-position: -200% 0; }\n" +
148
+ "100% { background-position: 200% 0; }",
149
+ defaultDuration: 1600,
150
+ iteration: "infinite",
151
+ purpose: "loading state on listing cards while results stream in",
152
+ },
153
+ },
154
+ respectsReducedMotion: true,
155
+ },
156
+
157
+ density: "high",
158
+
159
+ patterns: {
160
+ button:
161
+ "Solid-fill primary in --primary (Zillow blue), white text, 0.5rem radius, shadow-card. " +
162
+ "Secondary is white ghost with --border outline. Tertiary is text link in primary. " +
163
+ "Pills are allowed for filter chips and status badges (Sold/New/Open House) — pill shape is data, not chrome.",
164
+ card:
165
+ "Listing card: rounded-lg, bg-card, shadow-card, no border. Photo-first (4:3 landscape, full bleed at top). " +
166
+ "Below: price in display 700 weight, address in body, mono spec line (beds · baths · sqft). " +
167
+ "Hover applies card-lift. Internal padding p-4. " +
168
+ "Filter and panel cards use a hairline border and no shadow.",
169
+ input:
170
+ "Full rounded-lg box with 1px --input border, bg-card. Focus = 2px ring in primary at 40% opacity. " +
171
+ "Search input gets a leading icon. Label is small, sits above; helper text below in muted-foreground.",
172
+ cta:
173
+ "Solid-fill primary button is the canonical CTA. Save (heart) and Tour (calendar) buttons sit as filled-icon " +
174
+ "or icon+label variants. Sold / Off-market badges use destructive red — never as CTA, always as status.",
175
+ },
176
+
177
+ details: {
178
+ selectionBg: "hsl(var(--primary) / 0.18)",
179
+ selectionFg: "hsl(var(--foreground))",
180
+ focusRing: "2px solid hsl(var(--ring) / 0.5)",
181
+ scrollbarStyle: "thin",
182
+ },
183
+ };
@@ -0,0 +1,109 @@
1
+ # Design Direction — Restaurant-Modern
2
+
3
+ ## Ethos
4
+ Eleven Madison Park plating-as-art · Atomix NYC dark Korean fine dining · Pujol traditional Mexican warmth · Single Thread farm-to-table cream · Frantzén nordic-luxury restraint
5
+
6
+ ## Feel
7
+ A modern fine-dining restaurant site — the printed menu card translated to the web. Warm sand-cream linen canvas, deep cocoa ink, a single olive-bronze accent. Full-bleed plating photography reads as still life. EB Garamond display at oversized scale, generous breathing, JetBrains Mono for course numbers and producer credits. The page carries **reservation-required gravity** — the room exists, the chef exists, the menu changes weekly, and the booking is the conversation. Not a delivery app, not a Yelp listing.
8
+
9
+ ## Reference brands
10
+ - **Eleven Madison Park** → cream + EB Garamond serif + plating-as-art photography. The dish is a sculpture; the page is the plinth.
11
+ - **Atomix (NYC)** → dark + serif + Korean fine-dining moody intimacy. (We borrow the gravity and the typographic restraint; this direction defaults to cream canvas — see Exceptions for the dark variant.)
12
+ - **Pujol** → warm sand + traditional serif + Mexican fine-dining warmth. Earth-tone register and unbleached menu-card stock.
13
+ - **Single Thread** → cream + serif + farm-to-table imagery. Producer-credit rhythm; ingredients are named beside the dish.
14
+ - **Frantzén** → deep cream + restrained nordic-luxury. The olive-bronze accent and the intimate-room composure trace here.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
18
+
19
+ Surface stack is **warm sand-cream linen** (background) → **lifted ivory card** (card/popover) → **warm sand tiered deeper** (secondary/muted/accent). Depth comes from hairline rules at `foreground / 0.14`, never from fill differentiation. The single permitted shadow is `plating-shadow` — a diffuse drop reserved for plating photography, never UI chrome.
20
+
21
+ Brand tokens: `--linen-cream` (Pujol warm sand-cream, alias of background), `--ivory-card` (Single Thread lifted ivory, menu-card stock), `--ink-cocoa` (Eleven Madison Park deep cocoa, foreground/reduction shadow), `--olive-bronze` (Frantzén nordic-luxury accent, primary), `--ember-warm` (Pujol kitchen-ember red-brown, used sparingly on tasting-menu badges and 'Reserve' eyebrows). Primary is `32 38% 28%` — a restrained olive-bronze, never a saturated brand mark.
22
+
23
+ ## Typography
24
+ - **Display:** EB Garamond at 400/500/600, italic-friendly. Course names, dish names, chef's program. Tracking `-0.012em` — EB Garamond at restaurant-display scale wants slight negative tracking.
25
+ - **Body:** Inter at 400/500, **17px**, line-height **1.7**. Menu-card prose, comfortable for a long read; the neutral sans support type that lets the serif and the food carry.
26
+ - **Mono:** JetBrains Mono at 400. Used **only small** — course numbers (01/12 or Roman I, II, III), producer credits, allergen labels, year-and-vintage notes. Never display, never body.
27
+
28
+ Hierarchy is pair-driven: EB Garamond display + Inter body, with tracked-uppercase Inter small caps (letter-spacing 0.12em) for eyebrows ('THE MENU', 'THE ROOM', 'RESERVE'). H1 uses `clamp(2.75rem, 7vw, 6rem)` — dining-room hero scale. Font features: `"liga", "dlig", "onum", "kern"` — discretionary ligatures earn their place in serif-italic dish names.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-5xl px-6 lg:px-12` — 1024px. Plating photography reads at this width without becoming a magazine spread.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-28 pb-20 lg:pt-44 lg:pb-32` (dining-room hero scale)
34
+ - Default: `py-20 lg:py-32`
35
+ - Tight: `py-14 lg:py-20`
36
+ - **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128 160. The high end (96/128/160) is intentional — restaurant pacing, the next course doesn't arrive immediately.
37
+
38
+ ## Color
39
+ No hex anywhere. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. White and pure black are forbidden — `--linen-cream` (`34 26% 92%`) and `--ink-cocoa` (`24 22% 14%`) replace them.
40
+
41
+ The palette is restraint and earth:
42
+ - **Linen-cream** — Pujol warm sand-cream linen, the page surface.
43
+ - **Ivory-card** — Single Thread lifted ivory, menu-card and dish-card stock.
44
+ - **Ink-cocoa** — Eleven Madison Park deep cocoa, the foreground and the reduction-shadow base color.
45
+ - **Olive-bronze** — Frantzén restrained nordic accent, primary action.
46
+ - **Ember-warm** — Pujol kitchen-ember red-brown, used **sparingly** on tasting-menu badges, 'Reserve' eyebrows, and the single ember-pulse marker.
47
+
48
+ Saturation never exceeds what would read on an unbleached printed menu card under candlelight. The plating photography carries the color — the chrome stays neutral.
49
+
50
+ ## Radius
51
+ `--radius: 0`. **Sharp corners only.** Pills are disallowed (`pillsAllowed: false`) — pills read consumer/delivery app, not restaurant. The printed menu card is the precedent: rectangles, hairlines, generous margins.
52
+
53
+ ## Shadows
54
+ **Minimal.** Two utilities:
55
+ - `.menu-rule` — `0 1px 0 0 hsl(var(--foreground) / 0.14)`. The printed-menu divider between courses.
56
+ - `.plating-shadow` — `0 24px 64px -28px hsl(var(--foreground) / 0.28)`. **Plating photography only**, never UI chrome. A diffuse drop that lifts the dish off the page, like a still-life print on linen.
57
+
58
+ No glows. No floating cards. Buttons never carry shadow.
59
+
60
+ ## Motion
61
+ Three keyframes:
62
+ - **`course-rise`** — opacity + 20px translate, **1200ms**. The standard entrance for menu cards, dish photography, and chef's-program copy. The course is set down, not flung.
63
+ - **`ember-pulse`** — opacity `0.85 → 1 → 0.85`, **4000ms**, infinite. A soft heartbeat on the single 'Reserve' ember-warm dot — the room is open. Never on more than one element per page.
64
+ - **`plate-ken-burns`** — `scale(1.0) → scale(1.06)`, **32000ms**, infinite. Slow zoom on hero plating photography — restaurant-program presence, the still life almost imperceptibly breathing.
65
+
66
+ No marquee, no parallax, no chip-bounce. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `ember-pulse` and `plate-ken-burns` are disabled entirely under reduced motion; `course-rise` collapses to instantaneous final-state.
67
+
68
+ ## Component patterns
69
+ - **Buttons:** the default primary CTA is a **serif italic text-link in olive-bronze**, underline always visible — the heritage menu-card convention. The solid button is reserved for **one 'Reserve' hero CTA per page** — ink-cocoa bg + linen-cream text, sharp rectangle, no radius. Never a chip, never a gradient, never a shadow on a button. Reservation gravity comes from typography, not from button weight.
70
+ - **Cards (course/dish):** hairline top + hairline bottom rule at `foreground / 0.14`, **ivory-card bg** (one tier above the linen page), no fill-differentiation depth. Course number in JetBrains Mono small-caps (I, II, III or 01/12), dish name in **EB Garamond italic display**, producer credits in a mono row beneath. Internal padding `p-8 lg:p-12`. Plating photography sits flush above the card with a single `.plating-shadow` drop.
71
+ - **Inputs:** reservation form — border-bottom only (1px `--border`). No full box. Label above in tracked-uppercase Inter small caps (letter-spacing 0.12em). Placeholder in muted-foreground italic serif. Focus is olive-bronze ring, 1px.
72
+ - **CTAs:** default CTA is serif italic text-link in olive-bronze with always-visible underline. The single 'Reserve' hero CTA is the one solid-fill exception — ink-cocoa bg, linen-cream text, optional `.ember-pulse` heartbeat marker beside it. Never repeated, never duplicated in the page footer.
73
+
74
+ ## Recommended rich media
75
+
76
+ The page is led by **plating-as-art photography** — a single dish, shot from directly above or three-quarter, on a textured ceramic plate against a dark linen or stone-slab surface. Natural light, often window-side or candlelight, never softbox-flat. Eleven Madison Park / Single Thread / Frantzén still-life register.
77
+
78
+ **AI tool recommendations.**
79
+ - **Midjourney / Flux** — *"Eleven Madison Park plating photograph, single course on textured ceramic, dark linen surface, natural window light, Hasselblad medium-format, restrained warm color"*; for dining-room shots, *"intimate fine-dining room interior, candlelight, blurred figures in middle distance, Annie Leibovitz lighting, 35mm film"*; for ingredient close-ups, *"farm-to-table producer-credit still life, single ingredient on linen, raking afternoon light, Kodak Portra 400"*.
80
+ - **Avoid Midjourney's default food register** — it tends toward Instagram glossy. Always prompt for film grain, natural light, and a single subject.
81
+ - **Real photography beats AI** for restaurants more than almost any vertical. If a chef-photographer collaboration is possible, use it.
82
+
83
+ **Aspect ratios.** **1:1 square** for individual plating shots (the dish is a sculpture, the frame is a plinth), **4:5 portrait** for dining-room and chef portraits, **16:9** for the singular room-establishing hero. Never 3:2 casual.
84
+
85
+ **Color in imagery.** Warm-cool balance, restrained saturation. Plating colors live in their natural register — green herbs, brown stocks, white ceramics, dark linens — never saturated brand-mark color. Black-and-white kitchen-portraiture is welcome for chef bios.
86
+
87
+ **Video.** Used sparingly — a single 30s kitchen-prep loop or a static long-take of a dish being plated. Never autoplay with sound. Never UI demo footage. Never delivery-app-style flythroughs. ≤8 MB AV1 or H.265.
88
+
89
+ **Captions are mandatory.** Course number, dish name, key ingredients, producer credits, allergens — in JetBrains Mono small caps. *"I · Sunchoke · Black Truffle, Cured Egg Yolk · Coke Farm, Aromas, CA · contains: egg, dairy"* style attribution always.
90
+
91
+ **Performance.** Hero plating image ≤180 KB AVIF at 1600w; dish-card photography ≤90 KB each. LCP under 2.5s — if it slips, the plating photograph is too large, not the framework.
92
+
93
+ **Avoid.** Stock food photography (always reads wrong for fine dining). Yelp-energy interior shots. Delivery-app dish tiles. Branded plate decals. AI-glossy "perfect" food (uncanny). Lens flare. Gradient menus. Pop-up promotional banners. Anything that reads more **Grubhub than Le Bernardin**.
94
+
95
+ **Accessibility.** Long-form alt-text — describe the dish, plate, surface, lighting as if for a blind reader. *"A single sunchoke roasted to a deep amber and dressed with shaved black truffle, set on a hand-thrown grey ceramic plate against a dark linen surface in late afternoon window light."* The bar is restaurant editorial.
96
+
97
+ ## Component families
98
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they are established.
99
+
100
+ ## Details
101
+ - **Selection:** `hsl(var(--primary) / 0.20)` background, foreground text — olive-bronze highlight on linen cream.
102
+ - **Focus ring:** `1px solid hsl(var(--ring))`. Thin and quiet — restaurant precision, never decorative.
103
+ - **Scrollbar:** thin.
104
+
105
+ ## Exceptions
106
+ None yet. **A dark Atomix-register variant** (cocoa-ink background, linen-cream foreground, same olive-bronze accent) is anticipated for restaurants whose room is intentionally moody — it lives as a future direction-mode, not as a within-direction toggle. When an intentional one-of-one violation lands, add it here with the reason.
107
+
108
+ ## Revisions
109
+ - Initial direction, generated at install time.
@@ -0,0 +1,172 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const restaurantModern: Direction = {
4
+ name: "restaurant-modern",
5
+ ethos:
6
+ "Eleven Madison Park plating-as-art · Atomix NYC dark Korean fine dining · Pujol traditional Mexican warmth · Single Thread farm-to-table cream · Frantzén nordic-luxury restraint",
7
+ references: [
8
+ { brand: "Eleven Madison Park", trait: "cream + EB Garamond + plating-as-art photography" },
9
+ { brand: "Atomix (NYC)", trait: "dark + serif + Korean fine-dining moody intimacy" },
10
+ { brand: "Pujol", trait: "warm sand + traditional serif + Mexican fine-dining warmth" },
11
+ { brand: "Single Thread", trait: "cream + serif + farm-to-table imagery" },
12
+ { brand: "Frantzén", trait: "deep cream + restrained nordic-luxury, intimate room" },
13
+ ],
14
+ feel:
15
+ "Modern fine-dining restaurant site. Warm sand-cream canvas with deep cocoa ink " +
16
+ "and one olive-bronze accent. Full-bleed plating photography reads as still life. " +
17
+ "EB Garamond display at oversized scale, generous breathing, mono captions for " +
18
+ "course and producer credits. The page carries reservation-required gravity — " +
19
+ "the room exists, the chef exists, the booking is the conversation.",
20
+
21
+ fonts: {
22
+ display: {
23
+ family: "EB Garamond",
24
+ fallback: ["Cormorant Garamond", "Iowan Old Style", "Garamond", "Georgia", "serif"],
25
+ from: "EB Garamond — Eleven Madison Park / Single Thread restaurant-serif register; italic-friendly for course names",
26
+ googleFont: "EB+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500",
27
+ weights: [400, 500, 600],
28
+ },
29
+ body: {
30
+ family: "Inter",
31
+ fallback: ["Söhne", "Neue Haas Grotesk", "system-ui", "-apple-system", "sans-serif"],
32
+ from: "Inter — the neutral sans body; Pujol/Atomix support type, lets the serif and the food carry",
33
+ googleFont: "Inter:wght@400;500",
34
+ weights: [400, 500],
35
+ },
36
+ mono: {
37
+ family: "JetBrains Mono",
38
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
39
+ from: "JetBrains Mono — course numbers (I, II, III also acceptable), producer credits, allergen labels, small only",
40
+ googleFont: "JetBrains+Mono:wght@400",
41
+ weights: [400],
42
+ },
43
+ },
44
+
45
+ typography: {
46
+ headingTracking: "-0.012em", // EB Garamond at restaurant-display scale — slight negative tracking
47
+ bodyTracking: "0", // Inter body — neutral, lets the serif lead
48
+ fontFeatureSettings: '"liga", "dlig", "onum", "kern"',
49
+ h1ScaleClamp: "clamp(2.75rem, 7vw, 6rem)", // dining-room hero scale, Single Thread / EMP register
50
+ bodyBaseSize: "1.0625rem", // 17px — menu-card prose, comfortable for a long read
51
+ bodyLineHeight: "1.7", // generous, restaurant-program pacing
52
+ },
53
+
54
+ colors: {
55
+ background: { hsl: "34 26% 92%", from: "Pujol warm sand-cream — restaurant linen and unbleached menu card" },
56
+ foreground: { hsl: "24 22% 14%", from: "Eleven Madison Park deep cocoa ink — slate-stone reduction shadow" },
57
+ card: { hsl: "34 30% 96%", from: "Single Thread lifted ivory — one tier brighter than the linen page" },
58
+ popover: { hsl: "34 30% 96%", from: "same as card; depth from hairline only" },
59
+ primary: { hsl: "32 38% 28%", from: "Frantzén olive-bronze — restrained nordic-luxury accent, used for primary action and dish-card eyebrows" },
60
+ primaryForeground: { hsl: "34 26% 92%", from: "warm sand-cream on olive-bronze primary" },
61
+ secondary: { hsl: "34 22% 88%", from: "Pujol warm sand, one tier deeper — printed-menu second-tone" },
62
+ secondaryForeground: { hsl: "24 22% 14%", from: "cocoa ink on warm sand" },
63
+ muted: { hsl: "34 22% 88%", from: "same as secondary — differentiation by usage, not color" },
64
+ mutedForeground: { hsl: "24 14% 38%", from: "Atomix muted slate ink — course descriptions and small print" },
65
+ accent: { hsl: "34 24% 84%", from: "warm sand, deepest tier — hover surface only" },
66
+ accentForeground: { hsl: "24 22% 14%", from: "cocoa ink on warm sand accent" },
67
+ border: { hsl: "24 14% 76%", from: "restaurant menu hairline rule — printed-card divider weight, barely visible" },
68
+ input: { hsl: "24 14% 76%", from: "same as border — reservation form is hairlines, not boxes" },
69
+ ring: { hsl: "32 38% 28%", from: "primary olive-bronze — focus ring, the one accent moment" },
70
+ destructive: { hsl: "8 58% 38%", from: "wine-red alert — burgundy, dining-program register, never screaming red" },
71
+ destructiveForeground: { hsl: "34 26% 92%", from: "warm sand on wine-red" },
72
+ brand: {
73
+ "linen-cream": { hsl: "34 26% 92%", from: "Pujol warm sand-cream — alias of the background, the linen" },
74
+ "ivory-card": { hsl: "34 30% 96%", from: "Single Thread lifted ivory — menu-card and dish-card stock" },
75
+ "ink-cocoa": { hsl: "24 22% 14%", from: "Eleven Madison Park deep cocoa — foreground, reduction shadow" },
76
+ "olive-bronze": { hsl: "32 38% 28%", from: "Frantzén olive-bronze — primary accent" },
77
+ "ember-warm": { hsl: "18 48% 48%", from: "Pujol kitchen-ember red-brown — used sparingly on tasting-menu badges and 'Reserve' eyebrows" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160], // generous, dining-room pacing
84
+ containerMax: "max-w-5xl", // 1024px — plating photography reads at this width without becoming a magazine spread
85
+ containerPadding: "px-6 lg:px-12",
86
+ sectionPadding: {
87
+ hero: "pt-28 pb-20 lg:pt-44 lg:pb-32",
88
+ default: "py-20 lg:py-32",
89
+ tight: "py-14 lg:py-20",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "0", // printed-menu convention — sharp corners, no consumer softness
95
+ pillsAllowed: false, // no chip pills; "Reserve" is a text-link, not a pill
96
+ },
97
+
98
+ shadows: {
99
+ style: "minimal",
100
+ utilities: {
101
+ "menu-rule":
102
+ "0 1px 0 0 hsl(var(--foreground) / 0.14)", // 1px printed-menu divider between courses
103
+ "plating-shadow":
104
+ "0 24px 64px -28px hsl(var(--foreground) / 0.28)", // one diffuse drop, plating-photo elevation, never on UI chrome
105
+ },
106
+ },
107
+
108
+ motion: {
109
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
110
+ durations: {
111
+ reveal: 1200, // restaurant pacing — the course is served
112
+ loop: 4000,
113
+ ambient: 32000,
114
+ },
115
+ keyframes: {
116
+ "course-rise": {
117
+ css:
118
+ "from { opacity: 0; transform: translateY(20px); }\n" +
119
+ "to { opacity: 1; transform: translateY(0); }",
120
+ defaultDuration: 1200,
121
+ iteration: "once",
122
+ purpose:
123
+ "the standard entrance — 1.2s reveal for menu cards, dish photography, and chef's-program copy. The course is set down, not flung.",
124
+ },
125
+ "ember-pulse": {
126
+ css:
127
+ "0%, 100% { opacity: 0.85; }\n" +
128
+ "50% { opacity: 1; }",
129
+ defaultDuration: 4000,
130
+ iteration: "infinite",
131
+ purpose:
132
+ "4s soft pulse on the single 'Reserve' eyebrow ember-warm dot — a heartbeat marker, the room is open. Never on more than one element per page.",
133
+ },
134
+ "plate-ken-burns": {
135
+ css:
136
+ "from { transform: scale(1.0); }\n" +
137
+ "to { transform: scale(1.06); }",
138
+ defaultDuration: 32000,
139
+ iteration: "infinite",
140
+ purpose:
141
+ "32s slow zoom on hero plating photography — restaurant-program presence, the still life almost imperceptibly breathing.",
142
+ },
143
+ },
144
+ respectsReducedMotion: true,
145
+ },
146
+
147
+ density: "low",
148
+
149
+ patterns: {
150
+ button:
151
+ "Primary CTA is a serif italic text-link in olive-bronze (--primary), underline always visible — heritage menu-card convention. " +
152
+ "The solid button is reserved for ONE 'Reserve' hero CTA per page — ink-cocoa bg + linen-cream text, sharp rectangle, no radius. " +
153
+ "Never a chip, never a gradient, never a shadow on a button. Reservation gravity comes from typography, not from button weight.",
154
+ card:
155
+ "Course/dish cards: hairline top + hairline bottom rule at foreground/14, ivory-card bg (one tier above page), no fill-differentiation depth. " +
156
+ "Course number in JetBrains Mono small-caps (I, II, III or 01/12), dish name in EB Garamond italic display, producer credits in mono row beneath. " +
157
+ "Internal padding p-8 lg:p-12. Plating photography sits flush above the card with a single plating-shadow drop.",
158
+ input:
159
+ "Reservation form: border-bottom only (1px --border). No full box. Label above in tracked-uppercase Inter small caps (letter-spacing 0.12em). " +
160
+ "Placeholder in muted-foreground italic serif. Focus is olive-bronze ring, 1px.",
161
+ cta:
162
+ "Default CTA is serif italic text-link in olive-bronze with always-visible underline. " +
163
+ "The single 'Reserve' hero CTA is the one solid-fill exception — ink-cocoa bg, linen-cream text, optional ember-pulse heartbeat marker beside it. Never repeated.",
164
+ },
165
+
166
+ details: {
167
+ selectionBg: "hsl(var(--primary) / 0.20)",
168
+ selectionFg: "hsl(var(--foreground))",
169
+ focusRing: "1px solid hsl(var(--ring))",
170
+ scrollbarStyle: "thin",
171
+ },
172
+ };
@@ -0,0 +1,99 @@
1
+ # Design Direction — Runway-Fashion
2
+
3
+ ## Ethos
4
+ Chanel high-contrast b/w · Vogue runway photography · Saint Laurent disciplined restraint · Comme des Garçons asymmetric type · Helmut Newton drama
5
+
6
+ ## Feel
7
+ Binary pure-black-on-pure-white (or inverted). Oversized Didone serif at editorial scale — the hero is the type, set Vogue-cover large in italic Playfair. A single tiny couture-red accent is permitted, used once per page. Couture severity: this direction rejects color. The opposite of soft-modern.
8
+
9
+ ## Reference brands
10
+ - **Chanel** → binary black-and-white. No color, no warmth. Oversized display serif laid over runway photography.
11
+ - **Vogue** → issue typography. Italic Playfair at cover scale; fashion-plate restraint in the layout grid.
12
+ - **Saint Laurent** → disciplined minimalism. ALL-CAPS sparse-tracked wordmark; geometric severity.
13
+ - **Comme des Garçons** → Rei Kawakubo asymmetric layouts. Deliberate "wrong" type — the negative space is the composition.
14
+ - **Helmut Newton** → high-drama runway photography. Deep shadows, Tri-X 35mm grain, single subject.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
18
+
19
+ Surface stack is **pure white** (background, card, popover, secondary). There is no surface differentiation — depth comes from **whitespace and 1px black rules**, never from fill tiers, never from shadows.
20
+
21
+ Brand tokens: `--couture-red` (Chanel lipstick — the SINGLE red accent, used **once per page maximum, never twice**), `--ivory` (barely-off-white for masthead layering), `--noir` (deep ink for layered black-on-black overlays on runway photography). Primary is `0 0% 0%` — black is the primary; the couture-red is reserved for one moment.
22
+
23
+ ## Typography
24
+ - **Display:** Playfair Display (Bodoni Moda as fallback). Italic prominent. The Didone-style high-contrast serif is the design — set at Vogue-cover scale.
25
+ - **Body:** Inter, **16px**, line-height **1.5**. Clean sans so the serif is the hero; body never competes.
26
+ - **Mono:** JetBrains Mono. Tiny — issue numbers, "Vol 47 / Spring", credit lines. Never for body, never for headings.
27
+
28
+ Hero h1 uses `clamp(4rem, 10vw, 9rem)` — Vogue-cover scale, italic Playfair. Tracking is `-0.02em` on headings (Didone at this scale needs the optical tighten), `0` on body. Font features: `"kern", "liga", "dlig", "tnum"` — discretionary ligatures unlock italic Playfair's swash forms.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-6xl px-6 lg:px-12` — Vogue cover proportions, 1152px.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-32 pb-24 lg:pt-48 lg:pb-32` (cover-of-the-issue scale)
34
+ - Default: `py-24 lg:py-32`
35
+ - Tight: `py-12 lg:py-16`
36
+ - **Allowed scale values:** **4 8 12 16 24 32 48 64 96 128 160**. Couture-generous; low density wants more air.
37
+
38
+ ## Color
39
+ No hex anywhere. **Pure black (`0 0% 0%`) and pure white (`0 0% 100%`) are the language** — the Chanel binary. The single `--couture-red` (`0 100% 45%`) is the Chanel lipstick and the only allowed third color. Use it **once per page**: one primary CTA, or one rule, or one inline mark. Never twice. Never as a card border, never as a heading color, never in imagery.
40
+
41
+ `--muted` and `--accent` (`0 0% 98%`) are Vogue ivory — barely-off-white for masthead/credit layering. `--muted-foreground` (`0 0% 40%`) is the Helmut Newton mid-tone, used only for caption gray. There are no other grays.
42
+
43
+ This direction **rejects** warmth (no paper-cream, no Kodak Portra), gradients, glassmorphism, decorative ornament. Austerity is the direction.
44
+
45
+ ## Radius
46
+ `--radius: 0`. **Sharp couture corners only.** Pills are disallowed (`pillsAllowed: false`) — pills are anti-couture. Chanel and Saint Laurent never rounded a corner.
47
+
48
+ ## Shadows
49
+ **None.** The shadow utilities object is intentionally empty. Drops are forbidden; composition does the work. Separation comes from oversized whitespace and 1px black rules.
50
+
51
+ ## Motion
52
+ Runway-walk pacing — deliberate, never hurried.
53
+
54
+ - `runway-step` — **600ms** opacity-only fade between hero slides. The model walks; the page does not.
55
+ - `cover-flip` — **300ms** 8px translate for cover-of-the-issue reveals. Used sparingly, once per page maximum.
56
+
57
+ No marquee, no parallax, no ambient loops (`loop: 0`, `ambient: 0`). Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored.
58
+
59
+ ## Component patterns
60
+ - **Buttons:** two states, no middle ground.
61
+ - Primary text-link = ALL CAPS, sparse-tracked (`letter-spacing: 0.2em`), text-underline, black on white — the Saint Laurent wordmark move.
62
+ - Primary filled = oversized "SHOP" rectangle in pure black with white text, ALL CAPS, sparse-tracked.
63
+ - The `--couture-red` filled rectangle is reserved for **one primary action per page** — never repeated. No ghost mid-state, no hover lift, no rounded corners.
64
+ - **Cards:** no card chrome. Editorial blocks sit directly on the page, separated by oversized whitespace. When grouping is required, a single 1px black rule above. No fill, no shadow, no rounded corners. Titles in italic Playfair at Vogue-cover scale; body in 16px Inter.
65
+ - **Inputs:** 1px black border, sharp corners, white background. Label above in ALL CAPS sparse-tracked mono. Focus = 1px inset black ring, no glow. Placeholder italic Playfair, lowercase — the one place italic is permitted in chrome.
66
+ - **CTAs:** the default CTA is the Saint Laurent ALL-CAPS sparse-tracked text-underline link. The couture-red filled rectangle is the **one** Chanel-lipstick moment per page. There is no second.
67
+
68
+ ## Recommended rich media
69
+
70
+ **Cover.** Editorial fashion photography in the Helmut Newton high-drama tradition — model walking, single subject, deep shadows, Tri-X 35mm grain. Runway documentation (model in motion) or product detail shots on white seamless. Pure b/w grading **only**, or muted desaturated color if absolutely necessary. The hero is sometimes the type alone — italic Playfair at clamp(4rem, 10vw, 9rem) needs no image.
71
+
72
+ **AI tool recommendations.**
73
+ - **Midjourney** for runway/editorial photography — prompts like *"Vogue runway photography, Helmut Newton lighting, model walking, high contrast black and white, 35mm Tri-X film grain, deep shadows"*.
74
+ - **Recraft** for fashion-plate illustration in the Erté tradition — single-line couture figures, black on white.
75
+ - **Or use type alone** — italic Playfair at Vogue-cover scale carries the page without an image. This is often the right answer.
76
+
77
+ **Aspect ratios.** 4:5 portrait (couture-magazine standard) — primary. 3:2 landscape — occasional, for runway documentation. Never 16:9 (cinematic, off-feel). Never 1:1 (Instagram aesthetic).
78
+
79
+ **Color in imagery.** Black and white **only**, or heavily desaturated. The `--couture-red` appears in UI chrome — **never in imagery**.
80
+
81
+ **What to avoid.** Warm color grading (that's mid-century territory). Gradients. Glassmorphism. Decorative ornament. AI-photorealistic gloss. 3D renders. Lens flare. Stock photography with smiling models. Color-saturated runway shots — desaturate or grade to pure b/w.
82
+
83
+ **Honest constraint.** Austerity is the direction. If you are reaching for an image to fill space, the layout is the problem — set the type larger.
84
+
85
+ **Accessibility.** Long-form alt-text — describe the photograph as if for a blind reader. Italic Playfair at hero scale needs `aria-level` correctness; do not let display-size override semantic hierarchy.
86
+
87
+ ## Component families
88
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they are established. If a family ever calls for color beyond `--couture-red`, the rule is broken — escalate before adding.
89
+
90
+ ## Details
91
+ - **Selection:** `hsl(var(--foreground))` background, `hsl(var(--background))` text — pure couture inversion.
92
+ - **Focus ring:** `1px solid hsl(var(--ring))` (black). No offset, no glow.
93
+ - **Scrollbar:** thin — a single black rule, the one chrome detail allowed.
94
+
95
+ ## Exceptions
96
+ 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.
97
+
98
+ ## Revisions
99
+ - Initial direction, generated at install time.