@stylecrib/cli 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/README.md +94 -9
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +1606 -467
  25. package/package.json +12 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/THEME.md +125 -0
  38. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  39. package/themes/arc-stack/theme.yml +153 -0
  40. package/themes/arc-stack/tokens.ts +29 -0
  41. package/themes/architectural/THEME.md +102 -0
  42. package/themes/architectural/tokens.ts +159 -0
  43. package/themes/atelier-radiance/THEME.md +93 -0
  44. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  45. package/themes/atelier-radiance/theme.yml +130 -0
  46. package/themes/atelier-radiance/tokens.ts +29 -0
  47. package/themes/automotive-ev/THEME.md +87 -0
  48. package/themes/automotive-ev/tokens.ts +183 -0
  49. package/themes/automotive-luxury/THEME.md +88 -0
  50. package/themes/automotive-luxury/tokens.ts +175 -0
  51. package/themes/baby-modern/THEME.md +79 -0
  52. package/themes/baby-modern/tokens.ts +184 -0
  53. package/themes/banking-gravity/THEME.md +171 -0
  54. package/themes/banking-gravity/tokens.ts +169 -0
  55. package/themes/beauty-clean/THEME.md +92 -0
  56. package/themes/beauty-clean/tokens.ts +176 -0
  57. package/themes/beauty-luxury/THEME.md +96 -0
  58. package/themes/beauty-luxury/tokens.ts +178 -0
  59. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  60. package/themes/bento-modular/THEME.md +80 -0
  61. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  62. package/themes/bento-modular/theme.yml +83 -0
  63. package/themes/bento-modular/tokens.ts +27 -0
  64. package/themes/bookstore-indie/THEME.md +78 -0
  65. package/themes/bookstore-indie/tokens.ts +147 -0
  66. package/themes/brutalist/THEME.md +96 -0
  67. package/themes/brutalist/tokens.ts +151 -0
  68. package/themes/business-tiles/THEME.md +141 -0
  69. package/themes/business-tiles/tokens.ts +178 -0
  70. package/themes/cabana-poster/THEME.md +158 -0
  71. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  72. package/themes/cabana-poster/theme.yml +221 -0
  73. package/themes/cabana-poster/tokens.ts +34 -0
  74. package/themes/case-panel/THEME.md +126 -0
  75. package/themes/case-panel/tailwind.snippet.ts +15 -0
  76. package/themes/case-panel/theme.yml +153 -0
  77. package/themes/case-panel/tokens.ts +28 -0
  78. package/themes/cinematic-dark/THEME.md +97 -0
  79. package/themes/cinematic-dark/tokens.ts +195 -0
  80. package/themes/classic-car/THEME.md +86 -0
  81. package/themes/classic-car/tokens.ts +173 -0
  82. package/themes/cloud-friendly/THEME.md +152 -0
  83. package/themes/cloud-friendly/tokens.ts +181 -0
  84. package/themes/community-niche/THEME.md +102 -0
  85. package/themes/community-niche/tokens.ts +177 -0
  86. package/themes/corporate-grid/THEME.md +154 -0
  87. package/themes/corporate-grid/tokens.ts +182 -0
  88. package/themes/couture-luxury/THEME.md +85 -0
  89. package/themes/couture-luxury/tokens.ts +146 -0
  90. package/themes/creator-social/THEME.md +131 -0
  91. package/themes/creator-social/tokens.ts +249 -0
  92. package/themes/crypto-onchain/THEME.md +100 -0
  93. package/themes/crypto-onchain/tokens.ts +207 -0
  94. package/themes/cycling-brand/THEME.md +78 -0
  95. package/themes/cycling-brand/tokens.ts +185 -0
  96. package/themes/dating-friendly/THEME.md +102 -0
  97. package/themes/dating-friendly/tokens.ts +178 -0
  98. package/themes/dense-utility/THEME.md +85 -0
  99. package/themes/dense-utility/tokens.ts +155 -0
  100. package/themes/devtool-cli/THEME.md +100 -0
  101. package/themes/devtool-cli/tokens.ts +195 -0
  102. package/themes/devtool-docs/THEME.md +105 -0
  103. package/themes/devtool-docs/tokens.ts +177 -0
  104. package/themes/editorial/THEME.md +129 -0
  105. package/themes/editorial/tailwind.snippet.ts +15 -0
  106. package/themes/editorial/theme.yml +173 -0
  107. package/themes/editorial/tokens.ts +29 -0
  108. package/themes/education-formal/THEME.md +154 -0
  109. package/themes/education-formal/tailwind.snippet.ts +15 -0
  110. package/themes/education-formal/theme.yml +186 -0
  111. package/themes/education-formal/tokens.ts +29 -0
  112. package/themes/education-warm/THEME.md +91 -0
  113. package/themes/education-warm/tokens.ts +185 -0
  114. package/themes/ember-poster/README.md +79 -0
  115. package/themes/ember-poster/THEME.md +101 -0
  116. package/themes/ember-poster/package.json +34 -0
  117. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  118. package/themes/ember-poster/theme.yml +109 -0
  119. package/themes/ember-poster/tokens.ts +27 -0
  120. package/themes/enterprise-cloud/THEME.md +139 -0
  121. package/themes/enterprise-cloud/tokens.ts +179 -0
  122. package/themes/enterprise-tech/THEME.md +167 -0
  123. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  124. package/themes/enterprise-tech/theme.yml +202 -0
  125. package/themes/enterprise-tech/tokens.ts +29 -0
  126. package/themes/ev-charging/THEME.md +94 -0
  127. package/themes/ev-charging/tokens.ts +185 -0
  128. package/themes/farm-direct/THEME.md +92 -0
  129. package/themes/farm-direct/tokens.ts +180 -0
  130. package/themes/fintech-card/THEME.md +96 -0
  131. package/themes/fintech-card/tokens.ts +191 -0
  132. package/themes/fintech-trust/THEME.md +94 -0
  133. package/themes/fintech-trust/tokens.ts +192 -0
  134. package/themes/food-blog/THEME.md +98 -0
  135. package/themes/food-blog/tokens.ts +183 -0
  136. package/themes/forum-classic/THEME.md +100 -0
  137. package/themes/forum-classic/tokens.ts +168 -0
  138. package/themes/fresh-plate/THEME.md +144 -0
  139. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  140. package/themes/fresh-plate/theme.yml +189 -0
  141. package/themes/fresh-plate/tokens.ts +30 -0
  142. package/themes/furniture-modern/THEME.md +94 -0
  143. package/themes/furniture-modern/tokens.ts +176 -0
  144. package/themes/gaming-esports/THEME.md +146 -0
  145. package/themes/gaming-esports/tokens.ts +199 -0
  146. package/themes/gaming-streamer/THEME.md +139 -0
  147. package/themes/gaming-streamer/tokens.ts +201 -0
  148. package/themes/glassmorphic-modern/THEME.md +119 -0
  149. package/themes/glassmorphic-modern/tokens.ts +174 -0
  150. package/themes/government-civic/THEME.md +138 -0
  151. package/themes/government-civic/tokens.ts +164 -0
  152. package/themes/gym-chain/THEME.md +79 -0
  153. package/themes/gym-chain/tokens.ts +196 -0
  154. package/themes/healthcare-bright/THEME.md +95 -0
  155. package/themes/healthcare-bright/tokens.ts +184 -0
  156. package/themes/home-decor/THEME.md +94 -0
  157. package/themes/home-decor/tokens.ts +177 -0
  158. package/themes/hotel-boutique/THEME.md +110 -0
  159. package/themes/hotel-boutique/tokens.ts +179 -0
  160. package/themes/hyperminimal-mono/THEME.md +91 -0
  161. package/themes/hyperminimal-mono/tokens.ts +150 -0
  162. package/themes/indie-art-game/THEME.md +107 -0
  163. package/themes/indie-art-game/tokens.ts +216 -0
  164. package/themes/insurance-legacy/THEME.md +101 -0
  165. package/themes/insurance-legacy/tokens.ts +182 -0
  166. package/themes/insurance-modern/THEME.md +103 -0
  167. package/themes/insurance-modern/tokens.ts +192 -0
  168. package/themes/kaiju-reveal/THEME.md +97 -0
  169. package/themes/kaiju-reveal/tokens.ts +185 -0
  170. package/themes/kinetic-data/THEME.md +172 -0
  171. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  172. package/themes/kinetic-data/theme.yml +207 -0
  173. package/themes/kinetic-data/tokens.ts +30 -0
  174. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  175. package/themes/kinetic-headline/THEME.md +78 -0
  176. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  177. package/themes/kinetic-headline/theme.yml +81 -0
  178. package/themes/kinetic-headline/tokens.ts +26 -0
  179. package/themes/law-firm/THEME.md +108 -0
  180. package/themes/law-firm/tokens.ts +158 -0
  181. package/themes/lawtech-modern/THEME.md +107 -0
  182. package/themes/lawtech-modern/tokens.ts +192 -0
  183. package/themes/linkedin-pro/THEME.md +102 -0
  184. package/themes/linkedin-pro/tokens.ts +174 -0
  185. package/themes/logistics-modern/THEME.md +94 -0
  186. package/themes/logistics-modern/tokens.ts +187 -0
  187. package/themes/magazine-glossy/THEME.md +74 -0
  188. package/themes/magazine-glossy/tokens.ts +158 -0
  189. package/themes/marker-mag/THEME.md +128 -0
  190. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  191. package/themes/marker-mag/theme.yml +159 -0
  192. package/themes/marker-mag/tokens.ts +27 -0
  193. package/themes/marketplace-modern/THEME.md +135 -0
  194. package/themes/marketplace-modern/tokens.ts +186 -0
  195. package/themes/marketplace-vintage/THEME.md +110 -0
  196. package/themes/marketplace-vintage/tokens.ts +185 -0
  197. package/themes/maximalist/THEME.md +96 -0
  198. package/themes/maximalist/tokens.ts +168 -0
  199. package/themes/mid-century/THEME.md +109 -0
  200. package/themes/mid-century/tokens.ts +162 -0
  201. package/themes/motorcycle-brand/THEME.md +86 -0
  202. package/themes/motorcycle-brand/tokens.ts +174 -0
  203. package/themes/museum/THEME.md +83 -0
  204. package/themes/museum/tokens.ts +147 -0
  205. package/themes/music-streaming/THEME.md +101 -0
  206. package/themes/music-streaming/tokens.ts +187 -0
  207. package/themes/music-vinyl/THEME.md +98 -0
  208. package/themes/music-vinyl/tokens.ts +167 -0
  209. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  210. package/themes/nature-distilled/THEME.md +81 -0
  211. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  212. package/themes/nature-distilled/theme.yml +91 -0
  213. package/themes/nature-distilled/tokens.ts +26 -0
  214. package/themes/news-tabloid/THEME.md +72 -0
  215. package/themes/news-tabloid/tokens.ts +158 -0
  216. package/themes/news-tech/THEME.md +75 -0
  217. package/themes/news-tech/tokens.ts +149 -0
  218. package/themes/newsletter/THEME.md +82 -0
  219. package/themes/newsletter/tokens.ts +138 -0
  220. package/themes/newspaper-classic/THEME.md +74 -0
  221. package/themes/newspaper-classic/tokens.ts +159 -0
  222. package/themes/nonprofit-arts/THEME.md +78 -0
  223. package/themes/nonprofit-arts/tokens.ts +157 -0
  224. package/themes/nonprofit-warm/THEME.md +105 -0
  225. package/themes/nonprofit-warm/tokens.ts +188 -0
  226. package/themes/outdoor-adventure/THEME.md +113 -0
  227. package/themes/outdoor-adventure/tokens.ts +181 -0
  228. package/themes/overland-broadside/THEME.md +119 -0
  229. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  230. package/themes/overland-broadside/theme.yml +138 -0
  231. package/themes/overland-broadside/tokens.ts +27 -0
  232. package/themes/performance-engineered/THEME.md +162 -0
  233. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  234. package/themes/performance-engineered/theme.yml +193 -0
  235. package/themes/performance-engineered/tokens.ts +29 -0
  236. package/themes/pet-food/THEME.md +78 -0
  237. package/themes/pet-food/tokens.ts +185 -0
  238. package/themes/pharma-clinical/THEME.md +164 -0
  239. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  240. package/themes/pharma-clinical/theme.yml +201 -0
  241. package/themes/pharma-clinical/tokens.ts +29 -0
  242. package/themes/pill-editorial/THEME.md +125 -0
  243. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  244. package/themes/pill-editorial/theme.yml +168 -0
  245. package/themes/pill-editorial/tokens.ts +31 -0
  246. package/themes/podcast-warm/THEME.md +103 -0
  247. package/themes/podcast-warm/tokens.ts +192 -0
  248. package/themes/publisher-indie/THEME.md +78 -0
  249. package/themes/publisher-indie/tokens.ts +148 -0
  250. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  251. package/themes/raw-concrete/THEME.md +76 -0
  252. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  253. package/themes/raw-concrete/theme.yml +88 -0
  254. package/themes/raw-concrete/tokens.ts +27 -0
  255. package/themes/realestate-luxury/THEME.md +94 -0
  256. package/themes/realestate-luxury/tokens.ts +169 -0
  257. package/themes/realestate-marketplace/THEME.md +106 -0
  258. package/themes/realestate-marketplace/tokens.ts +183 -0
  259. package/themes/restaurant-modern/THEME.md +109 -0
  260. package/themes/restaurant-modern/tokens.ts +172 -0
  261. package/themes/runway-fashion/THEME.md +99 -0
  262. package/themes/runway-fashion/tokens.ts +167 -0
  263. package/themes/saturday-morning/THEME.md +117 -0
  264. package/themes/saturday-morning/tokens.ts +281 -0
  265. package/themes/schema.ts +235 -0
  266. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  267. package/themes/signal-dark/THEME.md +107 -0
  268. package/themes/signal-dark/tokens.ts +181 -0
  269. package/themes/soft-modern/THEME.md +91 -0
  270. package/themes/soft-modern/tokens.ts +166 -0
  271. package/themes/solar-residential/THEME.md +92 -0
  272. package/themes/solar-residential/tokens.ts +176 -0
  273. package/themes/sports-league/THEME.md +180 -0
  274. package/themes/sports-league/tailwind.snippet.ts +15 -0
  275. package/themes/sports-league/theme.yml +213 -0
  276. package/themes/sports-league/tokens.ts +32 -0
  277. package/themes/stadium-sport/THEME.md +114 -0
  278. package/themes/stadium-sport/tokens.ts +187 -0
  279. package/themes/streetwear-hype/THEME.md +100 -0
  280. package/themes/streetwear-hype/tokens.ts +174 -0
  281. package/themes/studio-architect/THEME.md +108 -0
  282. package/themes/studio-architect/tokens.ts +162 -0
  283. package/themes/studio-photographer/THEME.md +88 -0
  284. package/themes/studio-photographer/tokens.ts +164 -0
  285. package/themes/team-kanban/THEME.md +167 -0
  286. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  287. package/themes/team-kanban/theme.yml +209 -0
  288. package/themes/team-kanban/tokens.ts +35 -0
  289. package/themes/telehealth-modern/THEME.md +95 -0
  290. package/themes/telehealth-modern/tokens.ts +197 -0
  291. package/themes/tourism-board/THEME.md +111 -0
  292. package/themes/tourism-board/tokens.ts +173 -0
  293. package/themes/toys-modern/THEME.md +79 -0
  294. package/themes/toys-modern/tokens.ts +200 -0
  295. package/themes/travel-luxury/THEME.md +95 -0
  296. package/themes/travel-luxury/tokens.ts +162 -0
  297. package/themes/vacation-rental/THEME.md +105 -0
  298. package/themes/vacation-rental/tokens.ts +174 -0
  299. package/themes/vault-reel/THEME.md +134 -0
  300. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  301. package/themes/vault-reel/theme.yml +167 -0
  302. package/themes/vault-reel/tokens.ts +30 -0
  303. package/themes/vet-modern/THEME.md +79 -0
  304. package/themes/vet-modern/tokens.ts +194 -0
  305. package/themes/web3-restraint/THEME.md +87 -0
  306. package/themes/web3-restraint/tokens.ts +154 -0
  307. package/themes/wellness-active/THEME.md +102 -0
  308. package/themes/wellness-active/tokens.ts +203 -0
  309. package/themes/wellness-spa/THEME.md +93 -0
  310. package/themes/wellness-spa/tokens.ts +173 -0
  311. package/themes/y2k-chrome/THEME.md +118 -0
  312. package/themes/y2k-chrome/tokens.ts +249 -0
  313. package/themes/yoga-studio/THEME.md +76 -0
  314. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,180 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // farm-direct — Misfits Market / Imperfect Foods / Hungryroot friendly produce
4
+ // box subscription. Warm cream + friendly green, hand-drawn warmth, sourcing
5
+ // story over price. Reads like a farmers-market chalkboard, not a grocery aisle.
6
+
7
+ export const farmDirect: Direction = {
8
+ name: "farm-direct" as Direction["name"],
9
+ ethos:
10
+ "Misfits Market chalkboard-cream + carrot-orange · Imperfect Foods rescued-produce green · " +
11
+ "Hungryroot friendly-box configurator · Thrive Market warm-trust serif · Daily Harvest pastel pantry",
12
+ references: [
13
+ { brand: "Misfits Market", trait: "chalkboard-cream surface + carrot-orange accent" },
14
+ { brand: "Imperfect Foods", trait: "rescued-produce green, ugly-fruit-is-beautiful chrome" },
15
+ { brand: "Hungryroot", trait: "friendly box configurator, soft pastel produce cards" },
16
+ { brand: "Thrive Market", trait: "warm-trust serif, member-impact metrics gravity" },
17
+ { brand: "Daily Harvest", trait: "pastel pantry palette, glossy produce hero shots" },
18
+ ],
19
+ feel:
20
+ "Warm cream paper canvas with a friendly farm-green primary and a carrot-orange secondary. " +
21
+ "Headings carry a soft serif warmth; body sits in a rounded humanist sans. Box cards have pillow-rounded " +
22
+ "corners and produce illustrations sit inside them like a chalk drawing. Numbers report sourcing impact, " +
23
+ "not pricing pillars. The page is a farmers-market stand, not a checkout aisle.",
24
+
25
+ fonts: {
26
+ display: {
27
+ family: "Fraunces",
28
+ fallback: ["Georgia", "Cambria", "Times New Roman", "serif"],
29
+ from: "Misfits Market / Thrive Market display — Fraunces' soft soft-serif warmth at heavy weights",
30
+ googleFont: "Fraunces",
31
+ weights: [500, 600, 700],
32
+ },
33
+ body: {
34
+ family: "Nunito",
35
+ fallback: ["Inter", "system-ui", "-apple-system", "sans-serif"],
36
+ from: "Hungryroot body — Nunito rounded humanist, friendly at 16px",
37
+ googleFont: "Nunito",
38
+ weights: [400, 500, 700],
39
+ },
40
+ mono: {
41
+ family: "DM Mono",
42
+ fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "monospace"],
43
+ from: "lbs-rescued / farms-supported tickers — wider mono, friendlier than IBM Plex",
44
+ googleFont: "DM+Mono",
45
+ weights: [400, 500],
46
+ },
47
+ },
48
+
49
+ typography: {
50
+ headingTracking: "-0.015em",
51
+ bodyTracking: "0",
52
+ fontFeatureSettings: '"tnum", "ss01"',
53
+ h1ScaleClamp: "clamp(2.5rem, 5.5vw, 4rem)",
54
+ bodyBaseSize: "1rem",
55
+ bodyLineHeight: "1.6",
56
+ },
57
+
58
+ colors: {
59
+ background: { hsl: "42 38% 95%", from: "warm cream chalkboard — Misfits Market canvas, not paper-white" },
60
+ foreground: { hsl: "78 25% 14%", from: "deep olive-ink — reads warm against cream, never pure black" },
61
+ card: { hsl: "40 50% 98%", from: "lifted cream card — half a degree above background" },
62
+ popover: { hsl: "40 50% 98%", from: "same as card" },
63
+ primary: { hsl: "138 42% 38%", from: "Imperfect Foods farm-green — rescued-produce signal" },
64
+ primaryForeground: { hsl: "42 38% 95%", from: "cream on farm-green" },
65
+ secondary: { hsl: "42 34% 90%", from: "deeper cream — secondary surface for inset panels" },
66
+ secondaryForeground: { hsl: "78 25% 14%", from: "olive ink on deeper cream" },
67
+ muted: { hsl: "42 30% 88%", from: "muted cream — disabled, divider blocks" },
68
+ mutedForeground: { hsl: "78 14% 40%", from: "warm gray-green — captions, weight units, farm meta" },
69
+ accent: { hsl: "138 35% 92%", from: "pale farm-green hover — selected-box surface" },
70
+ accentForeground: { hsl: "138 45% 22%", from: "deep farm-green ink on pale" },
71
+ border: { hsl: "42 22% 82%", from: "warm cream hairline — soft, not assertive" },
72
+ input: { hsl: "42 22% 82%", from: "same as border" },
73
+ ring: { hsl: "138 42% 38%", from: "primary farm-green — focus ring" },
74
+ destructive: { hsl: "12 70% 50%", from: "tomato red — distinct from carrot accent, used for skip/remove" },
75
+ destructiveForeground: { hsl: "42 38% 95%", from: "cream on tomato" },
76
+ brand: {
77
+ "farm-green": { hsl: "138 42% 38%", from: "= primary; Imperfect Foods rescued-produce signal" },
78
+ "farm-green-deep": { hsl: "138 48% 24%", from: "hover, gradient anchor" },
79
+ "farm-green-soft": { hsl: "138 35% 92%", from: "pale farm-green badge bg, in-season highlight" },
80
+ "carrot-orange": { hsl: "22 82% 56%", from: "Misfits Market carrot — friendly secondary accent, used on box-size selectors" },
81
+ "tomato-soft": { hsl: "12 60% 92%", from: "pale tomato — out-of-stock or low-quantity badge" },
82
+ "chalk-blue": { hsl: "208 35% 58%", from: "chalkboard sky-blue — used on the sourcing map water tone" },
83
+ "earth-clay": { hsl: "26 32% 62%", from: "earth tone — sourcing-map land tone, basket weave illustration" },
84
+ },
85
+ },
86
+
87
+ spacing: {
88
+ base: 4,
89
+ scale: [4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64, 80, 96],
90
+ containerMax: "max-w-6xl",
91
+ containerPadding: "px-4 lg:px-8",
92
+ sectionPadding: {
93
+ hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
94
+ default: "py-16 lg:py-24",
95
+ tight: "py-12 lg:py-16",
96
+ },
97
+ },
98
+
99
+ radius: {
100
+ base: "1rem",
101
+ pillsAllowed: true,
102
+ },
103
+
104
+ shadows: {
105
+ style: "soft",
106
+ utilities: {
107
+ "shadow-basket":
108
+ "0 1px 2px hsl(78 25% 14% / 0.04), 0 8px 24px hsl(78 25% 14% / 0.06)",
109
+ "shadow-card":
110
+ "0 1px 2px hsl(78 25% 14% / 0.04), 0 3px 8px hsl(78 25% 14% / 0.05)",
111
+ "shadow-pop":
112
+ "0 4px 16px hsl(78 25% 14% / 0.10), 0 1px 2px hsl(78 25% 14% / 0.05)",
113
+ },
114
+ },
115
+
116
+ motion: {
117
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
118
+ durations: {
119
+ reveal: 500,
120
+ loop: 2400,
121
+ ambient: 22000,
122
+ },
123
+ keyframes: {
124
+ "fade-rise": {
125
+ css:
126
+ "from { opacity: 0; transform: translateY(12px); }\n" +
127
+ "to { opacity: 1; transform: translateY(0); }",
128
+ defaultDuration: 500,
129
+ iteration: "once",
130
+ purpose: "produce-card and box-configurator entrance — friendly rise",
131
+ },
132
+ "box-bump": {
133
+ css:
134
+ "0%, 100% { transform: scale(1); }\n" +
135
+ "50% { transform: scale(1.04); }",
136
+ defaultDuration: 280,
137
+ iteration: "once",
138
+ purpose: "box-size selector bumps when changed — playful confirm",
139
+ },
140
+ "drift": {
141
+ css:
142
+ "0% { transform: translateY(0); }\n" +
143
+ "50% { transform: translateY(-6px); }\n" +
144
+ "100% { transform: translateY(0); }",
145
+ defaultDuration: 22000,
146
+ iteration: "infinite",
147
+ purpose: "ambient drift on produce-illustration glyphs — slow, decorative",
148
+ },
149
+ },
150
+ respectsReducedMotion: true,
151
+ },
152
+
153
+ density: "medium",
154
+
155
+ patterns: {
156
+ button:
157
+ "Solid farm-green primary (rounded-full, shadow-card) for the single commit — Pick this box, Subscribe. " +
158
+ "Secondary is ghost (1.5px border in foreground). Tertiary is text-link farm-green-deep with underline-on-hover. " +
159
+ "Hover deepens fill to farm-green-deep with a 1px y-translate — playful, not theatrical.",
160
+ card:
161
+ "Rounded-2xl (1rem), 1px --border, bg-card (lifted cream), shadow-card. Padding p-6. " +
162
+ "Box-preview card uses shadow-basket and contains a produce-illustration cluster. " +
163
+ "Title in display serif (Fraunces), body in Nunito.",
164
+ input:
165
+ "Full rounded-xl box, 1px --input border, bg-card. Label above in body-medium 14px. " +
166
+ "Zip-code and email inputs lead with a small farm-green glyph. Focus = 2px farm-green ring at 50% opacity.",
167
+ cta:
168
+ "Primary farm-green pill button for the box commit. " +
169
+ "Box-size selector uses three pill chips — carrot-orange when selected, ghost when not. " +
170
+ "Sourcing-story farm callouts on the map use pop-out cards with shadow-pop. " +
171
+ "Impact metrics (lbs rescued, farms supported) display large in mono with tabular-nums.",
172
+ },
173
+
174
+ details: {
175
+ selectionBg: "hsl(var(--primary) / 0.22)",
176
+ selectionFg: "hsl(var(--foreground))",
177
+ focusRing: "2px solid hsl(var(--ring) / 0.5)",
178
+ scrollbarStyle: "thin",
179
+ },
180
+ };
@@ -0,0 +1,96 @@
1
+ # Design Direction — Fintech-Card
2
+
3
+ ## Ethos
4
+ Mercury cream + bordered tables · Brex terracotta + dark sidebar · Ramp modular cards · Stripe dashboard density · Pleo warm-pink chrome
5
+
6
+ ## Feel
7
+ Sharp grids, dense tabular data, a single brand accent, modular dashboard cards on a warm cream canvas. Hairline borders carry the structure; the accent does signal work without flooding the surface. Reads as the Tuesday-morning interface of a small-business CFO — productive, calm, never decorative.
8
+
9
+ ## Reference brands
10
+ - **Mercury** → cream surface and bordered tabular tables. The page is warm off-white, not Stripe-white. Tables wear visible 1px hairlines.
11
+ - **Brex** → terracotta accent against a dark left-sidebar. The accent is the only saturated color; the sidebar is a separate dark surface, not a tinted version of the page.
12
+ - **Ramp** → modular dashboard cards and tabular nums. Every card holds one metric or one table, never a mixed-purpose collage.
13
+ - **Stripe Dashboard** → deep purple accent and dense interface. Density is comfort here — the user is at this dashboard for hours.
14
+ - **Pleo** → warm-pink accent and friendly card chrome. Where Brex is grown-up, Pleo is friendly; we borrow the warmth without the candy.
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.
18
+
19
+ Surface stack is **cream background** → `--card` (pure white, one degree above) → `--secondary` (deeper cream for inset panels and table headers). Depth comes from hairline borders, not shadows. The dark sidebar uses `--sidebar-dark` and `--sidebar-fg` — a separate surface family, never the inverse of the page.
20
+
21
+ Brand tokens: `--terracotta`, `--terracotta-deep`, `--terracotta-soft`, `--ink`, `--sidebar-dark`, `--sidebar-fg`, `--stripe`, `--pleo`. `--stripe` and `--pleo` are semantic-only — Stripe purple appears on payment-processing badges; Pleo pink appears on success toasts. They are not free-for-use accents.
22
+
23
+ ## Typography
24
+ - **Display:** Inter heavy (Mercury/Ramp marketing display). h1–h4. Tracking `-0.02em`.
25
+ - **Body:** Inter regular/medium (Stripe Dashboard body). Body base **15px** with **line-height 1.5** — denser than the atmosphere directions on purpose.
26
+ - **Mono:** IBM Plex Mono. Transaction tables, amounts, IDs. Plex Mono is wider than JetBrains Mono and scans better at table row height.
27
+
28
+ H1 uses `clamp(2rem, 4vw, 3rem)` — restrained. Dashboards do not need 80px titles. Font features: `"tnum", "cv11", "ss01", "ss03"`. Tabular numerics are on at the root.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-7xl px-4 lg:px-6` — dashboard-wide, tighter horizontal padding than the atmosphere directions.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-12 pb-8 lg:pt-16 lg:pb-12` (modest by direction standards)
34
+ - Default: `py-10 lg:py-14`
35
+ - Tight: `py-6 lg:py-8`
36
+ - **Allowed scale values:** 2 4 6 8 10 12 14 16 20 24 32 40 48 64. The extra 2/14 steps exist for table-cell padding and chip insets. High-density direction by design.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens.
40
+
41
+ Terracotta is the only saturated accent. Stripe purple and Pleo pink are semantic-only and may not be used decoratively. Status pills use brand-soft backgrounds with brand-deep text (`bg-terracotta-soft text-terracotta-deep`) — never solid fills. Pure black is forbidden; `--ink` replaces it.
42
+
43
+ ## Radius
44
+ `--radius: 0.375rem` (6px). Sharper than fintech-trust — dashboard-language. Pills allowed (`pillsAllowed: true`) for status badges only (Paid, Pending, Approved, Failed). Pill is the only place 999px appears.
45
+
46
+ ## Shadows
47
+ **Minimal.** Three utilities: `.shadow-card` (subtle 1px lift), `.shadow-popover` (4-12px for dropdowns and modals), `.shadow-table-row` (inset bottom border for table row separation). No glows. No colored shadows. The page is held together by borders, not by lift.
48
+
49
+ ## Motion
50
+ Five keyframes: `fade-in` (200ms, opacity only, no translate), `scale-in` (160ms for popovers and dropdowns), `row-hover` (120ms background-color transition on table rows), `shimmer` (1400ms loading skeleton), `checkmark-draw` (240ms SVG stroke for transaction approval confirmation).
51
+
52
+ There is no rise translate on entrance — the dashboard does not bounce. There is no scale on hover — the dashboard does not breathe. Reveal is 200ms; this is the fastest direction in the library by design. Confirmations are the only place motion gets to perform — the checkmark-draw on a successful transaction is the single dramatic gesture allowed.
53
+
54
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored.
55
+
56
+ ## Density
57
+ High. The user is here to read 200 rows of transactions, not to admire whitespace. Cards are tight (`p-4 lg:p-6`), tables compress to 13px sans for meta and 14px mono for values, button hit-targets stay at 36px minimum.
58
+
59
+ ## Component patterns
60
+ - **Buttons:** solid terracotta primary (rounded-md, shadow-card) for the single committing action per surface — Send Money, Approve, Issue Card. Secondary is ghost (border + foreground text). Tertiary is text-link terracotta. Hover changes fill to `--terracotta-deep`; no scale, no shadow growth.
61
+ - **Cards:** rounded-md, 1px `--border`, `bg-card` (pure white on cream), `shadow-card`. Padding `p-4 lg:p-6` — tight by direction standard. Modular: every card holds one metric, table, or chart, never mixed-purpose. Title in display sans, value in mono.
62
+ - **Inputs:** full rounded-md box, 1px `--input` border, `bg-card`. Label above in sans-medium 13px. Focus = 2px terracotta ring at 40% opacity. Currency inputs right-aligned mono. Inline validation message in destructive, below the field.
63
+ - **CTA:** primary terracotta button for commit actions. Text-link terracotta for navigation between dashboard views. Status pills use brand-soft backgrounds — never solid fills. The terracotta solid fill is reserved for the commit; everything else is hairline or soft tint.
64
+
65
+ ## Recommended rich media
66
+ Fintech-Card leans on **tables, charts, and product screenshots** — the dashboard speaks for itself. Marketing pages show the actual product UI in browser-chrome mockups, not lifestyle photography. When illustration is needed, it is **flat geometric, single-line iconography at 1.5px stroke** — the Mercury/Stripe icon language. Three-quarter perspective 3D card renders for the physical-card hero shot are the one allowed photorealistic moment.
67
+
68
+ **Iconography:** 24px grid, 1.5px stroke, rounded line caps, never filled. The icon family should feel like a single hand drew all of them — no mixed weights. Lucide-react with default settings, or Heroicons outline, or a custom set in the same language.
69
+
70
+ **Product screenshots** are the headline media on marketing surfaces. Captured at 2x retina, cropped to dashboard cards, framed in a subtle browser-chrome SVG. Drop shadow under screenshots is `shadow-popover`, not a custom glow.
71
+
72
+ **AI tool recommendations:** **Midjourney / Flux** with prompts like *"photorealistic 3D credit card render, terracotta and cream color palette, soft studio lighting, three-quarter angle, no logo, isolated on cream background"* for physical-card hero shots. **Recraft** for the flat icon set in Mercury's language. Avoid Midjourney defaults that produce business stock photos, suit-and-tie people, or generic 'finance vibes' imagery.
73
+
74
+ **Aspect ratios:** 16:10 for dashboard screenshots (matches the browser viewport, not video). 1:1 for icon tiles. 4:3 for the card-render hero. Never 16:9 — that's video aspect ratio and reads consumer.
75
+
76
+ **Video:** rare. If used, it is a screen recording of the product UI itself, 30fps, ≤8MB H.265, poster frame mandatory. No people. No music in autoplay. The card-render rotation is the one acceptable autoplay loop, ≤3s, ≤2MB.
77
+
78
+ **Performance:** product screenshots ship as AVIF at 2x retina, ≤120KB each. The marketing page LCP target is 1.8s. Charts on the dashboard are SVG, never raster.
79
+
80
+ **Avoid:** stock photo people pointing at laptops, generic 'team' photography, brick-and-mortar bank exteriors, vault imagery, gold-coin renders, Wall Street bull/bear illustrations, neon-glow chart effects, dark-mode-only screenshots (this is a cream direction; show it in cream), animated GIFs of cursors, glassmorphic panels.
81
+
82
+ **Accessibility:** every status pill includes a text label (`Paid`, `Pending`), never color-only. Tables ship with proper `scope` attributes and a screen-reader caption summarizing column count and total rows. Terracotta meets 4.5:1 against cream at body size.
83
+
84
+ ## Component families
85
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established.
86
+
87
+ ## Details
88
+ - **Selection:** `hsl(var(--terracotta) / 0.22)` background, foreground text.
89
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.5)`. Terracotta, soft.
90
+ - **Scrollbar:** thin.
91
+
92
+ ## Exceptions
93
+ None yet. When an intentional one-of-one violation lands, add it here with the reason.
94
+
95
+ ## Revisions
96
+ - Initial direction, generated at install time.
@@ -0,0 +1,191 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const fintechCard: Direction = {
4
+ name: "fintech-card",
5
+ ethos:
6
+ "Mercury cream + bordered tables · Brex terracotta + dark sidebar · Ramp modular cards · Stripe dashboard density · Pleo warm-pink chrome",
7
+ references: [
8
+ { brand: "Mercury", trait: "cream surface + bordered tabular tables" },
9
+ { brand: "Brex", trait: "terracotta accent + dark left-sidebar" },
10
+ { brand: "Ramp", trait: "modular dashboard cards + tabular nums" },
11
+ { brand: "Stripe Dashboard", trait: "deep purple accent + dense interface" },
12
+ { brand: "Pleo", trait: "warm-pink accent + friendly card chrome" },
13
+ ],
14
+ feel:
15
+ "Sharp grids, dense tabular data, single brand accent, modular dashboard cards on a cream canvas. " +
16
+ "Hairline borders carry the structure; the accent does signal work without flooding the surface. " +
17
+ "Reads as the Tuesday-morning interface of a small-business CFO — productive, calm, never decorative.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Inter",
22
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
23
+ from: "Mercury/Ramp marketing display — Inter at heavy weights for dashboard chrome",
24
+ googleFont: "Inter",
25
+ weights: [500, 600, 700],
26
+ },
27
+ body: {
28
+ family: "Inter",
29
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
30
+ from: "Stripe Dashboard body — neutral, readable at 14px in dense tables",
31
+ googleFont: "Inter",
32
+ weights: [400, 500, 600],
33
+ },
34
+ mono: {
35
+ family: "IBM Plex Mono",
36
+ fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
37
+ from: "Mercury transaction-table feel — Plex Mono is wider, easier to scan at row height",
38
+ googleFont: "IBM+Plex+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.02em",
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"tnum", "cv11", "ss01", "ss03"', // tabular nums + Inter stylistic sets
47
+ h1ScaleClamp: "clamp(2rem, 4vw, 3rem)", // restrained — dashboards don't need 80px titles
48
+ bodyBaseSize: "0.9375rem", // 15px — denser than fintech-trust
49
+ bodyLineHeight: "1.5",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "36 30% 96%", from: "Mercury cream — warm off-white canvas, not Stripe-white" },
54
+ foreground: { hsl: "228 24% 12%", from: "deep ink — almost-black with cool bias, sits clean on cream" },
55
+ card: { hsl: "0 0% 100%", from: "pure white card — lifts off cream by one degree, no shadow needed" },
56
+ popover: { hsl: "0 0% 100%", from: "same as card; depth from hairline border" },
57
+ primary: { hsl: "16 65% 48%", from: "Brex terracotta — the single brand accent, warm not red" },
58
+ primaryForeground: { hsl: "36 30% 96%", from: "cream on terracotta" },
59
+ secondary: { hsl: "36 20% 92%", from: "deeper cream — secondary surface for inset panels and table headers" },
60
+ secondaryForeground: { hsl: "228 24% 12%", from: "ink on deeper cream" },
61
+ muted: { hsl: "36 18% 90%", from: "muted cream — disabled inputs, divider blocks" },
62
+ mutedForeground: { hsl: "228 12% 42%", from: "warm gray — table meta, secondary labels, timestamps" },
63
+ accent: { hsl: "36 22% 88%", from: "hover surface — row-hover and button-hover background" },
64
+ accentForeground: { hsl: "228 24% 12%", from: "ink on accent" },
65
+ border: { hsl: "36 14% 82%", from: "warm-cream hairline — the structural line in every table and card" },
66
+ input: { hsl: "36 14% 82%", from: "same as border — single hairline language" },
67
+ ring: { hsl: "16 65% 48%", from: "primary terracotta — focus ring is the brand accent" },
68
+ destructive: { hsl: "0 68% 48%", from: "deep alert red — distinct from terracotta primary, used for delete/reject" },
69
+ destructiveForeground: { hsl: "36 30% 96%", from: "cream on alert red" },
70
+ brand: {
71
+ terracotta: { hsl: "16 65% 48%", from: "= primary; Brex marketing accent" },
72
+ "terracotta-deep": { hsl: "14 60% 38%", from: "darker terracotta — hover state, gradient anchor" },
73
+ "terracotta-soft": { hsl: "16 60% 94%", from: "pale terracotta tint — active-row highlight, badge bg" },
74
+ ink: { hsl: "228 24% 12%", from: "= foreground; the structural dark, also used for dark sidebar" },
75
+ "sidebar-dark": { hsl: "228 22% 14%", from: "Brex dark left-sidebar — one stop above ink for nav surface" },
76
+ "sidebar-fg": { hsl: "36 20% 88%", from: "cream foreground for dark sidebar — readable, not pure white" },
77
+ stripe: { hsl: "256 56% 48%", from: "Stripe deep purple — semantic for payment/processing badges only" },
78
+ pleo: { hsl: "342 78% 64%", from: "Pleo warm pink — semantic for friendly success toasts, never primary" },
79
+ },
80
+ },
81
+
82
+ spacing: {
83
+ base: 4,
84
+ scale: [2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 40, 48, 64], // high density — extra 2/14 steps for tables
85
+ containerMax: "max-w-7xl", // dashboard-wide
86
+ containerPadding: "px-4 lg:px-6", // tighter than atmosphere directions
87
+ sectionPadding: {
88
+ hero: "pt-12 pb-8 lg:pt-16 lg:pb-12",
89
+ default: "py-10 lg:py-14",
90
+ tight: "py-6 lg:py-8",
91
+ },
92
+ },
93
+
94
+ radius: {
95
+ base: "0.375rem", // 6px — sharper than fintech-trust, dashboard-language
96
+ pillsAllowed: true, // pills for status badges (Paid, Pending, Approved)
97
+ },
98
+
99
+ shadows: {
100
+ style: "minimal",
101
+ utilities: {
102
+ "shadow-card":
103
+ "0 1px 2px hsl(228 24% 12% / 0.04), " +
104
+ "0 1px 1px hsl(228 24% 12% / 0.03)",
105
+ "shadow-popover":
106
+ "0 4px 12px hsl(228 24% 12% / 0.08), " +
107
+ "0 1px 2px hsl(228 24% 12% / 0.06)",
108
+ "shadow-table-row":
109
+ "inset 0 -1px 0 hsl(var(--border))",
110
+ },
111
+ },
112
+
113
+ motion: {
114
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
115
+ durations: {
116
+ reveal: 200, // instant — dashboards feel responsive, not theatrical
117
+ loop: 1400,
118
+ ambient: 1600,
119
+ },
120
+ keyframes: {
121
+ "fade-in": {
122
+ css:
123
+ "from { opacity: 0; }\n" +
124
+ "to { opacity: 1; }",
125
+ defaultDuration: 200,
126
+ iteration: "once",
127
+ purpose: "table-row and panel entrance — no translate, just opacity; dashboards don't bounce",
128
+ },
129
+ "scale-in": {
130
+ css:
131
+ "from { opacity: 0; transform: scale(0.98); }\n" +
132
+ "to { opacity: 1; transform: scale(1); }",
133
+ defaultDuration: 160,
134
+ iteration: "once",
135
+ purpose: "popover, dropdown, modal entrance — confirms interaction crisply",
136
+ },
137
+ "row-hover": {
138
+ css:
139
+ "from { background-color: transparent; }\n" +
140
+ "to { background-color: hsl(var(--accent)); }",
141
+ defaultDuration: 120,
142
+ iteration: "once",
143
+ purpose: "table-row hover transition — almost imperceptible, signals interactivity",
144
+ },
145
+ "shimmer": {
146
+ css:
147
+ "0% { background-position: -200% 0; }\n" +
148
+ "100% { background-position: 200% 0; }",
149
+ defaultDuration: 1400,
150
+ iteration: "infinite",
151
+ purpose: "loading skeletons for table cells while data fetches",
152
+ },
153
+ "checkmark-draw": {
154
+ css:
155
+ "from { stroke-dashoffset: 24; }\n" +
156
+ "to { stroke-dashoffset: 0; }",
157
+ defaultDuration: 240,
158
+ iteration: "once",
159
+ purpose: "confirmation checkmark on transaction approval — single-gesture success feedback",
160
+ },
161
+ },
162
+ respectsReducedMotion: true,
163
+ },
164
+
165
+ density: "high",
166
+
167
+ patterns: {
168
+ button:
169
+ "Solid terracotta primary (rounded-md, shadow-card) for the single committing action per surface. " +
170
+ "Secondary is ghost (border + foreground text). Tertiary is text-link terracotta. " +
171
+ "Hover changes fill to terracotta-deep; no scale, no shadow growth — dashboards stay still.",
172
+ card:
173
+ "Rounded-md, 1px --border, bg-card (pure white on cream), shadow-card. Padding p-4 lg:p-6 — tight by direction standard. " +
174
+ "Modular: every card holds one metric, table, or chart, never mixed-purpose. Title in display sans, value in mono.",
175
+ input:
176
+ "Full rounded-md box, 1px --input border, bg-card. Label above in sans-medium 13px. " +
177
+ "Focus = 2px terracotta ring at 40% opacity. Currency inputs right-aligned mono. " +
178
+ "Inline validation message in destructive, below.",
179
+ cta:
180
+ "Primary terracotta button for the commit action (Send Money, Approve, Issue Card). " +
181
+ "Text-link terracotta for navigation between dashboard views. " +
182
+ "Status pills (Paid, Pending, Failed) use brand-soft backgrounds with brand-deep text — never solid fills.",
183
+ },
184
+
185
+ details: {
186
+ selectionBg: "hsl(var(--terracotta) / 0.22)",
187
+ selectionFg: "hsl(var(--foreground))",
188
+ focusRing: "2px solid hsl(var(--ring) / 0.5)",
189
+ scrollbarStyle: "thin",
190
+ },
191
+ };
@@ -0,0 +1,94 @@
1
+ # Design Direction — Fintech-Trust
2
+
3
+ ## Ethos
4
+ Robinhood signal-green · Wealthfront soft elevation · Wise warm sans · Brex deep navy canvas · Public charts as hero
5
+
6
+ ## Feel
7
+ Modern fintech in dark mode. A deep navy canvas holds sage-green signal accents and chart surfaces that breathe. Soft elevated cards, generous tabular numerics, restrained typographic confidence. Reads as the brokerage that holds your retirement — quiet competence, not crypto loudness.
8
+
9
+ ## Reference brands
10
+ - **Robinhood** → dark-mode signal-green confirmations. Sage is the gains color and the primary action color; they are the same color.
11
+ - **Wealthfront** → Plus Jakarta Sans display and soft elevated cards. Soft lift off the canvas; no harsh shadows.
12
+ - **Wise** → warm sans and currency-data tables. Numbers right-aligned, tabular, mono.
13
+ - **Brex (marketing site)** → deep navy canvas with sage signal. The dark surface is engineered, not decorative.
14
+ - **Public.com** → charts treated as hero element. The line chart is the page, not a sidebar widget.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
18
+
19
+ Surface stack is **navy background** → `--card` (one stop above) → `--popover` (two stops). Depth comes from soft elevated shadows and hairline borders together, never from heavy fill differentiation.
20
+
21
+ Brand tokens: `--sage`, `--sage-deep`, `--sage-soft`, `--navy`, `--navy-mid`, `--chart-up`, `--chart-down`, `--gold`. `--chart-up` aliases sage and `--chart-down` aliases destructive — explicit semantic tokens so chart components never reach for primary directly.
22
+
23
+ ## Typography
24
+ - **Display:** Plus Jakarta Sans (Wealthfront display feel). h1–h4. Tracking `-0.02em` — Plus Jakarta tightens cleanly at display sizes.
25
+ - **Body:** Inter (Brex/Robinhood marketing body). Body base **16px** with **line-height 1.6**.
26
+ - **Mono:** JetBrains Mono. Prices, balances, percentage moves, timestamps — instrument-cluster heritage. Always `font-variant-numeric: tabular-nums`.
27
+
28
+ H1 uses `clamp(2.5rem, 6vw, 4.5rem)` — confident, not theatrical. Font features: `"tnum", "cv11", "ss01"`. Tabular numerics are on by default at the document root; money should never shift width.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-7xl px-6 lg:px-10` — wide. Hero charts span the full bleed.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
34
+ - Default: `py-16 lg:py-24`
35
+ - Tight: `py-12 lg:py-16`
36
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80 96. Medium density — charts need breathing room.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens.
40
+
41
+ Sage is the only saturated color allowed at any scale. Everything else is navy at varying lightness. Gold is permitted as a Wise-style currency-conversion accent — used sparingly, never on a primary CTA, never on a chart line. Red is reserved for losses and destructive actions — never a button face, never decoration.
42
+
43
+ ## Radius
44
+ `--radius: 0.625rem` (10px). Softer than fintech-card, never pillowy. Pills allowed (`pillsAllowed: true`) for ticker chips, percentage badges, and status indicators.
45
+
46
+ ## Shadows
47
+ **Soft.** Three utilities: `.shadow-card` (subtle lift for resting cards), `.shadow-elevated` (deeper lift for hero panels and modals), `.glow-sage` (sage rim glow for the single hero metric). Shadows are dark — they read on navy, not on white. The top edge of every elevated surface gets a 1px inset highlight in cool-white at 3-4% alpha — the Wealthfront soft-lift trick.
48
+
49
+ ## Motion
50
+ Five keyframes: `fade-rise` (200ms, opacity + 8px translate), `chart-draw` (1800ms, stroke-dashoffset reveal), `ticker-pulse` (1800ms infinite opacity heartbeat), `number-roll` (300ms, replace-and-rise on value change), `shimmer` (1600ms loading skeleton).
51
+
52
+ `chart-draw` is the signature gesture — line charts draw on first paint via SVG `stroke-dashoffset`. `number-roll` runs whenever a tabular-num value updates from a websocket tick.
53
+
54
+ Reveal is 500ms — crisp, confident. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored. Finance UI does not bounce, scale on hover, or auto-rotate. The page is still until data moves it.
55
+
56
+ ## Density
57
+ Medium. Spacing scale includes 6 and 10 for fine adjustment around table cells and chart axes, but the canonical reading rhythm is 16/24/32.
58
+
59
+ ## Component patterns
60
+ - **Buttons:** solid sage primary (sage bg, navy fg, rounded-lg, shadow-card) for the single positive action per surface. Secondary is ghost (border + foreground text + transparent fill). Tertiary is a text-link in sage. Hover deepens fill to `--sage-deep`; never grows in scale.
61
+ - **Cards:** rounded-[0.625rem], hairline `--border`, `bg-card` lifted off navy with `shadow-elevated`. Internal padding `p-6 lg:p-8`. Numbers always tabular, mono for prices, sans for labels. Chart cards span full width with the chart treated as primary content.
62
+ - **Inputs:** full rounded-lg box, 1px `--input` border, `bg-card`. Label above in sans-medium. Focus = 2px sage ring at 40% opacity. Currency inputs are mono and right-aligned.
63
+ - **CTA:** primary sage button for the positive action (Deposit, Invest, Trade). Text-link sage for secondary navigation. **Never red on a CTA** — red is reserved for losses and destructive actions.
64
+
65
+ ## Recommended rich media
66
+ Fintech-Trust leans on **live data as decoration**. The hero is rarely a stock photo — it is a chart of the user's portfolio, a ticker of held positions, or an animated sparkline of the day's market. When photography is used, it is **abstract macro of light through architectural glass, color-graded to navy and sage** — never people in suits, never handshakes, never the lifestyle cliches.
67
+
68
+ **Charts are the headline media.** Line charts, area fills under the line at 18% alpha, sparklines inline in table cells, donut charts for portfolio allocation. All chart strokes are 2px. All chart fills are gradient-to-transparent on the y-axis. Grids in `--sage-soft` at 8% alpha. The chart-draw entrance keyframe runs once on view; subsequent updates use number-roll on the legend value, not redraw.
69
+
70
+ **AI tool recommendations:** **Midjourney** with prompts like *"abstract macro architectural glass, navy and sage lighting, depth of field, finance editorial"* for hero backgrounds. **Recraft / SVG generators** for the chart and icon set — fintech iconography should be 1.5px stroke, 24px grid, rounded line caps, never filled. Avoid Midjourney defaults that produce 3D crypto-coin renders or stock-broker stock photos. **Rive** is the right tool for animated chart entrances if the project warrants it.
71
+
72
+ **Aspect ratios:** 16:9 for chart hero blocks. 4:3 for portfolio donut layouts. 1:1 for compact metric tiles. Never 1.91:1 social-share crops — those read marketing-deck, not product.
73
+
74
+ **Video:** rare. If used, it is a screen recording of the product itself with the cursor visible, exported at 30fps with poster frame. No autoplay. No background ambient loops. The product is the show.
75
+
76
+ **Performance:** chart payload under 40KB gzipped. Hero chart LCP under 1.5s. Animations on the chart respect `prefers-reduced-motion` by setting `stroke-dashoffset: 0` immediately and skipping the draw animation entirely.
77
+
78
+ **Avoid:** crypto-coin renders, handshake stock photos, brick-and-mortar bank imagery, suit-and-tie people, vault doors, gold-bar imagery, stock-ticker scrolling marquees as decoration, lens flare on numbers, glass-button gradients, Bloomberg-terminal orange.
79
+
80
+ **Accessibility:** every chart ships with a data table fallback as the accessible name. Color is never the only encoder of up/down — every gain has a `+` and every loss has a `−` prefix in tabular nums. Sage and destructive both meet 4.5:1 against navy at the sizes they're used.
81
+
82
+ ## Component families
83
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established.
84
+
85
+ ## Details
86
+ - **Selection:** `hsl(var(--sage) / 0.3)` background, foreground text.
87
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.5)`. Sage, soft.
88
+ - **Scrollbar:** thin.
89
+
90
+ ## Exceptions
91
+ None yet. When an intentional one-of-one violation lands, add it here with the reason.
92
+
93
+ ## Revisions
94
+ - Initial direction, generated at install time.