@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,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.