@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,85 @@
|
|
|
1
|
+
# Design Direction — Couture-Luxury
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Hermès saddle leather · Loro Piana cashmere · Aman cream paper · Gucci heritage type · Aesop apothecary restraint
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Warm cream surfaces with a single copper-oxblood accent, heritage serif at oversized magazine scale, generous whitespace that signals expense. Quiet luxury — never gold-chain ostentatious. Reads like the inside cover of a Hermès catalog.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Hermès** → saddle leather, copper accents, restrained. The oxblood/saddle accent is the only saturated color on the page.
|
|
11
|
+
- **Loro Piana** → cashmere warmth, neutral palette. Surfaces sit in a tight family of warm beiges; depth is felt, not seen.
|
|
12
|
+
- **Aman Resorts** → cream paper surfaces, Aesop-like quiet. The page is hospitality, not interface.
|
|
13
|
+
- **Gucci** → heritage Italian serif, ornate but composed. Display type carries the brand; ornament earns its place.
|
|
14
|
+
- **Aesop** → apothecary minimalism. Hairline rules, mono captions, no decoration that isn't functional.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand·trait — untraceable tokens fail review. Brand tokens: `--saddle` (Hermès saddle leather tan), `--champagne` (Aman cream gold, quiet), `--cocoa` (Loro Piana deep heritage ink), `--paper` (Hermès cream, alias for background).
|
|
18
|
+
|
|
19
|
+
Surface stack is **cream paper** (background) → **lighter cream** (card/popover) → **cashmere** (secondary/muted) → **deeper cashmere** (accent). Depth comes from hairline borders, never from fill contrast. Pure white is forbidden; `--card` is `36 32% 96%` (cream-tinted). Pure black is forbidden; `--foreground` is `25 20% 14%` (dark cocoa).
|
|
20
|
+
|
|
21
|
+
Primary is **Hermès oxblood / saddle leather copper-brown** (`14 55% 32%`) — the single heritage accent. Never a saturated brand color, never gold-chain bright.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Playfair Display (heritage Italian serif — Gucci/Vogue couture-catalog feel). Weights 400/700/900. Italic is canonical for CTAs and pull quotes.
|
|
25
|
+
- **Body:** Inter (Aesop/Loro Piana clean sans). Weights 400/500. Body base **17px** with **line-height 1.75** — Aman-level breathing.
|
|
26
|
+
- **Mono:** JetBrains Mono. Reserved for **small captions only** — issue numbers, atelier names, lot marks. Never body, never headings.
|
|
27
|
+
|
|
28
|
+
Heading tracking is **`-0.01em`** — a touch of negative tracking; heritage serifs settle into themselves. Body tracking is `0`. Font features: `"liga", "dlig", "onum"` — discretionary ligatures and old-style numerals; couture catalogs use them. H1 uses `clamp(3rem, 8vw, 6.5rem)` — oversized couture-catalog scale.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-3xl px-6 lg:px-16` — couture catalogs read narrow. Whitespace is the luxury; wide columns break the feel.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-32 pb-24 lg:pt-48 lg:pb-36` — deliberately oversized; the title page breathes
|
|
34
|
+
- Default: `py-24 lg:py-40`
|
|
35
|
+
- Tight: `py-16 lg:py-24`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 96 128 160. Low density — Aman-level generous space.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token. White and pure black are forbidden — `--paper` and `--cocoa` replace them. The oxblood (`--primary`) is the only saturated color on the page; using two saturated accents at once breaks the quiet-luxury feel. `--champagne` is for hairline dividers and small ornament only — never a fill that suggests metallic.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 0`. **Sharp corners only — print convention.** Pills are disallowed (`pillsAllowed: false`) — they read web-app, not heritage. Ornament has to earn its place: if a UI element needs softness, achieve it through whitespace and serif italics, not rounding.
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
**Minimal.** Single utility: `.hairline-bottom` — `0 1px 0 0 hsl(var(--foreground) / 0.12)`. A 1px line at 12% opacity, the heritage column rule. No drop shadows. No glows. The cream paper is the surface; the foreground hairline is the only line on it.
|
|
46
|
+
|
|
47
|
+
## Motion
|
|
48
|
+
Single keyframe: `fade-rise` (opacity + 20px translate, **1200ms** once). That is the only entrance. No marquee, no parallax, no ambient loops. **Reveal duration is 1200ms — deliberately slow.** Luxury doesn't perform; the page settles into place.
|
|
49
|
+
|
|
50
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — the keyframe is wrapped in the media query.
|
|
51
|
+
|
|
52
|
+
## Component patterns
|
|
53
|
+
- **Buttons:** primary CTA is a **serif italic underlined text-link in oxblood** (`--primary`). The solid button is reserved for **ONE hero "Atelier" CTA per page** — cocoa background + paper text, sharp rectangle, no radius. No chips, no gradients, no button shadows.
|
|
54
|
+
- **Cards:** hairline top + bottom border (`--foreground / 0.12`), **no fill differentiation from page**. Internal padding `p-10 lg:p-16`. No shadows. Title in display serif, often italic.
|
|
55
|
+
- **Inputs:** border-bottom only (1px `--border`). No full box. Label sits above in mono small-caps. Placeholder italic serif.
|
|
56
|
+
- **CTAs:** text-link in oxblood, serif italic, underline always visible (heritage convention — links are not shy). **Never a chip, never a rect, never a gradient.** The one hero "Atelier" CTA is the only exception.
|
|
57
|
+
|
|
58
|
+
## Recommended rich media
|
|
59
|
+
Cover: editorial photography in the heritage-Italian tradition — Hermès campaign feel. Color-graded warm with deep shadows; leather and wood textures; single-subject portraits in atelier interiors. Secondary imagery: illustrated atelier sketches in muted ink — Sergio Toppi pen-line, not vector flat illustration.
|
|
60
|
+
|
|
61
|
+
**AI tool recommendations:**
|
|
62
|
+
- **Midjourney / Flux** for stills. Include in every prompt: *"Hermès campaign photography, Sergio Toppi illustration, warm Kodak Portra grading, dark moody atelier interior, single subject, leather and wood textures"*.
|
|
63
|
+
- **Recraft** for the illustrated atelier sketches in the muted-ink style — explicitly prompt for hand-line and ink-wash, never vector.
|
|
64
|
+
|
|
65
|
+
**Aspect ratios:** **4:5 portrait dominant** (couture catalog standard) for subjects and product shots. **3:2 landscape** for landscape product shots and atelier environments. Never 16:9 (too cinematic for heritage print). Never 1:1 (Instagram aesthetic, breaks the catalog feel).
|
|
66
|
+
|
|
67
|
+
**Performance:** hero image **≤200 KB AVIF** at 1600w. Couture catalogs do not autoplay anything — if video is used at all, it's a poster image with a manual play button, never a loop.
|
|
68
|
+
|
|
69
|
+
**AVOID:** bright stock photography, glossy 3D renders, lens flare, gradient backgrounds, anything that reads as tech (this is heritage, not innovation). No metallic-effect gradients on `--champagne` — it is a paper-flat color, never a gilded surface.
|
|
70
|
+
|
|
71
|
+
**Accessibility:** long-form alt-text in the editorial register — describe the photograph as a couture caption would. *"Portrait: an artisan stitches a saddle by hand in a Parisian atelier, late afternoon light from a north-facing window."*
|
|
72
|
+
|
|
73
|
+
## Component families
|
|
74
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. Likely first families: `AtelierCTA` (the single hero solid button), `IssueCaption` (mono lot/atelier marks), `HeritageRule` (the hairline divider with optional `--champagne` tint).
|
|
75
|
+
|
|
76
|
+
## Details
|
|
77
|
+
- **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text. Oxblood, restrained.
|
|
78
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`. Thin and quiet — heritage, not loud.
|
|
79
|
+
- **Scrollbar:** thin.
|
|
80
|
+
|
|
81
|
+
## Exceptions
|
|
82
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
83
|
+
|
|
84
|
+
## Revisions
|
|
85
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const coutureLuxury: Direction = {
|
|
4
|
+
name: "couture-luxury",
|
|
5
|
+
ethos:
|
|
6
|
+
"Hermès saddle leather · Loro Piana cashmere · Aman cream paper · Gucci heritage type · Aesop apothecary restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Hermès", trait: "saddle leather, copper accents, restrained" },
|
|
9
|
+
{ brand: "Loro Piana", trait: "cashmere warmth, neutral palette" },
|
|
10
|
+
{ brand: "Aman Resorts", trait: "cream paper surfaces, Aesop-like quiet" },
|
|
11
|
+
{ brand: "Gucci", trait: "heritage Italian serif, ornate but composed" },
|
|
12
|
+
{ brand: "Aesop", trait: "apothecary minimalism" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Warm cream surfaces with a single copper-oxblood accent, heritage serif at " +
|
|
16
|
+
"oversized magazine scale, generous whitespace that signals expense. " +
|
|
17
|
+
"Quiet luxury — never gold-chain ostentatious. Reads like the inside cover of a Hermès catalog.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Playfair Display",
|
|
22
|
+
fallback: ["Bodoni 72", "Didot", "Garamond", "Georgia", "serif"],
|
|
23
|
+
from: "heritage Italian serif — Gucci/Vogue couture-catalog feel",
|
|
24
|
+
googleFont: "Playfair+Display",
|
|
25
|
+
weights: [400, 700, 900],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
|
|
30
|
+
from: "Aesop/Loro Piana clean sans — neutral support that lets the serif lead",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "small captions only — issue numbers, ateliers, lot marks",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.01em", // heritage serifs settle with a touch of negative tracking
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"liga", "dlig", "onum"',
|
|
47
|
+
h1ScaleClamp: "clamp(3rem, 8vw, 6.5rem)", // oversized couture-catalog scale
|
|
48
|
+
bodyBaseSize: "1.0625rem", // 17px — magazine prose, never crammed
|
|
49
|
+
bodyLineHeight: "1.75", // Aman-level breathing
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "36 28% 93%", from: "Hermès warm cream — premium paper stock" },
|
|
54
|
+
foreground: { hsl: "25 20% 14%", from: "Loro Piana dark cocoa ink, never pure black" },
|
|
55
|
+
card: { hsl: "36 32% 96%", from: "Aman cream paper — one tier lighter than the page" },
|
|
56
|
+
popover: { hsl: "36 32% 96%", from: "same as card; depth from hairline only" },
|
|
57
|
+
primary: { hsl: "14 55% 32%", from: "Hermès oxblood / saddle leather copper-brown — the heritage accent" },
|
|
58
|
+
primaryForeground: { hsl: "36 28% 93%", from: "Hermès cream on oxblood" },
|
|
59
|
+
secondary: { hsl: "36 22% 89%", from: "Loro Piana cashmere, one tier deeper than paper" },
|
|
60
|
+
secondaryForeground: { hsl: "25 20% 14%", from: "cocoa ink on cashmere" },
|
|
61
|
+
muted: { hsl: "36 22% 89%", from: "same as secondary; differentiation by usage, not color" },
|
|
62
|
+
mutedForeground: { hsl: "25 14% 38%", from: "Aesop apothecary mid-tone — secondary text" },
|
|
63
|
+
accent: { hsl: "36 24% 86%", from: "Loro Piana cashmere, deeper still — hover surface" },
|
|
64
|
+
accentForeground: { hsl: "25 20% 14%", from: "cocoa ink on cashmere accent" },
|
|
65
|
+
border: { hsl: "25 16% 78%", from: "Aesop apothecary hairline — barely visible, suggestive" },
|
|
66
|
+
input: { hsl: "25 16% 78%", from: "same as border — single hairline language" },
|
|
67
|
+
ring: { hsl: "14 55% 32%", from: "Hermès oxblood, used for focus only" },
|
|
68
|
+
destructive: { hsl: "8 62% 40%", from: "alert red, more saturated than the heritage oxblood" },
|
|
69
|
+
destructiveForeground: { hsl: "36 28% 93%", from: "Hermès cream on alert" },
|
|
70
|
+
brand: {
|
|
71
|
+
saddle: { hsl: "24 45% 38%", from: "Hermès saddle leather — the heritage tan" },
|
|
72
|
+
champagne: { hsl: "38 52% 65%", from: "Aman cream gold — quiet, never gilded" },
|
|
73
|
+
cocoa: { hsl: "25 30% 22%", from: "Loro Piana deep heritage ink — atelier shadow" },
|
|
74
|
+
paper: { hsl: "36 28% 93%", from: "Hermès cream — alias for bg, premium stock" },
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
spacing: {
|
|
79
|
+
base: 4,
|
|
80
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96, 128, 160], // Aman-level breathing
|
|
81
|
+
containerMax: "max-w-3xl", // couture catalog reads narrow; whitespace is the luxury
|
|
82
|
+
containerPadding: "px-6 lg:px-16",
|
|
83
|
+
sectionPadding: {
|
|
84
|
+
hero: "pt-32 pb-24 lg:pt-48 lg:pb-36",
|
|
85
|
+
default: "py-24 lg:py-40",
|
|
86
|
+
tight: "py-16 lg:py-24",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
radius: {
|
|
91
|
+
base: "0", // sharp print convention — no soft corners; ornament earns its place
|
|
92
|
+
pillsAllowed: false,
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
shadows: {
|
|
96
|
+
style: "minimal",
|
|
97
|
+
utilities: {
|
|
98
|
+
"hairline-bottom":
|
|
99
|
+
"0 1px 0 0 hsl(var(--foreground) / 0.12)", // 1px in foreground at 12% opacity — heritage column rule
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
motion: {
|
|
104
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
105
|
+
durations: {
|
|
106
|
+
reveal: 1200, // deliberately slow — luxury doesn't perform
|
|
107
|
+
loop: 4000,
|
|
108
|
+
ambient: 30000,
|
|
109
|
+
},
|
|
110
|
+
keyframes: {
|
|
111
|
+
"fade-rise": {
|
|
112
|
+
css:
|
|
113
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
114
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
115
|
+
defaultDuration: 1200,
|
|
116
|
+
iteration: "once",
|
|
117
|
+
purpose: "the only entrance — slow rise, no bounce, no flash; couture settles into place",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
respectsReducedMotion: true,
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
density: "low",
|
|
124
|
+
|
|
125
|
+
patterns: {
|
|
126
|
+
button:
|
|
127
|
+
"Primary CTA is a serif italic underlined text-link in oxblood (--primary). " +
|
|
128
|
+
"The solid button is reserved for ONE hero 'Atelier' CTA per page — cocoa bg + paper text, sharp rectangle, no radius. " +
|
|
129
|
+
"No chips, no gradients, no shadows on buttons.",
|
|
130
|
+
card:
|
|
131
|
+
"Hairline top + bottom border in --foreground/12, no fill differentiation from page. " +
|
|
132
|
+
"Internal padding generous (p-10 lg:p-16). No shadows. Title in display serif, often italic.",
|
|
133
|
+
input:
|
|
134
|
+
"Border-bottom only (1px --border). No full box. Label sits above in mono small-caps. Placeholder italic serif.",
|
|
135
|
+
cta:
|
|
136
|
+
"Text-link in oxblood, serif italic, underline always visible (heritage convention). " +
|
|
137
|
+
"Never a chip, never a rect, never a gradient. The one hero 'Atelier' CTA is the only exception.",
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
details: {
|
|
141
|
+
selectionBg: "hsl(var(--primary) / 0.18)",
|
|
142
|
+
selectionFg: "hsl(var(--foreground))",
|
|
143
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
144
|
+
scrollbarStyle: "thin",
|
|
145
|
+
},
|
|
146
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Design Direction — Creator-Social
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
TikTok pink-cyan gradient · Instagram glow · BeReal raw timestamp · Snap yellow ghost · Vine 6-second loop energy
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Vibrant, vertical-first, high-energy. Hot gradients (pink to cyan, orange to magenta), bold mobile-style cards. Reads as creator-economy native — younger, faster, more emotionally saturated than soft-modern. The Pixar of mobile UI.
|
|
8
|
+
|
|
9
|
+
Where glassmorphic-modern stays cool and premium-Apple, creator-social cranks the saturation, loses the chrome, and goes vertical. The canvas is a phone, not a desktop window — every surface assumes a 9:16 viewport is the natural home.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **TikTok** → hot pink to electric cyan gradient, vertical-first, high-energy. The wordmark gradient is the entire palette in one stroke.
|
|
13
|
+
- **Instagram** → warm Reels gradient (purple to orange-red), story rings, glow halo. The unposted-story indicator.
|
|
14
|
+
- **BeReal** → raw camera-app timestamp aesthetic, unfiltered black. The "no filter, no edit" frame.
|
|
15
|
+
- **Snapchat** → signature yellow, ghost iconography. The one warm pop allowed outside the IG gradient.
|
|
16
|
+
- **Vine** → 6s loop nostalgia, looped energy. Motion that repeats and rewards re-watching.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
20
|
+
|
|
21
|
+
Surface stack is **deep purple-black canvas** (background, `265 18% 7%`) → **lifted card** (`265 16% 11%`) → **secondary chip** (`265 14% 16%`) → **hairline** (`265 14% 20%`). The dark base is the night-mode phone screen the gradients pop off of. Depth comes from glow halos and gradient overlays, not from hue shift inside the gray stack.
|
|
22
|
+
|
|
23
|
+
Primary is **TikTok hot pink-magenta** (`325 95% 55%`) — the dominant brand hue, the heart-tap color. Accent is **TikTok cyan** (`190 100% 55%`) — primary's gradient pair. Together they ARE the wordmark.
|
|
24
|
+
|
|
25
|
+
Brand tokens — these are the language, not decoration:
|
|
26
|
+
- `--tt-cyan` — TikTok cyan, the gradient pair to primary pink.
|
|
27
|
+
- `--ig-gradient-start` (`290 85% 60%`) and `--ig-gradient-end` (`14 95% 55%`) — Instagram Reels/story-ring gradient stops. Use as a pair; never split them.
|
|
28
|
+
- `--snap-yellow` (`52 100% 55%`) — Snapchat ghost yellow. The signature alert/notification hue. The single warm pop the palette allows outside the IG gradient — use sparingly.
|
|
29
|
+
- `--bere-raw` (`0 0% 12%`) — BeReal raw black. The unfiltered camera-frame around posted moments; backs raw timestamp overlays.
|
|
30
|
+
|
|
31
|
+
## Typography
|
|
32
|
+
- **Display:** Inter — open-source SF Pro Display approximation, mobile-native default. h1–h4, weights 600/700/800/900. Heavy weights carry the TikTok caption/CTA energy; never use display under 600.
|
|
33
|
+
- **Body:** Inter (same family — single-face mobile convention, like iOS). Base 16px, line-height 1.5 (tighter than glassmorphic — mobile copy is denser).
|
|
34
|
+
- **Mono:** JetBrains Mono. Small only — BeReal-style raw timestamps, follower counts, view counters. Never paragraph copy.
|
|
35
|
+
|
|
36
|
+
Headings track `-0.02em` — tight, mobile-display feel. H1 uses `clamp(2.5rem, 7vw, 5rem)` — pushed bigger than glassmorphic because mobile hero type goes loud. Inter stylistic sets `"cv11", "ss01"`.
|
|
37
|
+
|
|
38
|
+
## Spacing
|
|
39
|
+
- **Container:** `max-w-6xl px-4 lg:px-8`.
|
|
40
|
+
- **Section padding tiers:**
|
|
41
|
+
- Hero: `pt-20 pb-12 lg:pt-28 lg:pb-20`
|
|
42
|
+
- Default: `py-14 lg:py-20`
|
|
43
|
+
- Tight: `py-10 lg:py-14`
|
|
44
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 48 64. Medium density — mobile-card medium, not dense. Cards breathe but stack tighter than glassmorphic.
|
|
45
|
+
|
|
46
|
+
## Color
|
|
47
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier.
|
|
48
|
+
|
|
49
|
+
The palette is **dark canvas + hot gradient** — never flat saturated rectangles, never desaturated enterprise. The pink-to-cyan primary gradient and the IG purple-to-orange gradient are the two recurring gradient pairs; never invent a new one. Snapchat yellow is the third color and the only warm note outside the IG gradient — reserve it for notification dots, ghost icons, and small accents. Going beyond yellow into amber/coral fights the cool envelope.
|
|
50
|
+
|
|
51
|
+
Pure black is forbidden — `--background` is `265 18% 7%` (deep cool purple-black, the TikTok night-mode tone) and `--bere-raw` is `0 0% 12%`. Pure white is permitted only via `--foreground` (captions over video need it).
|
|
52
|
+
|
|
53
|
+
## Radius
|
|
54
|
+
`--radius: 1.5rem` (24px). **Mobile-card soft, very rounded.** Pills are allowed (`pillsAllowed: true`) and are the default for buttons, follower chips, and hashtag tags. Right angles read "broken native UI" — every surface in this language is rounded.
|
|
55
|
+
|
|
56
|
+
## Shadows
|
|
57
|
+
Four glow-style utilities — color-saturated, never neutral gray drops:
|
|
58
|
+
|
|
59
|
+
- `.glow-magenta` — the signature. Hot pink halo on primary (1px ring + 32px + 80px concentric glow). Used on primary CTAs and the focus state.
|
|
60
|
+
- `.glow-gradient` — multi-color gradient glow (pink + cyan + IG purple). For vibrant moments only — hero cards, story rings, the Instagram unposted-story halo. Do not litter.
|
|
61
|
+
- `.glow-cyan` — TikTok cyan accent glow. Secondary CTAs, link halos, follow-button outlines.
|
|
62
|
+
- `.card-lift` — mobile-card drop shadow with a pink tint. The default feed-card elevation.
|
|
63
|
+
|
|
64
|
+
Shadows lean **hot** — drop shadows are tinted with primary pink or accent cyan, never neutral. Black drops read flat against the dark canvas; the pink tint is what makes a card lift off the feed.
|
|
65
|
+
|
|
66
|
+
## Motion
|
|
67
|
+
Three keyframes, high-energy:
|
|
68
|
+
|
|
69
|
+
- `spring-tap` (200ms, bouncy) — overshoot scale on tap. The TikTok heart-tap, Instagram like, the haptic-feeling press response. Goes 1 → 0.94 → 1.04 → 1.
|
|
70
|
+
- `story-ring` (4000ms loop) — continuous rotation for story-ring loaders. The Instagram unposted-story indicator at rest. Pair with a conic gradient border.
|
|
71
|
+
- `swipe-up` (300ms ease-out) — vertical reveal, TikTok swipe-up feel. Standard entrance for new feed cards, modals, comment sheets. translateY(24px) → 0.
|
|
72
|
+
|
|
73
|
+
Easing: `cubic-bezier(0.34, 1.56, 0.64, 1)` — bouncy overshoot, the mobile-tap spring. `prefers-reduced-motion` is honored — `spring-tap` collapses to a static scale, `story-ring` to a static gradient ring, `swipe-up` to a fade.
|
|
74
|
+
|
|
75
|
+
## Component patterns
|
|
76
|
+
- **Buttons:** primary = full-width pill with gradient bg (`from-primary to-[hsl(var(--tt-cyan))]`), white text, bold (weight 700+), `rounded-full`. Hover = scale 1.02 + `.glow-magenta` strengthens. Tap = `spring-tap` keyframe. Secondary = pill with `border` + foreground text, cyan glow on hover. **No flat gray buttons** — every CTA carries gradient or glow.
|
|
77
|
+
- **Cards:** mobile-feed card. `rounded-3xl` (1.5rem+), `bg-card`, `border`, `.card-lift` shadow. Padding `p-5 lg:p-6`. Title in Inter 700+. Vertical-first composition — 9:16 media slot at top is the default. Hover deepens `.card-lift`; optional `.glow-gradient` on hero/featured cards only.
|
|
78
|
+
- **Inputs:** full `rounded-full` pill or `rounded-2xl` box, `bg-secondary`, `border`. Focus uses `.glow-magenta` ring at 35% opacity, border brightens to primary. Label above; helper below in `mutedForeground`. DM-style placeholder text ("Send a message...").
|
|
79
|
+
- **CTAs:** gradient pill button is the default — never a flat rectangle. Secondary CTAs use a ghost pill (border + foreground) or a text-link in `tt-cyan` with `.glow-cyan` halo on hover. The **story-ring wrapper** (a `story-ring` keyframe spinning a conic-gradient border around an avatar) is the avatar/feature pattern — use it for hero avatars, featured creator chips, and "new" indicators.
|
|
80
|
+
|
|
81
|
+
## Component families
|
|
82
|
+
None at install time. As `*StoryRing`, `*FeedCard`, `*GradientPill`, `*Timestamp` families emerge, the Director lists them here with their shared pattern.
|
|
83
|
+
|
|
84
|
+
## Recommended rich media
|
|
85
|
+
|
|
86
|
+
### Cover and hero imagery
|
|
87
|
+
**Vertical-first.** The hero is rarely a 16:9 widescreen — that's broadcast. Native to this direction is the 9:16 phone frame.
|
|
88
|
+
|
|
89
|
+
- **Vertical 9:16 video** — the TikTok native aspect. Loop short (Vine-style 4–6 seconds), saturate hot, never letterbox into a 16:9 container.
|
|
90
|
+
- **Vertical photo crops** — portraits, hands-holding-phone shots, creator-at-desk verticals.
|
|
91
|
+
- **Animated mesh gradients** — pink/cyan/violet meshes drifting underneath glass cards. The hero background often doesn't need a photo at all.
|
|
92
|
+
- **BeReal-style raw timestamps overlaid on photos** — small mono caption (`YYYY-MM-DD HH:MM`), top-left, in `--bere-raw` plate with white text. Use to mark "real" moments without breaking the gradient palette.
|
|
93
|
+
|
|
94
|
+
### AI tool recommendations
|
|
95
|
+
- **Sora / Runway / Pika** for vertical 9:16 video loops. Prompt scaffold: *"vertical 9:16, creator-economy aesthetic, hot pink and cyan gradient lighting, mobile-first composition, 4-second loop"*. Keep loops short — Vine energy.
|
|
96
|
+
- **Midjourney** for stills. Prompt scaffold: *"vertical iPhone screenshot, vibrant gradient overlay, mobile-first composition, hot pink to cyan gradient, deep purple-black background"*. Always append `--ar 9:16`.
|
|
97
|
+
- **mesh-gradient.com** or hand-rolled CSS mesh gradients for backgrounds. Animated drift via the project easing.
|
|
98
|
+
- **Lottie** for sticker-style accents (hearts, stars, ghost icons) — pair with `spring-tap` on interaction.
|
|
99
|
+
|
|
100
|
+
### Aspect ratios
|
|
101
|
+
- **9:16 vertical** — the native ratio. Hero video, feed-card media, story-ring previews.
|
|
102
|
+
- **1:1 square** — feed thumbnails, profile grids.
|
|
103
|
+
- **4:5 portrait** — Instagram-feed native, secondary option when 9:16 is too tall.
|
|
104
|
+
- Avoid 16:9 entirely except in legacy-embed contexts.
|
|
105
|
+
|
|
106
|
+
### Color discipline for imagery
|
|
107
|
+
Stay vibrant. Hot gradients, saturated subjects, deep cool shadows. **If a source image has a muted or desaturated cast, regrade it or do not use it** — the direction breaks the moment a flat-saturation photo lands. Warm tones outside the IG gradient (random amber/coral) also break the palette.
|
|
108
|
+
|
|
109
|
+
### What to AVOID
|
|
110
|
+
- **16:9 widescreen** — that is broadcast, not social. This direction is vertical.
|
|
111
|
+
- **Serif type** — editorial territory; serif kills the mobile-native read.
|
|
112
|
+
- **Muted palettes** — vibrancy is the direction. Desaturated photography reads "wrong tab."
|
|
113
|
+
- **Chrome / glass / heavy translucency** — that is glassmorphic-modern or y2k-chrome.
|
|
114
|
+
- **Dense data dashboards** — wrong altitude.
|
|
115
|
+
|
|
116
|
+
### Accessibility
|
|
117
|
+
- White text over hot gradients can fail WCAG AA at the bright stop of the gradient — verify contrast at the worst point of the gradient (the lightest pixel), not the average. If contrast fails, add a subtle dark scrim layer between gradient and text rather than dimming the gradient.
|
|
118
|
+
- Story-ring rotation and gradient glows are decorative — mark with `aria-hidden="true"`.
|
|
119
|
+
- `spring-tap` and `story-ring` collapse under `prefers-reduced-motion` — verify in DevTools, not just by reading the CSS.
|
|
120
|
+
- Snapchat yellow on white fails contrast easily — never use `--snap-yellow` as foreground text on a light surface. It's a notification/icon color, not a text color.
|
|
121
|
+
|
|
122
|
+
## Details
|
|
123
|
+
- **Selection:** `hsl(var(--primary) / 0.35)` background, foreground text.
|
|
124
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.7)` — hot pink, visible, paired with `.glow-magenta` on primary CTAs.
|
|
125
|
+
- **Scrollbar:** thin.
|
|
126
|
+
|
|
127
|
+
## Exceptions
|
|
128
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
129
|
+
|
|
130
|
+
## Revisions
|
|
131
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const creatorSocial: Direction = {
|
|
4
|
+
name: "creator-social",
|
|
5
|
+
ethos:
|
|
6
|
+
"TikTok pink-cyan gradient · Instagram glow · BeReal raw timestamp · Snap yellow ghost · Vine 6-second loop energy",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "TikTok", trait: "hot pink to electric cyan gradient, vertical-first, high-energy" },
|
|
9
|
+
{ brand: "Instagram", trait: "warm Reels gradient, story rings, glow halo" },
|
|
10
|
+
{ brand: "BeReal", trait: "raw camera-app timestamp aesthetic, unfiltered black" },
|
|
11
|
+
{ brand: "Snapchat", trait: "signature yellow, ghost iconography" },
|
|
12
|
+
{ brand: "Vine", trait: "6s loop nostalgia, looped energy" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Vibrant, vertical-first, high-energy. Hot gradients (pink to cyan, orange to magenta), " +
|
|
16
|
+
"bold mobile-style cards. Reads as creator-economy native — younger, faster, more " +
|
|
17
|
+
"emotionally saturated than soft-modern. The Pixar of mobile UI.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Inter",
|
|
22
|
+
fallback: ["-apple-system", "BlinkMacSystemFont", "SF Pro Display", "system-ui", "sans-serif"],
|
|
23
|
+
from: "SF Pro Display approximation — mobile-native default; heavy weights carry the TikTok caption/CTA energy",
|
|
24
|
+
googleFont: "Inter",
|
|
25
|
+
weights: [600, 700, 800, 900],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["-apple-system", "BlinkMacSystemFont", "SF Pro Text", "system-ui", "sans-serif"],
|
|
30
|
+
from: "single-family mobile convention — same face across display and body, like iOS",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500, 600, 700],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["ui-monospace", "SF Mono", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "small mono — BeReal-style raw timestamps, follower counts, view counters",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.02em", // tight, mobile-display feel
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"cv11", "ss01"',
|
|
47
|
+
h1ScaleClamp: "clamp(2.5rem, 7vw, 5rem)",
|
|
48
|
+
bodyBaseSize: "1rem",
|
|
49
|
+
bodyLineHeight: "1.5",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: {
|
|
54
|
+
hsl: "265 18% 7%",
|
|
55
|
+
from: "deep cool purple-black — TikTok night mode, the dark canvas the gradients pop off of",
|
|
56
|
+
},
|
|
57
|
+
foreground: {
|
|
58
|
+
hsl: "0 0% 100%",
|
|
59
|
+
from: "pure white — phone screen, captions over video",
|
|
60
|
+
},
|
|
61
|
+
card: {
|
|
62
|
+
hsl: "265 16% 11%",
|
|
63
|
+
from: "lifted mobile-card surface — one tier above background, the post-card behind the gradient halo",
|
|
64
|
+
},
|
|
65
|
+
popover: {
|
|
66
|
+
hsl: "265 16% 11%",
|
|
67
|
+
from: "same as card — sheet/modal language matches feed cards on mobile",
|
|
68
|
+
},
|
|
69
|
+
primary: {
|
|
70
|
+
hsl: "325 95% 55%",
|
|
71
|
+
from: "TikTok hot pink-magenta — the dominant brand hue, the heart-tap color",
|
|
72
|
+
},
|
|
73
|
+
primaryForeground: {
|
|
74
|
+
hsl: "0 0% 100%",
|
|
75
|
+
from: "white on hot pink — the CTA label",
|
|
76
|
+
},
|
|
77
|
+
secondary: {
|
|
78
|
+
hsl: "265 14% 16%",
|
|
79
|
+
from: "secondary mobile surface — chip and tag background, one tier above card",
|
|
80
|
+
},
|
|
81
|
+
secondaryForeground: {
|
|
82
|
+
hsl: "0 0% 100%",
|
|
83
|
+
from: "white on secondary purple-black",
|
|
84
|
+
},
|
|
85
|
+
muted: {
|
|
86
|
+
hsl: "265 14% 16%",
|
|
87
|
+
from: "shares secondary tone — differentiation by usage, not hue",
|
|
88
|
+
},
|
|
89
|
+
mutedForeground: {
|
|
90
|
+
hsl: "265 10% 65%",
|
|
91
|
+
from: "Instagram secondary label gray — caption meta, follower count, timestamp",
|
|
92
|
+
},
|
|
93
|
+
accent: {
|
|
94
|
+
hsl: "190 100% 55%",
|
|
95
|
+
from: "TikTok cyan — the gradient pair to primary pink; secondary CTA glow",
|
|
96
|
+
},
|
|
97
|
+
accentForeground: {
|
|
98
|
+
hsl: "265 18% 7%",
|
|
99
|
+
from: "deep purple-black on cyan — high contrast on the bright accent",
|
|
100
|
+
},
|
|
101
|
+
border: {
|
|
102
|
+
hsl: "265 14% 20%",
|
|
103
|
+
from: "soft mobile-card hairline — visible against the dark canvas without becoming a frame",
|
|
104
|
+
},
|
|
105
|
+
input: {
|
|
106
|
+
hsl: "265 14% 20%",
|
|
107
|
+
from: "same as border — DM-input field on a dark feed",
|
|
108
|
+
},
|
|
109
|
+
ring: {
|
|
110
|
+
hsl: "325 95% 55%",
|
|
111
|
+
from: "TikTok hot pink — focus state, follow-button outline",
|
|
112
|
+
},
|
|
113
|
+
destructive: {
|
|
114
|
+
hsl: "0 90% 60%",
|
|
115
|
+
from: "report/unfollow red — saturated, mobile-alert language",
|
|
116
|
+
},
|
|
117
|
+
destructiveForeground: {
|
|
118
|
+
hsl: "0 0% 100%",
|
|
119
|
+
from: "white on alert red",
|
|
120
|
+
},
|
|
121
|
+
brand: {
|
|
122
|
+
"tt-cyan": {
|
|
123
|
+
hsl: "190 100% 55%",
|
|
124
|
+
from: "TikTok cyan — the gradient pair to primary pink, the wordmark's other half",
|
|
125
|
+
},
|
|
126
|
+
"ig-gradient-start": {
|
|
127
|
+
hsl: "290 85% 60%",
|
|
128
|
+
from: "Instagram purple — the cool stop of the Reels/story-ring gradient",
|
|
129
|
+
},
|
|
130
|
+
"ig-gradient-end": {
|
|
131
|
+
hsl: "14 95% 55%",
|
|
132
|
+
from: "Instagram orange-red — the warm stop of the Reels/story-ring gradient",
|
|
133
|
+
},
|
|
134
|
+
"snap-yellow": {
|
|
135
|
+
hsl: "52 100% 55%",
|
|
136
|
+
from: "Snapchat ghost yellow — signature alert/notification hue, the one warm pop the palette allows outside the IG gradient",
|
|
137
|
+
},
|
|
138
|
+
"bere-raw": {
|
|
139
|
+
hsl: "0 0% 12%",
|
|
140
|
+
from: "BeReal raw black — the unfiltered camera-app frame around a posted moment, used for raw timestamp overlays and authenticity cues",
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
spacing: {
|
|
146
|
+
base: 4,
|
|
147
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64],
|
|
148
|
+
containerMax: "max-w-6xl",
|
|
149
|
+
containerPadding: "px-4 lg:px-8",
|
|
150
|
+
sectionPadding: {
|
|
151
|
+
hero: "pt-20 pb-12 lg:pt-28 lg:pb-20",
|
|
152
|
+
default: "py-14 lg:py-20",
|
|
153
|
+
tight: "py-10 lg:py-14",
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
radius: {
|
|
158
|
+
base: "1.5rem", // 24px — mobile-card soft, very rounded
|
|
159
|
+
pillsAllowed: true, // pills for buttons, follower chips, hashtag tags
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
shadows: {
|
|
163
|
+
style: "glow",
|
|
164
|
+
utilities: {
|
|
165
|
+
"glow-magenta":
|
|
166
|
+
"0 0 0 1px hsl(325 95% 55% / 0.35), " +
|
|
167
|
+
"0 0 32px hsl(325 95% 55% / 0.45), " +
|
|
168
|
+
"0 0 80px hsl(325 95% 55% / 0.25)", // hot pink halo on primary — TikTok heart-tap glow
|
|
169
|
+
"glow-gradient":
|
|
170
|
+
"0 0 0 1px hsl(325 95% 55% / 0.3), " +
|
|
171
|
+
"0 0 24px hsl(325 95% 55% / 0.4), " +
|
|
172
|
+
"0 0 48px hsl(190 100% 55% / 0.35), " +
|
|
173
|
+
"0 0 96px hsl(290 85% 60% / 0.25)", // multi-color gradient glow — Instagram story-ring halo, vibrant moments only
|
|
174
|
+
"glow-cyan":
|
|
175
|
+
"0 0 0 1px hsl(190 100% 55% / 0.4), " +
|
|
176
|
+
"0 0 24px hsl(190 100% 55% / 0.45)", // TikTok cyan accent glow — secondary CTAs, link halos
|
|
177
|
+
"card-lift":
|
|
178
|
+
"0 1px 2px hsl(0 0% 0% / 0.4), " +
|
|
179
|
+
"0 12px 32px hsl(325 95% 55% / 0.18)", // mobile-card lift with pink-tinted drop — feeds and tiles
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
motion: {
|
|
184
|
+
easing: "cubic-bezier(0.34, 1.56, 0.64, 1)", // bouncy overshoot — mobile-tap spring
|
|
185
|
+
durations: {
|
|
186
|
+
reveal: 300, // swipe-up reveal — TikTok feed feel
|
|
187
|
+
loop: 4000, // story-ring continuous rotation
|
|
188
|
+
ambient: 8000, // mesh-gradient drift
|
|
189
|
+
},
|
|
190
|
+
keyframes: {
|
|
191
|
+
"spring-tap": {
|
|
192
|
+
css:
|
|
193
|
+
"0% { transform: scale(1); }\n" +
|
|
194
|
+
"40% { transform: scale(0.94); }\n" +
|
|
195
|
+
"70% { transform: scale(1.04); }\n" +
|
|
196
|
+
"100% { transform: scale(1); }",
|
|
197
|
+
defaultDuration: 200,
|
|
198
|
+
iteration: "once",
|
|
199
|
+
purpose: "bouncy overshoot scale on tap — TikTok heart-tap, Instagram like, the haptic-feeling press response",
|
|
200
|
+
},
|
|
201
|
+
"story-ring": {
|
|
202
|
+
css:
|
|
203
|
+
"from { transform: rotate(0deg); }\n" +
|
|
204
|
+
"to { transform: rotate(360deg); }",
|
|
205
|
+
defaultDuration: 4000,
|
|
206
|
+
iteration: "infinite",
|
|
207
|
+
purpose: "continuous rotation for story-ring loaders — the Instagram unposted-story indicator at rest",
|
|
208
|
+
},
|
|
209
|
+
"swipe-up": {
|
|
210
|
+
css:
|
|
211
|
+
"from { opacity: 0; transform: translateY(24px); }\n" +
|
|
212
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
213
|
+
defaultDuration: 300,
|
|
214
|
+
iteration: "once",
|
|
215
|
+
purpose: "vertical reveal — TikTok swipe-up feel for new feed cards, modals, comment sheets",
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
respectsReducedMotion: true,
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
density: "medium",
|
|
222
|
+
|
|
223
|
+
patterns: {
|
|
224
|
+
button:
|
|
225
|
+
"Primary = full-width pill with gradient bg (pink to cyan, `bg-gradient-to-r from-primary to-[hsl(var(--tt-cyan))]`), " +
|
|
226
|
+
"white text, bold (font-weight 700+), `rounded-full`. Hover = scale 1.02 + `.glow-magenta` strengthens. " +
|
|
227
|
+
"Tap = `spring-tap` keyframe. Secondary = pill with `border` + foreground text, cyan glow on hover. " +
|
|
228
|
+
"No flat gray buttons — every CTA carries gradient or glow.",
|
|
229
|
+
card:
|
|
230
|
+
"Mobile-feed card: `rounded-3xl` (1.5rem+), `bg-card`, `border`, `card-lift` shadow. " +
|
|
231
|
+
"Padding `p-5 lg:p-6`. Title in Inter 700+. Vertical-first composition — 9:16 media slot at top is the default. " +
|
|
232
|
+
"Hover = `card-lift` deepens, optional `.glow-gradient` on hero/featured cards only.",
|
|
233
|
+
input:
|
|
234
|
+
"Full `rounded-full` pill or `rounded-2xl` box, `bg-secondary`, `border`. " +
|
|
235
|
+
"Focus = `glow-magenta` ring at 35% opacity, border brightens to primary. " +
|
|
236
|
+
"Label above; helper below in `mutedForeground`. DM-style placeholder text.",
|
|
237
|
+
cta:
|
|
238
|
+
"Gradient pill button is the default — never a flat rectangle. " +
|
|
239
|
+
"Secondary CTAs use a ghost pill (border + foreground) or a text-link in `tt-cyan` with `.glow-cyan` halo on hover. " +
|
|
240
|
+
"Story-ring wrapper (`story-ring` keyframe on a gradient-border ring) is the avatar/feature pattern.",
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
details: {
|
|
244
|
+
selectionBg: "hsl(var(--primary) / 0.35)",
|
|
245
|
+
selectionFg: "hsl(var(--foreground))",
|
|
246
|
+
focusRing: "2px solid hsl(var(--ring) / 0.7)",
|
|
247
|
+
scrollbarStyle: "thin",
|
|
248
|
+
},
|
|
249
|
+
};
|