@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,108 @@
|
|
|
1
|
+
# Design Direction — Studio-Architect
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Sou Fujimoto numbered projects · OMA dense archive · Snøhetta curated monograph · BIG structured boldness · Herzog & de Meuron extreme restraint
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
The printed studio monograph the practice sends to a developer. Cream paper page, every project filed as **Nº 047**, structured case-study grids with hairline rules, deep serif headers, mono metadata. No decoration, no rounded corners, no shadows beyond a 1px structural divider. The page reads as document, not marketing. Sou Fujimoto's project index, OMA's dense archive, Snøhetta's curated portfolio — all written in the same restrained register.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Sou Fujimoto Architects** → cream paper background, structured project-numbered grids (Nº 001 through Nº 200+), deep serif headers, photography flush on the page. The studio book.
|
|
11
|
+
- **OMA** → warm cream + minimal type + dense project archives. Hundreds of entries indexed in mono, scanned in a single sitting. The archive is the architecture.
|
|
12
|
+
- **Snøhetta** → cream + Source Serif + curated project pages. Each project gets a single spread; the spread is the project.
|
|
13
|
+
- **BIG (Bjarke Ingels)** → cream + bold sans labels + structured case-study grids. Sans labels live alongside serif headers without fighting.
|
|
14
|
+
- **Herzog & de Meuron** → deep cream paper, extreme typographic restraint, project-as-document. No marketing language anywhere; the work speaks.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names a brand origin.
|
|
18
|
+
|
|
19
|
+
Surface stack is **cream monograph paper** (background) → **lifted cream card** → **cream paper deeper tiers** (secondary/muted/accent). Depth comes from hairline rules at `foreground / 0.16`, never from fill differentiation, never from drop shadows.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--paper-cream` (Sou Fujimoto monograph cream, alias of background), `--paper-deep` (OMA archive surface), `--ink-serif` (Snøhetta deep cocoa serif ink), `--ink-archive` (Herzog & de Meuron archival shadow, the foreground), `--stone-warm` (BIG warm stone mid-tone for plan drawings and figure backgrounds). Primary is `20 22% 22%` — a deep cocoa-ink serif color, never a saturated brand mark.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Source Serif 4 at 400/600/700. Project headers, pull quotes, Nº-numbered titles. Tracking `-0.015em` — Source Serif at monograph scale wants slight negative tracking to settle.
|
|
25
|
+
- **Body:** Inter at 400/500/600, **16px**, line-height **1.65**. Söhne-feel architectural sans. Case-study density; not magazine prose, not enterprise UI. The OMA/BIG body register.
|
|
26
|
+
- **Mono:** JetBrains Mono at 400/500. Used **only small** — Nº 047 project numbers, location/year/program metadata, credits, archive indices. Never display, never body.
|
|
27
|
+
|
|
28
|
+
Hierarchy is pair-driven: Source Serif 4 display + Inter body, with tracked-uppercase Inter small caps (letter-spacing 0.1em) for eyebrows and labels. H1 uses `clamp(2.5rem, 6vw, 5.25rem)` — monograph scale, not magazine-cinematic. Font features: `"kern", "tnum", "onum", "ss01"`.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-6xl px-6 lg:px-12` — 1152px, case-study grids need horizontal room for indexed lists and photo-grid layouts.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-32 pb-20 lg:pt-48 lg:pb-32` (monograph-spread scale)
|
|
34
|
+
- Default: `py-24 lg:py-40`
|
|
35
|
+
- Tight: `py-16 lg:py-24`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 24 32 48 64 96 128 160 192. The high end (128/160/192) is intentional — monograph whitespace between projects signals that each project gets its own page.
|
|
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 — `--paper-cream` (`38 24% 94%`) and `--ink-archive` (`30 14% 12%`) replace them.
|
|
40
|
+
|
|
41
|
+
The palette is restraint and paper:
|
|
42
|
+
- **Paper-cream** — Sou Fujimoto monograph cream, the printed page surface.
|
|
43
|
+
- **Paper-deep** — OMA archive surface; secondary/muted live here.
|
|
44
|
+
- **Ink-serif** — Snøhetta deep cocoa serif ink; project headers and primary actions.
|
|
45
|
+
- **Ink-archive** — Herzog & de Meuron archival shadow; the foreground, every body line, every divider color base.
|
|
46
|
+
- **Stone-warm** — BIG warm stone mid-tone; used on plan drawings, axonometric figures, and figure backgrounds.
|
|
47
|
+
|
|
48
|
+
Saturation never exceeds what would read in a printed studio monograph under warm gallery light. No accent color exists outside the cocoa-ink primary — the photography is the color.
|
|
49
|
+
|
|
50
|
+
## Radius
|
|
51
|
+
`--radius: 0`. **Sharp corners only.** Pills are disallowed (`pillsAllowed: false`) — pills read consumer-app, not studio book. Architecture is right angles; the page reflects the buildings.
|
|
52
|
+
|
|
53
|
+
## Shadows
|
|
54
|
+
**Minimal.** Two utilities:
|
|
55
|
+
- `.hairline-rule` — `0 1px 0 0 hsl(var(--foreground) / 0.16)`. A 1px structural divider between archive entries — the Herzog & de Meuron hairline.
|
|
56
|
+
- `.hairline-top` — `inset 0 1px 0 0 hsl(var(--foreground) / 0.16)`. Top-side rule for case-study card chrome; pairs with `.hairline-rule` to bracket the entry.
|
|
57
|
+
|
|
58
|
+
No drop shadows. No glows. No floating elevation. The page is paper.
|
|
59
|
+
|
|
60
|
+
## Motion
|
|
61
|
+
Two keyframes, both deliberately slow:
|
|
62
|
+
- **`page-settle`** — opacity + 12px translate, **1200ms**. The standard entrance for case-study cards and project headers. Studio-monograph pacing; the page settles, it does not perform.
|
|
63
|
+
- **`index-rule-draw`** — `scaleX(0) → scaleX(1)` from left origin, **1600ms**, once. Hairline rules between archive entries draw left-to-right on scroll-in — the structural divider being inscribed onto the page.
|
|
64
|
+
|
|
65
|
+
No marquee, no parallax, no chip-bounce, no ken-burns. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — both keyframes collapse to instantaneous final-state under reduced motion.
|
|
66
|
+
|
|
67
|
+
## Component patterns
|
|
68
|
+
- **Buttons:** the default primary CTA is an **uppercase tracked text-link with a hairline underline** (foreground color, Inter 500, letter-spacing 0.12em). Solid-filled rectangular buttons are reserved for **one 'Visit Project' or 'View Studio' CTA per page** — ink-archive bg + paper-cream text, sharp rectangle. No rounded corners, no shadows, no hover lift. The case study earns the visit; the button does not perform.
|
|
69
|
+
- **Cards (case-study entries):** hairline top + hairline bottom rule at `foreground / 0.16`, no fill differentiation from page. **Project number (Nº 047)** in JetBrains Mono small-caps eyebrow, **title** in Source Serif 4 display, **location/year/program** metadata in a mono row beneath. Internal padding `p-8 lg:p-12`. Photography sits flush, no chrome around the image.
|
|
70
|
+
- **Inputs:** border-bottom only (1px `--border`). No full box. Label above in tracked-uppercase Inter small caps (letter-spacing 0.1em). Placeholder italic in muted-foreground. Focus is the cocoa-ink primary ring, 1px.
|
|
71
|
+
- **CTAs:** default CTA is uppercase tracked text-link with hairline underline appearing on hover. The single 'Visit Project' solid-fill button per page is the **one** marketing moment — never repeated, never duplicated in the page footer.
|
|
72
|
+
|
|
73
|
+
## Recommended rich media
|
|
74
|
+
|
|
75
|
+
The page is led by **architectural project photography** — completed buildings in context, dramatic perspective, natural daylight. Supporting imagery: **line-drawing floor plans, axonometric projections, section drawings**, and the occasional material close-up. The monograph rhythm is photo-plan-photo-plan-photo, repeated across Nº-numbered entries.
|
|
76
|
+
|
|
77
|
+
**AI tool recommendations.**
|
|
78
|
+
- **Midjourney / Flux** — *"Sou Fujimoto architectural project photograph, completed building in context, dramatic perspective, natural daylight, 35mm Hasselblad, restrained color"*; for interiors, *"OMA project interior, Herzog & de Meuron material palette, large-format film"*; for material studies, *"close-up cedar grain texture, soft shadow, Snøhetta monograph still life"*.
|
|
79
|
+
- **Recraft** — for line-drawing floor plans, axonometric projections, and section drawings. Single-weight black line on `--paper-cream`, no fill, BIG technical-drawing register.
|
|
80
|
+
- **Hand-drawn plan scans** — when authentic, a scanned hand-drawn plan beats any AI render. The smudge and the eraser-line earn the page.
|
|
81
|
+
|
|
82
|
+
**Aspect ratios.** **4:5 portrait** for project hero photographs (monograph-spread standard), **16:9** for the singular site/context shot at the top of a project page, and **1:1.414 (A-series proportion)** for floor plans and axonometrics — they should read like scanned pages. Never 1:1 social-media square. Never 3:2 casual.
|
|
83
|
+
|
|
84
|
+
**Color in imagery.** Natural light, warm-cool balance, restrained saturation. Concrete grays, cedar browns, paper-cream backgrounds, sky-blues — never neon, never high-key consumer color. Black-and-white architectural photography is welcome and reads as canonical.
|
|
85
|
+
|
|
86
|
+
**Video.** Used sparingly and only for hero project pages — a single 24s slow pan or static long-take over completed work. Never autoplay with sound. Never UI demo footage. ≤8 MB AV1 or H.265.
|
|
87
|
+
|
|
88
|
+
**Captions are mandatory.** Project number, name, location, year, program, client — in JetBrains Mono small caps. *"Nº 047 · Serpentine Pavilion · London · 2013 · Pavilion · Serpentine Galleries"* style attribution always.
|
|
89
|
+
|
|
90
|
+
**Performance.** Hero image ≤200 KB AVIF at 2000w; inline figures ≤100 KB; floor-plan SVGs ≤40 KB. LCP under 2.5s — if it slips, the project photograph is too large, not the framework.
|
|
91
|
+
|
|
92
|
+
**Avoid.** Action photography. Marketing language ("transformative," "innovative"). Decorative ornament. Gradient meshes. Social-media energy. Stock photography. AI-photorealistic renders with uncanny perspective. Glassmorphism. Lens flare. Pseudo-3D building flyovers. Render-style imagery; the work should be **built and photographed**, not visualized.
|
|
93
|
+
|
|
94
|
+
**Accessibility.** Long-form alt-text — describe the building, materials, light, perspective, program as if for a blind reader. *"A four-story cedar-clad pavilion with a glazed double-height atrium, photographed from across an oak-shaded plaza in late summer afternoon."* The bar is monograph editorial, not e-commerce.
|
|
95
|
+
|
|
96
|
+
## Component families
|
|
97
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they are established.
|
|
98
|
+
|
|
99
|
+
## Details
|
|
100
|
+
- **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text — cocoa-ink highlight on cream paper.
|
|
101
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`. Thin and quiet — architectural precision, never decorative.
|
|
102
|
+
- **Scrollbar:** thin.
|
|
103
|
+
|
|
104
|
+
## Exceptions
|
|
105
|
+
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.
|
|
106
|
+
|
|
107
|
+
## Revisions
|
|
108
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const studioArchitect: Direction = {
|
|
4
|
+
name: "studio-architect",
|
|
5
|
+
ethos:
|
|
6
|
+
"Sou Fujimoto numbered projects · OMA dense archive · Snøhetta curated monograph · BIG structured boldness · Herzog & de Meuron extreme restraint",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Sou Fujimoto Architects", trait: "cream + structured grids + serif headers + numbered projects" },
|
|
9
|
+
{ brand: "OMA", trait: "warm cream + minimal type + dense project archives" },
|
|
10
|
+
{ brand: "Snøhetta", trait: "cream + Source Serif + curated project pages" },
|
|
11
|
+
{ brand: "BIG (Bjarke Ingels)", trait: "cream + bold sans + structured case-study grids" },
|
|
12
|
+
{ brand: "Herzog & de Meuron", trait: "deep cream + extreme restraint + project-as-document" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Cream paper studio monograph. Every project is filed as Nº 047, captioned, " +
|
|
16
|
+
"and laid into a structured case-study grid. Deep serif accents, no decoration, " +
|
|
17
|
+
"thin sans labels, mono metadata. Reads like the printed studio book that " +
|
|
18
|
+
"Sou Fujimoto or OMA sends to a developer — quiet, authoritative, archival.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Source Serif 4",
|
|
23
|
+
fallback: ["Source Serif Pro", "Iowan Old Style", "Garamond", "Georgia", "serif"],
|
|
24
|
+
from: "Source Serif 4 — Snøhetta-feel deep monograph serif, project headers and pull quotes",
|
|
25
|
+
googleFont: "Source+Serif+4:wght@400;600;700",
|
|
26
|
+
weights: [400, 600, 700],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Inter",
|
|
30
|
+
fallback: ["Söhne", "Neue Haas Grotesk", "system-ui", "-apple-system", "sans-serif"],
|
|
31
|
+
from: "Inter — Söhne-feel architectural sans body, OMA/BIG project copy register",
|
|
32
|
+
googleFont: "Inter:wght@400;500;600",
|
|
33
|
+
weights: [400, 500, 600],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
38
|
+
from: "JetBrains Mono — Nº 047 project numbers, credits, location/year metadata, archive indices",
|
|
39
|
+
googleFont: "JetBrains+Mono:wght@400;500",
|
|
40
|
+
weights: [400, 500],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.015em", // Source Serif 4 at display size — slight negative tracking settles the serif
|
|
46
|
+
bodyTracking: "0", // Inter body — neutral architectural register
|
|
47
|
+
fontFeatureSettings: '"kern", "tnum", "onum", "ss01"',
|
|
48
|
+
h1ScaleClamp: "clamp(2.5rem, 6vw, 5.25rem)", // monograph-scale, not magazine-cinematic
|
|
49
|
+
bodyBaseSize: "1rem", // 16px — case-study density, not magazine prose
|
|
50
|
+
bodyLineHeight: "1.65", // structured, slightly tighter than editorial
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "38 24% 94%", from: "Sou Fujimoto cream — printed monograph paper stock" },
|
|
55
|
+
foreground: { hsl: "30 14% 12%", from: "Herzog & de Meuron deep ink — heritage architectural shadow" },
|
|
56
|
+
card: { hsl: "38 28% 97%", from: "lifted cream card — one tier brighter than the monograph page" },
|
|
57
|
+
popover: { hsl: "38 28% 97%", from: "same as card; depth from hairline only" },
|
|
58
|
+
primary: { hsl: "20 22% 22%", from: "Snøhetta serif-ink primary — deep cocoa for project headers and actions" },
|
|
59
|
+
primaryForeground: { hsl: "38 24% 94%", from: "cream on cocoa-ink primary" },
|
|
60
|
+
secondary: { hsl: "38 20% 90%", from: "cream paper, one tier deeper — OMA archive surface" },
|
|
61
|
+
secondaryForeground: { hsl: "30 14% 12%", from: "deep ink on cream archive surface" },
|
|
62
|
+
muted: { hsl: "38 20% 90%", from: "same as secondary — differentiation by usage, not by color" },
|
|
63
|
+
mutedForeground: { hsl: "30 10% 38%", from: "BIG project-caption ink — secondary text and metadata" },
|
|
64
|
+
accent: { hsl: "38 22% 87%", from: "cream paper, deepest tier — hover surface only" },
|
|
65
|
+
accentForeground: { hsl: "30 14% 12%", from: "deep ink on cream accent" },
|
|
66
|
+
border: { hsl: "30 10% 78%", from: "Herzog & de Meuron hairline rule — barely visible structural divider" },
|
|
67
|
+
input: { hsl: "30 10% 78%", from: "same as border — single hairline language across the studio book" },
|
|
68
|
+
ring: { hsl: "20 22% 22%", from: "primary cocoa-ink — focus only, never decorative" },
|
|
69
|
+
destructive: { hsl: "8 50% 38%", from: "restrained terracotta alert — printed warning, never screaming red" },
|
|
70
|
+
destructiveForeground: { hsl: "38 24% 94%", from: "cream on terracotta alert" },
|
|
71
|
+
brand: {
|
|
72
|
+
"paper-cream": { hsl: "38 24% 94%", from: "Sou Fujimoto monograph cream — alias of the background" },
|
|
73
|
+
"paper-deep": { hsl: "38 22% 87%", from: "OMA archive surface — third tier in the cream stack" },
|
|
74
|
+
"ink-serif": { hsl: "20 22% 22%", from: "Snøhetta deep serif ink — display headers and primary actions" },
|
|
75
|
+
"ink-archive": { hsl: "30 14% 12%", from: "Herzog & de Meuron archival shadow — the foreground" },
|
|
76
|
+
"stone-warm": { hsl: "32 14% 56%", from: "BIG warm stone mid-tone — used on plan drawings and figure backgrounds" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
spacing: {
|
|
81
|
+
base: 4,
|
|
82
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160, 192], // monograph scale — generous but not editorial-extreme
|
|
83
|
+
containerMax: "max-w-6xl", // 1152px — case-study grids need horizontal room
|
|
84
|
+
containerPadding: "px-6 lg:px-12",
|
|
85
|
+
sectionPadding: {
|
|
86
|
+
hero: "pt-32 pb-20 lg:pt-48 lg:pb-32",
|
|
87
|
+
default: "py-24 lg:py-40",
|
|
88
|
+
tight: "py-16 lg:py-24",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
radius: {
|
|
93
|
+
base: "0", // architectural precision — every corner is right-angled
|
|
94
|
+
pillsAllowed: false, // pills read consumer-app; the studio book is printed
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
shadows: {
|
|
98
|
+
style: "minimal",
|
|
99
|
+
utilities: {
|
|
100
|
+
"hairline-rule":
|
|
101
|
+
"0 1px 0 0 hsl(var(--foreground) / 0.16)", // 1px structural divider at 16% — Herzog & de Meuron hairline
|
|
102
|
+
"hairline-top":
|
|
103
|
+
"inset 0 1px 0 0 hsl(var(--foreground) / 0.16)", // top-side rule for case-study card chrome
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
motion: {
|
|
108
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
109
|
+
durations: {
|
|
110
|
+
reveal: 1200, // monograph pacing — the page settles
|
|
111
|
+
loop: 6000,
|
|
112
|
+
ambient: 24000,
|
|
113
|
+
},
|
|
114
|
+
keyframes: {
|
|
115
|
+
"page-settle": {
|
|
116
|
+
css:
|
|
117
|
+
"from { opacity: 0; transform: translateY(12px); }\n" +
|
|
118
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
119
|
+
defaultDuration: 1200,
|
|
120
|
+
iteration: "once",
|
|
121
|
+
purpose:
|
|
122
|
+
"the standard entrance — 1.2s reveal at studio-monograph pace. Case-study cards and project headers settle into the page; no bounce, no flash.",
|
|
123
|
+
},
|
|
124
|
+
"index-rule-draw": {
|
|
125
|
+
css:
|
|
126
|
+
"from { transform: scaleX(0); transform-origin: left center; }\n" +
|
|
127
|
+
"to { transform: scaleX(1); transform-origin: left center; }",
|
|
128
|
+
defaultDuration: 1600,
|
|
129
|
+
iteration: "once",
|
|
130
|
+
purpose:
|
|
131
|
+
"1.6s left-to-right draw on hairline rules between archive entries — the structural divider being inscribed onto the page.",
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
respectsReducedMotion: true,
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
density: "medium",
|
|
138
|
+
|
|
139
|
+
patterns: {
|
|
140
|
+
button:
|
|
141
|
+
"Primary CTA is an uppercase tracked text-link with a hairline underline (foreground color, letter-spacing 0.12em, Inter 500). " +
|
|
142
|
+
"Solid-filled rectangular buttons are reserved for ONE 'Visit Project' or 'View Studio' CTA per page — ink-archive bg + paper-cream text, sharp rectangle. " +
|
|
143
|
+
"No rounded corners, no shadows, no hover lift. The case study earns the visit, the button does not perform.",
|
|
144
|
+
card:
|
|
145
|
+
"Case-study cards: hairline top + hairline bottom rule at foreground/16, no fill differentiation from page. " +
|
|
146
|
+
"Project number (Nº 047) in JetBrains Mono small-caps eyebrow, title in Source Serif 4 display, " +
|
|
147
|
+
"location/year/program metadata in mono row beneath. Internal padding p-8 lg:p-12. Photography sits flush, no chrome.",
|
|
148
|
+
input:
|
|
149
|
+
"Border-bottom only (1px --border). No full box. Label sits above in tracked-uppercase Inter small caps (letter-spacing 0.1em). " +
|
|
150
|
+
"Placeholder in muted-foreground italic. Focus is the cocoa-ink primary ring, 1px.",
|
|
151
|
+
cta:
|
|
152
|
+
"Default CTA is uppercase tracked text-link with hairline underline appearing on hover. " +
|
|
153
|
+
"The single 'Visit Project' solid-fill button per page uses ink-archive bg + paper-cream text — never repeated, never duplicated in the page footer.",
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
details: {
|
|
157
|
+
selectionBg: "hsl(var(--primary) / 0.18)",
|
|
158
|
+
selectionFg: "hsl(var(--foreground))",
|
|
159
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
160
|
+
scrollbarStyle: "thin",
|
|
161
|
+
},
|
|
162
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Design Direction — Studio-Photographer
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Annie Leibovitz full-bleed portraiture · Platon dark restraint · Dan Winters cream editorial · Magnum photojournalism · Aperture curatorial
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
The work is the website. Photographs sit full-bleed against a cream or near-black canvas with almost no chrome around them — captions sit in small serif italics, navigation collapses to a single line of type. Pacing is deliberate: one frame, then breath, then the next. The interface gets out of the way so the image lands.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Annie Leibovitz (portfolio)** → full-bleed image, minimal nav. The photograph is the page.
|
|
11
|
+
- **Platon (portfolio)** → dark canvas, image-grid restraint. Near-zero chrome.
|
|
12
|
+
- **Dan Winters (portfolio)** → cream paper, image-led editorial pacing. The page is hung, not designed.
|
|
13
|
+
- **Magnum Photos** → cream + Helvetica, photojournalist authority. Captions matter.
|
|
14
|
+
- **Aperture** → cream + serif, curatorial quietude. The publication frames the work.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. No numbered or generic tokens — every color traces to a brand.
|
|
18
|
+
|
|
19
|
+
Surface stack is **cream** (background) → **cream** (card; no differentiation) → **deeper cream** (secondary/muted). Depth comes from the photograph itself, not from fills or shadows. The card token deliberately matches background — cards are not separate surfaces in this language.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--cream`, `--archival-ink`, `--toned-sepia`, `--platinum-shadow`, `--blackout`. Primary is **ink** — restraint is the brand. The `--blackout` token enables an alternate Platon-mode canvas without redefining the system.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Lora (editorial serif, warm and curatorial). Used for project titles and section headers — never larger than `2.5rem`. The headline never competes with the photograph.
|
|
25
|
+
- **Body:** Source Sans Pro (Magnum house-style clean sans). Body base **15px** with **line-height 1.65** — caption-scale by default.
|
|
26
|
+
- **Mono:** IBM Plex Mono. Exposure data, archive call-numbers, frame metadata — contact-sheet texture.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(1.5rem, 2.5vw, 2.5rem)`. This is unusually small for an h1 and is the single most important typographic decision in this direction: **the photograph is the headline.** Font features: `"liga"`, `"kern"`, `"tnum"` for tabular metadata.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-[1800px] px-0 md:px-6` — very wide, with mobile going true full-bleed (image edge-to-edge against the screen). Desktop keeps a thin breathing margin so the cream paper shows.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-0 pb-32 lg:pt-0 lg:pb-48` (zero top — image starts at the viewport edge)
|
|
34
|
+
- Default: `py-32 lg:py-48` (long breath between frames)
|
|
35
|
+
- Tight: `py-16 lg:py-24`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 24 32 48 64 96 128 192 256. The scale tops out high because the pacing between photographs is part of the curation.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens. Pure white and pure black are forbidden — `--cream` and `--archival-ink` replace them; both are warm. Color accents (sepia, oxblood) are print-tones — gallery-derived, never digital-saturated. If a Platon-mode page is needed, swap `--background` to `--blackout` and `--foreground` to `--cream` — the rest of the system follows.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 0`. **Sharp corners only.** Gallery prints have no rounded corners. Pills are disallowed (`pillsAllowed: false`) — they read web-app, not print-gallery. If softness is wanted, it comes from a wide cream margin around the image, not from corner radius.
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
**None.** Photographs never wear shadows — depth is *in* the photograph, not added by CSS. Single utility: `.hairline-under` (1px bottom border in `--border / 0.5`) — the contact-sheet rule that separates caption from image. No drop shadows, no glows, no inner shadows.
|
|
46
|
+
|
|
47
|
+
## Motion
|
|
48
|
+
Three keyframes. Motion is rare and slow.
|
|
49
|
+
- **develop-in** (1600ms, once) — photographs fade in from a slight contrast/brightness lift, like a print emerging in the bath. The signature entrance.
|
|
50
|
+
- **caption-rise** (800ms, once) — caption fades up beneath the photograph after the image has settled. Sequenced, not simultaneous.
|
|
51
|
+
- **slow-ken-burns** (30s, infinite) — used only on hero stills. Almost imperceptible drift, gallery-projection feel.
|
|
52
|
+
|
|
53
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. **No marquee, no parallax, no hover swaps on images** — a photograph is not a button. `prefers-reduced-motion` is honored; with it on, images appear immediately and ken-burns is suspended.
|
|
54
|
+
|
|
55
|
+
## Component patterns
|
|
56
|
+
- **Buttons:** text links only as primary navigation — foreground text with hairline underline that thickens on hover. The single page-level CTA (Contact, Inquire, Newsletter) may use a sharp ink-on-cream filled rect. Never colored, never pill, never gradient.
|
|
57
|
+
- **Cards:** **there is no card.** Images sit directly on the page with caption below in small Lora italic. If grouping is needed, use a single `hairline-under` above the caption — no border, no fill, no shadow. The photograph is the card.
|
|
58
|
+
- **Inputs:** border-bottom only, 1px `--border`. No full box. Label above in mono uppercase, `tracking-[0.12em]` — archive-metadata feel. Focus thickens the underline to 2px (same color). Placeholder is italic Lora.
|
|
59
|
+
- **CTA links:** text-link with hairline underline. The hairline thickens to 2px on hover. Never a chip, never a pill, never colored — restraint is the brand.
|
|
60
|
+
|
|
61
|
+
## Recommended rich media
|
|
62
|
+
This direction *is* a photography portfolio. Lead media is **photography, full-bleed, color-graded as gelatin-silver or Kodak Tri-X for monochrome work, or Portra 800 for color work with deep shadow and warm highlight**. Image quality matters more than any other design decision: every photograph should be the largest reasonable file the bandwidth supports — sharpness is brand. Captions are mandatory and follow museum-label format: *"Portrait, sitter name, location, year. Print medium."* Italic Lora, left-aligned, sits 24–32px below the image.
|
|
63
|
+
|
|
64
|
+
**AI tool recommendations:** generally avoid. This direction presumes real photography — synthetic imagery breaks the entire premise of a working photographer's portfolio. If reference comps are needed during build-out, use **Midjourney** with prompts like *"black and white portrait, Platon studio, single softbox, Hasselblad, medium format, contact-sheet edge"* or *"Annie Leibovitz portrait, magazine cover, dramatic side light, 50mm"* — but the production build must replace every AI placeholder with real work.
|
|
65
|
+
|
|
66
|
+
**Aspect ratios:** 3:2 landscape and 4:5 portrait (35mm and medium-format standards). 1:1 acceptable for contact-sheet grids only. Never 16:9 (cinematic, off-feel for stills). Never irregular crops without a reason.
|
|
67
|
+
|
|
68
|
+
**Video:** rare. If a moving-image piece is in the body of work, it sits in its own page with a poster image and play button — never autoplay, never silent loop. Behind-the-scenes video is acceptable on a process page; the main portfolio is stills.
|
|
69
|
+
|
|
70
|
+
**Performance:** the budget is **inverted** here. Hero image may go up to 400 KB AVIF at 2400w because sharpness sells the portfolio. LCP target is 2.5s; if it slips, optimize the encoder and CDN before reducing image size. A blurry hero defeats the entire direction.
|
|
71
|
+
|
|
72
|
+
**Avoid:** stock photography of any kind, AI photos with uncanny hands or fake film grain, gradient backgrounds, glassmorphic anything, drop shadows on photographs, decorative SVG ornament, lightboxes with heavy chrome (the modal frame must be near-invisible), hover effects that scale or tilt images.
|
|
73
|
+
|
|
74
|
+
**Accessibility:** long-form alt-text mandatory — describe the photograph as a museum docent would. *"A man in a dark suit faces the camera, lit from a single hard source above-left; his hands rest folded on a desk; shadow falls across the right half of his face."* Captions are screen-reader-friendly and not redundant with alt-text. Dark-mode (Platon canvas) is an explicit toggle, not a system-pref auto-switch — the photographer chooses the gallery wall.
|
|
75
|
+
|
|
76
|
+
## Component families
|
|
77
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established.
|
|
78
|
+
|
|
79
|
+
## Details
|
|
80
|
+
- **Selection:** `hsl(var(--toned-sepia) / 0.25)` background, foreground text — gallery-tone selection.
|
|
81
|
+
- **Focus ring:** `1px solid hsl(var(--ring))`. Thin and quiet — ink color, never a hue.
|
|
82
|
+
- **Scrollbar:** none. Scroll the page; the chrome stays out.
|
|
83
|
+
|
|
84
|
+
## Exceptions
|
|
85
|
+
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.
|
|
86
|
+
|
|
87
|
+
## Revisions
|
|
88
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const studioPhotographer: Direction = {
|
|
4
|
+
name: "studio-photographer",
|
|
5
|
+
ethos:
|
|
6
|
+
"Annie Leibovitz full-bleed portraiture · Platon dark restraint · Dan Winters cream editorial · Magnum photojournalism · Aperture curatorial",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Annie Leibovitz (portfolio)", trait: "full-bleed image, minimal nav, the photograph is the page" },
|
|
9
|
+
{ brand: "Platon (portfolio)", trait: "dark canvas, image-grid restraint, near-zero chrome" },
|
|
10
|
+
{ brand: "Dan Winters (portfolio)", trait: "cream paper, image-led editorial pacing" },
|
|
11
|
+
{ brand: "Magnum Photos", trait: "cream + Helvetica, photojournalist authority" },
|
|
12
|
+
{ brand: "Aperture", trait: "cream + serif, curatorial quietude" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"The work is the website. Photographs sit full-bleed against a cream or near-black canvas with almost " +
|
|
16
|
+
"no chrome around them — captions sit in small serif italics, navigation collapses to a single line of type. " +
|
|
17
|
+
"Pacing is deliberate: one frame, then breath, then the next. The interface gets out of the way so the image lands.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Lora",
|
|
22
|
+
fallback: ["Georgia", "Times New Roman", "Times", "serif"],
|
|
23
|
+
from: "Aperture/Dan Winters editorial serif — warm, curatorial, sits quietly under photographs",
|
|
24
|
+
googleFont: "Lora",
|
|
25
|
+
weights: [400, 500, 600],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Source Sans Pro",
|
|
29
|
+
fallback: ["Helvetica Neue", "Helvetica", "Arial", "system-ui", "-apple-system", "sans-serif"],
|
|
30
|
+
from: "Magnum house-style clean sans — photojournalist caption authority, near-Helvetica",
|
|
31
|
+
googleFont: "Source+Sans+Pro",
|
|
32
|
+
weights: [300, 400, 600],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "IBM Plex Mono",
|
|
36
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "frame numbers, exposure data, archive call-numbers — contact-sheet metadata",
|
|
38
|
+
googleFont: "IBM+Plex+Mono",
|
|
39
|
+
weights: [400, 500],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "0.01em", // serif heading sits near zero — captions and titles, not display
|
|
45
|
+
bodyTracking: "0.005em",
|
|
46
|
+
fontFeatureSettings: '"liga", "kern", "tnum"',
|
|
47
|
+
h1ScaleClamp: "clamp(1.5rem, 2.5vw, 2.5rem)", // small — the title NEVER competes with the photograph
|
|
48
|
+
bodyBaseSize: "0.9375rem", // 15px — caption-scale by default
|
|
49
|
+
bodyLineHeight: "1.65",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "38 25% 93%", from: "= brand.cream — Magnum/Aperture matte paper; the gallery wall" },
|
|
54
|
+
foreground: { hsl: "30 8% 14%", from: "= brand.archival-ink — warm photographic black, never pure" },
|
|
55
|
+
card: { hsl: "38 25% 93%", from: "same as background — cards do not differentiate from canvas; image is the depth" },
|
|
56
|
+
popover: { hsl: "38 25% 96%", from: "fractionally lighter cream — popover surface, lifts off paper" },
|
|
57
|
+
primary: { hsl: "30 8% 14%", from: "ink — primary actions wear the foreground; restraint is the brand" },
|
|
58
|
+
primaryForeground: { hsl: "38 25% 93%", from: "cream on ink" },
|
|
59
|
+
secondary: { hsl: "38 18% 86%", from: "deeper cream — quiet panels, contact-sheet ground" },
|
|
60
|
+
secondaryForeground: { hsl: "30 8% 14%", from: "ink on deeper cream" },
|
|
61
|
+
muted: { hsl: "38 15% 82%", from: "deepest cream — metadata strip, footer ground" },
|
|
62
|
+
mutedForeground: { hsl: "30 6% 38%", from: "warm graphite — caption gray, sits below body weight" },
|
|
63
|
+
accent: { hsl: "20 35% 32%", from: "= brand.toned-sepia — print-tone accent, gallery red-brown" },
|
|
64
|
+
accentForeground: { hsl: "38 25% 93%", from: "cream on sepia" },
|
|
65
|
+
border: { hsl: "30 8% 14%", from: "ink — hairline rule under captions, same as foreground" },
|
|
66
|
+
input: { hsl: "30 8% 14%", from: "same as border — single hairline language" },
|
|
67
|
+
ring: { hsl: "30 8% 14%", from: "ink — focus is the foreground, never a color accent" },
|
|
68
|
+
destructive: { hsl: "0 45% 38%", from: "muted oxblood — print-tone red, never alarm-bright" },
|
|
69
|
+
destructiveForeground: { hsl: "38 25% 93%", from: "cream on oxblood" },
|
|
70
|
+
brand: {
|
|
71
|
+
cream: { hsl: "38 25% 93%", from: "= background; the gallery wall, Magnum/Aperture matte paper" },
|
|
72
|
+
"archival-ink": { hsl: "30 8% 14%", from: "= foreground; warm photographic black, never pure" },
|
|
73
|
+
"toned-sepia": { hsl: "20 35% 32%", from: "= accent; gelatin-silver print-tone, gallery red-brown" },
|
|
74
|
+
"platinum-shadow": { hsl: "30 6% 38%", from: "warm graphite, secondary caption tone" },
|
|
75
|
+
"blackout": { hsl: "30 8% 8%", from: "Platon dark mode — gallery-after-hours, alternate canvas" },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
spacing: {
|
|
80
|
+
base: 4,
|
|
81
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256], // generous — pacing matters, photographs need air
|
|
82
|
+
containerMax: "max-w-[1800px]", // very wide — image-first means edge-to-edge is the canvas
|
|
83
|
+
containerPadding: "px-0 md:px-6", // mobile is true full-bleed; desktop gets a thin margin
|
|
84
|
+
sectionPadding: {
|
|
85
|
+
hero: "pt-0 pb-32 lg:pt-0 lg:pb-48",
|
|
86
|
+
default: "py-32 lg:py-48",
|
|
87
|
+
tight: "py-16 lg:py-24",
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
radius: {
|
|
92
|
+
base: "0", // sharp — gallery prints have no rounded corners
|
|
93
|
+
pillsAllowed: false, // pills read web-app; this is print-gallery
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
shadows: {
|
|
97
|
+
style: "none", // never on photographs; depth is the photograph itself
|
|
98
|
+
utilities: {
|
|
99
|
+
"hairline-under":
|
|
100
|
+
"inset 0 -1px 0 0 hsl(var(--border) / 0.5)", // single rule under captions, contact-sheet style
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
motion: {
|
|
105
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
106
|
+
durations: {
|
|
107
|
+
reveal: 1600, // long fade — the photograph develops in
|
|
108
|
+
loop: 6000, // ambient print-tone breathing, used sparingly
|
|
109
|
+
ambient: 30000, // slow ken-burns for select hero stills
|
|
110
|
+
},
|
|
111
|
+
keyframes: {
|
|
112
|
+
"develop-in": {
|
|
113
|
+
css:
|
|
114
|
+
"0% { opacity: 0; filter: contrast(1.1) brightness(1.05); }\n" +
|
|
115
|
+
"100% { opacity: 1; filter: contrast(1) brightness(1); }",
|
|
116
|
+
defaultDuration: 1600,
|
|
117
|
+
iteration: "once",
|
|
118
|
+
purpose: "photograph entrance — develops in like a print emerging in the bath, never a hard pop",
|
|
119
|
+
},
|
|
120
|
+
"caption-rise": {
|
|
121
|
+
css:
|
|
122
|
+
"from { opacity: 0; transform: translateY(8px); }\n" +
|
|
123
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
124
|
+
defaultDuration: 800,
|
|
125
|
+
iteration: "once",
|
|
126
|
+
purpose: "caption fades up below the photograph after the image has settled",
|
|
127
|
+
},
|
|
128
|
+
"slow-ken-burns": {
|
|
129
|
+
css:
|
|
130
|
+
"0% { transform: scale(1.02) translate(0, 0); }\n" +
|
|
131
|
+
"100% { transform: scale(1.08) translate(-1.5%, -0.8%); }",
|
|
132
|
+
defaultDuration: 30000,
|
|
133
|
+
iteration: "infinite",
|
|
134
|
+
purpose: "very slow camera push on hero stills only — almost imperceptible, gallery-projection feel",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
respectsReducedMotion: true,
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
density: "low",
|
|
141
|
+
|
|
142
|
+
patterns: {
|
|
143
|
+
button:
|
|
144
|
+
"Text links only as primary navigation. CTA is foreground text with a hairline underline that thickens on hover. " +
|
|
145
|
+
"Solid-fill button is reserved for a single page-level action (contact, inquire) and is ink-on-cream with sharp corners. " +
|
|
146
|
+
"Never a colored button, never a pill, never gradient.",
|
|
147
|
+
card:
|
|
148
|
+
"There is no card. Images sit directly on the page with the caption below in small serif italic. " +
|
|
149
|
+
"If grouping is needed, use a single hairline rule above the caption — no border, no fill, no shadow.",
|
|
150
|
+
input:
|
|
151
|
+
"Border-bottom only, 1px --border. No box. Label above in mono uppercase tracking 0.12em — archive metadata feel. " +
|
|
152
|
+
"Focus thickens the underline to 2px, same color. Placeholder is italic Lora.",
|
|
153
|
+
cta:
|
|
154
|
+
"Text-link with hairline underline. The single page-level CTA may use a sharp ink-on-cream filled rect. " +
|
|
155
|
+
"Never a chip, never a pill, never colored.",
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
details: {
|
|
159
|
+
selectionBg: "hsl(var(--toned-sepia) / 0.25)",
|
|
160
|
+
selectionFg: "hsl(var(--foreground))",
|
|
161
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
162
|
+
scrollbarStyle: "none",
|
|
163
|
+
},
|
|
164
|
+
};
|
|
Binary file
|