@stylecrib/cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -9
- package/agents/MANIFEST.yml +136 -0
- package/agents/README.md +75 -0
- package/agents/art-director.md +168 -0
- package/agents/audacity-director.md +109 -0
- package/agents/brand-identity.md +179 -0
- package/agents/brand-precedent.md +119 -0
- package/agents/brief-enforcer.md +136 -0
- package/agents/component-qa.md +167 -0
- package/agents/cto.md +49 -0
- package/agents/design-director.md +184 -0
- package/agents/design-systems-engineer.md +162 -0
- package/agents/direction-curator.md +133 -0
- package/agents/homogeneity-detector.md +104 -0
- package/agents/logo-designer.md +240 -0
- package/agents/marketing-designer.md +156 -0
- package/agents/media-curator.md +165 -0
- package/agents/motion-engineer.md +270 -0
- package/agents/qa-conductor.md +143 -0
- package/agents/render-qa.md +133 -0
- package/agents/upgrade-simulator.md +123 -0
- package/agents/vp-architecture.md +49 -0
- package/agents/vp-engineering.md +49 -0
- package/dist/index.js +1577 -463
- package/package.json +11 -4
- package/themes/README.md +70 -0
- package/themes/acrylic-soft/THEME.md +142 -0
- package/themes/acrylic-soft/tokens.ts +180 -0
- package/themes/agency-creative/THEME.md +91 -0
- package/themes/agency-creative/tokens.ts +202 -0
- package/themes/agency-portfolio/THEME.md +109 -0
- package/themes/agency-portfolio/tokens.ts +159 -0
- package/themes/ai-startup/THEME.md +95 -0
- package/themes/ai-startup/tokens.ts +162 -0
- package/themes/airline-modern/THEME.md +104 -0
- package/themes/airline-modern/tokens.ts +179 -0
- package/themes/arc-stack/.anchor-render.png +0 -0
- package/themes/arc-stack/THEME.md +125 -0
- package/themes/arc-stack/audit.log.jsonl +6 -0
- package/themes/arc-stack/dismissals.jsonl +3 -0
- package/themes/arc-stack/tailwind.snippet.ts +17 -0
- package/themes/arc-stack/theme.yml +153 -0
- package/themes/arc-stack/tokens.ts +29 -0
- package/themes/architectural/THEME.md +102 -0
- package/themes/architectural/tokens.ts +159 -0
- package/themes/atelier-radiance/THEME.md +93 -0
- package/themes/atelier-radiance/audit.log.jsonl +1 -0
- package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
- package/themes/atelier-radiance/theme.yml +130 -0
- package/themes/atelier-radiance/tokens.ts +29 -0
- package/themes/automotive-ev/THEME.md +87 -0
- package/themes/automotive-ev/tokens.ts +183 -0
- package/themes/automotive-luxury/THEME.md +88 -0
- package/themes/automotive-luxury/tokens.ts +175 -0
- package/themes/baby-modern/THEME.md +79 -0
- package/themes/baby-modern/tokens.ts +184 -0
- package/themes/banking-gravity/THEME.md +171 -0
- package/themes/banking-gravity/tokens.ts +169 -0
- package/themes/beauty-clean/THEME.md +92 -0
- package/themes/beauty-clean/tokens.ts +176 -0
- package/themes/beauty-luxury/THEME.md +96 -0
- package/themes/beauty-luxury/tokens.ts +178 -0
- package/themes/bento-modular/.anchor-render.png +0 -0
- package/themes/bento-modular/BUILD_BRIEF.md +171 -0
- package/themes/bento-modular/THEME.md +80 -0
- package/themes/bento-modular/audit.log.jsonl +3 -0
- package/themes/bento-modular/dismissals.jsonl +1 -0
- package/themes/bento-modular/tailwind.snippet.ts +17 -0
- package/themes/bento-modular/theme.yml +83 -0
- package/themes/bento-modular/tokens.ts +27 -0
- package/themes/bookstore-indie/THEME.md +78 -0
- package/themes/bookstore-indie/tokens.ts +147 -0
- package/themes/brutalist/THEME.md +96 -0
- package/themes/brutalist/tokens.ts +151 -0
- package/themes/business-tiles/THEME.md +141 -0
- package/themes/business-tiles/tokens.ts +178 -0
- package/themes/cabana-poster/THEME.md +158 -0
- package/themes/cabana-poster/audit.log.jsonl +1 -0
- package/themes/cabana-poster/tailwind.snippet.ts +16 -0
- package/themes/cabana-poster/theme.yml +221 -0
- package/themes/cabana-poster/tokens.ts +34 -0
- package/themes/case-panel/THEME.md +126 -0
- package/themes/case-panel/audit.log.jsonl +2 -0
- package/themes/case-panel/tailwind.snippet.ts +15 -0
- package/themes/case-panel/theme.yml +153 -0
- package/themes/case-panel/tokens.ts +28 -0
- package/themes/cinematic-dark/THEME.md +97 -0
- package/themes/cinematic-dark/tokens.ts +195 -0
- package/themes/classic-car/THEME.md +86 -0
- package/themes/classic-car/tokens.ts +173 -0
- package/themes/cloud-friendly/THEME.md +152 -0
- package/themes/cloud-friendly/tokens.ts +181 -0
- package/themes/community-niche/THEME.md +102 -0
- package/themes/community-niche/tokens.ts +177 -0
- package/themes/corporate-grid/THEME.md +154 -0
- package/themes/corporate-grid/tokens.ts +182 -0
- package/themes/couture-luxury/THEME.md +85 -0
- package/themes/couture-luxury/tokens.ts +146 -0
- package/themes/creator-social/THEME.md +131 -0
- package/themes/creator-social/tokens.ts +249 -0
- package/themes/crypto-onchain/THEME.md +100 -0
- package/themes/crypto-onchain/tokens.ts +207 -0
- package/themes/cycling-brand/THEME.md +78 -0
- package/themes/cycling-brand/tokens.ts +185 -0
- package/themes/dating-friendly/THEME.md +102 -0
- package/themes/dating-friendly/tokens.ts +178 -0
- package/themes/dense-utility/THEME.md +85 -0
- package/themes/dense-utility/tokens.ts +155 -0
- package/themes/devtool-cli/THEME.md +100 -0
- package/themes/devtool-cli/tokens.ts +195 -0
- package/themes/devtool-docs/THEME.md +105 -0
- package/themes/devtool-docs/tokens.ts +177 -0
- package/themes/editorial/THEME.md +129 -0
- package/themes/editorial/audit.log.jsonl +2 -0
- package/themes/editorial/tailwind.snippet.ts +15 -0
- package/themes/editorial/theme.yml +173 -0
- package/themes/editorial/tokens.ts +29 -0
- package/themes/education-formal/THEME.md +154 -0
- package/themes/education-formal/audit.log.jsonl +1 -0
- package/themes/education-formal/tailwind.snippet.ts +15 -0
- package/themes/education-formal/theme.yml +186 -0
- package/themes/education-formal/tokens.ts +29 -0
- package/themes/education-warm/THEME.md +91 -0
- package/themes/education-warm/tokens.ts +185 -0
- package/themes/ember-poster/README.md +79 -0
- package/themes/ember-poster/THEME.md +101 -0
- package/themes/ember-poster/audit.log.jsonl +17 -0
- package/themes/ember-poster/package.json +34 -0
- package/themes/ember-poster/tailwind.snippet.ts +17 -0
- package/themes/ember-poster/theme.yml +109 -0
- package/themes/ember-poster/tokens.ts +27 -0
- package/themes/enterprise-cloud/THEME.md +139 -0
- package/themes/enterprise-cloud/tokens.ts +179 -0
- package/themes/enterprise-tech/.anchor-render.png +0 -0
- package/themes/enterprise-tech/THEME.md +167 -0
- package/themes/enterprise-tech/audit.log.jsonl +1 -0
- package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
- package/themes/enterprise-tech/theme.yml +202 -0
- package/themes/enterprise-tech/tokens.ts +29 -0
- package/themes/ev-charging/THEME.md +94 -0
- package/themes/ev-charging/tokens.ts +185 -0
- package/themes/farm-direct/THEME.md +92 -0
- package/themes/farm-direct/tokens.ts +180 -0
- package/themes/fintech-card/THEME.md +96 -0
- package/themes/fintech-card/tokens.ts +191 -0
- package/themes/fintech-trust/THEME.md +94 -0
- package/themes/fintech-trust/tokens.ts +192 -0
- package/themes/food-blog/THEME.md +98 -0
- package/themes/food-blog/tokens.ts +183 -0
- package/themes/forum-classic/THEME.md +100 -0
- package/themes/forum-classic/tokens.ts +168 -0
- package/themes/fresh-plate/.anchor-render.png +0 -0
- package/themes/fresh-plate/THEME.md +144 -0
- package/themes/fresh-plate/audit.log.jsonl +2 -0
- package/themes/fresh-plate/dismissals.jsonl +3 -0
- package/themes/fresh-plate/tailwind.snippet.ts +16 -0
- package/themes/fresh-plate/theme.yml +189 -0
- package/themes/fresh-plate/tokens.ts +30 -0
- package/themes/furniture-modern/THEME.md +94 -0
- package/themes/furniture-modern/tokens.ts +176 -0
- package/themes/gaming-esports/THEME.md +146 -0
- package/themes/gaming-esports/tokens.ts +199 -0
- package/themes/gaming-streamer/THEME.md +139 -0
- package/themes/gaming-streamer/tokens.ts +201 -0
- package/themes/glassmorphic-modern/THEME.md +119 -0
- package/themes/glassmorphic-modern/tokens.ts +174 -0
- package/themes/government-civic/THEME.md +138 -0
- package/themes/government-civic/tokens.ts +164 -0
- package/themes/gym-chain/THEME.md +79 -0
- package/themes/gym-chain/tokens.ts +196 -0
- package/themes/healthcare-bright/THEME.md +95 -0
- package/themes/healthcare-bright/tokens.ts +184 -0
- package/themes/home-decor/THEME.md +94 -0
- package/themes/home-decor/tokens.ts +177 -0
- package/themes/hotel-boutique/THEME.md +110 -0
- package/themes/hotel-boutique/tokens.ts +179 -0
- package/themes/hyperminimal-mono/THEME.md +91 -0
- package/themes/hyperminimal-mono/tokens.ts +150 -0
- package/themes/indie-art-game/THEME.md +107 -0
- package/themes/indie-art-game/tokens.ts +216 -0
- package/themes/insurance-legacy/THEME.md +101 -0
- package/themes/insurance-legacy/tokens.ts +182 -0
- package/themes/insurance-modern/THEME.md +103 -0
- package/themes/insurance-modern/tokens.ts +192 -0
- package/themes/kaiju-reveal/THEME.md +97 -0
- package/themes/kaiju-reveal/tokens.ts +185 -0
- package/themes/kinetic-data/THEME.md +172 -0
- package/themes/kinetic-data/audit.log.jsonl +1 -0
- package/themes/kinetic-data/tailwind.snippet.ts +16 -0
- package/themes/kinetic-data/theme.yml +207 -0
- package/themes/kinetic-data/tokens.ts +30 -0
- package/themes/kinetic-headline/.anchor-render.png +0 -0
- package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
- package/themes/kinetic-headline/THEME.md +78 -0
- package/themes/kinetic-headline/audit.log.jsonl +4 -0
- package/themes/kinetic-headline/dismissals.jsonl +1 -0
- package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
- package/themes/kinetic-headline/theme.yml +81 -0
- package/themes/kinetic-headline/tokens.ts +26 -0
- package/themes/law-firm/THEME.md +108 -0
- package/themes/law-firm/tokens.ts +158 -0
- package/themes/lawtech-modern/THEME.md +107 -0
- package/themes/lawtech-modern/tokens.ts +192 -0
- package/themes/linkedin-pro/THEME.md +102 -0
- package/themes/linkedin-pro/tokens.ts +174 -0
- package/themes/logistics-modern/THEME.md +94 -0
- package/themes/logistics-modern/tokens.ts +187 -0
- package/themes/magazine-glossy/THEME.md +74 -0
- package/themes/magazine-glossy/tokens.ts +158 -0
- package/themes/marker-mag/THEME.md +128 -0
- package/themes/marker-mag/audit.log.jsonl +1 -0
- package/themes/marker-mag/tailwind.snippet.ts +15 -0
- package/themes/marker-mag/theme.yml +159 -0
- package/themes/marker-mag/tokens.ts +27 -0
- package/themes/marketplace-modern/THEME.md +135 -0
- package/themes/marketplace-modern/tokens.ts +186 -0
- package/themes/marketplace-vintage/THEME.md +110 -0
- package/themes/marketplace-vintage/tokens.ts +185 -0
- package/themes/maximalist/THEME.md +96 -0
- package/themes/maximalist/tokens.ts +168 -0
- package/themes/mid-century/THEME.md +109 -0
- package/themes/mid-century/tokens.ts +162 -0
- package/themes/motorcycle-brand/THEME.md +86 -0
- package/themes/motorcycle-brand/tokens.ts +174 -0
- package/themes/museum/THEME.md +83 -0
- package/themes/museum/tokens.ts +147 -0
- package/themes/music-streaming/THEME.md +101 -0
- package/themes/music-streaming/tokens.ts +187 -0
- package/themes/music-vinyl/THEME.md +98 -0
- package/themes/music-vinyl/tokens.ts +167 -0
- package/themes/nature-distilled/.anchor-render.png +0 -0
- package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
- package/themes/nature-distilled/THEME.md +81 -0
- package/themes/nature-distilled/audit.log.jsonl +2 -0
- package/themes/nature-distilled/tailwind.snippet.ts +16 -0
- package/themes/nature-distilled/theme.yml +91 -0
- package/themes/nature-distilled/tokens.ts +26 -0
- package/themes/news-tabloid/THEME.md +72 -0
- package/themes/news-tabloid/tokens.ts +158 -0
- package/themes/news-tech/THEME.md +75 -0
- package/themes/news-tech/tokens.ts +149 -0
- package/themes/newsletter/THEME.md +82 -0
- package/themes/newsletter/tokens.ts +138 -0
- package/themes/newspaper-classic/THEME.md +74 -0
- package/themes/newspaper-classic/tokens.ts +159 -0
- package/themes/nonprofit-arts/THEME.md +78 -0
- package/themes/nonprofit-arts/tokens.ts +157 -0
- package/themes/nonprofit-warm/THEME.md +105 -0
- package/themes/nonprofit-warm/tokens.ts +188 -0
- package/themes/outdoor-adventure/THEME.md +113 -0
- package/themes/outdoor-adventure/tokens.ts +181 -0
- package/themes/overland-broadside/THEME.md +119 -0
- package/themes/overland-broadside/audit.log.jsonl +1 -0
- package/themes/overland-broadside/tailwind.snippet.ts +17 -0
- package/themes/overland-broadside/theme.yml +138 -0
- package/themes/overland-broadside/tokens.ts +27 -0
- package/themes/performance-engineered/THEME.md +162 -0
- package/themes/performance-engineered/audit.log.jsonl +1 -0
- package/themes/performance-engineered/tailwind.snippet.ts +15 -0
- package/themes/performance-engineered/theme.yml +193 -0
- package/themes/performance-engineered/tokens.ts +29 -0
- package/themes/pet-food/THEME.md +78 -0
- package/themes/pet-food/tokens.ts +185 -0
- package/themes/pharma-clinical/THEME.md +164 -0
- package/themes/pharma-clinical/audit.log.jsonl +1 -0
- package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
- package/themes/pharma-clinical/theme.yml +201 -0
- package/themes/pharma-clinical/tokens.ts +29 -0
- package/themes/pill-editorial/THEME.md +125 -0
- package/themes/pill-editorial/audit.log.jsonl +1 -0
- package/themes/pill-editorial/tailwind.snippet.ts +15 -0
- package/themes/pill-editorial/theme.yml +168 -0
- package/themes/pill-editorial/tokens.ts +31 -0
- package/themes/podcast-warm/THEME.md +103 -0
- package/themes/podcast-warm/tokens.ts +192 -0
- package/themes/publisher-indie/THEME.md +78 -0
- package/themes/publisher-indie/tokens.ts +148 -0
- package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
- package/themes/raw-concrete/THEME.md +76 -0
- package/themes/raw-concrete/audit.log.jsonl +10 -0
- package/themes/raw-concrete/tailwind.snippet.ts +16 -0
- package/themes/raw-concrete/theme.yml +88 -0
- package/themes/raw-concrete/tokens.ts +27 -0
- package/themes/realestate-luxury/THEME.md +94 -0
- package/themes/realestate-luxury/tokens.ts +169 -0
- package/themes/realestate-marketplace/THEME.md +106 -0
- package/themes/realestate-marketplace/tokens.ts +183 -0
- package/themes/restaurant-modern/THEME.md +109 -0
- package/themes/restaurant-modern/tokens.ts +172 -0
- package/themes/runway-fashion/THEME.md +99 -0
- package/themes/runway-fashion/tokens.ts +167 -0
- package/themes/saturday-morning/THEME.md +117 -0
- package/themes/saturday-morning/tokens.ts +281 -0
- package/themes/schema.ts +235 -0
- package/themes/signal-dark/BUILD_BRIEF.md +168 -0
- package/themes/signal-dark/THEME.md +107 -0
- package/themes/signal-dark/tokens.ts +181 -0
- package/themes/soft-modern/THEME.md +91 -0
- package/themes/soft-modern/tokens.ts +166 -0
- package/themes/solar-residential/THEME.md +92 -0
- package/themes/solar-residential/tokens.ts +176 -0
- package/themes/sports-league/THEME.md +180 -0
- package/themes/sports-league/audit.log.jsonl +1 -0
- package/themes/sports-league/tailwind.snippet.ts +15 -0
- package/themes/sports-league/theme.yml +213 -0
- package/themes/sports-league/tokens.ts +32 -0
- package/themes/stadium-sport/THEME.md +114 -0
- package/themes/stadium-sport/tokens.ts +187 -0
- package/themes/streetwear-hype/THEME.md +100 -0
- package/themes/streetwear-hype/tokens.ts +174 -0
- package/themes/studio-architect/THEME.md +108 -0
- package/themes/studio-architect/tokens.ts +162 -0
- package/themes/studio-photographer/THEME.md +88 -0
- package/themes/studio-photographer/tokens.ts +164 -0
- package/themes/team-kanban/.anchor-render.png +0 -0
- package/themes/team-kanban/THEME.md +167 -0
- package/themes/team-kanban/audit.log.jsonl +2 -0
- package/themes/team-kanban/dismissals.jsonl +1 -0
- package/themes/team-kanban/tailwind.snippet.ts +15 -0
- package/themes/team-kanban/theme.yml +209 -0
- package/themes/team-kanban/tokens.ts +35 -0
- package/themes/telehealth-modern/THEME.md +95 -0
- package/themes/telehealth-modern/tokens.ts +197 -0
- package/themes/tourism-board/THEME.md +111 -0
- package/themes/tourism-board/tokens.ts +173 -0
- package/themes/toys-modern/THEME.md +79 -0
- package/themes/toys-modern/tokens.ts +200 -0
- package/themes/travel-luxury/THEME.md +95 -0
- package/themes/travel-luxury/tokens.ts +162 -0
- package/themes/vacation-rental/THEME.md +105 -0
- package/themes/vacation-rental/tokens.ts +174 -0
- package/themes/vault-reel/THEME.md +134 -0
- package/themes/vault-reel/audit.log.jsonl +3 -0
- package/themes/vault-reel/tailwind.snippet.ts +16 -0
- package/themes/vault-reel/theme.yml +167 -0
- package/themes/vault-reel/tokens.ts +30 -0
- package/themes/vet-modern/THEME.md +79 -0
- package/themes/vet-modern/tokens.ts +194 -0
- package/themes/web3-restraint/THEME.md +87 -0
- package/themes/web3-restraint/tokens.ts +154 -0
- package/themes/wellness-active/THEME.md +102 -0
- package/themes/wellness-active/tokens.ts +203 -0
- package/themes/wellness-spa/THEME.md +93 -0
- package/themes/wellness-spa/tokens.ts +173 -0
- package/themes/y2k-chrome/THEME.md +118 -0
- package/themes/y2k-chrome/tokens.ts +249 -0
- package/themes/yoga-studio/THEME.md +76 -0
- package/themes/yoga-studio/tokens.ts +163 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Marker Mag — Family C, Editorial & Print.
|
|
2
|
+
#
|
|
3
|
+
# NEW-BASE CANDIDATE for BESPOKE_THEME_SYSTEM.md, adjacent to Base 26
|
|
4
|
+
# Cut & Paste Zine. Base 26 is pure punk-photocopy chaos (ransom-note
|
|
5
|
+
# type, xerox grain, mismatched sizes, torn tape). Marker Mag holds
|
|
6
|
+
# the same DIY / student-mag / youth-culture voice but structures it
|
|
7
|
+
# — hand-drawn brush-lettered wordmark instead of ransom-note type, a
|
|
8
|
+
# proper editorial grid instead of collage anarchy, and one SATURATED
|
|
9
|
+
# BAND COLOR as the canvas identity instead of photocopy-white. Same
|
|
10
|
+
# ethos (independent + youth + hand-made), different volume (organized
|
|
11
|
+
# not anarchic).
|
|
12
|
+
#
|
|
13
|
+
# Authored from Matt's provided design brief (2026-07-04, nexusmag.co.nz
|
|
14
|
+
# reference — the University of Waikato student magazine). Placeholder
|
|
15
|
+
# publication is a fictional NZ-adjacent student quarterly called
|
|
16
|
+
# STATIC — domain-agnostic mockup that could re-skin to any campus
|
|
17
|
+
# magazine, community zine, DIY press, or independent youth publication.
|
|
18
|
+
# The register expresses "independent + youth voice" through PALETTE
|
|
19
|
+
# SATURATION + HAND-DRAWN WORDMARK + DIY COVER ART, not through decoration.
|
|
20
|
+
#
|
|
21
|
+
# Ninth theme via the v2 harness. Third Family C theme (after
|
|
22
|
+
# ember-poster + case-panel). Fifth NEW BASE (after ember-poster,
|
|
23
|
+
# overland-broadside, arc-stack, case-panel). FIRST theme with a
|
|
24
|
+
# saturated non-neutral canvas — every previous theme has been white,
|
|
25
|
+
# cream, near-black, or charcoal; Marker Mag holds hot pink as canvas.
|
|
26
|
+
#
|
|
27
|
+
# Alternative slugs considered — riot-zine (too loaded), pink-punk
|
|
28
|
+
# (locks to one palette), pulp-press (adjacent but less specific),
|
|
29
|
+
# staple-press (too archaic), student-quarterly (too formal). Marker
|
|
30
|
+
# Mag picked because "marker" nails the hand-drawn brush-lettered
|
|
31
|
+
# wordmark signature and "mag" carries the student-magazine register
|
|
32
|
+
# without brand-attribution risk.
|
|
33
|
+
|
|
34
|
+
name: Marker Mag
|
|
35
|
+
concept: Student-magazine DIY register — saturated hot canvas (hot pink by default, other saturated hues per palette variant) broken by dark charcoal header + footer bands, hand-drawn brush-lettered wordmark repeated top and bottom, big DIY cover-art tile featuring the current issue, editorial article grid of dark cards on the saturated canvas.
|
|
36
|
+
influence: |
|
|
37
|
+
Independent campus / student magazines (the register held by NZ / AU / UK campus quarterlies — Salient, Craccum, Palatinate, Isis at their most DIY). Also youth-culture editorial (Dazed at their most zine-adjacent, i-D at their most staple-bound, The Face relaunch when it leans DIY). Adjacent to punk photocopy zines but structured — brush lettering instead of ransom-note, editorial grid instead of collage anarchy.
|
|
38
|
+
|
|
39
|
+
family: C
|
|
40
|
+
base_number: 26
|
|
41
|
+
base_note: |
|
|
42
|
+
New-base candidate adjacent to Base 26 Cut & Paste Zine. Base 26 is pure ransom-note anarchy — torn tape, xerox grain, mismatched fonts, deliberate misalignment. Marker Mag holds the DIY voice but structures it into a proper editorial magazine layout — brush-lettered SVG wordmark instead of ransom-note type, editorial article grid instead of collage anarchy, one saturated band color as canvas identity instead of photocopy-white. Same ethos (independent + youth + hand-made), different volume level (organized, not chaotic).
|
|
43
|
+
|
|
44
|
+
render_url: http://localhost:5173/themes/marker-mag
|
|
45
|
+
|
|
46
|
+
surface: web
|
|
47
|
+
|
|
48
|
+
typography:
|
|
49
|
+
display: DM Sans (free, Google Fonts) at 800 weight — capitalize case, letter-spacing normal. At scale — 36-44px article-tile titles, 22-28px featured article titles, 20px section labels. DM Sans is the reference face itself (the source site literally uses it) and it's a Google-Fonts-shelf humanist sans that reads as youth-friendly without being loud. The BRUSH-LETTERED wordmark is NOT a font — it's a bespoke hand-drawn SVG (see signature).
|
|
50
|
+
body: DM Sans same family — 400 weight for body, 500 for card titles, 600 for filter chips. 14-16px body copy, line-height 1.5. Sentence case, not all caps. Small captions (author bylines) get 12-13px 500-weight.
|
|
51
|
+
mono: none. Marker Mag is a consumer editorial surface — mono has no legitimate role. Author bylines are in body-face italic 12px, NOT mono-caps (that's the universal-slop-blocklist fingerprint).
|
|
52
|
+
scale: 1.25 (major third — deliberately shallow contrast; the article-grid cards should feel evenly-weighted so no one card dominates. The magazine cover-art tile carries the hero volume through IMAGE, not through outsized type.)
|
|
53
|
+
|
|
54
|
+
palette:
|
|
55
|
+
bg: "#E35BA0" # HOT PINK — the saturated canvas color (Marker Mag's identity). Rotates per palette variant to other saturated hues but always dominates the composition.
|
|
56
|
+
surface: "#2C2C2C" # dark charcoal — used for header nav bar, footer band, and every article-card in the editorial grid
|
|
57
|
+
ink: "#FFFFFF" # white — primary text on charcoal cards + charcoal header/footer
|
|
58
|
+
accent: "#0000EE" # browser-blue link accent — used ONLY for interactive states (hover on "Read More »", active-chip underline)
|
|
59
|
+
darkInk: "#0A0A0A" # ink for text ON the hot-pink canvas (title copy, category tabs)
|
|
60
|
+
cardMute: "#B8B8B8" # secondary text on dark cards (author bylines, "Read More »")
|
|
61
|
+
|
|
62
|
+
density: dense
|
|
63
|
+
|
|
64
|
+
motion: |
|
|
65
|
+
Ships live in the section renderer (no external dependencies):
|
|
66
|
+
1. Wordmark drop-in on first paint — the brush-lettered SVG wordmark strokes draw from opacity 0 → 1 with a 400ms cubic-bezier ease + 60ms stagger per letter, so it reads as "hand-drawn on the page in real time." Only fires once on load.
|
|
67
|
+
2. Cover-art tile hover — slight rotate(-1deg) + scale(1.02) on hover, 220ms cubic-bezier. Reads as "picking up a physical magazine off the desk."
|
|
68
|
+
3. Article card hover — the dark card lifts translateY(-4px) + the image inside scales(1.03) with 220ms cubic-bezier. Simultaneous "Read More »" arrow slides 4px right.
|
|
69
|
+
4. Category filter chips — click swaps active chip; grid re-renders filtered instantly (no cross-fade). Active chip has a solid white background with dark ink, inactive is transparent with hot-pink underline.
|
|
70
|
+
5. Pagination — click swaps active page number; grid scrolls to top of grid via smooth-scroll. Fast, no page-transition animation.
|
|
71
|
+
6. Featured-article-list rows in the editorial index — hover flips the row background from transparent to a subtle rgba(255,255,255,0.05) accent, 180ms transition.
|
|
72
|
+
7. prefers-reduced-motion: reduce — brush wordmark starts at final opacity; cover-tile hover disabled; card hover becomes instant. State changes still fire (they're content, not decoration).
|
|
73
|
+
|
|
74
|
+
Customer installs these as dependencies for the deeper motion tier:
|
|
75
|
+
- Lenis — smooth inertial scroll for the long article grid.
|
|
76
|
+
- GSAP DrawSVG — the brush wordmark stroke-draw could use DrawSVG for a more considered pen-on-paper reveal. The default CSS version is close enough for MVP.
|
|
77
|
+
- No preloader — student magazines land instantly, not with a splash screen.
|
|
78
|
+
|
|
79
|
+
Motion character: DIY, physical, tactile. Custom cubic-bezier(0.25,0.1,0.25,1) for reveals. Nothing electric, nothing corporate, nothing tech-bro-slick. The whole point of the DIY register is that it feels made by a human at a desk in a dorm, not by a design system.
|
|
80
|
+
|
|
81
|
+
signature: |
|
|
82
|
+
A hand-drawn BRUSH-LETTERED wordmark, rendered as bespoke SVG paths
|
|
83
|
+
(not a font), sits centered at the top of the composition on a dark
|
|
84
|
+
charcoal band and is REPEATED at the bottom of the composition in
|
|
85
|
+
the footer. The brush strokes carry a marker-on-paper texture — some
|
|
86
|
+
strokes are thicker, some thinner, some have visible ink pooling at
|
|
87
|
+
corners — so the word reads as "hand-drawn today" not "a font
|
|
88
|
+
someone bought." The main page canvas is a SATURATED band color
|
|
89
|
+
(hot pink by default, other saturated hues per palette) that
|
|
90
|
+
dominates every surface not covered by dark cards. Below the top
|
|
91
|
+
charcoal band, a big DIY COVER-ART tile shows the current issue's
|
|
92
|
+
cover in xeroxed / DIY-print texture: dark backdrop with a strong
|
|
93
|
+
central image (a fictional issue mascot or graphic), the issue's
|
|
94
|
+
volume + issue label in small caps on the cover, and a hand-drawn
|
|
95
|
+
border. Beside the cover, a FEATURED-INDEX list of the top articles
|
|
96
|
+
from the current issue — each row a small thumbnail + title + author
|
|
97
|
+
byline + "Read More »" link, all on the hot canvas. Below, a row of
|
|
98
|
+
category filter chips (Columns / Editorial / Entertainment /
|
|
99
|
+
Features / News / Reviews). Below the chips, a 12-tile editorial
|
|
100
|
+
grid arranged 3 columns wide, each tile a dark charcoal card with
|
|
101
|
+
the article's image on top, category badge overlay, title in
|
|
102
|
+
DM-Sans-800-capitalize, small italic author byline, body preview,
|
|
103
|
+
and "Read More »" link at bottom. Grid pagination row (1 2 3 4 5)
|
|
104
|
+
below the grid. Dark charcoal footer band with the wordmark
|
|
105
|
+
repeated + Instagram + Facebook + YouTube social icons. Border-
|
|
106
|
+
radius 0 everywhere. Brand character sits in the brush wordmark,
|
|
107
|
+
the saturated canvas, the DIY cover-art tile, and the disciplined
|
|
108
|
+
student-mag article-grid — not in decoration, not in mono-caps
|
|
109
|
+
eyebrows, not in stat-card triads.
|
|
110
|
+
|
|
111
|
+
imagery: |
|
|
112
|
+
DIY / xerox / punk photocopy aesthetic imagery. The cover-art tile
|
|
113
|
+
is the primary hero — a dark backdrop with a bold graphic (mascot,
|
|
114
|
+
illustration, photograph) that reads as a fictional student
|
|
115
|
+
magazine cover. Article-tile images use a mix of: (1) FPO
|
|
116
|
+
photograph rectangles with visible grain, (2) fake newspaper clip
|
|
117
|
+
scans, (3) colorful graphic panels with a fictional article-topic
|
|
118
|
+
hint. All FPO imagery has a slight rotation, an unfinished quality,
|
|
119
|
+
or a torn-edge treatment — because student magazines never ship
|
|
120
|
+
with polished stock photography. NO gradient blobs, NO glassmorphism,
|
|
121
|
+
NO clean brand-color panels (that's case-panel's move), NO
|
|
122
|
+
drop-shadow-md polish. The whole composition reads as printed +
|
|
123
|
+
photocopied + stapled.
|
|
124
|
+
|
|
125
|
+
best_for:
|
|
126
|
+
- Student / campus magazine sites (university quarterlies, college publications)
|
|
127
|
+
- Independent zines going from print to web (small-run editorial with a distinctive voice)
|
|
128
|
+
- Community publications with a youth or subculture voice
|
|
129
|
+
- Music / arts / culture writing sites that want DIY register instead of corporate polish
|
|
130
|
+
- Substack-alternative editorial platforms leaning into indie youth aesthetic
|
|
131
|
+
- Anything trading on "made by humans in a room, not a content team"
|
|
132
|
+
|
|
133
|
+
avoid:
|
|
134
|
+
- "Border-radius greater than 0px anywhere on the page — sharp corners are core to the identity"
|
|
135
|
+
- "Rounded pill buttons or fully-rounded CTAs — buttons and filter chips are sharp-cornered with 0 radius"
|
|
136
|
+
- "Serif or condensed display type — display face MUST be DM Sans or similar humanist sans, never Fraunces / Times / Playfair / Anton"
|
|
137
|
+
- "The wordmark rendered as a font — the wordmark MUST be hand-drawn bespoke SVG paths so it reads as marker-on-paper, not as a downloadable font"
|
|
138
|
+
- "Mono type as a decorative label voice — mono has no role on this consumer editorial surface"
|
|
139
|
+
- "Neutral canvas (white / cream / black / charcoal) as the primary background — the CANVAS IS ALWAYS SATURATED. Hot pink by default, other saturated hues per palette variant. A neutral canvas turns this into a generic dark-mode blog and the register dies."
|
|
140
|
+
- "Corporate polish on the article cards — no drop-shadow-md, no soft-glow, no rounded 2xl. Cards are FLAT dark rectangles on the saturated canvas."
|
|
141
|
+
- "Uniform 3-pillar / feature-triad layout for the article grid — the grid is a 3×N grid of same-size dark cards which is fine because that IS what magazines do, but the tiles must SHIP with real content variation (different images, different lengths, different categories) so it doesn't collapse into template output"
|
|
142
|
+
- "Center-aligned everything — hero cover art is LEFT of the featured-index, article grid is left-weighted"
|
|
143
|
+
- "Adding a second saturated accent color competing with the canvas — the canvas hue IS the accent. Blue #0000EE is reserved for interactive hover states only."
|
|
144
|
+
- "Emoji or decorative unicode marks — the brush wordmark carries all the personality; nothing else decorative ships"
|
|
145
|
+
- "Auto-advancing hero sliders / cycling headline words — refused"
|
|
146
|
+
- "Grain overlay as a fake-DIY treatment on the whole canvas — DIY texture lives IN the cover-art tile and article-tile images, not smeared across the whole page"
|
|
147
|
+
|
|
148
|
+
banned_defaults:
|
|
149
|
+
# Global blocklist from BESPOKE_THEME_SYSTEM.md
|
|
150
|
+
- "claude-cream (#F4F1EA + serif + #D97757)"
|
|
151
|
+
- "void+acid (near-black bg + single bright acid-green or vermilion accent)"
|
|
152
|
+
- "broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)"
|
|
153
|
+
- "tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)"
|
|
154
|
+
- "uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)"
|
|
155
|
+
# Base-specific
|
|
156
|
+
- "wordmark-as-font (the brush-lettered wordmark MUST be bespoke SVG paths. The moment you replace it with a Google Fonts brush face like Caveat or Permanent Marker, the register collapses into generic-blog-hand-drawn slop.)"
|
|
157
|
+
- "neutral-canvas-with-pink-accent (the whole point is the SATURATED CANVAS. A white canvas with hot pink accents is a completely different register and collapses this theme into generic-editorial-slop.)"
|
|
158
|
+
- "corporate-article-cards (dark cards must be FLAT rectangles on the canvas. The moment you add rounded-2xl + shadow-md + hover-scale-1.05, the register becomes stock Medium / Substack / Ghost editorial slop.)"
|
|
159
|
+
- "generic-cover-art (the DIY cover-art tile must feel PRINTED + PHOTOCOPIED + STAPLED. The moment you replace it with a clean brand-panel or a gradient hero, the register collapses.)"
|
|
@@ -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: "marker-mag",
|
|
5
|
+
family: "C",
|
|
6
|
+
base: "26",
|
|
7
|
+
palette: {
|
|
8
|
+
"bg": "#E35BA0",
|
|
9
|
+
"surface": "#2C2C2C",
|
|
10
|
+
"ink": "#FFFFFF",
|
|
11
|
+
"accent": "#0000EE",
|
|
12
|
+
"darkInk": "#0A0A0A",
|
|
13
|
+
"cardMute": "#B8B8B8"
|
|
14
|
+
},
|
|
15
|
+
typography: {
|
|
16
|
+
"display": "DM Sans (free, Google Fonts) at 800 weight — capitalize case, letter-spacing normal. At scale — 36-44px article-tile titles, 22-28px featured article titles, 20px section labels. DM Sans is the reference face itself (the source site literally uses it) and it's a Google-Fonts-shelf humanist sans that reads as youth-friendly without being loud. The BRUSH-LETTERED wordmark is NOT a font — it's a bespoke hand-drawn SVG (see signature).",
|
|
17
|
+
"body": "DM Sans same family — 400 weight for body, 500 for card titles, 600 for filter chips. 14-16px body copy, line-height 1.5. Sentence case, not all caps. Small captions (author bylines) get 12-13px 500-weight.",
|
|
18
|
+
"mono": "none. Marker Mag is a consumer editorial surface — mono has no legitimate role. Author bylines are in body-face italic 12px, NOT mono-caps (that's the universal-slop-blocklist fingerprint).",
|
|
19
|
+
"scale": "1.25 (major third — deliberately shallow contrast; the article-grid cards should feel evenly-weighted so no one card dominates. The magazine cover-art tile carries the hero volume through IMAGE, not through outsized type.)"
|
|
20
|
+
},
|
|
21
|
+
surface: "web",
|
|
22
|
+
density: "dense",
|
|
23
|
+
motion: "Ships live in the section renderer (no external dependencies):\n1. Wordmark drop-in on first paint — the brush-lettered SVG wordmark strokes draw from opacity 0 → 1 with a 400ms cubic-bezier ease + 60ms stagger per letter, so it reads as \"hand-drawn on the page in real time.\" Only fires once on load.\n2. Cover-art tile hover — slight rotate(-1deg) + scale(1.02) on hover, 220ms cubic-bezier. Reads as \"picking up a physical magazine off the desk.\"\n3. Article card hover — the dark card lifts translateY(-4px) + the image inside scales(1.03) with 220ms cubic-bezier. Simultaneous \"Read More »\" arrow slides 4px right.\n4. Category filter chips — click swaps active chip; grid re-renders filtered instantly (no cross-fade). Active chip has a solid white background with dark ink, inactive is transparent with hot-pink underline.\n5. Pagination — click swaps active page number; grid scrolls to top of grid via smooth-scroll. Fast, no page-transition animation.\n6. Featured-article-list rows in the editorial index — hover flips the row background from transparent to a subtle rgba(255,255,255,0.05) accent, 180ms transition.\n7. prefers-reduced-motion: reduce — brush wordmark starts at final opacity; cover-tile hover disabled; card hover becomes instant. State changes still fire (they're content, not decoration).\n\nCustomer installs these as dependencies for the deeper motion tier:\n- Lenis — smooth inertial scroll for the long article grid.\n- GSAP DrawSVG — the brush wordmark stroke-draw could use DrawSVG for a more considered pen-on-paper reveal. The default CSS version is close enough for MVP.\n- No preloader — student magazines land instantly, not with a splash screen.\n\nMotion character: DIY, physical, tactile. Custom cubic-bezier(0.25,0.1,0.25,1) for reveals. Nothing electric, nothing corporate, nothing tech-bro-slick. The whole point of the DIY register is that it feels made by a human at a desk in a dorm, not by a design system.\n",
|
|
24
|
+
signature: "A hand-drawn BRUSH-LETTERED wordmark, rendered as bespoke SVG paths\n(not a font), sits centered at the top of the composition on a dark\ncharcoal band and is REPEATED at the bottom of the composition in\nthe footer. The brush strokes carry a marker-on-paper texture — some\nstrokes are thicker, some thinner, some have visible ink pooling at\ncorners — so the word reads as \"hand-drawn today\" not \"a font\nsomeone bought.\" The main page canvas is a SATURATED band color\n(hot pink by default, other saturated hues per palette) that\ndominates every surface not covered by dark cards. Below the top\ncharcoal band, a big DIY COVER-ART tile shows the current issue's\ncover in xeroxed / DIY-print texture: dark backdrop with a strong\ncentral image (a fictional issue mascot or graphic), the issue's\nvolume + issue label in small caps on the cover, and a hand-drawn\nborder. Beside the cover, a FEATURED-INDEX list of the top articles\nfrom the current issue — each row a small thumbnail + title + author\nbyline + \"Read More »\" link, all on the hot canvas. Below, a row of\ncategory filter chips (Columns / Editorial / Entertainment /\nFeatures / News / Reviews). Below the chips, a 12-tile editorial\ngrid arranged 3 columns wide, each tile a dark charcoal card with\nthe article's image on top, category badge overlay, title in\nDM-Sans-800-capitalize, small italic author byline, body preview,\nand \"Read More »\" link at bottom. Grid pagination row (1 2 3 4 5)\nbelow the grid. Dark charcoal footer band with the wordmark\nrepeated + Instagram + Facebook + YouTube social icons. Border-\nradius 0 everywhere. Brand character sits in the brush wordmark,\nthe saturated canvas, the DIY cover-art tile, and the disciplined\nstudent-mag article-grid — not in decoration, not in mono-caps\neyebrows, not in stat-card triads.\n",
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
export type Tokens = typeof tokens;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Design Direction — Marketplace-Modern
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Faire warm-white catalog · Olist friendly B2B teal · Joor dignified navy · Shogun commerce-builder warmth · Pietra creator-merchant cream
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
Modern B2B wholesale marketplace. Clean white-paper canvas with a warm-sand secondary surface, structured product cards that read like a printed line-sheet, restrained navy text, and a single confident warm-orange action color. The page reads as the surface where a buyer commits a $40,000 purchase order — dashboard-grade trust, line-sheet pacing, never marketing-loud.
|
|
8
|
+
|
|
9
|
+
Where soft-modern is Linear's softer cousin (productivity for makers), marketplace-modern is the wholesale buyer's catalog — denser line-items, formal navy headers, MOQ and lead-time always visible, and a brand accent that's warm enough to feel like commerce rather than enterprise SaaS.
|
|
10
|
+
|
|
11
|
+
## Reference brands
|
|
12
|
+
- **Faire** → warm-white canvas, warm-sand surface, Plus Jakarta wordmark, structured catalog cards. The dominant template — this direction owes Faire its surface stack.
|
|
13
|
+
- **Olist** → deep teal product accent, friendly business UI, Brazilian SMB warmth. The secondary signal color for "verified supplier" and "ships on time."
|
|
14
|
+
- **Joor** → formal navy text, serif-adjacent dignity, line-sheet luxury. The typographic posture — buyers reading this surface are placing real-money orders.
|
|
15
|
+
- **Shogun** → warm orange action color, commerce-builder card grids. The primary CTA hue.
|
|
16
|
+
- **Pietra** → cream paper backdrop, creator-merchant marketplace pacing. The hero-canvas tone — warmer than enterprise, calmer than consumer.
|
|
17
|
+
|
|
18
|
+
## Tokens
|
|
19
|
+
HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
|
|
20
|
+
|
|
21
|
+
Surface stack is **warm-white canvas** (background, `30 25% 98%`) → **pure-white catalog card** (`0 0% 100%`) → **warm-sand secondary** (`32 28% 94%`) → **cream muted** (`32 22% 92%`). Depth comes from a hue shift (warm-sand sits under white cards) plus a soft `shadow-catalog` — never a saturated drop, never a fill-only differentiation.
|
|
22
|
+
|
|
23
|
+
Primary is **Shogun warm-orange** (`22 88% 52%`) — the single confident action color, used on "Add to Order," "Submit PO," "Request Samples." Olist teal (`186 70% 32%`) is the secondary product accent reserved for trust signals (Verified Supplier, On-Time Shipping). Joor navy (`215 35% 14%`) is the foreground.
|
|
24
|
+
|
|
25
|
+
Brand tokens — these are the working palette:
|
|
26
|
+
- `--faire-sand` — = `--secondary`; the warm-sand surface under catalog filters and table rows.
|
|
27
|
+
- `--joor-navy` and `--joor-navy-deep` — formal navy text and eyebrow.
|
|
28
|
+
- `--olist-teal` — verified-supplier and ship-on-time signals; never the primary CTA color.
|
|
29
|
+
- `--shogun-orange` and `--shogun-orange-deep` — primary action color and pressed state.
|
|
30
|
+
- `--pietra-cream` — = `--background`; hero canvas tone.
|
|
31
|
+
- `--success-leaf`, `--warning-mustard` — restrained semantic signals tuned for B2B (no consumer-bright greens).
|
|
32
|
+
|
|
33
|
+
## Typography
|
|
34
|
+
- **Display:** Plus Jakarta Sans (Faire wordmark family). h1–h4, weights 500/600/700. Friendly geometric humanist sans — retail-merchandising warmth without consumer cuteness.
|
|
35
|
+
- **Body:** Inter (Joor/Olist body sans). Base **15px** with **line-height 1.6** — dashboard-dense, line-item readable.
|
|
36
|
+
- **Mono:** JetBrains Mono. SKU codes, order numbers, MOQ counts, line-item totals. Instrument-cluster precision for numerics.
|
|
37
|
+
|
|
38
|
+
Headings track `-0.015em` — Plus Jakarta benefits from a hair of tightening at large sizes. H1 uses `clamp(2.25rem, 5vw, 3.75rem)` — dashboard hero, not editorial poster. Numbers always carry `font-variant-numeric: tabular-nums`. Font features: `"cv11", "ss01", "tnum", "calt"`.
|
|
39
|
+
|
|
40
|
+
## Spacing
|
|
41
|
+
- **Container:** `max-w-7xl px-4 lg:px-8` — wide enough for 4-up catalog grids and the order-summary sticky column.
|
|
42
|
+
- **Section padding tiers:**
|
|
43
|
+
- Hero: `pt-16 pb-12 lg:pt-24 lg:pb-16` — dashboard hero, not magazine cover
|
|
44
|
+
- Default: `py-14 lg:py-20`
|
|
45
|
+
- Tight: `py-10 lg:py-14`
|
|
46
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80. Medium density — catalog cards breathe, line-items pack tight.
|
|
47
|
+
|
|
48
|
+
## Color
|
|
49
|
+
No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, never via new tokens.
|
|
50
|
+
|
|
51
|
+
The palette is **warm-white canvas + single warm-orange accent + restrained semantic signals** — never multiple competing brand colors, never a saturated rainbow. The Faire/Pietra warm-sand stack is the surface language; Joor navy is the text; Shogun orange is the action. Olist teal is reserved for trust signals (verified, on-time) — using it as a CTA color breaks the "one action color" discipline.
|
|
52
|
+
|
|
53
|
+
Pure black is forbidden — `--foreground` is `215 35% 14%` (Joor navy-ink). Pure white is permitted only as `--card` — catalog cards lift off the warm-sand canvas via the hue shift. Consumer-bright greens are forbidden — `--success-leaf` at `152 48% 36%` is the B2B confirmation tone, restrained and trustworthy.
|
|
54
|
+
|
|
55
|
+
## Radius
|
|
56
|
+
`--radius: 0.5rem` (8px). **Catalog-card soft, dashboard-restrained.** Pills are allowed (`pillsAllowed: true`) and are the default for category tags, status chips (Backorder, Verified Supplier, Free Shipping), and filter toggles. Right angles read editorial; pillow corners read consumer-app — 8px is the line-sheet sweet spot.
|
|
57
|
+
|
|
58
|
+
## Shadows
|
|
59
|
+
Four soft utilities — no glows, no color-tinted drops:
|
|
60
|
+
|
|
61
|
+
- `.shadow-catalog` — default catalog-card elevation. Two-layer near-neutral drop with a faint navy tint. Quiet at rest.
|
|
62
|
+
- `.shadow-catalog-hover` — card lift on hover. Deeper drop with the same tint family.
|
|
63
|
+
- `.shadow-sheet` — order-summary sticky and slide-over panels. Pronounced lift for the surface that holds money decisions.
|
|
64
|
+
- `.ring-focus` — composite focus ring (white inset + 2px primary-orange at 45%). The single focus treatment across inputs and buttons.
|
|
65
|
+
|
|
66
|
+
Shadows are **near-neutral with a navy bias** — color-saturated drops read consumer/creator-social and break the B2B trust language.
|
|
67
|
+
|
|
68
|
+
## Motion
|
|
69
|
+
Three keyframes, dashboard-restrained:
|
|
70
|
+
|
|
71
|
+
- `fade-rise` (300ms) — standard content entrance. Short, dashboard-fast translateY(8px) → 0.
|
|
72
|
+
- `scale-in` (180ms) — dropdowns, popovers, line-item editors. The confirm-interaction gesture.
|
|
73
|
+
- `skeleton-pulse` (1800ms infinite) — catalog grid loading state. Opacity pulse rather than shimmer; shimmer reads consumer.
|
|
74
|
+
|
|
75
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)` — the universal taste-library curve. `prefers-reduced-motion` is honored — `fade-rise` collapses to opacity-only, `scale-in` to opacity-only, `skeleton-pulse` to a static 0.75 opacity.
|
|
76
|
+
|
|
77
|
+
No ambient motion. This direction is a dashboard for placing orders — nothing should drift in the background while a buyer is calculating margin.
|
|
78
|
+
|
|
79
|
+
## Component patterns
|
|
80
|
+
- **Buttons:** primary = solid Shogun-orange filled rect, `rounded-md` (8px), weight 600. Secondary = bordered ghost (border-border, bg-card, foreground text, hover:bg-accent). Tertiary = text-link in primary orange with `underline-offset-2 hover:underline`. Pills reserved for tags and status chips, never for primary CTAs. **One primary CTA per surface** — buyers commit on one button, not five.
|
|
81
|
+
- **Cards:** catalog card = `rounded-lg`, 1px `border-border`, `bg-card`, `shadow-catalog`. Internal padding `p-4 lg:p-5`. Title in Plus Jakarta weight 600; supplier name in `mutedForeground` weight 500; price block in tabular Inter; MOQ and lead time in mono caption. Hover deepens to `shadow-catalog-hover`. **Line-sheet variant** uses `shadow-sheet` on the sticky order-summary column.
|
|
82
|
+
- **Inputs:** compact (`h-9 text-sm`), 1px `border-input`, `bg-card`, `rounded-md`. Focus uses `.ring-focus` (warm-orange glow at 45% with white inset). Label above in foreground weight 500; helper below in `mutedForeground`. Inline validation in `destructive`, `warning-mustard`, `success-leaf`.
|
|
83
|
+
- **CTAs:** the warm-orange filled button is the primary action — "Add to Order," "Submit PO," "Request Samples." Secondary CTAs are bordered ghost buttons. Tertiary are orange underlined text-links. **Never a gradient button** — this is line-sheet trust, not consumer marketing.
|
|
84
|
+
|
|
85
|
+
## Component families
|
|
86
|
+
None at install time. As `*CatalogCard`, `*LineItemRow`, `*SupplierBadge`, `*OrderSummary` families emerge, the Director lists them here with their shared pattern.
|
|
87
|
+
|
|
88
|
+
## Recommended rich media
|
|
89
|
+
|
|
90
|
+
### Cover and hero imagery
|
|
91
|
+
**Product-photography first.** This is a wholesale catalog — every hero is anchored by real product imagery, not abstract gradient or 3D render.
|
|
92
|
+
|
|
93
|
+
- **Flat-lay product grids** — 6-up or 9-up arrangements on warm-sand seamless paper, slight overhead angle. The Faire homepage template.
|
|
94
|
+
- **Studio-lit single SKUs** — soft natural light, warm-white background matching `--background`, restrained shadow. Crate&Barrel-via-Faire.
|
|
95
|
+
- **Maker-at-work documentary** — supplier shots of a ceramicist's studio, a small-batch food kitchen, a textile loom. Warm color grade, slightly muted saturation, never the saturated-creator-social look.
|
|
96
|
+
- **Order-confirmation moments** — phone-in-hand shots of a buyer reviewing a PO, slight Joor navy gradient overlay for the hero text plate.
|
|
97
|
+
|
|
98
|
+
### AI tool recommendations
|
|
99
|
+
- **Midjourney** for product flat-lays. Prompt scaffold: *"flat-lay product photography, 6 ceramic vases on warm-sand seamless paper, soft natural overhead light, Faire catalog aesthetic, --ar 4:3"*. Always specify warm sand, never pure white seamless.
|
|
100
|
+
- **Flux** for maker-documentary stills. Prompt scaffold: *"small-batch ceramic studio, maker at wheel, warm afternoon light through north-facing window, documentary 35mm"*.
|
|
101
|
+
- **Recraft** for line-art SKU icons and category illustrations — flat single-color in `--joor-navy`, never gradient.
|
|
102
|
+
- Avoid Midjourney's default consumer-product gloss — explicitly prompt for natural light and warm sand, never studio strobe.
|
|
103
|
+
|
|
104
|
+
### Aspect ratios
|
|
105
|
+
- **4:3 landscape** — flat-lay catalog grids, the dominant hero ratio.
|
|
106
|
+
- **1:1 square** — individual SKU thumbnails in the catalog grid (mandatory — mixed ratios break the line-sheet rhythm).
|
|
107
|
+
- **3:4 portrait** — single-maker documentary verticals, supplier-story pages.
|
|
108
|
+
- Avoid 16:9 widescreen (cinematic, off-feel for catalog). Avoid 9:16 entirely (creator-social territory).
|
|
109
|
+
|
|
110
|
+
### Color discipline for imagery
|
|
111
|
+
Stay warm-neutral. Natural light, warm-sand backgrounds, restrained saturation. **If a product photo has a cool/blue cast or a black seamless background, regrade it or do not use it** — the warm-paper surface stack breaks the moment a cool-cast image lands. Saturated brand-colored product flats (a single hot-pink product on white) also break — soften through styling, not Photoshop.
|
|
112
|
+
|
|
113
|
+
### What to AVOID
|
|
114
|
+
- **Black seamless product photography** — cinematic-dark or couture-luxury territory; reads expensive in the wrong way for B2B wholesale.
|
|
115
|
+
- **Lifestyle stock photography with watermarks** — kills the line-sheet trust instantly.
|
|
116
|
+
- **Saturated gradient hero backgrounds** — creator-social/glassmorphic-modern territory.
|
|
117
|
+
- **3D rendered products** — uncanny, breaks the "real supplier" trust signal.
|
|
118
|
+
- **Decorative line-art ornament** — editorial territory, off-altitude.
|
|
119
|
+
|
|
120
|
+
### Accessibility
|
|
121
|
+
- Long-form alt-text for all product imagery — *"Six matte-glazed ceramic vases arranged on warm-sand paper, overhead angle, natural afternoon light."* Reads to a buyer evaluating a SKU.
|
|
122
|
+
- Tabular-numeric pricing must use `font-variant-numeric: tabular-nums` so screen-readers and visual scanners read column-aligned totals.
|
|
123
|
+
- Status chips (Verified Supplier, Backorder, On-Time) must carry an icon plus a text label — color alone fails for color-blind buyers.
|
|
124
|
+
- `--olist-teal` on warm-white passes WCAG AA at 14pt+ — verify at small caption sizes; use `--joor-navy` for body copy never teal.
|
|
125
|
+
|
|
126
|
+
## Details
|
|
127
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text.
|
|
128
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.5)` — warm-orange, paired with `.ring-focus` composite on inputs and buttons.
|
|
129
|
+
- **Scrollbar:** thin.
|
|
130
|
+
|
|
131
|
+
## Exceptions
|
|
132
|
+
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.
|
|
133
|
+
|
|
134
|
+
## Revisions
|
|
135
|
+
- Initial direction, generated at install time.
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { Direction } from "../schema";
|
|
2
|
+
|
|
3
|
+
export const marketplaceModern: Direction = {
|
|
4
|
+
name: "marketplace-modern",
|
|
5
|
+
ethos:
|
|
6
|
+
"Faire warm-white catalog · Olist friendly B2B teal · Joor dignified navy · Shogun commerce-builder warmth · Pietra creator-merchant cream",
|
|
7
|
+
references: [
|
|
8
|
+
{ brand: "Faire", trait: "clean white canvas, warm sand surface, Plus Jakarta type, structured catalog cards" },
|
|
9
|
+
{ brand: "Olist", trait: "deep teal product accent, friendly business UI, Brazilian SMB warmth" },
|
|
10
|
+
{ brand: "Joor", trait: "formal navy, serif accents, B2B dignified — line-sheet luxury" },
|
|
11
|
+
{ brand: "Shogun", trait: "warm orange action color, commerce-builder card grids" },
|
|
12
|
+
{ brand: "Pietra", trait: "cream paper backdrop, creator-merchant marketplace pacing" },
|
|
13
|
+
],
|
|
14
|
+
feel:
|
|
15
|
+
"Modern B2B wholesale marketplace. Clean white canvas with warm-sand secondary surface, " +
|
|
16
|
+
"structured product cards that feel like a printed line-sheet, restrained navy text, " +
|
|
17
|
+
"a single confident warm-orange brand accent. Reads as the surface where a buyer commits " +
|
|
18
|
+
"a $40k purchase order — dashboard-grade trust, never marketing-loud.",
|
|
19
|
+
|
|
20
|
+
fonts: {
|
|
21
|
+
display: {
|
|
22
|
+
family: "Plus Jakarta Sans",
|
|
23
|
+
fallback: ["Inter", "system-ui", "-apple-system", "Segoe UI", "sans-serif"],
|
|
24
|
+
from: "Faire wordmark family — friendly geometric sans, slightly humanist, retail-merchandising warmth",
|
|
25
|
+
googleFont: "Plus+Jakarta+Sans",
|
|
26
|
+
weights: [500, 600, 700],
|
|
27
|
+
},
|
|
28
|
+
body: {
|
|
29
|
+
family: "Inter",
|
|
30
|
+
fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
|
|
31
|
+
from: "Joor/Olist body sans — neutral, dashboard-ready, tabular numerics for SKUs and unit prices",
|
|
32
|
+
googleFont: "Inter",
|
|
33
|
+
weights: [400, 500, 600],
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
family: "JetBrains Mono",
|
|
37
|
+
fallback: ["SF Mono", "ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
|
|
38
|
+
from: "SKU codes, order numbers, MOQ counts — instrument-cluster precision in line items",
|
|
39
|
+
googleFont: "JetBrains+Mono",
|
|
40
|
+
weights: [400, 500],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
typography: {
|
|
45
|
+
headingTracking: "-0.015em",
|
|
46
|
+
bodyTracking: "0",
|
|
47
|
+
fontFeatureSettings: '"cv11", "ss01", "tnum", "calt"',
|
|
48
|
+
h1ScaleClamp: "clamp(2.25rem, 5vw, 3.75rem)",
|
|
49
|
+
bodyBaseSize: "0.9375rem",
|
|
50
|
+
bodyLineHeight: "1.6",
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
colors: {
|
|
54
|
+
background: { hsl: "30 25% 98%", from: "Faire warm-white canvas — barely-tinted paper, not pure white" },
|
|
55
|
+
foreground: { hsl: "215 35% 14%", from: "Joor dignified navy-ink — deep desaturated navy, never pure black" },
|
|
56
|
+
card: { hsl: "0 0% 100%", from: "Pure white catalog card — lifts off the warm-sand canvas by hue, not shadow" },
|
|
57
|
+
popover: { hsl: "0 0% 100%", from: "Same as card — popovers and dropdowns sit on the same paper" },
|
|
58
|
+
|
|
59
|
+
primary: { hsl: "22 88% 52%", from: "Shogun commerce-warm orange — the single confident action color" },
|
|
60
|
+
primaryForeground: { hsl: "0 0% 100%", from: "White on warm orange — CTA contrast" },
|
|
61
|
+
|
|
62
|
+
secondary: { hsl: "32 28% 94%", from: "Faire warm-sand secondary — the second surface, where catalog filters sit" },
|
|
63
|
+
secondaryForeground: { hsl: "215 35% 18%", from: "Navy-ink on warm sand" },
|
|
64
|
+
muted: { hsl: "32 22% 92%", from: "Pietra cream-muted — quieter panels, table row stripes" },
|
|
65
|
+
mutedForeground: { hsl: "215 14% 42%", from: "Slate-navy secondary text — meta, supplier names, MOQ captions" },
|
|
66
|
+
accent: { hsl: "32 28% 90%", from: "Hover surface — one tier deeper than secondary, still warm" },
|
|
67
|
+
accentForeground: { hsl: "215 35% 14%", from: "Navy-ink on accent" },
|
|
68
|
+
|
|
69
|
+
border: { hsl: "30 15% 88%", from: "Warm-paper hairline — Faire catalog card border, visible but quiet" },
|
|
70
|
+
input: { hsl: "215 18% 82%", from: "Slightly stronger than card border — affordance for line-item fields" },
|
|
71
|
+
ring: { hsl: "22 88% 52%", from: "Primary orange — focus ring on inputs and active CTAs" },
|
|
72
|
+
|
|
73
|
+
destructive: { hsl: "354 70% 48%", from: "Order-error red — out-of-stock, declined payment; warm not enterprise-harsh" },
|
|
74
|
+
destructiveForeground: { hsl: "0 0% 100%", from: "White on order-error red" },
|
|
75
|
+
|
|
76
|
+
brand: {
|
|
77
|
+
"faire-sand": { hsl: "32 28% 94%", from: "= secondary; Faire warm-sand surface, semantic for catalog backgrounds" },
|
|
78
|
+
"joor-navy": { hsl: "215 35% 14%", from: "= foreground; Joor dignified navy, semantic for line-sheet headers" },
|
|
79
|
+
"joor-navy-deep": { hsl: "215 45% 10%", from: "Deeper Joor navy — formal eyebrow text, signature block" },
|
|
80
|
+
"olist-teal": { hsl: "186 70% 32%", from: "Olist friendly B2B teal — secondary product accent, status-confirmed, ship-on-time" },
|
|
81
|
+
"shogun-orange": { hsl: "22 88% 52%", from: "= primary; Shogun warm action color" },
|
|
82
|
+
"shogun-orange-deep": { hsl: "18 82% 44%", from: "Hover/pressed orange — pressed-button state" },
|
|
83
|
+
"pietra-cream": { hsl: "30 25% 98%", from: "= background; Pietra cream paper, semantic for hero canvas" },
|
|
84
|
+
"success-leaf": { hsl: "152 48% 36%", from: "Order-confirmed green — restrained, business-trustworthy not consumer-bright" },
|
|
85
|
+
"warning-mustard": { hsl: "38 90% 50%", from: "Backorder/low-stock amber — caution without alarm" },
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
spacing: {
|
|
90
|
+
base: 4,
|
|
91
|
+
scale: [4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64, 80],
|
|
92
|
+
containerMax: "max-w-7xl",
|
|
93
|
+
containerPadding: "px-4 lg:px-8",
|
|
94
|
+
sectionPadding: {
|
|
95
|
+
hero: "pt-16 pb-12 lg:pt-24 lg:pb-16",
|
|
96
|
+
default: "py-14 lg:py-20",
|
|
97
|
+
tight: "py-10 lg:py-14",
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
radius: {
|
|
102
|
+
base: "0.5rem",
|
|
103
|
+
pillsAllowed: true,
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
shadows: {
|
|
107
|
+
style: "soft",
|
|
108
|
+
utilities: {
|
|
109
|
+
"shadow-catalog":
|
|
110
|
+
"0 1px 2px hsl(215 30% 20% / 0.04), 0 2px 6px hsl(215 30% 20% / 0.05)",
|
|
111
|
+
"shadow-catalog-hover":
|
|
112
|
+
"0 2px 4px hsl(215 30% 20% / 0.05), 0 12px 24px hsl(215 30% 20% / 0.08)",
|
|
113
|
+
"shadow-sheet":
|
|
114
|
+
"0 4px 8px hsl(215 30% 20% / 0.06), 0 24px 48px hsl(215 30% 20% / 0.10)",
|
|
115
|
+
"ring-focus":
|
|
116
|
+
"0 0 0 2px hsl(0 0% 100%), 0 0 0 4px hsl(var(--ring) / 0.45)",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
motion: {
|
|
121
|
+
easing: "cubic-bezier(0.22, 1, 0.36, 1)",
|
|
122
|
+
durations: {
|
|
123
|
+
reveal: 300,
|
|
124
|
+
loop: 1800,
|
|
125
|
+
ambient: 0,
|
|
126
|
+
},
|
|
127
|
+
keyframes: {
|
|
128
|
+
"fade-rise": {
|
|
129
|
+
css:
|
|
130
|
+
"from { opacity: 0; transform: translateY(8px); }\n" +
|
|
131
|
+
"to { opacity: 1; transform: translateY(0); }",
|
|
132
|
+
defaultDuration: 300,
|
|
133
|
+
iteration: "once",
|
|
134
|
+
purpose: "catalog card and section entrance — short, dashboard-fast",
|
|
135
|
+
},
|
|
136
|
+
"scale-in": {
|
|
137
|
+
css:
|
|
138
|
+
"from { opacity: 0; transform: scale(0.97); }\n" +
|
|
139
|
+
"to { opacity: 1; transform: scale(1); }",
|
|
140
|
+
defaultDuration: 180,
|
|
141
|
+
iteration: "once",
|
|
142
|
+
purpose: "dropdowns, popovers, line-item editors — confirms interaction",
|
|
143
|
+
},
|
|
144
|
+
"skeleton-pulse": {
|
|
145
|
+
css:
|
|
146
|
+
"0%, 100% { opacity: 0.55; }\n" +
|
|
147
|
+
"50% { opacity: 1; }",
|
|
148
|
+
defaultDuration: 1800,
|
|
149
|
+
iteration: "infinite",
|
|
150
|
+
purpose: "catalog grid loading state — pulse rather than shimmer, B2B-restrained",
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
respectsReducedMotion: true,
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
density: "medium",
|
|
157
|
+
|
|
158
|
+
patterns: {
|
|
159
|
+
button:
|
|
160
|
+
"Primary = solid warm-orange filled rect (bg-primary text-primary-foreground rounded-md font-medium), 8px radius, weight 600. " +
|
|
161
|
+
"Secondary = bordered ghost (border border-border bg-card text-foreground hover:bg-accent). " +
|
|
162
|
+
"Tertiary = link (text-primary underline-offset-2 hover:underline). " +
|
|
163
|
+
"Pills reserved for category tags and status chips (Backorder, Verified Supplier, Free Shipping). " +
|
|
164
|
+
"One primary CTA per surface — buyers commit on one button, not five.",
|
|
165
|
+
card:
|
|
166
|
+
"Catalog card = rounded-lg (8px), 1px border-border, bg-card, shadow-catalog. Padding p-4 lg:p-5. " +
|
|
167
|
+
"Title in Plus Jakarta weight 600; supplier name in muted-foreground weight 500. " +
|
|
168
|
+
"Price block in tabular Inter; MOQ + lead time in mono caption. " +
|
|
169
|
+
"Hover lifts to shadow-catalog-hover. Line-sheet variant uses shadow-sheet on the order-summary sticky.",
|
|
170
|
+
input:
|
|
171
|
+
"Compact (h-9 text-sm), 1px border-input, bg-card, rounded-md. " +
|
|
172
|
+
"Focus uses ring-focus (warm-orange glow at 45%). Label above in foreground weight 500; helper below in muted-foreground. " +
|
|
173
|
+
"Inline validation: destructive on invalid quantity, warning-mustard on low-stock, success-leaf on confirmed.",
|
|
174
|
+
cta:
|
|
175
|
+
"Primary action is the warm-orange filled button — 'Add to Order', 'Submit PO', 'Request Samples'. " +
|
|
176
|
+
"Secondary = bordered ghost. Tertiary = orange underlined link. " +
|
|
177
|
+
"Never a gradient button — this is line-sheet trust, not consumer marketing.",
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
details: {
|
|
181
|
+
selectionBg: "hsl(var(--primary) / 0.22)",
|
|
182
|
+
selectionFg: "hsl(var(--foreground))",
|
|
183
|
+
focusRing: "2px solid hsl(var(--ring) / 0.5)",
|
|
184
|
+
scrollbarStyle: "thin",
|
|
185
|
+
},
|
|
186
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Design Direction — Marketplace-Vintage
|
|
2
|
+
|
|
3
|
+
## Ethos
|
|
4
|
+
Etsy warm paper · Depop saturated youth · Grailed sharp resale · Vestiaire dignified vintage · eBay redesigned restraint
|
|
5
|
+
|
|
6
|
+
## Feel
|
|
7
|
+
A warm paper canvas you'd flip through at a flea market. A friendly geometric sans does the heavy lifting; a hand-feeling humanist serif sits on top for titles and seller stories. Personality is forward — every card carries a maker, a price, and a story. Decorative but not corporate-marketplace; loud where the listing earns it, quiet where the seller wants restraint.
|
|
8
|
+
|
|
9
|
+
## Reference brands
|
|
10
|
+
- **Etsy** → warm orange + friendly geometric sans + hand-crafted feel. Orange is the canonical action color; warm paper is the canvas.
|
|
11
|
+
- **Depop** → saturated youth palette + grid density + casual energy. Story tags, plum secondary, heart-pop interaction.
|
|
12
|
+
- **Grailed** → sharp black + Helvetica + men's-resale density. The ink color and the tabular price treatment trace here.
|
|
13
|
+
- **Vestiaire Collective** → cream + serif + luxury-resale dignified. The display serif and the dignified verified-seller tier trace here.
|
|
14
|
+
- **eBay (recent redesign)** → warm white + restraint + tight grid. The grid discipline and the absence of clutter trace here.
|
|
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 paper** (background) → **lifted warm paper** (card) → **deeper warm paper** (secondary/muted/accent). Depth comes from soft drop shadows and the warm hairline border. Pure white is forbidden — `--paper-warm` replaces it; pure black is forbidden — `--ink-grailed` (warm-tilted near-black) replaces it.
|
|
20
|
+
|
|
21
|
+
Brand tokens: `--paper-warm`, `--paper-deep`, `--orange-etsy`, `--plum-depop`, `--olive-vintage`, `--mustard-tag`, `--ink-grailed`, `--cream-vest`. Primary is `--orange-etsy`. Plum is a secondary story-accent (tags, sub-CTAs). Olive is the verified-seller / vintage-authenticated tier. Mustard is the price-tag color — On Sale chips and Make Offer affordances.
|
|
22
|
+
|
|
23
|
+
## Typography
|
|
24
|
+
- **Display:** Fraunces (the Google-Font swap for Recoleta — Vestiaire/Etsy hand-warm display serif). h1–h4 and listing-card titles. Tracking `-0.01em` — confident, near-zero.
|
|
25
|
+
- **Body:** DM Sans (Etsy/Depop friendly geometric sans). Body base **16px** with **line-height 1.55** — marketplace-comfortable, slightly looser than `realestate-marketplace`.
|
|
26
|
+
- **Mono:** DM Mono. Price, SKU, condition, vintage year. Tabular numerics always on for prices.
|
|
27
|
+
|
|
28
|
+
H1 uses `clamp(2.25rem, 5.5vw, 4rem)`. Font features: `"liga"`, `"ss01"`, `"tnum"`. Display serif paired with a friendly sans is the load-bearing combination — Fraunces alone reads luxury-vintage; DM Sans alone reads tech-marketplace; together they read flea-market-with-taste.
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
- **Container:** `max-w-7xl px-4 lg:px-8` — wide enough for an Etsy-style grid of 4–5 columns at desktop, comfortable single column on mobile.
|
|
32
|
+
- **Section padding tiers:**
|
|
33
|
+
- Hero: `pt-16 pb-12 lg:pt-24 lg:pb-16`
|
|
34
|
+
- Default: `py-12 lg:py-20`
|
|
35
|
+
- Tight: `py-8 lg:py-12`
|
|
36
|
+
- **Allowed scale values:** 4 6 8 10 12 16 20 24 32 40 48 64 80. Medium density — denser than catalog, looser than utility.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
No hex in component files. All color via tokens. Opacity via `/N` modifier. The palette is intentionally warm — orange, plum, olive, mustard, cream — and decorations are earned through tag color and seller-personality treatments, not through chrome saturation.
|
|
40
|
+
|
|
41
|
+
Color role discipline:
|
|
42
|
+
- **Orange** = primary action (Add to Cart, Buy It Now, Save).
|
|
43
|
+
- **Plum** = secondary story tag (Vintage 1970s, One-of-a-Kind, Maker's Story).
|
|
44
|
+
- **Olive** = verified/authenticated tier (Verified Seller, Vestiaire-style luxury-resale badge).
|
|
45
|
+
- **Mustard** = price tag — On Sale, Make Offer, Last One Left.
|
|
46
|
+
- **Red (destructive)** = removed listing, sold-out status only.
|
|
47
|
+
|
|
48
|
+
White is forbidden; `--paper-warm` is the canvas. Pure black is forbidden; `--ink-grailed` is the warm-tilted ink.
|
|
49
|
+
|
|
50
|
+
## Radius
|
|
51
|
+
`--radius: 0.625rem` (10px). Softer than utility, never balloon, sits between soft-modern and editorial. Pills are allowed (`pillsAllowed: true`) — condition pills, category chips, story tags. Pill shape is reserved for data semantics (it IS a tag/badge); never used as a button shape on primary CTAs.
|
|
52
|
+
|
|
53
|
+
## Shadows
|
|
54
|
+
**Soft.** Three utilities:
|
|
55
|
+
- `.shadow-card` — base listing-card lift, warm-tinted: `0 1px 2px hsl(var(--ink-grailed) / 0.05), 0 4px 12px hsl(var(--ink-grailed) / 0.07)`.
|
|
56
|
+
- `.shadow-card-hover` — listing-card hover lift, slightly deeper.
|
|
57
|
+
- `.shadow-pricetag` — `1px 1px 0 hsl(var(--ink-grailed) / 0.9)`, a single hard offset shadow that gives the mustard On Sale chip a stamped-price-tag feel.
|
|
58
|
+
|
|
59
|
+
No glows. Shadows are warm-tinted (warm ink, not blue ink) — this matters; blue-tinted shadows on the warm canvas read off.
|
|
60
|
+
|
|
61
|
+
## Motion
|
|
62
|
+
Four keyframes:
|
|
63
|
+
- `fade-rise` — 320ms, the standard listing entrance. Quick, casual, not ceremonial.
|
|
64
|
+
- `tag-wiggle` — 400ms once, `rotate(-1.5deg) → rotate(1.5deg)` on On Sale / New / Maker tag hover. Hand-pinned-label energy.
|
|
65
|
+
- `heart-pop` — 280ms once, scale `1 → 1.35 → 1` on favorite/save. Confirms a save with vintage-feeling overshoot.
|
|
66
|
+
- `marquee-slow` — 28000ms infinite, the seller-strip and category-strip horizontal scroll. Flea-market frieze along the top of category pages.
|
|
67
|
+
|
|
68
|
+
Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — the marquee in particular respects the media query and pauses to a static strip.
|
|
69
|
+
|
|
70
|
+
## Component patterns
|
|
71
|
+
- **Buttons:** Solid-fill primary in `--orange-etsy` with white text, 0.625rem radius, `shadow-card`. Secondary is ghost (border, foreground text). Tertiary is text-link in primary. Pill shape is reserved for tags and chips — **never for primary CTAs**. Make Offer / On Sale buttons may use `--mustard-tag` with `--ink-grailed` text for an explicit price-tag feel + `shadow-pricetag`.
|
|
72
|
+
- **Cards:** Listing card: rounded radius, bg-card (lifted warm paper), `shadow-card`, no border. Photo-first at **1:1 square** — the marketplace standard for goods (vs. 4:3 for real estate). Below the photo: title in Fraunces 600, price in DM Mono, seller handle in DM Sans 500 with avatar. Hover applies `shadow-card-hover`. Story tags (Vintage 1970s, Handmade) overlay the photo top-left as pills.
|
|
73
|
+
- **Inputs:** Full rounded box with 1px `--input` border, bg-card. Search bar carries a leading magnifier icon and a trailing segmented control ("in shops / in listings"). Focus = 2px primary ring at 40% opacity.
|
|
74
|
+
- **CTA links:** Filled primary orange button for Add to Cart / Buy It Now. Heart (favorite) is icon-only ghost on the card; Follow Seller is pill ghost. Mustard On Sale chip is **a status pill, never a CTA** — the CTA below it is the orange Buy button.
|
|
75
|
+
|
|
76
|
+
## Recommended rich media
|
|
77
|
+
Marketplace-Vintage is photography-driven but the photography is **deliberately seller-personal**, not catalog-styled. The canonical hero photo is taken by the seller — on a wood tabletop, a tile floor, a thrifted velvet couch — with **natural window light, slight color cast acceptable**. The point is that a human made this listing, not a studio.
|
|
78
|
+
|
|
79
|
+
Five photo treatments are canon:
|
|
80
|
+
1. **Tabletop product** — flat or three-quarter, natural surface, the staple Etsy / Depop shot.
|
|
81
|
+
2. **Worn / modeled** — clothing on a person, mirror selfie acceptable on Depop-tier listings, full-length-mirror on Grailed-tier.
|
|
82
|
+
3. **In-situ environment** — vintage furniture in the seller's apartment, ceramics on a kitchen shelf.
|
|
83
|
+
4. **Detail / texture macro** — close-up of fabric weave, ceramic glaze, hardware patina.
|
|
84
|
+
5. **Story / maker portrait** — the seller in their studio, used on seller pages and authenticated-listing pages.
|
|
85
|
+
|
|
86
|
+
**AI tool recommendations:** Listing photography itself is human-shot — AI-generated product imagery on a marketplace is a fraud signal. For **category-page hero imagery and editorial seller-story photography**, **Midjourney v6+** with prompts like *"editorial product photography, natural window light, wood tabletop, vintage ceramics, slight film grain, Kodak Portra 400, Kinfolk magazine"* works for filler. For **decorative ornament** (category badges, seller-tier crests, hand-drawn category icons), **Recraft** with *"hand-drawn linocut illustration, single warm color, simple, vintage flea-market sign"* hits the tone.
|
|
87
|
+
|
|
88
|
+
**Aspect ratios:** 1:1 square for product/listing photography (the marketplace standard; tessellates in grid; matches Instagram-native seller behavior); 4:5 portrait for modeled clothing; 16:9 for category hero photography and seller-story features.
|
|
89
|
+
|
|
90
|
+
**Video:** Short looping product videos (turn-around, fabric-flow, detail-pan) are welcome inline at 6–12 seconds, autoplay-muted-loop on the listing detail page only — never in the grid. Tour-of-shop videos sit behind a poster image. ≤3 MB per loop, H.265 or AV1.
|
|
91
|
+
|
|
92
|
+
**Performance:** thumbnail ≤25 KB AVIF at 600w; lightbox image ≤100 KB at 1600w. The grid must lazy-load aggressively — a vintage-marketplace category page often holds 200+ listings.
|
|
93
|
+
|
|
94
|
+
**Avoid:** glossy studio-cyc product photography (reads corporate-marketplace), AI-generated product photos (trust failure), hyper-saturated Depop-2018 filters (dated), serif body type at small sizes (illegible on the dense grid), green CTAs (Etsy-confusion — orange is the only primary).
|
|
95
|
+
|
|
96
|
+
**Accessibility:** alt-text describes the item as the seller would in a caption — *"Cream wool cardigan, hand-knit, size medium, photographed flat on oak tabletop"*. Story tag text must be readable independently of color — the tag color is reinforcement, the word is the meaning.
|
|
97
|
+
|
|
98
|
+
## Component families
|
|
99
|
+
None at install time. Likely first families: listing-card (square photo, seller block), story-tag (pill with category color), seller-card (avatar + handle + verified tier), price-tag-chip (mustard On Sale, hard offset shadow).
|
|
100
|
+
|
|
101
|
+
## Details
|
|
102
|
+
- **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text — orange selection, slightly stronger than the marketplace baseline to feel warm.
|
|
103
|
+
- **Focus ring:** `2px solid hsl(var(--ring) / 0.55)` — visible orange ring, accessibility-first.
|
|
104
|
+
- **Scrollbar:** thin.
|
|
105
|
+
|
|
106
|
+
## Exceptions
|
|
107
|
+
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.
|
|
108
|
+
|
|
109
|
+
## Revisions
|
|
110
|
+
- Initial direction, generated at install time.
|