@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,107 @@
|
|
|
1
|
+
# Design Direction — Signal-Dark
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Tesla blackout · Hugging Face yellow signal · Apple display type · Cybertruck engineered restraint · Vercel typographic discipline
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Warm-black backdrop with one bright yellow signal color and oversized display type. Hugging-Face-style model-card grids carry technical content; Tesla-style hero moments carry marketing. Reads as a premium developer tool — serious, friendly, expensive without being noisy. The opposite of generic AI-startup purple.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Tesla** → warm-black blackout marketing surfaces. Photography is the lead; UI gets out of the way.
|
|
11
|
+
- **Hugging Face** → yellow signal accent (#FFD21E) and model-card chrome. Code prominence; technical-but-friendly voice.
|
|
12
|
+
- **Apple** → oversized SF Pro display type at 80-140px, generous tracking refinement, hero whitespace.
|
|
13
|
+
- **Cybertruck** → engineered angular restraint, raw materiality. Hairline borders that *suggest* without enforcing.
|
|
14
|
+
- **Vercel** → developer-tool typographic discipline. Body type that's neutral; mono type that's prominent.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. The warm bias on dark surfaces (`30°` hue) is deliberate — it keeps photography from looking dead. Tesla cinematic uses cool 220° blue-black; signal-dark uses warm 30°. Same pitch-black at first glance, different feeling underneath.
|
|
18
|
+
|
|
19
|
+
Brand tokens: `signal` (= primary), `signal-glow`, `ice` (Vercel cyan, used sparingly for info states), `carbon` (Cybertruck steel for contrast panels), `platinum` (warm silver for sub-headings), `glow-warm` + `glow-cool` (radial-gradient stops for hero backdrops).
|
|
20
|
+
|
|
21
|
+
The yellow `signal` is the **only allowed accent color** on a page. No second color for "variety." If you need a status signal (success/warning/info), use mono labels with the signal-yellow dot prefix, not green/orange/blue chips. The single-color rule is what makes the yellow read as *the signal*.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Inter (Apple SF Pro Display approximation). Weights 500/600/700/800. h1-h4. Hero h1 uses `clamp(3.5rem, 10vw, 9rem)` — Apple/Vercel hero scale. Tracking `-0.04em` (very tight at display sizes; loosens to `-0.005em` at body).
|
|
25
|
+
- **Body:** Inter, 17px, line-height 1.55. Negative tracking `-0.005em`.
|
|
26
|
+
- **Mono:** JetBrains Mono. **Prominent.** Used for eyebrow labels (small-caps mono), code, model IDs, CLI output, status meta. Hugging-Face-style code-first surfaces.
|
|
27
|
+
|
|
28
|
+
Font features: `"cv11", "ss01", "ss03", "tnum"` — Inter stylistic sets + tabular figures. Numbers use `font-mono` or `.tabular`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-6 lg:px-12` (1280px wide — Apple/Tesla claim the screen).
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-24 pb-32 lg:pt-32 lg:pb-48` — oversized
|
|
34
|
+
- Default: `py-20 lg:py-32`
|
|
35
|
+
- Tight: `py-12 lg:py-20`
|
|
36
|
+
- **Allowed scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96 128.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. All color via tokens. Opacity via `/N` modifier on a token. **Pure black is forbidden** (`--background` is `30 8% 5%`, never `0 0% 0%`). **Pure white is forbidden** (`--foreground` is `30 15% 96%`, never `0 0% 100%`). The warm bias is structural; abandoning it makes everything look like every other dark-mode site.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 0.75rem` (12px). Apple-iOS card radius — rounded but not pillowy. **Pills are allowed** (`pillsAllowed: true`) for status badges, tags, model-card meta chips. Pure right angles read as a Vercel-dashboard surface (off-direction); pure pills read as a chip toggle (also off-direction).
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
Style is **"glow"**. Signature utility: `.glow-signal` (yellow halo + soft drop) on primary CTAs and active states. Cards use `.glow-card` (border + subtle drop + ambient backdrop shadow). The glow is the depth language — drop-shadows alone read as 2018 SaaS.
|
|
46
|
+
|
|
47
|
+
Three utilities:
|
|
48
|
+
- `.glow-signal` — yellow halo for the one primary action per page
|
|
49
|
+
- `.glow-card` — default card lift with border + subtle dark drop
|
|
50
|
+
- `.glow-subtle` — minimal hairline + small drop for secondary surfaces
|
|
51
|
+
|
|
52
|
+
## Motion
|
|
53
|
+
- **Easing:** `cubic-bezier(0.22, 1, 0.36, 1)`
|
|
54
|
+
- **Duration tiers:** reveal (700ms), loop (3s), ambient (32s)
|
|
55
|
+
- **Keyframes:**
|
|
56
|
+
- `fade-rise` — standard content reveal
|
|
57
|
+
- `glow-pulse` — primary CTA breathes slowly (3s loop on the main action)
|
|
58
|
+
- `gradient-shift` — hero backdrop drifts slowly (32s ambient, no visible loop point)
|
|
59
|
+
- `terminal-type` — staggered slide-in for terminal-demo lines
|
|
60
|
+
|
|
61
|
+
`prefers-reduced-motion` honored throughout. Transform-only animations on loops; never animate `top/left/width/height`.
|
|
62
|
+
|
|
63
|
+
## Component patterns
|
|
64
|
+
- **Buttons:** primary = solid yellow signal (`bg-signal text-primary-foreground rounded-xl font-medium`), `glow-signal` shadow on hover. Secondary = ghost (border + foreground). Tertiary = mono text-link with signal underline. **One primary per page.**
|
|
65
|
+
- **Cards:** `rounded-xl border bg-card`, `glow-card` shadow. Padding `p-6 lg:p-8`. Title in display font; meta in mono. Hover lifts with `translate-y-[-2px]` and the glow strengthens. **Model-card-style** — HF influence: meta lives at the top in mono, content lives below.
|
|
66
|
+
- **Inputs:** rounded-lg box, border, `bg-secondary`. Focus ring `2px solid signal at 60% opacity`. Label above; helper below in `mutedForeground`.
|
|
67
|
+
- **CTAs:** primary action is *the* yellow button — always. There is ONE primary CTA per page maximum. Secondary actions are ghost buttons or text-links. Marketing-heavy "free trial / sign up" double-CTAs are forbidden — pick one.
|
|
68
|
+
|
|
69
|
+
## Component families
|
|
70
|
+
**Model-card** (`*Card`, `*ModelCard`): rounded-xl, border, bg-card, glow-card; meta row in mono at top (icon + slug + version pill); display-font title; mono description; hover lifts. **Status pill** (`*Pill`, `*Badge`): rounded-full, text-xs, px-2 py-0.5, mono, signal-yellow dot prefix for active/success; never colored fills. **Hero block** (`*Hero`): full-bleed gradient backdrop, oversized h1, mono eyebrow, single yellow CTA + ghost secondary.
|
|
71
|
+
|
|
72
|
+
## Recommended rich media
|
|
73
|
+
|
|
74
|
+
Signal-dark is **photography-rich** in the Tesla / Apple-marketing tradition, but **screenshot-rich** in the Hugging Face / Vercel developer-tool tradition. The mix is the direction.
|
|
75
|
+
|
|
76
|
+
**Hero media:** widescreen photography (21:9 or 16:9), color-graded toward warm shadows + cool highlights (Tesla-cinematic), or product photography on warm-black seamless. **CSS mesh-gradient backdrops** are also permitted as the hero — radial gradients of `--glow-warm` and `--glow-cool` over `--background`, animated subtly via `gradient-shift`. The gradient backdrop is the cheapest hero option that still reads premium.
|
|
77
|
+
|
|
78
|
+
**Code / terminal demo:** the signature signal-dark element. Show the product running — CLI output, code snippets, model-card examples — in a styled `<pre>` with terminal chrome (window dots, title bar). HF leans into this hard; signal-dark should too. Use **JetBrains Mono**, signal-yellow for the prompt and accents, off-white body, dimmed muted-foreground for system text.
|
|
79
|
+
|
|
80
|
+
**AI tool recommendations:**
|
|
81
|
+
- **Midjourney / Flux** with prompts like *"Tesla marketing site photography, warm shadows, cool highlights, 21:9 cinematic, slight film grain, anamorphic lens flare suppressed"* for hero photography
|
|
82
|
+
- **Sora / Runway / Veo** for hero video loops (cinematic atmosphere, slow motion, max 8 MB)
|
|
83
|
+
- **Spline** for hero 3D — premium product objects, glass/chrome surfaces with warm rim lighting
|
|
84
|
+
- **mesh-gradient.com** for the CSS-only gradient backdrop (no AI needed)
|
|
85
|
+
- **Carbon (carbon.now.sh)** or **Ray.so** for static code-snippet images in warm-black theme
|
|
86
|
+
|
|
87
|
+
**Aspect ratios:** 21:9 or 16:9 for hero photography; 4:3 or 1:1 for product shots; gradient backdrops are full-bleed (no aspect constraint).
|
|
88
|
+
|
|
89
|
+
**Performance:** hero photo ≤200 KB AVIF at 1920w; hero video ≤6 MB H.265 with poster fallback; mesh-gradient is ~0 KB CSS. LCP target <2s on 4G.
|
|
90
|
+
|
|
91
|
+
**Avoid:** pure black photography backgrounds (kills the warm bias), saturated chrome 3D (that's Y2K), gradient backdrops in the wrong hue (no purple, no pink — warm amber + cool blue only), generic stock photography with watermarks, autoplay video with sound, photography that competes with the yellow signal (no yellow-dominant images — the signal must remain the unique yellow on the page).
|
|
92
|
+
|
|
93
|
+
**Accessibility:** WCAG AA for text on warm-black requires foreground at ≥`30 15% 88%` minimum (we use `30 15% 96%`, well above). Yellow signal on warm-black passes AA at large size; for small body text on yellow, the foreground must be the near-black `--primary-foreground`, never off-white.
|
|
94
|
+
|
|
95
|
+
## Component families (when projects add them)
|
|
96
|
+
Document each family here as it emerges. Initial expected families: `*Card` (model-card pattern), `*Pill` (status/tag), `*Hero` (full-bleed gradient + oversized type).
|
|
97
|
+
|
|
98
|
+
## Details
|
|
99
|
+
- **Selection:** `hsl(var(--signal) / 0.3)` background, foreground text.
|
|
100
|
+
- **Focus ring:** `2px solid hsl(var(--signal) / 0.6)` — visible and on-brand.
|
|
101
|
+
- **Scrollbar:** thin, warm-toned.
|
|
102
|
+
|
|
103
|
+
## Exceptions
|
|
104
|
+
None yet. When an intentional violation lands (e.g. a Tesla cinematic-dark *blue* hue used for a single hero moment), add it here with the reason.
|
|
105
|
+
|
|
106
|
+
## Revisions
|
|
107
|
+
- Initial direction, generated at install time. Authored as the 13th canonical direction to dogfood the synthesis Tesla + Hugging Face + Apple — and to provide a premium-developer-tool aesthetic the original twelve didn't cover.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const signalDark: Direction = {
|
|
4
|
+
name: "signal-dark",
|
|
5
|
+
ethos:
|
|
6
|
+
"Tesla blackout · Hugging Face yellow signal · Apple display type · Cybertruck engineered restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Tesla", trait: "warm-black blackout marketing surfaces" },
|
|
9
|
+
{ brand: "Hugging Face", trait: "yellow signal accent + model-card chrome" },
|
|
10
|
+
{ brand: "Apple", trait: "oversized SF Pro display type, generous whitespace" },
|
|
11
|
+
{ brand: "Cybertruck", trait: "engineered angular restraint, raw materiality" },
|
|
12
|
+
{ brand: "Vercel", trait: "developer-tool typographic discipline" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Warm-black backdrop with one bright yellow signal color and oversized display type. " +
|
|
16
|
+
"Hugging-Face-style model-card grids carry technical content; Tesla-style hero moments " +
|
|
17
|
+
"carry marketing. Reads as a premium developer tool — serious, friendly, expensive " +
|
|
18
|
+
"without being noisy. The opposite of generic AI-startup purple.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Inter",
|
|
23
|
+
fallback: ["-apple-system", "BlinkMacSystemFont", "Segoe UI", "system-ui", "sans-serif"],
|
|
24
|
+
from: "Apple SF Pro Display feel via Inter — closest open-source approximation, used at 80-140px hero sizes",
|
|
25
|
+
googleFont: "Inter",
|
|
26
|
+
weights: [400, 500, 600, 700, 800],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Inter",
|
|
30
|
+
fallback: ["-apple-system", "BlinkMacSystemFont", "system-ui", "sans-serif"],
|
|
31
|
+
from: "Apple SF Pro Text feel — clean at 14-18px body sizes",
|
|
32
|
+
googleFont: "Inter",
|
|
33
|
+
weights: [400, 500, 600],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "Hugging-Face-style code prominence — model IDs, tokens, CLI output, eyebrow labels",
|
|
39
|
+
googleFont: "JetBrains+Mono",
|
|
40
|
+
weights: [400, 500, 600],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.04em", // Apple-tight at display sizes; tighter than editorial -0.015em
|
|
46
|
+
bodyTracking: "-0.005em", // very subtle negative tracking — Apple body convention
|
|
47
|
+
fontFeatureSettings: '"cv11", "ss01", "ss03", "tnum"',
|
|
48
|
+
h1ScaleClamp: "clamp(3.5rem, 10vw, 9rem)", // ALERT-LEVEL oversized — Apple/Vercel hero scale
|
|
49
|
+
bodyBaseSize: "1.0625rem", // 17px — Apple body default
|
|
50
|
+
bodyLineHeight: "1.55",
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
// Surfaces — warm-black, Tesla blackout with slight warm bias (30°) so
|
|
55
|
+
// photography reads alive, not corpse-blue
|
|
56
|
+
background: { hsl: "30 8% 5%", from: "Tesla blackout — warm-bias near-black" },
|
|
57
|
+
foreground: { hsl: "30 15% 96%", from: "warm off-white, never pure white — Apple-tinted" },
|
|
58
|
+
card: { hsl: "30 6% 8%", from: "card surface, 3% lighter than bg" },
|
|
59
|
+
popover: { hsl: "30 6% 11%", from: "popover/menu surface, 6% lighter than bg" },
|
|
60
|
+
|
|
61
|
+
// Primary — Hugging Face yellow signal
|
|
62
|
+
primary: { hsl: "48 100% 56%", from: "Hugging Face yellow #FFD21E — the ONE signal color" },
|
|
63
|
+
primaryForeground: { hsl: "30 8% 5%", from: "near-black on yellow for max contrast" },
|
|
64
|
+
|
|
65
|
+
// Secondary surfaces — monochromatic steps
|
|
66
|
+
secondary: { hsl: "30 6% 14%", from: "secondary surface, Cybertruck engineered restraint" },
|
|
67
|
+
secondaryForeground: { hsl: "30 15% 96%", from: "off-white on dark gray" },
|
|
68
|
+
muted: { hsl: "30 6% 14%", from: "same as secondary; differentiation by usage" },
|
|
69
|
+
mutedForeground: { hsl: "30 8% 65%", from: "warm gray — captions, meta, eyebrows" },
|
|
70
|
+
accent: { hsl: "30 6% 18%", from: "hover surface, one tier lighter than secondary" },
|
|
71
|
+
accentForeground: { hsl: "30 15% 96%", from: "off-white on hover" },
|
|
72
|
+
|
|
73
|
+
// Borders — Cybertruck hairline, visible but quiet
|
|
74
|
+
border: { hsl: "30 6% 18%", from: "Cybertruck hairline — same as accent, structural" },
|
|
75
|
+
input: { hsl: "30 6% 18%", from: "same as border" },
|
|
76
|
+
ring: { hsl: "48 100% 56%", from: "primary yellow — focus rings everywhere" },
|
|
77
|
+
|
|
78
|
+
// Destructive — warm red, not pure (matches warm palette)
|
|
79
|
+
destructive: { hsl: "8 80% 56%", from: "warm Tesla brake-light red" },
|
|
80
|
+
destructiveForeground: { hsl: "30 15% 96%", from: "off-white on warm red" },
|
|
81
|
+
|
|
82
|
+
brand: {
|
|
83
|
+
signal: { hsl: "48 100% 56%", from: "alias for primary — the yellow signal color" },
|
|
84
|
+
"signal-glow": { hsl: "48 100% 65%", from: "brighter yellow for hover/glow states" },
|
|
85
|
+
ice: { hsl: "200 85% 65%", from: "Vercel-cyan tertiary accent, used sparingly for info" },
|
|
86
|
+
carbon: { hsl: "0 0% 12%", from: "Cybertruck steel — pure-neutral panel for contrast moments" },
|
|
87
|
+
platinum: { hsl: "30 8% 88%", from: "warm silver — sub-headings, premium meta text" },
|
|
88
|
+
"glow-warm": { hsl: "40 85% 60%", from: "amber glow stop for backdrop gradients" },
|
|
89
|
+
"glow-cool": { hsl: "200 75% 55%", from: "cool blue glow stop for backdrop gradients" },
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
spacing: {
|
|
94
|
+
base: 4,
|
|
95
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128],
|
|
96
|
+
containerMax: "max-w-7xl", // wider than editorial — Apple/Tesla claim the screen
|
|
97
|
+
containerPadding: "px-6 lg:px-12",
|
|
98
|
+
sectionPadding: {
|
|
99
|
+
hero: "pt-24 pb-32 lg:pt-32 lg:pb-48", // oversized hero — Apple convention
|
|
100
|
+
default: "py-20 lg:py-32",
|
|
101
|
+
tight: "py-12 lg:py-20",
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
radius: {
|
|
106
|
+
base: "0.75rem", // 12px — Apple iOS card; rounded but not pillowy
|
|
107
|
+
pillsAllowed: true, // status pills, tags, badges — HF model-card convention
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
shadows: {
|
|
111
|
+
style: "glow", // signature: yellow glow on hover for primary surfaces
|
|
112
|
+
utilities: {
|
|
113
|
+
"glow-signal":
|
|
114
|
+
"0 0 0 1px hsl(var(--signal) / 0.4), 0 8px 32px hsl(var(--signal) / 0.25), 0 16px 64px hsl(var(--signal) / 0.15)",
|
|
115
|
+
"glow-card":
|
|
116
|
+
"0 0 0 1px hsl(var(--border)), 0 4px 16px hsl(0 0% 0% / 0.4), 0 16px 48px hsl(0 0% 0% / 0.2)",
|
|
117
|
+
"glow-subtle":
|
|
118
|
+
"0 0 0 1px hsl(var(--border)), 0 2px 8px hsl(0 0% 0% / 0.3)",
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
motion: {
|
|
123
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
124
|
+
durations: { reveal: 700, loop: 3000, ambient: 32000 },
|
|
125
|
+
keyframes: {
|
|
126
|
+
"fade-rise": {
|
|
127
|
+
css:
|
|
128
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
129
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
130
|
+
defaultDuration: 700,
|
|
131
|
+
iteration: "once",
|
|
132
|
+
purpose: "standard reveal — content enters with subtle rise",
|
|
133
|
+
},
|
|
134
|
+
"glow-pulse": {
|
|
135
|
+
css:
|
|
136
|
+
"0%, 100% { box-shadow: 0 0 0 1px hsl(var(--signal) / 0.4), 0 8px 32px hsl(var(--signal) / 0.25); }\n" +
|
|
137
|
+
"50% { box-shadow: 0 0 0 1px hsl(var(--signal) / 0.6), 0 12px 48px hsl(var(--signal) / 0.4); }",
|
|
138
|
+
defaultDuration: 3000,
|
|
139
|
+
iteration: "infinite",
|
|
140
|
+
purpose: "primary CTA breathing — slow yellow pulse on the main action",
|
|
141
|
+
},
|
|
142
|
+
"gradient-shift": {
|
|
143
|
+
css:
|
|
144
|
+
"0%, 100% { background-position: 0% 50%; }\n" +
|
|
145
|
+
"50% { background-position: 100% 50%; }",
|
|
146
|
+
defaultDuration: 32000,
|
|
147
|
+
iteration: "infinite",
|
|
148
|
+
purpose: "hero backdrop — slow gradient drift, set-and-forget ambient",
|
|
149
|
+
},
|
|
150
|
+
"terminal-type": {
|
|
151
|
+
css:
|
|
152
|
+
"from { opacity: 0; transform: translateX(-8px); }\n" +
|
|
153
|
+
"to { opacity: 1; transform: translateX(0); }",
|
|
154
|
+
defaultDuration: 400,
|
|
155
|
+
iteration: "once",
|
|
156
|
+
purpose: "terminal demo — each line types in with a small slide",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
respectsReducedMotion: true,
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
density: "medium",
|
|
163
|
+
|
|
164
|
+
patterns: {
|
|
165
|
+
button:
|
|
166
|
+
"Primary = solid yellow signal (bg-signal, foreground=near-black, rounded-xl, font-medium, glow-signal shadow on hover). Secondary = ghost with border + foreground. Tertiary = mono text-link with signal underline.",
|
|
167
|
+
card:
|
|
168
|
+
"rounded-xl, border, bg-card, glow-card shadow. Padding p-6 lg:p-8. Title in display font; meta in mono. Hover lifts with translate-y-[-2px] and glow strengthens.",
|
|
169
|
+
input:
|
|
170
|
+
"rounded-lg box, border, bg-secondary. Focus ring = 2px solid signal at 60% opacity. Label above; helper below in mutedForeground.",
|
|
171
|
+
cta:
|
|
172
|
+
"Primary action is the yellow button — always. There is ONE primary CTA per page maximum. Secondary actions are ghost buttons or text-links. Marketing-heavy 'free trial / sign up' double-CTAs are forbidden.",
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
details: {
|
|
176
|
+
selectionBg: "hsl(var(--signal) / 0.3)",
|
|
177
|
+
selectionFg: "hsl(var(--foreground))",
|
|
178
|
+
focusRing: "2px solid hsl(var(--signal) / 0.6)",
|
|
179
|
+
scrollbarStyle: "thin",
|
|
180
|
+
},
|
|
181
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Design Direction — Soft-Modern
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Linear's geometric calm · Notion warmth · Stripe homepage gradients · Vercel's quiet polish · Plain's friendly chrome
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Approachable and considered. Rounded corners, soft layered shadows, friendly geometric sans, muted accent palette with one signal color. Subtle motion that confirms interaction without demanding attention. Reads productive, not flashy.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Linear** → geometric calm. Quiet UI that disappears into the work.
|
|
11
|
+
- **Notion** → approachable warmth. Friendly without being childish.
|
|
12
|
+
- **Stripe** → soft gradient backdrops. Marketing surfaces, not docs.
|
|
13
|
+
- **Vercel** → quiet polish. Hairline borders, minimal shadow.
|
|
14
|
+
- **Plain (plain.com)** → friendly type, rounded chrome.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Brand tokens: `--violet-soft`, `--violet-deep`, `--teal`, `--amber`. Primary is **violet** (Linear-style 262° hue). Surface stack is monochromatic (220° hue across background/secondary/muted/accent) — depth from border + shadow, never from hue shift.
|
|
18
|
+
|
|
19
|
+
The brand tokens (`teal`, `amber`) are the **secondary accents** — used sparingly, never as primary CTA color. They exist for status indicators, highlight badges, and one-off marketing moments.
|
|
20
|
+
|
|
21
|
+
## Typography
|
|
22
|
+
- **Display:** Plus Jakarta Sans (Notion/Plain — friendly geometric, slightly humanist). h1–h4, weights 500/600/700.
|
|
23
|
+
- **Body:** Inter (Linear/Vercel sans — clean at small sizes). Base 16px, line-height 1.6. Tracking `0`.
|
|
24
|
+
- **Mono:** JetBrains Mono. Code blocks, metrics, tabular numerics.
|
|
25
|
+
|
|
26
|
+
Headings track `-0.02em` (sans-serif headings benefit from tight tracking). Numbers always use `font-variant-numeric: tabular-nums`. Inter stylistic sets `"cv11", "ss01", "ss03"` for single-story a/g.
|
|
27
|
+
|
|
28
|
+
## Spacing
|
|
29
|
+
- **Container:** `max-w-6xl px-4 lg:px-8`.
|
|
30
|
+
- **Section padding tiers:**
|
|
31
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
|
|
32
|
+
- Default: `py-16 lg:py-24`
|
|
33
|
+
- Tight: `py-12 lg:py-16`
|
|
34
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80.
|
|
35
|
+
|
|
36
|
+
## Color
|
|
37
|
+
No hex anywhere. All color via tokens. Opacity via `/N` modifier. Pure white is allowed for cards (`--card`); pure black is not — `--foreground` is `224 38% 10%` (deep slate).
|
|
38
|
+
|
|
39
|
+
## Radius
|
|
40
|
+
`--radius: 0.75rem` (12px). **Rounded is the signature.** Pills are allowed for status chips and tags (`pillsAllowed: true`). Hard right angles read "bare HTML" in this language — keep things rounded.
|
|
41
|
+
|
|
42
|
+
## Shadows
|
|
43
|
+
Three soft-layered utilities:
|
|
44
|
+
- `.shadow-soft` — default card lift
|
|
45
|
+
- `.shadow-soft-lg` — hover lift, larger spread
|
|
46
|
+
- `.shadow-soft-inset` — top-edge highlight for raised surfaces
|
|
47
|
+
|
|
48
|
+
Shadows use 220° gray at 4-8% opacity — never pure black, never high opacity. The soft-modern shadow is *almost not there*.
|
|
49
|
+
|
|
50
|
+
## Motion
|
|
51
|
+
Three keyframes:
|
|
52
|
+
- `fade-rise` (600ms) — standard content entrance
|
|
53
|
+
- `scale-in` (200ms) — modals, popovers, tooltips
|
|
54
|
+
- `shimmer` (1600ms loop) — loading skeletons
|
|
55
|
+
|
|
56
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. Reveal duration `600ms` — fast enough to feel responsive. `prefers-reduced-motion` honored.
|
|
57
|
+
|
|
58
|
+
## Component patterns
|
|
59
|
+
- **Buttons:** solid-fill primary (`bg-primary`, `text-primary-foreground`, `rounded-xl`, `shadow-soft`). Secondary is ghost (border + foreground text). Tertiary is link. Hover lifts subtly (scale 1.01 + `shadow-soft-lg`).
|
|
60
|
+
- **Cards:** `rounded-xl`, border, `bg-card`, `shadow-soft`. Padding `p-6 lg:p-8`. Title in display font. Hover lifts to `shadow-soft-lg`.
|
|
61
|
+
- **Inputs:** full rounded-lg box, border, `bg-background`. Focus ring `2px solid var(--ring) / 0.5`. Label above; helper text below in `mutedForeground`.
|
|
62
|
+
- **CTAs:** primary button is default. Secondary CTAs use ghost button or text-link with primary color.
|
|
63
|
+
|
|
64
|
+
## Recommended rich media
|
|
65
|
+
Soft-modern's lead media is the **gradient backdrop** itself — Stripe-homepage-style soft mesh gradients (violet → teal → amber, low saturation, smooth blends). Product imagery is studio-clean on white seamless, slightly elevated with a soft shadow. Hero illustrations lean toward isometric or abstract geometric — Linear/Notion/Plain visual language. Photography is sparingly used; the gradient is doing the visual work.
|
|
66
|
+
|
|
67
|
+
**AI tool recommendations:** for mesh gradients, **mesh-gradient.com** or **csshero.org/mesh** for declarative CSS (no AI needed, often the right answer); **Midjourney / Flux** with prompts like *"soft mesh gradient, violet to teal to amber, smooth blend, 4K, abstract background"*; **Spline** for interactive 3D shapes (gradient orbs, soft geometry) when a hero needs depth; **Recraft** for isometric product illustrations and Notion-style figurative drawings; **Linear's screenshot library aesthetic** as a prompting target ("Linear app screenshot, geometric calm, single accent color").
|
|
68
|
+
|
|
69
|
+
**Aspect ratios:** gradient backdrops are full-bleed (no aspect constraint); product shots 4:3 or 1:1; isometric illustrations 16:9 hero or 4:3 supporting. Avoid 21:9 cinematic widescreen — that's cinematic-dark territory.
|
|
70
|
+
|
|
71
|
+
**Video:** subtle hero video accents are on-brand — UI screen-recordings with soft transitions (Linear-style demo), short product loops (4-8s, autoplay muted, no narration). ≤6 MB, H.265. Background gradient continues to play even when video pauses.
|
|
72
|
+
|
|
73
|
+
**Performance:** mesh gradient as CSS is ~0 KB. AVIF product shots ≤120 KB at 1200w. Video kept short and tightly compressed. LCP target under 1.5s on 4G.
|
|
74
|
+
|
|
75
|
+
**Avoid:** photorealistic AI hero images (too much depth — fights the soft palette), film-grain textures (cinematic-dark), dark moody photography, chrome 3D renders (Y2K), heavy decorative pattern (maximalist), pure black backgrounds.
|
|
76
|
+
|
|
77
|
+
**Accessibility:** gradient backgrounds at low contrast can fail WCAG AA — always verify text-on-gradient contrast; consider placing copy on a card surface inside the gradient rather than directly on the backdrop.
|
|
78
|
+
|
|
79
|
+
## Component families
|
|
80
|
+
None at install time. As `*Card`, `*Tile`, `*Badge` families emerge in the project, the Director lists them here with their shared pattern.
|
|
81
|
+
|
|
82
|
+
## Details
|
|
83
|
+
- **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text.
|
|
84
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — visible, not loud.
|
|
85
|
+
- **Scrollbar:** thin.
|
|
86
|
+
|
|
87
|
+
## Exceptions
|
|
88
|
+
None yet.
|
|
89
|
+
|
|
90
|
+
## Revisions
|
|
91
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const softModern: Direction = {
|
|
4
|
+
name: "soft-modern",
|
|
5
|
+
ethos: "Linear's softer cousin · Notion warmth · Stripe homepage gradients · Vercel's quiet polish",
|
|
6
|
+
references: [
|
|
7
|
+
{ brand: "Linear", trait: "geometric calm" },
|
|
8
|
+
{ brand: "Notion", trait: "approachable warmth" },
|
|
9
|
+
{ brand: "Stripe", trait: "soft gradient backdrops" },
|
|
10
|
+
{ brand: "Vercel", trait: "quiet polish on the marketing site" },
|
|
11
|
+
{ brand: "Plain (plain.com)", trait: "friendly type, rounded chrome" },
|
|
12
|
+
],
|
|
13
|
+
feel:
|
|
14
|
+
"Approachable and considered. Rounded corners, soft layered shadows, " +
|
|
15
|
+
"friendly geometric sans, muted accent palette with one signal color. " +
|
|
16
|
+
"Subtle motion that confirms interaction without demanding attention. " +
|
|
17
|
+
"Reads productive, not flashy.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Plus Jakarta Sans",
|
|
22
|
+
fallback: ["Inter", "system-ui", "-apple-system", "sans-serif"],
|
|
23
|
+
from: "Notion/Plain — friendly geometric, slightly humanist",
|
|
24
|
+
googleFont: "Plus+Jakarta+Sans",
|
|
25
|
+
weights: [500, 600, 700],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
|
|
30
|
+
from: "Linear/Vercel sans — clean, neutral, readable at small sizes",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500, 600],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["ui-monospace", "SFMono-Regular", "monospace"],
|
|
37
|
+
from: "code blocks, metrics — tabular numerics",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.02em", // friendly sans-serif headings benefit from tight tracking
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"cv11", "ss01", "ss03"', // Inter stylistic sets — single-story a/g
|
|
47
|
+
h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)",
|
|
48
|
+
bodyBaseSize: "1rem",
|
|
49
|
+
bodyLineHeight: "1.6",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "220 20% 99%", from: "near-white, faint blue bias — Linear surface" },
|
|
54
|
+
foreground: { hsl: "224 38% 10%", from: "deep slate, never pure black — Notion ink" },
|
|
55
|
+
card: { hsl: "0 0% 100%", from: "pure white card — lifts off the background subtly" },
|
|
56
|
+
popover: { hsl: "0 0% 100%", from: "same as card" },
|
|
57
|
+
primary: { hsl: "262 70% 58%", from: "violet — Linear's accent" },
|
|
58
|
+
primaryForeground: { hsl: "0 0% 100%", from: "white on violet" },
|
|
59
|
+
secondary: { hsl: "220 16% 96%", from: "soft cool gray — Vercel quiet surface" },
|
|
60
|
+
secondaryForeground: { hsl: "224 38% 14%", from: "slate ink on cool gray" },
|
|
61
|
+
muted: { hsl: "220 16% 96%", from: "same as secondary" },
|
|
62
|
+
mutedForeground: { hsl: "220 12% 46%", from: "slate gray — captions and meta" },
|
|
63
|
+
accent: { hsl: "220 16% 94%", from: "hover surface — one tier deeper than secondary" },
|
|
64
|
+
accentForeground: { hsl: "224 38% 14%", from: "slate ink" },
|
|
65
|
+
border: { hsl: "220 14% 90%", from: "soft border — visible, not assertive" },
|
|
66
|
+
input: { hsl: "220 14% 90%", from: "same as border" },
|
|
67
|
+
ring: { hsl: "262 70% 58%", from: "primary, used for focus only" },
|
|
68
|
+
destructive: { hsl: "354 80% 56%", from: "warm red — not the harsh enterprise red" },
|
|
69
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on warm red" },
|
|
70
|
+
brand: {
|
|
71
|
+
"violet-soft": { hsl: "262 60% 96%", from: "primary tinted bg — pills, highlights" },
|
|
72
|
+
"violet-deep": { hsl: "262 75% 42%", from: "primary hover, intensified" },
|
|
73
|
+
teal: { hsl: "172 60% 42%", from: "second accent — Stripe/Linear teal, used sparingly" },
|
|
74
|
+
amber: { hsl: "38 90% 60%", from: "warmth/highlight accent — Notion-like" },
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
spacing: {
|
|
79
|
+
base: 4,
|
|
80
|
+
scale: [4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64, 80],
|
|
81
|
+
containerMax: "max-w-6xl",
|
|
82
|
+
containerPadding: "px-4 lg:px-8",
|
|
83
|
+
sectionPadding: {
|
|
84
|
+
hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
|
|
85
|
+
default: "py-16 lg:py-24",
|
|
86
|
+
tight: "py-12 lg:py-16",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
radius: {
|
|
91
|
+
base: "0.75rem", // 12px — the soft-modern signature
|
|
92
|
+
pillsAllowed: true, // pills are part of this language (status chips, tags)
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
shadows: {
|
|
96
|
+
style: "soft",
|
|
97
|
+
utilities: {
|
|
98
|
+
"shadow-soft":
|
|
99
|
+
"0 1px 2px hsl(220 14% 50% / 0.04), 0 4px 12px hsl(220 14% 50% / 0.06)",
|
|
100
|
+
"shadow-soft-lg":
|
|
101
|
+
"0 2px 4px hsl(220 14% 50% / 0.04), 0 12px 32px hsl(220 14% 50% / 0.08)",
|
|
102
|
+
"shadow-soft-inset":
|
|
103
|
+
"inset 0 1px 0 hsl(0 0% 100% / 0.6)",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
motion: {
|
|
108
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
109
|
+
durations: {
|
|
110
|
+
reveal: 600, // faster than editorial — UI feels responsive
|
|
111
|
+
loop: 2400,
|
|
112
|
+
ambient: 24000,
|
|
113
|
+
},
|
|
114
|
+
keyframes: {
|
|
115
|
+
"fade-rise": {
|
|
116
|
+
css:
|
|
117
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
118
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
119
|
+
defaultDuration: 600,
|
|
120
|
+
iteration: "once",
|
|
121
|
+
purpose: "standard content entrance — short rise, faster than editorial",
|
|
122
|
+
},
|
|
123
|
+
"scale-in": {
|
|
124
|
+
css:
|
|
125
|
+
"from { opacity: 0; transform: scale(0.96); }\n" +
|
|
126
|
+
"to { opacity: 1; transform: scale(1); }",
|
|
127
|
+
defaultDuration: 200,
|
|
128
|
+
iteration: "once",
|
|
129
|
+
purpose: "modals, popovers, tooltips — confirms interaction",
|
|
130
|
+
},
|
|
131
|
+
"shimmer": {
|
|
132
|
+
css:
|
|
133
|
+
"0% { background-position: -200% 0; }\n" +
|
|
134
|
+
"100% { background-position: 200% 0; }",
|
|
135
|
+
defaultDuration: 1600,
|
|
136
|
+
iteration: "infinite",
|
|
137
|
+
purpose: "loading skeletons — gradient sweep",
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
respectsReducedMotion: true,
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
density: "medium",
|
|
144
|
+
|
|
145
|
+
patterns: {
|
|
146
|
+
button:
|
|
147
|
+
"Solid-fill primary (primary bg, primary-foreground text, rounded-xl, shadow-soft). " +
|
|
148
|
+
"Secondary is ghost (border, foreground text). Tertiary is link. " +
|
|
149
|
+
"Hover: subtle scale (1.01) + shadow-soft-lg.",
|
|
150
|
+
card:
|
|
151
|
+
"Rounded-xl, border, bg-card, shadow-soft. Internal padding p-6 lg:p-8. " +
|
|
152
|
+
"Title in display font; body in sans. Hover lifts to shadow-soft-lg.",
|
|
153
|
+
input:
|
|
154
|
+
"Full rounded-lg box, border, bg-background. Focus = ring (2px primary at 40% opacity). " +
|
|
155
|
+
"Label above, helper text below in muted-foreground.",
|
|
156
|
+
cta:
|
|
157
|
+
"Primary button is the default. Secondary CTAs use ghost button or text-link with primary color.",
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
details: {
|
|
161
|
+
selectionBg: "hsl(var(--primary) / 0.18)",
|
|
162
|
+
selectionFg: "hsl(var(--foreground))",
|
|
163
|
+
focusRing: "2px solid hsl(var(--ring) / 0.5)",
|
|
164
|
+
scrollbarStyle: "thin",
|
|
165
|
+
},
|
|
166
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Design Direction — Solar-Residential
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Sunrun homeowner-friendly chrome · Tesla Solar minimal white · SunPower trust-blue restraint · Sunnova warm signal-green · ADT Solar suburban-safe rounding
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Clean white residential-installer page. One signal-green accent does all the savings and CTA work. Numbers are big and tabular — kWh, dollar-per-month, panel count. Rounded corners read suburban-safe, not enterprise-sharp. The page reads as a confident neighborhood quote, never a sales pitch.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Sunrun** → homeowner-friendly CTA stack. The page is a quote, the quote is a button.
|
|
11
|
+
- **Tesla Solar** → near-zero-chrome white canvas. One accent moment per screen.
|
|
12
|
+
- **SunPower** → trust-blue restraint and savings-calculator gravity. Numbers are the hero.
|
|
13
|
+
- **Sunnova** → warm signal-green for go/install/active states. Green means yes.
|
|
14
|
+
- **ADT Solar** → rounded suburban-safe card chrome. The corners reassure the homeowner.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **pure white background** → `--card` (a single degree above) → `--secondary` (cool-gray inset panels). Depth comes from soft shadows on the savings card, hairline borders elsewhere. Pure black is forbidden; `--foreground` is a deep cool slate.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--signal-green`, `--signal-green-deep`, `--signal-green-soft`, `--trust-blue`, `--sun-amber`, `--panel-slate`. The `--sun-amber` is decorative-only — it appears on the sunshine glyph and never on a CTA. `--trust-blue` is reserved for warranty and certification badges.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Inter heavy (Tesla Solar / Sunrun marketing display). h1–h4. Tracking `-0.02em`.
|
|
25
|
+
- **Body:** Inter regular/medium (SunPower body). Body base **15px** with **line-height 1.55** — readable for older homeowners by design.
|
|
26
|
+
- **Mono:** JetBrains Mono. Dollar amounts, kWh, panel count, zip-code input — tabular-nums on by default.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 5vw, 3.75rem)`. Restrained — the dollar numbers carry the page, not the heading. Font features: `"tnum", "ss01"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-4 lg:px-8` — wide enough for a three-panel installer-process timeline.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-20 pb-12 lg:pt-28 lg:pb-20`
|
|
34
|
+
- Default: `py-14 lg:py-20`
|
|
35
|
+
- Tight: `py-10 lg:py-14`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens.
|
|
40
|
+
|
|
41
|
+
Signal green is the only saturated CTA accent. Trust blue and sun amber are decorative-semantic. The savings-row highlight (`bg-signal-green-soft`) is the only acceptable green-on-white surface tint. Status pills (`Quote`, `Permit`, `Install`, `Inspect`, `Activate`) use the signal-green-soft + signal-green-deep pair — never solid fills.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 0.625rem` (10px). Suburban-safe rounding — softer than enterprise dashboards, sharper than soft-modern. Pills allowed (`pillsAllowed: true`) for process-step badges and zip-code chips.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**Soft, three utilities:** `.shadow-quote` (savings-calculator card lift), `.shadow-card` (general panel lift), `.shadow-panel-glow` (the single green-ringed glow on the panel-render hero or the active quote card). No glows on body cards. No colored shadows except panel-glow on hero.
|
|
48
|
+
|
|
49
|
+
## Motion
|
|
50
|
+
Three keyframes: `fade-rise` (400ms — savings card and quote-block entrance), `counter-up` (600ms — estimated-savings dollar number rolls in once the zip is entered), `sun-rays` (18s slow ambient rotation behind the panel-render hero only). The counter-up is the one performative moment — it confirms the homeowner that their input did something.
|
|
51
|
+
|
|
52
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `sun-rays` halts, `counter-up` resolves immediately to its final state.
|
|
53
|
+
|
|
54
|
+
## Density
|
|
55
|
+
Medium. The page makes room for the dollar number to be 48px and tabular. Process-timeline steps get generous side-padding. Customer-story rows are airy — three homeowners across, photo-name-quote, not a packed grid.
|
|
56
|
+
|
|
57
|
+
## Component patterns
|
|
58
|
+
- **Buttons:** solid signal-green primary (rounded-lg, shadow-card) for the single commit — `Get my quote`, `Schedule install`. Secondary is ghost. Tertiary is text-link green. Hover deepens fill to `--signal-green-deep`; no scale, no shadow growth.
|
|
59
|
+
- **Cards:** rounded-lg, 1px `--border`, `bg-card`, `shadow-card`. Padding `p-5 lg:p-6`. The savings-calculator card is the one exception — it wears `shadow-panel-glow` for emphasis.
|
|
60
|
+
- **Inputs:** full rounded-lg box, 1px `--input` border, `bg-card`. Zip-code input is mono 18px center-aligned. Focus = 2px signal-green ring at 45% opacity.
|
|
61
|
+
- **CTA:** primary signal-green for the quote commit. Process timeline pills are soft-green badges. Customer-story name carries a thin trust-blue underline only.
|
|
62
|
+
|
|
63
|
+
## Recommended rich media
|
|
64
|
+
Solar-Residential leans on **photorealistic 3D roof-panel renders** and **real homeowner photography** — suburban houses in golden-hour light, panels visible, family-on-driveway energy. Avoid stock photography of suit-and-tie engineers or generic green-energy abstractions.
|
|
65
|
+
|
|
66
|
+
**Iconography:** 24px grid, 1.5px stroke, rounded line caps. Sun, house, panel, plug, leaf, dollar — drawn in a single hand. The literal sun glyph may use `--sun-amber` as a fill.
|
|
67
|
+
|
|
68
|
+
**AI tool recommendations:** **Midjourney / Flux** for *"photorealistic suburban single-family home with rooftop solar panels, golden hour, family standing in driveway, wide-angle, soft natural light, no logos"* and *"photorealistic 3D render of monocrystalline solar panel, isolated on white, three-quarter angle, soft studio lighting"*. Avoid the default Midjourney "green energy" abstract gradients — they look stock.
|
|
69
|
+
|
|
70
|
+
**Aspect ratios:** 16:10 for the hero roof shot. 4:3 for the savings-calculator screenshot. 1:1 for homeowner-story portraits. Never 16:9 — that's video and reads consumer-broadcast.
|
|
71
|
+
|
|
72
|
+
**Video:** rare, optional. If used, a 15-second silent install timelapse (truck, panels rising, family thumbs-up). Poster frame mandatory. ≤6MB H.265. Never autoplay with sound.
|
|
73
|
+
|
|
74
|
+
**Performance:** roof-render hero ships as AVIF at 1800w ≤140KB. Customer portraits at 600w ≤40KB each. LCP target 2s.
|
|
75
|
+
|
|
76
|
+
**Avoid:** generic green-leaf gradient backgrounds, world-globe imagery, suit-and-tie sales reps, polar-bear-on-ice climate visuals, neon-glow solar-cell renders, before/after slider gimmicks. The page sells a roof job, not a global mission.
|
|
77
|
+
|
|
78
|
+
**Accessibility:** every dollar figure has an accompanying spelled-out aria-label (`$184 saved per month`). Process-step pills include the step number and label, never icon-only. Signal-green meets 4.5:1 against white at button text size.
|
|
79
|
+
|
|
80
|
+
## Component families
|
|
81
|
+
None at install time. Family conventions emerge as the project grows.
|
|
82
|
+
|
|
83
|
+
## Details
|
|
84
|
+
- **Selection:** `hsl(var(--primary) / 0.20)` background, foreground text.
|
|
85
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.45)`. Signal-green, soft.
|
|
86
|
+
- **Scrollbar:** thin.
|
|
87
|
+
|
|
88
|
+
## Exceptions
|
|
89
|
+
None yet.
|
|
90
|
+
|
|
91
|
+
## Revisions
|
|
92
|
+
- Initial direction, generated at install time.
|