@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,103 @@
|
|
|
1
|
+
# Design Direction — Podcast-Warm
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Overcast warm orange · Pocket Casts deep red · Castro deep teal-green · Goodpods community warmth · Snipd purple clip-cards
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Warm off-white canvas, generously rounded chrome, oversized artwork tiles in a subscribed-shows grid. Friendly secondary palette of teal-green and clip-card purple. The independent-listener counterpoint to Spotify's cold corporate dark — this surface feels like a curated shelf of shows, not a streaming dashboard. The page is a library, not a player.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Overcast** → warm orange accent with friendly system sans and soft cards. The independent-listener default.
|
|
11
|
+
- **Pocket Casts** → deep red action color with smooth animations and warm surfaces. Considered library-management UX.
|
|
12
|
+
- **Castro** → deep teal-green chrome with a friendly, library-shelf feel. Inbox-style queue.
|
|
13
|
+
- **Goodpods** → community-warm Plus Jakarta Sans, recommendation-led layout. Social discovery.
|
|
14
|
+
- **Snipd** → purple clip-cards and friendly AI-generated chapter chrome. Clip-as-share-unit.
|
|
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-cream** (background, HSL `32 30% 96%` — library-shelf cream) → **white card** (`0 0% 100%`) → **deeper cream** (secondary/muted). Depth comes from soft warm shadows on cards lifted above the cream canvas — the cards feel like physical tiles on a shelf.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--overcast-orange` (primary, the canonical play color), `--castro-teal` (accent, friendly secondary), `--pocketcasts-red` (subscribed/badge accent), `--snipd-purple` (clip-card chrome), `--goodpods-pink` (recommendation highlight), `--warm-cream`, `--shelf-brown`. Primary is `--overcast-orange` — used for all play affordances and the hero subscribe CTA.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Plus Jakarta Sans (Goodpods display). Friendly geometric humanist, soft terminals — podcast-app warm. Tracking `-0.015em`.
|
|
25
|
+
- **Body:** Inter (Overcast/Pocket Casts system-feel sans). Neutral, screen-comfortable for episode descriptions. Body base **16px** with **line-height 1.6**.
|
|
26
|
+
- **Mono:** JetBrains Mono. Episode runtimes, chapter timestamps, playback speed — tabular numerics.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 6vw, 4.5rem)` — friendly hero scale, not cinematic-large. Font features: `"ss01"`, `"cv11"`, `"tnum"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-5 lg:px-8` — wide enough for a four-column subscribed-shows grid but not as wide as music-streaming.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-20 pb-14 lg:pt-32 lg:pb-20`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128. No arbitrary spacing.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token. Pure white is reserved for `--card` only — the warm-cream canvas is the default page surface. Pure black is forbidden — `--shelf-brown` (warm brown-ink) replaces it.
|
|
40
|
+
|
|
41
|
+
**Overcast orange is the canonical play color.** Castro-teal is the friendly secondary used for "Subscribed" toggles, category chips, and hover accents — it is the only place teal-green appears. Pocket-casts-red is reserved for "Subscribed" badges and library-management accents — never a CTA color. Snipd-purple sits on clip-cards and AI-summary chrome only. Goodpods-pink is for recommendation-card highlights only.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 1rem`. **Generously rounded — the warm-chrome signal.** Pills are core (`pillsAllowed: true`): category chips, subscribe toggles, playback-speed selectors, search input all use `rounded-full`. Icon buttons use `1rem`. Cards use `1rem`. The rounding is the warm signal.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**Soft style.** Three utilities:
|
|
48
|
+
- `.tile-soft` — show-artwork tile lift; warm soft drop in `--shelf-brown` at low opacity, never colored
|
|
49
|
+
- `.tile-lift` — hover state; the tile rises with a deeper soft shadow
|
|
50
|
+
- `.subscribe-glow` — hero subscribe button warm glow in overcast-orange, single instance per page
|
|
51
|
+
|
|
52
|
+
Shadows are always warm (cast from `--shelf-brown` brown-ink), never neutral gray. This is the "tile on a wooden shelf" lighting model.
|
|
53
|
+
|
|
54
|
+
## Motion
|
|
55
|
+
Five keyframes, all friendly:
|
|
56
|
+
- `tile-rise` (500ms once) — show-tile entrance, staggered across grid, gentle rise
|
|
57
|
+
- `subscribe-pop` (400ms once) — subscribe-button click feedback, friendly pop, never on play/pause
|
|
58
|
+
- `play-bar-bounce` (1800ms infinite) — now-playing mini-bar gentle bounce, present but unobtrusive
|
|
59
|
+
- `chapter-progress` (1200ms once) — chapter-marker fill animation on episode-page chapter list
|
|
60
|
+
- `tile-shimmer` (2400ms infinite) — featured-show artwork shimmer overlay, used only on the hero featured tile
|
|
61
|
+
|
|
62
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — every motion utility wrapped in a media query.
|
|
63
|
+
|
|
64
|
+
## Component patterns
|
|
65
|
+
- **Buttons:** primary play action is a SOLID `rounded-full` overcast-orange button with white play glyph. Subscribe toggle is a pill: outlined Castro-teal when "Subscribe", filled when "Subscribed". Secondary controls (queue, share, download) are ghost icon buttons with 1rem radius. Tertiary text-link CTAs use `--shelf-brown` foreground with underline-on-hover.
|
|
66
|
+
- **Cards:** show-tile is the canonical card — square artwork at 1:1, generously rounded (1rem), with title and host below, lifted by `.tile-soft` shadow that grows to `.tile-lift` on hover. Episode cards use `bg-card` (white) on cream background, `p-5 lg:p-6`, with chapter-list inside when expanded. **No card uses cream fill** — cards always sit above the canvas in white.
|
|
67
|
+
- **Inputs:** pill-shape (`rounded-full`) input with `bg-card`, 1px `--border`, leading icon. Focus ring is 2px overcast-orange. Filter chips are `rounded-full` pills in `bg-secondary` with shelf-brown foreground; selected state shifts to castro-teal fill with white text.
|
|
68
|
+
- **CTA links:** hero subscribe / listen CTA is a solid overcast-orange pill with white label, wrapped in `subscribe-glow`. App Store / Play Store badges for cross-platform CTAs. Tertiary links are foreground with underline-on-hover — **never colored text-only**.
|
|
69
|
+
|
|
70
|
+
## Recommended rich media
|
|
71
|
+
Podcast-warm leans on **square show artwork** as the hero asset — the same way a podcast-app library shelf does. Cover art at 1:1 aspect with generous rounding sits everywhere from a 48×48 row thumbnail to a full hero feature tile.
|
|
72
|
+
|
|
73
|
+
Lead media is **square show artwork at 1:1 aspect, minimum 1400×1400 source** (the iTunes/Apple Podcasts spec) displayed at any size. Behind a hero featured show, a subtle blurred-and-warmed copy of the artwork can sit as backdrop — but lighter and softer than the music-streaming equivalent. Host photography is appropriate as a secondary asset on show-detail pages; use **4:5 portrait** with warm color grading.
|
|
74
|
+
|
|
75
|
+
**AI tool recommendations:** for placeholder show artwork, **Midjourney** with prompts like *"square podcast cover art, [topic] aesthetic, friendly geometric illustration, warm palette, rounded shapes"* — explicitly avoid microphone or headphone clichés. **Flux** for friendly editorial illustrations of hosts or topics. **Recraft** for spot illustrations in show-notes and chapter summaries.
|
|
76
|
+
|
|
77
|
+
**Aspect ratios:** 1:1 square for show artwork (canonical, matches all podcast directories). 4:5 portrait for host photography. 16:9 for video-podcast trailers only. Never 21:9 (cinematic, wrong feel).
|
|
78
|
+
|
|
79
|
+
**Video:** video podcasts are user-initiated only, never autoplay. Embedded player uses the same warm chrome with overcast-orange play button. Trailers and clips (Snipd-style) get the purple clip-card treatment with `--snipd-purple` accent.
|
|
80
|
+
|
|
81
|
+
**Chapter art:** when episodes have per-chapter artwork, show it at 1:1 with the same `tile-soft` shadow language. Chapter progress bars use `chapter-progress` keyframe with `--overcast-orange` fill.
|
|
82
|
+
|
|
83
|
+
**Clip cards:** Snipd-style highlighted-quote cards use `--snipd-purple` border-left rule, white card body, mono timestamp, and shelf-brown quote text. Treat them as a distinct card variant — never mix with regular episode chrome.
|
|
84
|
+
|
|
85
|
+
**Performance:** show artwork thumbnails ≤30 KB AVIF at 600w; hero tiles ≤120 KB at 1400w. Blurhash placeholders during load — `tile-rise` covers the transition. LCP under 2s with hero featured tile.
|
|
86
|
+
|
|
87
|
+
**Avoid:** generic microphone/headphone stock photography (every podcast app uses this — it's the laziest possible visual), dark moody host photography (cinematic territory), gradient backgrounds (soft-modern territory), glassmorphic player chrome, AI-generated hosts with uncanny faces, lens flare, decorative SVG ornament beyond the warm rounded chrome.
|
|
88
|
+
|
|
89
|
+
**Accessibility:** show artwork always has alt-text in *"[Show name] cover art"* format. Subscribed-state toggle has `aria-pressed` reflecting state. Chapter list is a proper `<ol>` with timestamps as `<time>` elements. Play-bar bounce animation has `aria-hidden="true"`.
|
|
90
|
+
|
|
91
|
+
## Component families
|
|
92
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. Expected first families: `ShowTile`, `EpisodeCard`, `SubscribeButton`, `ChapterList`, `ClipCard`.
|
|
93
|
+
|
|
94
|
+
## Details
|
|
95
|
+
- **Selection:** `hsl(var(--overcast-orange) / 0.28)` background, foreground text.
|
|
96
|
+
- **Focus ring:** `2px solid hsl(var(--overcast-orange))`. Matches primary play action.
|
|
97
|
+
- **Scrollbar:** thin.
|
|
98
|
+
|
|
99
|
+
## Exceptions
|
|
100
|
+
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.
|
|
101
|
+
|
|
102
|
+
## Revisions
|
|
103
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const podcastWarm: Direction = {
|
|
4
|
+
name: "podcast-warm",
|
|
5
|
+
ethos:
|
|
6
|
+
"Overcast warm orange · Pocket Casts deep red · Castro deep teal-green · Goodpods community warmth · Snipd purple clip-cards",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Overcast", trait: "warm orange accent with friendly system sans and soft cards" },
|
|
9
|
+
{ brand: "Pocket Casts", trait: "deep red action color with smooth animations and warm surfaces" },
|
|
10
|
+
{ brand: "Castro", trait: "deep teal-green chrome with a friendly, library-shelf feel" },
|
|
11
|
+
{ brand: "Goodpods", trait: "community-warm Plus Jakarta Sans, recommendation-led layout" },
|
|
12
|
+
{ brand: "Snipd", trait: "purple clip-cards and friendly AI-generated chapter chrome" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Warm off-white canvas, generously rounded chrome, oversized artwork tiles in a subscribed-shows " +
|
|
16
|
+
"grid. Friendly secondary palette of teal-green and clip-card purple. The independent-listener counterpoint " +
|
|
17
|
+
"to Spotify's cold corporate dark — this surface feels like a curated shelf of shows, not a streaming dashboard.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Plus Jakarta Sans",
|
|
22
|
+
fallback: ["Manrope", "Inter", "system-ui", "-apple-system", "sans-serif"],
|
|
23
|
+
from: "Goodpods display sans — friendly geometric humanist, soft terminals, podcast-app warm",
|
|
24
|
+
googleFont: "Plus+Jakarta+Sans",
|
|
25
|
+
weights: [500, 600, 700, 800],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
30
|
+
from: "Overcast/Pocket Casts system-feel sans — neutral, screen-comfortable for episode descriptions",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500, 600],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "episode runtimes, chapter timestamps, playback speed — tabular numerics",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.015em",
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"ss01", "cv11", "tnum"',
|
|
47
|
+
h1ScaleClamp: "clamp(2.25rem, 6vw, 4.5rem)", // friendly hero scale — not cinematic-large
|
|
48
|
+
bodyBaseSize: "1rem", // 16px — episode description comfort
|
|
49
|
+
bodyLineHeight: "1.6",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "32 30% 96%", from: "warm off-white canvas — Overcast paper, library-shelf cream" },
|
|
54
|
+
foreground: { hsl: "24 20% 16%", from: "warm dark brown-ink — never pure black on warm cream" },
|
|
55
|
+
card: { hsl: "0 0% 100%", from: "show-tile and episode card — pure white on cream, friendly lift" },
|
|
56
|
+
popover: { hsl: "0 0% 100%", from: "menu and tooltip surface — same as card with stronger shadow" },
|
|
57
|
+
primary: { hsl: "18 88% 56%", from: "Overcast warm orange — the canonical 'Play' action across the player" },
|
|
58
|
+
primaryForeground: { hsl: "0 0% 100%", from: "white on Overcast orange" },
|
|
59
|
+
secondary: { hsl: "32 24% 92%", from: "deeper warm cream — quiet panels inside friendly pages" },
|
|
60
|
+
secondaryForeground: { hsl: "24 20% 16%", from: "brown-ink on deeper cream" },
|
|
61
|
+
muted: { hsl: "32 20% 90%", from: "muted surface — playlist row hover, soft dividers" },
|
|
62
|
+
mutedForeground: { hsl: "24 12% 42%", from: "episode-meta secondary text — duration, dateline, host name" },
|
|
63
|
+
accent: { hsl: "168 52% 38%", from: "Castro teal-green hover/selection accent — the warm secondary" },
|
|
64
|
+
accentForeground: { hsl: "0 0% 100%", from: "white on Castro teal-green" },
|
|
65
|
+
border: { hsl: "32 18% 84%", from: "soft warm border — softer than editorial hairline, friendlier" },
|
|
66
|
+
input: { hsl: "32 18% 84%", from: "same as border — input chrome uses the soft border language" },
|
|
67
|
+
ring: { hsl: "18 88% 56%", from: "Overcast orange focus ring — matches primary play action" },
|
|
68
|
+
destructive: { hsl: "356 70% 50%", from: "remove-from-queue red — distinct from Pocket Casts brand red below" },
|
|
69
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on destructive red" },
|
|
70
|
+
brand: {
|
|
71
|
+
"overcast-orange": { hsl: "18 88% 56%", from: "= primary; Overcast warm orange, canonical play color" },
|
|
72
|
+
"pocketcasts-red": { hsl: "356 78% 52%", from: "Pocket Casts deep red — secondary brand accent for 'Subscribed' badges" },
|
|
73
|
+
"castro-teal": { hsl: "168 52% 38%", from: "= accent; Castro deep teal-green, friendly category color" },
|
|
74
|
+
"snipd-purple": { hsl: "266 70% 60%", from: "Snipd clip-card purple — used on chapter clips and AI-summary chrome" },
|
|
75
|
+
"goodpods-pink": { hsl: "338 75% 65%", from: "Goodpods community pink — recommendation-card highlight" },
|
|
76
|
+
"warm-cream": { hsl: "32 30% 96%", from: "= background; warm off-white canvas, also a semantic token" },
|
|
77
|
+
"shelf-brown": { hsl: "24 20% 16%", from: "= foreground; warm brown-ink, also semantic for library-shelf chrome" },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
spacing: {
|
|
82
|
+
base: 4,
|
|
83
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128], // medium — friendly breathing, room for cards
|
|
84
|
+
containerMax: "max-w-6xl",
|
|
85
|
+
containerPadding: "px-5 lg:px-8",
|
|
86
|
+
sectionPadding: {
|
|
87
|
+
hero: "pt-20 pb-14 lg:pt-32 lg:pb-20",
|
|
88
|
+
default: "py-16 lg:py-24",
|
|
89
|
+
tight: "py-10 lg:py-14",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
radius: {
|
|
94
|
+
base: "1rem", // generously rounded — the warm-chrome signal
|
|
95
|
+
pillsAllowed: true, // pills are core: category chips, subscribe toggles, play-speed selectors
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
shadows: {
|
|
99
|
+
style: "soft",
|
|
100
|
+
utilities: {
|
|
101
|
+
"tile-soft":
|
|
102
|
+
"0 1px 2px hsl(24 20% 16% / 0.06), " +
|
|
103
|
+
"0 8px 24px hsl(24 20% 16% / 0.08)", // show-artwork tile lift — warm, soft, never glossy
|
|
104
|
+
"tile-lift":
|
|
105
|
+
"0 4px 8px hsl(24 20% 16% / 0.08), " +
|
|
106
|
+
"0 16px 40px hsl(24 20% 16% / 0.12)", // hover state — the tile rises on hover
|
|
107
|
+
"subscribe-glow":
|
|
108
|
+
"0 0 0 2px hsl(var(--overcast-orange) / 0.25), " +
|
|
109
|
+
"0 8px 24px hsl(var(--overcast-orange) / 0.2)", // hero subscribe button warm glow
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
motion: {
|
|
114
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
115
|
+
durations: {
|
|
116
|
+
reveal: 500, // friendly, immediate — not slow-editorial, not snap-app
|
|
117
|
+
loop: 1800, // play-bar bounce, chapter-progress pulse
|
|
118
|
+
ambient: 8000, // slow tile-shimmer on featured shows
|
|
119
|
+
},
|
|
120
|
+
keyframes: {
|
|
121
|
+
"tile-rise": {
|
|
122
|
+
css:
|
|
123
|
+
"from { opacity: 0; transform: translateY(16px); }\n" +
|
|
124
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
125
|
+
defaultDuration: 500,
|
|
126
|
+
iteration: "once",
|
|
127
|
+
purpose: "show-tile entrance — staggered across grid, gentle rise",
|
|
128
|
+
},
|
|
129
|
+
"subscribe-pop": {
|
|
130
|
+
css:
|
|
131
|
+
"0% { transform: scale(1); }\n" +
|
|
132
|
+
"40% { transform: scale(1.08); }\n" +
|
|
133
|
+
"100% { transform: scale(1); }",
|
|
134
|
+
defaultDuration: 400,
|
|
135
|
+
iteration: "once",
|
|
136
|
+
purpose: "subscribe-button click feedback — friendly pop, never on play/pause",
|
|
137
|
+
},
|
|
138
|
+
"play-bar-bounce": {
|
|
139
|
+
css:
|
|
140
|
+
"0%, 100% { transform: translateY(0); }\n" +
|
|
141
|
+
"50% { transform: translateY(-4px); }",
|
|
142
|
+
defaultDuration: 1800,
|
|
143
|
+
iteration: "infinite",
|
|
144
|
+
purpose: "now-playing mini-bar gentle bounce — present but unobtrusive",
|
|
145
|
+
},
|
|
146
|
+
"chapter-progress": {
|
|
147
|
+
css:
|
|
148
|
+
"from { transform: scaleX(0); }\n" +
|
|
149
|
+
"to { transform: scaleX(1); }",
|
|
150
|
+
defaultDuration: 1200,
|
|
151
|
+
iteration: "once",
|
|
152
|
+
purpose: "chapter-marker fill animation on episode-page chapter list",
|
|
153
|
+
},
|
|
154
|
+
"tile-shimmer": {
|
|
155
|
+
css:
|
|
156
|
+
"0% { background-position: -150% 0; }\n" +
|
|
157
|
+
"100% { background-position: 150% 0; }",
|
|
158
|
+
defaultDuration: 2400,
|
|
159
|
+
iteration: "infinite",
|
|
160
|
+
purpose: "featured-show artwork shimmer overlay — used only on the hero featured tile",
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
respectsReducedMotion: true,
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
density: "medium",
|
|
167
|
+
|
|
168
|
+
patterns: {
|
|
169
|
+
button:
|
|
170
|
+
"Primary play action is a SOLID rounded-full overcast-orange button with white play glyph. " +
|
|
171
|
+
"Subscribe toggle is a pill: outlined Castro-teal when 'subscribe', filled when 'subscribed'. " +
|
|
172
|
+
"Secondary controls (queue, share, download) are ghost icon buttons with 1rem radius. " +
|
|
173
|
+
"Tertiary text-link CTAs use shelf-brown foreground with underline-on-hover.",
|
|
174
|
+
card:
|
|
175
|
+
"Show-tile is the canonical card — square artwork at 1:1, generously rounded (1rem), with title and host below, lifted by .tile-soft shadow that grows to .tile-lift on hover. " +
|
|
176
|
+
"Episode cards use bg-card (white) on cream background, p-5 lg:p-6, with chapter-list inside when expanded. " +
|
|
177
|
+
"No card uses cream fill — cards always sit above the canvas in white.",
|
|
178
|
+
input:
|
|
179
|
+
"Pill-shape (rounded-full) input with bg-card, 1px --border, leading icon. " +
|
|
180
|
+
"Focus ring is 2px overcast-orange. Filter chips are rounded-full pills in bg-secondary with shelf-brown foreground; selected state shifts to castro-teal fill with white text.",
|
|
181
|
+
cta:
|
|
182
|
+
"Hero subscribe / listen CTA is a solid overcast-orange pill with white label, wrapped in subscribe-glow utility. " +
|
|
183
|
+
"App Store / Play Store badges for cross-platform CTAs. Tertiary links are foreground with underline-on-hover — never colored text-only.",
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
details: {
|
|
187
|
+
selectionBg: "hsl(var(--overcast-orange) / 0.28)",
|
|
188
|
+
selectionFg: "hsl(var(--foreground))",
|
|
189
|
+
focusRing: "2px solid hsl(var(--overcast-orange))",
|
|
190
|
+
scrollbarStyle: "thin",
|
|
191
|
+
},
|
|
192
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Design Direction — Publisher-Indie
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Coffee House Press structured catalogue · Graywolf serif gravity · New Directions modernist pedigree · Tin House quarterly discipline · Two Dollar Radio small-press risk
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
An independent literary publisher's spring catalogue. Deep cream paper, Source Serif throughout, forthcoming-titles listed with ISBN and pub-date the way a trade catalogue does. Color is almost absent — a single ink-navy used for series markers. Author headshots are tight black-and-white portraits, never marketing shots. The page reads with literary-fiction gravity, not bookstore warmth and not museum austerity — somewhere between.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Coffee House Press** → structured catalogue list. Deep cream. Source Serif.
|
|
11
|
+
- **Graywolf Press** → literary-fiction gravity, formal serif, ISBN-forward.
|
|
12
|
+
- **New Directions** → modernist pedigree, numbered series, restrained color.
|
|
13
|
+
- **Tin House** → quarterly publishing rhythm, masthead-style author bios.
|
|
14
|
+
- **Two Dollar Radio** → small-press risk, hand-set catalogue feel.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
Surface stack is **catalogue cream** (background) → **lighter cream** (card) → **deeper cream** (secondary/muted/accent). Hairline borders are warm gray (slightly cream-biased, never neutral). Brand tokens: `--ink`, `--cream`, `--ink-navy`, `--oxblood`.
|
|
18
|
+
|
|
19
|
+
Primary is `--ink-navy`. Reserved for series markers, focus ring, and the single 'Subscribe' CTA. Oxblood is reserved for the fiction-genre tag — never elsewhere.
|
|
20
|
+
|
|
21
|
+
## Typography
|
|
22
|
+
- **Display:** Source Serif Pro (Graywolf / Coffee House catalogue serif). h1–h4.
|
|
23
|
+
- **Body:** Source Serif Pro — single-family discipline. Body 17px / 1.68.
|
|
24
|
+
- **Mono:** IBM Plex Mono. ISBN, pub-date, trim size — trade-catalogue mono.
|
|
25
|
+
|
|
26
|
+
H1 uses `clamp(2.25rem, 5vw, 4.25rem)`. Forthcoming titles use the display serif italic at body+1 — like a catalogue subhead.
|
|
27
|
+
|
|
28
|
+
## Spacing
|
|
29
|
+
- **Container:** `max-w-5xl px-6 lg:px-12` — catalogue spread width.
|
|
30
|
+
- **Sections:** hero `pt-24 pb-16 lg:pt-40 lg:pb-24`; default `py-20 lg:py-28`; tight `py-12 lg:py-18`.
|
|
31
|
+
- **Scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128.
|
|
32
|
+
|
|
33
|
+
## Color
|
|
34
|
+
No hex. Tokens only. Ink-navy is the only color used as fill (Subscribe button); everywhere else it's a hover state or a series-marker accent. Oxblood is reserved for the fiction-genre tag only. Cream and ink dominate every surface.
|
|
35
|
+
|
|
36
|
+
## Radius
|
|
37
|
+
`--radius: 0`. Sharp corners — catalogue pages are sharp. Pills disallowed.
|
|
38
|
+
|
|
39
|
+
## Shadows
|
|
40
|
+
**Minimal.** Two utilities: `.hairline-bottom` and `.catalogue-rule` (rules above + below for a listing row).
|
|
41
|
+
|
|
42
|
+
## Motion
|
|
43
|
+
Single keyframe: `fade-rise` (opacity + 20px translate, 1100ms). Print-publication settle. `prefers-reduced-motion` honored.
|
|
44
|
+
|
|
45
|
+
## Component patterns
|
|
46
|
+
- **Buttons:** text-link CTAs with ink-navy on hover. 'Subscribe' is the single solid-fill — ink-navy bg + cream text.
|
|
47
|
+
- **Cards:** hairline rules top + bottom, no fill differentiation. Padding `p-7 lg:p-10`. Title in display serif italic; author in roman; metadata in mono.
|
|
48
|
+
- **Inputs:** border-bottom only (1px ink). Label above in mono uppercase.
|
|
49
|
+
- **CTA links:** ink → ink-navy on hover. Never a chip, never a gradient.
|
|
50
|
+
|
|
51
|
+
## Recommended rich media
|
|
52
|
+
Author portraits, black-and-white, tight crops — the way a publisher's catalogue shoots its authors. Environmental but not lifestyle: writer at a desk, on a porch, in a library. Never red-carpet, never event-PR. Cover plates are flat scans on cream paper, the way trade catalogues print them. Never 3D book mockups, never floating-cover renders.
|
|
53
|
+
|
|
54
|
+
**AI tool recommendations:** **Midjourney / Flux** for portraits: *"black-and-white author portrait, environmental, soft window light, 50mm, Tri-X grain"*. For covers: *"book cover photographed flat on cream paper, neutral overhead lighting"*. Avoid AI gradients and "book stack" hero compositions.
|
|
55
|
+
|
|
56
|
+
**Aspect ratios:** 4:5 portrait (author convention), 2:3 (cover convention). Never 16:9.
|
|
57
|
+
|
|
58
|
+
**Captions** in mono. Format: *"Author Name · Forthcoming Title (Spring 2026) · ISBN 978-x-xxxxxx-xx-x"*.
|
|
59
|
+
|
|
60
|
+
**Avoid:** marketing-style author shots, 3D book renders, gradients, decorative SVG, lifestyle stock.
|
|
61
|
+
|
|
62
|
+
**Accessibility:** alt-text describes the portrait and the work — *"Black-and-white portrait: Catherine Lacey at her writing desk, facing window light."*
|
|
63
|
+
|
|
64
|
+
## Component families
|
|
65
|
+
- `ForthcomingTitle` family — list row with date + title + author + genre tag + ISBN.
|
|
66
|
+
- `AuthorBio` family — portrait + name + recent title + 2-sentence bio.
|
|
67
|
+
- `Subscription` family — tier card (NYRB-Subscription style, never SaaS pricing pillars).
|
|
68
|
+
|
|
69
|
+
## Details
|
|
70
|
+
- **Selection:** `hsl(var(--primary) / 0.18)` — ink-navy wash.
|
|
71
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`.
|
|
72
|
+
- **Scrollbar:** thin.
|
|
73
|
+
|
|
74
|
+
## Exceptions
|
|
75
|
+
None yet.
|
|
76
|
+
|
|
77
|
+
## Revisions
|
|
78
|
+
- Initial direction.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const publisherIndie: Direction = {
|
|
4
|
+
name: "publisher-indie" as Direction["name"],
|
|
5
|
+
ethos:
|
|
6
|
+
"Coffee House Press structured catalogue · Graywolf serif gravity · New Directions modernist pedigree · Tin House quarterly discipline · Two Dollar Radio risk",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Coffee House Press", trait: "structured catalogue list, deep cream, Source Serif" },
|
|
9
|
+
{ brand: "Graywolf Press", trait: "literary-fiction gravity, formal serif, ISBN-forward listing" },
|
|
10
|
+
{ brand: "New Directions", trait: "modernist pedigree, numbered series, restrained color" },
|
|
11
|
+
{ brand: "Tin House", trait: "quarterly publishing rhythm, masthead-style author bios" },
|
|
12
|
+
{ brand: "Two Dollar Radio", trait: "small-press risk, hand-set catalogue feel" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"An independent literary publisher's spring catalogue. Deep cream paper, Source Serif throughout, " +
|
|
16
|
+
"forthcoming-titles listed with ISBN and pub-date the way a trade catalogue does. " +
|
|
17
|
+
"Color is almost absent — a single ink-navy used for series markers. Author headshots are tight " +
|
|
18
|
+
"black-and-white portraits, never marketing shots.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Source Serif Pro",
|
|
23
|
+
fallback: ["Source Serif 4", "Cormorant Garamond", "Georgia", "serif"],
|
|
24
|
+
from: "Graywolf / Coffee House catalogue serif — modern transitional, readable at small sizes",
|
|
25
|
+
googleFont: "Source+Serif+Pro",
|
|
26
|
+
weights: [400, 600, 700],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Source Serif Pro",
|
|
30
|
+
fallback: ["Source Serif 4", "Cormorant Garamond", "Georgia", "serif"],
|
|
31
|
+
from: "single-family discipline — body in the same serif, smaller, lighter",
|
|
32
|
+
googleFont: "Source+Serif+Pro",
|
|
33
|
+
weights: [400, 600],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "IBM Plex Mono",
|
|
37
|
+
fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "ISBN, pub-date, trim size — trade-catalogue mono, slightly warmer than JetBrains",
|
|
39
|
+
googleFont: "IBM+Plex+Mono",
|
|
40
|
+
weights: [400, 500],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.012em",
|
|
46
|
+
bodyTracking: "0",
|
|
47
|
+
fontFeatureSettings: '"tnum", "calt", "kern"',
|
|
48
|
+
h1ScaleClamp: "clamp(2.25rem, 5vw, 4.25rem)",
|
|
49
|
+
bodyBaseSize: "1.0625rem",
|
|
50
|
+
bodyLineHeight: "1.68",
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "36 28% 92%", from: "deep cream catalogue stock — Coffee House / Graywolf" },
|
|
55
|
+
foreground: { hsl: "220 22% 14%", from: "ink-navy black — printer's ink, never pure" },
|
|
56
|
+
card: { hsl: "36 32% 95%", from: "lighter cream — book-listing surface" },
|
|
57
|
+
popover: { hsl: "36 32% 95%", from: "matches card" },
|
|
58
|
+
primary: { hsl: "220 50% 28%", from: "series-marker ink-navy — New Directions numbered-series feel" },
|
|
59
|
+
primaryForeground: { hsl: "36 28% 92%", from: "cream on ink-navy" },
|
|
60
|
+
secondary: { hsl: "36 22% 87%", from: "deeper cream — catalogue divider, masthead row" },
|
|
61
|
+
secondaryForeground: { hsl: "220 22% 14%", from: "ink on deeper cream" },
|
|
62
|
+
muted: { hsl: "36 22% 87%", from: "same as secondary" },
|
|
63
|
+
mutedForeground: { hsl: "220 12% 38%", from: "trade-catalogue gray — pub-dates, ISBNs" },
|
|
64
|
+
accent: { hsl: "36 20% 84%", from: "hover surface — cream deeper still" },
|
|
65
|
+
accentForeground: { hsl: "220 22% 14%", from: "ink on hover" },
|
|
66
|
+
border: { hsl: "30 12% 76%", from: "catalogue-page hairline, slightly warmer than gray" },
|
|
67
|
+
input: { hsl: "30 12% 76%", from: "same as border" },
|
|
68
|
+
ring: { hsl: "220 50% 28%", from: "ink-navy — focus" },
|
|
69
|
+
destructive: { hsl: "8 60% 42%", from: "out-of-print indicator" },
|
|
70
|
+
destructiveForeground: { hsl: "36 28% 92%", from: "cream on destructive" },
|
|
71
|
+
brand: {
|
|
72
|
+
ink: { hsl: "220 22% 14%", from: "printer's ink — semantic foreground" },
|
|
73
|
+
cream: { hsl: "36 28% 92%", from: "catalogue cream — semantic background" },
|
|
74
|
+
"ink-navy": { hsl: "220 50% 28%", from: "series-marker navy — also semantic primary" },
|
|
75
|
+
oxblood: { hsl: "0 45% 28%", from: "fiction-mark oxblood, used for fiction genre tag only" },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
spacing: {
|
|
80
|
+
base: 4,
|
|
81
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
|
|
82
|
+
containerMax: "max-w-5xl",
|
|
83
|
+
containerPadding: "px-6 lg:px-12",
|
|
84
|
+
sectionPadding: {
|
|
85
|
+
hero: "pt-24 pb-16 lg:pt-40 lg:pb-24",
|
|
86
|
+
default: "py-20 lg:py-28",
|
|
87
|
+
tight: "py-12 lg:py-18",
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
radius: {
|
|
92
|
+
base: "0",
|
|
93
|
+
pillsAllowed: false,
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
shadows: {
|
|
97
|
+
style: "minimal",
|
|
98
|
+
utilities: {
|
|
99
|
+
"hairline-bottom":
|
|
100
|
+
"0 1px 0 0 hsl(var(--border))",
|
|
101
|
+
"catalogue-rule":
|
|
102
|
+
"0 1px 0 0 hsl(var(--border)), inset 0 1px 0 0 hsl(var(--border))",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
motion: {
|
|
107
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
108
|
+
durations: {
|
|
109
|
+
reveal: 1100,
|
|
110
|
+
loop: 4000,
|
|
111
|
+
ambient: 30000,
|
|
112
|
+
},
|
|
113
|
+
keyframes: {
|
|
114
|
+
"fade-rise": {
|
|
115
|
+
css:
|
|
116
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
117
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
118
|
+
defaultDuration: 1100,
|
|
119
|
+
iteration: "once",
|
|
120
|
+
purpose: "catalogue section entrance — print-publication settle",
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
respectsReducedMotion: true,
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
density: "medium",
|
|
127
|
+
|
|
128
|
+
patterns: {
|
|
129
|
+
button:
|
|
130
|
+
"Text-link CTAs with ink-navy on hover; 'Subscribe' is the single solid-fill — ink-navy bg + cream text. " +
|
|
131
|
+
"Pills disallowed — catalogue listings are rectangular.",
|
|
132
|
+
card:
|
|
133
|
+
"Hairline rules top + bottom, no fill differentiation from page. Padding p-7 lg:p-10. " +
|
|
134
|
+
"Title in display serif italic; author in display serif roman; metadata (ISBN, pub-date) in mono.",
|
|
135
|
+
input:
|
|
136
|
+
"Border-bottom only (1px ink). Label above in mono uppercase, small.",
|
|
137
|
+
cta:
|
|
138
|
+
"Text-link with ink, hover transitions to ink-navy. Never a chip. " +
|
|
139
|
+
"'Subscribe' is the single exception — solid ink-navy rectangle with cream text.",
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
details: {
|
|
143
|
+
selectionBg: "hsl(var(--primary) / 0.18)",
|
|
144
|
+
selectionFg: "hsl(var(--foreground))",
|
|
145
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
146
|
+
scrollbarStyle: "thin",
|
|
147
|
+
},
|
|
148
|
+
};
|