@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,110 @@
|
|
|
1
|
+
# Design Direction — Hotel-Boutique
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
The Standard cinematic warm-gradient property shots · Ace Hotel matte navy + characterful serif + community voice · Hotel Esencia Caribbean cream restraint · Soho House members-club gravity · Standard High Line nightlife-luxury
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
A boutique-hotel brand site with a personality — not chain-corporate, not OTA-aggregator. **The property has a name, a neighborhood, an opening hour for the bar, and a doorman who knows you.** Warm cream paper canvas, matte navy ink, a single lobby-velvet terracotta accent, and full-bleed property and neighborhood photography. Cormorant serif display at oversized property-headline scale, Plus Jakarta Sans body. The voice writes in first person — *"we built this room"*, *"the bar opens at six"*, *"the neighborhood eats here, not at the lobby restaurant"* — Ace Hotel community register layered over Standard cinematic gravity. Soho House members-club composure underneath.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **The Standard** → warm gradient + Plus Jakarta + cinematic property shots. The rooftop at dusk, the lobby at midnight. Photography is the lead.
|
|
11
|
+
- **Ace Hotel** → matte navy + cream + characterful serif + community voice. The hotel writes copy like a neighborhood newspaper.
|
|
12
|
+
- **Hotel Esencia** → warm cream + EB Garamond serif + Caribbean restraint. The room is the program; the page gets out of the way.
|
|
13
|
+
- **Soho House** → matte cream + serif + members-club gravity. Application, not booking. Cormorant italic, members'-only register.
|
|
14
|
+
- **Standard High Line** → warm gradient + restrained + nightlife-luxury. The brass-warm flicker on the key icon traces here.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **warm cream canvas** (background) → **lifted cream room** (card/popover) → **cream tiered deeper** (secondary/muted/accent). Depth comes from hairline rules at `foreground / 0.10` plus a soft `card-soft` lift; hero property photography gets `property-lift`, a diffuse cinematic drop. This direction is **soft**, not **minimal** — boutique hospitality earns one degree of warmth that architectural/editorial do not.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--cream-canvas` (Ace Hotel warm cream, alias of background), `--cream-room` (Hotel Esencia lifted cream, room-page stock), `--ink-navy` (Standard matte navy, foreground/midnight lobby), `--velvet-terracotta` (Soho House lobby-velvet, primary accent), `--brass-warm` (Standard High Line brass fixture, sparingly on key-icon eyebrows and member-tier badges), `--ocean-deep` (Hotel Esencia Caribbean deep-water, amenity icons and weather chips). Primary is `12 48% 36%` — a deep lobby-velvet terracotta, never a gilded gold.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Cormorant Garamond at 400/500/600/700, italic-friendly. Property names, room names, neighborhood essay titles. Tracking `-0.018em` — Cormorant at property-headline scale wants tighter tracking; the serif settles.
|
|
25
|
+
- **Body:** Plus Jakarta Sans at 400/500/600, **17px**, line-height **1.7**. Long-form property prose, neighborhood essays, the bar's opening-hours copy. The Standard / Standard High Line warm geometric sans register.
|
|
26
|
+
- **Mono:** JetBrains Mono at 400. Used **only small** — room numbers (Nº 412), neighborhood coordinates, weather/local-time captions, member-tier numbers. Never display, never body.
|
|
27
|
+
|
|
28
|
+
Hierarchy is pair-driven: Cormorant italic display + Plus Jakarta body, with tracked-uppercase Plus Jakarta small caps (letter-spacing 0.1em) for eyebrows ('THE PROPERTY', 'THE NEIGHBORHOOD', 'THE BAR'). H1 uses `clamp(2.75rem, 7.5vw, 6.5rem)` — property-headline scale, Standard cinematic register. Font features: `"liga", "dlig", "onum", "kern"` — discretionary ligatures earn their place in Cormorant italic property names.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-6 lg:px-12` — 1152px. Property photography is hero; the rooms-grid needs the width to read as a curated set, not a list.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-24 pb-16 lg:pt-40 lg:pb-28` (cinematic property-shot hero)
|
|
34
|
+
- Default: `py-20 lg:py-32`
|
|
35
|
+
- Tight: `py-14 lg:py-20`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 80 96 128 160. The high end (80/96/128/160) is intentional — hotel-program pacing, room to breathe between sections.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. White and pure black are forbidden — `--cream-canvas` (`32 22% 91%`) and `--ink-navy` (`220 28% 12%`) replace them.
|
|
40
|
+
|
|
41
|
+
The palette is warmth and one accent:
|
|
42
|
+
- **Cream-canvas** — Ace Hotel warm cream, the matte page.
|
|
43
|
+
- **Cream-room** — Hotel Esencia lifted cream, room-page and property-card stock.
|
|
44
|
+
- **Ink-navy** — Standard matte navy, the foreground and the midnight-lobby base color.
|
|
45
|
+
- **Velvet-terracotta** — Soho House lobby-velvet, the **one** primary accent. Characterful, never gilded.
|
|
46
|
+
- **Brass-warm** — Standard High Line brass fixture, used **sparingly** on key-icon eyebrows, member-tier badges, and the single `key-flicker` marker.
|
|
47
|
+
- **Ocean-deep** — Hotel Esencia Caribbean deep-water blue. Used for amenity icons (pool, beach, spa) and weather chips. **Never** as a primary action color.
|
|
48
|
+
|
|
49
|
+
Saturation never exceeds what would read in a printed members'-card mailer under warm lobby light. The property photography carries the color — the chrome stays warm-neutral.
|
|
50
|
+
|
|
51
|
+
## Radius
|
|
52
|
+
`--radius: 0.25rem` (4px). Softer than restaurant/architecture, **signals hospitality warmth without going consumer-pill**. Pills are disallowed (`pillsAllowed: false`) — member-tier badges are sharp rects, characterful not playful. The 0.25rem corner reads like the rounded edge of a printed Soho House member card, not a delivery-app chip.
|
|
53
|
+
|
|
54
|
+
## Shadows
|
|
55
|
+
**Soft.** Two utilities:
|
|
56
|
+
- `.property-lift` — `0 18px 48px -24px hsl(var(--foreground) / 0.32)`. Diffuse drop for **property hero photography only** — lobby-light register, rooftop-at-dusk lift.
|
|
57
|
+
- `.card-soft` — `0 1px 0 0 hsl(var(--foreground) / 0.10), 0 8px 24px -16px hsl(var(--foreground) / 0.18)`. Room-card hairline + subtle lift; the warmest chrome the page is allowed.
|
|
58
|
+
|
|
59
|
+
No glows. No neon-pulse. Buttons never carry shadow; the lift lives on cards and photography.
|
|
60
|
+
|
|
61
|
+
## Motion
|
|
62
|
+
Three keyframes:
|
|
63
|
+
- **`welcome-rise`** — opacity + 18px translate, **1100ms**. The standard entrance for property cards, room-page headers, and neighborhood essays. The door is opened, the guest steps in.
|
|
64
|
+
- **`lobby-ken-burns`** — `scale(1.04) translate(0,0) → scale(1.14) translate(-1.5%, -1%)`, **28000ms**, infinite. Slow cinematic drift on hero property photography — Standard camera-push, lobby and rooftop tableaus breathing.
|
|
65
|
+
- **`key-flicker`** — opacity flicker on the brass-warm key icon, **6000ms**, infinite. Neon-sign-at-dusk reference; used **once per page**, never on more than one element.
|
|
66
|
+
|
|
67
|
+
No marquee, no parallax. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `lobby-ken-burns` and `key-flicker` are disabled entirely under reduced motion; `welcome-rise` collapses to instantaneous final-state.
|
|
68
|
+
|
|
69
|
+
## Component patterns
|
|
70
|
+
- **Buttons:** the default primary CTA is a **serif italic text-link in velvet-terracotta**, underline always visible — members-club register. The solid button is reserved for **one 'Book a Room' hero CTA per page** — ink-navy bg + cream-canvas text, 0.25rem radius, **no shadow on the button itself**. Secondary actions ('Tour the Property', 'Read the Neighborhood Guide') are tracked-uppercase text-links in Plus Jakarta Sans 500.
|
|
71
|
+
- **Cards (property/room):** hairline top + bottom at `foreground / 0.10` plus the soft `.card-soft` lift, **cream-room bg** (one tier above canvas). Room number in JetBrains Mono small-caps eyebrow (Nº 412), room name in **Cormorant italic display**, square-footage/bed-count in a mono row beneath. Internal padding `p-8 lg:p-10`. The hero property shot uses `.property-lift` drop shadow, never `.card-soft`.
|
|
72
|
+
- **Inputs:** booking form — border-bottom + thin all-around border (1px `--border`), cream-room bg, 0.25rem radius. Label above in tracked-uppercase Plus Jakarta small caps (letter-spacing 0.1em). Placeholder in muted-foreground italic serif. Focus is velvet-terracotta ring, 1px. Date pickers and guest-count steppers use the same hairline language.
|
|
73
|
+
- **CTAs:** default CTA is serif italic text-link in velvet-terracotta with always-visible underline. The single 'Book a Room' hero CTA is the one solid-fill exception — ink-navy bg, cream-canvas text. Members'-only CTAs ('Member Login', 'Apply for Membership') use brass-warm tracked-uppercase text-link with optional `.key-flicker` on the key icon.
|
|
74
|
+
|
|
75
|
+
## Recommended rich media
|
|
76
|
+
|
|
77
|
+
The page is led by **cinematic property and neighborhood photography** — the rooftop at dusk, the lobby at midnight, the bar at six, the room with the window open. The Standard's photographic register; warm gradient skies, occupied spaces, never empty marketing-stage shots. **Show the doorman, show the bartender, show the regular at the corner table.**
|
|
78
|
+
|
|
79
|
+
**AI tool recommendations.**
|
|
80
|
+
- **Midjourney / Flux** — *"The Standard hotel rooftop at golden-hour dusk, warm gradient sky, occupied bar in middle distance, cinematic 35mm, Annie Leibovitz lighting"*; for rooms, *"Hotel Esencia guest room interior, late afternoon Caribbean window light, unmade linen, cedar floor, single subject"*; for neighborhood essays, *"Ace Hotel neighborhood street scene, locals at a coffee counter, warm afternoon light, Kodak Portra 400, 50mm"*.
|
|
81
|
+
- **Avoid Midjourney's default hotel-photography register** — it tends toward empty-room real-estate-listing energy. Always prompt for occupied spaces, warm gradient light, and a sense of time-of-day.
|
|
82
|
+
- **Real photography wins** — boutique hotels live on the photographer relationship. If a property-shoot is possible, use it.
|
|
83
|
+
|
|
84
|
+
**Aspect ratios.** **16:9** for the hero rooftop/lobby cinematic shot (Standard cinematic register), **4:5 portrait** for room interiors and chef/doorman portraits, **3:2 landscape** for neighborhood-essay photography. Never 1:1 social-square as the hero; the property is not an Instagram tile.
|
|
85
|
+
|
|
86
|
+
**Color in imagery.** Warm gradient skies, candlelit interiors, neon at dusk, terracotta and navy and brass. Never high-key bright, never harsh midday, never the empty-room real-estate-listing register. Black-and-white is welcome for member portraits and bar staff.
|
|
87
|
+
|
|
88
|
+
**Video.** Used for the property hero — a single 28s `.lobby-ken-burns`-style slow drift over a still, **or** a muted 20s loop of the rooftop at golden hour. Never autoplay with sound. Never room-tour-walkthrough video. ≤10 MB AV1 or H.265.
|
|
89
|
+
|
|
90
|
+
**Captions are mandatory.** Property name, neighborhood, room name, photographer credit, time of day — in JetBrains Mono small caps. *"The Standard · East Village, NY · Suite 1207 · Photograph by Brigitte Lacombe · 19:42 EDT"* style attribution always.
|
|
91
|
+
|
|
92
|
+
**Performance.** Hero property image ≤220 KB AVIF at 2000w; room-card photography ≤110 KB each. LCP under 2.8s — if it slips, the property photograph is too large, not the framework. Boutique hotels can afford slightly heavier hero media than editorial because **the photograph is the property**.
|
|
93
|
+
|
|
94
|
+
**Avoid.** OTA-aggregator energy (Booking.com tile grids). Empty-room real-estate-listing photography. Stock smiling-staff photos. Generic "boutique luxury" hotel-chain marketing language. AI-glossy "perfect" interiors (uncanny). Pop-up booking widgets that block the photograph. Lens flare. Anything that reads more **Hilton than Hotel Esencia**.
|
|
95
|
+
|
|
96
|
+
**Accessibility.** Long-form alt-text — describe the room, the light, the time of day, the occupants as if for a blind reader. *"A double room with an unmade linen bed, cedar floor, and a single open window looking out onto a coconut palm; photographed in late Caribbean afternoon light."* The bar is hotel-brochure editorial.
|
|
97
|
+
|
|
98
|
+
## Component families
|
|
99
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they are established.
|
|
100
|
+
|
|
101
|
+
## Details
|
|
102
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text — lobby-velvet highlight on cream canvas.
|
|
103
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`. Thin and quiet — hospitality precision, never decorative.
|
|
104
|
+
- **Scrollbar:** thin.
|
|
105
|
+
|
|
106
|
+
## Exceptions
|
|
107
|
+
None yet. A **dark Ace Hotel variant** (matte navy background, cream foreground, same velvet-terracotta accent) is anticipated for properties whose mood is intentionally nocturnal — it lives as a future direction-mode, not as a within-direction toggle. When an intentional one-of-one violation lands, add it here with the reason.
|
|
108
|
+
|
|
109
|
+
## Revisions
|
|
110
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const hotelBoutique: Direction = {
|
|
4
|
+
name: "hotel-boutique",
|
|
5
|
+
ethos:
|
|
6
|
+
"The Standard cinematic warm-gradient property shots · Ace Hotel matte navy + characterful serif + community voice · Hotel Esencia Caribbean cream restraint · Soho House members-club gravity · Standard High Line nightlife-luxury",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "The Standard", trait: "warm gradient + Plus Jakarta + cinematic property shots" },
|
|
9
|
+
{ brand: "Ace Hotel", trait: "matte navy + cream + characterful serif + community voice" },
|
|
10
|
+
{ brand: "Hotel Esencia", trait: "warm cream + EB Garamond + Caribbean restraint" },
|
|
11
|
+
{ brand: "Soho House", trait: "matte cream + serif + members-club gravity" },
|
|
12
|
+
{ brand: "Standard High Line", trait: "warm gradient + restrained + nightlife-luxury" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Boutique-hotel brand site with a personality — not chain-corporate, not OTA. " +
|
|
16
|
+
"Matte navy-ink canvas with warm cream paper and a single terracotta accent " +
|
|
17
|
+
"(the lobby velvet). Cormorant serif display at oversized property-headline scale, " +
|
|
18
|
+
"Plus Jakarta Sans body, full-bleed property and neighborhood photography. " +
|
|
19
|
+
"The voice writes in first person — 'we built this room', 'the bar opens at six' " +
|
|
20
|
+
"— Ace Hotel community register layered over Standard cinematic gravity.",
|
|
21
|
+
|
|
22
|
+
fonts: {
|
|
23
|
+
display: {
|
|
24
|
+
family: "Cormorant Garamond",
|
|
25
|
+
fallback: ["EB Garamond", "Iowan Old Style", "Garamond", "Georgia", "serif"],
|
|
26
|
+
from: "Cormorant Garamond — Soho House / Hotel Esencia members-club serif, italic-friendly for property names",
|
|
27
|
+
googleFont: "Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500",
|
|
28
|
+
weights: [400, 500, 600, 700],
|
|
29
|
+
},
|
|
30
|
+
body: {
|
|
31
|
+
family: "Plus Jakarta Sans",
|
|
32
|
+
fallback: ["Inter", "system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
|
|
33
|
+
from: "Plus Jakarta Sans — The Standard / Standard High Line body register; warm geometric sans, hospitality-friendly",
|
|
34
|
+
googleFont: "Plus+Jakarta+Sans:wght@400;500;600",
|
|
35
|
+
weights: [400, 500, 600],
|
|
36
|
+
},
|
|
37
|
+
mono: {
|
|
38
|
+
family: "JetBrains Mono",
|
|
39
|
+
fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
40
|
+
from: "JetBrains Mono — room numbers, neighborhood coordinates, weather/local-time captions, small only",
|
|
41
|
+
googleFont: "JetBrains+Mono:wght@400",
|
|
42
|
+
weights: [400],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
typography: {
|
|
47
|
+
headingTracking: "-0.018em", // Cormorant at hotel-display scale wants tighter tracking; the serif settles
|
|
48
|
+
bodyTracking: "0",
|
|
49
|
+
fontFeatureSettings: '"liga", "dlig", "onum", "kern"',
|
|
50
|
+
h1ScaleClamp: "clamp(2.75rem, 7.5vw, 6.5rem)", // property-headline scale, Standard cinematic register
|
|
51
|
+
bodyBaseSize: "1.0625rem", // 17px — long-form property prose, neighborhood essays
|
|
52
|
+
bodyLineHeight: "1.7",
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
colors: {
|
|
56
|
+
background: { hsl: "32 22% 91%", from: "Ace Hotel warm cream paper — the matte boutique canvas, never bright white" },
|
|
57
|
+
foreground: { hsl: "220 28% 12%", from: "Standard matte navy-ink — deep blue-black, lobby velvet shadow at midnight" },
|
|
58
|
+
card: { hsl: "32 26% 95%", from: "Hotel Esencia lifted cream — one tier brighter than the canvas, room-page surface" },
|
|
59
|
+
popover: { hsl: "32 26% 95%", from: "same as card; depth from hairline only" },
|
|
60
|
+
primary: { hsl: "12 48% 36%", from: "Soho House lobby-velvet terracotta — the single warm accent, characterful not gilded" },
|
|
61
|
+
primaryForeground: { hsl: "32 22% 91%", from: "warm cream on lobby-velvet terracotta" },
|
|
62
|
+
secondary: { hsl: "32 18% 86%", from: "Ace Hotel cream paper, one tier deeper — printed property-card second-tone" },
|
|
63
|
+
secondaryForeground: { hsl: "220 28% 12%", from: "navy-ink on cream" },
|
|
64
|
+
muted: { hsl: "32 18% 86%", from: "same as secondary — differentiation by usage, not by color" },
|
|
65
|
+
mutedForeground: { hsl: "220 18% 36%", from: "Standard secondary text — slate-navy for captions and small print" },
|
|
66
|
+
accent: { hsl: "32 20% 82%", from: "warm cream, deepest tier — hover surface only" },
|
|
67
|
+
accentForeground: { hsl: "220 28% 12%", from: "navy-ink on cream accent" },
|
|
68
|
+
border: { hsl: "220 14% 72%", from: "Soho House hairline rule — printed members-card divider weight, barely visible" },
|
|
69
|
+
input: { hsl: "220 14% 72%", from: "same as border — reservation/booking form is hairlines, not boxes" },
|
|
70
|
+
ring: { hsl: "12 48% 36%", from: "primary lobby-velvet terracotta — focus ring, the one accent moment" },
|
|
71
|
+
destructive: { hsl: "8 60% 42%", from: "fire-warm alert — characterful warning, never screaming red" },
|
|
72
|
+
destructiveForeground: { hsl: "32 22% 91%", from: "warm cream on fire-warm alert" },
|
|
73
|
+
brand: {
|
|
74
|
+
"cream-canvas": { hsl: "32 22% 91%", from: "Ace Hotel warm cream — alias of background, the matte canvas" },
|
|
75
|
+
"cream-room": { hsl: "32 26% 95%", from: "Hotel Esencia lifted cream — room-page card stock" },
|
|
76
|
+
"ink-navy": { hsl: "220 28% 12%", from: "Standard matte navy — foreground, the midnight lobby" },
|
|
77
|
+
"velvet-terracotta": { hsl: "12 48% 36%", from: "Soho House lobby-velvet terracotta — primary accent" },
|
|
78
|
+
"brass-warm": { hsl: "38 42% 56%", from: "Standard High Line brass fixture — used sparingly on key-icon eyebrows and member-tier badges" },
|
|
79
|
+
"ocean-deep": { hsl: "200 38% 28%", from: "Hotel Esencia Caribbean deep-water blue — used for amenity icons and weather chips, never as a primary action" },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
spacing: {
|
|
84
|
+
base: 4,
|
|
85
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160], // hotel-program pacing, room to breathe
|
|
86
|
+
containerMax: "max-w-6xl", // 1152px — property photography is hero; rooms-grid needs the width
|
|
87
|
+
containerPadding: "px-6 lg:px-12",
|
|
88
|
+
sectionPadding: {
|
|
89
|
+
hero: "pt-24 pb-16 lg:pt-40 lg:pb-28",
|
|
90
|
+
default: "py-20 lg:py-32",
|
|
91
|
+
tight: "py-14 lg:py-20",
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
radius: {
|
|
96
|
+
base: "0.25rem", // 4px — softer than restaurant/architecture, signals hospitality warmth without going consumer-pill
|
|
97
|
+
pillsAllowed: false, // no pill chips; member badges are sharp rects, characterful not playful
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
shadows: {
|
|
101
|
+
style: "soft",
|
|
102
|
+
utilities: {
|
|
103
|
+
"property-lift":
|
|
104
|
+
"0 18px 48px -24px hsl(var(--foreground) / 0.32)", // diffuse drop for property hero photography, lobby-light register
|
|
105
|
+
"card-soft":
|
|
106
|
+
"0 1px 0 0 hsl(var(--foreground) / 0.10), " +
|
|
107
|
+
"0 8px 24px -16px hsl(var(--foreground) / 0.18)", // room-card hairline + subtle lift
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
motion: {
|
|
112
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
113
|
+
durations: {
|
|
114
|
+
reveal: 1100, // hospitality pacing — welcoming, unhurried
|
|
115
|
+
loop: 4000,
|
|
116
|
+
ambient: 28000,
|
|
117
|
+
},
|
|
118
|
+
keyframes: {
|
|
119
|
+
"welcome-rise": {
|
|
120
|
+
css:
|
|
121
|
+
"from { opacity: 0; transform: translateY(18px); }\n" +
|
|
122
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
123
|
+
defaultDuration: 1100,
|
|
124
|
+
iteration: "once",
|
|
125
|
+
purpose:
|
|
126
|
+
"the standard entrance — 1.1s reveal for property cards, room-page headers, neighborhood essays. The door is opened, the guest steps in.",
|
|
127
|
+
},
|
|
128
|
+
"lobby-ken-burns": {
|
|
129
|
+
css:
|
|
130
|
+
"0% { transform: scale(1.04) translate(0, 0); }\n" +
|
|
131
|
+
"100% { transform: scale(1.14) translate(-1.5%, -1%); }",
|
|
132
|
+
defaultDuration: 28000,
|
|
133
|
+
iteration: "infinite",
|
|
134
|
+
purpose:
|
|
135
|
+
"28s slow drift on hero property photography — Standard cinematic camera-push, lobby and rooftop tableaus breathing.",
|
|
136
|
+
},
|
|
137
|
+
"key-flicker": {
|
|
138
|
+
css:
|
|
139
|
+
"0%, 96%, 100% { opacity: 1; }\n" +
|
|
140
|
+
"97% { opacity: 0.7; }\n" +
|
|
141
|
+
"98% { opacity: 1; }\n" +
|
|
142
|
+
"99% { opacity: 0.85; }",
|
|
143
|
+
defaultDuration: 6000,
|
|
144
|
+
iteration: "infinite",
|
|
145
|
+
purpose:
|
|
146
|
+
"6s subtle flicker on a single brass-warm key-icon eyebrow — neon-sign-at-dusk reference, used once per page, never on more than one element.",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
respectsReducedMotion: true,
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
density: "low",
|
|
153
|
+
|
|
154
|
+
patterns: {
|
|
155
|
+
button:
|
|
156
|
+
"Primary CTA is a serif italic text-link in velvet-terracotta (--primary), underline always visible — members-club register. " +
|
|
157
|
+
"The solid button is reserved for ONE 'Book a Room' hero CTA per page — ink-navy bg + cream-canvas text, 0.25rem radius, no shadow on the button itself. " +
|
|
158
|
+
"Secondary actions ('Tour the Property', 'Read the Neighborhood Guide') are tracked-uppercase text-links in Plus Jakarta Sans 500.",
|
|
159
|
+
card:
|
|
160
|
+
"Property/room cards: hairline top + bottom at foreground/10 plus soft card-soft lift, cream-room bg (one tier above canvas). " +
|
|
161
|
+
"Room number in JetBrains Mono small-caps eyebrow (Nº 412), room name in Cormorant italic display, square-footage/bed-count in mono row beneath. " +
|
|
162
|
+
"Internal padding p-8 lg:p-10. Hero property shot uses property-lift drop shadow, never card-soft.",
|
|
163
|
+
input:
|
|
164
|
+
"Booking form: border-bottom + thin all-around border (1px --border), cream-room bg, 0.25rem radius. " +
|
|
165
|
+
"Label above in tracked-uppercase Plus Jakarta small caps (letter-spacing 0.1em). Placeholder in muted-foreground italic serif. " +
|
|
166
|
+
"Focus is velvet-terracotta ring, 1px. Date pickers and guest-count steppers use the same hairline language.",
|
|
167
|
+
cta:
|
|
168
|
+
"Default CTA is serif italic text-link in velvet-terracotta with always-visible underline. " +
|
|
169
|
+
"The single 'Book a Room' hero CTA is the one solid-fill exception — ink-navy bg, cream-canvas text. " +
|
|
170
|
+
"Members'-only CTAs ('Member Login', 'Apply for Membership') use brass-warm tracked-uppercase text-link with optional key-flicker on the key icon.",
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
details: {
|
|
174
|
+
selectionBg: "hsl(var(--primary) / 0.22)",
|
|
175
|
+
selectionFg: "hsl(var(--foreground))",
|
|
176
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
177
|
+
scrollbarStyle: "thin",
|
|
178
|
+
},
|
|
179
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Design Direction — Hyperminimal-Mono
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Müller-Brockmann grid · Vignelli reduction · Apple Notes restraint · Browser Company purity · Bauhaus origin
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Pure black on pure white. Helvetica everywhere — same family for display and body; size and weight are the only hierarchy tools. Grid-strict, one accent color used once per page. The discipline is reductive: every element must justify its existence; defaults are the design.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Josef Müller-Brockmann** → Swiss-Style poster grid; *Grid Systems in Graphic Design*. The page is a module field, not a canvas.
|
|
11
|
+
- **Massimo Vignelli** → NYC subway map, American Airlines identity. A handful of typefaces, a handful of colors, forever.
|
|
12
|
+
- **Apple Notes** → restraint as default. The app has no opinion until you give it one.
|
|
13
|
+
- **The Browser Company** → landing-site typographic purity. Type carries the page; chrome stays out of the way.
|
|
14
|
+
- **Bauhaus** → origin. Form follows function; ornament is the enemy.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **white** (background, card, popover, secondary). There is no surface differentiation — depth comes from **whitespace and 1px black rules**, never from fill tiers, never from shadows.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--accent-red` (the one allowed color, used **once per page, never twice**), `--ink` (alias for the foreground black), `--paper` (alias for the background white). Primary is `0 0% 0%` — black is the primary; the accent-red is reserved for one moment.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Helvetica Neue (Inter as Helvetica substitute when Helvetica is unavailable). Same family as body.
|
|
25
|
+
- **Body:** Helvetica Neue / Inter, **16px**, line-height **1.5** (16 × 1.5 = 24, lands on the grid).
|
|
26
|
+
- **Mono:** Berkeley Mono. Restrained — used **only** for code and metadata (timestamps, IDs, hashes). Never for body, never for headings.
|
|
27
|
+
|
|
28
|
+
Hierarchy is built from **size and weight only** — never from face change, never from italic display, never from color. H1 uses `clamp(2rem, 5vw, 3.5rem)`. Tracking is `-0.01em` on headings, `0` everywhere else. Font features: `"kern", "tnum"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-5xl px-6 lg:px-8` — Vignelli grid module, generous but disciplined.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-24 pb-16 lg:pt-32 lg:pb-24`
|
|
34
|
+
- Default: `py-16 lg:py-24`
|
|
35
|
+
- Tight: `py-8 lg:py-12`
|
|
36
|
+
- **Allowed scale values:** **4 8 12 16 24 32 48 64 96**. Powers of 4 or multiples that fit the grid — nothing else. No `2px`, no `10px`, no `40px`.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere. **Pure black (`0 0% 0%`) and pure white (`0 0% 100%`) are the language** — the opposite of editorial's "no pure black, no pure white" rule. The single `--accent-red` (`0 100% 50%`) is the Müller-Brockmann poster red and the only allowed third color. Use it **once per page**: one primary CTA, or the link-visited state, or one rule. Never twice. Never as a card border, never as a heading color, never in imagery.
|
|
40
|
+
|
|
41
|
+
`--muted` (`0 0% 96%`) and `--muted-foreground` (`0 0% 40%`) exist for code blocks and secondary text only — they are the only grays.
|
|
42
|
+
|
|
43
|
+
## Radius
|
|
44
|
+
`--radius: 0`. **Sharp corners only.** Pills are disallowed (`pillsAllowed: false`) — pills are anti-grid. Status uses rectangles or plain text. Vignelli and Müller-Brockmann never rounded a corner.
|
|
45
|
+
|
|
46
|
+
## Shadows
|
|
47
|
+
**None.** The shadow utilities object is intentionally empty. Depth is forbidden; everything sits flat on the grid. Separation comes from whitespace and 1px black rules.
|
|
48
|
+
|
|
49
|
+
## Motion
|
|
50
|
+
Single keyframe: `fade-in` (100ms, opacity only — **no transform**). 100ms is just enough to avoid harsh paint; anything more is performance. No marquee, no parallax, no ambient motion (`loop: 0`, `ambient: 0`). Motion is anti-Swiss; what little exists is apologetic.
|
|
51
|
+
|
|
52
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored.
|
|
53
|
+
|
|
54
|
+
## Component patterns
|
|
55
|
+
- **Buttons:** plain rectangle. Default = 1px black border + black text on white, no fill, no hover lift, no rounded corners. Hover = invert (black bg, white text), instant. Tertiary = underlined link, black, no border. The `--accent-red` filled rectangle is reserved for **one primary action per page** — never repeated.
|
|
56
|
+
- **Cards:** no card chrome. Content sits directly on the page, separated by whitespace and a single top hairline rule when grouping is required. No fill, no shadow, no rounded corners. Padding grid-aligned (16/24/32).
|
|
57
|
+
- **Inputs:** 1px black border, sharp corners, white background. Label above (not floating). Focus = 1px inset black ring, no glow. Placeholders state expected format only — no clever copy.
|
|
58
|
+
- **CTAs:** the default CTA is a plain rectangle button. The accent-red filled rectangle is the **one** marketing moment per page. There is no second.
|
|
59
|
+
|
|
60
|
+
## Component families
|
|
61
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they are established. If a family ever needs a second color, the rule is broken — escalate before adding.
|
|
62
|
+
|
|
63
|
+
## Details
|
|
64
|
+
- **Selection:** `hsl(var(--foreground))` background, `hsl(var(--background))` text — pure inversion.
|
|
65
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` (black). No offset, no glow.
|
|
66
|
+
- **Scrollbar:** OS default (`auto`). The designer does not redecorate browser chrome.
|
|
67
|
+
|
|
68
|
+
## Recommended rich media
|
|
69
|
+
|
|
70
|
+
**Cover.** A single bold typographic image as hero; a single editorial photo (when one is used) at exact **1:1 or 16:9**, no other ratios; geometric illustrations in pure black on white, in the Müller-Brockmann grid-poster tradition.
|
|
71
|
+
|
|
72
|
+
**AI tool recommendations.**
|
|
73
|
+
- **Midjourney / Flux** for hero imagery — prompts like *"Müller-Brockmann Swiss design poster, pure geometric, Helvetica typography, black on white"*; for photography, *"Helmut Newton black and white, high contrast, single subject"*.
|
|
74
|
+
- **Recraft** for illustration — *"Vignelli geometric pictogram, single color, flat"*.
|
|
75
|
+
- **Or just use typography itself as the hero** — large Helvetica text, no image needed. This is often the right answer.
|
|
76
|
+
|
|
77
|
+
**Aspect ratios.** 1:1 or 16:9. Nothing else.
|
|
78
|
+
|
|
79
|
+
**Color in imagery.** Black and white **only**. The accent-red appears in UI chrome — never in images.
|
|
80
|
+
|
|
81
|
+
**What to avoid.** Gradients. AI-photorealistic images. Video (motion is anti-Swiss). 3D renders. Decorative SVG. Anything color-saturated. Stock photography with people smiling at laptops.
|
|
82
|
+
|
|
83
|
+
**Honest constraint.** A hyperminimal-mono site is often best served by **zero images**. Let the grid and the type carry it. If you are reaching for an image to fill space, the layout is the problem — fix the layout.
|
|
84
|
+
|
|
85
|
+
**Accessibility.** Alt text must be functional and describe what the image communicates. If an image is purely decorative, **remove it** rather than `aria-hidden`-ing it — decoration is the thing this direction rejects.
|
|
86
|
+
|
|
87
|
+
## Exceptions
|
|
88
|
+
None yet. When an intentional one-of-one violation lands, add it here with the reason. The Director's consistency pass lists all exceptions for human review.
|
|
89
|
+
|
|
90
|
+
## Revisions
|
|
91
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const hyperminimalMono: Direction = {
|
|
4
|
+
name: "hyperminimal-mono",
|
|
5
|
+
ethos:
|
|
6
|
+
"Müller-Brockmann grid · Vignelli reduction · Apple Notes restraint · Browser Company purity · Bauhaus origin",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Josef Müller-Brockmann", trait: "Swiss-Style grid posters, Grid Systems book" },
|
|
9
|
+
{ brand: "Massimo Vignelli", trait: "NYC subway map, American Airlines identity" },
|
|
10
|
+
{ brand: "Apple Notes", trait: "default-is-the-design restraint" },
|
|
11
|
+
{ brand: "The Browser Company", trait: "landing-site typographic purity" },
|
|
12
|
+
{ brand: "Bauhaus", trait: "form-follows-function origin" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Pure black on pure white. Helvetica everywhere — same family for display and " +
|
|
16
|
+
"body, size and weight are the only hierarchy tools. Grid-strict, one accent color " +
|
|
17
|
+
"used once per page. The discipline is reductive: every element must justify its " +
|
|
18
|
+
"existence; defaults are the design.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Helvetica Neue",
|
|
23
|
+
fallback: ["Inter", "Helvetica", "Arial", "system-ui", "-apple-system", "sans-serif"],
|
|
24
|
+
from: "Müller-Brockmann/Vignelli Swiss canon — size and weight do the hierarchy, not face change",
|
|
25
|
+
googleFont: "Inter",
|
|
26
|
+
weights: [400, 500, 700],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Helvetica Neue",
|
|
30
|
+
fallback: ["Inter", "Helvetica", "Arial", "system-ui", "-apple-system", "sans-serif"],
|
|
31
|
+
from: "same family as display — Bauhaus/Vignelli reduction: one face, no decoration",
|
|
32
|
+
googleFont: "Inter",
|
|
33
|
+
weights: [400, 500, 700],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "Berkeley Mono",
|
|
37
|
+
fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "Berkeley Mono — technical precision; restrained, used only for code and metadata",
|
|
39
|
+
weights: [400],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.01em", // Helvetica at large sizes wants a hair tighter
|
|
45
|
+
bodyTracking: "0", // Vignelli neutrality — no character spacing tricks
|
|
46
|
+
fontFeatureSettings: '"kern", "tnum"',
|
|
47
|
+
h1ScaleClamp: "clamp(2rem, 5vw, 3.5rem)", // hierarchy by weight, not by extreme scale
|
|
48
|
+
bodyBaseSize: "1rem", // 16px — Apple Notes default, no clever choice
|
|
49
|
+
bodyLineHeight: "1.5", // grid-friendly; 16 × 1.5 = 24 lands on the 4/8 grid
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "0 0% 100%", from: "pure white — not paper-cream, not off-white; Browser Company purity" },
|
|
54
|
+
foreground: { hsl: "0 0% 0%", from: "pure black — Müller-Brockmann ink" },
|
|
55
|
+
card: { hsl: "0 0% 100%", from: "no card differentiation; surface is the page" },
|
|
56
|
+
popover: { hsl: "0 0% 100%", from: "same as page; depth is forbidden" },
|
|
57
|
+
primary: { hsl: "0 0% 0%", from: "black is the primary action color; accent-red is reserved for one moment" },
|
|
58
|
+
primaryForeground: { hsl: "0 0% 100%", from: "white on black" },
|
|
59
|
+
secondary: { hsl: "0 0% 100%", from: "no secondary surface — differentiate by spacing and rule lines" },
|
|
60
|
+
secondaryForeground: { hsl: "0 0% 0%", from: "black, always" },
|
|
61
|
+
muted: { hsl: "0 0% 96%", from: "Apple Notes faintest gray — used only for code blocks and inline mono cells" },
|
|
62
|
+
mutedForeground: { hsl: "0 0% 40%", from: "Vignelli secondary text — readable, never decorative" },
|
|
63
|
+
accent: { hsl: "0 0% 96%", from: "hover surface; same as muted — restraint over distinction" },
|
|
64
|
+
accentForeground: { hsl: "0 0% 0%", from: "black on hover" },
|
|
65
|
+
border: { hsl: "0 0% 0%", from: "pure black 1px rule — Swiss grid line, never softened to gray" },
|
|
66
|
+
input: { hsl: "0 0% 0%", from: "same as border; inputs are hairlines on the grid" },
|
|
67
|
+
ring: { hsl: "0 0% 0%", from: "black focus ring — no accent leakage" },
|
|
68
|
+
destructive: { hsl: "0 100% 50%", from: "same single red as accent-red; destructive shares the one allowed color" },
|
|
69
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "white on red" },
|
|
70
|
+
brand: {
|
|
71
|
+
"accent-red": {
|
|
72
|
+
hsl: "0 100% 50%",
|
|
73
|
+
from: "Müller-Brockmann poster red — the one allowed color, used once per page, never twice",
|
|
74
|
+
},
|
|
75
|
+
ink: { hsl: "0 0% 0%", from: "alias for the foreground black — Bauhaus ink" },
|
|
76
|
+
paper: { hsl: "0 0% 100%", from: "alias for the background white — Browser Company purity" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
spacing: {
|
|
81
|
+
base: 4,
|
|
82
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96], // powers/multiples of 4 only — grid-strict
|
|
83
|
+
containerMax: "max-w-5xl", // 1024px — generous but disciplined; Vignelli grid module
|
|
84
|
+
containerPadding: "px-6 lg:px-8",
|
|
85
|
+
sectionPadding: {
|
|
86
|
+
hero: "pt-24 pb-16 lg:pt-32 lg:pb-24", // grid-aligned (96/64/128 multiples)
|
|
87
|
+
default: "py-16 lg:py-24",
|
|
88
|
+
tight: "py-8 lg:py-12",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
radius: {
|
|
93
|
+
base: "0", // sharp corners — Vignelli/Müller-Brockmann never rounded
|
|
94
|
+
pillsAllowed: false, // pills are anti-grid; status uses rectangles or text
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
shadows: {
|
|
98
|
+
style: "none", // depth is forbidden; everything sits flat on the grid
|
|
99
|
+
utilities: {}, // intentionally empty — no shadow utilities ship
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
motion: {
|
|
103
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
104
|
+
durations: {
|
|
105
|
+
reveal: 100, // instant — just enough to avoid harsh appearance
|
|
106
|
+
loop: 0, // no loops — motion is anti-Swiss
|
|
107
|
+
ambient: 0, // no ambient motion, ever
|
|
108
|
+
},
|
|
109
|
+
keyframes: {
|
|
110
|
+
"fade-in": {
|
|
111
|
+
css:
|
|
112
|
+
"from { opacity: 0; }\n" +
|
|
113
|
+
"to { opacity: 1; }",
|
|
114
|
+
defaultDuration: 100,
|
|
115
|
+
iteration: "once",
|
|
116
|
+
purpose:
|
|
117
|
+
"the only keyframe — opacity only, no transform. 100ms is just enough to avoid harsh paint.",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
respectsReducedMotion: true,
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
density: "medium",
|
|
124
|
+
|
|
125
|
+
patterns: {
|
|
126
|
+
button:
|
|
127
|
+
"Plain rectangle. Default = 1px black border + black foreground text, no fill, no hover lift, no rounded corners. " +
|
|
128
|
+
"Hover = invert (black bg, white text), no transition fanfare. " +
|
|
129
|
+
"Tertiary = underlined link, black, no border. " +
|
|
130
|
+
"The accent-red is used ONLY for one 'buy' or primary action button per page, and the link-visited state. " +
|
|
131
|
+
"Never as a card border, never as a heading color.",
|
|
132
|
+
card:
|
|
133
|
+
"No card chrome. Content sits directly on the page, separated by whitespace and a single top hairline rule when grouping is needed. " +
|
|
134
|
+
"No fill, no shadow, no rounded corners. Padding is grid-aligned (16/24/32).",
|
|
135
|
+
input:
|
|
136
|
+
"1px black border, sharp corners, white background. Label sits above (not floating). " +
|
|
137
|
+
"Focus = 1px black ring on the inside (inset), no glow. No placeholder cleverness — placeholders state expected format only.",
|
|
138
|
+
cta:
|
|
139
|
+
"Default CTA is a plain rectangle button (border + text). " +
|
|
140
|
+
"The accent-red filled rectangle is reserved for the single primary action per page — never repeated. " +
|
|
141
|
+
"Marketing flourish does not exist in this language.",
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
details: {
|
|
145
|
+
selectionBg: "hsl(var(--foreground))", // black selection — pure inversion
|
|
146
|
+
selectionFg: "hsl(var(--background))", // white text on black
|
|
147
|
+
focusRing: "1px solid hsl(var(--ring))", // 1px black, no offset, no glow
|
|
148
|
+
scrollbarStyle: "auto", // OS default; designer does not redecorate the chrome
|
|
149
|
+
},
|
|
150
|
+
};
|