@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,75 @@
|
|
|
1
|
+
# Design Direction — News-Tech
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Stratechery long-form authority · The Information paywall gravity · Pragmatic Engineer technical depth · Ben Thompson essayist voice · Platformer independent-publisher restraint
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Cream paper. Business-formal serif at modest sizes. The page wears its paid-newsletter authority quietly — no marketing chrome, no SaaS pricing pillars. A single feature article gets the masthead; subscriber tiers live inline in prose, not in a tile grid. Authority comes from byline gravity and content density.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Stratechery** → essayist single-author column, cream paper + business serif.
|
|
11
|
+
- **The Information** → paid-newsletter tier explanation, executive-interview row.
|
|
12
|
+
- **Pragmatic Engineer** → technical-depth feature articles, subscriber-tier breakdown.
|
|
13
|
+
- **Ben Thompson** → Daily Update, Stratechery Plus voice — authoritative analysis.
|
|
14
|
+
- **Platformer** → independent-publisher Substack restraint, sober palette.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Brand tokens: `--ink`, `--cream`, `--editorial-blue`, `--ink-soft`, `--subscriber-gold`. Foreground is a deep business-formal navy-black (`hsl(220 24% 14%)`); background is Stratechery cream (`hsl(38 24% 95%)`).
|
|
18
|
+
|
|
19
|
+
Primary is **editorial blue** (`hsl(215 55% 32%)`) — used for inline links and the single Subscribe CTA. `--subscriber-gold` (`hsl(36 60% 42%)`) is a subtle gold accent for paid-tier labels and "PLUS" marks beside bylines — never used as a button fill.
|
|
20
|
+
|
|
21
|
+
## Typography
|
|
22
|
+
- **Display:** Lora (Stratechery-essay serif). Modest sizes — not magazine-grand. Tracking `-0.012em`.
|
|
23
|
+
- **Body:** Source Serif Pro. 17px / `line-height: 1.68` — essay-comfortable for 4000-word reads.
|
|
24
|
+
- **Mono:** JetBrains Mono. Datelines (`JUNE 24, 2026`), read-times (`14 MIN READ`), tag pills (`STRATEGY`, `ANTITRUST`), subscriber-tier labels.
|
|
25
|
+
|
|
26
|
+
H1 uses `clamp(2rem, 4.5vw, 3.5rem)` — modest essay-headline scale, deliberately *not* magazine.
|
|
27
|
+
|
|
28
|
+
## Spacing
|
|
29
|
+
- **Container:** `max-w-5xl px-6 lg:px-10` — wider than editorial (room for list rows and interview grid), narrower than tabloid.
|
|
30
|
+
- **Section padding:** hero `pt-16 pb-12 lg:pt-24 lg:pb-16`; default `py-16 lg:py-24`; tight `py-10 lg:py-14`.
|
|
31
|
+
- **Scale:** 4 6 8 12 16 20 24 32 40 48 64 96.
|
|
32
|
+
|
|
33
|
+
## Color
|
|
34
|
+
No hex in components. Five tokens carry the entire page: ink, cream, editorial-blue, ink-soft, subscriber-gold.
|
|
35
|
+
|
|
36
|
+
## Radius
|
|
37
|
+
`--radius: 0.125rem` — very subtle, business-formal. Sharp print convention softened just enough to feel modern web. Pills allowed *only* for tag labels (`STRATEGY` / `ANTITRUST` / `MARKETS`) — never for buttons.
|
|
38
|
+
|
|
39
|
+
## Shadows
|
|
40
|
+
Minimal. Two utilities: `.panel-rule` (1px list-row divider) and `.tier-card` (inset rules above + below subscriber-tier panels). No drop shadows, no glows.
|
|
41
|
+
|
|
42
|
+
## Motion
|
|
43
|
+
Single keyframe: `fade-rise` (700ms). The only entrance — restrained, business-formal. Easing `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored.
|
|
44
|
+
|
|
45
|
+
## Component patterns
|
|
46
|
+
- **Buttons:** text-link CTAs in `--editorial-blue`, underline on hover. The single Subscribe is solid: `--editorial-blue` bg + `--cream` fg, 0.125rem radius. **No marketing-grade gradient buttons.**
|
|
47
|
+
- **Cards:** hairline top + bottom rule, no fill differentiation. Tag-pill chips in mono uppercase. Title in Lora, byline in mono small caps with `--subscriber-gold` "PLUS" mark for paid-tier authors.
|
|
48
|
+
- **Inputs:** border-bottom only. Email-capture is the canonical input — every page should make it findable.
|
|
49
|
+
- **CTA links:** text-link in `--editorial-blue`, underline on hover. **Never SaaS pricing pillars.**
|
|
50
|
+
|
|
51
|
+
## Bespoke section
|
|
52
|
+
Three blocks composed as a paid-newsletter author page:
|
|
53
|
+
1. **Subscription-feature card** — inline subscriber-tier explanation written as prose with two checklists ("Free" / "Plus"), not a 3-pillar SaaS pricing grid. Single Subscribe CTA + reassuring fine-print.
|
|
54
|
+
2. **Recent articles list** — 5 rows, each: date (mono caps) · tag pill · title (Lora) · read-time (mono caps).
|
|
55
|
+
3. **Executive-interview row** — 3 interviews: interviewee name + role, interviewer byline, mono-caps date and "PLUS" gold mark.
|
|
56
|
+
|
|
57
|
+
The composition refuses generic SaaS feature cards. Density and gravity — the page should look like *Stratechery's About page*, not like a startup landing page.
|
|
58
|
+
|
|
59
|
+
## Recommended rich media
|
|
60
|
+
Sparse. The page is text-first. A single small headshot per executive-interview row is permitted (3:2, neutral background, professional photography). No hero photography on most pages. Charts and figures live in essay bodies — not on the landing.
|
|
61
|
+
|
|
62
|
+
**AI tool recommendations:** Avoid Midjourney for this direction. Headshots should be sourced from actual photography. Charts use simple SVG / line-only treatments — no 3D, no gradient, no glow.
|
|
63
|
+
|
|
64
|
+
**Avoid:** SaaS-pricing pillars, three-reasons grids, generic feature cards, gradient hero backgrounds, glassmorphic anything, marketing illustration, animated GIFs, drop shadows, oversized hero photos.
|
|
65
|
+
|
|
66
|
+
## Details
|
|
67
|
+
- **Selection:** `hsl(var(--primary) / 0.18)`.
|
|
68
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`.
|
|
69
|
+
- **Scrollbar:** thin.
|
|
70
|
+
|
|
71
|
+
## Exceptions
|
|
72
|
+
None yet.
|
|
73
|
+
|
|
74
|
+
## Revisions
|
|
75
|
+
- Initial direction.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// Note: "news-tech" is not yet in the Direction["name"] enum.
|
|
4
|
+
// The schema is closed; until it is extended this file casts the name.
|
|
5
|
+
|
|
6
|
+
export const newsTech: Direction = {
|
|
7
|
+
name: "news-tech" as Direction["name"],
|
|
8
|
+
ethos: "Stratechery long-form authority · The Information paywall gravity · Pragmatic Engineer technical depth · Ben Thompson essayist voice · Platformer independent-publisher restraint",
|
|
9
|
+
references: [
|
|
10
|
+
{ brand: "Stratechery", trait: "essayist single-author column, cream paper + business serif" },
|
|
11
|
+
{ brand: "The Information", trait: "paid-newsletter tier explanation, executive-interview row" },
|
|
12
|
+
{ brand: "Pragmatic Engineer", trait: "technical-depth feature articles, subscriber-tier breakdown" },
|
|
13
|
+
{ brand: "Ben Thompson", trait: "Daily Update, Stratechery Plus voice — authoritative analysis" },
|
|
14
|
+
{ brand: "Platformer", trait: "independent-publisher Substack restraint, sober palette" },
|
|
15
|
+
],
|
|
16
|
+
feel:
|
|
17
|
+
"Cream paper. Business-formal serif at modest sizes. The page wears its paid-newsletter authority quietly — " +
|
|
18
|
+
"no marketing chrome, no SaaS pricing pillars. A single feature article gets the masthead; subscriber tiers " +
|
|
19
|
+
"live inline in prose, not in a tile grid. Authority comes from byline gravity and content density.",
|
|
20
|
+
|
|
21
|
+
fonts: {
|
|
22
|
+
display: {
|
|
23
|
+
family: "Lora",
|
|
24
|
+
fallback: ["Charter", "Source Serif Pro", "Georgia", "serif"],
|
|
25
|
+
from: "Stratechery/Pragmatic-Engineer essay-headline serif — business-formal, not editorial-grand",
|
|
26
|
+
googleFont: "Lora",
|
|
27
|
+
weights: [400, 500, 600, 700],
|
|
28
|
+
},
|
|
29
|
+
body: {
|
|
30
|
+
family: "Source Serif Pro",
|
|
31
|
+
fallback: ["Charter", "Iowan Old Style", "Georgia", "serif"],
|
|
32
|
+
from: "long-form business-prose serif — readable at 17px for 4000-word essays",
|
|
33
|
+
googleFont: "Source+Serif+Pro",
|
|
34
|
+
weights: [400, 600, 700],
|
|
35
|
+
},
|
|
36
|
+
mono: {
|
|
37
|
+
family: "JetBrains Mono",
|
|
38
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
39
|
+
from: "datelines, read-times, tag pills, subscriber-tier labels",
|
|
40
|
+
googleFont: "JetBrains+Mono",
|
|
41
|
+
weights: [400, 500, 600],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
typography: {
|
|
46
|
+
headingTracking: "-0.012em",
|
|
47
|
+
bodyTracking: "0",
|
|
48
|
+
fontFeatureSettings: '"liga", "onum", "tnum"',
|
|
49
|
+
h1ScaleClamp: "clamp(2rem, 4.5vw, 3.5rem)", // modest — essay-headline scale, not magazine-cover
|
|
50
|
+
bodyBaseSize: "1.0625rem", // 17px essay-comfortable
|
|
51
|
+
bodyLineHeight: "1.68",
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
colors: {
|
|
55
|
+
background: { hsl: "38 24% 95%", from: "Stratechery cream paper stock — warm, business-formal" },
|
|
56
|
+
foreground: { hsl: "220 24% 14%", from: "deep ink — business-formal navy-black" },
|
|
57
|
+
card: { hsl: "38 26% 97%", from: "lighter cream card — subscriber-tier panels, executive-interview rows" },
|
|
58
|
+
popover: { hsl: "38 26% 97%", from: "same as card" },
|
|
59
|
+
primary: { hsl: "215 55% 32%", from: "Platformer/Stratechery deep editorial blue — link color and accent" },
|
|
60
|
+
primaryForeground: { hsl: "38 24% 95%", from: "cream on blue" },
|
|
61
|
+
secondary: { hsl: "38 18% 90%", from: "deeper cream — recent-articles list zebra rows" },
|
|
62
|
+
secondaryForeground: { hsl: "220 24% 14%", from: "ink on cream" },
|
|
63
|
+
muted: { hsl: "38 18% 90%", from: "same as secondary; differentiation by usage" },
|
|
64
|
+
mutedForeground: { hsl: "220 14% 38%", from: "slate ink — read-times, datelines, tag pills" },
|
|
65
|
+
accent: { hsl: "38 20% 88%", from: "hover surface — quiet" },
|
|
66
|
+
accentForeground: { hsl: "220 24% 14%", from: "ink on accent" },
|
|
67
|
+
border: { hsl: "220 14% 82%", from: "hairline rule — subscriber-tier panel divider" },
|
|
68
|
+
input: { hsl: "220 14% 82%", from: "same as border" },
|
|
69
|
+
ring: { hsl: "215 55% 32%", from: "primary blue, focus" },
|
|
70
|
+
destructive: { hsl: "0 60% 42%", from: "alert red — cancellation/warning, not a brand color" },
|
|
71
|
+
destructiveForeground: { hsl: "38 24% 95%", from: "cream on alert" },
|
|
72
|
+
brand: {
|
|
73
|
+
ink: { hsl: "220 24% 14%", from: "= foreground; deep business-formal ink" },
|
|
74
|
+
cream: { hsl: "38 24% 95%", from: "= background; Stratechery cream paper" },
|
|
75
|
+
"editorial-blue": { hsl: "215 55% 32%", from: "= primary; link/accent" },
|
|
76
|
+
"ink-soft": { hsl: "220 18% 26%", from: "secondary headings, executive-interview titles" },
|
|
77
|
+
"subscriber-gold": { hsl: "36 60% 42%", from: "subtle gold accent for paid-tier label, not for buttons" },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
spacing: {
|
|
82
|
+
base: 4,
|
|
83
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96],
|
|
84
|
+
containerMax: "max-w-5xl", // wider than editorial — list rows + interview grid
|
|
85
|
+
containerPadding: "px-6 lg:px-10",
|
|
86
|
+
sectionPadding: {
|
|
87
|
+
hero: "pt-16 pb-12 lg:pt-24 lg:pb-16",
|
|
88
|
+
default: "py-16 lg:py-24",
|
|
89
|
+
tight: "py-10 lg:py-14",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
radius: {
|
|
94
|
+
base: "0.125rem", // very subtle — business-formal, not sharp print
|
|
95
|
+
pillsAllowed: true, // pills for tag labels (Strategy / Antitrust / Markets)
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
shadows: {
|
|
99
|
+
style: "minimal",
|
|
100
|
+
utilities: {
|
|
101
|
+
"panel-rule":
|
|
102
|
+
"0 1px 0 0 hsl(var(--border))", // list-row divider
|
|
103
|
+
"tier-card":
|
|
104
|
+
"0 1px 0 0 hsl(var(--border)) inset, 0 -1px 0 0 hsl(var(--border)) inset", // subscriber-tier panel rules
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
motion: {
|
|
109
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
110
|
+
durations: {
|
|
111
|
+
reveal: 700,
|
|
112
|
+
loop: 4000,
|
|
113
|
+
ambient: 20000,
|
|
114
|
+
},
|
|
115
|
+
keyframes: {
|
|
116
|
+
"fade-rise": {
|
|
117
|
+
css:
|
|
118
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
119
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
120
|
+
defaultDuration: 700,
|
|
121
|
+
iteration: "once",
|
|
122
|
+
purpose: "section entrance — restrained, business-formal",
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
respectsReducedMotion: true,
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
density: "medium",
|
|
129
|
+
|
|
130
|
+
patterns: {
|
|
131
|
+
button:
|
|
132
|
+
"Text-link CTAs in --editorial-blue with underline on hover. The single Subscribe CTA may be a solid --editorial-blue fill with --cream text. " +
|
|
133
|
+
"No marketing-grade gradient buttons — this is a paid-newsletter, not a SaaS landing page.",
|
|
134
|
+
card:
|
|
135
|
+
"Hairline top + bottom rule, no fill differentiation. Tag-pill chips in mono uppercase. " +
|
|
136
|
+
"Title in Lora display, byline in mono small caps with --subscriber-gold for paid-tier mark.",
|
|
137
|
+
input:
|
|
138
|
+
"Border-bottom only (1px --ink-soft). Label in mono small caps above. Email-capture is the canonical input.",
|
|
139
|
+
cta:
|
|
140
|
+
"Text-link in --editorial-blue, underline on hover. Subscribe is solid: --editorial-blue bg + --cream fg, modest 0.125rem radius.",
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
details: {
|
|
144
|
+
selectionBg: "hsl(var(--primary) / 0.18)",
|
|
145
|
+
selectionFg: "hsl(var(--foreground))",
|
|
146
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
147
|
+
scrollbarStyle: "thin",
|
|
148
|
+
},
|
|
149
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Design Direction — Newsletter
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Substack reading · Bear minimalism · The Browser typography · Granta editorial · Le Monde Diplomatique restraint · Pieter Levels essay-first plain page
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Reading-first. Narrow column, serif body, warm paper background, generous vertical rhythm. The page is designed to be read top-to-bottom for 10 minutes, not scanned. Buttons are foreign here; almost everything is a text link.
|
|
8
|
+
|
|
9
|
+
This is the editorial direction's reading-first sibling — narrower, quieter, and serif-only. Where editorial mixes a display serif with a body sans, newsletter sets *everything* in the same family: the type is the design, and switching faces inside a reading layout breaks flow.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Substack** → the reading view, not the marketing site. Single column, serif, warm background, no chrome.
|
|
13
|
+
- **Bear blog (bearblog.dev)** → minimalism. The page is just the words.
|
|
14
|
+
- **The Browser (thebrowser.com)** → typography. A weekly essay digest that respects the reader's eye.
|
|
15
|
+
- **Granta** → editorial long-form. Pacing, captions, restraint with images.
|
|
16
|
+
- **Le Monde Diplomatique** → restraint. Ink on paper, no decoration.
|
|
17
|
+
- **Pieter Levels** → essay-first plain page. Indie, unembarrassed by simplicity.
|
|
18
|
+
|
|
19
|
+
## Tokens
|
|
20
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin. Surface stack is intentionally flat — `background`, `card`, and `secondary` all sit on the same warm paper, with `card` collapsed to the page itself. There is no card. Sections are separated by `.hairline-top` and vertical rhythm.
|
|
21
|
+
|
|
22
|
+
Brand tokens: `--ink`, `--paper`, `--ink-soft`, `--link-visited`. Primary is **deep navy** (`220 70% 30%`) — the NYT-link-blue heritage. It is, primarily, the link color. Visited links shift to `--link-visited` purple (`280 50% 35%`) — the traditional, intentional convention.
|
|
23
|
+
|
|
24
|
+
## Typography
|
|
25
|
+
- **Display:** Lora. Same family as body — there is no separate display face. Tracking `-0.01em` (gentler than editorial's `-0.015em`; Lora is humanist).
|
|
26
|
+
- **Body:** Lora, **18px**, line-height **1.75**. Body paragraphs are `max-w-[64ch]` — never wider.
|
|
27
|
+
- **Mono:** JetBrains Mono. **Caption sizes only** — datelines, figure attributions, citations. Never used for body or headings.
|
|
28
|
+
|
|
29
|
+
H1 uses `clamp(2.25rem, 5vw, 3.75rem)` — narrower column means narrower headline. Font features: `"liga", "kern"` only; no stylistic alternates, because body and display share the face.
|
|
30
|
+
|
|
31
|
+
## Spacing
|
|
32
|
+
- **Container:** `max-w-prose px-6 lg:px-8`. Body paragraphs are additionally `max-w-[64ch]`. A wide column kills a reading page.
|
|
33
|
+
- **Section padding tiers:**
|
|
34
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
|
|
35
|
+
- Default: `py-16 lg:py-24`
|
|
36
|
+
- Tight: `py-12 lg:py-16`
|
|
37
|
+
- **Allowed scale values:** 4 6 8 12 16 24 32 48 64 96 128. Note: no `20`, no `40`. The jump from 16 to 24 enforces the generous vertical rhythm.
|
|
38
|
+
|
|
39
|
+
## Color
|
|
40
|
+
No hex anywhere. Pure white and pure black are forbidden — `--paper` and `--ink` replace them. Background is warmer and slightly more saturated than the editorial direction (`40 25% 95%` vs `36 25% 96%`) — closer to Substack and Granta stock than to Kinfolk. Foreground carries a slight blue bias (`220 18% 14%`) so the navy link color reads as a tonal shift, not a foreign accent.
|
|
41
|
+
|
|
42
|
+
## Radius
|
|
43
|
+
`--radius: 0`. **Sharp corners only.** Pills disallowed (`pillsAllowed: false`) — print convention, no exception. The Subscribe button is also sharp.
|
|
44
|
+
|
|
45
|
+
## Shadows
|
|
46
|
+
**None.** Single utility: `.hairline-top` (`inset 0 1px 0 0 hsl(var(--foreground) / 0.15)`) — a 1px border-top in foreground/15, used to separate sections. No drop shadows. No glows. No bottom borders either — top-only enforces a downward reading rhythm.
|
|
47
|
+
|
|
48
|
+
## Motion
|
|
49
|
+
**Zero.** Newsletters do not animate. `keyframes: {}` is intentionally empty — there is nothing to suppress. `respectsReducedMotion: true` is honored as a contract, but the library ships no animations. If a future component needs motion, it does not belong in this direction.
|
|
50
|
+
|
|
51
|
+
## Component patterns
|
|
52
|
+
- **Buttons:** text-link primary; underlined on hover only (default state is link-color text, no underline). The **Subscribe button is the ONLY filled rect on the page** — navy bg + paper text, sharp corners. No other buttons exist in this language.
|
|
53
|
+
- **Cards:** there is no card. Sections are separated by `.hairline-top` and vertical rhythm. If structure is needed, use a `<figure>` with a caption — not a bordered container.
|
|
54
|
+
- **Inputs:** border-bottom only (1px `--border`). Used almost exclusively by the Subscribe form. Placeholder italic, label above in `--ink-soft` mono.
|
|
55
|
+
- **CTAs:** text-link in `--primary` (navy). Underline on hover. Visited links shift to `--link-visited` (purple). Subscribe is the single exception.
|
|
56
|
+
|
|
57
|
+
## Component families
|
|
58
|
+
None at install time. Long-form posts ship with `<article>`, `<h1>`/`<h2>`/`<h3>`, `<p>`, `<blockquote>`, `<figure>`/`<figcaption>`, `<a>` — and that is, deliberately, almost the whole vocabulary.
|
|
59
|
+
|
|
60
|
+
## Recommended rich media
|
|
61
|
+
- **Cover:** single hero image per article (when used). Captioned figures within long-form. Occasional pull-quote photograph.
|
|
62
|
+
- **Photography style:** editorial portraiture, environmental shots, **never stock**.
|
|
63
|
+
- **AI tool recommendations:**
|
|
64
|
+
- **Midjourney / Flux** for illustrations and photographic compositions. Prompts like *"New Yorker magazine illustration, Pierre Mornet style"* for illustration; *"editorial portrait, Annie Leibovitz lighting, 50mm, slight grain"* for photography.
|
|
65
|
+
- **Recraft** for figurative line illustrations in the NYT op-ed style.
|
|
66
|
+
- For charts and diagrams, lean toward hand-drawn-style illustration over AI photorealism.
|
|
67
|
+
- **Aspect ratios:** 3:2 landscape (photographic standard) or 4:5 portrait for environmental subjects. **Never 16:9 widescreen** — cinematic, off-feel. **Avoid square 1:1** — Instagram-feel.
|
|
68
|
+
- **Captions:** every figure has a real caption, set in italic mono or sans. **Never a generic "Image: …" label.** The caption is part of the writing.
|
|
69
|
+
- **Performance:** hero ≤150 KB AVIF, inline figures ≤80 KB.
|
|
70
|
+
- **What to AVOID:** stock photography; dark moody product shots; video backgrounds (kills the reading flow); animated GIFs (visually noisy); AI-generated photos that look "off" (uncanny smile, weird hands, malformed jewellery).
|
|
71
|
+
- **Accessibility:** long-form figure alt-text — describe the photograph as if for a blind reader. Three to five words is not enough for editorial photography.
|
|
72
|
+
|
|
73
|
+
## Details
|
|
74
|
+
- **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text.
|
|
75
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`. Quiet — does not scream.
|
|
76
|
+
- **Scrollbar:** `auto` (default browser scrollbar). A reading page should not style its own chrome.
|
|
77
|
+
|
|
78
|
+
## Exceptions
|
|
79
|
+
- **Subscribe button.** The single filled rect on the page, by design. Navy background, paper text, sharp corners. Justified because the act of subscribing is the one transaction a newsletter page asks for, and it has to be unmissable in a layout that otherwise has no buttons at all.
|
|
80
|
+
|
|
81
|
+
## Revisions
|
|
82
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const newsletter: Direction = {
|
|
4
|
+
name: "newsletter",
|
|
5
|
+
ethos:
|
|
6
|
+
"Substack reading · Bear minimalism · The Browser typography · Granta editorial · Le Monde Diplomatique restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Substack", trait: "reading view, not the marketing site" },
|
|
9
|
+
{ brand: "Bear blog", trait: "minimalism — bearblog.dev" },
|
|
10
|
+
{ brand: "The Browser", trait: "typography — thebrowser.com" },
|
|
11
|
+
{ brand: "Granta", trait: "editorial long-form" },
|
|
12
|
+
{ brand: "Le Monde Diplomatique", trait: "restraint" },
|
|
13
|
+
{ brand: "Pieter Levels", trait: "essay-first plain page" },
|
|
14
|
+
],
|
|
15
|
+
feel:
|
|
16
|
+
"Reading-first. Narrow column, serif body, warm paper background, generous " +
|
|
17
|
+
"vertical rhythm. The page is designed to be read top-to-bottom for 10 minutes, " +
|
|
18
|
+
"not scanned. Buttons are foreign here; almost everything is a text link.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Lora",
|
|
23
|
+
fallback: ["Iowan Old Style", "Charter", "Georgia", "serif"],
|
|
24
|
+
from: "Substack-feel serif — readable display weight, no decorative drama",
|
|
25
|
+
googleFont: "Lora",
|
|
26
|
+
weights: [400, 500, 600, 700],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Lora",
|
|
30
|
+
fallback: ["Iowan Old Style", "Charter", "Georgia", "serif"],
|
|
31
|
+
from: "same family as display — the type is the design; mixing serifs in a reading layout breaks flow",
|
|
32
|
+
googleFont: "Lora",
|
|
33
|
+
weights: [400, 500, 600, 700],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "caption sizes only — datelines, citations, figure attributions",
|
|
39
|
+
googleFont: "JetBrains+Mono",
|
|
40
|
+
weights: [400],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.01em", // Lora is humanist; needs gentle tightening, not editorial's -0.015em
|
|
46
|
+
bodyTracking: "0",
|
|
47
|
+
fontFeatureSettings: '"liga", "kern"', // ligatures + kerning; no stylistic alts — body and display share the face
|
|
48
|
+
h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)", // narrower column = narrower headline
|
|
49
|
+
bodyBaseSize: "1.125rem", // 18px — newsletters are read, not skimmed
|
|
50
|
+
bodyLineHeight: "1.75", // generous; an essay's pace
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "40 25% 95%", from: "warm paper — slightly more saturated cream than editorial" },
|
|
55
|
+
foreground: { hsl: "220 18% 14%", from: "deep ink, slight blue bias — Granta/LMD ink" },
|
|
56
|
+
card: { hsl: "40 25% 95%", from: "same as paper — no card surface in a reading layout" },
|
|
57
|
+
popover: { hsl: "40 22% 97%", from: "footnote/tooltip — one tier brighter than paper" },
|
|
58
|
+
primary: { hsl: "220 70% 30%", from: "deep navy — NYT-link-blue heritage; this is the link color" },
|
|
59
|
+
primaryForeground: { hsl: "40 25% 95%", from: "paper on navy — only used by the Subscribe button" },
|
|
60
|
+
secondary: { hsl: "40 18% 91%", from: "warm paper, one tier deeper — block-quote ground" },
|
|
61
|
+
secondaryForeground: { hsl: "220 18% 14%", from: "ink on warm paper" },
|
|
62
|
+
muted: { hsl: "40 18% 91%", from: "same as secondary; differentiation by usage, not color" },
|
|
63
|
+
mutedForeground: { hsl: "220 16% 28%", from: "ink-soft — bylines and meta" },
|
|
64
|
+
accent: { hsl: "40 20% 89%", from: "warm paper, deeper still — hover ground for link blocks" },
|
|
65
|
+
accentForeground: { hsl: "220 18% 14%", from: "ink on warm paper" },
|
|
66
|
+
border: { hsl: "220 14% 84%", from: "hairline — barely visible, the divider between sections" },
|
|
67
|
+
input: { hsl: "220 14% 84%", from: "same as border — only Subscribe input uses this" },
|
|
68
|
+
ring: { hsl: "220 70% 30%", from: "primary navy, used for focus only" },
|
|
69
|
+
destructive: { hsl: "0 55% 38%", from: "errata red — restrained, never alarm" },
|
|
70
|
+
destructiveForeground: { hsl: "40 25% 95%", from: "paper on errata" },
|
|
71
|
+
brand: {
|
|
72
|
+
ink: { hsl: "220 18% 14%", from: "the deep ink — also semantic foreground" },
|
|
73
|
+
paper: { hsl: "40 25% 95%", from: "the warm paper — also semantic background" },
|
|
74
|
+
"ink-soft": { hsl: "220 16% 28%", from: "bylines, datelines, meta — the secondary voice" },
|
|
75
|
+
"link-visited": { hsl: "280 50% 35%", from: "purple — traditional visited-link, intentional heritage" },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
spacing: {
|
|
80
|
+
base: 4,
|
|
81
|
+
scale: [4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128], // extremely generous vertical rhythm — note the jump from 16 to 24, no 20
|
|
82
|
+
containerMax: "max-w-prose", // narrow reading column; body paragraphs max-w-[64ch]
|
|
83
|
+
containerPadding: "px-6 lg:px-8",
|
|
84
|
+
sectionPadding: {
|
|
85
|
+
hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
|
|
86
|
+
default: "py-16 lg:py-24",
|
|
87
|
+
tight: "py-12 lg:py-16",
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
radius: {
|
|
92
|
+
base: "0", // sharp — print convention
|
|
93
|
+
pillsAllowed: false,
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
shadows: {
|
|
97
|
+
style: "none",
|
|
98
|
+
utilities: {
|
|
99
|
+
"hairline-top":
|
|
100
|
+
"inset 0 1px 0 0 hsl(var(--foreground) / 0.15)", // 1px border-top in foreground/15 — the section divider
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
motion: {
|
|
105
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
106
|
+
durations: {
|
|
107
|
+
reveal: 0, // newsletters don't animate
|
|
108
|
+
loop: 0,
|
|
109
|
+
ambient: 0,
|
|
110
|
+
},
|
|
111
|
+
keyframes: {}, // intentionally empty — there is no motion in this language
|
|
112
|
+
respectsReducedMotion: true, // honored, though there's nothing to suppress
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
density: "low",
|
|
116
|
+
|
|
117
|
+
patterns: {
|
|
118
|
+
button:
|
|
119
|
+
"Text-link primary; underlined on hover only (default state is link-color text, no underline). " +
|
|
120
|
+
"The Subscribe button is the ONLY filled rect on the page — navy bg + paper text. No other buttons exist.",
|
|
121
|
+
card:
|
|
122
|
+
"There is no card. Sections are separated by `.hairline-top` and vertical rhythm. " +
|
|
123
|
+
"If structure is needed, use a `<figure>` with a caption — not a bordered container.",
|
|
124
|
+
input:
|
|
125
|
+
"Border-bottom only (1px `--border`). Used almost exclusively by the Subscribe form. " +
|
|
126
|
+
"Placeholder italic, label above in `--ink-soft` mono.",
|
|
127
|
+
cta:
|
|
128
|
+
"Text-link in `--primary` (navy). Underline on hover. Visited links shift to `--link-visited` (purple). " +
|
|
129
|
+
"Subscribe is the single exception — filled navy rect, paper text, sharp corners.",
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
details: {
|
|
133
|
+
selectionBg: "hsl(var(--primary) / 0.18)",
|
|
134
|
+
selectionFg: "hsl(var(--foreground))",
|
|
135
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
136
|
+
scrollbarStyle: "auto", // default browser scrollbar — a reading page should not style its own chrome
|
|
137
|
+
},
|
|
138
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Design Direction — Newspaper-Classic
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
NYT Cheltenham · WaPo dignified daily · Le Monde five-column page · Guardian section ribbons · WSJ stipple authority
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Cream newsprint stock with deep ink. Tall stately display serif headlines over a wide five-column page. Section nav reads like the top of a folded broadsheet; bylines and read-times sit in small-caps mono. Restrained red is reserved for the breaking-news ticker and the masthead rule — never for decoration.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **The New York Times** → Cheltenham-style display serif, five-column front-page grid.
|
|
11
|
+
- **The Washington Post** → Democracy-Dies-in-Darkness gravitas, breaking-news ticker.
|
|
12
|
+
- **Le Monde** → broadsheet column rhythm, dateline as masthead anchor.
|
|
13
|
+
- **The Guardian** → section ribbons across the page top, byline grids.
|
|
14
|
+
- **The Wall Street Journal** → stippled portrait engravings, business-formal restraint.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens are HSL triples in `src/index.css`. Every token's `from:` names a brand origin. Brand tokens: `--ink`, `--newsprint`, `--ink-soft`, `--rule-strong`, `--ticker-red`, `--stipple`.
|
|
18
|
+
|
|
19
|
+
Surface stack: **newsprint cream** (background) → lighter cream (card) → deeper cream (secondary/muted/accent). Depth comes from rules, not from fill differentiation. The thick `--rule-strong` 3px line under the masthead is the single decorative move.
|
|
20
|
+
|
|
21
|
+
Primary is a **restrained masthead red** (NYT op-ed / WaPo breaking) — used on the ticker strip, the masthead rule, and section kicker labels. Never on body copy. Never on photos.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Playfair Display (Cheltenham-style display serif). h1–h4. Tracking `-0.018em` — broadsheet headlines need it tight.
|
|
25
|
+
- **Body:** Source Serif Pro (WaPo/Guardian body serif). 17px / `line-height: 1.62` — long-form readable.
|
|
26
|
+
- **Mono:** JetBrains Mono. Datelines, bylines (`BY JANE DOE`), read-times, section kickers — all uppercase, tracked.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.5rem, 6.5vw, 5.25rem)`. Numbers always `tabular-nums`. Font features: `"liga", "onum", "tnum"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-6 lg:px-10` — wide; five-column grids need the room.
|
|
32
|
+
- **Section padding:** hero `pt-16 pb-12 lg:pt-24 lg:pb-20`; default `py-16 lg:py-24`; tight `py-10 lg:py-14`.
|
|
33
|
+
- **Scale:** 4 6 8 12 16 20 24 32 40 48 64 96. No arbitrary spacing.
|
|
34
|
+
|
|
35
|
+
## Color
|
|
36
|
+
No hex in components. White and pure black are forbidden — `--newsprint` and `--ink` replace them. Opacity via `/N` on the token.
|
|
37
|
+
|
|
38
|
+
## Radius
|
|
39
|
+
`--radius: 0`. **Sharp corners only.** Pills disallowed — newsprint convention. Section ribbons are flat-fill rects.
|
|
40
|
+
|
|
41
|
+
## Shadows
|
|
42
|
+
Minimal. Two utilities: `.rule-bottom` (1px column-divider rule) and `.rule-thick` (3px masthead rule). No drop shadows, no glows.
|
|
43
|
+
|
|
44
|
+
## Motion
|
|
45
|
+
Two keyframes. `fade-rise` (800ms) is the only entrance. `ticker-scroll` (30,000ms infinite) drives the breaking-news ticker strip — slow horizontal crawl, honors `prefers-reduced-motion` by pausing.
|
|
46
|
+
|
|
47
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`.
|
|
48
|
+
|
|
49
|
+
## Component patterns
|
|
50
|
+
- **Buttons:** text-link CTAs in `--ink`, underline on hover. The single masthead Subscribe is the only solid: `--ink` bg + `--newsprint` fg, sharp rect. Section ribbons are `--ticker-red` flat fills.
|
|
51
|
+
- **Cards:** top + bottom rules only, no side borders, no fill differentiation. Title in display serif, kicker in mono uppercase, byline in mono small caps. Padding `p-6 lg:p-8`.
|
|
52
|
+
- **Inputs:** border-bottom only (1px `--ink-soft`). Mono small-caps label above.
|
|
53
|
+
- **CTA links:** text-link in `--ink`, underline on hover. **Never a chip, never a pill.**
|
|
54
|
+
|
|
55
|
+
## Bespoke section
|
|
56
|
+
Section-nav ribbon (Front / Politics / Business / Opinion / Style) + leading-story big card with kicker / headline / deck / byline + four secondary stories in a 4-column grid + a breaking-news ticker strip across the bottom. The ticker uses `--ticker-red` background with `--newsprint` text and the `BREAKING` chip in a contrast box. The grid never collapses to feature cards; it remains a newsprint front page.
|
|
57
|
+
|
|
58
|
+
## Recommended rich media
|
|
59
|
+
Photography is photojournalistic — captured news moments, environmental portraits, courthouse steps. Color-grade for neutral newsprint reproduction (slight desaturation, true grays). One stipple-portrait engraving per page (WSJ heritage) is permitted for the lead op-ed byline.
|
|
60
|
+
|
|
61
|
+
**AI tool recommendations:** Midjourney prompts like *"photojournalism, Associated Press wire, 35mm, neutral color, slight grain"*. Avoid glossy editorial lighting (magazine-glossy territory) and avoid moody dark-mode lighting (cinematic territory). Aspect ratio 3:2 photographic standard.
|
|
62
|
+
|
|
63
|
+
**Avoid:** stock business photography, animated GIFs, gradient backgrounds, glassmorphic anything, any pill-shaped chip, drop shadows.
|
|
64
|
+
|
|
65
|
+
## Details
|
|
66
|
+
- **Selection:** `hsl(var(--primary) / 0.2)` background, foreground text.
|
|
67
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`.
|
|
68
|
+
- **Scrollbar:** thin.
|
|
69
|
+
|
|
70
|
+
## Exceptions
|
|
71
|
+
None yet.
|
|
72
|
+
|
|
73
|
+
## Revisions
|
|
74
|
+
- Initial direction.
|