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 ───────────────────────────────────────────────── */}