@stylecrib/cli 0.0.0-stage → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -2
- package/agents/MANIFEST.yml +136 -0
- package/agents/README.md +75 -0
- package/agents/art-director.md +168 -0
- package/agents/audacity-director.md +109 -0
- package/agents/brand-identity.md +179 -0
- package/agents/brand-precedent.md +119 -0
- package/agents/brief-enforcer.md +136 -0
- package/agents/component-qa.md +167 -0
- package/agents/cto.md +49 -0
- package/agents/design-director.md +184 -0
- package/agents/design-systems-engineer.md +162 -0
- package/agents/direction-curator.md +133 -0
- package/agents/homogeneity-detector.md +104 -0
- package/agents/logo-designer.md +240 -0
- package/agents/marketing-designer.md +156 -0
- package/agents/media-curator.md +165 -0
- package/agents/motion-engineer.md +270 -0
- package/agents/qa-conductor.md +143 -0
- package/agents/render-qa.md +133 -0
- package/agents/upgrade-simulator.md +123 -0
- package/agents/vp-architecture.md +49 -0
- package/agents/vp-engineering.md +49 -0
- package/dist/index.js +7182 -0
- package/package.json +69 -4
- package/themes/README.md +70 -0
- package/themes/acrylic-soft/THEME.md +142 -0
- package/themes/acrylic-soft/tokens.ts +180 -0
- package/themes/agency-creative/THEME.md +91 -0
- package/themes/agency-creative/tokens.ts +202 -0
- package/themes/agency-portfolio/THEME.md +109 -0
- package/themes/agency-portfolio/tokens.ts +159 -0
- package/themes/ai-startup/THEME.md +95 -0
- package/themes/ai-startup/tokens.ts +162 -0
- package/themes/airline-modern/THEME.md +104 -0
- package/themes/airline-modern/tokens.ts +179 -0
- package/themes/arc-stack/.anchor-render.png +0 -0
- package/themes/arc-stack/THEME.md +125 -0
- package/themes/arc-stack/audit.log.jsonl +6 -0
- package/themes/arc-stack/dismissals.jsonl +3 -0
- package/themes/arc-stack/tailwind.snippet.ts +17 -0
- package/themes/arc-stack/theme.yml +153 -0
- package/themes/arc-stack/tokens.ts +29 -0
- package/themes/architectural/THEME.md +102 -0
- package/themes/architectural/tokens.ts +159 -0
- package/themes/atelier-radiance/THEME.md +93 -0
- package/themes/atelier-radiance/audit.log.jsonl +1 -0
- package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
- package/themes/atelier-radiance/theme.yml +130 -0
- package/themes/atelier-radiance/tokens.ts +29 -0
- package/themes/automotive-ev/THEME.md +87 -0
- package/themes/automotive-ev/tokens.ts +183 -0
- package/themes/automotive-luxury/THEME.md +88 -0
- package/themes/automotive-luxury/tokens.ts +175 -0
- package/themes/baby-modern/THEME.md +79 -0
- package/themes/baby-modern/tokens.ts +184 -0
- package/themes/banking-gravity/THEME.md +171 -0
- package/themes/banking-gravity/tokens.ts +169 -0
- package/themes/beauty-clean/THEME.md +92 -0
- package/themes/beauty-clean/tokens.ts +176 -0
- package/themes/beauty-luxury/THEME.md +96 -0
- package/themes/beauty-luxury/tokens.ts +178 -0
- package/themes/bento-modular/.anchor-render.png +0 -0
- package/themes/bento-modular/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -0
- package/themes/bento-modular/audit.log.jsonl +3 -0
- package/themes/bento-modular/dismissals.jsonl +1 -0
- package/themes/bento-modular/tailwind.snippet.ts +17 -0
- package/themes/bento-modular/theme.yml +83 -0
- package/themes/bento-modular/tokens.ts +27 -0
- package/themes/bookstore-indie/THEME.md +78 -0
- package/themes/bookstore-indie/tokens.ts +147 -0
- package/themes/brutalist/THEME.md +96 -0
- package/themes/brutalist/tokens.ts +151 -0
- package/themes/business-tiles/THEME.md +141 -0
- package/themes/business-tiles/tokens.ts +178 -0
- package/themes/cabana-poster/THEME.md +158 -0
- package/themes/cabana-poster/audit.log.jsonl +1 -0
- package/themes/cabana-poster/tailwind.snippet.ts +16 -0
- package/themes/cabana-poster/theme.yml +221 -0
- package/themes/cabana-poster/tokens.ts +34 -0
- package/themes/case-panel/THEME.md +126 -0
- package/themes/case-panel/audit.log.jsonl +2 -0
- package/themes/case-panel/tailwind.snippet.ts +15 -0
- package/themes/case-panel/theme.yml +153 -0
- package/themes/case-panel/tokens.ts +28 -0
- package/themes/cinematic-dark/THEME.md +97 -0
- package/themes/cinematic-dark/tokens.ts +195 -0
- package/themes/classic-car/THEME.md +86 -0
- package/themes/classic-car/tokens.ts +173 -0
- package/themes/cloud-friendly/THEME.md +152 -0
- package/themes/cloud-friendly/tokens.ts +181 -0
- package/themes/community-niche/THEME.md +102 -0
- package/themes/community-niche/tokens.ts +177 -0
- package/themes/corporate-grid/THEME.md +154 -0
- package/themes/corporate-grid/tokens.ts +182 -0
- package/themes/couture-luxury/THEME.md +85 -0
- package/themes/couture-luxury/tokens.ts +146 -0
- package/themes/creator-social/THEME.md +131 -0
- package/themes/creator-social/tokens.ts +249 -0
- package/themes/crypto-onchain/THEME.md +100 -0
- package/themes/crypto-onchain/tokens.ts +207 -0
- package/themes/cycling-brand/THEME.md +78 -0
- package/themes/cycling-brand/tokens.ts +185 -0
- package/themes/dating-friendly/THEME.md +102 -0
- package/themes/dating-friendly/tokens.ts +178 -0
- package/themes/dense-utility/THEME.md +85 -0
- package/themes/dense-utility/tokens.ts +155 -0
- package/themes/devtool-cli/THEME.md +100 -0
- package/themes/devtool-cli/tokens.ts +195 -0
- package/themes/devtool-docs/THEME.md +105 -0
- package/themes/devtool-docs/tokens.ts +177 -0
- package/themes/editorial/THEME.md +129 -0
- package/themes/editorial/audit.log.jsonl +2 -0
- package/themes/editorial/tailwind.snippet.ts +15 -0
- package/themes/editorial/theme.yml +173 -0
- package/themes/editorial/tokens.ts +29 -0
- package/themes/education-formal/THEME.md +154 -0
- package/themes/education-formal/audit.log.jsonl +1 -0
- package/themes/education-formal/tailwind.snippet.ts +15 -0
- package/themes/education-formal/theme.yml +186 -0
- package/themes/education-formal/tokens.ts +29 -0
- package/themes/education-warm/THEME.md +91 -0
- package/themes/education-warm/tokens.ts +185 -0
- package/themes/ember-poster/README.md +79 -0
- package/themes/ember-poster/THEME.md +101 -0
- package/themes/ember-poster/audit.log.jsonl +17 -0
- package/themes/ember-poster/package.json +34 -0
- package/themes/ember-poster/tailwind.snippet.ts +17 -0
- package/themes/ember-poster/theme.yml +109 -0
- package/themes/ember-poster/tokens.ts +27 -0
- package/themes/enterprise-cloud/THEME.md +139 -0
- package/themes/enterprise-cloud/tokens.ts +179 -0
- package/themes/enterprise-tech/.anchor-render.png +0 -0
- package/themes/enterprise-tech/THEME.md +167 -0
- package/themes/enterprise-tech/audit.log.jsonl +1 -0
- package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
- package/themes/enterprise-tech/theme.yml +202 -0
- package/themes/enterprise-tech/tokens.ts +29 -0
- package/themes/ev-charging/THEME.md +94 -0
- package/themes/ev-charging/tokens.ts +185 -0
- package/themes/farm-direct/THEME.md +92 -0
- package/themes/farm-direct/tokens.ts +180 -0
- package/themes/fintech-card/THEME.md +96 -0
- package/themes/fintech-card/tokens.ts +191 -0
- package/themes/fintech-trust/THEME.md +94 -0
- package/themes/fintech-trust/tokens.ts +192 -0
- package/themes/food-blog/THEME.md +98 -0
- package/themes/food-blog/tokens.ts +183 -0
- package/themes/forum-classic/THEME.md +100 -0
- package/themes/forum-classic/tokens.ts +168 -0
- package/themes/fresh-plate/.anchor-render.png +0 -0
- package/themes/fresh-plate/THEME.md +144 -0
- package/themes/fresh-plate/audit.log.jsonl +2 -0
- package/themes/fresh-plate/dismissals.jsonl +3 -0
- package/themes/fresh-plate/tailwind.snippet.ts +16 -0
- package/themes/fresh-plate/theme.yml +189 -0
- package/themes/fresh-plate/tokens.ts +30 -0
- package/themes/furniture-modern/THEME.md +94 -0
- package/themes/furniture-modern/tokens.ts +176 -0
- package/themes/gaming-esports/THEME.md +146 -0
- package/themes/gaming-esports/tokens.ts +199 -0
- package/themes/gaming-streamer/THEME.md +139 -0
- package/themes/gaming-streamer/tokens.ts +201 -0
- package/themes/glassmorphic-modern/THEME.md +119 -0
- package/themes/glassmorphic-modern/tokens.ts +174 -0
- package/themes/government-civic/THEME.md +138 -0
- package/themes/government-civic/tokens.ts +164 -0
- package/themes/gym-chain/THEME.md +79 -0
- package/themes/gym-chain/tokens.ts +196 -0
- package/themes/healthcare-bright/THEME.md +95 -0
- package/themes/healthcare-bright/tokens.ts +184 -0
- package/themes/home-decor/THEME.md +94 -0
- package/themes/home-decor/tokens.ts +177 -0
- package/themes/hotel-boutique/THEME.md +110 -0
- package/themes/hotel-boutique/tokens.ts +179 -0
- package/themes/hyperminimal-mono/THEME.md +91 -0
- package/themes/hyperminimal-mono/tokens.ts +150 -0
- package/themes/indie-art-game/THEME.md +107 -0
- package/themes/indie-art-game/tokens.ts +216 -0
- package/themes/insurance-legacy/THEME.md +101 -0
- package/themes/insurance-legacy/tokens.ts +182 -0
- package/themes/insurance-modern/THEME.md +103 -0
- package/themes/insurance-modern/tokens.ts +192 -0
- package/themes/kaiju-reveal/THEME.md +97 -0
- package/themes/kaiju-reveal/tokens.ts +185 -0
- package/themes/kinetic-data/THEME.md +172 -0
- package/themes/kinetic-data/audit.log.jsonl +1 -0
- package/themes/kinetic-data/tailwind.snippet.ts +16 -0
- package/themes/kinetic-data/theme.yml +207 -0
- package/themes/kinetic-data/tokens.ts +30 -0
- package/themes/kinetic-headline/.anchor-render.png +0 -0
- package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -0
- package/themes/kinetic-headline/audit.log.jsonl +4 -0
- package/themes/kinetic-headline/dismissals.jsonl +1 -0
- package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
- package/themes/kinetic-headline/theme.yml +81 -0
- package/themes/kinetic-headline/tokens.ts +26 -0
- package/themes/law-firm/THEME.md +108 -0
- package/themes/law-firm/tokens.ts +158 -0
- package/themes/lawtech-modern/THEME.md +107 -0
- package/themes/lawtech-modern/tokens.ts +192 -0
- package/themes/linkedin-pro/THEME.md +102 -0
- package/themes/linkedin-pro/tokens.ts +174 -0
- package/themes/logistics-modern/THEME.md +94 -0
- package/themes/logistics-modern/tokens.ts +187 -0
- package/themes/magazine-glossy/THEME.md +74 -0
- package/themes/magazine-glossy/tokens.ts +158 -0
- package/themes/marker-mag/THEME.md +128 -0
- package/themes/marker-mag/audit.log.jsonl +1 -0
- package/themes/marker-mag/tailwind.snippet.ts +15 -0
- package/themes/marker-mag/theme.yml +159 -0
- package/themes/marker-mag/tokens.ts +27 -0
- package/themes/marketplace-modern/THEME.md +135 -0
- package/themes/marketplace-modern/tokens.ts +186 -0
- package/themes/marketplace-vintage/THEME.md +110 -0
- package/themes/marketplace-vintage/tokens.ts +185 -0
- package/themes/maximalist/THEME.md +96 -0
- package/themes/maximalist/tokens.ts +168 -0
- package/themes/mid-century/THEME.md +109 -0
- package/themes/mid-century/tokens.ts +162 -0
- package/themes/motorcycle-brand/THEME.md +86 -0
- package/themes/motorcycle-brand/tokens.ts +174 -0
- package/themes/museum/THEME.md +83 -0
- package/themes/museum/tokens.ts +147 -0
- package/themes/music-streaming/THEME.md +101 -0
- package/themes/music-streaming/tokens.ts +187 -0
- package/themes/music-vinyl/THEME.md +98 -0
- package/themes/music-vinyl/tokens.ts +167 -0
- package/themes/nature-distilled/.anchor-render.png +0 -0
- package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -0
- package/themes/nature-distilled/audit.log.jsonl +2 -0
- package/themes/nature-distilled/tailwind.snippet.ts +16 -0
- package/themes/nature-distilled/theme.yml +91 -0
- package/themes/nature-distilled/tokens.ts +26 -0
- package/themes/news-tabloid/THEME.md +72 -0
- package/themes/news-tabloid/tokens.ts +158 -0
- package/themes/news-tech/THEME.md +75 -0
- package/themes/news-tech/tokens.ts +149 -0
- package/themes/newsletter/THEME.md +82 -0
- package/themes/newsletter/tokens.ts +138 -0
- package/themes/newspaper-classic/THEME.md +74 -0
- package/themes/newspaper-classic/tokens.ts +159 -0
- package/themes/nonprofit-arts/THEME.md +78 -0
- package/themes/nonprofit-arts/tokens.ts +157 -0
- package/themes/nonprofit-warm/THEME.md +105 -0
- package/themes/nonprofit-warm/tokens.ts +188 -0
- package/themes/outdoor-adventure/THEME.md +113 -0
- package/themes/outdoor-adventure/tokens.ts +181 -0
- package/themes/overland-broadside/THEME.md +119 -0
- package/themes/overland-broadside/audit.log.jsonl +1 -0
- package/themes/overland-broadside/tailwind.snippet.ts +17 -0
- package/themes/overland-broadside/theme.yml +138 -0
- package/themes/overland-broadside/tokens.ts +27 -0
- package/themes/performance-engineered/THEME.md +162 -0
- package/themes/performance-engineered/audit.log.jsonl +1 -0
- package/themes/performance-engineered/tailwind.snippet.ts +15 -0
- package/themes/performance-engineered/theme.yml +193 -0
- package/themes/performance-engineered/tokens.ts +29 -0
- package/themes/pet-food/THEME.md +78 -0
- package/themes/pet-food/tokens.ts +185 -0
- package/themes/pharma-clinical/THEME.md +164 -0
- package/themes/pharma-clinical/audit.log.jsonl +1 -0
- package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
- package/themes/pharma-clinical/theme.yml +201 -0
- package/themes/pharma-clinical/tokens.ts +29 -0
- package/themes/pill-editorial/THEME.md +125 -0
- package/themes/pill-editorial/audit.log.jsonl +1 -0
- package/themes/pill-editorial/tailwind.snippet.ts +15 -0
- package/themes/pill-editorial/theme.yml +168 -0
- package/themes/pill-editorial/tokens.ts +31 -0
- package/themes/podcast-warm/THEME.md +103 -0
- package/themes/podcast-warm/tokens.ts +192 -0
- package/themes/publisher-indie/THEME.md +78 -0
- package/themes/publisher-indie/tokens.ts +148 -0
- package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
- package/themes/raw-concrete/THEME.md +76 -0
- package/themes/raw-concrete/audit.log.jsonl +10 -0
- package/themes/raw-concrete/tailwind.snippet.ts +16 -0
- package/themes/raw-concrete/theme.yml +88 -0
- package/themes/raw-concrete/tokens.ts +27 -0
- package/themes/realestate-luxury/THEME.md +94 -0
- package/themes/realestate-luxury/tokens.ts +169 -0
- package/themes/realestate-marketplace/THEME.md +106 -0
- package/themes/realestate-marketplace/tokens.ts +183 -0
- package/themes/restaurant-modern/THEME.md +109 -0
- package/themes/restaurant-modern/tokens.ts +172 -0
- package/themes/runway-fashion/THEME.md +99 -0
- package/themes/runway-fashion/tokens.ts +167 -0
- package/themes/saturday-morning/THEME.md +117 -0
- package/themes/saturday-morning/tokens.ts +281 -0
- package/themes/schema.ts +235 -0
- package/themes/signal-dark/BUILD_BRIEF.md +168 -0
- package/themes/signal-dark/THEME.md +107 -0
- package/themes/signal-dark/tokens.ts +181 -0
- package/themes/soft-modern/THEME.md +91 -0
- package/themes/soft-modern/tokens.ts +166 -0
- package/themes/solar-residential/THEME.md +92 -0
- package/themes/solar-residential/tokens.ts +176 -0
- package/themes/sports-league/THEME.md +180 -0
- package/themes/sports-league/audit.log.jsonl +1 -0
- package/themes/sports-league/tailwind.snippet.ts +15 -0
- package/themes/sports-league/theme.yml +213 -0
- package/themes/sports-league/tokens.ts +32 -0
- package/themes/stadium-sport/THEME.md +114 -0
- package/themes/stadium-sport/tokens.ts +187 -0
- package/themes/streetwear-hype/THEME.md +100 -0
- package/themes/streetwear-hype/tokens.ts +174 -0
- package/themes/studio-architect/THEME.md +108 -0
- package/themes/studio-architect/tokens.ts +162 -0
- package/themes/studio-photographer/THEME.md +88 -0
- package/themes/studio-photographer/tokens.ts +164 -0
- package/themes/team-kanban/.anchor-render.png +0 -0
- package/themes/team-kanban/THEME.md +167 -0
- package/themes/team-kanban/audit.log.jsonl +2 -0
- package/themes/team-kanban/dismissals.jsonl +1 -0
- package/themes/team-kanban/tailwind.snippet.ts +15 -0
- package/themes/team-kanban/theme.yml +209 -0
- package/themes/team-kanban/tokens.ts +35 -0
- package/themes/telehealth-modern/THEME.md +95 -0
- package/themes/telehealth-modern/tokens.ts +197 -0
- package/themes/tourism-board/THEME.md +111 -0
- package/themes/tourism-board/tokens.ts +173 -0
- package/themes/toys-modern/THEME.md +79 -0
- package/themes/toys-modern/tokens.ts +200 -0
- package/themes/travel-luxury/THEME.md +95 -0
- package/themes/travel-luxury/tokens.ts +162 -0
- package/themes/vacation-rental/THEME.md +105 -0
- package/themes/vacation-rental/tokens.ts +174 -0
- package/themes/vault-reel/THEME.md +134 -0
- package/themes/vault-reel/audit.log.jsonl +3 -0
- package/themes/vault-reel/tailwind.snippet.ts +16 -0
- package/themes/vault-reel/theme.yml +167 -0
- package/themes/vault-reel/tokens.ts +30 -0
- package/themes/vet-modern/THEME.md +79 -0
- package/themes/vet-modern/tokens.ts +194 -0
- package/themes/web3-restraint/THEME.md +87 -0
- package/themes/web3-restraint/tokens.ts +154 -0
- package/themes/wellness-active/THEME.md +102 -0
- package/themes/wellness-active/tokens.ts +203 -0
- package/themes/wellness-spa/THEME.md +93 -0
- package/themes/wellness-spa/tokens.ts +173 -0
- package/themes/y2k-chrome/THEME.md +118 -0
- package/themes/y2k-chrome/tokens.ts +249 -0
- package/themes/yoga-studio/THEME.md +76 -0
- package/themes/yoga-studio/tokens.ts +163 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const restaurantModern: Direction = {
|
|
4
|
+
name: "restaurant-modern",
|
|
5
|
+
ethos:
|
|
6
|
+
"Eleven Madison Park plating-as-art · Atomix NYC dark Korean fine dining · Pujol traditional Mexican warmth · Single Thread farm-to-table cream · Frantzén nordic-luxury restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Eleven Madison Park", trait: "cream + EB Garamond + plating-as-art photography" },
|
|
9
|
+
{ brand: "Atomix (NYC)", trait: "dark + serif + Korean fine-dining moody intimacy" },
|
|
10
|
+
{ brand: "Pujol", trait: "warm sand + traditional serif + Mexican fine-dining warmth" },
|
|
11
|
+
{ brand: "Single Thread", trait: "cream + serif + farm-to-table imagery" },
|
|
12
|
+
{ brand: "Frantzén", trait: "deep cream + restrained nordic-luxury, intimate room" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Modern fine-dining restaurant site. Warm sand-cream canvas with deep cocoa ink " +
|
|
16
|
+
"and one olive-bronze accent. Full-bleed plating photography reads as still life. " +
|
|
17
|
+
"EB Garamond display at oversized scale, generous breathing, mono captions for " +
|
|
18
|
+
"course and producer credits. The page carries reservation-required gravity — " +
|
|
19
|
+
"the room exists, the chef exists, the booking is the conversation.",
|
|
20
|
+
|
|
21
|
+
fonts: {
|
|
22
|
+
display: {
|
|
23
|
+
family: "EB Garamond",
|
|
24
|
+
fallback: ["Cormorant Garamond", "Iowan Old Style", "Garamond", "Georgia", "serif"],
|
|
25
|
+
from: "EB Garamond — Eleven Madison Park / Single Thread restaurant-serif register; italic-friendly for course names",
|
|
26
|
+
googleFont: "EB+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500",
|
|
27
|
+
weights: [400, 500, 600],
|
|
28
|
+
},
|
|
29
|
+
body: {
|
|
30
|
+
family: "Inter",
|
|
31
|
+
fallback: ["Söhne", "Neue Haas Grotesk", "system-ui", "-apple-system", "sans-serif"],
|
|
32
|
+
from: "Inter — the neutral sans body; Pujol/Atomix support type, lets the serif and the food carry",
|
|
33
|
+
googleFont: "Inter:wght@400;500",
|
|
34
|
+
weights: [400, 500],
|
|
35
|
+
},
|
|
36
|
+
mono: {
|
|
37
|
+
family: "JetBrains Mono",
|
|
38
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
39
|
+
from: "JetBrains Mono — course numbers (I, II, III also acceptable), producer credits, allergen labels, small only",
|
|
40
|
+
googleFont: "JetBrains+Mono:wght@400",
|
|
41
|
+
weights: [400],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
typography: {
|
|
46
|
+
headingTracking: "-0.012em", // EB Garamond at restaurant-display scale — slight negative tracking
|
|
47
|
+
bodyTracking: "0", // Inter body — neutral, lets the serif lead
|
|
48
|
+
fontFeatureSettings: '"liga", "dlig", "onum", "kern"',
|
|
49
|
+
h1ScaleClamp: "clamp(2.75rem, 7vw, 6rem)", // dining-room hero scale, Single Thread / EMP register
|
|
50
|
+
bodyBaseSize: "1.0625rem", // 17px — menu-card prose, comfortable for a long read
|
|
51
|
+
bodyLineHeight: "1.7", // generous, restaurant-program pacing
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
colors: {
|
|
55
|
+
background: { hsl: "34 26% 92%", from: "Pujol warm sand-cream — restaurant linen and unbleached menu card" },
|
|
56
|
+
foreground: { hsl: "24 22% 14%", from: "Eleven Madison Park deep cocoa ink — slate-stone reduction shadow" },
|
|
57
|
+
card: { hsl: "34 30% 96%", from: "Single Thread lifted ivory — one tier brighter than the linen page" },
|
|
58
|
+
popover: { hsl: "34 30% 96%", from: "same as card; depth from hairline only" },
|
|
59
|
+
primary: { hsl: "32 38% 28%", from: "Frantzén olive-bronze — restrained nordic-luxury accent, used for primary action and dish-card eyebrows" },
|
|
60
|
+
primaryForeground: { hsl: "34 26% 92%", from: "warm sand-cream on olive-bronze primary" },
|
|
61
|
+
secondary: { hsl: "34 22% 88%", from: "Pujol warm sand, one tier deeper — printed-menu second-tone" },
|
|
62
|
+
secondaryForeground: { hsl: "24 22% 14%", from: "cocoa ink on warm sand" },
|
|
63
|
+
muted: { hsl: "34 22% 88%", from: "same as secondary — differentiation by usage, not color" },
|
|
64
|
+
mutedForeground: { hsl: "24 14% 38%", from: "Atomix muted slate ink — course descriptions and small print" },
|
|
65
|
+
accent: { hsl: "34 24% 84%", from: "warm sand, deepest tier — hover surface only" },
|
|
66
|
+
accentForeground: { hsl: "24 22% 14%", from: "cocoa ink on warm sand accent" },
|
|
67
|
+
border: { hsl: "24 14% 76%", from: "restaurant menu hairline rule — printed-card divider weight, barely visible" },
|
|
68
|
+
input: { hsl: "24 14% 76%", from: "same as border — reservation form is hairlines, not boxes" },
|
|
69
|
+
ring: { hsl: "32 38% 28%", from: "primary olive-bronze — focus ring, the one accent moment" },
|
|
70
|
+
destructive: { hsl: "8 58% 38%", from: "wine-red alert — burgundy, dining-program register, never screaming red" },
|
|
71
|
+
destructiveForeground: { hsl: "34 26% 92%", from: "warm sand on wine-red" },
|
|
72
|
+
brand: {
|
|
73
|
+
"linen-cream": { hsl: "34 26% 92%", from: "Pujol warm sand-cream — alias of the background, the linen" },
|
|
74
|
+
"ivory-card": { hsl: "34 30% 96%", from: "Single Thread lifted ivory — menu-card and dish-card stock" },
|
|
75
|
+
"ink-cocoa": { hsl: "24 22% 14%", from: "Eleven Madison Park deep cocoa — foreground, reduction shadow" },
|
|
76
|
+
"olive-bronze": { hsl: "32 38% 28%", from: "Frantzén olive-bronze — primary accent" },
|
|
77
|
+
"ember-warm": { hsl: "18 48% 48%", from: "Pujol kitchen-ember red-brown — used sparingly on tasting-menu badges and 'Reserve' eyebrows" },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
spacing: {
|
|
82
|
+
base: 4,
|
|
83
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160], // generous, dining-room pacing
|
|
84
|
+
containerMax: "max-w-5xl", // 1024px — plating photography reads at this width without becoming a magazine spread
|
|
85
|
+
containerPadding: "px-6 lg:px-12",
|
|
86
|
+
sectionPadding: {
|
|
87
|
+
hero: "pt-28 pb-20 lg:pt-44 lg:pb-32",
|
|
88
|
+
default: "py-20 lg:py-32",
|
|
89
|
+
tight: "py-14 lg:py-20",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
radius: {
|
|
94
|
+
base: "0", // printed-menu convention — sharp corners, no consumer softness
|
|
95
|
+
pillsAllowed: false, // no chip pills; "Reserve" is a text-link, not a pill
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
shadows: {
|
|
99
|
+
style: "minimal",
|
|
100
|
+
utilities: {
|
|
101
|
+
"menu-rule":
|
|
102
|
+
"0 1px 0 0 hsl(var(--foreground) / 0.14)", // 1px printed-menu divider between courses
|
|
103
|
+
"plating-shadow":
|
|
104
|
+
"0 24px 64px -28px hsl(var(--foreground) / 0.28)", // one diffuse drop, plating-photo elevation, never on UI chrome
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
motion: {
|
|
109
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
110
|
+
durations: {
|
|
111
|
+
reveal: 1200, // restaurant pacing — the course is served
|
|
112
|
+
loop: 4000,
|
|
113
|
+
ambient: 32000,
|
|
114
|
+
},
|
|
115
|
+
keyframes: {
|
|
116
|
+
"course-rise": {
|
|
117
|
+
css:
|
|
118
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
119
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
120
|
+
defaultDuration: 1200,
|
|
121
|
+
iteration: "once",
|
|
122
|
+
purpose:
|
|
123
|
+
"the standard entrance — 1.2s reveal for menu cards, dish photography, and chef's-program copy. The course is set down, not flung.",
|
|
124
|
+
},
|
|
125
|
+
"ember-pulse": {
|
|
126
|
+
css:
|
|
127
|
+
"0%, 100% { opacity: 0.85; }\n" +
|
|
128
|
+
"50% { opacity: 1; }",
|
|
129
|
+
defaultDuration: 4000,
|
|
130
|
+
iteration: "infinite",
|
|
131
|
+
purpose:
|
|
132
|
+
"4s soft pulse on the single 'Reserve' eyebrow ember-warm dot — a heartbeat marker, the room is open. Never on more than one element per page.",
|
|
133
|
+
},
|
|
134
|
+
"plate-ken-burns": {
|
|
135
|
+
css:
|
|
136
|
+
"from { transform: scale(1.0); }\n" +
|
|
137
|
+
"to { transform: scale(1.06); }",
|
|
138
|
+
defaultDuration: 32000,
|
|
139
|
+
iteration: "infinite",
|
|
140
|
+
purpose:
|
|
141
|
+
"32s slow zoom on hero plating photography — restaurant-program presence, the still life almost imperceptibly breathing.",
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
respectsReducedMotion: true,
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
density: "low",
|
|
148
|
+
|
|
149
|
+
patterns: {
|
|
150
|
+
button:
|
|
151
|
+
"Primary CTA is a serif italic text-link in olive-bronze (--primary), underline always visible — heritage menu-card convention. " +
|
|
152
|
+
"The solid button is reserved for ONE 'Reserve' hero CTA per page — ink-cocoa bg + linen-cream text, sharp rectangle, no radius. " +
|
|
153
|
+
"Never a chip, never a gradient, never a shadow on a button. Reservation gravity comes from typography, not from button weight.",
|
|
154
|
+
card:
|
|
155
|
+
"Course/dish cards: hairline top + hairline bottom rule at foreground/14, ivory-card bg (one tier above page), no fill-differentiation depth. " +
|
|
156
|
+
"Course number in JetBrains Mono small-caps (I, II, III or 01/12), dish name in EB Garamond italic display, producer credits in mono row beneath. " +
|
|
157
|
+
"Internal padding p-8 lg:p-12. Plating photography sits flush above the card with a single plating-shadow drop.",
|
|
158
|
+
input:
|
|
159
|
+
"Reservation form: border-bottom only (1px --border). No full box. Label above in tracked-uppercase Inter small caps (letter-spacing 0.12em). " +
|
|
160
|
+
"Placeholder in muted-foreground italic serif. Focus is olive-bronze ring, 1px.",
|
|
161
|
+
cta:
|
|
162
|
+
"Default CTA is serif italic text-link in olive-bronze with always-visible underline. " +
|
|
163
|
+
"The single 'Reserve' hero CTA is the one solid-fill exception — ink-cocoa bg, linen-cream text, optional ember-pulse heartbeat marker beside it. Never repeated.",
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
details: {
|
|
167
|
+
selectionBg: "hsl(var(--primary) / 0.20)",
|
|
168
|
+
selectionFg: "hsl(var(--foreground))",
|
|
169
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
170
|
+
scrollbarStyle: "thin",
|
|
171
|
+
},
|
|
172
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Design Direction — Runway-Fashion
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Chanel high-contrast b/w · Vogue runway photography · Saint Laurent disciplined restraint · Comme des Garçons asymmetric type · Helmut Newton drama
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Binary pure-black-on-pure-white (or inverted). Oversized Didone serif at editorial scale — the hero is the type, set Vogue-cover large in italic Playfair. A single tiny couture-red accent is permitted, used once per page. Couture severity: this direction rejects color. The opposite of soft-modern.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Chanel** → binary black-and-white. No color, no warmth. Oversized display serif laid over runway photography.
|
|
11
|
+
- **Vogue** → issue typography. Italic Playfair at cover scale; fashion-plate restraint in the layout grid.
|
|
12
|
+
- **Saint Laurent** → disciplined minimalism. ALL-CAPS sparse-tracked wordmark; geometric severity.
|
|
13
|
+
- **Comme des Garçons** → Rei Kawakubo asymmetric layouts. Deliberate "wrong" type — the negative space is the composition.
|
|
14
|
+
- **Helmut Newton** → high-drama runway photography. Deep shadows, Tri-X 35mm grain, single subject.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **pure white** (background, card, popover, secondary). There is no surface differentiation — depth comes from **whitespace and 1px black rules**, never from fill tiers, never from shadows.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--couture-red` (Chanel lipstick — the SINGLE red accent, used **once per page maximum, never twice**), `--ivory` (barely-off-white for masthead layering), `--noir` (deep ink for layered black-on-black overlays on runway photography). Primary is `0 0% 0%` — black is the primary; the couture-red is reserved for one moment.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Playfair Display (Bodoni Moda as fallback). Italic prominent. The Didone-style high-contrast serif is the design — set at Vogue-cover scale.
|
|
25
|
+
- **Body:** Inter, **16px**, line-height **1.5**. Clean sans so the serif is the hero; body never competes.
|
|
26
|
+
- **Mono:** JetBrains Mono. Tiny — issue numbers, "Vol 47 / Spring", credit lines. Never for body, never for headings.
|
|
27
|
+
|
|
28
|
+
Hero h1 uses `clamp(4rem, 10vw, 9rem)` — Vogue-cover scale, italic Playfair. Tracking is `-0.02em` on headings (Didone at this scale needs the optical tighten), `0` on body. Font features: `"kern", "liga", "dlig", "tnum"` — discretionary ligatures unlock italic Playfair's swash forms.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-6 lg:px-12` — Vogue cover proportions, 1152px.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-32 pb-24 lg:pt-48 lg:pb-32` (cover-of-the-issue scale)
|
|
34
|
+
- Default: `py-24 lg:py-32`
|
|
35
|
+
- Tight: `py-12 lg:py-16`
|
|
36
|
+
- **Allowed scale values:** **4 8 12 16 24 32 48 64 96 128 160**. Couture-generous; low density wants more air.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. **Pure black (`0 0% 0%`) and pure white (`0 0% 100%`) are the language** — the Chanel binary. The single `--couture-red` (`0 100% 45%`) is the Chanel lipstick and the only allowed third color. Use it **once per page**: one primary CTA, or one rule, or one inline mark. Never twice. Never as a card border, never as a heading color, never in imagery.
|
|
40
|
+
|
|
41
|
+
`--muted` and `--accent` (`0 0% 98%`) are Vogue ivory — barely-off-white for masthead/credit layering. `--muted-foreground` (`0 0% 40%`) is the Helmut Newton mid-tone, used only for caption gray. There are no other grays.
|
|
42
|
+
|
|
43
|
+
This direction **rejects** warmth (no paper-cream, no Kodak Portra), gradients, glassmorphism, decorative ornament. Austerity is the direction.
|
|
44
|
+
|
|
45
|
+
## Radius
|
|
46
|
+
`--radius: 0`. **Sharp couture corners only.** Pills are disallowed (`pillsAllowed: false`) — pills are anti-couture. Chanel and Saint Laurent never rounded a corner.
|
|
47
|
+
|
|
48
|
+
## Shadows
|
|
49
|
+
**None.** The shadow utilities object is intentionally empty. Drops are forbidden; composition does the work. Separation comes from oversized whitespace and 1px black rules.
|
|
50
|
+
|
|
51
|
+
## Motion
|
|
52
|
+
Runway-walk pacing — deliberate, never hurried.
|
|
53
|
+
|
|
54
|
+
- `runway-step` — **600ms** opacity-only fade between hero slides. The model walks; the page does not.
|
|
55
|
+
- `cover-flip` — **300ms** 8px translate for cover-of-the-issue reveals. Used sparingly, once per page maximum.
|
|
56
|
+
|
|
57
|
+
No marquee, no parallax, no ambient loops (`loop: 0`, `ambient: 0`). Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored.
|
|
58
|
+
|
|
59
|
+
## Component patterns
|
|
60
|
+
- **Buttons:** two states, no middle ground.
|
|
61
|
+
- Primary text-link = ALL CAPS, sparse-tracked (`letter-spacing: 0.2em`), text-underline, black on white — the Saint Laurent wordmark move.
|
|
62
|
+
- Primary filled = oversized "SHOP" rectangle in pure black with white text, ALL CAPS, sparse-tracked.
|
|
63
|
+
- The `--couture-red` filled rectangle is reserved for **one primary action per page** — never repeated. No ghost mid-state, no hover lift, no rounded corners.
|
|
64
|
+
- **Cards:** no card chrome. Editorial blocks sit directly on the page, separated by oversized whitespace. When grouping is required, a single 1px black rule above. No fill, no shadow, no rounded corners. Titles in italic Playfair at Vogue-cover scale; body in 16px Inter.
|
|
65
|
+
- **Inputs:** 1px black border, sharp corners, white background. Label above in ALL CAPS sparse-tracked mono. Focus = 1px inset black ring, no glow. Placeholder italic Playfair, lowercase — the one place italic is permitted in chrome.
|
|
66
|
+
- **CTAs:** the default CTA is the Saint Laurent ALL-CAPS sparse-tracked text-underline link. The couture-red filled rectangle is the **one** Chanel-lipstick moment per page. There is no second.
|
|
67
|
+
|
|
68
|
+
## Recommended rich media
|
|
69
|
+
|
|
70
|
+
**Cover.** Editorial fashion photography in the Helmut Newton high-drama tradition — model walking, single subject, deep shadows, Tri-X 35mm grain. Runway documentation (model in motion) or product detail shots on white seamless. Pure b/w grading **only**, or muted desaturated color if absolutely necessary. The hero is sometimes the type alone — italic Playfair at clamp(4rem, 10vw, 9rem) needs no image.
|
|
71
|
+
|
|
72
|
+
**AI tool recommendations.**
|
|
73
|
+
- **Midjourney** for runway/editorial photography — prompts like *"Vogue runway photography, Helmut Newton lighting, model walking, high contrast black and white, 35mm Tri-X film grain, deep shadows"*.
|
|
74
|
+
- **Recraft** for fashion-plate illustration in the Erté tradition — single-line couture figures, black on white.
|
|
75
|
+
- **Or use type alone** — italic Playfair at Vogue-cover scale carries the page without an image. This is often the right answer.
|
|
76
|
+
|
|
77
|
+
**Aspect ratios.** 4:5 portrait (couture-magazine standard) — primary. 3:2 landscape — occasional, for runway documentation. Never 16:9 (cinematic, off-feel). Never 1:1 (Instagram aesthetic).
|
|
78
|
+
|
|
79
|
+
**Color in imagery.** Black and white **only**, or heavily desaturated. The `--couture-red` appears in UI chrome — **never in imagery**.
|
|
80
|
+
|
|
81
|
+
**What to avoid.** Warm color grading (that's mid-century territory). Gradients. Glassmorphism. Decorative ornament. AI-photorealistic gloss. 3D renders. Lens flare. Stock photography with smiling models. Color-saturated runway shots — desaturate or grade to pure b/w.
|
|
82
|
+
|
|
83
|
+
**Honest constraint.** Austerity is the direction. If you are reaching for an image to fill space, the layout is the problem — set the type larger.
|
|
84
|
+
|
|
85
|
+
**Accessibility.** Long-form alt-text — describe the photograph as if for a blind reader. Italic Playfair at hero scale needs `aria-level` correctness; do not let display-size override semantic hierarchy.
|
|
86
|
+
|
|
87
|
+
## Component families
|
|
88
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they are established. If a family ever calls for color beyond `--couture-red`, the rule is broken — escalate before adding.
|
|
89
|
+
|
|
90
|
+
## Details
|
|
91
|
+
- **Selection:** `hsl(var(--foreground))` background, `hsl(var(--background))` text — pure couture inversion.
|
|
92
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` (black). No offset, no glow.
|
|
93
|
+
- **Scrollbar:** thin — a single black rule, the one chrome detail allowed.
|
|
94
|
+
|
|
95
|
+
## Exceptions
|
|
96
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason. The Director's consistency pass lists all exceptions for human review.
|
|
97
|
+
|
|
98
|
+
## Revisions
|
|
99
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const runwayFashion: Direction = {
|
|
4
|
+
name: "runway-fashion",
|
|
5
|
+
ethos:
|
|
6
|
+
"Chanel high-contrast b/w · Vogue runway photography · Saint Laurent disciplined restraint · Comme des Garçons asymmetric type · Helmut Newton drama",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Chanel", trait: "binary black-and-white, no color, oversized display serif on runway photography" },
|
|
9
|
+
{ brand: "Vogue", trait: "issue typography, fashion plate restraint, couture-magazine cover scale" },
|
|
10
|
+
{ brand: "Saint Laurent", trait: "disciplined minimalism, geometric, all-caps sparse-tracked wordmark" },
|
|
11
|
+
{ brand: "Comme des Garçons", trait: "Rei Kawakubo asymmetric layouts, deliberate 'wrong' type" },
|
|
12
|
+
{ brand: "Helmut Newton", trait: "high-drama runway photography, deep shadows, Tri-X film grain" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Binary pure-black-on-pure-white (or inverted). Oversized Didone serif at " +
|
|
16
|
+
"editorial scale — the hero is the type, set Vogue-cover large in italic Playfair. " +
|
|
17
|
+
"A single tiny couture-red accent is permitted, used once per page. Couture severity: " +
|
|
18
|
+
"this direction rejects color. The opposite of soft-modern.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Playfair Display",
|
|
23
|
+
fallback: ["Bodoni Moda", "Didot", "Bodoni 72", "Bodoni", "Times New Roman", "serif"],
|
|
24
|
+
from: "Vogue/Chanel Didone-style high-contrast serif — oversized italic is the cover move",
|
|
25
|
+
googleFont: "Playfair+Display:wght@400;700;900",
|
|
26
|
+
weights: [400, 700, 900],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Inter",
|
|
30
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "sans-serif"],
|
|
31
|
+
from: "Saint Laurent body restraint — clean sans so the serif is the design; never decorative",
|
|
32
|
+
googleFont: "Inter",
|
|
33
|
+
weights: [400, 500],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "Vogue issue-number metadata — 'Vol 47 / Spring', tiny, used only for masthead bookkeeping",
|
|
39
|
+
googleFont: "JetBrains+Mono",
|
|
40
|
+
weights: [400],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.02em", // Didone display at Vogue scale wants the optical tighten
|
|
46
|
+
bodyTracking: "0", // body is neutral so the display serif carries the page
|
|
47
|
+
fontFeatureSettings: '"kern", "liga", "dlig", "tnum"', // discretionary ligatures for italic Playfair
|
|
48
|
+
h1ScaleClamp: "clamp(4rem, 10vw, 9rem)", // Vogue-cover scale — italic Playfair as hero
|
|
49
|
+
bodyBaseSize: "1rem", // 16px — Saint Laurent restraint
|
|
50
|
+
bodyLineHeight: "1.5",
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "0 0% 100%", from: "Chanel pure white — couture stock, no warmth, no paper-cream" },
|
|
55
|
+
foreground: { hsl: "0 0% 0%", from: "Chanel pure black — couture ink, the binary opposite of the page" },
|
|
56
|
+
card: { hsl: "0 0% 100%", from: "Saint Laurent surface restraint — no card differentiation; the page is the surface" },
|
|
57
|
+
popover: { hsl: "0 0% 100%", from: "Saint Laurent restraint — depth is forbidden, popovers sit on white" },
|
|
58
|
+
primary: { hsl: "0 0% 0%", from: "Chanel black IS the primary — the couture-red accent is reserved for one moment" },
|
|
59
|
+
primaryForeground: { hsl: "0 0% 100%", from: "Chanel pure white on black — couture inversion" },
|
|
60
|
+
secondary: { hsl: "0 0% 100%", from: "Saint Laurent secondary surface — no second tier; differentiate by typographic weight" },
|
|
61
|
+
secondaryForeground: { hsl: "0 0% 0%", from: "Chanel black, always — no gray-on-gray dilution" },
|
|
62
|
+
muted: { hsl: "0 0% 98%", from: "Vogue ivory — barely-off-white for layering masthead metadata blocks" },
|
|
63
|
+
mutedForeground: { hsl: "0 0% 40%", from: "Helmut Newton mid-tone — caption gray, instrument-feel for credit lines" },
|
|
64
|
+
accent: { hsl: "0 0% 98%", from: "Vogue ivory hover surface — same as muted; restraint over distinction" },
|
|
65
|
+
accentForeground: { hsl: "0 0% 0%", from: "Chanel black on hover" },
|
|
66
|
+
border: { hsl: "0 0% 0%", from: "Saint Laurent 1px black rule — couture line, never softened to gray" },
|
|
67
|
+
input: { hsl: "0 0% 0%", from: "Saint Laurent input rule — same as border; inputs are hairlines on the page" },
|
|
68
|
+
ring: { hsl: "0 0% 0%", from: "Chanel black focus ring — no accent leakage, couture severity" },
|
|
69
|
+
destructive: { hsl: "0 100% 45%", from: "Chanel lipstick — same single red as the couture accent; destructive shares the one color" },
|
|
70
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "Chanel pure white on couture-red" },
|
|
71
|
+
brand: {
|
|
72
|
+
"couture-red": {
|
|
73
|
+
hsl: "0 100% 45%",
|
|
74
|
+
from: "Chanel lipstick — the SINGLE red accent, used ONCE per page maximum, never twice",
|
|
75
|
+
},
|
|
76
|
+
ivory: {
|
|
77
|
+
hsl: "0 0% 98%",
|
|
78
|
+
from: "Vogue ivory — barely-off-white for layering masthead and credit blocks",
|
|
79
|
+
},
|
|
80
|
+
noir: {
|
|
81
|
+
hsl: "0 0% 4%",
|
|
82
|
+
from: "Helmut Newton deep ink — for layered black-on-black runway photography overlays",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
spacing: {
|
|
88
|
+
base: 4,
|
|
89
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160], // couture-generous; low density wants more air
|
|
90
|
+
containerMax: "max-w-6xl", // 1152px — Vogue cover proportions
|
|
91
|
+
containerPadding: "px-6 lg:px-12",
|
|
92
|
+
sectionPadding: {
|
|
93
|
+
hero: "pt-32 pb-24 lg:pt-48 lg:pb-32", // oversized — cover-of-the-issue scale
|
|
94
|
+
default: "py-24 lg:py-32",
|
|
95
|
+
tight: "py-12 lg:py-16",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
radius: {
|
|
100
|
+
base: "0", // sharp couture corners — Chanel and Saint Laurent never rounded
|
|
101
|
+
pillsAllowed: false, // pills are anti-couture; status uses rectangles or text
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
shadows: {
|
|
105
|
+
style: "none", // drops are forbidden; composition does the work
|
|
106
|
+
utilities: {}, // intentionally empty — no shadow utilities ship
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
motion: {
|
|
110
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
111
|
+
durations: {
|
|
112
|
+
reveal: 600, // runway-walk pacing — deliberate, never hurried
|
|
113
|
+
loop: 0, // no loops — the page is a printed cover
|
|
114
|
+
ambient: 0, // no ambient motion — couture stillness
|
|
115
|
+
},
|
|
116
|
+
keyframes: {
|
|
117
|
+
"runway-step": {
|
|
118
|
+
css:
|
|
119
|
+
"from { opacity: 0; }\n" +
|
|
120
|
+
"to { opacity: 1; }",
|
|
121
|
+
defaultDuration: 600,
|
|
122
|
+
iteration: "once",
|
|
123
|
+
purpose:
|
|
124
|
+
"deliberate runway-walk pacing — 600ms opacity-only fade between hero slides. No transform; the model walks, the page does not.",
|
|
125
|
+
},
|
|
126
|
+
"cover-flip": {
|
|
127
|
+
css:
|
|
128
|
+
"from { opacity: 0; transform: translateX(8px); }\n" +
|
|
129
|
+
"to { opacity: 1; transform: translateX(0); }",
|
|
130
|
+
defaultDuration: 300,
|
|
131
|
+
iteration: "once",
|
|
132
|
+
purpose:
|
|
133
|
+
"Vogue cover reveal — 300ms 8px slide for cover-of-the-issue transitions. Used sparingly; once per page maximum.",
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
respectsReducedMotion: true,
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
density: "low",
|
|
140
|
+
|
|
141
|
+
patterns: {
|
|
142
|
+
button:
|
|
143
|
+
"Two states, no middle ground. " +
|
|
144
|
+
"Primary text-link = ALL CAPS, sparse-tracked (`letter-spacing: 0.2em`), text-underline, black on white — the Saint Laurent wordmark move. " +
|
|
145
|
+
"Primary filled = oversized 'SHOP' rectangle in pure black with white text, ALL CAPS, sparse-tracked. " +
|
|
146
|
+
"The couture-red filled rectangle is reserved for the single primary action per page — never repeated. " +
|
|
147
|
+
"No ghost mid-state, no hover lift, no rounded corners.",
|
|
148
|
+
card:
|
|
149
|
+
"No card chrome. Editorial blocks sit directly on the page, separated by oversized whitespace. " +
|
|
150
|
+
"When grouping is required, a single 1px black rule above. No fill, no shadow, no rounded corners. " +
|
|
151
|
+
"Titles in italic Playfair Display at Vogue-cover scale; body in 16px Inter.",
|
|
152
|
+
input:
|
|
153
|
+
"1px black border, sharp corners, white background. Label above in ALL CAPS sparse-tracked mono. " +
|
|
154
|
+
"Focus = 1px inset black ring, no glow. Placeholder italic Playfair, lowercase — the one place italic is permitted in chrome.",
|
|
155
|
+
cta:
|
|
156
|
+
"Default CTA is the Saint Laurent ALL-CAPS sparse-tracked text-underline link. " +
|
|
157
|
+
"The couture-red filled rectangle is the ONE marketing moment per page — the Chanel-lipstick accent. " +
|
|
158
|
+
"There is no second.",
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
details: {
|
|
162
|
+
selectionBg: "hsl(var(--foreground))", // black selection — pure couture inversion
|
|
163
|
+
selectionFg: "hsl(var(--background))", // white text on black
|
|
164
|
+
focusRing: "1px solid hsl(var(--ring))", // 1px black, no offset, no glow
|
|
165
|
+
scrollbarStyle: "thin", // thin black rule — the only chrome detail allowed
|
|
166
|
+
},
|
|
167
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Design Direction — Saturday Morning
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Cartoon Network playful · Nickelodeon orange splat · Adult Swim ironic edge · Pixar warmth · Adventure Time hand-drawn whimsy
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Bright, chunky, playful without being childish. Bold display fonts with friendly roundness, many colors used confidently, hard-offset shadow drops give a sticker-pack feel. Reads as fun-but-considered, not Comic-Sans — the cartoon sensibility filtered through an Adult Swim editor's eye.
|
|
8
|
+
|
|
9
|
+
Maximalist is the closest sibling — same many-colors confidence, same brand-token bg overrides on components — but where maximalist works in editorial sharp corners and Wes Anderson serifs, saturday-morning rounds every edge into pillow shapes and lets a chunky display sans do the talking. The shadows are the giveaway: maximalist refuses shadows, saturday-morning lives on hard 4px sticker drops.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Cartoon Network (1990s-2000s bumper graphics)** → chunky bold type, mismatched colors, sticker-pack composition. The bumper card between commercials, not the show itself.
|
|
13
|
+
- **Nickelodeon** → orange splat, slime green, oversized round shapes. The splat is the brand and the brand is the splat.
|
|
14
|
+
- **Adult Swim** → ironic late-night minimalism with chunky type. Deadpan title cards on a single color — the wink that keeps this direction out of the kid zone.
|
|
15
|
+
- **Pixar** → warm character lighting, friendly rounded forms. Not photorealism — the *warmth* of Pixar, the soft-edge geometry.
|
|
16
|
+
- **Adventure Time** → hand-drawn wobble, expressive shapes, flat-color whimsy. The candy-kingdom palette and the slight imperfection that makes a vector line feel hand-traced.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
20
|
+
|
|
21
|
+
Surface stack is **bright cream** (background) → **lighter cream** (card) → **deeper cream** (muted) — the sun pouring through the kitchen window on a Saturday at 7am. Depth comes from **thick 2px `--ink` borders** and the **hard-offset sticker shadows**, never from hue shift on the cream tiers.
|
|
22
|
+
|
|
23
|
+
Brand tokens (named, never numbered): `--slime` (Nick slime green), `--sun` (Cartoon Network sun yellow, = secondary), `--sky` (Adventure Time sky blue, = accent), `--cherry` (Pixar character red, = destructive), `--grape` (Adult Swim title-card purple), `--magenta` (= primary), `--cream` (= background), `--ink` (= foreground). At least five named accent colors is the minimum — this direction is built around having many.
|
|
24
|
+
|
|
25
|
+
Primary is **hot magenta-pink** (`325 90% 55%`) — the Nickelodeon energy color, the splat saturation. Foreground is **deep purple-black** (`275 30% 15%`), never pure black; the slight hue gives the candy palette room to sit against it. Pure white and pure black are forbidden — `--cream` and `--ink` replace them.
|
|
26
|
+
|
|
27
|
+
## Typography
|
|
28
|
+
- **Display:** Fredoka (chunky friendly rounded display — the cartoon-bumper feel without the Comic-Sans wobble). Lilita One covers the same territory if Fredoka is unavailable. Weights 500/700/900. h1–h4.
|
|
29
|
+
- **Body:** DM Sans (friendly rounded sans, soft terminals that pair with Fredoka without competing). 17px (`1.0625rem`), line-height 1.6.
|
|
30
|
+
- **Mono:** JetBrains Mono (rounded humanist mono with personality — reads like a credits crawl on a cartoon bumper). Captions, code, micro-labels.
|
|
31
|
+
|
|
32
|
+
H1 uses `clamp(2.75rem, 7vw, 5.5rem)` — chunky display wants size, bumper-card territory. Heading tracking `-0.01em` — Fredoka is wide and round; a hair of negative tracking tightens the chunky feel. Body tracks `0`. Font features `"ss01", "cv11"` on DM Sans.
|
|
33
|
+
|
|
34
|
+
## Spacing
|
|
35
|
+
- **Container:** `max-w-5xl px-6 lg:px-10`.
|
|
36
|
+
- **Section padding tiers:**
|
|
37
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
|
|
38
|
+
- Default: `py-16 lg:py-24`
|
|
39
|
+
- Tight: `py-12 lg:py-16`
|
|
40
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 48 64. Medium density — decoration takes room.
|
|
41
|
+
|
|
42
|
+
## Color
|
|
43
|
+
No hex anywhere in component files. Color is the medium. Components are *encouraged* to override their background with any brand token — a card may be slime-green, a callout may be sky-blue, a tag row may run sun → cherry → grape across five chips. The cream background is the canvas, not a default.
|
|
44
|
+
|
|
45
|
+
The palette is **bright and warm by default**. If you reach for a desaturated enterprise blue or a moody gray, you've left the direction. The destructive token is warm cherry-red (`350°`), not magenta-red, because alerts should still feel hand-drawn.
|
|
46
|
+
|
|
47
|
+
## Radius
|
|
48
|
+
`--radius: 1.5rem` (24px). **Very rounded — pillowy soft, sticker-edge feel.** Pills are allowed (`pillsAllowed: true`) and encouraged for tags, toggles, and compact actions. Hard right angles read "developer demo" or "editorial," not Saturday morning — keep everything round.
|
|
49
|
+
|
|
50
|
+
## Shadows
|
|
51
|
+
`style: "none"` — meaning no gaussian-blur drop shadows. The depth language is **hard-offset sticker shadows** instead: a flat color block, 4px down and 4px right, no blur. The peel of a vinyl sticker, the layered cel of a cartoon background.
|
|
52
|
+
|
|
53
|
+
- `.shadow-sticker` — the signature. `4px 4px 0 0 hsl(var(--foreground))`. The default for buttons and cards.
|
|
54
|
+
- `.shadow-sticker-lg` — hover-lifted. `6px 6px 0 0`. The sticker peels further off the page.
|
|
55
|
+
- `.shadow-sticker-sm` — compact. `2px 2px 0 0`. For tags, badges, inline chips.
|
|
56
|
+
|
|
57
|
+
Soft gaussian shadows are forbidden — they belong to soft-modern. The sticker shadow is non-negotiable here; it's how depth happens.
|
|
58
|
+
|
|
59
|
+
## Motion
|
|
60
|
+
Three keyframes, all bouncy:
|
|
61
|
+
- `bounce-in` (400ms once) — entrance with overshoot. `cubic-bezier(0.34, 1.56, 0.64, 1)`. Buttons, modals, cards land with a spring — the cartoon-card pop.
|
|
62
|
+
- `wiggle` (600ms once) — rotate ±3deg playful nudge on hover. The Adventure Time wobble.
|
|
63
|
+
- `pop-color` (200ms once) — hue-rotate flash on hover for links and tags. The bumper-graphic blink.
|
|
64
|
+
|
|
65
|
+
Easing: `cubic-bezier(0.34, 1.56, 0.64, 1)` — overshoot is the language. Smooth easings without bounce are wrong for this direction. `prefers-reduced-motion` honored — `wiggle` and `bounce-in` collapse to static states, `pop-color` collapses to a flat color swap.
|
|
66
|
+
|
|
67
|
+
## Component patterns
|
|
68
|
+
- **Buttons:** chunky rounded, magenta solid by default with foreground text and a hard `.shadow-sticker` drop. `rounded-3xl` baseline; pills allowed for tags and compact actions. Hover triggers `wiggle` + lifts to `.shadow-sticker-lg`. Secondary buttons swap magenta for any brand token (sun, sky, slime, grape). Fill is the norm, ghost is the exception.
|
|
69
|
+
- **Cards:** thick 2px `--ink` border, brand-token or card-cream background, `rounded-3xl`, `.shadow-sticker` drop. Title in Fredoka display, oversized. Padding `p-6 lg:p-10`. Hover lifts to `.shadow-sticker-lg`. Cards are stickers — they peel off the page.
|
|
70
|
+
- **Inputs:** full `rounded-2xl` box, 2px `--ink` border, `bg-card`. Label above in DM Sans 500. Focus shifts border to `--ring` (magenta) and adds `.shadow-sticker-sm`. No border-bottom-only treatment — every input is a labeled sticker pocket.
|
|
71
|
+
- **CTAs:** filled chunky button is the default — magenta primary or sun-yellow secondary, with the sticker shadow. Pills reserved for tags and toggles. Text-link CTAs use `pop-color` on hover with a thick underline. Never a flat ghost — every CTA carries weight.
|
|
72
|
+
|
|
73
|
+
## Component families
|
|
74
|
+
None at install time. Patterns to expect: sticker-shadow cards, color-block tag rows, oversized chunky-display heroes, mono-label captions. The Director appends conventions here as they're established.
|
|
75
|
+
|
|
76
|
+
## Details
|
|
77
|
+
- **Selection:** `hsl(var(--brand-sun) / 0.6)` background, foreground text. Sun-yellow highlights the way a kid drags a crayon across a coloring book.
|
|
78
|
+
- **Focus ring:** `3px solid hsl(var(--ring))` — thick magenta to match the chunky border language. A 1px ring would disappear against the decoration.
|
|
79
|
+
- **Scrollbar:** auto. Native scrollbars are fine; the page already carries enough decoration.
|
|
80
|
+
|
|
81
|
+
## Recommended rich media
|
|
82
|
+
|
|
83
|
+
This direction leans on imagery — the cartoon sensibility wants illustration alongside type.
|
|
84
|
+
|
|
85
|
+
**Cover & hero imagery:**
|
|
86
|
+
- Flat illustrations in the Adventure Time / Cuphead-rubber-hose vocabulary — hand-drawn wobble, flat color, thick inked outline.
|
|
87
|
+
- Character-led photography — a single warm-lit subject (Pixar feel), placed centrally on a brand-token background.
|
|
88
|
+
- Expressive iconography — chunky outlined icons that feel custom-drawn, not Material/Heroicon-set.
|
|
89
|
+
|
|
90
|
+
**AI tool recommendations:**
|
|
91
|
+
- **Recraft** for vector flat illustrations with hand-drawn wobble. Best match for the Adventure Time / Push Pin lineage.
|
|
92
|
+
- **Midjourney / Flux** for character renders. Prompt scaffold: *"Cartoon Network bumper graphics, flat illustration, chunky colors, hand-drawn wobble, Adventure Time aesthetic"*. Append a single subject and a 1:1 or 4:5 aspect ratio.
|
|
93
|
+
- **Stable Diffusion + a custom rubber-hose LoRA** for character-led illustration with consistent style.
|
|
94
|
+
|
|
95
|
+
**Aspect ratios:**
|
|
96
|
+
- 1:1 square (Instagram-friendly, fits the sticker-card layout).
|
|
97
|
+
- 4:5 portrait (cartoon character-card framing).
|
|
98
|
+
- 16:9 landscape allowed for bumper-strip heroes; not the default.
|
|
99
|
+
|
|
100
|
+
**Color discipline for imagery:**
|
|
101
|
+
Lean into the full brand palette — every illustration uses at least 3 of the named tokens (magenta, slime, sun, sky, cherry, grape). A single-color image reads as a different direction. Backgrounds in imagery should match or contrast cream — never go dark moody.
|
|
102
|
+
|
|
103
|
+
**What to AVOID:**
|
|
104
|
+
- Photorealism — character-led warmth is fine, but documentary-real photography breaks the cartoon sensibility.
|
|
105
|
+
- Gradient meshes and soft-glow renders — that's soft-modern territory, not Saturday morning.
|
|
106
|
+
- Dark moody palettes — `--background` is bright cream; dark heroes break the kitchen-window-light premise.
|
|
107
|
+
- Comic Sans literally, or anything that drifts toward "kids' birthday clip-art" — chunky is the goal, naive is the failure mode.
|
|
108
|
+
- Soft gaussian drop shadows on imagery — flat sticker shadows or nothing.
|
|
109
|
+
|
|
110
|
+
**Accessibility:**
|
|
111
|
+
High decoration count means more `aria-hidden` on purely ornamental elements (sticker peels, wiggle hover targets that aren't focusable, decorative wobble ornaments). Alt-text must distinguish content imagery from ornament. Color contrast is preserved by `--ink` on cream and by `--ink` on every brand token; verify any custom color-on-color pairing meets WCAG AA before shipping — magenta-on-sun and slime-on-sky in particular need a contrast check.
|
|
112
|
+
|
|
113
|
+
## Exceptions
|
|
114
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
115
|
+
|
|
116
|
+
## Revisions
|
|
117
|
+
- Initial direction, generated at install time.
|