@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,167 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const runwayFashion: Direction = {
4
+ name: "runway-fashion",
5
+ ethos:
6
+ "Chanel high-contrast b/w · Vogue runway photography · Saint Laurent disciplined restraint · Comme des Garçons asymmetric type · Helmut Newton drama",
7
+ references: [
8
+ { brand: "Chanel", trait: "binary black-and-white, no color, oversized display serif on runway photography" },
9
+ { brand: "Vogue", trait: "issue typography, fashion plate restraint, couture-magazine cover scale" },
10
+ { brand: "Saint Laurent", trait: "disciplined minimalism, geometric, all-caps sparse-tracked wordmark" },
11
+ { brand: "Comme des Garçons", trait: "Rei Kawakubo asymmetric layouts, deliberate 'wrong' type" },
12
+ { brand: "Helmut Newton", trait: "high-drama runway photography, deep shadows, Tri-X film grain" },
13
+ ],
14
+ feel:
15
+ "Binary pure-black-on-pure-white (or inverted). Oversized Didone serif at " +
16
+ "editorial scale — the hero is the type, set Vogue-cover large in italic Playfair. " +
17
+ "A single tiny couture-red accent is permitted, used once per page. Couture severity: " +
18
+ "this direction rejects color. The opposite of soft-modern.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Playfair Display",
23
+ fallback: ["Bodoni Moda", "Didot", "Bodoni 72", "Bodoni", "Times New Roman", "serif"],
24
+ from: "Vogue/Chanel Didone-style high-contrast serif — oversized italic is the cover move",
25
+ googleFont: "Playfair+Display:wght@400;700;900",
26
+ weights: [400, 700, 900],
27
+ },
28
+ body: {
29
+ family: "Inter",
30
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "sans-serif"],
31
+ from: "Saint Laurent body restraint — clean sans so the serif is the design; never decorative",
32
+ googleFont: "Inter",
33
+ weights: [400, 500],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "Vogue issue-number metadata — 'Vol 47 / Spring', tiny, used only for masthead bookkeeping",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.02em", // Didone display at Vogue scale wants the optical tighten
46
+ bodyTracking: "0", // body is neutral so the display serif carries the page
47
+ fontFeatureSettings: '"kern", "liga", "dlig", "tnum"', // discretionary ligatures for italic Playfair
48
+ h1ScaleClamp: "clamp(4rem, 10vw, 9rem)", // Vogue-cover scale — italic Playfair as hero
49
+ bodyBaseSize: "1rem", // 16px — Saint Laurent restraint
50
+ bodyLineHeight: "1.5",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "0 0% 100%", from: "Chanel pure white — couture stock, no warmth, no paper-cream" },
55
+ foreground: { hsl: "0 0% 0%", from: "Chanel pure black — couture ink, the binary opposite of the page" },
56
+ card: { hsl: "0 0% 100%", from: "Saint Laurent surface restraint — no card differentiation; the page is the surface" },
57
+ popover: { hsl: "0 0% 100%", from: "Saint Laurent restraint — depth is forbidden, popovers sit on white" },
58
+ primary: { hsl: "0 0% 0%", from: "Chanel black IS the primary — the couture-red accent is reserved for one moment" },
59
+ primaryForeground: { hsl: "0 0% 100%", from: "Chanel pure white on black — couture inversion" },
60
+ secondary: { hsl: "0 0% 100%", from: "Saint Laurent secondary surface — no second tier; differentiate by typographic weight" },
61
+ secondaryForeground: { hsl: "0 0% 0%", from: "Chanel black, always — no gray-on-gray dilution" },
62
+ muted: { hsl: "0 0% 98%", from: "Vogue ivory — barely-off-white for layering masthead metadata blocks" },
63
+ mutedForeground: { hsl: "0 0% 40%", from: "Helmut Newton mid-tone — caption gray, instrument-feel for credit lines" },
64
+ accent: { hsl: "0 0% 98%", from: "Vogue ivory hover surface — same as muted; restraint over distinction" },
65
+ accentForeground: { hsl: "0 0% 0%", from: "Chanel black on hover" },
66
+ border: { hsl: "0 0% 0%", from: "Saint Laurent 1px black rule — couture line, never softened to gray" },
67
+ input: { hsl: "0 0% 0%", from: "Saint Laurent input rule — same as border; inputs are hairlines on the page" },
68
+ ring: { hsl: "0 0% 0%", from: "Chanel black focus ring — no accent leakage, couture severity" },
69
+ destructive: { hsl: "0 100% 45%", from: "Chanel lipstick — same single red as the couture accent; destructive shares the one color" },
70
+ destructiveForeground: { hsl: "0 0% 100%", from: "Chanel pure white on couture-red" },
71
+ brand: {
72
+ "couture-red": {
73
+ hsl: "0 100% 45%",
74
+ from: "Chanel lipstick — the SINGLE red accent, used ONCE per page maximum, never twice",
75
+ },
76
+ ivory: {
77
+ hsl: "0 0% 98%",
78
+ from: "Vogue ivory — barely-off-white for layering masthead and credit blocks",
79
+ },
80
+ noir: {
81
+ hsl: "0 0% 4%",
82
+ from: "Helmut Newton deep ink — for layered black-on-black runway photography overlays",
83
+ },
84
+ },
85
+ },
86
+
87
+ spacing: {
88
+ base: 4,
89
+ scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160], // couture-generous; low density wants more air
90
+ containerMax: "max-w-6xl", // 1152px — Vogue cover proportions
91
+ containerPadding: "px-6 lg:px-12",
92
+ sectionPadding: {
93
+ hero: "pt-32 pb-24 lg:pt-48 lg:pb-32", // oversized — cover-of-the-issue scale
94
+ default: "py-24 lg:py-32",
95
+ tight: "py-12 lg:py-16",
96
+ },
97
+ },
98
+
99
+ radius: {
100
+ base: "0", // sharp couture corners — Chanel and Saint Laurent never rounded
101
+ pillsAllowed: false, // pills are anti-couture; status uses rectangles or text
102
+ },
103
+
104
+ shadows: {
105
+ style: "none", // drops are forbidden; composition does the work
106
+ utilities: {}, // intentionally empty — no shadow utilities ship
107
+ },
108
+
109
+ motion: {
110
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
111
+ durations: {
112
+ reveal: 600, // runway-walk pacing — deliberate, never hurried
113
+ loop: 0, // no loops — the page is a printed cover
114
+ ambient: 0, // no ambient motion — couture stillness
115
+ },
116
+ keyframes: {
117
+ "runway-step": {
118
+ css:
119
+ "from { opacity: 0; }\n" +
120
+ "to { opacity: 1; }",
121
+ defaultDuration: 600,
122
+ iteration: "once",
123
+ purpose:
124
+ "deliberate runway-walk pacing — 600ms opacity-only fade between hero slides. No transform; the model walks, the page does not.",
125
+ },
126
+ "cover-flip": {
127
+ css:
128
+ "from { opacity: 0; transform: translateX(8px); }\n" +
129
+ "to { opacity: 1; transform: translateX(0); }",
130
+ defaultDuration: 300,
131
+ iteration: "once",
132
+ purpose:
133
+ "Vogue cover reveal — 300ms 8px slide for cover-of-the-issue transitions. Used sparingly; once per page maximum.",
134
+ },
135
+ },
136
+ respectsReducedMotion: true,
137
+ },
138
+
139
+ density: "low",
140
+
141
+ patterns: {
142
+ button:
143
+ "Two states, no middle ground. " +
144
+ "Primary text-link = ALL CAPS, sparse-tracked (`letter-spacing: 0.2em`), text-underline, black on white — the Saint Laurent wordmark move. " +
145
+ "Primary filled = oversized 'SHOP' rectangle in pure black with white text, ALL CAPS, sparse-tracked. " +
146
+ "The couture-red filled rectangle is reserved for the single primary action per page — never repeated. " +
147
+ "No ghost mid-state, no hover lift, no rounded corners.",
148
+ card:
149
+ "No card chrome. Editorial blocks sit directly on the page, separated by oversized whitespace. " +
150
+ "When grouping is required, a single 1px black rule above. No fill, no shadow, no rounded corners. " +
151
+ "Titles in italic Playfair Display at Vogue-cover scale; body in 16px Inter.",
152
+ input:
153
+ "1px black border, sharp corners, white background. Label above in ALL CAPS sparse-tracked mono. " +
154
+ "Focus = 1px inset black ring, no glow. Placeholder italic Playfair, lowercase — the one place italic is permitted in chrome.",
155
+ cta:
156
+ "Default CTA is the Saint Laurent ALL-CAPS sparse-tracked text-underline link. " +
157
+ "The couture-red filled rectangle is the ONE marketing moment per page — the Chanel-lipstick accent. " +
158
+ "There is no second.",
159
+ },
160
+
161
+ details: {
162
+ selectionBg: "hsl(var(--foreground))", // black selection — pure couture inversion
163
+ selectionFg: "hsl(var(--background))", // white text on black
164
+ focusRing: "1px solid hsl(var(--ring))", // 1px black, no offset, no glow
165
+ scrollbarStyle: "thin", // thin black rule — the only chrome detail allowed
166
+ },
167
+ };
@@ -0,0 +1,117 @@
1
+ # Design Direction — Saturday Morning
2
+
3
+ ## Ethos
4
+ Cartoon Network playful · Nickelodeon orange splat · Adult Swim ironic edge · Pixar warmth · Adventure Time hand-drawn whimsy
5
+
6
+ ## Feel
7
+ Bright, chunky, playful without being childish. Bold display fonts with friendly roundness, many colors used confidently, hard-offset shadow drops give a sticker-pack feel. Reads as fun-but-considered, not Comic-Sans — the cartoon sensibility filtered through an Adult Swim editor's eye.
8
+
9
+ Maximalist is the closest sibling — same many-colors confidence, same brand-token bg overrides on components — but where maximalist works in editorial sharp corners and Wes Anderson serifs, saturday-morning rounds every edge into pillow shapes and lets a chunky display sans do the talking. The shadows are the giveaway: maximalist refuses shadows, saturday-morning lives on hard 4px sticker drops.
10
+
11
+ ## Reference brands
12
+ - **Cartoon Network (1990s-2000s bumper graphics)** → chunky bold type, mismatched colors, sticker-pack composition. The bumper card between commercials, not the show itself.
13
+ - **Nickelodeon** → orange splat, slime green, oversized round shapes. The splat is the brand and the brand is the splat.
14
+ - **Adult Swim** → ironic late-night minimalism with chunky type. Deadpan title cards on a single color — the wink that keeps this direction out of the kid zone.
15
+ - **Pixar** → warm character lighting, friendly rounded forms. Not photorealism — the *warmth* of Pixar, the soft-edge geometry.
16
+ - **Adventure Time** → hand-drawn wobble, expressive shapes, flat-color whimsy. The candy-kingdom palette and the slight imperfection that makes a vector line feel hand-traced.
17
+
18
+ ## Tokens
19
+ HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
20
+
21
+ Surface stack is **bright cream** (background) → **lighter cream** (card) → **deeper cream** (muted) — the sun pouring through the kitchen window on a Saturday at 7am. Depth comes from **thick 2px `--ink` borders** and the **hard-offset sticker shadows**, never from hue shift on the cream tiers.
22
+
23
+ Brand tokens (named, never numbered): `--slime` (Nick slime green), `--sun` (Cartoon Network sun yellow, = secondary), `--sky` (Adventure Time sky blue, = accent), `--cherry` (Pixar character red, = destructive), `--grape` (Adult Swim title-card purple), `--magenta` (= primary), `--cream` (= background), `--ink` (= foreground). At least five named accent colors is the minimum — this direction is built around having many.
24
+
25
+ Primary is **hot magenta-pink** (`325 90% 55%`) — the Nickelodeon energy color, the splat saturation. Foreground is **deep purple-black** (`275 30% 15%`), never pure black; the slight hue gives the candy palette room to sit against it. Pure white and pure black are forbidden — `--cream` and `--ink` replace them.
26
+
27
+ ## Typography
28
+ - **Display:** Fredoka (chunky friendly rounded display — the cartoon-bumper feel without the Comic-Sans wobble). Lilita One covers the same territory if Fredoka is unavailable. Weights 500/700/900. h1–h4.
29
+ - **Body:** DM Sans (friendly rounded sans, soft terminals that pair with Fredoka without competing). 17px (`1.0625rem`), line-height 1.6.
30
+ - **Mono:** JetBrains Mono (rounded humanist mono with personality — reads like a credits crawl on a cartoon bumper). Captions, code, micro-labels.
31
+
32
+ H1 uses `clamp(2.75rem, 7vw, 5.5rem)` — chunky display wants size, bumper-card territory. Heading tracking `-0.01em` — Fredoka is wide and round; a hair of negative tracking tightens the chunky feel. Body tracks `0`. Font features `"ss01", "cv11"` on DM Sans.
33
+
34
+ ## Spacing
35
+ - **Container:** `max-w-5xl px-6 lg:px-10`.
36
+ - **Section padding tiers:**
37
+ - Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
38
+ - Default: `py-16 lg:py-24`
39
+ - Tight: `py-12 lg:py-16`
40
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 48 64. Medium density — decoration takes room.
41
+
42
+ ## Color
43
+ No hex anywhere in component files. Color is the medium. Components are *encouraged* to override their background with any brand token — a card may be slime-green, a callout may be sky-blue, a tag row may run sun → cherry → grape across five chips. The cream background is the canvas, not a default.
44
+
45
+ The palette is **bright and warm by default**. If you reach for a desaturated enterprise blue or a moody gray, you've left the direction. The destructive token is warm cherry-red (`350°`), not magenta-red, because alerts should still feel hand-drawn.
46
+
47
+ ## Radius
48
+ `--radius: 1.5rem` (24px). **Very rounded — pillowy soft, sticker-edge feel.** Pills are allowed (`pillsAllowed: true`) and encouraged for tags, toggles, and compact actions. Hard right angles read "developer demo" or "editorial," not Saturday morning — keep everything round.
49
+
50
+ ## Shadows
51
+ `style: "none"` — meaning no gaussian-blur drop shadows. The depth language is **hard-offset sticker shadows** instead: a flat color block, 4px down and 4px right, no blur. The peel of a vinyl sticker, the layered cel of a cartoon background.
52
+
53
+ - `.shadow-sticker` — the signature. `4px 4px 0 0 hsl(var(--foreground))`. The default for buttons and cards.
54
+ - `.shadow-sticker-lg` — hover-lifted. `6px 6px 0 0`. The sticker peels further off the page.
55
+ - `.shadow-sticker-sm` — compact. `2px 2px 0 0`. For tags, badges, inline chips.
56
+
57
+ Soft gaussian shadows are forbidden — they belong to soft-modern. The sticker shadow is non-negotiable here; it's how depth happens.
58
+
59
+ ## Motion
60
+ Three keyframes, all bouncy:
61
+ - `bounce-in` (400ms once) — entrance with overshoot. `cubic-bezier(0.34, 1.56, 0.64, 1)`. Buttons, modals, cards land with a spring — the cartoon-card pop.
62
+ - `wiggle` (600ms once) — rotate ±3deg playful nudge on hover. The Adventure Time wobble.
63
+ - `pop-color` (200ms once) — hue-rotate flash on hover for links and tags. The bumper-graphic blink.
64
+
65
+ Easing: `cubic-bezier(0.34, 1.56, 0.64, 1)` — overshoot is the language. Smooth easings without bounce are wrong for this direction. `prefers-reduced-motion` honored — `wiggle` and `bounce-in` collapse to static states, `pop-color` collapses to a flat color swap.
66
+
67
+ ## Component patterns
68
+ - **Buttons:** chunky rounded, magenta solid by default with foreground text and a hard `.shadow-sticker` drop. `rounded-3xl` baseline; pills allowed for tags and compact actions. Hover triggers `wiggle` + lifts to `.shadow-sticker-lg`. Secondary buttons swap magenta for any brand token (sun, sky, slime, grape). Fill is the norm, ghost is the exception.
69
+ - **Cards:** thick 2px `--ink` border, brand-token or card-cream background, `rounded-3xl`, `.shadow-sticker` drop. Title in Fredoka display, oversized. Padding `p-6 lg:p-10`. Hover lifts to `.shadow-sticker-lg`. Cards are stickers — they peel off the page.
70
+ - **Inputs:** full `rounded-2xl` box, 2px `--ink` border, `bg-card`. Label above in DM Sans 500. Focus shifts border to `--ring` (magenta) and adds `.shadow-sticker-sm`. No border-bottom-only treatment — every input is a labeled sticker pocket.
71
+ - **CTAs:** filled chunky button is the default — magenta primary or sun-yellow secondary, with the sticker shadow. Pills reserved for tags and toggles. Text-link CTAs use `pop-color` on hover with a thick underline. Never a flat ghost — every CTA carries weight.
72
+
73
+ ## Component families
74
+ None at install time. Patterns to expect: sticker-shadow cards, color-block tag rows, oversized chunky-display heroes, mono-label captions. The Director appends conventions here as they're established.
75
+
76
+ ## Details
77
+ - **Selection:** `hsl(var(--brand-sun) / 0.6)` background, foreground text. Sun-yellow highlights the way a kid drags a crayon across a coloring book.
78
+ - **Focus ring:** `3px solid hsl(var(--ring))` — thick magenta to match the chunky border language. A 1px ring would disappear against the decoration.
79
+ - **Scrollbar:** auto. Native scrollbars are fine; the page already carries enough decoration.
80
+
81
+ ## Recommended rich media
82
+
83
+ This direction leans on imagery — the cartoon sensibility wants illustration alongside type.
84
+
85
+ **Cover & hero imagery:**
86
+ - Flat illustrations in the Adventure Time / Cuphead-rubber-hose vocabulary — hand-drawn wobble, flat color, thick inked outline.
87
+ - Character-led photography — a single warm-lit subject (Pixar feel), placed centrally on a brand-token background.
88
+ - Expressive iconography — chunky outlined icons that feel custom-drawn, not Material/Heroicon-set.
89
+
90
+ **AI tool recommendations:**
91
+ - **Recraft** for vector flat illustrations with hand-drawn wobble. Best match for the Adventure Time / Push Pin lineage.
92
+ - **Midjourney / Flux** for character renders. Prompt scaffold: *"Cartoon Network bumper graphics, flat illustration, chunky colors, hand-drawn wobble, Adventure Time aesthetic"*. Append a single subject and a 1:1 or 4:5 aspect ratio.
93
+ - **Stable Diffusion + a custom rubber-hose LoRA** for character-led illustration with consistent style.
94
+
95
+ **Aspect ratios:**
96
+ - 1:1 square (Instagram-friendly, fits the sticker-card layout).
97
+ - 4:5 portrait (cartoon character-card framing).
98
+ - 16:9 landscape allowed for bumper-strip heroes; not the default.
99
+
100
+ **Color discipline for imagery:**
101
+ Lean into the full brand palette — every illustration uses at least 3 of the named tokens (magenta, slime, sun, sky, cherry, grape). A single-color image reads as a different direction. Backgrounds in imagery should match or contrast cream — never go dark moody.
102
+
103
+ **What to AVOID:**
104
+ - Photorealism — character-led warmth is fine, but documentary-real photography breaks the cartoon sensibility.
105
+ - Gradient meshes and soft-glow renders — that's soft-modern territory, not Saturday morning.
106
+ - Dark moody palettes — `--background` is bright cream; dark heroes break the kitchen-window-light premise.
107
+ - Comic Sans literally, or anything that drifts toward "kids' birthday clip-art" — chunky is the goal, naive is the failure mode.
108
+ - Soft gaussian drop shadows on imagery — flat sticker shadows or nothing.
109
+
110
+ **Accessibility:**
111
+ High decoration count means more `aria-hidden` on purely ornamental elements (sticker peels, wiggle hover targets that aren't focusable, decorative wobble ornaments). Alt-text must distinguish content imagery from ornament. Color contrast is preserved by `--ink` on cream and by `--ink` on every brand token; verify any custom color-on-color pairing meets WCAG AA before shipping — magenta-on-sun and slime-on-sky in particular need a contrast check.
112
+
113
+ ## Exceptions
114
+ None yet. When an intentional one-of-one violation lands, add it here with the reason.
115
+
116
+ ## Revisions
117
+ - Initial direction, generated at install time.
@@ -0,0 +1,281 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const saturdayMorning: Direction = {
4
+ name: "saturday-morning",
5
+ ethos:
6
+ "Cartoon Network playful · Nickelodeon orange splat · Adult Swim ironic edge · Pixar warmth · Adventure Time hand-drawn whimsy",
7
+ references: [
8
+ {
9
+ brand: "Cartoon Network (1990s-2000s bumper graphics)",
10
+ trait: "chunky bold type, mismatched colors, sticker-pack composition",
11
+ },
12
+ {
13
+ brand: "Nickelodeon",
14
+ trait: "orange splat, slime green, oversized round shapes",
15
+ },
16
+ {
17
+ brand: "Adult Swim",
18
+ trait: "ironic late-night minimalism with chunky type, deadpan title cards",
19
+ },
20
+ {
21
+ brand: "Pixar",
22
+ trait: "warm character lighting, friendly rounded forms",
23
+ },
24
+ {
25
+ brand: "Adventure Time",
26
+ trait: "hand-drawn wobble, expressive shapes, flat-color whimsy",
27
+ },
28
+ ],
29
+ feel:
30
+ "Bright, chunky, playful without being childish. Bold display fonts with friendly roundness, " +
31
+ "many colors used confidently, hard-offset shadow drops give a sticker-pack feel. " +
32
+ "Reads as fun-but-considered, not Comic-Sans — the cartoon sensibility filtered through " +
33
+ "an Adult Swim editor's eye.",
34
+
35
+ fonts: {
36
+ display: {
37
+ family: "Fredoka",
38
+ fallback: ["Lilita One", "Baloo 2", "Inter", "system-ui", "sans-serif"],
39
+ from:
40
+ "Fredoka — chunky friendly rounded display, the cartoon-bumper feel without the Comic-Sans wobble; " +
41
+ "Lilita One covers the same territory if Fredoka is unavailable",
42
+ googleFont: "Fredoka:wght@500;700;900",
43
+ weights: [500, 700, 900],
44
+ },
45
+ body: {
46
+ family: "DM Sans",
47
+ fallback: ["Inter", "system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
48
+ from:
49
+ "DM Sans — friendly rounded sans, soft terminals that pair with Fredoka without competing; " +
50
+ "the body voice is warm, not corporate",
51
+ googleFont: "DM+Sans:wght@400;500;700",
52
+ weights: [400, 500, 700],
53
+ },
54
+ mono: {
55
+ family: "JetBrains Mono",
56
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
57
+ from:
58
+ "JetBrains Mono — rounded humanist mono with personality; reads like a credits crawl on a cartoon bumper",
59
+ googleFont: "JetBrains+Mono",
60
+ weights: [400, 700],
61
+ },
62
+ },
63
+
64
+ typography: {
65
+ headingTracking: "-0.01em", // Fredoka is wide and round; a hair of negative tracking tightens the chunky feel
66
+ bodyTracking: "0",
67
+ fontFeatureSettings: '"ss01", "cv11"',
68
+ h1ScaleClamp: "clamp(2.75rem, 7vw, 5.5rem)", // chunky display wants size — bumper-card territory
69
+ bodyBaseSize: "1.0625rem",
70
+ bodyLineHeight: "1.6",
71
+ },
72
+
73
+ colors: {
74
+ background: {
75
+ hsl: "42 90% 92%",
76
+ from: "bright cream sun — Saturday morning light pouring through the kitchen window",
77
+ },
78
+ foreground: {
79
+ hsl: "275 30% 15%",
80
+ from:
81
+ "deep purple-black — not pure black; gives the palette room to sit against it without going gray",
82
+ },
83
+ card: {
84
+ hsl: "42 80% 96%",
85
+ from: "lighter cream — a card lifted off the cereal-box background",
86
+ },
87
+ popover: {
88
+ hsl: "42 80% 96%",
89
+ from: "same as card; depth comes from sticker shadow, not hue shift",
90
+ },
91
+ primary: {
92
+ hsl: "325 90% 55%",
93
+ from: "hot magenta-pink — the Nickelodeon energy color, the principal action",
94
+ },
95
+ primaryForeground: {
96
+ hsl: "42 80% 96%",
97
+ from: "cream on magenta — the sticker label",
98
+ },
99
+ secondary: {
100
+ hsl: "44 100% 55%",
101
+ from: "= brand.sun — Cartoon Network sun yellow, secondary action color",
102
+ },
103
+ secondaryForeground: {
104
+ hsl: "275 30% 15%",
105
+ from: "purple-black on sun yellow",
106
+ },
107
+ muted: {
108
+ hsl: "42 50% 88%",
109
+ from: "deeper cream — quiet panels inside a bright page",
110
+ },
111
+ mutedForeground: {
112
+ hsl: "275 20% 35%",
113
+ from: "purple-gray — secondary text that reads against cream and muted alike",
114
+ },
115
+ accent: {
116
+ hsl: "200 95% 60%",
117
+ from: "= brand.sky — Adventure Time sky blue, hover and selection accent",
118
+ },
119
+ accentForeground: {
120
+ hsl: "275 30% 15%",
121
+ from: "purple-black on sky blue",
122
+ },
123
+ border: {
124
+ hsl: "275 30% 15%",
125
+ from:
126
+ "= foreground; the inked outline around every cartoon shape — thick, intentional, never gray",
127
+ },
128
+ input: {
129
+ hsl: "275 30% 15%",
130
+ from: "same as border — inputs wear the inked-outline treatment",
131
+ },
132
+ ring: {
133
+ hsl: "325 90% 55%",
134
+ from: "primary magenta, focus only",
135
+ },
136
+ destructive: {
137
+ hsl: "350 85% 60%",
138
+ from:
139
+ "= brand.cherry — Pixar character red; saturated and warm, not blood-red — alerts that still feel hand-drawn",
140
+ },
141
+ destructiveForeground: {
142
+ hsl: "42 80% 96%",
143
+ from: "cream on alert",
144
+ },
145
+ brand: {
146
+ slime: {
147
+ hsl: "90 75% 55%",
148
+ from: "Nickelodeon slime green — the splat color, the late-90s game-show ooze",
149
+ },
150
+ sun: {
151
+ hsl: "44 100% 55%",
152
+ from: "Cartoon Network sun yellow — the bumper-card highlight, the Adventure Time afternoon",
153
+ },
154
+ sky: {
155
+ hsl: "200 95% 60%",
156
+ from: "Adventure Time sky blue — the flat-cel backdrop, the candy-kingdom horizon",
157
+ },
158
+ cherry: {
159
+ hsl: "350 85% 60%",
160
+ from: "Pixar character red — Mr. Incredible chest, warm and saturated, never cool magenta",
161
+ },
162
+ grape: {
163
+ hsl: "275 75% 55%",
164
+ from: "playful purple — Adult Swim title-card grape, the wink between the bright colors",
165
+ },
166
+ magenta: {
167
+ hsl: "325 90% 55%",
168
+ from: "= primary; Nickelodeon energy magenta, also the brand-mark color",
169
+ },
170
+ cream: {
171
+ hsl: "42 90% 92%",
172
+ from: "= background; the kitchen-window light, also a named token for component overrides",
173
+ },
174
+ ink: {
175
+ hsl: "275 30% 15%",
176
+ from: "= foreground; the inked outline, also semantic for borders",
177
+ },
178
+ },
179
+ },
180
+
181
+ spacing: {
182
+ base: 4,
183
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64], // medium — decoration takes room
184
+ containerMax: "max-w-5xl",
185
+ containerPadding: "px-6 lg:px-10",
186
+ sectionPadding: {
187
+ hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
188
+ default: "py-16 lg:py-24",
189
+ tight: "py-12 lg:py-16",
190
+ },
191
+ },
192
+
193
+ radius: {
194
+ base: "1.5rem", // very rounded — pillowy soft, sticker-edge feel
195
+ pillsAllowed: true,
196
+ },
197
+
198
+ shadows: {
199
+ style: "none",
200
+ utilities: {
201
+ "shadow-sticker":
202
+ "4px 4px 0 0 hsl(var(--foreground))", // hard offset, no blur — the sticker/comic peel
203
+ "shadow-sticker-lg":
204
+ "6px 6px 0 0 hsl(var(--foreground))", // hover-lifted sticker — same drop, bigger throw
205
+ "shadow-sticker-sm":
206
+ "2px 2px 0 0 hsl(var(--foreground))", // compact sticker for tags, badges, inline chips
207
+ },
208
+ },
209
+
210
+ motion: {
211
+ easing: "cubic-bezier(0.34, 1.56, 0.64, 1)", // bouncy spring — overshoot is the language
212
+ durations: {
213
+ reveal: 400, // bounce-in entrance — spring with overshoot
214
+ loop: 600, // wiggle cycle
215
+ ambient: 200, // pop-color flash on hover
216
+ },
217
+ keyframes: {
218
+ "bounce-in": {
219
+ css:
220
+ "0% { opacity: 0; transform: scale(0.6); }\n" +
221
+ "60% { opacity: 1; transform: scale(1.08); }\n" +
222
+ "100% { opacity: 1; transform: scale(1); }",
223
+ defaultDuration: 400,
224
+ iteration: "once",
225
+ purpose:
226
+ "entrance with overshoot — buttons, modals, cards land with a spring; the cartoon-card pop",
227
+ },
228
+ "wiggle": {
229
+ css:
230
+ "0%, 100% { transform: rotate(0deg); }\n" +
231
+ "25% { transform: rotate(-3deg); }\n" +
232
+ "75% { transform: rotate(3deg); }",
233
+ defaultDuration: 600,
234
+ iteration: "once",
235
+ purpose:
236
+ "playful nudge on hover — buttons wiggle when the cursor lands; the Adventure Time wobble",
237
+ },
238
+ "pop-color": {
239
+ css:
240
+ "0% { filter: hue-rotate(0deg); }\n" +
241
+ "50% { filter: hue-rotate(20deg) saturate(1.15); }\n" +
242
+ "100% { filter: hue-rotate(0deg); }",
243
+ defaultDuration: 200,
244
+ iteration: "once",
245
+ purpose:
246
+ "color flash on hover — links and tags pulse a hue-shift; the bumper-graphic blink",
247
+ },
248
+ },
249
+ respectsReducedMotion: true,
250
+ },
251
+
252
+ density: "medium",
253
+
254
+ patterns: {
255
+ button:
256
+ "Chunky rounded, magenta solid by default with foreground text and a hard `.shadow-sticker` drop. " +
257
+ "Rounded-3xl baseline (matches `--radius: 1.5rem`); pills allowed for tags and compact actions. " +
258
+ "Hover: `wiggle` keyframe + lift to `.shadow-sticker-lg`. " +
259
+ "Secondary buttons swap the magenta for any brand token (sun, sky, slime, grape) — fill is the norm, " +
260
+ "ghost is the exception.",
261
+ card:
262
+ "Thick 2px `--ink` border, brand-token or card-cream background, `rounded-3xl`, " +
263
+ "`.shadow-sticker` drop. Title in Fredoka display, oversized. Padding `p-6 lg:p-10`. " +
264
+ "Hover lifts to `.shadow-sticker-lg`. Cards are stickers — they peel off the page.",
265
+ input:
266
+ "Full `rounded-2xl` box, 2px `--ink` border, `bg-card`. Label above in DM Sans 500. " +
267
+ "Focus shifts border to `--ring` (magenta) and adds `.shadow-sticker-sm`. " +
268
+ "No border-bottom-only treatment — every input is a labeled sticker pocket.",
269
+ cta:
270
+ "Filled chunky button is the default — magenta primary or sun-yellow secondary, with the sticker shadow. " +
271
+ "Pills reserved for tags and toggles. Text-link CTAs use `pop-color` on hover with a thick underline. " +
272
+ "Never a flat ghost — every CTA carries weight.",
273
+ },
274
+
275
+ details: {
276
+ selectionBg: "hsl(var(--brand-sun) / 0.6)",
277
+ selectionFg: "hsl(var(--foreground))",
278
+ focusRing: "3px solid hsl(var(--ring))",
279
+ scrollbarStyle: "auto",
280
+ },
281
+ };