@stylecrib/cli 0.3.1 → 0.3.3
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 +1606 -467
- package/package.json +12 -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/THEME.md +125 -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/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/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -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/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/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/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/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/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/THEME.md +167 -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/THEME.md +144 -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/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/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -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/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/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -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/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/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/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/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/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/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/THEME.md +167 -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/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,88 @@
|
|
|
1
|
+
# Base 06 Raw Concrete — the first flagship theme authored under the v2 arc.
|
|
2
|
+
#
|
|
3
|
+
# Per SURVIVOR_MAPPING.md, Family A (Art & Design Movements) has zero
|
|
4
|
+
# survivor precedent. Raw Concrete is chosen as theme #1 specifically
|
|
5
|
+
# because its signature move is "unstyled honesty" — default link colors,
|
|
6
|
+
# visible borders, exposed structure. That's hard to slop up: the failure
|
|
7
|
+
# mode is over-styling, not under-styling. Good forcing function for a
|
|
8
|
+
# harness whose gates are looking for slop patterns.
|
|
9
|
+
#
|
|
10
|
+
# See site/design-system/BESPOKE_THEME_SYSTEM.md #06 for the source
|
|
11
|
+
# entry. This file expands that one line into the full YAML schema.
|
|
12
|
+
|
|
13
|
+
name: Raw Concrete
|
|
14
|
+
concept: Web brutalism — system defaults weaponized, honest structure, monospace throughout.
|
|
15
|
+
influence: Web brutalism (brutalistwebsites.com era). Kate Moross print, Vitalik's blog, the original Craigslist, arxiv.org paper listings.
|
|
16
|
+
|
|
17
|
+
# v2 metadata — for anchor-compare + regression-scan scoping.
|
|
18
|
+
family: A
|
|
19
|
+
base_number: 6
|
|
20
|
+
|
|
21
|
+
# Where the theme renders live. anchor-compare fetches this URL and
|
|
22
|
+
# passes the rendered screenshot to Director for grading. Anchor-compare
|
|
23
|
+
# is skipped for Family A + G in MVP (no survivor precedent) but the URL
|
|
24
|
+
# is here so the site-integration path is stable across families.
|
|
25
|
+
render_url: http://localhost:5173/themes/raw-concrete
|
|
26
|
+
|
|
27
|
+
surface: web
|
|
28
|
+
|
|
29
|
+
typography:
|
|
30
|
+
display: Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this
|
|
31
|
+
body: same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px
|
|
32
|
+
mono: same as display and body — the whole theme is monospace, one family, three weights
|
|
33
|
+
scale: 1.2 (minor third — deliberately shallow contrast; body and heading feel close)
|
|
34
|
+
|
|
35
|
+
palette:
|
|
36
|
+
bg: "#FFFFFF"
|
|
37
|
+
surface: "#FFFFFF"
|
|
38
|
+
ink: "#000000"
|
|
39
|
+
accent: "#0000EE" # default browser link blue — used as-is, not "our brand blue"
|
|
40
|
+
secondary: "#C0C0C0" # default table border gray
|
|
41
|
+
visited: "#551A8B" # default visited link purple — used as-is
|
|
42
|
+
|
|
43
|
+
density: dense
|
|
44
|
+
|
|
45
|
+
motion: none — no transitions, no scroll reveals, no hover animations. The absence IS the register.
|
|
46
|
+
|
|
47
|
+
signature: |
|
|
48
|
+
Every link is `#0000EE`. Every visited link is `#551A8B`. Every border is a
|
|
49
|
+
`1px solid #C0C0C0` hairline. No border-radius anywhere — every corner is
|
|
50
|
+
90°. No box-shadow ever. Tables render as tables (visible cell borders).
|
|
51
|
+
Buttons look like `<button>` elements pre-CSS. Underlines on links stay.
|
|
52
|
+
The composition is unmistakably "the browser did this, not a designer."
|
|
53
|
+
|
|
54
|
+
imagery: |
|
|
55
|
+
Photographs render at native aspect ratio with a 1px black border and no
|
|
56
|
+
cropping. No filters, no gradients, no vignettes. Illustrations are ASCII
|
|
57
|
+
or single-color line drawings. No 3D, no rendered shapes, no icons beyond
|
|
58
|
+
what unicode provides.
|
|
59
|
+
|
|
60
|
+
best_for:
|
|
61
|
+
- Personal blogs (Vitalik-register)
|
|
62
|
+
- Academic paper listings (arxiv-register)
|
|
63
|
+
- Indie developer portfolios that want to feel earned
|
|
64
|
+
- Manifestos and long-form essays
|
|
65
|
+
- Art projects that trade on refusal-of-polish
|
|
66
|
+
- Craigslist-shaped marketplaces
|
|
67
|
+
|
|
68
|
+
avoid:
|
|
69
|
+
- "Border-radius greater than 0px anywhere on the page"
|
|
70
|
+
- "Any box-shadow — hover, focus, or decorative"
|
|
71
|
+
- "CSS transitions or animations of any kind"
|
|
72
|
+
- "Prettified link colors — links must render as browser-default #0000EE"
|
|
73
|
+
- "Sans-serif or serif faces — monospace only, one family throughout"
|
|
74
|
+
- "Rounded buttons or pill-shaped controls"
|
|
75
|
+
- "Gradient backgrounds or gradient text"
|
|
76
|
+
- "Icon fonts or SVG icons — unicode symbols only (▲ ▼ · × → ←)"
|
|
77
|
+
- "Padding standardization — deliberately inconsistent, exposed structure"
|
|
78
|
+
- "Hover states other than the browser default underline / link-color-change"
|
|
79
|
+
|
|
80
|
+
banned_defaults:
|
|
81
|
+
# Global blocklist (inherited from BESPOKE_THEME_SYSTEM.md's global slop-blocklist)
|
|
82
|
+
- "claude-cream (#F4F1EA + serif + #D97757)"
|
|
83
|
+
- "void+acid (near-black bg + single bright acid-green or vermilion accent)"
|
|
84
|
+
- "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
|
|
85
|
+
- "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
|
|
86
|
+
- "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
|
|
87
|
+
# Base-specific: Raw Concrete has its OWN slop failure mode
|
|
88
|
+
- "brutalism-as-decoration (visible borders + monospace applied as decoration to an otherwise polished SaaS layout — Raw Concrete must refuse polish structurally, not aesthetically)"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Generated from theme.yml. Do not edit by hand — edit theme.yml + re-materialize.
|
|
2
|
+
|
|
3
|
+
export const tokens = {
|
|
4
|
+
slug: "raw-concrete",
|
|
5
|
+
family: "A",
|
|
6
|
+
base: "06",
|
|
7
|
+
palette: {
|
|
8
|
+
"bg": "#FFFFFF",
|
|
9
|
+
"surface": "#FFFFFF",
|
|
10
|
+
"ink": "#000000",
|
|
11
|
+
"accent": "#0000EE",
|
|
12
|
+
"secondary": "#C0C0C0",
|
|
13
|
+
"visited": "#551A8B"
|
|
14
|
+
},
|
|
15
|
+
typography: {
|
|
16
|
+
"display": "Berkeley Mono (paid) or JetBrains Mono (free) — 500 weight for headings, no display face beyond this",
|
|
17
|
+
"body": "same as display — Berkeley Mono or JetBrains Mono, 400 weight, 15px",
|
|
18
|
+
"mono": "same as display and body — the whole theme is monospace, one family, three weights",
|
|
19
|
+
"scale": "1.2 (minor third — deliberately shallow contrast; body and heading feel close)"
|
|
20
|
+
},
|
|
21
|
+
surface: "web",
|
|
22
|
+
density: "dense",
|
|
23
|
+
motion: "none — no transitions, no scroll reveals, no hover animations. The absence IS the register.",
|
|
24
|
+
signature: "Every link is `#0000EE`. Every visited link is `#551A8B`. Every border is a\n`1px solid #C0C0C0` hairline. No border-radius anywhere — every corner is\n90°. No box-shadow ever. Tables render as tables (visible cell borders).\nButtons look like `<button>` elements pre-CSS. Underlines on links stay.\nThe composition is unmistakably \"the browser did this, not a designer.\"\n",
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
export type Tokens = typeof tokens;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Design Direction — Realestate-Luxury
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Sotheby's cream listing-book · Compass deep navy · Modern House serif · The Agency cinematic listings · 1stDibs editorial luxury
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
An eight-figure listing book delivered through the browser. Deep cream backgrounds carry full-bleed property cinematography, high-contrast serif headlines name the address as if it were a chapter title, and a single deep navy accent does all the interaction work. Burgundy is the second luxury accent — focus rings, selection, the occasional vertical rule on a spec table. Reads as a bound real estate catalog, not as a marketplace search experience.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Sotheby's Realty** → cream paper + Cormorant-feel serif + listing-as-portrait photography. The headline IS the address; the photograph IS the listing.
|
|
11
|
+
- **Compass** → deep navy mark + clean sans + structured global search. Navy is the canonical action color; nothing else competes.
|
|
12
|
+
- **Modern House (London)** → cream + serif + architectural full-bleed photography. The page is a quiet frame for the property.
|
|
13
|
+
- **The Agency** → deep cream + restrained nav + cinematic listing reels. Motion is slow ken-burns over stills, never UI animation for its own sake.
|
|
14
|
+
- **1stDibs Estate** → warm cream + editorial serif + provenance copy. Long-form descriptive prose is welcome — the listing has a story.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
|
|
18
|
+
|
|
19
|
+
Surface stack is **deep cream** (background) → **lifted cream** (card) → **deeper cream** (secondary/muted/accent). Depth comes from hairline borders on a warm hairline color, never from drop shadows or fill differentiation. Pure white is forbidden — `--paper`/`--cream` replace it; pure black is forbidden — `--navy-ink` replaces it.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--cream`, `--cream-deep`, `--navy`, `--navy-ink`, `--burgundy`, `--brass`. Primary is deep navy. Burgundy is reserved for focus, selection, and the occasional editorial rule. Brass is reserved for hardware-feeling accents — spec-table rules, divider dots — never as a button face.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Cormorant Garamond (Sotheby's listing-book serif feel). h1–h4. Tracking `-0.012em` — Garalde display wants near-zero, just shy of it.
|
|
25
|
+
- **Body:** Inter (Compass clean sans). Body base **17px** with **line-height 1.65** — catalog-comfortable, never marketplace-dense.
|
|
26
|
+
- **Mono:** JetBrains Mono. Price, lot size, sqft, MLS number, dateline. Always `font-variant-numeric: tabular-nums` so prices align column-wise.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.75rem, 7vw, 6rem)` — the address-as-title scale. Font features: `"liga"`, `"dlig"`, `"tnum"`, `"ss01"` — discretionary ligatures on the display serif, tabular numerics on body and mono.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-6 lg:px-12` — wide enough for full-bleed photography and 21:9 hero stills, with generous outer gutters.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-24 pb-20 lg:pt-32 lg:pb-28`
|
|
34
|
+
- Default: `py-20 lg:py-32`
|
|
35
|
+
- Tight: `py-12 lg:py-20`
|
|
36
|
+
- **Allowed scale values:** 4 8 12 16 20 24 32 40 48 64 96 128. No arbitrary spacing. Density tier is **low** — catalog breathing, never marketplace density.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex in component files. All color via tokens. Opacity via `/N` modifier. White and pure black are forbidden — `--cream` and `--navy-ink` replace them. The palette is intentionally small: cream, navy, burgundy, brass, and the cream-family neutrals. If a designer needs a new color, the answer is almost always a wider use of one of the six brand tokens, not a new one.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
`--radius: 0`. **Sharp corners only.** Pills are disallowed (`pillsAllowed: false`) — they read marketplace. Every listing card, every input, every button has catalog-page corners.
|
|
43
|
+
|
|
44
|
+
## Shadows
|
|
45
|
+
**Minimal.** Two utilities:
|
|
46
|
+
- `.hairline-bottom` — `inset 0 -1px 0 hsl(var(--border))`, the divider rule between listing sections.
|
|
47
|
+
- `.shadow-listing` — `0 1px 2px hsl(var(--navy-ink) / 0.04), 0 8px 24px hsl(var(--navy-ink) / 0.06)`, used only on listing-card hover.
|
|
48
|
+
|
|
49
|
+
No glows. No colored shadows. The cream paper absorbs depth gracefully through hairlines and full-bleed photography.
|
|
50
|
+
|
|
51
|
+
## Motion
|
|
52
|
+
Three keyframes:
|
|
53
|
+
- `fade-rise` — 1000ms opacity + 20px translate, the standard entrance. Slow on purpose: catalog pacing.
|
|
54
|
+
- `ken-burns` — 32000ms infinite scale + translate on hero stills, the architectural camera push.
|
|
55
|
+
- `underline-sweep` — 600ms scaleX 0→1 from left origin, the text-link hover.
|
|
56
|
+
|
|
57
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — wrapped in a media query in every motion utility. **No marquee. No parallax. No UI bounce. No glow pulse.** This direction does not perform.
|
|
58
|
+
|
|
59
|
+
## Component patterns
|
|
60
|
+
- **Buttons:** Text-link CTAs by default, navy color, underline-sweep on hover. Solid-fill is reserved for the single hero action per page — navy bg, cream text, sharp corners. Secondary actions are hairline-outlined ghost buttons in navy. **No pill shapes. No burgundy buttons** — burgundy is focus-only.
|
|
61
|
+
- **Cards:** Sharp 0 corners, hairline border on `--cream` card surface. Internal padding `p-8 lg:p-12`. Listing cards lead with full-width photography (4:5 portrait or 3:2 landscape), address in Cormorant display, spec line in mono. Hover lifts to `shadow-listing`.
|
|
62
|
+
- **Inputs:** Border-bottom only (1px `--border`) on the cream surface. No full box. Label sits above in mono-uppercase, tracking `0.12em`. Focus shifts border to burgundy.
|
|
63
|
+
- **CTA links:** Text-link with underline-sweep for the catalog body. Solid navy rectangle for the single hero CTA (Request Viewing). **Never a pill, never a gradient, never a glow.**
|
|
64
|
+
|
|
65
|
+
## Recommended rich media
|
|
66
|
+
Realestate-Luxury is a photography-driven language. The lead asset on any listing is **environmental architectural photography, color-graded toward Architectural Digest warmth** — golden-hour interior light, cool blue-grey exterior shadow, no HDR halos, no overly-corrected verticals. Real estate hero stills should feel like Helene Binet or Iwan Baan, not like MLS phone photography.
|
|
67
|
+
|
|
68
|
+
Twilight exteriors are the canonical hero treatment — lights on inside, sky still holding cobalt, no people in frame. Interior shots are staged and styled (a single book on the bench, a vase of olive branches, never a family photo). Drone aerials are welcome for estates with land; never use drone footage of suburban subdivisions — it reads marketplace.
|
|
69
|
+
|
|
70
|
+
**AI tool recommendations:** **Midjourney v6+** with prompts like *"architectural photography, twilight exterior, Iwan Baan style, warm interior light, cobalt sky, medium format, 50mm, no people"* for hero stills; *"interior architectural photography, AD magazine, golden hour, Hasselblad, natural light, styled interior"* for interiors. Avoid Midjourney's default "luxury real estate" prompt — it produces glossy, over-saturated McMansion renders. Explicitly prompt for medium format and architectural authorship.
|
|
71
|
+
|
|
72
|
+
**Aspect ratios:** 21:9 cinematic for the hero (full-bleed, the cinematic real-estate frame); 4:5 portrait for vertical environmental shots; 3:2 for inline catalog photography. **Never 1:1 square** — that reads Instagram listing, not catalog.
|
|
73
|
+
|
|
74
|
+
**Video:** A single autoplay-muted hero reel of the property is welcome — slow drone push, slow interior tracking, 18–24 second loop. No music in autoplay. Full property tour videos sit behind a play-button poster image. ≤6 MB per hero loop, H.265 or AV1.
|
|
75
|
+
|
|
76
|
+
**Performance:** hero image ≤180 KB AVIF at 2400w; inline catalog photography ≤120 KB at 1600w. LCP under 2.2s with hero image — if it slips, optimize the image; do not strip the photography.
|
|
77
|
+
|
|
78
|
+
**Avoid:** MLS-style 14-photo carousels (marketplace territory), red SOLD overlays (Redfin territory), price-drop badges (marketplace territory), virtual-tour glasses iconography (gimmicky), AI-generated "luxury homes" (the uncanny-valley grass tells), drone footage of cookie-cutter subdivisions.
|
|
79
|
+
|
|
80
|
+
**Accessibility:** alt-text describes the property as a Sotheby's catalog would — *"Hudson Valley farmhouse with limestone exterior, cedar-shingle roof, and a maple grove descending to the river at golden hour"*. Address + property type alone is not enough.
|
|
81
|
+
|
|
82
|
+
## Component families
|
|
83
|
+
None at install time. Family conventions emerge as the project grows; the Director appends them here as they're established. First likely families: listing-card, spec-table, agent-attribution, neighborhood-frame.
|
|
84
|
+
|
|
85
|
+
## Details
|
|
86
|
+
- **Selection:** `hsl(var(--brand-burgundy) / 0.22)` background, foreground text. Burgundy doing its second-accent job.
|
|
87
|
+
- **Focus ring:** `1px solid hsl(var(--ring))` — thin burgundy. Quiet, considered, never a 2px blue web-app ring.
|
|
88
|
+
- **Scrollbar:** thin.
|
|
89
|
+
|
|
90
|
+
## Exceptions
|
|
91
|
+
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.
|
|
92
|
+
|
|
93
|
+
## Revisions
|
|
94
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const realestateLuxury: Direction = {
|
|
4
|
+
name: "realestate-luxury",
|
|
5
|
+
ethos:
|
|
6
|
+
"Sotheby's cream listing-book · Compass deep navy · Modern House serif · The Agency cinematic listings · 1stDibs editorial luxury",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Sotheby's Realty", trait: "cream paper + Cormorant serif + listing-as-portrait photography" },
|
|
9
|
+
{ brand: "Compass", trait: "deep navy mark + clean sans + structured global search" },
|
|
10
|
+
{ brand: "Modern House (London)", trait: "cream + serif + architectural full-bleed photography" },
|
|
11
|
+
{ brand: "The Agency", trait: "deep cream + restrained nav + cinematic listing reels" },
|
|
12
|
+
{ brand: "1stDibs Estate", trait: "warm cream + editorial serif + curated provenance copy" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Eight-figure listing book in browser form. Deep cream backgrounds carry full-bleed property cinematography, " +
|
|
16
|
+
"high-contrast serif headlines name the address, and a single deep navy or burgundy accent does all the " +
|
|
17
|
+
"interaction work. Reads as bound real estate catalog, not as marketplace search.",
|
|
18
|
+
|
|
19
|
+
fonts: {
|
|
20
|
+
display: {
|
|
21
|
+
family: "Cormorant Garamond",
|
|
22
|
+
fallback: ["Cormorant", "EB Garamond", "Garamond", "Didot", "Georgia", "serif"],
|
|
23
|
+
from: "Sotheby's listing-book serif — high-contrast Garalde with a 1stDibs catalog feel",
|
|
24
|
+
googleFont: "Cormorant+Garamond",
|
|
25
|
+
weights: [400, 500, 600],
|
|
26
|
+
},
|
|
27
|
+
body: {
|
|
28
|
+
family: "Inter",
|
|
29
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "sans-serif"],
|
|
30
|
+
from: "Compass clean sans — neutral body that lets the serif and photography lead",
|
|
31
|
+
googleFont: "Inter",
|
|
32
|
+
weights: [400, 500, 600],
|
|
33
|
+
},
|
|
34
|
+
mono: {
|
|
35
|
+
family: "JetBrains Mono",
|
|
36
|
+
fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
|
|
37
|
+
from: "tabular numerics for price, lot size, sqft — instrument-feel for the spec table",
|
|
38
|
+
googleFont: "JetBrains+Mono",
|
|
39
|
+
weights: [400, 500],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
typography: {
|
|
44
|
+
headingTracking: "-0.012em", // Cormorant tightens slightly — display Garalde wants near-zero, just shy
|
|
45
|
+
bodyTracking: "0",
|
|
46
|
+
fontFeatureSettings: '"liga", "dlig", "tnum", "ss01"',
|
|
47
|
+
h1ScaleClamp: "clamp(2.75rem, 7vw, 6rem)", // address-as-title scale — the headline IS the listing
|
|
48
|
+
bodyBaseSize: "1.0625rem", // 17px — catalog comfort
|
|
49
|
+
bodyLineHeight: "1.65",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
colors: {
|
|
53
|
+
background: { hsl: "38 32% 94%", from: "Sotheby's deep cream — the listing-book paper, never white" },
|
|
54
|
+
foreground: { hsl: "215 38% 14%", from: "Compass deep navy-ink — heading + body, never pure black" },
|
|
55
|
+
card: { hsl: "38 28% 97%", from: "lifted cream — listing card surface, one tone above paper" },
|
|
56
|
+
popover: { hsl: "38 28% 97%", from: "same family as card — depth via hairline, not fill" },
|
|
57
|
+
primary: { hsl: "215 48% 22%", from: "Compass deep navy — the canonical action color across the listing book" },
|
|
58
|
+
primaryForeground: { hsl: "38 32% 94%", from: "cream on deep navy" },
|
|
59
|
+
secondary: { hsl: "38 22% 88%", from: "deeper cream tier — secondary panels and quiet surfaces" },
|
|
60
|
+
secondaryForeground: { hsl: "215 38% 14%", from: "navy-ink on deeper cream" },
|
|
61
|
+
muted: { hsl: "38 18% 86%", from: "muted cream — listing meta strips, dateline backgrounds" },
|
|
62
|
+
mutedForeground: { hsl: "215 18% 36%", from: "Modern House soft navy — secondary copy on cream" },
|
|
63
|
+
accent: { hsl: "38 24% 90%", from: "hover cream — one tier under secondary" },
|
|
64
|
+
accentForeground: { hsl: "215 38% 14%", from: "navy-ink on accent cream" },
|
|
65
|
+
border: { hsl: "38 18% 78%", from: "warm hairline — visible on cream but never assertive" },
|
|
66
|
+
input: { hsl: "38 18% 78%", from: "same as border — single hairline language" },
|
|
67
|
+
ring: { hsl: "350 48% 32%", from: "deep burgundy — the luxury second-accent, used for focus only" },
|
|
68
|
+
destructive: { hsl: "8 62% 42%", from: "deep terracotta — alert tone that respects the cream palette" },
|
|
69
|
+
destructiveForeground: { hsl: "38 32% 94%", from: "cream on terracotta" },
|
|
70
|
+
brand: {
|
|
71
|
+
cream: { hsl: "38 32% 94%", from: "= background; the listing-book paper itself" },
|
|
72
|
+
"cream-deep": { hsl: "38 22% 88%", from: "= secondary; the deeper cream for panel surfaces" },
|
|
73
|
+
navy: { hsl: "215 48% 22%", from: "= primary; Compass deep navy" },
|
|
74
|
+
"navy-ink": { hsl: "215 38% 14%", from: "= foreground; the deepest navy, used as ink" },
|
|
75
|
+
burgundy: { hsl: "350 48% 32%", from: "Modern House / Sotheby's deep burgundy — second luxury accent" },
|
|
76
|
+
brass: { hsl: "38 42% 52%", from: "antique brass — fitting-hardware accent, rule lines on spec tables" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
spacing: {
|
|
81
|
+
base: 4,
|
|
82
|
+
scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 96, 128],
|
|
83
|
+
containerMax: "max-w-7xl", // full-bleed listing photography needs the width
|
|
84
|
+
containerPadding: "px-6 lg:px-12",
|
|
85
|
+
sectionPadding: {
|
|
86
|
+
hero: "pt-24 pb-20 lg:pt-32 lg:pb-28",
|
|
87
|
+
default: "py-20 lg:py-32",
|
|
88
|
+
tight: "py-12 lg:py-20",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
radius: {
|
|
93
|
+
base: "0", // sharp — catalog-page corners, never rounded
|
|
94
|
+
pillsAllowed: false, // pills read marketplace, not listing book
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
shadows: {
|
|
98
|
+
style: "minimal",
|
|
99
|
+
utilities: {
|
|
100
|
+
"hairline-bottom":
|
|
101
|
+
"inset 0 -1px 0 hsl(var(--border))",
|
|
102
|
+
"shadow-listing":
|
|
103
|
+
"0 1px 2px hsl(215 38% 14% / 0.04), 0 8px 24px hsl(215 38% 14% / 0.06)",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
motion: {
|
|
108
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
109
|
+
durations: {
|
|
110
|
+
reveal: 1000, // slow on purpose — catalog pacing
|
|
111
|
+
loop: 2400,
|
|
112
|
+
ambient: 32000, // ken-burns on hero stills
|
|
113
|
+
},
|
|
114
|
+
keyframes: {
|
|
115
|
+
"fade-rise": {
|
|
116
|
+
css:
|
|
117
|
+
"from { opacity: 0; transform: translateY(20px); }\n" +
|
|
118
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
119
|
+
defaultDuration: 1000,
|
|
120
|
+
iteration: "once",
|
|
121
|
+
purpose: "section entrance — listing reveal, deliberately unhurried",
|
|
122
|
+
},
|
|
123
|
+
"ken-burns": {
|
|
124
|
+
css:
|
|
125
|
+
"0% { transform: scale(1.04) translate(0, 0); }\n" +
|
|
126
|
+
"100% { transform: scale(1.12) translate(-1.5%, -1%); }",
|
|
127
|
+
defaultDuration: 32000,
|
|
128
|
+
iteration: "infinite",
|
|
129
|
+
purpose: "hero listing photography drift — architectural camera push",
|
|
130
|
+
},
|
|
131
|
+
"underline-sweep": {
|
|
132
|
+
css:
|
|
133
|
+
"from { transform: scaleX(0); transform-origin: left; }\n" +
|
|
134
|
+
"to { transform: scaleX(1); transform-origin: left; }",
|
|
135
|
+
defaultDuration: 600,
|
|
136
|
+
iteration: "once",
|
|
137
|
+
purpose: "text-link hover — underline wipes in left-to-right",
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
respectsReducedMotion: true,
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
density: "low", // catalog breathing; never marketplace density
|
|
144
|
+
|
|
145
|
+
patterns: {
|
|
146
|
+
button:
|
|
147
|
+
"Text-link CTAs by default — navy color, underline-sweep on hover. " +
|
|
148
|
+
"Solid-fill is reserved for the single hero action per page (navy bg, cream text, sharp corners). " +
|
|
149
|
+
"Secondary actions are hairline-outlined ghost buttons in navy. No pill shapes. " +
|
|
150
|
+
"Burgundy is focus-ring only, never a button face.",
|
|
151
|
+
card:
|
|
152
|
+
"Sharp corners. Hairline border (--border) on a card-cream surface. Internal padding p-8 lg:p-12. " +
|
|
153
|
+
"Listing cards lead with full-width photography (4:5 portrait or 3:2 landscape), " +
|
|
154
|
+
"address in Cormorant display, spec line in mono. Hover lifts to shadow-listing.",
|
|
155
|
+
input:
|
|
156
|
+
"Border-bottom only (1px --border) on cream. No full box. " +
|
|
157
|
+
"Label above in mono-uppercase tracking 0.12em. Focus shifts border to burgundy.",
|
|
158
|
+
cta:
|
|
159
|
+
"Text-link with underline-sweep for the catalog. Solid navy rectangle for the single hero CTA (Request Viewing). " +
|
|
160
|
+
"Never a pill, never a gradient, never a glow.",
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
details: {
|
|
164
|
+
selectionBg: "hsl(var(--brand-burgundy) / 0.22)",
|
|
165
|
+
selectionFg: "hsl(var(--foreground))",
|
|
166
|
+
focusRing: "1px solid hsl(var(--ring))",
|
|
167
|
+
scrollbarStyle: "thin",
|
|
168
|
+
},
|
|
169
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Design Direction — Realestate-Marketplace
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Zillow listing-card grid · Redfin signal red · Apartments.com warm orange · Trulia friendly map · Streeteasy dense tabular
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Built for browsing two hundred listings on a Saturday. A warm-white canvas carries a friendly geometric sans, dense photo-card grids, and a single signal-color CTA. The map and the list co-exist; filters are first-class chrome, not an afterthought. Reads as a marketplace tool, not as a catalog or a brochure.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Zillow** → deep blue brand mark + warm white + listing-card grid. Blue carries everything: search, save, primary CTAs, focus ring.
|
|
11
|
+
- **Redfin** → signal red + soft cards + structured filter chrome. Red is a status color (Sold, Off-market, urgent badges) — never a primary CTA.
|
|
12
|
+
- **Apartments.com** → warm orange accent + density + photo-card volume. Orange is the New / Hot listing badge; one accent color among several signals.
|
|
13
|
+
- **Trulia** → sand surface + friendly map UI + neighborhood scoring. The map is a first-class surface, not a modal.
|
|
14
|
+
- **Streeteasy** → NYC-specific dense tabular listings. Density is a feature; tabular numerics are non-negotiable on price columns.
|
|
15
|
+
|
|
16
|
+
## Tokens
|
|
17
|
+
All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a brand it traces to.
|
|
18
|
+
|
|
19
|
+
Surface stack is **warm white** (background) → **pure white** (card/popover) → **cool gray** (secondary/muted/accent). Depth comes from soft card shadows and hairline borders. The filter bar uses `shadow-filterbar` — a single hairline + soft drop, the signature marketplace chrome.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--blue-zillow`, `--blue-deep`, `--red-redfin`, `--orange-apt`, `--green-saved`, `--sand-warm`, `--map-water`. Primary is `--blue-zillow`. Status colors (red, orange, green) are reserved for status chips and badges — never primary CTAs.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Manrope (Zillow-adjacent geometric sans). h1–h4 and listing-card titles. Tracking `-0.02em` — confident, slightly tight.
|
|
25
|
+
- **Body:** Inter (Redfin/Streeteasy clean sans). Body base **15px** with **line-height 1.5** — marketplace density.
|
|
26
|
+
- **Mono:** JetBrains Mono. Price, sqft, bed/bath count, lot size, MLS, last-updated date. Tabular numerics always on.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2rem, 4.5vw, 3.25rem)` — restrained on purpose. The H1 is rarely the show on a marketplace page; the listings are. Font features: `"cv11"`, `"ss01"`, `"tnum"` — tabular numerics enabled site-wide so prices align in the result grid without per-component overrides.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-screen-2xl px-4 lg:px-6` — marketplace lives full-width for the map/list split. Gutters are tighter than catalog directions because content is the point.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-12 pb-10 lg:pt-16 lg:pb-12` (modest — the search bar is the hero, not a marketing slab)
|
|
34
|
+
- Default: `py-10 lg:py-16`
|
|
35
|
+
- Tight: `py-6 lg:py-10`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 28 32 40 48 64 80. High-density scale with many small steps — marketplace UI needs the granularity.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex in component files. All color via tokens. Opacity via `/N` modifier. The marketplace palette intentionally carries multiple signal colors — red, orange, green, blue — but each has a strict role:
|
|
40
|
+
|
|
41
|
+
- **Blue** = primary action, focus, brand. The catch-all.
|
|
42
|
+
- **Red** = status only (Sold, Off-market, Removed, urgent alerts). Never a CTA.
|
|
43
|
+
- **Orange** = badge accent (New, Hot, Open House). Never body chrome.
|
|
44
|
+
- **Green** = confirmation only (Saved, Favorited, Verified). Never a CTA.
|
|
45
|
+
|
|
46
|
+
Pure white is allowed (it's the card surface — marketplace cards must lift off the canvas). Pure black is forbidden — `--foreground` is a deep blue-ink.
|
|
47
|
+
|
|
48
|
+
## Radius
|
|
49
|
+
`--radius: 0.5rem` (8px). Softer than utility/dense, sharper than soft-modern. Pills are allowed (`pillsAllowed: true`) — filter chips, status badges, and category pills are part of the language. Pill shape encodes data (it's a filter / badge / chip), not chrome.
|
|
50
|
+
|
|
51
|
+
## Shadows
|
|
52
|
+
**Soft.** Four utilities:
|
|
53
|
+
- `.shadow-card` — base listing-card lift: `0 1px 2px hsl(var(--navy-ink) / 0.05), 0 2px 6px hsl(var(--navy-ink) / 0.04)`.
|
|
54
|
+
- `.shadow-card-hover` — listing-card hover lift.
|
|
55
|
+
- `.shadow-mappin` — `0 2px 4px hsl(var(--navy-ink) / 0.18), 0 0 0 2px hsl(0 0% 100%)`, the white halo + drop shadow that defines a map pin.
|
|
56
|
+
- `.shadow-filterbar` — `0 1px 0 hsl(var(--border)), 0 2px 8px hsl(var(--navy-ink) / 0.04)`, the sticky filter bar separation.
|
|
57
|
+
|
|
58
|
+
No glows. No colored shadows.
|
|
59
|
+
|
|
60
|
+
## Motion
|
|
61
|
+
Four keyframes:
|
|
62
|
+
- `fade-rise` — 240ms, the standard listing/result entrance. Marketplace must feel responsive; 1000ms is unacceptable here.
|
|
63
|
+
- `card-lift` — 180ms hover lift on listing cards. Confirms targetability on a dense grid.
|
|
64
|
+
- `pin-drop` — 320ms map-pin reveal with a slight overshoot. Feedback when a result lands on the map.
|
|
65
|
+
- `skeleton-shimmer` — 1600ms infinite gradient sweep on loading skeletons. Listings stream in; the skeleton tells the user to keep scrolling.
|
|
66
|
+
|
|
67
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored. **No ambient ken-burns — this is a tool, not a film.**
|
|
68
|
+
|
|
69
|
+
## Component patterns
|
|
70
|
+
- **Buttons:** Solid-fill primary in `--primary` (Zillow blue), white text, 0.5rem radius, `shadow-card`. Secondary is white ghost with `--border` outline. Tertiary is text-link in primary. Pills are allowed for filter chips and status badges (Sold/New/Open House) — pill shape is data semantics, not chrome.
|
|
71
|
+
- **Cards:** Listing card: rounded-lg, bg-card (pure white), `shadow-card`, no border. Photo-first (4:3 landscape, full-bleed at top). Below: price in display 700 weight, address in body, mono spec line (`3 bd · 2 ba · 1,840 sqft`). Hover applies `card-lift`. Filter and panel cards use a hairline border with no shadow.
|
|
72
|
+
- **Inputs:** Full rounded-lg box with 1px `--input` border, bg-card. Focus = 2px ring in primary at 40% opacity. Search input gets a leading magnifier icon. Label sits small above; helper text below in muted-foreground.
|
|
73
|
+
- **CTA links:** Solid-fill primary button is the canonical CTA. Save (heart) and Tour (calendar) buttons sit as filled-icon or icon+label variants. Sold / Off-market badges use destructive red — **never as a CTA, always as a status pill**.
|
|
74
|
+
|
|
75
|
+
## Recommended rich media
|
|
76
|
+
Realestate-Marketplace is photography-volume-driven, not photography-prestige-driven. Listings carry 8–24 photos each, optimized for grid thumbnails and a full-screen lightbox. The first photo is the canonical hero — usually a 4:3 exterior or wide living-room shot. **Photography quality matches the listing's price tier** — a $300k starter home with iPhone photos sits comfortably in this direction; a $3M home pushes toward Realestate-Luxury territory.
|
|
77
|
+
|
|
78
|
+
Map screenshots and floor plans are first-class media. Floor plans render best at 4:3 landscape with the listing's price overlaid as a chip in the top-right. Map pin tiles use `--map-water` as the basemap water; pins use primary blue with the white halo from `shadow-mappin`.
|
|
79
|
+
|
|
80
|
+
Neighborhood images sit in a separate tier — `--sand-warm` panels with a 16:9 photo, a walk-score block, and three nearby category icons (coffee, transit, schools).
|
|
81
|
+
|
|
82
|
+
**AI tool recommendations:** Marketplace listing photography is rarely AI-generated — real photos win on trust. For **neighborhood imagery and category illustrations**, **Midjourney v6+** with prompts like *"editorial neighborhood photography, warm afternoon light, residential street, no people, 35mm, natural color"* works for filler. For floor plans and icons, **Recraft** with *"isometric floor plan, line drawing, restrained color, no shadows"* and a small icon set in **Lucide** (already a common marketplace standard).
|
|
83
|
+
|
|
84
|
+
**Aspect ratios:** 4:3 landscape for listing photography (the marketplace standard, tessellates cleanly in a grid); 16:9 for neighborhood hero photography; 1:1 for thumbnails and avatars. **Avoid 21:9 cinematic** — that reads luxury catalog, off-feel here.
|
|
85
|
+
|
|
86
|
+
**Video:** Listing tour videos sit behind a play-button poster image in the photo gallery. Autoplay is forbidden — the user is scanning 200 results. ≤4 MB per tour video, H.265 or AV1, 30s typical length.
|
|
87
|
+
|
|
88
|
+
**Performance:** listing thumbnail ≤30 KB AVIF at 800w; lightbox image ≤120 KB AVIF at 2000w. Critical: the grid must lazy-load below the fold. LCP under 1.8s with the search bar + first row of cards rendered.
|
|
89
|
+
|
|
90
|
+
**Avoid:** twilight cinematic real-estate hero stills (luxury territory), serif typography on listing cards (luxury territory), parallax map effects (gimmicky and bad on mobile), animated price-drop badges (cheap), AI-generated listing photos (illegal in many jurisdictions and a trust failure regardless).
|
|
91
|
+
|
|
92
|
+
**Accessibility:** alt-text on listing photos must include property type + photo subject — *"Two-story craftsman home, front exterior with attached garage"* not *"Image: 123 Oak St"*. Map pins must have a text alternative (price + address); the map is not a substitute for a list.
|
|
93
|
+
|
|
94
|
+
## Component families
|
|
95
|
+
None at install time. Likely first families: listing-card (grid + lightbox), filter-pill, map-pin, neighborhood-tile, save-button.
|
|
96
|
+
|
|
97
|
+
## Details
|
|
98
|
+
- **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text — the standard blue selection.
|
|
99
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — visible, web-app-standard, accessibility-first.
|
|
100
|
+
- **Scrollbar:** thin.
|
|
101
|
+
|
|
102
|
+
## Exceptions
|
|
103
|
+
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.
|
|
104
|
+
|
|
105
|
+
## Revisions
|
|
106
|
+
- Initial direction, generated at install time.
|