@stylecrib/cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -9
- package/agents/MANIFEST.yml +136 -0
- package/agents/README.md +75 -0
- package/agents/art-director.md +168 -0
- package/agents/audacity-director.md +109 -0
- package/agents/brand-identity.md +179 -0
- package/agents/brand-precedent.md +119 -0
- package/agents/brief-enforcer.md +136 -0
- package/agents/component-qa.md +167 -0
- package/agents/cto.md +49 -0
- package/agents/design-director.md +184 -0
- package/agents/design-systems-engineer.md +162 -0
- package/agents/direction-curator.md +133 -0
- package/agents/homogeneity-detector.md +104 -0
- package/agents/logo-designer.md +240 -0
- package/agents/marketing-designer.md +156 -0
- package/agents/media-curator.md +165 -0
- package/agents/motion-engineer.md +270 -0
- package/agents/qa-conductor.md +143 -0
- package/agents/render-qa.md +133 -0
- package/agents/upgrade-simulator.md +123 -0
- package/agents/vp-architecture.md +49 -0
- package/agents/vp-engineering.md +49 -0
- package/dist/index.js +1577 -463
- package/package.json +11 -4
- package/themes/README.md +70 -0
- package/themes/acrylic-soft/THEME.md +142 -0
- package/themes/acrylic-soft/tokens.ts +180 -0
- package/themes/agency-creative/THEME.md +91 -0
- package/themes/agency-creative/tokens.ts +202 -0
- package/themes/agency-portfolio/THEME.md +109 -0
- package/themes/agency-portfolio/tokens.ts +159 -0
- package/themes/ai-startup/THEME.md +95 -0
- package/themes/ai-startup/tokens.ts +162 -0
- package/themes/airline-modern/THEME.md +104 -0
- package/themes/airline-modern/tokens.ts +179 -0
- package/themes/arc-stack/.anchor-render.png +0 -0
- package/themes/arc-stack/THEME.md +125 -0
- package/themes/arc-stack/audit.log.jsonl +6 -0
- package/themes/arc-stack/dismissals.jsonl +3 -0
- package/themes/arc-stack/tailwind.snippet.ts +17 -0
- package/themes/arc-stack/theme.yml +153 -0
- package/themes/arc-stack/tokens.ts +29 -0
- package/themes/architectural/THEME.md +102 -0
- package/themes/architectural/tokens.ts +159 -0
- package/themes/atelier-radiance/THEME.md +93 -0
- package/themes/atelier-radiance/audit.log.jsonl +1 -0
- package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
- package/themes/atelier-radiance/theme.yml +130 -0
- package/themes/atelier-radiance/tokens.ts +29 -0
- package/themes/automotive-ev/THEME.md +87 -0
- package/themes/automotive-ev/tokens.ts +183 -0
- package/themes/automotive-luxury/THEME.md +88 -0
- package/themes/automotive-luxury/tokens.ts +175 -0
- package/themes/baby-modern/THEME.md +79 -0
- package/themes/baby-modern/tokens.ts +184 -0
- package/themes/banking-gravity/THEME.md +171 -0
- package/themes/banking-gravity/tokens.ts +169 -0
- package/themes/beauty-clean/THEME.md +92 -0
- package/themes/beauty-clean/tokens.ts +176 -0
- package/themes/beauty-luxury/THEME.md +96 -0
- package/themes/beauty-luxury/tokens.ts +178 -0
- package/themes/bento-modular/.anchor-render.png +0 -0
- package/themes/bento-modular/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -0
- package/themes/bento-modular/audit.log.jsonl +3 -0
- package/themes/bento-modular/dismissals.jsonl +1 -0
- package/themes/bento-modular/tailwind.snippet.ts +17 -0
- package/themes/bento-modular/theme.yml +83 -0
- package/themes/bento-modular/tokens.ts +27 -0
- package/themes/bookstore-indie/THEME.md +78 -0
- package/themes/bookstore-indie/tokens.ts +147 -0
- package/themes/brutalist/THEME.md +96 -0
- package/themes/brutalist/tokens.ts +151 -0
- package/themes/business-tiles/THEME.md +141 -0
- package/themes/business-tiles/tokens.ts +178 -0
- package/themes/cabana-poster/THEME.md +158 -0
- package/themes/cabana-poster/audit.log.jsonl +1 -0
- package/themes/cabana-poster/tailwind.snippet.ts +16 -0
- package/themes/cabana-poster/theme.yml +221 -0
- package/themes/cabana-poster/tokens.ts +34 -0
- package/themes/case-panel/THEME.md +126 -0
- package/themes/case-panel/audit.log.jsonl +2 -0
- package/themes/case-panel/tailwind.snippet.ts +15 -0
- package/themes/case-panel/theme.yml +153 -0
- package/themes/case-panel/tokens.ts +28 -0
- package/themes/cinematic-dark/THEME.md +97 -0
- package/themes/cinematic-dark/tokens.ts +195 -0
- package/themes/classic-car/THEME.md +86 -0
- package/themes/classic-car/tokens.ts +173 -0
- package/themes/cloud-friendly/THEME.md +152 -0
- package/themes/cloud-friendly/tokens.ts +181 -0
- package/themes/community-niche/THEME.md +102 -0
- package/themes/community-niche/tokens.ts +177 -0
- package/themes/corporate-grid/THEME.md +154 -0
- package/themes/corporate-grid/tokens.ts +182 -0
- package/themes/couture-luxury/THEME.md +85 -0
- package/themes/couture-luxury/tokens.ts +146 -0
- package/themes/creator-social/THEME.md +131 -0
- package/themes/creator-social/tokens.ts +249 -0
- package/themes/crypto-onchain/THEME.md +100 -0
- package/themes/crypto-onchain/tokens.ts +207 -0
- package/themes/cycling-brand/THEME.md +78 -0
- package/themes/cycling-brand/tokens.ts +185 -0
- package/themes/dating-friendly/THEME.md +102 -0
- package/themes/dating-friendly/tokens.ts +178 -0
- package/themes/dense-utility/THEME.md +85 -0
- package/themes/dense-utility/tokens.ts +155 -0
- package/themes/devtool-cli/THEME.md +100 -0
- package/themes/devtool-cli/tokens.ts +195 -0
- package/themes/devtool-docs/THEME.md +105 -0
- package/themes/devtool-docs/tokens.ts +177 -0
- package/themes/editorial/THEME.md +129 -0
- package/themes/editorial/audit.log.jsonl +2 -0
- package/themes/editorial/tailwind.snippet.ts +15 -0
- package/themes/editorial/theme.yml +173 -0
- package/themes/editorial/tokens.ts +29 -0
- package/themes/education-formal/THEME.md +154 -0
- package/themes/education-formal/audit.log.jsonl +1 -0
- package/themes/education-formal/tailwind.snippet.ts +15 -0
- package/themes/education-formal/theme.yml +186 -0
- package/themes/education-formal/tokens.ts +29 -0
- package/themes/education-warm/THEME.md +91 -0
- package/themes/education-warm/tokens.ts +185 -0
- package/themes/ember-poster/README.md +79 -0
- package/themes/ember-poster/THEME.md +101 -0
- package/themes/ember-poster/audit.log.jsonl +17 -0
- package/themes/ember-poster/package.json +34 -0
- package/themes/ember-poster/tailwind.snippet.ts +17 -0
- package/themes/ember-poster/theme.yml +109 -0
- package/themes/ember-poster/tokens.ts +27 -0
- package/themes/enterprise-cloud/THEME.md +139 -0
- package/themes/enterprise-cloud/tokens.ts +179 -0
- package/themes/enterprise-tech/.anchor-render.png +0 -0
- package/themes/enterprise-tech/THEME.md +167 -0
- package/themes/enterprise-tech/audit.log.jsonl +1 -0
- package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
- package/themes/enterprise-tech/theme.yml +202 -0
- package/themes/enterprise-tech/tokens.ts +29 -0
- package/themes/ev-charging/THEME.md +94 -0
- package/themes/ev-charging/tokens.ts +185 -0
- package/themes/farm-direct/THEME.md +92 -0
- package/themes/farm-direct/tokens.ts +180 -0
- package/themes/fintech-card/THEME.md +96 -0
- package/themes/fintech-card/tokens.ts +191 -0
- package/themes/fintech-trust/THEME.md +94 -0
- package/themes/fintech-trust/tokens.ts +192 -0
- package/themes/food-blog/THEME.md +98 -0
- package/themes/food-blog/tokens.ts +183 -0
- package/themes/forum-classic/THEME.md +100 -0
- package/themes/forum-classic/tokens.ts +168 -0
- package/themes/fresh-plate/.anchor-render.png +0 -0
- package/themes/fresh-plate/THEME.md +144 -0
- package/themes/fresh-plate/audit.log.jsonl +2 -0
- package/themes/fresh-plate/dismissals.jsonl +3 -0
- package/themes/fresh-plate/tailwind.snippet.ts +16 -0
- package/themes/fresh-plate/theme.yml +189 -0
- package/themes/fresh-plate/tokens.ts +30 -0
- package/themes/furniture-modern/THEME.md +94 -0
- package/themes/furniture-modern/tokens.ts +176 -0
- package/themes/gaming-esports/THEME.md +146 -0
- package/themes/gaming-esports/tokens.ts +199 -0
- package/themes/gaming-streamer/THEME.md +139 -0
- package/themes/gaming-streamer/tokens.ts +201 -0
- package/themes/glassmorphic-modern/THEME.md +119 -0
- package/themes/glassmorphic-modern/tokens.ts +174 -0
- package/themes/government-civic/THEME.md +138 -0
- package/themes/government-civic/tokens.ts +164 -0
- package/themes/gym-chain/THEME.md +79 -0
- package/themes/gym-chain/tokens.ts +196 -0
- package/themes/healthcare-bright/THEME.md +95 -0
- package/themes/healthcare-bright/tokens.ts +184 -0
- package/themes/home-decor/THEME.md +94 -0
- package/themes/home-decor/tokens.ts +177 -0
- package/themes/hotel-boutique/THEME.md +110 -0
- package/themes/hotel-boutique/tokens.ts +179 -0
- package/themes/hyperminimal-mono/THEME.md +91 -0
- package/themes/hyperminimal-mono/tokens.ts +150 -0
- package/themes/indie-art-game/THEME.md +107 -0
- package/themes/indie-art-game/tokens.ts +216 -0
- package/themes/insurance-legacy/THEME.md +101 -0
- package/themes/insurance-legacy/tokens.ts +182 -0
- package/themes/insurance-modern/THEME.md +103 -0
- package/themes/insurance-modern/tokens.ts +192 -0
- package/themes/kaiju-reveal/THEME.md +97 -0
- package/themes/kaiju-reveal/tokens.ts +185 -0
- package/themes/kinetic-data/THEME.md +172 -0
- package/themes/kinetic-data/audit.log.jsonl +1 -0
- package/themes/kinetic-data/tailwind.snippet.ts +16 -0
- package/themes/kinetic-data/theme.yml +207 -0
- package/themes/kinetic-data/tokens.ts +30 -0
- package/themes/kinetic-headline/.anchor-render.png +0 -0
- package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -0
- package/themes/kinetic-headline/audit.log.jsonl +4 -0
- package/themes/kinetic-headline/dismissals.jsonl +1 -0
- package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
- package/themes/kinetic-headline/theme.yml +81 -0
- package/themes/kinetic-headline/tokens.ts +26 -0
- package/themes/law-firm/THEME.md +108 -0
- package/themes/law-firm/tokens.ts +158 -0
- package/themes/lawtech-modern/THEME.md +107 -0
- package/themes/lawtech-modern/tokens.ts +192 -0
- package/themes/linkedin-pro/THEME.md +102 -0
- package/themes/linkedin-pro/tokens.ts +174 -0
- package/themes/logistics-modern/THEME.md +94 -0
- package/themes/logistics-modern/tokens.ts +187 -0
- package/themes/magazine-glossy/THEME.md +74 -0
- package/themes/magazine-glossy/tokens.ts +158 -0
- package/themes/marker-mag/THEME.md +128 -0
- package/themes/marker-mag/audit.log.jsonl +1 -0
- package/themes/marker-mag/tailwind.snippet.ts +15 -0
- package/themes/marker-mag/theme.yml +159 -0
- package/themes/marker-mag/tokens.ts +27 -0
- package/themes/marketplace-modern/THEME.md +135 -0
- package/themes/marketplace-modern/tokens.ts +186 -0
- package/themes/marketplace-vintage/THEME.md +110 -0
- package/themes/marketplace-vintage/tokens.ts +185 -0
- package/themes/maximalist/THEME.md +96 -0
- package/themes/maximalist/tokens.ts +168 -0
- package/themes/mid-century/THEME.md +109 -0
- package/themes/mid-century/tokens.ts +162 -0
- package/themes/motorcycle-brand/THEME.md +86 -0
- package/themes/motorcycle-brand/tokens.ts +174 -0
- package/themes/museum/THEME.md +83 -0
- package/themes/museum/tokens.ts +147 -0
- package/themes/music-streaming/THEME.md +101 -0
- package/themes/music-streaming/tokens.ts +187 -0
- package/themes/music-vinyl/THEME.md +98 -0
- package/themes/music-vinyl/tokens.ts +167 -0
- package/themes/nature-distilled/.anchor-render.png +0 -0
- package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -0
- package/themes/nature-distilled/audit.log.jsonl +2 -0
- package/themes/nature-distilled/tailwind.snippet.ts +16 -0
- package/themes/nature-distilled/theme.yml +91 -0
- package/themes/nature-distilled/tokens.ts +26 -0
- package/themes/news-tabloid/THEME.md +72 -0
- package/themes/news-tabloid/tokens.ts +158 -0
- package/themes/news-tech/THEME.md +75 -0
- package/themes/news-tech/tokens.ts +149 -0
- package/themes/newsletter/THEME.md +82 -0
- package/themes/newsletter/tokens.ts +138 -0
- package/themes/newspaper-classic/THEME.md +74 -0
- package/themes/newspaper-classic/tokens.ts +159 -0
- package/themes/nonprofit-arts/THEME.md +78 -0
- package/themes/nonprofit-arts/tokens.ts +157 -0
- package/themes/nonprofit-warm/THEME.md +105 -0
- package/themes/nonprofit-warm/tokens.ts +188 -0
- package/themes/outdoor-adventure/THEME.md +113 -0
- package/themes/outdoor-adventure/tokens.ts +181 -0
- package/themes/overland-broadside/THEME.md +119 -0
- package/themes/overland-broadside/audit.log.jsonl +1 -0
- package/themes/overland-broadside/tailwind.snippet.ts +17 -0
- package/themes/overland-broadside/theme.yml +138 -0
- package/themes/overland-broadside/tokens.ts +27 -0
- package/themes/performance-engineered/THEME.md +162 -0
- package/themes/performance-engineered/audit.log.jsonl +1 -0
- package/themes/performance-engineered/tailwind.snippet.ts +15 -0
- package/themes/performance-engineered/theme.yml +193 -0
- package/themes/performance-engineered/tokens.ts +29 -0
- package/themes/pet-food/THEME.md +78 -0
- package/themes/pet-food/tokens.ts +185 -0
- package/themes/pharma-clinical/THEME.md +164 -0
- package/themes/pharma-clinical/audit.log.jsonl +1 -0
- package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
- package/themes/pharma-clinical/theme.yml +201 -0
- package/themes/pharma-clinical/tokens.ts +29 -0
- package/themes/pill-editorial/THEME.md +125 -0
- package/themes/pill-editorial/audit.log.jsonl +1 -0
- package/themes/pill-editorial/tailwind.snippet.ts +15 -0
- package/themes/pill-editorial/theme.yml +168 -0
- package/themes/pill-editorial/tokens.ts +31 -0
- package/themes/podcast-warm/THEME.md +103 -0
- package/themes/podcast-warm/tokens.ts +192 -0
- package/themes/publisher-indie/THEME.md +78 -0
- package/themes/publisher-indie/tokens.ts +148 -0
- package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
- package/themes/raw-concrete/THEME.md +76 -0
- package/themes/raw-concrete/audit.log.jsonl +10 -0
- package/themes/raw-concrete/tailwind.snippet.ts +16 -0
- package/themes/raw-concrete/theme.yml +88 -0
- package/themes/raw-concrete/tokens.ts +27 -0
- package/themes/realestate-luxury/THEME.md +94 -0
- package/themes/realestate-luxury/tokens.ts +169 -0
- package/themes/realestate-marketplace/THEME.md +106 -0
- package/themes/realestate-marketplace/tokens.ts +183 -0
- package/themes/restaurant-modern/THEME.md +109 -0
- package/themes/restaurant-modern/tokens.ts +172 -0
- package/themes/runway-fashion/THEME.md +99 -0
- package/themes/runway-fashion/tokens.ts +167 -0
- package/themes/saturday-morning/THEME.md +117 -0
- package/themes/saturday-morning/tokens.ts +281 -0
- package/themes/schema.ts +235 -0
- package/themes/signal-dark/BUILD_BRIEF.md +168 -0
- package/themes/signal-dark/THEME.md +107 -0
- package/themes/signal-dark/tokens.ts +181 -0
- package/themes/soft-modern/THEME.md +91 -0
- package/themes/soft-modern/tokens.ts +166 -0
- package/themes/solar-residential/THEME.md +92 -0
- package/themes/solar-residential/tokens.ts +176 -0
- package/themes/sports-league/THEME.md +180 -0
- package/themes/sports-league/audit.log.jsonl +1 -0
- package/themes/sports-league/tailwind.snippet.ts +15 -0
- package/themes/sports-league/theme.yml +213 -0
- package/themes/sports-league/tokens.ts +32 -0
- package/themes/stadium-sport/THEME.md +114 -0
- package/themes/stadium-sport/tokens.ts +187 -0
- package/themes/streetwear-hype/THEME.md +100 -0
- package/themes/streetwear-hype/tokens.ts +174 -0
- package/themes/studio-architect/THEME.md +108 -0
- package/themes/studio-architect/tokens.ts +162 -0
- package/themes/studio-photographer/THEME.md +88 -0
- package/themes/studio-photographer/tokens.ts +164 -0
- package/themes/team-kanban/.anchor-render.png +0 -0
- package/themes/team-kanban/THEME.md +167 -0
- package/themes/team-kanban/audit.log.jsonl +2 -0
- package/themes/team-kanban/dismissals.jsonl +1 -0
- package/themes/team-kanban/tailwind.snippet.ts +15 -0
- package/themes/team-kanban/theme.yml +209 -0
- package/themes/team-kanban/tokens.ts +35 -0
- package/themes/telehealth-modern/THEME.md +95 -0
- package/themes/telehealth-modern/tokens.ts +197 -0
- package/themes/tourism-board/THEME.md +111 -0
- package/themes/tourism-board/tokens.ts +173 -0
- package/themes/toys-modern/THEME.md +79 -0
- package/themes/toys-modern/tokens.ts +200 -0
- package/themes/travel-luxury/THEME.md +95 -0
- package/themes/travel-luxury/tokens.ts +162 -0
- package/themes/vacation-rental/THEME.md +105 -0
- package/themes/vacation-rental/tokens.ts +174 -0
- package/themes/vault-reel/THEME.md +134 -0
- package/themes/vault-reel/audit.log.jsonl +3 -0
- package/themes/vault-reel/tailwind.snippet.ts +16 -0
- package/themes/vault-reel/theme.yml +167 -0
- package/themes/vault-reel/tokens.ts +30 -0
- package/themes/vet-modern/THEME.md +79 -0
- package/themes/vet-modern/tokens.ts +194 -0
- package/themes/web3-restraint/THEME.md +87 -0
- package/themes/web3-restraint/tokens.ts +154 -0
- package/themes/wellness-active/THEME.md +102 -0
- package/themes/wellness-active/tokens.ts +203 -0
- package/themes/wellness-spa/THEME.md +93 -0
- package/themes/wellness-spa/tokens.ts +173 -0
- package/themes/y2k-chrome/THEME.md +118 -0
- package/themes/y2k-chrome/tokens.ts +249 -0
- package/themes/yoga-studio/THEME.md +76 -0
- package/themes/yoga-studio/tokens.ts +163 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const wellnessActive: Direction = {
|
|
4
|
+
name: "wellness-active",
|
|
5
|
+
ethos:
|
|
6
|
+
"Strava signal-orange · Whoop recovery-green · Peloton matte-black · Garmin tabular density · Athletic Greens premium cream",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Strava", trait: "signal orange on near-black + map-and-data hero" },
|
|
9
|
+
{ brand: "Whoop", trait: "deep black + signal green + recovery-graph hero" },
|
|
10
|
+
{ brand: "Peloton", trait: "matte black + signal red + cinematic instructor portraits" },
|
|
11
|
+
{ brand: "Garmin Connect", trait: "dark canvas + signal blue + dense health tabular" },
|
|
12
|
+
{ brand: "Athletic Greens", trait: "warm cream + serif + premium-supplement restraint" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Dark cinematic canvas with one electric signal color burning through each section. " +
|
|
16
|
+
"Oversized metric numerals — PRs, heart-rate zones, strain scores — set in tabular mono. " +
|
|
17
|
+
"Body-in-motion photography, kinetic graph reveals, a dashboard that reads like a podium.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Archivo",
|
|
22
|
+
fallback: ["Inter", "Helvetica Neue", "system-ui", "-apple-system", "sans-serif"],
|
|
23
|
+
from: "Strava/Whoop modern grotesque — broad caps, athletic stance, broadcast-poster weight at 800",
|
|
24
|
+
googleFont: "Archivo",
|
|
25
|
+
weights: [400, 600, 800, 900],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "sans-serif"],
|
|
30
|
+
from: "Garmin/Peloton clean sans — neutral UI body, never decorative under data",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500, 600, 700],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "tabular numerics for splits, BPM, watts, recovery % — instrument-cluster heritage from Garmin",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500, 700],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.02em", // big athletic display tightens at scale — Strava header feel
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"tnum", "ss01", "cv11"',
|
|
47
|
+
h1ScaleClamp: "clamp(3.5rem, 11vw, 9rem)", // oversized PR-number scale — the metric IS the headline
|
|
48
|
+
bodyBaseSize: "1rem", // 16px — comfortable on dark surfaces
|
|
49
|
+
bodyLineHeight: "1.55", // tighter than editorial; this is a dashboard, not a magazine
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "220 14% 5%", from: "Whoop deep black — graphite, not pure ink" },
|
|
54
|
+
foreground: { hsl: "36 18% 95%", from: "Athletic Greens warm cream — premium, never bone-white on dark" },
|
|
55
|
+
card: { hsl: "220 12% 8%", from: "elevated surface, one stop up from canvas — graph-card tier" },
|
|
56
|
+
popover: { hsl: "220 11% 11%", from: "menu/popover surface, two stops up" },
|
|
57
|
+
primary: { hsl: "18 96% 56%", from: "Strava signal orange — the canonical activity color, used on PRs and CTAs" },
|
|
58
|
+
primaryForeground: { hsl: "220 14% 5%", from: "graphite on Strava orange — never cream, contrast law" },
|
|
59
|
+
secondary: { hsl: "220 10% 13%", from: "Peloton matte-steel tier — secondary surface, deeper grain" },
|
|
60
|
+
secondaryForeground: { hsl: "36 18% 95%", from: "cream on matte-steel" },
|
|
61
|
+
muted: { hsl: "220 9% 15%", from: "muted surface — same family as secondary, fractionally lighter" },
|
|
62
|
+
mutedForeground: { hsl: "36 8% 65%", from: "warm-tinted secondary text — locker-room gray" },
|
|
63
|
+
accent: { hsl: "220 10% 18%", from: "hover surface, Peloton brushed-steel highlight" },
|
|
64
|
+
accentForeground: { hsl: "36 18% 95%", from: "cream on accent steel" },
|
|
65
|
+
border: { hsl: "220 8% 20%", from: "Garmin hairline panel-gap — engineered, visible only on inspection" },
|
|
66
|
+
input: { hsl: "220 8% 20%", from: "same as border — single hairline language" },
|
|
67
|
+
ring: { hsl: "18 96% 56%", from: "Strava orange — focus is the signal color, never neutral" },
|
|
68
|
+
destructive: { hsl: "0 84% 58%", from: "Peloton signal red — heart-rate-max alert, not decoration" },
|
|
69
|
+
destructiveForeground: { hsl: "36 18% 95%", from: "cream on alert red" },
|
|
70
|
+
brand: {
|
|
71
|
+
"signal-orange": { hsl: "18 96% 56%", from: "Strava 1828 — the activity orange, also primary" },
|
|
72
|
+
"recovery-green": { hsl: "142 72% 48%", from: "Whoop recovery green — the rested-and-ready state, also success" },
|
|
73
|
+
"strain-blue": { hsl: "204 96% 58%", from: "Garmin/Whoop strain blue — cardio-zone HUD, instrument cluster" },
|
|
74
|
+
"zone-yellow": { hsl: "48 100% 56%", from: "Strava/Garmin tempo-zone yellow — threshold tier on heart-rate plots" },
|
|
75
|
+
cream: { hsl: "36 18% 95%", from: "Athletic Greens warm cream — premium-supplement off-white, also foreground" },
|
|
76
|
+
graphite: { hsl: "220 14% 5%", from: "Whoop graphite — the canvas, also background" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
spacing: {
|
|
81
|
+
base: 4,
|
|
82
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128], // medium density — dashboards breathe but pack data
|
|
83
|
+
containerMax: "max-w-7xl", // wide — graphs and split-tables need horizontal room
|
|
84
|
+
containerPadding: "px-6 lg:px-10",
|
|
85
|
+
sectionPadding: {
|
|
86
|
+
hero: "pt-20 pb-12 lg:pt-32 lg:pb-20",
|
|
87
|
+
default: "py-16 lg:py-24",
|
|
88
|
+
tight: "py-10 lg:py-14",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
radius: {
|
|
93
|
+
base: "0.5rem", // soft enough for cards, never pillow — sport-tech chamfer
|
|
94
|
+
pillsAllowed: true, // zone tags, heart-rate badges and activity-type chips read as pills
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
shadows: {
|
|
98
|
+
style: "glow",
|
|
99
|
+
utilities: {
|
|
100
|
+
"glow-signal":
|
|
101
|
+
"0 0 0 1px hsl(var(--signal-orange) / 0.4), " +
|
|
102
|
+
"0 8px 24px hsl(var(--signal-orange) / 0.2), " +
|
|
103
|
+
"0 40px 100px hsl(var(--signal-orange) / 0.25)",
|
|
104
|
+
"glow-recovery":
|
|
105
|
+
"0 0 0 1px hsl(var(--recovery-green) / 0.4), " +
|
|
106
|
+
"0 8px 24px hsl(var(--recovery-green) / 0.18), " +
|
|
107
|
+
"0 40px 100px hsl(var(--recovery-green) / 0.22)",
|
|
108
|
+
"card-lift":
|
|
109
|
+
"0 1px 0 0 hsl(var(--border)), " +
|
|
110
|
+
"0 24px 60px hsl(220 14% 0% / 0.45)",
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
motion: {
|
|
115
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
116
|
+
durations: {
|
|
117
|
+
reveal: 700, // graph rise-in — fast enough to feel responsive, slow enough to read
|
|
118
|
+
loop: 1800, // heartbeat pulses, strain rings
|
|
119
|
+
ambient: 18000, // ken-burns over hero training photography
|
|
120
|
+
},
|
|
121
|
+
keyframes: {
|
|
122
|
+
"metric-count": {
|
|
123
|
+
css:
|
|
124
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
125
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
126
|
+
defaultDuration: 700,
|
|
127
|
+
iteration: "once",
|
|
128
|
+
purpose: "PR/metric number entrance — the headline number rises into place before the label",
|
|
129
|
+
},
|
|
130
|
+
"graph-trace": {
|
|
131
|
+
css:
|
|
132
|
+
"from { stroke-dashoffset: 1000; }\n" +
|
|
133
|
+
"to { stroke-dashoffset: 0; }",
|
|
134
|
+
defaultDuration: 1600,
|
|
135
|
+
iteration: "once",
|
|
136
|
+
purpose: "SVG line-graph reveal — heart-rate trace draws left-to-right as the section enters viewport",
|
|
137
|
+
},
|
|
138
|
+
"heartbeat": {
|
|
139
|
+
css:
|
|
140
|
+
"0%, 100% { transform: scale(1); }\n" +
|
|
141
|
+
"12% { transform: scale(1.08); }\n" +
|
|
142
|
+
"24% { transform: scale(1); }\n" +
|
|
143
|
+
"36% { transform: scale(1.04); }\n" +
|
|
144
|
+
"48% { transform: scale(1); }",
|
|
145
|
+
defaultDuration: 1800,
|
|
146
|
+
iteration: "infinite",
|
|
147
|
+
purpose: "live-session indicator — BPM dot pulses in a real cardiac rhythm, not a sine wave",
|
|
148
|
+
},
|
|
149
|
+
"strain-ring": {
|
|
150
|
+
css:
|
|
151
|
+
"0% { stroke-dasharray: 0 360; }\n" +
|
|
152
|
+
"100% { stroke-dasharray: 280 360; }",
|
|
153
|
+
defaultDuration: 1400,
|
|
154
|
+
iteration: "once",
|
|
155
|
+
purpose: "Whoop-style circular progress ring fills to the current strain value on reveal",
|
|
156
|
+
},
|
|
157
|
+
"ken-burns-hero": {
|
|
158
|
+
css:
|
|
159
|
+
"0% { transform: scale(1.06) translate(0, 0); }\n" +
|
|
160
|
+
"100% { transform: scale(1.16) translate(-2%, -1%); }",
|
|
161
|
+
defaultDuration: 18000,
|
|
162
|
+
iteration: "infinite",
|
|
163
|
+
purpose: "hero training photography drift — Peloton instructor portrait, slow camera push",
|
|
164
|
+
},
|
|
165
|
+
"pulse-signal": {
|
|
166
|
+
css:
|
|
167
|
+
"0%, 100% { box-shadow: 0 0 0 0 hsl(var(--signal-orange) / 0.55); }\n" +
|
|
168
|
+
"50% { box-shadow: 0 0 0 14px hsl(var(--signal-orange) / 0); }",
|
|
169
|
+
defaultDuration: 2200,
|
|
170
|
+
iteration: "infinite",
|
|
171
|
+
purpose: "single primary CTA heartbeat ring — start-workout button, one per page only",
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
respectsReducedMotion: true,
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
density: "medium",
|
|
178
|
+
|
|
179
|
+
patterns: {
|
|
180
|
+
button:
|
|
181
|
+
"Primary action = signal-orange filled rectangle, graphite text, 0.5rem radius, uppercase tracking 0.08em label. " +
|
|
182
|
+
"Secondary = transparent with 1px border in --border, cream text, hover lifts to --accent. " +
|
|
183
|
+
"Tertiary = text-link in signal-orange, underline-on-hover. " +
|
|
184
|
+
"Recovery actions (rest, sleep, mark complete) use recovery-green fill instead of orange — semantic, not decorative.",
|
|
185
|
+
card:
|
|
186
|
+
"0.5rem radius, hairline border (--border), bg-card one stop above canvas. " +
|
|
187
|
+
"Padding p-6 lg:p-8. Metric cards use card-lift shadow; live-session cards use glow-signal; " +
|
|
188
|
+
"recovery cards use glow-recovery. Headline metric in oversized Archivo display, label in mono uppercase tracking 0.1em.",
|
|
189
|
+
input:
|
|
190
|
+
"Full box, 1px --border, bg-card, 0.5rem radius. Label sits above in mono uppercase, tracking 0.08em. " +
|
|
191
|
+
"Focus ring is signal-orange, 2px. Units (bpm, kg, km) live in a mono suffix slot inside the input.",
|
|
192
|
+
cta:
|
|
193
|
+
"The single hero start-workout button uses pulse-signal glow. " +
|
|
194
|
+
"Inline CTAs are text-links in signal-orange. Never a green primary unless it is semantically a recovery action.",
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
details: {
|
|
198
|
+
selectionBg: "hsl(var(--signal-orange) / 0.35)",
|
|
199
|
+
selectionFg: "hsl(var(--foreground))",
|
|
200
|
+
focusRing: "2px solid hsl(var(--ring))",
|
|
201
|
+
scrollbarStyle: "thin",
|
|
202
|
+
},
|
|
203
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Design Direction — Wellness-Spa
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Aman cream restraint · Six Senses warm sand · The Class deep cream · Hotel Esencia earth · Open meditation softness
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Luxury wellness retreat. The page reads like a folded cotton robe on a stone shelf — quiet, considered, expensive in its withholding. Cream and stone surfaces, a single restrained sage or terracotta accent, vast negative space, slow pacing. The site is for a retreat-booking, a spa-membership, a meditation-app premium tier, a wellness-resort brochure — anywhere the value proposition is *less*, not *more*. The page settles; it does not perform.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Aman** → cream paper, EB Garamond display, extreme restraint, vast whitespace as luxury signal.
|
|
11
|
+
- **Six Senses** → warm sand and cream pairing, serif headings, photography of stone, water, linen.
|
|
12
|
+
- **The Class by Taryn Toomey** → deep cream surfaces, restrained typography, ceremonial pacing.
|
|
13
|
+
- **Hotel Esencia** → warm earth-tone accent (terracotta-sage palette), EB Garamond, brochure-feel.
|
|
14
|
+
- **Open** → meditation-app warmth, Plus Jakarta as humanist body, soft gradient restraint.
|
|
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 **cream paper** (background AND card — no card differentiation) → **deeper cream** (secondary) → **stone** (muted) → **sage-soft or terracotta-soft** (the two restrained accent tints). Depth comes from hairline rules and whitespace, never from fill differentiation. The card token equals the background token on purpose — the page is one continuous surface.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--cream`, `--cream-deep`, `--sage`, `--sage-soft`, `--terracotta`, `--terracotta-soft`, `--stone`, `--ink`. Primary is **Six Senses sage** — used sparingly, never as a marketing color, never on more than one CTA per page. Terracotta is the second accent for warmth moments (retreat-photography pairing, treatment-icon strokes).
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** EB Garamond (Aman/Hotel Esencia feel). h1–h4, weights 400/500. Italic variants are core, not decoration. Tracking `-0.01em` — barely-tightened.
|
|
25
|
+
- **Body:** Plus Jakarta Sans (Open/Six Senses feel), weights 300/400/500. Body base **17px** with **line-height 1.75** — pacing comes from line-height. Tracking `0.005em` — a hair of open tracking for luxury sans breath.
|
|
26
|
+
- **Mono:** JetBrains Mono. Used only for booking-confirmation numerals and treatment-duration metadata. Sparingly is the point — mono is a tool font and this brand is not a tool.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.5rem, 6vw, 4.5rem)`. Numbers use lining figures by default but treatment durations and prices may use old-style figures with `"onum"`. Font features: `"liga"`, `"dlig"`, `"kern"` — ligatures on for luxury serif rendering.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-4xl px-6 lg:px-12` — narrow; this is a brochure column, not a marketing splash. The retreat is exclusive; the layout reflects it.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-32 pb-24 lg:pt-48 lg:pb-32` (oversized — ceremony)
|
|
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 on purpose — the gaps in the scale (no 6, no 10, no 14) prevent fussy small adjustments. If a layout needs a 10px gap, the answer is reconsidering whether the element belongs.
|
|
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 — `--cream` and `--ink` (a deep earth-tone) replace them. Sage and terracotta are the only saturated colors, and "saturated" is generous — both are heavily desaturated.
|
|
40
|
+
|
|
41
|
+
The single sage accent appears at most twice per page: once on the primary CTA (sage-fill rectangle), once on a treatment-icon stroke or hairline rule. Terracotta is rarer — reserved for retreat-photography pairing, seasonal-offering moments, and warmth-needed editorial accents. The restraint is the brand; if the page reads colorful, the brand has collapsed.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 0`. **Sharp corners only.** Aman, Six Senses, Hotel Esencia do not round corners; rounding reads app/SaaS and undermines the heritage-hospitality language. Pills are disallowed (`pillsAllowed: false`) — tags and status indicators are framed by hairline top/bottom rules or rendered as small-caps text, never as pills.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**Minimal.** Two utilities:
|
|
48
|
+
- `.shadow-quiet` — single 1px bottom rule in stone-tinted color; the only "shadow" most components ever receive
|
|
49
|
+
- `.shadow-popover` — soft warm shadow for popover/modal lift (booking-confirmation modal, treatment-detail overlay)
|
|
50
|
+
|
|
51
|
+
No drop shadows on cards (there are no cards). No glows. No colored shadows. Depth is whitespace.
|
|
52
|
+
|
|
53
|
+
## Motion
|
|
54
|
+
Three keyframes — `fade-rise` (section entrance, **1400ms** — slower than editorial, retreat pacing), `fade-in` (image and quote-block entrance, 1200ms, opacity only when transform would feel restless), `ken-burns-still` (hero retreat-landscape photograph, 32000ms infinite, barely-perceptible push — only on the lead image, never elsewhere).
|
|
55
|
+
|
|
56
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — wrapped in a media query in every motion utility. **No looped motion** beyond the single hero ken-burns. The page settles; it does not perform. Reveal at 1400ms is deliberate — visitors to a luxury retreat brochure expect ceremony, not snappy SaaS responsiveness.
|
|
57
|
+
|
|
58
|
+
## Component patterns
|
|
59
|
+
- **Buttons:** Text-link CTAs by default — foreground earth-ink with a hairline underline appearing on hover. Solid sage-fill is reserved for the single primary action per page (Reserve, Book Stay, Begin Membership). No secondary solid buttons. No icon-only buttons. Destructive uses muted-terracotta text-link with a confirm step, never a red fill.
|
|
60
|
+
- **Cards:** No card chrome at all. Content sits directly on cream, separated by hairline rules and generous whitespace. Internal padding `p-8 lg:p-12`. Title in EB Garamond italic or roman; body in Plus Jakarta 400. When grouping is essential, a single top hairline rule does the work — never a filled card, never a rounded container.
|
|
61
|
+
- **Inputs:** Border-bottom only, 1px stone. Cream background, no full box. Label sits above in small-caps Plus Jakarta with letter-spacing `0.12em`. Focus = sage 1px underline, no glow. Placeholder italic, lowercase.
|
|
62
|
+
- **CTAs:** Primary CTA is a text-link with hairline underline in foreground ink. The single hero action per page may use a sage-fill rectangle with cream text — once, never twice. All other actions are text-links. Marketing flourish does not exist in this language.
|
|
63
|
+
|
|
64
|
+
## Recommended rich media
|
|
65
|
+
Wellness-spa photography is **the most important asset on the page**. Hero imagery is **stone, water, linen, plant** — environmental landscape from the retreat, the spa pool at sunrise, a folded towel on a teak bench, a single ceramic bowl on a stone shelf. Photography is color-graded to warm late-afternoon light — golden-hour highlights, gentle shadows, never mid-day flat. Kodak Portra 400 or Fuji Pro 400H feel.
|
|
66
|
+
|
|
67
|
+
Portraits are rare and editorial when used — a guest in profile reading on a daybed, a practitioner's hands in mid-treatment, never face-forward smiling stock. The audience is buying the *experience*, and a stock-smiling face short-circuits the imagination.
|
|
68
|
+
|
|
69
|
+
**AI tool recommendations:** **Midjourney / Flux** with prompts like *"luxury retreat landscape photography, stone and water and linen, late afternoon golden hour, Portra 400, depth of field, editorial"*; *"hands holding ceramic tea bowl, soft window light, slight film grain, environmental wellness"*. **Recraft** for single-stroke line illustrations of treatments (massage table, meditation cushion) in earth-tone monoline. Avoid Midjourney's default people-and-smiles output — luxury wellness photography is environment-first, people-rare-and-editorial.
|
|
70
|
+
|
|
71
|
+
**Aspect ratios:** 3:2 landscape (heritage photographic standard) or 4:5 portrait for environmental verticals. Never 16:9 (cinematic, wrong feel for this brand). Never 1:1 (Instagram-aesthetic, breaks the brochure language).
|
|
72
|
+
|
|
73
|
+
**Video:** generally avoided. If used, a single hero with a poster image and a play button — never autoplay loop. A 6-second ambient loop of water-on-stone or linen-in-breeze is acceptable for the hero only, ≤2 MB, H.265, no audio. Treatment-walkthrough video is wrong for this brand — the experience is described in prose, photographed in stills.
|
|
74
|
+
|
|
75
|
+
**Performance:** hero image ≤180 KB AVIF at 1800w (slightly larger budget than editorial — the photography is core to conversion). Inline figures ≤80 KB. LCP under 2.5s.
|
|
76
|
+
|
|
77
|
+
**Avoid:** stock photography of yoga-poses-on-cliff, glowing-pill renders, gradient backgrounds, glassmorphic anything, AI photos with uncanny smiles or weird hands, anything that looks like a 2015 spa brochure (overhead flatlay of crystals and dropper bottles is over), 3D rendered water droplets, lens flare, gold-foil overlays.
|
|
78
|
+
|
|
79
|
+
**Accessibility:** alt-text is descriptive and ceremonial: *"A folded linen robe rests on a teak bench beside a stone basin filled with water, late afternoon light catching the surface."* The *"Image: …"* prefix is not enough — describe as if for a guest who has never visited.
|
|
80
|
+
|
|
81
|
+
## Component families
|
|
82
|
+
None at install time. The hint sheet for treatment-listing, room-detail, retreat-program, and booking-flow patterns lives in the design-system handoff once the first views ship; the Director appends them here as patterns stabilize.
|
|
83
|
+
|
|
84
|
+
## Details
|
|
85
|
+
- **Selection:** `hsl(var(--sage) / 0.20)` background, foreground text.
|
|
86
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` — thin, quiet sage. Never a 2px glow ring; that is dashboard language.
|
|
87
|
+
- **Scrollbar:** thin.
|
|
88
|
+
|
|
89
|
+
## Exceptions
|
|
90
|
+
None yet. When an intentional one-of-one violation lands (a single rounded element for a booking-trust-badge that must match a third-party payment partner, a terracotta-fill button for a one-off seasonal landing page), add it here with the reason. The Director's consistency pass lists all exceptions for human review.
|
|
91
|
+
|
|
92
|
+
## Revisions
|
|
93
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const wellnessSpa: Direction = {
|
|
4
|
+
name: "wellness-spa",
|
|
5
|
+
ethos:
|
|
6
|
+
"Aman cream restraint · Six Senses warm sand · The Class deep cream · Hotel Esencia earth · Open meditation softness",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Aman", trait: "cream + EB Garamond + extreme restraint" },
|
|
9
|
+
{ brand: "Six Senses", trait: "sand + warm cream + serif heads" },
|
|
10
|
+
{ brand: "The Class by Taryn Toomey", trait: "deep cream + restrained type" },
|
|
11
|
+
{ brand: "Hotel Esencia", trait: "warm earth tones + EB Garamond" },
|
|
12
|
+
{ brand: "Open", trait: "soft gradient + Plus Jakarta restraint" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Luxury wellness retreat. Cream and stone surfaces, a single restrained sage or " +
|
|
16
|
+
"terracotta accent, vast negative space, slow pacing. The page reads like a folded " +
|
|
17
|
+
"cotton robe on a stone shelf — quiet, considered, expensive in its withholding.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "EB Garamond",
|
|
22
|
+
fallback: ["Cormorant Garamond", "Garamond", "Georgia", "serif"],
|
|
23
|
+
from: "Aman/Hotel Esencia serif — old-world hospitality, never sans for headings",
|
|
24
|
+
googleFont: "EB+Garamond",
|
|
25
|
+
weights: [400, 500],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Plus Jakarta Sans",
|
|
29
|
+
fallback: ["Inter", "system-ui", "-apple-system", "sans-serif"],
|
|
30
|
+
from: "Open/Six Senses body — humanist sans with warmth, never cold geometric",
|
|
31
|
+
googleFont: "Plus+Jakarta+Sans",
|
|
32
|
+
weights: [300, 400, 500],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "booking-confirmation numerals and treatment-duration metadata — used sparingly",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.01em", // serif at large size — barely-tightened
|
|
45
|
+
bodyTracking: "0.005em", // hair of open tracking — luxury sans breath
|
|
46
|
+
fontFeatureSettings: '"liga", "dlig", "kern"',
|
|
47
|
+
h1ScaleClamp: "clamp(2.5rem, 6vw, 4.5rem)",
|
|
48
|
+
bodyBaseSize: "1.0625rem", // 17px — readable in a slow scroll
|
|
49
|
+
bodyLineHeight: "1.75", // generous — pacing comes from line-height
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "36 30% 95%", from: "Aman cream — warm paper, slightly toasted" },
|
|
54
|
+
foreground: { hsl: "28 18% 18%", from: "Hotel Esencia deep earth ink — softer than black, never cool" },
|
|
55
|
+
card: { hsl: "36 30% 95%", from: "same as background — no card chrome, restraint over differentiation" },
|
|
56
|
+
popover: { hsl: "36 34% 97%", from: "fractionally lighter cream — popover lifts via tone, not shadow" },
|
|
57
|
+
primary: { hsl: "150 18% 38%", from: "Six Senses sage — the single restrained accent, used sparingly" },
|
|
58
|
+
primaryForeground: { hsl: "36 30% 95%", from: "cream on sage" },
|
|
59
|
+
secondary: { hsl: "36 24% 92%", from: "deeper cream — secondary surface, only one tone off bg" },
|
|
60
|
+
secondaryForeground: { hsl: "28 18% 18%", from: "earth ink on deeper cream" },
|
|
61
|
+
muted: { hsl: "36 22% 90%", from: "stone — slightly cooler than secondary, used for inset zones" },
|
|
62
|
+
mutedForeground: { hsl: "28 12% 44%", from: "earth-gray — captions, treatment-duration labels" },
|
|
63
|
+
accent: { hsl: "20 26% 86%", from: "warm terracotta-stone — second accent tint, retreat warmth" },
|
|
64
|
+
accentForeground: { hsl: "20 32% 24%", from: "deep terracotta on its tint" },
|
|
65
|
+
border: { hsl: "36 18% 84%", from: "stone hairline — visible on cream, never harsh" },
|
|
66
|
+
input: { hsl: "36 18% 84%", from: "same as border" },
|
|
67
|
+
ring: { hsl: "150 18% 38%", from: "primary sage, used for focus" },
|
|
68
|
+
destructive: { hsl: "16 50% 48%", from: "muted terracotta-red — cancel-booking, never alarm-red" },
|
|
69
|
+
destructiveForeground: { hsl: "36 30% 95%", from: "cream on muted terracotta" },
|
|
70
|
+
brand: {
|
|
71
|
+
cream: { hsl: "36 30% 95%", from: "alias for background — Aman cream paper" },
|
|
72
|
+
"cream-deep": { hsl: "36 24% 92%", from: "secondary cream — one tone deeper" },
|
|
73
|
+
sage: { hsl: "150 18% 38%", from: "Six Senses sage — the canonical luxury wellness accent" },
|
|
74
|
+
"sage-soft": { hsl: "150 14% 88%", from: "sage tint — restrained badge surface, used once per view" },
|
|
75
|
+
terracotta: { hsl: "20 50% 52%", from: "Hotel Esencia warm earth — secondary accent, retreat-warmth moments" },
|
|
76
|
+
"terracotta-soft": { hsl: "20 26% 86%", from: "alias for accent — warm-stone hover surface" },
|
|
77
|
+
stone: { hsl: "36 12% 70%", from: "warm stone — divider lines, muted icon, treatment-icon stroke" },
|
|
78
|
+
ink: { hsl: "28 18% 18%", from: "alias for foreground — earth ink" },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
spacing: {
|
|
83
|
+
base: 4,
|
|
84
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160, 192], // restrained — sparse on purpose
|
|
85
|
+
containerMax: "max-w-4xl", // narrow — prose-leaning, retreat-brochure column
|
|
86
|
+
containerPadding: "px-6 lg:px-12",
|
|
87
|
+
sectionPadding: {
|
|
88
|
+
hero: "pt-32 pb-24 lg:pt-48 lg:pb-32",
|
|
89
|
+
default: "py-24 lg:py-40",
|
|
90
|
+
tight: "py-16 lg:py-24",
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
radius: {
|
|
95
|
+
base: "0", // sharp corners — Aman/Six Senses do not round; rounding reads app
|
|
96
|
+
pillsAllowed: false, // pills are app-language; here tags are framed by hairline rules
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
shadows: {
|
|
100
|
+
style: "minimal",
|
|
101
|
+
utilities: {
|
|
102
|
+
"shadow-quiet":
|
|
103
|
+
"0 1px 0 hsl(36 18% 80%)",
|
|
104
|
+
"shadow-popover":
|
|
105
|
+
"0 2px 4px hsl(28 18% 18% / 0.04), 0 12px 32px hsl(28 18% 18% / 0.08)",
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
motion: {
|
|
110
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
111
|
+
durations: {
|
|
112
|
+
reveal: 1400, // slower than editorial — retreat pacing
|
|
113
|
+
loop: 0, // no looped motion
|
|
114
|
+
ambient: 32000, // single ambient ken-burns on hero photography only
|
|
115
|
+
},
|
|
116
|
+
keyframes: {
|
|
117
|
+
"fade-rise": {
|
|
118
|
+
css:
|
|
119
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
120
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
121
|
+
defaultDuration: 1400,
|
|
122
|
+
iteration: "once",
|
|
123
|
+
purpose: "section entrance — slow, ceremonial, never abrupt",
|
|
124
|
+
},
|
|
125
|
+
"fade-in": {
|
|
126
|
+
css:
|
|
127
|
+
"from { opacity: 0; }\n" +
|
|
128
|
+
"to { opacity: 1; }",
|
|
129
|
+
defaultDuration: 1200,
|
|
130
|
+
iteration: "once",
|
|
131
|
+
purpose: "image and quote-block entrance — opacity only when transform would feel restless",
|
|
132
|
+
},
|
|
133
|
+
"ken-burns-still": {
|
|
134
|
+
css:
|
|
135
|
+
"0% { transform: scale(1.04) translate(0, 0); }\n" +
|
|
136
|
+
"100% { transform: scale(1.10) translate(-1%, -0.5%); }",
|
|
137
|
+
defaultDuration: 32000,
|
|
138
|
+
iteration: "infinite",
|
|
139
|
+
purpose: "hero retreat-landscape photograph — barely-perceptible push, only on the lead image",
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
respectsReducedMotion: true,
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
density: "low",
|
|
146
|
+
|
|
147
|
+
patterns: {
|
|
148
|
+
button:
|
|
149
|
+
"Text-link CTAs by default — foreground earth-ink with hairline underline appearing on hover. " +
|
|
150
|
+
"Solid sage-fill is reserved for the single primary action per page (Reserve, Book Stay). " +
|
|
151
|
+
"No secondary solid buttons. No icon-only buttons. " +
|
|
152
|
+
"Destructive uses muted-terracotta text-link with confirm step, never a red fill.",
|
|
153
|
+
card:
|
|
154
|
+
"No card chrome at all. Content sits directly on cream, separated by hairline rules and generous whitespace. " +
|
|
155
|
+
"Internal padding p-8 lg:p-12. Title in EB Garamond italic or roman; body in Plus Jakarta 400. " +
|
|
156
|
+
"When grouping is essential, a single top hairline rule does the work — never a filled card.",
|
|
157
|
+
input:
|
|
158
|
+
"Border-bottom only, 1px stone. White-cream background, no full box. " +
|
|
159
|
+
"Label sits above in small-caps Plus Jakarta with letter-spacing 0.12em. " +
|
|
160
|
+
"Focus = sage 1px underline, no glow. Placeholder italic, lowercase.",
|
|
161
|
+
cta:
|
|
162
|
+
"Primary CTA is a text-link with hairline underline in foreground ink. " +
|
|
163
|
+
"The single hero action per page may use a sage-fill rectangle with cream text — once, never twice. " +
|
|
164
|
+
"All other actions are text-links. Marketing flourish does not exist in this language.",
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
details: {
|
|
168
|
+
selectionBg: "hsl(var(--sage) / 0.20)",
|
|
169
|
+
selectionFg: "hsl(var(--foreground))",
|
|
170
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
171
|
+
scrollbarStyle: "thin",
|
|
172
|
+
},
|
|
173
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Design Direction — Y2K Chrome
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
iMac G4 translucent · iPod gleam · MTV 2001 chrome · Bose Wave optimism · early-WinAmp futurism · Sony VAIO magnesium-and-blue
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Optimistic-tech nostalgia. Translucent surfaces, chrome gleams, soft cool gradients (silver-to-blue), bubble buttons. Rounded everything. The world hasn't ended yet and the future is shiny.
|
|
8
|
+
|
|
9
|
+
Soft-modern is the closest sibling — same rounded vocabulary, same monochromatic cool-gray surface stack — but where soft-modern stays matte and quiet, y2k-chrome wets the surface, adds the bevel, and lights the dome from inside.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Apple iMac G3/G4** → translucent shells, candy-colored optimism. The dome with the light on behind it.
|
|
13
|
+
- **Apple iPod (original)** → chrome back, click-wheel gleam. The bevel and the catch of light.
|
|
14
|
+
- **MTV (2001 broadcast graphics)** → chrome wordmarks, lens flares, cyan lower-thirds.
|
|
15
|
+
- **Bose Wave radio** → soft silver product optimism. Brushed aluminum, no sharp corners.
|
|
16
|
+
- **WinAmp (original)** → skinnable futurism, cyan VU meters. The glow accent at peak.
|
|
17
|
+
- **Sony VAIO** → magnesium-and-blue laptop era. Cool palette, lavender accent strip.
|
|
18
|
+
|
|
19
|
+
## Tokens
|
|
20
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
21
|
+
|
|
22
|
+
Surface stack is **cool gray** (background) → white (card, translucent shell) → soft silver (secondary/muted) → chrome (accent hover). Depth comes from the `.gleam` and `.chrome-edge` utilities, not from hue shift — the palette stays inside 200°-260° hue at all times.
|
|
23
|
+
|
|
24
|
+
Brand tokens: `--chrome-light`, `--chrome-mid`, `--chrome-deep` (the three stops of a brushed-metal gradient), `--cyan-hot` (WinAmp/MTV peak cyan, used as glow only), `--lavender` (Y2K secondary — Bondi-era lilac, VAIO accent, tags and status).
|
|
25
|
+
|
|
26
|
+
Primary is **iMac-era cyan-blue** (`200 95% 50%`) — the .com-boom hero color. Never a saturated warm hue, never a desaturated enterprise blue.
|
|
27
|
+
|
|
28
|
+
## Typography
|
|
29
|
+
- **Display:** Eurostile (canonical Y2K display face — geometric, tech-feel, broadcast-graphic energy). Bahnschrift is the equivalent on Windows; DM Sans is the web-safe Google Fonts fallback. h1–h4, weights 400/500/700.
|
|
30
|
+
- **Body:** Inter. Clean, neutral — lets the chrome chrome itself. The body text doesn't compete with the gleam.
|
|
31
|
+
- **Mono:** Space Mono. Geometric mono with personality — feels like OS X 10.0 dock fonts and old VAIO BIOS screens. Captions, code, dock-style labels.
|
|
32
|
+
|
|
33
|
+
Headings track `0.01em` — slight *positive* tracking; Eurostile/Bahnschrift breathes wider, and the broadcast-graphic feel wants the air. Body tracks `0`. H1 uses `clamp(2.25rem, 5.5vw, 4rem)`. Inter stylistic sets `"ss01", "cv11"`.
|
|
34
|
+
|
|
35
|
+
## Spacing
|
|
36
|
+
- **Container:** `max-w-6xl px-4 lg:px-8`.
|
|
37
|
+
- **Section padding tiers:**
|
|
38
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
|
|
39
|
+
- Default: `py-16 lg:py-24`
|
|
40
|
+
- Tight: `py-10 lg:py-16`
|
|
41
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 48. Medium density — decoration takes some room.
|
|
42
|
+
|
|
43
|
+
## Color
|
|
44
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier. Pure black is forbidden — `--foreground` is `220 25% 12%` (deep cool black, never warm).
|
|
45
|
+
|
|
46
|
+
Warm hues are forbidden across the palette. If you reach for amber or coral, you've left the direction. The destructive token is pulled toward magenta-red (`350°`) rather than fire-red (`12°`) to stay inside the cool envelope.
|
|
47
|
+
|
|
48
|
+
## Radius
|
|
49
|
+
`--radius: 1rem` (16px). **Very rounded — iMac G4 dome territory.** Pills are allowed (`pillsAllowed: true`) and encouraged for compact actions and tags. Hard right angles read "developer demo," not Y2K product — keep things rounded.
|
|
50
|
+
|
|
51
|
+
## Shadows
|
|
52
|
+
Four glow-style utilities — multi-layer, with inset highlights that simulate a wet acrylic surface.
|
|
53
|
+
|
|
54
|
+
- `.gleam` — the signature. Inset top highlight (the catch of light) + inset bottom shade (the bevel underside) + cyan-tinted drop shadow (the iMac shelf glow). The default for cards and bubble buttons.
|
|
55
|
+
- `.gleam-lg` — hover lift. Larger spread, deeper bevel.
|
|
56
|
+
- `.chrome-edge` — multi-stop gradient border simulation. Inset hairlines at chrome-light → chrome-mid → chrome-deep. Use on inputs and ghost buttons where a single-color border would look flat.
|
|
57
|
+
- `.glow-cyan` — WinAmp peak indicator and focus state. 1px cyan ring + 24px cyan-hot glow.
|
|
58
|
+
|
|
59
|
+
Shadows lean **cool** — the drop-shadow color is tinted with cyan, not neutral gray. Never warm, never harsh black.
|
|
60
|
+
|
|
61
|
+
## Motion
|
|
62
|
+
Three keyframes, all gentle:
|
|
63
|
+
- `scale-in` (200ms) — standard appear for bubble buttons, modals, popovers. Confirms the click without bouncing.
|
|
64
|
+
- `pulse-glow` (3000ms loop) — slow ambient oscillation on glow accents. The WinAmp VU meter at rest.
|
|
65
|
+
- `gleam-sweep` (4000ms loop) — light sweep across a chrome surface. The catch of light moving across an iPod back. Hero cards only; do not litter.
|
|
66
|
+
|
|
67
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)` — smooth easings only, no springs, no bounce. `prefers-reduced-motion` is honored — `pulse-glow` and `gleam-sweep` collapse to a static state.
|
|
68
|
+
|
|
69
|
+
## Component patterns
|
|
70
|
+
- **Buttons:** gradient-filled bubble (cyan-to-blue, top-light to bottom-dark) with inner highlight via `.gleam`. Very rounded (`rounded-2xl`); pills allowed for compact actions. Solid is the norm — text-links are the ghost variant. Hover: `.gleam-lg` + 1.02 scale; never a flat color swap.
|
|
71
|
+
- **Cards:** translucent white on cool-gray background, `.chrome-edge` border, `rounded-2xl`, `.gleam` shadow. Padding `p-6 lg:p-8`. Title in Eurostile/Bahnschrift display. Hover lifts to `.gleam-lg`. Optional `.gleam-sweep` strip on hero cards only.
|
|
72
|
+
- **Inputs:** full `rounded-xl` box, `.chrome-edge` inset border, `bg-card`. Focus uses `.glow-cyan` ring. Label above; helper text below in `mutedForeground`.
|
|
73
|
+
- **CTAs:** gradient bubble button is the default. Secondary CTAs are ghost (chrome-edge + foreground text) or text-link in primary cyan with underline-on-hover.
|
|
74
|
+
|
|
75
|
+
## Component families
|
|
76
|
+
None at install time. As `*Tile`, `*Capsule`, `*Dock` families emerge, the Director lists them here with their shared pattern.
|
|
77
|
+
|
|
78
|
+
## Recommended rich media
|
|
79
|
+
|
|
80
|
+
This direction leans hard on imagery — chrome is visual. The hero is rarely just type.
|
|
81
|
+
|
|
82
|
+
**Cover & hero imagery:**
|
|
83
|
+
- Product-shot photography on white seamless, Apple-marketing style — a single subject, centered, soft cool lighting, no warm fill.
|
|
84
|
+
- Chrome 3D renders: glass orbs, metallic bubble buttons, brushed-aluminum slabs, translucent acrylic shells.
|
|
85
|
+
- Glassy translucent UI screenshots presented at angle, with lens flares on hero highlights.
|
|
86
|
+
|
|
87
|
+
**AI tool recommendations:**
|
|
88
|
+
- **Midjourney / Flux** for renders. Prompt scaffold: *"Y2K aesthetic, chrome, translucent iMac G4, cyan and silver, glossy 3D render, Octane render"*. Append a single subject and a 16:9 or 1:1 ratio.
|
|
89
|
+
- **Spline** for actual interactive 3D chrome surfaces — embed a live render rather than baking a static image.
|
|
90
|
+
- **Magnific** or **Topaz Photo AI** for upscaling vintage Y2K product photography sourced from real catalogs and press kits.
|
|
91
|
+
- **Lottie** with custom shimmer/gleam animations for hero accents. Pair with `.pulse-glow` or `.gleam-sweep` from the CSS layer for a layered effect.
|
|
92
|
+
|
|
93
|
+
**Aspect ratios:**
|
|
94
|
+
- 16:9 hero with a centered chrome subject (the iMac press-shot composition).
|
|
95
|
+
- 1:1 product shots for cards and feature grids.
|
|
96
|
+
- 4:3 retro tech-poster format for editorial moments.
|
|
97
|
+
|
|
98
|
+
**Color discipline for imagery:**
|
|
99
|
+
Stay within the cool palette. Never warm photography, never amber-graded video, always cyan/silver/lavender. If the source image has a warm cast, regrade it before use — the palette breaks the moment a warm hue lands.
|
|
100
|
+
|
|
101
|
+
**What to AVOID:**
|
|
102
|
+
- Warm vintage filters — that is mid-century territory, not Y2K.
|
|
103
|
+
- Grunge textures, distress, scan-line overlays — that is brutalist.
|
|
104
|
+
- Saturated maximalist palettes (hot pink + lime + orange) — that is Memphis revival, a different direction entirely.
|
|
105
|
+
|
|
106
|
+
**Accessibility:**
|
|
107
|
+
Imagery in this direction is heavily decorative. Mark chrome accents, gleam strips, and ambient 3D renders with `aria-hidden="true"`. Reserve `alt` text for content imagery (people, products, screenshots that convey information). Never describe the gleam.
|
|
108
|
+
|
|
109
|
+
## Details
|
|
110
|
+
- **Selection:** `hsl(var(--primary) / 0.25)` background, foreground text.
|
|
111
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.6)` — cyan, visible, paired with `.glow-cyan` on bubble buttons.
|
|
112
|
+
- **Scrollbar:** thin.
|
|
113
|
+
|
|
114
|
+
## Exceptions
|
|
115
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
116
|
+
|
|
117
|
+
## Revisions
|
|
118
|
+
- Initial direction, generated at install time.
|