@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,91 @@
1
+ # Design Direction — Education-Warm
2
+
3
+ ## Ethos
4
+ Duolingo celebratory feedback · Khan Academy warm sun · Brilliant soft purple · Quizlet mint UI · Notion-for-Education friendly chrome
5
+
6
+ ## Feel
7
+ Friendly mascot energy without the saccharine. Rounded chrome, warm accent palette, celebratory progress moments — the green-streak ping, the confetti on completion. Built to retain a twelve-year-old's attention; engineered so a parent doesn't feel embarrassed. Saturation is high but balanced against a warm off-white paper, not a gamified neon void.
8
+
9
+ ## Reference brands
10
+ - **Duolingo** → rounded sans, saturated owl-green, celebratory streak feedback. The bottom-edge button shadow is the press-feedback signature.
11
+ - **Khan Academy** → warm yellow accent, soft blues, friendly Plus Jakarta sans display. Lesson surfaces, not dashboard chrome.
12
+ - **Brilliant** → soft purple math-illustration warmth, geometric softness. Decorative highlight, never the primary surface.
13
+ - **Quizlet** → mint and warm card stack, friendly progress UI. The quiz-correct mint moment.
14
+ - **Notion for Education** → warm gray surfaces, soft iconography, gentle chrome. Educator-facing without being institutional.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
18
+
19
+ Surface stack is **warm off-white paper** (background) → pure white (card) → deeper warm cream (muted/secondary panels). Depth comes from soft shadows and 12px rounded corners, supplemented by warm sandy borders. Color carries meaning: owl-green = celebration and primary, sky-blue = secondary and progress, sun-yellow = streak and achievement, brilliant-purple = decorative accent, mint = quiz-correct, warm-coral = try-again.
20
+
21
+ Brand tokens: `--owl-green`, `--sun-yellow`, `--sky-blue`, `--brilliant-purple`, `--mint`, `--warm-coral`, `--paper`, `--ink`. Every saturated color traces to a reference brand's signature feedback moment.
22
+
23
+ ## Typography
24
+ - **Display:** Plus Jakarta Sans (Khan Academy display). h1–h4 and lesson-card titles. Tracking `-0.02em` — Plus Jakarta wants tightening at display size. Weights 600/700/800 used liberally for friendly emphasis.
25
+ - **Body:** DM Sans (Duolingo body). Body base **16px** with **line-height 1.6** — short instructional copy, optimized for tap-target proximity.
26
+ - **Mono:** JetBrains Mono. Code lessons, math expressions, streak counters. Tabular figures mandatory for XP and score widgets.
27
+
28
+ H1 uses `clamp(2rem, 5vw, 3.5rem)` — medium scale, lesson-header weight not poster-banner. Font features: `"ss01"`, `"cv11"` (stylistic single-storey *a* — friendlier), `"tnum"` for score widgets.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-5xl px-4 lg:px-8` — 1024px max, accommodates lesson-card grids without going full-bleed. Lessons live in 2–3 column grids on desktop.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-16 pb-12 lg:pt-24 lg:pb-20`
34
+ - Default: `py-16 lg:py-24`
35
+ - Tight: `py-10 lg:py-14`
36
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80. Generous medium — lessons need breathing room.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. Pure black is forbidden — `--ink` (deep blue-warm-ink) replaces it. Pure white is allowed but only on card surfaces, never as page background.
40
+
41
+ Saturation is high and intentional. The palette commits to color — desaturating any token reads as broken. Multiple brand colors coexist on a single page because they carry different roles: green celebrates, blue progresses, yellow rewards, purple decorates, coral corrects.
42
+
43
+ ## Radius
44
+ `--radius: 0.75rem` (12px). **Distinctly rounded** — Duolingo/Khan card rounding. Pills allowed (`pillsAllowed: true`) and central to the language: tags, streak counters, level badges, filter chips all use pill radius. Square corners are disallowed everywhere except divider rules.
45
+
46
+ ## Shadows
47
+ **Soft.** Three utilities: `.card-soft` (default card lift), `.card-lift` (hover state — deeper double-shadow), `.button-press` (Duolingo bottom-edge shadow — `0 4px 0 0` in a darker shade of the button color). The button-press shadow is signature: it makes every primary CTA feel like a physical button being tapped, and pairs with the `tap-press` keyframe on click.
48
+
49
+ ## Motion
50
+ Four keyframes:
51
+ - `celebrate-bounce` (350ms) — the signature: lesson-complete badge, streak-extension toast, correct-answer ping. Scale up past 1.0, settle back. Used for all positive feedback moments.
52
+ - `progress-fill` (600ms) — XP bar fill on lesson completion. Sky-blue bar reveals left-to-right via `scaleX` transform.
53
+ - `mascot-wiggle` (2400ms, infinite) — idle mascot ambient sway. Reserved for decorative illustration only; never on functional UI.
54
+ - `tap-press` (150ms) — button tap-down feedback, pairs with `.button-press` bottom-edge shadow.
55
+
56
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — celebrate-bounce degrades to a simple opacity fade, mascot-wiggle pauses entirely.
57
+
58
+ ## Component patterns
59
+ - **Buttons:** filled, rounded (12px), with a contrasting bottom-edge shadow (`.button-press`) — the Duolingo press-feedback. Primary CTA is owl-green fill, white text, dark-green bottom edge. Pills allowed for filter chips and tags. Ghost buttons exist as secondary actions: 2px sandy border, ink text, no shadow. **Never gradient.**
60
+ - **Cards:** white fill on warm-paper bg, 12px radius, `.card-soft` shadow, no border by default. Hover lifts to `.card-lift`. Padding `p-6 lg:p-8`. Title in Plus Jakarta 700 at 1.25rem. Status indicators (streak flame, level badge) sit top-right as colored pills.
61
+ - **Inputs:** full box with 2px sandy border, 12px radius, `p-3` internal. Label sits above in DM Sans 500. Focus thickens border to owl-green and adds a 4px ring offset in green/15. Validation states use warm-coral (error) and owl-green (success) borders with matching icon.
62
+ - **CTA:** filled rounded button by default — primary in owl-green, secondary in sky-blue. Inline text links are sky-blue with no underline at rest, underline on hover. Streak and achievement CTAs may use sun-yellow fill with ink text for celebration moments.
63
+
64
+ ## Recommended rich media
65
+ This direction leans heavily on **friendly illustration** — geometric flat-color characters, simplified mascot figures, gentle gradients on illustrated backgrounds (illustration only, never on UI chrome). Think Duolingo's Duo, Khan's Khanmigo, Brilliant's math figures. Photography is rare and reserved for student testimonials and instructor portraits, color-graded warm and bright.
66
+
67
+ **AI tool recommendations:** **Recraft** for vector character illustration in flat-color geometric style — prompt for *"flat geometric character illustration, Duolingo style, soft palette, single-line weight"*. **Midjourney** with *"warm friendly classroom photography, natural light, smiling student, soft focus background"* for testimonial photos. **SVGator** for animating mascot illustrations. Avoid Midjourney's default photorealistic style for illustrations — explicitly prompt vector flat.
68
+
69
+ **Aspect ratios:** 1:1 square for mascot illustrations and lesson-card heroes. 4:3 for instructor portraits and classroom photography. 16:9 for video lessons. Never 3:2 (editorial), never 9:16 (mobile-vertical signals social).
70
+
71
+ **Video:** core to the direction. Short lesson-intro videos (≤90s) with poster image and play button. Autoplay on hover for explainer thumbnails (muted, looped). Lesson-complete celebration animations are first-class — Lottie or short MP4 of confetti, badge flips, streak flames. ≤6 MB per video, H.265 or AV1.
72
+
73
+ **Performance:** lesson-card hero illustrations ≤50 KB SVG or AVIF. Mascot animations ≤120 KB Lottie. LCP under 2.5s. If a lesson grid pushes past 1 MB total, lazy-load below the fold.
74
+
75
+ **Avoid:** corporate-stock photography (handshakes, headsets, generic-office), dark moody anything, photorealistic 3D renders of children (uncanny), gradient-heavy synthwave illustration, hand-drawn marker-style (too casual — this is education, not preschool craft). Never use mascots that look like NFT PFPs — the warmth must feel pedagogical, not collectible.
76
+
77
+ **Accessibility:** every illustration has descriptive alt-text. Mascot animations have a static fallback for `prefers-reduced-motion`. Celebration confetti must not flash more than 3 times/sec (WCAG 2.3.1). Lesson videos require captions, not just transcripts.
78
+
79
+ ## Component families
80
+ None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established.
81
+
82
+ ## Details
83
+ - **Selection:** `hsl(var(--brand-sun-yellow) / 0.4)` background — warm yellow highlighter, pencil-on-paper feel.
84
+ - **Focus ring:** `3px solid hsl(var(--ring) / 0.4)` — soft owl-green ring, visible and warm. Larger than typical because tap-targets matter on touch devices.
85
+ - **Scrollbar:** auto (browser default) — friendly, no thin-restraint move.
86
+
87
+ ## Exceptions
88
+ None yet. When an intentional one-of-one violation lands, add it here with the reason. The Director's consistency pass lists all exceptions for human review.
89
+
90
+ ## Revisions
91
+ - Initial direction, generated at install time.
@@ -0,0 +1,185 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const educationWarm: Direction = {
4
+ name: "education-warm",
5
+ ethos:
6
+ "Duolingo celebratory feedback · Khan Academy warm sun · Brilliant soft purple · Quizlet mint UI · Notion-for-Education friendly chrome",
7
+ references: [
8
+ { brand: "Duolingo", trait: "rounded sans, saturated owl-green, celebratory streak feedback" },
9
+ { brand: "Khan Academy", trait: "warm yellow accent, soft blues, friendly Plus Jakarta sans" },
10
+ { brand: "Brilliant", trait: "soft purple math-illustration warmth, geometric softness" },
11
+ { brand: "Quizlet", trait: "mint and warm card stack, friendly progress UI" },
12
+ { brand: "Notion for Education", trait: "warm gray surfaces, soft iconography, gentle chrome" },
13
+ ],
14
+ feel:
15
+ "Friendly mascot energy without the saccharine. Rounded chrome, warm accent palette, " +
16
+ "celebratory progress moments — the green-streak ping, the confetti on completion. " +
17
+ "Built to retain a twelve-year-old's attention; engineered so a parent doesn't feel embarrassed. " +
18
+ "Saturation is high but balanced against a warm off-white paper, not a gamified neon void.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Plus Jakarta Sans",
23
+ fallback: ["DM Sans", "Inter", "system-ui", "-apple-system", "sans-serif"],
24
+ from: "Khan Academy display — rounded geometric sans with friendly terminals, reads as warm-not-childish",
25
+ googleFont: "Plus+Jakarta+Sans",
26
+ weights: [400, 500, 600, 700, 800],
27
+ },
28
+ body: {
29
+ family: "DM Sans",
30
+ fallback: ["Plus Jakarta Sans", "Inter", "system-ui", "sans-serif"],
31
+ from: "Duolingo body — soft humanist sans, optimized for short instructional copy at 16px",
32
+ googleFont: "DM+Sans",
33
+ weights: [400, 500, 700],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["IBM Plex Mono", "SF Mono", "ui-monospace", "Menlo", "monospace"],
38
+ from: "code lessons, math expressions, streak counters — friendly slab-mono pairing",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400, 700],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.02em", // Plus Jakarta wants tightening at display size
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"ss01", "cv11", "tnum"', // stylistic single-storey a + tabular figures for score widgets
48
+ h1ScaleClamp: "clamp(2rem, 5vw, 3.5rem)", // medium — Duolingo lesson headers, not Wes Anderson posters
49
+ bodyBaseSize: "1rem", // 16px — instructional copy is short; readability over luxury
50
+ bodyLineHeight: "1.6",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "44 50% 97%", from: "warm off-white paper — Khan Academy lesson surface; warm tint avoids clinical-app feel" },
55
+ foreground: { hsl: "230 35% 18%", from: "deep blue-ink — Brilliant body color, warmer than pure black, retains contrast" },
56
+ card: { hsl: "0 0% 100%", from: "pure white card — sits on warm paper, friendly tier-separation" },
57
+ popover: { hsl: "0 0% 100%", from: "same as card; depth from soft shadow + rounded corners" },
58
+ primary: { hsl: "148 58% 45%", from: "= brand.owl-green — Duolingo signal green, the celebration color and main CTA" },
59
+ primaryForeground: { hsl: "0 0% 100%", from: "white on owl-green" },
60
+ secondary: { hsl: "210 90% 60%", from: "= brand.sky-blue — Khan Academy soft sky, secondary CTAs and progress fills" },
61
+ secondaryForeground: { hsl: "0 0% 100%", from: "white on sky-blue" },
62
+ muted: { hsl: "44 35% 93%", from: "warm cream — quiet panels, lesson-aside surfaces" },
63
+ mutedForeground: { hsl: "230 18% 42%", from: "warm slate — secondary text, captions, progress meta" },
64
+ accent: { hsl: "270 65% 65%", from: "= brand.brilliant-purple — accent only, used for hover and decorative highlights" },
65
+ accentForeground: { hsl: "0 0% 100%", from: "white on purple" },
66
+ border: { hsl: "44 30% 88%", from: "warm sandy border — Notion-for-Education chrome line, soft and inviting" },
67
+ input: { hsl: "44 30% 88%", from: "same as border — inputs are rounded rectangles with warm border" },
68
+ ring: { hsl: "148 58% 45%", from: "owl-green focus — matches primary, signals tap-target" },
69
+ destructive: { hsl: "8 80% 58%", from: "warm coral alert — friendlier than red, still clearly negative" },
70
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on coral" },
71
+ brand: {
72
+ "owl-green": { hsl: "148 58% 45%", from: "= primary; Duolingo signal green, celebrations and streaks" },
73
+ "sun-yellow": { hsl: "44 95% 60%", from: "Khan Academy warm yellow — streak flames, achievement coins, badge highlights" },
74
+ "sky-blue": { hsl: "210 90% 60%", from: "= secondary; Khan Academy soft sky, progress and secondary CTA" },
75
+ "brilliant-purple": { hsl: "270 65% 65%", from: "= accent; Brilliant math-illustration purple, decorative highlight" },
76
+ "mint": { hsl: "165 55% 70%", from: "Quizlet card mint — quiz-correct moments, friendly success surface" },
77
+ "warm-coral": { hsl: "8 80% 58%", from: "= destructive; warm coral, used for try-again moments without harshness" },
78
+ "paper": { hsl: "44 50% 97%", from: "= background; warm off-white paper" },
79
+ "ink": { hsl: "230 35% 18%", from: "= foreground; deep blue-ink for primary text" },
80
+ },
81
+ },
82
+
83
+ spacing: {
84
+ base: 4,
85
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80], // generous medium — lessons need breathing room
86
+ containerMax: "max-w-5xl", // 1024px — accommodates lesson-card grids without going full-bleed
87
+ containerPadding: "px-4 lg:px-8",
88
+ sectionPadding: {
89
+ hero: "pt-16 pb-12 lg:pt-24 lg:pb-20",
90
+ default: "py-16 lg:py-24",
91
+ tight: "py-10 lg:py-14",
92
+ },
93
+ },
94
+
95
+ radius: {
96
+ base: "0.75rem", // 12px — Duolingo/Khan card rounding, distinctly soft
97
+ pillsAllowed: true, // pills for tags, streak counters, level badges — core to the language
98
+ },
99
+
100
+ shadows: {
101
+ style: "soft",
102
+ utilities: {
103
+ "card-soft":
104
+ "0 1px 2px 0 hsl(230 35% 18% / 0.05), 0 4px 12px -2px hsl(230 35% 18% / 0.08)",
105
+ "card-lift":
106
+ "0 4px 8px -2px hsl(230 35% 18% / 0.08), 0 12px 24px -6px hsl(230 35% 18% / 0.12)",
107
+ "button-press":
108
+ "0 4px 0 0 hsl(148 58% 35%)", // Duolingo button bottom-edge — the press-feedback shadow
109
+ },
110
+ },
111
+
112
+ motion: {
113
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
114
+ durations: {
115
+ reveal: 350, // quick and friendly, never slow
116
+ loop: 600, // bounce cycle
117
+ ambient: 2400, // wiggle loop on idle mascot
118
+ },
119
+ keyframes: {
120
+ "celebrate-bounce": {
121
+ css:
122
+ "0% { transform: scale(0.9) translateY(8px); opacity: 0; }\n" +
123
+ "60% { transform: scale(1.08) translateY(-4px); opacity: 1; }\n" +
124
+ "100% { transform: scale(1) translateY(0); opacity: 1; }",
125
+ defaultDuration: 350,
126
+ iteration: "once",
127
+ purpose: "lesson-complete badge, streak-extension toast, correct-answer ping — the signature celebratory entrance",
128
+ },
129
+ "progress-fill": {
130
+ css:
131
+ "from { transform: scaleX(0); transform-origin: left center; }\n" +
132
+ "to { transform: scaleX(1); transform-origin: left center; }",
133
+ defaultDuration: 600,
134
+ iteration: "once",
135
+ purpose: "XP bar fill on lesson completion; sky-blue bar reveals left-to-right",
136
+ },
137
+ "mascot-wiggle": {
138
+ css:
139
+ "0%, 100% { transform: rotate(-3deg); }\n" +
140
+ "50% { transform: rotate(3deg); }",
141
+ defaultDuration: 2400,
142
+ iteration: "infinite",
143
+ purpose: "idle mascot animation — gentle ambient sway, reserved for decorative illustration only",
144
+ },
145
+ "tap-press": {
146
+ css:
147
+ "0% { transform: translateY(0); }\n" +
148
+ "50% { transform: translateY(2px); }\n" +
149
+ "100% { transform: translateY(0); }",
150
+ defaultDuration: 150,
151
+ iteration: "once",
152
+ purpose: "button tap-down feedback — pairs with .button-press bottom-edge shadow",
153
+ },
154
+ },
155
+ respectsReducedMotion: true,
156
+ },
157
+
158
+ density: "medium",
159
+
160
+ patterns: {
161
+ button:
162
+ "Filled, rounded (12px radius), with a contrasting bottom-edge shadow (.button-press) — the Duolingo press-feedback. " +
163
+ "Primary CTA is owl-green fill, white text, dark-green bottom edge. Pills allowed for filter chips and tags. " +
164
+ "Ghost buttons exist as secondary actions: 2px sandy border, ink text, no shadow. Never gradient.",
165
+ card:
166
+ "White fill on warm-paper bg, 12px radius, .card-soft shadow, no border by default. " +
167
+ "Hover lifts to .card-lift. Internal padding p-6 lg:p-8. Title in Plus Jakarta 700 at 1.25rem. " +
168
+ "Status indicators (streak flame, level badge) sit top-right as colored pills.",
169
+ input:
170
+ "Full box with 2px sandy border, 12px radius, p-3 internal. Label sits above in DM Sans 500. " +
171
+ "Focus thickens border to owl-green and adds 4px ring offset in green/15. Placeholder is mutedForeground. " +
172
+ "Validation states use warm-coral (error) and owl-green (success) borders with matching icon.",
173
+ cta:
174
+ "Filled rounded button by default — primary in owl-green, secondary in sky-blue. " +
175
+ "Inline text links are sky-blue with no underline at rest, underline on hover. " +
176
+ "Streak and achievement CTAs may use sun-yellow fill with ink text for celebration moments.",
177
+ },
178
+
179
+ details: {
180
+ selectionBg: "hsl(var(--brand-sun-yellow) / 0.4)", // warm yellow highlighter — pencil-on-paper feel
181
+ selectionFg: "hsl(var(--foreground))",
182
+ focusRing: "3px solid hsl(var(--ring) / 0.4)", // soft 3px owl-green ring — visible but warm
183
+ scrollbarStyle: "auto", // friendly default — no thin-restraint move
184
+ },
185
+ };
@@ -0,0 +1,79 @@
1
+ # Ember Poster — install guide
2
+
3
+ A warm-dark editorial theme with marker-drawn uppercase display type, three hot editorial accents (flame / chili / caramel-gold), and sharp corners throughout. Ships as a `DIRECTION.md`-ready theme with tokens, a bespoke section renderer, and live motion (hero slider, letter marquees, stateful cart transitions) built in.
4
+
5
+ ## What's in this folder
6
+
7
+ | File | What it is |
8
+ |---|---|
9
+ | `theme.yml` | Source of truth — palette, type, motion, avoid rules, banned defaults. |
10
+ | `THEME.md` | Auto-generated human-readable direction doc. Feed to `design-director` and `design-systems-engineer`. |
11
+ | `tokens.ts` | TypeScript module with palette + typography + surface tokens. |
12
+ | `tailwind.snippet.ts` | Partial `theme.extend` block. Merge into your `tailwind.config.ts`. |
13
+ | `package.json` | Peer-dependencies your host project needs. |
14
+
15
+ ## Quick install
16
+
17
+ ```bash
18
+ # in your project root
19
+ npx stylecrib apply @taste/ember-poster
20
+ ```
21
+
22
+ `stylecrib apply` copies the theme files into your `design-system/`, merges the tailwind snippet into your config, and adds the peer-deps below into your project's `package.json`. Run `npm install` after.
23
+
24
+ ## Deps you'll add to your project
25
+
26
+ - **`lenis`** (~10 kB) — smooth inertial scroll across the whole page. The theme's `useEffect` initializes Lenis on mount and cleans up on unmount. Respects `prefers-reduced-motion`.
27
+ - **`gsap`** (optional) — orchestrated scroll timelines. Only needed if you want the full "bottle stop-motion / staggered per-section reveal" behavior. Without GSAP, the theme still ships the essential motion (hero slider, marquees, cart states, IntersectionObserver reveals).
28
+
29
+ ## Fonts
30
+
31
+ - **Display face (paid):** [Peperoncino Sans](https://resistenza.com) by Resistenza. The marker-drawn signature the theme is designed against. Commercial license required (free version is personal-use only). Purchase and self-host via `@font-face`. Recommended.
32
+ - **Display face (free):** [Shrikhand](https://fonts.google.com/specimen/Shrikhand) via Google Fonts. The closest marker-adjacent free approximation — chunky slab-serif with hand-cut character. Load via:
33
+ ```html
34
+ <link href="https://fonts.googleapis.com/css2?family=Shrikhand&family=Inter+Tight:wght@400;500;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
35
+ ```
36
+ - **Body:** Inter Tight (free) — variable weight 100–900.
37
+ - **Mono:** JetBrains Mono (free) — for small tracked-caps metadata labels.
38
+
39
+ The theme's font stack:
40
+
41
+ ```css
42
+ --font-display: "Peperoncino Sans", "Shrikhand", "Bricolage Grotesque", "Anton", Impact, sans-serif;
43
+ --font-body: "Inter Tight", Inter, system-ui, -apple-system, sans-serif;
44
+ --font-mono: "JetBrains Mono", "IBM Plex Mono", monospace;
45
+ ```
46
+
47
+ Peperoncino comes first — if you've licensed it and self-hosted, it wins. Otherwise Shrikhand takes over.
48
+
49
+ ## Motion ships live (no external code)
50
+
51
+ - Hero item slider — auto-advances every 4s, click 1/2/3 to jump.
52
+ - Immediate-fold horizontal ticker — CSS keyframe, 16s per loop.
53
+ - Vertical letter marquee — CSS keyframe, 22s per loop, seamless.
54
+ - Testimonial band — full-width alternating pull-quotes with a fast horizontal marquee ticker underneath the section header.
55
+ - Stateful add-to-cart — React state, 3-phase transition (idle → adding → added).
56
+ - Subscription tier toggle — React state, updates price + visual stack reactively.
57
+ - Scroll-triggered reveal on the hero headline — IntersectionObserver + CSS transition.
58
+ - **Smooth inertial scroll** — Lenis, requires the peer-dep.
59
+ - `prefers-reduced-motion: reduce` is honored throughout — keyframes pause, transitions become instant, state changes still fire.
60
+
61
+ ## What you get after install
62
+
63
+ - Every color, type scale, and spacing rule aligned to the theme.
64
+ - One 500-line bespoke section renderer at `src/components/sections/ember-poster.tsx` that demonstrates the register end-to-end.
65
+ - Motion primitives (marquees, cart states) as inline patterns you can copy into your own components.
66
+
67
+ ## Refuse-if defaults
68
+
69
+ The theme's `theme.yml` includes an `avoid:` array. Feed it to your Design Director agent as reject conditions. In particular this theme refuses:
70
+
71
+ - `border-radius > 0` anywhere on the page.
72
+ - Rounded pill CTAs — buttons are sharp-cornered display type.
73
+ - Cool blue/teal palette — this register is WARM.
74
+ - Sans-serif humanist display like Inter Display or Söhne — display must be marker-hand.
75
+ - Title case on display type — always uppercase.
76
+ - Corporate polish — no shadow-md cards, no soft glow, no muted color-block hero.
77
+ - Center-aligned everything — composition is left-weighted and asymmetric.
78
+
79
+ See `theme.yml` for the full 11-entry avoid list plus the inherited global slop-blocklist.
@@ -0,0 +1,101 @@
1
+ # Ember Poster
2
+
3
+ > Warm-dark editorial register — cream type on espresso canvas, hot editorial accents, oversized marker-uppercase display, sharp corners, loud tongue-in-cheek voice.
4
+
5
+ **Slug:** `ember-poster` — **Surface:** web — **Density:** balanced
6
+
7
+ ## Influence
8
+
9
+ Small-batch print editorial. Awwwards-tier independent-magazine and craft-brand sites — the register that reads "hand-made premium" through type and motion instead of ornament. Also 1970s poster editorial (bold caps, negative tracking, condensed hot palettes) and hot-shop print like The Small Object.
10
+
11
+ ## Signature move
12
+
13
+ Cream Shrikhand-family display at 104px scale broken across multiple lines,
14
+ set on espresso-brown canvas, letter-spacing tightened to -0.02em. Feature
15
+ names rendered as stacked single-word lines filling one side of the
16
+ viewport, hero imagery beside. Three editorial accents map one-per-item
17
+ (flame orange, chili red, caramel gold) and carry through card, hover, and
18
+ cart state consistently. Border-radius is 0 everywhere. Hand-drawn splat +
19
+ antler + chef-hat ornaments and a red pen-slash strike-through for
20
+ negation. Inverted cream-bg bands break up the dark rhythm as callout
21
+ sections. NO mono-caps eyebrows, NO dot-metadata rows, NO corner tags —
22
+ brand character sits in the display type, not in ornamented labels.
23
+
24
+ ## Palette
25
+
26
+ - **bg:** `#100B06`
27
+ - **surface:** `#322C23`
28
+ - **ink:** `#F5E4C7`
29
+ - **accent:** `#F15726`
30
+ - **secondary:** `#BE8D3F`
31
+ - **signal:** `#DA1F27`
32
+
33
+ ## Typography
34
+
35
+ - **Display:** Anton (or Bricolage Grotesque as broader-market fallback) — 400 weight, UPPERCASE always, letter-spacing -0.02em. At scale — 104px hero, 52px section title, 37px h3. The marker-hand alternative (Peperoncino Sans by Resistenza) is the reference face but requires commercial license; Anton is the safest free approximation.
36
+ - **Body:** Inter Tight (variable 100-900) — 400/500/700, mixed-case, line-height 1.5, 16px body, up to 40px for manifesto "voice" lines that contrast with the display "shout."
37
+ - **Mono:** JetBrains Mono — narrowly scoped to code specimens only. NOT used for section eyebrows, corner tags, metadata rows, or bylines (those defaults are universal-slop-blocklist hits).
38
+ - **Scale:** 1.333 (perfect fourth — hero/display/lead/body span a wide contrast so the display shouts and the body speaks)
39
+
40
+ ## Motion
41
+
42
+ Ships live in the section renderer (no external dependencies):
43
+ 1. Hero item slider — auto-advances every 4s, click 1/2/3 to jump; FPO cover + accent-gradient backdrop transition on change.
44
+ 2. Scroll-triggered reveal on hero headline — IntersectionObserver + CSS transition (translate-up + fade, 500ms cubic-bezier).
45
+ 3. Vertical letter marquee ("SMALL BATCH SMALL BATCH...") — CSS keyframe, 22s linear infinite loop, seamless via content duplication.
46
+ 4. Testimonial rails — TWO rows, opposite directions, CSS keyframe 40s linear infinite, pause on hover via animation-play-state.
47
+ 5. Stateful add-to-cart: ADD → ADDING (600ms) → ✓ ADDED (1800ms) → back. Button background flips to cream on ADDED. Per-product + separate for the pack.
48
+ 6. Subscription tier 4-issue / 12-issue: click updates price ($60 / $160) and rebuilds the visual stack reactively.
49
+ 7. Microinteractions — CSS transitions on hover states, active-state scale(0.97) on cart buttons.
50
+ 8. prefers-reduced-motion: reduce — all keyframe animations pause, transitions become instant, state changes still fire (they're content).
51
+
52
+ Customer installs these as dependencies for the deeper motion tier:
53
+ - Lenis — smooth inertial scroll across the whole page (Awwwards-tier inertial feel).
54
+ - GSAP ScrollTrigger — orchestrated multi-element timelines (image stop-motion / spin, staggered per-section reveals).
55
+ - Custom branded preloader.
56
+
57
+ Motion character: weighty but crisp, custom cubic-bezier(0.16,1,0.3,1) easings, nothing bouncy-cute. All motion serves the "confident + hand-made" tone. See sections/ember-poster.tsx for the shipping implementation.
58
+
59
+
60
+ ## Imagery
61
+
62
+ Warm-lit editorial photography on the dark canvas with amber-tungsten
63
+ spotlight, deep shadow, high contrast, saturated. Hero and feature imagery
64
+ reads as small-batch print / small-studio quality — NO flat white product
65
+ shots, NO gradient overlays behind imagery, NO stock photography. Illustration
66
+ if used is marker-hand line-art in cream or accent color. Placeholder
67
+ compositions use clearly-labeled FPO blocks so the layout is legible
68
+ without shipping stock images.
69
+
70
+ ## Best for
71
+
72
+ - Small independent magazines and quarterlies with a loud editorial voice
73
+ - Craft goods and small-batch consumer brands (books, records, ceramics, apothecary)
74
+ - Editorial launch pages for premium consumer brands that refuse corporate gloss
75
+ - Independent zines and print-adjacent brand sites
76
+ - Any Awwwards-tier editorial or brand site that trades on personality
77
+
78
+ ## Reject if
79
+
80
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
81
+
82
+ - Border-radius greater than 0px anywhere on the page — sharp corners are core to the identity
83
+ - Rounded button chrome or pill CTAs — buttons are sharp-cornered display type
84
+ - Cool color palette — this register is WARM (espresso, cream, flame, chili, caramel), never blue/teal/violet
85
+ - Sans-serif humanist display like Inter Display or Söhne — the display face has to carry marker-hand character (Anton, Peperoncino Sans, Bricolage Grotesque)
86
+ - Title case or sentence case on display type — display is ALWAYS uppercase in this register
87
+ - Loose or default letter-spacing on display — display tracks -0.02em minimum, tighter at hero scale
88
+ - Corporate polish — no shadow-md cards, no soft glow, no muted color-block hero
89
+ - Three-tier pricing cards or feature-pillar grids — the composition refuses SaaS defaults structurally
90
+ - Center-aligned everything — composition is left-weighted and asymmetric, display type BREAKS the grid
91
+ - Cool grays for body text — body ink is cream (#F5E4C7), never #64748b slate
92
+
93
+ ## Banned defaults (inherited + theme-specific)
94
+
95
+ - claude-cream (#F4F1EA + serif + #D97757)
96
+ - void+acid (near-black bg + single bright acid-green or vermilion accent)
97
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
98
+ - tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
99
+ - uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
100
+ - warm-dark-plus-rainbow (espresso canvas paired with more than three accent colors — the register only holds with three heat hues used sparingly)
101
+ - generic-food-brand (safe rounded product cards + generic sans + soft photography — that's the corporate DTC default this register explicitly refuses)
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@taste/ember-poster",
3
+ "version": "1.0.0",
4
+ "description": "Ember Poster — a warm-dark editorial theme. Marker-drawn uppercase display on espresso canvas, three hot editorial accents, sharp corners. Ships with live motion (hero slider, marquees, stateful cart) inline. Install the peerDependencies below to enable the deeper motion tier (Lenis smooth scroll + GSAP scroll timelines).",
5
+ "keywords": ["taste", "theme", "editorial", "warm-dark", "poster", "marker-hand", "family-c"],
6
+ "author": "StyleCrib (matt@glidetalk.com)",
7
+ "license": "See ../../LICENSE",
8
+ "files": [
9
+ "theme.yml",
10
+ "THEME.md",
11
+ "tokens.ts",
12
+ "tailwind.snippet.ts",
13
+ "README.md"
14
+ ],
15
+ "peerDependencies": {
16
+ "react": ">=18.0.0",
17
+ "react-dom": ">=18.0.0",
18
+ "lenis": "^1.1.0"
19
+ },
20
+ "peerDependenciesMeta": {
21
+ "gsap": {
22
+ "optional": true
23
+ }
24
+ },
25
+ "optionalDependencies": {
26
+ "gsap": "^3.12.0"
27
+ },
28
+ "fonts": {
29
+ "displayLicensed": "Peperoncino Sans (Resistenza) — commercial license required, purchase separately at https://resistenza.com and self-host as @font-face url",
30
+ "displayFree": "Shrikhand (Google Fonts, SIL Open Font License) — the marker-adjacent free approximation. Load via <link href='https://fonts.googleapis.com/css2?family=Shrikhand&display=swap' rel='stylesheet' />",
31
+ "bodyFree": "Inter Tight (Google Fonts, SIL Open Font License)",
32
+ "monoFree": "JetBrains Mono (Apache 2.0)"
33
+ }
34
+ }
@@ -0,0 +1,17 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: ember-poster
3
+ export const emberPosterTailwindExtend = {
4
+ colors: {
5
+ bg: "#100B06",
6
+ surface: "#322C23",
7
+ ink: "#F5E4C7",
8
+ accent: "#F15726",
9
+ secondary: "#BE8D3F",
10
+ signal: "#DA1F27",
11
+ },
12
+ fontFamily: {
13
+ display: ["Anton (or Bricolage Grotesque as broader-market fallback) — 400 weight, UPPERCASE always, letter-spacing -0.02em. At scale — 104px hero, 52px section title, 37px h3. The marker-hand alternative (Peperoncino Sans by Resistenza) is the reference face but requires commercial license; Anton is the safest free approximation."],
14
+ body: ["Inter Tight (variable 100-900) — 400/500/700, mixed-case, line-height 1.5, 16px body, up to 40px for manifesto \"voice\" lines that contrast with the display \"shout.\""],
15
+ mono: ["JetBrains Mono — narrowly scoped to code specimens only. NOT used for section eyebrows, corner tags, metadata rows, or bylines (those defaults are universal-slop-blocklist hits)."],
16
+ },
17
+ };
@@ -0,0 +1,109 @@
1
+ # Ember Poster — Family C, Editorial & Print.
2
+ #
3
+ # NEW-BASE CANDIDATE for BESPOKE_THEME_SYSTEM.md. Warm-dark editorial
4
+ # register — espresso-brown canvas, cream type, three hot editorial accents
5
+ # (flame, chili, caramel-gold). Marker-drawn uppercase display + Inter Tight
6
+ # body. Sharp corners throughout. Loud, confident, small-batch voice.
7
+ #
8
+ # Authored from Matt's provided design brief (2026-07-03). Placeholder
9
+ # demonstration domain is a fictional print quarterly ("PLATE") — a
10
+ # domain-agnostic mockup that could be re-skinned to any small-batch
11
+ # consumer or editorial brand. The register expresses "hand-made premium"
12
+ # through TYPE and MOTION rather than decoration.
13
+ #
14
+ # Fifth theme via the v2 harness. First non-Family-D theme, first Family C
15
+ # theme, first NEW BASE (not one of the current 60 in the spec).
16
+
17
+ name: Ember Poster
18
+ concept: Warm-dark editorial register — cream type on espresso canvas, hot editorial accents, oversized marker-uppercase display, sharp corners, loud tongue-in-cheek voice.
19
+ influence: Small-batch print editorial. Awwwards-tier independent-magazine and craft-brand sites — the register that reads "hand-made premium" through type and motion instead of ornament. Also 1970s poster editorial (bold caps, negative tracking, condensed hot palettes) and hot-shop print like The Small Object.
20
+
21
+ family: C
22
+ render_url: http://localhost:5173/themes/ember-poster
23
+
24
+ surface: web
25
+
26
+ typography:
27
+ display: Anton (or Bricolage Grotesque as broader-market fallback) — 400 weight, UPPERCASE always, letter-spacing -0.02em. At scale — 104px hero, 52px section title, 37px h3. The marker-hand alternative (Peperoncino Sans by Resistenza) is the reference face but requires commercial license; Anton is the safest free approximation.
28
+ body: Inter Tight (variable 100-900) — 400/500/700, mixed-case, line-height 1.5, 16px body, up to 40px for manifesto "voice" lines that contrast with the display "shout."
29
+ mono: JetBrains Mono — narrowly scoped to code specimens only. NOT used for section eyebrows, corner tags, metadata rows, or bylines (those defaults are universal-slop-blocklist hits).
30
+ scale: 1.333 (perfect fourth — hero/display/lead/body span a wide contrast so the display shouts and the body speaks)
31
+
32
+ palette:
33
+ bg: "#100B06"
34
+ surface: "#322C23"
35
+ ink: "#F5E4C7"
36
+ accent: "#F15726"
37
+ secondary: "#BE8D3F"
38
+ signal: "#DA1F27"
39
+
40
+ density: balanced
41
+
42
+ motion: |
43
+ Ships live in the section renderer (no external dependencies):
44
+ 1. Hero item slider — auto-advances every 4s, click 1/2/3 to jump; FPO cover + accent-gradient backdrop transition on change.
45
+ 2. Scroll-triggered reveal on hero headline — IntersectionObserver + CSS transition (translate-up + fade, 500ms cubic-bezier).
46
+ 3. Vertical letter marquee ("SMALL BATCH SMALL BATCH...") — CSS keyframe, 22s linear infinite loop, seamless via content duplication.
47
+ 4. Testimonial rails — TWO rows, opposite directions, CSS keyframe 40s linear infinite, pause on hover via animation-play-state.
48
+ 5. Stateful add-to-cart: ADD → ADDING (600ms) → ✓ ADDED (1800ms) → back. Button background flips to cream on ADDED. Per-product + separate for the pack.
49
+ 6. Subscription tier 4-issue / 12-issue: click updates price ($60 / $160) and rebuilds the visual stack reactively.
50
+ 7. Microinteractions — CSS transitions on hover states, active-state scale(0.97) on cart buttons.
51
+ 8. prefers-reduced-motion: reduce — all keyframe animations pause, transitions become instant, state changes still fire (they're content).
52
+
53
+ Customer installs these as dependencies for the deeper motion tier:
54
+ - Lenis — smooth inertial scroll across the whole page (Awwwards-tier inertial feel).
55
+ - GSAP ScrollTrigger — orchestrated multi-element timelines (image stop-motion / spin, staggered per-section reveals).
56
+ - Custom branded preloader.
57
+
58
+ Motion character: weighty but crisp, custom cubic-bezier(0.16,1,0.3,1) easings, nothing bouncy-cute. All motion serves the "confident + hand-made" tone. See sections/ember-poster.tsx for the shipping implementation.
59
+
60
+ signature: |
61
+ Cream Shrikhand-family display at 104px scale broken across multiple lines,
62
+ set on espresso-brown canvas, letter-spacing tightened to -0.02em. Feature
63
+ names rendered as stacked single-word lines filling one side of the
64
+ viewport, hero imagery beside. Three editorial accents map one-per-item
65
+ (flame orange, chili red, caramel gold) and carry through card, hover, and
66
+ cart state consistently. Border-radius is 0 everywhere. Hand-drawn splat +
67
+ antler + chef-hat ornaments and a red pen-slash strike-through for
68
+ negation. Inverted cream-bg bands break up the dark rhythm as callout
69
+ sections. NO mono-caps eyebrows, NO dot-metadata rows, NO corner tags —
70
+ brand character sits in the display type, not in ornamented labels.
71
+
72
+ imagery: |
73
+ Warm-lit editorial photography on the dark canvas with amber-tungsten
74
+ spotlight, deep shadow, high contrast, saturated. Hero and feature imagery
75
+ reads as small-batch print / small-studio quality — NO flat white product
76
+ shots, NO gradient overlays behind imagery, NO stock photography. Illustration
77
+ if used is marker-hand line-art in cream or accent color. Placeholder
78
+ compositions use clearly-labeled FPO blocks so the layout is legible
79
+ without shipping stock images.
80
+
81
+ best_for:
82
+ - Small independent magazines and quarterlies with a loud editorial voice
83
+ - Craft goods and small-batch consumer brands (books, records, ceramics, apothecary)
84
+ - Editorial launch pages for premium consumer brands that refuse corporate gloss
85
+ - Independent zines and print-adjacent brand sites
86
+ - Any Awwwards-tier editorial or brand site that trades on personality
87
+
88
+ avoid:
89
+ - "Border-radius greater than 0px anywhere on the page — sharp corners are core to the identity"
90
+ - "Rounded button chrome or pill CTAs — buttons are sharp-cornered display type"
91
+ - "Cool color palette — this register is WARM (espresso, cream, flame, chili, caramel), never blue/teal/violet"
92
+ - "Sans-serif humanist display like Inter Display or Söhne — the display face has to carry marker-hand character (Anton, Peperoncino Sans, Bricolage Grotesque)"
93
+ - "Title case or sentence case on display type — display is ALWAYS uppercase in this register"
94
+ - "Loose or default letter-spacing on display — display tracks -0.02em minimum, tighter at hero scale"
95
+ - "Corporate polish — no shadow-md cards, no soft glow, no muted color-block hero"
96
+ - "Three-tier pricing cards or feature-pillar grids — the composition refuses SaaS defaults structurally"
97
+ - "Center-aligned everything — composition is left-weighted and asymmetric, display type BREAKS the grid"
98
+ - "Cool grays for body text — body ink is cream (#F5E4C7), never #64748b slate"
99
+
100
+ banned_defaults:
101
+ # Global blocklist from BESPOKE_THEME_SYSTEM.md
102
+ - "claude-cream (#F4F1EA + serif + #D97757)"
103
+ - "void+acid (near-black bg + single bright acid-green or vermilion accent)"
104
+ - "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
105
+ - "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
106
+ - "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
107
+ # Base-specific
108
+ - "warm-dark-plus-rainbow (espresso canvas paired with more than three accent colors — the register only holds with three heat hues used sparingly)"
109
+ - "generic-food-brand (safe rounded product cards + generic sans + soft photography — that's the corporate DTC default this register explicitly refuses)"