From 40b2cc8c5d1a36acd63fb867054b40774aa3c072 Mon Sep 17 00:00:00 2001 From: Greg Kilmer Date: Thu, 6 Aug 2026 12:42:27 -0400 Subject: [PATCH] Store detail updates --- src/data/store-availability.json | 14 +++++--- src/data/store-products.ts | 58 ++++++++++++++++++++++---------- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/data/store-availability.json b/src/data/store-availability.json index 50da5fc..6494d8a 100644 --- a/src/data/store-availability.json +++ b/src/data/store-availability.json @@ -1,10 +1,16 @@ { "ordersOpen": false, - "lastUpdated": "2026-08-04", + "lastUpdated": "2026-08-06", "turnaround": "Estimated turnaround: ~2 weeks once a list is confirmed.", "maxNote": "I take a limited number of orders at a time so each one gets full attention. Slots reopen as current orders finish.", "slots": { - "cards": { "open": 0, "total": 5 }, - "deckBoxes": { "open": 0, "total": 4 } + "cards": { + "open": 0, + "total": 3 + }, + "deckBoxes": { + "open": 0, + "total": 3 + } } -} +} \ No newline at end of file diff --git a/src/data/store-products.ts b/src/data/store-products.ts index ada1386..29660ce 100644 --- a/src/data/store-products.ts +++ b/src/data/store-products.ts @@ -42,6 +42,21 @@ export interface PriceTier { note?: string; } +/** + * A selectable filament/print color for a printed product. Rendered as a + * swatch on the product page and offered in the order form. Flip `inStock` to + * false when a color runs out — it shows as "Out of stock" and is removed from + * the order-form color list. + */ +export interface ColorOption { + /** Display name, e.g. "Midnight Black". */ + name: string; + /** Hex swatch color shown in the grid + form, e.g. "#1b1730". */ + hex: string; + /** Whether the color is currently available to order. */ + inStock: boolean; +} + export interface Product { /** mdi icon used as the decorative mark. */ icon: string; @@ -64,6 +79,13 @@ export interface Product { specs: SpecRow[]; /** Pricing tiers rendered as a pricing table. */ pricing: PriceTier[]; + /** + * Optional selectable print colors (filament). Rendered as a swatch grid on + * the product page and offered in the order form. Add/remove entries here to + * manage available colors; toggle `inStock` per color. Omit for products that + * have no color choice (e.g. proxy cards). + */ + colors?: ColorOption[]; } /** @@ -74,7 +96,7 @@ export const cardProduct: Product = { icon: 'cards-playing', title: 'Proxy MTG Cards', summary: - 'High-quality printed proxy cards for casual play, sized to match real Magic cards and clearly marked as proxies.', + 'High-quality printed proxy cards for casual play, sized to match real Magic cards and clearly marked as proxies intended for use sleeved.', slotKey: 'cards', images: [ { @@ -95,23 +117,25 @@ export const cardProduct: Product = { ], specs: [ { label: 'Size', value: '63 x 88 mm (standard MTG card size)' }, - { label: 'Thickness', value: '[Greg to fill] (e.g. 300 gsm / 350 gsm cardstock)' }, + { label: 'Thickness', value: '0.31mm laminated photo cardstock' }, { label: 'Back', value: 'Solid white back (clearly not tournament-legal)' }, { label: 'Finishes', - value: '[Greg to fill] (e.g. matte, linen, glossy)', + value: 'Default matte finish, available in glossy on request', }, { label: 'Double-sided cards', value: 'Printed as two separate cards and count as 2 card slots', }, - { label: 'Art', value: 'Official card art only. No custom or offensive art (see Requirements)' }, + { label: 'Art', value: 'Official card art only. No offensive art (custom cards usable if fully provided see Requirements)' }, ], pricing: [ - { band: '1-9 cards', price: '[Greg to fill]', note: 'per card' }, - { band: '10-39 cards', price: '[Greg to fill]', note: 'per card' }, - { band: '40-99 cards', price: '[Greg to fill]', note: 'per card' }, - { band: '100+ cards', price: '[Greg to fill]', note: 'per card' }, + { band: 'Individual cards', price: '$1.00', note: 'per card' }, + { band: 'Individual foil cards', price: '$2.00', note: 'per card' }, + { band: '36 card set', price: '$20.00', note: 'per set of cards' }, + { band: '60 card deck', price: '$30.00', note: 'per set of cards' }, + { band: '100 card deck', price: '$40.00', note: 'per set of cards' }, + { band: 'Deck Disclosure Card', price: '$2.00', note: 'per card' }, ], }; @@ -142,16 +166,16 @@ export const deckBoxProduct: Product = { }, ], specs: [ - { label: 'Capacity', value: '[Greg to fill] (e.g. 100 double-sleeved cards)' }, - { label: 'Material', value: '[Greg to fill] (e.g. PLA / PETG)' }, - { label: 'Finish', value: '[Greg to fill] (e.g. as-printed, sanded, painted)' }, - { label: 'Sizing', value: '[Greg to fill] (deck box + matching counters)' }, + { label: 'Capacity', value: '100 double-sleeved card bay / 82mm depth and tray 67 mm x 76 mm x 24 mm (width x depth x height)' }, + { label: 'Material', value: 'PLA with 2x4 magnets and top-loader protection pane' }, + { label: 'Finish', value: 'as-printed' }, + { label: 'Sizing', value: '86 mm x 109 mm x 143 mm (width x depth x height)' }, { label: 'Customization', value: 'Color selection from available filament' }, ], pricing: [ - { band: 'Single deck box', price: '[Greg to fill]', note: 'per print' }, - { band: 'Deck box + counter set', price: '[Greg to fill]', note: 'per set' }, - { band: 'Counter / token only', price: '[Greg to fill]', note: 'per print' }, + { band: 'Single deck box', price: '$30.00', note: 'per print' }, + { band: 'Deck box + counter set', price: 'Coming Soon', note: 'per set' }, + { band: 'Counter / token only', price: 'Coming Soon', note: 'per print' }, ], }; @@ -205,8 +229,8 @@ export const requirements: Requirement[] = [ }, { icon: 'alert', - title: 'No custom or offensive art', - body: 'I will not print custom art or any cards I find to be offensive. Only official card art is used.', + title: 'No offensive art', + body: 'I will not print custom art or any cards I find to be offensive. Only official card art is used unless card art fully provided by the customer.', }, { icon: 'information',