@stylecrib/cli 0.0.0-stage → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -2
- package/agents/MANIFEST.yml +136 -0
- package/agents/README.md +75 -0
- package/agents/art-director.md +168 -0
- package/agents/audacity-director.md +109 -0
- package/agents/brand-identity.md +179 -0
- package/agents/brand-precedent.md +119 -0
- package/agents/brief-enforcer.md +136 -0
- package/agents/component-qa.md +167 -0
- package/agents/cto.md +49 -0
- package/agents/design-director.md +184 -0
- package/agents/design-systems-engineer.md +162 -0
- package/agents/direction-curator.md +133 -0
- package/agents/homogeneity-detector.md +104 -0
- package/agents/logo-designer.md +240 -0
- package/agents/marketing-designer.md +156 -0
- package/agents/media-curator.md +165 -0
- package/agents/motion-engineer.md +270 -0
- package/agents/qa-conductor.md +143 -0
- package/agents/render-qa.md +133 -0
- package/agents/upgrade-simulator.md +123 -0
- package/agents/vp-architecture.md +49 -0
- package/agents/vp-engineering.md +49 -0
- package/dist/index.js +7182 -0
- package/package.json +69 -4
- package/themes/README.md +70 -0
- package/themes/acrylic-soft/THEME.md +142 -0
- package/themes/acrylic-soft/tokens.ts +180 -0
- package/themes/agency-creative/THEME.md +91 -0
- package/themes/agency-creative/tokens.ts +202 -0
- package/themes/agency-portfolio/THEME.md +109 -0
- package/themes/agency-portfolio/tokens.ts +159 -0
- package/themes/ai-startup/THEME.md +95 -0
- package/themes/ai-startup/tokens.ts +162 -0
- package/themes/airline-modern/THEME.md +104 -0
- package/themes/airline-modern/tokens.ts +179 -0
- package/themes/arc-stack/.anchor-render.png +0 -0
- package/themes/arc-stack/THEME.md +125 -0
- package/themes/arc-stack/audit.log.jsonl +6 -0
- package/themes/arc-stack/dismissals.jsonl +3 -0
- package/themes/arc-stack/tailwind.snippet.ts +17 -0
- package/themes/arc-stack/theme.yml +153 -0
- package/themes/arc-stack/tokens.ts +29 -0
- package/themes/architectural/THEME.md +102 -0
- package/themes/architectural/tokens.ts +159 -0
- package/themes/atelier-radiance/THEME.md +93 -0
- package/themes/atelier-radiance/audit.log.jsonl +1 -0
- package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
- package/themes/atelier-radiance/theme.yml +130 -0
- package/themes/atelier-radiance/tokens.ts +29 -0
- package/themes/automotive-ev/THEME.md +87 -0
- package/themes/automotive-ev/tokens.ts +183 -0
- package/themes/automotive-luxury/THEME.md +88 -0
- package/themes/automotive-luxury/tokens.ts +175 -0
- package/themes/baby-modern/THEME.md +79 -0
- package/themes/baby-modern/tokens.ts +184 -0
- package/themes/banking-gravity/THEME.md +171 -0
- package/themes/banking-gravity/tokens.ts +169 -0
- package/themes/beauty-clean/THEME.md +92 -0
- package/themes/beauty-clean/tokens.ts +176 -0
- package/themes/beauty-luxury/THEME.md +96 -0
- package/themes/beauty-luxury/tokens.ts +178 -0
- package/themes/bento-modular/.anchor-render.png +0 -0
- package/themes/bento-modular/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -0
- package/themes/bento-modular/audit.log.jsonl +3 -0
- package/themes/bento-modular/dismissals.jsonl +1 -0
- package/themes/bento-modular/tailwind.snippet.ts +17 -0
- package/themes/bento-modular/theme.yml +83 -0
- package/themes/bento-modular/tokens.ts +27 -0
- package/themes/bookstore-indie/THEME.md +78 -0
- package/themes/bookstore-indie/tokens.ts +147 -0
- package/themes/brutalist/THEME.md +96 -0
- package/themes/brutalist/tokens.ts +151 -0
- package/themes/business-tiles/THEME.md +141 -0
- package/themes/business-tiles/tokens.ts +178 -0
- package/themes/cabana-poster/THEME.md +158 -0
- package/themes/cabana-poster/audit.log.jsonl +1 -0
- package/themes/cabana-poster/tailwind.snippet.ts +16 -0
- package/themes/cabana-poster/theme.yml +221 -0
- package/themes/cabana-poster/tokens.ts +34 -0
- package/themes/case-panel/THEME.md +126 -0
- package/themes/case-panel/audit.log.jsonl +2 -0
- package/themes/case-panel/tailwind.snippet.ts +15 -0
- package/themes/case-panel/theme.yml +153 -0
- package/themes/case-panel/tokens.ts +28 -0
- package/themes/cinematic-dark/THEME.md +97 -0
- package/themes/cinematic-dark/tokens.ts +195 -0
- package/themes/classic-car/THEME.md +86 -0
- package/themes/classic-car/tokens.ts +173 -0
- package/themes/cloud-friendly/THEME.md +152 -0
- package/themes/cloud-friendly/tokens.ts +181 -0
- package/themes/community-niche/THEME.md +102 -0
- package/themes/community-niche/tokens.ts +177 -0
- package/themes/corporate-grid/THEME.md +154 -0
- package/themes/corporate-grid/tokens.ts +182 -0
- package/themes/couture-luxury/THEME.md +85 -0
- package/themes/couture-luxury/tokens.ts +146 -0
- package/themes/creator-social/THEME.md +131 -0
- package/themes/creator-social/tokens.ts +249 -0
- package/themes/crypto-onchain/THEME.md +100 -0
- package/themes/crypto-onchain/tokens.ts +207 -0
- package/themes/cycling-brand/THEME.md +78 -0
- package/themes/cycling-brand/tokens.ts +185 -0
- package/themes/dating-friendly/THEME.md +102 -0
- package/themes/dating-friendly/tokens.ts +178 -0
- package/themes/dense-utility/THEME.md +85 -0
- package/themes/dense-utility/tokens.ts +155 -0
- package/themes/devtool-cli/THEME.md +100 -0
- package/themes/devtool-cli/tokens.ts +195 -0
- package/themes/devtool-docs/THEME.md +105 -0
- package/themes/devtool-docs/tokens.ts +177 -0
- package/themes/editorial/THEME.md +129 -0
- package/themes/editorial/audit.log.jsonl +2 -0
- package/themes/editorial/tailwind.snippet.ts +15 -0
- package/themes/editorial/theme.yml +173 -0
- package/themes/editorial/tokens.ts +29 -0
- package/themes/education-formal/THEME.md +154 -0
- package/themes/education-formal/audit.log.jsonl +1 -0
- package/themes/education-formal/tailwind.snippet.ts +15 -0
- package/themes/education-formal/theme.yml +186 -0
- package/themes/education-formal/tokens.ts +29 -0
- package/themes/education-warm/THEME.md +91 -0
- package/themes/education-warm/tokens.ts +185 -0
- package/themes/ember-poster/README.md +79 -0
- package/themes/ember-poster/THEME.md +101 -0
- package/themes/ember-poster/audit.log.jsonl +17 -0
- package/themes/ember-poster/package.json +34 -0
- package/themes/ember-poster/tailwind.snippet.ts +17 -0
- package/themes/ember-poster/theme.yml +109 -0
- package/themes/ember-poster/tokens.ts +27 -0
- package/themes/enterprise-cloud/THEME.md +139 -0
- package/themes/enterprise-cloud/tokens.ts +179 -0
- package/themes/enterprise-tech/.anchor-render.png +0 -0
- package/themes/enterprise-tech/THEME.md +167 -0
- package/themes/enterprise-tech/audit.log.jsonl +1 -0
- package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
- package/themes/enterprise-tech/theme.yml +202 -0
- package/themes/enterprise-tech/tokens.ts +29 -0
- package/themes/ev-charging/THEME.md +94 -0
- package/themes/ev-charging/tokens.ts +185 -0
- package/themes/farm-direct/THEME.md +92 -0
- package/themes/farm-direct/tokens.ts +180 -0
- package/themes/fintech-card/THEME.md +96 -0
- package/themes/fintech-card/tokens.ts +191 -0
- package/themes/fintech-trust/THEME.md +94 -0
- package/themes/fintech-trust/tokens.ts +192 -0
- package/themes/food-blog/THEME.md +98 -0
- package/themes/food-blog/tokens.ts +183 -0
- package/themes/forum-classic/THEME.md +100 -0
- package/themes/forum-classic/tokens.ts +168 -0
- package/themes/fresh-plate/.anchor-render.png +0 -0
- package/themes/fresh-plate/THEME.md +144 -0
- package/themes/fresh-plate/audit.log.jsonl +2 -0
- package/themes/fresh-plate/dismissals.jsonl +3 -0
- package/themes/fresh-plate/tailwind.snippet.ts +16 -0
- package/themes/fresh-plate/theme.yml +189 -0
- package/themes/fresh-plate/tokens.ts +30 -0
- package/themes/furniture-modern/THEME.md +94 -0
- package/themes/furniture-modern/tokens.ts +176 -0
- package/themes/gaming-esports/THEME.md +146 -0
- package/themes/gaming-esports/tokens.ts +199 -0
- package/themes/gaming-streamer/THEME.md +139 -0
- package/themes/gaming-streamer/tokens.ts +201 -0
- package/themes/glassmorphic-modern/THEME.md +119 -0
- package/themes/glassmorphic-modern/tokens.ts +174 -0
- package/themes/government-civic/THEME.md +138 -0
- package/themes/government-civic/tokens.ts +164 -0
- package/themes/gym-chain/THEME.md +79 -0
- package/themes/gym-chain/tokens.ts +196 -0
- package/themes/healthcare-bright/THEME.md +95 -0
- package/themes/healthcare-bright/tokens.ts +184 -0
- package/themes/home-decor/THEME.md +94 -0
- package/themes/home-decor/tokens.ts +177 -0
- package/themes/hotel-boutique/THEME.md +110 -0
- package/themes/hotel-boutique/tokens.ts +179 -0
- package/themes/hyperminimal-mono/THEME.md +91 -0
- package/themes/hyperminimal-mono/tokens.ts +150 -0
- package/themes/indie-art-game/THEME.md +107 -0
- package/themes/indie-art-game/tokens.ts +216 -0
- package/themes/insurance-legacy/THEME.md +101 -0
- package/themes/insurance-legacy/tokens.ts +182 -0
- package/themes/insurance-modern/THEME.md +103 -0
- package/themes/insurance-modern/tokens.ts +192 -0
- package/themes/kaiju-reveal/THEME.md +97 -0
- package/themes/kaiju-reveal/tokens.ts +185 -0
- package/themes/kinetic-data/THEME.md +172 -0
- package/themes/kinetic-data/audit.log.jsonl +1 -0
- package/themes/kinetic-data/tailwind.snippet.ts +16 -0
- package/themes/kinetic-data/theme.yml +207 -0
- package/themes/kinetic-data/tokens.ts +30 -0
- package/themes/kinetic-headline/.anchor-render.png +0 -0
- package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -0
- package/themes/kinetic-headline/audit.log.jsonl +4 -0
- package/themes/kinetic-headline/dismissals.jsonl +1 -0
- package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
- package/themes/kinetic-headline/theme.yml +81 -0
- package/themes/kinetic-headline/tokens.ts +26 -0
- package/themes/law-firm/THEME.md +108 -0
- package/themes/law-firm/tokens.ts +158 -0
- package/themes/lawtech-modern/THEME.md +107 -0
- package/themes/lawtech-modern/tokens.ts +192 -0
- package/themes/linkedin-pro/THEME.md +102 -0
- package/themes/linkedin-pro/tokens.ts +174 -0
- package/themes/logistics-modern/THEME.md +94 -0
- package/themes/logistics-modern/tokens.ts +187 -0
- package/themes/magazine-glossy/THEME.md +74 -0
- package/themes/magazine-glossy/tokens.ts +158 -0
- package/themes/marker-mag/THEME.md +128 -0
- package/themes/marker-mag/audit.log.jsonl +1 -0
- package/themes/marker-mag/tailwind.snippet.ts +15 -0
- package/themes/marker-mag/theme.yml +159 -0
- package/themes/marker-mag/tokens.ts +27 -0
- package/themes/marketplace-modern/THEME.md +135 -0
- package/themes/marketplace-modern/tokens.ts +186 -0
- package/themes/marketplace-vintage/THEME.md +110 -0
- package/themes/marketplace-vintage/tokens.ts +185 -0
- package/themes/maximalist/THEME.md +96 -0
- package/themes/maximalist/tokens.ts +168 -0
- package/themes/mid-century/THEME.md +109 -0
- package/themes/mid-century/tokens.ts +162 -0
- package/themes/motorcycle-brand/THEME.md +86 -0
- package/themes/motorcycle-brand/tokens.ts +174 -0
- package/themes/museum/THEME.md +83 -0
- package/themes/museum/tokens.ts +147 -0
- package/themes/music-streaming/THEME.md +101 -0
- package/themes/music-streaming/tokens.ts +187 -0
- package/themes/music-vinyl/THEME.md +98 -0
- package/themes/music-vinyl/tokens.ts +167 -0
- package/themes/nature-distilled/.anchor-render.png +0 -0
- package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -0
- package/themes/nature-distilled/audit.log.jsonl +2 -0
- package/themes/nature-distilled/tailwind.snippet.ts +16 -0
- package/themes/nature-distilled/theme.yml +91 -0
- package/themes/nature-distilled/tokens.ts +26 -0
- package/themes/news-tabloid/THEME.md +72 -0
- package/themes/news-tabloid/tokens.ts +158 -0
- package/themes/news-tech/THEME.md +75 -0
- package/themes/news-tech/tokens.ts +149 -0
- package/themes/newsletter/THEME.md +82 -0
- package/themes/newsletter/tokens.ts +138 -0
- package/themes/newspaper-classic/THEME.md +74 -0
- package/themes/newspaper-classic/tokens.ts +159 -0
- package/themes/nonprofit-arts/THEME.md +78 -0
- package/themes/nonprofit-arts/tokens.ts +157 -0
- package/themes/nonprofit-warm/THEME.md +105 -0
- package/themes/nonprofit-warm/tokens.ts +188 -0
- package/themes/outdoor-adventure/THEME.md +113 -0
- package/themes/outdoor-adventure/tokens.ts +181 -0
- package/themes/overland-broadside/THEME.md +119 -0
- package/themes/overland-broadside/audit.log.jsonl +1 -0
- package/themes/overland-broadside/tailwind.snippet.ts +17 -0
- package/themes/overland-broadside/theme.yml +138 -0
- package/themes/overland-broadside/tokens.ts +27 -0
- package/themes/performance-engineered/THEME.md +162 -0
- package/themes/performance-engineered/audit.log.jsonl +1 -0
- package/themes/performance-engineered/tailwind.snippet.ts +15 -0
- package/themes/performance-engineered/theme.yml +193 -0
- package/themes/performance-engineered/tokens.ts +29 -0
- package/themes/pet-food/THEME.md +78 -0
- package/themes/pet-food/tokens.ts +185 -0
- package/themes/pharma-clinical/THEME.md +164 -0
- package/themes/pharma-clinical/audit.log.jsonl +1 -0
- package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
- package/themes/pharma-clinical/theme.yml +201 -0
- package/themes/pharma-clinical/tokens.ts +29 -0
- package/themes/pill-editorial/THEME.md +125 -0
- package/themes/pill-editorial/audit.log.jsonl +1 -0
- package/themes/pill-editorial/tailwind.snippet.ts +15 -0
- package/themes/pill-editorial/theme.yml +168 -0
- package/themes/pill-editorial/tokens.ts +31 -0
- package/themes/podcast-warm/THEME.md +103 -0
- package/themes/podcast-warm/tokens.ts +192 -0
- package/themes/publisher-indie/THEME.md +78 -0
- package/themes/publisher-indie/tokens.ts +148 -0
- package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
- package/themes/raw-concrete/THEME.md +76 -0
- package/themes/raw-concrete/audit.log.jsonl +10 -0
- package/themes/raw-concrete/tailwind.snippet.ts +16 -0
- package/themes/raw-concrete/theme.yml +88 -0
- package/themes/raw-concrete/tokens.ts +27 -0
- package/themes/realestate-luxury/THEME.md +94 -0
- package/themes/realestate-luxury/tokens.ts +169 -0
- package/themes/realestate-marketplace/THEME.md +106 -0
- package/themes/realestate-marketplace/tokens.ts +183 -0
- package/themes/restaurant-modern/THEME.md +109 -0
- package/themes/restaurant-modern/tokens.ts +172 -0
- package/themes/runway-fashion/THEME.md +99 -0
- package/themes/runway-fashion/tokens.ts +167 -0
- package/themes/saturday-morning/THEME.md +117 -0
- package/themes/saturday-morning/tokens.ts +281 -0
- package/themes/schema.ts +235 -0
- package/themes/signal-dark/BUILD_BRIEF.md +168 -0
- package/themes/signal-dark/THEME.md +107 -0
- package/themes/signal-dark/tokens.ts +181 -0
- package/themes/soft-modern/THEME.md +91 -0
- package/themes/soft-modern/tokens.ts +166 -0
- package/themes/solar-residential/THEME.md +92 -0
- package/themes/solar-residential/tokens.ts +176 -0
- package/themes/sports-league/THEME.md +180 -0
- package/themes/sports-league/audit.log.jsonl +1 -0
- package/themes/sports-league/tailwind.snippet.ts +15 -0
- package/themes/sports-league/theme.yml +213 -0
- package/themes/sports-league/tokens.ts +32 -0
- package/themes/stadium-sport/THEME.md +114 -0
- package/themes/stadium-sport/tokens.ts +187 -0
- package/themes/streetwear-hype/THEME.md +100 -0
- package/themes/streetwear-hype/tokens.ts +174 -0
- package/themes/studio-architect/THEME.md +108 -0
- package/themes/studio-architect/tokens.ts +162 -0
- package/themes/studio-photographer/THEME.md +88 -0
- package/themes/studio-photographer/tokens.ts +164 -0
- package/themes/team-kanban/.anchor-render.png +0 -0
- package/themes/team-kanban/THEME.md +167 -0
- package/themes/team-kanban/audit.log.jsonl +2 -0
- package/themes/team-kanban/dismissals.jsonl +1 -0
- package/themes/team-kanban/tailwind.snippet.ts +15 -0
- package/themes/team-kanban/theme.yml +209 -0
- package/themes/team-kanban/tokens.ts +35 -0
- package/themes/telehealth-modern/THEME.md +95 -0
- package/themes/telehealth-modern/tokens.ts +197 -0
- package/themes/tourism-board/THEME.md +111 -0
- package/themes/tourism-board/tokens.ts +173 -0
- package/themes/toys-modern/THEME.md +79 -0
- package/themes/toys-modern/tokens.ts +200 -0
- package/themes/travel-luxury/THEME.md +95 -0
- package/themes/travel-luxury/tokens.ts +162 -0
- package/themes/vacation-rental/THEME.md +105 -0
- package/themes/vacation-rental/tokens.ts +174 -0
- package/themes/vault-reel/THEME.md +134 -0
- package/themes/vault-reel/audit.log.jsonl +3 -0
- package/themes/vault-reel/tailwind.snippet.ts +16 -0
- package/themes/vault-reel/theme.yml +167 -0
- package/themes/vault-reel/tokens.ts +30 -0
- package/themes/vet-modern/THEME.md +79 -0
- package/themes/vet-modern/tokens.ts +194 -0
- package/themes/web3-restraint/THEME.md +87 -0
- package/themes/web3-restraint/tokens.ts +154 -0
- package/themes/wellness-active/THEME.md +102 -0
- package/themes/wellness-active/tokens.ts +203 -0
- package/themes/wellness-spa/THEME.md +93 -0
- package/themes/wellness-spa/tokens.ts +173 -0
- package/themes/y2k-chrome/THEME.md +118 -0
- package/themes/y2k-chrome/tokens.ts +249 -0
- package/themes/yoga-studio/THEME.md +76 -0
- package/themes/yoga-studio/tokens.ts +163 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Kinetic Headline
|
|
2
|
+
|
|
3
|
+
> Type as the whole page — one oversized variable-font headline, everything else calms down around it.
|
|
4
|
+
|
|
5
|
+
**Slug:** `kinetic-headline` — **Surface:** web — **Density:** airy
|
|
6
|
+
|
|
7
|
+
## Influence
|
|
8
|
+
|
|
9
|
+
Studio Feixen wordmark work, Instrument's kinetic case studies, Rauno's variable-font demos, Vercel's typographic launches, Field's identity systems.
|
|
10
|
+
|
|
11
|
+
## Signature move
|
|
12
|
+
|
|
13
|
+
The display headline fills 60-80% of viewport width at rest, weight 400.
|
|
14
|
+
On hover / scroll, weight morphs to 700+ via variable-font axis interpolation.
|
|
15
|
+
Body content sits BELOW the fold — the headline IS the page above the crease.
|
|
16
|
+
Everything else uses a single quiet body face at one weight.
|
|
17
|
+
|
|
18
|
+
## Palette
|
|
19
|
+
|
|
20
|
+
- **bg:** `#FAFAFA`
|
|
21
|
+
- **surface:** `#F2F2F2`
|
|
22
|
+
- **ink:** `#0A0A0A`
|
|
23
|
+
- **accent:** `#3D5AFE`
|
|
24
|
+
- **secondary:** `#7A7A7A`
|
|
25
|
+
|
|
26
|
+
## Typography
|
|
27
|
+
|
|
28
|
+
- **Display:** Bricolage Grotesque Variable — 400 baseline, morphs to 700+ on hover; 120-260px display sizes, letter-spacing -0.04em at scale
|
|
29
|
+
- **Body:** Uncut Sans — 400, 16px, line-height 1.5. Body type stays QUIET so the display carries the moment.
|
|
30
|
+
- **Mono:** JetBrains Mono — 12-13px, only for metadata (case numbers, timestamps, footnotes). Never for body.
|
|
31
|
+
- **Scale:** 1.5 (perfect fifth — deliberately WIDE contrast; body and display should feel like different pages).
|
|
32
|
+
|
|
33
|
+
## Motion
|
|
34
|
+
|
|
35
|
+
ONE kinetic moment: the display headline morphs weight on scroll or hover
|
|
36
|
+
(400→700 axis animation over 400ms). Nothing else moves — no scroll reveals,
|
|
37
|
+
no hover shifts on cards, no button animations beyond native focus rings.
|
|
38
|
+
The absence of secondary motion is what makes the primary moment land.
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## Imagery
|
|
42
|
+
|
|
43
|
+
Zero decorative imagery. If a photograph is used, it's ONE full-bleed shot
|
|
44
|
+
behind the headline, cropped so the type sits on negative space. No 3D
|
|
45
|
+
renders, no illustrations, no icon systems. Optional: one variable-font
|
|
46
|
+
specimen card showing the axis range being used.
|
|
47
|
+
|
|
48
|
+
## Best for
|
|
49
|
+
|
|
50
|
+
- Design agency portfolios
|
|
51
|
+
- Individual designer / studio splash pages
|
|
52
|
+
- Product launch marketing (single-headline campaigns)
|
|
53
|
+
- Manifesto pages
|
|
54
|
+
- Type foundries and font-focused editorial
|
|
55
|
+
|
|
56
|
+
## Reject if
|
|
57
|
+
|
|
58
|
+
_Director grades each of the following as a pass/fail check. Any violation blocks the theme._
|
|
59
|
+
|
|
60
|
+
- Animating body text or any non-headline type (unreadable, defeats the whole register)
|
|
61
|
+
- More than one kinetic moment per page (dilutes the signature — headline moves, that's it)
|
|
62
|
+
- Secondary accent color — accent is one hue, used sparingly, no supporting palette
|
|
63
|
+
- Decorative imagery competing with the headline for attention
|
|
64
|
+
- Card grids, feature tiles, or Bento layouts — they're visual noise beside the headline
|
|
65
|
+
- Hover animations on non-headline elements — the page should feel STILL except for the headline
|
|
66
|
+
- Serif display faces (this is a grotesque-variable register, not editorial)
|
|
67
|
+
- Multi-column body flow (this is the opposite of Broadsheet, it's single-focus)
|
|
68
|
+
- Rounded button chrome greater than 4px (subtle if any, no pill-shapes)
|
|
69
|
+
|
|
70
|
+
## Banned defaults (inherited + theme-specific)
|
|
71
|
+
|
|
72
|
+
- claude-cream (#F4F1EA + serif + #D97757)
|
|
73
|
+
- void+acid (near-black bg + single bright acid-green or vermilion accent)
|
|
74
|
+
- broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
|
|
75
|
+
- tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
|
|
76
|
+
- uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
|
|
77
|
+
- kinetic-body (animating body text along with the headline — collapses the register)
|
|
78
|
+
- kinetic-everything (every element gets a hover animation — the signature moment stops being singular)
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"slug":"kinetic-headline","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:04:59.221Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:04:59.228Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:05:27.140Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":false,"failures":[{"rule":"ANCHOR-02","severity":"block","evidence":"Accent restraint — Two accents visible simultaneously — blue 'system fonts' link and purple 'visited purple' link — both used as interactive signals in the same sentence."}]},"ran_at":"2026-07-03T17:05:39.411Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-03T17:04:59.221Z"}
|
|
2
|
+
{"slug":"kinetic-headline","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:11:49.351Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:11:49.359Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T17:11:49.359Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — anchor-compare skipped. Set the key to enable rubric grading."},"ran_at":"2026-07-03T17:11:53.333Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T17:11:49.351Z"}
|
|
3
|
+
{"slug":"kinetic-headline","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:12:20.390Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:12:20.399Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:12:57.891Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T17:13:11.669Z","dismissed":[{"rule":"ANCHOR-02","severity":"block","evidence":"Accent restraint — Two accents visible simultaneously: the blue 'system fonts' link and the purple 'visited purple' link inside the same sentence — violates one-accent rule.","dismissed":true,"dismissal":{"scope":"this_theme","reason":"Real defect but out of theme scope. The shared archetype mockup wrapper in site/src/components/SiteMockup.tsx (RestraintMockup fallback for kinetic-headline's archetype key) renders default browser link colors (#0000EE, #551A8B) that contradict Family D accent-restraint. Kinetic-Headline's OWN section renderer + card use only #3D5AFE. Site chrome fix is a follow-up — retire this dismissal when the archetype wrapper is refactored to inherit from the theme's palette.","dismissed_at":"2026-07-03T17:11:49.228Z"}}]}],"overall":"PASS","ran_at":"2026-07-03T17:12:20.390Z"}
|
|
4
|
+
{"slug":"kinetic-headline","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:07.767Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-03T22:52:07.776Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — avoid-rubric gate skipped. Set the key to grade against theme.avoid array."},"ran_at":"2026-07-03T22:52:07.777Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"ANTHROPIC_API_KEY not set — anchor-compare skipped. Set the key to enable rubric grading."},"ran_at":"2026-07-03T22:52:11.106Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-03T22:52:07.767Z"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"finding_id":"ANCHOR-02","scope":"this_theme","reason":"Real defect but out of theme scope. The shared archetype mockup wrapper in site/src/components/SiteMockup.tsx (RestraintMockup fallback for kinetic-headline's archetype key) renders default browser link colors (#0000EE, #551A8B) that contradict Family D accent-restraint. Kinetic-Headline's OWN section renderer + card use only #3D5AFE. Site chrome fix is a follow-up — retire this dismissal when the archetype wrapper is refactored to inherit from the theme's palette.","dismissed_at":"2026-07-03T17:11:49.228Z","applied":false}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
|
|
2
|
+
// slug: kinetic-headline
|
|
3
|
+
export const kineticHeadlineTailwindExtend = {
|
|
4
|
+
colors: {
|
|
5
|
+
bg: "#FAFAFA",
|
|
6
|
+
surface: "#F2F2F2",
|
|
7
|
+
ink: "#0A0A0A",
|
|
8
|
+
accent: "#3D5AFE",
|
|
9
|
+
secondary: "#7A7A7A",
|
|
10
|
+
},
|
|
11
|
+
fontFamily: {
|
|
12
|
+
display: ["Bricolage Grotesque Variable — 400 baseline, morphs to 700+ on hover; 120-260px display sizes, letter-spacing -0.04em at scale"],
|
|
13
|
+
body: ["Uncut Sans — 400, 16px, line-height 1.5. Body type stays QUIET so the display carries the moment."],
|
|
14
|
+
mono: ["JetBrains Mono — 12-13px, only for metadata (case numbers, timestamps, footnotes). Never for body."],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Base 32 Kinetic Headline — Family D, Contemporary Web.
|
|
2
|
+
#
|
|
3
|
+
# Per BESPOKE_THEME_SYSTEM.md #32: type as the hero, oversized variable-font
|
|
4
|
+
# headline that fills the viewport, everything else quiet. The one signature
|
|
5
|
+
# is the kinetic type moment; nothing else moves.
|
|
6
|
+
#
|
|
7
|
+
# This is theme #2 authored through the v2 harness. Second theme in Family D
|
|
8
|
+
# (signal-dark was survivor precedent, Base 33 Dark Premium). Uses the
|
|
9
|
+
# existing Family D golden anchor + rubric infrastructure.
|
|
10
|
+
|
|
11
|
+
name: Kinetic Headline
|
|
12
|
+
concept: Type as the whole page — one oversized variable-font headline, everything else calms down around it.
|
|
13
|
+
influence: Studio Feixen wordmark work, Instrument's kinetic case studies, Rauno's variable-font demos, Vercel's typographic launches, Field's identity systems.
|
|
14
|
+
|
|
15
|
+
family: D
|
|
16
|
+
base_number: 32
|
|
17
|
+
render_url: http://localhost:5173/themes/kinetic-headline
|
|
18
|
+
|
|
19
|
+
surface: web
|
|
20
|
+
|
|
21
|
+
typography:
|
|
22
|
+
display: Bricolage Grotesque Variable — 400 baseline, morphs to 700+ on hover; 120-260px display sizes, letter-spacing -0.04em at scale
|
|
23
|
+
body: Uncut Sans — 400, 16px, line-height 1.5. Body type stays QUIET so the display carries the moment.
|
|
24
|
+
mono: JetBrains Mono — 12-13px, only for metadata (case numbers, timestamps, footnotes). Never for body.
|
|
25
|
+
scale: 1.5 (perfect fifth — deliberately WIDE contrast; body and display should feel like different pages).
|
|
26
|
+
|
|
27
|
+
palette:
|
|
28
|
+
bg: "#FAFAFA"
|
|
29
|
+
surface: "#F2F2F2"
|
|
30
|
+
ink: "#0A0A0A"
|
|
31
|
+
accent: "#3D5AFE"
|
|
32
|
+
secondary: "#7A7A7A"
|
|
33
|
+
|
|
34
|
+
density: airy
|
|
35
|
+
|
|
36
|
+
motion: |
|
|
37
|
+
ONE kinetic moment: the display headline morphs weight on scroll or hover
|
|
38
|
+
(400→700 axis animation over 400ms). Nothing else moves — no scroll reveals,
|
|
39
|
+
no hover shifts on cards, no button animations beyond native focus rings.
|
|
40
|
+
The absence of secondary motion is what makes the primary moment land.
|
|
41
|
+
|
|
42
|
+
signature: |
|
|
43
|
+
The display headline fills 60-80% of viewport width at rest, weight 400.
|
|
44
|
+
On hover / scroll, weight morphs to 700+ via variable-font axis interpolation.
|
|
45
|
+
Body content sits BELOW the fold — the headline IS the page above the crease.
|
|
46
|
+
Everything else uses a single quiet body face at one weight.
|
|
47
|
+
|
|
48
|
+
imagery: |
|
|
49
|
+
Zero decorative imagery. If a photograph is used, it's ONE full-bleed shot
|
|
50
|
+
behind the headline, cropped so the type sits on negative space. No 3D
|
|
51
|
+
renders, no illustrations, no icon systems. Optional: one variable-font
|
|
52
|
+
specimen card showing the axis range being used.
|
|
53
|
+
|
|
54
|
+
best_for:
|
|
55
|
+
- Design agency portfolios
|
|
56
|
+
- Individual designer / studio splash pages
|
|
57
|
+
- Product launch marketing (single-headline campaigns)
|
|
58
|
+
- Manifesto pages
|
|
59
|
+
- Type foundries and font-focused editorial
|
|
60
|
+
|
|
61
|
+
avoid:
|
|
62
|
+
- "Animating body text or any non-headline type (unreadable, defeats the whole register)"
|
|
63
|
+
- "More than one kinetic moment per page (dilutes the signature — headline moves, that's it)"
|
|
64
|
+
- "Secondary accent color — accent is one hue, used sparingly, no supporting palette"
|
|
65
|
+
- "Decorative imagery competing with the headline for attention"
|
|
66
|
+
- "Card grids, feature tiles, or Bento layouts — they're visual noise beside the headline"
|
|
67
|
+
- "Hover animations on non-headline elements — the page should feel STILL except for the headline"
|
|
68
|
+
- "Serif display faces (this is a grotesque-variable register, not editorial)"
|
|
69
|
+
- "Multi-column body flow (this is the opposite of Broadsheet, it's single-focus)"
|
|
70
|
+
- "Rounded button chrome greater than 4px (subtle if any, no pill-shapes)"
|
|
71
|
+
|
|
72
|
+
banned_defaults:
|
|
73
|
+
# Global blocklist from BESPOKE_THEME_SYSTEM.md
|
|
74
|
+
- "claude-cream (#F4F1EA + serif + #D97757)"
|
|
75
|
+
- "void+acid (near-black bg + single bright acid-green or vermilion accent)"
|
|
76
|
+
- "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
|
|
77
|
+
- "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
|
|
78
|
+
- "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
|
|
79
|
+
# Base-specific
|
|
80
|
+
- "kinetic-body (animating body text along with the headline — collapses the register)"
|
|
81
|
+
- "kinetic-everything (every element gets a hover animation — the signature moment stops being singular)"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
|
|
2
|
+
|
|
3
|
+
export const tokens = {
|
|
4
|
+
slug: "kinetic-headline",
|
|
5
|
+
family: "D",
|
|
6
|
+
base: "32",
|
|
7
|
+
palette: {
|
|
8
|
+
"bg": "#FAFAFA",
|
|
9
|
+
"surface": "#F2F2F2",
|
|
10
|
+
"ink": "#0A0A0A",
|
|
11
|
+
"accent": "#3D5AFE",
|
|
12
|
+
"secondary": "#7A7A7A"
|
|
13
|
+
},
|
|
14
|
+
typography: {
|
|
15
|
+
"display": "Bricolage Grotesque Variable — 400 baseline, morphs to 700+ on hover; 120-260px display sizes, letter-spacing -0.04em at scale",
|
|
16
|
+
"body": "Uncut Sans — 400, 16px, line-height 1.5. Body type stays QUIET so the display carries the moment.",
|
|
17
|
+
"mono": "JetBrains Mono — 12-13px, only for metadata (case numbers, timestamps, footnotes). Never for body.",
|
|
18
|
+
"scale": "1.5 (perfect fifth — deliberately WIDE contrast; body and display should feel like different pages)."
|
|
19
|
+
},
|
|
20
|
+
surface: "web",
|
|
21
|
+
density: "airy",
|
|
22
|
+
motion: "ONE kinetic moment: the display headline morphs weight on scroll or hover\n(400→700 axis animation over 400ms). Nothing else moves — no scroll reveals,\nno hover shifts on cards, no button animations beyond native focus rings.\nThe absence of secondary motion is what makes the primary moment land.\n",
|
|
23
|
+
signature: "The display headline fills 60-80% of viewport width at rest, weight 400.\nOn hover / scroll, weight morphs to 700+ via variable-font axis interpolation.\nBody content sits BELOW the fold — the headline IS the page above the crease.\nEverything else uses a single quiet body face at one weight.\n",
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
export type Tokens = typeof tokens;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Design Direction — Law-Firm
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Skadden white-shoe formality · Latham partner-track gravity · Cravath one-tier promotion restraint · Wachtell deal-list density · Davis Polk Wall Street typesetting
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Annual-report formality at screen scale. Cream paper, deep ink, formal serif display (Cheltenham-feel) over clean sans body. A conservative navy is the single accent — used for the bar admission, the practice tag, the rule. The page reads "we have argued before the Court since 1898." Never trendy, never marketing-loud, never lifestyle. Print-document discipline is the design.
|
|
8
|
+
|
|
9
|
+
A law-firm surface that feels playful, soft, or startup-loud is off-direction. The voice is partner-level, restrained, informed.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Skadden Arps** (skadden.com) → cream paper, navy serif, attorney-roster gravity. The benchmark for white-shoe digital presence.
|
|
13
|
+
- **Latham & Watkins** (lw.com) → global-practice grid, formal Cheltenham-feel headings. Office-network density without losing typographic discipline.
|
|
14
|
+
- **Cravath Swaine & Moore** (cravath.com) → 150-year typographic restraint, deal-record density. The firm that invented the partner track in 1875 and still designs like it.
|
|
15
|
+
- **Wachtell Lipton** (wlrk.com) → partner-only headcount, single-page annual-report formality. Restraint as a brand position.
|
|
16
|
+
- **Davis Polk** (davispolk.com) → Wall Street typesetting, slate-on-cream column rule. The closest thing law has to The Economist's reading rhythm.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. The cream background (`38 28% 95%`) is structural — pure white reads tech-startup; cream paper carries the annual-report feel. Deep ink (`220 30% 14%`) replaces pure black.
|
|
20
|
+
|
|
21
|
+
Brand tokens, all semantic:
|
|
22
|
+
- `ink` — alias of `--foreground`. The deep ink for body and headings.
|
|
23
|
+
- `paper` — alias of `--background`. The cream paper.
|
|
24
|
+
- `navy-deep` — alias of `--primary`. Conservative bar-association navy; the single emphasis tone.
|
|
25
|
+
- `navy-soft` — subheadings and deck text — one tier above body ink.
|
|
26
|
+
- `bar-gold` — rare bar-admission/honors accent. Reserved for credential moments (Order of the Coif, Chambers ranking) — never routine.
|
|
27
|
+
- `cream-deep` — alias of `--secondary`. Deeper cream for aside panels and roster stripes.
|
|
28
|
+
|
|
29
|
+
Color rules:
|
|
30
|
+
- **Pure white is forbidden.** `--foreground` is deep ink on cream paper; `--card` is the one place pure white appears, as a lift.
|
|
31
|
+
- **Navy is the emphasis tone, not the volume tone.** A surface may have one navy CTA. Two is loud. Three is a marketing site.
|
|
32
|
+
- **Bar-gold is credentialing only.** Use it for "Best Lawyers", "Chambers Band 1", "Order of the Coif" — never for buttons.
|
|
33
|
+
|
|
34
|
+
## Typography
|
|
35
|
+
- **Display:** EB Garamond (Cheltenham/Garamond stand-in). Weights 400/500/600/700. Used for firm name, practice headings, attorney names. Tracking `-0.012em` — serifs at display want tight, not crushed.
|
|
36
|
+
- **Body:** Inter, **17px**, line-height 1.7. Weights 400/500/600. Bar-journal leading for long-form practice descriptions.
|
|
37
|
+
- **Mono:** JetBrains Mono. Matter numbers, bar admissions (NY · 2008, DC · 2011), citation refs, dateline. Tabular figures non-negotiable for the roster.
|
|
38
|
+
|
|
39
|
+
Font features: `"liga", "onum", "tnum", "ss01"`. Old-style figures inline (bar-admission years), tabular figures in rosters and deal records.
|
|
40
|
+
|
|
41
|
+
H1 uses `clamp(2.25rem, 5vw, 3.75rem)` — restrained. White-shoe firms do not shout. The practice name labels the surface; the deal record and the bios do the work.
|
|
42
|
+
|
|
43
|
+
## Spacing
|
|
44
|
+
- **Container:** `max-w-5xl px-6 lg:px-10` — wider than editorial. Holds a 6-column practice grid + a 4-column attorney roster in one composition without breaking rhythm.
|
|
45
|
+
- **Section padding tiers:**
|
|
46
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24` — formal but not oversized.
|
|
47
|
+
- Default: `py-20 lg:py-28`
|
|
48
|
+
- Tight: `py-14 lg:py-20`
|
|
49
|
+
- **Allowed scale:** 4 6 8 12 16 20 24 32 40 48 64 80 96. Medium density — firm sites pack practices and rosters but breathe between sections.
|
|
50
|
+
|
|
51
|
+
## Color
|
|
52
|
+
No hex anywhere. Pure white is forbidden. Pure black is forbidden. Navy is the single emphasis tone. Bar-gold is credentialing only.
|
|
53
|
+
|
|
54
|
+
## Radius
|
|
55
|
+
`--radius: 0.125rem` (2px). **Formal print-document feel.** Pills are **disallowed** — they read marketing-startup. Status indicators (Partner, Counsel, Of Counsel) use sharp rect badges with mono small-caps text.
|
|
56
|
+
|
|
57
|
+
## Shadows
|
|
58
|
+
**Minimal.** Two utilities:
|
|
59
|
+
- `.hairline-bottom` — single-pixel column-divider rule. The default depth language.
|
|
60
|
+
- `.card-formal` — very subtle card lift (two soft drops at 4% opacity). For the biographical tile and the news+insights item only.
|
|
61
|
+
|
|
62
|
+
No glows, no decorative drops. Depth is borders and cream tiers — not blur.
|
|
63
|
+
|
|
64
|
+
## Motion
|
|
65
|
+
Very limited. White-shoe firms do not perform.
|
|
66
|
+
|
|
67
|
+
- **Easing:** `cubic-bezier(0.22, 1, 0.36, 1)`
|
|
68
|
+
- **Duration:** reveal 600ms. No loop, no ambient.
|
|
69
|
+
- **Keyframes:** single `fade-rise` (opacity + 12px translate). The only entrance — measured, formal, never bouncy.
|
|
70
|
+
|
|
71
|
+
`prefers-reduced-motion` is honored.
|
|
72
|
+
|
|
73
|
+
## Component patterns
|
|
74
|
+
- **Buttons:** sparing. **Primary** = solid navy fill, cream text, 2px radius — single emphatic CTA per page (*Contact*, *Request Counsel*). **Secondary** = ghost (1px navy border, navy text). **Tertiary** = navy text-link, underline on hover. Sentence-case or formal title-case only.
|
|
75
|
+
- **Cards:** white fill on cream bg, 2px radius, 1px hairline border, optional `.card-formal` shadow. Internal padding `p-6 lg:p-8`. Title in EB Garamond 600. Eyebrow in mono small-caps. Attorney roster cards omit shadow — flush on cream with hairline rule only.
|
|
76
|
+
- **Inputs:** border-bottom only (1px `navy-soft`). No full box. Label above in Inter 500. Focus thickens border to 2px `navy-deep`.
|
|
77
|
+
- **CTAs:** navy solid button for the single primary action per page. Voice is formal: *"Contact our M&A practice"*, *"Request the 2025 deal record"*. **Never** *"Get started"*, *"Try it free"*, or *"Sign up today"*.
|
|
78
|
+
|
|
79
|
+
## Recommended rich media
|
|
80
|
+
Law-firm sites use **editorial business portraiture** the way a bar journal does — sparingly, formally, always in service of the partner-track voice. Attorney biographies carry a formal headshot; practice pages carry one architectural environmental shot of the office tower or the courthouse.
|
|
81
|
+
|
|
82
|
+
**Permitted:** formal attorney portraits (3:4 portrait crop, studio lighting, charcoal/navy suiting against soft cream backdrop, neutral expression — Annie Leibovitz at one stop down). Architectural shots of the firm's offices (16:9 landscape — One Manhattan West, Two World Financial Center, the Cravath building). Courthouse/Supreme Court establishing shots for litigation practices. Restrained line diagrams for transaction structures.
|
|
83
|
+
|
|
84
|
+
**Forbidden:** lifestyle photography, conference-room handshakes (cliché stock), team-jumping shots, AI-rendered abstracts, isometric illustrations, 3D renders, animated GIFs, autoplay video.
|
|
85
|
+
|
|
86
|
+
**AI tools:** Midjourney/Flux with prompts like *"formal attorney portrait, studio lighting, cream backdrop, charcoal suit, restrained expression, 85mm, Annie Leibovitz business-portrait at one stop down"*. Explicitly prompt away from the consultant-headshot grin.
|
|
87
|
+
|
|
88
|
+
**Aspect ratios:** 3:4 for portraits, 16:9 for architecture. Never 1:1 (consumer-social), never 9:16 (social-video).
|
|
89
|
+
|
|
90
|
+
**Performance:** hero ≤180 KB AVIF at 1600w; portraits ≤90 KB at 800w. LCP under 2s.
|
|
91
|
+
|
|
92
|
+
## Component families
|
|
93
|
+
None at install time. Anticipated families:
|
|
94
|
+
- **PartnerRosterCard** — formal portrait + name in EB Garamond + practice + mono bar-admission line.
|
|
95
|
+
- **PracticeTile** — EB Garamond practice name, mono small-caps eyebrow, body description, navy chevron link.
|
|
96
|
+
- **InsightItem** — dated row with mono dateline, EB Garamond title, mono attorney byline.
|
|
97
|
+
- **DealRecordRow** — matter, role, value, date — mono tabular, hairline-divided.
|
|
98
|
+
|
|
99
|
+
## Details
|
|
100
|
+
- **Selection:** `hsl(var(--primary) / 0.20)` background, foreground text — pale navy highlight.
|
|
101
|
+
- **Focus ring:** `2px solid hsl(var(--ring))` — formal and unmissable.
|
|
102
|
+
- **Scrollbar:** thin.
|
|
103
|
+
|
|
104
|
+
## Exceptions
|
|
105
|
+
None yet. The "Best Lawyers" honors badge is the one place `bar-gold` lands as a fill — record here when introduced.
|
|
106
|
+
|
|
107
|
+
## Revisions
|
|
108
|
+
- Initial direction, authored at install time. Pairs with `editorial` (shared serif gravitas vocabulary) and `banking-gravity` (shared partner-track formality, alternate accent). The distinct slot: white-shoe partner-track law where editorial is magazine-prose-first and banking-gravity is capital-markets-dark.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
// law-firm — Skadden / Latham / Cravath / Wachtell / Davis Polk.
|
|
4
|
+
// White-shoe partner-track gravity. Cream paper, formal serif headings,
|
|
5
|
+
// conservative navy accent. Annual-report-of-a-150-year-firm energy.
|
|
6
|
+
|
|
7
|
+
export const lawFirm: Direction = {
|
|
8
|
+
name: "law-firm" as Direction["name"],
|
|
9
|
+
ethos:
|
|
10
|
+
"Skadden white-shoe formality · Latham partner-track gravity · Cravath one-tier promotion restraint · Wachtell deal-list density · Davis Polk Wall Street typesetting",
|
|
11
|
+
references: [
|
|
12
|
+
{ brand: "Skadden Arps", trait: "cream paper, navy serif, attorney-roster gravity" },
|
|
13
|
+
{ brand: "Latham & Watkins", trait: "global-practice grid, formal Cheltenham-feel headings" },
|
|
14
|
+
{ brand: "Cravath Swaine & Moore", trait: "150-year typographic restraint, deal-record density" },
|
|
15
|
+
{ brand: "Wachtell Lipton", trait: "partner-only headcount, single-page annual-report formality" },
|
|
16
|
+
{ brand: "Davis Polk", trait: "Wall Street typesetting, slate-on-cream column rule" },
|
|
17
|
+
],
|
|
18
|
+
feel:
|
|
19
|
+
"Annual-report formality at screen scale. Cream paper, deep ink, formal serif " +
|
|
20
|
+
"display (Cheltenham-feel) over clean sans body. A conservative navy is the " +
|
|
21
|
+
"single accent — used for the bar admission, the practice tag, the rule. The " +
|
|
22
|
+
"page reads 'we have argued before the Court since 1898.' Never trendy, never " +
|
|
23
|
+
"marketing-loud, never lifestyle. Print-document discipline is the design.",
|
|
24
|
+
|
|
25
|
+
fonts: {
|
|
26
|
+
display: {
|
|
27
|
+
family: "EB Garamond",
|
|
28
|
+
fallback: ["Cheltenham", "Garamond", "Iowan Old Style", "Georgia", "serif"],
|
|
29
|
+
from: "Cheltenham/Garamond stand-in — white-shoe serif tradition, attorney-roster gravity",
|
|
30
|
+
googleFont: "EB+Garamond",
|
|
31
|
+
weights: [400, 500, 600, 700],
|
|
32
|
+
},
|
|
33
|
+
body: {
|
|
34
|
+
family: "Inter",
|
|
35
|
+
fallback: ["Söhne", "system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
|
|
36
|
+
from: "clean sans body for biography paragraphs, practice descriptions, news rows",
|
|
37
|
+
googleFont: "Inter",
|
|
38
|
+
weights: [400, 500, 600],
|
|
39
|
+
},
|
|
40
|
+
mono: {
|
|
41
|
+
family: "JetBrains Mono",
|
|
42
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
43
|
+
from: "matter numbers, bar admissions, citation refs, dateline — instrument-feel for small text",
|
|
44
|
+
googleFont: "JetBrains+Mono",
|
|
45
|
+
weights: [400, 500, 700],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
typography: {
|
|
50
|
+
headingTracking: "-0.012em", // serifs at display want tight, not crushed
|
|
51
|
+
bodyTracking: "0",
|
|
52
|
+
fontFeatureSettings: '"liga", "onum", "tnum", "ss01"', // old-style figures inline, tabular in rosters
|
|
53
|
+
h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)", // restrained — white-shoe firms don't shout
|
|
54
|
+
bodyBaseSize: "1.0625rem", // 17px — long-form practice descriptions are the load
|
|
55
|
+
bodyLineHeight: "1.7", // generous column — bar-journal leading
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
colors: {
|
|
59
|
+
background: { hsl: "38 28% 95%", from: "Skadden cream paper — annual-report stock, never pure white" },
|
|
60
|
+
foreground: { hsl: "220 30% 14%", from: "deep ink — Davis Polk text on cream, never pure black" },
|
|
61
|
+
card: { hsl: "0 0% 100%", from: "pure white card — biographical tile, lifts off cream" },
|
|
62
|
+
popover: { hsl: "0 0% 100%", from: "same as card" },
|
|
63
|
+
primary: { hsl: "218 60% 22%", from: "Cravath conservative navy — bar-association accent, the single emphasis tone" },
|
|
64
|
+
primaryForeground: { hsl: "38 28% 95%", from: "cream paper on navy" },
|
|
65
|
+
secondary: { hsl: "38 20% 90%", from: "deeper cream — sidebar panels, attorney-row stripe" },
|
|
66
|
+
secondaryForeground: { hsl: "220 30% 14%", from: "ink on cream panel" },
|
|
67
|
+
muted: { hsl: "38 20% 90%", from: "same as secondary — differentiation by usage, not color" },
|
|
68
|
+
mutedForeground: { hsl: "220 14% 40%", from: "slate ink — dateline, jurisdiction, citation footer" },
|
|
69
|
+
accent: { hsl: "38 18% 88%", from: "hover surface — one cream tier deeper" },
|
|
70
|
+
accentForeground: { hsl: "220 30% 14%", from: "ink on hover" },
|
|
71
|
+
border: { hsl: "38 14% 82%", from: "warm hairline rule — Wachtell column divider, barely visible on cream" },
|
|
72
|
+
input: { hsl: "38 14% 82%", from: "same as border" },
|
|
73
|
+
ring: { hsl: "218 60% 22%", from: "navy focus ring — formal and unmissable for accessibility" },
|
|
74
|
+
destructive: { hsl: "0 60% 36%", from: "formal alert red — deep, restrained, never the consumer brake-light red" },
|
|
75
|
+
destructiveForeground: { hsl: "38 28% 95%", from: "cream on alert" },
|
|
76
|
+
brand: {
|
|
77
|
+
ink: { hsl: "220 30% 14%", from: "= foreground; deep ink for body and headings" },
|
|
78
|
+
paper: { hsl: "38 28% 95%", from: "= background; cream paper" },
|
|
79
|
+
"navy-deep": { hsl: "218 60% 22%", from: "= primary; conservative bar-association navy" },
|
|
80
|
+
"navy-soft": { hsl: "218 40% 32%", from: "subheadings, deck text — one tier above body ink" },
|
|
81
|
+
"bar-gold": { hsl: "42 60% 42%", from: "rare bar-admission/honors accent — reserved for credential moments only" },
|
|
82
|
+
"cream-deep": { hsl: "38 20% 90%", from: "= secondary; deeper cream for aside panels" },
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
spacing: {
|
|
87
|
+
base: 4,
|
|
88
|
+
scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96], // generous — annual-report rhythm
|
|
89
|
+
containerMax: "max-w-5xl", // wider than editorial — practice grid + roster fit together
|
|
90
|
+
containerPadding: "px-6 lg:px-10",
|
|
91
|
+
sectionPadding: {
|
|
92
|
+
hero: "pt-24 pb-16 lg:pt-32 lg:pb-24",
|
|
93
|
+
default: "py-20 lg:py-28",
|
|
94
|
+
tight: "py-14 lg:py-20",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
radius: {
|
|
99
|
+
base: "0.125rem", // 2px — formal print-document feel, never soft
|
|
100
|
+
pillsAllowed: false, // pills read marketing-startup, not white-shoe; use rect badges
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
shadows: {
|
|
104
|
+
style: "minimal",
|
|
105
|
+
utilities: {
|
|
106
|
+
"hairline-bottom":
|
|
107
|
+
"0 1px 0 0 hsl(var(--border))", // column-divider rule
|
|
108
|
+
"card-formal":
|
|
109
|
+
"0 1px 2px 0 hsl(220 30% 14% / 0.04), 0 2px 6px 0 hsl(220 30% 14% / 0.04)",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
motion: {
|
|
114
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
115
|
+
durations: {
|
|
116
|
+
reveal: 600, // measured — partner-track sites do not perform
|
|
117
|
+
loop: 0, // no loops on a firm site
|
|
118
|
+
ambient: 0, // no ambient
|
|
119
|
+
},
|
|
120
|
+
keyframes: {
|
|
121
|
+
"fade-rise": {
|
|
122
|
+
css:
|
|
123
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
124
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
125
|
+
defaultDuration: 600,
|
|
126
|
+
iteration: "once",
|
|
127
|
+
purpose: "the only entrance — measured, formal, never bouncy",
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
respectsReducedMotion: true,
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
density: "medium",
|
|
134
|
+
|
|
135
|
+
patterns: {
|
|
136
|
+
button:
|
|
137
|
+
"Primary = solid navy fill, cream text, 2px radius — single emphatic CTA per page (Contact, Request Counsel). " +
|
|
138
|
+
"Secondary = ghost (1px navy border, navy text). Tertiary = navy text-link, underline on hover. " +
|
|
139
|
+
"No shadow on buttons, no gradient, no pill. Sentence-case or formal title-case only.",
|
|
140
|
+
card:
|
|
141
|
+
"White fill on cream bg, 2px radius, 1px hairline border, optional .card-formal shadow. " +
|
|
142
|
+
"Internal padding p-6 lg:p-8. Title in EB Garamond 600. Eyebrow in mono small-caps mutedForeground. " +
|
|
143
|
+
"Attorney roster cards omit shadow — they sit flush on cream with hairline rule only.",
|
|
144
|
+
input:
|
|
145
|
+
"Border-bottom only (1px navy-soft). No full box. Label above in Inter 500. Focus thickens border to 2px navy-deep. " +
|
|
146
|
+
"Placeholder italic in mutedForeground. Form chrome is rare on firm sites; this language matches the rare contact form.",
|
|
147
|
+
cta:
|
|
148
|
+
"Navy solid button for the single primary action per page. Inline contact-the-firm links are navy text with permanent underline. " +
|
|
149
|
+
"Voice is formal: 'Contact our M&A practice', 'Request the 2025 deal record'. Never 'Get started', never 'Try it free'.",
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
details: {
|
|
153
|
+
selectionBg: "hsl(var(--primary) / 0.20)",
|
|
154
|
+
selectionFg: "hsl(var(--foreground))",
|
|
155
|
+
focusRing: "2px solid hsl(var(--ring))",
|
|
156
|
+
scrollbarStyle: "thin",
|
|
157
|
+
},
|
|
158
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Design Direction — Lawtech-Modern
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Clio matter-management warmth · MyCase friendly dashboard · Smokeball pragmatic UI · Filevine fielded-data clarity · PracticePanther solo-practitioner approachability
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Modern legal-tech dashboard energy. Cream-tinted surfaces with sage primary, friendly Inter, dense-but-soft information layout. Software-not-stuffy — the tool a paperless solo practitioner or a 40-person firm runs without the white-shoe self-image. Brex-for-law: competence with warmth, not gravitas with starch.
|
|
8
|
+
|
|
9
|
+
A lawtech-modern surface that feels formal-serif, white-shoe, or capital-markets-cold is off-direction. This is the SaaS the firm uses; not the firm itself.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Clio** (clio.com) → cream + sage, friendly Inter, matter-list density without coldness. The category leader's visual benchmark.
|
|
13
|
+
- **MyCase** (mycase.com) → dashboard warmth, sage CTAs, plain-English voice. Solo and small-firm focus.
|
|
14
|
+
- **Smokeball** (smokeball.com) → pragmatic UI, sage activity-feed, friendly badges. Practice-management without the enterprise crust.
|
|
15
|
+
- **Filevine** (filevine.com) → fielded-data clarity, dense forms with breathing room. The litigation-management flank.
|
|
16
|
+
- **PracticePanther** (practicepanther.com) → solo + small-firm approachability, gentle sage primary.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. The cream background (`40 32% 97%`) is the brand-warmth signal — pure dashboard white reads enterprise-cold; spa cream reads wellness. Lawtech cream is the middle position.
|
|
20
|
+
|
|
21
|
+
Brand tokens, all semantic:
|
|
22
|
+
- `sage` — alias of `--primary`. The Clio/MyCase friendly primary; never enterprise navy.
|
|
23
|
+
- `sage-soft` — sage tint for status pills, hover surfaces.
|
|
24
|
+
- `sage-deep` — sage hover-darken, active state.
|
|
25
|
+
- `cream` / `cream-deep` — aliases of `--background` / `--secondary`. The Clio surface stack.
|
|
26
|
+
- `amber` — deadline-approaching, pending-review. The attention tone, never alarm.
|
|
27
|
+
- `navy` — secondary info accent for client-portal links, court-filing badges. Never primary.
|
|
28
|
+
|
|
29
|
+
Color rules:
|
|
30
|
+
- **Sage is the brand voice.** Two sage accents per surface is fine; this is a tool, not a magazine.
|
|
31
|
+
- **Navy is secondary information only.** Court-filing badges, client-portal labels. Never the primary CTA — that's sage's job.
|
|
32
|
+
- **Amber is attention, red is overdue.** Pending review = amber chip. Past-due invoice or missed deadline = red. The distinction is non-negotiable.
|
|
33
|
+
|
|
34
|
+
## Typography
|
|
35
|
+
- **Display:** Inter at weights 500/600/700. No serif. Lawtech sites read as software; serifs would break the dashboard register.
|
|
36
|
+
- **Body:** Inter, **15px**, line-height 1.55. Dashboard density.
|
|
37
|
+
- **Mono:** IBM Plex Mono. Matter IDs (24-0182-CV), billable codes, court-deadline counters, invoice amounts. Tabular figures non-negotiable for the billable-hours tracker.
|
|
38
|
+
|
|
39
|
+
Font features: `"cv11", "ss01", "tnum", "calt"`.
|
|
40
|
+
|
|
41
|
+
H1 uses `clamp(2rem, 4.5vw, 3.25rem)` — tool-first, never marketing-shouty.
|
|
42
|
+
|
|
43
|
+
## Spacing
|
|
44
|
+
- **Container:** `max-w-7xl px-4 lg:px-6` — wide, dashboard runs edge-to-edge.
|
|
45
|
+
- **Section padding tiers:**
|
|
46
|
+
- Hero: `pt-16 pb-12 lg:pt-24 lg:pb-16`
|
|
47
|
+
- Default: `py-12 lg:py-20`
|
|
48
|
+
- Tight: `py-8 lg:py-12`
|
|
49
|
+
- **Allowed scale:** 2 4 6 8 10 12 14 16 20 24 32 40 48 64 80. Dense — dashboards use micro-steps.
|
|
50
|
+
|
|
51
|
+
## Color
|
|
52
|
+
No hex anywhere. Sage is brand; navy is info; amber is attention; red is overdue. Pure dashboard-white shows up only as the card fill — backgrounds are always cream.
|
|
53
|
+
|
|
54
|
+
## Radius
|
|
55
|
+
`--radius: 0.625rem` (10px). Softer than enterprise-tech, less pillowy than DTC consumer. **Pills allowed** — matter-status, billable-tag, deadline-state pills are core to the language.
|
|
56
|
+
|
|
57
|
+
## Shadows
|
|
58
|
+
**Soft.** Four utilities:
|
|
59
|
+
- `.shadow-panel` — standard dashboard card.
|
|
60
|
+
- `.shadow-panel-lg` — hover lift.
|
|
61
|
+
- `.shadow-popover` — dropdowns, modals.
|
|
62
|
+
- `.shadow-inset-soft` — top-edge highlight on the white card sitting on cream.
|
|
63
|
+
|
|
64
|
+
## Motion
|
|
65
|
+
Dashboard-responsive, not marketing-slow.
|
|
66
|
+
- **Easing:** `cubic-bezier(0.22, 1, 0.36, 1)`
|
|
67
|
+
- **Durations:** reveal 350ms, loop 1800ms.
|
|
68
|
+
- **Keyframes:** `fade-rise` (panel entrance), `scale-in` (modals), `soft-pulse` (live timer / deadline-approaching dot), `shimmer` (loading skeleton).
|
|
69
|
+
|
|
70
|
+
`prefers-reduced-motion` honored.
|
|
71
|
+
|
|
72
|
+
## Component patterns
|
|
73
|
+
- **Buttons:** primary = solid sage fill, white text, `rounded-lg`, `shadow-panel`. Secondary = white fill with 1px warm border. Tertiary = sage text-link. Destructive = red ghost, upgrades to solid only on confirm.
|
|
74
|
+
- **Cards:** `rounded-lg`, white fill on cream, 1px warm border, `shadow-panel`. Internal padding `p-5 lg:p-6`. Dashboard tile may use 4px top-border in the brand color matching the data tier.
|
|
75
|
+
- **Inputs:** `rounded-md`, 1px warm border, white bg, compact (`h-9`). Label above in Inter 500. Focus = 2px sage ring at 40% opacity.
|
|
76
|
+
- **CTAs:** sage solid is the dashboard default. Marketing pairs primary + navy ghost. Voice: *"Start your free trial"*, *"Import your matters"*, *"Talk to a specialist"*. Friendly-professional — never marketing-loud, never white-shoe formal.
|
|
77
|
+
|
|
78
|
+
## Recommended rich media
|
|
79
|
+
Lawtech-modern uses **product screenshots and friendly attorney portraits** the way SaaS marketing does — the screen is the hero, the human is the supporting cast.
|
|
80
|
+
|
|
81
|
+
**Permitted:** product screenshots (matter dashboard, billable-hours tracker, document automation flow) — the hero of every marketing page. Attorney portraits, but friendly-warm (not white-shoe formal) — casual blazer, natural light, smiling-but-not-grinning. Spot illustrations in sage line-work for empty-states and onboarding. Customer-logo strips for the "trusted by 150,000 firms" social-proof row.
|
|
82
|
+
|
|
83
|
+
**Forbidden:** white-shoe formal portraits (that's the firm's brand, not the tool's); courthouse architecture (that's law-firm direction); AI-rendered abstract gradients; isometric office scenes (overused SaaS cliché in 2023, dated in 2026).
|
|
84
|
+
|
|
85
|
+
**AI tools:** Midjourney/Flux for the friendly attorney portraits. Spot illustrations: Recraft or hand-drawn in Figma. Product screenshots: real Loom-grade UI captures, not Figma mockups masquerading as screenshots.
|
|
86
|
+
|
|
87
|
+
**Aspect ratios:** 16:9 for product screenshots, 4:5 for portraits, 1:1 for spot illustrations.
|
|
88
|
+
|
|
89
|
+
**Performance:** product screenshot ≤200 KB AVIF at 1600w; portraits ≤80 KB at 600w. LCP under 2s.
|
|
90
|
+
|
|
91
|
+
## Component families
|
|
92
|
+
None at install time. Anticipated families:
|
|
93
|
+
- **MatterRow** — matter number (mono), name (Inter 500), status pill (sage/amber/red), assigned attorney, last activity.
|
|
94
|
+
- **BillableTrackerBar** — weekday letter, mono hours, sage bar fill against muted track.
|
|
95
|
+
- **DeadlineCard** — sage top-border, court name (Inter 600), filing-due-in counter (mono amber when ≤72h).
|
|
96
|
+
- **DocumentAutomationStrip** — three-step horizontal flow with arrows, sage active step.
|
|
97
|
+
|
|
98
|
+
## Details
|
|
99
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` — pale sage highlight.
|
|
100
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — soft sage.
|
|
101
|
+
- **Scrollbar:** thin.
|
|
102
|
+
|
|
103
|
+
## Exceptions
|
|
104
|
+
None yet.
|
|
105
|
+
|
|
106
|
+
## Revisions
|
|
107
|
+
- Initial direction, authored at install time. Pairs distinctly with `law-firm` — same industry, opposite voice. Law-firm is the white-shoe partnership; lawtech-modern is the SaaS the partnership runs.
|