@stylecrib/cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -9
- package/agents/MANIFEST.yml +136 -0
- package/agents/README.md +75 -0
- package/agents/art-director.md +168 -0
- package/agents/audacity-director.md +109 -0
- package/agents/brand-identity.md +179 -0
- package/agents/brand-precedent.md +119 -0
- package/agents/brief-enforcer.md +136 -0
- package/agents/component-qa.md +167 -0
- package/agents/cto.md +49 -0
- package/agents/design-director.md +184 -0
- package/agents/design-systems-engineer.md +162 -0
- package/agents/direction-curator.md +133 -0
- package/agents/homogeneity-detector.md +104 -0
- package/agents/logo-designer.md +240 -0
- package/agents/marketing-designer.md +156 -0
- package/agents/media-curator.md +165 -0
- package/agents/motion-engineer.md +270 -0
- package/agents/qa-conductor.md +143 -0
- package/agents/render-qa.md +133 -0
- package/agents/upgrade-simulator.md +123 -0
- package/agents/vp-architecture.md +49 -0
- package/agents/vp-engineering.md +49 -0
- package/dist/index.js +1577 -463
- package/package.json +11 -4
- package/themes/README.md +70 -0
- package/themes/acrylic-soft/THEME.md +142 -0
- package/themes/acrylic-soft/tokens.ts +180 -0
- package/themes/agency-creative/THEME.md +91 -0
- package/themes/agency-creative/tokens.ts +202 -0
- package/themes/agency-portfolio/THEME.md +109 -0
- package/themes/agency-portfolio/tokens.ts +159 -0
- package/themes/ai-startup/THEME.md +95 -0
- package/themes/ai-startup/tokens.ts +162 -0
- package/themes/airline-modern/THEME.md +104 -0
- package/themes/airline-modern/tokens.ts +179 -0
- package/themes/arc-stack/.anchor-render.png +0 -0
- package/themes/arc-stack/THEME.md +125 -0
- package/themes/arc-stack/audit.log.jsonl +6 -0
- package/themes/arc-stack/dismissals.jsonl +3 -0
- package/themes/arc-stack/tailwind.snippet.ts +17 -0
- package/themes/arc-stack/theme.yml +153 -0
- package/themes/arc-stack/tokens.ts +29 -0
- package/themes/architectural/THEME.md +102 -0
- package/themes/architectural/tokens.ts +159 -0
- package/themes/atelier-radiance/THEME.md +93 -0
- package/themes/atelier-radiance/audit.log.jsonl +1 -0
- package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
- package/themes/atelier-radiance/theme.yml +130 -0
- package/themes/atelier-radiance/tokens.ts +29 -0
- package/themes/automotive-ev/THEME.md +87 -0
- package/themes/automotive-ev/tokens.ts +183 -0
- package/themes/automotive-luxury/THEME.md +88 -0
- package/themes/automotive-luxury/tokens.ts +175 -0
- package/themes/baby-modern/THEME.md +79 -0
- package/themes/baby-modern/tokens.ts +184 -0
- package/themes/banking-gravity/THEME.md +171 -0
- package/themes/banking-gravity/tokens.ts +169 -0
- package/themes/beauty-clean/THEME.md +92 -0
- package/themes/beauty-clean/tokens.ts +176 -0
- package/themes/beauty-luxury/THEME.md +96 -0
- package/themes/beauty-luxury/tokens.ts +178 -0
- package/themes/bento-modular/.anchor-render.png +0 -0
- package/themes/bento-modular/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -0
- package/themes/bento-modular/audit.log.jsonl +3 -0
- package/themes/bento-modular/dismissals.jsonl +1 -0
- package/themes/bento-modular/tailwind.snippet.ts +17 -0
- package/themes/bento-modular/theme.yml +83 -0
- package/themes/bento-modular/tokens.ts +27 -0
- package/themes/bookstore-indie/THEME.md +78 -0
- package/themes/bookstore-indie/tokens.ts +147 -0
- package/themes/brutalist/THEME.md +96 -0
- package/themes/brutalist/tokens.ts +151 -0
- package/themes/business-tiles/THEME.md +141 -0
- package/themes/business-tiles/tokens.ts +178 -0
- package/themes/cabana-poster/THEME.md +158 -0
- package/themes/cabana-poster/audit.log.jsonl +1 -0
- package/themes/cabana-poster/tailwind.snippet.ts +16 -0
- package/themes/cabana-poster/theme.yml +221 -0
- package/themes/cabana-poster/tokens.ts +34 -0
- package/themes/case-panel/THEME.md +126 -0
- package/themes/case-panel/audit.log.jsonl +2 -0
- package/themes/case-panel/tailwind.snippet.ts +15 -0
- package/themes/case-panel/theme.yml +153 -0
- package/themes/case-panel/tokens.ts +28 -0
- package/themes/cinematic-dark/THEME.md +97 -0
- package/themes/cinematic-dark/tokens.ts +195 -0
- package/themes/classic-car/THEME.md +86 -0
- package/themes/classic-car/tokens.ts +173 -0
- package/themes/cloud-friendly/THEME.md +152 -0
- package/themes/cloud-friendly/tokens.ts +181 -0
- package/themes/community-niche/THEME.md +102 -0
- package/themes/community-niche/tokens.ts +177 -0
- package/themes/corporate-grid/THEME.md +154 -0
- package/themes/corporate-grid/tokens.ts +182 -0
- package/themes/couture-luxury/THEME.md +85 -0
- package/themes/couture-luxury/tokens.ts +146 -0
- package/themes/creator-social/THEME.md +131 -0
- package/themes/creator-social/tokens.ts +249 -0
- package/themes/crypto-onchain/THEME.md +100 -0
- package/themes/crypto-onchain/tokens.ts +207 -0
- package/themes/cycling-brand/THEME.md +78 -0
- package/themes/cycling-brand/tokens.ts +185 -0
- package/themes/dating-friendly/THEME.md +102 -0
- package/themes/dating-friendly/tokens.ts +178 -0
- package/themes/dense-utility/THEME.md +85 -0
- package/themes/dense-utility/tokens.ts +155 -0
- package/themes/devtool-cli/THEME.md +100 -0
- package/themes/devtool-cli/tokens.ts +195 -0
- package/themes/devtool-docs/THEME.md +105 -0
- package/themes/devtool-docs/tokens.ts +177 -0
- package/themes/editorial/THEME.md +129 -0
- package/themes/editorial/audit.log.jsonl +2 -0
- package/themes/editorial/tailwind.snippet.ts +15 -0
- package/themes/editorial/theme.yml +173 -0
- package/themes/editorial/tokens.ts +29 -0
- package/themes/education-formal/THEME.md +154 -0
- package/themes/education-formal/audit.log.jsonl +1 -0
- package/themes/education-formal/tailwind.snippet.ts +15 -0
- package/themes/education-formal/theme.yml +186 -0
- package/themes/education-formal/tokens.ts +29 -0
- package/themes/education-warm/THEME.md +91 -0
- package/themes/education-warm/tokens.ts +185 -0
- package/themes/ember-poster/README.md +79 -0
- package/themes/ember-poster/THEME.md +101 -0
- package/themes/ember-poster/audit.log.jsonl +17 -0
- package/themes/ember-poster/package.json +34 -0
- package/themes/ember-poster/tailwind.snippet.ts +17 -0
- package/themes/ember-poster/theme.yml +109 -0
- package/themes/ember-poster/tokens.ts +27 -0
- package/themes/enterprise-cloud/THEME.md +139 -0
- package/themes/enterprise-cloud/tokens.ts +179 -0
- package/themes/enterprise-tech/.anchor-render.png +0 -0
- package/themes/enterprise-tech/THEME.md +167 -0
- package/themes/enterprise-tech/audit.log.jsonl +1 -0
- package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
- package/themes/enterprise-tech/theme.yml +202 -0
- package/themes/enterprise-tech/tokens.ts +29 -0
- package/themes/ev-charging/THEME.md +94 -0
- package/themes/ev-charging/tokens.ts +185 -0
- package/themes/farm-direct/THEME.md +92 -0
- package/themes/farm-direct/tokens.ts +180 -0
- package/themes/fintech-card/THEME.md +96 -0
- package/themes/fintech-card/tokens.ts +191 -0
- package/themes/fintech-trust/THEME.md +94 -0
- package/themes/fintech-trust/tokens.ts +192 -0
- package/themes/food-blog/THEME.md +98 -0
- package/themes/food-blog/tokens.ts +183 -0
- package/themes/forum-classic/THEME.md +100 -0
- package/themes/forum-classic/tokens.ts +168 -0
- package/themes/fresh-plate/.anchor-render.png +0 -0
- package/themes/fresh-plate/THEME.md +144 -0
- package/themes/fresh-plate/audit.log.jsonl +2 -0
- package/themes/fresh-plate/dismissals.jsonl +3 -0
- package/themes/fresh-plate/tailwind.snippet.ts +16 -0
- package/themes/fresh-plate/theme.yml +189 -0
- package/themes/fresh-plate/tokens.ts +30 -0
- package/themes/furniture-modern/THEME.md +94 -0
- package/themes/furniture-modern/tokens.ts +176 -0
- package/themes/gaming-esports/THEME.md +146 -0
- package/themes/gaming-esports/tokens.ts +199 -0
- package/themes/gaming-streamer/THEME.md +139 -0
- package/themes/gaming-streamer/tokens.ts +201 -0
- package/themes/glassmorphic-modern/THEME.md +119 -0
- package/themes/glassmorphic-modern/tokens.ts +174 -0
- package/themes/government-civic/THEME.md +138 -0
- package/themes/government-civic/tokens.ts +164 -0
- package/themes/gym-chain/THEME.md +79 -0
- package/themes/gym-chain/tokens.ts +196 -0
- package/themes/healthcare-bright/THEME.md +95 -0
- package/themes/healthcare-bright/tokens.ts +184 -0
- package/themes/home-decor/THEME.md +94 -0
- package/themes/home-decor/tokens.ts +177 -0
- package/themes/hotel-boutique/THEME.md +110 -0
- package/themes/hotel-boutique/tokens.ts +179 -0
- package/themes/hyperminimal-mono/THEME.md +91 -0
- package/themes/hyperminimal-mono/tokens.ts +150 -0
- package/themes/indie-art-game/THEME.md +107 -0
- package/themes/indie-art-game/tokens.ts +216 -0
- package/themes/insurance-legacy/THEME.md +101 -0
- package/themes/insurance-legacy/tokens.ts +182 -0
- package/themes/insurance-modern/THEME.md +103 -0
- package/themes/insurance-modern/tokens.ts +192 -0
- package/themes/kaiju-reveal/THEME.md +97 -0
- package/themes/kaiju-reveal/tokens.ts +185 -0
- package/themes/kinetic-data/THEME.md +172 -0
- package/themes/kinetic-data/audit.log.jsonl +1 -0
- package/themes/kinetic-data/tailwind.snippet.ts +16 -0
- package/themes/kinetic-data/theme.yml +207 -0
- package/themes/kinetic-data/tokens.ts +30 -0
- package/themes/kinetic-headline/.anchor-render.png +0 -0
- package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -0
- package/themes/kinetic-headline/audit.log.jsonl +4 -0
- package/themes/kinetic-headline/dismissals.jsonl +1 -0
- package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
- package/themes/kinetic-headline/theme.yml +81 -0
- package/themes/kinetic-headline/tokens.ts +26 -0
- package/themes/law-firm/THEME.md +108 -0
- package/themes/law-firm/tokens.ts +158 -0
- package/themes/lawtech-modern/THEME.md +107 -0
- package/themes/lawtech-modern/tokens.ts +192 -0
- package/themes/linkedin-pro/THEME.md +102 -0
- package/themes/linkedin-pro/tokens.ts +174 -0
- package/themes/logistics-modern/THEME.md +94 -0
- package/themes/logistics-modern/tokens.ts +187 -0
- package/themes/magazine-glossy/THEME.md +74 -0
- package/themes/magazine-glossy/tokens.ts +158 -0
- package/themes/marker-mag/THEME.md +128 -0
- package/themes/marker-mag/audit.log.jsonl +1 -0
- package/themes/marker-mag/tailwind.snippet.ts +15 -0
- package/themes/marker-mag/theme.yml +159 -0
- package/themes/marker-mag/tokens.ts +27 -0
- package/themes/marketplace-modern/THEME.md +135 -0
- package/themes/marketplace-modern/tokens.ts +186 -0
- package/themes/marketplace-vintage/THEME.md +110 -0
- package/themes/marketplace-vintage/tokens.ts +185 -0
- package/themes/maximalist/THEME.md +96 -0
- package/themes/maximalist/tokens.ts +168 -0
- package/themes/mid-century/THEME.md +109 -0
- package/themes/mid-century/tokens.ts +162 -0
- package/themes/motorcycle-brand/THEME.md +86 -0
- package/themes/motorcycle-brand/tokens.ts +174 -0
- package/themes/museum/THEME.md +83 -0
- package/themes/museum/tokens.ts +147 -0
- package/themes/music-streaming/THEME.md +101 -0
- package/themes/music-streaming/tokens.ts +187 -0
- package/themes/music-vinyl/THEME.md +98 -0
- package/themes/music-vinyl/tokens.ts +167 -0
- package/themes/nature-distilled/.anchor-render.png +0 -0
- package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -0
- package/themes/nature-distilled/audit.log.jsonl +2 -0
- package/themes/nature-distilled/tailwind.snippet.ts +16 -0
- package/themes/nature-distilled/theme.yml +91 -0
- package/themes/nature-distilled/tokens.ts +26 -0
- package/themes/news-tabloid/THEME.md +72 -0
- package/themes/news-tabloid/tokens.ts +158 -0
- package/themes/news-tech/THEME.md +75 -0
- package/themes/news-tech/tokens.ts +149 -0
- package/themes/newsletter/THEME.md +82 -0
- package/themes/newsletter/tokens.ts +138 -0
- package/themes/newspaper-classic/THEME.md +74 -0
- package/themes/newspaper-classic/tokens.ts +159 -0
- package/themes/nonprofit-arts/THEME.md +78 -0
- package/themes/nonprofit-arts/tokens.ts +157 -0
- package/themes/nonprofit-warm/THEME.md +105 -0
- package/themes/nonprofit-warm/tokens.ts +188 -0
- package/themes/outdoor-adventure/THEME.md +113 -0
- package/themes/outdoor-adventure/tokens.ts +181 -0
- package/themes/overland-broadside/THEME.md +119 -0
- package/themes/overland-broadside/audit.log.jsonl +1 -0
- package/themes/overland-broadside/tailwind.snippet.ts +17 -0
- package/themes/overland-broadside/theme.yml +138 -0
- package/themes/overland-broadside/tokens.ts +27 -0
- package/themes/performance-engineered/THEME.md +162 -0
- package/themes/performance-engineered/audit.log.jsonl +1 -0
- package/themes/performance-engineered/tailwind.snippet.ts +15 -0
- package/themes/performance-engineered/theme.yml +193 -0
- package/themes/performance-engineered/tokens.ts +29 -0
- package/themes/pet-food/THEME.md +78 -0
- package/themes/pet-food/tokens.ts +185 -0
- package/themes/pharma-clinical/THEME.md +164 -0
- package/themes/pharma-clinical/audit.log.jsonl +1 -0
- package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
- package/themes/pharma-clinical/theme.yml +201 -0
- package/themes/pharma-clinical/tokens.ts +29 -0
- package/themes/pill-editorial/THEME.md +125 -0
- package/themes/pill-editorial/audit.log.jsonl +1 -0
- package/themes/pill-editorial/tailwind.snippet.ts +15 -0
- package/themes/pill-editorial/theme.yml +168 -0
- package/themes/pill-editorial/tokens.ts +31 -0
- package/themes/podcast-warm/THEME.md +103 -0
- package/themes/podcast-warm/tokens.ts +192 -0
- package/themes/publisher-indie/THEME.md +78 -0
- package/themes/publisher-indie/tokens.ts +148 -0
- package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
- package/themes/raw-concrete/THEME.md +76 -0
- package/themes/raw-concrete/audit.log.jsonl +10 -0
- package/themes/raw-concrete/tailwind.snippet.ts +16 -0
- package/themes/raw-concrete/theme.yml +88 -0
- package/themes/raw-concrete/tokens.ts +27 -0
- package/themes/realestate-luxury/THEME.md +94 -0
- package/themes/realestate-luxury/tokens.ts +169 -0
- package/themes/realestate-marketplace/THEME.md +106 -0
- package/themes/realestate-marketplace/tokens.ts +183 -0
- package/themes/restaurant-modern/THEME.md +109 -0
- package/themes/restaurant-modern/tokens.ts +172 -0
- package/themes/runway-fashion/THEME.md +99 -0
- package/themes/runway-fashion/tokens.ts +167 -0
- package/themes/saturday-morning/THEME.md +117 -0
- package/themes/saturday-morning/tokens.ts +281 -0
- package/themes/schema.ts +235 -0
- package/themes/signal-dark/BUILD_BRIEF.md +168 -0
- package/themes/signal-dark/THEME.md +107 -0
- package/themes/signal-dark/tokens.ts +181 -0
- package/themes/soft-modern/THEME.md +91 -0
- package/themes/soft-modern/tokens.ts +166 -0
- package/themes/solar-residential/THEME.md +92 -0
- package/themes/solar-residential/tokens.ts +176 -0
- package/themes/sports-league/THEME.md +180 -0
- package/themes/sports-league/audit.log.jsonl +1 -0
- package/themes/sports-league/tailwind.snippet.ts +15 -0
- package/themes/sports-league/theme.yml +213 -0
- package/themes/sports-league/tokens.ts +32 -0
- package/themes/stadium-sport/THEME.md +114 -0
- package/themes/stadium-sport/tokens.ts +187 -0
- package/themes/streetwear-hype/THEME.md +100 -0
- package/themes/streetwear-hype/tokens.ts +174 -0
- package/themes/studio-architect/THEME.md +108 -0
- package/themes/studio-architect/tokens.ts +162 -0
- package/themes/studio-photographer/THEME.md +88 -0
- package/themes/studio-photographer/tokens.ts +164 -0
- package/themes/team-kanban/.anchor-render.png +0 -0
- package/themes/team-kanban/THEME.md +167 -0
- package/themes/team-kanban/audit.log.jsonl +2 -0
- package/themes/team-kanban/dismissals.jsonl +1 -0
- package/themes/team-kanban/tailwind.snippet.ts +15 -0
- package/themes/team-kanban/theme.yml +209 -0
- package/themes/team-kanban/tokens.ts +35 -0
- package/themes/telehealth-modern/THEME.md +95 -0
- package/themes/telehealth-modern/tokens.ts +197 -0
- package/themes/tourism-board/THEME.md +111 -0
- package/themes/tourism-board/tokens.ts +173 -0
- package/themes/toys-modern/THEME.md +79 -0
- package/themes/toys-modern/tokens.ts +200 -0
- package/themes/travel-luxury/THEME.md +95 -0
- package/themes/travel-luxury/tokens.ts +162 -0
- package/themes/vacation-rental/THEME.md +105 -0
- package/themes/vacation-rental/tokens.ts +174 -0
- package/themes/vault-reel/THEME.md +134 -0
- package/themes/vault-reel/audit.log.jsonl +3 -0
- package/themes/vault-reel/tailwind.snippet.ts +16 -0
- package/themes/vault-reel/theme.yml +167 -0
- package/themes/vault-reel/tokens.ts +30 -0
- package/themes/vet-modern/THEME.md +79 -0
- package/themes/vet-modern/tokens.ts +194 -0
- package/themes/web3-restraint/THEME.md +87 -0
- package/themes/web3-restraint/tokens.ts +154 -0
- package/themes/wellness-active/THEME.md +102 -0
- package/themes/wellness-active/tokens.ts +203 -0
- package/themes/wellness-spa/THEME.md +93 -0
- package/themes/wellness-spa/tokens.ts +173 -0
- package/themes/y2k-chrome/THEME.md +118 -0
- package/themes/y2k-chrome/tokens.ts +249 -0
- package/themes/yoga-studio/THEME.md +76 -0
- 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,17 @@
|
|
|
1
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T20:33:01.725Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T20:33:01.736Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T20:33:37.739Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T20:33:37.741Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T20:33:01.725Z"}
|
|
2
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-AUTO-HELPER-LABEL","severity":"block","evidence":"section source contains \"AUTO 4s\" — auto-advance helper label reads as engineer-explaining-to-self"},{"rule":"R-CYCLING-HEADLINE-WORDS","severity":"block","evidence":"setInterval mutating a headline/phrase every 4000ms — the \"we [design][build][ship]\" cycling-verbs pattern"}]},"ran_at":"2026-07-03T22:48:34.522Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T22:48:34.522Z"}
|
|
3
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:49:11.869Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:49:11.878Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T22:49:11.878Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T22:49:11.878Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:49:11.869Z"}
|
|
4
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-DOT-METADATA-ROW","severity":"block","evidence":"section source contains \"ISSUE 04 · CHAPTER\" — dot-separated mono-caps metadata row is universal slop; use real page-position folios or nothing"}]},"ran_at":"2026-07-03T22:50:06.656Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T22:50:06.656Z"}
|
|
5
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-DOT-METADATA-ROW","severity":"block","evidence":"section source contains \"NEWSLETTER · FIRST DIBS\" — dot-separated mono-caps metadata row is universal slop; use real page-position folios or nothing"}]},"ran_at":"2026-07-03T22:51:01.641Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T22:51:01.641Z"}
|
|
6
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:51:13.559Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:51:13.571Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T22:51:13.571Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T22:51:13.571Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:51:13.559Z"}
|
|
7
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:54:10.983Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:54:10.991Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T22:54:10.992Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T22:54:10.992Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:54:10.983Z"}
|
|
8
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-DOT-METADATA-ROW","severity":"block","evidence":"section source contains \"3 YEARS · SAVE 33\" — mono-caps dot-metadata pattern is universal slop; use real page-position folios or nothing"},{"rule":"R-READ-TIME-META","severity":"block","evidence":"section source contains \"READ TIME\" — read-time/page-count ornament is the Medium-inherited \"here's how long this takes\" slop"}]},"ran_at":"2026-07-03T22:58:12.862Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T22:58:12.862Z"}
|
|
9
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-DOT-METADATA-ROW","severity":"block","evidence":"section source contains \"3 YEARS · SAVE 33\" — mono-caps dot-metadata pattern is universal slop; use real page-position folios or nothing"},{"rule":"R-READ-TIME-META","severity":"block","evidence":"section source contains \"READ TIME\" — read-time/page-count ornament is the Medium-inherited \"here's how long this takes\" slop"},{"rule":"R-BYLINE-MONO-CAPS","severity":"block","evidence":"section source contains \"\n BY X\" — mono-caps byline reads as editorial cosplay; set bylines in body type or omit"}]},"ran_at":"2026-07-03T22:59:06.440Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T22:59:06.440Z"}
|
|
10
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-DOT-METADATA-ROW","severity":"block","evidence":"section source contains \"C · X\" — mono-caps dot-metadata pattern is universal slop; use real page-position folios or nothing"}]},"ran_at":"2026-07-03T23:00:13.841Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T23:00:13.841Z"}
|
|
11
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:01:32.555Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:01:32.564Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T23:01:32.564Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T23:01:32.564Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T23:01:32.555Z"}
|
|
12
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:03:44.627Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:03:44.640Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T23:03:44.640Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T23:03:44.640Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T23:03:44.627Z"}
|
|
13
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:07:10.856Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:07:10.865Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T23:07:10.865Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T23:07:10.865Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T23:07:10.856Z"}
|
|
14
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:11:33.971Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:11:33.981Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T23:11:33.981Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T23:11:33.981Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T23:11:33.971Z"}
|
|
15
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":false,"failures":[{"rule":"R-WIDE-TRACKED-CAPS","severity":"block","evidence":"5 inline style block(s) combine textTransform: uppercase + wide letterSpacing (0.20em @ ~11px) — CSS fingerprint of mono-caps eyebrow slop that source-text scanners miss"}]},"ran_at":"2026-07-03T23:12:10.529Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T23:12:10.529Z"}
|
|
16
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:14:19.157Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T23:14:19.166Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T23:14:19.166Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-03T23:14:19.166Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T23:14:19.157Z"}
|
|
17
|
+
{"slug":"ember-poster","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T00:00:36.233Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T00:00:36.242Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-04T00:00:36.242Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-04T00:00:36.243Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-04T00:00:36.233Z"}
|
|
@@ -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
|
+
};
|