@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,194 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// vet-modern — Bond Vet / Modern Animal walk-in-friendly clinical.
|
|
4
|
+
// Soft sage-green accent on cream, friendly Inter, dense-but-soft booking
|
|
5
|
+
// chrome. Clinical competence with the bedside manner of a Brooklyn corner
|
|
6
|
+
// clinic — not a hospital EHR, not a pet-DTC playful boutique. The page
|
|
7
|
+
// books an appointment fast.
|
|
8
|
+
export const vetModern: Direction = {
|
|
9
|
+
name: "vet-modern" as Direction["name"],
|
|
10
|
+
ethos:
|
|
11
|
+
"Bond Vet sage-and-cream walk-in · Modern Animal hotel-lobby clinical · " +
|
|
12
|
+
"Small Door membership-friendly chrome · Heart + Paw spa-meets-clinic warmth · " +
|
|
13
|
+
"GoodVets neighborhood-clinic candor",
|
|
14
|
+
references: [
|
|
15
|
+
{ brand: "Bond Vet", trait: "soft sage on cream + walk-in-friendly booking chrome" },
|
|
16
|
+
{ brand: "Modern Animal", trait: "hotel-lobby clinical, generous whitespace, membership-first" },
|
|
17
|
+
{ brand: "Small Door Veterinary", trait: "membership-friendly chrome, app-led scheduling" },
|
|
18
|
+
{ brand: "Heart + Paw", trait: "spa-meets-clinic warmth, pet-portrait photography" },
|
|
19
|
+
{ brand: "GoodVets", trait: "neighborhood-clinic candor, locations-first IA" },
|
|
20
|
+
],
|
|
21
|
+
feel:
|
|
22
|
+
"Walk-in-friendly clinical. Cream-tinted surfaces with one principled sage-green " +
|
|
23
|
+
"accent — never two competing colors. Friendly Inter, dense-but-soft booking chrome, " +
|
|
24
|
+
"tabular numerics for times and prices. The page is a tool: locations grid resolves " +
|
|
25
|
+
"to hours, services list resolves to a price range, booking widget resolves to a " +
|
|
26
|
+
"Tuesday-2:30 slot in two taps. Clinical competence without the EHR coldness.",
|
|
27
|
+
|
|
28
|
+
fonts: {
|
|
29
|
+
display: {
|
|
30
|
+
family: "Inter",
|
|
31
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
32
|
+
from: "Bond Vet / Modern Animal — Inter as display reads competent + approachable",
|
|
33
|
+
googleFont: "Inter",
|
|
34
|
+
weights: [500, 600, 700],
|
|
35
|
+
},
|
|
36
|
+
body: {
|
|
37
|
+
family: "Inter",
|
|
38
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
39
|
+
from: "same family — clinical tools use one face; hierarchy via weight + size",
|
|
40
|
+
googleFont: "Inter",
|
|
41
|
+
weights: [400, 500, 600],
|
|
42
|
+
},
|
|
43
|
+
mono: {
|
|
44
|
+
family: "JetBrains Mono",
|
|
45
|
+
fallback: ["IBM Plex Mono", "ui-monospace", "SFMono-Regular", "monospace"],
|
|
46
|
+
from: "appointment times, prices, clinic hours — tabular numerics, instrument feel",
|
|
47
|
+
googleFont: "JetBrains+Mono",
|
|
48
|
+
weights: [400, 500],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
typography: {
|
|
53
|
+
headingTracking: "-0.015em",
|
|
54
|
+
bodyTracking: "0",
|
|
55
|
+
fontFeatureSettings: '"cv11", "ss01", "tnum", "calt"',
|
|
56
|
+
h1ScaleClamp: "clamp(1.875rem, 4vw, 3rem)", // tool-first; not magazine-large
|
|
57
|
+
bodyBaseSize: "0.9375rem", // 15px — denser than marketing
|
|
58
|
+
bodyLineHeight: "1.55",
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
colors: {
|
|
62
|
+
background: { hsl: "60 24% 97%", from: "Bond Vet warm cream — softer than dashboard-white, never yellow-spa" },
|
|
63
|
+
foreground: { hsl: "168 28% 14%", from: "deep evergreen-ink — never black; ties to the sage accent without competing" },
|
|
64
|
+
card: { hsl: "0 0% 100%", from: "true white card — lifts cleanly off cream for booking-panel tiles" },
|
|
65
|
+
popover: { hsl: "0 0% 100%", from: "same as card" },
|
|
66
|
+
primary: { hsl: "152 38% 42%", from: "Bond Vet sage-green — principal action, the single brand color" },
|
|
67
|
+
primaryForeground: { hsl: "0 0% 100%", from: "white on sage" },
|
|
68
|
+
secondary: { hsl: "60 22% 93%", from: "deeper cream — secondary panel, location-card bg" },
|
|
69
|
+
secondaryForeground: { hsl: "168 28% 18%", from: "evergreen ink on cream panel" },
|
|
70
|
+
muted: { hsl: "60 18% 95%", from: "table-row stripe — quietest cream, near-bg" },
|
|
71
|
+
mutedForeground: { hsl: "168 10% 42%", from: "soft slate-sage — captions, hours, sub-labels" },
|
|
72
|
+
accent: { hsl: "152 30% 90%", from: "sage-tint — hover and selected-slot surface" },
|
|
73
|
+
accentForeground: { hsl: "152 38% 24%", from: "deep sage on tint" },
|
|
74
|
+
border: { hsl: "60 16% 86%", from: "warm hairline — Bond directory rule, never cool gray" },
|
|
75
|
+
input: { hsl: "60 16% 86%", from: "same as border" },
|
|
76
|
+
ring: { hsl: "152 38% 42%", from: "primary sage, focus only" },
|
|
77
|
+
destructive: { hsl: "352 64% 50%", from: "warm clinical red — cancel-appointment, urgent-care alert" },
|
|
78
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on warm red" },
|
|
79
|
+
brand: {
|
|
80
|
+
sage: { hsl: "152 38% 42%", from: "= primary; Bond Vet principal — the single brand color" },
|
|
81
|
+
"sage-soft": { hsl: "152 30% 90%", from: "alias for accent — booked-slot pill, included-in-membership chip" },
|
|
82
|
+
"sage-deep": { hsl: "152 42% 28%", from: "hover/active sage — buttons darken to this on press" },
|
|
83
|
+
cream: { hsl: "60 24% 97%", from: "alias for background — Bond cream paper" },
|
|
84
|
+
kraft: { hsl: "40 22% 80%", from: "deeper warm border — location-card divider, hours-list rule" },
|
|
85
|
+
sun: { hsl: "44 84% 60%", from: "Modern Animal walk-in-available amber — clinic-open-now indicator, never primary" },
|
|
86
|
+
"sun-soft": { hsl: "44 84% 92%", from: "amber tint — same-day-availability chip background" },
|
|
87
|
+
ink: { hsl: "168 28% 14%", from: "alias for foreground — deep evergreen, never pure black" },
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
spacing: {
|
|
92
|
+
base: 4,
|
|
93
|
+
scale: [2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 40, 48, 64, 80], // dashboard-allowed micro-steps
|
|
94
|
+
containerMax: "max-w-7xl", // tool-wide — booking grids edge-to-edge
|
|
95
|
+
containerPadding: "px-4 lg:px-6",
|
|
96
|
+
sectionPadding: {
|
|
97
|
+
hero: "pt-16 pb-10 lg:pt-20 lg:pb-14",
|
|
98
|
+
default: "py-12 lg:py-18",
|
|
99
|
+
tight: "py-8 lg:py-12",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
radius: {
|
|
104
|
+
base: "0.625rem", // 10px — softer than dense-utility, less pillowy than DTC
|
|
105
|
+
pillsAllowed: true, // pills core — appointment-status, service-type, availability
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
shadows: {
|
|
109
|
+
style: "soft",
|
|
110
|
+
utilities: {
|
|
111
|
+
"shadow-clinic":
|
|
112
|
+
"0 1px 2px hsl(168 30% 20% / 0.04), 0 4px 12px hsl(168 30% 20% / 0.06)",
|
|
113
|
+
"shadow-clinic-lg":
|
|
114
|
+
"0 2px 4px hsl(168 30% 20% / 0.05), 0 12px 28px hsl(168 30% 20% / 0.08)",
|
|
115
|
+
"shadow-booking":
|
|
116
|
+
"0 4px 8px hsl(168 30% 20% / 0.06), 0 24px 48px hsl(168 30% 20% / 0.12)",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
motion: {
|
|
121
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
122
|
+
durations: {
|
|
123
|
+
reveal: 380,
|
|
124
|
+
loop: 1800,
|
|
125
|
+
ambient: 0, // no ambient on a booking tool
|
|
126
|
+
},
|
|
127
|
+
keyframes: {
|
|
128
|
+
"fade-rise": {
|
|
129
|
+
css:
|
|
130
|
+
"from { opacity: 0; transform: translateY(8px); }\n" +
|
|
131
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
132
|
+
defaultDuration: 380,
|
|
133
|
+
iteration: "once",
|
|
134
|
+
purpose: "panel and row entrance — short, dashboard-quick",
|
|
135
|
+
},
|
|
136
|
+
"scale-in": {
|
|
137
|
+
css:
|
|
138
|
+
"from { opacity: 0; transform: scale(0.97); }\n" +
|
|
139
|
+
"to { opacity: 1; transform: scale(1); }",
|
|
140
|
+
defaultDuration: 180,
|
|
141
|
+
iteration: "once",
|
|
142
|
+
purpose: "modal, popover, slot-picker — confirms click without delay",
|
|
143
|
+
},
|
|
144
|
+
"soft-pulse": {
|
|
145
|
+
css:
|
|
146
|
+
"0%, 100% { opacity: 1; }\n" +
|
|
147
|
+
"50% { opacity: 0.5; }",
|
|
148
|
+
defaultDuration: 1800,
|
|
149
|
+
iteration: "infinite",
|
|
150
|
+
purpose: "open-now indicator dot and live-availability ping — quiet attention",
|
|
151
|
+
},
|
|
152
|
+
"shimmer": {
|
|
153
|
+
css:
|
|
154
|
+
"0% { background-position: -200% 0; }\n" +
|
|
155
|
+
"100% { background-position: 200% 0; }",
|
|
156
|
+
defaultDuration: 1400,
|
|
157
|
+
iteration: "infinite",
|
|
158
|
+
purpose: "appointment-list and slot-grid loading skeleton",
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
respectsReducedMotion: true,
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
density: "high",
|
|
165
|
+
|
|
166
|
+
patterns: {
|
|
167
|
+
button:
|
|
168
|
+
"Primary = solid sage fill, white text, rounded-lg, shadow-clinic. " +
|
|
169
|
+
"Secondary = white fill with 1px warm border, evergreen-ink text. Tertiary = sage text-link. " +
|
|
170
|
+
"Destructive = warm-red ghost (border + text), upgrades to solid only on confirm step. " +
|
|
171
|
+
"Hover: shadow-clinic-lg + 4% darken to sage-deep, never scale (jumpiness in clinical chrome reads error-prone).",
|
|
172
|
+
card:
|
|
173
|
+
"Rounded-lg, white fill on cream background, 1px warm border, shadow-clinic. " +
|
|
174
|
+
"Internal padding p-5 lg:p-6 (denser than marketing). " +
|
|
175
|
+
"Location-card variant: 4px sage top-border when open-now, 4px kraft top-border when closed-today. " +
|
|
176
|
+
"Booking-widget card uses shadow-booking for emphasis — the primary tool on the page.",
|
|
177
|
+
input:
|
|
178
|
+
"Rounded-md, 1px warm border, white background. Compact height (h-9). " +
|
|
179
|
+
"Label sits above in Inter 500. Focus = 2px sage ring at 40% opacity. " +
|
|
180
|
+
"Pet-name and reason-for-visit inputs may show a small paw glyph in left padding. " +
|
|
181
|
+
"Inline validation appears as the user types — clinical forms need real-time feedback.",
|
|
182
|
+
cta:
|
|
183
|
+
"Primary sage solid is the dashboard default — 'Book appointment', 'Find a clinic', 'Become a member'. " +
|
|
184
|
+
"Side-by-side primary + secondary is allowed for booking flows (primary = book now, secondary = see all times). " +
|
|
185
|
+
"Sun (amber) is reserved for walk-in-available context — chip only, never a button face.",
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
details: {
|
|
189
|
+
selectionBg: "hsl(var(--sage) / 0.22)",
|
|
190
|
+
selectionFg: "hsl(var(--foreground))",
|
|
191
|
+
focusRing: "2px solid hsl(var(--ring) / 0.5)",
|
|
192
|
+
scrollbarStyle: "thin",
|
|
193
|
+
},
|
|
194
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Design Direction — Web3-Restraint
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Ethereum Foundation slate · Vitalik blog hairlines · paradigm.xyz mono grid · a16z report formality · Allium Labs docs technical-paper restraint
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
The opposite of crypto-onchain. A whitepaper, not a launch page. Monospace labels, hairline rules, two near-blacks, one near-paper, no gradient and no glow. Color is reserved for inline code, links, and the rare diagram callout. The page reads like a footnote in a research index.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **ethereum.org** → slate grey neutrals, Inter body sized restrained, sparse chrome. The headline is information, not a banner.
|
|
11
|
+
- **Vitalik blog (vitalik.eth.limo)** → serif body, hairline rules, near-zero ornament. Long-form research at default browser leading.
|
|
12
|
+
- **paradigm.xyz** → monospace prominence, black-on-white, structured two-column grid. The mono is a first-class face, not a code-block ghetto.
|
|
13
|
+
- **a16z crypto reports** → formal layout, restrained color, whitepaper-style document conventions.
|
|
14
|
+
- **Allium Labs docs** → light gray surfaces, JetBrains Mono for labels and code, technical-paper density without claustrophobia.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
|
|
18
|
+
|
|
19
|
+
Surface stack is **near-paper slate** (background) → pure white (card) → slightly cooler slate (secondary/muted/accent). Depth comes from 1px hairline borders, never from fill differentiation. The palette is monochromatic by intent — one chromatic accent (`--brand-link`) and one warning (`--destructive`). Everything else is slate.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--ink`, `--paper`, `--ink-soft`, `--link`, `--code-bg`, `--rule-strong`. Primary shares the foreground ink — there is no separate brand color, because the brand IS the restraint.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Inter (ethereum.org display). h1–h4. Tracking `-0.01em` — tight but not aggressive. Display sits restrained at clamp(1.75rem, 3.5vw, 2.5rem); never larger.
|
|
25
|
+
- **Body:** Source Serif Pro (Vitalik blog body). Body base **16px** with **line-height 1.65** — research-paper leading, optimized for long-form arguments.
|
|
26
|
+
- **Mono:** JetBrains Mono (paradigm.xyz / Allium docs). First-class face: section labels in uppercase 0.75rem mono, inline code, addresses, callout markers. Letter-spacing `0.04em` on uppercase mono labels.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(1.75rem, 3.5vw, 2.5rem)` — deliberately small. Numbers always use `font-variant-numeric: tabular-nums` and `"zero"` for the slashed zero. Font features: `"tnum"`, `"zero"`, `"ss01"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-3xl px-4 lg:px-8` — paradigm.xyz reading-column width, 768px. Wider columns break the whitepaper rhythm.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-16 pb-10 lg:pt-24 lg:pb-16` (the abstract is the hero — no banner)
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 96. No arbitrary spacing.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. Pure black and pure white are forbidden — `--paper` (near-paper slate) and `--ink` (deep slate) replace them.
|
|
40
|
+
|
|
41
|
+
The palette is intentionally monochromatic. Chromatic accent is reserved for `--brand-link` (the only true color in the design), which doubles as the focus ring. `--destructive` exists for alerts but is muted, never bright.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 0.125rem` (2px). **Barely-there rounding** — sharp enough to feel technical, soft enough to not feel hostile. Pills are disallowed (`pillsAllowed: false`) — they read web-app, not research-paper. Status indicators use plain text with a leading mono dash.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**Minimal.** Three utilities: `.hairline-top`, `.hairline-bottom`, `.rule-strong`. All are 1px border-equivalents (top edge, bottom edge, or stronger figure separator). No drop shadows. No glows. The figure separator (`--rule-strong`) is the heaviest element on the page.
|
|
48
|
+
|
|
49
|
+
## Motion
|
|
50
|
+
Single keyframe: `fade-in` (pure opacity, 200ms). That is the only entrance. No translate, no scale, no marquee, no parallax, no ambient loops. Figures and callouts **appear** — they do not arrive.
|
|
51
|
+
|
|
52
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — wrapped in a media query in the single motion utility. Loop and ambient durations are zero by design; this direction rejects ambient motion entirely.
|
|
53
|
+
|
|
54
|
+
## Component patterns
|
|
55
|
+
- **Buttons:** text link primary by default — link-blue, no underline at rest, underline on hover. The single solid button per page (download-pdf, abstract-cta) is a ghost: 1px ink border with ink text, no fill. Filled solid buttons in primary color are one-of-one moments and **never carry gradient or shadow**.
|
|
56
|
+
- **Cards:** 1px hairline border, white fill against the slate bg, no shadow, 2px radius. Padding `p-6 lg:p-8`. Title in Inter 600 at body+1 size, label in mono uppercase 0.75rem above. Cards never carry color fill — color is reserved for inline code and link.
|
|
57
|
+
- **Inputs:** border-bottom only (1px `--border`). No full box. Label sits above in mono uppercase 0.75rem with letter-spacing `0.04em`. Focus thickens the border-bottom to 2px in `--ring` blue. Placeholder is italic in `--mutedForeground`.
|
|
58
|
+
- **CTA links:** inline text link in `--link`, underline on hover only. Section-level CTA is a hairline-bordered ghost button with ink text. **Never a chip, never a gradient, never a glow.** The link IS the design.
|
|
59
|
+
|
|
60
|
+
## Recommended rich media
|
|
61
|
+
This direction is hostile to glossy imagery. Lead media is **diagrams, charts, and figures** — never hero photography. Figures are flat 2D, single-line-weight, monochromatic with a single accent stroke in `--brand-link`. Think paradigm.xyz architecture diagrams or ethereum.org protocol illustrations. Charts are unfilled line charts on a white card with a 1px `--rule-strong` axis and JetBrains Mono labels.
|
|
62
|
+
|
|
63
|
+
**AI tool recommendations:** **Excalidraw** for hand-drawn-feel architecture diagrams (matches the technical-paper aesthetic). **D2** or **Mermaid** rendered with custom theme matching the slate palette for system diagrams. **Recharts** or **Observable Plot** for data viz — both support flat-fill, single-color, axis-only styling. Avoid Midjourney and Flux entirely — generative photography breaks the whitepaper feel instantly.
|
|
64
|
+
|
|
65
|
+
**Aspect ratios:** 16:9 for diagrams and architecture figures (matches whitepaper PDF figure conventions). Square 1:1 acceptable for small inline diagrams. Never 3:2 or 4:5 — those signal editorial photography, which this direction rejects.
|
|
66
|
+
|
|
67
|
+
**Video:** disallowed by default. Research papers don't autoplay. If a demo video is essential, embed as a static poster image with a play-button overlay that opens the video in a new tab — never inline autoplay.
|
|
68
|
+
|
|
69
|
+
**Performance:** every figure must be inline SVG or AVIF ≤30 KB. The page should weigh under 200 KB total. LCP under 1.5s. If a figure pushes past 50 KB, it is too detailed — simplify the diagram.
|
|
70
|
+
|
|
71
|
+
**Avoid:** all stock photography, 3D renders, gradient backgrounds, glassmorphic surfaces, holographic textures, generative AI photography, lens flare, particle systems, animated GIFs, blockchain-glyph clipart (purple-and-orange node-graph nonsense), NFT-aesthetic anything. This direction is the **explicit antidote** to onchain visual language.
|
|
72
|
+
|
|
73
|
+
**Accessibility:** every figure has a full prose caption that reproduces the diagram's claim in words. Diagrams must work as text descriptions. Alt-text follows the same standard.
|
|
74
|
+
|
|
75
|
+
## Component families
|
|
76
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established.
|
|
77
|
+
|
|
78
|
+
## Details
|
|
79
|
+
- **Selection:** `hsl(var(--brand-link) / 0.15)` background — pale link-blue wash, academic-highlighter feel.
|
|
80
|
+
- **Focus ring:** `2px solid hsl(var(--ring))` in link-blue. Visible but not loud.
|
|
81
|
+
- **Scrollbar:** thin — matches the hairline rule language.
|
|
82
|
+
|
|
83
|
+
## Exceptions
|
|
84
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason. The Director's consistency pass lists all exceptions for human review.
|
|
85
|
+
|
|
86
|
+
## Revisions
|
|
87
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const web3Restraint: Direction = {
|
|
4
|
+
name: "web3-restraint",
|
|
5
|
+
ethos:
|
|
6
|
+
"Ethereum Foundation slate · Vitalik blog hairlines · paradigm.xyz mono grid · a16z report formality · Allium docs technical-paper restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "ethereum.org", trait: "slate grey neutrals, Inter body, sparse chrome" },
|
|
9
|
+
{ brand: "Vitalik blog (vitalik.eth.limo)", trait: "serif body, hairline rules, near-zero ornament" },
|
|
10
|
+
{ brand: "paradigm.xyz", trait: "monospace prominence, black-on-white, structured grid" },
|
|
11
|
+
{ brand: "a16z crypto reports", trait: "formal layout, restrained color, two-column whitepaper" },
|
|
12
|
+
{ brand: "Allium Labs docs", trait: "light gray surfaces, JetBrains Mono for code and labels" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"The opposite of crypto-onchain. A whitepaper, not a launch page. " +
|
|
16
|
+
"Monospace labels, hairline rules, two near-blacks, one near-paper, no gradient and no glow. " +
|
|
17
|
+
"Color is reserved for inline code, links, and the rare diagram callout. The page reads like a footnote in a research index.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Inter",
|
|
22
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
|
|
23
|
+
from: "ethereum.org display — Inter sized restrained, never above 3rem; the headline is information, not a banner",
|
|
24
|
+
googleFont: "Inter",
|
|
25
|
+
weights: [400, 500, 600],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Source Serif Pro",
|
|
29
|
+
fallback: ["Iowan Old Style", "Georgia", "serif"],
|
|
30
|
+
from: "Vitalik blog body — readable serif at long-form length, paired with sans display and mono labels",
|
|
31
|
+
googleFont: "Source+Serif+Pro",
|
|
32
|
+
weights: [400, 600],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["IBM Plex Mono", "SF Mono", "ui-monospace", "Menlo", "monospace"],
|
|
37
|
+
from: "paradigm.xyz / Allium docs — mono is a first-class face for labels, addresses, and section markers",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500, 700],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.01em", // Inter at display size sits tight, not negative-aggressive
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"tnum", "zero", "ss01"', // tabular figures + slashed zero — whitepaper convention
|
|
47
|
+
h1ScaleClamp: "clamp(1.75rem, 3.5vw, 2.5rem)", // restrained — Vitalik's blog H1 is ~2rem
|
|
48
|
+
bodyBaseSize: "1rem", // 16px — paradigm and ethereum.org default
|
|
49
|
+
bodyLineHeight: "1.65", // research-paper leading
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "210 17% 98%", from: "near-paper slate — ethereum.org page bg, the lightest cool gray that still reads as paper" },
|
|
54
|
+
foreground: { hsl: "215 25% 15%", from: "deep slate ink — paradigm.xyz body color, near-black with cool bias" },
|
|
55
|
+
card: { hsl: "0 0% 100%", from: "pure white card — sits one tier above the slate background, no warm tint" },
|
|
56
|
+
popover: { hsl: "0 0% 100%", from: "same as card; depth from hairline border only" },
|
|
57
|
+
primary: { hsl: "215 25% 15%", from: "same as foreground — link and primary share the ink color, paradigm.xyz convention" },
|
|
58
|
+
primaryForeground: { hsl: "210 17% 98%", from: "paper on ink — used only for the rare solid button" },
|
|
59
|
+
secondary: { hsl: "210 14% 94%", from: "Allium Labs docs sidebar gray — secondary surfaces, one tier above bg" },
|
|
60
|
+
secondaryForeground: { hsl: "215 25% 15%", from: "ink on secondary slate" },
|
|
61
|
+
muted: { hsl: "210 14% 94%", from: "same as secondary — restraint refuses to invent extra grays" },
|
|
62
|
+
mutedForeground: { hsl: "215 12% 42%", from: "ethereum.org caption gray — bylines, footnotes, table meta" },
|
|
63
|
+
accent: { hsl: "210 14% 94%", from: "same as secondary — hover state, no new hue" },
|
|
64
|
+
accentForeground: { hsl: "215 25% 15%", from: "ink on hover" },
|
|
65
|
+
border: { hsl: "215 16% 88%", from: "hairline slate — Vitalik blog rule color, barely visible at 1px" },
|
|
66
|
+
input: { hsl: "215 16% 88%", from: "same as border — inputs read as hairline-ruled fields, never filled boxes" },
|
|
67
|
+
ring: { hsl: "212 80% 45%", from: "= brand.link — focus and link share the only chromatic accent in the palette" },
|
|
68
|
+
destructive: { hsl: "358 65% 42%", from: "academic-paper alert red — distinct from link blue, not saturated" },
|
|
69
|
+
destructiveForeground: { hsl: "210 17% 98%", from: "paper on alert" },
|
|
70
|
+
brand: {
|
|
71
|
+
ink: { hsl: "215 25% 15%", from: "= foreground; deep slate ink, also semantic for primary text" },
|
|
72
|
+
paper: { hsl: "210 17% 98%", from: "= background; near-paper slate" },
|
|
73
|
+
"ink-soft": { hsl: "215 18% 28%", from: "subheadings and lead paragraphs — one tier above body ink" },
|
|
74
|
+
link: { hsl: "212 80% 45%", from: "ethereum.org link blue — the only real color in the palette, used for href and focus" },
|
|
75
|
+
"code-bg": { hsl: "210 16% 96%", from: "Allium docs inline-code surface — flatter than card, sits under JetBrains Mono" },
|
|
76
|
+
"rule-strong": { hsl: "215 20% 70%", from: "paradigm.xyz section-rule gray — stronger than border, used for figure separators" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
spacing: {
|
|
81
|
+
base: 4,
|
|
82
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96], // medium — whitepaper rhythm, not luxury
|
|
83
|
+
containerMax: "max-w-3xl", // 768px reading column — paradigm.xyz body width
|
|
84
|
+
containerPadding: "px-4 lg:px-8",
|
|
85
|
+
sectionPadding: {
|
|
86
|
+
hero: "pt-16 pb-10 lg:pt-24 lg:pb-16", // the abstract is the hero, not a banner
|
|
87
|
+
default: "py-16 lg:py-24",
|
|
88
|
+
tight: "py-10 lg:py-14",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
radius: {
|
|
93
|
+
base: "0.125rem", // 2px — barely-there rounding, paradigm.xyz button feel
|
|
94
|
+
pillsAllowed: false, // no pills — they read web-app, not research-paper
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
shadows: {
|
|
98
|
+
style: "minimal",
|
|
99
|
+
utilities: {
|
|
100
|
+
"hairline-top":
|
|
101
|
+
"0 -1px 0 0 hsl(var(--border))", // section divider rule, top edge
|
|
102
|
+
"hairline-bottom":
|
|
103
|
+
"0 1px 0 0 hsl(var(--border))", // section divider rule, bottom edge
|
|
104
|
+
"rule-strong":
|
|
105
|
+
"0 1px 0 0 hsl(var(--brand-rule-strong))", // figure separator, slightly heavier than hairline
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
motion: {
|
|
110
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
111
|
+
durations: {
|
|
112
|
+
reveal: 200, // brief, technical — no slow fades
|
|
113
|
+
loop: 0, // no loops — research papers don't pulse
|
|
114
|
+
ambient: 0, // no ambient motion
|
|
115
|
+
},
|
|
116
|
+
keyframes: {
|
|
117
|
+
"fade-in": {
|
|
118
|
+
css:
|
|
119
|
+
"from { opacity: 0; }\n" +
|
|
120
|
+
"to { opacity: 1; }",
|
|
121
|
+
defaultDuration: 200,
|
|
122
|
+
iteration: "once",
|
|
123
|
+
purpose: "the only entrance — pure opacity, no translate, no scale; figures and callouts appear, they do not arrive",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
respectsReducedMotion: true,
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
density: "medium",
|
|
130
|
+
|
|
131
|
+
patterns: {
|
|
132
|
+
button:
|
|
133
|
+
"Text link primary by default — link-blue, no underline at rest, underline on hover. " +
|
|
134
|
+
"The single solid button per page (the abstract CTA, the download-pdf) renders as a 1px ink border with ink text, no fill. " +
|
|
135
|
+
"Filled solid buttons in primary color are reserved for one-of-one moments and never carry gradient or shadow.",
|
|
136
|
+
card:
|
|
137
|
+
"1px hairline border, white fill against the slate bg, no shadow, 2px radius. " +
|
|
138
|
+
"Internal padding p-6 lg:p-8. Title in Inter 600 at body-+1 size, label in mono uppercase 0.75rem above. " +
|
|
139
|
+
"Cards never carry color fill — color is reserved for inline code and link.",
|
|
140
|
+
input:
|
|
141
|
+
"Border-bottom only (1px --border). No full box. Label sits above in mono uppercase 0.75rem with letter-spacing 0.04em. " +
|
|
142
|
+
"Focus thickens the border-bottom to 2px in --ring blue. Placeholder is italic in mutedForeground.",
|
|
143
|
+
cta:
|
|
144
|
+
"Inline text link in --link, underline on hover only. Section-level CTA is a hairline-bordered ghost button with ink text. " +
|
|
145
|
+
"Never a chip, never a gradient, never a glow. The link IS the design.",
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
details: {
|
|
149
|
+
selectionBg: "hsl(var(--brand-link) / 0.15)", // pale link-blue wash — academic highlighter
|
|
150
|
+
selectionFg: "hsl(var(--foreground))",
|
|
151
|
+
focusRing: "2px solid hsl(var(--ring))", // 2px solid in link-blue — visible but not loud
|
|
152
|
+
scrollbarStyle: "thin", // thin slate scrollbar matches the hairline language
|
|
153
|
+
},
|
|
154
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Design Direction — Wellness-Active
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Strava signal-orange · Whoop recovery-green · Peloton matte-black · Garmin tabular density · Athletic Greens premium cream
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Dark cinematic canvas with one electric signal color burning through each section. Oversized metric numerals — PRs, heart-rate zones, strain scores — set in tabular mono. Body-in-motion photography, kinetic graph reveals, a dashboard that reads like a podium. This is the "I just hit a PR" aesthetic: performance and recovery treated as twin disciplines.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Strava** → signal-orange on near-black, map-and-data hero. Orange is THE activity color; it shows up once per section and means *effort logged*.
|
|
11
|
+
- **Whoop** → deep graphite black, signal-green recovery state, ring-and-graph hero. Recovery is its own semantic color, never decorative.
|
|
12
|
+
- **Peloton** → matte black canvas, signal-red urgency, cinematic instructor portraits with ken-burns drift.
|
|
13
|
+
- **Garmin Connect** → dark dashboard, signal-blue HUD plots, dense tabular health data with tabular-num mono.
|
|
14
|
+
- **Athletic Greens** → warm cream foreground on dark — the premium-supplement off-white that keeps the brand from feeling cheap-tech.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
|
|
18
|
+
|
|
19
|
+
Surface stack is **graphite black** (background) → one stop up (card) → two stops up (popover) → matte-steel (secondary/muted/accent). Depth comes from hairline borders plus a single `card-lift` drop shadow for metric tiles.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--signal-orange`, `--recovery-green`, `--strain-blue`, `--zone-yellow`, `--cream`, `--graphite`. Primary is Strava signal-orange; recovery actions (sleep, rest, mark complete) swap to recovery-green as a semantic — never a stylistic — choice.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Archivo (Strava/Whoop modern grotesque). h1–h4, broad caps, athletic stance at weight 800. Tracking `-0.02em` — big display tightens at scale.
|
|
25
|
+
- **Body:** Inter (Garmin/Peloton clean UI sans). Body base **16px** with **line-height 1.55** — this is a dashboard, not a magazine.
|
|
26
|
+
- **Mono:** JetBrains Mono. Tabular numerics for splits, BPM, watts, recovery % — instrument-cluster heritage.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(3.5rem, 11vw, 9rem)` — oversized because *the metric is the headline*. PR numbers, total miles, recovery scores get the full Archivo display treatment. Numbers always use `font-variant-numeric: tabular-nums`. Font features: `"tnum"`, `"ss01"`, `"cv11"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-6 lg:px-10` — wide. Graphs and split-tables need horizontal room.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-20 pb-12 lg:pt-32 lg:pb-20`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128. No arbitrary spacing.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens.
|
|
40
|
+
|
|
41
|
+
The signal-orange rule: **one signal color burns per section**, and it is almost always orange. Recovery-green is reserved for explicit recovery semantics (sleep score, rest day, completed-and-cooled-down). Strain-blue and zone-yellow live in graph plots only — they describe data, they do not decorate UI.
|
|
42
|
+
|
|
43
|
+
Pure white and pure black are forbidden. `--cream` (warm Athletic Greens off-white) replaces white. `--graphite` (Whoop deep black with a slight blue bias) replaces black.
|
|
44
|
+
|
|
45
|
+
## Radius
|
|
46
|
+
`--radius: 0.5rem`. Soft enough for metric tiles, never pillow. Pills ARE allowed (`pillsAllowed: true`) — zone tags, activity-type chips and heart-rate badges read as pills because that's the established sport-tech convention.
|
|
47
|
+
|
|
48
|
+
## Shadows
|
|
49
|
+
**Glow.** Three utilities:
|
|
50
|
+
- `.glow-signal` — orange glow, used for active live-session tiles
|
|
51
|
+
- `.glow-recovery` — green glow, used for recovery/rest tiles
|
|
52
|
+
- `.card-lift` — neutral drop shadow for default metric tiles, no color tint
|
|
53
|
+
|
|
54
|
+
Drop shadows lean dark (HSL 220 14% 0%) because the canvas is graphite — light-tinted shadows would muddy.
|
|
55
|
+
|
|
56
|
+
## Motion
|
|
57
|
+
Six keyframes — this direction is animated because dashboards perform:
|
|
58
|
+
- `metric-count` (700ms) — the headline number rises into place before its label
|
|
59
|
+
- `graph-trace` (1600ms) — SVG line-graph draws left-to-right on enter
|
|
60
|
+
- `heartbeat` (1800ms, infinite) — live-session BPM dot pulses in a real cardiac rhythm, *not* a sine wave
|
|
61
|
+
- `strain-ring` (1400ms) — Whoop-style circular progress ring fills to current value
|
|
62
|
+
- `ken-burns-hero` (18000ms, infinite) — Peloton instructor portrait drift
|
|
63
|
+
- `pulse-signal` (2200ms, infinite) — single start-workout CTA heartbeat ring
|
|
64
|
+
|
|
65
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored in every utility — heartbeat collapses to a static dot, graph-trace shows instantly, ken-burns disables.
|
|
66
|
+
|
|
67
|
+
## Component patterns
|
|
68
|
+
- **Buttons:** primary = signal-orange filled rectangle, graphite text, uppercase tracking `0.08em` label. Secondary = transparent + 1px border, cream text, hover lifts to `--accent`. Tertiary = signal-orange text-link with underline-on-hover. Recovery actions use recovery-green fill — semantic, not stylistic.
|
|
69
|
+
- **Cards:** `0.5rem` radius, hairline border, bg-card. Padding `p-6 lg:p-8`. Headline metric in oversized Archivo display, label in mono uppercase tracking `0.1em`. Live-session cards use `glow-signal`; recovery cards use `glow-recovery`; default tiles use `card-lift`.
|
|
70
|
+
- **Inputs:** full box, 1px `--border`, `0.5rem` radius. Label above in mono uppercase tracking `0.08em`. Focus ring is signal-orange, 2px. Units (bpm, kg, km) live in a mono suffix slot inside the input.
|
|
71
|
+
- **CTA:** hero start-workout button uses `pulse-signal` — one per page only. Inline CTAs are signal-orange text-links. **Never a green primary** unless it is semantically a recovery action.
|
|
72
|
+
|
|
73
|
+
## Recommended rich media
|
|
74
|
+
Wellness-Active leans on **body-in-motion photography**: silhouettes against sunrise, mid-stride runners, weight-room shadows, peloton riders shot from low angles with rim light. Color-grade toward **Kodak Vision3 500T with crushed shadows and warm highlights** — cinematic athletic, never glossy stock. Instructor portraits should feel Peloton-cinematic: shallow depth, ambient gym backlight, mid-effort breath captured.
|
|
75
|
+
|
|
76
|
+
Data visualization is first-class media in this direction. Heart-rate plots, strain rings, split tables, calendar heatmaps, route polylines — these *are* the imagery. SVG line plots use 2px strokes in signal-orange, strain-blue or zone-yellow depending on what's measured. Route maps render in Mapbox dark style with a 3px signal-orange polyline.
|
|
77
|
+
|
|
78
|
+
**AI tool recommendations:** **Midjourney / Flux** prompts like *"athlete mid-stride at dawn, low rim light, Kodak Vision3 500T, shallow depth of field, cinematic"* for hero photography; *"Peloton instructor portrait, gym backlight, anamorphic lens flare suppressed, 50mm"* for portraiture. Avoid anything that reads "stock fitness model on white background" — the canvas is dark, the energy is *during* the workout, not the marketing shoot.
|
|
79
|
+
|
|
80
|
+
**Aspect ratios:** 21:9 cinematic for hero (Peloton/Strava cover-shot convention); 4:5 portrait for instructor cards; 16:9 for embedded session replays. Never 1:1 square (Instagram fitness influencer territory, wrong feel).
|
|
81
|
+
|
|
82
|
+
**Video:** loops are welcome but kept silent and short — autoplay muted, ≤6s, AV1 ≤2 MB. Ken-burns on a still is preferable to actual video where the still does the job. Hero session-replays use a poster image and click-to-play, never autoplay sound.
|
|
83
|
+
|
|
84
|
+
**Performance:** hero AVIF ≤200 KB at 2400w; instructor cards ≤90 KB; SVG plot data inlined (≤8 KB). LCP under 2s. Dark backgrounds tolerate higher JPEG compression than light — exploit that.
|
|
85
|
+
|
|
86
|
+
**Avoid:** generic stock fitness photography (smiling on white), gradient overlays on photos (we use color grade, not CSS gradient), kale-and-yoga-mat lifestyle stock (that's a different wellness aesthetic), pastel illustration (this is hard signal, not soft).
|
|
87
|
+
|
|
88
|
+
**Accessibility:** all data viz needs a tabular fallback view. A line plot must also exist as a sortable table. Color is never the only signal — recovery-green status always pairs with a "Recovered" text label. Long-form alt-text for hero photography: describe the action, not the brand.
|
|
89
|
+
|
|
90
|
+
## Component families
|
|
91
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. Expect early conventions around `<MetricTile>`, `<HeartRatePlot>`, `<StrainRing>`, `<SessionCard>`.
|
|
92
|
+
|
|
93
|
+
## Details
|
|
94
|
+
- **Selection:** `hsl(var(--signal-orange) / 0.35)` background, foreground text.
|
|
95
|
+
- **Focus ring:** `2px solid hsl(var(--ring))` — thicker than editorial, this is a touch-and-tap dashboard.
|
|
96
|
+
- **Scrollbar:** thin.
|
|
97
|
+
|
|
98
|
+
## Exceptions
|
|
99
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
100
|
+
|
|
101
|
+
## Revisions
|
|
102
|
+
- Initial direction, generated at install time.
|