@stylecrib/cli 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/README.md +94 -9
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +1577 -463
  25. package/package.json +11 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/.anchor-render.png +0 -0
  38. package/themes/arc-stack/THEME.md +125 -0
  39. package/themes/arc-stack/audit.log.jsonl +6 -0
  40. package/themes/arc-stack/dismissals.jsonl +3 -0
  41. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  42. package/themes/arc-stack/theme.yml +153 -0
  43. package/themes/arc-stack/tokens.ts +29 -0
  44. package/themes/architectural/THEME.md +102 -0
  45. package/themes/architectural/tokens.ts +159 -0
  46. package/themes/atelier-radiance/THEME.md +93 -0
  47. package/themes/atelier-radiance/audit.log.jsonl +1 -0
  48. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  49. package/themes/atelier-radiance/theme.yml +130 -0
  50. package/themes/atelier-radiance/tokens.ts +29 -0
  51. package/themes/automotive-ev/THEME.md +87 -0
  52. package/themes/automotive-ev/tokens.ts +183 -0
  53. package/themes/automotive-luxury/THEME.md +88 -0
  54. package/themes/automotive-luxury/tokens.ts +175 -0
  55. package/themes/baby-modern/THEME.md +79 -0
  56. package/themes/baby-modern/tokens.ts +184 -0
  57. package/themes/banking-gravity/THEME.md +171 -0
  58. package/themes/banking-gravity/tokens.ts +169 -0
  59. package/themes/beauty-clean/THEME.md +92 -0
  60. package/themes/beauty-clean/tokens.ts +176 -0
  61. package/themes/beauty-luxury/THEME.md +96 -0
  62. package/themes/beauty-luxury/tokens.ts +178 -0
  63. package/themes/bento-modular/.anchor-render.png +0 -0
  64. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  65. package/themes/bento-modular/THEME.md +80 -0
  66. package/themes/bento-modular/audit.log.jsonl +3 -0
  67. package/themes/bento-modular/dismissals.jsonl +1 -0
  68. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  69. package/themes/bento-modular/theme.yml +83 -0
  70. package/themes/bento-modular/tokens.ts +27 -0
  71. package/themes/bookstore-indie/THEME.md +78 -0
  72. package/themes/bookstore-indie/tokens.ts +147 -0
  73. package/themes/brutalist/THEME.md +96 -0
  74. package/themes/brutalist/tokens.ts +151 -0
  75. package/themes/business-tiles/THEME.md +141 -0
  76. package/themes/business-tiles/tokens.ts +178 -0
  77. package/themes/cabana-poster/THEME.md +158 -0
  78. package/themes/cabana-poster/audit.log.jsonl +1 -0
  79. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  80. package/themes/cabana-poster/theme.yml +221 -0
  81. package/themes/cabana-poster/tokens.ts +34 -0
  82. package/themes/case-panel/THEME.md +126 -0
  83. package/themes/case-panel/audit.log.jsonl +2 -0
  84. package/themes/case-panel/tailwind.snippet.ts +15 -0
  85. package/themes/case-panel/theme.yml +153 -0
  86. package/themes/case-panel/tokens.ts +28 -0
  87. package/themes/cinematic-dark/THEME.md +97 -0
  88. package/themes/cinematic-dark/tokens.ts +195 -0
  89. package/themes/classic-car/THEME.md +86 -0
  90. package/themes/classic-car/tokens.ts +173 -0
  91. package/themes/cloud-friendly/THEME.md +152 -0
  92. package/themes/cloud-friendly/tokens.ts +181 -0
  93. package/themes/community-niche/THEME.md +102 -0
  94. package/themes/community-niche/tokens.ts +177 -0
  95. package/themes/corporate-grid/THEME.md +154 -0
  96. package/themes/corporate-grid/tokens.ts +182 -0
  97. package/themes/couture-luxury/THEME.md +85 -0
  98. package/themes/couture-luxury/tokens.ts +146 -0
  99. package/themes/creator-social/THEME.md +131 -0
  100. package/themes/creator-social/tokens.ts +249 -0
  101. package/themes/crypto-onchain/THEME.md +100 -0
  102. package/themes/crypto-onchain/tokens.ts +207 -0
  103. package/themes/cycling-brand/THEME.md +78 -0
  104. package/themes/cycling-brand/tokens.ts +185 -0
  105. package/themes/dating-friendly/THEME.md +102 -0
  106. package/themes/dating-friendly/tokens.ts +178 -0
  107. package/themes/dense-utility/THEME.md +85 -0
  108. package/themes/dense-utility/tokens.ts +155 -0
  109. package/themes/devtool-cli/THEME.md +100 -0
  110. package/themes/devtool-cli/tokens.ts +195 -0
  111. package/themes/devtool-docs/THEME.md +105 -0
  112. package/themes/devtool-docs/tokens.ts +177 -0
  113. package/themes/editorial/THEME.md +129 -0
  114. package/themes/editorial/audit.log.jsonl +2 -0
  115. package/themes/editorial/tailwind.snippet.ts +15 -0
  116. package/themes/editorial/theme.yml +173 -0
  117. package/themes/editorial/tokens.ts +29 -0
  118. package/themes/education-formal/THEME.md +154 -0
  119. package/themes/education-formal/audit.log.jsonl +1 -0
  120. package/themes/education-formal/tailwind.snippet.ts +15 -0
  121. package/themes/education-formal/theme.yml +186 -0
  122. package/themes/education-formal/tokens.ts +29 -0
  123. package/themes/education-warm/THEME.md +91 -0
  124. package/themes/education-warm/tokens.ts +185 -0
  125. package/themes/ember-poster/README.md +79 -0
  126. package/themes/ember-poster/THEME.md +101 -0
  127. package/themes/ember-poster/audit.log.jsonl +17 -0
  128. package/themes/ember-poster/package.json +34 -0
  129. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  130. package/themes/ember-poster/theme.yml +109 -0
  131. package/themes/ember-poster/tokens.ts +27 -0
  132. package/themes/enterprise-cloud/THEME.md +139 -0
  133. package/themes/enterprise-cloud/tokens.ts +179 -0
  134. package/themes/enterprise-tech/.anchor-render.png +0 -0
  135. package/themes/enterprise-tech/THEME.md +167 -0
  136. package/themes/enterprise-tech/audit.log.jsonl +1 -0
  137. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  138. package/themes/enterprise-tech/theme.yml +202 -0
  139. package/themes/enterprise-tech/tokens.ts +29 -0
  140. package/themes/ev-charging/THEME.md +94 -0
  141. package/themes/ev-charging/tokens.ts +185 -0
  142. package/themes/farm-direct/THEME.md +92 -0
  143. package/themes/farm-direct/tokens.ts +180 -0
  144. package/themes/fintech-card/THEME.md +96 -0
  145. package/themes/fintech-card/tokens.ts +191 -0
  146. package/themes/fintech-trust/THEME.md +94 -0
  147. package/themes/fintech-trust/tokens.ts +192 -0
  148. package/themes/food-blog/THEME.md +98 -0
  149. package/themes/food-blog/tokens.ts +183 -0
  150. package/themes/forum-classic/THEME.md +100 -0
  151. package/themes/forum-classic/tokens.ts +168 -0
  152. package/themes/fresh-plate/.anchor-render.png +0 -0
  153. package/themes/fresh-plate/THEME.md +144 -0
  154. package/themes/fresh-plate/audit.log.jsonl +2 -0
  155. package/themes/fresh-plate/dismissals.jsonl +3 -0
  156. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  157. package/themes/fresh-plate/theme.yml +189 -0
  158. package/themes/fresh-plate/tokens.ts +30 -0
  159. package/themes/furniture-modern/THEME.md +94 -0
  160. package/themes/furniture-modern/tokens.ts +176 -0
  161. package/themes/gaming-esports/THEME.md +146 -0
  162. package/themes/gaming-esports/tokens.ts +199 -0
  163. package/themes/gaming-streamer/THEME.md +139 -0
  164. package/themes/gaming-streamer/tokens.ts +201 -0
  165. package/themes/glassmorphic-modern/THEME.md +119 -0
  166. package/themes/glassmorphic-modern/tokens.ts +174 -0
  167. package/themes/government-civic/THEME.md +138 -0
  168. package/themes/government-civic/tokens.ts +164 -0
  169. package/themes/gym-chain/THEME.md +79 -0
  170. package/themes/gym-chain/tokens.ts +196 -0
  171. package/themes/healthcare-bright/THEME.md +95 -0
  172. package/themes/healthcare-bright/tokens.ts +184 -0
  173. package/themes/home-decor/THEME.md +94 -0
  174. package/themes/home-decor/tokens.ts +177 -0
  175. package/themes/hotel-boutique/THEME.md +110 -0
  176. package/themes/hotel-boutique/tokens.ts +179 -0
  177. package/themes/hyperminimal-mono/THEME.md +91 -0
  178. package/themes/hyperminimal-mono/tokens.ts +150 -0
  179. package/themes/indie-art-game/THEME.md +107 -0
  180. package/themes/indie-art-game/tokens.ts +216 -0
  181. package/themes/insurance-legacy/THEME.md +101 -0
  182. package/themes/insurance-legacy/tokens.ts +182 -0
  183. package/themes/insurance-modern/THEME.md +103 -0
  184. package/themes/insurance-modern/tokens.ts +192 -0
  185. package/themes/kaiju-reveal/THEME.md +97 -0
  186. package/themes/kaiju-reveal/tokens.ts +185 -0
  187. package/themes/kinetic-data/THEME.md +172 -0
  188. package/themes/kinetic-data/audit.log.jsonl +1 -0
  189. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  190. package/themes/kinetic-data/theme.yml +207 -0
  191. package/themes/kinetic-data/tokens.ts +30 -0
  192. package/themes/kinetic-headline/.anchor-render.png +0 -0
  193. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  194. package/themes/kinetic-headline/THEME.md +78 -0
  195. package/themes/kinetic-headline/audit.log.jsonl +4 -0
  196. package/themes/kinetic-headline/dismissals.jsonl +1 -0
  197. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  198. package/themes/kinetic-headline/theme.yml +81 -0
  199. package/themes/kinetic-headline/tokens.ts +26 -0
  200. package/themes/law-firm/THEME.md +108 -0
  201. package/themes/law-firm/tokens.ts +158 -0
  202. package/themes/lawtech-modern/THEME.md +107 -0
  203. package/themes/lawtech-modern/tokens.ts +192 -0
  204. package/themes/linkedin-pro/THEME.md +102 -0
  205. package/themes/linkedin-pro/tokens.ts +174 -0
  206. package/themes/logistics-modern/THEME.md +94 -0
  207. package/themes/logistics-modern/tokens.ts +187 -0
  208. package/themes/magazine-glossy/THEME.md +74 -0
  209. package/themes/magazine-glossy/tokens.ts +158 -0
  210. package/themes/marker-mag/THEME.md +128 -0
  211. package/themes/marker-mag/audit.log.jsonl +1 -0
  212. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  213. package/themes/marker-mag/theme.yml +159 -0
  214. package/themes/marker-mag/tokens.ts +27 -0
  215. package/themes/marketplace-modern/THEME.md +135 -0
  216. package/themes/marketplace-modern/tokens.ts +186 -0
  217. package/themes/marketplace-vintage/THEME.md +110 -0
  218. package/themes/marketplace-vintage/tokens.ts +185 -0
  219. package/themes/maximalist/THEME.md +96 -0
  220. package/themes/maximalist/tokens.ts +168 -0
  221. package/themes/mid-century/THEME.md +109 -0
  222. package/themes/mid-century/tokens.ts +162 -0
  223. package/themes/motorcycle-brand/THEME.md +86 -0
  224. package/themes/motorcycle-brand/tokens.ts +174 -0
  225. package/themes/museum/THEME.md +83 -0
  226. package/themes/museum/tokens.ts +147 -0
  227. package/themes/music-streaming/THEME.md +101 -0
  228. package/themes/music-streaming/tokens.ts +187 -0
  229. package/themes/music-vinyl/THEME.md +98 -0
  230. package/themes/music-vinyl/tokens.ts +167 -0
  231. package/themes/nature-distilled/.anchor-render.png +0 -0
  232. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  233. package/themes/nature-distilled/THEME.md +81 -0
  234. package/themes/nature-distilled/audit.log.jsonl +2 -0
  235. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  236. package/themes/nature-distilled/theme.yml +91 -0
  237. package/themes/nature-distilled/tokens.ts +26 -0
  238. package/themes/news-tabloid/THEME.md +72 -0
  239. package/themes/news-tabloid/tokens.ts +158 -0
  240. package/themes/news-tech/THEME.md +75 -0
  241. package/themes/news-tech/tokens.ts +149 -0
  242. package/themes/newsletter/THEME.md +82 -0
  243. package/themes/newsletter/tokens.ts +138 -0
  244. package/themes/newspaper-classic/THEME.md +74 -0
  245. package/themes/newspaper-classic/tokens.ts +159 -0
  246. package/themes/nonprofit-arts/THEME.md +78 -0
  247. package/themes/nonprofit-arts/tokens.ts +157 -0
  248. package/themes/nonprofit-warm/THEME.md +105 -0
  249. package/themes/nonprofit-warm/tokens.ts +188 -0
  250. package/themes/outdoor-adventure/THEME.md +113 -0
  251. package/themes/outdoor-adventure/tokens.ts +181 -0
  252. package/themes/overland-broadside/THEME.md +119 -0
  253. package/themes/overland-broadside/audit.log.jsonl +1 -0
  254. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  255. package/themes/overland-broadside/theme.yml +138 -0
  256. package/themes/overland-broadside/tokens.ts +27 -0
  257. package/themes/performance-engineered/THEME.md +162 -0
  258. package/themes/performance-engineered/audit.log.jsonl +1 -0
  259. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  260. package/themes/performance-engineered/theme.yml +193 -0
  261. package/themes/performance-engineered/tokens.ts +29 -0
  262. package/themes/pet-food/THEME.md +78 -0
  263. package/themes/pet-food/tokens.ts +185 -0
  264. package/themes/pharma-clinical/THEME.md +164 -0
  265. package/themes/pharma-clinical/audit.log.jsonl +1 -0
  266. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  267. package/themes/pharma-clinical/theme.yml +201 -0
  268. package/themes/pharma-clinical/tokens.ts +29 -0
  269. package/themes/pill-editorial/THEME.md +125 -0
  270. package/themes/pill-editorial/audit.log.jsonl +1 -0
  271. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  272. package/themes/pill-editorial/theme.yml +168 -0
  273. package/themes/pill-editorial/tokens.ts +31 -0
  274. package/themes/podcast-warm/THEME.md +103 -0
  275. package/themes/podcast-warm/tokens.ts +192 -0
  276. package/themes/publisher-indie/THEME.md +78 -0
  277. package/themes/publisher-indie/tokens.ts +148 -0
  278. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  279. package/themes/raw-concrete/THEME.md +76 -0
  280. package/themes/raw-concrete/audit.log.jsonl +10 -0
  281. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  282. package/themes/raw-concrete/theme.yml +88 -0
  283. package/themes/raw-concrete/tokens.ts +27 -0
  284. package/themes/realestate-luxury/THEME.md +94 -0
  285. package/themes/realestate-luxury/tokens.ts +169 -0
  286. package/themes/realestate-marketplace/THEME.md +106 -0
  287. package/themes/realestate-marketplace/tokens.ts +183 -0
  288. package/themes/restaurant-modern/THEME.md +109 -0
  289. package/themes/restaurant-modern/tokens.ts +172 -0
  290. package/themes/runway-fashion/THEME.md +99 -0
  291. package/themes/runway-fashion/tokens.ts +167 -0
  292. package/themes/saturday-morning/THEME.md +117 -0
  293. package/themes/saturday-morning/tokens.ts +281 -0
  294. package/themes/schema.ts +235 -0
  295. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  296. package/themes/signal-dark/THEME.md +107 -0
  297. package/themes/signal-dark/tokens.ts +181 -0
  298. package/themes/soft-modern/THEME.md +91 -0
  299. package/themes/soft-modern/tokens.ts +166 -0
  300. package/themes/solar-residential/THEME.md +92 -0
  301. package/themes/solar-residential/tokens.ts +176 -0
  302. package/themes/sports-league/THEME.md +180 -0
  303. package/themes/sports-league/audit.log.jsonl +1 -0
  304. package/themes/sports-league/tailwind.snippet.ts +15 -0
  305. package/themes/sports-league/theme.yml +213 -0
  306. package/themes/sports-league/tokens.ts +32 -0
  307. package/themes/stadium-sport/THEME.md +114 -0
  308. package/themes/stadium-sport/tokens.ts +187 -0
  309. package/themes/streetwear-hype/THEME.md +100 -0
  310. package/themes/streetwear-hype/tokens.ts +174 -0
  311. package/themes/studio-architect/THEME.md +108 -0
  312. package/themes/studio-architect/tokens.ts +162 -0
  313. package/themes/studio-photographer/THEME.md +88 -0
  314. package/themes/studio-photographer/tokens.ts +164 -0
  315. package/themes/team-kanban/.anchor-render.png +0 -0
  316. package/themes/team-kanban/THEME.md +167 -0
  317. package/themes/team-kanban/audit.log.jsonl +2 -0
  318. package/themes/team-kanban/dismissals.jsonl +1 -0
  319. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  320. package/themes/team-kanban/theme.yml +209 -0
  321. package/themes/team-kanban/tokens.ts +35 -0
  322. package/themes/telehealth-modern/THEME.md +95 -0
  323. package/themes/telehealth-modern/tokens.ts +197 -0
  324. package/themes/tourism-board/THEME.md +111 -0
  325. package/themes/tourism-board/tokens.ts +173 -0
  326. package/themes/toys-modern/THEME.md +79 -0
  327. package/themes/toys-modern/tokens.ts +200 -0
  328. package/themes/travel-luxury/THEME.md +95 -0
  329. package/themes/travel-luxury/tokens.ts +162 -0
  330. package/themes/vacation-rental/THEME.md +105 -0
  331. package/themes/vacation-rental/tokens.ts +174 -0
  332. package/themes/vault-reel/THEME.md +134 -0
  333. package/themes/vault-reel/audit.log.jsonl +3 -0
  334. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  335. package/themes/vault-reel/theme.yml +167 -0
  336. package/themes/vault-reel/tokens.ts +30 -0
  337. package/themes/vet-modern/THEME.md +79 -0
  338. package/themes/vet-modern/tokens.ts +194 -0
  339. package/themes/web3-restraint/THEME.md +87 -0
  340. package/themes/web3-restraint/tokens.ts +154 -0
  341. package/themes/wellness-active/THEME.md +102 -0
  342. package/themes/wellness-active/tokens.ts +203 -0
  343. package/themes/wellness-spa/THEME.md +93 -0
  344. package/themes/wellness-spa/tokens.ts +173 -0
  345. package/themes/y2k-chrome/THEME.md +118 -0
  346. package/themes/y2k-chrome/tokens.ts +249 -0
  347. package/themes/yoga-studio/THEME.md +76 -0
  348. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,107 @@
1
+ # Design Direction — Signal-Dark
2
+
3
+ ## Ethos
4
+ Tesla blackout · Hugging Face yellow signal · Apple display type · Cybertruck engineered restraint · Vercel typographic discipline
5
+
6
+ ## Feel
7
+ Warm-black backdrop with one bright yellow signal color and oversized display type. Hugging-Face-style model-card grids carry technical content; Tesla-style hero moments carry marketing. Reads as a premium developer tool — serious, friendly, expensive without being noisy. The opposite of generic AI-startup purple.
8
+
9
+ ## Reference brands
10
+ - **Tesla** → warm-black blackout marketing surfaces. Photography is the lead; UI gets out of the way.
11
+ - **Hugging Face** → yellow signal accent (#FFD21E) and model-card chrome. Code prominence; technical-but-friendly voice.
12
+ - **Apple** → oversized SF Pro display type at 80-140px, generous tracking refinement, hero whitespace.
13
+ - **Cybertruck** → engineered angular restraint, raw materiality. Hairline borders that *suggest* without enforcing.
14
+ - **Vercel** → developer-tool typographic discipline. Body type that's neutral; mono type that's prominent.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. The warm bias on dark surfaces (`30°` hue) is deliberate — it keeps photography from looking dead. Tesla cinematic uses cool 220° blue-black; signal-dark uses warm 30°. Same pitch-black at first glance, different feeling underneath.
18
+
19
+ Brand tokens: `signal` (= primary), `signal-glow`, `ice` (Vercel cyan, used sparingly for info states), `carbon` (Cybertruck steel for contrast panels), `platinum` (warm silver for sub-headings), `glow-warm` + `glow-cool` (radial-gradient stops for hero backdrops).
20
+
21
+ The yellow `signal` is the **only allowed accent color** on a page. No second color for "variety." If you need a status signal (success/warning/info), use mono labels with the signal-yellow dot prefix, not green/orange/blue chips. The single-color rule is what makes the yellow read as *the signal*.
22
+
23
+ ## Typography
24
+ - **Display:** Inter (Apple SF Pro Display approximation). Weights 500/600/700/800. h1-h4. Hero h1 uses `clamp(3.5rem, 10vw, 9rem)` — Apple/Vercel hero scale. Tracking `-0.04em` (very tight at display sizes; loosens to `-0.005em` at body).
25
+ - **Body:** Inter, 17px, line-height 1.55. Negative tracking `-0.005em`.
26
+ - **Mono:** JetBrains Mono. **Prominent.** Used for eyebrow labels (small-caps mono), code, model IDs, CLI output, status meta. Hugging-Face-style code-first surfaces.
27
+
28
+ Font features: `"cv11", "ss01", "ss03", "tnum"` — Inter stylistic sets + tabular figures. Numbers use `font-mono` or `.tabular`.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-7xl px-6 lg:px-12` (1280px wide — Apple/Tesla claim the screen).
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-24 pb-32 lg:pt-32 lg:pb-48` — oversized
34
+ - Default: `py-20 lg:py-32`
35
+ - Tight: `py-12 lg:py-20`
36
+ - **Allowed scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128.
37
+
38
+ ## Color
39
+ No hex anywhere. All color via tokens. Opacity via `/N` modifier on a token. **Pure black is forbidden** (`--background` is `30 8% 5%`, never `0 0% 0%`). **Pure white is forbidden** (`--foreground` is `30 15% 96%`, never `0 0% 100%`). The warm bias is structural; abandoning it makes everything look like every other dark-mode site.
40
+
41
+ ## Radius
42
+ `--radius: 0.75rem` (12px). Apple-iOS card radius — rounded but not pillowy. **Pills are allowed** (`pillsAllowed: true`) for status badges, tags, model-card meta chips. Pure right angles read as a Vercel-dashboard surface (off-direction); pure pills read as a chip toggle (also off-direction).
43
+
44
+ ## Shadows
45
+ Style is **"glow"**. Signature utility: `.glow-signal` (yellow halo + soft drop) on primary CTAs and active states. Cards use `.glow-card` (border + subtle drop + ambient backdrop shadow). The glow is the depth language — drop-shadows alone read as 2018 SaaS.
46
+
47
+ Three utilities:
48
+ - `.glow-signal` — yellow halo for the one primary action per page
49
+ - `.glow-card` — default card lift with border + subtle dark drop
50
+ - `.glow-subtle` — minimal hairline + small drop for secondary surfaces
51
+
52
+ ## Motion
53
+ - **Easing:** `cubic-bezier(0.22, 1, 0.36, 1)`
54
+ - **Duration tiers:** reveal (700ms), loop (3s), ambient (32s)
55
+ - **Keyframes:**
56
+ - `fade-rise` — standard content reveal
57
+ - `glow-pulse` — primary CTA breathes slowly (3s loop on the main action)
58
+ - `gradient-shift` — hero backdrop drifts slowly (32s ambient, no visible loop point)
59
+ - `terminal-type` — staggered slide-in for terminal-demo lines
60
+
61
+ `prefers-reduced-motion` honored throughout. Transform-only animations on loops; never animate `top/left/width/height`.
62
+
63
+ ## Component patterns
64
+ - **Buttons:** primary = solid yellow signal (`bg-signal text-primary-foreground rounded-xl font-medium`), `glow-signal` shadow on hover. Secondary = ghost (border + foreground). Tertiary = mono text-link with signal underline. **One primary per page.**
65
+ - **Cards:** `rounded-xl border bg-card`, `glow-card` shadow. Padding `p-6 lg:p-8`. Title in display font; meta in mono. Hover lifts with `translate-y-[-2px]` and the glow strengthens. **Model-card-style** — HF influence: meta lives at the top in mono, content lives below.
66
+ - **Inputs:** rounded-lg box, border, `bg-secondary`. Focus ring `2px solid signal at 60% opacity`. Label above; helper below in `mutedForeground`.
67
+ - **CTAs:** primary action is *the* yellow button — always. There is ONE primary CTA per page maximum. Secondary actions are ghost buttons or text-links. Marketing-heavy "free trial / sign up" double-CTAs are forbidden — pick one.
68
+
69
+ ## Component families
70
+ **Model-card** (`*Card`, `*ModelCard`): rounded-xl, border, bg-card, glow-card; meta row in mono at top (icon + slug + version pill); display-font title; mono description; hover lifts. **Status pill** (`*Pill`, `*Badge`): rounded-full, text-xs, px-2 py-0.5, mono, signal-yellow dot prefix for active/success; never colored fills. **Hero block** (`*Hero`): full-bleed gradient backdrop, oversized h1, mono eyebrow, single yellow CTA + ghost secondary.
71
+
72
+ ## Recommended rich media
73
+
74
+ Signal-dark is **photography-rich** in the Tesla / Apple-marketing tradition, but **screenshot-rich** in the Hugging Face / Vercel developer-tool tradition. The mix is the direction.
75
+
76
+ **Hero media:** widescreen photography (21:9 or 16:9), color-graded toward warm shadows + cool highlights (Tesla-cinematic), or product photography on warm-black seamless. **CSS mesh-gradient backdrops** are also permitted as the hero — radial gradients of `--glow-warm` and `--glow-cool` over `--background`, animated subtly via `gradient-shift`. The gradient backdrop is the cheapest hero option that still reads premium.
77
+
78
+ **Code / terminal demo:** the signature signal-dark element. Show the product running — CLI output, code snippets, model-card examples — in a styled `<pre>` with terminal chrome (window dots, title bar). HF leans into this hard; signal-dark should too. Use **JetBrains Mono**, signal-yellow for the prompt and accents, off-white body, dimmed muted-foreground for system text.
79
+
80
+ **AI tool recommendations:**
81
+ - **Midjourney / Flux** with prompts like *"Tesla marketing site photography, warm shadows, cool highlights, 21:9 cinematic, slight film grain, anamorphic lens flare suppressed"* for hero photography
82
+ - **Sora / Runway / Veo** for hero video loops (cinematic atmosphere, slow motion, max 8 MB)
83
+ - **Spline** for hero 3D — premium product objects, glass/chrome surfaces with warm rim lighting
84
+ - **mesh-gradient.com** for the CSS-only gradient backdrop (no AI needed)
85
+ - **Carbon (carbon.now.sh)** or **Ray.so** for static code-snippet images in warm-black theme
86
+
87
+ **Aspect ratios:** 21:9 or 16:9 for hero photography; 4:3 or 1:1 for product shots; gradient backdrops are full-bleed (no aspect constraint).
88
+
89
+ **Performance:** hero photo ≤200 KB AVIF at 1920w; hero video ≤6 MB H.265 with poster fallback; mesh-gradient is ~0 KB CSS. LCP target <2s on 4G.
90
+
91
+ **Avoid:** pure black photography backgrounds (kills the warm bias), saturated chrome 3D (that's Y2K), gradient backdrops in the wrong hue (no purple, no pink — warm amber + cool blue only), generic stock photography with watermarks, autoplay video with sound, photography that competes with the yellow signal (no yellow-dominant images — the signal must remain the unique yellow on the page).
92
+
93
+ **Accessibility:** WCAG AA for text on warm-black requires foreground at ≥`30 15% 88%` minimum (we use `30 15% 96%`, well above). Yellow signal on warm-black passes AA at large size; for small body text on yellow, the foreground must be the near-black `--primary-foreground`, never off-white.
94
+
95
+ ## Component families (when projects add them)
96
+ Document each family here as it emerges. Initial expected families: `*Card` (model-card pattern), `*Pill` (status/tag), `*Hero` (full-bleed gradient + oversized type).
97
+
98
+ ## Details
99
+ - **Selection:** `hsl(var(--signal) / 0.3)` background, foreground text.
100
+ - **Focus ring:** `2px solid hsl(var(--signal) / 0.6)` — visible and on-brand.
101
+ - **Scrollbar:** thin, warm-toned.
102
+
103
+ ## Exceptions
104
+ None yet. When an intentional violation lands (e.g. a Tesla cinematic-dark *blue* hue used for a single hero moment), add it here with the reason.
105
+
106
+ ## Revisions
107
+ - Initial direction, generated at install time. Authored as the 13th canonical direction to dogfood the synthesis Tesla + Hugging Face + Apple — and to provide a premium-developer-tool aesthetic the original twelve didn't cover.
@@ -0,0 +1,181 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const signalDark: Direction = {
4
+ name: "signal-dark",
5
+ ethos:
6
+ "Tesla blackout · Hugging Face yellow signal · Apple display type · Cybertruck engineered restraint",
7
+ references: [
8
+ { brand: "Tesla", trait: "warm-black blackout marketing surfaces" },
9
+ { brand: "Hugging Face", trait: "yellow signal accent + model-card chrome" },
10
+ { brand: "Apple", trait: "oversized SF Pro display type, generous whitespace" },
11
+ { brand: "Cybertruck", trait: "engineered angular restraint, raw materiality" },
12
+ { brand: "Vercel", trait: "developer-tool typographic discipline" },
13
+ ],
14
+ feel:
15
+ "Warm-black backdrop with one bright yellow signal color and oversized display type. " +
16
+ "Hugging-Face-style model-card grids carry technical content; Tesla-style hero moments " +
17
+ "carry marketing. Reads as a premium developer tool — serious, friendly, expensive " +
18
+ "without being noisy. The opposite of generic AI-startup purple.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Inter",
23
+ fallback: ["-apple-system", "BlinkMacSystemFont", "Segoe UI", "system-ui", "sans-serif"],
24
+ from: "Apple SF Pro Display feel via Inter — closest open-source approximation, used at 80-140px hero sizes",
25
+ googleFont: "Inter",
26
+ weights: [400, 500, 600, 700, 800],
27
+ },
28
+ body: {
29
+ family: "Inter",
30
+ fallback: ["-apple-system", "BlinkMacSystemFont", "system-ui", "sans-serif"],
31
+ from: "Apple SF Pro Text feel — clean at 14-18px body sizes",
32
+ googleFont: "Inter",
33
+ weights: [400, 500, 600],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "Hugging-Face-style code prominence — model IDs, tokens, CLI output, eyebrow labels",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400, 500, 600],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.04em", // Apple-tight at display sizes; tighter than editorial -0.015em
46
+ bodyTracking: "-0.005em", // very subtle negative tracking — Apple body convention
47
+ fontFeatureSettings: '"cv11", "ss01", "ss03", "tnum"',
48
+ h1ScaleClamp: "clamp(3.5rem, 10vw, 9rem)", // ALERT-LEVEL oversized — Apple/Vercel hero scale
49
+ bodyBaseSize: "1.0625rem", // 17px — Apple body default
50
+ bodyLineHeight: "1.55",
51
+ },
52
+
53
+ colors: {
54
+ // Surfaces — warm-black, Tesla blackout with slight warm bias (30°) so
55
+ // photography reads alive, not corpse-blue
56
+ background: { hsl: "30 8% 5%", from: "Tesla blackout — warm-bias near-black" },
57
+ foreground: { hsl: "30 15% 96%", from: "warm off-white, never pure white — Apple-tinted" },
58
+ card: { hsl: "30 6% 8%", from: "card surface, 3% lighter than bg" },
59
+ popover: { hsl: "30 6% 11%", from: "popover/menu surface, 6% lighter than bg" },
60
+
61
+ // Primary — Hugging Face yellow signal
62
+ primary: { hsl: "48 100% 56%", from: "Hugging Face yellow #FFD21E — the ONE signal color" },
63
+ primaryForeground: { hsl: "30 8% 5%", from: "near-black on yellow for max contrast" },
64
+
65
+ // Secondary surfaces — monochromatic steps
66
+ secondary: { hsl: "30 6% 14%", from: "secondary surface, Cybertruck engineered restraint" },
67
+ secondaryForeground: { hsl: "30 15% 96%", from: "off-white on dark gray" },
68
+ muted: { hsl: "30 6% 14%", from: "same as secondary; differentiation by usage" },
69
+ mutedForeground: { hsl: "30 8% 65%", from: "warm gray — captions, meta, eyebrows" },
70
+ accent: { hsl: "30 6% 18%", from: "hover surface, one tier lighter than secondary" },
71
+ accentForeground: { hsl: "30 15% 96%", from: "off-white on hover" },
72
+
73
+ // Borders — Cybertruck hairline, visible but quiet
74
+ border: { hsl: "30 6% 18%", from: "Cybertruck hairline — same as accent, structural" },
75
+ input: { hsl: "30 6% 18%", from: "same as border" },
76
+ ring: { hsl: "48 100% 56%", from: "primary yellow — focus rings everywhere" },
77
+
78
+ // Destructive — warm red, not pure (matches warm palette)
79
+ destructive: { hsl: "8 80% 56%", from: "warm Tesla brake-light red" },
80
+ destructiveForeground: { hsl: "30 15% 96%", from: "off-white on warm red" },
81
+
82
+ brand: {
83
+ signal: { hsl: "48 100% 56%", from: "alias for primary — the yellow signal color" },
84
+ "signal-glow": { hsl: "48 100% 65%", from: "brighter yellow for hover/glow states" },
85
+ ice: { hsl: "200 85% 65%", from: "Vercel-cyan tertiary accent, used sparingly for info" },
86
+ carbon: { hsl: "0 0% 12%", from: "Cybertruck steel — pure-neutral panel for contrast moments" },
87
+ platinum: { hsl: "30 8% 88%", from: "warm silver — sub-headings, premium meta text" },
88
+ "glow-warm": { hsl: "40 85% 60%", from: "amber glow stop for backdrop gradients" },
89
+ "glow-cool": { hsl: "200 75% 55%", from: "cool blue glow stop for backdrop gradients" },
90
+ },
91
+ },
92
+
93
+ spacing: {
94
+ base: 4,
95
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
96
+ containerMax: "max-w-7xl", // wider than editorial — Apple/Tesla claim the screen
97
+ containerPadding: "px-6 lg:px-12",
98
+ sectionPadding: {
99
+ hero: "pt-24 pb-32 lg:pt-32 lg:pb-48", // oversized hero — Apple convention
100
+ default: "py-20 lg:py-32",
101
+ tight: "py-12 lg:py-20",
102
+ },
103
+ },
104
+
105
+ radius: {
106
+ base: "0.75rem", // 12px — Apple iOS card; rounded but not pillowy
107
+ pillsAllowed: true, // status pills, tags, badges — HF model-card convention
108
+ },
109
+
110
+ shadows: {
111
+ style: "glow", // signature: yellow glow on hover for primary surfaces
112
+ utilities: {
113
+ "glow-signal":
114
+ "0 0 0 1px hsl(var(--signal) / 0.4), 0 8px 32px hsl(var(--signal) / 0.25), 0 16px 64px hsl(var(--signal) / 0.15)",
115
+ "glow-card":
116
+ "0 0 0 1px hsl(var(--border)), 0 4px 16px hsl(0 0% 0% / 0.4), 0 16px 48px hsl(0 0% 0% / 0.2)",
117
+ "glow-subtle":
118
+ "0 0 0 1px hsl(var(--border)), 0 2px 8px hsl(0 0% 0% / 0.3)",
119
+ },
120
+ },
121
+
122
+ motion: {
123
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
124
+ durations: { reveal: 700, loop: 3000, ambient: 32000 },
125
+ keyframes: {
126
+ "fade-rise": {
127
+ css:
128
+ "from { opacity: 0; transform: translateY(20px); }\n" +
129
+ "to { opacity: 1; transform: translateY(0); }",
130
+ defaultDuration: 700,
131
+ iteration: "once",
132
+ purpose: "standard reveal — content enters with subtle rise",
133
+ },
134
+ "glow-pulse": {
135
+ css:
136
+ "0%, 100% { box-shadow: 0 0 0 1px hsl(var(--signal) / 0.4), 0 8px 32px hsl(var(--signal) / 0.25); }\n" +
137
+ "50% { box-shadow: 0 0 0 1px hsl(var(--signal) / 0.6), 0 12px 48px hsl(var(--signal) / 0.4); }",
138
+ defaultDuration: 3000,
139
+ iteration: "infinite",
140
+ purpose: "primary CTA breathing — slow yellow pulse on the main action",
141
+ },
142
+ "gradient-shift": {
143
+ css:
144
+ "0%, 100% { background-position: 0% 50%; }\n" +
145
+ "50% { background-position: 100% 50%; }",
146
+ defaultDuration: 32000,
147
+ iteration: "infinite",
148
+ purpose: "hero backdrop — slow gradient drift, set-and-forget ambient",
149
+ },
150
+ "terminal-type": {
151
+ css:
152
+ "from { opacity: 0; transform: translateX(-8px); }\n" +
153
+ "to { opacity: 1; transform: translateX(0); }",
154
+ defaultDuration: 400,
155
+ iteration: "once",
156
+ purpose: "terminal demo — each line types in with a small slide",
157
+ },
158
+ },
159
+ respectsReducedMotion: true,
160
+ },
161
+
162
+ density: "medium",
163
+
164
+ patterns: {
165
+ button:
166
+ "Primary = solid yellow signal (bg-signal, foreground=near-black, rounded-xl, font-medium, glow-signal shadow on hover). Secondary = ghost with border + foreground. Tertiary = mono text-link with signal underline.",
167
+ card:
168
+ "rounded-xl, border, bg-card, glow-card shadow. Padding p-6 lg:p-8. Title in display font; meta in mono. Hover lifts with translate-y-[-2px] and glow strengthens.",
169
+ input:
170
+ "rounded-lg box, border, bg-secondary. Focus ring = 2px solid signal at 60% opacity. Label above; helper below in mutedForeground.",
171
+ cta:
172
+ "Primary action is the yellow button — always. There is ONE primary CTA per page maximum. Secondary actions are ghost buttons or text-links. Marketing-heavy 'free trial / sign up' double-CTAs are forbidden.",
173
+ },
174
+
175
+ details: {
176
+ selectionBg: "hsl(var(--signal) / 0.3)",
177
+ selectionFg: "hsl(var(--foreground))",
178
+ focusRing: "2px solid hsl(var(--signal) / 0.6)",
179
+ scrollbarStyle: "thin",
180
+ },
181
+ };
@@ -0,0 +1,91 @@
1
+ # Design Direction — Soft-Modern
2
+
3
+ ## Ethos
4
+ Linear's geometric calm · Notion warmth · Stripe homepage gradients · Vercel's quiet polish · Plain's friendly chrome
5
+
6
+ ## Feel
7
+ Approachable and considered. Rounded corners, soft layered shadows, friendly geometric sans, muted accent palette with one signal color. Subtle motion that confirms interaction without demanding attention. Reads productive, not flashy.
8
+
9
+ ## Reference brands
10
+ - **Linear** → geometric calm. Quiet UI that disappears into the work.
11
+ - **Notion** → approachable warmth. Friendly without being childish.
12
+ - **Stripe** → soft gradient backdrops. Marketing surfaces, not docs.
13
+ - **Vercel** → quiet polish. Hairline borders, minimal shadow.
14
+ - **Plain (plain.com)** → friendly type, rounded chrome.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Brand tokens: `--violet-soft`, `--violet-deep`, `--teal`, `--amber`. Primary is **violet** (Linear-style 262° hue). Surface stack is monochromatic (220° hue across background/secondary/muted/accent) — depth from border + shadow, never from hue shift.
18
+
19
+ The brand tokens (`teal`, `amber`) are the **secondary accents** — used sparingly, never as primary CTA color. They exist for status indicators, highlight badges, and one-off marketing moments.
20
+
21
+ ## Typography
22
+ - **Display:** Plus Jakarta Sans (Notion/Plain — friendly geometric, slightly humanist). h1–h4, weights 500/600/700.
23
+ - **Body:** Inter (Linear/Vercel sans — clean at small sizes). Base 16px, line-height 1.6. Tracking `0`.
24
+ - **Mono:** JetBrains Mono. Code blocks, metrics, tabular numerics.
25
+
26
+ Headings track `-0.02em` (sans-serif headings benefit from tight tracking). Numbers always use `font-variant-numeric: tabular-nums`. Inter stylistic sets `"cv11", "ss01", "ss03"` for single-story a/g.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-6xl px-4 lg:px-8`.
30
+ - **Section padding tiers:**
31
+ - Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
32
+ - Default: `py-16 lg:py-24`
33
+ - Tight: `py-12 lg:py-16`
34
+ - **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80.
35
+
36
+ ## Color
37
+ No hex anywhere. All color via tokens. Opacity via `/N` modifier. Pure white is allowed for cards (`--card`); pure black is not — `--foreground` is `224 38% 10%` (deep slate).
38
+
39
+ ## Radius
40
+ `--radius: 0.75rem` (12px). **Rounded is the signature.** Pills are allowed for status chips and tags (`pillsAllowed: true`). Hard right angles read "bare HTML" in this language — keep things rounded.
41
+
42
+ ## Shadows
43
+ Three soft-layered utilities:
44
+ - `.shadow-soft` — default card lift
45
+ - `.shadow-soft-lg` — hover lift, larger spread
46
+ - `.shadow-soft-inset` — top-edge highlight for raised surfaces
47
+
48
+ Shadows use 220° gray at 4-8% opacity — never pure black, never high opacity. The soft-modern shadow is *almost not there*.
49
+
50
+ ## Motion
51
+ Three keyframes:
52
+ - `fade-rise` (600ms) — standard content entrance
53
+ - `scale-in` (200ms) — modals, popovers, tooltips
54
+ - `shimmer` (1600ms loop) — loading skeletons
55
+
56
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. Reveal duration `600ms` — fast enough to feel responsive. `prefers-reduced-motion` honored.
57
+
58
+ ## Component patterns
59
+ - **Buttons:** solid-fill primary (`bg-primary`, `text-primary-foreground`, `rounded-xl`, `shadow-soft`). Secondary is ghost (border + foreground text). Tertiary is link. Hover lifts subtly (scale 1.01 + `shadow-soft-lg`).
60
+ - **Cards:** `rounded-xl`, border, `bg-card`, `shadow-soft`. Padding `p-6 lg:p-8`. Title in display font. Hover lifts to `shadow-soft-lg`.
61
+ - **Inputs:** full rounded-lg box, border, `bg-background`. Focus ring `2px solid var(--ring) / 0.5`. Label above; helper text below in `mutedForeground`.
62
+ - **CTAs:** primary button is default. Secondary CTAs use ghost button or text-link with primary color.
63
+
64
+ ## Recommended rich media
65
+ Soft-modern's lead media is the **gradient backdrop** itself — Stripe-homepage-style soft mesh gradients (violet → teal → amber, low saturation, smooth blends). Product imagery is studio-clean on white seamless, slightly elevated with a soft shadow. Hero illustrations lean toward isometric or abstract geometric — Linear/Notion/Plain visual language. Photography is sparingly used; the gradient is doing the visual work.
66
+
67
+ **AI tool recommendations:** for mesh gradients, **mesh-gradient.com** or **csshero.org/mesh** for declarative CSS (no AI needed, often the right answer); **Midjourney / Flux** with prompts like *"soft mesh gradient, violet to teal to amber, smooth blend, 4K, abstract background"*; **Spline** for interactive 3D shapes (gradient orbs, soft geometry) when a hero needs depth; **Recraft** for isometric product illustrations and Notion-style figurative drawings; **Linear's screenshot library aesthetic** as a prompting target ("Linear app screenshot, geometric calm, single accent color").
68
+
69
+ **Aspect ratios:** gradient backdrops are full-bleed (no aspect constraint); product shots 4:3 or 1:1; isometric illustrations 16:9 hero or 4:3 supporting. Avoid 21:9 cinematic widescreen — that's cinematic-dark territory.
70
+
71
+ **Video:** subtle hero video accents are on-brand — UI screen-recordings with soft transitions (Linear-style demo), short product loops (4-8s, autoplay muted, no narration). ≤6 MB, H.265. Background gradient continues to play even when video pauses.
72
+
73
+ **Performance:** mesh gradient as CSS is ~0 KB. AVIF product shots ≤120 KB at 1200w. Video kept short and tightly compressed. LCP target under 1.5s on 4G.
74
+
75
+ **Avoid:** photorealistic AI hero images (too much depth — fights the soft palette), film-grain textures (cinematic-dark), dark moody photography, chrome 3D renders (Y2K), heavy decorative pattern (maximalist), pure black backgrounds.
76
+
77
+ **Accessibility:** gradient backgrounds at low contrast can fail WCAG AA — always verify text-on-gradient contrast; consider placing copy on a card surface inside the gradient rather than directly on the backdrop.
78
+
79
+ ## Component families
80
+ None at install time. As `*Card`, `*Tile`, `*Badge` families emerge in the project, the Director lists them here with their shared pattern.
81
+
82
+ ## Details
83
+ - **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text.
84
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — visible, not loud.
85
+ - **Scrollbar:** thin.
86
+
87
+ ## Exceptions
88
+ None yet.
89
+
90
+ ## Revisions
91
+ - Initial direction, generated at install time.
@@ -0,0 +1,166 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const softModern: Direction = {
4
+ name: "soft-modern",
5
+ ethos: "Linear's softer cousin · Notion warmth · Stripe homepage gradients · Vercel's quiet polish",
6
+ references: [
7
+ { brand: "Linear", trait: "geometric calm" },
8
+ { brand: "Notion", trait: "approachable warmth" },
9
+ { brand: "Stripe", trait: "soft gradient backdrops" },
10
+ { brand: "Vercel", trait: "quiet polish on the marketing site" },
11
+ { brand: "Plain (plain.com)", trait: "friendly type, rounded chrome" },
12
+ ],
13
+ feel:
14
+ "Approachable and considered. Rounded corners, soft layered shadows, " +
15
+ "friendly geometric sans, muted accent palette with one signal color. " +
16
+ "Subtle motion that confirms interaction without demanding attention. " +
17
+ "Reads productive, not flashy.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Plus Jakarta Sans",
22
+ fallback: ["Inter", "system-ui", "-apple-system", "sans-serif"],
23
+ from: "Notion/Plain — friendly geometric, slightly humanist",
24
+ googleFont: "Plus+Jakarta+Sans",
25
+ weights: [500, 600, 700],
26
+ },
27
+ body: {
28
+ family: "Inter",
29
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
30
+ from: "Linear/Vercel sans — clean, neutral, readable at small sizes",
31
+ googleFont: "Inter",
32
+ weights: [400, 500, 600],
33
+ },
34
+ mono: {
35
+ family: "JetBrains Mono",
36
+ fallback: ["ui-monospace", "SFMono-Regular", "monospace"],
37
+ from: "code blocks, metrics — tabular numerics",
38
+ googleFont: "JetBrains+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.02em", // friendly sans-serif headings benefit from tight tracking
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"cv11", "ss01", "ss03"', // Inter stylistic sets — single-story a/g
47
+ h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)",
48
+ bodyBaseSize: "1rem",
49
+ bodyLineHeight: "1.6",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "220 20% 99%", from: "near-white, faint blue bias — Linear surface" },
54
+ foreground: { hsl: "224 38% 10%", from: "deep slate, never pure black — Notion ink" },
55
+ card: { hsl: "0 0% 100%", from: "pure white card — lifts off the background subtly" },
56
+ popover: { hsl: "0 0% 100%", from: "same as card" },
57
+ primary: { hsl: "262 70% 58%", from: "violet — Linear's accent" },
58
+ primaryForeground: { hsl: "0 0% 100%", from: "white on violet" },
59
+ secondary: { hsl: "220 16% 96%", from: "soft cool gray — Vercel quiet surface" },
60
+ secondaryForeground: { hsl: "224 38% 14%", from: "slate ink on cool gray" },
61
+ muted: { hsl: "220 16% 96%", from: "same as secondary" },
62
+ mutedForeground: { hsl: "220 12% 46%", from: "slate gray — captions and meta" },
63
+ accent: { hsl: "220 16% 94%", from: "hover surface — one tier deeper than secondary" },
64
+ accentForeground: { hsl: "224 38% 14%", from: "slate ink" },
65
+ border: { hsl: "220 14% 90%", from: "soft border — visible, not assertive" },
66
+ input: { hsl: "220 14% 90%", from: "same as border" },
67
+ ring: { hsl: "262 70% 58%", from: "primary, used for focus only" },
68
+ destructive: { hsl: "354 80% 56%", from: "warm red — not the harsh enterprise red" },
69
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on warm red" },
70
+ brand: {
71
+ "violet-soft": { hsl: "262 60% 96%", from: "primary tinted bg — pills, highlights" },
72
+ "violet-deep": { hsl: "262 75% 42%", from: "primary hover, intensified" },
73
+ teal: { hsl: "172 60% 42%", from: "second accent — Stripe/Linear teal, used sparingly" },
74
+ amber: { hsl: "38 90% 60%", from: "warmth/highlight accent — Notion-like" },
75
+ },
76
+ },
77
+
78
+ spacing: {
79
+ base: 4,
80
+ scale: [4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64, 80],
81
+ containerMax: "max-w-6xl",
82
+ containerPadding: "px-4 lg:px-8",
83
+ sectionPadding: {
84
+ hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
85
+ default: "py-16 lg:py-24",
86
+ tight: "py-12 lg:py-16",
87
+ },
88
+ },
89
+
90
+ radius: {
91
+ base: "0.75rem", // 12px — the soft-modern signature
92
+ pillsAllowed: true, // pills are part of this language (status chips, tags)
93
+ },
94
+
95
+ shadows: {
96
+ style: "soft",
97
+ utilities: {
98
+ "shadow-soft":
99
+ "0 1px 2px hsl(220 14% 50% / 0.04), 0 4px 12px hsl(220 14% 50% / 0.06)",
100
+ "shadow-soft-lg":
101
+ "0 2px 4px hsl(220 14% 50% / 0.04), 0 12px 32px hsl(220 14% 50% / 0.08)",
102
+ "shadow-soft-inset":
103
+ "inset 0 1px 0 hsl(0 0% 100% / 0.6)",
104
+ },
105
+ },
106
+
107
+ motion: {
108
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
109
+ durations: {
110
+ reveal: 600, // faster than editorial — UI feels responsive
111
+ loop: 2400,
112
+ ambient: 24000,
113
+ },
114
+ keyframes: {
115
+ "fade-rise": {
116
+ css:
117
+ "from { opacity: 0; transform: translateY(12px); }\n" +
118
+ "to { opacity: 1; transform: translateY(0); }",
119
+ defaultDuration: 600,
120
+ iteration: "once",
121
+ purpose: "standard content entrance — short rise, faster than editorial",
122
+ },
123
+ "scale-in": {
124
+ css:
125
+ "from { opacity: 0; transform: scale(0.96); }\n" +
126
+ "to { opacity: 1; transform: scale(1); }",
127
+ defaultDuration: 200,
128
+ iteration: "once",
129
+ purpose: "modals, popovers, tooltips — confirms interaction",
130
+ },
131
+ "shimmer": {
132
+ css:
133
+ "0% { background-position: -200% 0; }\n" +
134
+ "100% { background-position: 200% 0; }",
135
+ defaultDuration: 1600,
136
+ iteration: "infinite",
137
+ purpose: "loading skeletons — gradient sweep",
138
+ },
139
+ },
140
+ respectsReducedMotion: true,
141
+ },
142
+
143
+ density: "medium",
144
+
145
+ patterns: {
146
+ button:
147
+ "Solid-fill primary (primary bg, primary-foreground text, rounded-xl, shadow-soft). " +
148
+ "Secondary is ghost (border, foreground text). Tertiary is link. " +
149
+ "Hover: subtle scale (1.01) + shadow-soft-lg.",
150
+ card:
151
+ "Rounded-xl, border, bg-card, shadow-soft. Internal padding p-6 lg:p-8. " +
152
+ "Title in display font; body in sans. Hover lifts to shadow-soft-lg.",
153
+ input:
154
+ "Full rounded-lg box, border, bg-background. Focus = ring (2px primary at 40% opacity). " +
155
+ "Label above, helper text below in muted-foreground.",
156
+ cta:
157
+ "Primary button is the default. Secondary CTAs use ghost button or text-link with primary color.",
158
+ },
159
+
160
+ details: {
161
+ selectionBg: "hsl(var(--primary) / 0.18)",
162
+ selectionFg: "hsl(var(--foreground))",
163
+ focusRing: "2px solid hsl(var(--ring) / 0.5)",
164
+ scrollbarStyle: "thin",
165
+ },
166
+ };
@@ -0,0 +1,92 @@
1
+ # Design Direction — Solar-Residential
2
+
3
+ ## Ethos
4
+ Sunrun homeowner-friendly chrome · Tesla Solar minimal white · SunPower trust-blue restraint · Sunnova warm signal-green · ADT Solar suburban-safe rounding
5
+
6
+ ## Feel
7
+ Clean white residential-installer page. One signal-green accent does all the savings and CTA work. Numbers are big and tabular — kWh, dollar-per-month, panel count. Rounded corners read suburban-safe, not enterprise-sharp. The page reads as a confident neighborhood quote, never a sales pitch.
8
+
9
+ ## Reference brands
10
+ - **Sunrun** → homeowner-friendly CTA stack. The page is a quote, the quote is a button.
11
+ - **Tesla Solar** → near-zero-chrome white canvas. One accent moment per screen.
12
+ - **SunPower** → trust-blue restraint and savings-calculator gravity. Numbers are the hero.
13
+ - **Sunnova** → warm signal-green for go/install/active states. Green means yes.
14
+ - **ADT Solar** → rounded suburban-safe card chrome. The corners reassure the homeowner.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin.
18
+
19
+ Surface stack is **pure white background** → `--card` (a single degree above) → `--secondary` (cool-gray inset panels). Depth comes from soft shadows on the savings card, hairline borders elsewhere. Pure black is forbidden; `--foreground` is a deep cool slate.
20
+
21
+ Brand tokens: `--signal-green`, `--signal-green-deep`, `--signal-green-soft`, `--trust-blue`, `--sun-amber`, `--panel-slate`. The `--sun-amber` is decorative-only — it appears on the sunshine glyph and never on a CTA. `--trust-blue` is reserved for warranty and certification badges.
22
+
23
+ ## Typography
24
+ - **Display:** Inter heavy (Tesla Solar / Sunrun marketing display). h1–h4. Tracking `-0.02em`.
25
+ - **Body:** Inter regular/medium (SunPower body). Body base **15px** with **line-height 1.55** — readable for older homeowners by design.
26
+ - **Mono:** JetBrains Mono. Dollar amounts, kWh, panel count, zip-code input — tabular-nums on by default.
27
+
28
+ H1 uses `clamp(2.25rem, 5vw, 3.75rem)`. Restrained — the dollar numbers carry the page, not the heading. Font features: `"tnum", "ss01"`.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-6xl px-4 lg:px-8` — wide enough for a three-panel installer-process timeline.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-20 pb-12 lg:pt-28 lg:pb-20`
34
+ - Default: `py-14 lg:py-20`
35
+ - Tight: `py-10 lg:py-14`
36
+ - **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens.
40
+
41
+ Signal green is the only saturated CTA accent. Trust blue and sun amber are decorative-semantic. The savings-row highlight (`bg-signal-green-soft`) is the only acceptable green-on-white surface tint. Status pills (`Quote`, `Permit`, `Install`, `Inspect`, `Activate`) use the signal-green-soft + signal-green-deep pair — never solid fills.
42
+
43
+ ## Radius
44
+ `--radius: 0.625rem` (10px). Suburban-safe rounding — softer than enterprise dashboards, sharper than soft-modern. Pills allowed (`pillsAllowed: true`) for process-step badges and zip-code chips.
45
+
46
+ ## Shadows
47
+ **Soft, three utilities:** `.shadow-quote` (savings-calculator card lift), `.shadow-card` (general panel lift), `.shadow-panel-glow` (the single green-ringed glow on the panel-render hero or the active quote card). No glows on body cards. No colored shadows except panel-glow on hero.
48
+
49
+ ## Motion
50
+ Three keyframes: `fade-rise` (400ms — savings card and quote-block entrance), `counter-up` (600ms — estimated-savings dollar number rolls in once the zip is entered), `sun-rays` (18s slow ambient rotation behind the panel-render hero only). The counter-up is the one performative moment — it confirms the homeowner that their input did something.
51
+
52
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `sun-rays` halts, `counter-up` resolves immediately to its final state.
53
+
54
+ ## Density
55
+ Medium. The page makes room for the dollar number to be 48px and tabular. Process-timeline steps get generous side-padding. Customer-story rows are airy — three homeowners across, photo-name-quote, not a packed grid.
56
+
57
+ ## Component patterns
58
+ - **Buttons:** solid signal-green primary (rounded-lg, shadow-card) for the single commit — `Get my quote`, `Schedule install`. Secondary is ghost. Tertiary is text-link green. Hover deepens fill to `--signal-green-deep`; no scale, no shadow growth.
59
+ - **Cards:** rounded-lg, 1px `--border`, `bg-card`, `shadow-card`. Padding `p-5 lg:p-6`. The savings-calculator card is the one exception — it wears `shadow-panel-glow` for emphasis.
60
+ - **Inputs:** full rounded-lg box, 1px `--input` border, `bg-card`. Zip-code input is mono 18px center-aligned. Focus = 2px signal-green ring at 45% opacity.
61
+ - **CTA:** primary signal-green for the quote commit. Process timeline pills are soft-green badges. Customer-story name carries a thin trust-blue underline only.
62
+
63
+ ## Recommended rich media
64
+ Solar-Residential leans on **photorealistic 3D roof-panel renders** and **real homeowner photography** — suburban houses in golden-hour light, panels visible, family-on-driveway energy. Avoid stock photography of suit-and-tie engineers or generic green-energy abstractions.
65
+
66
+ **Iconography:** 24px grid, 1.5px stroke, rounded line caps. Sun, house, panel, plug, leaf, dollar — drawn in a single hand. The literal sun glyph may use `--sun-amber` as a fill.
67
+
68
+ **AI tool recommendations:** **Midjourney / Flux** for *"photorealistic suburban single-family home with rooftop solar panels, golden hour, family standing in driveway, wide-angle, soft natural light, no logos"* and *"photorealistic 3D render of monocrystalline solar panel, isolated on white, three-quarter angle, soft studio lighting"*. Avoid the default Midjourney "green energy" abstract gradients — they look stock.
69
+
70
+ **Aspect ratios:** 16:10 for the hero roof shot. 4:3 for the savings-calculator screenshot. 1:1 for homeowner-story portraits. Never 16:9 — that's video and reads consumer-broadcast.
71
+
72
+ **Video:** rare, optional. If used, a 15-second silent install timelapse (truck, panels rising, family thumbs-up). Poster frame mandatory. ≤6MB H.265. Never autoplay with sound.
73
+
74
+ **Performance:** roof-render hero ships as AVIF at 1800w ≤140KB. Customer portraits at 600w ≤40KB each. LCP target 2s.
75
+
76
+ **Avoid:** generic green-leaf gradient backgrounds, world-globe imagery, suit-and-tie sales reps, polar-bear-on-ice climate visuals, neon-glow solar-cell renders, before/after slider gimmicks. The page sells a roof job, not a global mission.
77
+
78
+ **Accessibility:** every dollar figure has an accompanying spelled-out aria-label (`$184 saved per month`). Process-step pills include the step number and label, never icon-only. Signal-green meets 4.5:1 against white at button text size.
79
+
80
+ ## Component families
81
+ None at install time. Family conventions emerge as the project grows.
82
+
83
+ ## Details
84
+ - **Selection:** `hsl(var(--primary) / 0.20)` background, foreground text.
85
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.45)`. Signal-green, soft.
86
+ - **Scrollbar:** thin.
87
+
88
+ ## Exceptions
89
+ None yet.
90
+
91
+ ## Revisions
92
+ - Initial direction, generated at install time.