v0.6: template-manager owns the product catalog

The host no longer carries a runtime product catalog. products.js
shrinks to a legacy single-product stub; the canonical catalog lives in
template-manager's productsStore, seeded ONCE on first boot from the
new seedProducts.js (after that the store under templates/ is
authoritative and the seed is ignored — intentional, so restarts never
rewrite an admin-managed catalog). phoneModels.js and
templateCategories.js are the supporting constant sets, and
docs/template-schema.md documents the v4 schema.

templates/ is the admin-managed store itself (_products_index.json +
products/<id>/product.json, JSON only) — committed so the configured
catalog (sizes, pricing, options built up in the admin UI) survives a
fresh checkout rather than regressing to the seed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
khalid@traclabs.com
2026-09-01 23:28:48 -05:00
parent b5b8808251
commit aba2dbedfb
17 changed files with 1549 additions and 76 deletions

View File

@@ -0,0 +1,104 @@
{
"products": {
"c3ac22c7-ef49-4997-a525-d4f0eb32da6f": {
"id": "c3ac22c7-ef49-4997-a525-d4f0eb32da6f",
"slug": "shirt",
"label": "T-Shirt",
"category": "Apparel",
"sizeCount": 5,
"createdAt": "2026-05-25T12:31:21.547Z",
"updatedAt": "2026-05-25T12:31:21.547Z"
},
"6202b99a-a4a9-4f11-8b2d-32c17516ecfa": {
"id": "6202b99a-a4a9-4f11-8b2d-32c17516ecfa",
"slug": "hoodie",
"label": "Hoodie",
"category": "Apparel",
"sizeCount": 5,
"createdAt": "2026-05-25T12:31:21.552Z",
"updatedAt": "2026-05-25T12:31:21.552Z"
},
"f530dc06-ef10-46b4-9903-3927f85bd9a7": {
"id": "f530dc06-ef10-46b4-9903-3927f85bd9a7",
"slug": "magnet",
"label": "Magnet",
"category": "Home",
"sizeCount": 3,
"createdAt": "2026-05-25T12:31:21.554Z",
"updatedAt": "2026-05-25T12:31:21.554Z"
},
"951cc0aa-6b28-460a-ad31-8ac8fdcc5ebd": {
"id": "951cc0aa-6b28-460a-ad31-8ac8fdcc5ebd",
"slug": "mug",
"label": "Ceramic Mug",
"category": "Drinkware",
"sizeCount": 2,
"createdAt": "2026-05-25T12:31:21.555Z",
"updatedAt": "2026-05-25T12:31:21.555Z"
},
"95dca14e-28e4-46e8-93b1-b45e3b556530": {
"id": "95dca14e-28e4-46e8-93b1-b45e3b556530",
"slug": "poster",
"label": "Poster",
"category": "Wall Art",
"sizeCount": 2,
"createdAt": "2026-05-25T12:31:21.556Z",
"updatedAt": "2026-05-25T12:31:21.556Z"
},
"1d69616b-96a8-4280-9beb-c8926222c589": {
"id": "1d69616b-96a8-4280-9beb-c8926222c589",
"slug": "tote",
"label": "Tote Bag",
"category": "Accessories",
"sizeCount": 1,
"createdAt": "2026-05-25T12:31:21.557Z",
"updatedAt": "2026-05-25T12:31:21.557Z"
},
"c722b19b-d6c6-4639-b0eb-dec34731e50d": {
"id": "c722b19b-d6c6-4639-b0eb-dec34731e50d",
"slug": "pillow",
"label": "Throw Pillow",
"category": "Home",
"sizeCount": 1,
"createdAt": "2026-05-25T12:31:21.558Z",
"updatedAt": "2026-05-25T12:31:21.558Z"
},
"1ed028ad-1998-4ace-813b-79023bd08c1d": {
"id": "1ed028ad-1998-4ace-813b-79023bd08c1d",
"slug": "notebook",
"label": "Notebook",
"category": "Stationery",
"sizeCount": 1,
"createdAt": "2026-05-25T12:31:21.559Z",
"updatedAt": "2026-05-25T12:31:21.559Z"
},
"04507704-50a9-4de9-9b23-475d6b76bf0e": {
"id": "04507704-50a9-4de9-9b23-475d6b76bf0e",
"slug": "sticker",
"label": "Sticker",
"category": "Stationery",
"sizeCount": 1,
"createdAt": "2026-05-25T12:31:21.560Z",
"updatedAt": "2026-05-25T12:31:21.560Z"
},
"cb43b749-05c0-4d1c-8d0b-dadd9b28574d": {
"id": "cb43b749-05c0-4d1c-8d0b-dadd9b28574d",
"slug": "hat",
"label": "Hat",
"category": "Apparel",
"sizeCount": 1,
"createdAt": "2026-05-25T12:31:21.562Z",
"updatedAt": "2026-05-25T12:31:21.562Z"
},
"f5cbb673-8696-4dad-a63c-3a802ba53fd3": {
"id": "f5cbb673-8696-4dad-a63c-3a802ba53fd3",
"slug": "phone-case",
"label": "Phone Case",
"category": "Accessories",
"sizeCount": 1,
"createdAt": "2026-05-25T12:31:21.563Z",
"updatedAt": "2026-05-25T12:31:21.563Z"
}
},
"version": 1
}

View File

@@ -0,0 +1,35 @@
{
"id": "04507704-50a9-4de9-9b23-475d6b76bf0e",
"slug": "sticker",
"label": "Sticker",
"description": "Weatherproof vinyl sticker, die-cut to your design.",
"category": "Stationery",
"options": [],
"sizes": [
{
"id": "6744bd80-e64b-4351-a0b8-9316dd138db5",
"slug": "3in-die-cut",
"label": "3\" Die-Cut",
"physical": {
"width": 3,
"height": 3,
"unit": "in"
},
"canvas": {
"width": 300,
"height": 300
},
"printZone": {
"x": 30,
"y": 30,
"width": 240,
"height": 240
},
"silhouettePath": "M12,0 L288,0 A12,12 0 0 1 300,12 L300,288 A12,12 0 0 1 288,300 L12,300 A12,12 0 0 1 0,288 L0,12 A12,12 0 0 1 12,0 Z",
"mockupFallbackColor": "#fce7f3",
"basePriceCents": 400
}
],
"createdAt": "2026-05-25T12:31:21.560Z",
"updatedAt": "2026-05-25T12:31:21.560Z"
}

View File

@@ -0,0 +1,35 @@
{
"id": "1d69616b-96a8-4280-9beb-c8926222c589",
"slug": "tote",
"label": "Tote Bag",
"description": "Sturdy canvas tote with reinforced straps.",
"category": "Accessories",
"options": [],
"sizes": [
{
"id": "61e5519d-1230-4397-a795-7303a30e0881",
"slug": "14x14",
"label": "14\" × 14\"",
"physical": {
"width": 14,
"height": 14,
"unit": "in"
},
"canvas": {
"width": 1400,
"height": 1400
},
"printZone": {
"x": 140,
"y": 140,
"width": 1120,
"height": 1120
},
"silhouettePath": "M56,0 L1344,0 A56,56 0 0 1 1400,56 L1400,1344 A56,56 0 0 1 1344,1400 L56,1400 A56,56 0 0 1 0,1344 L0,56 A56,56 0 0 1 56,0 Z",
"mockupFallbackColor": "#fef3c7",
"basePriceCents": 1800
}
],
"createdAt": "2026-05-25T12:31:21.557Z",
"updatedAt": "2026-05-25T12:31:21.557Z"
}

View File

@@ -0,0 +1,35 @@
{
"id": "1ed028ad-1998-4ace-813b-79023bd08c1d",
"slug": "notebook",
"label": "Notebook",
"description": "A5 hardcover notebook, 120 lined pages.",
"category": "Stationery",
"options": [],
"sizes": [
{
"id": "add070b4-1fa3-47bb-84a5-df8d99c2b821",
"slug": "a5",
"label": "A5",
"physical": {
"width": 5.5,
"height": 8.5,
"unit": "in"
},
"canvas": {
"width": 550,
"height": 850
},
"printZone": {
"x": 55,
"y": 85,
"width": 440,
"height": 680
},
"silhouettePath": "M22,0 L528,0 A22,22 0 0 1 550,22 L550,828 A22,22 0 0 1 528,850 L22,850 A22,22 0 0 1 0,828 L0,22 A22,22 0 0 1 22,0 Z",
"mockupFallbackColor": "#fafaf9",
"basePriceCents": 1500
}
],
"createdAt": "2026-05-25T12:31:21.559Z",
"updatedAt": "2026-05-25T12:31:21.559Z"
}

View File

@@ -0,0 +1,154 @@
{
"id": "6202b99a-a4a9-4f11-8b2d-32c17516ecfa",
"slug": "hoodie",
"label": "Hoodie",
"description": "Heavyweight pullover hoodie with front-and-back print options.",
"category": "Apparel",
"options": [
{
"id": "49a9bd93-84c9-4e9c-a4e6-c1e742c6777a",
"slug": "color",
"label": "Color",
"kind": "color",
"values": [
{
"id": "4e8d2854-8f0e-4c99-b854-8c0e07b59a49",
"slug": "black",
"label": "Black",
"hex": "#111827"
},
{
"id": "618c49fc-9fc6-486b-9d83-a2fff373092f",
"slug": "navy",
"label": "Navy",
"hex": "#1e3a8a"
},
{
"id": "0d1d8ec2-c7b9-40c9-9da8-9b5f1c6d1e3f",
"slug": "gray",
"label": "Heather Gray",
"hex": "#9ca3af"
}
]
}
],
"sizes": [
{
"id": "f002d98e-6601-46cb-9ed0-ad6608a794ac",
"slug": "s",
"label": "Small",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#475569",
"basePriceCents": 4800
},
{
"id": "13849307-bed4-4654-9476-fb135561f05f",
"slug": "m",
"label": "Medium",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#475569",
"basePriceCents": 4800
},
{
"id": "b327d6c5-8f0b-4639-b8ec-8d3f4ec74d1a",
"slug": "l",
"label": "Large",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#475569",
"basePriceCents": 4800
},
{
"id": "af9ed947-e705-4205-87b0-6c529ce6b342",
"slug": "xl",
"label": "X-Large",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#475569",
"basePriceCents": 5200
},
{
"id": "83156320-5f30-4cf8-b28c-3f69fcf7887e",
"slug": "xxl",
"label": "XX-Large",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#475569",
"basePriceCents": 5400
}
],
"createdAt": "2026-05-25T12:31:21.552Z",
"updatedAt": "2026-05-25T12:31:21.552Z"
}

View File

@@ -0,0 +1,58 @@
{
"id": "951cc0aa-6b28-460a-ad31-8ac8fdcc5ebd",
"slug": "mug",
"label": "Ceramic Mug",
"description": "Dishwasher-safe ceramic mug. Print wraps the body.",
"category": "Drinkware",
"options": [],
"sizes": [
{
"id": "ccaf7033-3e43-4171-9cde-fe6be676ea05",
"slug": "11oz",
"label": "11oz",
"physical": {
"width": 8,
"height": 3.25,
"unit": "in"
},
"canvas": {
"width": 800,
"height": 325
},
"printZone": {
"x": 80,
"y": 33,
"width": 640,
"height": 259
},
"silhouettePath": "M13,0 L787,0 A13,13 0 0 1 800,13 L800,312 A13,13 0 0 1 787,325 L13,325 A13,13 0 0 1 0,312 L0,13 A13,13 0 0 1 13,0 Z",
"mockupFallbackColor": "#f8fafc",
"basePriceCents": 1500
},
{
"id": "ae4ad837-6669-4491-af8e-445f90794779",
"slug": "15oz",
"label": "15oz",
"physical": {
"width": 8.5,
"height": 4.25,
"unit": "in"
},
"canvas": {
"width": 850,
"height": 425
},
"printZone": {
"x": 85,
"y": 43,
"width": 680,
"height": 339
},
"silhouettePath": "M17,0 L833,0 A17,17 0 0 1 850,17 L850,408 A17,17 0 0 1 833,425 L17,425 A17,17 0 0 1 0,408 L0,17 A17,17 0 0 1 17,0 Z",
"mockupFallbackColor": "#f1f5f9",
"basePriceCents": 1800
}
],
"createdAt": "2026-05-25T12:31:21.555Z",
"updatedAt": "2026-05-25T12:31:21.555Z"
}

View File

@@ -0,0 +1,58 @@
{
"id": "95dca14e-28e4-46e8-93b1-b45e3b556530",
"slug": "poster",
"label": "Poster",
"description": "Premium matte poster, suitable for framing.",
"category": "Wall Art",
"options": [],
"sizes": [
{
"id": "7d015072-f884-4e04-8a39-ce7c8e149059",
"slug": "12x18",
"label": "12\" × 18\"",
"physical": {
"width": 12,
"height": 18,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1800
},
"printZone": {
"x": 120,
"y": 180,
"width": 960,
"height": 1440
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1752 A48,48 0 0 1 1152,1800 L48,1800 A48,48 0 0 1 0,1752 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#f3f4f6",
"basePriceCents": 1800
},
{
"id": "9a5529fd-e54e-4868-acbb-5a62c44d1297",
"slug": "18x24",
"label": "18\" × 24\"",
"physical": {
"width": 18,
"height": 24,
"unit": "in"
},
"canvas": {
"width": 1800,
"height": 2400
},
"printZone": {
"x": 180,
"y": 240,
"width": 1440,
"height": 1920
},
"silhouettePath": "M72,0 L1728,0 A72,72 0 0 1 1800,72 L1800,2328 A72,72 0 0 1 1728,2400 L72,2400 A72,72 0 0 1 0,2328 L0,72 A72,72 0 0 1 72,0 Z",
"mockupFallbackColor": "#e5e7eb",
"basePriceCents": 2400
}
],
"createdAt": "2026-05-25T12:31:21.556Z",
"updatedAt": "2026-05-25T12:31:21.556Z"
}

View File

@@ -0,0 +1,154 @@
{
"id": "c3ac22c7-ef49-4997-a525-d4f0eb32da6f",
"slug": "shirt",
"label": "T-Shirt",
"description": "Soft cotton tee, printed on the front.",
"category": "Apparel",
"options": [
{
"id": "9d58a8b1-5976-4512-9095-883f16a4c1b8",
"slug": "color",
"label": "Color",
"kind": "color",
"values": [
{
"id": "29092f97-2654-4150-89e5-7a323eb891e4",
"slug": "white",
"label": "White",
"hex": "#ffffff"
},
{
"id": "c25f746a-efc2-4213-9328-728ac6881bc6",
"slug": "black",
"label": "Black",
"hex": "#1f2937"
},
{
"id": "8e077db8-bc48-45c0-a3e1-df10b6f1367f",
"slug": "pink",
"label": "Dusty Pink",
"hex": "#fbcfe8"
}
]
}
],
"sizes": [
{
"id": "3df58f51-70ce-4898-8091-2bb186b04193",
"slug": "s",
"label": "Small",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#f4f4f5",
"basePriceCents": 2200
},
{
"id": "86787c88-c4e0-4798-a34f-d1e173b2704b",
"slug": "m",
"label": "Medium",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#f4f4f5",
"basePriceCents": 2200
},
{
"id": "8cf5377f-8c6b-4afe-80c3-9337e6303176",
"slug": "l",
"label": "Large",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#f4f4f5",
"basePriceCents": 2200
},
{
"id": "ecc7707a-1703-4c27-9da7-6b39709837ba",
"slug": "xl",
"label": "X-Large",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#f4f4f5",
"basePriceCents": 2400
},
{
"id": "3667ec33-6123-44bd-a12e-5fdfef3c2874",
"slug": "xxl",
"label": "XX-Large",
"physical": {
"width": 12,
"height": 16,
"unit": "in"
},
"canvas": {
"width": 1200,
"height": 1600
},
"printZone": {
"x": 120,
"y": 160,
"width": 960,
"height": 1280
},
"silhouettePath": "M48,0 L1152,0 A48,48 0 0 1 1200,48 L1200,1552 A48,48 0 0 1 1152,1600 L48,1600 A48,48 0 0 1 0,1552 L0,48 A48,48 0 0 1 48,0 Z",
"mockupFallbackColor": "#f4f4f5",
"basePriceCents": 2600
}
],
"createdAt": "2026-05-25T12:31:21.547Z",
"updatedAt": "2026-05-25T12:31:21.547Z"
}

View File

@@ -0,0 +1,35 @@
{
"id": "c722b19b-d6c6-4639-b0eb-dec34731e50d",
"slug": "pillow",
"label": "Throw Pillow",
"description": "Plush throw pillow with hidden zipper and insert.",
"category": "Home",
"options": [],
"sizes": [
{
"id": "22d04708-d964-4cdc-a682-fa9c02372a88",
"slug": "18x18",
"label": "18\" × 18\"",
"physical": {
"width": 18,
"height": 18,
"unit": "in"
},
"canvas": {
"width": 1800,
"height": 1800
},
"printZone": {
"x": 180,
"y": 180,
"width": 1440,
"height": 1440
},
"silhouettePath": "M162,0 L1638,0 A162,162 0 0 1 1800,162 L1800,1638 A162,162 0 0 1 1638,1800 L162,1800 A162,162 0 0 1 0,1638 L0,162 A162,162 0 0 1 162,0 Z",
"mockupFallbackColor": "#dcfce7",
"basePriceCents": 2400
}
],
"createdAt": "2026-05-25T12:31:21.558Z",
"updatedAt": "2026-05-25T12:31:21.558Z"
}

View File

@@ -0,0 +1,35 @@
{
"id": "cb43b749-05c0-4d1c-8d0b-dadd9b28574d",
"slug": "hat",
"label": "Hat",
"description": "Adjustable baseball cap with embroidered front print.",
"category": "Apparel",
"options": [],
"sizes": [
{
"id": "778c4b47-a46b-4753-8fa2-be8af1523f4a",
"slug": "cap",
"label": "Baseball Cap",
"physical": {
"width": 5,
"height": 2,
"unit": "in"
},
"canvas": {
"width": 500,
"height": 200
},
"printZone": {
"x": 50,
"y": 20,
"width": 400,
"height": 160
},
"silhouettePath": "M30,0 L470,0 A30,30 0 0 1 500,30 L500,170 A30,30 0 0 1 470,200 L30,200 A30,30 0 0 1 0,170 L0,30 A30,30 0 0 1 30,0 Z",
"mockupFallbackColor": "#fce7f3",
"basePriceCents": 2200
}
],
"createdAt": "2026-05-25T12:31:21.562Z",
"updatedAt": "2026-05-25T12:31:21.562Z"
}

View File

@@ -0,0 +1,81 @@
{
"id": "f530dc06-ef10-46b4-9903-3927f85bd9a7",
"slug": "magnet",
"label": "Magnet",
"description": "Refrigerator-safe matte magnet, square or die-cut round.",
"category": "Home",
"options": [],
"sizes": [
{
"id": "6f88ed75-7ab5-49ae-8dc5-18568da63899",
"slug": "3x3-square",
"label": "3\" × 3\" Square",
"physical": {
"width": 3,
"height": 3,
"unit": "in"
},
"canvas": {
"width": 300,
"height": 300
},
"printZone": {
"x": 30,
"y": 30,
"width": 240,
"height": 240
},
"silhouettePath": "M12,0 L288,0 A12,12 0 0 1 300,12 L300,288 A12,12 0 0 1 288,300 L12,300 A12,12 0 0 1 0,288 L0,12 A12,12 0 0 1 12,0 Z",
"mockupFallbackColor": "#fef9c3",
"basePriceCents": 700
},
{
"id": "3a9d60f5-821c-4f3f-8d41-62cfeaba208a",
"slug": "4x4-square",
"label": "4\" × 4\" Square",
"physical": {
"width": 4,
"height": 4,
"unit": "in"
},
"canvas": {
"width": 400,
"height": 400
},
"printZone": {
"x": 40,
"y": 40,
"width": 320,
"height": 320
},
"silhouettePath": "M16,0 L384,0 A16,16 0 0 1 400,16 L400,384 A16,16 0 0 1 384,400 L16,400 A16,16 0 0 1 0,384 L0,16 A16,16 0 0 1 16,0 Z",
"mockupFallbackColor": "#fef9c3",
"basePriceCents": 900
},
{
"id": "17e3cc66-f897-4717-8b08-c5b0308668df",
"slug": "3in-round",
"label": "3\" Round",
"physical": {
"width": 3,
"height": 3,
"unit": "in"
},
"canvas": {
"width": 300,
"height": 300
},
"printZone": {
"x": 30,
"y": 30,
"width": 240,
"height": 240
},
"silhouettePath": "M150,0 A150,150 0 1 0 150,300 A150,150 0 1 0 150,0 Z",
"mockupFallbackColor": "#fde68a",
"basePriceCents": 700
}
],
"createdAt": "2026-05-25T12:31:21.554Z",
"updatedAt": "2026-05-25T12:31:21.554Z"
}

View File

@@ -0,0 +1,35 @@
{
"id": "f5cbb673-8696-4dad-a63c-3a802ba53fd3",
"slug": "phone-case",
"label": "Phone Case",
"description": "Slim flexible case with edge-to-edge print.",
"category": "Accessories",
"options": [],
"sizes": [
{
"id": "4be821c2-8ba5-4dd1-ad0b-1a188dd89796",
"slug": "generic",
"label": "Generic Wrap",
"physical": {
"width": 2.7,
"height": 5.4,
"unit": "in"
},
"canvas": {
"width": 270,
"height": 540
},
"printZone": {
"x": 27,
"y": 54,
"width": 216,
"height": 432
},
"silhouettePath": "M27,0 L243,0 A27,27 0 0 1 270,27 L270,513 A27,27 0 0 1 243,540 L27,540 A27,27 0 0 1 0,513 L0,27 A27,27 0 0 1 27,0 Z",
"mockupFallbackColor": "#e0e7ff",
"basePriceCents": 2200
}
],
"createdAt": "2026-05-25T12:31:21.563Z",
"updatedAt": "2026-05-25T12:31:21.563Z"
}