@stylecrib/cli 0.0.0-stage → 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 +163 -2
- 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 +7182 -0
- package/package.json +69 -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,158 @@
|
|
|
1
|
+
# Nature-Distilled — Build Brief
|
|
2
|
+
|
|
3
|
+
> The contract this theme ships with. Read at commit time by the
|
|
4
|
+
> brief-enforcer subagent; handed to Claude Code via the Copy-for-Claude
|
|
5
|
+
> button on the theme detail page.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## MANDATORY BUILD DIRECTIVE — you MUST
|
|
10
|
+
|
|
11
|
+
1. **Hold the warm cream ground at `#EDE4D3`** on the light canvas.
|
|
12
|
+
Never the Claude-cream tell `#F4F1EA`. Never pure white. On dark
|
|
13
|
+
canvas invert to warm charcoal `#3D3226` bg + cream ink.
|
|
14
|
+
2. **Use terra `#A6714E` STRUCTURALLY, never as a CTA button color.**
|
|
15
|
+
Terra is: the initial drop-cap on the hero H1, the hairline divider
|
|
16
|
+
under the hero, per-region tile top-rules, structural underlines.
|
|
17
|
+
Buttons are walnut on cream, terra bordered ghost, or accent bg.
|
|
18
|
+
3. **Set the hero display in Fraunces serif** at `clamp(3rem, 7vw,
|
|
19
|
+
6rem)`, weight 500, tracking -0.015em. Line-height 1.02. Body copy
|
|
20
|
+
in Hanken Grotesk / Inter at 17px line-height 1.55.
|
|
21
|
+
4. **Olive-green mono `#6B7256` for sourcing chrome** — batch numbers
|
|
22
|
+
("Batch 104"), region labels ("Oaxaca"), journal author bylines
|
|
23
|
+
("Nia Ortiz · 8 min read"). This is the ONE place mono lives.
|
|
24
|
+
Never mono-caps eyebrows.
|
|
25
|
+
5. **Terra initial cap on the hero H1** — the first letter of the
|
|
26
|
+
headline is in terra, weight 600, otherwise the headline is in
|
|
27
|
+
walnut ink `#3D3226`. This is the register-defining move.
|
|
28
|
+
6. **Real Pexels photos** for the hero (aged wood or artisan hands),
|
|
29
|
+
sourcing tiles (3 region shots), journal cards (3 field photos),
|
|
30
|
+
and studio still. No SVG stand-ins. Photos: warm-toned, still-life
|
|
31
|
+
or artisan-context, never generic stock.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## SLOP-BLOCKLIST — you MUST NOT
|
|
36
|
+
|
|
37
|
+
- **Terra used as a CTA button fill color.** Terra is structural only.
|
|
38
|
+
A terra-fill button reads as decorative and breaks the register.
|
|
39
|
+
- **Mono-caps decorative eyebrows** (`SOURCING · REGIONS`, `BATCH 104`
|
|
40
|
+
at fingerprint `textTransform: uppercase` + `letterSpacing ≥ 0.14em`
|
|
41
|
+
at `fontSize < 20px`). Real content labels like `Batch 104-a` on a
|
|
42
|
+
product card are content, not eyebrow chrome.
|
|
43
|
+
- **`№` / N.º / no. / vol. ornaments.**
|
|
44
|
+
- **Roman-numeral copyright** (`MMXXVI`).
|
|
45
|
+
- **Cold gray body copy.** The register is warm-black `#3D3226` on
|
|
46
|
+
cream, or warm cream on charcoal. NEVER `#0F0F0F` or `#FFFFFF` or
|
|
47
|
+
any 0° hue neutral.
|
|
48
|
+
- **Sunset/sunrise gradient backdrops** — this theme uses grain
|
|
49
|
+
overlay, not gradients.
|
|
50
|
+
- **Vague trust copy:** hand-crafted, thoughtfully-made, considered.
|
|
51
|
+
This theme's whole register IS handcrafted — SHOW it via named
|
|
52
|
+
makers + origin postcodes, don't SAY it.
|
|
53
|
+
- **Attribution of influence in visible copy** — Aesop, The Ordinary,
|
|
54
|
+
Patagonia, Kinfolk can be studied but never NAMED.
|
|
55
|
+
- **Auto-advancing anything.** No sliders, no ticker, no cycling
|
|
56
|
+
headline words.
|
|
57
|
+
- **3-pillar identical feature grids.** Region tiles are 3-wide but
|
|
58
|
+
each tile has DIFFERENT internal composition (photo aspect,
|
|
59
|
+
material name, story length).
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## CHROME INVENTORY — the allow-list
|
|
64
|
+
|
|
65
|
+
- **Sticky palette + canvas picker strip** — meta-UI, sentence-case
|
|
66
|
+
body font.
|
|
67
|
+
- **Masthead nav** — Fraunces "Ochre & Ash" wordmark (weight 600 at
|
|
68
|
+
22px, letter-spacing -0.01em) + 4 nav items (body font, 14px,
|
|
69
|
+
walnut) + "Cart (0)" link (body font, walnut).
|
|
70
|
+
- **Grain-textured hero band** — SVG-filter fractal noise at
|
|
71
|
+
`mixBlendMode: multiply` (dark canvas: `screen`), opacity 0.7,
|
|
72
|
+
revealed on IntersectionObserver.
|
|
73
|
+
- **Hero H1 with terra drop-cap** — Fraunces 500 at clamp(3rem, 7vw,
|
|
74
|
+
6rem), first letter in terra weight 600, rest in walnut ink.
|
|
75
|
+
- **Terra hairline divider** — 1px terra, 80px wide, between H1 and
|
|
76
|
+
body copy.
|
|
77
|
+
- **Walnut-filled CTA button** — walnut bg `#3D3226`, cream text,
|
|
78
|
+
padding 14px 24px, no radius, body font 15px weight 500. THIS is
|
|
79
|
+
the primary button style. Never terra-filled.
|
|
80
|
+
- **Full-bleed hero photograph** — 16:8 or 21:9, warm-toned, natural
|
|
81
|
+
materials.
|
|
82
|
+
- **Product tile grid (4-up)** — each tile: 4:5 photo, batch chip
|
|
83
|
+
(mono olive), product name (Fraunces 500 at 18px), tag (italic
|
|
84
|
+
body), price. NEVER add a hover animation.
|
|
85
|
+
- **Sourcing region tile (3-up)** — 3:2 photo + batch chip + region
|
|
86
|
+
name (Fraunces H3) + material italic + terra 32px hairline + prose.
|
|
87
|
+
- **Journal card (3-up)** — 3:2 photo + Fraunces title (22px) + mono
|
|
88
|
+
olive byline (`Nia Ortiz · 8 min read`).
|
|
89
|
+
- **Studio manifesto band** — surface-cream bg, 2-col: photo 4:5 +
|
|
90
|
+
Fraunces H2 + 2 body paragraphs.
|
|
91
|
+
- **Newsletter capture** — center-aligned Fraunces H2 + body + one-row
|
|
92
|
+
email input + walnut submit button.
|
|
93
|
+
- **Cream footer** — brand + one-liner + 3 link columns (mono olive
|
|
94
|
+
column labels are permitted here as content — they're footer nav
|
|
95
|
+
headings, not decorative eyebrows).
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## SIGNATURE MOVES — verbs, not adjectives
|
|
100
|
+
|
|
101
|
+
- **Reveal the grain overlay on scroll** using IntersectionObserver at
|
|
102
|
+
threshold 0.3 — opacity 0 → 0.7 over 400ms cubic-bezier. Cream
|
|
103
|
+
paper texture is the visual grounding.
|
|
104
|
+
- **Drop-cap the hero's first letter in terra** — this is the ONE
|
|
105
|
+
structural use of terra above the hairline. If the drop-cap isn't
|
|
106
|
+
there, the theme is broken.
|
|
107
|
+
- **Batch every product with a mono olive chip** — `Batch 104-b`.
|
|
108
|
+
This IS the theme's slow-goods signature.
|
|
109
|
+
- **Alternate 60/40 splits for the sourcing regions** — each region
|
|
110
|
+
tile keeps photo-left OR photo-top, but every alternate section
|
|
111
|
+
through the page swaps side. Never render three regions in a
|
|
112
|
+
uniform grid.
|
|
113
|
+
- **Italic Fraunces for product tags** ("50ml", "180mm", "Set of two")
|
|
114
|
+
— italic Fraunces at 13px in warm walnut. This is how the theme
|
|
115
|
+
reads as slow-goods and not modern-DTC.
|
|
116
|
+
- **The batch letter is six letters a year, no offers** — the
|
|
117
|
+
newsletter copy IS the theme's product-voice signature.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## COLOR TOKENS
|
|
122
|
+
|
|
123
|
+
**Light canvas** — `cream: #EDE4D3` / `surfaceCream: #F5EFE0` /
|
|
124
|
+
`walnut: #3D3226` (ink) / body / mute / footer copy.
|
|
125
|
+
|
|
126
|
+
**Dark canvas** — `bg: #3D3226` (warm charcoal) / `surface: #4E4235` /
|
|
127
|
+
`ink: #F5EFE0` / mute.
|
|
128
|
+
|
|
129
|
+
**Structural** — `terra: #A6714E` (drop-cap, hairlines, dividers).
|
|
130
|
+
|
|
131
|
+
**Sourcing chrome** — `olive: #6B7256` (batch chips, footer column
|
|
132
|
+
labels, journal bylines).
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## TYPOGRAPHY
|
|
137
|
+
|
|
138
|
+
- **Display:** Fraunces (fallback Playfair Display, Georgia).
|
|
139
|
+
Weight 500 default, 600 for the drop-cap. Tracking -0.015em.
|
|
140
|
+
- **Body:** Hanken Grotesk (fallback Inter), 17px, line-height 1.55.
|
|
141
|
+
- **Mono:** JetBrains Mono / IBM Plex Mono, 11px, `color: olive`,
|
|
142
|
+
letter-spacing 0.16-0.20em. ONLY for batch chips, region labels,
|
|
143
|
+
journal bylines, footer column labels, and the palette picker.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## SECTION SKELETON
|
|
148
|
+
|
|
149
|
+
1. Sticky palette + canvas picker.
|
|
150
|
+
2. Masthead nav.
|
|
151
|
+
3. Grain-textured hero with terra drop-cap.
|
|
152
|
+
4. Full-bleed hero photograph.
|
|
153
|
+
5. Featured products (4-up batch).
|
|
154
|
+
6. Sourcing regions (3-up).
|
|
155
|
+
7. Journal / field reports (3-up).
|
|
156
|
+
8. Studio manifesto (2-col: portrait + copy).
|
|
157
|
+
9. Batch-letter newsletter capture.
|
|
158
|
+
10. Cream footer band.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Nature Distilled
|
|
2
|
+
|
|
3
|
+
> Earthy grounded warmth — skin, wood, and soil tones anchor a light surface with tactile depth. Trustworthy without being sterile.
|
|
4
|
+
|
|
5
|
+
**Slug:** `nature-distilled` — **Surface:** web — **Density:** airy
|
|
6
|
+
|
|
7
|
+
## Influence
|
|
8
|
+
|
|
9
|
+
The Ordinary skincare (sand + walnut layering), Aesop packaging (warm earth on cream), Cotopaxi (natural texture over flat), Field Notes (warm paper + olive accent), Patagonia storytelling (organic photography).
|
|
10
|
+
|
|
11
|
+
## Signature move
|
|
12
|
+
|
|
13
|
+
Grain texture overlay on hero imagery (subtle noise, 8-12% opacity)
|
|
14
|
+
+ walnut ink on cream surface (never terracotta — that's the AI tell).
|
|
15
|
+
Serif display type at generous size, one olive-green secondary used
|
|
16
|
+
sparingly for sourcing/attribution chrome, and a single terra accent
|
|
17
|
+
#A6714E used STRUCTURALLY (a section divider, an initial cap) not
|
|
18
|
+
as the safe cream+terra button color.
|
|
19
|
+
|
|
20
|
+
## Palette
|
|
21
|
+
|
|
22
|
+
- **bg:** `#EDE4D3`
|
|
23
|
+
- **surface:** `#F5EFE0`
|
|
24
|
+
- **ink:** `#3D3226`
|
|
25
|
+
- **accent:** `#A6714E`
|
|
26
|
+
- **secondary:** `#6B7256`
|
|
27
|
+
|
|
28
|
+
## Typography
|
|
29
|
+
|
|
30
|
+
- **Display:** Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em
|
|
31
|
+
- **Body:** Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display.
|
|
32
|
+
- **Mono:** JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body.
|
|
33
|
+
- **Scale:** 1.333 (perfect fourth — organic contrast, doesn't feel measured)
|
|
34
|
+
|
|
35
|
+
## Motion
|
|
36
|
+
|
|
37
|
+
One texture-in reveal on scroll — grain overlay fades in over the hero
|
|
38
|
+
image at 400ms ease-out when the hero enters viewport. Nothing else
|
|
39
|
+
moves. No card hover animation, no CTA glow, no scroll parallax.
|
|
40
|
+
Warmth comes from PALETTE and TEXTURE, never from motion.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
## Imagery
|
|
44
|
+
|
|
45
|
+
Warm organic photography — hands working material, wood grain,
|
|
46
|
+
earth-toned still life. Slight desaturation (85-90%), warm color-cast.
|
|
47
|
+
Grain overlay when the image is a hero. Illustration if used is
|
|
48
|
+
botanical line-art in walnut ink. NO stock photography of "hands
|
|
49
|
+
reaching," NO gradient overlays.
|
|
50
|
+
|
|
51
|
+
## Best for
|
|
52
|
+
|
|
53
|
+
- Skincare and beauty brands with an earth-conscious register
|
|
54
|
+
- Craft goods (ceramics, textiles, furniture, small-batch food)
|
|
55
|
+
- Sustainability-focused DTC and mission-driven consumer brands
|
|
56
|
+
- Warm-editorial magazines and lifestyle publishing
|
|
57
|
+
- Wellness and wine brands that want depth without going full luxury
|
|
58
|
+
|
|
59
|
+
## Reject if
|
|
60
|
+
|
|
61
|
+
_Director grades each of the following as a pass/fail check. Any violation blocks the theme._
|
|
62
|
+
|
|
63
|
+
- #D97757 or any terracotta accent as the primary CTA / decoration — that IS the Claude-cream tell (R-CLAUDE-CREAM in slop-blocklist)
|
|
64
|
+
- Pure #FFFFFF background — the register is warm cream, never sterile white
|
|
65
|
+
- shadow-md or drop-shadow on cards — depth comes from grain texture, not shadow bloom
|
|
66
|
+
- Cold gray body text — ink is #3D3226 walnut, never #64748b slate-gray
|
|
67
|
+
- Gradient overlays on hero photography — grain overlay is the technique, not gradients
|
|
68
|
+
- Sans-serif display (this register requires the Fraunces optical-serif contrast)
|
|
69
|
+
- Rounded button corners greater than 8px — softer than brutalism but not pill-shaped
|
|
70
|
+
- Bright saturated accents — walnut/terra/olive stay muted (saturation <45%)
|
|
71
|
+
- Two accent colors visible simultaneously beyond the walnut-ink + one earthy accent
|
|
72
|
+
|
|
73
|
+
## Banned defaults (inherited + theme-specific)
|
|
74
|
+
|
|
75
|
+
- claude-cream (#F4F1EA + serif + #D97757)
|
|
76
|
+
- void+acid (near-black bg + single bright acid-green or vermilion accent)
|
|
77
|
+
- broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
|
|
78
|
+
- tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
|
|
79
|
+
- uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
|
|
80
|
+
- cream-plus-terra (any hex within Lab 8 of #F4F1EA background paired with any hex within Lab 8 of #D97757 accent — the specific Claude-cream tell)
|
|
81
|
+
- sterile-nature (cream/white bg with cold gray body ink and one saturated green — the AI 'nature' default that reads as pharmacy, not craft)
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"slug":"nature-distilled","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:00.081Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:00.089Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:27.642Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T18:32:41.517Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T18:32:00.081Z"}
|
|
2
|
+
{"slug":"nature-distilled","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:14.404Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:14.413Z","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:52:14.413Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — anchor-compare skipped. Set the key to enable rubric grading."},"ran_at":"2026-07-03T22:52:17.614Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:52:14.404Z"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
|
|
2
|
+
// slug: nature-distilled
|
|
3
|
+
export const natureDistilledTailwindExtend = {
|
|
4
|
+
colors: {
|
|
5
|
+
bg: "#EDE4D3",
|
|
6
|
+
surface: "#F5EFE0",
|
|
7
|
+
ink: "#3D3226",
|
|
8
|
+
accent: "#A6714E",
|
|
9
|
+
secondary: "#6B7256",
|
|
10
|
+
},
|
|
11
|
+
fontFamily: {
|
|
12
|
+
display: ["Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em"],
|
|
13
|
+
body: ["Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display."],
|
|
14
|
+
mono: ["JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body."],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Base 34 Nature Distilled — Family D, Contemporary Web.
|
|
2
|
+
#
|
|
3
|
+
# Per BESPOKE_THEME_SYSTEM.md #34: earthy grounded warmth. Skin/wood/soil
|
|
4
|
+
# tones. Tactile, human, trustworthy. The spec explicitly says AVOID
|
|
5
|
+
# #D97757 on cream — anchor in walnut/olive instead. That's the exact
|
|
6
|
+
# Claude-cream tell R-CLAUDE-CREAM catches; Nature Distilled has to
|
|
7
|
+
# refuse it by construction.
|
|
8
|
+
#
|
|
9
|
+
# Theme #4 through the v2 harness. Chosen deliberately as a test: does
|
|
10
|
+
# the Family D rubric (written around Dark Premium's dark-ground signal-
|
|
11
|
+
# accent register) accept a LIGHT earthy theme in the same family?
|
|
12
|
+
# Prediction: anchor-compare may fire on surface-layering (rubric axis 1,
|
|
13
|
+
# looking for dark layered panels). That's a real finding about rubric
|
|
14
|
+
# breadth if it happens — surface it, don't paper over.
|
|
15
|
+
#
|
|
16
|
+
# Precedent: pet-food + zone-drift survivors, per SURVIVOR_MAPPING.md.
|
|
17
|
+
|
|
18
|
+
name: Nature Distilled
|
|
19
|
+
concept: Earthy grounded warmth — skin, wood, and soil tones anchor a light surface with tactile depth. Trustworthy without being sterile.
|
|
20
|
+
influence: The Ordinary skincare (sand + walnut layering), Aesop packaging (warm earth on cream), Cotopaxi (natural texture over flat), Field Notes (warm paper + olive accent), Patagonia storytelling (organic photography).
|
|
21
|
+
|
|
22
|
+
family: D
|
|
23
|
+
base_number: 34
|
|
24
|
+
render_url: http://localhost:5173/themes/nature-distilled
|
|
25
|
+
|
|
26
|
+
surface: web
|
|
27
|
+
|
|
28
|
+
typography:
|
|
29
|
+
display: Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em
|
|
30
|
+
body: Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display.
|
|
31
|
+
mono: JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body.
|
|
32
|
+
scale: 1.333 (perfect fourth — organic contrast, doesn't feel measured)
|
|
33
|
+
|
|
34
|
+
palette:
|
|
35
|
+
bg: "#EDE4D3"
|
|
36
|
+
surface: "#F5EFE0"
|
|
37
|
+
ink: "#3D3226"
|
|
38
|
+
accent: "#A6714E"
|
|
39
|
+
secondary: "#6B7256"
|
|
40
|
+
|
|
41
|
+
density: airy
|
|
42
|
+
|
|
43
|
+
motion: |
|
|
44
|
+
One texture-in reveal on scroll — grain overlay fades in over the hero
|
|
45
|
+
image at 400ms ease-out when the hero enters viewport. Nothing else
|
|
46
|
+
moves. No card hover animation, no CTA glow, no scroll parallax.
|
|
47
|
+
Warmth comes from PALETTE and TEXTURE, never from motion.
|
|
48
|
+
|
|
49
|
+
signature: |
|
|
50
|
+
Grain texture overlay on hero imagery (subtle noise, 8-12% opacity)
|
|
51
|
+
+ walnut ink on cream surface (never terracotta — that's the AI tell).
|
|
52
|
+
Serif display type at generous size, one olive-green secondary used
|
|
53
|
+
sparingly for sourcing/attribution chrome, and a single terra accent
|
|
54
|
+
#A6714E used STRUCTURALLY (a section divider, an initial cap) not
|
|
55
|
+
as the safe cream+terra button color.
|
|
56
|
+
|
|
57
|
+
imagery: |
|
|
58
|
+
Warm organic photography — hands working material, wood grain,
|
|
59
|
+
earth-toned still life. Slight desaturation (85-90%), warm color-cast.
|
|
60
|
+
Grain overlay when the image is a hero. Illustration if used is
|
|
61
|
+
botanical line-art in walnut ink. NO stock photography of "hands
|
|
62
|
+
reaching," NO gradient overlays.
|
|
63
|
+
|
|
64
|
+
best_for:
|
|
65
|
+
- Skincare and beauty brands with an earth-conscious register
|
|
66
|
+
- Craft goods (ceramics, textiles, furniture, small-batch food)
|
|
67
|
+
- Sustainability-focused DTC and mission-driven consumer brands
|
|
68
|
+
- Warm-editorial magazines and lifestyle publishing
|
|
69
|
+
- Wellness and wine brands that want depth without going full luxury
|
|
70
|
+
|
|
71
|
+
avoid:
|
|
72
|
+
- "#D97757 or any terracotta accent as the primary CTA / decoration — that IS the Claude-cream tell (R-CLAUDE-CREAM in slop-blocklist)"
|
|
73
|
+
- "Pure #FFFFFF background — the register is warm cream, never sterile white"
|
|
74
|
+
- "shadow-md or drop-shadow on cards — depth comes from grain texture, not shadow bloom"
|
|
75
|
+
- "Cold gray body text — ink is #3D3226 walnut, never #64748b slate-gray"
|
|
76
|
+
- "Gradient overlays on hero photography — grain overlay is the technique, not gradients"
|
|
77
|
+
- "Sans-serif display (this register requires the Fraunces optical-serif contrast)"
|
|
78
|
+
- "Rounded button corners greater than 8px — softer than brutalism but not pill-shaped"
|
|
79
|
+
- "Bright saturated accents — walnut/terra/olive stay muted (saturation <45%)"
|
|
80
|
+
- "Two accent colors visible simultaneously beyond the walnut-ink + one earthy accent"
|
|
81
|
+
|
|
82
|
+
banned_defaults:
|
|
83
|
+
# Global blocklist from BESPOKE_THEME_SYSTEM.md
|
|
84
|
+
- "claude-cream (#F4F1EA + serif + #D97757)"
|
|
85
|
+
- "void+acid (near-black bg + single bright acid-green or vermilion accent)"
|
|
86
|
+
- "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
|
|
87
|
+
- "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
|
|
88
|
+
- "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
|
|
89
|
+
# Base-specific
|
|
90
|
+
- "cream-plus-terra (any hex within Lab 8 of #F4F1EA background paired with any hex within Lab 8 of #D97757 accent — the specific Claude-cream tell)"
|
|
91
|
+
- "sterile-nature (cream/white bg with cold gray body ink and one saturated green — the AI 'nature' default that reads as pharmacy, not craft)"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
|
|
2
|
+
|
|
3
|
+
export const tokens = {
|
|
4
|
+
slug: "nature-distilled",
|
|
5
|
+
family: "D",
|
|
6
|
+
base: "34",
|
|
7
|
+
palette: {
|
|
8
|
+
"bg": "#EDE4D3",
|
|
9
|
+
"surface": "#F5EFE0",
|
|
10
|
+
"ink": "#3D3226",
|
|
11
|
+
"accent": "#A6714E",
|
|
12
|
+
"secondary": "#6B7256"
|
|
13
|
+
},
|
|
14
|
+
typography: {
|
|
15
|
+
"display": "Fraunces (soft variable serif) — 500-600 weight for headlines at 40-72px, optical size tuned wide, letter-spacing -0.015em",
|
|
16
|
+
"body": "Hanken Grotesk — 400, 16px, line-height 1.55. Warm but not calligraphic. Doesn't compete with the serif display.",
|
|
17
|
+
"mono": "JetBrains Mono — 12-13px, only for metadata (batch numbers, sourcing lines, weight indicators). Never body.",
|
|
18
|
+
"scale": "1.333 (perfect fourth — organic contrast, doesn't feel measured)"
|
|
19
|
+
},
|
|
20
|
+
surface: "web",
|
|
21
|
+
density: "airy",
|
|
22
|
+
motion: "One texture-in reveal on scroll — grain overlay fades in over the hero\nimage at 400ms ease-out when the hero enters viewport. Nothing else\nmoves. No card hover animation, no CTA glow, no scroll parallax.\nWarmth comes from PALETTE and TEXTURE, never from motion.\n",
|
|
23
|
+
signature: "Grain texture overlay on hero imagery (subtle noise, 8-12% opacity)\n+ walnut ink on cream surface (never terracotta — that's the AI tell).\nSerif display type at generous size, one olive-green secondary used\nsparingly for sourcing/attribution chrome, and a single terra accent\n#A6714E used STRUCTURALLY (a section divider, an initial cap) not\nas the safe cream+terra button color.\n",
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
export type Tokens = typeof tokens;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Design Direction — News-Tabloid
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Daily Mail sidebar-of-shame · NY Post wood-type front page · The Sun condensed screamer · Bild red-rule masthead · NY Daily News photo-density
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Loud, condensed, photo-dense. Red masthead rule + black ink on near-white newsprint. Knockout-style condensed bold sans at oversized sizes screaming the headline. Stacks of headlines, grids of thumbnails, talker sidebars. The page is the noise. The opposite of editorial restraint — every inch carries shout.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Daily Mail** → sidebar-of-shame headline stack, photo-densest layout in news.
|
|
11
|
+
- **NY Post** → wood-type-condensed front-page screamer, all-caps shout.
|
|
12
|
+
- **The Sun** → red+black bold, white-on-red kicker chips.
|
|
13
|
+
- **Bild** → thick red masthead rule, sans-only display register.
|
|
14
|
+
- **NY Daily News** → tabloid headline tower, talker sidebar.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Brand tokens: `--ink`, `--tabloid-red`, `--exclusive-yellow`, `--newsprint`, `--rule-heavy`, `--chip-fill`. Foreground is nearly pure black (`hsl(0 0% 8%)`) — tabloid ink is screamer-ready, not editorial-warm.
|
|
18
|
+
|
|
19
|
+
Primary is **tabloid red** (`hsl(0 82% 48%)`) — saturated, used aggressively as masthead, kicker chips, and CTA fills. EXCLUSIVE-chip yellow (`hsl(48 100% 50%)`) is the second loud accent, used sparingly on top-story flags.
|
|
20
|
+
|
|
21
|
+
## Typography
|
|
22
|
+
- **Display:** Oswald (Knockout-style condensed bold sans). Weights 500–700. The headline tower lives here, all-caps at oversized sizes.
|
|
23
|
+
- **Body:** Source Sans 3. 15px tight / `line-height: 1.45` — high density.
|
|
24
|
+
- **Mono:** JetBrains Mono. Timestamps, comment counts (`12,847 COMMENTS`), picture credits.
|
|
25
|
+
|
|
26
|
+
H1 uses `clamp(3rem, 9vw, 7rem)` — front-page screamer scale.
|
|
27
|
+
|
|
28
|
+
## Spacing
|
|
29
|
+
- **Container:** `max-w-7xl px-4 lg:px-8` — wide; photo grids and headline towers need the room.
|
|
30
|
+
- **Section padding:** hero `pt-10 pb-8 lg:pt-16 lg:pb-12`; default `py-12 lg:py-16`; tight `py-6 lg:py-10`. Tighter than every other direction.
|
|
31
|
+
- **Scale:** 2 4 6 8 10 12 16 20 24 32 48 64 — high density.
|
|
32
|
+
|
|
33
|
+
## Color
|
|
34
|
+
No hex in components. The page is built from four colors: `--ink`, `--newsprint`, `--tabloid-red`, `--exclusive-yellow`. The combination is the brand.
|
|
35
|
+
|
|
36
|
+
## Radius
|
|
37
|
+
`--radius: 0`. **Sharp corners only.** Pills disallowed — no soft chips. Tabloid chips are angular rects with heavy ink borders.
|
|
38
|
+
|
|
39
|
+
## Shadows
|
|
40
|
+
None / utility-only. Two utilities: `.rule-heavy` (2px ink rule under section bars) and `.chip-shadow` (crude 2px / 2px offset shadow on EXCLUSIVE chips — newsprint-printing-press feel).
|
|
41
|
+
|
|
42
|
+
## Motion
|
|
43
|
+
Two keyframes. `snap-in` (250ms) — fast snap entrance, no theatrical rise. `chip-flash` (800ms infinite) — flashes the BREAKING/EXCLUSIVE chip between red and yellow, used sparingly (single top story only). Honors `prefers-reduced-motion`.
|
|
44
|
+
|
|
45
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`.
|
|
46
|
+
|
|
47
|
+
## Component patterns
|
|
48
|
+
- **Buttons:** solid-fill in `--tabloid-red` with white text + heavy `--ink` border. Bold condensed display font, all-caps. Secondary buttons invert: `--ink` fill + white text. No ghost buttons — tabloid commits to fill.
|
|
49
|
+
- **Cards:** thick 2px `--ink` border, no radius. White or `--newsprint` background. Oversized Oswald headline, colored kicker chip bar above. Padding tight (`p-3 lg:p-4`).
|
|
50
|
+
- **Inputs:** full box with 2px `--ink` border. Bold sans label above in caps. Focus shifts border to `--tabloid-red`.
|
|
51
|
+
- **CTA links:** filled rect in `--tabloid-red` or `--ink`, heavy border, all-caps. **Never a text-link CTA.**
|
|
52
|
+
|
|
53
|
+
## Bespoke section
|
|
54
|
+
A headline tower of 8 stacked headlines (varying sizes — top story oversized, descending) + a 6-thumbnail photo grid with caption strips beneath each + a "Talkers" sidebar list (5 most-commented stories with comment-count mono badges). The tower uses BREAKING / EXCLUSIVE / SHOCK kicker chips in flashing colors. Composition is dense and packed — no white space breathing room.
|
|
55
|
+
|
|
56
|
+
## Recommended rich media
|
|
57
|
+
Tabloid photography — paparazzi shots, court entrances, celebrity-with-coffee. High contrast, slight oversaturation. Thumbnails are tight 4:3 with bold caption strips beneath in white-on-black.
|
|
58
|
+
|
|
59
|
+
**AI tool recommendations:** Midjourney prompts like *"paparazzi long-lens, tabloid front page, harsh flash, high contrast"*. Avoid editorial portraiture (newspaper-classic / magazine-glossy territory). Use bold Knockout-style headlines as caption overlays.
|
|
60
|
+
|
|
61
|
+
**Avoid:** subtle photography, magazine-glossy lighting, drop shadows (the offset crude shadow is the only allowed shadow), pill chips, gradient backgrounds, any restrained palette.
|
|
62
|
+
|
|
63
|
+
## Details
|
|
64
|
+
- **Selection:** `hsl(var(--exclusive-yellow) / 0.6)` — yellow highlighter.
|
|
65
|
+
- **Focus ring:** `2px solid hsl(var(--ring))` — thick, screamer-loud.
|
|
66
|
+
- **Scrollbar:** auto.
|
|
67
|
+
|
|
68
|
+
## Exceptions
|
|
69
|
+
None yet.
|
|
70
|
+
|
|
71
|
+
## Revisions
|
|
72
|
+
- Initial direction.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// Note: "news-tabloid" is not yet in the Direction["name"] enum.
|
|
4
|
+
// The schema is closed; until it is extended this file casts the name.
|
|
5
|
+
|
|
6
|
+
export const newsTabloid: Direction = {
|
|
7
|
+
name: "news-tabloid" as Direction["name"],
|
|
8
|
+
ethos: "Daily Mail sidebar-of-shame · NY Post wood-type front page · The Sun condensed screamer · Bild red-rule masthead · NY Daily News photo-density",
|
|
9
|
+
references: [
|
|
10
|
+
{ brand: "Daily Mail", trait: "sidebar-of-shame headline stack, photo-densest layout in news" },
|
|
11
|
+
{ brand: "NY Post", trait: "wood-type-condensed front-page screamer, all-caps shout" },
|
|
12
|
+
{ brand: "The Sun", trait: "red+black bold, white-on-red kicker chips" },
|
|
13
|
+
{ brand: "Bild", trait: "thick red masthead rule, sans-only display register" },
|
|
14
|
+
{ brand: "NY Daily News", trait: "tabloid headline tower, talker sidebar" },
|
|
15
|
+
],
|
|
16
|
+
feel:
|
|
17
|
+
"Loud, condensed, photo-dense. Red masthead rule + black ink on near-white newsprint. " +
|
|
18
|
+
"Knockout-style condensed bold sans at oversized sizes screaming the headline. " +
|
|
19
|
+
"Stacks of headlines, grids of thumbnails, talker sidebars. The page is the noise.",
|
|
20
|
+
|
|
21
|
+
fonts: {
|
|
22
|
+
display: {
|
|
23
|
+
family: "Oswald",
|
|
24
|
+
fallback: ["Knockout", "Bebas Neue", "Anton", "Impact", "Haettenschweiler", "sans-serif"],
|
|
25
|
+
from: "Knockout-style condensed bold sans — NY Post / Daily Mail front-page register",
|
|
26
|
+
googleFont: "Oswald",
|
|
27
|
+
weights: [500, 600, 700],
|
|
28
|
+
},
|
|
29
|
+
body: {
|
|
30
|
+
family: "Source Sans 3",
|
|
31
|
+
fallback: ["Helvetica Neue", "Helvetica", "Arial", "sans-serif"],
|
|
32
|
+
from: "tabloid body sans — dense, readable in narrow tabloid columns",
|
|
33
|
+
googleFont: "Source+Sans+3",
|
|
34
|
+
weights: [400, 600, 700],
|
|
35
|
+
},
|
|
36
|
+
mono: {
|
|
37
|
+
family: "JetBrains Mono",
|
|
38
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
39
|
+
from: "timestamps, comment counts, picture credits — newsroom wire-feed metadata",
|
|
40
|
+
googleFont: "JetBrains+Mono",
|
|
41
|
+
weights: [400, 700],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
typography: {
|
|
46
|
+
headingTracking: "-0.005em",
|
|
47
|
+
bodyTracking: "0",
|
|
48
|
+
fontFeatureSettings: '"tnum", "ss01"',
|
|
49
|
+
h1ScaleClamp: "clamp(3rem, 9vw, 7rem)", // screamer — tabloid front-page scale
|
|
50
|
+
bodyBaseSize: "0.9375rem", // 15px — tight tabloid column
|
|
51
|
+
bodyLineHeight: "1.45",
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
colors: {
|
|
55
|
+
background: { hsl: "40 12% 96%", from: "near-white tabloid newsprint — slightly warm" },
|
|
56
|
+
foreground: { hsl: "0 0% 8%", from: "tabloid ink — nearly pure black, screamer-ready" },
|
|
57
|
+
card: { hsl: "0 0% 100%", from: "white card — sits brighter than the newsprint" },
|
|
58
|
+
popover: { hsl: "0 0% 100%", from: "white popover" },
|
|
59
|
+
primary: { hsl: "0 82% 48%", from: "tabloid red — The Sun / NY Post masthead and kicker chip" },
|
|
60
|
+
primaryForeground: { hsl: "0 0% 100%", from: "white on red" },
|
|
61
|
+
secondary: { hsl: "0 0% 12%", from: "near-black secondary — for inverted bars and chips" },
|
|
62
|
+
secondaryForeground: { hsl: "40 12% 96%", from: "newsprint on black" },
|
|
63
|
+
muted: { hsl: "40 8% 90%", from: "muted newsprint — quiet panels in a loud page" },
|
|
64
|
+
mutedForeground: { hsl: "0 0% 32%", from: "slate ink — timestamps, comment counts" },
|
|
65
|
+
accent: { hsl: "48 100% 50%", from: "EXCLUSIVE-chip yellow — Daily Mail tag accent" },
|
|
66
|
+
accentForeground: { hsl: "0 0% 8%", from: "ink on yellow" },
|
|
67
|
+
border: { hsl: "0 0% 22%", from: "thick rule — tabloid uses heavy rules to organize the shout" },
|
|
68
|
+
input: { hsl: "0 0% 22%", from: "same as border" },
|
|
69
|
+
ring: { hsl: "0 82% 48%", from: "primary red, focus" },
|
|
70
|
+
destructive: { hsl: "0 82% 40%", from: "deeper red — alert" },
|
|
71
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on alert" },
|
|
72
|
+
brand: {
|
|
73
|
+
ink: { hsl: "0 0% 8%", from: "= foreground; tabloid ink" },
|
|
74
|
+
"tabloid-red": { hsl: "0 82% 48%", from: "= primary; the canonical tabloid red" },
|
|
75
|
+
"exclusive-yellow": { hsl: "48 100% 50%", from: "= accent; EXCLUSIVE/BREAKING chip" },
|
|
76
|
+
newsprint: { hsl: "40 12% 96%", from: "= background; near-white newsprint" },
|
|
77
|
+
"rule-heavy": { hsl: "0 0% 22%", from: "= border; thick organizing rule" },
|
|
78
|
+
"chip-fill": { hsl: "0 0% 8%", from: "black chip for SHOCK / SCOOP labels" },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
spacing: {
|
|
83
|
+
base: 4,
|
|
84
|
+
scale: [2, 4, 6, 8, 10, 12, 16, 20, 24, 32, 48, 64], // tight — high density
|
|
85
|
+
containerMax: "max-w-7xl", // wide — photo grids and headline towers need room
|
|
86
|
+
containerPadding: "px-4 lg:px-8",
|
|
87
|
+
sectionPadding: {
|
|
88
|
+
hero: "pt-10 pb-8 lg:pt-16 lg:pb-12",
|
|
89
|
+
default: "py-12 lg:py-16",
|
|
90
|
+
tight: "py-6 lg:py-10",
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
radius: {
|
|
95
|
+
base: "0", // sharp — no soft chips in tabloid
|
|
96
|
+
pillsAllowed: false,
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
shadows: {
|
|
100
|
+
style: "none",
|
|
101
|
+
utilities: {
|
|
102
|
+
"rule-heavy":
|
|
103
|
+
"0 2px 0 0 hsl(var(--ink))", // thick rule under section bars
|
|
104
|
+
"chip-shadow":
|
|
105
|
+
"2px 2px 0 0 hsl(var(--ink))", // crude offset shadow on EXCLUSIVE chips
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
motion: {
|
|
110
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
111
|
+
durations: {
|
|
112
|
+
reveal: 250, // snap — tabloid does not breathe
|
|
113
|
+
loop: 800, // flash chip
|
|
114
|
+
ambient: 20000,
|
|
115
|
+
},
|
|
116
|
+
keyframes: {
|
|
117
|
+
"snap-in": {
|
|
118
|
+
css:
|
|
119
|
+
"from { opacity: 0; transform: translateY(8px); }\n" +
|
|
120
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
121
|
+
defaultDuration: 250,
|
|
122
|
+
iteration: "once",
|
|
123
|
+
purpose: "section entrance — fast snap, no theatrical slow rise",
|
|
124
|
+
},
|
|
125
|
+
"chip-flash": {
|
|
126
|
+
css:
|
|
127
|
+
"0%, 100% { background-color: hsl(var(--tabloid-red)); color: hsl(0 0% 100%); }\n" +
|
|
128
|
+
"50% { background-color: hsl(var(--exclusive-yellow)); color: hsl(var(--ink)); }",
|
|
129
|
+
defaultDuration: 800,
|
|
130
|
+
iteration: "infinite",
|
|
131
|
+
purpose: "BREAKING/EXCLUSIVE chip color flash — used sparingly on top story only",
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
respectsReducedMotion: true,
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
density: "high",
|
|
138
|
+
|
|
139
|
+
patterns: {
|
|
140
|
+
button:
|
|
141
|
+
"Solid-fill in --tabloid-red with white text + heavy --ink border. Bold condensed display font, all-caps. " +
|
|
142
|
+
"Secondary buttons invert: --ink fill + white text. No ghost buttons — tabloid commits to fill.",
|
|
143
|
+
card:
|
|
144
|
+
"Thick 2px --ink border, no radius. Background is white or --newsprint. " +
|
|
145
|
+
"Headline in oversized Oswald, kicker chip in colored bar. Padding tight (p-3 lg:p-4).",
|
|
146
|
+
input:
|
|
147
|
+
"Full box with 2px --ink border. Bold sans label above in caps. Focus shifts border to --tabloid-red.",
|
|
148
|
+
cta:
|
|
149
|
+
"Filled rect in --tabloid-red or --ink. Heavy border. All-caps display font. Never a text-link CTA.",
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
details: {
|
|
153
|
+
selectionBg: "hsl(var(--exclusive-yellow) / 0.6)",
|
|
154
|
+
selectionFg: "hsl(var(--ink))",
|
|
155
|
+
focusRing: "2px solid hsl(var(--ring))",
|
|
156
|
+
scrollbarStyle: "auto",
|
|
157
|
+
},
|
|
158
|
+
};
|