@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,169 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const realestateLuxury: Direction = {
4
+ name: "realestate-luxury",
5
+ ethos:
6
+ "Sotheby's cream listing-book · Compass deep navy · Modern House serif · The Agency cinematic listings · 1stDibs editorial luxury",
7
+ references: [
8
+ { brand: "Sotheby's Realty", trait: "cream paper + Cormorant serif + listing-as-portrait photography" },
9
+ { brand: "Compass", trait: "deep navy mark + clean sans + structured global search" },
10
+ { brand: "Modern House (London)", trait: "cream + serif + architectural full-bleed photography" },
11
+ { brand: "The Agency", trait: "deep cream + restrained nav + cinematic listing reels" },
12
+ { brand: "1stDibs Estate", trait: "warm cream + editorial serif + curated provenance copy" },
13
+ ],
14
+ feel:
15
+ "Eight-figure listing book in browser form. Deep cream backgrounds carry full-bleed property cinematography, " +
16
+ "high-contrast serif headlines name the address, and a single deep navy or burgundy accent does all the " +
17
+ "interaction work. Reads as bound real estate catalog, not as marketplace search.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Cormorant Garamond",
22
+ fallback: ["Cormorant", "EB Garamond", "Garamond", "Didot", "Georgia", "serif"],
23
+ from: "Sotheby's listing-book serif — high-contrast Garalde with a 1stDibs catalog feel",
24
+ googleFont: "Cormorant+Garamond",
25
+ weights: [400, 500, 600],
26
+ },
27
+ body: {
28
+ family: "Inter",
29
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "sans-serif"],
30
+ from: "Compass clean sans — neutral body that lets the serif and photography lead",
31
+ googleFont: "Inter",
32
+ weights: [400, 500, 600],
33
+ },
34
+ mono: {
35
+ family: "JetBrains Mono",
36
+ fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
37
+ from: "tabular numerics for price, lot size, sqft — instrument-feel for the spec table",
38
+ googleFont: "JetBrains+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.012em", // Cormorant tightens slightly — display Garalde wants near-zero, just shy
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"liga", "dlig", "tnum", "ss01"',
47
+ h1ScaleClamp: "clamp(2.75rem, 7vw, 6rem)", // address-as-title scale — the headline IS the listing
48
+ bodyBaseSize: "1.0625rem", // 17px — catalog comfort
49
+ bodyLineHeight: "1.65",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "38 32% 94%", from: "Sotheby's deep cream — the listing-book paper, never white" },
54
+ foreground: { hsl: "215 38% 14%", from: "Compass deep navy-ink — heading + body, never pure black" },
55
+ card: { hsl: "38 28% 97%", from: "lifted cream — listing card surface, one tone above paper" },
56
+ popover: { hsl: "38 28% 97%", from: "same family as card — depth via hairline, not fill" },
57
+ primary: { hsl: "215 48% 22%", from: "Compass deep navy — the canonical action color across the listing book" },
58
+ primaryForeground: { hsl: "38 32% 94%", from: "cream on deep navy" },
59
+ secondary: { hsl: "38 22% 88%", from: "deeper cream tier — secondary panels and quiet surfaces" },
60
+ secondaryForeground: { hsl: "215 38% 14%", from: "navy-ink on deeper cream" },
61
+ muted: { hsl: "38 18% 86%", from: "muted cream — listing meta strips, dateline backgrounds" },
62
+ mutedForeground: { hsl: "215 18% 36%", from: "Modern House soft navy — secondary copy on cream" },
63
+ accent: { hsl: "38 24% 90%", from: "hover cream — one tier under secondary" },
64
+ accentForeground: { hsl: "215 38% 14%", from: "navy-ink on accent cream" },
65
+ border: { hsl: "38 18% 78%", from: "warm hairline — visible on cream but never assertive" },
66
+ input: { hsl: "38 18% 78%", from: "same as border — single hairline language" },
67
+ ring: { hsl: "350 48% 32%", from: "deep burgundy — the luxury second-accent, used for focus only" },
68
+ destructive: { hsl: "8 62% 42%", from: "deep terracotta — alert tone that respects the cream palette" },
69
+ destructiveForeground: { hsl: "38 32% 94%", from: "cream on terracotta" },
70
+ brand: {
71
+ cream: { hsl: "38 32% 94%", from: "= background; the listing-book paper itself" },
72
+ "cream-deep": { hsl: "38 22% 88%", from: "= secondary; the deeper cream for panel surfaces" },
73
+ navy: { hsl: "215 48% 22%", from: "= primary; Compass deep navy" },
74
+ "navy-ink": { hsl: "215 38% 14%", from: "= foreground; the deepest navy, used as ink" },
75
+ burgundy: { hsl: "350 48% 32%", from: "Modern House / Sotheby's deep burgundy — second luxury accent" },
76
+ brass: { hsl: "38 42% 52%", from: "antique brass — fitting-hardware accent, rule lines on spec tables" },
77
+ },
78
+ },
79
+
80
+ spacing: {
81
+ base: 4,
82
+ scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96, 128],
83
+ containerMax: "max-w-7xl", // full-bleed listing photography needs the width
84
+ containerPadding: "px-6 lg:px-12",
85
+ sectionPadding: {
86
+ hero: "pt-24 pb-20 lg:pt-32 lg:pb-28",
87
+ default: "py-20 lg:py-32",
88
+ tight: "py-12 lg:py-20",
89
+ },
90
+ },
91
+
92
+ radius: {
93
+ base: "0", // sharp — catalog-page corners, never rounded
94
+ pillsAllowed: false, // pills read marketplace, not listing book
95
+ },
96
+
97
+ shadows: {
98
+ style: "minimal",
99
+ utilities: {
100
+ "hairline-bottom":
101
+ "inset 0 -1px 0 hsl(var(--border))",
102
+ "shadow-listing":
103
+ "0 1px 2px hsl(215 38% 14% / 0.04), 0 8px 24px hsl(215 38% 14% / 0.06)",
104
+ },
105
+ },
106
+
107
+ motion: {
108
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
109
+ durations: {
110
+ reveal: 1000, // slow on purpose — catalog pacing
111
+ loop: 2400,
112
+ ambient: 32000, // ken-burns on hero stills
113
+ },
114
+ keyframes: {
115
+ "fade-rise": {
116
+ css:
117
+ "from { opacity: 0; transform: translateY(20px); }\n" +
118
+ "to { opacity: 1; transform: translateY(0); }",
119
+ defaultDuration: 1000,
120
+ iteration: "once",
121
+ purpose: "section entrance — listing reveal, deliberately unhurried",
122
+ },
123
+ "ken-burns": {
124
+ css:
125
+ "0% { transform: scale(1.04) translate(0, 0); }\n" +
126
+ "100% { transform: scale(1.12) translate(-1.5%, -1%); }",
127
+ defaultDuration: 32000,
128
+ iteration: "infinite",
129
+ purpose: "hero listing photography drift — architectural camera push",
130
+ },
131
+ "underline-sweep": {
132
+ css:
133
+ "from { transform: scaleX(0); transform-origin: left; }\n" +
134
+ "to { transform: scaleX(1); transform-origin: left; }",
135
+ defaultDuration: 600,
136
+ iteration: "once",
137
+ purpose: "text-link hover — underline wipes in left-to-right",
138
+ },
139
+ },
140
+ respectsReducedMotion: true,
141
+ },
142
+
143
+ density: "low", // catalog breathing; never marketplace density
144
+
145
+ patterns: {
146
+ button:
147
+ "Text-link CTAs by default — navy color, underline-sweep on hover. " +
148
+ "Solid-fill is reserved for the single hero action per page (navy bg, cream text, sharp corners). " +
149
+ "Secondary actions are hairline-outlined ghost buttons in navy. No pill shapes. " +
150
+ "Burgundy is focus-ring only, never a button face.",
151
+ card:
152
+ "Sharp corners. Hairline border (--border) on a card-cream surface. Internal padding p-8 lg:p-12. " +
153
+ "Listing cards lead with full-width photography (4:5 portrait or 3:2 landscape), " +
154
+ "address in Cormorant display, spec line in mono. Hover lifts to shadow-listing.",
155
+ input:
156
+ "Border-bottom only (1px --border) on cream. No full box. " +
157
+ "Label above in mono-uppercase tracking 0.12em. Focus shifts border to burgundy.",
158
+ cta:
159
+ "Text-link with underline-sweep for the catalog. Solid navy rectangle for the single hero CTA (Request Viewing). " +
160
+ "Never a pill, never a gradient, never a glow.",
161
+ },
162
+
163
+ details: {
164
+ selectionBg: "hsl(var(--brand-burgundy) / 0.22)",
165
+ selectionFg: "hsl(var(--foreground))",
166
+ focusRing: "1px solid hsl(var(--ring))",
167
+ scrollbarStyle: "thin",
168
+ },
169
+ };
@@ -0,0 +1,106 @@
1
+ # Design Direction — Realestate-Marketplace
2
+
3
+ ## Ethos
4
+ Zillow listing-card grid · Redfin signal red · Apartments.com warm orange · Trulia friendly map · Streeteasy dense tabular
5
+
6
+ ## Feel
7
+ Built for browsing two hundred listings on a Saturday. A warm-white canvas carries a friendly geometric sans, dense photo-card grids, and a single signal-color CTA. The map and the list co-exist; filters are first-class chrome, not an afterthought. Reads as a marketplace tool, not as a catalog or a brochure.
8
+
9
+ ## Reference brands
10
+ - **Zillow** → deep blue brand mark + warm white + listing-card grid. Blue carries everything: search, save, primary CTAs, focus ring.
11
+ - **Redfin** → signal red + soft cards + structured filter chrome. Red is a status color (Sold, Off-market, urgent badges) — never a primary CTA.
12
+ - **Apartments.com** → warm orange accent + density + photo-card volume. Orange is the New / Hot listing badge; one accent color among several signals.
13
+ - **Trulia** → sand surface + friendly map UI + neighborhood scoring. The map is a first-class surface, not a modal.
14
+ - **Streeteasy** → NYC-specific dense tabular listings. Density is a feature; tabular numerics are non-negotiable on price columns.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
18
+
19
+ Surface stack is **warm white** (background) → **pure white** (card/popover) → **cool gray** (secondary/muted/accent). Depth comes from soft card shadows and hairline borders. The filter bar uses `shadow-filterbar` — a single hairline + soft drop, the signature marketplace chrome.
20
+
21
+ Brand tokens: `--blue-zillow`, `--blue-deep`, `--red-redfin`, `--orange-apt`, `--green-saved`, `--sand-warm`, `--map-water`. Primary is `--blue-zillow`. Status colors (red, orange, green) are reserved for status chips and badges — never primary CTAs.
22
+
23
+ ## Typography
24
+ - **Display:** Manrope (Zillow-adjacent geometric sans). h1–h4 and listing-card titles. Tracking `-0.02em` — confident, slightly tight.
25
+ - **Body:** Inter (Redfin/Streeteasy clean sans). Body base **15px** with **line-height 1.5** — marketplace density.
26
+ - **Mono:** JetBrains Mono. Price, sqft, bed/bath count, lot size, MLS, last-updated date. Tabular numerics always on.
27
+
28
+ H1 uses `clamp(2rem, 4.5vw, 3.25rem)` — restrained on purpose. The H1 is rarely the show on a marketplace page; the listings are. Font features: `"cv11"`, `"ss01"`, `"tnum"` — tabular numerics enabled site-wide so prices align in the result grid without per-component overrides.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-screen-2xl px-4 lg:px-6` — marketplace lives full-width for the map/list split. Gutters are tighter than catalog directions because content is the point.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-12 pb-10 lg:pt-16 lg:pb-12` (modest — the search bar is the hero, not a marketing slab)
34
+ - Default: `py-10 lg:py-16`
35
+ - Tight: `py-6 lg:py-10`
36
+ - **Allowed scale values:** 4 6 8 10 12 16 20 24 28 32 40 48 64 80. High-density scale with many small steps — marketplace UI needs the granularity.
37
+
38
+ ## Color
39
+ No hex in component files. All color via tokens. Opacity via `/N` modifier. The marketplace palette intentionally carries multiple signal colors — red, orange, green, blue — but each has a strict role:
40
+
41
+ - **Blue** = primary action, focus, brand. The catch-all.
42
+ - **Red** = status only (Sold, Off-market, Removed, urgent alerts). Never a CTA.
43
+ - **Orange** = badge accent (New, Hot, Open House). Never body chrome.
44
+ - **Green** = confirmation only (Saved, Favorited, Verified). Never a CTA.
45
+
46
+ Pure white is allowed (it's the card surface — marketplace cards must lift off the canvas). Pure black is forbidden — `--foreground` is a deep blue-ink.
47
+
48
+ ## Radius
49
+ `--radius: 0.5rem` (8px). Softer than utility/dense, sharper than soft-modern. Pills are allowed (`pillsAllowed: true`) — filter chips, status badges, and category pills are part of the language. Pill shape encodes data (it's a filter / badge / chip), not chrome.
50
+
51
+ ## Shadows
52
+ **Soft.** Four utilities:
53
+ - `.shadow-card` — base listing-card lift: `0 1px 2px hsl(var(--navy-ink) / 0.05), 0 2px 6px hsl(var(--navy-ink) / 0.04)`.
54
+ - `.shadow-card-hover` — listing-card hover lift.
55
+ - `.shadow-mappin` — `0 2px 4px hsl(var(--navy-ink) / 0.18), 0 0 0 2px hsl(0 0% 100%)`, the white halo + drop shadow that defines a map pin.
56
+ - `.shadow-filterbar` — `0 1px 0 hsl(var(--border)), 0 2px 8px hsl(var(--navy-ink) / 0.04)`, the sticky filter bar separation.
57
+
58
+ No glows. No colored shadows.
59
+
60
+ ## Motion
61
+ Four keyframes:
62
+ - `fade-rise` — 240ms, the standard listing/result entrance. Marketplace must feel responsive; 1000ms is unacceptable here.
63
+ - `card-lift` — 180ms hover lift on listing cards. Confirms targetability on a dense grid.
64
+ - `pin-drop` — 320ms map-pin reveal with a slight overshoot. Feedback when a result lands on the map.
65
+ - `skeleton-shimmer` — 1600ms infinite gradient sweep on loading skeletons. Listings stream in; the skeleton tells the user to keep scrolling.
66
+
67
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored. **No ambient ken-burns — this is a tool, not a film.**
68
+
69
+ ## Component patterns
70
+ - **Buttons:** Solid-fill primary in `--primary` (Zillow blue), white text, 0.5rem radius, `shadow-card`. Secondary is white ghost with `--border` outline. Tertiary is text-link in primary. Pills are allowed for filter chips and status badges (Sold/New/Open House) — pill shape is data semantics, not chrome.
71
+ - **Cards:** Listing card: rounded-lg, bg-card (pure white), `shadow-card`, no border. Photo-first (4:3 landscape, full-bleed at top). Below: price in display 700 weight, address in body, mono spec line (`3 bd · 2 ba · 1,840 sqft`). Hover applies `card-lift`. Filter and panel cards use a hairline border with no shadow.
72
+ - **Inputs:** Full rounded-lg box with 1px `--input` border, bg-card. Focus = 2px ring in primary at 40% opacity. Search input gets a leading magnifier icon. Label sits small above; helper text below in muted-foreground.
73
+ - **CTA links:** Solid-fill primary button is the canonical CTA. Save (heart) and Tour (calendar) buttons sit as filled-icon or icon+label variants. Sold / Off-market badges use destructive red — **never as a CTA, always as a status pill**.
74
+
75
+ ## Recommended rich media
76
+ Realestate-Marketplace is photography-volume-driven, not photography-prestige-driven. Listings carry 8–24 photos each, optimized for grid thumbnails and a full-screen lightbox. The first photo is the canonical hero — usually a 4:3 exterior or wide living-room shot. **Photography quality matches the listing's price tier** — a $300k starter home with iPhone photos sits comfortably in this direction; a $3M home pushes toward Realestate-Luxury territory.
77
+
78
+ Map screenshots and floor plans are first-class media. Floor plans render best at 4:3 landscape with the listing's price overlaid as a chip in the top-right. Map pin tiles use `--map-water` as the basemap water; pins use primary blue with the white halo from `shadow-mappin`.
79
+
80
+ Neighborhood images sit in a separate tier — `--sand-warm` panels with a 16:9 photo, a walk-score block, and three nearby category icons (coffee, transit, schools).
81
+
82
+ **AI tool recommendations:** Marketplace listing photography is rarely AI-generated — real photos win on trust. For **neighborhood imagery and category illustrations**, **Midjourney v6+** with prompts like *"editorial neighborhood photography, warm afternoon light, residential street, no people, 35mm, natural color"* works for filler. For floor plans and icons, **Recraft** with *"isometric floor plan, line drawing, restrained color, no shadows"* and a small icon set in **Lucide** (already a common marketplace standard).
83
+
84
+ **Aspect ratios:** 4:3 landscape for listing photography (the marketplace standard, tessellates cleanly in a grid); 16:9 for neighborhood hero photography; 1:1 for thumbnails and avatars. **Avoid 21:9 cinematic** — that reads luxury catalog, off-feel here.
85
+
86
+ **Video:** Listing tour videos sit behind a play-button poster image in the photo gallery. Autoplay is forbidden — the user is scanning 200 results. ≤4 MB per tour video, H.265 or AV1, 30s typical length.
87
+
88
+ **Performance:** listing thumbnail ≤30 KB AVIF at 800w; lightbox image ≤120 KB AVIF at 2000w. Critical: the grid must lazy-load below the fold. LCP under 1.8s with the search bar + first row of cards rendered.
89
+
90
+ **Avoid:** twilight cinematic real-estate hero stills (luxury territory), serif typography on listing cards (luxury territory), parallax map effects (gimmicky and bad on mobile), animated price-drop badges (cheap), AI-generated listing photos (illegal in many jurisdictions and a trust failure regardless).
91
+
92
+ **Accessibility:** alt-text on listing photos must include property type + photo subject — *"Two-story craftsman home, front exterior with attached garage"* not *"Image: 123 Oak St"*. Map pins must have a text alternative (price + address); the map is not a substitute for a list.
93
+
94
+ ## Component families
95
+ None at install time. Likely first families: listing-card (grid + lightbox), filter-pill, map-pin, neighborhood-tile, save-button.
96
+
97
+ ## Details
98
+ - **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text — the standard blue selection.
99
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — visible, web-app-standard, accessibility-first.
100
+ - **Scrollbar:** thin.
101
+
102
+ ## Exceptions
103
+ 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.
104
+
105
+ ## Revisions
106
+ - Initial direction, generated at install time.
@@ -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.