@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,169 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const bankingGravity: Direction = {
|
|
4
|
+
name: "banking-gravity",
|
|
5
|
+
ethos:
|
|
6
|
+
"Goldman Sachs gravitas · JPMorgan heritage · BlackRock institutional weight · Morgan Stanley sobriety · capital-markets restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Goldman Sachs", trait: "deep navy, serif touches, restrained corporate voice" },
|
|
9
|
+
{ brand: "JPMorgan Chase", trait: "heritage blue, 150-year institutional weight" },
|
|
10
|
+
{ brand: "Morgan Stanley", trait: "slate sobriety, heritage serif mark" },
|
|
11
|
+
{ brand: "BlackRock", trait: "institutional gravity, asset-manager restraint" },
|
|
12
|
+
{ brand: "Vanguard", trait: "conservative blue, fiduciary tone" },
|
|
13
|
+
{ brand: "Bloomberg Wealth", trait: "data-meets-gravitas hybrid" },
|
|
14
|
+
],
|
|
15
|
+
feel:
|
|
16
|
+
"Capital-markets institutional. Deep navy backgrounds, restrained brand-mark accent (heritage gold), " +
|
|
17
|
+
"serif touches for gravitas — WSJ/FT layout convention of serif display + sans body. " +
|
|
18
|
+
"Reads 'we have been trustworthy for 150 years' — never trendy, never cheerful, always informed. " +
|
|
19
|
+
"Print-document formality at screen scale.",
|
|
20
|
+
|
|
21
|
+
fonts: {
|
|
22
|
+
display: {
|
|
23
|
+
family: "EB Garamond",
|
|
24
|
+
fallback: ["Tiempos Headline", "Caslon Pro", "Iowan Old Style", "Garamond", "Georgia", "serif"],
|
|
25
|
+
from: "Tiempos/Caslon gravitas — closest open serif. The headline-serif moment heritage banks use for trust.",
|
|
26
|
+
googleFont: "EB+Garamond",
|
|
27
|
+
weights: [400, 500, 600, 700],
|
|
28
|
+
},
|
|
29
|
+
body: {
|
|
30
|
+
family: "Inter",
|
|
31
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "sans-serif"],
|
|
32
|
+
from: "Goldman/JPMorgan modern sans body — heritage-but-modern hybrid",
|
|
33
|
+
googleFont: "Inter",
|
|
34
|
+
weights: [400, 500, 600],
|
|
35
|
+
},
|
|
36
|
+
mono: {
|
|
37
|
+
family: "JetBrains Mono",
|
|
38
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
39
|
+
from: "tabular financial numerics — basis points, returns, AUM figures",
|
|
40
|
+
googleFont: "JetBrains+Mono",
|
|
41
|
+
weights: [400, 500, 700],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
typography: {
|
|
46
|
+
headingTracking: "-0.01em", // serifs set tight, not crunched
|
|
47
|
+
bodyTracking: "0",
|
|
48
|
+
fontFeatureSettings: '"tnum", "zero", "lnum", "ss01"', // tabular lining figures + slashed zero — finance non-negotiable
|
|
49
|
+
h1ScaleClamp: "clamp(2.25rem, 4.5vw, 3.75rem)", // restrained — institutional, not marketing-loud
|
|
50
|
+
bodyBaseSize: "0.9375rem", // 15px — readable but information-dense
|
|
51
|
+
bodyLineHeight: "1.55", // medium-tight — financial body, not editorial prose
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
colors: {
|
|
55
|
+
// Surfaces — deep institutional navy, the Goldman/JPMorgan brand-mark family
|
|
56
|
+
background: { hsl: "220 35% 12%", from: "Goldman/JPMorgan brand-mark deep navy" },
|
|
57
|
+
foreground: { hsl: "38 25% 92%", from: "warm cream off-white — never pure white; heritage paper feel" },
|
|
58
|
+
card: { hsl: "218 30% 22%", from: "navy-mid surface tier — stacked panels on deep navy" },
|
|
59
|
+
popover: { hsl: "218 28% 18%", from: "dropdown/menu surface between bg and card" },
|
|
60
|
+
|
|
61
|
+
// Primary — heritage gold, the capital-markets accent
|
|
62
|
+
primary: { hsl: "38 65% 55%", from: "heritage gold — JPMorgan/Goldman secondary brand-mark accent" },
|
|
63
|
+
primaryForeground: { hsl: "220 35% 12%", from: "deep navy on gold — formal, never paper-on-gold" },
|
|
64
|
+
|
|
65
|
+
// Secondary surfaces — deeper navy tiers for stacking
|
|
66
|
+
secondary: { hsl: "219 28% 18%", from: "navy panel divider tier" },
|
|
67
|
+
secondaryForeground: { hsl: "38 25% 92%", from: "cream on navy panel" },
|
|
68
|
+
muted: { hsl: "219 25% 20%", from: "muted navy panel — secondary text container" },
|
|
69
|
+
mutedForeground: { hsl: "215 15% 68%", from: "cool slate — axis ticks, datelines, sub-headings" },
|
|
70
|
+
accent: { hsl: "218 28% 26%", from: "hover surface, one tier above secondary" },
|
|
71
|
+
accentForeground: { hsl: "38 25% 92%", from: "cream on hover" },
|
|
72
|
+
|
|
73
|
+
// Borders — hairline, the dominant structural language
|
|
74
|
+
border: { hsl: "218 22% 30%", from: "hairline navy — Morgan Stanley table rule, barely visible" },
|
|
75
|
+
input: { hsl: "218 22% 30%", from: "same as border — formal input chrome" },
|
|
76
|
+
ring: { hsl: "38 65% 55%", from: "heritage gold — focus only" },
|
|
77
|
+
|
|
78
|
+
// Destructive — restrained alarm, never bright
|
|
79
|
+
destructive: { hsl: "358 55% 38%", from: "deep restrained alarm — Morgan Stanley red mark family" },
|
|
80
|
+
destructiveForeground: { hsl: "38 25% 92%", from: "cream on deep red" },
|
|
81
|
+
|
|
82
|
+
brand: {
|
|
83
|
+
"navy-deep": { hsl: "220 35% 12%", from: "alias of bg — Goldman/JPMorgan brand-mark navy" },
|
|
84
|
+
"navy-mid": { hsl: "218 30% 22%", from: "surface tier — alias of card" },
|
|
85
|
+
"cream-paper": { hsl: "38 25% 92%", from: "alias of fg — heritage paper warm off-white" },
|
|
86
|
+
"accent-blue": { hsl: "213 60% 40%", from: "secondary corporate-blue accent — JPMorgan heritage blue tier" },
|
|
87
|
+
"success-green": { hsl: "140 45% 38%", from: "restrained gain green — never bright; performance positive" },
|
|
88
|
+
"danger-deep": { hsl: "358 55% 38%", from: "alias of destructive — restrained loss/alarm" },
|
|
89
|
+
"heritage-gold": { hsl: "38 65% 55%", from: "alias of primary — capital-markets gold accent" },
|
|
90
|
+
"slate-rule": { hsl: "215 15% 68%", from: "alias of muted-fg — dateline and rule-text color" },
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
spacing: {
|
|
95
|
+
base: 4,
|
|
96
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96], // medium-high density
|
|
97
|
+
containerMax: "max-w-6xl", // wide enough for tables, narrow enough for prose
|
|
98
|
+
containerPadding: "px-4 lg:px-8",
|
|
99
|
+
sectionPadding: {
|
|
100
|
+
hero: "pt-20 pb-12 lg:pt-28 lg:pb-16", // formal but not oversized
|
|
101
|
+
default: "py-16 lg:py-24",
|
|
102
|
+
tight: "py-12",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
radius: {
|
|
107
|
+
base: "0.125rem", // 2px — formal print-document feel
|
|
108
|
+
pillsAllowed: false, // no marketing pills — institutional surfaces don't use them
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
shadows: {
|
|
112
|
+
style: "minimal",
|
|
113
|
+
utilities: {
|
|
114
|
+
"shadow-page":
|
|
115
|
+
"0 1px 2px 0 hsl(220 50% 4% / 0.4), 0 0 0 1px hsl(var(--border))",
|
|
116
|
+
// very subtle page-edge drop for stacked surfaces — print stack feel, not soft-modern lift
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
motion: {
|
|
121
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
122
|
+
durations: {
|
|
123
|
+
reveal: 200, // restrained — capital-markets sites don't perform
|
|
124
|
+
loop: 0, // no loops
|
|
125
|
+
ambient: 0, // no ambient motion
|
|
126
|
+
},
|
|
127
|
+
keyframes: {
|
|
128
|
+
"fade-rise-quiet": {
|
|
129
|
+
css:
|
|
130
|
+
"from { opacity: 0; transform: translateY(8px); }\n" +
|
|
131
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
132
|
+
defaultDuration: 200,
|
|
133
|
+
iteration: "once",
|
|
134
|
+
purpose:
|
|
135
|
+
"the only entrance — small, quiet, 200ms. Capital-markets formality: settle, do not perform.",
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
respectsReducedMotion: true,
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
density: "high",
|
|
142
|
+
|
|
143
|
+
patterns: {
|
|
144
|
+
button:
|
|
145
|
+
"Sparing. Primary = solid heritage gold with navy text, 2px radius, mono-uppercase label or sentence-case sans. " +
|
|
146
|
+
"Secondary = ghost with cream border (1px) and cream text. " +
|
|
147
|
+
"Tertiary = underlined gold text-link — many institutional sites lean on text-links over buttons. " +
|
|
148
|
+
"Buttons never glow, never gradient, never pill. Labels are formal: 'View prospectus', 'Request access', 'Read the report'.",
|
|
149
|
+
card:
|
|
150
|
+
"Sharp corners (rounded-sm, 2px). Hairline 1px border in --border, bg-card (navy-mid). " +
|
|
151
|
+
"Internal padding p-6 lg:p-8. Title in EB Garamond display serif. Eyebrow label in mono small-caps muted-fg. " +
|
|
152
|
+
"Body in Inter. Numbers in mono tabular. Optional .shadow-page on the outermost stacked surface only.",
|
|
153
|
+
input:
|
|
154
|
+
"1px border, bg-background, rounded-sm, h-9 px-3. Label sits above in mono small-caps muted-fg. " +
|
|
155
|
+
"Focus ring 2px heritage-gold. Numeric inputs tabular, right-aligned. " +
|
|
156
|
+
"No floating labels, no rounded pills — formal print-form chrome.",
|
|
157
|
+
cta:
|
|
158
|
+
"Hero CTAs are sparing — at most one primary gold button per surface. Secondary actions are gold underlined text-links. " +
|
|
159
|
+
"Language is formal: 'View the 2025 annual report', 'Speak with an advisor', 'Open an account'. " +
|
|
160
|
+
"Never 'Get started free' or 'Sign up now' — capital-markets restraint forbids retail-startup cheer.",
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
details: {
|
|
164
|
+
selectionBg: "hsl(var(--primary) / 0.25)",
|
|
165
|
+
selectionFg: "hsl(var(--foreground))",
|
|
166
|
+
focusRing: "2px solid hsl(var(--ring))",
|
|
167
|
+
scrollbarStyle: "thin",
|
|
168
|
+
},
|
|
169
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Design Direction — Beauty-Clean
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Glossier pink-powder · Saie milky cream · Topicals editorial inclusivity · Ilia barely-there packaging · Tata Harper apothecary green-cream
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Friendly cosmetic. Soft powder-pink and milky-cream surfaces, a single warm pop on CTAs, ingredient transparency as design language. The page reads like a Glossier showroom — not clinical, never moody, never extra. The audience is shopping a 5-minute regimen; the layout returns confidence and clarity rather than performing luxury. Lowercase serif logotype feel for display, humanist sans for body, soft pillow rounding everywhere.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Glossier** → millennial pink, bubble-pillow shadows, lowercase serif logotype, packaging-photo-on-white aesthetic.
|
|
11
|
+
- **Saie** → milky cream surfaces, black serif headlines, sparing pink pop on price tags.
|
|
12
|
+
- **Topicals** → editorial-magazine ingredient transparency, warm friendly inclusive tone, full-bleed product photography.
|
|
13
|
+
- **Ilia Beauty** → barely-there packaging photography, neutral sand backgrounds, clinical-clarity product cards.
|
|
14
|
+
- **Tata Harper** → apothecary serif, soft green-cream pairing, ingredient-list-as-design (INCI on the front of the bottle).
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
|
|
18
|
+
|
|
19
|
+
Surface stack is **milky cream** (background) → **white** (card — pure white, packaging-shot feel) → **deeper cream** (secondary) → **warm beige** (muted). Depth comes from pillow shadows and pink tint, never from heavy borders.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--pink`, `--pink-deep`, `--pink-tint`, `--cream`, `--cream-deep`, `--sage`, `--apricot`, `--ink`. Primary is **Glossier signature pink** — the canonical brand mark. Sage and apricot are second-accent pops used sparingly (ingredient callouts, ritual-step numerals).
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Fraunces (Glossier/Topicals editorial serif). h1–h4, weights 400/500/600. Lowercase headlines preferred — the brand voice is friendly, not titled. Tracking `-0.02em`.
|
|
25
|
+
- **Body:** DM Sans (Saie/Ilia humanist sans), weights 400/500/700. Body base **16px** with **line-height 1.65** — warm, readable, modern. Tracking `0.005em`.
|
|
26
|
+
- **Mono:** JetBrains Mono. Used only for ingredient INCI lists and shade-codes — clinical numerals, sparingly.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 6vw, 4.5rem)`. Numbers use tabular figures for prices. Font features: `"ss01"`, `"ss02"`, `"liga"` — Fraunces lowercase-tail stylistic sets are core, not optional.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-5 lg:px-8` — wide enough for a 3-column product grid but not splash-page wide.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-20 pb-14 lg:pt-28 lg:pb-20`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80 96. Medium density — product grids breathe but never feel sparse.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. Pure black and pure white-on-pink are forbidden — `--ink` (deep plum) and pink-tint variants do the work. Pink appears on primary CTAs, price tags, and one new-product badge. If three pink elements appear in the same viewport, the page has tipped from friendly to noisy.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 1rem` (16px). **The soft pillow** — Glossier's signature. Pills allowed (`pillsAllowed: true`) for shade names, ingredient tags, review stars. Cards use rounded-2xl. Buttons use rounded-2xl. Inputs use rounded-xl. The rounding language is consistent and committed — no sharp corners except on inline ingredient-data tables.
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
**Soft pillow.** Three utilities:
|
|
46
|
+
- `.shadow-pillow` — default product-card lift (1px ambient + 8px pink-tinted soft shadow)
|
|
47
|
+
- `.shadow-pillow-lg` — hover state, slightly deeper pink tint
|
|
48
|
+
- `.shadow-cream-inset` — inner highlight on white cards for packaging-photo feel
|
|
49
|
+
|
|
50
|
+
Shadows carry a faint pink tint — this is the brand. Neutral-gray shadows read app/SaaS and break the cosmetic language.
|
|
51
|
+
|
|
52
|
+
## Motion
|
|
53
|
+
Three keyframes — `fade-rise` (product card entrance, 500ms — quick, friendly), `scale-in` (shade-swatch swap and add-to-bag confirmation, 220ms), `bob` (single new-product badge, 2200ms infinite, gentle attention pull).
|
|
54
|
+
|
|
55
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored. Motion is friendly-responsive, not ceremonial — beauty shoppers are scanning quickly and motion should confirm rather than perform.
|
|
56
|
+
|
|
57
|
+
## Component patterns
|
|
58
|
+
- **Buttons:** Solid-fill primary (pink bg, plum-ink text, rounded-2xl, shadow-pillow). Secondary is white card with plum border. Tertiary is text-link in pink-deep with underline-on-hover. Hover lifts shadow-pillow → shadow-pillow-lg with `scale(1.01)`. No ghost-only buttons — beauty CTAs commit.
|
|
59
|
+
- **Cards:** Rounded-2xl, white bg, soft cream border, shadow-pillow. Internal padding `p-5 lg:p-7`. Title in Fraunces 500; price + ingredients in DM Sans. Hover lifts to shadow-pillow-lg.
|
|
60
|
+
- **Inputs:** Full rounded-xl box, cream border, white bg. Focus = pink 2px ring at 35% opacity. Label above in DM Sans 500, helper text below in muted-foreground.
|
|
61
|
+
- **CTAs:** Pink-fill primary button is the default. Secondary CTAs use white-card button or text-link in pink-deep. Ingredient lists are always a chip row, never a comma-separated paragraph — INCI-as-chips is the brand's transparency move.
|
|
62
|
+
|
|
63
|
+
## Recommended rich media
|
|
64
|
+
Beauty-clean photography is **packaging on white, lifestyle on cream**. Hero product shots are bottle-on-white-seamless with soft top-down shadow — Glossier/Ilia/Saie e-commerce style. Lifestyle imagery is hand-on-skin or product-in-routine, color-graded to warm afternoon light, never high-key flash. Skin tones are diverse and rendered accurately — this is a Topicals-era brand, not a 2010s wash-of-white.
|
|
65
|
+
|
|
66
|
+
**AI tool recommendations:** **Midjourney / Flux** for *"e-commerce beauty product photography, frosted glass bottle on cream paper backdrop, soft top-down lighting, slight cast shadow, packaging-shot aesthetic"*; *"hands applying serum, warm afternoon window light, brown skin, editorial beauty"*. Avoid Midjourney's default glossy-magazine output — explicitly prompt for "matte packaging" and "no studio flash."
|
|
67
|
+
|
|
68
|
+
**Aspect ratios:** 4:5 portrait for product cards (Instagram-shoppable proportion), 3:4 portrait for lifestyle, 16:9 only for the homepage hero video.
|
|
69
|
+
|
|
70
|
+
**Video:** product-routine loops are acceptable — 4-second loop of pump-and-apply, no audio, ≤3 MB. Hero video may be a 12-second routine montage with subtle UI overlay.
|
|
71
|
+
|
|
72
|
+
**Performance:** product card images ≤80 KB WebP at 800w; hero ≤200 KB. LCP under 2.2s — beauty shoppers bounce fast.
|
|
73
|
+
|
|
74
|
+
**Avoid:** moody dark beauty (luxury territory), heavy retouching that flattens skin texture, watermark stock, glowing 3D bottle renders, gradient backgrounds, glassmorphic anything, AI photos with uncanny smiles, lens flare, gold-foil overlays. Old-school glossy-magazine retouching is over.
|
|
75
|
+
|
|
76
|
+
**Accessibility:** alt-text names the SKU and key ingredient: *"Glossier Balm Dotcom in Birthday — pink tinted lip balm with castor oil, on a cream paper backdrop."*
|
|
77
|
+
|
|
78
|
+
## Component families
|
|
79
|
+
- **Product card** — square white tile, product image top, name in Fraunces, key-ingredient pill, price.
|
|
80
|
+
- **Ritual step card** — numbered apricot circle, step name in Fraunces, product callout chip.
|
|
81
|
+
- **Review chip row** — star count + reviewer initial avatar + one-line quote.
|
|
82
|
+
|
|
83
|
+
## Details
|
|
84
|
+
- **Selection:** `hsl(var(--pink) / 0.28)` background, foreground text.
|
|
85
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)`. Soft pink — visible without screaming.
|
|
86
|
+
- **Scrollbar:** thin.
|
|
87
|
+
|
|
88
|
+
## Exceptions
|
|
89
|
+
None yet. When an intentional one-of-one violation lands (a black-on-white limited-edition collab page where the pink palette is intentionally absent), add it here with the reason.
|
|
90
|
+
|
|
91
|
+
## Revisions
|
|
92
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// Note: "beauty-clean" is not yet in the Direction["name"] enum.
|
|
4
|
+
// The schema is closed; until it is extended this file casts the name.
|
|
5
|
+
// All other fields fully validate.
|
|
6
|
+
|
|
7
|
+
export const beautyClean: Direction = {
|
|
8
|
+
name: "beauty-clean" as Direction["name"],
|
|
9
|
+
ethos:
|
|
10
|
+
"Glossier pink-powder · Saie milky cream · Topicals editorial inclusivity · Ilia barely-there packaging · Tata Harper apothecary green-cream",
|
|
11
|
+
references: [
|
|
12
|
+
{ brand: "Glossier", trait: "millennial pink + bubble-pillow + lowercase serif logo" },
|
|
13
|
+
{ brand: "Saie", trait: "milky cream surface + black serif headlines + soft pink pop" },
|
|
14
|
+
{ brand: "Topicals", trait: "editorial-magazine ingredient transparency + warm friendly tone" },
|
|
15
|
+
{ brand: "Ilia Beauty", trait: "barely-there packaging photography + neutral sands + clinical clarity" },
|
|
16
|
+
{ brand: "Tata Harper", trait: "apothecary serif + soft green-cream + ingredient-list-as-design" },
|
|
17
|
+
],
|
|
18
|
+
feel:
|
|
19
|
+
"Friendly cosmetic. Soft powder-pink and milky-cream surfaces, a single warm pop on CTAs, " +
|
|
20
|
+
"ingredient transparency as design language. Lowercase serif logotype feel for display, " +
|
|
21
|
+
"humanist sans for body. Soft rounded chrome, pillow shadows, the page reads like a Glossier " +
|
|
22
|
+
"showroom — not clinical, never moody, never extra.",
|
|
23
|
+
|
|
24
|
+
fonts: {
|
|
25
|
+
display: {
|
|
26
|
+
family: "Fraunces",
|
|
27
|
+
fallback: ["Cormorant Garamond", "Georgia", "Times New Roman", "serif"],
|
|
28
|
+
from: "Glossier/Topicals editorial serif — soft, slightly quirky, lowercase-friendly",
|
|
29
|
+
googleFont: "Fraunces",
|
|
30
|
+
weights: [400, 500, 600],
|
|
31
|
+
},
|
|
32
|
+
body: {
|
|
33
|
+
family: "DM Sans",
|
|
34
|
+
fallback: ["Inter", "system-ui", "-apple-system", "sans-serif"],
|
|
35
|
+
from: "Saie/Ilia humanist sans — warm, rounded, modern beauty-brand body voice",
|
|
36
|
+
googleFont: "DM+Sans",
|
|
37
|
+
weights: [400, 500, 700],
|
|
38
|
+
},
|
|
39
|
+
mono: {
|
|
40
|
+
family: "JetBrains Mono",
|
|
41
|
+
fallback: ["ui-monospace", "SFMono-Regular", "monospace"],
|
|
42
|
+
from: "ingredient INCI lists and shade-codes — clinical numerals, used sparingly",
|
|
43
|
+
googleFont: "JetBrains+Mono",
|
|
44
|
+
weights: [400, 500],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
typography: {
|
|
49
|
+
headingTracking: "-0.02em", // soft serif sits tight at display sizes
|
|
50
|
+
bodyTracking: "0.005em",
|
|
51
|
+
fontFeatureSettings: '"ss01", "ss02", "liga"', // Fraunces stylistic sets, lowercase-tail variants
|
|
52
|
+
h1ScaleClamp: "clamp(2.25rem, 6vw, 4.5rem)",
|
|
53
|
+
bodyBaseSize: "1rem",
|
|
54
|
+
bodyLineHeight: "1.65",
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
colors: {
|
|
58
|
+
background: { hsl: "20 40% 97%", from: "Saie milky cream — barely-tinted warm paper, never pure white" },
|
|
59
|
+
foreground: { hsl: "340 20% 18%", from: "Glossier deep plum-ink — softer than black, holds pink palette" },
|
|
60
|
+
card: { hsl: "0 0% 100%", from: "pure white card — lifts off the milky background, packaging-photo feel" },
|
|
61
|
+
popover: { hsl: "0 0% 100%", from: "same as card — popovers wear the same white as packaging" },
|
|
62
|
+
primary: { hsl: "344 70% 68%", from: "Glossier signature pink — the canonical brand-pink, not magenta" },
|
|
63
|
+
primaryForeground: { hsl: "340 30% 18%", from: "plum-ink on pink — never white, pink is too light" },
|
|
64
|
+
secondary: { hsl: "20 35% 94%", from: "deeper milky cream — pill chips, ingredient-tag surface" },
|
|
65
|
+
secondaryForeground: { hsl: "340 20% 18%", from: "plum-ink on cream" },
|
|
66
|
+
muted: { hsl: "20 25% 92%", from: "warm beige — quiet panels and divider stripes" },
|
|
67
|
+
mutedForeground: { hsl: "340 12% 42%", from: "warm-plum gray — captions, ingredient names" },
|
|
68
|
+
accent: { hsl: "344 60% 92%", from: "pink-tint hover surface — pink at low saturation for chips" },
|
|
69
|
+
accentForeground: { hsl: "340 30% 18%", from: "plum-ink on pink-tint" },
|
|
70
|
+
border: { hsl: "20 25% 88%", from: "warm cream hairline — visible on milky bg, never harsh" },
|
|
71
|
+
input: { hsl: "20 25% 88%", from: "same as border" },
|
|
72
|
+
ring: { hsl: "344 70% 68%", from: "Glossier pink, focus ring only" },
|
|
73
|
+
destructive: { hsl: "0 65% 55%", from: "warm coral-red — sold-out badge, never alarm red" },
|
|
74
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on warm red" },
|
|
75
|
+
brand: {
|
|
76
|
+
pink: { hsl: "344 70% 68%", from: "= primary; Glossier signature pink — the canonical brand-mark" },
|
|
77
|
+
"pink-deep": { hsl: "340 55% 52%", from: "Glossier deeper pink — hover state, gradient anchor" },
|
|
78
|
+
"pink-tint": { hsl: "344 60% 92%", from: "blush tint — review-card surface, ingredient pills" },
|
|
79
|
+
cream: { hsl: "20 40% 97%", from: "= background; milky Saie cream paper" },
|
|
80
|
+
"cream-deep": { hsl: "20 35% 94%", from: "secondary cream — one tone deeper" },
|
|
81
|
+
sage: { hsl: "120 18% 62%", from: "Tata Harper apothecary green — ingredient-callout dot, used sparingly" },
|
|
82
|
+
apricot: { hsl: "22 80% 76%", from: "Topicals warm apricot — second pop accent for ritual-step numerals" },
|
|
83
|
+
ink: { hsl: "340 20% 18%", from: "= foreground; deep plum-ink, semantic for all heading copy" },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
spacing: {
|
|
88
|
+
base: 4,
|
|
89
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96],
|
|
90
|
+
containerMax: "max-w-6xl", // wide enough for 3-column product grids
|
|
91
|
+
containerPadding: "px-5 lg:px-8",
|
|
92
|
+
sectionPadding: {
|
|
93
|
+
hero: "pt-20 pb-14 lg:pt-28 lg:pb-20",
|
|
94
|
+
default: "py-16 lg:py-24",
|
|
95
|
+
tight: "py-10 lg:py-14",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
radius: {
|
|
100
|
+
base: "1rem", // 16px — the soft pillow, Glossier signature
|
|
101
|
+
pillsAllowed: true, // pills carry shade names, ingredient tags, review stars
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
shadows: {
|
|
105
|
+
style: "soft",
|
|
106
|
+
utilities: {
|
|
107
|
+
"shadow-pillow":
|
|
108
|
+
"0 1px 2px hsl(340 20% 18% / 0.04), 0 8px 24px hsl(344 70% 68% / 0.10)",
|
|
109
|
+
"shadow-pillow-lg":
|
|
110
|
+
"0 2px 4px hsl(340 20% 18% / 0.05), 0 18px 48px hsl(344 70% 68% / 0.14)",
|
|
111
|
+
"shadow-cream-inset":
|
|
112
|
+
"inset 0 1px 0 hsl(0 0% 100% / 0.7)",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
motion: {
|
|
117
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
118
|
+
durations: {
|
|
119
|
+
reveal: 500,
|
|
120
|
+
loop: 2200,
|
|
121
|
+
ambient: 18000,
|
|
122
|
+
},
|
|
123
|
+
keyframes: {
|
|
124
|
+
"fade-rise": {
|
|
125
|
+
css:
|
|
126
|
+
"from { opacity: 0; transform: translateY(10px); }\n" +
|
|
127
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
128
|
+
defaultDuration: 500,
|
|
129
|
+
iteration: "once",
|
|
130
|
+
purpose: "product card entrance — quick rise, friendly responsiveness",
|
|
131
|
+
},
|
|
132
|
+
"scale-in": {
|
|
133
|
+
css:
|
|
134
|
+
"from { opacity: 0; transform: scale(0.96); }\n" +
|
|
135
|
+
"to { opacity: 1; transform: scale(1); }",
|
|
136
|
+
defaultDuration: 220,
|
|
137
|
+
iteration: "once",
|
|
138
|
+
purpose: "shade-swatch swap, add-to-bag confirmation — confirms tap",
|
|
139
|
+
},
|
|
140
|
+
"bob": {
|
|
141
|
+
css:
|
|
142
|
+
"0%, 100% { transform: translateY(0); }\n" +
|
|
143
|
+
"50% { transform: translateY(-4px); }",
|
|
144
|
+
defaultDuration: 2200,
|
|
145
|
+
iteration: "infinite",
|
|
146
|
+
purpose: "single new-product badge — gentle attention pull",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
respectsReducedMotion: true,
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
density: "medium",
|
|
153
|
+
|
|
154
|
+
patterns: {
|
|
155
|
+
button:
|
|
156
|
+
"Solid-fill primary (pink bg, plum-ink text, rounded-2xl, shadow-pillow). " +
|
|
157
|
+
"Secondary is white card with plum border. Tertiary is text-link in pink-deep with underline-on-hover. " +
|
|
158
|
+
"Hover lifts shadow-pillow → shadow-pillow-lg with scale(1.01). No ghost-only buttons.",
|
|
159
|
+
card:
|
|
160
|
+
"Rounded-2xl, white bg, soft cream border, shadow-pillow. Internal padding p-5 lg:p-7. " +
|
|
161
|
+
"Title in Fraunces 500; price + ingredients in DM Sans. Hover lifts to shadow-pillow-lg.",
|
|
162
|
+
input:
|
|
163
|
+
"Full rounded-xl box, cream border, white bg. Focus = pink 2px ring at 35% opacity. " +
|
|
164
|
+
"Label above in DM Sans 500, helper text below in muted-foreground.",
|
|
165
|
+
cta:
|
|
166
|
+
"Pink-fill primary button is the default. Secondary CTAs use white-card button or text-link " +
|
|
167
|
+
"in pink-deep. Ingredient-list is always a chip row, never a paragraph.",
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
details: {
|
|
171
|
+
selectionBg: "hsl(var(--pink) / 0.28)",
|
|
172
|
+
selectionFg: "hsl(var(--foreground))",
|
|
173
|
+
focusRing: "2px solid hsl(var(--ring) / 0.5)",
|
|
174
|
+
scrollbarStyle: "thin",
|
|
175
|
+
},
|
|
176
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Design Direction — Beauty-Luxury
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
La Mer cream-and-jade vault · Augustinus Bader clinical-restraint cream · Sisley apothecary serif · Guerlain Orchidée Impériale gilded glass · Vintner's Daughter botanical alchemy
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Restrained luxury cosmetic. Ivory and cream surfaces hold a single SKU like a museum vitrine — champagne gold appears only on hairlines and seals, never as a fill. Italic serif tells the ingredient story; small-caps mono carries the technical lineage. The page reads like a Guerlain boutique window at dusk: ceremonial, withholding, expensive in its silence. The audience is buying a $440 cream and expects the layout to behave like the bottle: weighty, considered, photographed once and well.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **La Mer** → deep ocean cream jar, jade green seal, serif logotype, single-product-per-page reverence.
|
|
11
|
+
- **Augustinus Bader** → clinical white-on-cream, restrained navy, TFC8 minimalism, ingredient-as-science.
|
|
12
|
+
- **Sisley Paris** → old-world apothecary serif, cream paper, gold-leaf detailing, French heritage voice.
|
|
13
|
+
- **Guerlain Orchidée Impériale** → gilded glass jar, ivory, champagne gold, heritage seal, dusk lighting.
|
|
14
|
+
- **Vintner's Daughter** → botanical alchemy, ivory paper, sage, single-product reverence, founder-story prose.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
|
|
18
|
+
|
|
19
|
+
Surface stack is **ivory** (background) → **ivory-deep** (card, half a tone up) → **stone-cream** (muted) → **jade-pale or ivory-deep** (accent tints). Depth comes from hairline rules and ceremonial whitespace, never from heavy fill differentiation. The card token is barely differentiated — vitrine, not panel.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--ivory`, `--ivory-deep`, `--gold`, `--gold-deep`, `--jade`, `--jade-pale`, `--navy`, `--ink`. Primary is **Guerlain champagne gold** — used as hairline, seal, focus, and exactly one filled CTA per page. Jade is the single saturated counterpoint (La Mer seal); navy appears once, on the lot-number block (Augustinus Bader nod).
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Cormorant Garamond (Sisley/Guerlain apothecary serif). h1–h4, weights 300/400/500. Italic variants are core, not decoration — ingredient stories are told in italic. Tracking `-0.005em`.
|
|
25
|
+
- **Body:** Cormorant (La Mer/Vintner's Daughter body serif). Body base **17px** with **line-height 1.75**. Luxury beauty rarely uses sans for body — the brand voice is heritage-prose, not product-marketing. Tracking `0.01em`.
|
|
26
|
+
- **Mono:** JetBrains Mono. Used only for ingredient INCI lists, lot numbers, and technical lineage. Small-caps, tracked-out 0.28em — instrument-feel for laboratory specificity.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 5.5vw, 4rem)`. Prices use old-style figures (`"onum"` feature on). Font features: `"liga"`, `"dlig"`, `"onum"`, `"kern"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-4xl px-6 lg:px-12` — narrow boutique vitrine column. This is not a splash page.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-32 pb-24 lg:pt-48 lg:pb-32` (ceremonial)
|
|
34
|
+
- Default: `py-24 lg:py-40`
|
|
35
|
+
- Tight: `py-16 lg:py-24`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 24 32 48 64 96 128 160 192. Sparse — luxury withholding.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. Pure white and pure black are forbidden — `--ivory` and `--ink` (deep warm earth) replace them.
|
|
40
|
+
|
|
41
|
+
Gold is a hairline color, not a fill color. Exception: the single primary CTA per page may be gold-fill on ivory — once. Jade appears at most twice per page (one ingredient-callout dot, one seal hairline). If the page reads gold-heavy, the restraint has collapsed and the brand reads as costume jewelry instead of heritage.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 0`. **Sharp corners only.** La Mer, Guerlain, Sisley do not round; rounding reads app/SaaS and undermines the heritage-cosmetic language. Pills are disallowed (`pillsAllowed: false`) — tags are hairline-bounded small-caps text, never rounded chips.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**Minimal.** Three utilities:
|
|
48
|
+
- `.shadow-vitrine` — single product showcase lift (1px stone bottom + soft 24px earth-ink shadow); the museum-vitrine effect
|
|
49
|
+
- `.shadow-gold-hairline` — inset 1px gold hairline at 45% opacity; the seal treatment for hero product cards
|
|
50
|
+
- `.shadow-quiet` — single 1px stone-tinted bottom rule
|
|
51
|
+
|
|
52
|
+
No drop shadows on standard content. No glows. No colored shadows beyond the gold hairline.
|
|
53
|
+
|
|
54
|
+
## Motion
|
|
55
|
+
Three keyframes — `fade-rise` (section entrance, **1400ms** — ceremonial pacing), `fade-in` (ingredient-story paragraph and product-shot, 1200ms, opacity only), `gold-sheen` (gold hairline-rule on seal/monogram only, 4800ms infinite, **never on text**, never on multiple elements).
|
|
56
|
+
|
|
57
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored. The page settles; it does not perform. Reveal at 1400ms is deliberate — luxury beauty shoppers expect ceremony, not snappy SaaS responsiveness.
|
|
58
|
+
|
|
59
|
+
## Component patterns
|
|
60
|
+
- **Buttons:** Text-link CTAs by default — earth-ink with hairline gold underline appearing on hover. Solid gold-fill is reserved for the single primary action per page (Reserve, Discover, Add to Vanity). No secondary solid buttons. No pills, no chips. Destructive uses muted-oxblood text-link.
|
|
61
|
+
- **Cards:** No card chrome by default. When grouping is essential, hairline 1px gold-tinted border + ivory-deep bg + shadow-vitrine — a single vitrine per page. Internal padding `p-10 lg:p-16`. Title in Cormorant italic; body in Cormorant 400.
|
|
62
|
+
- **Inputs:** Border-bottom only, 1px gold at 45% opacity. Ivory bg, no full box. Label sits above in small-caps mono with letter-spacing 0.28em. Focus = gold 1px underline, no glow. Placeholder italic, lowercase.
|
|
63
|
+
- **CTAs:** Primary CTA is a text-link with hairline gold underline. The single hero action per page may use a gold-fill rectangle with ivory text — once, never twice. All other actions are text-links. Marketing flourish does not exist in this language.
|
|
64
|
+
|
|
65
|
+
## Recommended rich media
|
|
66
|
+
Beauty-luxury photography is **product-as-still-life at dusk**. The hero is a single glass jar photographed in chiaroscuro late-afternoon light — warm key from camera-left, deep shadow on the right side of the bottle. Backgrounds are ivory paper or marble; never seamless studio white (that reads e-commerce, not vault). Color-graded to Kodak Portra 400 warmth with a slight champagne highlight.
|
|
67
|
+
|
|
68
|
+
Hands are rare and editorial when used — a single hand cradling the jar, never face-forward product-demo. The audience is buying *the object*, not watching an influencer apply it.
|
|
69
|
+
|
|
70
|
+
**AI tool recommendations:** **Midjourney / Flux** for *"luxury cosmetic still life, gilded glass jar on ivory paper, late afternoon window light, deep chiaroscuro shadow, Kodak Portra 400, slight grain, editorial heritage"*; *"single ingredient botanical photograph, dried orchid on cream paper, museum specimen lighting, 100mm macro"*. Avoid Midjourney's default beauty output — explicitly prompt for "no studio flash, no high-key, no e-commerce."
|
|
71
|
+
|
|
72
|
+
**Aspect ratios:** 4:5 portrait (vitrine proportion) or 1:1 square for botanical-ingredient stills. Never 16:9 (cinematic, wrong feel).
|
|
73
|
+
|
|
74
|
+
**Video:** generally avoided. A 6-second ambient loop of light moving across a jar surface is acceptable for the hero only, ≤2 MB, H.265, no audio.
|
|
75
|
+
|
|
76
|
+
**Performance:** hero ≤200 KB AVIF at 1800w (heritage photography is worth the budget). Inline figures ≤80 KB. LCP under 2.5s.
|
|
77
|
+
|
|
78
|
+
**Avoid:** seamless studio white (e-commerce territory), heavy flash retouching, watermark stock, glowing 3D bottle renders, gradient backgrounds, glassmorphic anything, gold-foil-overlay-on-photo, AI photos with uncanny smiles, pink (that's beauty-clean territory).
|
|
79
|
+
|
|
80
|
+
**Accessibility:** alt-text is ceremonial: *"A crystal jar of Orchidée Impériale cream sits on an ivory marble shelf, late afternoon light catching the gilded brass collar."*
|
|
81
|
+
|
|
82
|
+
## Component families
|
|
83
|
+
- **Hero product vitrine** — single SKU, large vertical product shot, ingredient-list as small-caps mono column, gold-hairline frame.
|
|
84
|
+
- **Ingredient story** — single italic-serif paragraph, centered, max-width 32rem, gold small-caps overline.
|
|
85
|
+
- **Flagship boutique list** — city in italic-serif, address in body serif, hours in small-caps mono, hairline-rule separation.
|
|
86
|
+
|
|
87
|
+
## Details
|
|
88
|
+
- **Selection:** `hsl(var(--gold) / 0.22)` background, foreground text.
|
|
89
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` — thin, quiet champagne gold. Never a 2px glow ring.
|
|
90
|
+
- **Scrollbar:** thin.
|
|
91
|
+
|
|
92
|
+
## Exceptions
|
|
93
|
+
None yet. When an intentional one-of-one violation lands (a navy-heavy clinical sub-brand page where Augustinus Bader's TFC8 minimalism dominates), add it here with the reason.
|
|
94
|
+
|
|
95
|
+
## Revisions
|
|
96
|
+
- Initial direction, generated at install time.
|