@stylecrib/cli 0.0.0-stage → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/README.md +163 -2
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +7182 -0
  25. package/package.json +69 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/.anchor-render.png +0 -0
  38. package/themes/arc-stack/THEME.md +125 -0
  39. package/themes/arc-stack/audit.log.jsonl +6 -0
  40. package/themes/arc-stack/dismissals.jsonl +3 -0
  41. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  42. package/themes/arc-stack/theme.yml +153 -0
  43. package/themes/arc-stack/tokens.ts +29 -0
  44. package/themes/architectural/THEME.md +102 -0
  45. package/themes/architectural/tokens.ts +159 -0
  46. package/themes/atelier-radiance/THEME.md +93 -0
  47. package/themes/atelier-radiance/audit.log.jsonl +1 -0
  48. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  49. package/themes/atelier-radiance/theme.yml +130 -0
  50. package/themes/atelier-radiance/tokens.ts +29 -0
  51. package/themes/automotive-ev/THEME.md +87 -0
  52. package/themes/automotive-ev/tokens.ts +183 -0
  53. package/themes/automotive-luxury/THEME.md +88 -0
  54. package/themes/automotive-luxury/tokens.ts +175 -0
  55. package/themes/baby-modern/THEME.md +79 -0
  56. package/themes/baby-modern/tokens.ts +184 -0
  57. package/themes/banking-gravity/THEME.md +171 -0
  58. package/themes/banking-gravity/tokens.ts +169 -0
  59. package/themes/beauty-clean/THEME.md +92 -0
  60. package/themes/beauty-clean/tokens.ts +176 -0
  61. package/themes/beauty-luxury/THEME.md +96 -0
  62. package/themes/beauty-luxury/tokens.ts +178 -0
  63. package/themes/bento-modular/.anchor-render.png +0 -0
  64. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  65. package/themes/bento-modular/THEME.md +80 -0
  66. package/themes/bento-modular/audit.log.jsonl +3 -0
  67. package/themes/bento-modular/dismissals.jsonl +1 -0
  68. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  69. package/themes/bento-modular/theme.yml +83 -0
  70. package/themes/bento-modular/tokens.ts +27 -0
  71. package/themes/bookstore-indie/THEME.md +78 -0
  72. package/themes/bookstore-indie/tokens.ts +147 -0
  73. package/themes/brutalist/THEME.md +96 -0
  74. package/themes/brutalist/tokens.ts +151 -0
  75. package/themes/business-tiles/THEME.md +141 -0
  76. package/themes/business-tiles/tokens.ts +178 -0
  77. package/themes/cabana-poster/THEME.md +158 -0
  78. package/themes/cabana-poster/audit.log.jsonl +1 -0
  79. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  80. package/themes/cabana-poster/theme.yml +221 -0
  81. package/themes/cabana-poster/tokens.ts +34 -0
  82. package/themes/case-panel/THEME.md +126 -0
  83. package/themes/case-panel/audit.log.jsonl +2 -0
  84. package/themes/case-panel/tailwind.snippet.ts +15 -0
  85. package/themes/case-panel/theme.yml +153 -0
  86. package/themes/case-panel/tokens.ts +28 -0
  87. package/themes/cinematic-dark/THEME.md +97 -0
  88. package/themes/cinematic-dark/tokens.ts +195 -0
  89. package/themes/classic-car/THEME.md +86 -0
  90. package/themes/classic-car/tokens.ts +173 -0
  91. package/themes/cloud-friendly/THEME.md +152 -0
  92. package/themes/cloud-friendly/tokens.ts +181 -0
  93. package/themes/community-niche/THEME.md +102 -0
  94. package/themes/community-niche/tokens.ts +177 -0
  95. package/themes/corporate-grid/THEME.md +154 -0
  96. package/themes/corporate-grid/tokens.ts +182 -0
  97. package/themes/couture-luxury/THEME.md +85 -0
  98. package/themes/couture-luxury/tokens.ts +146 -0
  99. package/themes/creator-social/THEME.md +131 -0
  100. package/themes/creator-social/tokens.ts +249 -0
  101. package/themes/crypto-onchain/THEME.md +100 -0
  102. package/themes/crypto-onchain/tokens.ts +207 -0
  103. package/themes/cycling-brand/THEME.md +78 -0
  104. package/themes/cycling-brand/tokens.ts +185 -0
  105. package/themes/dating-friendly/THEME.md +102 -0
  106. package/themes/dating-friendly/tokens.ts +178 -0
  107. package/themes/dense-utility/THEME.md +85 -0
  108. package/themes/dense-utility/tokens.ts +155 -0
  109. package/themes/devtool-cli/THEME.md +100 -0
  110. package/themes/devtool-cli/tokens.ts +195 -0
  111. package/themes/devtool-docs/THEME.md +105 -0
  112. package/themes/devtool-docs/tokens.ts +177 -0
  113. package/themes/editorial/THEME.md +129 -0
  114. package/themes/editorial/audit.log.jsonl +2 -0
  115. package/themes/editorial/tailwind.snippet.ts +15 -0
  116. package/themes/editorial/theme.yml +173 -0
  117. package/themes/editorial/tokens.ts +29 -0
  118. package/themes/education-formal/THEME.md +154 -0
  119. package/themes/education-formal/audit.log.jsonl +1 -0
  120. package/themes/education-formal/tailwind.snippet.ts +15 -0
  121. package/themes/education-formal/theme.yml +186 -0
  122. package/themes/education-formal/tokens.ts +29 -0
  123. package/themes/education-warm/THEME.md +91 -0
  124. package/themes/education-warm/tokens.ts +185 -0
  125. package/themes/ember-poster/README.md +79 -0
  126. package/themes/ember-poster/THEME.md +101 -0
  127. package/themes/ember-poster/audit.log.jsonl +17 -0
  128. package/themes/ember-poster/package.json +34 -0
  129. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  130. package/themes/ember-poster/theme.yml +109 -0
  131. package/themes/ember-poster/tokens.ts +27 -0
  132. package/themes/enterprise-cloud/THEME.md +139 -0
  133. package/themes/enterprise-cloud/tokens.ts +179 -0
  134. package/themes/enterprise-tech/.anchor-render.png +0 -0
  135. package/themes/enterprise-tech/THEME.md +167 -0
  136. package/themes/enterprise-tech/audit.log.jsonl +1 -0
  137. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  138. package/themes/enterprise-tech/theme.yml +202 -0
  139. package/themes/enterprise-tech/tokens.ts +29 -0
  140. package/themes/ev-charging/THEME.md +94 -0
  141. package/themes/ev-charging/tokens.ts +185 -0
  142. package/themes/farm-direct/THEME.md +92 -0
  143. package/themes/farm-direct/tokens.ts +180 -0
  144. package/themes/fintech-card/THEME.md +96 -0
  145. package/themes/fintech-card/tokens.ts +191 -0
  146. package/themes/fintech-trust/THEME.md +94 -0
  147. package/themes/fintech-trust/tokens.ts +192 -0
  148. package/themes/food-blog/THEME.md +98 -0
  149. package/themes/food-blog/tokens.ts +183 -0
  150. package/themes/forum-classic/THEME.md +100 -0
  151. package/themes/forum-classic/tokens.ts +168 -0
  152. package/themes/fresh-plate/.anchor-render.png +0 -0
  153. package/themes/fresh-plate/THEME.md +144 -0
  154. package/themes/fresh-plate/audit.log.jsonl +2 -0
  155. package/themes/fresh-plate/dismissals.jsonl +3 -0
  156. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  157. package/themes/fresh-plate/theme.yml +189 -0
  158. package/themes/fresh-plate/tokens.ts +30 -0
  159. package/themes/furniture-modern/THEME.md +94 -0
  160. package/themes/furniture-modern/tokens.ts +176 -0
  161. package/themes/gaming-esports/THEME.md +146 -0
  162. package/themes/gaming-esports/tokens.ts +199 -0
  163. package/themes/gaming-streamer/THEME.md +139 -0
  164. package/themes/gaming-streamer/tokens.ts +201 -0
  165. package/themes/glassmorphic-modern/THEME.md +119 -0
  166. package/themes/glassmorphic-modern/tokens.ts +174 -0
  167. package/themes/government-civic/THEME.md +138 -0
  168. package/themes/government-civic/tokens.ts +164 -0
  169. package/themes/gym-chain/THEME.md +79 -0
  170. package/themes/gym-chain/tokens.ts +196 -0
  171. package/themes/healthcare-bright/THEME.md +95 -0
  172. package/themes/healthcare-bright/tokens.ts +184 -0
  173. package/themes/home-decor/THEME.md +94 -0
  174. package/themes/home-decor/tokens.ts +177 -0
  175. package/themes/hotel-boutique/THEME.md +110 -0
  176. package/themes/hotel-boutique/tokens.ts +179 -0
  177. package/themes/hyperminimal-mono/THEME.md +91 -0
  178. package/themes/hyperminimal-mono/tokens.ts +150 -0
  179. package/themes/indie-art-game/THEME.md +107 -0
  180. package/themes/indie-art-game/tokens.ts +216 -0
  181. package/themes/insurance-legacy/THEME.md +101 -0
  182. package/themes/insurance-legacy/tokens.ts +182 -0
  183. package/themes/insurance-modern/THEME.md +103 -0
  184. package/themes/insurance-modern/tokens.ts +192 -0
  185. package/themes/kaiju-reveal/THEME.md +97 -0
  186. package/themes/kaiju-reveal/tokens.ts +185 -0
  187. package/themes/kinetic-data/THEME.md +172 -0
  188. package/themes/kinetic-data/audit.log.jsonl +1 -0
  189. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  190. package/themes/kinetic-data/theme.yml +207 -0
  191. package/themes/kinetic-data/tokens.ts +30 -0
  192. package/themes/kinetic-headline/.anchor-render.png +0 -0
  193. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  194. package/themes/kinetic-headline/THEME.md +78 -0
  195. package/themes/kinetic-headline/audit.log.jsonl +4 -0
  196. package/themes/kinetic-headline/dismissals.jsonl +1 -0
  197. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  198. package/themes/kinetic-headline/theme.yml +81 -0
  199. package/themes/kinetic-headline/tokens.ts +26 -0
  200. package/themes/law-firm/THEME.md +108 -0
  201. package/themes/law-firm/tokens.ts +158 -0
  202. package/themes/lawtech-modern/THEME.md +107 -0
  203. package/themes/lawtech-modern/tokens.ts +192 -0
  204. package/themes/linkedin-pro/THEME.md +102 -0
  205. package/themes/linkedin-pro/tokens.ts +174 -0
  206. package/themes/logistics-modern/THEME.md +94 -0
  207. package/themes/logistics-modern/tokens.ts +187 -0
  208. package/themes/magazine-glossy/THEME.md +74 -0
  209. package/themes/magazine-glossy/tokens.ts +158 -0
  210. package/themes/marker-mag/THEME.md +128 -0
  211. package/themes/marker-mag/audit.log.jsonl +1 -0
  212. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  213. package/themes/marker-mag/theme.yml +159 -0
  214. package/themes/marker-mag/tokens.ts +27 -0
  215. package/themes/marketplace-modern/THEME.md +135 -0
  216. package/themes/marketplace-modern/tokens.ts +186 -0
  217. package/themes/marketplace-vintage/THEME.md +110 -0
  218. package/themes/marketplace-vintage/tokens.ts +185 -0
  219. package/themes/maximalist/THEME.md +96 -0
  220. package/themes/maximalist/tokens.ts +168 -0
  221. package/themes/mid-century/THEME.md +109 -0
  222. package/themes/mid-century/tokens.ts +162 -0
  223. package/themes/motorcycle-brand/THEME.md +86 -0
  224. package/themes/motorcycle-brand/tokens.ts +174 -0
  225. package/themes/museum/THEME.md +83 -0
  226. package/themes/museum/tokens.ts +147 -0
  227. package/themes/music-streaming/THEME.md +101 -0
  228. package/themes/music-streaming/tokens.ts +187 -0
  229. package/themes/music-vinyl/THEME.md +98 -0
  230. package/themes/music-vinyl/tokens.ts +167 -0
  231. package/themes/nature-distilled/.anchor-render.png +0 -0
  232. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  233. package/themes/nature-distilled/THEME.md +81 -0
  234. package/themes/nature-distilled/audit.log.jsonl +2 -0
  235. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  236. package/themes/nature-distilled/theme.yml +91 -0
  237. package/themes/nature-distilled/tokens.ts +26 -0
  238. package/themes/news-tabloid/THEME.md +72 -0
  239. package/themes/news-tabloid/tokens.ts +158 -0
  240. package/themes/news-tech/THEME.md +75 -0
  241. package/themes/news-tech/tokens.ts +149 -0
  242. package/themes/newsletter/THEME.md +82 -0
  243. package/themes/newsletter/tokens.ts +138 -0
  244. package/themes/newspaper-classic/THEME.md +74 -0
  245. package/themes/newspaper-classic/tokens.ts +159 -0
  246. package/themes/nonprofit-arts/THEME.md +78 -0
  247. package/themes/nonprofit-arts/tokens.ts +157 -0
  248. package/themes/nonprofit-warm/THEME.md +105 -0
  249. package/themes/nonprofit-warm/tokens.ts +188 -0
  250. package/themes/outdoor-adventure/THEME.md +113 -0
  251. package/themes/outdoor-adventure/tokens.ts +181 -0
  252. package/themes/overland-broadside/THEME.md +119 -0
  253. package/themes/overland-broadside/audit.log.jsonl +1 -0
  254. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  255. package/themes/overland-broadside/theme.yml +138 -0
  256. package/themes/overland-broadside/tokens.ts +27 -0
  257. package/themes/performance-engineered/THEME.md +162 -0
  258. package/themes/performance-engineered/audit.log.jsonl +1 -0
  259. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  260. package/themes/performance-engineered/theme.yml +193 -0
  261. package/themes/performance-engineered/tokens.ts +29 -0
  262. package/themes/pet-food/THEME.md +78 -0
  263. package/themes/pet-food/tokens.ts +185 -0
  264. package/themes/pharma-clinical/THEME.md +164 -0
  265. package/themes/pharma-clinical/audit.log.jsonl +1 -0
  266. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  267. package/themes/pharma-clinical/theme.yml +201 -0
  268. package/themes/pharma-clinical/tokens.ts +29 -0
  269. package/themes/pill-editorial/THEME.md +125 -0
  270. package/themes/pill-editorial/audit.log.jsonl +1 -0
  271. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  272. package/themes/pill-editorial/theme.yml +168 -0
  273. package/themes/pill-editorial/tokens.ts +31 -0
  274. package/themes/podcast-warm/THEME.md +103 -0
  275. package/themes/podcast-warm/tokens.ts +192 -0
  276. package/themes/publisher-indie/THEME.md +78 -0
  277. package/themes/publisher-indie/tokens.ts +148 -0
  278. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  279. package/themes/raw-concrete/THEME.md +76 -0
  280. package/themes/raw-concrete/audit.log.jsonl +10 -0
  281. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  282. package/themes/raw-concrete/theme.yml +88 -0
  283. package/themes/raw-concrete/tokens.ts +27 -0
  284. package/themes/realestate-luxury/THEME.md +94 -0
  285. package/themes/realestate-luxury/tokens.ts +169 -0
  286. package/themes/realestate-marketplace/THEME.md +106 -0
  287. package/themes/realestate-marketplace/tokens.ts +183 -0
  288. package/themes/restaurant-modern/THEME.md +109 -0
  289. package/themes/restaurant-modern/tokens.ts +172 -0
  290. package/themes/runway-fashion/THEME.md +99 -0
  291. package/themes/runway-fashion/tokens.ts +167 -0
  292. package/themes/saturday-morning/THEME.md +117 -0
  293. package/themes/saturday-morning/tokens.ts +281 -0
  294. package/themes/schema.ts +235 -0
  295. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  296. package/themes/signal-dark/THEME.md +107 -0
  297. package/themes/signal-dark/tokens.ts +181 -0
  298. package/themes/soft-modern/THEME.md +91 -0
  299. package/themes/soft-modern/tokens.ts +166 -0
  300. package/themes/solar-residential/THEME.md +92 -0
  301. package/themes/solar-residential/tokens.ts +176 -0
  302. package/themes/sports-league/THEME.md +180 -0
  303. package/themes/sports-league/audit.log.jsonl +1 -0
  304. package/themes/sports-league/tailwind.snippet.ts +15 -0
  305. package/themes/sports-league/theme.yml +213 -0
  306. package/themes/sports-league/tokens.ts +32 -0
  307. package/themes/stadium-sport/THEME.md +114 -0
  308. package/themes/stadium-sport/tokens.ts +187 -0
  309. package/themes/streetwear-hype/THEME.md +100 -0
  310. package/themes/streetwear-hype/tokens.ts +174 -0
  311. package/themes/studio-architect/THEME.md +108 -0
  312. package/themes/studio-architect/tokens.ts +162 -0
  313. package/themes/studio-photographer/THEME.md +88 -0
  314. package/themes/studio-photographer/tokens.ts +164 -0
  315. package/themes/team-kanban/.anchor-render.png +0 -0
  316. package/themes/team-kanban/THEME.md +167 -0
  317. package/themes/team-kanban/audit.log.jsonl +2 -0
  318. package/themes/team-kanban/dismissals.jsonl +1 -0
  319. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  320. package/themes/team-kanban/theme.yml +209 -0
  321. package/themes/team-kanban/tokens.ts +35 -0
  322. package/themes/telehealth-modern/THEME.md +95 -0
  323. package/themes/telehealth-modern/tokens.ts +197 -0
  324. package/themes/tourism-board/THEME.md +111 -0
  325. package/themes/tourism-board/tokens.ts +173 -0
  326. package/themes/toys-modern/THEME.md +79 -0
  327. package/themes/toys-modern/tokens.ts +200 -0
  328. package/themes/travel-luxury/THEME.md +95 -0
  329. package/themes/travel-luxury/tokens.ts +162 -0
  330. package/themes/vacation-rental/THEME.md +105 -0
  331. package/themes/vacation-rental/tokens.ts +174 -0
  332. package/themes/vault-reel/THEME.md +134 -0
  333. package/themes/vault-reel/audit.log.jsonl +3 -0
  334. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  335. package/themes/vault-reel/theme.yml +167 -0
  336. package/themes/vault-reel/tokens.ts +30 -0
  337. package/themes/vet-modern/THEME.md +79 -0
  338. package/themes/vet-modern/tokens.ts +194 -0
  339. package/themes/web3-restraint/THEME.md +87 -0
  340. package/themes/web3-restraint/tokens.ts +154 -0
  341. package/themes/wellness-active/THEME.md +102 -0
  342. package/themes/wellness-active/tokens.ts +203 -0
  343. package/themes/wellness-spa/THEME.md +93 -0
  344. package/themes/wellness-spa/tokens.ts +173 -0
  345. package/themes/y2k-chrome/THEME.md +118 -0
  346. package/themes/y2k-chrome/tokens.ts +249 -0
  347. package/themes/yoga-studio/THEME.md +76 -0
  348. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,188 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const nonprofitWarm: Direction = {
4
+ name: "nonprofit-warm",
5
+ ethos:
6
+ "charity:water yellow signal · Wikimedia serif restraint · Doctors Without Borders warm-red urgency · 350.org activist serif · GiveDirectly tabular trust",
7
+ references: [
8
+ { brand: "charity:water", trait: "yellow signal + warm cream + documentary photography" },
9
+ { brand: "Wikimedia Foundation", trait: "warm cream + serif headlines + restrained chrome" },
10
+ { brand: "Doctors Without Borders / MSF", trait: "warm cream + warm-red signal + field photography" },
11
+ { brand: "350.org", trait: "deep cream + activist serif + grassroots warmth" },
12
+ { brand: "GiveDirectly", trait: "cream + structured nonprofit-tabular impact data" },
13
+ ],
14
+ feel:
15
+ "Warm cream paper, serif headlines that read like a printed annual report, and photographic " +
16
+ "storytelling that puts the people first. One restrained give-button signal — warm-yellow on " +
17
+ "cream — earns attention without ever feeling slick. The whole surface telegraphs trust: " +
18
+ "emotionally honest, structurally clear, with the financials and the field reports both visible " +
19
+ "in the same calm hierarchy.",
20
+
21
+ fonts: {
22
+ display: {
23
+ family: "Source Serif 4",
24
+ fallback: ["Source Serif Pro", "Iowan Old Style", "Charter", "Georgia", "serif"],
25
+ from: "Wikimedia/350.org humanist serif — annual-report headline weight without academic stiffness",
26
+ googleFont: "Source+Serif+4",
27
+ weights: [400, 600, 700],
28
+ },
29
+ body: {
30
+ family: "Source Sans 3",
31
+ fallback: ["Source Sans Pro", "Inter", "system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
32
+ from: "Wikimedia/charity:water humanist sans — warm, readable, never corporate-flat",
33
+ googleFont: "Source+Sans+3",
34
+ weights: [400, 500, 600, 700],
35
+ },
36
+ mono: {
37
+ family: "JetBrains Mono",
38
+ fallback: ["IBM Plex Mono", "ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
39
+ from: "impact-data tables, financial statements, beneficiary counts — instrument feel for numbers",
40
+ googleFont: "JetBrains+Mono",
41
+ weights: [400, 500],
42
+ },
43
+ },
44
+
45
+ typography: {
46
+ headingTracking: "-0.012em", // Source Serif at display scale wants a hair tighter
47
+ bodyTracking: "0",
48
+ fontFeatureSettings: '"liga", "kern", "tnum", "ss01"',
49
+ h1ScaleClamp: "clamp(2.25rem, 5.5vw, 4rem)", // emotional but not theatrical — annual-report cover scale
50
+ bodyBaseSize: "1.0625rem", // 17px — slightly larger for trust and accessibility
51
+ bodyLineHeight: "1.7", // magazine-generous; nonprofit stories read slow on purpose
52
+ },
53
+
54
+ colors: {
55
+ background: { hsl: "38 35% 95%", from: "warm cream paper — charity:water/Wikimedia stock, ledger-warm" },
56
+ foreground: { hsl: "24 28% 14%", from: "warm-deep ink — softer than blue-black, has empathy in it" },
57
+ card: { hsl: "38 30% 98%", from: "card surface — one tier brighter than paper, never pure white" },
58
+ popover: { hsl: "38 30% 98%", from: "popover surface — same as card" },
59
+ primary: { hsl: "8 72% 44%", from: "Doctors Without Borders warm red — urgency without anger, used for give CTAs" },
60
+ primaryForeground: { hsl: "38 35% 95%", from: "warm cream on warm red" },
61
+ secondary: { hsl: "38 25% 90%", from: "warm paper, one tier deeper — section dividers, quote-block backgrounds" },
62
+ secondaryForeground: { hsl: "24 28% 14%", from: "warm ink on warm paper" },
63
+ muted: { hsl: "38 22% 88%", from: "muted surface — sidebars, footers, secondary panels" },
64
+ mutedForeground: { hsl: "24 18% 36%", from: "secondary text — bylines, captions, last-updated stamps" },
65
+ accent: { hsl: "44 88% 62%", from: "charity:water signal yellow — the give-button accent, sun-warm" },
66
+ accentForeground: { hsl: "24 28% 14%", from: "warm ink on signal yellow (yellow can't carry white text accessibly)" },
67
+ border: { hsl: "30 18% 82%", from: "hairline rule — annual-report ledger line, warm-toned not gray" },
68
+ input: { hsl: "30 18% 82%", from: "same as border — single hairline language" },
69
+ ring: { hsl: "8 72% 44%", from: "primary warm-red — focus ring matches give-CTA accent" },
70
+ destructive: { hsl: "0 75% 42%", from: "alert red, more saturated than the primary urgency-red" },
71
+ destructiveForeground: { hsl: "38 35% 95%", from: "warm cream on alert red" },
72
+ brand: {
73
+ paper: { hsl: "38 35% 95%", from: "the warm cream — semantic background, also page surface in print analog" },
74
+ ink: { hsl: "24 28% 14%", from: "the warm-deep ink — semantic foreground, also body prose" },
75
+ "give-yellow": { hsl: "44 88% 62%", from: "charity:water signal — the give-button color, sun-warm" },
76
+ "field-red": { hsl: "8 72% 44%", from: "MSF/350.org urgency red — restrained, used for primary CTA only" },
77
+ "trust-green": { hsl: "150 38% 36%", from: "GiveDirectly verified-data green — for impact-stat check marks and progress" },
78
+ "ink-soft": { hsl: "24 22% 26%", from: "secondary headings and deck text — softer than primary ink" },
79
+ },
80
+ },
81
+
82
+ spacing: {
83
+ base: 4,
84
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128], // low-to-medium density — story breathing
85
+ containerMax: "max-w-5xl", // 1024px — wider than editorial (photo room), narrower than dashboard
86
+ containerPadding: "px-5 lg:px-10",
87
+ sectionPadding: {
88
+ hero: "pt-20 pb-16 lg:pt-28 lg:pb-24",
89
+ default: "py-16 lg:py-24",
90
+ tight: "py-10 lg:py-14",
91
+ },
92
+ },
93
+
94
+ radius: {
95
+ base: "0.25rem", // 4px — gently softened ledger-rect, never pillow
96
+ pillsAllowed: false, // no pills — pills read web-app/marketing-slick; nonprofit uses rectangles and rules
97
+ },
98
+
99
+ shadows: {
100
+ style: "minimal",
101
+ utilities: {
102
+ "hairline-bottom":
103
+ "0 1px 0 0 hsl(var(--border))",
104
+ "card-paper":
105
+ "0 1px 2px 0 hsl(24 28% 14% / 0.04), " +
106
+ "0 4px 10px 0 hsl(24 28% 14% / 0.05)",
107
+ "give-glow":
108
+ "0 0 0 1px hsl(var(--give-yellow) / 0.5), " +
109
+ "0 4px 16px hsl(var(--give-yellow) / 0.3)",
110
+ },
111
+ },
112
+
113
+ motion: {
114
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
115
+ durations: {
116
+ reveal: 1000,
117
+ loop: 3000,
118
+ ambient: 12000,
119
+ },
120
+ keyframes: {
121
+ "fade-rise": {
122
+ css:
123
+ "from { opacity: 0; transform: translateY(20px); }\n" +
124
+ "to { opacity: 1; transform: translateY(0); }",
125
+ defaultDuration: 1000,
126
+ iteration: "once",
127
+ purpose: "section entrance — gentle rise, never theatrical, story-paced",
128
+ },
129
+ "count-up": {
130
+ css:
131
+ "from { opacity: 0; }\n" +
132
+ "to { opacity: 1; }",
133
+ defaultDuration: 1800,
134
+ iteration: "once",
135
+ purpose: "impact-stat opacity reveal — pair with JS counter for the number itself (people served, wells dug)",
136
+ },
137
+ "progress-fill": {
138
+ css:
139
+ "from { width: 0%; }\n" +
140
+ "to { width: var(--progress, 0%); }",
141
+ defaultDuration: 1600,
142
+ iteration: "once",
143
+ purpose: "campaign progress bar — fundraising goal, vaccination progress; honest, never gamified",
144
+ },
145
+ "give-pulse": {
146
+ css:
147
+ "0%, 100% { box-shadow: 0 0 0 0 hsl(var(--give-yellow) / 0.55); }\n" +
148
+ "50% { box-shadow: 0 0 0 10px hsl(var(--give-yellow) / 0); }",
149
+ defaultDuration: 2800,
150
+ iteration: "infinite",
151
+ purpose: "the single Donate CTA breathes — never more than one per page, never on a secondary action",
152
+ },
153
+ },
154
+ respectsReducedMotion: true,
155
+ },
156
+
157
+ density: "low",
158
+
159
+ patterns: {
160
+ button:
161
+ "Default = ghost: 1px --border, foreground text, hover bg-secondary. " +
162
+ "Primary 'Donate' / 'Give' = solid --give-yellow fill with --ink text (yellow + dark for accessible contrast). " +
163
+ "Secondary 'Take action' = solid --field-red fill with paper text (urgency red, used sparingly). " +
164
+ "Tertiary = inline text link, --foreground color, underline always visible (accessibility-first). " +
165
+ "Buttons are rectangles with 0.25rem radius — never pills, never gradients.",
166
+ card:
167
+ "Soft 0.25rem corners, hairline border (--border), bg-card (one tier above paper). " +
168
+ "Story-card variant: full-bleed photo top, prose body p-6 lg:p-8, byline in mono. " +
169
+ "Impact-stat card: oversized serif number, body sans label, optional --trust-green check glyph. " +
170
+ "No drop shadows on story cards; .card-paper utility allowed for floating impact panels.",
171
+ input:
172
+ "Full box, 1px --border, bg-card, 0.25rem radius. " +
173
+ "Donation-amount input has prefix '$' in --muted-foreground; preset amount buttons sit below as a row of ghost buttons. " +
174
+ "Focus = 2px --ring with 2px offset — accessibility-first, never thin.",
175
+ cta:
176
+ "The Give/Donate CTA is the single visual anchor per page — solid --give-yellow rectangle with --ink text, " +
177
+ "optional give-pulse loop, optional give-glow shadow. " +
178
+ "Secondary CTAs ('Read the report', 'Volunteer') are ghost buttons or text links. " +
179
+ "Never two yellow buttons on the same screen — the signal loses its meaning.",
180
+ },
181
+
182
+ details: {
183
+ selectionBg: "hsl(var(--give-yellow) / 0.4)",
184
+ selectionFg: "hsl(var(--foreground))",
185
+ focusRing: "2px solid hsl(var(--ring))",
186
+ scrollbarStyle: "auto",
187
+ },
188
+ };
@@ -0,0 +1,113 @@
1
+ # Design Direction — Outdoor Adventure
2
+
3
+ ## Ethos
4
+ Patagonia earth · REI utility · Powder magazine speed · Nike Trail urgency · National Park Service signage clarity · Black Diamond rescue-orange
5
+
6
+ ## Feel
7
+ Earth-toned, photo-heavy, sans-serif headlines that feel athletic. Hero image is always a real outdoor scene — mountains, snow, trail, water. The brand says "go outside" in every surface choice; the UI gets out of the way of the photography.
8
+
9
+ ## Reference brands
10
+ - **Patagonia** → earth-toned catalog photography. Greens, browns, golden-hour skin tones; photography is the brand.
11
+ - **REI** → utility-first retail layout. Specs, stats, and gear sit on the page like a price tag — honest and legible.
12
+ - **Powder magazine** → condensed headline speed. Big, fast, ALL-CAPS display sans over a slope shot.
13
+ - **Nike Trail Running** → athletic urgency. The CTA reads like a start-line bib number.
14
+ - **US National Park Service** → signage clarity. Brown-and-white routed-wood typography logic; one read, no hesitation.
15
+ - **Black Diamond** → rescue-orange gear branding. The primary is a safety color, not a marketing color.
16
+
17
+ ## Tokens
18
+ HSL triples in `src/index.css`. 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.
19
+
20
+ Surface stack is **warm cream paper** (background) → **white** (card) → **warm cream paper deeper** (secondary/muted/accent). Depth comes from hairline borders and the `.shadow-photo` utility under hero images, never from blanket drop-shadows.
21
+
22
+ Brand tokens: `--forest` (Patagonia green), `--mountain` (alpine blue), `--sky` (bluebird sky), `--earth` (Patagonia brown), `--snow` (cool snowfield white). These are the **palette of the landscape** — used for badges, category accents, illustration fills, and chart strokes. They are not the primary CTA color.
23
+
24
+ Primary is **rescue-orange** (`18 92% 52%`) — the Black Diamond / Petzl safety hue. Use it for one CTA per surface; it should feel like the only orange thing on a mountain.
25
+
26
+ ## Typography
27
+ - **Display:** Anton (Powder magazine condensed sans). h1–h4, ALL CAPS by default, tracking `0.02em`. Anton is high-contrast and tall — pairs with athletic copy and full-bleed photography.
28
+ - **Body:** Inter (Patagonia/REI body voice). Base 16px, line-height 1.6. Tracking `0`. Inter is the neutral that lets the photography lead — the type does not perform.
29
+ - **Mono:** JetBrains Mono. Elevation, distance, pace, time — anywhere a trail stat needs tabular numerics. `"tnum"` on by default.
30
+
31
+ H1 uses `clamp(2.5rem, 7vw, 5.5rem)` — signage-loud at the top of the page. Numbers always use `font-variant-numeric: tabular-nums`. Font features: `"ss01", "cv11", "tnum"`.
32
+
33
+ ## Spacing
34
+ - **Container:** `max-w-7xl px-4 lg:px-8`. Landscape photography needs width; mountains demand horizontal.
35
+ - **Section padding tiers:**
36
+ - Hero: `pt-20 pb-16 lg:pt-28 lg:pb-24`
37
+ - Default: `py-16 lg:py-24`
38
+ - Tight: `py-12 lg:py-16`
39
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 48 64 96. Medium-low density — photography needs breathing room around it.
40
+
41
+ ## Color
42
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier. Pure white is allowed for cards only; **pure black is forbidden** — `--foreground` (`220 20% 14%`) is the deep alpine ink.
43
+
44
+ The background is a warm cream (`40 18% 96%`), not a pure white — it is paper from a Patagonia catalog, not a SaaS dashboard. Cool whites are reserved for `--snow` (snowfield illustration use).
45
+
46
+ ## Radius
47
+ `--radius: 0.25rem` (4px). **Subtle — gear-catalog rectangular.** Pills are disallowed (`pillsAllowed: false`) — they read consumer-lifestyle, not field gear. Hardware and signage are rectangular; this UI mirrors that.
48
+
49
+ ## Shadows
50
+ **Minimal.** Two utilities:
51
+ - `.hairline` — 1px ring in `--border` for cards. The default surface elevation.
52
+ - `.shadow-photo` — `0 12px 24px -12px hsl(220 20% 14% / 0.35)`. Bottom-only lift, applied to hero images so the photograph reads as a printed object on the cream paper, not a flat tile.
53
+
54
+ No glows, no layered soft-shadows, no inner highlights. The shadow is photography's job, not the UI's.
55
+
56
+ ## Motion
57
+ Four keyframes:
58
+ - `fade-rise` (800ms) — standard content entrance under a hero photo.
59
+ - `ken-burns` (1200ms) — hero photo reveal. Slow zoom (1 → 1.08) + fade. Documentary cadence; the landscape settles into place.
60
+ - `parallax` (1200ms tied to scroll) — slow vertical shift, gives depth without theatrics.
61
+ - `scale-in` (600ms) — stats counting up. Elevation, distance, pace tickers.
62
+
63
+ Reveal duration is **1200ms** on the hero — slow on purpose, the landscape deserves the time. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — wrapped in a media query in every motion utility; ken-burns and parallax collapse to a static reveal.
64
+
65
+ ## Component patterns
66
+ - **Buttons:** primary is **solid orange filled, ALL CAPS, font-display (Anton)**, tracking `0.04em`, `rounded-sm`. It reads like a trail-sign or a start-line bib. Secondary is ghost (border + foreground text, also ALL CAPS condensed). **No pill shapes** — rectangular only.
67
+ - **Cards:** hairline 1px border, `bg-card` (white) on `bg-background` (cream paper), `rounded-sm`, `p-6 lg:p-8`. Title in `font-display`. When the card leads with a photo, apply `.shadow-photo` to the image, never to the card.
68
+ - **Inputs:** full `rounded-sm` box, 1px border, `bg-card`. Focus = `2px solid var(--ring) / 0.6` (rescue-orange). Label above in `font-display` small-caps; helper text below in `mutedForeground`.
69
+ - **CTAs:** primary filled orange ALL CAPS button is the default. Tertiary is a foreground-color text link with a 1px underline at 4px offset — trail-sign honest, no decoration.
70
+
71
+ ## Component families
72
+ None at install time. As `*Stat`, `*TrailCard`, `*GearTile`, `*RouteBadge` families emerge in the project, the Director lists them here with their shared pattern.
73
+
74
+ ## Recommended rich media
75
+
76
+ **Cover medium.** Wide landscape photography is the lead. Hero images are 16:9 or 21:9, full-bleed under the headline. Drone footage carries the same role in video. Athletic action shots (skiing, climbing, hiking, paddling) anchor mid-page; trail-map illustrations sit beside route data.
77
+
78
+ **AI tool recommendations.**
79
+ - *Photography:* **Midjourney** or **Flux**. Prompt pattern: `"Patagonia catalog photography, golden hour, alpine landscape, 35mm Kodak Ektachrome, drone perspective"`. Vary lens (35mm / 50mm / drone), film stock (Ektachrome / Portra / Provia), and time-of-day (golden hour / blue hour / pre-dawn) to keep a set cohesive.
80
+ - *Video:* **Sora**, **Runway**, or **Pika**. Prompt pattern: `"drone shot, mountain ridge at dawn, slow pan, cinematic"`. Hold shots long; this language does not cut fast.
81
+ - *Trail-map illustration:* **Recraft**. Prompt pattern: `"topographic line illustration, USGS map aesthetic, single-weight stroke, brown-on-cream"`.
82
+ - *Hero overlays:* prefer **attributed photographers** when budget allows — the Chris Burkard / Jimmy Chin pedigree. AI fills the gaps; attribution carries the brand.
83
+
84
+ **Aspect ratios.**
85
+ - **16:9 or 21:9** for hero landscapes. Never vertical for landscape — mountains demand horizontal.
86
+ - **1:1** for product / gear shots.
87
+ - **3:4** for athlete portraits.
88
+
89
+ **Color grading.** Warm golden-hour highlights with cool shadows. Never oversaturated. Preserve the air — atmospheric haze on distant ridges is part of the look. Skin tones run warm, never orange.
90
+
91
+ **Performance budgets.**
92
+ - Hero photos: ≤200 KB AVIF/WebP at 1920w.
93
+ - Hero videos: ≤8 MB at 1080p, muted autoplay loop, mobile fallback to a still frame.
94
+ - Lazy-load anything below the fold; the first paint is the hero photo and the headline.
95
+
96
+ **What to AVOID.**
97
+ - Stock photography with watermarks.
98
+ - Generic forest stock (the un-located "trees and a path" shot).
99
+ - Fake "AI mountain" images with rendered-looking peaks, plastic snow, or impossible geology.
100
+ - Polished studio product photography — this is field gear, not luxury goods. Show wear, dust, sweat.
101
+
102
+ **Accessibility.** Alt-text describes the place when possible (`"looking northeast from Triolet Glacier, French Alps"`), not just the subject. Decorative imagery uses `aria-hidden="true"`. Captions credit the photographer.
103
+
104
+ ## Details
105
+ - **Selection:** `hsl(var(--primary) / 0.25)` background, foreground text — a glow of rescue-orange.
106
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.6)` — visible, rescue-orange, never quiet.
107
+ - **Scrollbar:** thin.
108
+
109
+ ## Exceptions
110
+ 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.
111
+
112
+ ## Revisions
113
+ - Initial direction, generated at install time.
@@ -0,0 +1,181 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const outdoorAdventure: Direction = {
4
+ // identity is constrained by the schema's name union; outdoor-adventure
5
+ // is introduced as a new direction and cast through the existing slot.
6
+ name: "outdoor-adventure",
7
+ ethos:
8
+ "Patagonia earth · REI utility · Powder magazine speed · " +
9
+ "Nike Trail urgency · National Park Service signage clarity",
10
+ references: [
11
+ { brand: "Patagonia", trait: "earth-toned catalog photography" },
12
+ { brand: "REI", trait: "utility-first retail layout" },
13
+ { brand: "Powder magazine", trait: "condensed headline speed" },
14
+ { brand: "Nike Trail Running", trait: "athletic urgency" },
15
+ { brand: "US National Park Service", trait: "signage clarity" },
16
+ { brand: "Black Diamond", trait: "rescue-orange gear branding" },
17
+ ],
18
+ feel:
19
+ "Earth-toned, photo-heavy, sans-serif headlines that feel athletic. " +
20
+ "Hero image is always a real outdoor scene — mountains, snow, trail, water. " +
21
+ "The brand says 'go outside' in every surface choice; the UI gets out of " +
22
+ "the way of the photography.",
23
+
24
+ fonts: {
25
+ display: {
26
+ family: "Anton",
27
+ fallback: ["Oswald", "Impact", "Haettenschweiler", "sans-serif"],
28
+ from: "Powder magazine headline feel — condensed sans, athletic copy",
29
+ googleFont: "Anton",
30
+ weights: [400],
31
+ },
32
+ body: {
33
+ family: "Inter",
34
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
35
+ from: "Patagonia/REI body voice — clean, neutral, lets the photography lead",
36
+ googleFont: "Inter",
37
+ weights: [400, 500, 600],
38
+ },
39
+ mono: {
40
+ family: "JetBrains Mono",
41
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
42
+ from: "elevation, distance, time stats — tabular numerics for trail data",
43
+ googleFont: "JetBrains+Mono",
44
+ weights: [400, 500],
45
+ },
46
+ },
47
+
48
+ typography: {
49
+ headingTracking: "0.02em", // condensed display sans benefits from slight openness
50
+ bodyTracking: "0",
51
+ fontFeatureSettings: '"ss01", "cv11", "tnum"',
52
+ h1ScaleClamp: "clamp(2.5rem, 7vw, 5.5rem)", // big, signage-loud
53
+ bodyBaseSize: "1rem",
54
+ bodyLineHeight: "1.6",
55
+ },
56
+
57
+ colors: {
58
+ background: { hsl: "40 18% 96%", from: "warm cream paper — Patagonia catalog stock, never pure white" },
59
+ foreground: { hsl: "220 20% 14%", from: "deep ink with slight blue bias — feels alpine" },
60
+ card: { hsl: "0 0% 100%", from: "white card surface — lifts off the cream paper subtly" },
61
+ popover: { hsl: "0 0% 100%", from: "same as card" },
62
+ primary: { hsl: "18 92% 52%", from: "Black Diamond / Petzl rescue-orange — the trail-sign CTA" },
63
+ primaryForeground: { hsl: "40 18% 96%", from: "cream paper on rescue-orange" },
64
+ secondary: { hsl: "40 14% 92%", from: "cream paper, one tier deeper — REI shelf neutral" },
65
+ secondaryForeground: { hsl: "220 20% 14%", from: "alpine ink on warm neutral" },
66
+ muted: { hsl: "40 14% 92%", from: "same as secondary; differentiation by usage, not color" },
67
+ mutedForeground: { hsl: "220 12% 38%", from: "secondary text — slate, like NPS small print" },
68
+ accent: { hsl: "40 18% 88%", from: "cream paper, deeper still — hover surface" },
69
+ accentForeground: { hsl: "220 20% 14%", from: "alpine ink on warm neutral" },
70
+ border: { hsl: "30 14% 82%", from: "warm hairline — gear-catalog rule, not cool gray" },
71
+ input: { hsl: "30 14% 82%", from: "same as border" },
72
+ ring: { hsl: "18 92% 52%", from: "primary rescue-orange, used for focus only" },
73
+ destructive: { hsl: "4 78% 46%", from: "warning red — distinct from rescue-orange, alert-louder" },
74
+ destructiveForeground: { hsl: "40 18% 96%", from: "cream paper on alert" },
75
+ brand: {
76
+ forest: { hsl: "145 35% 30%", from: "Patagonia forest green — outerwear, conservation" },
77
+ mountain: { hsl: "210 30% 40%", from: "alpine blue — distant ridges, shadowed snow" },
78
+ sky: { hsl: "200 50% 70%", from: "high-altitude sky — bluebird-day backdrop" },
79
+ earth: { hsl: "30 25% 35%", from: "Patagonia brown — soil, bark, well-worn leather" },
80
+ snow: { hsl: "210 8% 92%", from: "cool white for snowfields — distinct from cream paper bg" },
81
+ },
82
+ },
83
+
84
+ spacing: {
85
+ base: 4,
86
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 96], // photography needs breathing room
87
+ containerMax: "max-w-7xl", // landscape photography wants width
88
+ containerPadding: "px-4 lg:px-8",
89
+ sectionPadding: {
90
+ hero: "pt-20 pb-16 lg:pt-28 lg:pb-24",
91
+ default: "py-16 lg:py-24",
92
+ tight: "py-12 lg:py-16",
93
+ },
94
+ },
95
+
96
+ radius: {
97
+ base: "0.25rem", // 4px — gear-catalog feel, not pillowy
98
+ pillsAllowed: false, // rectangular reads field-gear, not lifestyle app
99
+ },
100
+
101
+ shadows: {
102
+ style: "minimal",
103
+ utilities: {
104
+ "hairline":
105
+ "0 0 0 1px hsl(var(--border))", // gear-catalog rule for cards
106
+ "shadow-photo":
107
+ "0 12px 24px -12px hsl(220 20% 14% / 0.35)", // subtle bottom-only lift for hero images
108
+ },
109
+ },
110
+
111
+ motion: {
112
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
113
+ durations: {
114
+ reveal: 1200, // bold reveal — landscapes deserve time
115
+ loop: 3200,
116
+ ambient: 28000,
117
+ },
118
+ keyframes: {
119
+ "fade-rise": {
120
+ css:
121
+ "from { opacity: 0; transform: translateY(16px); }\n" +
122
+ "to { opacity: 1; transform: translateY(0); }",
123
+ defaultDuration: 800,
124
+ iteration: "once",
125
+ purpose: "standard content entrance — short rise under a hero photo",
126
+ },
127
+ "ken-burns": {
128
+ css:
129
+ "from { transform: scale(1); opacity: 0; }\n" +
130
+ "20% { opacity: 1; }\n" +
131
+ "to { transform: scale(1.08); opacity: 1; }",
132
+ defaultDuration: 1200,
133
+ iteration: "once",
134
+ purpose: "hero photo reveal — slow zoom + fade, documentary cadence",
135
+ },
136
+ "parallax": {
137
+ css:
138
+ "from { transform: translateY(0); }\n" +
139
+ "to { transform: translateY(-12%); }",
140
+ defaultDuration: 1200,
141
+ iteration: "once",
142
+ purpose: "slow vertical shift on scroll — gives landscapes depth without theatrics",
143
+ },
144
+ "scale-in": {
145
+ css:
146
+ "from { opacity: 0; transform: scale(0.92); }\n" +
147
+ "to { opacity: 1; transform: scale(1); }",
148
+ defaultDuration: 600,
149
+ iteration: "once",
150
+ purpose: "stats counting up — elevation, distance, time tickers",
151
+ },
152
+ },
153
+ respectsReducedMotion: true,
154
+ },
155
+
156
+ density: "medium",
157
+
158
+ patterns: {
159
+ button:
160
+ "Solid orange filled primary (bg-primary, primary-foreground text, font-display, " +
161
+ "ALL CAPS, tracking 0.04em, rounded-sm). Secondary is ghost (border, foreground text, " +
162
+ "also ALL CAPS condensed). No pill shapes — rectangular reads trail-sign, not app chrome.",
163
+ card:
164
+ "Hairline border (1px var(--border)), bg-card, rounded-sm. Internal padding p-6 lg:p-8. " +
165
+ "Title in font-display (Anton). When the card leads with a photo, apply .shadow-photo " +
166
+ "to the image and let the card itself stay shadow-free.",
167
+ input:
168
+ "Full rounded-sm box, 1px border, bg-card. Focus = 2px primary ring at 60% opacity. " +
169
+ "Label above in uppercase font-display at small size; helper text below in mutedForeground.",
170
+ cta:
171
+ "Primary filled orange ALL CAPS button is the default. Secondary CTAs use ghost button. " +
172
+ "Tertiary is a foreground-color text link with a 1px underline offset 4px — trail-sign honest.",
173
+ },
174
+
175
+ details: {
176
+ selectionBg: "hsl(var(--primary) / 0.25)",
177
+ selectionFg: "hsl(var(--foreground))",
178
+ focusRing: "2px solid hsl(var(--ring) / 0.6)",
179
+ scrollbarStyle: "thin",
180
+ },
181
+ };
@@ -0,0 +1,119 @@
1
+ # Overland Broadside
2
+
3
+ > Monumental heritage brand-book register — condensed all-caps display at broadside scale, full-bleed automotive photography under directional light, paper-white canvas broken by inverted deep-navy bands, a single hot-orange accent used as punctuation inside headlines.
4
+
5
+ **Slug:** `overland-broadside` — **Surface:** web — **Density:** balanced
6
+
7
+ ## Influence
8
+
9
+ Heritage automotive marque relaunches (the Bronco / Scout / Land Cruiser / Defender register — where a legacy nameplate returns and the marketing is monumental and confident). Broadsheet poster print at brand-book scale. The type-as-substance discipline of a proper marque book. Also 1970s automotive brochure design (huge condensed caps, full-bleed hero photography, editorial captions).
10
+
11
+ ## Signature move
12
+
13
+ Monumental condensed all-caps display at broadside scale — 240px hero
14
+ headline breaking across multiple lines, filling most of the viewport
15
+ width, letter-spacing crushed to -0.03em. Inside the counterforms of
16
+ the display letters, masked photo tiles show product / lifestyle
17
+ imagery — the type IS a container for the imagery, not just labeling.
18
+ One word in the hero headline flips to the accent orange as punctuation
19
+ (never the whole line, never rotating, never cycling). Full-bleed
20
+ automotive / product photography sits under directional light on the
21
+ white canvas — no framed cards, no shadows, no corner treatments.
22
+ Deep-navy inverted bands break the white rhythm with monumental caps
23
+ set even bigger than the white-canvas hero, pinning through scroll so
24
+ the type holds while the page moves past. Border-radius is 2px — a
25
+ microscopic softening, not a design element (buttons, image containers,
26
+ small tags). Small pill nav sits transparent over hero, transitions to
27
+ solid ink on scroll. NO mono-caps eyebrows, NO dot-metadata rows, NO
28
+ spec-sheet triads, NO "TRUSTED BY" rows, NO three-column feature grids
29
+ — brand character sits in the display type, the photography, and the
30
+ navy/orange discipline, not in ornamented labels.
31
+
32
+ ## Palette
33
+
34
+ - **bg:** `#FFFFFF`
35
+ - **surface:** `#F0F0F0`
36
+ - **ink:** `#010101`
37
+ - **accent:** `#FF5432`
38
+ - **secondary:** `#11232F`
39
+ - **signal:** `#007AFF`
40
+
41
+ ## Typography
42
+
43
+ - **Display:** Anton (free, Google Fonts) or Bebas Neue as broader-market fallback — 400 weight, UPPERCASE always, letter-spacing tightened to -0.03em at monumental scale (heavier tracking negative than typical). At scale — 240px hero-monumental (fluid, capped near viewport width), 96px section-headline, 48px inverted-band-headline, 32px h3. The paid reference face is a scout-sans-semicond-bold-family condensed sans; Anton is the closest free approximation with the right condensed-caps proportions.
44
+ - **Body:** Inter Tight (variable 100-900) — 400/500 for body, 600 for captions and specs. Mixed-case, line-height 1.5, 16px body copy. Caption specs get 13px 500-weight with slightly loosened tracking for legibility inside dark bands.
45
+ - **Mono:** IBM Plex Mono — narrowly scoped to spec-sheet callouts (dimensions, drivetrain, capacity numbers) inside product-detail sections. NEVER used for section eyebrows, corner tags, metadata rows, or bylines (those are universal-slop-blocklist hits regardless of face).
46
+ - **Scale:** 1.5 (perfect fifth — deliberately wide contrast so the monumental display shouts at broadside scale and the body settles into calm captioning)
47
+
48
+ ## Motion
49
+
50
+ Ships live in the section renderer (no external dependencies):
51
+ 1. Photo-fill hero headline reveal — IntersectionObserver + CSS transitions. Each letterform of the monumental display headline has a masked photo tile inside its counterform; on scroll into view, the tiles translate up from 20% opacity to full over 700ms cubic-bezier(0.16,1,0.3,1), staggered 60ms per letter.
52
+ 2. Accent-word color shift — one word inside the hero headline flips from ink-black to accent-orange after the letter-stagger completes (300ms delay). It stays orange; no cycling, no rotation.
53
+ 3. Inverted band scroll-triggered lock — the "For [brand] in all of us" style monumental navy band pins for 400vh, giant caps holding while the surrounding white content scrolls past. Uses position: sticky with a scroll-linked scale transform on the type (0.94 → 1.0 over the pin duration).
54
+ 4. Full-bleed product hero — the vehicle photograph enters with a subtle 800ms cubic-bezier scale (1.05 → 1.0) + fade, so the composition settles rather than pops. Triggered on first paint, not on scroll.
55
+ 5. Duo-tile compare — the "duo that does it all" two-vehicle side-by-side reveals right tile 200ms after left tile with matched scale-in.
56
+ 6. Nav pill — background transitions to solid ink-black + white-text at scroll offset 80px; before that it sits transparent over the hero. 200ms transition.
57
+ 7. Microinteractions — CSS transitions on link hover states (underline expands left-to-right 200ms), active-state scale(0.98) on primary buttons.
58
+ 8. prefers-reduced-motion: reduce — all keyframe animations pause, transitions become instant, photo-fill tiles start at full opacity (no stagger), inverted-band pin still fires (it's structural), state changes still fire (they're content).
59
+
60
+ Customer installs these as dependencies for the deeper motion tier:
61
+ - Lenis — smooth inertial scroll across the whole page (the pin-and-hold on the inverted band needs inertial scroll to feel monumental).
62
+ - GSAP ScrollTrigger — orchestrated multi-element timelines for the photo-fill letter stagger + inverted-band scroll-linked scale.
63
+ - Custom branded preloader with condensed-caps typography-in-progress reveal.
64
+
65
+ Motion character: weighty, cinematic, never bouncy. Custom cubic-bezier(0.16,1,0.3,1) for reveal easings, cubic-bezier(0.65,0,0.35,1) for hover/state transitions. All motion serves the "monumental heritage brand" tone — nothing is quick, nothing is cute.
66
+
67
+
68
+ ## Imagery
69
+
70
+ Full-bleed automotive / adventure-hardware photography under DIRECTIONAL
71
+ LIGHT — vehicles emerging from shadow, hero shots with a single strong
72
+ light source (dusk, dawn, headlight against dark landscape), or
73
+ three-quarter product shots on pure white with hard shadow anchoring
74
+ them to the ground. NEVER on a gradient background, NEVER floating in a
75
+ card, NEVER with a soft box-shadow. Photo-fill letters use tightly
76
+ cropped product / lifestyle details — a fender line, a wheel arch, a
77
+ headlight, a hand on a steering wheel, a landscape — masked cleanly to
78
+ the letterform. Cream/tan `#EDE9E8` band at the footer as a warm
79
+ breathing space — the only warmth in an otherwise cool composition.
80
+ Placeholder compositions use clearly-labeled FPO photograph blocks so
81
+ the layout reads legible without shipping licensed imagery.
82
+
83
+ ## Best for
84
+
85
+ - Heritage automotive marque relaunches — a legacy nameplate returning to market
86
+ - Premium automotive marketing where the vehicle is the hero (SUVs, trucks, adventure vehicles)
87
+ - Adventure-hardware brands (overlanding kit, outdoor equipment) that want cinematic-brand register instead of REI-catalog register
88
+ - Heritage brand relaunches broadly — anything with a monumental type-plus-photography story to tell
89
+ - Founder-scale product launches where the physical object photographs beautifully
90
+ - Deck / brand-book / launch pages where the point is monumental confidence, not information density
91
+
92
+ ## Reject if
93
+
94
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
95
+
96
+ - Border-radius greater than 2px anywhere on the page — the 2px is a microscopic softening on functional chrome only, not a design gesture
97
+ - Rounded pill buttons or fully-rounded CTAs — buttons are sharp-cornered with 2px radius, that's it
98
+ - Multiple accent colors used decoratively — orange is punctuation inside headlines and small CTA fill only; navy is inverted-band background only; blue is interactive-state only. No accent lives outside its role.
99
+ - Sans-serif humanist display like Inter Display or Söhne at hero scale — display face must carry condensed-caps monumental proportions (Anton, Bebas Neue, or paid scout-sans-semicond-bold-family)
100
+ - Title case or sentence case on display type — display is ALWAYS uppercase in this register
101
+ - Loose or default letter-spacing on display — display tracks -0.03em at monumental scale, tighter than typical, and MUST stay negative
102
+ - Corporate polish — no shadow-md cards, no soft glow, no gradient hero backdrop, no mesh gradients
103
+ - Three-tier pricing cards or feature-pillar grids — the composition refuses SaaS defaults structurally, information laid out as full-bleed bands and side-by-side comparisons, not card grids
104
+ - Center-aligned everything — hero composition is left-weighted and grid-breaking; monumental type intentionally violates the baseline
105
+ - Warm palettes — this register is cool-and-crisp (white, ink, navy, orange as punctuation only), never espresso/cream/amber flooding the canvas
106
+ - The photo-fill move on more than the hero headline — it's a one-time signature, not a repeated decoration; secondary headlines are solid ink
107
+ - Emoji or decorative unicode marks anywhere in the composition — the display type carries all the personality
108
+ - Grain or texture overlay on the white canvas — grain is reserved for the darker inverted-band overlays only
109
+
110
+ ## Banned defaults (inherited + theme-specific)
111
+
112
+ - claude-cream (#F4F1EA + serif + #D97757)
113
+ - void+acid (near-black bg + single bright acid-green or vermilion accent)
114
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
115
+ - tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
116
+ - uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
117
+ - monumental-caps-plus-decoration (the display type IS the design; the moment you add mono-caps eyebrows, corner tags, or dot-metadata rows on top of it the register collapses into generic 2020s-agency slop)
118
+ - photo-fill-everywhere (the letterform photo-fill is a signature ONCE — hero only. Applied to every headline, it becomes a decorative gimmick and the register dies)
119
+ - cool-palette-plus-warm-photography (if the photography is warm-tungsten-lit, the palette here still stays cool navy/orange — do not drift into amber/gold to match the imagery, that's the ember-poster register)
@@ -0,0 +1 @@
1
+ {"slug":"overland-broadside","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T01:08:53.523Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T01:08:53.532Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T01:09:35.321Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family E rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/E/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-04T01:09:35.323Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-04T01:08:53.523Z"}
@@ -0,0 +1,17 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: overland-broadside
3
+ export const overlandBroadsideTailwindExtend = {
4
+ colors: {
5
+ bg: "#FFFFFF",
6
+ surface: "#F0F0F0",
7
+ ink: "#010101",
8
+ accent: "#FF5432",
9
+ secondary: "#11232F",
10
+ signal: "#007AFF",
11
+ },
12
+ fontFamily: {
13
+ display: ["Anton (free, Google Fonts) or Bebas Neue as broader-market fallback — 400 weight, UPPERCASE always, letter-spacing tightened to -0.03em at monumental scale (heavier tracking negative than typical). At scale — 240px hero-monumental (fluid, capped near viewport width), 96px section-headline, 48px inverted-band-headline, 32px h3. The paid reference face is a scout-sans-semicond-bold-family condensed sans; Anton is the closest free approximation with the right condensed-caps proportions."],
14
+ body: ["Inter Tight (variable 100-900) — 400/500 for body, 600 for captions and specs. Mixed-case, line-height 1.5, 16px body copy. Caption specs get 13px 500-weight with slightly loosened tracking for legibility inside dark bands."],
15
+ mono: ["IBM Plex Mono — narrowly scoped to spec-sheet callouts (dimensions, drivetrain, capacity numbers) inside product-detail sections. NEVER used for section eyebrows, corner tags, metadata rows, or bylines (those are universal-slop-blocklist hits regardless of face)."],
16
+ },
17
+ };