feat: dark mode, community revenue messaging, design catalog update

- Switch to dark theme by default (globals.css + default space.yaml)
- Rewrite landing page copy to emphasize community revenue streams
  - "Revenue for Your Community" hero
  - "Merch That Funds Your Mission" section with revenue breakdown
  - Revenue routing to rFunds/DAOs/treasuries
- Step 1: "Upload or Create a Design"
- Step 3: "Ship Locally — Worldwide" (local fulfillment, less carbon)
- Features: Revenue Streams, Local Fulfillment replace old cards
- All designs now show on default space (space: all)
- DefectFi design gets hoodie product variant
- Fix light-mode hardcoded colors for dark compatibility (red-50, green-600)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-02-24 21:38:56 -08:00
parent dd873b91b5
commit a152e77fed
8 changed files with 219 additions and 120 deletions

View File

@ -1,8 +1,8 @@
name: "Don't Abuse the Holes!"
slug: defectfi-dont-abuse-holes
description: "Defensive bug hunting meets punk resistance. Distressed typography with beetles crawling through the design — because the best defense is finding the vulnerabilities before they find you. #DefectFi"
tags: [defectfi, whistleblower, bug-bounty, punk, resistance, tee]
space: default
description: "Defensive bug hunting meets punk resistance. Distressed typography with beetles crawling through the design — because the best defense is finding the vulnerabilities before they find you. Revenue from this design supports the DefectFi community. #DefectFi"
tags: [defectfi, whistleblower, bug-bounty, punk, resistance, tee, community]
space: all
category: shirts
created: "2026-02-24"
author: defectfi
@ -11,8 +11,8 @@ source:
file: dont-abuse-the-holes.png
format: png
dimensions:
width: 3600
height: 4800
width: 1743
height: 1786
dpi: 300
color_profile: sRGB
@ -22,5 +22,10 @@ products:
sku: "71"
variants: [S, M, L, XL, 2XL, 3XL]
retail_price: 29.99
- type: hoodie
provider: printful
sku: "146"
variants: [S, M, L, XL, 2XL]
retail_price: 49.99
status: active

View File

@ -1,8 +1,8 @@
name: "Fungi Flows Logo Tee"
slug: fungi-logo-tee
description: "The original Fungi Flows logo on a premium tee. Gold and bioluminescent green on deep purple — rep the mycelium movement."
tags: [fungiflows, mushroom, logo, hip-hop, pittsburgh, tee]
space: fungiflows
description: "The original Fungi Flows logo on a premium tee. Gold and bioluminescent green on deep purple — rep the mycelium movement. Revenue supports the Fungi Flows community."
tags: [fungiflows, mushroom, logo, hip-hop, pittsburgh, tee, community]
space: all
category: shirts
created: "2026-02-18"
author: fungi-flows
@ -22,5 +22,10 @@ products:
sku: "71"
variants: [S, M, L, XL, 2XL]
retail_price: 29.99
- type: hoodie
provider: printful
sku: "146"
variants: [S, M, L, XL, 2XL]
retail_price: 49.99
status: active

View File

@ -1,8 +1,8 @@
name: "Spore Print Sticker"
slug: fungi-spore
description: "Bioluminescent mushroom spore print design. Neon green on deep purple — the signature Fungi Flows aesthetic."
tags: [fungiflows, mushroom, spore, psychedelic, sticker]
space: fungiflows
description: "Bioluminescent mushroom spore print design. Neon green on deep purple — the signature Fungi Flows aesthetic. Revenue supports the Fungi Flows community."
tags: [fungiflows, mushroom, spore, psychedelic, sticker, community]
space: all
category: stickers
created: "2026-02-18"
author: fungi-flows

View File

@ -189,7 +189,7 @@ export default function DesignPage() {
</div>
{error && (
<div className="p-4 bg-red-50 border border-red-200 rounded-md text-red-700">
<div className="p-4 bg-destructive/10 border border-destructive/30 rounded-md text-red-400">
{error}
</div>
)}
@ -279,7 +279,7 @@ export default function DesignPage() {
<span
className={
generatedDesign.status === "active"
? "text-green-600"
? "text-emerald-400"
: "text-yellow-600"
}
>
@ -300,7 +300,7 @@ export default function DesignPage() {
</button>
<button
onClick={handleDelete}
className="px-4 py-2 border border-red-300 text-red-600 rounded-md font-medium hover:bg-red-50 transition-colors"
className="px-4 py-2 border border-red-500/30 text-red-400 rounded-md font-medium hover:bg-red-500/10 transition-colors"
>
Discard
</button>

View File

@ -4,48 +4,26 @@
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--card: 0 0% 100%;
--card-foreground: 222.2 84% 4.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 84% 4.9%;
--primary: 195 80% 45%;
--primary-foreground: 0 0% 100%;
--secondary: 45 80% 55%;
--secondary-foreground: 222.2 47.4% 11.2%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--ring: 195 80% 45%;
--radius: 0.625rem;
}
.dark {
--background: 264 30% 6%;
--background: 222 30% 6%;
--foreground: 180 10% 96%;
--card: 264 30% 6%;
--card: 222 25% 8%;
--card-foreground: 180 10% 96%;
--popover: 264 30% 6%;
--popover: 222 25% 8%;
--popover-foreground: 180 10% 96%;
--primary: 195 80% 50%;
--primary-foreground: 264 30% 6%;
--primary-foreground: 0 0% 100%;
--secondary: 45 80% 55%;
--secondary-foreground: 180 10% 96%;
--muted: 264 20% 15%;
--muted-foreground: 215 20.2% 65.1%;
--accent: 264 20% 15%;
--muted: 222 20% 14%;
--muted-foreground: 215 20% 65%;
--accent: 222 20% 14%;
--accent-foreground: 180 10% 96%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 210 40% 98%;
--border: 264 20% 15%;
--input: 264 20% 15%;
--border: 222 20% 16%;
--input: 222 20% 16%;
--ring: 195 80% 50%;
--radius: 0.625rem;
}
}

View File

@ -83,7 +83,7 @@ export default async function HomePage() {
Community Merch,
<br />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-primary to-secondary">
On Demand
Revenue for Your Community
</span>
</>
)}
@ -95,11 +95,12 @@ export default async function HomePage() {
"Custom merchandise for your community."
) : (
<>
Create a{" "}
<strong className="text-foreground">Space</strong> for your
community&apos;s merchandise. Design, upload, and sell{" "}
<strong className="text-foreground">print-on-demand</strong>{" "}
swag stickers, shirts, and more.
Locally produced merch that{" "}
<strong className="text-foreground">
feeds revenue directly into your community
</strong>
. Design, upload, and sell print-on-demand swag every sale
funds your project&apos;s mission.
</>
)}
</p>
@ -141,13 +142,13 @@ export default async function HomePage() {
How It Works
</span>
<h2 className="mt-3 text-2xl sm:text-3xl font-bold">
rSwag in 30 Seconds
From Design to Revenue in Minutes
</h2>
<p className="mt-2 text-lg text-muted-foreground max-w-2xl mx-auto">
<strong className="text-primary">Upload</strong> your design,{" "}
<strong className="text-secondary">preview</strong> it on products,
and <strong className="text-foreground">order</strong> print-on-demand
merch shipped worldwide.
<strong className="text-primary">Create</strong> your community&apos;s
merch, <strong className="text-secondary">sell</strong> it on demand,
and <strong className="text-foreground">fund</strong> your
community&apos;s work no inventory, no risk.
</p>
</div>
@ -166,17 +167,18 @@ export default async function HomePage() {
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"
d="M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42"
/>
</svg>
</div>
<h3 className="font-bold text-lg">1. Upload a Design</h3>
<h3 className="font-bold text-lg">1. Upload or Create a Design</h3>
</div>
<p className="text-sm text-muted-foreground leading-relaxed">
Upload your own artwork or generate a unique design with AI.
Transparent PNGs work best for clean product mockups.
Upload your own artwork or generate a unique design with our AI
studio. Logos, slogans, art anything that represents your
community.
<strong className="text-foreground block mt-2">
Your art, your merch.
Your community&apos;s identity, on merch.
</strong>
</p>
</div>
@ -199,13 +201,14 @@ export default async function HomePage() {
/>
</svg>
</div>
<h3 className="font-bold text-lg">2. Pick Products</h3>
<h3 className="font-bold text-lg">2. Pick Products & Set Prices</h3>
</div>
<p className="text-sm text-muted-foreground leading-relaxed">
Choose from t-shirts, hoodies, stickers, posters, mugs, and more.
See photorealistic mockups of your design on each product.
Set your markup every dollar above cost goes directly into your
community&apos;s funding stream.
<strong className="text-foreground block mt-2">
Preview before you order.
You set the margin, you keep the revenue.
</strong>
</p>
</div>
@ -224,32 +227,138 @@ export default async function HomePage() {
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5"
d="M12.75 3.03v.568c0 .334.148.65.405.864l1.068.89c.442.369.535 1.01.216 1.49l-.51.766a2.25 2.25 0 01-1.161.886l-.143.048a1.107 1.107 0 00-.57 1.664c.369.555.169 1.307-.427 1.605L9 13.125l.423 1.059a.956.956 0 01-1.652.928l-.679-.906a1.125 1.125 0 00-1.906.172L4.5 15.75l-.612.153M12.75 3.031a9 9 0 00-8.862 12.872M12.75 3.031a9 9 0 016.69 14.036m0 0l-.177-.529A2.25 2.25 0 0017.128 15H16.5l-.324-.324a1.453 1.453 0 00-2.328.377l-.036.073a1.586 1.586 0 01-.982.816l-.99.282c-.55.157-.894.702-.8 1.267l.073.438a2.253 2.253 0 01-1.699 2.608l-.425.108A9.012 9.012 0 013.888 15.9"
/>
</svg>
</div>
<h3 className="font-bold text-lg">3. Ship Worldwide</h3>
<h3 className="font-bold text-lg">3. Ship Locally Worldwide</h3>
</div>
<p className="text-sm text-muted-foreground leading-relaxed">
Printful prints and ships each order on demand. No inventory,
no waste just quality merch delivered to your door.
Printful prints locally from the nearest fulfillment center less
shipping, less carbon. Delivered to your community members anywhere
in the world.
<strong className="text-foreground block mt-2">
Printed fresh, shipped fast.
Local production, global reach.
</strong>
</p>
</div>
</div>
</section>
{/* ── Community Revenue Model ───────────────────────────── */}
<section className="py-16 bg-muted/30">
<div className="max-w-5xl mx-auto px-4">
<div className="text-center mb-12">
<h2 className="text-2xl sm:text-3xl font-bold mb-4">
Merch That Funds Your Mission
</h2>
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
Every purchase feeds revenue directly into your community&apos;s
funding streams. No middlemen, no platform fees eating your margins.
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-4xl mx-auto">
{/* Revenue Flow */}
<div className="border border-primary/20 rounded-xl p-6 bg-card">
<div className="flex items-center gap-3 mb-4">
<div className="h-10 w-10 rounded-full bg-gradient-to-br from-green-500 to-emerald-600 flex items-center justify-center shrink-0">
<svg
className="h-5 w-5 text-white"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth={2}
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M2.25 18L9 11.25l4.306 4.307a11.95 11.95 0 015.814-5.519l2.74-1.22m0 0l-5.94-2.28m5.94 2.28l-2.28 5.941"
/>
</svg>
</div>
<h3 className="font-bold text-lg">Direct Revenue Stream</h3>
</div>
<p className="text-sm text-muted-foreground leading-relaxed mb-4">
Set your own margins. Printful handles production at cost, and
the markup goes straight into your community&apos;s treasury, DAO,
or project fund.
</p>
<div className="bg-muted/50 rounded-lg p-4 text-sm space-y-2">
<div className="flex justify-between">
<span className="text-muted-foreground">Production cost</span>
<span>$9.25</span>
</div>
<div className="flex justify-between">
<span className="text-muted-foreground">Your price</span>
<span>$29.99</span>
</div>
<div className="border-t border-border pt-2 flex justify-between font-bold text-primary">
<span>Community revenue</span>
<span>$20.74 per sale</span>
</div>
</div>
</div>
{/* Community Benefits */}
<div className="border border-primary/20 rounded-xl p-6 bg-card">
<div className="flex items-center gap-3 mb-4">
<div className="h-10 w-10 rounded-full bg-gradient-to-br from-primary to-primary/60 flex items-center justify-center shrink-0">
<svg
className="h-5 w-5 text-white"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth={2}
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M18 18.72a9.094 9.094 0 003.741-.479 3 3 0 00-4.682-2.72m.94 3.198l.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0112 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 016 18.719m12 0a5.971 5.971 0 00-.941-3.197m0 0A5.995 5.995 0 0012 12.75a5.995 5.995 0 00-5.058 2.772m0 0a3 3 0 00-4.681 2.72 8.986 8.986 0 003.74.477m.94-3.197a5.971 5.971 0 00-.94 3.197M15 6.75a3 3 0 11-6 0 3 3 0 016 0zm6 3a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0zm-13.5 0a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z"
/>
</svg>
</div>
<h3 className="font-bold text-lg">Built for Communities</h3>
</div>
<ul className="text-sm text-muted-foreground space-y-3">
<li className="flex items-start gap-2">
<svg className="h-5 w-5 text-primary shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<span><strong className="text-foreground">Branded Spaces</strong> each community gets their own storefront with custom theme, logo, and catalog</span>
</li>
<li className="flex items-start gap-2">
<svg className="h-5 w-5 text-primary shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<span><strong className="text-foreground">Zero inventory risk</strong> items printed on demand, no upfront costs for your community</span>
</li>
<li className="flex items-start gap-2">
<svg className="h-5 w-5 text-primary shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<span><strong className="text-foreground">Revenue routing</strong> connect to rFunds, DAOs, or any wallet to stream merch revenue directly into community funding</span>
</li>
<li className="flex items-start gap-2">
<svg className="h-5 w-5 text-primary shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<span><strong className="text-foreground">Local production</strong> Printful fulfills from the nearest center, reducing shipping distance and carbon footprint</span>
</li>
</ul>
</div>
</div>
</div>
</section>
{/* ── Features Grid ─────────────────────────────────────── */}
<section className="py-16 max-w-5xl mx-auto px-4">
<div className="text-center mb-12">
<h2 className="text-2xl sm:text-3xl font-bold mb-4">
Built for Communities
Everything Your Community Needs
</h2>
<p className="text-muted-foreground">
Everything you need to run a merch shop for your project or
community
Tools to design, sell, and ship merch that funds your collective work
</p>
</div>
@ -272,8 +381,8 @@ export default async function HomePage() {
</div>
<h3 className="font-semibold mb-2">AI Design Studio</h3>
<p className="text-sm text-muted-foreground">
Generate unique designs with AI or upload your own artwork.
Instant photorealistic mockups.
Generate unique designs with AI or upload your own. Instant
photorealistic product mockups.
</p>
</div>
@ -295,8 +404,8 @@ export default async function HomePage() {
</div>
<h3 className="font-semibold mb-2">Community Spaces</h3>
<p className="text-sm text-muted-foreground">
Each community gets its own branded storefront with custom themes,
logos, and product catalog.
Each community gets its own branded storefront custom domain,
theme, and product catalog.
</p>
</div>
@ -312,14 +421,14 @@ export default async function HomePage() {
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H14.23c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z"
d="M2.25 18L9 11.25l4.306 4.307a11.95 11.95 0 015.814-5.519l2.74-1.22m0 0l-5.94-2.28m5.94 2.28l-2.28 5.941"
/>
</svg>
</div>
<h3 className="font-semibold mb-2">Zero Inventory</h3>
<h3 className="font-semibold mb-2">Revenue Streams</h3>
<p className="text-sm text-muted-foreground">
Print-on-demand means no upfront costs, no warehouse, no waste.
Items are printed fresh per order.
Merch revenue flows directly to your community connect to rFunds,
DAOs, treasuries, or any funding channel.
</p>
</div>
@ -341,8 +450,8 @@ export default async function HomePage() {
</div>
<h3 className="font-semibold mb-2">Realistic Mockups</h3>
<p className="text-sm text-muted-foreground">
See your design on real product photos via Printful&apos;s mockup
engine. No guessing how it&apos;ll look.
See your design on real products via Printful&apos;s mockup engine
before you ever commit to an order.
</p>
</div>
@ -358,14 +467,14 @@ export default async function HomePage() {
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M2.25 8.25h19.5M2.25 9h19.5m-16.5 5.25h6m-6 2.25h3m-3.75 3h15a2.25 2.25 0 002.25-2.25V6.75A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25v10.5A2.25 2.25 0 004.5 19.5z"
d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418"
/>
</svg>
</div>
<h3 className="font-semibold mb-2">Secure Payments</h3>
<h3 className="font-semibold mb-2">Local Fulfillment</h3>
<p className="text-sm text-muted-foreground">
Pay with Mollie credit card, iDEAL, PayPal, and more. European
data residency for privacy.
Printed at the nearest Printful facility shorter shipping
distances, less carbon, faster delivery.
</p>
</div>
@ -381,14 +490,14 @@ export default async function HomePage() {
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M12.75 3.03v.568c0 .334.148.65.405.864l1.068.89c.442.369.535 1.01.216 1.49l-.51.766a2.25 2.25 0 01-1.161.886l-.143.048a1.107 1.107 0 00-.57 1.664c.369.555.169 1.307-.427 1.605L9 13.125l.423 1.059a.956.956 0 01-1.652.928l-.679-.906a1.125 1.125 0 00-1.906.172L4.5 15.75l-.612.153M12.75 3.031a9 9 0 00-8.862 12.872M12.75 3.031a9 9 0 016.69 14.036m0 0l-.177-.529A2.25 2.25 0 0017.128 15H16.5l-.324-.324a1.453 1.453 0 00-2.328.377l-.036.073a1.586 1.586 0 01-.982.816l-.99.282c-.55.157-.894.702-.8 1.267l.073.438a2.253 2.253 0 01-1.699 2.608l-.425.108A9.012 9.012 0 013.888 15.9"
d="M13.5 16.875h3.375m0 0h3.375m-3.375 0V13.5m0 3.375v3.375M6 10.5h2.25a2.25 2.25 0 002.25-2.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v2.25A2.25 2.25 0 006 10.5zm0 9.75h2.25A2.25 2.25 0 0010.5 18v-2.25a2.25 2.25 0 00-2.25-2.25H6a2.25 2.25 0 00-2.25 2.25V18A2.25 2.25 0 006 20.25zm9.75-9.75H18a2.25 2.25 0 002.25-2.25V6A2.25 2.25 0 0018 3.75h-2.25A2.25 2.25 0 0013.5 6v2.25a2.25 2.25 0 002.25 2.25z"
/>
</svg>
</div>
<h3 className="font-semibold mb-2">rSpace Ecosystem</h3>
<p className="text-sm text-muted-foreground">
Part of the r* suite integrates with rVote, rWork, rMaps, and
more collaborative tools.
Part of the r* suite integrates with rFunds for treasury, rVote
for design governance, and more.
</p>
</div>
</div>
@ -396,14 +505,15 @@ export default async function HomePage() {
{/* ── Featured Products ─────────────────────────────────── */}
{products.length > 0 && (
<section className="py-16 bg-muted/30">
<section className="py-16">
<div className="max-w-5xl mx-auto px-4">
<div className="text-center mb-10">
<h2 className="text-2xl sm:text-3xl font-bold mb-2">
Featured Products
Community Merch
</h2>
<p className="text-muted-foreground">
Print-on-demand fulfilled by Printful, shipped worldwide.
Locally produced, print-on-demand every sale supports the
community.
</p>
</div>
@ -414,7 +524,7 @@ export default async function HomePage() {
href={`/products/${product.slug}`}
className="group block"
>
<div className="relative overflow-hidden rounded-xl border bg-card shadow-sm transition-all duration-300 hover:shadow-xl hover:-translate-y-1">
<div className="relative overflow-hidden rounded-xl border border-border/50 bg-card shadow-sm transition-all duration-300 hover:shadow-xl hover:shadow-primary/5 hover:-translate-y-1 hover:border-primary/30">
<div className="aspect-square bg-muted relative overflow-hidden">
<img
src={`${API_URL}/designs/${product.slug}/mockup?type=${getMockupType(product.product_type)}`}
@ -470,14 +580,15 @@ export default async function HomePage() {
<div className="absolute bottom-0 left-0 w-64 h-64 bg-secondary/10 rounded-full blur-3xl" />
<div className="py-12 sm:py-16 text-center space-y-6 relative px-6">
<span className="inline-flex items-center rounded-full text-sm px-4 py-1.5 bg-primary/10 text-primary border border-primary/20 font-medium">
Join the rSpace Ecosystem
Fund Your Community
</span>
<h2 className="text-2xl sm:text-3xl font-bold">
Ready to launch your community&apos;s merch?
Turn your community&apos;s identity into a revenue stream
</h2>
<p className="text-lg text-muted-foreground max-w-xl mx-auto">
Create a Space for your project, upload your designs, and let your
community order swag all powered by print-on-demand.
Create a Space, upload your designs, and start selling merch that
funds your community&apos;s work. Every sale flows directly into your
community&apos;s funding channels.
</p>
<div className="flex flex-col sm:flex-row justify-center gap-4">
<Link
@ -503,7 +614,7 @@ export default async function HomePage() {
href="/products"
className="inline-flex items-center justify-center rounded-lg border border-primary/30 hover:bg-primary/5 px-8 py-3.5 text-lg font-medium transition-colors"
>
Browse the Demo
Browse the Shop
</Link>
</div>
</div>

View File

@ -303,7 +303,7 @@ export default function UploadPage() {
</div>
{error && (
<div className="p-4 bg-red-50 border border-red-200 rounded-md text-red-700">
<div className="p-4 bg-destructive/10 border border-destructive/30 rounded-md text-red-400">
{error}
</div>
)}
@ -354,7 +354,7 @@ export default function UploadPage() {
<span
className={
uploadedDesign.status === "active"
? "text-green-600"
? "text-emerald-400"
: "text-yellow-600"
}
>
@ -375,7 +375,7 @@ export default function UploadPage() {
</button>
<button
onClick={handleDelete}
className="px-4 py-2 border border-red-300 text-red-600 rounded-md font-medium hover:bg-red-50 transition-colors"
className="px-4 py-2 border border-red-500/30 text-red-400 rounded-md font-medium hover:bg-red-500/10 transition-colors"
>
Discard
</button>

View File

@ -1,30 +1,30 @@
id: default
name: "rSwag"
tagline: "Merch for the rSpace ecosystem"
description: "Stickers, shirts, and more — designed by the community, printed on demand."
tagline: "Community Merch, On Demand"
description: "Your community's merch shop — designed locally, printed on demand. Revenue flows directly back to your community."
domain: "rswag.online"
footer_text: "rSpace. Infrastructure for the commons."
theme:
primary: "195 80% 45%"
primary: "195 80% 50%"
primary_foreground: "0 0% 100%"
secondary: "45 80% 55%"
secondary_foreground: "222.2 47.4% 11.2%"
background: "0 0% 100%"
foreground: "222.2 84% 4.9%"
card: "0 0% 100%"
card_foreground: "222.2 84% 4.9%"
popover: "0 0% 100%"
popover_foreground: "222.2 84% 4.9%"
muted: "210 40% 96.1%"
muted_foreground: "215.4 16.3% 46.9%"
accent: "210 40% 96.1%"
accent_foreground: "222.2 47.4% 11.2%"
destructive: "0 84.2% 60.2%"
secondary_foreground: "180 10% 96%"
background: "222 30% 6%"
foreground: "180 10% 96%"
card: "222 25% 8%"
card_foreground: "180 10% 96%"
popover: "222 25% 8%"
popover_foreground: "180 10% 96%"
muted: "222 20% 14%"
muted_foreground: "215 20% 65%"
accent: "222 20% 14%"
accent_foreground: "180 10% 96%"
destructive: "0 62.8% 30.6%"
destructive_foreground: "210 40% 98%"
border: "214.3 31.8% 91.4%"
input: "214.3 31.8% 91.4%"
ring: "195 80% 45%"
border: "222 20% 16%"
input: "222 20% 16%"
ring: "195 80% 50%"
design_filter: "all"
logo_url: null