@stylecrib/cli 0.0.0-stage → 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 +163 -2
- 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 +7182 -0
- package/package.json +69 -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,94 @@
|
|
|
1
|
+
# Design Direction — Furniture-Modern
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
West Elm warm-cream lifestyle · Article scandi-modern catalog · CB2 modern-rust accents · Burrow friendly modular · Floyd considered millennial home
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Friendly soft furniture catalog. Warm cream surfaces, walnut and sage accents, room-by-room navigation as the primary frame. The page reads like a West Elm or Article catalog: approachable, photographable, never showroom-cold and never beige-on-beige boring. The audience is renting a first apartment or filling out a starter home — the layout returns confidence ("you can pull this room together for $1,800") rather than performing taste-knowledge.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **West Elm** → warm cream surface, lifestyle photography, room-by-room navigation, friendly category names ("Sofas We Love").
|
|
11
|
+
- **Article** → scandi-modern restraint, walnut accent wood, serif headlines, room sets, designer-collab call-outs.
|
|
12
|
+
- **CB2** → modern rust and cement gray, bold serif type, photography-forward, seasonal collection drops.
|
|
13
|
+
- **Burrow** → friendly modular sofa CTAs, warm gradient backdrops, rounded chrome, financing-friendly messaging.
|
|
14
|
+
- **Floyd** → considered millennial home, sand-cream palette, soft sage, lifestyle staging without influencer aesthetic.
|
|
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 **warm cream** (background) → **white** (card — lifestyle-photo backdrop feel) → **deeper cream** (secondary) → **stone-cream** (muted). Depth comes from soft shadows with a warm earth tint, never from cold neutral grays.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--cream`, `--cream-deep`, `--walnut`, `--walnut-deep`, `--sage`, `--rust`, `--sand`, `--ink`. Primary is **Article walnut** — the canonical warm-wood accent on CTAs, filters, focus rings. Sage appears on room-tags and sustainability badges. Rust is the seasonal-collection mark (CB2-adjacent), used sparingly.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Fraunces (Article/CB2 serif headlines). h1–h4, weights 400/500/600. Soft variants on for friendly-catalog warmth. Tracking `-0.018em`.
|
|
25
|
+
- **Body:** Inter (West Elm/Burrow body sans), weights 400/500/600. Body base **16px** with **line-height 1.6**. Inter is the modern catalog default; humanist sans that doesn't impose personality on product copy.
|
|
26
|
+
- **Mono:** JetBrains Mono. Used for dimensions, SKU numbers, ship-by dates — tabular numerals for catalog metadata.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 5.5vw, 4rem)`. Prices use tabular nums. Font features: `"ss01"`, `"ss02"`, `"tnum"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-5 lg:px-10` — wide; catalog needs lifestyle-photo room and 4-tile grids.
|
|
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-16`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128. Medium density — room tiles breathe, product grids stay scannable.
|
|
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-on-cream are forbidden — `--ink` (walnut-ink) and walnut variants do the work. Walnut appears on primary CTAs and filter pills; sage on room-tags; rust on seasonal-collection badges (max once per viewport).
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 0.75rem` (12px). Catalog-card softness — soft but not pillowy. Pills allowed (`pillsAllowed: true`) for room categories, fabric swatches, ship-by chips. Cards use rounded-xl. Buttons use rounded-lg. The rounding language is consistent and committed.
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
**Soft.** Three utilities:
|
|
46
|
+
- `.shadow-room` — default room-card and product-tile lift (1px ambient + 8px warm earth-tint shadow)
|
|
47
|
+
- `.shadow-room-lg` — hover state, deeper earth-tint
|
|
48
|
+
- `.shadow-cream-inset` — inner highlight on white cards for lifestyle-photo backdrop feel
|
|
49
|
+
|
|
50
|
+
Shadows carry a warm earth tint, never cold neutral gray — that reads SaaS/dashboard and breaks the catalog language.
|
|
51
|
+
|
|
52
|
+
## Motion
|
|
53
|
+
Three keyframes — `fade-rise` (room-card and product-tile entrance, 600ms — friendly catalog responsiveness), `scale-in` (swatch swap and add-to-cart confirmation, 220ms), `ken-burns-soft` (single hero room-photograph drift, 22000ms infinite, **never on grid tiles**, only on the lead image).
|
|
54
|
+
|
|
55
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored. Motion is friendly-responsive — confirms taps and reveals room tiles without performing.
|
|
56
|
+
|
|
57
|
+
## Component patterns
|
|
58
|
+
- **Buttons:** Solid-fill primary (walnut bg, cream text, rounded-lg, shadow-room). Secondary is white card with walnut border. Tertiary is text-link in walnut-deep with underline-on-hover. Filter chips are pills with cream bg. Hover lifts shadow-room → shadow-room-lg.
|
|
59
|
+
- **Cards:** Rounded-xl, white bg, soft cream border, shadow-room. Internal padding `p-5 lg:p-7`. Title in Fraunces 500; price + dimensions in Inter + JetBrains Mono. Hover lifts to shadow-room-lg.
|
|
60
|
+
- **Inputs:** Full rounded-lg box, cream border, white bg. Focus = walnut 2px ring at 35% opacity. Label above in Inter 500, helper text below in muted-foreground.
|
|
61
|
+
- **CTAs:** Walnut-fill primary button is the default. Secondary CTAs use white-card button or text-link. Room-category nav is a pill row across the top, never a dropdown — catalog navigation is horizontal.
|
|
62
|
+
|
|
63
|
+
## Recommended rich media
|
|
64
|
+
Furniture-modern photography is **room sets, never product-on-seamless**. Hero imagery is a fully-staged room with the featured piece prominent — natural window light, late-morning or golden-hour, lived-in props (a book on the side table, throw thrown not folded). Color-graded to warm afternoon light. Plants are mandatory in at least one corner; pets are encouraged.
|
|
65
|
+
|
|
66
|
+
Product-tile imagery may be product-on-cream-seamless when filtered to a category, but the homepage and room-collection pages lean on staged rooms.
|
|
67
|
+
|
|
68
|
+
**AI tool recommendations:** **Midjourney / Flux** for *"modern living room interior, walnut credenza, sage upholstered sofa, warm afternoon window light, scandi-modern, slight film grain, lifestyle photography"*; *"bedroom with platform bed, oak nightstand, linen bedding, morning light, west elm catalog aesthetic"*. Avoid Midjourney's default architectural-render output — explicitly prompt for "lived-in, slight clutter, natural light, no studio flash."
|
|
69
|
+
|
|
70
|
+
**Aspect ratios:** 4:5 portrait for room tiles, 16:9 landscape for hero room shots, 1:1 square for product-on-cream tiles.
|
|
71
|
+
|
|
72
|
+
**Video:** room-tour loops are acceptable on hero only — 8-second slow pan across a staged room, no audio, ≤4 MB. Designer-collab features may include a 30-second video with the designer talking through the collection.
|
|
73
|
+
|
|
74
|
+
**Performance:** room tile images ≤120 KB WebP at 1200w; hero ≤250 KB. LCP under 2.5s.
|
|
75
|
+
|
|
76
|
+
**Avoid:** showroom-cold mid-century reference photography (that's the mid-century direction's territory), beige-on-beige influencer aesthetic, watermark stock, 3D render placeholders with uncanny shadows, dark moody product shots, gradient backgrounds, glassmorphic anything.
|
|
77
|
+
|
|
78
|
+
**Accessibility:** alt-text names the room and the featured piece: *"A staged living room with the Article walnut credenza beneath a row of framed botanical prints, sage sofa on the left, morning light through linen curtains."*
|
|
79
|
+
|
|
80
|
+
## Component families
|
|
81
|
+
- **Room tile** — square white card with hero room photo, room name in Fraunces, piece count, "Shop the room →".
|
|
82
|
+
- **Designer-collab feature card** — full-width banner, designer portrait left, collection name + range in Fraunces, "See the collection →".
|
|
83
|
+
- **Financing strip** — single-row banner explaining 0% APR, with provider logo placeholder, plain copy, never aggressive.
|
|
84
|
+
|
|
85
|
+
## Details
|
|
86
|
+
- **Selection:** `hsl(var(--walnut) / 0.20)` background, foreground text.
|
|
87
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.45)` — visible walnut ring without screaming.
|
|
88
|
+
- **Scrollbar:** thin.
|
|
89
|
+
|
|
90
|
+
## Exceptions
|
|
91
|
+
None yet. When an intentional one-of-one violation lands (a dark-mode holiday-collection takeover where the cream palette is intentionally inverted), add it here with the reason.
|
|
92
|
+
|
|
93
|
+
## Revisions
|
|
94
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// Note: "furniture-modern" is not yet in the Direction["name"] enum.
|
|
4
|
+
// The schema is closed; until it is extended this file casts the name.
|
|
5
|
+
// All other fields fully validate.
|
|
6
|
+
|
|
7
|
+
export const furnitureModern: Direction = {
|
|
8
|
+
name: "furniture-modern" as Direction["name"],
|
|
9
|
+
ethos:
|
|
10
|
+
"West Elm warm-cream lifestyle · Article scandi-modern catalog · CB2 modern-rust accents · Burrow friendly modular · Floyd considered millennial home",
|
|
11
|
+
references: [
|
|
12
|
+
{ brand: "West Elm", trait: "warm cream surface + lifestyle photography + room-by-room navigation" },
|
|
13
|
+
{ brand: "Article", trait: "scandi-modern restraint + walnut accent + serif headlines + room sets" },
|
|
14
|
+
{ brand: "CB2", trait: "modern rust + cement gray + bold serif type + photography-forward" },
|
|
15
|
+
{ brand: "Burrow", trait: "friendly modular sofa CTAs + warm gradient backdrops + rounded chrome" },
|
|
16
|
+
{ brand: "Floyd", trait: "considered millennial home + sand cream + soft sage + lifestyle staging" },
|
|
17
|
+
],
|
|
18
|
+
feel:
|
|
19
|
+
"Friendly soft furniture catalog. Warm cream surfaces, walnut and sage accents, room-by-room " +
|
|
20
|
+
"navigation as the primary frame. Soft rounded cards with warm gradient backdrops, serif headlines " +
|
|
21
|
+
"for room names, humanist sans for product copy. The page reads like a West Elm/Article catalog: " +
|
|
22
|
+
"approachable, photographable, never showroom-cold and never beige-on-beige boring.",
|
|
23
|
+
|
|
24
|
+
fonts: {
|
|
25
|
+
display: {
|
|
26
|
+
family: "Fraunces",
|
|
27
|
+
fallback: ["Cormorant Garamond", "Georgia", "Times New Roman", "serif"],
|
|
28
|
+
from: "Article/CB2 serif headlines — friendly, soft, modern-classic catalog feel",
|
|
29
|
+
googleFont: "Fraunces",
|
|
30
|
+
weights: [400, 500, 600],
|
|
31
|
+
},
|
|
32
|
+
body: {
|
|
33
|
+
family: "Inter",
|
|
34
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
|
|
35
|
+
from: "West Elm/Burrow product copy — clean humanist sans, never sans-serif-display, readable",
|
|
36
|
+
googleFont: "Inter",
|
|
37
|
+
weights: [400, 500, 600],
|
|
38
|
+
},
|
|
39
|
+
mono: {
|
|
40
|
+
family: "JetBrains Mono",
|
|
41
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
42
|
+
from: "dimensions, sku numbers, ship-by dates — tabular numerals for catalog metadata",
|
|
43
|
+
googleFont: "JetBrains+Mono",
|
|
44
|
+
weights: [400, 500],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
typography: {
|
|
49
|
+
headingTracking: "-0.018em", // friendly serif, slightly tight
|
|
50
|
+
bodyTracking: "0",
|
|
51
|
+
fontFeatureSettings: '"ss01", "ss02", "tnum"', // Fraunces soft variants + tabular nums for prices
|
|
52
|
+
h1ScaleClamp: "clamp(2.25rem, 5.5vw, 4rem)",
|
|
53
|
+
bodyBaseSize: "1rem",
|
|
54
|
+
bodyLineHeight: "1.6",
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
colors: {
|
|
58
|
+
background: { hsl: "32 30% 96%", from: "West Elm warm cream — friendly catalog paper, never cold white" },
|
|
59
|
+
foreground: { hsl: "28 22% 16%", from: "Article walnut-ink — deep warm brown-black, holds palette" },
|
|
60
|
+
card: { hsl: "0 0% 100%", from: "pure white card — lifts off cream, lifestyle-photo backdrop feel" },
|
|
61
|
+
popover: { hsl: "0 0% 100%", from: "same as card" },
|
|
62
|
+
primary: { hsl: "22 60% 42%", from: "Article walnut — the canonical warm-wood accent for primary CTAs" },
|
|
63
|
+
primaryForeground: { hsl: "32 30% 96%", from: "cream on walnut" },
|
|
64
|
+
secondary: { hsl: "32 26% 92%", from: "deeper cream — secondary surface, sub-nav, filter chips" },
|
|
65
|
+
secondaryForeground: { hsl: "28 22% 16%", from: "walnut-ink on cream" },
|
|
66
|
+
muted: { hsl: "32 20% 90%", from: "stone-cream — muted panels, room-category filter row" },
|
|
67
|
+
mutedForeground: { hsl: "28 14% 42%", from: "warm gray — captions, dimensions, designer credits" },
|
|
68
|
+
accent: { hsl: "150 18% 56%", from: "Floyd sage — second accent for room-tags and sustainability badges" },
|
|
69
|
+
accentForeground: { hsl: "32 30% 96%", from: "cream on sage" },
|
|
70
|
+
border: { hsl: "32 22% 86%", from: "warm cream hairline — visible on bg, never harsh" },
|
|
71
|
+
input: { hsl: "32 22% 86%", from: "same as border" },
|
|
72
|
+
ring: { hsl: "22 60% 42%", from: "walnut primary, focus only" },
|
|
73
|
+
destructive: { hsl: "8 65% 50%", from: "warm rust-red — sold-out / removed-from-cart, CB2 rust adjacent" },
|
|
74
|
+
destructiveForeground: { hsl: "32 30% 96%", from: "cream on rust" },
|
|
75
|
+
brand: {
|
|
76
|
+
cream: { hsl: "32 30% 96%", from: "= background; West Elm warm catalog paper" },
|
|
77
|
+
"cream-deep": { hsl: "32 26% 92%", from: "secondary cream — one tone deeper, sub-nav" },
|
|
78
|
+
walnut: { hsl: "22 60% 42%", from: "= primary; Article walnut wood — the canonical accent" },
|
|
79
|
+
"walnut-deep": { hsl: "20 55% 28%", from: "Article walnut hover — gradient anchor, deep wood" },
|
|
80
|
+
sage: { hsl: "150 18% 56%", from: "= accent; Floyd sage — room-tag and sustainability accent" },
|
|
81
|
+
rust: { hsl: "18 65% 52%", from: "CB2 rust — seasonal collection mark, used sparingly" },
|
|
82
|
+
sand: { hsl: "32 35% 82%", from: "warm sand — room-tile gradient backdrop, lifestyle-photo halo" },
|
|
83
|
+
ink: { hsl: "28 22% 16%", from: "= foreground; walnut-ink, semantic for body and headings" },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
spacing: {
|
|
88
|
+
base: 4,
|
|
89
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
|
|
90
|
+
containerMax: "max-w-7xl", // wide — catalog needs lifestyle-photo room
|
|
91
|
+
containerPadding: "px-5 lg:px-10",
|
|
92
|
+
sectionPadding: {
|
|
93
|
+
hero: "pt-20 pb-16 lg:pt-28 lg:pb-24",
|
|
94
|
+
default: "py-16 lg:py-24",
|
|
95
|
+
tight: "py-10 lg:py-16",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
radius: {
|
|
100
|
+
base: "0.75rem", // 12px — soft but not pillowy; catalog-card softness
|
|
101
|
+
pillsAllowed: true, // pills for room categories, fabric swatches, ship-by chips
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
shadows: {
|
|
105
|
+
style: "soft",
|
|
106
|
+
utilities: {
|
|
107
|
+
"shadow-room":
|
|
108
|
+
"0 1px 2px hsl(28 22% 16% / 0.05), 0 8px 28px hsl(28 22% 16% / 0.08)",
|
|
109
|
+
"shadow-room-lg":
|
|
110
|
+
"0 2px 4px hsl(28 22% 16% / 0.06), 0 20px 56px hsl(28 22% 16% / 0.12)",
|
|
111
|
+
"shadow-cream-inset":
|
|
112
|
+
"inset 0 1px 0 hsl(0 0% 100% / 0.6)",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
motion: {
|
|
117
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
118
|
+
durations: {
|
|
119
|
+
reveal: 600,
|
|
120
|
+
loop: 2400,
|
|
121
|
+
ambient: 22000,
|
|
122
|
+
},
|
|
123
|
+
keyframes: {
|
|
124
|
+
"fade-rise": {
|
|
125
|
+
css:
|
|
126
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
127
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
128
|
+
defaultDuration: 600,
|
|
129
|
+
iteration: "once",
|
|
130
|
+
purpose: "room-card and product-tile entrance — friendly catalog responsiveness",
|
|
131
|
+
},
|
|
132
|
+
"scale-in": {
|
|
133
|
+
css:
|
|
134
|
+
"from { opacity: 0; transform: scale(0.96); }\n" +
|
|
135
|
+
"to { opacity: 1; transform: scale(1); }",
|
|
136
|
+
defaultDuration: 220,
|
|
137
|
+
iteration: "once",
|
|
138
|
+
purpose: "swatch swap and add-to-cart confirmation",
|
|
139
|
+
},
|
|
140
|
+
"ken-burns-soft": {
|
|
141
|
+
css:
|
|
142
|
+
"0% { transform: scale(1.02); }\n" +
|
|
143
|
+
"100% { transform: scale(1.08); }",
|
|
144
|
+
defaultDuration: 22000,
|
|
145
|
+
iteration: "infinite",
|
|
146
|
+
purpose: "single hero room-photograph drift — never on grid tiles, only on the lead image",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
respectsReducedMotion: true,
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
density: "medium",
|
|
153
|
+
|
|
154
|
+
patterns: {
|
|
155
|
+
button:
|
|
156
|
+
"Solid-fill primary (walnut bg, cream text, rounded-lg, shadow-room). Secondary is white card " +
|
|
157
|
+
"with walnut border. Tertiary is text-link in walnut-deep with underline-on-hover. " +
|
|
158
|
+
"Filter chips are pills with cream bg. Hover lifts shadow-room → shadow-room-lg.",
|
|
159
|
+
card:
|
|
160
|
+
"Rounded-xl, white bg, soft cream border, shadow-room. Internal padding p-5 lg:p-7. " +
|
|
161
|
+
"Title in Fraunces 500; price + dimensions in Inter + JetBrains Mono. Hover lifts shadow-room-lg.",
|
|
162
|
+
input:
|
|
163
|
+
"Full rounded-lg box, cream border, white bg. Focus = walnut 2px ring at 35% opacity. " +
|
|
164
|
+
"Label above in Inter 500, helper text below in muted-foreground.",
|
|
165
|
+
cta:
|
|
166
|
+
"Walnut-fill primary button is the default. Secondary CTAs use white-card or text-link. " +
|
|
167
|
+
"Room-category nav is a pill row, never a dropdown.",
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
details: {
|
|
171
|
+
selectionBg: "hsl(var(--walnut) / 0.20)",
|
|
172
|
+
selectionFg: "hsl(var(--foreground))",
|
|
173
|
+
focusRing: "2px solid hsl(var(--ring) / 0.45)",
|
|
174
|
+
scrollbarStyle: "thin",
|
|
175
|
+
},
|
|
176
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Design Direction — Gaming-Esports
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Riot Games signal-red broadcast · T1 cinematic black + restrained gold · 100 Thieves matte black streetwear · Faze Clan signal red bold · Astralis Danish gold elegance
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Premium broadcast-grade gaming brand. Dark cinematic canvas, sharp condensed display type, team-color signal red as the brand mark, restrained championship gold as the focus and accent, full-bleed player portraits color-graded for broadcast. The page reads as the **League of Legends Worlds opening ceremony**, a T1 roster reveal, a 100 Thieves product drop — production design, not platform UI.
|
|
8
|
+
|
|
9
|
+
Where gaming-streamer is loud-friendly and live-now (purple, presence dots, chat tickers), gaming-esports is **quiet at rest, signal-loud at the brand moments**. Where cinematic-dark is Tesla-engineered and Rolex-restrained (gold-only luxury), gaming-esports is Riot-broadcast and team-color-charged (signal red as the brand mark, gold as the luxury accent for finals/championships only).
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Riot Games** → black canvas + signal red, the League brand mark, Worlds-broadcast production design. The dominant template — this direction owes Riot the signal-red discipline.
|
|
13
|
+
- **T1 esports** → cinematic matte-black, restrained gold accent, Korean roster dignity. The roster-page posture.
|
|
14
|
+
- **100 Thieves** → matte-black + signal red, premium streetwear-adjacent aesthetic. The product-drop / merch-store altitude.
|
|
15
|
+
- **Faze Clan** → dark canvas + signal red, bold condensed all-caps display. The headline-type energy.
|
|
16
|
+
- **Astralis** → dark canvas + restrained Danish gold, considered roster portraiture. The gold-as-luxury-accent source.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
20
|
+
|
|
21
|
+
Surface stack is **matte-black canvas** (background, `0 0% 4%`) → **lifted card** (`0 0% 7%`) → **popover** (`0 0% 9%`) → **dark steel** (`0 0% 12%`) → **muted** (`0 0% 14%`) → **accent hover** (`0 0% 17%`). The entire stack is neutral-black (zero hue), not blue-black or warm-black — esports broadcast cinematography is graded neutral, not tinted. Depth comes from `.shadow-broadcast` (deep neutral drop) and the occasional `.glow-red` halo on the hero CTA.
|
|
22
|
+
|
|
23
|
+
Primary is **Riot/Faze/100T signal red** (`0 85% 50%`) — the team-color brand mark, restrained in deployment. It is also `--destructive` — the team-color and the warning state share the same brand mark, deliberately, because in this language signal red IS attention.
|
|
24
|
+
|
|
25
|
+
Ring is **Astralis / T1 restrained gold** (`42 70% 56%`) — focus is the luxury accent, never signal red. Red is the brand; gold is the moment.
|
|
26
|
+
|
|
27
|
+
Brand tokens — the working palette:
|
|
28
|
+
- `--riot-red` and `--riot-red-deep` — primary brand mark and gradient/shadow anchor.
|
|
29
|
+
- `--t1-black` — = `--background`; semantic for full-bleed hero backdrop.
|
|
30
|
+
- `--100t-matte` — = `--card`; streetwear product-page card tone.
|
|
31
|
+
- `--astralis-gold` and `--astralis-gold-deep` — focus/ring color and championship/finals accent.
|
|
32
|
+
- `--broadcast-white` — = `--foreground`; the lower-third caption white.
|
|
33
|
+
- `--stat-cyan` — broadcast HUD accent for match-broadcast surfaces only (gold differential, mini-map plates). **Never on marketing pages** — reserved for in-broadcast data overlays.
|
|
34
|
+
|
|
35
|
+
## Typography
|
|
36
|
+
- **Display:** Oswald (open-source condensed broadcast headline — Riot/Faze poster weight). h1–h4, weights 500/600/700. All-caps friendly, Worlds-stage poster discipline. Headings track **`0.06em` positive** — condensed type at scale reads better with positive tracking, and broadcast lower-thirds are tracked wide by convention.
|
|
37
|
+
- **Body:** Inter. Base **16px** with **line-height 1.55** — comfortable on dark surfaces, T1/100T roster-page convention.
|
|
38
|
+
- **Mono:** JetBrains Mono. Broadcast scoreboard numerics — match clock, KDA, gold differential, tournament seed. Tabular numerics mandatory.
|
|
39
|
+
|
|
40
|
+
H1 uses `clamp(3rem, 9vw, 7rem)` — oversized, broadcast title-card scale. Body tracking sits at `0.01em` for slight broadcast-caption tightness. Font features: `"ss01", "tnum", "case", "cv11"`.
|
|
41
|
+
|
|
42
|
+
**All-caps convention:** display headlines and CTA labels are uppercase by default (Oswald is designed for it). Body copy is sentence case.
|
|
43
|
+
|
|
44
|
+
## Spacing
|
|
45
|
+
- **Container:** `max-w-7xl px-6 lg:px-10` — wide enough for 21:9 full-bleed roster stills and broadcast-grade hero photography.
|
|
46
|
+
- **Section padding tiers:**
|
|
47
|
+
- Hero: `pt-24 pb-16 lg:pt-36 lg:pb-24` — broadcast title-card scale
|
|
48
|
+
- Default: `py-20 lg:py-32`
|
|
49
|
+
- Tight: `py-12 lg:py-16`
|
|
50
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128 160. Medium density — cinematic breathing room.
|
|
51
|
+
|
|
52
|
+
## Color
|
|
53
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier.
|
|
54
|
+
|
|
55
|
+
The palette is **matte-black canvas + signal red brand mark + championship gold luxury accent** — never multi-color, never desaturated team rainbows. Signal red is restrained — used on the brand mark, the single hero CTA per page, the LIVE / FINAL match badge, the destructive state. Gold is luxury — used on focus rings, finals/championship surfaces, trophy moments, gold-medal stat callouts.
|
|
56
|
+
|
|
57
|
+
Pure black is forbidden — `--background` is `0 0% 4%`, the matte-black tone broadcast cinematography uses. Pure white is forbidden — `--foreground` is `40 20% 96%`, the warm broadcast-caption white. Stat-cyan exists for match-broadcast surfaces only — using it on marketing pages reads broadcast-HUD-out-of-context.
|
|
58
|
+
|
|
59
|
+
**Signal red discipline:** signal red is the brand mark. Bleeding it onto every CTA, every divider, every link destroys the "this matters right now" signal. The rule: **one signal-red moment per visible viewport** (the hero CTA, or the LIVE badge, or the finals callout — pick one).
|
|
60
|
+
|
|
61
|
+
## Radius
|
|
62
|
+
`--radius: 0.25rem` (4px). **Sharp, engineered chamfer.** Pills are forbidden (`pillsAllowed: false`) — esports broadcast language uses rectangles, bevels, and angled cuts, never rounded chips. Pillow-soft rounding reads consumer app / streamer-platform; sharp rectangles read production design.
|
|
63
|
+
|
|
64
|
+
## Shadows
|
|
65
|
+
Four utilities — broadcast-grade discipline:
|
|
66
|
+
|
|
67
|
+
- `.glow-red` — signal-red halo. **Used only on the single hero CTA per page or the LIVE match badge.** Bleeding it onto multiple CTAs ruins the signal — the rule is one glow-red per visible viewport.
|
|
68
|
+
- `.glow-gold` — championship gold halo for finals/trophy/championship surfaces. Astralis-roster, T1-finals territory. Restrained — gold is the luxury moment, not the default.
|
|
69
|
+
- `.shadow-broadcast` — deep neutral drop for full-bleed feature cards and roster-reveal tiles. The default heavy-elevation utility.
|
|
70
|
+
- `.edge-lower-third` — inset bottom 2px signal-red. The broadcast lower-third underline — sits under name plates on roster tiles, under section eyebrows, under the active nav item. **The single subtle red moment** allowed across the page.
|
|
71
|
+
|
|
72
|
+
Shadows are **neutral-black or signal-saturated** — never colored drop with a tint other than red/gold. Cool-blue or purple-tinted shadows read streamer-platform or cinematic-dark, both wrong-tab.
|
|
73
|
+
|
|
74
|
+
## Motion
|
|
75
|
+
Four keyframes, broadcast-paced:
|
|
76
|
+
|
|
77
|
+
- `broadcast-rise` (1000ms once) — roster-reveal and section entrance. Slow broadcast title-card lift, translateY(48px) → 0. Longer than streamer-platform; this is production, not real-time.
|
|
78
|
+
- `ken-burns` (24000ms infinite) — full-bleed player portrait drift on hero photography. Worlds-broadcast camera push.
|
|
79
|
+
- `lower-third-wipe` (600ms once) — name/role plate wipes in left-to-right, the canonical broadcast lower-third reveal. Pairs with `.edge-lower-third`.
|
|
80
|
+
- `scoreboard-flicker` (4000ms infinite) — subtle live-match scoreboard CRT-flicker hint. **Restricted to the score plate only** — bleeding it onto body copy reads broken, not broadcast.
|
|
81
|
+
|
|
82
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `broadcast-rise` collapses to opacity-only, `ken-burns` collapses to a static scale, `lower-third-wipe` collapses to a static visible state, `scoreboard-flicker` collapses to a stable opacity 1.
|
|
83
|
+
|
|
84
|
+
No `marquee`-style scrolling tickers. Esports broadcast pacing is slow reveals and static plates, not horizontal scrolls — those are streamer-platform.
|
|
85
|
+
|
|
86
|
+
## Component patterns
|
|
87
|
+
- **Buttons:** primary CTA = sharp 0.25rem signal-red rect, broadcast-white text, weight 700, uppercase, tracking `0.08em`. `.glow-red` allowed on the **ONE** hero CTA per page. Secondary = bordered ghost (`border-foreground/0.4`, transparent bg, foreground text, uppercase tracked). Tertiary = text-link in `--astralis-gold` with `underline-offset-2 hover:underline`. **Pills are forbidden** — every CTA is a rectangle.
|
|
88
|
+
- **Cards:** roster-tile card = sharp 0.25rem corners, 1px `border-border`, `bg-card`. Padding `p-6 lg:p-10`. Title in Oswald uppercase tracking 0.08em; player handle in Inter weight 700; role in mono caption. **Full-bleed portrait variant** fills the card with a player image, gradient overlay from `t1-black/0` at top to `t1-black/90` at bottom, name plate at the bottom edge with `.edge-lower-third` red underline. **Featured-tile variant** uses `.shadow-broadcast` for finals/championship surfaces.
|
|
89
|
+
- **Inputs:** sharp 0.25rem corners, `bg-card`, 1px `border-input`. Label sits above in Oswald uppercase tracking `0.1em` in `mutedForeground`. Focus shifts ring to 1px `--astralis-gold` (never red — red is signal, not focus). Helper text below in Inter weight 400.
|
|
90
|
+
- **CTAs:** sharp signal-red rect for the single hero action ("BUY TICKETS," "WATCH FINALS," "ROSTER REVEAL") — uppercase, tracked, weight 700. Secondary CTAs are bordered ghost rectangles. Tertiary are gold underlined text-links. **Never a pill, never a gradient on the primary** — the signal-red rect IS the brand mark.
|
|
91
|
+
|
|
92
|
+
## Component families
|
|
93
|
+
None at install time. As `*RosterTile`, `*LowerThird`, `*ScorePlate`, `*ChampionshipBanner`, `*MatchClock`, `*PortraitCard` families emerge, the Director lists them here with their shared pattern.
|
|
94
|
+
|
|
95
|
+
## Recommended rich media
|
|
96
|
+
|
|
97
|
+
### Cover and hero imagery
|
|
98
|
+
**Player portraiture, broadcast-graded.** This is production design — every hero is anchored by a real player or a real broadcast still, never abstract gradient or 3D render.
|
|
99
|
+
|
|
100
|
+
- **Full-bleed player portraits** — three-quarter or half-body shots of players in team jerseys, dramatic rim lighting (cool key, warm rim), color-graded matte-black background. Worlds-broadcast roster reveal aesthetic.
|
|
101
|
+
- **Broadcast stage stills** — wide shots of esports arenas mid-match, crowd glow visible, jumbotron in frame, restrained signal-red highlights.
|
|
102
|
+
- **Trophy / championship moments** — players hoiding the Summoner's Cup, gold-graded highlights, championship-gold accent overlay.
|
|
103
|
+
- **Streetwear product flats** — 100 Thieves drop aesthetic; merch laid on matte-black seamless, signal-red branded pieces, single-strobe overhead lighting.
|
|
104
|
+
- **21:9 cinematic stills** — extra-wide aspect ratio for the title-card hero; this is the only direction that calls for 21:9.
|
|
105
|
+
|
|
106
|
+
### AI tool recommendations
|
|
107
|
+
- **Midjourney** for player portrait hero stills. Prompt scaffold: *"esports player portrait, three-quarter angle, dramatic cool key light with warm signal-red rim, matte-black studio background, color-graded for broadcast, 21:9 cinematic"*. Always specify matte-black and broadcast color grade.
|
|
108
|
+
- **Flux** for broadcast stage stills. Prompt scaffold: *"esports arena stage, wide shot, jumbotron in frame, crowd in dim background, signal-red brand lighting, dramatic broadcast cinematography"*.
|
|
109
|
+
- **Runway** for slow ken-burns hero loops — apply the `ken-burns` keyframe to a still, do not generate native video unless the loop is broadcast-graded.
|
|
110
|
+
- Avoid Midjourney's default high-saturation gaming-art look — explicitly prompt for broadcast color grade, never "vibrant gaming."
|
|
111
|
+
|
|
112
|
+
### Aspect ratios
|
|
113
|
+
- **21:9 cinematic** — title-card hero, full-bleed player portrait. The signature aspect.
|
|
114
|
+
- **16:9 landscape** — broadcast stills, match recap photography.
|
|
115
|
+
- **3:4 portrait** — roster-tile player portraits, the mandatory roster-grid ratio.
|
|
116
|
+
- **1:1 square** — team logos, championship trophy thumbnails.
|
|
117
|
+
- Avoid 9:16 vertical (streamer/creator-social territory). Avoid 4:3 (off-feel; broadcast doesn't shoot 4:3 anymore).
|
|
118
|
+
|
|
119
|
+
### Color discipline for imagery
|
|
120
|
+
Broadcast-grade neutral. Matte-black backgrounds, cool key + warm rim lighting, restrained signal-red highlights, championship-gold for finals moments. **If a source image has a saturated rainbow gaming-art cast or default-Midjourney glow, regrade it or do not use it** — the production-design language breaks the moment a "vibrant gaming" image lands.
|
|
121
|
+
|
|
122
|
+
### What to AVOID
|
|
123
|
+
- **Saturated rainbow gaming art** — that is indie-art-game or streamer-platform territory; reads consumer-game-fan-art, not esports-production.
|
|
124
|
+
- **Purple-tinted dark backgrounds** — streamer-platform territory (gaming-streamer).
|
|
125
|
+
- **Round / pill / soft chrome** — wrong production altitude entirely.
|
|
126
|
+
- **Stock crowd photography** — kills the broadcast-trust signal; use real arena stills or skip.
|
|
127
|
+
- **Multi-color team rainbow palettes** — esports brand discipline is single-team-color (signal red here); if you need a different team color, the project is a different direction.
|
|
128
|
+
- **Live presence dots / chat tickers** — gaming-streamer territory.
|
|
129
|
+
|
|
130
|
+
### Accessibility
|
|
131
|
+
- **Long-form alt-text on player portraits** — *"Player Faker in three-quarter portrait, T1 jersey, dramatic cool key light, matte-black background."* Treat as broadcast caption.
|
|
132
|
+
- **Signal red on broadcast-white** passes WCAG AA at 14pt+; verify at small caption sizes — small red text on the matte-black canvas is risky.
|
|
133
|
+
- **Uppercase tracked display** — must carry `aria-label` with proper-case text when the visual label is an abbreviation (e.g., "KDA" → `aria-label="kills, deaths, assists"`).
|
|
134
|
+
- All keyframe animations collapse under `prefers-reduced-motion` — verify in DevTools, not just by reading the CSS. `scoreboard-flicker` in particular must hold stable opacity 1 under reduced motion (flicker is a vestibular concern).
|
|
135
|
+
- `.glow-red` and `.glow-gold` are decorative — mark with `aria-hidden="true"`; the label text is the accessible signal.
|
|
136
|
+
|
|
137
|
+
## Details
|
|
138
|
+
- **Selection:** `hsl(var(--astralis-gold) / 0.35)` background, foreground text. **Gold not red** — selection is a quiet moment, signal red is too loud for it.
|
|
139
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` — thin, gold, broadcast-quiet. Never the 2px assertive ring of dashboard languages.
|
|
140
|
+
- **Scrollbar:** thin.
|
|
141
|
+
|
|
142
|
+
## Exceptions
|
|
143
|
+
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.
|
|
144
|
+
|
|
145
|
+
## Revisions
|
|
146
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const gamingEsports: Direction = {
|
|
4
|
+
name: "gaming-esports",
|
|
5
|
+
ethos:
|
|
6
|
+
"Riot Games signal-red broadcast · T1 cinematic black + restrained gold · 100 Thieves matte black streetwear · Faze signal red bold · Astralis Danish gold elegance",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Riot Games", trait: "black canvas + signal red, League brand mark, Worlds-broadcast production" },
|
|
9
|
+
{ brand: "T1 esports", trait: "cinematic black, restrained gold accent, Korean roster dignity" },
|
|
10
|
+
{ brand: "100 Thieves", trait: "matte black + signal red, premium streetwear-adjacent aesthetic" },
|
|
11
|
+
{ brand: "Faze Clan", trait: "dark canvas + signal red, bold all-caps display type" },
|
|
12
|
+
{ brand: "Astralis", trait: "dark canvas + restrained gold, Danish elegance, considered roster portraiture" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Premium broadcast-grade gaming brand. Dark cinematic canvas, sharp condensed display type, " +
|
|
16
|
+
"team-color signal red, full-bleed player portraits color-graded for broadcast. Reads as the " +
|
|
17
|
+
"League of Legends Worlds opening ceremony, a T1 roster reveal, a 100 Thieves drop page — " +
|
|
18
|
+
"production design, not platform UI. Quiet at rest; signal-loud at the brand moments.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Oswald",
|
|
23
|
+
fallback: ["Bebas Neue", "Anton", "Impact", "Haettenschweiler", "Arial Narrow Bold", "sans-serif"],
|
|
24
|
+
from: "Riot Games / Faze condensed broadcast headline — all-caps friendly, Worlds-stage poster weight",
|
|
25
|
+
googleFont: "Oswald",
|
|
26
|
+
weights: [500, 600, 700],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Inter",
|
|
30
|
+
fallback: ["Manrope", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
31
|
+
from: "Neutral broadcast body sans — readable at small sizes against dark canvas, T1/100T roster-page convention",
|
|
32
|
+
googleFont: "Inter",
|
|
33
|
+
weights: [400, 500, 600, 700],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["SF Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "Broadcast scoreboard numerics — match clock, KDA, gold differential, tournament seed",
|
|
39
|
+
googleFont: "JetBrains+Mono",
|
|
40
|
+
weights: [400, 500, 700],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "0.06em",
|
|
46
|
+
bodyTracking: "0.01em",
|
|
47
|
+
fontFeatureSettings: '"ss01", "tnum", "case", "cv11"',
|
|
48
|
+
h1ScaleClamp: "clamp(3rem, 9vw, 7rem)",
|
|
49
|
+
bodyBaseSize: "1rem",
|
|
50
|
+
bodyLineHeight: "1.55",
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "0 0% 4%", from: "Riot/100T matte-black canvas — near-black, slightly warm to match broadcast cinematography" },
|
|
55
|
+
foreground: { hsl: "40 20% 96%", from: "Warm off-white — broadcast caption white, never pure" },
|
|
56
|
+
card: { hsl: "0 0% 7%", from: "Lifted card surface — roster-tile background, one stop up from matte-black" },
|
|
57
|
+
popover: { hsl: "0 0% 9%", from: "Popover/menu surface, two stops up" },
|
|
58
|
+
|
|
59
|
+
primary: { hsl: "0 85% 50%", from: "Riot / Faze / 100T signal red — the team-color brand mark, restrained in deployment" },
|
|
60
|
+
primaryForeground: { hsl: "40 20% 96%", from: "Warm-white on signal red" },
|
|
61
|
+
|
|
62
|
+
secondary: { hsl: "0 0% 12%", from: "Cinematic dark steel — deeper roster-card surface, broadcast lower-third plate" },
|
|
63
|
+
secondaryForeground: { hsl: "40 20% 96%", from: "Warm-white on dark steel" },
|
|
64
|
+
muted: { hsl: "0 0% 14%", from: "Muted surface — quieter roster-meta plates, stat blocks" },
|
|
65
|
+
mutedForeground: { hsl: "40 10% 64%", from: "Broadcast-still gray — caption text, player handles at rest, match-history meta" },
|
|
66
|
+
accent: { hsl: "0 0% 17%", from: "Hover surface — Astralis brushed-steel highlight, roster-row hover" },
|
|
67
|
+
accentForeground: { hsl: "40 20% 96%", from: "Warm-white on accent" },
|
|
68
|
+
|
|
69
|
+
border: { hsl: "0 0% 18%", from: "Hairline panel-gap — broadcast lower-third edge, engineered visible only on inspection" },
|
|
70
|
+
input: { hsl: "0 0% 20%", from: "Slightly stronger than border for input affordance" },
|
|
71
|
+
ring: { hsl: "42 70% 56%", from: "Astralis / T1 restrained gold — focus is the luxury accent, never signal red" },
|
|
72
|
+
|
|
73
|
+
destructive: { hsl: "0 85% 50%", from: "= primary; signal red doubles as destructive — team-color and warning share the same brand mark" },
|
|
74
|
+
destructiveForeground: { hsl: "40 20% 96%", from: "Warm-white on signal red" },
|
|
75
|
+
|
|
76
|
+
brand: {
|
|
77
|
+
"riot-red": { hsl: "0 85% 50%", from: "= primary; Riot Games signal red, League of Legends Worlds brand mark" },
|
|
78
|
+
"riot-red-deep": { hsl: "0 80% 40%", from: "Pressed/deeper red — gradient anchor, broadcast title-card shadow tone" },
|
|
79
|
+
"t1-black": { hsl: "0 0% 4%", from: "= background; T1 cinematic matte-black, semantic for full-bleed hero backdrop" },
|
|
80
|
+
"100t-matte": { hsl: "0 0% 7%", from: "100 Thieves matte-black surface — streetwear product-page card tone" },
|
|
81
|
+
"astralis-gold": { hsl: "42 70% 56%", from: "= ring; Astralis / T1 restrained gold, championship trophy hue" },
|
|
82
|
+
"astralis-gold-deep": { hsl: "38 60% 42%", from: "Deeper gold — engraved-trophy gradient anchor, finals-banner shadow" },
|
|
83
|
+
"broadcast-white": { hsl: "40 20% 96%", from: "= foreground; broadcast caption white, also lower-third text plate" },
|
|
84
|
+
"stat-cyan": { hsl: "195 90% 60%", from: "Broadcast HUD cyan — alternate stat-overlay accent (gold-differential, mini-map), used in match-broadcast surfaces only" },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
spacing: {
|
|
89
|
+
base: 4,
|
|
90
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160],
|
|
91
|
+
containerMax: "max-w-7xl",
|
|
92
|
+
containerPadding: "px-6 lg:px-10",
|
|
93
|
+
sectionPadding: {
|
|
94
|
+
hero: "pt-24 pb-16 lg:pt-36 lg:pb-24",
|
|
95
|
+
default: "py-20 lg:py-32",
|
|
96
|
+
tight: "py-12 lg:py-16",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
radius: {
|
|
101
|
+
base: "0.25rem",
|
|
102
|
+
pillsAllowed: false,
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
shadows: {
|
|
106
|
+
style: "glow",
|
|
107
|
+
utilities: {
|
|
108
|
+
"glow-red":
|
|
109
|
+
"0 0 0 1px hsl(var(--riot-red) / 0.4), " +
|
|
110
|
+
"0 8px 24px hsl(var(--riot-red) / 0.25), " +
|
|
111
|
+
"0 40px 120px hsl(var(--riot-red) / 0.18)",
|
|
112
|
+
"glow-gold":
|
|
113
|
+
"0 0 0 1px hsl(var(--astralis-gold) / 0.35), " +
|
|
114
|
+
"0 8px 24px hsl(var(--astralis-gold) / 0.18), " +
|
|
115
|
+
"0 40px 120px hsl(var(--astralis-gold) / 0.22)",
|
|
116
|
+
"shadow-broadcast":
|
|
117
|
+
"0 4px 12px hsl(0 0% 0% / 0.6), 0 24px 80px hsl(0 0% 0% / 0.5)",
|
|
118
|
+
"edge-lower-third":
|
|
119
|
+
"inset 0 -2px 0 hsl(var(--riot-red))",
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
motion: {
|
|
124
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
125
|
+
durations: {
|
|
126
|
+
reveal: 1000,
|
|
127
|
+
loop: 2400,
|
|
128
|
+
ambient: 30000,
|
|
129
|
+
},
|
|
130
|
+
keyframes: {
|
|
131
|
+
"broadcast-rise": {
|
|
132
|
+
css:
|
|
133
|
+
"from { opacity: 0; transform: translateY(48px); }\n" +
|
|
134
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
135
|
+
defaultDuration: 1000,
|
|
136
|
+
iteration: "once",
|
|
137
|
+
purpose: "roster-reveal and section entrance — slow broadcast title-card lift",
|
|
138
|
+
},
|
|
139
|
+
"ken-burns": {
|
|
140
|
+
css:
|
|
141
|
+
"0% { transform: scale(1.06) translate(0, 0); }\n" +
|
|
142
|
+
"100% { transform: scale(1.18) translate(-2%, -1%); }",
|
|
143
|
+
defaultDuration: 24000,
|
|
144
|
+
iteration: "infinite",
|
|
145
|
+
purpose: "full-bleed player portrait drift — Worlds-broadcast camera push on hero photography",
|
|
146
|
+
},
|
|
147
|
+
"lower-third-wipe": {
|
|
148
|
+
css:
|
|
149
|
+
"from { transform: scaleX(0); transform-origin: left; }\n" +
|
|
150
|
+
"to { transform: scaleX(1); transform-origin: left; }",
|
|
151
|
+
defaultDuration: 600,
|
|
152
|
+
iteration: "once",
|
|
153
|
+
purpose: "broadcast lower-third reveal — name/role plate wipes in left-to-right, the canonical reveal gesture",
|
|
154
|
+
},
|
|
155
|
+
"scoreboard-flicker": {
|
|
156
|
+
css:
|
|
157
|
+
"0%, 100% { opacity: 1; }\n" +
|
|
158
|
+
"92% { opacity: 1; }\n" +
|
|
159
|
+
"94% { opacity: 0.85; }\n" +
|
|
160
|
+
"96% { opacity: 1; }",
|
|
161
|
+
defaultDuration: 4000,
|
|
162
|
+
iteration: "infinite",
|
|
163
|
+
purpose: "live-match scoreboard subtle flicker — broadcast-feed CRT hint on the score plate only, never on body copy",
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
respectsReducedMotion: true,
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
density: "medium",
|
|
170
|
+
|
|
171
|
+
patterns: {
|
|
172
|
+
button:
|
|
173
|
+
"Primary CTA = sharp 0.25rem rect with bg-primary (signal red) and broadcast-white text, weight 700, tracking 0.08em uppercase. " +
|
|
174
|
+
"Pulse-glow / .glow-red allowed on the ONE hero CTA per page. " +
|
|
175
|
+
"Secondary = bordered ghost (border-foreground/0.4, transparent bg, foreground text, uppercase tracked). " +
|
|
176
|
+
"Tertiary = text-link in astralis-gold (the luxury accent), underline on hover. " +
|
|
177
|
+
"Pills are forbidden — esports broadcast language uses rectangles and bevels, never rounded chips.",
|
|
178
|
+
card:
|
|
179
|
+
"Roster-tile card = sharp 0.25rem corners, 1px border-border, bg-card (one stop above matte-black). " +
|
|
180
|
+
"Padding p-6 lg:p-10. Title in Oswald uppercase tracking 0.08em; player handle in Inter weight 700; role in mono caption. " +
|
|
181
|
+
"Full-bleed portrait variant fills the card with a player image, gradient overlay from t1-black/0 at top to t1-black/90 at bottom, name plate at the bottom edge with .edge-lower-third red underline. " +
|
|
182
|
+
"Featured-tile variant uses .shadow-broadcast for finals/championship surfaces.",
|
|
183
|
+
input:
|
|
184
|
+
"Sharp 0.25rem corners, bg-card, 1px border-input. Label sits above in Oswald uppercase tracking 0.1em mutedForeground. " +
|
|
185
|
+
"Focus shifts ring to 1px astralis-gold (never red — red is signal, not focus). " +
|
|
186
|
+
"Helper text below in Inter weight 400 mutedForeground.",
|
|
187
|
+
cta:
|
|
188
|
+
"Sharp signal-red rect for the single hero action (BUY TICKETS, WATCH FINALS, ROSTER REVEAL) — uppercase, tracked 0.08em, weight 700. " +
|
|
189
|
+
"Secondary CTAs are bordered ghost rectangles. Tertiary are gold underlined text-links. " +
|
|
190
|
+
"Never a pill, never a gradient on the primary CTA — the signal-red rect IS the brand mark.",
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
details: {
|
|
194
|
+
selectionBg: "hsl(var(--astralis-gold) / 0.35)",
|
|
195
|
+
selectionFg: "hsl(var(--foreground))",
|
|
196
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
197
|
+
scrollbarStyle: "thin",
|
|
198
|
+
},
|
|
199
|
+
};
|