@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,178 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// Note: "beauty-luxury" is not yet in the Direction["name"] enum.
|
|
4
|
+
// The schema is closed; until it is extended this file casts the name.
|
|
5
|
+
// All other fields fully validate.
|
|
6
|
+
|
|
7
|
+
export const beautyLuxury: Direction = {
|
|
8
|
+
name: "beauty-luxury" as Direction["name"],
|
|
9
|
+
ethos:
|
|
10
|
+
"La Mer cream-and-jade vault · Augustinus Bader clinical-restraint cream · Sisley apothecary serif · Guerlain Orchidée Impériale gilded glass · Vintner's Daughter botanical alchemy",
|
|
11
|
+
references: [
|
|
12
|
+
{ brand: "La Mer", trait: "deep ocean cream jar + jade green seal + serif logotype" },
|
|
13
|
+
{ brand: "Augustinus Bader", trait: "clinical white-on-cream + restrained navy + TFC8 minimalism" },
|
|
14
|
+
{ brand: "Sisley Paris", trait: "old-world apothecary serif + cream + gold-leaf detailing" },
|
|
15
|
+
{ brand: "Guerlain Orchidée Impériale", trait: "gilded glass jar + ivory + champagne gold + heritage seal" },
|
|
16
|
+
{ brand: "Vintner's Daughter", trait: "botanical alchemy + ivory paper + sage + single-product reverence" },
|
|
17
|
+
],
|
|
18
|
+
feel:
|
|
19
|
+
"Restrained luxury cosmetic. Ivory and cream surfaces hold a single SKU like a museum vitrine — " +
|
|
20
|
+
"champagne gold appears only on hairlines and seals, never as a fill. Italic serif tells the " +
|
|
21
|
+
"ingredient story; small-caps mono carries the technical lineage. The page reads like a Guerlain " +
|
|
22
|
+
"boutique window at dusk: ceremonial, withholding, expensive in its silence.",
|
|
23
|
+
|
|
24
|
+
fonts: {
|
|
25
|
+
display: {
|
|
26
|
+
family: "Cormorant Garamond",
|
|
27
|
+
fallback: ["EB Garamond", "Garamond", "Didot", "Georgia", "serif"],
|
|
28
|
+
from: "Sisley/Guerlain old-world apothecary serif — high-contrast, italic-first, ceremonial",
|
|
29
|
+
googleFont: "Cormorant+Garamond",
|
|
30
|
+
weights: [300, 400, 500],
|
|
31
|
+
},
|
|
32
|
+
body: {
|
|
33
|
+
family: "Cormorant",
|
|
34
|
+
fallback: ["EB Garamond", "Iowan Old Style", "Georgia", "serif"],
|
|
35
|
+
from: "La Mer/Vintner's Daughter body serif — luxury beauty rarely uses sans for body copy",
|
|
36
|
+
googleFont: "Cormorant",
|
|
37
|
+
weights: [400, 500],
|
|
38
|
+
},
|
|
39
|
+
mono: {
|
|
40
|
+
family: "JetBrains Mono",
|
|
41
|
+
fallback: ["Berkeley Mono", "ui-monospace", "monospace"],
|
|
42
|
+
from: "ingredient INCI, lot numbers, technical lineage — small-caps tracked-out instrument feel",
|
|
43
|
+
googleFont: "JetBrains+Mono",
|
|
44
|
+
weights: [400],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
typography: {
|
|
49
|
+
headingTracking: "-0.005em", // high-contrast serif barely tightened — luxury sits near zero
|
|
50
|
+
bodyTracking: "0.01em",
|
|
51
|
+
fontFeatureSettings: '"liga", "dlig", "onum", "kern"', // old-style figures for prices, ligatures on
|
|
52
|
+
h1ScaleClamp: "clamp(2.25rem, 5.5vw, 4rem)",
|
|
53
|
+
bodyBaseSize: "1.0625rem", // 17px — slow reading column for ingredient stories
|
|
54
|
+
bodyLineHeight: "1.75", // generous — ceremonial pacing
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
colors: {
|
|
58
|
+
background: { hsl: "40 28% 95%", from: "Guerlain ivory — warm paper, slightly toasted, heritage feel" },
|
|
59
|
+
foreground: { hsl: "30 15% 16%", from: "Sisley deep earth ink — never pure black, holds gold accent" },
|
|
60
|
+
card: { hsl: "40 32% 97%", from: "lighter ivory — card lifts off the bg by half a tone, vitrine effect" },
|
|
61
|
+
popover: { hsl: "40 32% 97%", from: "same as card — popovers wear the lifted-ivory tone" },
|
|
62
|
+
primary: { hsl: "38 38% 52%", from: "Guerlain champagne gold — the canonical luxury accent, restrained" },
|
|
63
|
+
primaryForeground: { hsl: "40 28% 95%", from: "ivory on champagne gold — never white" },
|
|
64
|
+
secondary: { hsl: "40 24% 92%", from: "deeper ivory — secondary surface, one tone off bg" },
|
|
65
|
+
secondaryForeground: { hsl: "30 15% 16%", from: "earth ink on deeper ivory" },
|
|
66
|
+
muted: { hsl: "40 18% 88%", from: "stone-cream — muted backgrounds for technical-lineage zones" },
|
|
67
|
+
mutedForeground: { hsl: "30 10% 44%", from: "earth-gray — captions, ingredient names, lot numbers" },
|
|
68
|
+
accent: { hsl: "155 20% 88%", from: "La Mer jade-pale — accent tint, single-color counterpoint to gold" },
|
|
69
|
+
accentForeground: { hsl: "155 32% 22%", from: "deep jade on its pale tint" },
|
|
70
|
+
border: { hsl: "38 22% 80%", from: "warm hairline — visible on ivory, never harsh; champagne adjacent" },
|
|
71
|
+
input: { hsl: "38 22% 80%", from: "same as border — single hairline language" },
|
|
72
|
+
ring: { hsl: "38 38% 52%", from: "champagne gold, focus only — the luxury accent" },
|
|
73
|
+
destructive: { hsl: "8 50% 42%", from: "muted oxblood — recall/discontinued, never alarm red" },
|
|
74
|
+
destructiveForeground: { hsl: "40 28% 95%", from: "ivory on oxblood" },
|
|
75
|
+
brand: {
|
|
76
|
+
ivory: { hsl: "40 28% 95%", from: "= background; Guerlain heritage ivory paper" },
|
|
77
|
+
"ivory-deep": { hsl: "40 24% 92%", from: "secondary ivory — one tone deeper, panel surface" },
|
|
78
|
+
gold: { hsl: "38 38% 52%", from: "= primary; champagne gold — Guerlain Impériale seal, single luxury mark" },
|
|
79
|
+
"gold-deep": { hsl: "36 42% 38%", from: "darker champagne — engraved seal, hover, gradient anchor" },
|
|
80
|
+
jade: { hsl: "155 28% 32%", from: "La Mer deep jade — the single saturated counterpoint to gold" },
|
|
81
|
+
"jade-pale": { hsl: "155 20% 88%", from: "= accent; pale jade for restrained ingredient-tag tint" },
|
|
82
|
+
navy: { hsl: "215 35% 22%", from: "Augustinus Bader clinical navy — used once, on the lot-number block" },
|
|
83
|
+
ink: { hsl: "30 15% 16%", from: "= foreground; warm earth-ink, semantic for all body copy" },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
spacing: {
|
|
88
|
+
base: 4,
|
|
89
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160, 192], // sparse — luxury withholding
|
|
90
|
+
containerMax: "max-w-4xl", // narrow — boutique vitrine column, never splash
|
|
91
|
+
containerPadding: "px-6 lg:px-12",
|
|
92
|
+
sectionPadding: {
|
|
93
|
+
hero: "pt-32 pb-24 lg:pt-48 lg:pb-32",
|
|
94
|
+
default: "py-24 lg:py-40",
|
|
95
|
+
tight: "py-16 lg:py-24",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
radius: {
|
|
100
|
+
base: "0", // sharp — La Mer, Guerlain, Sisley do not round; rounding reads app
|
|
101
|
+
pillsAllowed: false, // pills are app-language; tags are hairline-bounded small-caps
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
shadows: {
|
|
105
|
+
style: "minimal",
|
|
106
|
+
utilities: {
|
|
107
|
+
"shadow-vitrine":
|
|
108
|
+
"0 1px 0 hsl(38 22% 78%), 0 24px 60px hsl(30 15% 16% / 0.08)",
|
|
109
|
+
"shadow-gold-hairline":
|
|
110
|
+
"inset 0 0 0 1px hsl(38 38% 52% / 0.45)",
|
|
111
|
+
"shadow-quiet":
|
|
112
|
+
"0 1px 0 hsl(38 22% 80%)",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
motion: {
|
|
117
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
118
|
+
durations: {
|
|
119
|
+
reveal: 1400, // slow — ceremonial pacing
|
|
120
|
+
loop: 0, // no looped motion
|
|
121
|
+
ambient: 28000, // single ambient ken-burns on hero product still
|
|
122
|
+
},
|
|
123
|
+
keyframes: {
|
|
124
|
+
"fade-rise": {
|
|
125
|
+
css:
|
|
126
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
127
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
128
|
+
defaultDuration: 1400,
|
|
129
|
+
iteration: "once",
|
|
130
|
+
purpose: "section entrance — slow, ceremonial, never abrupt",
|
|
131
|
+
},
|
|
132
|
+
"fade-in": {
|
|
133
|
+
css:
|
|
134
|
+
"from { opacity: 0; }\n" +
|
|
135
|
+
"to { opacity: 1; }",
|
|
136
|
+
defaultDuration: 1200,
|
|
137
|
+
iteration: "once",
|
|
138
|
+
purpose: "ingredient-story paragraph and product-shot entrance — opacity only",
|
|
139
|
+
},
|
|
140
|
+
"gold-sheen": {
|
|
141
|
+
css:
|
|
142
|
+
"0% { background-position: -200% 0; }\n" +
|
|
143
|
+
"100% { background-position: 200% 0; }",
|
|
144
|
+
defaultDuration: 4800,
|
|
145
|
+
iteration: "infinite",
|
|
146
|
+
purpose: "gold hairline-rule sheen on seal/monogram only — never on text, never on multiple elements",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
respectsReducedMotion: true,
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
density: "low",
|
|
153
|
+
|
|
154
|
+
patterns: {
|
|
155
|
+
button:
|
|
156
|
+
"Text-link CTAs by default — earth-ink with hairline gold underline appearing on hover. " +
|
|
157
|
+
"Solid gold-fill is reserved for the single primary action per page (Reserve, Discover). " +
|
|
158
|
+
"No secondary solid buttons. No pills, no chips. Destructive is muted-oxblood text-link.",
|
|
159
|
+
card:
|
|
160
|
+
"No card chrome by default. When grouping is essential, hairline 1px gold-tinted border + " +
|
|
161
|
+
"ivory-deep bg + shadow-vitrine — a single vitrine per page. Internal padding p-10 lg:p-16. " +
|
|
162
|
+
"Title in Cormorant italic; body in Cormorant 400.",
|
|
163
|
+
input:
|
|
164
|
+
"Border-bottom only, 1px gold at 45% opacity. Ivory bg, no full box. " +
|
|
165
|
+
"Label sits above in small-caps mono with letter-spacing 0.28em. " +
|
|
166
|
+
"Focus = gold 1px underline, no glow. Placeholder italic, lowercase.",
|
|
167
|
+
cta:
|
|
168
|
+
"Primary CTA is a text-link with hairline gold underline. The single hero action per page " +
|
|
169
|
+
"may use a gold-fill rectangle with ivory text — once, never twice. All other actions are text-links.",
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
details: {
|
|
173
|
+
selectionBg: "hsl(var(--gold) / 0.22)",
|
|
174
|
+
selectionFg: "hsl(var(--foreground))",
|
|
175
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
176
|
+
scrollbarStyle: "thin",
|
|
177
|
+
},
|
|
178
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Bento-Modular — Build Brief
|
|
2
|
+
|
|
3
|
+
> The contract this theme ships with. Read at commit time by the
|
|
4
|
+
> brief-enforcer subagent; handed to Claude Code via the Copy-for-Claude
|
|
5
|
+
> button on the theme detail page.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## MANDATORY BUILD DIRECTIVE — you MUST
|
|
10
|
+
|
|
11
|
+
1. **Hold the dark ground at `#0F0F12`** on dark canvas — cool
|
|
12
|
+
near-black, 240° hue bias. Tile surface `#1A1A1F`. Hover surface
|
|
13
|
+
`#22222A`. Never pure black. On light canvas: paper `#FAFAFA`,
|
|
14
|
+
tile `#FFFFFF`, hover `#F0F0F0`.
|
|
15
|
+
2. **Surface luminance shift is the boundary.** Tiles have NO
|
|
16
|
+
borders and NO drop shadows. The boundary is the ~+3-5%
|
|
17
|
+
luminance step between bg and tile bg. This is the whole point
|
|
18
|
+
of the register.
|
|
19
|
+
3. **Set tiles at `borderRadius: 12`** (12px). Never 4px, never 20px.
|
|
20
|
+
12px is the Apple-iOS card radius that reads as premium-modern.
|
|
21
|
+
4. **Asymmetric bento — six tiles at VARIED spans.** Use
|
|
22
|
+
`grid-template-columns: repeat(4, 1fr)` + `grid-auto-flow: dense`.
|
|
23
|
+
Tile spans are: `2×1`, `2×1`, `1×1`, `1×1`, `2×1`, `4×1`. NEVER
|
|
24
|
+
render 6 tiles all at the same size — that's the "Bootstrap card
|
|
25
|
+
grid" failure mode this theme was built to refuse.
|
|
26
|
+
5. **Body font Hanken Grotesk / Inter, display font Neue Montreal.**
|
|
27
|
+
Mono font IBM Plex Mono ONLY for numeric metrics, CSS/code
|
|
28
|
+
samples, and token specimen labels. Never mono for decorative
|
|
29
|
+
headings.
|
|
30
|
+
6. **Tabular figures** on every number in a metric tile —
|
|
31
|
+
`fontFeatureSettings: '"tnum"'`. Non-tabular metric numerals
|
|
32
|
+
break the register.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## SLOP-BLOCKLIST — you MUST NOT
|
|
37
|
+
|
|
38
|
+
- **Same-size tile grid.** If every tile has `gridColumn: span 1`
|
|
39
|
+
the theme has failed. Fingerprint: all tiles with identical
|
|
40
|
+
`gridColumn` and `gridRow` values.
|
|
41
|
+
- **`border: 1px solid` on tiles.** Depth is surface-luminance, not
|
|
42
|
+
hairlines. The ONE exception: the palette specimen's `#0F0F12`
|
|
43
|
+
sample swatch gets a hairline to be visible against the tile bg.
|
|
44
|
+
- **`boxShadow: 0 4px ...` or `shadow-md`** on tiles. Solid dropshadow
|
|
45
|
+
is banned. On the hover surface change from `#1A1A1F` → `#22222A`
|
|
46
|
+
IS the interaction.
|
|
47
|
+
- **Mono-caps decorative eyebrows** (`BENTO / SPECIMEN`, `THE PRODUCT`,
|
|
48
|
+
`CAPABILITIES`). CSS fingerprint: `textTransform: uppercase` +
|
|
49
|
+
`letterSpacing ≥ 0.14em` at `fontSize < 20px`. NOT permitted.
|
|
50
|
+
Tile inner labels use the `TileEyebrow` mono style in sentence-case
|
|
51
|
+
10px letter-spacing 0.20em uppercase is banned — refactor to
|
|
52
|
+
sentence-case at 12px.
|
|
53
|
+
- **`TRUSTED BY` / `AS SEEN IN` / `COMPOSED BY TEAMS AT` wordmark
|
|
54
|
+
strips.** The `Composed by teams at Linear/Vercel/etc.` slop pattern
|
|
55
|
+
is banned.
|
|
56
|
+
- **Dot-metadata rows** (`ISSUE 04 · CHAPTER 03`, `EST. 2019`,
|
|
57
|
+
`12 MIN READ`).
|
|
58
|
+
- **3-pillar identical feature-card grids.** Bento IS the answer to
|
|
59
|
+
the 3-pillar grid; don't devolve back.
|
|
60
|
+
- **Purple/indigo/pink gradient backgrounds** on the bg or tiles.
|
|
61
|
+
The register is single-color surface + accent, no gradients.
|
|
62
|
+
- **Ticker bars**, cycling headline words, auto-advancing sliders.
|
|
63
|
+
- **Vague trust copy:** hand-crafted, thoughtfully-made, considered.
|
|
64
|
+
- **Roman-numeral copyright** (`MMXXVI`).
|
|
65
|
+
- **Attribution of influence in visible copy** — Apple, Vercel are
|
|
66
|
+
studied but never NAMED in slug, copy, or UI.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## CHROME INVENTORY — the allow-list
|
|
71
|
+
|
|
72
|
+
- **Sticky palette + canvas picker strip** — meta-UI, sentence-case
|
|
73
|
+
body font.
|
|
74
|
+
- **Masthead nav** — brand square (accent bg, 12px display) +
|
|
75
|
+
wordmark ("Facet" in Neue Montreal 600 at 17px, tracking -0.02em)
|
|
76
|
+
+ 4 nav items (body font 14px) + accent-filled "Start free" pill
|
|
77
|
+
(radius 8px, accent bg + bg-color text).
|
|
78
|
+
- **Hero display H1** — Neue Montreal 600 at `clamp(3rem, 7vw, 6rem)`,
|
|
79
|
+
tracking -0.035em, one line-break, two lines max (`Six tiles.` +
|
|
80
|
+
`One idea each.`).
|
|
81
|
+
- **Asymmetric 6-tile bento** — 4-col grid at `grid-template-columns:
|
|
82
|
+
repeat(4, 1fr)`, gap 28px, `grid-auto-flow: dense`. Six tiles at
|
|
83
|
+
spans `2×1 / 2×1 / 1×1 / 1×1 / 2×1 / 4×1`.
|
|
84
|
+
- **Tile primitive** — `background: #1A1A1F`, `borderRadius: 12`,
|
|
85
|
+
`padding: 24`, `display: flex / flexDirection: column`,
|
|
86
|
+
`minHeight: 180`. Hover surface shifts to `#22222A`. NO border,
|
|
87
|
+
NO shadow.
|
|
88
|
+
- **Big-metric tile** — `<TileEyebrow>` in mono 10px sentence-case
|
|
89
|
+
color mute + display metric numeral in mono 92px tabular figures.
|
|
90
|
+
- **Chart-mini tile** — 8 bars, flex end-aligned, last bar in accent
|
|
91
|
+
color; delta below in `#30D158` (success green) mono 18px tabular.
|
|
92
|
+
- **Code-sample tile** — `<pre>` in IBM Plex Mono 11px
|
|
93
|
+
line-height 1.5, ink color, inline `<code>` for the highlighted
|
|
94
|
+
clause. Body inside tile uses `TileFooter` style (12px body font).
|
|
95
|
+
- **Full-bleed photo tile** — 2×1 or 4×1 span, `objectFit: cover`,
|
|
96
|
+
`borderRadius: 12`. NO caption card.
|
|
97
|
+
- **Palette specimen tile (4×1)** — bottom-full-width row showing
|
|
98
|
+
the 5 palette swatches with hex + label. The token label uses
|
|
99
|
+
mono 10px sentence-case (not caps).
|
|
100
|
+
- **Feature grid (2×2)** — 4 numbered features (`01`-`04` in mono
|
|
101
|
+
accent 12px), each in its own tile.
|
|
102
|
+
- **Testimonial + photo split** — 2-col, left column italic display
|
|
103
|
+
quote + attribution, right column photo tile.
|
|
104
|
+
- **3-tier pricing card row** — three tiles (radius 12px), middle
|
|
105
|
+
tier "featured" is accent-filled bg with bg-color text and
|
|
106
|
+
contrast CTA.
|
|
107
|
+
- **Bottom CTA** — center-aligned display H2 (72px) + accent-filled
|
|
108
|
+
button + one-line lede.
|
|
109
|
+
- **Footer** — 4-col grid (brand + 3 link columns), copyright line
|
|
110
|
+
in body 12px muted.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## SIGNATURE MOVES — verbs, not adjectives
|
|
115
|
+
|
|
116
|
+
- **Vary tile spans across the row.** Never 6 identical tiles.
|
|
117
|
+
Layout: `[2×1] [2×1]` / `[1×1] [1×1] [2×1]` / `[4×1]`. This is
|
|
118
|
+
what makes the register bento and not card-grid.
|
|
119
|
+
- **Shift tile background on hover from `#1A1A1F` to `#22222A`** —
|
|
120
|
+
200ms ease. This is the ONLY interaction on the tile. No
|
|
121
|
+
translate, no shadow, no border. Surface luminance IS the feedback.
|
|
122
|
+
- **Set metric numerals in IBM Plex Mono at 92px with tabular
|
|
123
|
+
figures.** The big "6" in the hero tile IS the theme's signature.
|
|
124
|
+
Non-tabular figures break the alignment.
|
|
125
|
+
- **Use `grid-auto-flow: dense`** to pack tiles. Without it, the
|
|
126
|
+
asymmetric spans leave holes.
|
|
127
|
+
- **Accent the last bar in a mini-chart with the palette accent.**
|
|
128
|
+
Non-last bars in `#2F2F38` (neutral tile-mute). This is how the
|
|
129
|
+
mini-chart reads as "growth" without a text label.
|
|
130
|
+
- **Draw palette swatches as filled 20×20 squares with a 4px
|
|
131
|
+
radius** — matches the tile radius scaled down. Hex in mono
|
|
132
|
+
11px, label in mono 9px sentence-case.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## COLOR TOKENS
|
|
137
|
+
|
|
138
|
+
**Dark canvas** — `bg: #0F0F12` / `tileBg: #1A1A1F` / `tileHoverBg:
|
|
139
|
+
#22222A` / `ink: #F5F5F7` / `muted: #8B8B96` / `success: #30D158`.
|
|
140
|
+
|
|
141
|
+
**Light canvas** — `bg: #FAFAFA` / `tileBg: #FFFFFF` / `tileHoverBg:
|
|
142
|
+
#F0F0F0` / `ink: #0F0F12` / `muted: #6E6E7A` / `success: #0E8A3E`.
|
|
143
|
+
|
|
144
|
+
**Accent** — per palette variant (10 product-brand hues; default
|
|
145
|
+
`electric` `#0A84FF` on dark, `#0A66D9` on light).
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## TYPOGRAPHY
|
|
150
|
+
|
|
151
|
+
- **Display:** Neue Montreal (fallback Hanken Grotesk, Inter). Weight
|
|
152
|
+
600, tracking -0.03em on hero, -0.02em on section H2.
|
|
153
|
+
- **Body:** Hanken Grotesk (fallback Inter), 15-17px, line-height
|
|
154
|
+
1.5-1.55.
|
|
155
|
+
- **Mono:** IBM Plex Mono, 10-13px for metric numerals + code
|
|
156
|
+
specimens + palette hex + token labels. NEVER for decorative
|
|
157
|
+
section eyebrows.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## SECTION SKELETON
|
|
162
|
+
|
|
163
|
+
1. Sticky palette + canvas picker.
|
|
164
|
+
2. Masthead nav (brand + 4 items + accent CTA).
|
|
165
|
+
3. Hero — asymmetric 6-tile bento (the signature move).
|
|
166
|
+
4. Product hero photo — full-bleed 16:9.
|
|
167
|
+
5. Feature grid (2×2 of numbered feature tiles).
|
|
168
|
+
6. Testimonial + photo split.
|
|
169
|
+
7. 3-tier pricing.
|
|
170
|
+
8. Bottom CTA — big display + accent button.
|
|
171
|
+
9. Footer.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Bento Modular
|
|
2
|
+
|
|
3
|
+
> Asymmetric grid of self-contained tiles — mixed sizes, generous gutters, one idea per module.
|
|
4
|
+
|
|
5
|
+
**Slug:** `bento-modular` — **Surface:** web — **Density:** balanced
|
|
6
|
+
|
|
7
|
+
## Influence
|
|
8
|
+
|
|
9
|
+
Apple iPhone product pages, Vercel dashboard, Linear /pricing, Notion inbox, Arc browser feature grids.
|
|
10
|
+
|
|
11
|
+
## Signature move
|
|
12
|
+
|
|
13
|
+
Asymmetric grid of tiles at varied spans — a 4×4 or 6×6 conceptual grid
|
|
14
|
+
where individual tiles span 2×1, 2×2, 3×1, 1×2, etc. Each tile carries
|
|
15
|
+
ONE idea (a metric, a headline, a single product feature, a chart, a
|
|
16
|
+
quote). Corners are subtly rounded (12px). Gutters are generous (24-32px).
|
|
17
|
+
No tile has a border — the surface luminance shift IS the boundary.
|
|
18
|
+
|
|
19
|
+
## Palette
|
|
20
|
+
|
|
21
|
+
- **bg:** `#0F0F12`
|
|
22
|
+
- **surface:** `#1A1A1F`
|
|
23
|
+
- **ink:** `#F5F5F7`
|
|
24
|
+
- **accent:** `#0A84FF`
|
|
25
|
+
- **secondary:** `#8B8B96`
|
|
26
|
+
- **signal:** `#30D158`
|
|
27
|
+
|
|
28
|
+
## Typography
|
|
29
|
+
|
|
30
|
+
- **Display:** Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em
|
|
31
|
+
- **Body:** Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition.
|
|
32
|
+
- **Mono:** IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px.
|
|
33
|
+
- **Scale:** 1.25 (major third — controlled contrast so tiles feel varied without shouting)
|
|
34
|
+
|
|
35
|
+
## Motion
|
|
36
|
+
|
|
37
|
+
Tile hover reveals a soft luminance lift (bg goes from #1A1A1F to
|
|
38
|
+
#22222A) with a 200ms ease. No card scale/translate on hover. Optional:
|
|
39
|
+
a single featured tile can carry ONE small motion moment (chart animating
|
|
40
|
+
in, number counter). Never more than one animated tile per screen.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
## Imagery
|
|
44
|
+
|
|
45
|
+
Product photography in individual tiles is fine — hero-crop style, filling
|
|
46
|
+
the tile. Charts and data viz can occupy their own tile. No decorative
|
|
47
|
+
imagery filling gutters. No background pattern behind tiles — the dark
|
|
48
|
+
ground is the composition.
|
|
49
|
+
|
|
50
|
+
## Best for
|
|
51
|
+
|
|
52
|
+
- Product landing pages (Apple-style feature bentos)
|
|
53
|
+
- Analytics dashboards showcasing multiple metrics
|
|
54
|
+
- Feature-highlight pages for SaaS products
|
|
55
|
+
- Pitch decks — one bento per section
|
|
56
|
+
- Portfolio grids showing selected work at varied sizes
|
|
57
|
+
|
|
58
|
+
## Reject if
|
|
59
|
+
|
|
60
|
+
_Director grades each of the following as a pass/fail check. Any violation blocks the theme._
|
|
61
|
+
|
|
62
|
+
- Uniform grid of same-size cards — that's a Bootstrap card grid, not bento
|
|
63
|
+
- Bordered tiles with 1px hairlines — the surface shift IS the boundary; borders read as cramped
|
|
64
|
+
- shadow-md or drop-shadow on tiles — kills the flat-luminance composition
|
|
65
|
+
- More than one animated tile per viewport — dilutes the featured moment
|
|
66
|
+
- Cramming tiles at consistent 240×240 sizes — negates the whole 'varied span' signature
|
|
67
|
+
- Rounded corners greater than 16px — bento tiles are subtly rounded (12px), not pill-shaped
|
|
68
|
+
- Secondary accent color beyond the one dominant hue (#0A84FF) plus optional #30D158 for success-state semantic ONLY
|
|
69
|
+
- Filled backgrounds inside tiles beyond the base surface color — no gradient tiles, no colored tiles
|
|
70
|
+
- Tile hover states beyond the luminance lift (no scale, no translate, no shadow bloom)
|
|
71
|
+
|
|
72
|
+
## Banned defaults (inherited + theme-specific)
|
|
73
|
+
|
|
74
|
+
- claude-cream (#F4F1EA + serif + #D97757)
|
|
75
|
+
- void+acid (near-black bg + single bright acid-green or vermilion accent)
|
|
76
|
+
- broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
|
|
77
|
+
- tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
|
|
78
|
+
- uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
|
|
79
|
+
- bento-as-cards (same-size tiles + hairline borders + shadow-md — that's the safe SaaS card grid the bento was supposed to escape)
|
|
80
|
+
- shadow-bento (drop-shadows doing the layer separation instead of surface luminance — kills the composition)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
|
|
2
|
+
// slug: bento-modular
|
|
3
|
+
export const bentoModularTailwindExtend = {
|
|
4
|
+
colors: {
|
|
5
|
+
bg: "#0F0F12",
|
|
6
|
+
surface: "#1A1A1F",
|
|
7
|
+
ink: "#F5F5F7",
|
|
8
|
+
accent: "#0A84FF",
|
|
9
|
+
secondary: "#8B8B96",
|
|
10
|
+
signal: "#30D158",
|
|
11
|
+
},
|
|
12
|
+
fontFamily: {
|
|
13
|
+
display: ["Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em"],
|
|
14
|
+
body: ["Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition."],
|
|
15
|
+
mono: ["IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px."],
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Base 31 Bento Modular — Family D, Contemporary Web.
|
|
2
|
+
#
|
|
3
|
+
# Per BESPOKE_THEME_SYSTEM.md #31: Apple-style bento grid. Mixed-size
|
|
4
|
+
# tiles at varied spans, each a self-contained module, one idea per tile,
|
|
5
|
+
# generous gutters. NOT a uniform card grid — asymmetry is the register.
|
|
6
|
+
#
|
|
7
|
+
# Theme #3 through the v2 harness. Third theme in Family D (signal-dark
|
|
8
|
+
# survivor as Dark Premium anchor; kinetic-headline as Base 32; this is
|
|
9
|
+
# Base 31). Precedent for bento authoring: team-kanban survivor.
|
|
10
|
+
|
|
11
|
+
name: Bento Modular
|
|
12
|
+
concept: Asymmetric grid of self-contained tiles — mixed sizes, generous gutters, one idea per module.
|
|
13
|
+
influence: Apple iPhone product pages, Vercel dashboard, Linear /pricing, Notion inbox, Arc browser feature grids.
|
|
14
|
+
|
|
15
|
+
family: D
|
|
16
|
+
base_number: 31
|
|
17
|
+
render_url: http://localhost:5173/themes/bento-modular
|
|
18
|
+
|
|
19
|
+
surface: web
|
|
20
|
+
|
|
21
|
+
typography:
|
|
22
|
+
display: Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em
|
|
23
|
+
body: Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition.
|
|
24
|
+
mono: IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px.
|
|
25
|
+
scale: 1.25 (major third — controlled contrast so tiles feel varied without shouting)
|
|
26
|
+
|
|
27
|
+
palette:
|
|
28
|
+
bg: "#0F0F12"
|
|
29
|
+
surface: "#1A1A1F"
|
|
30
|
+
ink: "#F5F5F7"
|
|
31
|
+
accent: "#0A84FF"
|
|
32
|
+
secondary: "#8B8B96"
|
|
33
|
+
signal: "#30D158"
|
|
34
|
+
|
|
35
|
+
density: balanced
|
|
36
|
+
|
|
37
|
+
motion: |
|
|
38
|
+
Tile hover reveals a soft luminance lift (bg goes from #1A1A1F to
|
|
39
|
+
#22222A) with a 200ms ease. No card scale/translate on hover. Optional:
|
|
40
|
+
a single featured tile can carry ONE small motion moment (chart animating
|
|
41
|
+
in, number counter). Never more than one animated tile per screen.
|
|
42
|
+
|
|
43
|
+
signature: |
|
|
44
|
+
Asymmetric grid of tiles at varied spans — a 4×4 or 6×6 conceptual grid
|
|
45
|
+
where individual tiles span 2×1, 2×2, 3×1, 1×2, etc. Each tile carries
|
|
46
|
+
ONE idea (a metric, a headline, a single product feature, a chart, a
|
|
47
|
+
quote). Corners are subtly rounded (12px). Gutters are generous (24-32px).
|
|
48
|
+
No tile has a border — the surface luminance shift IS the boundary.
|
|
49
|
+
|
|
50
|
+
imagery: |
|
|
51
|
+
Product photography in individual tiles is fine — hero-crop style, filling
|
|
52
|
+
the tile. Charts and data viz can occupy their own tile. No decorative
|
|
53
|
+
imagery filling gutters. No background pattern behind tiles — the dark
|
|
54
|
+
ground is the composition.
|
|
55
|
+
|
|
56
|
+
best_for:
|
|
57
|
+
- Product landing pages (Apple-style feature bentos)
|
|
58
|
+
- Analytics dashboards showcasing multiple metrics
|
|
59
|
+
- Feature-highlight pages for SaaS products
|
|
60
|
+
- Pitch decks — one bento per section
|
|
61
|
+
- Portfolio grids showing selected work at varied sizes
|
|
62
|
+
|
|
63
|
+
avoid:
|
|
64
|
+
- "Uniform grid of same-size cards — that's a Bootstrap card grid, not bento"
|
|
65
|
+
- "Bordered tiles with 1px hairlines — the surface shift IS the boundary; borders read as cramped"
|
|
66
|
+
- "shadow-md or drop-shadow on tiles — kills the flat-luminance composition"
|
|
67
|
+
- "More than one animated tile per viewport — dilutes the featured moment"
|
|
68
|
+
- "Cramming tiles at consistent 240×240 sizes — negates the whole 'varied span' signature"
|
|
69
|
+
- "Rounded corners greater than 16px — bento tiles are subtly rounded (12px), not pill-shaped"
|
|
70
|
+
- "Secondary accent color beyond the one dominant hue (#0A84FF) plus optional #30D158 for success-state semantic ONLY"
|
|
71
|
+
- "Filled backgrounds inside tiles beyond the base surface color — no gradient tiles, no colored tiles"
|
|
72
|
+
- "Tile hover states beyond the luminance lift (no scale, no translate, no shadow bloom)"
|
|
73
|
+
|
|
74
|
+
banned_defaults:
|
|
75
|
+
# Global blocklist from BESPOKE_THEME_SYSTEM.md
|
|
76
|
+
- "claude-cream (#F4F1EA + serif + #D97757)"
|
|
77
|
+
- "void+acid (near-black bg + single bright acid-green or vermilion accent)"
|
|
78
|
+
- "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
|
|
79
|
+
- "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
|
|
80
|
+
- "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
|
|
81
|
+
# Base-specific
|
|
82
|
+
- "bento-as-cards (same-size tiles + hairline borders + shadow-md — that's the safe SaaS card grid the bento was supposed to escape)"
|
|
83
|
+
- "shadow-bento (drop-shadows doing the layer separation instead of surface luminance — kills the composition)"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
|
|
2
|
+
|
|
3
|
+
export const tokens = {
|
|
4
|
+
slug: "bento-modular",
|
|
5
|
+
family: "D",
|
|
6
|
+
base: "31",
|
|
7
|
+
palette: {
|
|
8
|
+
"bg": "#0F0F12",
|
|
9
|
+
"surface": "#1A1A1F",
|
|
10
|
+
"ink": "#F5F5F7",
|
|
11
|
+
"accent": "#0A84FF",
|
|
12
|
+
"secondary": "#8B8B96",
|
|
13
|
+
"signal": "#30D158"
|
|
14
|
+
},
|
|
15
|
+
typography: {
|
|
16
|
+
"display": "Neue Montreal (paid) or Hanken Grotesk (free) — 600 weight for tile headlines at 24-36px, tight tracking -0.02em",
|
|
17
|
+
"body": "Hanken Grotesk — 400, 14-15px, line-height 1.5. Quiet, doesn't compete with the tile composition.",
|
|
18
|
+
"mono": "IBM Plex Mono — for metric numerals (tile stats), timestamps, keyboard shortcuts. 13px.",
|
|
19
|
+
"scale": "1.25 (major third — controlled contrast so tiles feel varied without shouting)"
|
|
20
|
+
},
|
|
21
|
+
surface: "web",
|
|
22
|
+
density: "balanced",
|
|
23
|
+
motion: "Tile hover reveals a soft luminance lift (bg goes from #1A1A1F to\n#22222A) with a 200ms ease. No card scale/translate on hover. Optional:\na single featured tile can carry ONE small motion moment (chart animating\nin, number counter). Never more than one animated tile per screen.\n",
|
|
24
|
+
signature: "Asymmetric grid of tiles at varied spans — a 4×4 or 6×6 conceptual grid\nwhere individual tiles span 2×1, 2×2, 3×1, 1×2, etc. Each tile carries\nONE idea (a metric, a headline, a single product feature, a chart, a\nquote). Corners are subtly rounded (12px). Gutters are generous (24-32px).\nNo tile has a border — the surface luminance shift IS the boundary.\n",
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
export type Tokens = typeof tokens;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Design Direction — Bookstore-Indie
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Strand 18 miles of books · Powell's stacked-card warmth · City Lights beat-poet pedigree · Three Lives neighborhood serif · Greenlight handwritten staff blurbs
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Walking into a small neighborhood bookstore on a side street. Warm cream paper, generous body serif throughout, italic staff-blurbs that read like someone actually wrote them. The page is for readers, not customers — pick up the book, flip a few pages, find a hand-lettered shelf tag. Color is sparing; a single brick-red accent marks staff-picks and new arrivals.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Strand Bookstore** → warm cream, dense shelves, no marketing varnish.
|
|
11
|
+
- **Powell's City of Books** → color-coded room signage, handwritten staff blurbs.
|
|
12
|
+
- **City Lights** → literary-magazine serif, beat-poet austerity.
|
|
13
|
+
- **Three Lives & Co** → neighborhood-bookstore serif, single-window display.
|
|
14
|
+
- **Greenlight Bookstore** → Lora-feel body serif, staff-pick shelf as homepage.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
Surface stack is **paperback cream** (background) → **shelf-tag cream** (card) → **deeper cream** (secondary/muted). Hairline borders are wood-tone shelf-edges. Brand tokens: `--ink` (espresso brown), `--cream`, `--brick` (staff-pick stamp), `--sage` (event listings).
|
|
18
|
+
|
|
19
|
+
Primary is `--brick`. Reserved for staff-pick stamps, new-arrival markers, focus ring, and the single 'Buy local' CTA.
|
|
20
|
+
|
|
21
|
+
## Typography
|
|
22
|
+
- **Display:** Lora (Greenlight / Three Lives book-cover serif feel). h1–h4.
|
|
23
|
+
- **Body:** Lora as well — same family, smaller, lighter weight. Single-family discipline is intentional: bookstores don't mix typefaces, books don't mix typefaces.
|
|
24
|
+
- **Mono:** JetBrains Mono. ISBNs, event times, shelf-tag numbers — receipt-tape feel.
|
|
25
|
+
|
|
26
|
+
Body 17px / 1.7. Reading is the point.
|
|
27
|
+
|
|
28
|
+
## Spacing
|
|
29
|
+
- **Container:** `max-w-5xl px-6 lg:px-10` — wider than editorial (room for a shelf of 6 books), narrower than cinematic.
|
|
30
|
+
- **Sections:** hero `pt-24 pb-14 lg:pt-36 lg:pb-20`; default `py-16 lg:py-24`; tight `py-10 lg:py-16`.
|
|
31
|
+
- **Scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96.
|
|
32
|
+
|
|
33
|
+
## Color
|
|
34
|
+
No hex. Tokens only. Brick appears only on staff-pick stamps, hover states, focus, selection, and the buy-local CTA. Sage appears only on event listings (readings, signings) — never elsewhere.
|
|
35
|
+
|
|
36
|
+
## Radius
|
|
37
|
+
`--radius: 0.125rem` — a hair of softness, the way a shelf-tag has a slightly trimmed corner. Pills disallowed.
|
|
38
|
+
|
|
39
|
+
## Shadows
|
|
40
|
+
**Minimal.** Two utilities: `.hairline-bottom` and `.shelf-tag` (hairline border + hairline bottom, mimicking a tag pinned to a shelf edge).
|
|
41
|
+
|
|
42
|
+
## Motion
|
|
43
|
+
Single keyframe: `fade-rise` (opacity + 16px translate, 1000ms). Page-turn pace. `prefers-reduced-motion` honored.
|
|
44
|
+
|
|
45
|
+
## Component patterns
|
|
46
|
+
- **Buttons:** text-link CTAs with brick-on-hover. The single solid-fill is 'Buy local' / 'Order from us' — brick bg + cream text.
|
|
47
|
+
- **Cards:** hairline border, slight cream-tier shift. Padding `p-6 lg:p-8`. Title in display serif italic; author in display serif roman; staff blurb in body serif italic with a small mono attribution (`— Maya, since 2019`).
|
|
48
|
+
- **Inputs:** border-bottom only (1px ink).
|
|
49
|
+
- **CTA links:** ink → brick on hover. Never a chip.
|
|
50
|
+
|
|
51
|
+
## Recommended rich media
|
|
52
|
+
Book covers — only. Each cover photographed flat against cream paper or on a wood shelf with neutral lighting. Author headshots are black-and-white, environmental (writing at a desk, not a press shot). Never lifestyle stock, never models reading, never decorative gradients.
|
|
53
|
+
|
|
54
|
+
**AI tool recommendations:** **Midjourney / Flux** for placeholder covers: *"book cover photographed flat on warm cream paper, neutral overhead lighting, slight shadow"*. Avoid AI-generated "book stack" hero images — they always have wrong proportions and uncanny text.
|
|
55
|
+
|
|
56
|
+
**Aspect ratios:** 3:4 portrait (book cover convention), 2:3 (slightly taller, also valid). Never 16:9.
|
|
57
|
+
|
|
58
|
+
**Captions:** italic body-serif, with the staff attribution. *"— Maya recommends, since 2019."*
|
|
59
|
+
|
|
60
|
+
**Avoid:** generic "person reading" stock, AI gradients, glassmorphic anything, animated GIFs.
|
|
61
|
+
|
|
62
|
+
**Accessibility:** alt-text describes the cover — *"Book cover: 'Trust' by Hernan Diaz, dark green with gold typography, paperback edition."*
|
|
63
|
+
|
|
64
|
+
## Component families
|
|
65
|
+
- `StaffPick` family — book card with cover + title + author + italic blurb + signed attribution.
|
|
66
|
+
- `EventListing` family — date column + title + reader name + brief description.
|
|
67
|
+
- `BuyLocal` family — single callout with brick stamp.
|
|
68
|
+
|
|
69
|
+
## Details
|
|
70
|
+
- **Selection:** `hsl(var(--primary) / 0.2)` — brick wash.
|
|
71
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`.
|
|
72
|
+
- **Scrollbar:** thin.
|
|
73
|
+
|
|
74
|
+
## Exceptions
|
|
75
|
+
None yet.
|
|
76
|
+
|
|
77
|
+
## Revisions
|
|
78
|
+
- Initial direction.
|