@stylecrib/cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -9
- package/agents/MANIFEST.yml +136 -0
- package/agents/README.md +75 -0
- package/agents/art-director.md +168 -0
- package/agents/audacity-director.md +109 -0
- package/agents/brand-identity.md +179 -0
- package/agents/brand-precedent.md +119 -0
- package/agents/brief-enforcer.md +136 -0
- package/agents/component-qa.md +167 -0
- package/agents/cto.md +49 -0
- package/agents/design-director.md +184 -0
- package/agents/design-systems-engineer.md +162 -0
- package/agents/direction-curator.md +133 -0
- package/agents/homogeneity-detector.md +104 -0
- package/agents/logo-designer.md +240 -0
- package/agents/marketing-designer.md +156 -0
- package/agents/media-curator.md +165 -0
- package/agents/motion-engineer.md +270 -0
- package/agents/qa-conductor.md +143 -0
- package/agents/render-qa.md +133 -0
- package/agents/upgrade-simulator.md +123 -0
- package/agents/vp-architecture.md +49 -0
- package/agents/vp-engineering.md +49 -0
- package/dist/index.js +1577 -463
- package/package.json +11 -4
- package/themes/README.md +70 -0
- package/themes/acrylic-soft/THEME.md +142 -0
- package/themes/acrylic-soft/tokens.ts +180 -0
- package/themes/agency-creative/THEME.md +91 -0
- package/themes/agency-creative/tokens.ts +202 -0
- package/themes/agency-portfolio/THEME.md +109 -0
- package/themes/agency-portfolio/tokens.ts +159 -0
- package/themes/ai-startup/THEME.md +95 -0
- package/themes/ai-startup/tokens.ts +162 -0
- package/themes/airline-modern/THEME.md +104 -0
- package/themes/airline-modern/tokens.ts +179 -0
- package/themes/arc-stack/.anchor-render.png +0 -0
- package/themes/arc-stack/THEME.md +125 -0
- package/themes/arc-stack/audit.log.jsonl +6 -0
- package/themes/arc-stack/dismissals.jsonl +3 -0
- package/themes/arc-stack/tailwind.snippet.ts +17 -0
- package/themes/arc-stack/theme.yml +153 -0
- package/themes/arc-stack/tokens.ts +29 -0
- package/themes/architectural/THEME.md +102 -0
- package/themes/architectural/tokens.ts +159 -0
- package/themes/atelier-radiance/THEME.md +93 -0
- package/themes/atelier-radiance/audit.log.jsonl +1 -0
- package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
- package/themes/atelier-radiance/theme.yml +130 -0
- package/themes/atelier-radiance/tokens.ts +29 -0
- package/themes/automotive-ev/THEME.md +87 -0
- package/themes/automotive-ev/tokens.ts +183 -0
- package/themes/automotive-luxury/THEME.md +88 -0
- package/themes/automotive-luxury/tokens.ts +175 -0
- package/themes/baby-modern/THEME.md +79 -0
- package/themes/baby-modern/tokens.ts +184 -0
- package/themes/banking-gravity/THEME.md +171 -0
- package/themes/banking-gravity/tokens.ts +169 -0
- package/themes/beauty-clean/THEME.md +92 -0
- package/themes/beauty-clean/tokens.ts +176 -0
- package/themes/beauty-luxury/THEME.md +96 -0
- package/themes/beauty-luxury/tokens.ts +178 -0
- package/themes/bento-modular/.anchor-render.png +0 -0
- package/themes/bento-modular/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -0
- package/themes/bento-modular/audit.log.jsonl +3 -0
- package/themes/bento-modular/dismissals.jsonl +1 -0
- package/themes/bento-modular/tailwind.snippet.ts +17 -0
- package/themes/bento-modular/theme.yml +83 -0
- package/themes/bento-modular/tokens.ts +27 -0
- package/themes/bookstore-indie/THEME.md +78 -0
- package/themes/bookstore-indie/tokens.ts +147 -0
- package/themes/brutalist/THEME.md +96 -0
- package/themes/brutalist/tokens.ts +151 -0
- package/themes/business-tiles/THEME.md +141 -0
- package/themes/business-tiles/tokens.ts +178 -0
- package/themes/cabana-poster/THEME.md +158 -0
- package/themes/cabana-poster/audit.log.jsonl +1 -0
- package/themes/cabana-poster/tailwind.snippet.ts +16 -0
- package/themes/cabana-poster/theme.yml +221 -0
- package/themes/cabana-poster/tokens.ts +34 -0
- package/themes/case-panel/THEME.md +126 -0
- package/themes/case-panel/audit.log.jsonl +2 -0
- package/themes/case-panel/tailwind.snippet.ts +15 -0
- package/themes/case-panel/theme.yml +153 -0
- package/themes/case-panel/tokens.ts +28 -0
- package/themes/cinematic-dark/THEME.md +97 -0
- package/themes/cinematic-dark/tokens.ts +195 -0
- package/themes/classic-car/THEME.md +86 -0
- package/themes/classic-car/tokens.ts +173 -0
- package/themes/cloud-friendly/THEME.md +152 -0
- package/themes/cloud-friendly/tokens.ts +181 -0
- package/themes/community-niche/THEME.md +102 -0
- package/themes/community-niche/tokens.ts +177 -0
- package/themes/corporate-grid/THEME.md +154 -0
- package/themes/corporate-grid/tokens.ts +182 -0
- package/themes/couture-luxury/THEME.md +85 -0
- package/themes/couture-luxury/tokens.ts +146 -0
- package/themes/creator-social/THEME.md +131 -0
- package/themes/creator-social/tokens.ts +249 -0
- package/themes/crypto-onchain/THEME.md +100 -0
- package/themes/crypto-onchain/tokens.ts +207 -0
- package/themes/cycling-brand/THEME.md +78 -0
- package/themes/cycling-brand/tokens.ts +185 -0
- package/themes/dating-friendly/THEME.md +102 -0
- package/themes/dating-friendly/tokens.ts +178 -0
- package/themes/dense-utility/THEME.md +85 -0
- package/themes/dense-utility/tokens.ts +155 -0
- package/themes/devtool-cli/THEME.md +100 -0
- package/themes/devtool-cli/tokens.ts +195 -0
- package/themes/devtool-docs/THEME.md +105 -0
- package/themes/devtool-docs/tokens.ts +177 -0
- package/themes/editorial/THEME.md +129 -0
- package/themes/editorial/audit.log.jsonl +2 -0
- package/themes/editorial/tailwind.snippet.ts +15 -0
- package/themes/editorial/theme.yml +173 -0
- package/themes/editorial/tokens.ts +29 -0
- package/themes/education-formal/THEME.md +154 -0
- package/themes/education-formal/audit.log.jsonl +1 -0
- package/themes/education-formal/tailwind.snippet.ts +15 -0
- package/themes/education-formal/theme.yml +186 -0
- package/themes/education-formal/tokens.ts +29 -0
- package/themes/education-warm/THEME.md +91 -0
- package/themes/education-warm/tokens.ts +185 -0
- package/themes/ember-poster/README.md +79 -0
- package/themes/ember-poster/THEME.md +101 -0
- package/themes/ember-poster/audit.log.jsonl +17 -0
- package/themes/ember-poster/package.json +34 -0
- package/themes/ember-poster/tailwind.snippet.ts +17 -0
- package/themes/ember-poster/theme.yml +109 -0
- package/themes/ember-poster/tokens.ts +27 -0
- package/themes/enterprise-cloud/THEME.md +139 -0
- package/themes/enterprise-cloud/tokens.ts +179 -0
- package/themes/enterprise-tech/.anchor-render.png +0 -0
- package/themes/enterprise-tech/THEME.md +167 -0
- package/themes/enterprise-tech/audit.log.jsonl +1 -0
- package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
- package/themes/enterprise-tech/theme.yml +202 -0
- package/themes/enterprise-tech/tokens.ts +29 -0
- package/themes/ev-charging/THEME.md +94 -0
- package/themes/ev-charging/tokens.ts +185 -0
- package/themes/farm-direct/THEME.md +92 -0
- package/themes/farm-direct/tokens.ts +180 -0
- package/themes/fintech-card/THEME.md +96 -0
- package/themes/fintech-card/tokens.ts +191 -0
- package/themes/fintech-trust/THEME.md +94 -0
- package/themes/fintech-trust/tokens.ts +192 -0
- package/themes/food-blog/THEME.md +98 -0
- package/themes/food-blog/tokens.ts +183 -0
- package/themes/forum-classic/THEME.md +100 -0
- package/themes/forum-classic/tokens.ts +168 -0
- package/themes/fresh-plate/.anchor-render.png +0 -0
- package/themes/fresh-plate/THEME.md +144 -0
- package/themes/fresh-plate/audit.log.jsonl +2 -0
- package/themes/fresh-plate/dismissals.jsonl +3 -0
- package/themes/fresh-plate/tailwind.snippet.ts +16 -0
- package/themes/fresh-plate/theme.yml +189 -0
- package/themes/fresh-plate/tokens.ts +30 -0
- package/themes/furniture-modern/THEME.md +94 -0
- package/themes/furniture-modern/tokens.ts +176 -0
- package/themes/gaming-esports/THEME.md +146 -0
- package/themes/gaming-esports/tokens.ts +199 -0
- package/themes/gaming-streamer/THEME.md +139 -0
- package/themes/gaming-streamer/tokens.ts +201 -0
- package/themes/glassmorphic-modern/THEME.md +119 -0
- package/themes/glassmorphic-modern/tokens.ts +174 -0
- package/themes/government-civic/THEME.md +138 -0
- package/themes/government-civic/tokens.ts +164 -0
- package/themes/gym-chain/THEME.md +79 -0
- package/themes/gym-chain/tokens.ts +196 -0
- package/themes/healthcare-bright/THEME.md +95 -0
- package/themes/healthcare-bright/tokens.ts +184 -0
- package/themes/home-decor/THEME.md +94 -0
- package/themes/home-decor/tokens.ts +177 -0
- package/themes/hotel-boutique/THEME.md +110 -0
- package/themes/hotel-boutique/tokens.ts +179 -0
- package/themes/hyperminimal-mono/THEME.md +91 -0
- package/themes/hyperminimal-mono/tokens.ts +150 -0
- package/themes/indie-art-game/THEME.md +107 -0
- package/themes/indie-art-game/tokens.ts +216 -0
- package/themes/insurance-legacy/THEME.md +101 -0
- package/themes/insurance-legacy/tokens.ts +182 -0
- package/themes/insurance-modern/THEME.md +103 -0
- package/themes/insurance-modern/tokens.ts +192 -0
- package/themes/kaiju-reveal/THEME.md +97 -0
- package/themes/kaiju-reveal/tokens.ts +185 -0
- package/themes/kinetic-data/THEME.md +172 -0
- package/themes/kinetic-data/audit.log.jsonl +1 -0
- package/themes/kinetic-data/tailwind.snippet.ts +16 -0
- package/themes/kinetic-data/theme.yml +207 -0
- package/themes/kinetic-data/tokens.ts +30 -0
- package/themes/kinetic-headline/.anchor-render.png +0 -0
- package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -0
- package/themes/kinetic-headline/audit.log.jsonl +4 -0
- package/themes/kinetic-headline/dismissals.jsonl +1 -0
- package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
- package/themes/kinetic-headline/theme.yml +81 -0
- package/themes/kinetic-headline/tokens.ts +26 -0
- package/themes/law-firm/THEME.md +108 -0
- package/themes/law-firm/tokens.ts +158 -0
- package/themes/lawtech-modern/THEME.md +107 -0
- package/themes/lawtech-modern/tokens.ts +192 -0
- package/themes/linkedin-pro/THEME.md +102 -0
- package/themes/linkedin-pro/tokens.ts +174 -0
- package/themes/logistics-modern/THEME.md +94 -0
- package/themes/logistics-modern/tokens.ts +187 -0
- package/themes/magazine-glossy/THEME.md +74 -0
- package/themes/magazine-glossy/tokens.ts +158 -0
- package/themes/marker-mag/THEME.md +128 -0
- package/themes/marker-mag/audit.log.jsonl +1 -0
- package/themes/marker-mag/tailwind.snippet.ts +15 -0
- package/themes/marker-mag/theme.yml +159 -0
- package/themes/marker-mag/tokens.ts +27 -0
- package/themes/marketplace-modern/THEME.md +135 -0
- package/themes/marketplace-modern/tokens.ts +186 -0
- package/themes/marketplace-vintage/THEME.md +110 -0
- package/themes/marketplace-vintage/tokens.ts +185 -0
- package/themes/maximalist/THEME.md +96 -0
- package/themes/maximalist/tokens.ts +168 -0
- package/themes/mid-century/THEME.md +109 -0
- package/themes/mid-century/tokens.ts +162 -0
- package/themes/motorcycle-brand/THEME.md +86 -0
- package/themes/motorcycle-brand/tokens.ts +174 -0
- package/themes/museum/THEME.md +83 -0
- package/themes/museum/tokens.ts +147 -0
- package/themes/music-streaming/THEME.md +101 -0
- package/themes/music-streaming/tokens.ts +187 -0
- package/themes/music-vinyl/THEME.md +98 -0
- package/themes/music-vinyl/tokens.ts +167 -0
- package/themes/nature-distilled/.anchor-render.png +0 -0
- package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -0
- package/themes/nature-distilled/audit.log.jsonl +2 -0
- package/themes/nature-distilled/tailwind.snippet.ts +16 -0
- package/themes/nature-distilled/theme.yml +91 -0
- package/themes/nature-distilled/tokens.ts +26 -0
- package/themes/news-tabloid/THEME.md +72 -0
- package/themes/news-tabloid/tokens.ts +158 -0
- package/themes/news-tech/THEME.md +75 -0
- package/themes/news-tech/tokens.ts +149 -0
- package/themes/newsletter/THEME.md +82 -0
- package/themes/newsletter/tokens.ts +138 -0
- package/themes/newspaper-classic/THEME.md +74 -0
- package/themes/newspaper-classic/tokens.ts +159 -0
- package/themes/nonprofit-arts/THEME.md +78 -0
- package/themes/nonprofit-arts/tokens.ts +157 -0
- package/themes/nonprofit-warm/THEME.md +105 -0
- package/themes/nonprofit-warm/tokens.ts +188 -0
- package/themes/outdoor-adventure/THEME.md +113 -0
- package/themes/outdoor-adventure/tokens.ts +181 -0
- package/themes/overland-broadside/THEME.md +119 -0
- package/themes/overland-broadside/audit.log.jsonl +1 -0
- package/themes/overland-broadside/tailwind.snippet.ts +17 -0
- package/themes/overland-broadside/theme.yml +138 -0
- package/themes/overland-broadside/tokens.ts +27 -0
- package/themes/performance-engineered/THEME.md +162 -0
- package/themes/performance-engineered/audit.log.jsonl +1 -0
- package/themes/performance-engineered/tailwind.snippet.ts +15 -0
- package/themes/performance-engineered/theme.yml +193 -0
- package/themes/performance-engineered/tokens.ts +29 -0
- package/themes/pet-food/THEME.md +78 -0
- package/themes/pet-food/tokens.ts +185 -0
- package/themes/pharma-clinical/THEME.md +164 -0
- package/themes/pharma-clinical/audit.log.jsonl +1 -0
- package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
- package/themes/pharma-clinical/theme.yml +201 -0
- package/themes/pharma-clinical/tokens.ts +29 -0
- package/themes/pill-editorial/THEME.md +125 -0
- package/themes/pill-editorial/audit.log.jsonl +1 -0
- package/themes/pill-editorial/tailwind.snippet.ts +15 -0
- package/themes/pill-editorial/theme.yml +168 -0
- package/themes/pill-editorial/tokens.ts +31 -0
- package/themes/podcast-warm/THEME.md +103 -0
- package/themes/podcast-warm/tokens.ts +192 -0
- package/themes/publisher-indie/THEME.md +78 -0
- package/themes/publisher-indie/tokens.ts +148 -0
- package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
- package/themes/raw-concrete/THEME.md +76 -0
- package/themes/raw-concrete/audit.log.jsonl +10 -0
- package/themes/raw-concrete/tailwind.snippet.ts +16 -0
- package/themes/raw-concrete/theme.yml +88 -0
- package/themes/raw-concrete/tokens.ts +27 -0
- package/themes/realestate-luxury/THEME.md +94 -0
- package/themes/realestate-luxury/tokens.ts +169 -0
- package/themes/realestate-marketplace/THEME.md +106 -0
- package/themes/realestate-marketplace/tokens.ts +183 -0
- package/themes/restaurant-modern/THEME.md +109 -0
- package/themes/restaurant-modern/tokens.ts +172 -0
- package/themes/runway-fashion/THEME.md +99 -0
- package/themes/runway-fashion/tokens.ts +167 -0
- package/themes/saturday-morning/THEME.md +117 -0
- package/themes/saturday-morning/tokens.ts +281 -0
- package/themes/schema.ts +235 -0
- package/themes/signal-dark/BUILD_BRIEF.md +168 -0
- package/themes/signal-dark/THEME.md +107 -0
- package/themes/signal-dark/tokens.ts +181 -0
- package/themes/soft-modern/THEME.md +91 -0
- package/themes/soft-modern/tokens.ts +166 -0
- package/themes/solar-residential/THEME.md +92 -0
- package/themes/solar-residential/tokens.ts +176 -0
- package/themes/sports-league/THEME.md +180 -0
- package/themes/sports-league/audit.log.jsonl +1 -0
- package/themes/sports-league/tailwind.snippet.ts +15 -0
- package/themes/sports-league/theme.yml +213 -0
- package/themes/sports-league/tokens.ts +32 -0
- package/themes/stadium-sport/THEME.md +114 -0
- package/themes/stadium-sport/tokens.ts +187 -0
- package/themes/streetwear-hype/THEME.md +100 -0
- package/themes/streetwear-hype/tokens.ts +174 -0
- package/themes/studio-architect/THEME.md +108 -0
- package/themes/studio-architect/tokens.ts +162 -0
- package/themes/studio-photographer/THEME.md +88 -0
- package/themes/studio-photographer/tokens.ts +164 -0
- package/themes/team-kanban/.anchor-render.png +0 -0
- package/themes/team-kanban/THEME.md +167 -0
- package/themes/team-kanban/audit.log.jsonl +2 -0
- package/themes/team-kanban/dismissals.jsonl +1 -0
- package/themes/team-kanban/tailwind.snippet.ts +15 -0
- package/themes/team-kanban/theme.yml +209 -0
- package/themes/team-kanban/tokens.ts +35 -0
- package/themes/telehealth-modern/THEME.md +95 -0
- package/themes/telehealth-modern/tokens.ts +197 -0
- package/themes/tourism-board/THEME.md +111 -0
- package/themes/tourism-board/tokens.ts +173 -0
- package/themes/toys-modern/THEME.md +79 -0
- package/themes/toys-modern/tokens.ts +200 -0
- package/themes/travel-luxury/THEME.md +95 -0
- package/themes/travel-luxury/tokens.ts +162 -0
- package/themes/vacation-rental/THEME.md +105 -0
- package/themes/vacation-rental/tokens.ts +174 -0
- package/themes/vault-reel/THEME.md +134 -0
- package/themes/vault-reel/audit.log.jsonl +3 -0
- package/themes/vault-reel/tailwind.snippet.ts +16 -0
- package/themes/vault-reel/theme.yml +167 -0
- package/themes/vault-reel/tokens.ts +30 -0
- package/themes/vet-modern/THEME.md +79 -0
- package/themes/vet-modern/tokens.ts +194 -0
- package/themes/web3-restraint/THEME.md +87 -0
- package/themes/web3-restraint/tokens.ts +154 -0
- package/themes/wellness-active/THEME.md +102 -0
- package/themes/wellness-active/tokens.ts +203 -0
- package/themes/wellness-spa/THEME.md +93 -0
- package/themes/wellness-spa/tokens.ts +173 -0
- package/themes/y2k-chrome/THEME.md +118 -0
- package/themes/y2k-chrome/tokens.ts +249 -0
- package/themes/yoga-studio/THEME.md +76 -0
- package/themes/yoga-studio/tokens.ts +163 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Design Direction — Crypto-Onchain
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Uniswap pink-magenta gradient · Farcaster warm purple casts · Friend.tech black-gold pixel · Phantom purple glass · OpenSea asset-grid density
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Saturated gradients, pixel-art accents, on-chain stat tickers, playful-serious in equal measure. Backgrounds are tinted glass over a near-black purple void; type sits Inter-clean against gradient hero blocks. The 'we live on Base' aesthetic — Web3-native without being a meme coin, dense without being shouty.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Uniswap** → pink-magenta gradient and Inter type. The gradient is the brand; Inter is the universal sans of the on-chain web.
|
|
11
|
+
- **Farcaster** → warm purple cast cards. Glass-tinted card surfaces with hairline borders, purple cast-author chrome.
|
|
12
|
+
- **Friend.tech** → black, gold, pixel-art borders. The pixel-shadow utility (2px hard offset) is borrowed here, the gold-tier badge treatment too.
|
|
13
|
+
- **Phantom (wallet)** → purple gradient glass surfaces. The wallet UI canon: blurred glass cards over a deep purple void.
|
|
14
|
+
- **OpenSea** → Helvetica and dense asset-grid layout. The asset grid is dense, flat, hairline-bordered — the glow goes on the hero, not on every tile.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **purple-tinted void** → `--card` (glass surface, one stop above) → `--popover` (wallet-menu surface). Depth comes from a combination of glass blur, hairline border, and glow shadow — three coordinated languages.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--magenta`, `--magenta-deep`, `--purple`, `--purple-deep`, `--gold`, `--cyan`, `--pixel-shadow`, `--success`. Magenta is the canonical primary; purple is the gradient partner. Gold is reserved for Friend.tech-style pixel-tier badges. Cyan is a chain-badge accent for L2 mentions (Base, Optimism). `--success` is distinct from finance-gains green — it's the tx-confirmation pure-on-chain green.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Inter at 700/800 (Uniswap/OpenSea display). h1–h4. Tracking `-0.03em` — Inter tightens hard at heavy weights for the crypto-display feel.
|
|
25
|
+
- **Body:** Inter 400/500 (Phantom/Farcaster body). Body base **16px** with **line-height 1.55**.
|
|
26
|
+
- **Mono:** JetBrains Mono with the slashed-zero feature on. Wallet addresses, tx hashes, gas prices, token amounts. Always `font-variant-numeric: tabular-nums slashed-zero`.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.5rem, 7vw, 5.5rem)` — bold. Gradients deserve scale. Font features: `"tnum", "cv11", "ss01", "zero"`. The slashed zero is non-negotiable — distinguishes 0 from O in addresses and hashes.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-4 lg:px-8` — wide. Asset grids span the full bleed.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-20 pb-16 lg:pt-28 lg:pb-24`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128. Medium density — the asset grid is dense, but the hero gradient block is generous.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens.
|
|
40
|
+
|
|
41
|
+
The magenta-to-purple gradient is the signature brand surface. It appears on the hero block, the primary CTA fill, and the focus glow — and only there. Asset grids and tables stay flat, hairline-bordered, no gradient. Gold is reserved for rare-tier badges and pixel-shadow decoration. Cyan is reserved for chain-name badges.
|
|
42
|
+
|
|
43
|
+
Opacity via `/N` modifier on token. Pure black is forbidden; `--background` (purple-tinted near-black) replaces it. The pixel-shadow color `--pixel-shadow` is the only deeper-than-background color — used exclusively for the 2px hard-offset shadow on pixel-bordered elements.
|
|
44
|
+
|
|
45
|
+
## Radius
|
|
46
|
+
`--radius: 1rem` (16px). The Uniswap/Phantom rounded glass surface signature. Pills allowed (`pillsAllowed: true`) for token tickers, chain badges, and address chips. Pixel-bordered elements override base radius to `0` — pixel art and rounded glass do not mix on the same element.
|
|
47
|
+
|
|
48
|
+
## Shadows
|
|
49
|
+
**Glow.** Five utilities: `.glow-magenta` (primary CTA and hero rim), `.glow-purple` (secondary feature emphasis), `.glow-gold` (rare-tier badge highlight), `.pixel-shadow` (2px hard offset, no blur — the Friend.tech pixel-art drop shadow), `.glass` (inset white-top highlight + deep shadow for glass cards).
|
|
50
|
+
|
|
51
|
+
Glow utilities carry the signal; the page is dark enough that subtle lift is not enough. The pixel-shadow is a deliberate retro citation — it appears only on pixel-art elements (tier badges, retro mint counters, optional Easter-egg ornament).
|
|
52
|
+
|
|
53
|
+
## Motion
|
|
54
|
+
Six keyframes: `gradient-drift` (12000ms infinite background-position cycle on the hero gradient), `pulse-glow` (2000ms infinite magenta heartbeat ring on the single page-level CTA), `ticker-scroll` (30000ms infinite marquee for on-chain stat tickers), `fade-rise` (500ms entrance for cards and asset-grid tiles), `pixel-blink` (1000ms hard-step cursor blink — no easing), `number-roll` (240ms replace-and-rise on live socket-tick values).
|
|
55
|
+
|
|
56
|
+
`gradient-drift` is the signature ambient motion — the hero magenta-to-purple gradient slowly cycles its background-position so the page never feels static. `pulse-glow` is reserved for the single page-level Connect Wallet / Swap / Mint CTA — never more than one element per page. `pixel-blink` uses a hard step, no easing, to read genuinely retro.
|
|
57
|
+
|
|
58
|
+
Easing on everything else: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored — gradient-drift, pulse-glow, and ticker-scroll all freeze when reduced motion is requested.
|
|
59
|
+
|
|
60
|
+
## Density
|
|
61
|
+
Medium. The asset grid wants density (4–6 columns on desktop); the hero gradient wants generosity. The canonical reading rhythm is 16/24/32, with 6/8 for asset-card internal padding and 80/128 for hero vertical breathing.
|
|
62
|
+
|
|
63
|
+
## Component patterns
|
|
64
|
+
- **Buttons:** primary CTAs use a magenta→purple gradient fill with rounded-2xl (16px) and `glow-magenta` utility. Secondary is glass-card style (bg-card with `glass` shadow, `--border`). Tertiary is text-link magenta. Connect Wallet is the single page-level `pulse-glow` element. Pill buttons for token selectors and chain switchers.
|
|
65
|
+
- **Cards:** rounded-2xl (16px), 1px `--border`, `bg-card` with `glass` shadow utility. Padding `p-6 lg:p-8`. Hero/feature cards may use `glow-magenta` or `glow-purple`. Asset-grid cards stay flat with hairline border only — density on the grid, glow on the hero. NFT/asset cards use a 1:1 aspect-ratio media block.
|
|
66
|
+
- **Inputs:** full rounded-xl box, 1px `--input` border, `bg-card`. Amount inputs are oversized (text-3xl, mono) — the Uniswap swap-field treatment. Token selector pill sits inside the input on the right. Focus shifts border to magenta with glow.
|
|
67
|
+
- **CTA:** gradient magenta→purple rect for the primary action (Swap, Mint, Bridge, Connect Wallet). Glow utility carries the signal — no plain flat fills on hero CTAs. Pill buttons with brand-soft bg for chain badges (Base, Optimism, Arbitrum) — text in mono, chain logo on the left.
|
|
68
|
+
|
|
69
|
+
## Recommended rich media
|
|
70
|
+
Crypto-Onchain leans on **gradient backdrops, asset-grid imagery, and pixel-art ornament**. The hero is a magenta-to-purple gradient with optional pixel-art Easter eggs (a single pixel skull, a pixel coin, a pixel ghost) — Friend.tech-style ornament that signals 'we live on-chain' without being a meme coin.
|
|
71
|
+
|
|
72
|
+
**NFT/asset imagery** is the headline media on marketplace and profile surfaces. Asset tiles are 1:1, lazy-loaded, with `fade-rise` entrance staggered 40ms per tile in the grid. Floor prices, last-sale, and listing currency live in mono under the asset name.
|
|
73
|
+
|
|
74
|
+
**On-chain stat tickers** — TVL, gas price, ETH/USD, top floor — scroll as a `ticker-scroll` marquee in the lower third of marketing surfaces. The marquee is a real-data feed, not a decoration; if data is unavailable, the marquee hides rather than showing placeholder values.
|
|
75
|
+
|
|
76
|
+
**AI tool recommendations:** **Midjourney / Flux** with prompts like *"abstract magenta to purple gradient mesh, soft volumetric light, depth, 4k, web3 hero"* for hero gradients; *"isometric pixel art coin, 32x32, gold and black, transparent background, retro game art"* for pixel-art ornament. **Recraft** for the chain-logo and token-icon sets in flat-vector style. **Rive** for the Connect Wallet button micro-interaction — the wallet handshake animation. Avoid Midjourney defaults that produce shiny 3D crypto-bro coins, lambo imagery, or moon-rocket clichés.
|
|
77
|
+
|
|
78
|
+
**Aspect ratios:** 16:9 for hero gradient blocks. 1:1 for asset tiles and pixel-art ornament. 21:9 ultrawide for marquee tickers. Never 4:3 — that's enterprise software.
|
|
79
|
+
|
|
80
|
+
**Video:** allowed for hero gradient ambient loops (≤6s, ≤3MB H.265 with poster) and for product demos of Swap/Mint flows. Auto-play silent ambient loops are acceptable on the hero only — gradient-drift in CSS is preferred, but a hand-rendered video gradient at 24fps reads richer when the budget allows.
|
|
81
|
+
|
|
82
|
+
**Performance:** hero gradient is CSS by default — image fallback only when the gradient is complex enough to need it. Asset-grid images are AVIF at 600w max, ≤40KB each. LCP target 2.0s on marketplace surfaces where the asset grid is the LCP.
|
|
83
|
+
|
|
84
|
+
**Avoid:** lambo imagery, moon-rocket clichés, generic crypto-bro 3D coins, Matrix green-on-black, blockchain-as-glowing-cube illustration, NFT-cliche Ape imagery, generic "Web3" stock photography, Helvetica Neue (use Inter — that's the actual on-chain canon now), light-mode designs (this direction is dark-only).
|
|
85
|
+
|
|
86
|
+
**Accessibility:** wallet addresses always render truncated as `0x1234...abcd` with a copy-to-clipboard button and an `aria-label` containing the full address. Gas prices, percentages, and token amounts include unit suffixes in their accessible names (`"3.2 gwei"`, not `"3.2"`). Magenta meets 4.5:1 against the purple-tinted background at body weight; if used at lighter weights, paired with foreground text instead of as text color.
|
|
87
|
+
|
|
88
|
+
## Component families
|
|
89
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established.
|
|
90
|
+
|
|
91
|
+
## Details
|
|
92
|
+
- **Selection:** `hsl(var(--magenta) / 0.35)` background, foreground text.
|
|
93
|
+
- **Focus ring:** `2px solid hsl(var(--ring))`. Solid magenta — focus is loud on purpose, the page is dark.
|
|
94
|
+
- **Scrollbar:** thin.
|
|
95
|
+
|
|
96
|
+
## Exceptions
|
|
97
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
98
|
+
|
|
99
|
+
## Revisions
|
|
100
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const cryptoOnchain: Direction = {
|
|
4
|
+
name: "crypto-onchain",
|
|
5
|
+
ethos:
|
|
6
|
+
"Uniswap pink-magenta gradient · Farcaster warm purple casts · Friend.tech black-gold pixel · Phantom purple glass · OpenSea asset-grid density",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Uniswap", trait: "pink-magenta gradient + Inter type" },
|
|
9
|
+
{ brand: "Farcaster", trait: "warm purple cast cards" },
|
|
10
|
+
{ brand: "Friend.tech", trait: "black + gold + pixel-art borders" },
|
|
11
|
+
{ brand: "Phantom (wallet)", trait: "purple gradient glass surfaces" },
|
|
12
|
+
{ brand: "OpenSea", trait: "Helvetica + dense asset-grid layout" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Saturated gradients, pixel-art accents, on-chain stat tickers, playful-serious in equal measure. " +
|
|
16
|
+
"Backgrounds are tinted glass over a near-black void; type sits Inter-clean against gradient hero blocks. " +
|
|
17
|
+
"The 'we live on Base' aesthetic — Web3-native without being a meme coin, dense without being shouty.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Inter",
|
|
22
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
23
|
+
from: "Uniswap/OpenSea display — Inter heavy weights, the canonical Web3-native face",
|
|
24
|
+
googleFont: "Inter",
|
|
25
|
+
weights: [500, 600, 700, 800],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
30
|
+
from: "Phantom/Farcaster body — Inter at 400/500 for cast text and wallet UI",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500, 600],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["IBM Plex Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "wallet addresses, tx hashes, gas prices — the on-chain instrument-cluster face",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500, 700],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.03em", // Inter at heavy weights tightens hard for crypto-display feel
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"tnum", "cv11", "ss01", "zero"', // slashed-zero — distinguishes 0 from O in addresses
|
|
47
|
+
h1ScaleClamp: "clamp(2.5rem, 7vw, 5.5rem)", // bold — gradients deserve scale
|
|
48
|
+
bodyBaseSize: "1rem",
|
|
49
|
+
bodyLineHeight: "1.55",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "270 30% 6%", from: "Phantom near-black with strong purple bias — the void behind glass" },
|
|
54
|
+
foreground: { hsl: "280 20% 96%", from: "cool off-white with faint purple tint — readable on purple-black" },
|
|
55
|
+
card: { hsl: "275 28% 10%", from: "glass card surface — one stop above void, sits under blur+gradient" },
|
|
56
|
+
popover: { hsl: "275 26% 12%", from: "popover surface — wallet menus, swap confirmations" },
|
|
57
|
+
primary: { hsl: "322 88% 58%", from: "Uniswap magenta-pink — the canonical Web3 primary action color" },
|
|
58
|
+
primaryForeground: { hsl: "280 20% 96%", from: "near-white on magenta" },
|
|
59
|
+
secondary: { hsl: "270 24% 16%", from: "purple-shadowed surface, secondary tier" },
|
|
60
|
+
secondaryForeground: { hsl: "280 20% 96%", from: "near-white on purple secondary" },
|
|
61
|
+
muted: { hsl: "270 20% 18%", from: "muted surface — quiet panels inside loud gradient pages" },
|
|
62
|
+
mutedForeground: { hsl: "275 14% 68%", from: "lavender-gray secondary text — captions, address truncations" },
|
|
63
|
+
accent: { hsl: "270 22% 22%", from: "hover surface — one stop above muted" },
|
|
64
|
+
accentForeground: { hsl: "280 20% 96%", from: "near-white on accent" },
|
|
65
|
+
border: { hsl: "270 20% 24%", from: "purple-tinted hairline — visible on glass card edges" },
|
|
66
|
+
input: { hsl: "270 20% 24%", from: "same as border" },
|
|
67
|
+
ring: { hsl: "322 88% 58%", from: "= primary magenta — focus ring is the brand pink" },
|
|
68
|
+
destructive: { hsl: "12 88% 56%", from: "warning orange-red — failed tx, slippage exceeded, insufficient gas" },
|
|
69
|
+
destructiveForeground: { hsl: "280 20% 96%", from: "near-white on warning" },
|
|
70
|
+
brand: {
|
|
71
|
+
magenta: { hsl: "322 88% 58%", from: "= primary; Uniswap magenta, the canonical accent" },
|
|
72
|
+
"magenta-deep": { hsl: "320 78% 44%", from: "darker magenta — gradient anchor, hover state" },
|
|
73
|
+
purple: { hsl: "268 78% 62%", from: "Phantom/Farcaster purple — secondary brand accent" },
|
|
74
|
+
"purple-deep": { hsl: "265 70% 42%", from: "deep purple — gradient anchor with magenta" },
|
|
75
|
+
gold: { hsl: "42 95% 58%", from: "Friend.tech gold — pixel-border accent, rare-tier badges" },
|
|
76
|
+
cyan: { hsl: "186 88% 56%", from: "Base-blue-cyan adjacency — chain-badge accent for L2 mentions" },
|
|
77
|
+
"pixel-shadow": { hsl: "270 30% 4%", from: "deepest void — pixel-art drop-shadow color, 2px hard offset" },
|
|
78
|
+
success: { hsl: "150 70% 50%", from: "tx confirmation green — distinct from gains in finance, pure on-chain confirm" },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
spacing: {
|
|
83
|
+
base: 4,
|
|
84
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
|
|
85
|
+
containerMax: "max-w-7xl",
|
|
86
|
+
containerPadding: "px-4 lg:px-8",
|
|
87
|
+
sectionPadding: {
|
|
88
|
+
hero: "pt-20 pb-16 lg:pt-28 lg:pb-24",
|
|
89
|
+
default: "py-16 lg:py-24",
|
|
90
|
+
tight: "py-10 lg:py-14",
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
radius: {
|
|
95
|
+
base: "1rem", // 16px — Uniswap/Phantom rounded glass surfaces
|
|
96
|
+
pillsAllowed: true, // pills for token tickers, chain badges, address chips
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
shadows: {
|
|
100
|
+
style: "glow",
|
|
101
|
+
utilities: {
|
|
102
|
+
"glow-magenta":
|
|
103
|
+
"0 0 0 1px hsl(var(--magenta) / 0.4), " +
|
|
104
|
+
"0 8px 32px hsl(var(--magenta) / 0.32), " +
|
|
105
|
+
"0 40px 120px hsl(var(--magenta) / 0.25)",
|
|
106
|
+
"glow-purple":
|
|
107
|
+
"0 0 0 1px hsl(var(--purple) / 0.4), " +
|
|
108
|
+
"0 8px 32px hsl(var(--purple) / 0.3), " +
|
|
109
|
+
"0 40px 120px hsl(var(--purple) / 0.22)",
|
|
110
|
+
"glow-gold":
|
|
111
|
+
"0 0 0 1px hsl(var(--gold) / 0.6), " +
|
|
112
|
+
"0 4px 16px hsl(var(--gold) / 0.4)",
|
|
113
|
+
"pixel-shadow":
|
|
114
|
+
"2px 2px 0 0 hsl(var(--pixel-shadow))",
|
|
115
|
+
"glass":
|
|
116
|
+
"inset 0 1px 0 hsl(280 20% 96% / 0.08), " +
|
|
117
|
+
"0 8px 32px hsl(270 30% 4% / 0.6)",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
motion: {
|
|
122
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
123
|
+
durations: {
|
|
124
|
+
reveal: 500,
|
|
125
|
+
loop: 2000, // pulse cadence for live tickers
|
|
126
|
+
ambient: 12000, // slow gradient drift
|
|
127
|
+
},
|
|
128
|
+
keyframes: {
|
|
129
|
+
"gradient-drift": {
|
|
130
|
+
css:
|
|
131
|
+
"0%, 100% { background-position: 0% 50%; }\n" +
|
|
132
|
+
"50% { background-position: 100% 50%; }",
|
|
133
|
+
defaultDuration: 12000,
|
|
134
|
+
iteration: "infinite",
|
|
135
|
+
purpose: "hero gradient backdrop — magenta-to-purple slow drift, the signature ambient motion",
|
|
136
|
+
},
|
|
137
|
+
"pulse-glow": {
|
|
138
|
+
css:
|
|
139
|
+
"0%, 100% { box-shadow: 0 0 0 0 hsl(var(--magenta) / 0.5); }\n" +
|
|
140
|
+
"50% { box-shadow: 0 0 0 16px hsl(var(--magenta) / 0); }",
|
|
141
|
+
defaultDuration: 2000,
|
|
142
|
+
iteration: "infinite",
|
|
143
|
+
purpose: "single hero CTA heartbeat — Connect Wallet, Swap, Mint; one element per page only",
|
|
144
|
+
},
|
|
145
|
+
"ticker-scroll": {
|
|
146
|
+
css:
|
|
147
|
+
"from { transform: translateX(0); }\n" +
|
|
148
|
+
"to { transform: translateX(-50%); }",
|
|
149
|
+
defaultDuration: 30000,
|
|
150
|
+
iteration: "infinite",
|
|
151
|
+
purpose: "on-chain stat marquee — TVL, gas, floor prices scrolling lower-third",
|
|
152
|
+
},
|
|
153
|
+
"fade-rise": {
|
|
154
|
+
css:
|
|
155
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
156
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
157
|
+
defaultDuration: 500,
|
|
158
|
+
iteration: "once",
|
|
159
|
+
purpose: "card and asset-grid entrance — short rise, no theatrics",
|
|
160
|
+
},
|
|
161
|
+
"pixel-blink": {
|
|
162
|
+
css:
|
|
163
|
+
"0%, 50% { opacity: 1; }\n" +
|
|
164
|
+
"50.01%, 100% { opacity: 0; }",
|
|
165
|
+
defaultDuration: 1000,
|
|
166
|
+
iteration: "infinite",
|
|
167
|
+
purpose: "pixel-art cursor and rare-tier badge blink — hard step, no easing, retro feel",
|
|
168
|
+
},
|
|
169
|
+
"number-roll": {
|
|
170
|
+
css:
|
|
171
|
+
"from { opacity: 0; transform: translateY(-8px); }\n" +
|
|
172
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
173
|
+
defaultDuration: 240,
|
|
174
|
+
iteration: "once",
|
|
175
|
+
purpose: "live price/floor/TVL value updates — replace-and-rise on socket tick",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
respectsReducedMotion: true,
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
density: "medium",
|
|
182
|
+
|
|
183
|
+
patterns: {
|
|
184
|
+
button:
|
|
185
|
+
"Primary CTAs use a magenta→purple gradient fill with rounded-2xl (16px) and glow-magenta utility. " +
|
|
186
|
+
"Secondary is glass-card style (bg-card with glass shadow, --border). Tertiary is text-link magenta. " +
|
|
187
|
+
"Connect Wallet is the single page-level pulse-glow element. Pill buttons for token selectors and chain switchers.",
|
|
188
|
+
card:
|
|
189
|
+
"Rounded-2xl (16px), 1px --border, bg-card with glass shadow utility. Padding p-6 lg:p-8. " +
|
|
190
|
+
"Hero/feature cards may use glow-magenta or glow-purple. Asset-grid cards stay flat with hairline border only — " +
|
|
191
|
+
"density on the grid, glow on the hero. NFT/asset cards use 1:1 aspect-ratio media block.",
|
|
192
|
+
input:
|
|
193
|
+
"Full rounded-xl box, 1px --input border, bg-card. Amount inputs are oversized (text-3xl, mono) — the Uniswap swap-field treatment. " +
|
|
194
|
+
"Token selector pill sits inside the input on the right. Focus shifts border to magenta with glow.",
|
|
195
|
+
cta:
|
|
196
|
+
"Gradient magenta→purple rect for the primary action (Swap, Mint, Bridge, Connect). " +
|
|
197
|
+
"Glow utility carries the signal — no plain flat fills on hero CTAs. " +
|
|
198
|
+
"Pill buttons with brand-soft bg for chain badges (Base, Optimism, Arbitrum) — text in mono, chain logo on the left.",
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
details: {
|
|
202
|
+
selectionBg: "hsl(var(--magenta) / 0.35)",
|
|
203
|
+
selectionFg: "hsl(var(--foreground))",
|
|
204
|
+
focusRing: "2px solid hsl(var(--ring))",
|
|
205
|
+
scrollbarStyle: "thin",
|
|
206
|
+
},
|
|
207
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Design Direction — Cycling-Brand
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Rapha matte-black heritage · Trek precision engineering · Pinarello Italian curve · Specialized S-Works performance restraint · Castelli pink-band peloton mark
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Matte black canvas. Full-bleed road photography — rain-slicked tarmac, peloton blur, alpine col at dawn. Product chrome is restrained — black on black with one Castelli-pink stripe. Heritage display serif for marque names, engineered sans for spec. The site reads like a Rapha catalogue, not a dashboard.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Rapha** → matte black, full-bleed peloton photography, pink racing-stripe accent.
|
|
11
|
+
- **Trek** → engineered restraint, spec-card density, Project One craft language.
|
|
12
|
+
- **Pinarello** → Italian display serif, asymmetric Onda curve, race-heritage typography.
|
|
13
|
+
- **Specialized S-Works** → performance product chrome, carbon-weave detail photography.
|
|
14
|
+
- **Castelli** → Giro-pink peloton mark, race-kit color discipline, climbing-stripe heritage.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
Surface stack is **kit-black** (background) → **+3% lift** (card) → **+8% lift** (secondary / muted / accent). Brand tokens: `--giro-pink`, `--pink-deep`, `--kit-black`, `--bone`, `--race-gray`, `--champagne-stripe`. Primary is `--giro-pink` — the singular peloton mark. Champagne-stripe is reserved for jersey-detail accents (city collection stripe), never for body surfaces or CTAs.
|
|
18
|
+
|
|
19
|
+
## Typography
|
|
20
|
+
- **Display:** Cormorant Infant 400/500. Heritage Italian display serif — Pinarello marque typography. Set with `font-style: italic` on model names for race-program elegance. Tracking `-0.015em` at scale.
|
|
21
|
+
- **Body:** Inter 400/500/600/700. Engineered sans for spec lines. 16px base, line-height 1.6 — catalogue prose, not dashboard density.
|
|
22
|
+
- **Mono:** JetBrains Mono. Reserved for tabular spec: frame weight (grams), wheelbase, stack/reach, race distance.
|
|
23
|
+
|
|
24
|
+
H1 uses `clamp(2.75rem, 7vw, 6rem)` — catalogue scale, never billboard. Race-program headlines are italic display serif by default.
|
|
25
|
+
|
|
26
|
+
## Spacing
|
|
27
|
+
- **Container:** `max-w-7xl px-6 lg:px-10` — peloton photography needs full bleed.
|
|
28
|
+
- **Section padding tiers:**
|
|
29
|
+
- Hero: `pt-24 pb-16 lg:pt-36 lg:pb-24` (long inhale before the page begins)
|
|
30
|
+
- Default: `py-20 lg:py-28`
|
|
31
|
+
- Tight: `py-12 lg:py-16`
|
|
32
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128 160. Catalogue rhythm — wide and considered.
|
|
33
|
+
|
|
34
|
+
## Color
|
|
35
|
+
No hex anywhere — tokens only. There is one pink, and it is Castelli/Giro. There is no signal-blue, no tech-cyan, no green — pink and bone and matte-black are the entire vocabulary. `--destructive` is a separate warning red (flat-tire alert) — never to be used for marketing.
|
|
36
|
+
|
|
37
|
+
## Radius
|
|
38
|
+
`--radius: 0`. Sharp corners only. Pills disallowed (`pillsAllowed: false`) — race tags, distance markers, and CTAs are all rectangles. Rapha catalogue rule.
|
|
39
|
+
|
|
40
|
+
## Shadows
|
|
41
|
+
**Soft.** Two utilities: `.card-frame` (1px hairline + 24px×60px deep black drop) for product cards, `.glow-pink` (pink 1px ring + 36px pink glow) for the singular featured product or hero CTA. Nothing else lifts.
|
|
42
|
+
|
|
43
|
+
## Motion
|
|
44
|
+
Four keyframes: `catalogue-rise` (1000ms entrance — slow, considered page-turn rhythm), `route-pulse` (2400ms loop for Club-Ride map markers — restrained, half-opacity dip), `ken-burns-peloton` (26000ms slow camera push on hero photography — Tour-coverage feel), `pink-sweep` (4000ms gradient stripe sweep on hero product — Castelli climbing-stripe motion).
|
|
45
|
+
|
|
46
|
+
Easing `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — ken-burns and pink-sweep stop, the page settles.
|
|
47
|
+
|
|
48
|
+
## Component patterns
|
|
49
|
+
- **Buttons:** primary is Giro-pink filled rectangle (0 radius), kit-black text, uppercase tracking 0.12em. Secondary is transparent 1px border. Tertiary is uppercase pink text-link.
|
|
50
|
+
- **Kit-catalogue product card:** kit-black background, product photo above, model name in italic display serif, two-line spec in body, price in mono tabular bottom-right. Hover lifts to `card-frame` shadow.
|
|
51
|
+
- **Race-calendar row:** five compact rectangles — date in mono, race name in italic display, distance + altitude gain in mono, location in body. Stripe of `--champagne-stripe` along the left for road races, `--giro-pink` for races in the pink-jersey series.
|
|
52
|
+
- **Club-Ride map placeholder:** matte topographic gradient on `--card`, three pulsing pink `route-pulse` markers, distance/elevation legend bottom-left in mono.
|
|
53
|
+
- **Inputs:** full box, 1px border, `bg-card`, 0 radius. Mono uppercase label above (tracking 0.14em). Focus ring Giro-pink 2px.
|
|
54
|
+
|
|
55
|
+
## Recommended rich media
|
|
56
|
+
Photography is the lead medium — peloton mid-climb on a cobbled section, rider silhouette against an alpine sunrise, mechanic's hands threading a chain in a workshop, rain on a top tube. Aspect ratios 21:9 cinematic for hero, 4:5 portrait for rider features, 3:2 catalogue-standard for product. Black-and-white acceptable for hero; product is full color with deliberate desaturation.
|
|
57
|
+
|
|
58
|
+
**AI tool recommendations:** Midjourney *"Rapha Cent Cols photography, peloton, rain on tarmac, Magnum Photos, Kodak Portra 400, soft grain, golden hour alpine col"*. Avoid bright cyclist-stock photography — that's gym-tier, not Rapha-tier.
|
|
59
|
+
|
|
60
|
+
**Video:** hero 8-second peloton clip looped — silent autoplay, ≤6 MB. Stops on `prefers-reduced-motion`.
|
|
61
|
+
|
|
62
|
+
**Performance:** hero photo ≤220 KB AVIF at 1920w.
|
|
63
|
+
|
|
64
|
+
**Avoid:** "Three reasons to switch" / SaaS pricing pillars / generic feature cards. Stock cyclist smiling at camera. Carbon-fiber close-ups rendered in 3D. Blue tech-wash. Any neon-yellow-green safety-vest accent — that's commuter, not race.
|
|
65
|
+
|
|
66
|
+
## Component families
|
|
67
|
+
None at install time.
|
|
68
|
+
|
|
69
|
+
## Details
|
|
70
|
+
- **Selection:** `hsl(var(--giro-pink) / 0.32)` — the only place pink touches body text.
|
|
71
|
+
- **Focus ring:** 2px solid Giro-pink.
|
|
72
|
+
- **Scrollbar:** thin.
|
|
73
|
+
|
|
74
|
+
## Exceptions
|
|
75
|
+
None yet.
|
|
76
|
+
|
|
77
|
+
## Revisions
|
|
78
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// cycling-brand — Rapha / Trek / Pinarello atmosphere. Matte black canvas,
|
|
4
|
+
// full-bleed road-cycling photography, restrained product chrome. Premium
|
|
5
|
+
// performance cycling — heritage typography, racing pink as the singular
|
|
6
|
+
// accent (Rapha's house mark), no signal-blue tech-wash.
|
|
7
|
+
export const cyclingBrand: Direction = {
|
|
8
|
+
name: "cycling-brand" as Direction["name"],
|
|
9
|
+
ethos:
|
|
10
|
+
"Rapha matte-black heritage · Trek precision engineering · Pinarello Italian curve · " +
|
|
11
|
+
"Specialized S-Works performance restraint · Castelli pink-band peloton mark",
|
|
12
|
+
references: [
|
|
13
|
+
{ brand: "Rapha", trait: "matte black, full-bleed peloton photography, pink racing-stripe accent" },
|
|
14
|
+
{ brand: "Trek", trait: "engineered restraint, spec-card density, Project One craft language" },
|
|
15
|
+
{ brand: "Pinarello", trait: "Italian display serif, asymmetric Onda curve, race-heritage typography" },
|
|
16
|
+
{ brand: "Specialized S-Works", trait: "performance product chrome, carbon-weave detail photography" },
|
|
17
|
+
{ brand: "Castelli", trait: "Giro-pink peloton mark, race-kit color discipline, climbing-stripe heritage" },
|
|
18
|
+
],
|
|
19
|
+
feel:
|
|
20
|
+
"Matte black canvas. Full-bleed road photography — rain-slicked tarmac, peloton blur, " +
|
|
21
|
+
"alpine col at dawn. Product chrome is restrained — black on black with one Castelli-pink " +
|
|
22
|
+
"stripe. Heritage display serif for marque names, engineered sans for spec. The site reads " +
|
|
23
|
+
"like a Rapha catalogue, not a dashboard.",
|
|
24
|
+
|
|
25
|
+
fonts: {
|
|
26
|
+
display: {
|
|
27
|
+
family: "Cormorant Infant",
|
|
28
|
+
fallback: ["EB Garamond", "Cormorant Garamond", "Iowan Old Style", "Times New Roman", "serif"],
|
|
29
|
+
from: "Pinarello Italian display serif feel — heritage marque typography, racing-program elegance",
|
|
30
|
+
googleFont: "Cormorant+Infant",
|
|
31
|
+
weights: [400, 500, 600],
|
|
32
|
+
},
|
|
33
|
+
body: {
|
|
34
|
+
family: "Inter",
|
|
35
|
+
fallback: ["system-ui", "-apple-system", "Helvetica Neue", "sans-serif"],
|
|
36
|
+
from: "Trek/Specialized engineered sans — neutral spec body, never decorative under product photography",
|
|
37
|
+
googleFont: "Inter",
|
|
38
|
+
weights: [400, 500, 600, 700],
|
|
39
|
+
},
|
|
40
|
+
mono: {
|
|
41
|
+
family: "JetBrains Mono",
|
|
42
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
|
|
43
|
+
from: "tabular spec numerics — wheelbase, stack/reach, frame weight in grams, race distances",
|
|
44
|
+
googleFont: "JetBrains+Mono",
|
|
45
|
+
weights: [400, 500, 700],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
typography: {
|
|
50
|
+
headingTracking: "-0.015em", // display serif tightens at large size — Pinarello marque feel
|
|
51
|
+
bodyTracking: "0.005em",
|
|
52
|
+
fontFeatureSettings: '"ss01", "tnum", "calt", "liga"',
|
|
53
|
+
h1ScaleClamp: "clamp(2.75rem, 7vw, 6rem)", // catalogue scale — restrained, never billboard
|
|
54
|
+
bodyBaseSize: "1rem", // 16px — comfortable on near-black
|
|
55
|
+
bodyLineHeight: "1.6", // catalogue prose, not dashboard density
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
colors: {
|
|
59
|
+
background: { hsl: "0 0% 6%", from: "Rapha matte-black — bib-short fabric, never blue-tinted" },
|
|
60
|
+
foreground: { hsl: "36 14% 92%", from: "warm bone — race-program paper, never harsh white" },
|
|
61
|
+
card: { hsl: "0 0% 9%", from: "elevated surface — kit-photo studio backdrop, one stop up" },
|
|
62
|
+
popover: { hsl: "0 0% 12%", from: "menu/popover surface — two stops up" },
|
|
63
|
+
primary: { hsl: "340 80% 56%", from: "Castelli/Giro pink — the canonical peloton-mark accent, used on CTAs only" },
|
|
64
|
+
primaryForeground: { hsl: "0 0% 6%", from: "matte black on Giro pink — contrast law" },
|
|
65
|
+
secondary: { hsl: "0 0% 14%", from: "Rapha shadow tier — secondary surface, deeper kit-photo backdrop" },
|
|
66
|
+
secondaryForeground: { hsl: "36 14% 92%", from: "bone on shadow tier" },
|
|
67
|
+
muted: { hsl: "0 0% 16%", from: "muted surface — same family, fractionally lighter" },
|
|
68
|
+
mutedForeground: { hsl: "36 8% 62%", from: "race-program meta gray — distance, date, rider count" },
|
|
69
|
+
accent: { hsl: "0 0% 19%", from: "hover surface — brushed-frame highlight" },
|
|
70
|
+
accentForeground: { hsl: "36 14% 92%", from: "bone on accent" },
|
|
71
|
+
border: { hsl: "0 0% 22%", from: "frame-tube hairline — engineered, visible only on inspection" },
|
|
72
|
+
input: { hsl: "0 0% 22%", from: "same as border — single hairline language" },
|
|
73
|
+
ring: { hsl: "340 80% 56%", from: "Giro pink — focus is the peloton mark, never neutral" },
|
|
74
|
+
destructive: { hsl: "356 78% 50%", from: "warning red — flat-tire, stop-the-ride alert, never decoration" },
|
|
75
|
+
destructiveForeground: { hsl: "36 14% 92%", from: "bone on warning red" },
|
|
76
|
+
brand: {
|
|
77
|
+
"giro-pink": { hsl: "340 80% 56%", from: "Castelli/Giro maglia rosa — the singular accent, also primary" },
|
|
78
|
+
"pink-deep": { hsl: "338 70% 38%", from: "deeper Giro pink — used only on hover and gradient anchors" },
|
|
79
|
+
"kit-black": { hsl: "0 0% 6%", from: "Rapha bib fabric — also background" },
|
|
80
|
+
bone: { hsl: "36 14% 92%", from: "race-program paper — also foreground" },
|
|
81
|
+
"race-gray": { hsl: "36 8% 62%", from: "program meta — secondary text" },
|
|
82
|
+
"champagne-stripe": { hsl: "41 32% 52%", from: "Rapha city-jersey stripe — restrained alternative stripe color" },
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
spacing: {
|
|
87
|
+
base: 4,
|
|
88
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160], // catalogue rhythm — wide and considered
|
|
89
|
+
containerMax: "max-w-7xl", // wide — peloton photography needs full bleed
|
|
90
|
+
containerPadding: "px-6 lg:px-10",
|
|
91
|
+
sectionPadding: {
|
|
92
|
+
hero: "pt-24 pb-16 lg:pt-36 lg:pb-24",
|
|
93
|
+
default: "py-20 lg:py-28",
|
|
94
|
+
tight: "py-12 lg:py-16",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
radius: {
|
|
99
|
+
base: "0", // sharp — catalogue rectangle, never web-app pillow
|
|
100
|
+
pillsAllowed: false, // race tags are rectangles, not pills — Rapha rule
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
shadows: {
|
|
104
|
+
style: "soft",
|
|
105
|
+
utilities: {
|
|
106
|
+
"card-frame":
|
|
107
|
+
"0 1px 0 0 hsl(var(--border)), " +
|
|
108
|
+
"0 24px 60px hsl(0 0% 0% / 0.5)",
|
|
109
|
+
"glow-pink":
|
|
110
|
+
"0 0 0 1px hsl(var(--giro-pink) / 0.35), " +
|
|
111
|
+
"0 12px 36px hsl(var(--giro-pink) / 0.2)",
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
motion: {
|
|
116
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
117
|
+
durations: {
|
|
118
|
+
reveal: 1000, // catalogue entrance — slow, considered
|
|
119
|
+
loop: 2400, // route-marker pulses
|
|
120
|
+
ambient: 26000, // ken-burns over peloton photography
|
|
121
|
+
},
|
|
122
|
+
keyframes: {
|
|
123
|
+
"catalogue-rise": {
|
|
124
|
+
css:
|
|
125
|
+
"from { opacity: 0; transform: translateY(24px); }\n" +
|
|
126
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
127
|
+
defaultDuration: 1000,
|
|
128
|
+
iteration: "once",
|
|
129
|
+
purpose: "product/section entrance — catalogue page-turn rhythm",
|
|
130
|
+
},
|
|
131
|
+
"route-pulse": {
|
|
132
|
+
css:
|
|
133
|
+
"0%, 100% { opacity: 1; transform: scale(1); }\n" +
|
|
134
|
+
"50% { opacity: 0.5; transform: scale(0.92); }",
|
|
135
|
+
defaultDuration: 2400,
|
|
136
|
+
iteration: "infinite",
|
|
137
|
+
purpose: "Club-Ride map marker — start-pin pulses in tempo, restrained",
|
|
138
|
+
},
|
|
139
|
+
"ken-burns-peloton": {
|
|
140
|
+
css:
|
|
141
|
+
"0% { transform: scale(1.05) translate(0, 0); }\n" +
|
|
142
|
+
"100% { transform: scale(1.16) translate(-2%, -1%); }",
|
|
143
|
+
defaultDuration: 26000,
|
|
144
|
+
iteration: "infinite",
|
|
145
|
+
purpose: "hero peloton photography drift — slow camera push, Tour-coverage feel",
|
|
146
|
+
},
|
|
147
|
+
"pink-sweep": {
|
|
148
|
+
css:
|
|
149
|
+
"0% { background-position: -150% 0; }\n" +
|
|
150
|
+
"100% { background-position: 250% 0; }",
|
|
151
|
+
defaultDuration: 4000,
|
|
152
|
+
iteration: "infinite",
|
|
153
|
+
purpose: "race-stripe gradient sweep on hero product reveal — Castelli climbing-stripe motion",
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
respectsReducedMotion: true,
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
density: "medium",
|
|
160
|
+
|
|
161
|
+
patterns: {
|
|
162
|
+
button:
|
|
163
|
+
"Primary action = Giro-pink filled rectangle, kit-black text, 0 radius, uppercase tracking 0.12em label. " +
|
|
164
|
+
"Secondary = transparent with 1px border in --border, bone text, hover lifts to --accent. " +
|
|
165
|
+
"Tertiary = text-link in Giro-pink, uppercase tracking 0.08em, underline-on-hover. " +
|
|
166
|
+
"Never softened with radius. Never a gradient softer than pink → pink-deep.",
|
|
167
|
+
card:
|
|
168
|
+
"0 radius, hairline border (--border), bg-card. Padding p-6 lg:p-8. " +
|
|
169
|
+
"Product cards use card-frame shadow; hero/featured product uses glow-pink. " +
|
|
170
|
+
"Headline (model name) in display serif italic, spec lines in mono tabular.",
|
|
171
|
+
input:
|
|
172
|
+
"Full box, 1px --border, bg-card, 0 radius. Label above in mono uppercase tracking 0.14em. " +
|
|
173
|
+
"Focus ring is Giro-pink, 2px.",
|
|
174
|
+
cta:
|
|
175
|
+
"The hero CTA (shop / register) is a pink-filled rectangle. Inline CTAs are uppercase text-links in pink. " +
|
|
176
|
+
"Spec-detail CTAs (view geometry, view weight chart) are bone text-links with hairline underline.",
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
details: {
|
|
180
|
+
selectionBg: "hsl(var(--giro-pink) / 0.32)",
|
|
181
|
+
selectionFg: "hsl(var(--foreground))",
|
|
182
|
+
focusRing: "2px solid hsl(var(--ring))",
|
|
183
|
+
scrollbarStyle: "thin",
|
|
184
|
+
},
|
|
185
|
+
};
|