@stylecrib/cli 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1606 -467
- package/package.json +12 -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/THEME.md +125 -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/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/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -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/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/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/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/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/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/THEME.md +167 -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/THEME.md +144 -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/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/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -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/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/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -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/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/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/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/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/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/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/THEME.md +167 -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/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,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
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Raw-Concrete — 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
|
+
> This theme is intentionally the LEAST polished theme in the library.
|
|
8
|
+
> Its whole register is refusing polish. That means several rules in
|
|
9
|
+
> the SLOP-BLOCKLIST are the OPPOSITE of what other themes forbid — do
|
|
10
|
+
> NOT smooth this one into a modern SaaS composition.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## MANDATORY BUILD DIRECTIVE — you MUST
|
|
15
|
+
|
|
16
|
+
1. **Radius 0 everywhere.** No `borderRadius: 4`, no `12`, no `999`,
|
|
17
|
+
no pill CTAs. Every button, every card, every input is a square.
|
|
18
|
+
The palette picker corners are `borderRadius: 0` too.
|
|
19
|
+
2. **Box-shadow `none` everywhere.** Every card, every button, every
|
|
20
|
+
div. Depth is suggested by 1px `#C0C0C0` hairline borders, nothing
|
|
21
|
+
else.
|
|
22
|
+
3. **Monospace family throughout the body.** `Berkeley Mono`,
|
|
23
|
+
`JetBrains Mono`, `Menlo` — one family. Body copy in mono at 14px
|
|
24
|
+
line-height 1.5. Headings in mono at slightly larger sizes but same
|
|
25
|
+
family. No display sans, no display serif.
|
|
26
|
+
4. **Native `#0000EE` link color** on light canvas, `#8CB4FF` on dark.
|
|
27
|
+
Never override link color to match the palette accent. That IS the
|
|
28
|
+
theme's brand register.
|
|
29
|
+
5. **Native `#551A8B` visited-link color** (dark canvas: `#D0ADF0`).
|
|
30
|
+
Users must be able to tell what they've already read.
|
|
31
|
+
6. **Section numbers as `[01]`, `[02]`, `[03]`.** Every h2 opens with a
|
|
32
|
+
square-bracketed section number. This is the arxiv-preprint tell.
|
|
33
|
+
7. **All images have visible captions** with `<figcaption>` in the
|
|
34
|
+
format `**fig. N.** <sentence>`. Never a photo without a caption.
|
|
35
|
+
This is the arxiv-figure register.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## SLOP-BLOCKLIST — you MUST NOT
|
|
40
|
+
|
|
41
|
+
- **ANY border-radius > 0.** Pills, rounded cards, rounded buttons, all
|
|
42
|
+
banned. Fingerprint: `borderRadius: [1-9]` anywhere in the section.
|
|
43
|
+
- **ANY box-shadow.** Fingerprint: `boxShadow:` with a non-`none`
|
|
44
|
+
value. No drop shadow, no glow, no elevation.
|
|
45
|
+
- **ANY `transition:` on hover states.** Native links, native focus
|
|
46
|
+
rings, browser defaults only.
|
|
47
|
+
- **Sans-serif or serif display fonts.** No Inter, no Fraunces, no
|
|
48
|
+
Bricolage. Monospace only.
|
|
49
|
+
- **Override of the native link color.** The palette variant swaps
|
|
50
|
+
the LINK hue (that IS the theme's palette), but the CSS property
|
|
51
|
+
is always native link color, never a custom accent bg on a
|
|
52
|
+
span-as-link.
|
|
53
|
+
- **Underline REMOVAL from links.** Every link stays underlined.
|
|
54
|
+
- **Cycling headline words** or auto-advancing content.
|
|
55
|
+
- **Purple/indigo/pink gradient backgrounds.** No gradients at all.
|
|
56
|
+
- **CSS `filter:` treatments** on photos (no `brightness()`,
|
|
57
|
+
`contrast()`, `saturate()`). Photos rendered raw.
|
|
58
|
+
- **Section-numbered content presented as marketing feature cards.**
|
|
59
|
+
Section `[01] Recent posts` is a numbered LIST, not a card grid.
|
|
60
|
+
- **Roman-numeral copyright** (`MMXXVI`). Native `©` + Arabic year.
|
|
61
|
+
- **Attribution of influence in visible copy** — vitalik.eth.limo,
|
|
62
|
+
arxiv.org, brutalistwebsites.com are studied but NEVER NAMED in
|
|
63
|
+
slug, copy, or UI.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## CHROME INVENTORY — the allow-list
|
|
68
|
+
|
|
69
|
+
- **Sticky picker strip in native-link register** — canvas + link-color
|
|
70
|
+
pickers as underlined `[dark]` / `[light]` and `[default]` / `[kelp]`
|
|
71
|
+
bracket-prefixed links. NO button chrome. Body font (monospace).
|
|
72
|
+
- **Table-based masthead nav** — `<table>` with 1px borderCollapse.
|
|
73
|
+
Left cell: `raw-concrete.txt` in bold. Right cell: 5-6 nav items as
|
|
74
|
+
underlined links separated by ` · `.
|
|
75
|
+
- **Document masthead / [00] hero** — H1 in mono at 28px, weight 500;
|
|
76
|
+
1-3 paragraphs of body prose with inline underlined links; maintained
|
|
77
|
+
by / last-modified / content-type meta line (content-level `·` is
|
|
78
|
+
allowed here — it's arxiv-native).
|
|
79
|
+
- **[N] Section headings** — h2 in mono at 18px, weight 500, prefixed
|
|
80
|
+
with `[01]`, `[02]`, etc. 1px underline via `borderBottom`.
|
|
81
|
+
- **Numbered `<ol>` post lists** — indent 24px, mono body 14px.
|
|
82
|
+
- **`<figure>` with photo + `<figcaption>`** — 1px black border on
|
|
83
|
+
image, caption below in mono 12px starting with `**fig. N.**`.
|
|
84
|
+
- **`<table>` for spec + archive** — `borderCollapse: collapse`, 1px
|
|
85
|
+
border on every cell, mono 13px content, no zebra striping.
|
|
86
|
+
- **`<blockquote>` for manifesto** — 3px left border, mono body 14px
|
|
87
|
+
in `normal` (not italic).
|
|
88
|
+
- **Native `<input type="email">` + `<button>` for the subscribe
|
|
89
|
+
section.** No custom styling beyond 1px black border, radius 0.
|
|
90
|
+
- **`©` copyright line in mono 12px.** No trademark ornaments.
|
|
91
|
+
- **Palette picker labels use body font (monospace), sentence-case,
|
|
92
|
+
no textTransform.**
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## SIGNATURE MOVES — verbs, not adjectives
|
|
97
|
+
|
|
98
|
+
- **Number every section with `[NN]` in square brackets.** This is
|
|
99
|
+
the arxiv-preprint tell. The reader should feel they're reading a
|
|
100
|
+
document, not browsing an app.
|
|
101
|
+
- **Set every link in `#0000EE` on cream** (or `#8CB4FF` on dark).
|
|
102
|
+
Visited links go `#551A8B`. Users must be able to tell what they've
|
|
103
|
+
already read. This is the ONE color that varies per palette.
|
|
104
|
+
- **Wrap every image in `<figure>` with a `<figcaption>` starting
|
|
105
|
+
`fig. N.`** — never a bare `<img>`. If the image doesn't have a
|
|
106
|
+
caption, it doesn't belong on this theme.
|
|
107
|
+
- **Use `<table>` for tabular data** — the spec table AND the archive
|
|
108
|
+
year list are real `<table>` elements with visible cell borders.
|
|
109
|
+
Refuse a `grid-cols-*` grid; this is the native-web tell.
|
|
110
|
+
- **Render `<blockquote>` with a 3px left border** and mono body in
|
|
111
|
+
`fontStyle: "normal"` — NEVER italic. Italic blockquotes are the
|
|
112
|
+
Medium-blog register; the raw-concrete register is pre-CSS HTML.
|
|
113
|
+
- **Sign off the colophon with an honest `view-source` link** — the
|
|
114
|
+
footer's last three links are `rss` + `atom` + `view-source` +
|
|
115
|
+
`colophon`. That IS the register.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## COLOR TOKENS
|
|
120
|
+
|
|
121
|
+
**Light canvas** — `bg: #FFFFFF` / `ink: #000000` / `border: #C0C0C0`.
|
|
122
|
+
Native link `#0000EE`, visited `#551A8B`.
|
|
123
|
+
|
|
124
|
+
**Dark canvas** — `bg: #111111` / `ink: #E8E6E3` / `border: #404040`.
|
|
125
|
+
Native link (per browser default in dark UA): `#8CB4FF` / visited
|
|
126
|
+
`#D0ADF0`. This ISN'T pure black bg — the register is "dark browser
|
|
127
|
+
default," not black-void.
|
|
128
|
+
|
|
129
|
+
**Palette variant** — 10 link-color variants (default, kelp, vermilion,
|
|
130
|
+
aubergine, ochre, cobalt, moss, ink, hazard, cyan). Only link + visited
|
|
131
|
+
values change per palette. Everything else stays FIXED across variants.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## TYPOGRAPHY
|
|
136
|
+
|
|
137
|
+
- **Display / body / mono:** ONE family. Berkeley Mono (fallback
|
|
138
|
+
JetBrains Mono, Menlo, Courier New). No secondary font.
|
|
139
|
+
- **Sizes:** h1 = 28px weight 500; h2 = 18px weight 500 (with `[NN]`
|
|
140
|
+
prefix); body = 14px line-height 1.5; caption = 12px.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## SECTION SKELETON
|
|
145
|
+
|
|
146
|
+
1. Sticky picker strip (native-link register).
|
|
147
|
+
2. Table-based masthead nav.
|
|
148
|
+
3. `[00]` Document masthead / hero.
|
|
149
|
+
4. `[01]` Recent posts (numbered list).
|
|
150
|
+
5. `[02]` Figures (3-up with captions).
|
|
151
|
+
6. `[03]` Spec table.
|
|
152
|
+
7. `[04]` Manifesto blockquote.
|
|
153
|
+
8. `[05]` Fig. 4 full-bleed figure with caption.
|
|
154
|
+
9. `[06]` Archive (year table).
|
|
155
|
+
10. `[07]` Colophon (photo + text side-by-side).
|
|
156
|
+
11. `[08]` Subscribe (native form).
|
|
157
|
+
12. Footer with copyright + rss/atom/view-source/colophon links.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Raw Concrete
|
|
2
|
+
|
|
3
|
+
> Web brutalism — system defaults weaponized, honest structure, monospace throughout.
|
|
4
|
+
|
|
5
|
+
**Slug:** `raw-concrete` — **Surface:** web — **Density:** dense
|
|
6
|
+
|
|
7
|
+
## Influence
|
|
8
|
+
|
|
9
|
+
Web brutalism (brutalistwebsites.com era). Kate Moross print, Vitalik's blog, the original Craigslist, arxiv.org paper listings.
|
|
10
|
+
|
|
11
|
+
## Signature move
|
|
12
|
+
|
|
13
|
+
Every link is `#0000EE`. Every visited link is `#551A8B`. Every border is a
|
|
14
|
+
`1px solid #C0C0C0` hairline. No border-radius anywhere — every corner is
|
|
15
|
+
90°. No box-shadow ever. Tables render as tables (visible cell borders).
|
|
16
|
+
Buttons look like `<button>` elements pre-CSS. Underlines on links stay.
|
|
17
|
+
The composition is unmistakably "the browser did this, not a designer."
|
|
18
|
+
|
|
19
|
+
## Palette
|
|
20
|
+
|
|
21
|
+
- **bg:** `#FFFFFF`
|
|
22
|
+
- **surface:** `#FFFFFF`
|
|
23
|
+
- **ink:** `#000000`
|
|
24
|
+
- **accent:** `#0000EE`
|
|
25
|
+
- **secondary:** `#C0C0C0`
|
|
26
|
+
|
|
27
|
+
## Typography
|
|
28
|
+
|
|
29
|
+
- **Display:** Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this
|
|
30
|
+
- **Body:** same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px
|
|
31
|
+
- **Mono:** same as display and body — the whole theme is monospace, one family, three weights
|
|
32
|
+
- **Scale:** 1.2 (minor third — deliberately shallow contrast; body and heading feel close)
|
|
33
|
+
|
|
34
|
+
## Motion
|
|
35
|
+
|
|
36
|
+
none — no transitions, no scroll reveals, no hover animations. The absence IS the register.
|
|
37
|
+
|
|
38
|
+
## Imagery
|
|
39
|
+
|
|
40
|
+
Photographs render at native aspect ratio with a 1px black border and no
|
|
41
|
+
cropping. No filters, no gradients, no vignettes. Illustrations are ASCII
|
|
42
|
+
or single-color line drawings. No 3D, no rendered shapes, no icons beyond
|
|
43
|
+
what unicode provides.
|
|
44
|
+
|
|
45
|
+
## Best for
|
|
46
|
+
|
|
47
|
+
- Personal blogs (Vitalik-register)
|
|
48
|
+
- Academic paper listings (arxiv-register)
|
|
49
|
+
- Indie developer portfolios that want to feel earned
|
|
50
|
+
- Manifestos and long-form essays
|
|
51
|
+
- Art projects that trade on refusal-of-polish
|
|
52
|
+
- Craigslist-shaped marketplaces
|
|
53
|
+
|
|
54
|
+
## Reject if
|
|
55
|
+
|
|
56
|
+
_Director grades each of the following as a pass/fail check. Any violation blocks the theme._
|
|
57
|
+
|
|
58
|
+
- Border-radius greater than 0px anywhere on the page
|
|
59
|
+
- Any box-shadow — hover, focus, or decorative
|
|
60
|
+
- CSS transitions or animations of any kind
|
|
61
|
+
- Prettified link colors — links must render as browser-default #0000EE
|
|
62
|
+
- Sans-serif or serif faces — monospace only, one family throughout
|
|
63
|
+
- Rounded buttons or pill-shaped controls
|
|
64
|
+
- Gradient backgrounds or gradient text
|
|
65
|
+
- Icon fonts or SVG icons — unicode symbols only (▲ ▼ · × → ←)
|
|
66
|
+
- Padding standardization — deliberately inconsistent, exposed structure
|
|
67
|
+
- Hover states other than the browser default underline / link-color-change
|
|
68
|
+
|
|
69
|
+
## Banned defaults (inherited + theme-specific)
|
|
70
|
+
|
|
71
|
+
- claude-cream (#F4F1EA + serif + #D97757)
|
|
72
|
+
- void+acid (near-black bg + single bright acid-green or vermilion accent)
|
|
73
|
+
- broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
|
|
74
|
+
- tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
|
|
75
|
+
- uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
|
|
76
|
+
- brutalism-as-decoration (visible borders + monospace applied as decoration to an otherwise polished SaaS layout — Raw Concrete must refuse polish structurally, not aesthetically)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
|
|
2
|
+
// slug: raw-concrete
|
|
3
|
+
export const rawConcreteTailwindExtend = {
|
|
4
|
+
colors: {
|
|
5
|
+
bg: "#FFFFFF",
|
|
6
|
+
surface: "#FFFFFF",
|
|
7
|
+
ink: "#000000",
|
|
8
|
+
accent: "#0000EE",
|
|
9
|
+
secondary: "#C0C0C0",
|
|
10
|
+
},
|
|
11
|
+
fontFamily: {
|
|
12
|
+
display: ["Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this"],
|
|
13
|
+
body: ["same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px"],
|
|
14
|
+
mono: ["same as display and body — the whole theme is monospace, one family, three weights"],
|
|
15
|
+
},
|
|
16
|
+
};
|