From 5b770dc79b2ba6b9b13cb76552ee05492c25997f Mon Sep 17 00:00:00 2001 From: SkateSpots Date: Mon, 28 Sep 2026 11:21:03 +0700 Subject: [PATCH] contents(app-shop): move the free printables into the 'Sticker packs' entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sticker + poster were their own 'Free to print' section, which made the shop read as two lists. They now live inside the 'Sticker packs' card in the 'In the works' grid (full-width, FREE badge, compact previews + Print/Save), between Decks and Shop tools — so a category shows what it already offers. Verified: no 'Free to print' heading remains, both printables still render, and the page reads hero -> in the works (5 entries) -> how buying works. --- AGENTS.md | 4 +- src/pages/AppShopPage.tsx | 163 ++++++++++++++++++++++---------------- 2 files changed, 96 insertions(+), 71 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index e3e0be7..c68771d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -361,7 +361,9 @@ session with **no other memory of this project**. So: 'nothing is for sale' note — removed on request). **Do not add prices/fake urgency/buy buttons until there is real stock**; when items exist, model them as listings and take Lightning/Cashu payment. The page reads the live stock strip as 0/None/Nothing - — keep it honest if that changes. It also serves two **free printables** + — keep it honest if that changes. It also serves two **free printables** (rendered INSIDE the 'Sticker packs' + entry of the 'In the works' grid — deliberately not a separate section, per the + owner: the free sticker + poster belong under their merch category) (`public/images/print/skatespots-sticker.svg` 55×86 mm, `…-poster.svg` A3), regenerated with `node scripts/make-print-art.mjs` (output is committed). Those SVGs are self-contained: brand fonts + logo embedded as data URIs and a real diff --git a/src/pages/AppShopPage.tsx b/src/pages/AppShopPage.tsx index 8ff4d31..687acdf 100644 --- a/src/pages/AppShopPage.tsx +++ b/src/pages/AppShopPage.tsx @@ -58,7 +58,8 @@ const FREE_PRINT = [ const PLANNED = [ { icon: Shirt, label: 'Tees & hoodies' }, { icon: Package, label: 'Decks' }, - { icon: Sticker, label: 'Sticker packs' }, + // 'Sticker packs' is rendered separately in the grid, because it is the one + // entry that already contains something real: the free printables. { icon: Hammer, label: 'Shop tools' }, ]; @@ -157,7 +158,97 @@ export default function AppShopPage() {
- {PLANNED.map(({ icon: Icon, label }) => ( + {PLANNED.slice(0, 2).map(({ icon: Icon, label }) => ( +
+
+ + + +

+ {label} +

+
+ + soon + +
+ ))} + + {/* Sticker packs — the only thing you can actually GET today: the free + printables. Kept inside its category (not a separate section) so the + shop reads as one list of merch, free stuff included. */} +
+
+ + + +
+

Sticker packs

+

+ The packs are coming. The designs are not — print these two right now, free. +

+
+ + Free + +
+ +
+ {FREE_PRINT.map((item) => ( +
+
+ {`SkateSpots +
+
+
+

{item.title}

+ + {item.size} + +
+

+ + {item.tip} +

+ +
+
+ ))} +
+ +

+ Print at 100% / “Actual size” so the size is + exact and the QR stays sharp — it points at skate-spots.org. Vector files, so they + scale without going fuzzy. +

+
+ + {PLANNED.slice(2).map(({ icon: Icon, label }) => (
- {/* ── Free to print ────────────────────────────────────────────────── */} -
-
-

- - Free to print -

-
- - no sats needed - -
- -
- {FREE_PRINT.map((item) => ( -
-
- {`SkateSpots - - Free - -
-
-
-

{item.title}

- - {item.size} - -
-

- - {item.tip} -

- -
-
- ))} -
- -

- Print at 100% / “Actual size” so the size is - exact and the QR stays sharp — it points at skate-spots.org. These are vector files, so - they scale to any size without going fuzzy. -

-
- {/* ── How it'll work ───────────────────────────────────────────────── */}