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:
104
templates/_products_index.json
Normal file
104
templates/_products_index.json
Normal 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
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user