@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,162 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const midCentury: Direction = {
4
+ name: "mid-century",
5
+ ethos:
6
+ "Eames warmth · Saul Bass geometric play · Knoll restraint · Aalto natural · Pushpin Studios color",
7
+ references: [
8
+ { brand: "Eames", trait: "warmth — plywood, fiberglass, upholstery linen" },
9
+ { brand: "Saul Bass", trait: "geometric cut-paper play — Vertigo, Anatomy of a Murder, Golden Arm" },
10
+ { brand: "Knoll", trait: "restraint — mid-century catalog discipline" },
11
+ { brand: "Alvar Aalto", trait: "natural — wood and glass interiors" },
12
+ { brand: "Push Pin Studios", trait: "color — Milton Glaser era" },
13
+ { brand: "Mad Men set design", trait: "1962 composed period detail" },
14
+ ],
15
+ feel:
16
+ "Warm cream surfaces, geometric typography, a restrained palette built " +
17
+ "around a single bold accent. Not bright, not minimal — composed. " +
18
+ "Reads like a 1962 design magazine spread, not a Memphis-style throwback.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Futura",
23
+ fallback: ["DM Sans", "Avenir", "Century Gothic", "system-ui", "sans-serif"],
24
+ from: "Futura — Bauhaus origin, geometric mid-century canonical",
25
+ googleFont: undefined, // Futura is not on Google Fonts; DM Sans is the loaded fallback
26
+ weights: [400, 500, 700],
27
+ },
28
+ body: {
29
+ family: "DM Sans",
30
+ fallback: ["Futura", "system-ui", "-apple-system", "sans-serif"],
31
+ from: "DM Sans — geometric humanist, readable at small sizes, complements Futura",
32
+ googleFont: "DM+Sans",
33
+ weights: [400, 500, 700],
34
+ },
35
+ mono: {
36
+ family: "IBM Plex Mono",
37
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "IBM Plex Mono — modernist geometric mono, period-correct",
39
+ googleFont: "IBM+Plex+Mono",
40
+ weights: [400, 500],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "0", // Futura is already geometric; no tightening needed
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"ss01", "tnum"',
48
+ h1ScaleClamp: "clamp(2.25rem, 5vw, 4rem)",
49
+ bodyBaseSize: "1rem", // 16px — composed, not dense, not magazine-oversized
50
+ bodyLineHeight: "1.6",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "36 25% 94%", from: "warm cream — Eames upholstery linen" },
55
+ foreground: { hsl: "25 8% 15%", from: "warm black, slight brown bias — printed-ink feel" },
56
+ card: { hsl: "36 28% 97%", from: "lifted cream — one step above the linen ground" },
57
+ popover: { hsl: "36 28% 97%", from: "same as card; depth from hairline + soft eames shadow" },
58
+ primary: { hsl: "14 75% 48%", from: "Saul Bass rust orange — the Vertigo poster red-orange" },
59
+ primaryForeground: { hsl: "36 25% 94%", from: "cream on rust" },
60
+ secondary: { hsl: "36 20% 89%", from: "warm cream, one tier deeper" },
61
+ secondaryForeground: { hsl: "25 8% 15%", from: "ink on warm cream" },
62
+ muted: { hsl: "36 20% 89%", from: "same as secondary; differentiation by usage, not color" },
63
+ mutedForeground: { hsl: "25 10% 38%", from: "warm slate — caption ink" },
64
+ accent: { hsl: "36 22% 86%", from: "warm cream, deepest tier — hover surface only" },
65
+ accentForeground: { hsl: "25 8% 15%", from: "ink on warm cream hover" },
66
+ border: { hsl: "30 14% 78%", from: "Knoll hairline — warm gray, suggestive not assertive" },
67
+ input: { hsl: "30 14% 78%", from: "same as border" },
68
+ ring: { hsl: "14 75% 48%", from: "primary, used for focus only" },
69
+ destructive: { hsl: "0 60% 42%", from: "muted alert red — sits next to rust without clashing" },
70
+ destructiveForeground: { hsl: "36 25% 94%", from: "cream on alert" },
71
+ brand: {
72
+ cream: { hsl: "36 25% 94%", from: "Eames linen — also semantic background" },
73
+ ink: { hsl: "25 8% 15%", from: "printed ink — also semantic foreground" },
74
+ rust: { hsl: "14 75% 48%", from: "Saul Bass rust orange — also semantic primary" },
75
+ avocado: { hsl: "75 40% 42%", from: "Eames green — secondary accent for category and chart" },
76
+ mustard: { hsl: "44 78% 50%", from: "Pushpin yellow — Milton Glaser era warm accent" },
77
+ teak: { hsl: "25 35% 38%", from: "Aalto warm wood — supporting brown for wood-grain surfaces" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64], // breathing but composed — medium-low density
84
+ containerMax: "max-w-5xl", // composed column, wider than editorial prose
85
+ containerPadding: "px-6 lg:px-10",
86
+ sectionPadding: {
87
+ hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
88
+ default: "py-16 lg:py-24",
89
+ tight: "py-12 lg:py-16",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "0.25rem", // subtle — not pillow-soft, not razor-sharp; mid-century is composed
95
+ pillsAllowed: false, // tag/label shapes only; no Stripe-style status pills
96
+ },
97
+
98
+ shadows: {
99
+ style: "minimal",
100
+ utilities: {
101
+ hairline:
102
+ "0 1px 0 0 hsl(var(--border))", // catalog divider — single-line separator
103
+ "shadow-eames":
104
+ "0 1px 2px 0 hsl(25 20% 20% / 0.08)", // very soft 1px offset, low blur — card lift
105
+ },
106
+ },
107
+
108
+ motion: {
109
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
110
+ durations: {
111
+ reveal: 900, // slow, composed entrances
112
+ loop: 6000, // ken-burns drift
113
+ ambient: 12000,
114
+ },
115
+ keyframes: {
116
+ "fade-rise": {
117
+ css:
118
+ "from { opacity: 0; transform: translateY(16px); }\n" +
119
+ "to { opacity: 1; transform: translateY(0); }",
120
+ defaultDuration: 900,
121
+ iteration: "once",
122
+ purpose: "the entrance — slow rise, no bounce, composed",
123
+ },
124
+ "ken-burns": {
125
+ css:
126
+ "from { transform: scale(1) translate(0, 0); }\n" +
127
+ "to { transform: scale(1.08) translate(-1%, -1%); }",
128
+ defaultDuration: 12000,
129
+ iteration: "infinite",
130
+ purpose: "slow zoom on hero photographs — Eames catalog stillness in motion",
131
+ },
132
+ },
133
+ respectsReducedMotion: true,
134
+ },
135
+
136
+ density: "low", // medium-low — breathing but composed
137
+
138
+ patterns: {
139
+ button:
140
+ "Filled rect with 0.25rem radius. " +
141
+ "Primary = rust orange bg + cream text. " +
142
+ "Secondary = ghost (transparent bg, ink border + ink text, hover bg-accent). " +
143
+ "Tertiary = underlined text-link in rust color.",
144
+ card:
145
+ "Cream surface lifted one tier from background (--card), hairline border, " +
146
+ "soft .shadow-eames for gentle depth. Padding p-6 lg:p-8. " +
147
+ "Title in Futura; meta in IBM Plex Mono.",
148
+ input:
149
+ "Full box, 0.25rem radius, hairline border on cream card surface. " +
150
+ "Label above, geometric and small. Focus = 2px rust ring.",
151
+ cta:
152
+ "Underlined text-link in rust orange for inline CTAs. " +
153
+ "Hero/primary action = filled rust rect. No gradients, no pills.",
154
+ },
155
+
156
+ details: {
157
+ selectionBg: "hsl(var(--primary) / 0.22)",
158
+ selectionFg: "hsl(var(--foreground))",
159
+ focusRing: "2px solid hsl(var(--ring))",
160
+ scrollbarStyle: "thin",
161
+ },
162
+ };
@@ -0,0 +1,86 @@
1
+ # Design Direction — Motorcycle-Brand
2
+
3
+ ## Ethos
4
+ Harley-Davidson chrome-on-bone heritage · Ducati Italian race red · Triumph English-mono restraint · Indian Motorcycle script-mark heritage · BMW Motorrad engineered precision
5
+
6
+ ## Feel
7
+ An industrial bone-and-leather canvas with race-red doing all the brand-mark work. Oversized condensed mono display does the badge-typography — model names read like they're stamped onto a fuel tank. Hairline rules everywhere; chrome-tinted dividers separate sections. Photography is machine-and-rider — never lifestyle stock. The page should feel like there's a V-twin idling underneath the scroll.
8
+
9
+ ## Reference brands
10
+ - **Harley-Davidson** → industrial display mono, bone canvas, leather-and-chrome warmth, the HOG rider-club community spotlight as a first-class section.
11
+ - **Ducati** → Italian race red as the singular brand mark, against carbon-black model stills.
12
+ - **Triumph** → English engineering restraint — Bonneville nameplate mono, hairline divider rules, no decoration without function.
13
+ - **Indian Motorcycle** → heritage script-mark, leather-tan warmth, the badge IS the typography.
14
+ - **BMW Motorrad** → engineered precision — tabular spec strips, technical side-profile photography.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Surface stack is **bone** (background) → **lifted bone** (card) → **deeper bone** (muted). Depth comes from thick 2px leather-ink borders, never from drop shadows. Pure white is forbidden — `--bone` replaces it; pure black is forbidden — `--leather-ink` replaces it.
18
+
19
+ Brand tokens: `--bone`, `--leather-ink`, `--race-red`, `--race-red-deep`, `--chrome`, `--tan`. Primary is race-red. Chrome and tan are reserved for divider dots, fender-line accents, occasional heritage badge frames — never as a button face. Race-red is the ONLY color that wears the brand-mark role; no orange/yellow/green ever competes.
20
+
21
+ ## Typography
22
+ - **Display:** Oswald (Harley tank-badge industrial mono). h1–h4. Tracking `0.04em` — condensed display reads better with positive tracking; broadcast badge feel.
23
+ - **Body:** Work Sans (BMW Motorrad neutral engineering sans). Body base **16px** with **line-height 1.6**.
24
+ - **Mono:** JetBrains Mono. Engine size, MSRP, torque, weight, top speed. Always `font-variant-numeric: tabular-nums`.
25
+
26
+ H1 uses `clamp(3rem, 9vw, 7rem)` — tank-badge scale. Font features: `"tnum"`, `"ss01"`. All-caps treatment on display headings is the default, not the exception.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-7xl px-6 lg:px-10` — bike grids and community photography panoramas need width.
30
+ - **Section padding tiers:**
31
+ - Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
32
+ - Default: `py-16 lg:py-24`
33
+ - Tight: `py-10 lg:py-16`
34
+ - **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96. Density tier is **medium**.
35
+
36
+ ## Color
37
+ No hex anywhere. All color via tokens. The palette is intentionally tight: bone, leather-ink, race-red, chrome, tan. **Never a saturated fourth color** — heritage brands earn one brand-mark, not four. If a designer needs distinction, the answer is a thicker border or a tabular-mono numeral, not a new hue.
38
+
39
+ ## Radius
40
+ `--radius: 0`. **Sharp corners only** — tank-badge corners. Pills are disallowed (`pillsAllowed: false`) — they read app/marketplace, not heritage motorcycle.
41
+
42
+ ## Shadows
43
+ **Minimal.** Two utilities:
44
+ - `.border-thick` — `inset 0 0 0 2px hsl(var(--border))`, the industrial bordered-block treatment (Harley fender-pinstripe weight).
45
+ - `.hairline-double` — double-line divider rule between major sections (Triumph nameplate frame).
46
+
47
+ No drop shadows. No glows. Heritage motorcycle marketing is matte print, not glass.
48
+
49
+ ## Motion
50
+ Three keyframes:
51
+ - `rev-in` — 600ms opacity + 16px translate, quick mechanical entrance.
52
+ - `rumble` — 240ms tiny vertical tremor (±0.5px) on bike-grid tile hover. V-twin idle suggestion, sparingly used.
53
+ - `marquee` — 40000ms infinite horizontal scroll for the rider-chapter membership belt.
54
+
55
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored — `rumble` and `marquee` both go quiet.
56
+
57
+ ## Component patterns
58
+ - **Buttons:** Solid race-red-on-bone for the single hero action with a 2px leather-ink border (Harley tank-badge layering). Secondary is leather-ink-bordered ghost on bone. Pills disallowed. Text-link in race-red for body CTAs.
59
+ - **Cards:** Sharp 0 corners, 2px leather-ink border on bone or lifted-bone surface. Bike cards lead with side-profile machine photography (3:2 landscape), model name in oversized Oswald all-caps, spec line in mono. Hover may apply 240ms `rumble`.
60
+ - **Inputs:** Full box with 2px border on lifted-bone. Sharp corners. Label above in mono-uppercase tracking `0.16em`. Focus shifts border to race-red.
61
+ - **CTA links:** Solid race-red rectangle with 2px leather-ink border for hero action. Never a pill, never a gradient that isn't `red → red-deep`.
62
+
63
+ ## Recommended rich media
64
+ The hero is **side-profile machine photography** — Triumph studio aesthetic, white-cyc background or matte black backdrop, raked single-light highlight on the tank. Secondary frames are **rider-and-machine documentary photography** — Sturgis B&W reportage, Iron Butt rally portraits, Indian Motorcycle's Burt Munro-flavored heritage shots. **Never showroom-floor stock photography. Never women-on-bikes lifestyle stock.**
65
+
66
+ **AI tool recommendations:** **Midjourney v6+** with prompts like *"motorcycle side-profile product photography, studio-lit, matte black backdrop, single key light raking across fuel tank, Triumph brand-book aesthetic, medium format, 85mm, no people"*; *"motorcycle rider portrait, documentary photography, Sturgis rally, 1970s film stock, Tri-X grain, environmental"*. Avoid Midjourney's default "biker" prompt — produces leather-clad stock cliché. Prompt for documentary authorship.
67
+
68
+ **Aspect ratios:** 3:2 landscape for machine shots; 4:5 portrait for rider documentary; 21:9 for hero panoramic. **Never 1:1.**
69
+
70
+ **Video:** A single autoplay-muted hero reel of slow camera pan along the bike with the engine idling audio replaced by silence (autoplay is muted). 18–24 seconds, ≤6 MB per loop.
71
+
72
+ **Avoid:** orange-on-orange decorative gradients (Halloween cliché), skull-and-flame iconography (parody territory), generic "freedom of the open road" stock highways, racing-stripe SVG decoration as background.
73
+
74
+ ## Component families
75
+ None at install time. First likely families: bike-card, rider-spotlight, dealer-network-strip, chapter-belt-marquee.
76
+
77
+ ## Details
78
+ - **Selection:** `hsl(var(--brand-race-red) / 0.28)` background, bone text.
79
+ - **Focus ring:** `2px solid hsl(var(--ring))` — race red, thick to match the border language.
80
+ - **Scrollbar:** auto.
81
+
82
+ ## Exceptions
83
+ None yet.
84
+
85
+ ## Revisions
86
+ - Initial direction, generated at install time.
@@ -0,0 +1,174 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // Note: name is not in the schema enum at install time; the codegen pipeline
4
+ // accepts new slugs by string and the type guard is updated on next schema sync.
5
+ export const motorcycleBrand = {
6
+ name: "motorcycle-brand",
7
+ ethos:
8
+ "Harley-Davidson chrome-on-bone heritage · Ducati Italian race red · Triumph English-mono restraint · Indian Motorcycle script-mark heritage · BMW Motorrad engineered precision",
9
+ references: [
10
+ { brand: "Harley-Davidson", trait: "industrial display mono, bone canvas, leather-and-chrome warmth, rider-club community" },
11
+ { brand: "Ducati", trait: "Italian race red as the singular brand mark, against carbon-black" },
12
+ { brand: "Triumph", trait: "English engineering — restrained mono nameplate, hairline rules" },
13
+ { brand: "Indian Motorcycle", trait: "heritage script-mark, leather tan, badge-as-typography" },
14
+ { brand: "BMW Motorrad", trait: "engineered precision — tabular specs, technical photography" },
15
+ ],
16
+ feel:
17
+ "Industrial bone-and-leather canvas with race-red as the single brand-mark. " +
18
+ "An oversized condensed mono display does the badge-work — model names read like they're stamped " +
19
+ "on a tank. Hairline rules everywhere; chrome-tinted dividers separate sections. Photography is " +
20
+ "machine-and-rider, not lifestyle-stock. The page sounds like it has a V-twin idling underneath.",
21
+
22
+ fonts: {
23
+ display: {
24
+ family: "Oswald",
25
+ fallback: ["Anton", "Impact", "Haettenschweiler", "Arial Narrow Bold", "sans-serif"],
26
+ from: "Harley-Davidson tank-badge industrial mono — condensed, all-caps friendly, broadcast weight",
27
+ googleFont: "Oswald",
28
+ weights: [400, 500, 600, 700],
29
+ },
30
+ body: {
31
+ family: "Work Sans",
32
+ fallback: ["Inter", "system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
33
+ from: "BMW Motorrad neutral engineering sans — clean, technical, screen-comfortable",
34
+ googleFont: "Work+Sans",
35
+ weights: [400, 500, 600, 700],
36
+ },
37
+ mono: {
38
+ family: "JetBrains Mono",
39
+ fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
40
+ from: "tabular numerics for engine size, MSRP, torque — instrument-cluster heritage",
41
+ googleFont: "JetBrains+Mono",
42
+ weights: [400, 500, 700],
43
+ },
44
+ },
45
+
46
+ typography: {
47
+ headingTracking: "0.04em", // Oswald condensed reads better with positive tracking — broadcast badge feel
48
+ bodyTracking: "0.01em",
49
+ fontFeatureSettings: '"tnum", "ss01"',
50
+ h1ScaleClamp: "clamp(3rem, 9vw, 7rem)", // oversized — tank-badge scale
51
+ bodyBaseSize: "1rem",
52
+ bodyLineHeight: "1.6",
53
+ },
54
+
55
+ colors: {
56
+ background: { hsl: "38 22% 88%", from: "Harley bone — warm cream tank-paint canvas, never pure white" },
57
+ foreground: { hsl: "22 14% 14%", from: "deep leather-ink — body text on bone, never pure black" },
58
+ card: { hsl: "38 18% 92%", from: "lifted bone — card surface one tier above canvas" },
59
+ popover: { hsl: "38 18% 95%", from: "popover surface — two tiers up" },
60
+ primary: { hsl: "0 78% 46%", from: "Ducati Italian race red — the singular brand-mark color" },
61
+ primaryForeground: { hsl: "38 22% 92%", from: "bone on race red" },
62
+ secondary: { hsl: "22 14% 14%", from: "deep leather-ink — secondary tier doubles as foreground for fill-on-bone" },
63
+ secondaryForeground: { hsl: "38 22% 92%", from: "bone on leather-ink" },
64
+ muted: { hsl: "38 14% 82%", from: "deeper bone — quiet panel surface, leather-rubbed-into-paint feel" },
65
+ mutedForeground: { hsl: "22 10% 38%", from: "chrome-grey secondary text — readable on bone" },
66
+ accent: { hsl: "30 22% 64%", from: "chrome-tan accent — divider dots, decorative rules" },
67
+ accentForeground: { hsl: "22 14% 14%", from: "leather-ink on chrome-tan" },
68
+ border: { hsl: "22 14% 14%", from: "leather-ink — borders are thick and intentional, like a Harley fender pinstripe" },
69
+ input: { hsl: "22 14% 14%", from: "same as border — single industrial border language" },
70
+ ring: { hsl: "0 78% 46%", from: "race red — focus ring is the brand-mark" },
71
+ destructive: { hsl: "8 72% 40%", from: "deeper alarm red — distinct from primary race red" },
72
+ destructiveForeground: { hsl: "38 22% 92%", from: "bone on alarm red" },
73
+ brand: {
74
+ "race-red": { hsl: "0 78% 46%", from: "= primary; Ducati Italian race red, the singular brand-mark" },
75
+ "race-red-deep": { hsl: "356 80% 34%", from: "deeper race red — gradient anchor and hover state" },
76
+ bone: { hsl: "38 22% 88%", from: "= background; Harley tank-paint bone canvas" },
77
+ "leather-ink": { hsl: "22 14% 14%", from: "= foreground; deep saddle-leather ink" },
78
+ chrome: { hsl: "30 12% 78%", from: "polished chrome — fender, exhaust, badge-trim accent" },
79
+ tan: { hsl: "30 36% 58%", from: "Indian Motorcycle saddle-tan — heritage warmth, sparing use" },
80
+ },
81
+ },
82
+
83
+ spacing: {
84
+ base: 4,
85
+ scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96],
86
+ containerMax: "max-w-7xl", // bike grid + community photography need width
87
+ containerPadding: "px-6 lg:px-10",
88
+ sectionPadding: {
89
+ hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
90
+ default: "py-16 lg:py-24",
91
+ tight: "py-10 lg:py-16",
92
+ },
93
+ },
94
+
95
+ radius: {
96
+ base: "0", // sharp — tank-badge corners, never rounded
97
+ pillsAllowed: false, // pills read app/marketplace; badge corners only
98
+ },
99
+
100
+ shadows: {
101
+ style: "minimal",
102
+ utilities: {
103
+ "border-thick":
104
+ "inset 0 0 0 2px hsl(var(--border))", // industrial bordered-block treatment, Harley fender-pinstripe weight
105
+ "hairline-double":
106
+ "inset 0 -1px 0 hsl(var(--border)), inset 0 -4px 0 hsl(var(--background)), inset 0 -5px 0 hsl(var(--border))",
107
+ },
108
+ },
109
+
110
+ motion: {
111
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
112
+ durations: {
113
+ reveal: 600,
114
+ loop: 2400,
115
+ ambient: 60000,
116
+ },
117
+ keyframes: {
118
+ "rev-in": {
119
+ css:
120
+ "from { opacity: 0; transform: translateY(16px); }\n" +
121
+ "to { opacity: 1; transform: translateY(0); }",
122
+ defaultDuration: 600,
123
+ iteration: "once",
124
+ purpose: "section entrance — quick, mechanical, not languid",
125
+ },
126
+ "rumble": {
127
+ css:
128
+ "0%, 100% { transform: translateY(0); }\n" +
129
+ "25% { transform: translateY(-0.5px); }\n" +
130
+ "75% { transform: translateY(0.5px); }",
131
+ defaultDuration: 240,
132
+ iteration: "once",
133
+ purpose: "tiny hover tremor on bike-grid tiles — V-twin idle suggestion, sparingly",
134
+ },
135
+ "marquee": {
136
+ css:
137
+ "from { transform: translateX(0); }\n" +
138
+ "to { transform: translateX(-50%); }",
139
+ defaultDuration: 40000,
140
+ iteration: "infinite",
141
+ purpose: "rider-name / chapter-name horizontal strip — community membership belt",
142
+ },
143
+ },
144
+ respectsReducedMotion: true,
145
+ },
146
+
147
+ density: "medium",
148
+
149
+ patterns: {
150
+ button:
151
+ "Solid race-red-on-bone for the single hero action with a 2px leather-ink border (Harley tank-badge layering). " +
152
+ "Secondary actions are leather-ink-bordered ghost buttons on bone, text in leather-ink. " +
153
+ "Pills disallowed — every CTA is a sharp-cornered badge. " +
154
+ "Text-link in race-red for body CTAs.",
155
+ card:
156
+ "Sharp 0 corners. 2px leather-ink border (--border) on bone or lifted-bone surface. " +
157
+ "Internal padding p-6 lg:p-8. Bike cards lead with side-profile machine photography (3:2 landscape), " +
158
+ "model name in oversized Oswald all-caps, spec line in mono. " +
159
+ "Hover may apply a 240ms rumble.",
160
+ input:
161
+ "Full box with 2px --border on lifted-bone. Sharp corners. " +
162
+ "Label sits above in mono-uppercase, tracking 0.16em. Focus shifts border to race-red.",
163
+ cta:
164
+ "Solid race-red rectangle with 2px leather-ink border for hero action. " +
165
+ "Text-link in race-red for body. Never a pill, never a gradient that isn't red→red-deep.",
166
+ },
167
+
168
+ details: {
169
+ selectionBg: "hsl(var(--brand-race-red) / 0.28)",
170
+ selectionFg: "hsl(var(--brand-bone))",
171
+ focusRing: "2px solid hsl(var(--ring))",
172
+ scrollbarStyle: "auto",
173
+ },
174
+ } satisfies Partial<Direction> & { name: string };
@@ -0,0 +1,83 @@
1
+ # Design Direction — Museum
2
+
3
+ ## Ethos
4
+ MoMA exhibition restraint · Met serif gravity · Tate Modern curatorial calm · Whitney cream paper · Guggenheim structural hierarchy
5
+
6
+ ## Feel
7
+ A museum catalogue, not a museum app. Cream-paper background, serif display, exhibition titles set like wall labels. Color is almost entirely absent — a single restrained gallery red marks current shows. Photographs of works do all the visual work; never lifestyle photography, never crowd shots, never decorative SVG.
8
+
9
+ ## Reference brands
10
+ - **MoMA** → exhibition-first homepage. Cream + ink. No marketing chrome.
11
+ - **The Met** → Sabon-feel serif gravity. Deep ink on warm paper.
12
+ - **Tate Modern** → curatorial restraint. The image of the work earns its space.
13
+ - **Whitney Museum** → cream stock, hairline rules, exhibition dates set in mono.
14
+ - **Guggenheim** → structural typographic hierarchy. No decorative color.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Surface stack is **cream paper** (background) → **lighter cream** (card) → **deeper cream** (secondary/muted/accent). Depth comes from hairline borders only. Brand tokens: `--ink`, `--cream`, `--gallery-red`, `--label-gray`.
18
+
19
+ Primary is `--gallery-red` — a restrained 4° hue, 62% saturation, 36% lightness. Never used as button fill. Reserved for current-exhibition markers and hover states on key links.
20
+
21
+ ## Typography
22
+ - **Display:** Cormorant Garamond (Met / MoMA wall-label serif feel). h1–h4. Tracking `-0.02em` — high-contrast serifs need it.
23
+ - **Body:** Inter (Tate Modern body sans). 17px / 1.65 line height. Neutral, never warm.
24
+ - **Mono:** JetBrains Mono. Exhibition dates, gallery floors, catalogue numbers, wall-label metadata. Always `font-variant-numeric: tabular-nums`.
25
+
26
+ H1 uses `clamp(2.5rem, 6vw, 5rem)`. Exhibition titles use the display serif at a smaller scale than hero — the heading hierarchy is gentle, the way wall-label hierarchy is gentle.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-5xl px-6 lg:px-12` — wider than editorial, narrower than cinematic. Catalogue spread width.
30
+ - **Section padding tiers:**
31
+ - Hero: `pt-28 pb-16 lg:pt-44 lg:pb-28`
32
+ - Default: `py-20 lg:py-32`
33
+ - Tight: `py-12 lg:py-20`
34
+ - **Scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128.
35
+
36
+ ## Color
37
+ No hex. Tokens only. Opacity via `/N` modifier. White and pure black are forbidden — `--cream` and `--ink` replace them. Gallery red appears on **current-exhibition pills, hover states, focus ring, selection background** and almost nowhere else.
38
+
39
+ ## Radius
40
+ `--radius: 0`. Sharp corners. Pills disallowed — exhibition signage is rectangular, museum maps are rectangular, gallery floor plans are rectangular.
41
+
42
+ ## Shadows
43
+ **Minimal.** Two utilities: `.hairline-bottom` and `.hairline-top`. No drop shadows, no glows, no elevation language.
44
+
45
+ ## Motion
46
+ Single keyframe: `fade-rise` (opacity + 20px translate, 1100ms). The only entrance gesture. No marquees, no parallax. Reveal duration is 1100ms — gallery-walk pace.
47
+
48
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored.
49
+
50
+ ## Component patterns
51
+ - **Buttons:** text-link CTAs that transition to gallery-red on hover. The single exception is 'Get tickets' / primary admission action — solid ink rectangle with cream text, sharp corners.
52
+ - **Cards:** hairline top + bottom borders, no fill differentiation from page. Padding `p-8 lg:p-12`. Title in display serif; metadata (dates, gallery floor, curator) in mono uppercase tracking `0.18em`.
53
+ - **Inputs:** border-bottom only (1px ink). Label above in mono uppercase. No placeholder-as-label.
54
+ - **CTA links:** foreground ink, hover transitions to gallery-red. Never a chip, never a gradient.
55
+
56
+ ## Recommended rich media
57
+ Photographs of works — only. Each image is a single work shot square or in its installation context, color-graded to a museum-catalogue neutral (slight warm cast, accurate skin tones in portraits of curators). Never lifestyle, never crowd shots at openings, never wide-angle gallery shots with visitors.
58
+
59
+ **AI tool recommendations:** **Midjourney / Flux** with prompts like *"museum installation photograph, gallery wall, neutral lighting, color-accurate"* or *"painting reproduction for catalogue, slight warm cast, no shadows"*. Avoid AI gallery interiors — they always have wrong shadows.
60
+
61
+ **Aspect ratios:** 1:1 square (work plate convention), 3:4 portrait (single-painting wall hang), or 3:2 landscape (installation view). Never 16:9 widescreen.
62
+
63
+ **Captions are mandatory** and live in mono. Format: *"Artist Name, Title, year. Medium. Gallery floor."* — exactly the wall-label format.
64
+
65
+ **Avoid:** lifestyle/event photography, generic museum-exterior shots, AI-rendered "art" (uncanny), decorative gradients, anything that reads as marketing rather than catalogue.
66
+
67
+ **Accessibility:** alt-text describes the work itself, not the page composition. *"Painting: Joan Mitchell, Untitled, 1972, oil on canvas, large abstract field of cobalt and ochre."*
68
+
69
+ ## Component families
70
+ - `Exhibition` family — list rows with dates, curator, gallery floor.
71
+ - `Work` family — catalogue plate + artist + year + medium label.
72
+ - `Admission` family — ticket type rows, no pricing-pillar layout.
73
+
74
+ ## Details
75
+ - **Selection:** `hsl(var(--primary) / 0.18)` — gallery red wash.
76
+ - **Focus ring:** `1px solid hsl(var(--ring))` — gallery red, thin.
77
+ - **Scrollbar:** thin.
78
+
79
+ ## Exceptions
80
+ None yet.
81
+
82
+ ## Revisions
83
+ - Initial direction.
@@ -0,0 +1,147 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const museum: Direction = {
4
+ name: "museum" as Direction["name"],
5
+ ethos:
6
+ "MoMA exhibition restraint · Met serif gravity · Tate Modern curatorial calm · Whitney cream paper · Guggenheim spiral discipline",
7
+ references: [
8
+ { brand: "MoMA", trait: "exhibition-first homepage, cream + ink, no chrome" },
9
+ { brand: "The Met", trait: "Sabon-feel serif display, deep ink on warm paper" },
10
+ { brand: "Tate Modern", trait: "curatorial restraint, image earns its space" },
11
+ { brand: "Whitney Museum", trait: "cream stock, hairline rules, exhibition dates set in mono" },
12
+ { brand: "Guggenheim", trait: "structural typographic hierarchy, no decorative color" },
13
+ ],
14
+ feel:
15
+ "Cream-paper museum catalogue. Serif display dominates; exhibition titles read like wall labels. " +
16
+ "Color is absent except for a single restrained gallery red used for current-show markers. " +
17
+ "Photographs of works are the only image language — never lifestyle, never crowd shots.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Cormorant Garamond",
22
+ fallback: ["EB Garamond", "Iowan Old Style", "Garamond", "Georgia", "serif"],
23
+ from: "Met / MoMA wall-label serif — high-contrast, exhibition-catalogue feel",
24
+ googleFont: "Cormorant+Garamond",
25
+ weights: [300, 400, 500, 600],
26
+ },
27
+ body: {
28
+ family: "Inter",
29
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
30
+ from: "Tate Modern body sans — neutral, never editorial-warm",
31
+ googleFont: "Inter",
32
+ weights: [400, 500, 600],
33
+ },
34
+ mono: {
35
+ family: "JetBrains Mono",
36
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
37
+ from: "exhibition dates, gallery floors, catalogue numbers — wall-label tabular feel",
38
+ googleFont: "JetBrains+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.02em",
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"tnum", "calt"',
47
+ h1ScaleClamp: "clamp(2.5rem, 6vw, 5rem)",
48
+ bodyBaseSize: "1.0625rem",
49
+ bodyLineHeight: "1.65",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "40 30% 95%", from: "cream catalogue stock — MoMA / Whitney paper" },
54
+ foreground: { hsl: "30 12% 14%", from: "deep warm ink, never pure black — wall-label legibility" },
55
+ card: { hsl: "40 32% 97%", from: "lighter cream — work-label surface" },
56
+ popover: { hsl: "40 32% 97%", from: "matches card; depth from hairline only" },
57
+ primary: { hsl: "4 62% 36%", from: "gallery red — current-exhibition marker, restrained" },
58
+ primaryForeground: { hsl: "40 30% 95%", from: "cream on gallery red" },
59
+ secondary: { hsl: "40 22% 91%", from: "cream paper, one tier deeper" },
60
+ secondaryForeground: { hsl: "30 12% 14%", from: "ink on deeper cream" },
61
+ muted: { hsl: "40 22% 91%", from: "same as secondary — single muted family" },
62
+ mutedForeground: { hsl: "30 8% 38%", from: "wall-label secondary text — slate ink" },
63
+ accent: { hsl: "40 20% 88%", from: "hover surface — cream paper deeper still" },
64
+ accentForeground: { hsl: "30 12% 14%", from: "ink on hover surface" },
65
+ border: { hsl: "30 10% 80%", from: "hairline rule — gallery floor plan line weight" },
66
+ input: { hsl: "30 10% 80%", from: "same as border" },
67
+ ring: { hsl: "4 62% 36%", from: "primary — gallery red on focus" },
68
+ destructive: { hsl: "0 65% 40%", from: "exhibition-closed indicator, more saturated than primary" },
69
+ destructiveForeground: { hsl: "40 30% 95%", from: "cream on destructive" },
70
+ brand: {
71
+ ink: { hsl: "30 12% 14%", from: "the deep ink — also semantic foreground" },
72
+ cream: { hsl: "40 30% 95%", from: "the catalogue paper — also semantic background" },
73
+ "gallery-red": { hsl: "4 62% 36%", from: "gallery red — current-show marker, also semantic primary" },
74
+ "label-gray": { hsl: "30 8% 38%", from: "wall-label gray — date strips, gallery floor numbers" },
75
+ },
76
+ },
77
+
78
+ spacing: {
79
+ base: 4,
80
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
81
+ containerMax: "max-w-5xl",
82
+ containerPadding: "px-6 lg:px-12",
83
+ sectionPadding: {
84
+ hero: "pt-28 pb-16 lg:pt-44 lg:pb-28",
85
+ default: "py-20 lg:py-32",
86
+ tight: "py-12 lg:py-20",
87
+ },
88
+ },
89
+
90
+ radius: {
91
+ base: "0",
92
+ pillsAllowed: false,
93
+ },
94
+
95
+ shadows: {
96
+ style: "minimal",
97
+ utilities: {
98
+ "hairline-bottom":
99
+ "0 1px 0 0 hsl(var(--border))",
100
+ "hairline-top":
101
+ "inset 0 1px 0 0 hsl(var(--border))",
102
+ },
103
+ },
104
+
105
+ motion: {
106
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
107
+ durations: {
108
+ reveal: 1100,
109
+ loop: 4000,
110
+ ambient: 30000,
111
+ },
112
+ keyframes: {
113
+ "fade-rise": {
114
+ css:
115
+ "from { opacity: 0; transform: translateY(20px); }\n" +
116
+ "to { opacity: 1; transform: translateY(0); }",
117
+ defaultDuration: 1100,
118
+ iteration: "once",
119
+ purpose: "exhibition section entrance — slow, deliberate, gallery-walk pace",
120
+ },
121
+ },
122
+ respectsReducedMotion: true,
123
+ },
124
+
125
+ density: "low",
126
+
127
+ patterns: {
128
+ button:
129
+ "Text-link CTAs with gallery-red on hover; primary action ('Get tickets') is the single solid-fill per page, " +
130
+ "ink bg + cream text, sharp corners. No pills, no rounded buttons — exhibition signage is rectangular.",
131
+ card:
132
+ "Hairline top + bottom borders, no fill differentiation from page. " +
133
+ "Internal padding p-8 lg:p-12. Title in display serif; metadata (dates, gallery floor) in mono uppercase.",
134
+ input:
135
+ "Border-bottom only (1px ink), no full box. Label sits above in mono uppercase, tracking 0.18em.",
136
+ cta:
137
+ "Text-link with foreground ink, hover transitions to gallery-red. Never a chip, never a gradient. " +
138
+ "'Get tickets' is the single exception — solid ink rectangle.",
139
+ },
140
+
141
+ details: {
142
+ selectionBg: "hsl(var(--primary) / 0.18)",
143
+ selectionFg: "hsl(var(--foreground))",
144
+ focusRing: "1px solid hsl(var(--ring))",
145
+ scrollbarStyle: "thin",
146
+ },
147
+ };