@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,102 @@
|
|
|
1
|
+
# Design Direction — Dating-Friendly
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Hinge prompt-card warmth · Bumble honey-yellow + bold serif · Tinder coral-pink swipe stage · Feeld off-white intimate · OkCupid playful question-driven
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Warm and intimate, never corporate. Saturated coral-pink and peach over a soft cream surface; everything is rounded heavily so the page feels like the home of a person, not a product. Prompt-card driven — text-on-tinted-card is the basic unit of identity. Serif display headlines (Fraunces) add a bookish, considered warmth so the saturation never reads cheap.
|
|
8
|
+
|
|
9
|
+
Where `creator-social` cranks vibrance to the wall for video, dating-friendly stays editorial-warm — saturated but readable, playful but grown-up. The page should feel like a coffee-shop conversation, not a nightclub.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Hinge** → prompt cards + photo-pairs + warm cream surface. The "designed to be deleted" tone — earnest, prompt-driven.
|
|
13
|
+
- **Bumble** → honey yellow + bold serif headlines (Bumble's brand serif). Woman-first warmth.
|
|
14
|
+
- **Tinder** → saturated coral-pink swipe stage. The heart-tap, the right-swipe.
|
|
15
|
+
- **Feeld** → off-white surface + serif + considered intimacy. Adult sophistication without darkness.
|
|
16
|
+
- **OkCupid** → playful question-driven UI + bright magenta. The "match score" charm.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
20
|
+
|
|
21
|
+
Surface stack: **cream-peach paper** (`24 60% 96%`, the home surface) → **white prompt/profile card** (`0 0% 100%`) → **peach-tinted card** (`24 70% 92%`, the prompt-card fill). Warmth is encoded into every neutral — pure gray is forbidden because gray reads "corporate dating app from 2008."
|
|
22
|
+
|
|
23
|
+
Primary is **Tinder coral-pink** (`350 88% 60%`) — the heart-tap, the right-swipe, the love-action. Saturated and warm enough to glow against the cream paper without going screen-burn neon.
|
|
24
|
+
|
|
25
|
+
Brand tokens — language, not decoration:
|
|
26
|
+
- `--coral` (= primary) — the heart-tap.
|
|
27
|
+
- `--peach` — prompt-card tint, the soft fill.
|
|
28
|
+
- `--bumble-honey` — alt CTA in woman-led contexts, premium-chip accent.
|
|
29
|
+
- `--magenta` — OkCupid bright; reserved for badges, milestone moments (first match, anniversaries).
|
|
30
|
+
- `--rose-gold` — subtle highlight for featured prompts, premium chips.
|
|
31
|
+
- `--aubergine` (= foreground) — warm-bias deep ink; pure black is forbidden.
|
|
32
|
+
|
|
33
|
+
## Typography
|
|
34
|
+
- **Display:** Fraunces — Bumble's bold serif spirit, optical-size aware, weights 600/700/900. Used for headlines, prompt quotes, profile names. The serif is what keeps saturation from reading cheap.
|
|
35
|
+
- **Body:** DM Sans — friendly geometric, mobile-readable. Base 16px, line-height 1.55.
|
|
36
|
+
- **Mono:** DM Mono — age, distance, "last active" meta. Tiny tabular only.
|
|
37
|
+
|
|
38
|
+
H1 uses `clamp(2.5rem, 6vw, 4.5rem)`. Tracking `-0.02em` for the serif display.
|
|
39
|
+
|
|
40
|
+
## Spacing
|
|
41
|
+
- **Container:** `max-w-5xl px-5 lg:px-8` — narrower than corporate; prompt-cards read better in a tighter column.
|
|
42
|
+
- **Section padding tiers:**
|
|
43
|
+
- Hero: `pt-20 pb-14 lg:pt-28 lg:pb-20`
|
|
44
|
+
- Default: `py-16 lg:py-24`
|
|
45
|
+
- Tight: `py-10 lg:py-14`
|
|
46
|
+
- **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80. Medium density — cards breathe.
|
|
47
|
+
|
|
48
|
+
## Color
|
|
49
|
+
No hex in components. All color via tokens. Opacity via `/N`.
|
|
50
|
+
|
|
51
|
+
The palette is **warm-saturated-on-cream**. Resist adding any cool accent — blue, teal, mint, and slate all break the warmth envelope. The only allowed cool note is `--aubergine` (which is a warm-bias near-black). Pure white is permitted only on `--card` (the prompt-card fill); the page never sits on pure white.
|
|
52
|
+
|
|
53
|
+
## Radius
|
|
54
|
+
`--radius: 1.25rem` (20px). **Heavily rounded** — Hinge/Bumble prompt-card softness. Pills allowed (`pillsAllowed: true`) and default for tag chips, age/distance chips, the like-back button. **Sharp corners are forbidden** in this language; they read corporate dating app, not the considered-warm modern feel.
|
|
55
|
+
|
|
56
|
+
## Shadows
|
|
57
|
+
Three warm-tinted utilities — drops carry coral-pink tint, never neutral gray:
|
|
58
|
+
- `.shadow-card-warm` — resting prompt/profile-card elevation (12px coral-tinted drop).
|
|
59
|
+
- `.shadow-card-lift` — hover state (20px deeper coral drop).
|
|
60
|
+
- `.shadow-heart` — the match-state glow (2px coral ring + 20px coral halo). Used on first-match cards and the heart-tap-confirmation state.
|
|
61
|
+
|
|
62
|
+
## Motion
|
|
63
|
+
Three keyframes with playful overshoot easing (`cubic-bezier(0.34, 1.56, 0.64, 1)`):
|
|
64
|
+
- `heart-pop` (320ms) — like-button tap. The dating-app dopamine confirmation. Scale 1 → 0.88 → 1.18 → 1.
|
|
65
|
+
- `prompt-rise` (500ms) — prompt-card entrance. Warm rise with slight scale-in.
|
|
66
|
+
- `honey-shimmer` (2200ms loop) — Bumble-honey sweep across featured/premium prompts. Subtle, not a marquee.
|
|
67
|
+
|
|
68
|
+
`prefers-reduced-motion` is honored — `heart-pop` collapses to a static color change; `honey-shimmer` to a static honey fill.
|
|
69
|
+
|
|
70
|
+
## Component patterns
|
|
71
|
+
- **Buttons:** primary = filled coral pill (weight 600, rounded-full). Secondary = peach-tinted pill with aubergine text. Alt CTA in Bumble-honey for woman-led contexts. Tap = `heart-pop` keyframe. **No sharp-corner buttons in this language.**
|
|
72
|
+
- **Cards:** two shapes —
|
|
73
|
+
- **PROMPT-CARD**: peach-tinted (`--peach`), rounded-3xl, large serif quote with small handwritten-feel attribution. The basic unit of identity.
|
|
74
|
+
- **PROFILE-CARD**: white, rounded-2xl, photo (4:5 portrait) + name + age-chip stack.
|
|
75
|
+
- Both wear `.shadow-card-warm`. Hover lifts to `.shadow-card-lift`.
|
|
76
|
+
- **Inputs:** full rounded-full pill or rounded-2xl box. Focus = 2px coral ring at 40% opacity. Placeholders are conversational ("What's your favorite Sunday?", "Where did you grow up?") — never "Enter text here."
|
|
77
|
+
- **CTAs:** coral pill is the default love-action. The heart icon is the universal positive primitive. Matches carry `.shadow-heart`. Never a flat rectangle.
|
|
78
|
+
|
|
79
|
+
## Component families
|
|
80
|
+
- `*PromptCard` — peach tint + serif quote + handwritten attribution.
|
|
81
|
+
- `*ProfileCard` — photo + name + age-chip + prompt-pair below.
|
|
82
|
+
- `*HeartButton` — coral pill + heart-pop motion + shadow-heart on confirmed state.
|
|
83
|
+
|
|
84
|
+
## Recommended rich media
|
|
85
|
+
Warm photographic portraits — golden-hour, natural light, real environments (cafés, parks, kitchens). Avoid studio lighting, corporate headshots, beach-vacation tropes, and any "model-with-prop" stock.
|
|
86
|
+
|
|
87
|
+
**AI tools:** Midjourney *"natural portrait, warm afternoon light, environmental, 50mm, slight grain, Kodak Portra, real face"*. Avoid: studio backdrops, AI-uncanny smiles, model poses, anything with the "perfect couple at sunset" stock energy. Real, slightly imperfect, lived-in.
|
|
88
|
+
|
|
89
|
+
**Aspect ratios:** 4:5 portrait (Hinge native) is the default. 1:1 square as an alternate. 9:16 only for video moments (a 3s "wave" loop).
|
|
90
|
+
|
|
91
|
+
**AVOID:** night-club photography, cinematic darkness, glassy 3D renders, anything that reads "dating app from 2010," gradient backgrounds outside the peach-cream envelope, swipe-card stacks (that's Tinder, which is one ref but not the dominant shape — Hinge prompt-cards are).
|
|
92
|
+
|
|
93
|
+
## Details
|
|
94
|
+
- **Selection:** `hsl(var(--primary) / 0.25)` background, foreground text.
|
|
95
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)`. Coral, warm-visible.
|
|
96
|
+
- **Scrollbar:** thin.
|
|
97
|
+
|
|
98
|
+
## Exceptions
|
|
99
|
+
None yet.
|
|
100
|
+
|
|
101
|
+
## Revisions
|
|
102
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// dating-friendly — Hinge / Bumble warmth. Saturated coral-pink and peach,
|
|
4
|
+
// friendly serif display, soft cards with generous rounding. Decoration-first
|
|
5
|
+
// language built around prompt-cards and profile-photo stages.
|
|
6
|
+
export const datingFriendly: Direction = {
|
|
7
|
+
name: "dating-friendly",
|
|
8
|
+
ethos:
|
|
9
|
+
"Hinge prompt-card warmth · Bumble honey-yellow + bold serif · Tinder pink swipe stage · Feeld off-white intimate · OkCupid playful question-driven",
|
|
10
|
+
references: [
|
|
11
|
+
{ brand: "Hinge", trait: "prompt cards + photo-pairs + warm cream surface" },
|
|
12
|
+
{ brand: "Bumble", trait: "honey yellow + bold serif headlines + woman-first warmth" },
|
|
13
|
+
{ brand: "Tinder", trait: "saturated coral-pink + swipe stage" },
|
|
14
|
+
{ brand: "Feeld", trait: "off-white surface + serif + considered intimacy" },
|
|
15
|
+
{ brand: "OkCupid", trait: "playful question-driven UI + bright magenta" },
|
|
16
|
+
],
|
|
17
|
+
feel:
|
|
18
|
+
"Warm and intimate, never corporate. Saturated coral-pink and peach over a soft cream surface; " +
|
|
19
|
+
"everything is rounded heavily so the page feels like the home of a person, not a product. " +
|
|
20
|
+
"Prompt-card driven — text-on-tinted-card is the basic unit of identity. " +
|
|
21
|
+
"Serif display headlines add a bookish, considered warmth so the saturation never reads cheap.",
|
|
22
|
+
|
|
23
|
+
fonts: {
|
|
24
|
+
display: {
|
|
25
|
+
family: "Fraunces",
|
|
26
|
+
fallback: ["Recoleta", "Georgia", "serif"],
|
|
27
|
+
from: "Bumble's bold serif headline + Hinge's editorial display — warm, optical-size aware",
|
|
28
|
+
googleFont: "Fraunces",
|
|
29
|
+
weights: [400, 600, 700, 900],
|
|
30
|
+
},
|
|
31
|
+
body: {
|
|
32
|
+
family: "DM Sans",
|
|
33
|
+
fallback: ["Inter", "system-ui", "-apple-system", "sans-serif"],
|
|
34
|
+
from: "Hinge / Feeld body sans — friendly geometric, readable on a phone",
|
|
35
|
+
googleFont: "DM+Sans",
|
|
36
|
+
weights: [400, 500, 600],
|
|
37
|
+
},
|
|
38
|
+
mono: {
|
|
39
|
+
family: "DM Mono",
|
|
40
|
+
fallback: ["ui-monospace", "SFMono-Regular", "monospace"],
|
|
41
|
+
from: "age + distance meta — small playful tabular",
|
|
42
|
+
googleFont: "DM+Mono",
|
|
43
|
+
weights: [400, 500],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
typography: {
|
|
48
|
+
headingTracking: "-0.02em",
|
|
49
|
+
bodyTracking: "0",
|
|
50
|
+
fontFeatureSettings: '"ss01", "ss02"', // Fraunces soft variants
|
|
51
|
+
h1ScaleClamp: "clamp(2.5rem, 6vw, 4.5rem)",
|
|
52
|
+
bodyBaseSize: "1rem",
|
|
53
|
+
bodyLineHeight: "1.55",
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
colors: {
|
|
57
|
+
background: { hsl: "24 60% 96%", from: "Hinge cream-peach paper — warm off-white, never gray" },
|
|
58
|
+
foreground: { hsl: "350 30% 16%", from: "deep aubergine-ink — soft black with a pink bias" },
|
|
59
|
+
card: { hsl: "0 0% 100%", from: "white prompt-card — lifts off the cream paper" },
|
|
60
|
+
popover: { hsl: "0 0% 100%", from: "same as card" },
|
|
61
|
+
primary: { hsl: "350 88% 60%", from: "Tinder coral-pink — the heart-tap color, saturated and warm" },
|
|
62
|
+
primaryForeground: { hsl: "24 60% 98%", from: "near-cream on coral — keeps the warmth" },
|
|
63
|
+
secondary: { hsl: "24 70% 92%", from: "soft peach tinted bg — secondary prompt card" },
|
|
64
|
+
secondaryForeground: { hsl: "350 30% 18%", from: "aubergine on peach" },
|
|
65
|
+
muted: { hsl: "24 30% 90%", from: "quiet peach-cream — meta panels" },
|
|
66
|
+
mutedForeground: { hsl: "350 14% 42%", from: "warm gray-ink with pink bias — captions" },
|
|
67
|
+
accent: { hsl: "350 85% 95%", from: "primary tinted bg — selected prompt, like-back state" },
|
|
68
|
+
accentForeground: { hsl: "350 88% 38%", from: "deeper coral on tinted accent" },
|
|
69
|
+
border: { hsl: "24 35% 86%", from: "Hinge soft border — visible but warm" },
|
|
70
|
+
input: { hsl: "24 35% 86%", from: "same as border" },
|
|
71
|
+
ring: { hsl: "350 88% 60%", from: "primary, focus only" },
|
|
72
|
+
destructive: { hsl: "0 70% 50%", from: "warm red — different from coral primary; for X/unmatch" },
|
|
73
|
+
destructiveForeground: { hsl: "24 60% 98%", from: "cream on alert" },
|
|
74
|
+
brand: {
|
|
75
|
+
coral: { hsl: "350 88% 60%", from: "= primary; Tinder swipe-right, heart-tap" },
|
|
76
|
+
peach: { hsl: "20 92% 78%", from: "Hinge prompt-card tint — the soft warm fill" },
|
|
77
|
+
"bumble-honey": { hsl: "44 96% 58%", from: "Bumble honey yellow — woman-first warmth, alt CTA" },
|
|
78
|
+
magenta: { hsl: "320 78% 55%", from: "OkCupid bright magenta — for badges, milestone moments" },
|
|
79
|
+
cream: { hsl: "24 60% 96%", from: "= background; Feeld off-white paper" },
|
|
80
|
+
aubergine: { hsl: "350 30% 16%", from: "= foreground; warm-bias deep ink" },
|
|
81
|
+
"rose-gold": { hsl: "12 60% 70%", from: "subtle highlight — featured prompt, premium chip" },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
spacing: {
|
|
86
|
+
base: 4,
|
|
87
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80],
|
|
88
|
+
containerMax: "max-w-5xl",
|
|
89
|
+
containerPadding: "px-5 lg:px-8",
|
|
90
|
+
sectionPadding: {
|
|
91
|
+
hero: "pt-20 pb-14 lg:pt-28 lg:pb-20",
|
|
92
|
+
default: "py-16 lg:py-24",
|
|
93
|
+
tight: "py-10 lg:py-14",
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
radius: {
|
|
98
|
+
base: "1.25rem", // 20px — Hinge/Bumble prompt-card softness
|
|
99
|
+
pillsAllowed: true, // tag chips, age/distance chips, like-back pill
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
shadows: {
|
|
103
|
+
style: "soft",
|
|
104
|
+
utilities: {
|
|
105
|
+
"shadow-card-warm":
|
|
106
|
+
"0 2px 4px hsl(350 30% 30% / 0.04), 0 12px 28px hsl(350 60% 50% / 0.08)",
|
|
107
|
+
"shadow-card-lift":
|
|
108
|
+
"0 4px 8px hsl(350 30% 30% / 0.06), 0 20px 48px hsl(350 70% 55% / 0.14)",
|
|
109
|
+
"shadow-heart":
|
|
110
|
+
"0 0 0 2px hsl(350 88% 60% / 0.25), 0 8px 20px hsl(350 88% 60% / 0.32)",
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
motion: {
|
|
115
|
+
easing: "cubic-bezier(0.34, 1.56, 0.64, 1)", // playful overshoot — like-tap feel
|
|
116
|
+
durations: {
|
|
117
|
+
reveal: 500,
|
|
118
|
+
loop: 2200,
|
|
119
|
+
ambient: 14000,
|
|
120
|
+
},
|
|
121
|
+
keyframes: {
|
|
122
|
+
"heart-pop": {
|
|
123
|
+
css:
|
|
124
|
+
"0% { transform: scale(1); }\n" +
|
|
125
|
+
"30% { transform: scale(0.88); }\n" +
|
|
126
|
+
"60% { transform: scale(1.18); }\n" +
|
|
127
|
+
"100% { transform: scale(1); }",
|
|
128
|
+
defaultDuration: 320,
|
|
129
|
+
iteration: "once",
|
|
130
|
+
purpose: "like-button tap — the heart-pulse, the dating-app dopamine confirmation",
|
|
131
|
+
},
|
|
132
|
+
"prompt-rise": {
|
|
133
|
+
css:
|
|
134
|
+
"from { opacity: 0; transform: translateY(20px) scale(0.97); }\n" +
|
|
135
|
+
"to { opacity: 1; transform: translateY(0) scale(1); }",
|
|
136
|
+
defaultDuration: 500,
|
|
137
|
+
iteration: "once",
|
|
138
|
+
purpose: "prompt-card entrance — warm rise with slight scale",
|
|
139
|
+
},
|
|
140
|
+
"honey-shimmer": {
|
|
141
|
+
css:
|
|
142
|
+
"0% { background-position: 200% 0; }\n" +
|
|
143
|
+
"100% { background-position: -200% 0; }",
|
|
144
|
+
defaultDuration: 2200,
|
|
145
|
+
iteration: "infinite",
|
|
146
|
+
purpose: "Bumble-honey featured-prompt sweep — subtle premium hint",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
respectsReducedMotion: true,
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
density: "medium",
|
|
153
|
+
|
|
154
|
+
patterns: {
|
|
155
|
+
button:
|
|
156
|
+
"Primary = filled coral pill, weight 600, rounded-full. " +
|
|
157
|
+
"Secondary = peach-tinted pill with aubergine text. " +
|
|
158
|
+
"Alt CTA on female-led contexts = Bumble-honey pill. " +
|
|
159
|
+
"Tap = heart-pop keyframe. Never a sharp-corner button.",
|
|
160
|
+
card:
|
|
161
|
+
"Two card shapes: PROMPT-CARD (peach-tinted, rounded-3xl, large serif quote with small handwritten-feel attribution) and " +
|
|
162
|
+
"PROFILE-CARD (white, rounded-2xl, photo + name + age-chip stack). " +
|
|
163
|
+
"Both wear shadow-card-warm. Hover lifts to shadow-card-lift.",
|
|
164
|
+
input:
|
|
165
|
+
"Full rounded-full pill or rounded-2xl box, border, bg-card. " +
|
|
166
|
+
"Focus = 2px coral ring at 40% opacity. Placeholders are conversational ('What's your favorite Sunday?').",
|
|
167
|
+
cta:
|
|
168
|
+
"Coral pill is the default love-tap. Heart icon is the universal positive action. " +
|
|
169
|
+
"Never a flat rectangle. Likes carry the heart-pop motion; matches carry shadow-heart.",
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
details: {
|
|
173
|
+
selectionBg: "hsl(var(--primary) / 0.25)",
|
|
174
|
+
selectionFg: "hsl(var(--foreground))",
|
|
175
|
+
focusRing: "2px solid hsl(var(--ring) / 0.5)",
|
|
176
|
+
scrollbarStyle: "thin",
|
|
177
|
+
},
|
|
178
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Design Direction — Dense-Utility
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Vercel dashboard density · Stripe internal tools · Linear keyboard-first · Bloomberg terminal heritage · PlanetScale dark technical surfaces
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Information-rich, compact, technical. Tight spacing, monospace accents, high information density, minimal decoration. The UI is an instrument panel — every pixel earns its row.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Vercel dashboard** → high information density. Tables, deploys, logs.
|
|
11
|
+
- **Stripe internal tools** → monospace numerics, status pills, audit trails.
|
|
12
|
+
- **Linear** → keyboard-first, command-palette mindset. UI exists to be commanded.
|
|
13
|
+
- **Bloomberg terminal** → instrument-cluster heritage. The screen *is* the work.
|
|
14
|
+
- **PlanetScale** → dark technical surfaces, sharp corners, monospace-prominent.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Brand/semantic tokens: `--success` (= primary, Vercel green), `--warning` (Stripe amber), `--info` (blue), `--fg-dim` (tertiary text), `--bg-row-alt` (alternating table rows). The surface stack steps in 3-5% lightness increments — `bg → card → popover → secondary → accent` — and depth comes from **borders**, never shadows.
|
|
18
|
+
|
|
19
|
+
Numbered status tokens (`success`, `warning`, `info`) are intentional here — utility UIs render real semantic states, and the agent and operator both benefit from a flat, predictable token name.
|
|
20
|
+
|
|
21
|
+
## Typography
|
|
22
|
+
- **Display:** Inter (no separate display face — headings are just larger body weight). Weights 500/600/700.
|
|
23
|
+
- **Body:** Inter, **14px**, line-height 1.5. Tracking `0`.
|
|
24
|
+
- **Mono:** JetBrains Mono. **Prominent** — every metric, id, timestamp, hash uses mono. Fallback to Berkeley Mono if available.
|
|
25
|
+
|
|
26
|
+
Font features: `"cv11", "ss01", "tnum", "zero"` — tabular nums + slashed zero, table-friendly. H1 uses `clamp(1.5rem, 3vw, 2.25rem)` — small, because this language is body-first.
|
|
27
|
+
|
|
28
|
+
## Spacing
|
|
29
|
+
- **Container:** `max-w-screen-2xl px-4 lg:px-6` — wide. Utility UIs claim the screen.
|
|
30
|
+
- **Section padding tiers:**
|
|
31
|
+
- Hero (rarely used): `pt-12 pb-8 lg:pt-16 lg:pb-12`
|
|
32
|
+
- Default: `py-8 lg:py-12`
|
|
33
|
+
- Tight: `py-4 lg:py-6`
|
|
34
|
+
- **Allowed scale values:** **2** 4 6 8 10 12 16 20 24 32 40 48. The `2` step exists for icon-to-label gaps; nothing else uses it.
|
|
35
|
+
|
|
36
|
+
## Color
|
|
37
|
+
No hex anywhere. Pure black is forbidden; `--background` is `0 0% 4%` (near-black with no hue bias). Pure white is forbidden; `--foreground` is `0 0% 96%`. Tables use `--bg-row-alt` for zebra striping (2% delta — barely visible).
|
|
38
|
+
|
|
39
|
+
## Radius
|
|
40
|
+
`--radius: 0.25rem` (4px). **Sharp but not knife-edge.** Pills are allowed (`pillsAllowed: true`) — status badges everywhere in this language. Tags, severity chips, run-status indicators all use pill shape.
|
|
41
|
+
|
|
42
|
+
## Shadows
|
|
43
|
+
**None.** Single utility: `.border-elevated` (`inset 0 0 0 1px var(--border)`) — a border-as-shadow trick for layered surfaces. Drop shadows are a soft-modern affordance; dense-utility uses borders only.
|
|
44
|
+
|
|
45
|
+
## Motion
|
|
46
|
+
Two keyframes:
|
|
47
|
+
- `fade-in` (150ms) — **fade only, no transform**. Dropdowns, popovers, table rows on load.
|
|
48
|
+
- `spin` (800ms infinite) — inline loading spinner only.
|
|
49
|
+
|
|
50
|
+
**No ambient motion** (no marquee, no parallax). **No transform-based reveals.** Reveal duration `150ms` — UI is responsive, not theatrical. `prefers-reduced-motion` honored.
|
|
51
|
+
|
|
52
|
+
## Component patterns
|
|
53
|
+
- **Buttons:** small (`h-7 px-2.5 text-xs`) and default (`h-8 px-3 text-sm`). Primary = solid green. Secondary = border + foreground. Ghost = no border, hover `bg-accent`. Icon-only buttons are square, 7-8 grid cells.
|
|
54
|
+
- **Cards:** sharp corners (`rounded-sm`), border, `bg-card`. Tight padding `p-4`. Header row inside card has bottom border. Tables embed inline.
|
|
55
|
+
- **Inputs:** compact (`h-8 text-sm`), border, `bg-background`, `rounded-sm`. Focus ring **1px** (not 2px — dense UIs can't afford it). Inline validation messages, no helper text by default.
|
|
56
|
+
- **CTAs:** primary action is a button. Secondary actions are icon buttons. **Marketing-style CTAs do not exist in this language.**
|
|
57
|
+
|
|
58
|
+
## Recommended rich media
|
|
59
|
+
Dense-utility is **the most media-restrained direction** in the library. The screen is the work; rich media gets in the way. Hero imagery generally doesn't exist on these surfaces — there is no marketing hero. Permitted media is functional only: **product screenshots presented frankly** (no shadow, no border, no decorative crop), **inline charts and graphs** (high contrast, mono numerics, semantic color from `--success/--warning/--info/--destructive`), **small monochrome icons** (Lucide / Phosphor / Heroicons at 16/20/24px), occasional **diagrams and flow charts** with clear labels.
|
|
60
|
+
|
|
61
|
+
**AI tool recommendations:** generally **not needed**. When used: **Recraft** for technical diagrams ("system architecture diagram, flat lines, two-color, minimal labels"); **Excalidraw + AI assist** for hand-drawn-feel sketches that work in dense layouts; **Mermaid** or **DBML** for declarative diagrams that update with the code (no AI involved, often the better answer). For screenshots, use real ones — never AI-fabricated UI.
|
|
62
|
+
|
|
63
|
+
**Aspect ratios:** screenshots respect their natural aspect (whatever the dashboard is); charts fit their data; icons are square (16/20/24/32). No 16:9 hero crops; no cinematic widescreen.
|
|
64
|
+
|
|
65
|
+
**Video:** rare and short. Permitted: 15-30s screen-recording demos (Loom / CleanShot / Cap), no music, no narration overlay, real cursor motion. Embedded inline at small size (≤640px wide), pause-on-load with a clear play affordance. Autoplay forbidden — dense surfaces have too much going on for ambient motion to compete.
|
|
66
|
+
|
|
67
|
+
**Performance:** SVG icons inline (≤2 KB each); chart libraries lazy-loaded; screenshots ≤80 KB PNG/AVIF at 1.5x device pixel ratio. LCP under 1s — dense-utility users are running thousands of these surfaces and every ms compounds.
|
|
68
|
+
|
|
69
|
+
**Avoid:** marketing hero photography, gradient backgrounds, glassmorphic anything, photorealistic AI renders, decorative SVG ornament, animated GIFs, autoplay video, drop shadows on UI screenshots, lens flare, ANY 3D rendering. Honest constraint: a dense-utility surface that uses zero rich media is more on-direction than one that uses any decorative imagery.
|
|
70
|
+
|
|
71
|
+
**Accessibility:** charts must have data tables as alternatives; icons that convey meaning need `aria-label`; screenshots showing UI need alt-text describing what the user would see. Color-coding (red = bad, green = good) needs a non-color signal (icon, text label) — colorblind users matter especially in dense surfaces.
|
|
72
|
+
|
|
73
|
+
## Component families
|
|
74
|
+
Status badges (`StatusPill`, `RunStatusBadge`, etc.) share: `rounded-full`, `text-xs`, `px-2 py-0.5`, semantic bg+fg from `--success/--warning/--info/--destructive`. Tables (`Table`, `DataGrid`) share: `text-sm`, `border-collapse`, `border-b border-border` on rows, mono font on numeric columns.
|
|
75
|
+
|
|
76
|
+
## Details
|
|
77
|
+
- **Selection:** `hsl(var(--primary) / 0.25)` background, foreground text.
|
|
78
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` — thin, the only kind that fits.
|
|
79
|
+
- **Scrollbar:** thin.
|
|
80
|
+
|
|
81
|
+
## Exceptions
|
|
82
|
+
None yet.
|
|
83
|
+
|
|
84
|
+
## Revisions
|
|
85
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const denseUtility: Direction = {
|
|
4
|
+
name: "dense-utility",
|
|
5
|
+
ethos: "Vercel dashboard density · Stripe internal tools · Linear keyboard-first · Bloomberg terminal heritage",
|
|
6
|
+
references: [
|
|
7
|
+
{ brand: "Vercel dashboard", trait: "high information density" },
|
|
8
|
+
{ brand: "Stripe internal", trait: "monospace numerics, status pills" },
|
|
9
|
+
{ brand: "Linear", trait: "keyboard-first, command-palette mindset" },
|
|
10
|
+
{ brand: "Bloomberg terminal", trait: "instrument-cluster heritage" },
|
|
11
|
+
{ brand: "PlanetScale", trait: "dark technical surfaces, sharp corners" },
|
|
12
|
+
],
|
|
13
|
+
feel:
|
|
14
|
+
"Information-rich, compact, technical. Tight spacing, monospace accents, " +
|
|
15
|
+
"high information density, minimal decoration. The UI is an instrument " +
|
|
16
|
+
"panel — every pixel earns its row.",
|
|
17
|
+
|
|
18
|
+
fonts: {
|
|
19
|
+
display: {
|
|
20
|
+
family: "Inter",
|
|
21
|
+
fallback: ["system-ui", "-apple-system", "sans-serif"],
|
|
22
|
+
from: "no separate display face — headings are just larger body weight",
|
|
23
|
+
googleFont: "Inter",
|
|
24
|
+
weights: [500, 600, 700],
|
|
25
|
+
},
|
|
26
|
+
body: {
|
|
27
|
+
family: "Inter",
|
|
28
|
+
fallback: ["system-ui", "-apple-system", "sans-serif"],
|
|
29
|
+
from: "Linear/Vercel base sans — readable at 13-14px",
|
|
30
|
+
googleFont: "Inter",
|
|
31
|
+
weights: [400, 500, 600],
|
|
32
|
+
},
|
|
33
|
+
mono: {
|
|
34
|
+
family: "JetBrains Mono",
|
|
35
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "monospace"],
|
|
36
|
+
from: "prominent — every metric, id, timestamp, hash",
|
|
37
|
+
googleFont: "JetBrains+Mono",
|
|
38
|
+
weights: [400, 500],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
typography: {
|
|
43
|
+
headingTracking: "-0.01em",
|
|
44
|
+
bodyTracking: "0",
|
|
45
|
+
fontFeatureSettings: '"cv11", "ss01", "tnum", "zero"', // tabular nums + slashed zero, table-friendly
|
|
46
|
+
h1ScaleClamp: "clamp(1.5rem, 3vw, 2.25rem)", // small headings — this language is body-first
|
|
47
|
+
bodyBaseSize: "0.875rem", // 14px — dense
|
|
48
|
+
bodyLineHeight: "1.5",
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
colors: {
|
|
52
|
+
background: { hsl: "0 0% 4%", from: "near-black, neutral — Vercel/PlanetScale chrome" },
|
|
53
|
+
foreground: { hsl: "0 0% 96%", from: "near-white, neutral — high contrast for table reading" },
|
|
54
|
+
card: { hsl: "0 0% 7%", from: "elevated surface, 3% lighter than bg" },
|
|
55
|
+
popover: { hsl: "0 0% 9%", from: "popovers and menus, 5% lighter than bg" },
|
|
56
|
+
primary: { hsl: "142 70% 50%", from: "Vercel green — status + primary action" },
|
|
57
|
+
primaryForeground: { hsl: "0 0% 4%", from: "near-black on green" },
|
|
58
|
+
secondary: { hsl: "0 0% 11%", from: "tertiary surface" },
|
|
59
|
+
secondaryForeground: { hsl: "0 0% 96%", from: "white on dark gray" },
|
|
60
|
+
muted: { hsl: "0 0% 11%", from: "muted surface, same as secondary" },
|
|
61
|
+
mutedForeground: { hsl: "0 0% 58%", from: "secondary text — labels, captions" },
|
|
62
|
+
accent: { hsl: "0 0% 14%", from: "hover surface" },
|
|
63
|
+
accentForeground: { hsl: "0 0% 96%", from: "white on hover" },
|
|
64
|
+
border: { hsl: "0 0% 16%", from: "table grids, card edges — visible, structural" },
|
|
65
|
+
input: { hsl: "0 0% 16%", from: "same as border" },
|
|
66
|
+
ring: { hsl: "142 70% 50%", from: "primary, focus only" },
|
|
67
|
+
destructive: { hsl: "0 70% 55%", from: "alert red — used as text and badge bg" },
|
|
68
|
+
destructiveForeground: { hsl: "0 0% 96%", from: "white on red" },
|
|
69
|
+
brand: {
|
|
70
|
+
success: { hsl: "142 70% 50%", from: "Vercel green = primary, also semantic success" },
|
|
71
|
+
warning: { hsl: "38 95% 56%", from: "Stripe amber — pending, attention" },
|
|
72
|
+
info: { hsl: "210 100% 60%", from: "blue — info status, links in tables" },
|
|
73
|
+
"fg-dim": { hsl: "0 0% 42%", from: "tertiary text — log timestamps, row IDs" },
|
|
74
|
+
"bg-row-alt": { hsl: "0 0% 6%", from: "alternating table row, almost imperceptible" },
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
spacing: {
|
|
79
|
+
base: 4,
|
|
80
|
+
scale: [2, 4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48], // tight — note the 2px step for icon gaps
|
|
81
|
+
containerMax: "max-w-screen-2xl", // wide — utility UIs claim the screen
|
|
82
|
+
containerPadding: "px-4 lg:px-6",
|
|
83
|
+
sectionPadding: {
|
|
84
|
+
hero: "pt-12 pb-8 lg:pt-16 lg:pb-12", // small — utility UIs don't have heroes
|
|
85
|
+
default: "py-8 lg:py-12",
|
|
86
|
+
tight: "py-4 lg:py-6",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
radius: {
|
|
91
|
+
base: "0.25rem", // 4px — sharp but not knife-edge
|
|
92
|
+
pillsAllowed: true, // pills are essential — status badges everywhere
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
shadows: {
|
|
96
|
+
style: "none",
|
|
97
|
+
utilities: {
|
|
98
|
+
"border-elevated":
|
|
99
|
+
"inset 0 0 0 1px hsl(var(--border))", // border-as-shadow utility for layered surfaces
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
motion: {
|
|
104
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
105
|
+
durations: {
|
|
106
|
+
reveal: 150, // very fast — UI is responsive, not theatrical
|
|
107
|
+
loop: 1200,
|
|
108
|
+
ambient: 0, // no ambient motion in this language
|
|
109
|
+
},
|
|
110
|
+
keyframes: {
|
|
111
|
+
"fade-in": {
|
|
112
|
+
css:
|
|
113
|
+
"from { opacity: 0; }\n" +
|
|
114
|
+
"to { opacity: 1; }",
|
|
115
|
+
defaultDuration: 150,
|
|
116
|
+
iteration: "once",
|
|
117
|
+
purpose: "fade only — no transform. Dropdowns, popovers, table rows on load.",
|
|
118
|
+
},
|
|
119
|
+
"spin": {
|
|
120
|
+
css:
|
|
121
|
+
"from { transform: rotate(0deg); }\n" +
|
|
122
|
+
"to { transform: rotate(360deg); }",
|
|
123
|
+
defaultDuration: 800,
|
|
124
|
+
iteration: "infinite",
|
|
125
|
+
purpose: "spinner for inline loading states only",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
respectsReducedMotion: true,
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
density: "high",
|
|
132
|
+
|
|
133
|
+
patterns: {
|
|
134
|
+
button:
|
|
135
|
+
"Small (h-7 px-2.5 text-xs) and default (h-8 px-3 text-sm). " +
|
|
136
|
+
"Primary = solid green. Secondary = border + foreground. Ghost = no border, hover bg-accent. " +
|
|
137
|
+
"Icon-only buttons are square, 7-8 grid cells.",
|
|
138
|
+
card:
|
|
139
|
+
"Sharp corners (rounded-sm), border, bg-card. Tight padding (p-4). " +
|
|
140
|
+
"Header row inside card has bottom border. Tables embed inline.",
|
|
141
|
+
input:
|
|
142
|
+
"Compact (h-8 text-sm), border, bg-background, rounded-sm. " +
|
|
143
|
+
"Focus ring 1px (not 2px). Inline validation messages, no helper text by default.",
|
|
144
|
+
cta:
|
|
145
|
+
"Primary action is a button. Secondary actions are icon buttons. " +
|
|
146
|
+
"Marketing-style CTAs do not exist in this language.",
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
details: {
|
|
150
|
+
selectionBg: "hsl(var(--primary) / 0.25)",
|
|
151
|
+
selectionFg: "hsl(var(--foreground))",
|
|
152
|
+
focusRing: "1px solid hsl(var(--ring))", // thin — dense UIs can't afford a 2px ring
|
|
153
|
+
scrollbarStyle: "thin",
|
|
154
|
+
},
|
|
155
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Design Direction — Devtool-CLI
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Cloudflare signal-orange · Fly.io Plex-Mono voice · Railway dark canvas · Vercel Geist restraint · Resend warm-yellow accent
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Near-black canvas with one signal accent — orange-amber, used like a status LED. Monospace is promoted to display: terminal prompts, version strings, and code excerpts do the heavy lifting that headlines normally would. The page reads like a status dashboard that happens to be marketing — we run the internet, but the surface is effortless.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Cloudflare** → dark canvas + signal orange + JetBrains-Mono accents. The status-LED energy applied to a marketing site.
|
|
11
|
+
- **Fly.io** → deep paper-cream OR dark + IBM Plex Mono brand voice. Mono as identity, not as decoration.
|
|
12
|
+
- **Railway** → deep dark + Inter body + node-graph illustrations. The infrastructure-graph as hero visual.
|
|
13
|
+
- **Vercel** → black canvas + Geist sans + restrained chrome. Less is the brand.
|
|
14
|
+
- **Resend** → black canvas + warm yellow + minimal flourish. One accent, deployed with discipline.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand and a purpose.
|
|
18
|
+
|
|
19
|
+
Surface stack is **canvas** (background, deepest near-black) → **card** (one stop up, the terminal pane) → **popover** (two stops up, command palette / menu) → **secondary** → **muted** (code-block fill) → **accent** (hover). All on the same blue-biased near-black family — depth comes from one HSL lightness step, never a hue shift.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--signal` (Cloudflare orange — the LED), `--signal-warm` (Resend yellow — gradient partner), `--success` (terminal stdout green), `--info` (Railway link blue), `--canvas`, `--ink`. **The signal-orange is the one allowed accent.** Use it for primary CTAs, focus rings, and the hero gradient — never for body decoration, never as a card border.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** JetBrains Mono. h1–h3 use mono — the terminal prompt IS the headline. Tracking `-0.02em` (mono at scale needs tightening; counters Inter's looser metric).
|
|
25
|
+
- **Body:** Inter (Railway/Vercel body sans). Base **15px** with line-height **1.6** — technical body density, never magazine-loose.
|
|
26
|
+
- **Mono:** JetBrains Mono (same as display). Code blocks, shell commands, metric counters, version strings.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 5.5vw, 4.5rem)` — deliberately restrained. Mono at oversize loses readability fast; the discipline is to let the prompt speak, not shout. Numbers always use tabular figures (`"tnum"`). Slashed zero (`"zero"`) and stylistic alt 1 (`"ss01"`) are on by default — devtool convention so `0/O` and `1/l/I` never collide.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-5 lg:px-8` — 1152px max. Wide enough for two-column code+prose ("write this / get this") without breaking the eye.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-20 pb-16 lg:pt-28 lg:pb-24`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128. Medium density — terminal-pane breathing, never magazine-airy.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on the token, not via new tokens. Pure white and pure black are forbidden — `--canvas` (near-black, blue-biased) and `--ink` (cool off-white) replace them. The single signal accent is non-negotiable — adding a second accent breaks the metaphor.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 0.375rem` (6px). Soft enough to feel modern-web, sharp enough to feel engineered. Pills ARE allowed for **status indicators only** (`v2.4.1`, `stable`, `edge`, `beta`) — pills here read as terminal convention, not as web-app chrome. Never a pill button.
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
**Glow style, restrained.** Three utilities ship:
|
|
46
|
+
- `.glow-signal` — 1px signal-orange ring + soft halo. Reserved for the **hero card or hero CTA** only.
|
|
47
|
+
- `.panel-lift` — hairline bottom + soft drop. For floating panels (command palette, dropdown).
|
|
48
|
+
- `.terminal-inset` — inset hairline frame. For terminal/code-pane chrome.
|
|
49
|
+
|
|
50
|
+
No generic drop-shadows. No multi-stop elevation system.
|
|
51
|
+
|
|
52
|
+
## Motion
|
|
53
|
+
The motion vocabulary is **terminal-aesthetic**: blinking carets, typewriter reveals, log-stream stagger.
|
|
54
|
+
|
|
55
|
+
- `caret-blink` — 1100ms infinite, opacity 1↔0 on the half-step. The canonical devtool tell. One per page (the hero prompt).
|
|
56
|
+
- `type-in` — 1800ms once, `width 0→100%`. Pair with `steps(12)` or similar discrete timing in usage to read as typing. Used on the hero command line.
|
|
57
|
+
- `log-stream` — 400ms once, fade + 8px rise. Apply to log lines / status rows with a **60ms stagger** between siblings.
|
|
58
|
+
- `status-pulse` — 2000ms infinite, expanding ring on the success-green dot. The "all systems operational" heartbeat. One per surface.
|
|
59
|
+
- `fade-rise` — 600ms once, fade + 16px rise. The general section entrance.
|
|
60
|
+
|
|
61
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — blinks and pulses freeze at midpoint; typewriter resolves instantly to final state.
|
|
62
|
+
|
|
63
|
+
## Component patterns
|
|
64
|
+
- **Buttons:** ghost-default (1px `--border`, foreground text, hover `bg-accent`). **Primary = solid `--signal` fill with `--canvas` text**, used on the single hero action per page. Tertiary = text-link with dotted underline-offset. Command-shaped buttons (`npm install`, `gh repo clone`) may use mono. **Never gradient on button faces.**
|
|
65
|
+
- **Cards:** sharp-ish `0.375rem` corners, hairline `--border`, `bg-card`. **Terminal-pane variant** for hero or code-demo cards — header strip with three dots (close/min/max) in `--muted`, body in mono. Padding `p-5 lg:p-8`.
|
|
66
|
+
- **Inputs:** full box, 1px `--border`, `bg-card`, mono family by default — in a devtool surface, an input is command-shaped. Focus = 1px `--ring` (signal). Placeholder in `--muted-foreground`, mono.
|
|
67
|
+
- **CTAs:** hero is solid signal-fill with inline arrow glyph. Secondary CTAs ship in pairs (Docs / GitHub). Status pills accompany CTAs to convey runtime state (`stable`, `beta`, `edge`) — never as decoration.
|
|
68
|
+
- **Code blocks:** `bg-muted`, 1px `--border`, `0.375rem` radius, `p-4`. Filename strip on top (mono, `--muted-foreground`). Inline `<code>` uses `bg-muted` with no border, `0.25rem` radius, `px-1.5 py-0.5`.
|
|
69
|
+
|
|
70
|
+
## Recommended rich media
|
|
71
|
+
Devtool-CLI leans on three media archetypes — all native to the form, none lifted from generic SaaS:
|
|
72
|
+
1. **Terminal screenshots** — actual `iTerm2`/`Warp` captures, dark theme, JetBrains Mono, with the project's signal-orange used as the prompt accent. Cropped to 21:9 or 16:9, captioned with the command in mono below.
|
|
73
|
+
2. **Node-graph illustrations** — Railway's signature. Nodes (services, edges, requests) connected with hairline strokes in `--border` color, with one or two nodes glowing in `--signal`. Built in Figma or as inline SVG; never raster.
|
|
74
|
+
3. **Architecture diagrams** — Cloudflare's edge-network style. Geometric, monochrome (foreground + muted), one signal-orange highlight per diagram. Mono labels.
|
|
75
|
+
|
|
76
|
+
**AI tool recommendations:** **Excalidraw** with the system-default style for hand-drawn architecture diagrams (then re-color tokens to match). **Figma + Auto-layout** for node graphs. **CleanShot X** or **Ray.so** for terminal/code screenshots with the project's exact token palette. Avoid Midjourney/Flux — they produce generic "tech" imagery (glowing servers, neon highways) that screams 2010s SaaS, not 2025 devtool.
|
|
77
|
+
|
|
78
|
+
**Aspect ratios:** 21:9 for terminal hero captures. 16:9 for architecture diagrams. 1:1 for inline node graphs in feature cards. **Never 4:5 portrait** — devtool sites are landscape-monitor-shaped.
|
|
79
|
+
|
|
80
|
+
**Video:** allowed and encouraged for one purpose only — a **15–30s screencast loop** of the CLI doing something real (deploy, log stream, edge invalidation). Muted, autoplay, looped, posterframe on signal-orange prompt. WebM/AV1, ≤2 MB. Never a talking-head explainer.
|
|
81
|
+
|
|
82
|
+
**Performance:** hero terminal capture ≤80 KB AVIF at 1600w. Node-graph SVGs inlined and ≤8 KB each. LCP under 1.5s — devtool audiences run Lighthouse on your site for fun; a slow devtool site is self-disqualifying.
|
|
83
|
+
|
|
84
|
+
**Avoid:** stock photos of "developers" with hoodies and giant monitors, glowing-server-room imagery, gradient meshes (soft-modern territory), 3D isometric illustrations (mid-2010s Stripe-clone aesthetic), AI imagery with hand-warped keyboards, lens flare, particle backgrounds.
|
|
85
|
+
|
|
86
|
+
**Accessibility:** terminal/code captures are images of text and **must ship a real `<pre><code>` block alongside** for copy-paste and screen-reader access. The image is decoration; the code is the content. Alt text on diagrams describes the dataflow in one sentence — *"Diagram: requests enter the edge router, fan out to three regions, return to the user."*
|
|
87
|
+
|
|
88
|
+
## Component families
|
|
89
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. Expected first families: `terminal-pane`, `log-row`, `status-pill`, `command-button`.
|
|
90
|
+
|
|
91
|
+
## Details
|
|
92
|
+
- **Selection:** `hsl(var(--signal) / 0.35)` background, foreground text — orange highlight on the terminal.
|
|
93
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` — signal-orange, no offset, no glow. The accent IS the focus indicator.
|
|
94
|
+
- **Scrollbar:** thin. Track is `--card`; thumb is `--border`. Hover thumb `--muted-foreground`.
|
|
95
|
+
|
|
96
|
+
## Exceptions
|
|
97
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason.
|
|
98
|
+
|
|
99
|
+
## Revisions
|
|
100
|
+
- Initial direction, generated at install time.
|