@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,139 @@
|
|
|
1
|
+
# Design Direction — Gaming-Streamer
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Twitch saturated purple · Discord blurple presence · Kick signal-green youth · YouTube Gaming creator-red · Streamlabs overlay-friendly purple
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Loud-friendly gaming streamer / community platform. Saturated purples as the primary canvas, neon accents for live presence, a multi-color status palette for online / idle / DND / streaming / raiding, and chrome that feels real-time: pulsing live dots, animated chat tickers, multi-color reaction emoji, follower counts that tick up.
|
|
8
|
+
|
|
9
|
+
Reads as **"everyone is online right now, and someone is going live."** Where creator-social is mobile-vertical and TikTok-saturated, gaming-streamer is desktop-grid and Twitch-saturated — denser tile layouts, chat as a first-class surface, presence as the dominant signal language.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Twitch** → saturated purple `#9146FF` wordmark, Inter-class type, dense chat UI, the canonical live-now dot. The dominant template.
|
|
13
|
+
- **Discord** → blurple primary, friendly geometric sans, status pills (online green / idle yellow / DND red). The presence-language source.
|
|
14
|
+
- **Kick** → signal green on dark canvas, youthful streamer-platform energy. Secondary live-now signal.
|
|
15
|
+
- **YouTube Gaming** → deep red badge, dark canvas, creator-tools chrome. The "LIVE" badge color and the destructive/warning hue.
|
|
16
|
+
- **Streamlabs** → purple creator-overlay aesthetic, alert-box visual language (subscriber/raid/bits alerts). The alert-pop and ticker patterns trace here.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
20
|
+
|
|
21
|
+
Surface stack is **Twitch purple-black canvas** (background, `260 22% 8%`) → **lifted card** (`260 20% 12%`) → **popover** (`260 18% 14%`) → **secondary** (`260 16% 18%`) → **muted** (`260 14% 22%`). The whole stack is cool-purple-tinted — going neutral gray reads dashboard, not streamer platform. Depth comes from a saturated `.glow-purple` halo on key surfaces plus `.shadow-tile` on stream grids.
|
|
22
|
+
|
|
23
|
+
Primary is **Twitch purple** (`264 90% 62%`) — the follow-button color, the dominant CTA, the streaming-now presence dot.
|
|
24
|
+
|
|
25
|
+
Brand tokens — the multi-color status palette is the working vocabulary, not decoration:
|
|
26
|
+
- `--twitch-purple` and `--twitch-purple-deep` — primary CTA and pressed state.
|
|
27
|
+
- `--discord-blurple` — community-platform secondary product accent (Discord-style CTAs, server-join buttons).
|
|
28
|
+
- `--kick-green` — alternate live-now signal, the Kick-platform variant; also "stream successfully started" confirmation.
|
|
29
|
+
- `--yt-red` — = `--destructive`; also the canonical LIVE badge color.
|
|
30
|
+
- `--status-online`, `--status-idle`, `--status-dnd`, `--status-streaming` — the four presence dots. **These ARE the language**, not decoration. Use them on user avatars, chat-roster rows, and the "now playing" header.
|
|
31
|
+
- `--alert-cyan`, `--alert-magenta` — Streamlabs alert-tier accents for subscriber and bits notifications. Pair with `--twitch-purple` in the upgrade-CTA gradient — never split.
|
|
32
|
+
|
|
33
|
+
## Typography
|
|
34
|
+
- **Display:** Inter (open-source stand-in for Twitch's Roobert and Discord's gg sans). h1–h4, weights 600/700/800/900. **Never below 600** for display — streamer-platform display copy is bold, broadcast-poster weight.
|
|
35
|
+
- **Body:** Inter (single-face platform convention — Twitch, Discord, Kick all run an Inter-class sans). Base **15px** with **line-height 1.5** — chat-readable, dense.
|
|
36
|
+
- **Mono:** JetBrains Mono. Chat timestamps, viewer counts, bit/sub counts, stream-elapsed clocks — broadcast-overlay numerics. Tabular numerics mandatory.
|
|
37
|
+
|
|
38
|
+
Headings track `-0.02em` — tight, streamer-display feel. H1 uses `clamp(2.5rem, 7vw, 4.75rem)` — bigger than dashboard, smaller than cinematic. Inter stylistic sets `"cv11", "ss01"` plus `"tnum"` for the viewer-count numerics that update in real time.
|
|
39
|
+
|
|
40
|
+
## Spacing
|
|
41
|
+
- **Container:** `max-w-7xl px-4 lg:px-8` — wide enough for 4-up or 5-up stream-tile grids plus the chat sidebar.
|
|
42
|
+
- **Section padding tiers:**
|
|
43
|
+
- Hero: `pt-16 pb-10 lg:pt-24 lg:pb-14`
|
|
44
|
+
- Default: `py-12 lg:py-16`
|
|
45
|
+
- Tight: `py-8 lg:py-12`
|
|
46
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80. Medium density — stream tiles pack tight, chat sits at high density.
|
|
47
|
+
|
|
48
|
+
## Color
|
|
49
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier.
|
|
50
|
+
|
|
51
|
+
The palette is **purple-black canvas + saturated brand purple + multi-color status signals** — never desaturated, never neutral gray. The cool-purple surface stack is the canvas; Twitch purple is the action; the four status hues (online/idle/DND/streaming) are the presence language; Kick green / YT red / Discord blurple are the platform-cross-reference signals.
|
|
52
|
+
|
|
53
|
+
Pure black is forbidden — `--background` is the cool purple-black at `260 22% 8%`. Pure white is forbidden — `--foreground` is the cool-tinted off-white at `260 12% 96%`. Warm whites read streaming-warm-channel rather than streamer-platform.
|
|
54
|
+
|
|
55
|
+
**Status color discipline:** use the right status token for the right semantic — `--status-streaming` (purple) for streaming-now, `--status-online` (green) for online-not-streaming, `--status-idle` (yellow) for AFK, `--status-dnd` (red) for do-not-disturb. Reusing `--primary` for all four breaks the presence-language read.
|
|
56
|
+
|
|
57
|
+
## Radius
|
|
58
|
+
`--radius: 0.5rem` (8px). **Platform-card soft.** Pills are allowed (`pillsAllowed: true`) and are the default for status chips (Live, Online, Idle, DND, In-Game, Raiding), game-category tags, and the LIVE badge. Sharp rectangles read enterprise; pillow-soft reads consumer-app — 8px is the streamer-platform sweet spot.
|
|
59
|
+
|
|
60
|
+
## Shadows
|
|
61
|
+
Four utilities — color-saturated, never neutral gray drops:
|
|
62
|
+
|
|
63
|
+
- `.glow-purple` — the signature. Twitch-purple halo on primary CTAs and feature tiles (1px ring + 16px + 64px concentric).
|
|
64
|
+
- `.glow-kick` — Kick-green halo for the alternate live-platform signal and stream-started confirmations.
|
|
65
|
+
- `.glow-live` — high-saturation red 2px ring + 16px glow. **Used only on the LIVE badge and the live-now stream tile border.** Reserved — bleeding it onto other elements ruins the "live right now" signal.
|
|
66
|
+
- `.shadow-tile` — default stream-tile drop shadow, deep cool-purple-tinted (matches the canvas), not neutral gray.
|
|
67
|
+
|
|
68
|
+
Shadows lean **purple-tinted** — neutral gray drops on a purple-black canvas read flat and dead. The purple tint is what makes a tile lift off the grid.
|
|
69
|
+
|
|
70
|
+
## Motion
|
|
71
|
+
Four keyframes, real-time-friendly:
|
|
72
|
+
|
|
73
|
+
- `live-pulse` (1400ms infinite) — the canonical live-now dot heartbeat. Opacity + scale double-bind. **The ONE always-on loop allowed** on the page; bleeding it onto other elements destroys the signal.
|
|
74
|
+
- `chat-rise` (200ms once) — incoming chat message entrance. Short translateY(12px) → 0, matches platform chat-stream rhythm.
|
|
75
|
+
- `alert-pop` (350ms once) — subscriber/raid/bits alert. Streamlabs-style overshoot (0.8 → 1.08 → 1). Also used for follow-button confirm.
|
|
76
|
+
- `ticker-scroll` (30000ms infinite) — stream-info ticker for recent subs/follows/raids scrolling a banner. Broadcast lower-third pace.
|
|
77
|
+
|
|
78
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `live-pulse` collapses to a static high-contrast dot (the badge does not disappear; only the animation does), `chat-rise` collapses to opacity-only, `alert-pop` collapses to a static scale, `ticker-scroll` collapses to a paused static state.
|
|
79
|
+
|
|
80
|
+
## Component patterns
|
|
81
|
+
- **Buttons:** primary = solid Twitch-purple filled rect, `rounded-md` (8px), weight 700. Follow-button variant adds `.glow-purple` on hover and triggers `alert-pop` on click. Secondary = bordered ghost (border-input, bg-secondary, foreground, hover:bg-accent). Tertiary = text-link in twitch-purple. **Pills allowed** for status chips and game-category tags — each colored by its status token, never the same purple as primary (or the presence-language breaks).
|
|
82
|
+
- **Cards:** stream-tile card = `rounded-lg` (8px), 1px `border-border`, `bg-card`, `.shadow-tile`. Padding `p-3 lg:p-4` (tight — grids stack many tiles). **Live tile** adds `.glow-live` border treatment and a LIVE pill with `live-pulse` on the dot. Title in Inter weight 700; streamer name in `mutedForeground` weight 500; game category in mono caption. Viewer count in tabular mono with the live-pulse dot prefix.
|
|
83
|
+
- **Inputs:** chat input = full-width `rounded-md`, `bg-secondary`, 1px `border-input`, with a `border-bottom` accent on focus. General-purpose input: `rounded-md`, `bg-card`, 1px `border-input`. Focus ring uses `.glow-purple` at 35% opacity. The emote-picker trigger is a pill-shaped icon button to the right of the chat input.
|
|
84
|
+
- **CTAs:** primary "Follow" / "Subscribe" = solid Twitch-purple with `.glow-purple` on hover and `alert-pop` on click-confirm. Secondary "Watch Now" = bordered pill. Tertiary = purple underlined text-link. **The Subscribe-upgrade variant** may use a `twitch-purple → alert-magenta` gradient — Streamlabs alert-tier styling, reserved for the upgrade path only, never the generic CTA.
|
|
85
|
+
|
|
86
|
+
## Component families
|
|
87
|
+
None at install time. As `*StreamTile`, `*LivePill`, `*StatusDot`, `*ChatMessage`, `*AlertToast`, `*ViewerCounter` families emerge, the Director lists them here with their shared pattern.
|
|
88
|
+
|
|
89
|
+
## Recommended rich media
|
|
90
|
+
|
|
91
|
+
### Cover and hero imagery
|
|
92
|
+
**Stream-thumbnail first.** This is a streamer platform — the hero is almost always a live stream preview or a streamer portrait, not abstract gradient.
|
|
93
|
+
|
|
94
|
+
- **16:9 stream-preview stills** — gameplay screenshot with a small streamer-cam overlay in the corner, LIVE badge top-left in `--yt-red`, viewer count bottom-right in mono. The Twitch homepage template.
|
|
95
|
+
- **Streamer portrait + neon backdrop** — half-body shot of the streamer at desk with RGB-keyboard glow, purple/cyan rim lighting matching the palette. Pinterest-streamer-setup aesthetic.
|
|
96
|
+
- **Game key-art cover tiles** — official game-publisher key art for category browsing. 3:4 portrait aspect, exactly like Twitch's Browse Games grid.
|
|
97
|
+
- **Overlay-frame mockups** — Streamlabs alert-box screenshots showing "NEW SUBSCRIBER" pop, animated with `alert-pop`.
|
|
98
|
+
- **Animated mesh gradients** — purple / blurple / alert-magenta meshes drifting underneath section headers. The hero background can lean abstract when the page is a category/discover page rather than a stream page.
|
|
99
|
+
|
|
100
|
+
### AI tool recommendations
|
|
101
|
+
- **Midjourney** for streamer-portrait hero stills. Prompt scaffold: *"streamer at gaming desk, RGB keyboard glow, purple and cyan rim lighting, deep purple-black background, dramatic gaming setup, 16:9"*. Always specify the purple/cyan rim — neutral lighting reads dead.
|
|
102
|
+
- **Runway / Pika** for short looped gameplay-cam composites. Keep loops 4–6 seconds, broadcast pace.
|
|
103
|
+
- **mesh-gradient.com** or hand-rolled CSS conic gradients for purple/blurple/magenta backdrops.
|
|
104
|
+
- **Lottie** for Streamlabs-style alert animations (NEW SUBSCRIBER, RAID INCOMING) — pair with `alert-pop` on trigger.
|
|
105
|
+
- Avoid Midjourney's default warm-lit portraits — explicitly prompt for purple-black backgrounds and neon rim.
|
|
106
|
+
|
|
107
|
+
### Aspect ratios
|
|
108
|
+
- **16:9 landscape** — stream previews, gameplay stills, the dominant tile ratio (mandatory — mixed ratios break the grid).
|
|
109
|
+
- **3:4 portrait** — game key-art covers, exactly like Twitch's category grid.
|
|
110
|
+
- **1:1 square** — streamer avatars, emote previews.
|
|
111
|
+
- Avoid 9:16 vertical (creator-social territory; streamer platforms are desktop-grid).
|
|
112
|
+
|
|
113
|
+
### Color discipline for imagery
|
|
114
|
+
Stay cool-saturated. RGB-lit gaming setups, neon city backdrops, purple/cyan/magenta rim lighting. **If a source image has a warm-amber cast or natural-daylight lighting, regrade it or do not use it** — the cool purple-black surface stack breaks the moment a warm-lit image lands. Desaturated documentary photography also breaks — this is a vibrant platform.
|
|
115
|
+
|
|
116
|
+
### What to AVOID
|
|
117
|
+
- **Warm-lit portraits and natural daylight** — wrong tab; reads podcast-warm or marketplace-modern.
|
|
118
|
+
- **Serif type** — editorial territory; serif kills the streamer-platform read.
|
|
119
|
+
- **Black-and-white photography** — wrong altitude entirely.
|
|
120
|
+
- **Cinematic film-grain texture** — that is cinematic-dark or gaming-esports; streamer platform is live and noisy, not cinematic.
|
|
121
|
+
- **Dense data dashboards** — wrong altitude.
|
|
122
|
+
|
|
123
|
+
### Accessibility
|
|
124
|
+
- **Live status must not rely on color alone** — the LIVE badge must carry the text "LIVE" plus the pulse, so color-blind viewers can identify streaming-now tiles.
|
|
125
|
+
- **Status dots** (online/idle/DND/streaming) must pair with a text label on first introduction (chat-roster row, profile header). Standalone status dots are decorative-only.
|
|
126
|
+
- White cool-text on `--twitch-purple` passes WCAG AA at 14pt+; verify at small caption sizes on purple buttons.
|
|
127
|
+
- `live-pulse` and `ticker-scroll` collapse under `prefers-reduced-motion` — verify in DevTools, not just by reading the CSS.
|
|
128
|
+
- `.glow-live` is decorative — mark with `aria-hidden="true"`; the LIVE text label is the accessible signal.
|
|
129
|
+
|
|
130
|
+
## Details
|
|
131
|
+
- **Selection:** `hsl(var(--primary) / 0.4)` background, foreground text.
|
|
132
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.7)` — Twitch purple, paired with `.glow-purple` on primary CTAs.
|
|
133
|
+
- **Scrollbar:** thin.
|
|
134
|
+
|
|
135
|
+
## Exceptions
|
|
136
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
137
|
+
|
|
138
|
+
## Revisions
|
|
139
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const gamingStreamer: Direction = {
|
|
4
|
+
name: "gaming-streamer",
|
|
5
|
+
ethos:
|
|
6
|
+
"Twitch saturated purple · Discord blurple presence · Kick signal-green youth · YouTube Gaming creator-red · Streamlabs overlay-friendly purple",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Twitch", trait: "saturated purple wordmark, Inter type, dense chat UI, live-now dot" },
|
|
9
|
+
{ brand: "Discord", trait: "blurple primary, friendly sans, status pills (online / idle / DND)" },
|
|
10
|
+
{ brand: "Kick", trait: "signal green on dark, youthful streamer-platform energy" },
|
|
11
|
+
{ brand: "YouTube Gaming", trait: "deep red signal, dark canvas, creator-tools chrome" },
|
|
12
|
+
{ brand: "Streamlabs", trait: "purple creator-overlay aesthetic, alert-box visual language" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Loud-friendly gaming streamer / community platform. Saturated purples as the primary canvas, " +
|
|
16
|
+
"neon accents for live presence, multi-color status palette for online/idle/DND/streaming/raid. " +
|
|
17
|
+
"Real-time-feeling chrome: pulsing live dots, animated chat tickers, multi-color reaction emoji. " +
|
|
18
|
+
"Reads as 'everyone is online right now, and someone is going live.'",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Inter",
|
|
23
|
+
fallback: ["Roobert", "system-ui", "-apple-system", "Segoe UI", "sans-serif"],
|
|
24
|
+
from: "Twitch/Discord wordmark family — Inter is the open-source stand-in for Roobert; weight 700+ carries the streamer-display energy",
|
|
25
|
+
googleFont: "Inter:wght@500;600;700;800;900",
|
|
26
|
+
weights: [600, 700, 800, 900],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Inter",
|
|
30
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
31
|
+
from: "Single-face streamer platform convention (Twitch/Discord/Kick all use Inter-class sans for body)",
|
|
32
|
+
googleFont: "Inter:wght@400;500;600",
|
|
33
|
+
weights: [400, 500, 600],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["SF Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "Chat timestamps, viewer counts, bit/sub counts, stream-elapsed clocks — broadcast-overlay numerics",
|
|
39
|
+
googleFont: "JetBrains+Mono",
|
|
40
|
+
weights: [400, 500, 700],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.02em",
|
|
46
|
+
bodyTracking: "0",
|
|
47
|
+
fontFeatureSettings: '"cv11", "ss01", "tnum"',
|
|
48
|
+
h1ScaleClamp: "clamp(2.5rem, 7vw, 4.75rem)",
|
|
49
|
+
bodyBaseSize: "0.9375rem",
|
|
50
|
+
bodyLineHeight: "1.5",
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "260 22% 8%", from: "Twitch night-mode purple-black — deep cool-purple canvas, never pure black" },
|
|
55
|
+
foreground: { hsl: "260 12% 96%", from: "Cool-tinted off-white — chat-readable on purple-black, never warm" },
|
|
56
|
+
card: { hsl: "260 20% 12%", from: "Lifted card surface — stream-tile background, one stop up from canvas" },
|
|
57
|
+
popover: { hsl: "260 18% 14%", from: "Popover/menu surface — two stops up; chat menus and emote pickers" },
|
|
58
|
+
|
|
59
|
+
primary: { hsl: "264 90% 62%", from: "Twitch saturated purple #9146FF — the dominant brand hue, follow-button color" },
|
|
60
|
+
primaryForeground: { hsl: "260 12% 98%", from: "Cool-white on Twitch purple" },
|
|
61
|
+
|
|
62
|
+
secondary: { hsl: "260 16% 18%", from: "Channel-row secondary surface — sidebar entries, follower-list rows" },
|
|
63
|
+
secondaryForeground: { hsl: "260 12% 96%", from: "Cool-white on secondary" },
|
|
64
|
+
muted: { hsl: "260 14% 22%", from: "Muted chat-meta surface — timestamp plates, low-priority chips" },
|
|
65
|
+
mutedForeground: { hsl: "260 10% 64%", from: "Chat meta — usernames at rest, view counts, timestamps" },
|
|
66
|
+
accent: { hsl: "260 18% 26%", from: "Hover surface — channel-row hover, emote-picker hover" },
|
|
67
|
+
accentForeground: { hsl: "260 12% 98%", from: "Cool-white on accent hover" },
|
|
68
|
+
|
|
69
|
+
border: { hsl: "260 14% 22%", from: "Hairline border — visible on purple-black canvas, never assertive" },
|
|
70
|
+
input: { hsl: "260 14% 26%", from: "Chat input border — stronger than card border for affordance" },
|
|
71
|
+
ring: { hsl: "264 90% 62%", from: "Twitch purple — focus ring and follow-button outline" },
|
|
72
|
+
|
|
73
|
+
destructive: { hsl: "0 78% 56%", from: "YouTube Gaming creator-red — ban, timeout, delete-message; warning-tier red" },
|
|
74
|
+
destructiveForeground: { hsl: "260 12% 98%", from: "Cool-white on creator-red" },
|
|
75
|
+
|
|
76
|
+
brand: {
|
|
77
|
+
"twitch-purple": { hsl: "264 90% 62%", from: "= primary; Twitch wordmark purple #9146FF" },
|
|
78
|
+
"twitch-purple-deep": { hsl: "264 75% 48%", from: "Pressed/hover purple — follow-button pressed, gradient anchor" },
|
|
79
|
+
"discord-blurple": { hsl: "235 86% 65%", from: "Discord brand blurple #5865F2 — community-platform CTA, secondary product accent" },
|
|
80
|
+
"kick-green": { hsl: "138 88% 50%", from: "Kick signal green — live-now indicator, alternate streamer-platform accent" },
|
|
81
|
+
"yt-red": { hsl: "0 78% 56%", from: "= destructive; YouTube Gaming red — also live-status badge color" },
|
|
82
|
+
"status-online": { hsl: "138 70% 45%", from: "Discord online green — presence dot, ships-online indicator" },
|
|
83
|
+
"status-idle": { hsl: "42 95% 55%", from: "Discord idle yellow — away, AFK presence" },
|
|
84
|
+
"status-dnd": { hsl: "0 78% 56%", from: "Discord DND red — do-not-disturb presence (shares hue with destructive)" },
|
|
85
|
+
"status-streaming": { hsl: "264 90% 62%", from: "Streaming-now purple — = primary; the 'live right now' presence color" },
|
|
86
|
+
"alert-cyan": { hsl: "190 95% 60%", from: "Streamlabs alert-cyan — subscriber/raid notification accent" },
|
|
87
|
+
"alert-magenta": { hsl: "320 85% 60%", from: "Streamlabs alert-magenta — bits/donation accent, gradient pair with purple" },
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
spacing: {
|
|
92
|
+
base: 4,
|
|
93
|
+
scale: [4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64, 80],
|
|
94
|
+
containerMax: "max-w-7xl",
|
|
95
|
+
containerPadding: "px-4 lg:px-8",
|
|
96
|
+
sectionPadding: {
|
|
97
|
+
hero: "pt-16 pb-10 lg:pt-24 lg:pb-14",
|
|
98
|
+
default: "py-12 lg:py-16",
|
|
99
|
+
tight: "py-8 lg:py-12",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
radius: {
|
|
104
|
+
base: "0.5rem",
|
|
105
|
+
pillsAllowed: true,
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
shadows: {
|
|
109
|
+
style: "glow",
|
|
110
|
+
utilities: {
|
|
111
|
+
"glow-purple":
|
|
112
|
+
"0 0 0 1px hsl(var(--twitch-purple) / 0.4), " +
|
|
113
|
+
"0 4px 16px hsl(var(--twitch-purple) / 0.25), " +
|
|
114
|
+
"0 24px 64px hsl(var(--twitch-purple) / 0.2)",
|
|
115
|
+
"glow-kick":
|
|
116
|
+
"0 0 0 1px hsl(var(--kick-green) / 0.5), " +
|
|
117
|
+
"0 4px 16px hsl(var(--kick-green) / 0.3)",
|
|
118
|
+
"glow-live":
|
|
119
|
+
"0 0 0 2px hsl(var(--yt-red) / 0.6), " +
|
|
120
|
+
"0 0 16px hsl(var(--yt-red) / 0.55)",
|
|
121
|
+
"shadow-tile":
|
|
122
|
+
"0 2px 4px hsl(260 30% 4% / 0.4), 0 8px 20px hsl(260 30% 4% / 0.3)",
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
motion: {
|
|
127
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
128
|
+
durations: {
|
|
129
|
+
reveal: 250,
|
|
130
|
+
loop: 1600,
|
|
131
|
+
ambient: 0,
|
|
132
|
+
},
|
|
133
|
+
keyframes: {
|
|
134
|
+
"live-pulse": {
|
|
135
|
+
css:
|
|
136
|
+
"0%, 100% { opacity: 1; transform: scale(1); }\n" +
|
|
137
|
+
"50% { opacity: 0.7; transform: scale(1.15); }",
|
|
138
|
+
defaultDuration: 1400,
|
|
139
|
+
iteration: "infinite",
|
|
140
|
+
purpose: "live-now dot heartbeat — the canonical 'streaming right now' indicator; the ONE always-on loop allowed",
|
|
141
|
+
},
|
|
142
|
+
"chat-rise": {
|
|
143
|
+
css:
|
|
144
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
145
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
146
|
+
defaultDuration: 200,
|
|
147
|
+
iteration: "once",
|
|
148
|
+
purpose: "incoming chat message entrance — short rise, matches platform chat-stream rhythm",
|
|
149
|
+
},
|
|
150
|
+
"alert-pop": {
|
|
151
|
+
css:
|
|
152
|
+
"0% { transform: scale(0.8); opacity: 0; }\n" +
|
|
153
|
+
"60% { transform: scale(1.08); opacity: 1; }\n" +
|
|
154
|
+
"100% { transform: scale(1); opacity: 1; }",
|
|
155
|
+
defaultDuration: 350,
|
|
156
|
+
iteration: "once",
|
|
157
|
+
purpose: "subscriber/raid/bits alert entrance — Streamlabs overlay pop, used for follow-button confirm and notification toasts",
|
|
158
|
+
},
|
|
159
|
+
"ticker-scroll": {
|
|
160
|
+
css:
|
|
161
|
+
"from { transform: translateX(0); }\n" +
|
|
162
|
+
"to { transform: translateX(-50%); }",
|
|
163
|
+
defaultDuration: 30000,
|
|
164
|
+
iteration: "infinite",
|
|
165
|
+
purpose: "stream-info ticker — recent subs/follows/raids scrolling across a banner; broadcast lower-third pace",
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
respectsReducedMotion: true,
|
|
169
|
+
},
|
|
170
|
+
|
|
171
|
+
density: "medium",
|
|
172
|
+
|
|
173
|
+
patterns: {
|
|
174
|
+
button:
|
|
175
|
+
"Primary = solid Twitch-purple filled rect (bg-primary text-primary-foreground rounded-md font-bold), 8px radius, weight 700. " +
|
|
176
|
+
"Follow-button variant uses .glow-purple on hover. " +
|
|
177
|
+
"Secondary = bordered ghost (border-input bg-secondary, foreground, hover:bg-accent). " +
|
|
178
|
+
"Tertiary = text-link in twitch-purple. " +
|
|
179
|
+
"Pills allowed for status chips (Live, Online, Idle, DND, In-Game, Raiding) — each colored by status token, never the same purple as primary.",
|
|
180
|
+
card:
|
|
181
|
+
"Stream-tile card = rounded-lg (8px), 1px border-border, bg-card, shadow-tile. Padding p-3 lg:p-4 (tight — stream grids stack many tiles). " +
|
|
182
|
+
"Live tile adds .glow-live + a 'LIVE' pill with live-pulse animation. " +
|
|
183
|
+
"Title in Inter weight 700; streamer name in mutedForeground weight 500; game category in mono caption. " +
|
|
184
|
+
"Viewer count in tabular mono with the live-pulse dot prefix.",
|
|
185
|
+
input:
|
|
186
|
+
"Chat input = full-width rounded-md, bg-secondary, 1px border-input, no full box on chat send (border-bottom on focus only). " +
|
|
187
|
+
"General input: rounded-md, bg-card, 1px border-input. Focus uses ring with .glow-purple at 35%. " +
|
|
188
|
+
"Emote picker trigger is a pill-shaped icon button to the right of the chat input.",
|
|
189
|
+
cta:
|
|
190
|
+
"Primary 'Follow' / 'Subscribe' = solid Twitch-purple with .glow-purple on hover and alert-pop on click-confirm. " +
|
|
191
|
+
"Secondary 'Watch Now' = bordered pill. Tertiary = purple underlined link. " +
|
|
192
|
+
"'Subscribe' upgrade variant may use a gradient from twitch-purple to alert-magenta — Streamlabs alert-tier styling, reserved for the upgrade path only.",
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
details: {
|
|
196
|
+
selectionBg: "hsl(var(--primary) / 0.4)",
|
|
197
|
+
selectionFg: "hsl(var(--foreground))",
|
|
198
|
+
focusRing: "2px solid hsl(var(--ring) / 0.7)",
|
|
199
|
+
scrollbarStyle: "thin",
|
|
200
|
+
},
|
|
201
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Design Direction — Glassmorphic-Modern
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Apple Big Sur glass · iOS 14 widgets · Vision Pro depth · Spotify Now Playing backdrop · Stripe hero gradient
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Translucent frosted surfaces over rich gradient backdrops. Apple-era depth language without being a pure clone — rounded everything, soft shadows layered with backdrop-blur, gradient-driven backgrounds rather than flat fills. Reads modern, premium, slightly Apple-derivative on purpose.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Apple Big Sur (macOS 11+)** → translucent chrome that picks up the desktop wallpaper. Glass as a material, not a filter.
|
|
11
|
+
- **iOS 14+ widgets** → rounded glass tiles arranged on a gradient home screen. The tile language.
|
|
12
|
+
- **Apple Vision Pro (visionOS)** → spatial depth, frosted layering, parallax tilt on hover.
|
|
13
|
+
- **Spotify Now Playing** → blurred album art as backdrop. The surface IS the artwork.
|
|
14
|
+
- **Stripe homepage hero** → violet gradient hero, glass cards floating over it.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Brand tokens: `--glass-light`, `--glass-mid`, `--gradient-start`, `--gradient-end`, `--accent-purple`. Primary is **iOS system blue** (`211 100% 50%`) — the canonical Apple blue.
|
|
18
|
+
|
|
19
|
+
Surface stack is **gradient backdrop** (`--gradient-start` → `--gradient-end`) → **glass-mid card** at 70-80% opacity with backdrop-blur → **glass-light overlay** at 50-60% opacity for nested elements. Depth comes from translucency layered over the gradient, not from solid fills.
|
|
20
|
+
|
|
21
|
+
The brand tokens (`glass-light`, `glass-mid`, `gradient-start`, `gradient-end`, `accent-purple`) are not decorative additions — they ARE the language. `accent-purple` is the Vision-Pro spatial accent used for non-CTA marketing moments.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Inter (open-source SF Pro Display stand-in — clean geometric humanist). h1–h4, weights 500/600/700.
|
|
25
|
+
- **Body:** Inter (same family — Apple convention is one face across sizes). Base 16px, line-height 1.6.
|
|
26
|
+
- **Mono:** JetBrains Mono (open-source SF Mono stand-in). Code blocks, metrics, captions.
|
|
27
|
+
|
|
28
|
+
Headings track `-0.022em` — tight, SF-Display-style. H1 uses `clamp(2.5rem, 6vw, 4.5rem)`. Inter stylistic sets `"cv11", "ss01", "ss03"` to push the typeface closer to SF's single-story a/g.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-4 lg:px-8`.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-12 lg:py-16`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 48 64. Generous card padding is the signature — let glass surfaces breathe.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. All color via tokens. Opacity via `/N` modifier (heavily used — glass IS opacity). Pure white is allowed only via `--glass-light`; pure black is never used — `--foreground` is `220 25% 14%` (deep cool ink).
|
|
40
|
+
|
|
41
|
+
The gradient backdrop (`linear-gradient(135deg, hsl(var(--gradient-start)), hsl(var(--gradient-end)))`) is the page bg by default. Flat single-color backgrounds break the identity — if you find yourself reaching for one, use a tighter section of the gradient or a glass card instead.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 1.25rem` (20px). **Very rounded — iOS widget tile.** Pills are allowed for buttons, chips, and tags (`pillsAllowed: true`). Right angles read "bare HTML" in this language — every surface carries the round.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
Four utilities, layered to fake depth on glass:
|
|
48
|
+
- `.glass-soft` — subtle drop + inner-highlight inset for the default card lift
|
|
49
|
+
- `.glass-deep` — larger drop + colored (violet) ambient shadow for hero and hover states
|
|
50
|
+
- `.backdrop-blur-md` — 16px blur + 180% saturation, the default glass treatment
|
|
51
|
+
- `.backdrop-blur-lg` — 28px blur + 180% saturation, for hero glass and modals
|
|
52
|
+
|
|
53
|
+
Shadows pair with backdrop-blur — they don't work without it. The inner-highlight inset (`inset 0 1px 0 hsl(0 0% 100% / 0.55)`) is what sells the glass; without it the surface reads flat.
|
|
54
|
+
|
|
55
|
+
## Motion
|
|
56
|
+
Three keyframes, spring-physics feel:
|
|
57
|
+
- `scale-in-spring` (320ms) — modals, popovers, tile reveal. Overshoots to 1.02 then settles.
|
|
58
|
+
- `slide-up-soft` (400ms) — standard content entrance, ease-out translateY.
|
|
59
|
+
- `parallax-tilt` (200ms) — subtle mouse-follow tilt on hero glass surfaces, Vision-Pro depth cue.
|
|
60
|
+
|
|
61
|
+
Easing: `cubic-bezier(0.34, 1.56, 0.64, 1)` — bouncier than the project default for that spring effect. `prefers-reduced-motion` is honored — `parallax-tilt` is disabled entirely under reduced motion (it's the most aggressive of the three).
|
|
62
|
+
|
|
63
|
+
## Component patterns
|
|
64
|
+
- **Buttons:** translucent backdrop-blur with subtle border and hover lift. Primary = iOS blue solid (`bg-primary`, `text-primary-foreground`, `rounded-full` or `rounded-2xl`, `glass-soft`) or glass with blue tint. Secondary = pill-shaped glass (`bg-glass-light` at ~60% opacity, `backdrop-blur-md`, border). **No flat plain rectangles** — everything carries a glass treatment.
|
|
65
|
+
- **Cards:** `rounded-3xl`, `bg-glass-mid` at 70-80% opacity, `backdrop-blur-lg`, hairline border, `glass-soft`. Padding `p-6 lg:p-8`. Title in Inter 600. Hover lifts to `glass-deep` with subtle 1.01 scale.
|
|
66
|
+
- **Inputs:** full `rounded-2xl` box, `bg-glass-light` at 50% opacity, `backdrop-blur-md`, border. Focus ring `2px solid var(--ring) / 0.5` and border brightens. Label above; helper below in `mutedForeground`.
|
|
67
|
+
- **CTAs:** primary button is the default. Secondary CTAs use pill-shaped glass button. Text-link variants gain a backdrop-blur halo on hover, never a plain underline.
|
|
68
|
+
|
|
69
|
+
## Component families
|
|
70
|
+
None at install time. As `*GlassCard`, `*Widget`, `*PillButton` families emerge, the Director lists them here with their shared pattern.
|
|
71
|
+
|
|
72
|
+
## Details
|
|
73
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text.
|
|
74
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — iOS blue at half opacity.
|
|
75
|
+
- **Scrollbar:** thin.
|
|
76
|
+
|
|
77
|
+
## Recommended rich media
|
|
78
|
+
|
|
79
|
+
### Cover and hero imagery
|
|
80
|
+
**Gradient backgrounds, not photos** — the gradient IS the background. The hero surface should be a CSS mesh gradient (or full-bleed gradient image) with glass cards layered over it. Acceptable cover subjects:
|
|
81
|
+
- 3D rendered glass orbs and shapes (translucent material, soft volumetric lighting)
|
|
82
|
+
- Vision-Pro-style spatial scenes (floating cards, depth-of-field, parallax layers)
|
|
83
|
+
- Soft abstract gradient compositions
|
|
84
|
+
- Occasional product shots of glassy hardware (perfume bottles, headphones, glass objects) photographed against the same violet-lavender gradient
|
|
85
|
+
|
|
86
|
+
### AI tool recommendations
|
|
87
|
+
- **Midjourney / Flux** for hero renders. Prompt template: `"Apple Vision Pro UI, translucent glass material, soft gradient backdrop, soft volumetric lighting, Octane render, 8K"`. For product photography: `"studio photography, glass material, soft frontal lighting, deep purple-violet gradient backdrop"`.
|
|
88
|
+
- **Spline** for interactive 3D glass surfaces rendered in the browser. Best for hero scenes where the user can subtly rotate/explore.
|
|
89
|
+
- **mesh-gradient.com** or **csshero.org/mesh** for declarative CSS mesh gradients — no AI needed; the hero background often doesn't need rendering at all.
|
|
90
|
+
|
|
91
|
+
### Aspect ratios
|
|
92
|
+
- **16:9** hero with the subject centered — gives the gradient room on either side.
|
|
93
|
+
- **1:1** for product shots dropped into cards.
|
|
94
|
+
- **Backgrounds are full-bleed** — no aspect constraint; gradients extend to the viewport edge and bleed past glass cards.
|
|
95
|
+
|
|
96
|
+
### Color discipline
|
|
97
|
+
Stay in the gradient palette — violet, blue, lavender. **Never warm-graded photography against this backdrop** (orange/amber tones read "wrong tab" — they fight the cool gradient and make the page look broken).
|
|
98
|
+
|
|
99
|
+
### What to AVOID
|
|
100
|
+
- **Flat single-color backgrounds** — defeats the gradient identity. If a section needs to feel quieter, use a tighter slice of the gradient or a glass overlay.
|
|
101
|
+
- **Photography with warm color grading** — breaks the cool palette.
|
|
102
|
+
- **Heavy chrome / metallic reflections** — that's Y2K, a different direction entirely.
|
|
103
|
+
- **Brutalist screenshots, raw terminal output, monospace-heavy comps** — wrong altitude.
|
|
104
|
+
- **Hard-edged geometric illustration** — anything that breaks the depth language.
|
|
105
|
+
|
|
106
|
+
### Performance
|
|
107
|
+
3D scenes via Spline or Three.js have real cost. **Gate behind `prefers-reduced-motion`** AND ship a static-image fallback for mobile. The parallax-tilt motion is similarly gated. Backdrop-filter is GPU-accelerated on modern browsers but expensive on low-end Android — test on a real device, not just desktop Chrome.
|
|
108
|
+
|
|
109
|
+
### Accessibility
|
|
110
|
+
**Backdrop-blur can fail contrast checks for text-on-glass.** Always verify WCAG AA at the foreground/glass boundary. Two safe patterns:
|
|
111
|
+
1. Render text on the opaque inner card surface inside the glass container, not directly on the translucent overlay.
|
|
112
|
+
2. Increase glass opacity (raise from ~50% to ~80%) wherever text sits directly on the glass.
|
|
113
|
+
Never sacrifice the contrast check for the visual effect — a beautiful unreadable surface is a broken surface.
|
|
114
|
+
|
|
115
|
+
## Exceptions
|
|
116
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
117
|
+
|
|
118
|
+
## Revisions
|
|
119
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const glassmorphicModern: Direction = {
|
|
4
|
+
name: "glassmorphic-modern",
|
|
5
|
+
ethos:
|
|
6
|
+
"Apple Big Sur glass · iOS 14 widgets · Vision Pro depth · Spotify Now Playing backdrop · Stripe hero gradient",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Apple Big Sur", trait: "translucent chrome over desktop wallpaper" },
|
|
9
|
+
{ brand: "iOS 14 widgets", trait: "rounded glass tiles on a gradient home screen" },
|
|
10
|
+
{ brand: "Apple Vision Pro", trait: "spatial depth and frosted layering" },
|
|
11
|
+
{ brand: "Spotify Now Playing", trait: "blurred album-art backdrop" },
|
|
12
|
+
{ brand: "Stripe", trait: "violet hero gradient" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Translucent frosted surfaces over rich gradient backdrops. Apple-era " +
|
|
16
|
+
"depth language without being a pure clone — rounded everything, soft " +
|
|
17
|
+
"shadows layered with backdrop-blur, gradient-driven backgrounds rather " +
|
|
18
|
+
"than flat fills. Reads modern, premium, slightly Apple-derivative on " +
|
|
19
|
+
"purpose.",
|
|
20
|
+
|
|
21
|
+
fonts: {
|
|
22
|
+
display: {
|
|
23
|
+
family: "Inter",
|
|
24
|
+
fallback: ["-apple-system", "BlinkMacSystemFont", "SF Pro Display", "system-ui", "sans-serif"],
|
|
25
|
+
from: "open-source SF Pro Display stand-in — clean geometric humanist, Apple-era",
|
|
26
|
+
googleFont: "Inter",
|
|
27
|
+
weights: [500, 600, 700],
|
|
28
|
+
},
|
|
29
|
+
body: {
|
|
30
|
+
family: "Inter",
|
|
31
|
+
fallback: ["-apple-system", "BlinkMacSystemFont", "SF Pro Text", "system-ui", "sans-serif"],
|
|
32
|
+
from: "single-family Apple convention — same face across display and body",
|
|
33
|
+
googleFont: "Inter",
|
|
34
|
+
weights: [400, 500, 600],
|
|
35
|
+
},
|
|
36
|
+
mono: {
|
|
37
|
+
family: "JetBrains Mono",
|
|
38
|
+
fallback: ["ui-monospace", "SF Mono", "SFMono-Regular", "Consolas", "monospace"],
|
|
39
|
+
from: "open-source SF Mono stand-in — captions, metrics, code chips",
|
|
40
|
+
googleFont: "JetBrains+Mono",
|
|
41
|
+
weights: [400, 500],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
typography: {
|
|
46
|
+
headingTracking: "-0.022em", // tight, SF-Display-style
|
|
47
|
+
bodyTracking: "0",
|
|
48
|
+
fontFeatureSettings: '"cv11", "ss01", "ss03"', // Inter single-story a/g, closer to SF
|
|
49
|
+
h1ScaleClamp: "clamp(2.5rem, 6vw, 4.5rem)",
|
|
50
|
+
bodyBaseSize: "1rem",
|
|
51
|
+
bodyLineHeight: "1.6",
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
colors: {
|
|
55
|
+
background: { hsl: "240 30% 96%", from: "light cool with violet bias — base under the gradient overlay" },
|
|
56
|
+
foreground: { hsl: "220 25% 14%", from: "deep cool ink — Big Sur dark text on light glass" },
|
|
57
|
+
card: { hsl: "220 30% 95%", from: "mid-tier glass surface — the readable card behind the blur" },
|
|
58
|
+
popover: { hsl: "0 0% 100%", from: "highest-translucency overlay — pure white at low opacity" },
|
|
59
|
+
primary: { hsl: "211 100% 50%", from: "iOS system blue — canonical Apple primary" },
|
|
60
|
+
primaryForeground: { hsl: "0 0% 100%", from: "white on iOS blue" },
|
|
61
|
+
secondary: { hsl: "220 25% 92%", from: "cool gray glass tier two — secondary chips and surfaces" },
|
|
62
|
+
secondaryForeground: { hsl: "220 25% 14%", from: "deep cool ink on cool gray glass" },
|
|
63
|
+
muted: { hsl: "220 25% 92%", from: "shares secondary tone; differentiated by usage" },
|
|
64
|
+
mutedForeground: { hsl: "220 14% 44%", from: "Vision-Pro-style secondary label — quiet cool gray" },
|
|
65
|
+
accent: { hsl: "265 60% 94%", from: "violet-tinted hover surface — picks up the gradient" },
|
|
66
|
+
accentForeground: { hsl: "265 75% 28%", from: "deep violet ink on violet wash" },
|
|
67
|
+
border: { hsl: "220 30% 88%", from: "soft cool hairline — visible against frosted glass" },
|
|
68
|
+
input: { hsl: "220 30% 88%", from: "same as border" },
|
|
69
|
+
ring: { hsl: "211 100% 50%", from: "iOS blue — focus only" },
|
|
70
|
+
destructive: { hsl: "4 90% 58%", from: "iOS system red — Apple alert convention" },
|
|
71
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on iOS red" },
|
|
72
|
+
brand: {
|
|
73
|
+
"glass-light": { hsl: "0 0% 100%", from: "pure white for the highest-translucency overlays" },
|
|
74
|
+
"glass-mid": { hsl: "220 30% 95%", from: "middle-tier card surface — readable through the blur" },
|
|
75
|
+
"gradient-start": { hsl: "240 60% 88%", from: "backdrop gradient origin — cool lavender" },
|
|
76
|
+
"gradient-end": { hsl: "280 50% 85%", from: "backdrop gradient end — warmer violet" },
|
|
77
|
+
"accent-purple": { hsl: "265 75% 60%", from: "Vision Pro accent — spatial violet" },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
spacing: {
|
|
82
|
+
base: 4,
|
|
83
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64],
|
|
84
|
+
containerMax: "max-w-6xl",
|
|
85
|
+
containerPadding: "px-4 lg:px-8",
|
|
86
|
+
sectionPadding: {
|
|
87
|
+
hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
|
|
88
|
+
default: "py-16 lg:py-24",
|
|
89
|
+
tight: "py-12 lg:py-16",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
radius: {
|
|
94
|
+
base: "1.25rem", // 20px — iOS widget card
|
|
95
|
+
pillsAllowed: true, // pills for buttons, chips, tags
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
shadows: {
|
|
99
|
+
style: "soft",
|
|
100
|
+
utilities: {
|
|
101
|
+
"glass-soft":
|
|
102
|
+
"0 1px 2px hsl(220 30% 20% / 0.06), 0 8px 24px hsl(220 30% 20% / 0.08), inset 0 1px 0 hsl(0 0% 100% / 0.55)",
|
|
103
|
+
"glass-deep":
|
|
104
|
+
"0 2px 4px hsl(220 30% 20% / 0.08), 0 24px 64px hsl(265 75% 40% / 0.18), inset 0 1px 0 hsl(0 0% 100% / 0.6)",
|
|
105
|
+
"backdrop-blur-md":
|
|
106
|
+
"backdrop-filter: blur(16px) saturate(180%); -webkit-backdrop-filter: blur(16px) saturate(180%);",
|
|
107
|
+
"backdrop-blur-lg":
|
|
108
|
+
"backdrop-filter: blur(28px) saturate(180%); -webkit-backdrop-filter: blur(28px) saturate(180%);",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
motion: {
|
|
113
|
+
easing: "cubic-bezier(0.34, 1.56, 0.64, 1)", // springy overshoot — Vision-Pro/iOS feel
|
|
114
|
+
durations: {
|
|
115
|
+
reveal: 400,
|
|
116
|
+
loop: 2000,
|
|
117
|
+
ambient: 20000,
|
|
118
|
+
},
|
|
119
|
+
keyframes: {
|
|
120
|
+
"scale-in-spring": {
|
|
121
|
+
css:
|
|
122
|
+
"0% { opacity: 0; transform: scale(0.92); }\n" +
|
|
123
|
+
"60% { opacity: 1; transform: scale(1.02); }\n" +
|
|
124
|
+
"100% { opacity: 1; transform: scale(1); }",
|
|
125
|
+
defaultDuration: 320,
|
|
126
|
+
iteration: "once",
|
|
127
|
+
purpose: "modals, popovers, tile reveal — spring overshoot, iOS card feel",
|
|
128
|
+
},
|
|
129
|
+
"slide-up-soft": {
|
|
130
|
+
css:
|
|
131
|
+
"from { opacity: 0; transform: translateY(16px); }\n" +
|
|
132
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
133
|
+
defaultDuration: 400,
|
|
134
|
+
iteration: "once",
|
|
135
|
+
purpose: "standard content entrance — soft translateY with ease-out",
|
|
136
|
+
},
|
|
137
|
+
"parallax-tilt": {
|
|
138
|
+
css:
|
|
139
|
+
"from { transform: perspective(800px) rotateX(0deg) rotateY(0deg); }\n" +
|
|
140
|
+
"to { transform: perspective(800px) rotateX(var(--tilt-x, 0deg)) rotateY(var(--tilt-y, 0deg)); }",
|
|
141
|
+
defaultDuration: 200,
|
|
142
|
+
iteration: "once",
|
|
143
|
+
purpose: "subtle mouse-follow tilt on hero glass surfaces — Vision-Pro depth cue",
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
respectsReducedMotion: true,
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
density: "medium",
|
|
150
|
+
|
|
151
|
+
patterns: {
|
|
152
|
+
button:
|
|
153
|
+
"Translucent backdrop-blur with subtle border and hover lift. " +
|
|
154
|
+
"Primary = iOS blue solid (bg-primary, text-primary-foreground, rounded-full or rounded-2xl, glass-soft) " +
|
|
155
|
+
"or glass with blue tint. Secondary = pill-shaped glass (bg-glass-light at ~60% opacity, backdrop-blur-md, border). " +
|
|
156
|
+
"No flat plain rectangles — everything carries a glass treatment.",
|
|
157
|
+
card:
|
|
158
|
+
"Rounded-3xl (1.25rem+), bg-glass-mid at 70-80% opacity, backdrop-blur-lg, hairline border, glass-soft. " +
|
|
159
|
+
"Internal padding p-6 lg:p-8. Title in Inter 600. Hover lifts to glass-deep with subtle (1.01) scale.",
|
|
160
|
+
input:
|
|
161
|
+
"Full rounded-2xl box, bg-glass-light at 50% opacity, backdrop-blur-md, border. " +
|
|
162
|
+
"Focus = ring (2px primary at 50% opacity) and border brightens. Label above; helper below in mutedForeground.",
|
|
163
|
+
cta:
|
|
164
|
+
"Primary button is the default. Secondary CTAs use pill-shaped glass button. " +
|
|
165
|
+
"Text-link variants gain a backdrop-blur halo on hover, never a plain underline.",
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
details: {
|
|
169
|
+
selectionBg: "hsl(var(--primary) / 0.22)",
|
|
170
|
+
selectionFg: "hsl(var(--foreground))",
|
|
171
|
+
focusRing: "2px solid hsl(var(--ring) / 0.5)",
|
|
172
|
+
scrollbarStyle: "thin",
|
|
173
|
+
},
|
|
174
|
+
};
|