@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,200 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// toys-modern — Lovevery / Maisonette / KiwiCo developmental playful.
|
|
4
|
+
// Friendly bright primaries (not pastel, not neon) — yolk-yellow, tomato-red,
|
|
5
|
+
// grass-green, sky-blue. Rounded geometric sans, generous color blocking,
|
|
6
|
+
// developmental-age driven. Decoration-first: pages carry shape-blocks,
|
|
7
|
+
// dotted timelines, milestone confetti. Reads designed-for-kids without
|
|
8
|
+
// patronizing the parent who is paying.
|
|
9
|
+
export const toysModern: Direction = {
|
|
10
|
+
name: "toys-modern" as Direction["name"],
|
|
11
|
+
ethos:
|
|
12
|
+
"Lovevery developmental-age system · Maisonette curated-boutique playfulness · " +
|
|
13
|
+
"KiwiCo monthly-kit anticipation · Tegu magnetic-block primaries · " +
|
|
14
|
+
"Petit Collage flat-illustration color collage",
|
|
15
|
+
references: [
|
|
16
|
+
{ brand: "Lovevery", trait: "developmental-age system + Montessori-restrained primaries" },
|
|
17
|
+
{ brand: "Maisonette", trait: "curated-boutique playful, cream + sage + tomato" },
|
|
18
|
+
{ brand: "KiwiCo", trait: "monthly-kit anticipation, age-band hero, friendly badges" },
|
|
19
|
+
{ brand: "Tegu", trait: "magnetic-block primaries — saturated, never neon" },
|
|
20
|
+
{ brand: "Petit Collage", trait: "flat-illustration color collage, paper-cut shapes" },
|
|
21
|
+
],
|
|
22
|
+
feel:
|
|
23
|
+
"Bright friendly primaries on warm cream — yolk, tomato, grass, sky — color-blocked " +
|
|
24
|
+
"like Tegu blocks on a play mat. Generous shape-decoration: dotted developmental " +
|
|
25
|
+
"timelines, milestone confetti, paper-cut illustration accents. Rounded geometric sans " +
|
|
26
|
+
"for chrome, friendly serif italic for milestone names. Reads designed-for-kids without " +
|
|
27
|
+
"patronizing the parent reading it — Lovevery's trick.",
|
|
28
|
+
|
|
29
|
+
fonts: {
|
|
30
|
+
display: {
|
|
31
|
+
family: "Recoleta",
|
|
32
|
+
fallback: ["Fraunces", "Recoleta Alt", "Georgia", "serif"],
|
|
33
|
+
from: "Lovevery / Maisonette — warm rounded serif, optical sizes friendly at large sizes",
|
|
34
|
+
googleFont: "Fraunces",
|
|
35
|
+
weights: [500, 600, 700],
|
|
36
|
+
},
|
|
37
|
+
body: {
|
|
38
|
+
family: "Nunito",
|
|
39
|
+
fallback: ["Quicksand", "DM Sans", "Inter", "system-ui", "sans-serif"],
|
|
40
|
+
from: "KiwiCo / Lovevery — round humanist body, reads friendly at every size",
|
|
41
|
+
googleFont: "Nunito",
|
|
42
|
+
weights: [400, 600, 700],
|
|
43
|
+
},
|
|
44
|
+
mono: {
|
|
45
|
+
family: "Space Mono",
|
|
46
|
+
fallback: ["DM Mono", "ui-monospace", "Courier New", "monospace"],
|
|
47
|
+
from: "playful kit-numbers and age-band labels — geometric mono with character",
|
|
48
|
+
googleFont: "Space+Mono",
|
|
49
|
+
weights: [400, 700],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
typography: {
|
|
54
|
+
headingTracking: "-0.01em",
|
|
55
|
+
bodyTracking: "0.005em",
|
|
56
|
+
fontFeatureSettings: '"ss01", "calt", "liga"',
|
|
57
|
+
h1ScaleClamp: "clamp(2.25rem, 5.5vw, 4rem)",
|
|
58
|
+
bodyBaseSize: "1rem",
|
|
59
|
+
bodyLineHeight: "1.6",
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
colors: {
|
|
63
|
+
background: { hsl: "44 60% 96%", from: "Lovevery warm cream — paper for the color blocks to sit on" },
|
|
64
|
+
foreground: { hsl: "228 35% 18%", from: "deep ink — never black; gives primaries room to vibrate" },
|
|
65
|
+
card: { hsl: "44 60% 99%", from: "lighter cream — card lifts slightly off the play-mat paper" },
|
|
66
|
+
popover: { hsl: "44 60% 99%", from: "same as card" },
|
|
67
|
+
primary: { hsl: "10 78% 56%", from: "Tegu tomato-red — principal action, the block-color that says GO" },
|
|
68
|
+
primaryForeground: { hsl: "44 60% 96%", from: "cream on tomato" },
|
|
69
|
+
secondary: { hsl: "44 50% 90%", from: "deeper cream panel — secondary surface" },
|
|
70
|
+
secondaryForeground: { hsl: "228 35% 22%", from: "ink on cream panel" },
|
|
71
|
+
muted: { hsl: "44 40% 92%", from: "quietest cream — helper bg, table-row" },
|
|
72
|
+
mutedForeground: { hsl: "228 14% 44%", from: "soft slate — captions, age-meta" },
|
|
73
|
+
accent: { hsl: "204 76% 88%", from: "sky-blue tint — hover and age-band-selected surface" },
|
|
74
|
+
accentForeground: { hsl: "204 60% 26%", from: "deep sky on tint" },
|
|
75
|
+
border: { hsl: "30 28% 84%", from: "warm kraft hairline — never cool gray" },
|
|
76
|
+
input: { hsl: "30 28% 84%", from: "same as border" },
|
|
77
|
+
ring: { hsl: "10 78% 56%", from: "primary tomato, focus only" },
|
|
78
|
+
destructive: { hsl: "354 75% 50%", from: "deeper red — recall/safety alert, distinct from tomato primary" },
|
|
79
|
+
destructiveForeground: { hsl: "44 60% 96%", from: "cream on alert" },
|
|
80
|
+
brand: {
|
|
81
|
+
tomato: { hsl: "10 78% 56%", from: "= primary; Tegu block-red, principal action" },
|
|
82
|
+
"tomato-soft": { hsl: "10 70% 92%", from: "tomato tint — selected age-band chip, gift-pick callout" },
|
|
83
|
+
yolk: { hsl: "44 92% 60%", from: "Tegu yolk-yellow — milestone star, kit-monthly callout" },
|
|
84
|
+
"yolk-soft": { hsl: "44 90% 90%", from: "yolk tint — kit-included chip, achievement bg" },
|
|
85
|
+
grass: { hsl: "138 50% 46%", from: "Tegu grass-green — developmental wellness mark, completed-stage" },
|
|
86
|
+
"grass-soft": { hsl: "138 38% 88%", from: "grass tint — milestone-met chip, vetted-by-experts pill" },
|
|
87
|
+
sky: { hsl: "204 76% 56%", from: "Tegu sky-blue — secondary friendly action, info accent" },
|
|
88
|
+
"sky-soft": { hsl: "204 76% 88%", from: "alias for accent — age-tab surface" },
|
|
89
|
+
cream: { hsl: "44 60% 96%", from: "alias for background — Lovevery play-mat paper" },
|
|
90
|
+
ink: { hsl: "228 35% 18%", from: "alias for foreground — deep slate ink" },
|
|
91
|
+
plum: { hsl: "294 38% 50%", from: "Petit Collage plum — paper-cut accent, decorative shape-block only" },
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
spacing: {
|
|
96
|
+
base: 4,
|
|
97
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 80, 96], // decoration breathes
|
|
98
|
+
containerMax: "max-w-6xl",
|
|
99
|
+
containerPadding: "px-6 lg:px-10",
|
|
100
|
+
sectionPadding: {
|
|
101
|
+
hero: "pt-20 pb-16 lg:pt-28 lg:pb-24",
|
|
102
|
+
default: "py-16 lg:py-24",
|
|
103
|
+
tight: "py-12 lg:py-16",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
radius: {
|
|
108
|
+
base: "1.5rem", // 24px — block-rounded, playful but not bubbly
|
|
109
|
+
pillsAllowed: true, // pills core — age bands, milestone chips, kit-tags
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
shadows: {
|
|
113
|
+
style: "soft",
|
|
114
|
+
utilities: {
|
|
115
|
+
"shadow-block":
|
|
116
|
+
"0 1px 2px hsl(228 30% 30% / 0.05), 0 6px 18px hsl(228 30% 30% / 0.08)",
|
|
117
|
+
"shadow-block-lift":
|
|
118
|
+
"0 4px 0 0 hsl(228 35% 18% / 0.08), 0 12px 28px hsl(228 30% 30% / 0.10)",
|
|
119
|
+
"shadow-confetti":
|
|
120
|
+
"0 8px 0 0 hsl(44 92% 60% / 0.18), 0 16px 32px hsl(228 30% 30% / 0.08)",
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
motion: {
|
|
125
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
126
|
+
durations: {
|
|
127
|
+
reveal: 500,
|
|
128
|
+
loop: 2400,
|
|
129
|
+
ambient: 30000,
|
|
130
|
+
},
|
|
131
|
+
keyframes: {
|
|
132
|
+
"fade-rise": {
|
|
133
|
+
css:
|
|
134
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
135
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
136
|
+
defaultDuration: 500,
|
|
137
|
+
iteration: "once",
|
|
138
|
+
purpose: "entrance for age-band cards, kit-feature, gift-guide rows",
|
|
139
|
+
},
|
|
140
|
+
"milestone-pop": {
|
|
141
|
+
css:
|
|
142
|
+
"0% { transform: scale(0.7) rotate(-8deg); opacity: 0; }\n" +
|
|
143
|
+
"60% { transform: scale(1.08) rotate(4deg); opacity: 1; }\n" +
|
|
144
|
+
"100% { transform: scale(1) rotate(0deg); opacity: 1; }",
|
|
145
|
+
defaultDuration: 480,
|
|
146
|
+
iteration: "once",
|
|
147
|
+
purpose: "milestone-met confetti and achievement star — playful pop with rotation",
|
|
148
|
+
},
|
|
149
|
+
"shape-drift": {
|
|
150
|
+
css:
|
|
151
|
+
"0%, 100% { transform: translate(0, 0) rotate(0deg); }\n" +
|
|
152
|
+
"50% { transform: translate(8px, -6px) rotate(3deg); }",
|
|
153
|
+
defaultDuration: 6000,
|
|
154
|
+
iteration: "infinite",
|
|
155
|
+
purpose: "background paper-cut shapes drift — decorative only, never on functional UI",
|
|
156
|
+
},
|
|
157
|
+
"soft-pulse": {
|
|
158
|
+
css:
|
|
159
|
+
"0%, 100% { opacity: 1; }\n" +
|
|
160
|
+
"50% { opacity: 0.7; }",
|
|
161
|
+
defaultDuration: 2400,
|
|
162
|
+
iteration: "infinite",
|
|
163
|
+
purpose: "next-kit-shipping countdown and live-stage indicator",
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
respectsReducedMotion: true,
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
density: "medium",
|
|
170
|
+
|
|
171
|
+
patterns: {
|
|
172
|
+
button:
|
|
173
|
+
"Primary = solid tomato fill, cream text, rounded-2xl (block-rounded), shadow-block. " +
|
|
174
|
+
"Secondary = sky-blue solid fill, cream text (Tegu primaries siblings, not ghosts). " +
|
|
175
|
+
"Tertiary = ink text-link with tomato underline. Pills allowed for age-band tabs and chips. " +
|
|
176
|
+
"Hover: shadow-block-lift (4px-drop shadow) — buttons 'pop' like Tegu blocks. " +
|
|
177
|
+
"No ghost-only buttons as primary — this language commits to color.",
|
|
178
|
+
card:
|
|
179
|
+
"Rounded-3xl, cream-card on cream-paper, 1px kraft border, shadow-block. " +
|
|
180
|
+
"Age-band cards may use a 4px colored top-border (tomato / yolk / grass / sky / plum) keyed to the band. " +
|
|
181
|
+
"Internal padding p-6 lg:p-8. Decorative shape-block (a tomato circle, yolk triangle) may sit " +
|
|
182
|
+
"behind a card as a paper-cut accent — purely decorative, absolutely-positioned, never blocking content.",
|
|
183
|
+
input:
|
|
184
|
+
"Rounded-2xl, 2px kraft border (thicker than soft-modern — block-energy), cream-card fill. " +
|
|
185
|
+
"Label above in Nunito 700, age-pill chip beside it if relevant. " +
|
|
186
|
+
"Focus = 3px tomato ring at 35% opacity. Placeholder in muted slate, never italic.",
|
|
187
|
+
cta:
|
|
188
|
+
"Primary tomato solid is the principal action. " +
|
|
189
|
+
"Kit-subscribe and gift-guide CTAs may use yolk for variety (the second-tier action). " +
|
|
190
|
+
"Grass is reserved for milestone-met / completed-stage context. " +
|
|
191
|
+
"Plum is decoration-only — never a CTA color.",
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
details: {
|
|
195
|
+
selectionBg: "hsl(var(--yolk) / 0.45)",
|
|
196
|
+
selectionFg: "hsl(var(--foreground))",
|
|
197
|
+
focusRing: "3px solid hsl(var(--ring) / 0.4)",
|
|
198
|
+
scrollbarStyle: "auto",
|
|
199
|
+
},
|
|
200
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Design Direction — Travel-Luxury
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Aman cream paper · Belmond burgundy heritage · Six Senses barefoot restraint · Rosewood navy monogram · &Beyond cinematic property film
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
A printed Aman portfolio mailer rendered to the web. Quiet cream-paper canvas, full-bleed property cinematography as the lead element, restrained navy/burgundy accent. Fraunces serif display at property-headline scale, Source Serif Pro body for the long-form concierge prose. The voice writes in first person plural — *"we keep four rooms"*, *"the manager will meet you in Kathmandu"*, *"we send a letter, not a confirmation email"* — Aman composure with &Beyond cinematic gravity underneath. Monogram-level restraint: the property is the design; the page is the paper.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Aman** → cream-paper page, oversized property cinematography, monogram restraint. The dominant template — this direction owes Aman its surface stack and pacing.
|
|
11
|
+
- **Belmond** → burgundy heritage accent, train-poster serif display. The single primary color.
|
|
12
|
+
- **Six Senses** → warm sand canvas, barefoot-luxury restraint. The secondary surface tier.
|
|
13
|
+
- **Rosewood Hotels** → deep-navy monogram, A Sense of Place voice. The foreground ink.
|
|
14
|
+
- **&Beyond** → cinematic safari-property film, wide-bleed photography. The hero-media register.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **cream paper** (background) → **lifted cream room** (card/popover) → **warm sand** (secondary/muted/accent). Depth comes from hairline borders at `0.10` opacity, never from fill differentiation. Hero property photography gets `.property-lift`; concierge cards get `.concierge-card`. The page is **minimal**, not soft — Aman would never carry a colored drop shadow.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--cream-paper` (Aman canvas, alias of background), `--cream-room` (lifted cream, property-card stock), `--ink-navy` (Rosewood monogram, foreground alias), `--burgundy-heritage` (Belmond, the one accent), `--burgundy-deep` (pressed state), `--sand-warm` (Six Senses warm-sand secondary), `--moss-deep` (&Beyond safari moss, used **only** on private-inquiry chrome). Primary is `0 48% 28%` — heritage burgundy, never a gilded gold.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Fraunces at 300/400/500/600, italic-friendly. Property names, destination essay titles. Tracking `-0.022em` — large optical sizes settle tighter; the serif holds at headline scale.
|
|
25
|
+
- **Body:** Source Serif Pro at 400/600, **17px** with **line-height 1.7**. Long-form property prose, concierge letters, the manager's note. Belmond/Aman printed-mailer register.
|
|
26
|
+
- **Mono:** JetBrains Mono at 400. **Only small** — itinerary dates, GPS coordinates, Nº 4 property-number eyebrows, photographer credits. Never display, never body.
|
|
27
|
+
|
|
28
|
+
Hierarchy is pair-driven: Fraunces italic display + Source Serif Pro body, with tracked-uppercase JetBrains Mono small caps (letter-spacing 0.24em) for eyebrows ('THE PROPERTY', 'THE JOURNEY', 'BY INVITATION'). H1 uses `clamp(2.75rem, 7vw, 6rem)` — printed-monograph scale, Aman portfolio register. Font features: `"liga", "dlig", "onum", "kern"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-6 lg:px-12` — 1152px. The cinematic property shot needs the width; the concierge letter sits comfortably inside.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-28 pb-20 lg:pt-44 lg:pb-32` — cinematic property-shot hero, deliberately oversized
|
|
34
|
+
- Default: `py-24 lg:py-36`
|
|
35
|
+
- Tight: `py-16 lg:py-24`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128 160 192. The high end is intentional — Aman pacing, room to breathe between properties.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. All color via tokens. Opacity via `/N` modifier on token. White and pure black are forbidden — `--cream-paper` (`36 28% 94%`) and `--ink-navy` (`220 32% 14%`) replace them.
|
|
40
|
+
|
|
41
|
+
The palette is warmth and one heritage accent. Saturation never exceeds what would read on a printed Aman portfolio under warm gallery light. Property photography carries the color; the chrome stays cream-and-navy.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 0`. **Sharp corners only** — the printed-monograph register. Pills are disallowed (`pillsAllowed: false`); they read consumer-app, never concierge-letter. Softness comes from whitespace and serif italic, not corner rounding.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**Minimal.** Two utilities:
|
|
48
|
+
- `.property-lift` — diffuse drop for **property hero photography only**. Gallery-print register.
|
|
49
|
+
- `.concierge-card` — hairline + faint drop for the concierge-note card. The warmest chrome the page is allowed.
|
|
50
|
+
|
|
51
|
+
No glows, no neon, no colored drops. Buttons never carry shadow.
|
|
52
|
+
|
|
53
|
+
## Motion
|
|
54
|
+
Two keyframes only:
|
|
55
|
+
- **`fade-rise`** — opacity + 24px translate, **1200ms**. The single entrance for property cards and concierge notes. The page settles; it does not perform.
|
|
56
|
+
- **`property-drift`** — `scale(1.03) → scale(1.12)`, **32000ms**, infinite. Slow ken-burns on hero property photography — &Beyond camera-push, the rooftop at golden hour breathing.
|
|
57
|
+
|
|
58
|
+
No marquee, no parallax. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `property-drift` is disabled entirely under reduced motion; `fade-rise` collapses to instantaneous final-state.
|
|
59
|
+
|
|
60
|
+
## Component patterns
|
|
61
|
+
- **Buttons:** the default CTA is a **serif italic text-link in burgundy**, always-visible thin underline — concierge register. The solid button is reserved for **one 'Arrange a Stay' or 'Request a Private Inquiry' hero CTA per page** — burgundy bg + cream-paper text, sharp corners, no shadow on the button itself. Tertiary actions ('View the Itinerary', 'Read the Letter from the Manager') are tracked-uppercase mono small caps in navy.
|
|
62
|
+
- **Cards (property/journey):** hairline top + bottom only, **no full box**. Cream-room background, internal padding `p-10 lg:p-14`. Property name in **Fraunces italic display**, location in mono small caps eyebrow above (Nº 04 · KATHMANDU). Hero property photograph uses `.property-lift`; concierge-note card uses `.concierge-card`.
|
|
63
|
+
- **Inputs:** private-inquiry form — border-bottom only (1px `--ink-soft`), cream-room background. Label above in tracked-uppercase mono small caps. Placeholder italic serif in mutedForeground. Focus is burgundy underline-thickening, 2px.
|
|
64
|
+
- **CTAs:** default = serif italic text-link in burgundy, underline always visible. The single 'Arrange a Stay' is the one solid-fill exception. Private-inquiry actions use moss-deep tracked-uppercase mono small caps with mailto: behavior. **Never a chip, never a gradient, never a pill.**
|
|
65
|
+
|
|
66
|
+
## Recommended rich media
|
|
67
|
+
**Cinematic property photography first.** The rooftop suite at golden hour, the unmade linen at six, the empty plunge pool with the volcano behind it, the manager waiting at the airfield. &Beyond's photographic register: warm gradient skies, occupied or recently-occupied spaces, never the empty real-estate-listing energy.
|
|
68
|
+
|
|
69
|
+
**AI tool recommendations.** **Midjourney / Flux** for hero property cinematography — *"Aman resort suite interior, late afternoon golden light through linen curtains, unmade bed, single subject, Annie Leibovitz lighting, 35mm, Kodak Portra 400, --ar 21:9"*. For destination essays, *"&Beyond Botswana camp at dusk, occupied chairs around fire, warm gradient sky, documentary 35mm"*. Avoid Midjourney's default hotel-marketing register — explicitly prompt for warm grade and occupied spaces.
|
|
70
|
+
|
|
71
|
+
**Aspect ratios.** **21:9** for the cinematic property hero (Aman portfolio mailer register). **4:5 portrait** for room interiors and manager portraits. **3:2 landscape** for destination/journey photography. Never 1:1 social-square as the hero; the property is not an Instagram tile.
|
|
72
|
+
|
|
73
|
+
**Captions are mandatory.** Property name, destination, photographer credit, time of day, monogram number — in JetBrains Mono small caps. *"Aman Tokyo · Otemachi, Chiyoda · Suite 3304 · Photograph by François Halard · 17:18 JST"* style attribution always.
|
|
74
|
+
|
|
75
|
+
**Video.** Used for the property hero only — a single 30s slow `property-drift` over a still, **or** a muted 24s loop of the rooftop at dusk. Never autoplay with sound. Never a room-walkthrough. ≤12 MB AV1 or H.265.
|
|
76
|
+
|
|
77
|
+
**Performance.** Hero property image ≤240 KB AVIF at 2200w. LCP under 2.8s — if it slips, the photograph is too large, not the framework. Aman can afford slightly heavier hero media; the photograph is the property.
|
|
78
|
+
|
|
79
|
+
**Avoid.** OTA-aggregator energy. Empty-room real-estate-listing photography. Smiling-staff stock. Generic "boutique luxury" hotel-chain marketing language. Pop-up booking widgets. Lens flare. Anything that reads more **Marriott Bonvoy than Aman**.
|
|
80
|
+
|
|
81
|
+
**Accessibility.** Long-form alt-text — describe the property, the light, the time of day as if for a blind reader. *"A linen-draped four-poster bed in a Kyoto suite, late afternoon light through a paper screen, an open volume of poems on the side table."* The bar is Aman-portfolio editorial.
|
|
82
|
+
|
|
83
|
+
## Component families
|
|
84
|
+
None at install time. As `*PropertyCard`, `*ConciergeNote`, `*PrivateInquiryStrip`, `*ItineraryRow` families emerge, the Director lists them here.
|
|
85
|
+
|
|
86
|
+
## Details
|
|
87
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text — burgundy highlight on cream paper.
|
|
88
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`. Thin and quiet — monogram precision.
|
|
89
|
+
- **Scrollbar:** thin.
|
|
90
|
+
|
|
91
|
+
## Exceptions
|
|
92
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
93
|
+
|
|
94
|
+
## Revisions
|
|
95
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const travelLuxury: Direction = {
|
|
4
|
+
name: "travel-luxury",
|
|
5
|
+
ethos: "Aman cream paper · Belmond burgundy heritage · Six Senses restraint · Rosewood navy monogram · &Beyond cinematic property film",
|
|
6
|
+
references: [
|
|
7
|
+
{ brand: "Aman", trait: "cream-paper page, oversized property cinematography, monogram-level restraint" },
|
|
8
|
+
{ brand: "Belmond", trait: "burgundy heritage accent, train-poster serif display" },
|
|
9
|
+
{ brand: "Six Senses", trait: "warm sand canvas, barefoot-luxury restraint" },
|
|
10
|
+
{ brand: "Rosewood Hotels", trait: "deep-navy monogram, A Sense of Place voice" },
|
|
11
|
+
{ brand: "&Beyond", trait: "cinematic safari-property film, wide-bleed photography" },
|
|
12
|
+
],
|
|
13
|
+
feel:
|
|
14
|
+
"Quiet cream-paper canvas with full-bleed property photography as the lead element. " +
|
|
15
|
+
"A single restrained navy/burgundy accent, deeply serif display, and concierge-letter prose pacing. " +
|
|
16
|
+
"Reads like a printed Aman portfolio mailer — the page is the paper, the property is the design.",
|
|
17
|
+
|
|
18
|
+
fonts: {
|
|
19
|
+
display: {
|
|
20
|
+
family: "Fraunces",
|
|
21
|
+
fallback: ["EB Garamond", "Playfair Display", "Times New Roman", "serif"],
|
|
22
|
+
from: "Aman portfolio serif — large optical sizes for property names, italic-friendly",
|
|
23
|
+
googleFont: "Fraunces",
|
|
24
|
+
weights: [300, 400, 500, 600],
|
|
25
|
+
},
|
|
26
|
+
body: {
|
|
27
|
+
family: "Source Serif Pro",
|
|
28
|
+
fallback: ["EB Garamond", "Georgia", "serif"],
|
|
29
|
+
from: "Belmond concierge-letter body — serif body for the long-form property prose",
|
|
30
|
+
googleFont: "Source+Serif+Pro",
|
|
31
|
+
weights: [400, 600],
|
|
32
|
+
},
|
|
33
|
+
mono: {
|
|
34
|
+
family: "JetBrains Mono",
|
|
35
|
+
fallback: ["IBM Plex Mono", "ui-monospace", "monospace"],
|
|
36
|
+
from: "small captions only — itinerary dates, coordinates, Rosewood property numbers",
|
|
37
|
+
googleFont: "JetBrains+Mono",
|
|
38
|
+
weights: [400],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
typography: {
|
|
43
|
+
headingTracking: "-0.022em",
|
|
44
|
+
bodyTracking: "0.005em",
|
|
45
|
+
fontFeatureSettings: '"liga", "dlig", "onum", "kern"',
|
|
46
|
+
h1ScaleClamp: "clamp(2.75rem, 7vw, 6rem)",
|
|
47
|
+
bodyBaseSize: "1.0625rem",
|
|
48
|
+
bodyLineHeight: "1.7",
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
colors: {
|
|
52
|
+
background: { hsl: "36 28% 94%", from: "Aman cream paper — the matte canvas, never pure white" },
|
|
53
|
+
foreground: { hsl: "220 32% 14%", from: "Rosewood deep-navy monogram ink" },
|
|
54
|
+
card: { hsl: "36 30% 97%", from: "lifted cream — one stop above paper, for property-card surfaces" },
|
|
55
|
+
popover: { hsl: "36 30% 97%", from: "same as card" },
|
|
56
|
+
primary: { hsl: "0 48% 28%", from: "Belmond burgundy — heritage train-livery, restrained" },
|
|
57
|
+
primaryForeground: { hsl: "36 28% 94%", from: "cream on burgundy" },
|
|
58
|
+
secondary: { hsl: "36 24% 90%", from: "Six Senses warm-sand tier — secondary surface" },
|
|
59
|
+
secondaryForeground: { hsl: "220 32% 14%", from: "navy ink on warm sand" },
|
|
60
|
+
muted: { hsl: "36 20% 88%", from: "muted sand — for inactive chrome" },
|
|
61
|
+
mutedForeground: { hsl: "220 18% 42%", from: "Rosewood navy-soft, secondary text and captions" },
|
|
62
|
+
accent: { hsl: "36 24% 86%", from: "hover surface — one tier deeper than secondary" },
|
|
63
|
+
accentForeground: { hsl: "220 32% 14%", from: "navy ink on accent" },
|
|
64
|
+
border: { hsl: "220 18% 78%", from: "Aman hairline — visible only on inspection, never assertive" },
|
|
65
|
+
input: { hsl: "220 18% 78%", from: "same as border — single hairline language" },
|
|
66
|
+
ring: { hsl: "0 48% 28%", from: "burgundy focus — primary, used for keyboard focus only" },
|
|
67
|
+
destructive: { hsl: "8 60% 38%", from: "deepened heritage red — never bright" },
|
|
68
|
+
destructiveForeground: { hsl: "36 28% 94%", from: "cream on deep red" },
|
|
69
|
+
brand: {
|
|
70
|
+
"cream-paper": { hsl: "36 28% 94%", from: "Aman canvas — alias of background" },
|
|
71
|
+
"cream-room": { hsl: "36 30% 97%", from: "lifted cream — property-card stock" },
|
|
72
|
+
"ink-navy": { hsl: "220 32% 14%", from: "Rosewood monogram navy — foreground alias" },
|
|
73
|
+
"burgundy-heritage": { hsl: "0 48% 28%", from: "Belmond train livery — the single accent" },
|
|
74
|
+
"burgundy-deep": { hsl: "0 52% 22%", from: "burgundy pressed-state, gradient anchor" },
|
|
75
|
+
"sand-warm": { hsl: "36 24% 90%", from: "Six Senses warm-sand — secondary tier" },
|
|
76
|
+
"moss-deep": { hsl: "150 18% 28%", from: "&Beyond safari moss — used sparingly on private-inquiry chrome" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
spacing: {
|
|
81
|
+
base: 4,
|
|
82
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160, 192],
|
|
83
|
+
containerMax: "max-w-6xl",
|
|
84
|
+
containerPadding: "px-6 lg:px-12",
|
|
85
|
+
sectionPadding: {
|
|
86
|
+
hero: "pt-28 pb-20 lg:pt-44 lg:pb-32",
|
|
87
|
+
default: "py-24 lg:py-36",
|
|
88
|
+
tight: "py-16 lg:py-24",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
radius: {
|
|
93
|
+
base: "0",
|
|
94
|
+
pillsAllowed: false,
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
shadows: {
|
|
98
|
+
style: "minimal",
|
|
99
|
+
utilities: {
|
|
100
|
+
"property-lift":
|
|
101
|
+
"0 24px 64px -32px hsl(220 32% 14% / 0.28)",
|
|
102
|
+
"concierge-card":
|
|
103
|
+
"0 1px 0 0 hsl(220 18% 78% / 1), 0 12px 32px -24px hsl(220 32% 14% / 0.16)",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
motion: {
|
|
108
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
109
|
+
durations: {
|
|
110
|
+
reveal: 1200,
|
|
111
|
+
loop: 4000,
|
|
112
|
+
ambient: 32000,
|
|
113
|
+
},
|
|
114
|
+
keyframes: {
|
|
115
|
+
"fade-rise": {
|
|
116
|
+
css:
|
|
117
|
+
"from { opacity: 0; transform: translateY(24px); }\n" +
|
|
118
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
119
|
+
defaultDuration: 1200,
|
|
120
|
+
iteration: "once",
|
|
121
|
+
purpose: "slow entrance — property cards, concierge notes; the door is opened",
|
|
122
|
+
},
|
|
123
|
+
"property-drift": {
|
|
124
|
+
css:
|
|
125
|
+
"0% { transform: scale(1.03) translate(0, 0); }\n" +
|
|
126
|
+
"100% { transform: scale(1.12) translate(-1.5%, -1%); }",
|
|
127
|
+
defaultDuration: 32000,
|
|
128
|
+
iteration: "infinite",
|
|
129
|
+
purpose: "slow ken-burns drift on hero property photography — &Beyond camera-push",
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
respectsReducedMotion: true,
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
density: "low",
|
|
136
|
+
|
|
137
|
+
patterns: {
|
|
138
|
+
button:
|
|
139
|
+
"Default CTA is a serif italic text-link in burgundy with always-visible thin underline — concierge register. " +
|
|
140
|
+
"The single hero action per page may be a solid burgundy rect, cream text, sharp corners. " +
|
|
141
|
+
"Never a pill, never a gradient. Tertiary actions are tracked-uppercase mono small caps in navy.",
|
|
142
|
+
card:
|
|
143
|
+
"Hairline top + bottom only, no full box. Cream-room background, internal padding p-10 lg:p-14. " +
|
|
144
|
+
"Property name in Fraunces italic display, location in mono small caps eyebrow above. " +
|
|
145
|
+
"Hero property photograph uses .property-lift drop; never .concierge-card on imagery.",
|
|
146
|
+
input:
|
|
147
|
+
"Border-bottom only (1px --border), cream-room background, no full box. " +
|
|
148
|
+
"Label above in tracked-uppercase mono small caps. Placeholder in mutedForeground italic serif. " +
|
|
149
|
+
"Focus is burgundy underline-thickening, 2px.",
|
|
150
|
+
cta:
|
|
151
|
+
"Default = serif italic text-link in burgundy, underline. " +
|
|
152
|
+
"Single 'Request a Private Inquiry' or 'Arrange a Stay' may be a solid burgundy rect. " +
|
|
153
|
+
"Never a chip, never a gradient. The page is the concierge letter; the CTA is the postscript.",
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
details: {
|
|
157
|
+
selectionBg: "hsl(var(--primary) / 0.22)",
|
|
158
|
+
selectionFg: "hsl(var(--foreground))",
|
|
159
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
160
|
+
scrollbarStyle: "thin",
|
|
161
|
+
},
|
|
162
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Design Direction — Vacation-Rental
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Airbnb soft pink Cereal-wordmark consumer warmth · Vrbo family-photography trust-blue · Plum Guide curated charcoal · Whimstay last-minute coral · Sonder modern-stay rounded chrome
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Friendly consumer marketplace — the page you would actually book a cabin on for next weekend. Soft Airbnb Rausch pink as the single primary, generous rounded corners, photography-led product cards in a dense 3- or 4-up grid, wishlist hearts in the upper-right of every image. Search density lives at the top (Where · When · Guests). Reads productive and warm at once: photo-first like Airbnb, with a hint of Plum Guide's curated voice in the captions and Whimstay's last-minute coral on percent-off badges.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Airbnb** → Cereal wordmark, soft Rausch coral-pink, rounded photo-card grid, wishlist heart. The dominant template — this direction owes Airbnb its surface stack, primary color, and card pattern.
|
|
11
|
+
- **Vrbo** → family-warm photography, deep-blue trust accent. Used only on Verified Host / Superhost chips.
|
|
12
|
+
- **Plum Guide** → curated charcoal headers, hand-picked editorial captions. The voice in property descriptions.
|
|
13
|
+
- **Whimstay** → last-minute coral signal, percent-off badge language. The deals-strip eyebrow color.
|
|
14
|
+
- **Sonder** → modern-stay rounded chrome, hospitality dashboard pacing. The density of filter rows and the search-bar shape.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **pure white canvas** (background and card both white — photography reads truest on white) → **warm blush** (secondary/muted/accent). Depth comes from soft drop-shadows on cards, never from fill differentiation. Hue shift to warm-blush only on wishlist tiles and inactive filter chips. The page is **soft**, the chrome is rounded — this is consumer, not enterprise.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--rausch-pink` (Airbnb canonical, primary alias), `--rausch-deep` (pressed/active state), `--blush-soft` (secondary surface), `--vrbo-blue` (trust chip color, never a CTA), `--wishlist-rose` (heart hover bg), `--whimstay-coral` (percent-off badges only), `--rating-gold` (★ glyphs only). Primary is `351 78% 56%` — the canonical Airbnb Rausch coral-pink.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** DM Sans at 400/500/700. Friendly geometric — Airbnb Cereal stand-in. Property titles, section headers, card titles. Tracking `-0.018em`.
|
|
25
|
+
- **Body:** Inter at 400/500/600, **15px** with **line-height 1.55**. Dashboard-dense, photo-card-readable. Captions, addresses, review snippets.
|
|
26
|
+
- **Mono:** JetBrains Mono at 400/500. **Only small** — guest counts (4 guests · 2 beds · 1 bath), night counts, price-per-night tabular numerics. Never display, never body.
|
|
27
|
+
|
|
28
|
+
Hierarchy is photo-first: image leads, DM Sans 500 title underneath, Inter muted-foreground subtitle, mono price row. H1 uses `clamp(2rem, 4.5vw, 3.25rem)` — consumer-search hero, not editorial poster. Numbers always carry `font-variant-numeric: tabular-nums`. Font features: `"cv11", "ss01", "tnum"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-4 lg:px-10` — wide enough for 4-up card grids and the search bar.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-12 pb-8 lg:pt-16 lg:pb-12` — search-first hero, dashboard-tight, never magazine
|
|
34
|
+
- Default: `py-12 lg:py-16`
|
|
35
|
+
- Tight: `py-8 lg:py-10`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80 96. Medium density — cards breathe, filter rows pack tight.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. All color via tokens. Opacity via `/N` modifier on token.
|
|
40
|
+
|
|
41
|
+
The palette is **white canvas + Rausch pink + warm blush + restrained semantic chips**. Vrbo blue appears **only** on Superhost / Verified Host chips. Whimstay coral appears **only** on percent-off / last-minute deal badges. Rating gold appears **only** on the ★ glyph. The primary action is always Rausch pink — using any other color as a primary breaks the consumer-marketplace trust.
|
|
42
|
+
|
|
43
|
+
Pure black is forbidden — `--foreground` is `0 0% 14%` (Airbnb near-black, Cereal ink). Pure white is the canvas; cards are also pure white and lift via shadow.
|
|
44
|
+
|
|
45
|
+
## Radius
|
|
46
|
+
`--radius: 0.75rem` (12px). **Rounded consumer chrome.** Pills are allowed (`pillsAllowed: true`) and are the default for filter chips (Cabins · Beachfront · Trending), status chips (Superhost, Free cancellation, Self check-in), and the rounded-full search bar. Photo-card corners are 12px; the search bar is fully pill; chips are fully pill.
|
|
47
|
+
|
|
48
|
+
## Shadows
|
|
49
|
+
**Soft.** Three utilities — no glows, no color-tinted drops:
|
|
50
|
+
|
|
51
|
+
- `.shadow-card` — default property-card elevation. Two-layer neutral drop, quiet at rest.
|
|
52
|
+
- `.shadow-card-hover` — card lift on hover. Deeper drop with the same family.
|
|
53
|
+
- `.shadow-sticky` — sticky search-bar and filter-row strip. Just enough to separate from scrolling content.
|
|
54
|
+
|
|
55
|
+
Shadows are **neutral** — color-saturated drops read creator-social and break the consumer-trust language.
|
|
56
|
+
|
|
57
|
+
## Motion
|
|
58
|
+
Three keyframes — consumer-fast:
|
|
59
|
+
|
|
60
|
+
- **`fade-up`** (400ms) — property-card grid entrance. translateY(8px) → 0.
|
|
61
|
+
- **`heart-pop`** (360ms) — wishlist heart toggle. Scale 1 → 1.35 → 1. Airbnb-signature interaction.
|
|
62
|
+
- **`shimmer`** (1600ms infinite) — photo-card skeleton on initial load. Gradient sweep across image plates.
|
|
63
|
+
|
|
64
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `fade-up` collapses to opacity-only, `heart-pop` to a color-fill only, `shimmer` to a static 0.8 opacity.
|
|
65
|
+
|
|
66
|
+
No ambient motion. This is a search-first consumer surface — nothing should drift while the user is filtering for dates.
|
|
67
|
+
|
|
68
|
+
## Component patterns
|
|
69
|
+
- **Buttons:** primary = solid Rausch-pink filled rect, `rounded-xl` (12px), weight 600 — 'Reserve', 'Continue', 'Show on Map'. Secondary = outlined ghost (foreground border, white bg). Tertiary = underline text-link in foreground; pink is reserved for actions, never for inline links. **One primary CTA per surface.**
|
|
70
|
+
- **Cards (property):** `rounded-xl`, **no border**, white bg, `.shadow-card`. Photo is the lead (4:3 or 5:4, rounded-xl, top-right wishlist heart absolutely positioned). Title in DM Sans 500, subtitle (neighborhood · distance) in muted-foreground, ★ rating row in rating-gold + review count in muted, price row in tabular Inter with mono /night. Hover lifts to `.shadow-card-hover` and the heart fills with `.wishlist-rose`.
|
|
71
|
+
- **Inputs:** the canonical search bar is **pill-shape rounded-full**, ~64px tall on desktop, with embedded column divides (Where · When · Guests). Filter inputs (compact h-10) are `rounded-md`, soft border, white bg. Focus uses ring (2px Rausch at 45%).
|
|
72
|
+
- **CTAs:** filled Rausch-pink rect is the primary action language. Wishlist heart is the icon-CTA — outlined at rest, filled when active. Status chips (Superhost in vrbo-blue, Free cancellation in foreground-on-blush, -32% Tonight in whimstay-coral) are pills.
|
|
73
|
+
|
|
74
|
+
## Recommended rich media
|
|
75
|
+
**Real warm property photography, always.** Sun-through-window shots, unmade bed in morning light, deck with two coffee mugs, dog on the rug — the family-warm Vrbo register layered over Airbnb's photographic competence. **Show occupied or recently-occupied spaces, never the empty real-estate-listing energy.**
|
|
76
|
+
|
|
77
|
+
**AI tool recommendations.** **Midjourney / Flux** for hero property photography — *"warm cozy cabin interior, morning light through window, unmade linen bed, single subject, Airbnb listing photography, 24mm, --ar 4:3"*. For exterior shots, *"beachfront vacation rental at golden hour, deck with two chairs, soft warm light, documentary 35mm"*. Avoid Midjourney's default empty-room listing register — explicitly prompt for occupied/just-occupied and warm grade.
|
|
78
|
+
|
|
79
|
+
**Aspect ratios.** **4:3 landscape** for property hero cards (the dominant ratio — mixed ratios break the grid rhythm). **5:4 portrait** for detail-page hero galleries. **1:1 square** for wishlist tiles. Never 16:9 (off-feel for consumer rental).
|
|
80
|
+
|
|
81
|
+
**Color in imagery.** Warm grade — golden hour, late afternoon, morning sun. **Never** cool/blue cast (reads sterile). Never harsh midday flash. Saturated brand-colored interiors are fine (a coral throw blanket on a white bed reads on-brand for the page).
|
|
82
|
+
|
|
83
|
+
**Video.** Short 15s mute loops in hero galleries on detail pages only. Never autoplay video in the card grid (kills scan speed). ≤8 MB AV1 or H.265.
|
|
84
|
+
|
|
85
|
+
**Captions.** Property title (DM Sans 500), neighborhood + distance from major landmark (muted Inter), ★ rating + review count, price / night. Plum Guide-style hand-picked editorial line for premium listings ("a sun-drenched two-bedroom four blocks from the beach, with the best outdoor shower we have ever tested").
|
|
86
|
+
|
|
87
|
+
**Performance.** Card-grid photos ≤120 KB AVIF at 1200w; hero-gallery images ≤200 KB. LCP under 2.4s — if it slips, photo sizes are too heavy, not the framework. Consumer search needs sub-2s perceived load.
|
|
88
|
+
|
|
89
|
+
**Avoid.** Empty-room real-estate-listing photography. Stock smiling-staff photos. AI-glossy interiors (uncanny). Pop-up booking-incentive modals (Airbnb stopped doing these for a reason). Lens flare. Anything that reads more **OTA-aggregator than Airbnb / Plum Guide.**
|
|
90
|
+
|
|
91
|
+
**Accessibility.** Alt-text for property photos must convey the space — *"A wood-paneled living room with a leather sofa, a fireplace, and a window onto pine trees, photographed in late afternoon light."* Wishlist hearts must have `aria-pressed` state. Filter chips must use `aria-selected` not color alone — color-blind users need the state in the DOM.
|
|
92
|
+
|
|
93
|
+
## Component families
|
|
94
|
+
None at install time. As `*PropertyCard`, `*WishlistTile`, `*FilterChip`, `*SearchBar`, `*StatusChip` families emerge, the Director lists them here.
|
|
95
|
+
|
|
96
|
+
## Details
|
|
97
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text — Rausch pink highlight.
|
|
98
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — Rausch pink at 50%.
|
|
99
|
+
- **Scrollbar:** thin.
|
|
100
|
+
|
|
101
|
+
## Exceptions
|
|
102
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
103
|
+
|
|
104
|
+
## Revisions
|
|
105
|
+
- Initial direction, generated at install time.
|