@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,176 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // solar-residential — Sunrun / Tesla Solar / SunPower clean-white residential
4
+ // installer language. White canvas, single signal-green accent, savings-driven
5
+ // numerics. Reads like a friendly neighborhood quote, not a utility bill.
6
+
7
+ export const solarResidential: Direction = {
8
+ name: "solar-residential" as Direction["name"],
9
+ ethos:
10
+ "Sunrun homeowner-friendly chrome · Tesla Solar minimal white · SunPower trust-blue restraint · " +
11
+ "Sunnova warm signal-green · ADT Solar suburban-safe rounding",
12
+ references: [
13
+ { brand: "Sunrun", trait: "homeowner-friendly orange-on-white CTA stack" },
14
+ { brand: "Tesla Solar", trait: "near-zero-chrome white canvas, single-accent moment" },
15
+ { brand: "SunPower", trait: "restrained trust-blue type, savings-calculator gravity" },
16
+ { brand: "Sunnova", trait: "warm signal-green for go/install/active states" },
17
+ { brand: "ADT Solar", trait: "rounded suburban-safe card chrome, friendly numerics" },
18
+ ],
19
+ feel:
20
+ "Clean white residential-installer page. One signal-green accent does all the savings/CTA work. " +
21
+ "Numbers are big and tabular — kWh, dollar-per-month, panel count. Rounded corners read suburban-safe " +
22
+ "(not enterprise-sharp). The page is a confident quote, not a sales pitch.",
23
+
24
+ fonts: {
25
+ display: {
26
+ family: "Inter",
27
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
28
+ from: "Tesla Solar / Sunrun display — Inter heavy, no flourishes",
29
+ googleFont: "Inter",
30
+ weights: [500, 600, 700],
31
+ },
32
+ body: {
33
+ family: "Inter",
34
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
35
+ from: "SunPower body — neutral 15px, readable for older homeowners",
36
+ googleFont: "Inter",
37
+ weights: [400, 500, 600],
38
+ },
39
+ mono: {
40
+ family: "JetBrains Mono",
41
+ fallback: ["ui-monospace", "SFMono-Regular", "monospace"],
42
+ from: "savings numerics — kWh, $/month, panel count tabular",
43
+ googleFont: "JetBrains+Mono",
44
+ weights: [400, 500],
45
+ },
46
+ },
47
+
48
+ typography: {
49
+ headingTracking: "-0.02em",
50
+ bodyTracking: "0",
51
+ fontFeatureSettings: '"tnum", "ss01"',
52
+ h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)",
53
+ bodyBaseSize: "0.9375rem",
54
+ bodyLineHeight: "1.55",
55
+ },
56
+
57
+ colors: {
58
+ background: { hsl: "0 0% 100%", from: "Tesla Solar pure white — no warmth, no tint" },
59
+ foreground: { hsl: "215 30% 14%", from: "deep slate — SunPower trust-ink, not pure black" },
60
+ card: { hsl: "210 25% 98%", from: "near-white card — lifts a degree above background" },
61
+ popover: { hsl: "0 0% 100%", from: "same as background" },
62
+ primary: { hsl: "142 65% 38%", from: "Sunnova signal green — install/active/savings color" },
63
+ primaryForeground: { hsl: "0 0% 100%", from: "white on signal green" },
64
+ secondary: { hsl: "210 22% 96%", from: "cool gray surface — secondary panel" },
65
+ secondaryForeground: { hsl: "215 30% 14%", from: "ink on cool gray" },
66
+ muted: { hsl: "210 20% 95%", from: "muted gray — divider blocks, disabled" },
67
+ mutedForeground: { hsl: "215 14% 44%", from: "slate gray — captions, kWh units, address meta" },
68
+ accent: { hsl: "142 55% 94%", from: "pale green hover surface — savings-row highlight" },
69
+ accentForeground: { hsl: "142 70% 22%", from: "deep green ink on pale green" },
70
+ border: { hsl: "210 16% 88%", from: "soft cool-gray hairline" },
71
+ input: { hsl: "210 16% 88%", from: "same as border" },
72
+ ring: { hsl: "142 65% 38%", from: "primary signal green — focus rings on inputs" },
73
+ destructive: { hsl: "8 72% 50%", from: "alert red — distinct from any solar accent, used for outage/fault" },
74
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on alert red" },
75
+ brand: {
76
+ "signal-green": { hsl: "142 65% 38%", from: "= primary; Sunnova install/active state" },
77
+ "signal-green-deep": { hsl: "142 70% 28%", from: "hover state for green, gradient anchor" },
78
+ "signal-green-soft": { hsl: "142 55% 94%", from: "pale green badge bg, savings-row highlight" },
79
+ "trust-blue": { hsl: "212 60% 38%", from: "SunPower trust-blue — secondary accent for warranty/badges" },
80
+ "sun-amber": { hsl: "38 92% 56%", from: "literal sun warmth — used sparingly on sunshine-icon, never CTA" },
81
+ "panel-slate": { hsl: "215 25% 22%", from: "panel-render slate — 3D card render anchor color" },
82
+ },
83
+ },
84
+
85
+ spacing: {
86
+ base: 4,
87
+ scale: [4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64, 80],
88
+ containerMax: "max-w-6xl",
89
+ containerPadding: "px-4 lg:px-8",
90
+ sectionPadding: {
91
+ hero: "pt-20 pb-12 lg:pt-28 lg:pb-20",
92
+ default: "py-14 lg:py-20",
93
+ tight: "py-10 lg:py-14",
94
+ },
95
+ },
96
+
97
+ radius: {
98
+ base: "0.625rem",
99
+ pillsAllowed: true,
100
+ },
101
+
102
+ shadows: {
103
+ style: "soft",
104
+ utilities: {
105
+ "shadow-quote":
106
+ "0 1px 2px hsl(215 30% 14% / 0.04), 0 6px 18px hsl(215 30% 14% / 0.06)",
107
+ "shadow-card":
108
+ "0 1px 2px hsl(215 30% 14% / 0.04), 0 2px 6px hsl(215 30% 14% / 0.04)",
109
+ "shadow-panel-glow":
110
+ "0 0 0 1px hsl(142 65% 38% / 0.18), 0 12px 40px hsl(142 65% 38% / 0.16)",
111
+ },
112
+ },
113
+
114
+ motion: {
115
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
116
+ durations: {
117
+ reveal: 400,
118
+ loop: 2400,
119
+ ambient: 18000,
120
+ },
121
+ keyframes: {
122
+ "fade-rise": {
123
+ css:
124
+ "from { opacity: 0; transform: translateY(10px); }\n" +
125
+ "to { opacity: 1; transform: translateY(0); }",
126
+ defaultDuration: 400,
127
+ iteration: "once",
128
+ purpose: "savings card and quote-block entrance — confident, not theatrical",
129
+ },
130
+ "counter-up": {
131
+ css:
132
+ "from { opacity: 0; transform: translateY(6px); }\n" +
133
+ "to { opacity: 1; transform: translateY(0); }",
134
+ defaultDuration: 600,
135
+ iteration: "once",
136
+ purpose: "estimated-savings dollar number rolls in once the zip is entered",
137
+ },
138
+ "sun-rays": {
139
+ css:
140
+ "0% { transform: rotate(0deg); opacity: 0.6; }\n" +
141
+ "100% { transform: rotate(360deg); opacity: 0.6; }",
142
+ defaultDuration: 18000,
143
+ iteration: "infinite",
144
+ purpose: "ambient sun-ray rotation behind the panel-render hero — slow, decorative",
145
+ },
146
+ },
147
+ respectsReducedMotion: true,
148
+ },
149
+
150
+ density: "medium",
151
+
152
+ patterns: {
153
+ button:
154
+ "Solid signal-green primary (rounded-lg, shadow-card) for the single quote/install commit. " +
155
+ "Secondary is ghost (border + foreground). Tertiary is text-link green. " +
156
+ "Hover deepens fill to signal-green-deep; no scale jump — residential trust language is steady.",
157
+ card:
158
+ "Rounded-lg, 1px --border, bg-card, shadow-card. Padding p-5 lg:p-6. " +
159
+ "Savings-calculator card uses shadow-panel-glow as the hero exception. " +
160
+ "Title display sans, dollar/kWh numbers in mono with tabular-nums.",
161
+ input:
162
+ "Full rounded-lg box, 1px --input border, bg-card. Zip-code input is mono 18px, center-aligned. " +
163
+ "Focus = 2px signal-green ring at 45% opacity. Label above in sans-medium 13px.",
164
+ cta:
165
+ "Primary signal-green button for 'Get my quote' / 'Schedule install'. " +
166
+ "Process timeline steps use signal-green-soft pills with signal-green-deep text. " +
167
+ "Customer-story rows use a small trust-blue underline on the homeowner name only.",
168
+ },
169
+
170
+ details: {
171
+ selectionBg: "hsl(var(--primary) / 0.20)",
172
+ selectionFg: "hsl(var(--foreground))",
173
+ focusRing: "2px solid hsl(var(--ring) / 0.45)",
174
+ scrollbarStyle: "thin",
175
+ },
176
+ };
@@ -0,0 +1,180 @@
1
+ # Sports League
2
+
3
+ > NBA / league-official-anchored premium sports register — deep navy canvas at
4
+
5
+ **Slug:** `sports-league` — **Surface:** web — **Density:** dense
6
+
7
+ ## Influence
8
+
9
+ Modern professional-league brand systems at their most cinematic
10
+ (league-official hero tiles at their most portrait-and-stat forward,
11
+ premium sports broadcast graphics at their most graphic and pared-back,
12
+ broadcast score-bug chrome at its most reduced). Distinct from esports
13
+ and college-sports surfaces through the PLAYER STAT CARD ANCHOR +
14
+ ARENA CHROME + LEAGUE-OFFICIAL RESTRAINT trio.
15
+
16
+
17
+ ## Signature move
18
+
19
+ Deep navy canvas at #0a0e1e — the register's non-negotiable base
20
+ (league-official cinematic ground, deeper than pure black, warmer
21
+ than cool blue). Saturated arena-red brand accent #e6202b used ONLY
22
+ for live indicators, score bugs, primary CTAs, and championship
23
+ moments. Per-palette team spotlight color rotates through the 10
24
+ palette variants (Meridian red / Arcadia navy / Summit purple /
25
+ Capital forest / Marquee gold / Lane orange / Clutch teal / Opener
26
+ crimson / Final indigo / Capstone silver). Sharp 2px corners
27
+ everywhere.
28
+
29
+ MASTHEAD — a cream 'MERIDIAN' wordmark in Archivo Black uppercase
30
+ at 22px on the left with a stylized ball-mark, a horizontal nav
31
+ (Games / Standings / Teams / Schedule / Season Pass) center, a
32
+ filled arena-red 'Watch live' button right-aligned. Shrinks after
33
+ 200px scroll.
34
+
35
+ LIVE TICKER STRIP — a full-bleed horizontal ticker below the nav
36
+ showing 6 games with team abbreviations, live/final scores, and
37
+ game clocks. Ticker cycles every 4 seconds. Live indicator pulses.
38
+ ('MER 108 · ARC 102 · Q4 2:41 LIVE' + 'SUM 94 · CAP 87 · FINAL' +
39
+ 'MAR 71 · LAN 68 · Q3 8:12 LIVE' etc.)
40
+
41
+ CINEMATIC PLAYER STAT CARD — the SIGNATURE MOVE. Full-bleed panel
42
+ with:
43
+ • BACKGROUND: team-color flood (Meridian arena red) with subtle
44
+ arena-lights texture (bespoke SVG radial spotlights, sharp
45
+ geometric — no gradient blooms).
46
+ • LEFT: bespoke SVG player silhouette in cream on navy — a
47
+ dramatic shooting-form portrait, not a stock photo, not an
48
+ emoji, not a radial-gradient blob. Illustrated in a graphic
49
+ broadcast-poster style with sharp angular geometry.
50
+ • RIGHT: massive stat number '48' in Archivo Black at 160px
51
+ counting up from 0, with 'PTS' label below in tracked mono.
52
+ Secondary stats '12 REB · 9 AST · 4 STL · 2 BLK' in a row
53
+ below in mono.
54
+ • BOTTOM RIBBON: player name 'K. MOSELY' + jersey number '#7'
55
+ + team 'MERIDIAN HOME' + game 'vs. Arcadia · Feb 24'.
56
+
57
+ STANDINGS TABLE — full-width dark table with 12 rows (all 12
58
+ fictional Meridian League teams). Columns: RANK / TEAM / W-L / PCT
59
+ / GB / STRK / LAST 10. Top 4 rows have subtle arena-red left border
60
+ (playoff spots). Bottom row has a small trending-down indicator.
61
+ Rows stagger reveal at 40ms per row.
62
+
63
+ ROSTER GRID — 12 player tiles in a dense 4-column grid, each with:
64
+ • Bespoke SVG jersey-number tile in team color
65
+ • Player name in Archivo Black uppercase
66
+ • Position + height in mono ('SF · 6'8"')
67
+ • Season stats mini bar: PTS · REB · AST
68
+ • Small status pill (Active / Day-to-day / Out)
69
+
70
+ SCHEDULE STRIP — horizontally-scrolling row of 10 upcoming game
71
+ cards, each with:
72
+ • Date + tip-off time in mono
73
+ • Home team abbreviation + logo mark (bespoke SVG)
74
+ • '@' or 'vs' in tracked mono
75
+ • Away team abbreviation + logo mark
76
+ • Arena venue + broadcast channel
77
+
78
+ FEATURED GAME RECAP — a full-width recap card with:
79
+ • Final score in Archivo Black 120px ('MER 108 · ARC 102')
80
+ • Game-flow line chart drawing via stroke-dashoffset (home vs.
81
+ away score progression over 4 quarters)
82
+ • Box-score mini-table (top 5 scorers per team, PTS/REB/AST)
83
+ • Championship-gold winner ribbon strip
84
+
85
+ SEASON PASS TIERS — 3-tier grid with:
86
+ • REGULAR SEASON PASS: all 82 regular-season games
87
+ • PLAYOFF PASS: adds playoffs (arena-red RECOMMENDED chip)
88
+ • CHAMPIONSHIP PASS: adds finals + all-access (championship-gold
89
+ chip + total-savings counter)
90
+
91
+ FOOTER — dark inverted band with 'MERIDIAN LEAGUE' wordmark at ~160px,
92
+ a 5-column utility grid, and a small broadcast-partner logo strip
93
+ (fictional 'MERIDIAN NETWORK · MRD SPORTS · WEST WIRE').
94
+
95
+ Six bespoke SVG marks (league-shield, ball-mark, jersey-number-tile,
96
+ clock-bug, court-diagram-mini, arena-lights) drop as PUNCTUATION at
97
+ specific compositional moments, never as a uniform icon row.
98
+
99
+ ## Palette
100
+
101
+ - **bg:** `#0a0e1e`
102
+ - **surface:** `#111632`
103
+ - **ink:** `#f5f2ec`
104
+ - **accent:** `#e6202b`
105
+
106
+ ## Typography
107
+
108
+ - **Display:** A bold condensed display sans at very heavy weight — Archivo Black / Neue Machina / Helvetica Now Condensed Extra Bold. Free fallback stack — "Archivo Black", "Barlow Condensed", "Helvetica Neue", "Impact", system-ui, sans-serif. Weight 800-900, uppercase for hero + score bugs, mixed case for section titles. Very tight letter-spacing (-0.03em) at hero scale. Top of scale ~160px cinematic hero stat number, 88px section titles, 32px card titles.
109
+ - **Body:** A clean neutral sans for body copy and player names — Inter / IBM Plex Sans. Free fallback stack — "Inter", "IBM Plex Sans", system-ui, sans-serif. Weight 400 for body, 500 for player names, 600 for team names. 14-15px body copy, line-height 1.55.
110
+ - **Mono:** JetBrains Mono / IBM Plex Mono for stats, jersey numbers, box scores, and game clock. Weight 400-600, 11-14px. LEGITIMATE here because sports statistics genuinely require monospaced tabular figures.
111
+ - **Scale:** 1.333 (perfect fourth stretched — dramatic hero-to-body jump)
112
+
113
+ ## Motion
114
+
115
+ Ships live in the section renderer (no external dependencies):
116
+ 1. Hero player-portrait fades in with 1000ms cubic-bezier(0.19,1,0.22,1), then the big stat number counts up 0 → target (e.g., 0 → 48) over 1600ms via requestAnimationFrame ease-out.
117
+ 2. Live scoreboard ticker — 6 games cycle through the ticker every 4 seconds, each with team abbreviations + live/final score + game clock. The 'LIVE' indicator pulses in arena red at 1.4s intervals.
118
+ 3. Standings table row reveal — 12 rows fade in with 40ms per-row stagger on IntersectionObserver visibility at 30% threshold.
119
+ 4. Roster grid stagger — 12 player tiles fade in with 60ms per-tile stagger on scroll into view.
120
+ 5. Schedule strip horizontal scroll — 10 upcoming games slide in from right with 80ms per-card stagger on scroll.
121
+ 6. Featured recap chart draws — a game-flow line chart draws via stroke-dashoffset over 1400ms cubic-bezier on visibility at 40%.
122
+ 7. Season-pass tier count-up — total-savings number counts up 0 → $340 on scroll.
123
+ 8. Section reveals — each below-fold section fades in over 700ms cubic-bezier on IntersectionObserver at 25% threshold.
124
+ 9. Nav shrink on scroll after 200px; ticker sticks to top edge after 400px scroll.
125
+ 10. prefers-reduced-motion: reduce — scoreboard ticker still cycles but without pulse; counter jumps to final; charts show at full stroke; state changes still fire.
126
+
127
+ Motion character: cinematic, broadcast-graphic, high-gloss. Custom cubic-bezier(0.19,1,0.22,1) for reveals + cubic-bezier(0.65, 0, 0.35, 1) for scoreboard transitions. Reads as a broadcast graphics package, not a marketing page.
128
+
129
+
130
+ ## Imagery
131
+
132
+ BESPOKE SVG illustrations — the reference uses cinematic player
133
+ portraits, team-color hero floods, jersey-number tiles, and court
134
+ diagrams. FPO imagery here should read as considered broadcast-
135
+ graphics (bespoke SVG player silhouettes with sharp angular
136
+ geometry, team-color flood grounds, subtle arena-lights radial
137
+ spotlights). NO stock 'cheering crowd in stadium' photography.
138
+ NO player mockups that could read as real-world attribution.
139
+ NO 3D-rendered basketball/football renders. NO radial-gradient
140
+ placeholder fills as fake photography.
141
+
142
+ ## Best for
143
+
144
+ - Professional-league broadcast and streaming surfaces
145
+ - Sports-league official brand sites and season-pass storefronts
146
+ - Sports media surfaces (recap, box-score, standings)
147
+ - Fantasy-league and sports-analytics platforms leaning cinematic
148
+ - Sports-betting platforms leaning premium and league-official
149
+ - Sports-team single-brand promo sites
150
+
151
+ ## Reject if
152
+
153
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
154
+
155
+ - Light canvas — Sports League's canvas is DEEP NAVY #0a0e1e. Light canvas inverts the league-broadcast register into a fantasy-sports light-tool register (different theme).
156
+ - Pure black canvas — #0a0e1e is deliberately WARMER and BLUER than pure black, matching league-official brand systems. Pure black kills the specific atmospheric depth.
157
+ - Serif display — the register requires BOLD CONDENSED DISPLAY SANS. Serif display collapses into editorial territory.
158
+ - Multi-color palette — the register uses NAVY + CREAM + ARENA RED single accent + per-palette team spotlight. Introducing multi-color as decoration collapses the discipline into candy slop.
159
+ - Fully-rounded pill corners — cards use 2px sharp corners. 999px pills anywhere on this register kill the league-official reading.
160
+ - Stock crowd photography — imagery MUST feel like considered SVG broadcast graphics (player silhouettes, team-color floods, jersey tiles). Stock cheering-crowd photography is the AI-tell for corporate-sports slop.
161
+ - Player names or team names lifted from real leagues — placeholder MERIDIAN LEAGUE + fictional teams (MER / ARC / SUM / CAP / MAR / LAN / CLU / OPE / FIN / CAP-2) + fictional players. Naming real-world players / teams / leagues creates trademark and right-of-publicity exposure.
162
+ - 3D-rendered ball / court renders — visuals must be flat SVG broadcast graphics. 3D renders read as e-sports esports launch.
163
+ - Emoji sports icons ⛹️ 🏀 🏆 — bespoke SVG only. Emoji is the biggest AI-tell for corporate sports slop.
164
+ - Marketing-loud copy ('the most epic season of all time', 'unleash your fandom', 'game-changing action') — the register requires broadcast-official voice. Marketing-loud copy collapses into startup slop.
165
+ - Cycling headline words or auto-advancing carousel — the LIVE motion is the SCOREBOARD TICKER + STAT-NUMBER COUNT-UP only. Auto-advancing headline sliders collapse into marketing slop.
166
+
167
+ ## Banned defaults (inherited + theme-specific)
168
+
169
+ - claude-cream (#F4F1EA + serif + #D97757) — this theme's canvas is deep navy #0a0e1e, and register requires bold condensed sans.
170
+ - void+acid
171
+ - broadsheet-on-noneditorial
172
+ - tech-bro purple gradient
173
+ - uniform-everything
174
+ - light-canvas-inversion (canvas is deep navy. Light canvas inverts into fantasy-tool register.)
175
+ - serif-display-anywhere (register requires bold condensed display sans. Serif display collapses into editorial territory.)
176
+ - multi-color-outside-team-spotlight (palette is navy + cream + arena red + per-palette team spotlight. Multi-color as decoration collapses into candy slop.)
177
+ - pill-card-corners (cards use 2px sharp corners, NOT 999px pills. 999px pills kill the league-official reading.)
178
+ - stock-crowd-photography (imagery must be bespoke SVG broadcast graphics. Stock crowd photography is the AI-tell.)
179
+ - real-player-names (placeholder MERIDIAN LEAGUE + fictional teams and players. Real player names create right-of-publicity exposure.)
180
+ - emoji-sports-icons (bespoke SVG only. Emoji is the biggest AI-tell for corporate sports slop.)
@@ -0,0 +1,15 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: sports-league
3
+ export const sportsLeagueTailwindExtend = {
4
+ colors: {
5
+ bg: "#0a0e1e",
6
+ surface: "#111632",
7
+ ink: "#f5f2ec",
8
+ accent: "#e6202b",
9
+ },
10
+ fontFamily: {
11
+ display: ["A bold condensed display sans at very heavy weight — Archivo Black / Neue Machina / Helvetica Now Condensed Extra Bold. Free fallback stack — \"Archivo Black\", \"Barlow Condensed\", \"Helvetica Neue\", \"Impact\", system-ui, sans-serif. Weight 800-900, uppercase for hero + score bugs, mixed case for section titles. Very tight letter-spacing (-0.03em) at hero scale. Top of scale ~160px cinematic hero stat number, 88px section titles, 32px card titles."],
12
+ body: ["A clean neutral sans for body copy and player names — Inter / IBM Plex Sans. Free fallback stack — \"Inter\", \"IBM Plex Sans\", system-ui, sans-serif. Weight 400 for body, 500 for player names, 600 for team names. 14-15px body copy, line-height 1.55."],
13
+ mono: ["JetBrains Mono / IBM Plex Mono for stats, jersey numbers, box scores, and game clock. Weight 400-600, 11-14px. LEGITIMATE here because sports statistics genuinely require monospaced tabular figures."],
14
+ },
15
+ };
@@ -0,0 +1,213 @@
1
+ # Sports League — Family E, Cinematic Dark (league-broadcast subregion).
2
+ #
3
+ # NBA / league-official-anchored premium sports register. Deep navy canvas
4
+ # (#0a0e1e) + high-gloss cream typography + saturated ARENA RED single accent
5
+ # (#e6202b) + optional per-palette team spotlight color. Bold condensed
6
+ # display sans + geometric mono for stats. Sharp 2px corners.
7
+ #
8
+ # Influence anchor: modern league-official brand systems at their most
9
+ # cinematic — the black/team-color hero tiles, the huge portrait + big
10
+ # stat overlay, the scoreboard-strip chrome. Placeholder league:
11
+ # "MERIDIAN LEAGUE" — a fictional pro league. Original name, original
12
+ # copy, no team names or player names lifted from any real league.
13
+ #
14
+ # Distinct from other Family E bases:
15
+ # - Vault Reel is cinema-poster reels for film festivals
16
+ # - Cinematic Dark is film-poster editorial dark
17
+ # - Performance Engineered is hypercar molten-amber
18
+ # - Signal Dark is dev-dashboard terminal green
19
+ # Sports League fills the LEAGUE-BROADCAST slot — the CINEMATIC PLAYER
20
+ # STAT CARD is the composition's signature move.
21
+ #
22
+ # Twenty-second theme via the v2 harness. Fifth Family E theme.
23
+ # Upgrade of the existing v1 archetype-fallback slug.
24
+
25
+ name: Sports League
26
+ concept: NBA / league-official-anchored premium sports register — deep navy canvas at #0a0e1e with high-gloss cream typography, saturated arena-red single accent, and a rotating per-palette team spotlight color. Bold condensed display sans (Archivo Black / Neue Machina / Helvetica Now Condensed) at monumental sizes. Full-bleed CINEMATIC PLAYER STAT CARD as the signature move — a bespoke SVG player silhouette on a team-color-flood ground with a massive overlaid stat number (48 PTS / 12 REB / 9 AST). Live scoreboard ticker updating every 4 seconds. Standings table, roster grid with bespoke jersey-number tiles, schedule strip, featured game recap with box score, and season-pass tiers.
27
+ influence: |
28
+ Modern professional-league brand systems at their most cinematic
29
+ (league-official hero tiles at their most portrait-and-stat forward,
30
+ premium sports broadcast graphics at their most graphic and pared-back,
31
+ broadcast score-bug chrome at its most reduced). Distinct from esports
32
+ and college-sports surfaces through the PLAYER STAT CARD ANCHOR +
33
+ ARENA CHROME + LEAGUE-OFFICIAL RESTRAINT trio.
34
+
35
+ family: E
36
+ base_number: 38
37
+ base_note: |
38
+ Family E Cinematic Dark, LEAGUE-BROADCAST slot. Distinct from other
39
+ Family E bases through the CINEMATIC PLAYER STAT CARD signature move
40
+ (full-bleed portrait + big stat number is the hero — not a film
41
+ still, not a hypercar close-up) + LIVE SCOREBOARD TICKER + STANDINGS
42
+ TABLE. Vault Reel is film-festival reels; Cinematic Dark is film-
43
+ poster editorial; Performance Engineered is hypercar molten-amber.
44
+ Sports League fills the league-broadcast slot. Upgrade of the
45
+ existing v1 sports-league slug from archetype-fallback.
46
+
47
+ render_url: http://localhost:5173/themes/sports-league
48
+
49
+ surface: web
50
+
51
+ typography:
52
+ display: A bold condensed display sans at very heavy weight — Archivo Black / Neue Machina / Helvetica Now Condensed Extra Bold. Free fallback stack — "Archivo Black", "Barlow Condensed", "Helvetica Neue", "Impact", system-ui, sans-serif. Weight 800-900, uppercase for hero + score bugs, mixed case for section titles. Very tight letter-spacing (-0.03em) at hero scale. Top of scale ~160px cinematic hero stat number, 88px section titles, 32px card titles.
53
+ body: A clean neutral sans for body copy and player names — Inter / IBM Plex Sans. Free fallback stack — "Inter", "IBM Plex Sans", system-ui, sans-serif. Weight 400 for body, 500 for player names, 600 for team names. 14-15px body copy, line-height 1.55.
54
+ mono: JetBrains Mono / IBM Plex Mono for stats, jersey numbers, box scores, and game clock. Weight 400-600, 11-14px. LEGITIMATE here because sports statistics genuinely require monospaced tabular figures.
55
+ scale: 1.333 (perfect fourth stretched — dramatic hero-to-body jump)
56
+ eyebrow_exception: |
57
+ Sports League LEGITIMATELY uses small-caps 0.14em-tracked 10-11px labels for LIVE GAME STATUS ('LIVE · Q4 · 2:41'), SCORE BUGS ('FINAL · OT'), STANDINGS COLUMN HEADERS ('W-L / PCT / GB / STRK'), and BOX-SCORE LABELS ('PTS / REB / AST / STL / BLK'). This is a THEME-SPECIFIC EXCEPTION — league-broadcast chrome uses these EXACTLY in this register as diegetic broadcast chrome, not decorative eyebrow slop.
58
+
59
+ palette:
60
+ bg: "#0a0e1e" # deep navy canvas — league-official base
61
+ surface: "#111632" # raised card surface — navy step
62
+ ink: "#f5f2ec" # high-gloss cream typography
63
+ accent: "#e6202b" # arena red single accent — CTAs, score bugs, live indicators
64
+ cream: "#f5f2ec" # alias for ink
65
+ darkInk: "#050813" # deepest navy for full-bleed floods
66
+ mute: "#8a90a8" # dimmed for captions + column headers
67
+ spotlight: "#d5aa50" # championship-gold accent for banner + title strip
68
+ teamHome: "#c8102e" # per-palette default team-home color (Meridian home)
69
+ teamAway: "#00538c" # per-palette default team-away color (Arcadia visitors)
70
+
71
+ density: dense
72
+
73
+ motion: |
74
+ Ships live in the section renderer (no external dependencies):
75
+ 1. Hero player-portrait fades in with 1000ms cubic-bezier(0.19,1,0.22,1), then the big stat number counts up 0 → target (e.g., 0 → 48) over 1600ms via requestAnimationFrame ease-out.
76
+ 2. Live scoreboard ticker — 6 games cycle through the ticker every 4 seconds, each with team abbreviations + live/final score + game clock. The 'LIVE' indicator pulses in arena red at 1.4s intervals.
77
+ 3. Standings table row reveal — 12 rows fade in with 40ms per-row stagger on IntersectionObserver visibility at 30% threshold.
78
+ 4. Roster grid stagger — 12 player tiles fade in with 60ms per-tile stagger on scroll into view.
79
+ 5. Schedule strip horizontal scroll — 10 upcoming games slide in from right with 80ms per-card stagger on scroll.
80
+ 6. Featured recap chart draws — a game-flow line chart draws via stroke-dashoffset over 1400ms cubic-bezier on visibility at 40%.
81
+ 7. Season-pass tier count-up — total-savings number counts up 0 → $340 on scroll.
82
+ 8. Section reveals — each below-fold section fades in over 700ms cubic-bezier on IntersectionObserver at 25% threshold.
83
+ 9. Nav shrink on scroll after 200px; ticker sticks to top edge after 400px scroll.
84
+ 10. prefers-reduced-motion: reduce — scoreboard ticker still cycles but without pulse; counter jumps to final; charts show at full stroke; state changes still fire.
85
+
86
+ Motion character: cinematic, broadcast-graphic, high-gloss. Custom cubic-bezier(0.19,1,0.22,1) for reveals + cubic-bezier(0.65, 0, 0.35, 1) for scoreboard transitions. Reads as a broadcast graphics package, not a marketing page.
87
+
88
+ signature: |
89
+ Deep navy canvas at #0a0e1e — the register's non-negotiable base
90
+ (league-official cinematic ground, deeper than pure black, warmer
91
+ than cool blue). Saturated arena-red brand accent #e6202b used ONLY
92
+ for live indicators, score bugs, primary CTAs, and championship
93
+ moments. Per-palette team spotlight color rotates through the 10
94
+ palette variants (Meridian red / Arcadia navy / Summit purple /
95
+ Capital forest / Marquee gold / Lane orange / Clutch teal / Opener
96
+ crimson / Final indigo / Capstone silver). Sharp 2px corners
97
+ everywhere.
98
+
99
+ MASTHEAD — a cream 'MERIDIAN' wordmark in Archivo Black uppercase
100
+ at 22px on the left with a stylized ball-mark, a horizontal nav
101
+ (Games / Standings / Teams / Schedule / Season Pass) center, a
102
+ filled arena-red 'Watch live' button right-aligned. Shrinks after
103
+ 200px scroll.
104
+
105
+ LIVE TICKER STRIP — a full-bleed horizontal ticker below the nav
106
+ showing 6 games with team abbreviations, live/final scores, and
107
+ game clocks. Ticker cycles every 4 seconds. Live indicator pulses.
108
+ ('MER 108 · ARC 102 · Q4 2:41 LIVE' + 'SUM 94 · CAP 87 · FINAL' +
109
+ 'MAR 71 · LAN 68 · Q3 8:12 LIVE' etc.)
110
+
111
+ CINEMATIC PLAYER STAT CARD — the SIGNATURE MOVE. Full-bleed panel
112
+ with:
113
+ • BACKGROUND: team-color flood (Meridian arena red) with subtle
114
+ arena-lights texture (bespoke SVG radial spotlights, sharp
115
+ geometric — no gradient blooms).
116
+ • LEFT: bespoke SVG player silhouette in cream on navy — a
117
+ dramatic shooting-form portrait, not a stock photo, not an
118
+ emoji, not a radial-gradient blob. Illustrated in a graphic
119
+ broadcast-poster style with sharp angular geometry.
120
+ • RIGHT: massive stat number '48' in Archivo Black at 160px
121
+ counting up from 0, with 'PTS' label below in tracked mono.
122
+ Secondary stats '12 REB · 9 AST · 4 STL · 2 BLK' in a row
123
+ below in mono.
124
+ • BOTTOM RIBBON: player name 'K. MOSELY' + jersey number '#7'
125
+ + team 'MERIDIAN HOME' + game 'vs. Arcadia · Feb 24'.
126
+
127
+ STANDINGS TABLE — full-width dark table with 12 rows (all 12
128
+ fictional Meridian League teams). Columns: RANK / TEAM / W-L / PCT
129
+ / GB / STRK / LAST 10. Top 4 rows have subtle arena-red left border
130
+ (playoff spots). Bottom row has a small trending-down indicator.
131
+ Rows stagger reveal at 40ms per row.
132
+
133
+ ROSTER GRID — 12 player tiles in a dense 4-column grid, each with:
134
+ • Bespoke SVG jersey-number tile in team color
135
+ • Player name in Archivo Black uppercase
136
+ • Position + height in mono ('SF · 6'8"')
137
+ • Season stats mini bar: PTS · REB · AST
138
+ • Small status pill (Active / Day-to-day / Out)
139
+
140
+ SCHEDULE STRIP — horizontally-scrolling row of 10 upcoming game
141
+ cards, each with:
142
+ • Date + tip-off time in mono
143
+ • Home team abbreviation + logo mark (bespoke SVG)
144
+ • '@' or 'vs' in tracked mono
145
+ • Away team abbreviation + logo mark
146
+ • Arena venue + broadcast channel
147
+
148
+ FEATURED GAME RECAP — a full-width recap card with:
149
+ • Final score in Archivo Black 120px ('MER 108 · ARC 102')
150
+ • Game-flow line chart drawing via stroke-dashoffset (home vs.
151
+ away score progression over 4 quarters)
152
+ • Box-score mini-table (top 5 scorers per team, PTS/REB/AST)
153
+ • Championship-gold winner ribbon strip
154
+
155
+ SEASON PASS TIERS — 3-tier grid with:
156
+ • REGULAR SEASON PASS: all 82 regular-season games
157
+ • PLAYOFF PASS: adds playoffs (arena-red RECOMMENDED chip)
158
+ • CHAMPIONSHIP PASS: adds finals + all-access (championship-gold
159
+ chip + total-savings counter)
160
+
161
+ FOOTER — dark inverted band with 'MERIDIAN LEAGUE' wordmark at ~160px,
162
+ a 5-column utility grid, and a small broadcast-partner logo strip
163
+ (fictional 'MERIDIAN NETWORK · MRD SPORTS · WEST WIRE').
164
+
165
+ Six bespoke SVG marks (league-shield, ball-mark, jersey-number-tile,
166
+ clock-bug, court-diagram-mini, arena-lights) drop as PUNCTUATION at
167
+ specific compositional moments, never as a uniform icon row.
168
+
169
+ imagery: |
170
+ BESPOKE SVG illustrations — the reference uses cinematic player
171
+ portraits, team-color hero floods, jersey-number tiles, and court
172
+ diagrams. FPO imagery here should read as considered broadcast-
173
+ graphics (bespoke SVG player silhouettes with sharp angular
174
+ geometry, team-color flood grounds, subtle arena-lights radial
175
+ spotlights). NO stock 'cheering crowd in stadium' photography.
176
+ NO player mockups that could read as real-world attribution.
177
+ NO 3D-rendered basketball/football renders. NO radial-gradient
178
+ placeholder fills as fake photography.
179
+
180
+ best_for:
181
+ - Professional-league broadcast and streaming surfaces
182
+ - Sports-league official brand sites and season-pass storefronts
183
+ - Sports media surfaces (recap, box-score, standings)
184
+ - Fantasy-league and sports-analytics platforms leaning cinematic
185
+ - Sports-betting platforms leaning premium and league-official
186
+ - Sports-team single-brand promo sites
187
+
188
+ avoid:
189
+ - "Light canvas — Sports League's canvas is DEEP NAVY #0a0e1e. Light canvas inverts the league-broadcast register into a fantasy-sports light-tool register (different theme)."
190
+ - "Pure black canvas — #0a0e1e is deliberately WARMER and BLUER than pure black, matching league-official brand systems. Pure black kills the specific atmospheric depth."
191
+ - "Serif display — the register requires BOLD CONDENSED DISPLAY SANS. Serif display collapses into editorial territory."
192
+ - "Multi-color palette — the register uses NAVY + CREAM + ARENA RED single accent + per-palette team spotlight. Introducing multi-color as decoration collapses the discipline into candy slop."
193
+ - "Fully-rounded pill corners — cards use 2px sharp corners. 999px pills anywhere on this register kill the league-official reading."
194
+ - "Stock crowd photography — imagery MUST feel like considered SVG broadcast graphics (player silhouettes, team-color floods, jersey tiles). Stock cheering-crowd photography is the AI-tell for corporate-sports slop."
195
+ - "Player names or team names lifted from real leagues — placeholder MERIDIAN LEAGUE + fictional teams (MER / ARC / SUM / CAP / MAR / LAN / CLU / OPE / FIN / CAP-2) + fictional players. Naming real-world players / teams / leagues creates trademark and right-of-publicity exposure."
196
+ - "3D-rendered ball / court renders — visuals must be flat SVG broadcast graphics. 3D renders read as e-sports esports launch."
197
+ - "Emoji sports icons ⛹️ 🏀 🏆 — bespoke SVG only. Emoji is the biggest AI-tell for corporate sports slop."
198
+ - "Marketing-loud copy ('the most epic season of all time', 'unleash your fandom', 'game-changing action') — the register requires broadcast-official voice. Marketing-loud copy collapses into startup slop."
199
+ - "Cycling headline words or auto-advancing carousel — the LIVE motion is the SCOREBOARD TICKER + STAT-NUMBER COUNT-UP only. Auto-advancing headline sliders collapse into marketing slop."
200
+
201
+ banned_defaults:
202
+ - "claude-cream (#F4F1EA + serif + #D97757) — this theme's canvas is deep navy #0a0e1e, and register requires bold condensed sans."
203
+ - "void+acid"
204
+ - "broadsheet-on-noneditorial"
205
+ - "tech-bro purple gradient"
206
+ - "uniform-everything"
207
+ - "light-canvas-inversion (canvas is deep navy. Light canvas inverts into fantasy-tool register.)"
208
+ - "serif-display-anywhere (register requires bold condensed display sans. Serif display collapses into editorial territory.)"
209
+ - "multi-color-outside-team-spotlight (palette is navy + cream + arena red + per-palette team spotlight. Multi-color as decoration collapses into candy slop.)"
210
+ - "pill-card-corners (cards use 2px sharp corners, NOT 999px pills. 999px pills kill the league-official reading.)"
211
+ - "stock-crowd-photography (imagery must be bespoke SVG broadcast graphics. Stock crowd photography is the AI-tell.)"
212
+ - "real-player-names (placeholder MERIDIAN LEAGUE + fictional teams and players. Real player names create right-of-publicity exposure.)"
213
+ - "emoji-sports-icons (bespoke SVG only. Emoji is the biggest AI-tell for corporate sports slop.)"
@@ -0,0 +1,32 @@
1
+ // Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
2
+
3
+ export const tokens = {
4
+ slug: "sports-league",
5
+ family: "E",
6
+ base: "38",
7
+ palette: {
8
+ "bg": "#0a0e1e",
9
+ "surface": "#111632",
10
+ "ink": "#f5f2ec",
11
+ "accent": "#e6202b",
12
+ "cream": "#f5f2ec",
13
+ "darkInk": "#050813",
14
+ "mute": "#8a90a8",
15
+ "spotlight": "#d5aa50",
16
+ "teamHome": "#c8102e",
17
+ "teamAway": "#00538c"
18
+ },
19
+ typography: {
20
+ "display": "A bold condensed display sans at very heavy weight — Archivo Black / Neue Machina / Helvetica Now Condensed Extra Bold. Free fallback stack — \"Archivo Black\", \"Barlow Condensed\", \"Helvetica Neue\", \"Impact\", system-ui, sans-serif. Weight 800-900, uppercase for hero + score bugs, mixed case for section titles. Very tight letter-spacing (-0.03em) at hero scale. Top of scale ~160px cinematic hero stat number, 88px section titles, 32px card titles.",
21
+ "body": "A clean neutral sans for body copy and player names — Inter / IBM Plex Sans. Free fallback stack — \"Inter\", \"IBM Plex Sans\", system-ui, sans-serif. Weight 400 for body, 500 for player names, 600 for team names. 14-15px body copy, line-height 1.55.",
22
+ "mono": "JetBrains Mono / IBM Plex Mono for stats, jersey numbers, box scores, and game clock. Weight 400-600, 11-14px. LEGITIMATE here because sports statistics genuinely require monospaced tabular figures.",
23
+ "scale": "1.333 (perfect fourth stretched — dramatic hero-to-body jump)",
24
+ "eyebrow_exception": "Sports League LEGITIMATELY uses small-caps 0.14em-tracked 10-11px labels for LIVE GAME STATUS ('LIVE · Q4 · 2:41'), SCORE BUGS ('FINAL · OT'), STANDINGS COLUMN HEADERS ('W-L / PCT / GB / STRK'), and BOX-SCORE LABELS ('PTS / REB / AST / STL / BLK'). This is a THEME-SPECIFIC EXCEPTION — league-broadcast chrome uses these EXACTLY in this register as diegetic broadcast chrome, not decorative eyebrow slop.\n"
25
+ },
26
+ surface: "web",
27
+ density: "dense",
28
+ motion: "Ships live in the section renderer (no external dependencies):\n1. Hero player-portrait fades in with 1000ms cubic-bezier(0.19,1,0.22,1), then the big stat number counts up 0 → target (e.g., 0 → 48) over 1600ms via requestAnimationFrame ease-out.\n2. Live scoreboard ticker — 6 games cycle through the ticker every 4 seconds, each with team abbreviations + live/final score + game clock. The 'LIVE' indicator pulses in arena red at 1.4s intervals.\n3. Standings table row reveal — 12 rows fade in with 40ms per-row stagger on IntersectionObserver visibility at 30% threshold.\n4. Roster grid stagger — 12 player tiles fade in with 60ms per-tile stagger on scroll into view.\n5. Schedule strip horizontal scroll — 10 upcoming games slide in from right with 80ms per-card stagger on scroll.\n6. Featured recap chart draws — a game-flow line chart draws via stroke-dashoffset over 1400ms cubic-bezier on visibility at 40%.\n7. Season-pass tier count-up — total-savings number counts up 0 → $340 on scroll.\n8. Section reveals — each below-fold section fades in over 700ms cubic-bezier on IntersectionObserver at 25% threshold.\n9. Nav shrink on scroll after 200px; ticker sticks to top edge after 400px scroll.\n10. prefers-reduced-motion: reduce — scoreboard ticker still cycles but without pulse; counter jumps to final; charts show at full stroke; state changes still fire.\n\nMotion character: cinematic, broadcast-graphic, high-gloss. Custom cubic-bezier(0.19,1,0.22,1) for reveals + cubic-bezier(0.65, 0, 0.35, 1) for scoreboard transitions. Reads as a broadcast graphics package, not a marketing page.\n",
29
+ signature: "Deep navy canvas at #0a0e1e — the register's non-negotiable base\n(league-official cinematic ground, deeper than pure black, warmer\nthan cool blue). Saturated arena-red brand accent #e6202b used ONLY\nfor live indicators, score bugs, primary CTAs, and championship\nmoments. Per-palette team spotlight color rotates through the 10\npalette variants (Meridian red / Arcadia navy / Summit purple /\nCapital forest / Marquee gold / Lane orange / Clutch teal / Opener\ncrimson / Final indigo / Capstone silver). Sharp 2px corners\neverywhere.\n\nMASTHEAD — a cream 'MERIDIAN' wordmark in Archivo Black uppercase\nat 22px on the left with a stylized ball-mark, a horizontal nav\n(Games / Standings / Teams / Schedule / Season Pass) center, a\nfilled arena-red 'Watch live' button right-aligned. Shrinks after\n200px scroll.\n\nLIVE TICKER STRIP — a full-bleed horizontal ticker below the nav\nshowing 6 games with team abbreviations, live/final scores, and\ngame clocks. Ticker cycles every 4 seconds. Live indicator pulses.\n('MER 108 · ARC 102 · Q4 2:41 LIVE' + 'SUM 94 · CAP 87 · FINAL' +\n 'MAR 71 · LAN 68 · Q3 8:12 LIVE' etc.)\n\nCINEMATIC PLAYER STAT CARD — the SIGNATURE MOVE. Full-bleed panel\nwith:\n • BACKGROUND: team-color flood (Meridian arena red) with subtle\n arena-lights texture (bespoke SVG radial spotlights, sharp\n geometric — no gradient blooms).\n • LEFT: bespoke SVG player silhouette in cream on navy — a\n dramatic shooting-form portrait, not a stock photo, not an\n emoji, not a radial-gradient blob. Illustrated in a graphic\n broadcast-poster style with sharp angular geometry.\n • RIGHT: massive stat number '48' in Archivo Black at 160px\n counting up from 0, with 'PTS' label below in tracked mono.\n Secondary stats '12 REB · 9 AST · 4 STL · 2 BLK' in a row\n below in mono.\n • BOTTOM RIBBON: player name 'K. MOSELY' + jersey number '#7'\n + team 'MERIDIAN HOME' + game 'vs. Arcadia · Feb 24'.\n\nSTANDINGS TABLE — full-width dark table with 12 rows (all 12\nfictional Meridian League teams). Columns: RANK / TEAM / W-L / PCT\n/ GB / STRK / LAST 10. Top 4 rows have subtle arena-red left border\n(playoff spots). Bottom row has a small trending-down indicator.\nRows stagger reveal at 40ms per row.\n\nROSTER GRID — 12 player tiles in a dense 4-column grid, each with:\n • Bespoke SVG jersey-number tile in team color\n • Player name in Archivo Black uppercase\n • Position + height in mono ('SF · 6'8\"')\n • Season stats mini bar: PTS · REB · AST\n • Small status pill (Active / Day-to-day / Out)\n\nSCHEDULE STRIP — horizontally-scrolling row of 10 upcoming game\ncards, each with:\n • Date + tip-off time in mono\n • Home team abbreviation + logo mark (bespoke SVG)\n • '@' or 'vs' in tracked mono\n • Away team abbreviation + logo mark\n • Arena venue + broadcast channel\n\nFEATURED GAME RECAP — a full-width recap card with:\n • Final score in Archivo Black 120px ('MER 108 · ARC 102')\n • Game-flow line chart drawing via stroke-dashoffset (home vs.\n away score progression over 4 quarters)\n • Box-score mini-table (top 5 scorers per team, PTS/REB/AST)\n • Championship-gold winner ribbon strip\n\nSEASON PASS TIERS — 3-tier grid with:\n • REGULAR SEASON PASS: all 82 regular-season games\n • PLAYOFF PASS: adds playoffs (arena-red RECOMMENDED chip)\n • CHAMPIONSHIP PASS: adds finals + all-access (championship-gold\n chip + total-savings counter)\n\nFOOTER — dark inverted band with 'MERIDIAN LEAGUE' wordmark at ~160px,\na 5-column utility grid, and a small broadcast-partner logo strip\n(fictional 'MERIDIAN NETWORK · MRD SPORTS · WEST WIRE').\n\nSix bespoke SVG marks (league-shield, ball-mark, jersey-number-tile,\nclock-bug, court-diagram-mini, arena-lights) drop as PUNCTUATION at\nspecific compositional moments, never as a uniform icon row.\n",
30
+ } as const;
31
+
32
+ export type Tokens = typeof tokens;