@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,159 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // Note: "newspaper-classic" is not yet in the Direction["name"] enum.
4
+ // The schema is closed; until it is extended this file casts the name.
5
+ // All other fields fully validate.
6
+
7
+ export const newspaperClassic: Direction = {
8
+ name: "newspaper-classic" as Direction["name"],
9
+ ethos: "NYT Cheltenham · WaPo dignified daily · Le Monde five-column page · Guardian section ribbons · WSJ stipple authority",
10
+ references: [
11
+ { brand: "The New York Times", trait: "Cheltenham-style display serif, five-column front-page grid" },
12
+ { brand: "The Washington Post", trait: "Democracy-Dies-in-Darkness gravitas, breaking-news ticker" },
13
+ { brand: "Le Monde", trait: "broadsheet column rhythm, dateline as masthead anchor" },
14
+ { brand: "The Guardian", trait: "section ribbons across the page top, byline grids" },
15
+ { brand: "The Wall Street Journal", trait: "stippled portrait engravings, business-formal restraint" },
16
+ ],
17
+ feel:
18
+ "Cream newsprint stock with deep ink. Tall stately display serif headlines over a wide five-column page. " +
19
+ "Section nav reads like the top of a folded broadsheet; bylines and read-times sit in small caps. " +
20
+ "Restrained red is reserved for the breaking-news ticker and the masthead rule — never for decoration.",
21
+
22
+ fonts: {
23
+ display: {
24
+ family: "Playfair Display",
25
+ fallback: ["Cheltenham", "Georgia Pro", "Iowan Old Style", "Georgia", "serif"],
26
+ from: "Cheltenham-style high-contrast display serif — NYT front-page headline feel",
27
+ googleFont: "Playfair+Display",
28
+ weights: [400, 500, 700, 900],
29
+ },
30
+ body: {
31
+ family: "Source Serif Pro",
32
+ fallback: ["Charter", "Iowan Old Style", "Georgia", "serif"],
33
+ from: "WaPo/Guardian body serif — long-form readable on newsprint stock",
34
+ googleFont: "Source+Serif+Pro",
35
+ weights: [400, 600],
36
+ },
37
+ mono: {
38
+ family: "JetBrains Mono",
39
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
40
+ from: "datelines, bylines, read-times — instrument feel for editorial metadata",
41
+ googleFont: "JetBrains+Mono",
42
+ weights: [400, 500],
43
+ },
44
+ },
45
+
46
+ typography: {
47
+ headingTracking: "-0.018em", // Playfair sits tighter; broadsheet headlines need it
48
+ bodyTracking: "0",
49
+ fontFeatureSettings: '"liga", "onum", "tnum"',
50
+ h1ScaleClamp: "clamp(2.5rem, 6.5vw, 5.25rem)",
51
+ bodyBaseSize: "1.0625rem", // 17px — comfortable for long reading
52
+ bodyLineHeight: "1.62",
53
+ },
54
+
55
+ colors: {
56
+ background: { hsl: "40 28% 95%", from: "cream newsprint stock — slightly warmer than editorial paper" },
57
+ foreground: { hsl: "220 22% 11%", from: "deep newspaper ink, never pure black" },
58
+ card: { hsl: "40 30% 97%", from: "lighter cream card — sits one tier above the page" },
59
+ popover: { hsl: "40 30% 97%", from: "same as card; depth from rules, not fill" },
60
+ primary: { hsl: "0 65% 38%", from: "NYT op-ed red / WaPo breaking red — restrained masthead mark" },
61
+ primaryForeground: { hsl: "40 28% 95%", from: "cream on red" },
62
+ secondary: { hsl: "40 20% 90%", from: "deeper cream — quiet panels and inset boxes" },
63
+ secondaryForeground: { hsl: "220 22% 11%", from: "ink on cream" },
64
+ muted: { hsl: "40 20% 90%", from: "same as secondary; differentiation by usage" },
65
+ mutedForeground: { hsl: "220 12% 36%", from: "slate ink — bylines, datelines, read-times" },
66
+ accent: { hsl: "40 22% 88%", from: "deeper cream still — hover states and section panels" },
67
+ accentForeground: { hsl: "220 22% 11%", from: "ink on accent cream" },
68
+ border: { hsl: "220 14% 78%", from: "newsprint rule — visible column divider, not a hairline" },
69
+ input: { hsl: "220 14% 78%", from: "same as border — full-width input rules" },
70
+ ring: { hsl: "0 65% 38%", from: "primary, focus only" },
71
+ destructive: { hsl: "0 72% 45%", from: "alert red, more saturated than primary" },
72
+ destructiveForeground: { hsl: "40 28% 95%", from: "cream on alert" },
73
+ brand: {
74
+ ink: { hsl: "220 22% 11%", from: "deep newspaper ink — also semantic foreground" },
75
+ newsprint: { hsl: "40 28% 95%", from: "cream stock — also semantic background" },
76
+ "ink-soft": { hsl: "220 18% 26%", from: "secondary headings, decks, kicker text" },
77
+ "rule-strong": { hsl: "220 22% 11%", from: "page-top thick rule under masthead" },
78
+ "ticker-red": { hsl: "0 65% 38%", from: "breaking-news ticker base — = primary, named for intent" },
79
+ stipple: { hsl: "220 20% 36%", from: "WSJ stipple-portrait midtone, for caption motifs" },
80
+ },
81
+ },
82
+
83
+ spacing: {
84
+ base: 4,
85
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96], // newsprint rhythm
86
+ containerMax: "max-w-6xl", // wide — five-column grid needs the room
87
+ containerPadding: "px-6 lg:px-10",
88
+ sectionPadding: {
89
+ hero: "pt-16 pb-12 lg:pt-24 lg:pb-20",
90
+ default: "py-16 lg:py-24",
91
+ tight: "py-10 lg:py-14",
92
+ },
93
+ },
94
+
95
+ radius: {
96
+ base: "0", // sharp — newsprint convention
97
+ pillsAllowed: false,
98
+ },
99
+
100
+ shadows: {
101
+ style: "minimal",
102
+ utilities: {
103
+ "rule-bottom":
104
+ "0 1px 0 0 hsl(var(--border))", // column divider rule
105
+ "rule-thick":
106
+ "0 3px 0 0 hsl(var(--foreground))", // page-top thick rule under masthead
107
+ },
108
+ },
109
+
110
+ motion: {
111
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
112
+ durations: {
113
+ reveal: 800,
114
+ loop: 30000, // ticker speed
115
+ ambient: 60000,
116
+ },
117
+ keyframes: {
118
+ "fade-rise": {
119
+ css:
120
+ "from { opacity: 0; transform: translateY(16px); }\n" +
121
+ "to { opacity: 1; transform: translateY(0); }",
122
+ defaultDuration: 800,
123
+ iteration: "once",
124
+ purpose: "section entrance — subtle, never theatrical",
125
+ },
126
+ "ticker-scroll": {
127
+ css:
128
+ "from { transform: translateX(0); }\n" +
129
+ "to { transform: translateX(-50%); }",
130
+ defaultDuration: 30000,
131
+ iteration: "infinite",
132
+ purpose: "breaking-news ticker strip — slow horizontal crawl",
133
+ },
134
+ },
135
+ respectsReducedMotion: true,
136
+ },
137
+
138
+ density: "medium",
139
+
140
+ patterns: {
141
+ button:
142
+ "Text-link CTAs in --ink with underline on hover. The single masthead CTA (Subscribe) may be a solid --ink fill with --newsprint text. " +
143
+ "Section ribbons use --ticker-red flat fill, no border. No pill buttons — print convention.",
144
+ card:
145
+ "Top rule (1px --border) + bottom rule, no side borders. No fill differentiation from page. " +
146
+ "Title in display serif, kicker in mono uppercase, byline in mono small caps. Padding p-6 lg:p-8.",
147
+ input:
148
+ "Border-bottom only (1px --ink-soft). Label sits above in mono small caps. No full box.",
149
+ cta:
150
+ "Text-link with --ink color, underline on hover. Subscribe pill is the sole solid fill, --ink bg + --newsprint fg.",
151
+ },
152
+
153
+ details: {
154
+ selectionBg: "hsl(var(--primary) / 0.2)",
155
+ selectionFg: "hsl(var(--foreground))",
156
+ focusRing: "1px solid hsl(var(--ring))",
157
+ scrollbarStyle: "thin",
158
+ },
159
+ };
@@ -0,0 +1,78 @@
1
+ # Design Direction — Nonprofit-Arts
2
+
3
+ ## Ethos
4
+ NY Phil deep wine + cream · Royal Ballet formal serif · SF Symphony season-calendar gravity · Lincoln Center curtain-up restraint · Carnegie Hall masthead pedigree
5
+
6
+ ## Feel
7
+ An orchestra's printed season-book translated to the web. Deep wine red on warm ivory cream, formal serif display in small caps for performance titles, mono for dates and opus numbers. The page is slightly elevated, slightly hushed — but anchored in functional list-driven content: season calendar, ensemble roster, donor recognition. It must read like a program-book, not a marketing brochure.
8
+
9
+ ## Reference brands
10
+ - **New York Philharmonic** → deep wine red, formal serif, season-calendar driven.
11
+ - **Royal Ballet** → ivory program-book stock, Trajan-feel display, formal capitals.
12
+ - **San Francisco Symphony** → concert-program serif, performance-row layout.
13
+ - **Lincoln Center** → curtain-up restraint, deep red marker, generous whitespace.
14
+ - **Carnegie Hall** → masthead pedigree, donor recognition tiers, formal capitals.
15
+
16
+ ## Tokens
17
+ Surface stack is **program ivory** (background) → **lighter ivory** (card) → **deeper ivory** (secondary/muted/accent). Brand tokens: `--wine`, `--ivory`, `--ink`, `--gold`.
18
+
19
+ Primary is `--wine`. Used for performance markers, focus ring, the hero CTA fill, and selection wash. `--gold` is reserved exclusively for donor-circle tier markers ("Maestro Circle", "Composer's Circle") — never elsewhere.
20
+
21
+ ## Typography
22
+ - **Display:** Cormorant SC (small caps) — Royal Ballet / Carnegie masthead feel. h1–h4. Tracking `0.04em` — small caps need positive tracking.
23
+ - **Body:** Cormorant Garamond (roman) — same family, lowercase variant for prose. 17px / 1.7.
24
+ - **Mono:** JetBrains Mono. Dates, opus numbers, donor levels.
25
+
26
+ H1 uses `clamp(2.5rem, 7vw, 5.5rem)`. Performance titles use display SC at body+2 — they read like marquee titles.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-6xl px-6 lg:px-12` — wider than editorial, accommodates the 5-column season grid.
30
+ - **Sections:** hero `pt-28 pb-16 lg:pt-44 lg:pb-28`; default `py-20 lg:py-32`; tight `py-12 lg:py-20`.
31
+ - **Scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128 160.
32
+
33
+ ## Color
34
+ No hex. Tokens only. Wine appears as fill only on the single 'Subscribe to the season' / 'Buy tickets' CTA. Everywhere else it's a hover state, hairline accent, or selection wash. Gold appears only on donor tier names — `font-variant: small-caps`.
35
+
36
+ ## Radius
37
+ `--radius: 0`. Program books are sharp-cornered. Pills disallowed.
38
+
39
+ ## Shadows
40
+ **Soft (one).** Three utilities: `.hairline-bottom`, `.program-rule`, and `.curtain-wash` (24px diffused wine glow under the hero only — the curtain-up feeling). No drop shadows on cards.
41
+
42
+ ## Motion
43
+ Two keyframes: `fade-rise` (1200ms, ceremonial) and `wine-wash` (one-shot ambient under hero, opacity 0 → 0.06 over 2400ms). `prefers-reduced-motion` honored — `wine-wash` disables to a static state.
44
+
45
+ ## Component patterns
46
+ - **Buttons:** text-link CTAs with wine-on-hover. 'Buy tickets' / 'Subscribe to the season' is the single solid-fill — wine bg + ivory text + small-caps label.
47
+ - **Cards:** hairline rules, ivory-tier shift. Padding `p-8 lg:p-12`. Title in display SC; date + venue in mono; conductor / composer in body serif italic.
48
+ - **Inputs:** border-bottom only (1px wine-ink). Label above in display SC.
49
+ - **CTA links:** wine-ink → wine on hover. Never a chip, never a gradient.
50
+
51
+ ## Recommended rich media
52
+ Performance photography — only. Stage lighting, low-light orchestral pit shots, conductor portraits in profile, ensemble shots taken from the back of the hall. Color-graded to a warm tungsten cast (the actual color of stage light). Never event-PR photography, never crowd shots at galas, never "behind the scenes" lifestyle. Headshots are formal — concert-program style, often in performance attire.
53
+
54
+ **AI tool recommendations:** **Midjourney / Flux** with *"orchestra performance, warm tungsten stage lighting, deep shadows, photographed from the back of the hall"* or *"formal portrait, conductor, concert attire, soft window light"*. Avoid AI's tendency toward dramatic uplighting — concert lighting is warm and overhead, not theatrical.
55
+
56
+ **Aspect ratios:** 16:9 widescreen (concert hall convention), 3:4 portrait (conductor headshot), 21:9 ultra-wide (proscenium / stage-from-the-balcony hero shot only).
57
+
58
+ **Captions** in display SC small caps. Format: *"GUSTAVO DUDAMEL · MAHLER NO. 2 · GEFFEN HALL"*.
59
+
60
+ **Avoid:** gala-night PR photos, crowd shots, "behind the scenes" rehearsal candids that read marketing, gradients, glassmorphic, decorative SVG.
61
+
62
+ **Accessibility:** alt-text describes the performance — *"Orchestra performing under warm stage lights, conductor in profile, brass section visible."*
63
+
64
+ ## Component families
65
+ - `Performance` family — list row with date + composer + conductor + venue.
66
+ - `EnsembleMember` family — portrait + name + instrument + section.
67
+ - `DonorTier` family — named circle (Maestro / Composer's / Conductor's) + tier amount + donor list.
68
+
69
+ ## Details
70
+ - **Selection:** `hsl(var(--primary) / 0.22)` — wine wash.
71
+ - **Focus ring:** `1px solid hsl(var(--ring))`.
72
+ - **Scrollbar:** thin.
73
+
74
+ ## Exceptions
75
+ None yet.
76
+
77
+ ## Revisions
78
+ - Initial direction.
@@ -0,0 +1,157 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const nonprofitArts: Direction = {
4
+ name: "nonprofit-arts" as Direction["name"],
5
+ ethos:
6
+ "NY Phil deep wine + cream · Royal Ballet formal serif · SF Symphony season-calendar gravity · Lincoln Center curtain-up restraint · Carnegie Hall masthead pedigree",
7
+ references: [
8
+ { brand: "New York Philharmonic", trait: "deep wine red, formal serif, season-calendar driven" },
9
+ { brand: "Royal Ballet", trait: "ivory program-book stock, Trajan-feel display, formal capitals" },
10
+ { brand: "San Francisco Symphony", trait: "concert-program serif, performance-row layout" },
11
+ { brand: "Lincoln Center", trait: "curtain-up restraint, deep red marker, generous whitespace" },
12
+ { brand: "Carnegie Hall", trait: "masthead pedigree, donor recognition tiers, formal capitals" },
13
+ ],
14
+ feel:
15
+ "An orchestra's printed season-book made into a website. Deep wine red on warm ivory cream, formal " +
16
+ "serif display in small caps for performance titles, mono for dates and conductors. The page is " +
17
+ "atmospheric — slightly elevated, slightly hushed — but anchored in functional list-driven content " +
18
+ "(season calendar, ensemble, donor recognition).",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Cormorant SC",
23
+ fallback: ["Cormorant Garamond", "Trajan Pro", "EB Garamond", "Georgia", "serif"],
24
+ from: "Royal Ballet / Carnegie Hall masthead-capitals feel — small-caps display serif",
25
+ googleFont: "Cormorant+SC",
26
+ weights: [400, 500, 600, 700],
27
+ },
28
+ body: {
29
+ family: "Cormorant Garamond",
30
+ fallback: ["EB Garamond", "Iowan Old Style", "Georgia", "serif"],
31
+ from: "concert-program body serif — Cormorant's roman, slightly tighter than display",
32
+ googleFont: "Cormorant+Garamond",
33
+ weights: [400, 500, 600],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "performance dates, opus numbers, donor levels — concert-program tabular feel",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400, 500],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "0.04em",
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"tnum", "calt", "smcp"',
48
+ h1ScaleClamp: "clamp(2.5rem, 7vw, 5.5rem)",
49
+ bodyBaseSize: "1.0625rem",
50
+ bodyLineHeight: "1.7",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "38 32% 93%", from: "ivory program-book stock — Royal Ballet / Carnegie program" },
55
+ foreground: { hsl: "0 35% 12%", from: "deep wine-ink, almost black with a red undertone — concert ink" },
56
+ card: { hsl: "38 35% 96%", from: "lighter ivory — performance-row surface" },
57
+ popover: { hsl: "38 35% 96%", from: "matches card" },
58
+ primary: { hsl: "350 65% 28%", from: "deep wine red — NY Phil / Lincoln Center curtain-up red" },
59
+ primaryForeground: { hsl: "38 32% 93%", from: "ivory on wine" },
60
+ secondary: { hsl: "38 26% 88%", from: "deeper ivory — section divider, masthead row" },
61
+ secondaryForeground: { hsl: "0 35% 12%", from: "wine-ink on deeper ivory" },
62
+ muted: { hsl: "38 26% 88%", from: "same as secondary" },
63
+ mutedForeground: { hsl: "0 12% 38%", from: "concert-program gray — dates, opus numbers" },
64
+ accent: { hsl: "38 22% 84%", from: "hover surface" },
65
+ accentForeground: { hsl: "0 35% 12%", from: "wine-ink on hover" },
66
+ border: { hsl: "0 10% 78%", from: "program-page hairline rule, slightly warm" },
67
+ input: { hsl: "0 10% 78%", from: "same as border" },
68
+ ring: { hsl: "350 65% 28%", from: "wine red — focus" },
69
+ destructive: { hsl: "8 65% 38%", from: "sold-out / cancelled indicator, brighter than wine" },
70
+ destructiveForeground: { hsl: "38 32% 93%", from: "ivory on destructive" },
71
+ brand: {
72
+ wine: { hsl: "350 65% 28%", from: "the curtain-up wine red — also semantic primary" },
73
+ ivory: { hsl: "38 32% 93%", from: "program-book ivory — also semantic background" },
74
+ ink: { hsl: "0 35% 12%", from: "wine-ink black — also semantic foreground" },
75
+ gold: { hsl: "42 55% 50%", from: "donor-circle gold, used only on donor-tier markers" },
76
+ },
77
+ },
78
+
79
+ spacing: {
80
+ base: 4,
81
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160],
82
+ containerMax: "max-w-6xl",
83
+ containerPadding: "px-6 lg:px-12",
84
+ sectionPadding: {
85
+ hero: "pt-28 pb-16 lg:pt-44 lg:pb-28",
86
+ default: "py-20 lg:py-32",
87
+ tight: "py-12 lg:py-20",
88
+ },
89
+ },
90
+
91
+ radius: {
92
+ base: "0",
93
+ pillsAllowed: false,
94
+ },
95
+
96
+ shadows: {
97
+ style: "soft",
98
+ utilities: {
99
+ "hairline-bottom":
100
+ "0 1px 0 0 hsl(var(--border))",
101
+ "program-rule":
102
+ "0 1px 0 0 hsl(var(--border)), inset 0 1px 0 0 hsl(var(--border))",
103
+ "curtain-wash":
104
+ "0 24px 60px hsl(var(--primary) / 0.12)",
105
+ },
106
+ },
107
+
108
+ motion: {
109
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
110
+ durations: {
111
+ reveal: 1200,
112
+ loop: 3000,
113
+ ambient: 24000,
114
+ },
115
+ keyframes: {
116
+ "fade-rise": {
117
+ css:
118
+ "from { opacity: 0; transform: translateY(24px); }\n" +
119
+ "to { opacity: 1; transform: translateY(0); }",
120
+ defaultDuration: 1200,
121
+ iteration: "once",
122
+ purpose: "curtain-up entrance — slow, ceremonial",
123
+ },
124
+ "wine-wash": {
125
+ css:
126
+ "0% { opacity: 0; }\n" +
127
+ "100% { opacity: 0.06; }",
128
+ defaultDuration: 2400,
129
+ iteration: "once",
130
+ purpose: "hero ambient — wine-red ambient wash behind season hero",
131
+ },
132
+ },
133
+ respectsReducedMotion: true,
134
+ },
135
+
136
+ density: "low",
137
+
138
+ patterns: {
139
+ button:
140
+ "Text-link CTAs with wine on hover; 'Buy tickets' is the single solid-fill — wine bg + ivory text. " +
141
+ "Small-caps label inside the button. Pills disallowed.",
142
+ card:
143
+ "Hairline rules top + bottom, ivory-tier shift from background. Padding p-8 lg:p-12. " +
144
+ "Title in display SC (small caps); date + venue in mono; conductor/composer in body serif italic.",
145
+ input:
146
+ "Border-bottom only (1px wine-ink). Label above in display SC small caps.",
147
+ cta:
148
+ "Text-link with wine-ink, hover transitions to wine. The hero 'Subscribe to the season' is the single solid-fill exception.",
149
+ },
150
+
151
+ details: {
152
+ selectionBg: "hsl(var(--primary) / 0.22)",
153
+ selectionFg: "hsl(var(--foreground))",
154
+ focusRing: "1px solid hsl(var(--ring))",
155
+ scrollbarStyle: "thin",
156
+ },
157
+ };
@@ -0,0 +1,105 @@
1
+ # Design Direction — Nonprofit-Warm
2
+
3
+ ## Ethos
4
+ charity:water yellow signal · Wikimedia serif restraint · Doctors Without Borders warm-red urgency · 350.org activist serif · GiveDirectly tabular trust
5
+
6
+ ## Feel
7
+ Warm cream paper, serif headlines that read like a printed annual report, and photographic storytelling that puts the people first. One restrained give-button signal — warm-yellow on cream — earns attention without ever feeling slick. The whole surface telegraphs trust: emotionally honest, structurally clear, with the financials and the field reports both visible in the same calm hierarchy.
8
+
9
+ ## Reference brands
10
+ - **charity:water** → yellow signal + warm cream + documentary photography. The canonical "I trust where my $30 went" surface.
11
+ - **Wikimedia Foundation** → cream + serif + restrained chrome. Mission over marketing; the year-end appeal that doesn't feel like an ad.
12
+ - **Doctors Without Borders (MSF)** → warm cream + warm-red signal + field photography. Urgency without aggression.
13
+ - **350.org** → deep cream + activist serif + grassroots warmth. Movement aesthetic, not agency aesthetic.
14
+ - **GiveDirectly** → cream + structured + nonprofit-tabular impact data. The receipt is part of the design.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a purpose (give-CTA, impact-verified, field-photo-caption) and the brand it traces to.
18
+
19
+ Surface stack is **warm cream paper** (background) → **warm-card** (one tier brighter, never pure white) → **warm paper deeper** (secondary, muted). The warmth is in the cream — HSL hue stays in the 30–44 amber band across all neutrals. Cool grays here would feel corporate and break the empathy.
20
+
21
+ Brand tokens: `--paper`, `--ink`, `--ink-soft`, `--give-yellow` (charity:water signal), `--field-red` (MSF urgency), `--trust-green` (GiveDirectly verified-data). **The give-yellow is the one anchor accent** — it appears on the primary Donate CTA, in the active-state of the give-form, and nowhere else. Adding a second accent dilutes the call to action.
22
+
23
+ ## Typography
24
+ - **Display:** Source Serif 4. Annual-report headline weight without academic stiffness. h1–h4. Tracking `-0.012em`.
25
+ - **Body:** Source Sans 3 (humanist sans). Base **17px** with line-height **1.7** — slightly larger than default for trust and accessibility. Field stories read slow.
26
+ - **Mono:** JetBrains Mono. Impact data tables, financial statements, beneficiary counts, last-updated stamps. **Numbers in nonprofit work are not decoration — they are the receipt.** Tabular figures are mandatory.
27
+
28
+ H1 uses `clamp(2.25rem, 5.5vw, 4rem)` — emotional but not theatrical. The serif carries the gravity; oversizing reads as marketing.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-5xl px-5 lg:px-10` — 1024px. Wider than editorial (the field photos need room) but narrower than a dashboard.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-20 pb-16 lg:pt-28 lg:pb-24`
34
+ - Default: `py-16 lg:py-24`
35
+ - Tight: `py-10 lg:py-14`
36
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128. Low-to-medium density — story breathing.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier. Pure white and pure black are forbidden — `--paper` (warm cream) and `--ink` (warm-deep ink) replace them. The cream is non-negotiable: a cool-gray background here breaks the trust the surface is built to communicate.
40
+
41
+ **Accessibility-critical pairing:** `--give-yellow` carries `--ink` text, never paper text. The yellow is bright enough that white-on-yellow fails WCAG by a wide margin — and the dark text on bright yellow is part of the charity:water visual signature anyway.
42
+
43
+ ## Radius
44
+ `--radius: 0.25rem` (4px). Gently softened ledger-rect — annual-report convention. **Pills are disallowed** (`pillsAllowed: false`) — pills read web-app or DTC-marketing, both of which are wrong tones for mission-led work. Status and labels use rectangles or text rules.
45
+
46
+ ## Shadows
47
+ **Minimal style.** Three utilities ship:
48
+ - `.hairline-bottom` — 1px `--border` ledger line. Magazine column divider. Used between story sections and table rows.
49
+ - `.card-paper` — very light 1px + 4px stack. For impact-stat cards and floating panels.
50
+ - `.give-glow` — 1px `--give-yellow` ring + soft halo. **Reserved for the single Donate CTA per page** — never another use.
51
+
52
+ No drop shadows on story cards. No glow on heroes (the photography carries it).
53
+
54
+ ## Motion
55
+ Nonprofit motion is **slow, intentional, and earned**. Five keyframes, all reverent of the content:
56
+
57
+ - `fade-rise` — 1000ms once. Section entrance; gentle 20px rise. Story-paced, never theatrical.
58
+ - `count-up` — 1800ms once (opacity reveal; pair with a JS counter for the number itself). For impact stats: *242,000 people served*, *1,847 wells dug*. The number arriving is part of the message.
59
+ - `progress-fill` — 1600ms once. Campaign progress bars (fundraising goal, vaccination percentage). Width animates from 0 to `var(--progress)`. **Honest, never gamified** — no overshoot bounce, no celebration confetti.
60
+ - `give-pulse` — 2800ms infinite. The Donate CTA breathes. **One per page, ever.** Never on a secondary action.
61
+ - (no marquee, no parallax, no autoplay video carousel — these all break the trust tone.)
62
+
63
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — pulse freezes mid-state, progress bars resolve instantly to final width, count-up resolves to final number without animation.
64
+
65
+ ## Component patterns
66
+ - **Buttons:** ghost-default (1px `--border`, foreground text, hover `bg-secondary`). **Primary "Donate" / "Give" = solid `--give-yellow` fill with `--ink` text.** Secondary urgency action ("Take action," "Sign the petition") = solid `--field-red` with paper text, used sparingly. Tertiary = inline text link, foreground color, **underline always visible** (accessibility-first, not hover-only). Rectangles with 4px radius; never pills, never gradient fills.
67
+ - **Cards:** soft `0.25rem` corners, hairline `--border`, `bg-card`. **Story-card** variant: full-bleed photo top, prose body `p-6 lg:p-8`, byline in mono. **Impact-stat card**: oversized serif number, body sans label below, optional `--trust-green` check glyph. **Financial-card**: tabular-mono columns for revenue / programs / overhead — the transparency receipt.
68
+ - **Inputs:** full box, 1px `--border`, `bg-card`, `0.25rem` radius. **Donation-amount input** has `$` prefix in `--muted-foreground`; preset amount buttons ($10 / $25 / $50 / $100 / Other) sit below as a row of ghost buttons. Focus = 2px `--ring` with 2px offset — accessibility-first.
69
+ - **CTAs:** the Give/Donate CTA is the **single visual anchor per page** — solid yellow rectangle with ink text, optional `.give-pulse` loop, optional `.give-glow` shadow. Secondary CTAs ("Read the report," "Volunteer," "Subscribe") are ghost buttons or text links. **Never two yellow buttons on the same screen.**
70
+ - **Quotes (testimony / field voice):** large serif, italic, foreground color, no quotation-mark glyph (the type carries it). Attribution below in mono `text-sm`, `--muted-foreground` — *"— Amina, community health worker, Kakuma"*.
71
+ - **Tables (impact / financials):** tabular-mono numbers. Row separator 1px `--border`. Header row in body sans, `--muted-foreground`, uppercase, `tracking-wide`. **Total / subtotal rows** get `font-medium` and a 2px `--border` top.
72
+
73
+ ## Recommended rich media
74
+ Nonprofit-Warm is **photography-led**. The portraits and field shots ARE the story; the design is the frame.
75
+
76
+ 1. **Documentary portraiture** — single-subject, environmental, eye-contact, color-graded for warm cream tones (matches the paper). Kodak Portra 400 grading is the canonical reference. Always shot with consent, always with the subject's name and location in the caption.
77
+ 2. **Field photography** — context shots: a clinic, a classroom, a well being dug, a clean-water tap running. Documentary, not staged. **Never a smiling subject with a thumbs-up holding the donor's product** — this is the failure mode (and the cliché).
78
+ 3. **Hand-drawn maps and diagrams** — for "where the work happens" sections. Watercolor-style or letterpress-style, warm-palette. Built in Procreate or commissioned from illustrators; never AI.
79
+ 4. **Impact-receipt visualizations** — simple horizontal bar charts in `--trust-green` + `--ink`, mono labels, no 3D, no animation beyond `progress-fill`. The aesthetic is annual-report, not dashboard-SaaS.
80
+
81
+ **AI tool recommendations:** **Midjourney / Flux** for photography ONLY with strict prompts — *"documentary portrait, Sebastião Salgado lighting, 50mm, Kodak Portra 400, environmental subject"* — and **always disclose AI use** in the caption if the imagery is generative; AI photos of nonexistent beneficiaries is a trust-breaking failure mode. Prefer commissioned real photography or licensed editorial stock (Magnum, VII Photo, Panos Pictures). **Recraft** acceptable for the hand-drawn maps.
82
+
83
+ **Aspect ratios:** 3:2 landscape (photographic standard) or 4:5 portrait for environmental subjects. Hero images can be 21:9 letterbox-cinematic IF the photo earns it (a horizon, a landscape, a queue of people). Never 1:1 (Instagram aesthetic — wrong tone for the work).
84
+
85
+ **Video:** allowed for testimony and field documentary. Always with a poster image, never autoplay, always captioned. 30–90 seconds. ≤8 MB AV1. **Never a music-bed-over-stock-footage donor-marketing video** — that reads as agency work and tanks trust.
86
+
87
+ **Performance:** hero image ≤180 KB AVIF at 1600w; inline figures ≤100 KB. Mobile-first — nonprofit audiences include people on 3G in donor and field markets both. LCP under 2.5s with the hero photo loaded. If it slips, the photo is too large, not the framework.
88
+
89
+ **Avoid:** stock photography of "diverse hands joined together," logo soup of media mentions, white-saviorism imagery (subject as object, donor-perspective framing), gradient meshes, glassmorphic donation widgets, animated GIF "thank you" overlays, confetti or fireworks on form-submit, fake urgency countdowns, the word "disrupt."
90
+
91
+ **Accessibility:** alt text is mandatory and **describes the photograph as if for a blind donor** — *"A woman in a yellow headwrap fills a jerrycan at a hand-pumped well. Three children wait behind her in late afternoon light."* The image's caption (visible to all readers) credits the photographer and names the subject(s) with consent. **Captions are non-negotiable on photographs of people.**
92
+
93
+ ## Component families
94
+ None at install time. Expected first families as the project grows: `story-card`, `impact-stat`, `donation-form`, `financial-table`, `testimony-quote`, `progress-bar`, `field-gallery`.
95
+
96
+ ## Details
97
+ - **Selection:** `hsl(var(--give-yellow) / 0.4)` background, foreground text — the signal yellow highlights the reader's attention.
98
+ - **Focus ring:** `2px solid hsl(var(--ring))` with offset — accessibility-first, **never thin**. Nonprofit audiences include older donors and keyboard users; the ring earns its visibility.
99
+ - **Scrollbar:** `auto` (OS default). The chrome is the OS's; we don't redecorate. Quiet trust signal — we didn't even bother to skin the scrollbar, because we spent the design budget on the story.
100
+
101
+ ## Exceptions
102
+ None yet. When an intentional one-of-one violation lands, add it here with the reason — and the reason must trace back to the mission, not to a design preference.
103
+
104
+ ## Revisions
105
+ - Initial direction, generated at install time.