@cimplify/sdk 0.38.3 → 0.38.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3539,7 +3539,9 @@ function toCanonicalProductSummary(p) {
3539
3539
  };
3540
3540
  }
3541
3541
  function deriveRenderHint(p) {
3542
+ if (p.render_hint) return p.render_hint;
3542
3543
  if (p.product_type === "service") return "general";
3544
+ if (p.product_type === "digital") return "general";
3543
3545
  const foodish = (p.tags ?? []).some(
3544
3546
  (t) => /food|drink|cake|bread|pastry|dessert|coffee|tea|juice|spice/i.test(t)
3545
3547
  );
@@ -3567,6 +3569,12 @@ function toApiProduct(p, ctx) {
3567
3569
  tags: p.tags ?? [],
3568
3570
  calories: p.calories,
3569
3571
  allergies: p.allergies ?? [],
3572
+ display_mode: p.display_mode,
3573
+ digital_product_type: p.digital_product_type,
3574
+ quantity_pricing: p.quantity_pricing,
3575
+ duration_unit: p.duration_unit,
3576
+ duration_minutes: p.duration_minutes,
3577
+ billing_plans: p.billing_plans,
3570
3578
  created_at: p.created_at,
3571
3579
  updated_at: p.updated_at,
3572
3580
  metadata: {
@@ -5057,6 +5065,21 @@ function makeProduct(input, categoryIds) {
5057
5065
  pairings: input.pairings ?? [],
5058
5066
  is_signature: input.isSignature ?? false,
5059
5067
  is_new: input.isNew ?? false,
5068
+ render_hint: input.renderHint,
5069
+ display_mode: input.displayMode,
5070
+ digital_product_type: input.digitalProductType,
5071
+ quantity_pricing: input.quantityPricing,
5072
+ duration_unit: input.durationUnit,
5073
+ duration_minutes: input.durationMinutes,
5074
+ billing_plans: input.billingPlans?.map((b) => ({
5075
+ id: b.id,
5076
+ name: b.name,
5077
+ interval: b.interval,
5078
+ interval_count: b.interval_count,
5079
+ price: b.price,
5080
+ currency: b.currency ?? "GHS",
5081
+ trial_period_days: b.trial_period_days
5082
+ })),
5060
5083
  created_at: ISO,
5061
5084
  updated_at: ISO
5062
5085
  };
@@ -5097,7 +5120,9 @@ function seedDefault(registry) {
5097
5120
  { slug: "pastries", name: "Pastries", description: "Hand-laminated croissants, danishes, brownies." },
5098
5121
  { slug: "cakes", name: "Cakes", description: "Slices and made-to-order showstoppers." },
5099
5122
  { slug: "drinks", name: "Drinks", description: "Locally roasted coffee, brewed teas, fresh juice." },
5100
- { slug: "boxes", name: "Boxes & Bundles", description: "Curated boxes for sharing." }
5123
+ { slug: "boxes", name: "Boxes & Bundles", description: "Curated boxes for sharing." },
5124
+ { slug: "merch", name: "Merch & More", description: "Branded goods, wholesale flour, downloadable recipes, gift cards." },
5125
+ { slug: "classes", name: "Classes & Stays", description: "Hands-on baking classes, kitchen rentals, monthly bread subscriptions." }
5101
5126
  ];
5102
5127
  const catIds = /* @__PURE__ */ new Map();
5103
5128
  for (const c of categoryDefs) {
@@ -5411,6 +5436,154 @@ function seedDefault(registry) {
5411
5436
  imageUrl: img("1486427944299-d1955d23e34d"),
5412
5437
  tags: ["composite", "build-your-own", "gift"],
5413
5438
  productType: "composite"
5439
+ },
5440
+ // ── Merch (Retail card — render_hint=physical) ──
5441
+ {
5442
+ id: "prod_apron",
5443
+ name: "Akua's Bakery Apron",
5444
+ slug: "apron",
5445
+ price: "85.00",
5446
+ description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
5447
+ category: "merch",
5448
+ imageUrl: img("1556905055-8f358a7a47b2"),
5449
+ tags: ["merch", "physical"],
5450
+ renderHint: "physical"
5451
+ },
5452
+ {
5453
+ id: "prod_tote",
5454
+ name: "Bakery Tote Bag",
5455
+ slug: "tote-bag",
5456
+ price: "35.00",
5457
+ description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
5458
+ category: "merch",
5459
+ imageUrl: img("1591561954557-26941169b49e"),
5460
+ tags: ["merch", "physical", "gift"],
5461
+ renderHint: "physical",
5462
+ isNew: true
5463
+ },
5464
+ // ── Wholesale (Wholesale card — quantity_pricing tiers) ──
5465
+ {
5466
+ id: "prod_flour-wholesale",
5467
+ name: "Heritage Flour \u2014 25kg Sack",
5468
+ slug: "flour-25kg",
5469
+ price: "320.00",
5470
+ description: "Stone-milled heritage wheat flour, the same we use in our country sourdough. Tiered pricing for caf\xE9s, restaurants, and home-baking co-ops.",
5471
+ category: "merch",
5472
+ imageUrl: img("1568254183919-78a4f43a2877"),
5473
+ tags: ["wholesale", "physical", "trade"],
5474
+ renderHint: "physical",
5475
+ quantityPricing: [
5476
+ { min_quantity: 1, unit_price: "320.00" },
5477
+ { min_quantity: 5, unit_price: "295.00" },
5478
+ { min_quantity: 10, unit_price: "270.00" },
5479
+ { min_quantity: 25, unit_price: "245.00" }
5480
+ ]
5481
+ },
5482
+ // ── Digital products (Digital card — type=digital) ──
5483
+ {
5484
+ id: "prod_recipe-ebook",
5485
+ name: "Sourdough Starter eBook",
5486
+ slug: "sourdough-ebook",
5487
+ price: "45.00",
5488
+ description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
5489
+ category: "merch",
5490
+ imageUrl: img("1543002588-bfa74002ed7e"),
5491
+ tags: ["digital", "download"],
5492
+ productType: "digital",
5493
+ digitalProductType: "download"
5494
+ },
5495
+ {
5496
+ id: "prod_gift-card",
5497
+ name: "Bakery Gift Card",
5498
+ slug: "gift-card",
5499
+ price: "100.00",
5500
+ description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
5501
+ category: "merch",
5502
+ imageUrl: img("1556905055-8f358a7a47b2"),
5503
+ tags: ["digital", "gift"],
5504
+ productType: "digital",
5505
+ digitalProductType: "gift_code",
5506
+ isSignature: true
5507
+ },
5508
+ // ── Services (Standard service card — type=service + duration_minutes) ──
5509
+ {
5510
+ id: "prod_baking-class",
5511
+ name: "Sourdough Baking Class",
5512
+ slug: "baking-class",
5513
+ price: "320.00",
5514
+ description: "Two-hour hands-on class: shape your own boule, score it, and take home a baked loaf and a starter jar. Held Saturdays, 10am\u201312pm.",
5515
+ category: "classes",
5516
+ imageUrl: img("1556909114-44e3e9399a2e"),
5517
+ tags: ["class", "service", "hands-on"],
5518
+ productType: "service",
5519
+ durationMinutes: 120
5520
+ },
5521
+ {
5522
+ id: "prod_pastry-workshop",
5523
+ name: "Lamination Workshop",
5524
+ slug: "pastry-workshop",
5525
+ price: "480.00",
5526
+ description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
5527
+ category: "classes",
5528
+ imageUrl: img("1517433367423-c7e5b0f35086"),
5529
+ tags: ["class", "service", "advanced"],
5530
+ productType: "service",
5531
+ durationMinutes: 180,
5532
+ isNew: true
5533
+ },
5534
+ // ── Rental service (Rental card — duration_unit=hours) ──
5535
+ {
5536
+ id: "prod_kitchen-rental",
5537
+ name: "Pro Kitchen Rental",
5538
+ slug: "kitchen-rental",
5539
+ price: "180.00",
5540
+ description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
5541
+ category: "classes",
5542
+ imageUrl: img("1556909114-44e3e9399a2e"),
5543
+ tags: ["rental", "service", "commercial"],
5544
+ productType: "service",
5545
+ durationUnit: "hours"
5546
+ },
5547
+ // ── Accommodation (Accommodation card — duration_unit=nights) ──
5548
+ {
5549
+ id: "prod_loft-stay",
5550
+ name: "Bakery Loft \u2014 Weekend Stay",
5551
+ slug: "loft-stay",
5552
+ price: "650.00",
5553
+ description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
5554
+ category: "classes",
5555
+ imageUrl: img("1564013799919-ab600027ffc6"),
5556
+ tags: ["stay", "service", "premium"],
5557
+ productType: "service",
5558
+ durationUnit: "nights"
5559
+ },
5560
+ // ── Subscription (Subscription card — billing_plans, no duration_minutes) ──
5561
+ {
5562
+ id: "prod_loaf-subscription",
5563
+ name: "Weekly Loaf Subscription",
5564
+ slug: "loaf-subscription",
5565
+ price: "0.00",
5566
+ description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
5567
+ category: "classes",
5568
+ imageUrl: img("1509440159596-0249088772ff"),
5569
+ tags: ["subscription", "service", "delivery"],
5570
+ productType: "service",
5571
+ billingPlans: [
5572
+ {
5573
+ id: "plan_loaf_monthly",
5574
+ name: "Monthly",
5575
+ interval: "month",
5576
+ interval_count: 1,
5577
+ price: "90.00"
5578
+ },
5579
+ {
5580
+ id: "plan_loaf_quarterly",
5581
+ name: "Quarterly (save 10%)",
5582
+ interval: "month",
5583
+ interval_count: 3,
5584
+ price: "243.00"
5585
+ }
5586
+ ]
5414
5587
  }
5415
5588
  ];
5416
5589
  for (const input of productInputs) {
@@ -3537,7 +3537,9 @@ function toCanonicalProductSummary(p) {
3537
3537
  };
3538
3538
  }
3539
3539
  function deriveRenderHint(p) {
3540
+ if (p.render_hint) return p.render_hint;
3540
3541
  if (p.product_type === "service") return "general";
3542
+ if (p.product_type === "digital") return "general";
3541
3543
  const foodish = (p.tags ?? []).some(
3542
3544
  (t) => /food|drink|cake|bread|pastry|dessert|coffee|tea|juice|spice/i.test(t)
3543
3545
  );
@@ -3565,6 +3567,12 @@ function toApiProduct(p, ctx) {
3565
3567
  tags: p.tags ?? [],
3566
3568
  calories: p.calories,
3567
3569
  allergies: p.allergies ?? [],
3570
+ display_mode: p.display_mode,
3571
+ digital_product_type: p.digital_product_type,
3572
+ quantity_pricing: p.quantity_pricing,
3573
+ duration_unit: p.duration_unit,
3574
+ duration_minutes: p.duration_minutes,
3575
+ billing_plans: p.billing_plans,
3568
3576
  created_at: p.created_at,
3569
3577
  updated_at: p.updated_at,
3570
3578
  metadata: {
@@ -5055,6 +5063,21 @@ function makeProduct(input, categoryIds) {
5055
5063
  pairings: input.pairings ?? [],
5056
5064
  is_signature: input.isSignature ?? false,
5057
5065
  is_new: input.isNew ?? false,
5066
+ render_hint: input.renderHint,
5067
+ display_mode: input.displayMode,
5068
+ digital_product_type: input.digitalProductType,
5069
+ quantity_pricing: input.quantityPricing,
5070
+ duration_unit: input.durationUnit,
5071
+ duration_minutes: input.durationMinutes,
5072
+ billing_plans: input.billingPlans?.map((b) => ({
5073
+ id: b.id,
5074
+ name: b.name,
5075
+ interval: b.interval,
5076
+ interval_count: b.interval_count,
5077
+ price: b.price,
5078
+ currency: b.currency ?? "GHS",
5079
+ trial_period_days: b.trial_period_days
5080
+ })),
5058
5081
  created_at: ISO,
5059
5082
  updated_at: ISO
5060
5083
  };
@@ -5095,7 +5118,9 @@ function seedDefault(registry) {
5095
5118
  { slug: "pastries", name: "Pastries", description: "Hand-laminated croissants, danishes, brownies." },
5096
5119
  { slug: "cakes", name: "Cakes", description: "Slices and made-to-order showstoppers." },
5097
5120
  { slug: "drinks", name: "Drinks", description: "Locally roasted coffee, brewed teas, fresh juice." },
5098
- { slug: "boxes", name: "Boxes & Bundles", description: "Curated boxes for sharing." }
5121
+ { slug: "boxes", name: "Boxes & Bundles", description: "Curated boxes for sharing." },
5122
+ { slug: "merch", name: "Merch & More", description: "Branded goods, wholesale flour, downloadable recipes, gift cards." },
5123
+ { slug: "classes", name: "Classes & Stays", description: "Hands-on baking classes, kitchen rentals, monthly bread subscriptions." }
5099
5124
  ];
5100
5125
  const catIds = /* @__PURE__ */ new Map();
5101
5126
  for (const c of categoryDefs) {
@@ -5409,6 +5434,154 @@ function seedDefault(registry) {
5409
5434
  imageUrl: img("1486427944299-d1955d23e34d"),
5410
5435
  tags: ["composite", "build-your-own", "gift"],
5411
5436
  productType: "composite"
5437
+ },
5438
+ // ── Merch (Retail card — render_hint=physical) ──
5439
+ {
5440
+ id: "prod_apron",
5441
+ name: "Akua's Bakery Apron",
5442
+ slug: "apron",
5443
+ price: "85.00",
5444
+ description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
5445
+ category: "merch",
5446
+ imageUrl: img("1556905055-8f358a7a47b2"),
5447
+ tags: ["merch", "physical"],
5448
+ renderHint: "physical"
5449
+ },
5450
+ {
5451
+ id: "prod_tote",
5452
+ name: "Bakery Tote Bag",
5453
+ slug: "tote-bag",
5454
+ price: "35.00",
5455
+ description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
5456
+ category: "merch",
5457
+ imageUrl: img("1591561954557-26941169b49e"),
5458
+ tags: ["merch", "physical", "gift"],
5459
+ renderHint: "physical",
5460
+ isNew: true
5461
+ },
5462
+ // ── Wholesale (Wholesale card — quantity_pricing tiers) ──
5463
+ {
5464
+ id: "prod_flour-wholesale",
5465
+ name: "Heritage Flour \u2014 25kg Sack",
5466
+ slug: "flour-25kg",
5467
+ price: "320.00",
5468
+ description: "Stone-milled heritage wheat flour, the same we use in our country sourdough. Tiered pricing for caf\xE9s, restaurants, and home-baking co-ops.",
5469
+ category: "merch",
5470
+ imageUrl: img("1568254183919-78a4f43a2877"),
5471
+ tags: ["wholesale", "physical", "trade"],
5472
+ renderHint: "physical",
5473
+ quantityPricing: [
5474
+ { min_quantity: 1, unit_price: "320.00" },
5475
+ { min_quantity: 5, unit_price: "295.00" },
5476
+ { min_quantity: 10, unit_price: "270.00" },
5477
+ { min_quantity: 25, unit_price: "245.00" }
5478
+ ]
5479
+ },
5480
+ // ── Digital products (Digital card — type=digital) ──
5481
+ {
5482
+ id: "prod_recipe-ebook",
5483
+ name: "Sourdough Starter eBook",
5484
+ slug: "sourdough-ebook",
5485
+ price: "45.00",
5486
+ description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
5487
+ category: "merch",
5488
+ imageUrl: img("1543002588-bfa74002ed7e"),
5489
+ tags: ["digital", "download"],
5490
+ productType: "digital",
5491
+ digitalProductType: "download"
5492
+ },
5493
+ {
5494
+ id: "prod_gift-card",
5495
+ name: "Bakery Gift Card",
5496
+ slug: "gift-card",
5497
+ price: "100.00",
5498
+ description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
5499
+ category: "merch",
5500
+ imageUrl: img("1556905055-8f358a7a47b2"),
5501
+ tags: ["digital", "gift"],
5502
+ productType: "digital",
5503
+ digitalProductType: "gift_code",
5504
+ isSignature: true
5505
+ },
5506
+ // ── Services (Standard service card — type=service + duration_minutes) ──
5507
+ {
5508
+ id: "prod_baking-class",
5509
+ name: "Sourdough Baking Class",
5510
+ slug: "baking-class",
5511
+ price: "320.00",
5512
+ description: "Two-hour hands-on class: shape your own boule, score it, and take home a baked loaf and a starter jar. Held Saturdays, 10am\u201312pm.",
5513
+ category: "classes",
5514
+ imageUrl: img("1556909114-44e3e9399a2e"),
5515
+ tags: ["class", "service", "hands-on"],
5516
+ productType: "service",
5517
+ durationMinutes: 120
5518
+ },
5519
+ {
5520
+ id: "prod_pastry-workshop",
5521
+ name: "Lamination Workshop",
5522
+ slug: "pastry-workshop",
5523
+ price: "480.00",
5524
+ description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
5525
+ category: "classes",
5526
+ imageUrl: img("1517433367423-c7e5b0f35086"),
5527
+ tags: ["class", "service", "advanced"],
5528
+ productType: "service",
5529
+ durationMinutes: 180,
5530
+ isNew: true
5531
+ },
5532
+ // ── Rental service (Rental card — duration_unit=hours) ──
5533
+ {
5534
+ id: "prod_kitchen-rental",
5535
+ name: "Pro Kitchen Rental",
5536
+ slug: "kitchen-rental",
5537
+ price: "180.00",
5538
+ description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
5539
+ category: "classes",
5540
+ imageUrl: img("1556909114-44e3e9399a2e"),
5541
+ tags: ["rental", "service", "commercial"],
5542
+ productType: "service",
5543
+ durationUnit: "hours"
5544
+ },
5545
+ // ── Accommodation (Accommodation card — duration_unit=nights) ──
5546
+ {
5547
+ id: "prod_loft-stay",
5548
+ name: "Bakery Loft \u2014 Weekend Stay",
5549
+ slug: "loft-stay",
5550
+ price: "650.00",
5551
+ description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
5552
+ category: "classes",
5553
+ imageUrl: img("1564013799919-ab600027ffc6"),
5554
+ tags: ["stay", "service", "premium"],
5555
+ productType: "service",
5556
+ durationUnit: "nights"
5557
+ },
5558
+ // ── Subscription (Subscription card — billing_plans, no duration_minutes) ──
5559
+ {
5560
+ id: "prod_loaf-subscription",
5561
+ name: "Weekly Loaf Subscription",
5562
+ slug: "loaf-subscription",
5563
+ price: "0.00",
5564
+ description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
5565
+ category: "classes",
5566
+ imageUrl: img("1509440159596-0249088772ff"),
5567
+ tags: ["subscription", "service", "delivery"],
5568
+ productType: "service",
5569
+ billingPlans: [
5570
+ {
5571
+ id: "plan_loaf_monthly",
5572
+ name: "Monthly",
5573
+ interval: "month",
5574
+ interval_count: 1,
5575
+ price: "90.00"
5576
+ },
5577
+ {
5578
+ id: "plan_loaf_quarterly",
5579
+ name: "Quarterly (save 10%)",
5580
+ interval: "month",
5581
+ interval_count: 3,
5582
+ price: "243.00"
5583
+ }
5584
+ ]
5412
5585
  }
5413
5586
  ];
5414
5587
  for (const input of productInputs) {
@@ -1,4 +1,4 @@
1
- import { A as AppHandle, C as CreateAppOptions } from '../server-BNy6Ri-4.mjs';
1
+ import { A as AppHandle, C as CreateAppOptions } from '../server-CVEsjECc.mjs';
2
2
  import 'hono';
3
3
 
4
4
  interface MswHandlerSetup {
@@ -1,4 +1,4 @@
1
- import { A as AppHandle, C as CreateAppOptions } from '../server-BNy6Ri-4.js';
1
+ import { A as AppHandle, C as CreateAppOptions } from '../server-CVEsjECc.js';
2
2
  import 'hono';
3
3
 
4
4
  interface MswHandlerSetup {
package/dist/mock/msw.js CHANGED
@@ -3537,7 +3537,9 @@ function toCanonicalProductSummary(p) {
3537
3537
  };
3538
3538
  }
3539
3539
  function deriveRenderHint(p) {
3540
+ if (p.render_hint) return p.render_hint;
3540
3541
  if (p.product_type === "service") return "general";
3542
+ if (p.product_type === "digital") return "general";
3541
3543
  const foodish = (p.tags ?? []).some(
3542
3544
  (t) => /food|drink|cake|bread|pastry|dessert|coffee|tea|juice|spice/i.test(t)
3543
3545
  );
@@ -3565,6 +3567,12 @@ function toApiProduct(p, ctx) {
3565
3567
  tags: p.tags ?? [],
3566
3568
  calories: p.calories,
3567
3569
  allergies: p.allergies ?? [],
3570
+ display_mode: p.display_mode,
3571
+ digital_product_type: p.digital_product_type,
3572
+ quantity_pricing: p.quantity_pricing,
3573
+ duration_unit: p.duration_unit,
3574
+ duration_minutes: p.duration_minutes,
3575
+ billing_plans: p.billing_plans,
3568
3576
  created_at: p.created_at,
3569
3577
  updated_at: p.updated_at,
3570
3578
  metadata: {
@@ -5055,6 +5063,21 @@ function makeProduct(input, categoryIds) {
5055
5063
  pairings: input.pairings ?? [],
5056
5064
  is_signature: input.isSignature ?? false,
5057
5065
  is_new: input.isNew ?? false,
5066
+ render_hint: input.renderHint,
5067
+ display_mode: input.displayMode,
5068
+ digital_product_type: input.digitalProductType,
5069
+ quantity_pricing: input.quantityPricing,
5070
+ duration_unit: input.durationUnit,
5071
+ duration_minutes: input.durationMinutes,
5072
+ billing_plans: input.billingPlans?.map((b) => ({
5073
+ id: b.id,
5074
+ name: b.name,
5075
+ interval: b.interval,
5076
+ interval_count: b.interval_count,
5077
+ price: b.price,
5078
+ currency: b.currency ?? "GHS",
5079
+ trial_period_days: b.trial_period_days
5080
+ })),
5058
5081
  created_at: ISO,
5059
5082
  updated_at: ISO
5060
5083
  };
@@ -5095,7 +5118,9 @@ function seedDefault(registry) {
5095
5118
  { slug: "pastries", name: "Pastries", description: "Hand-laminated croissants, danishes, brownies." },
5096
5119
  { slug: "cakes", name: "Cakes", description: "Slices and made-to-order showstoppers." },
5097
5120
  { slug: "drinks", name: "Drinks", description: "Locally roasted coffee, brewed teas, fresh juice." },
5098
- { slug: "boxes", name: "Boxes & Bundles", description: "Curated boxes for sharing." }
5121
+ { slug: "boxes", name: "Boxes & Bundles", description: "Curated boxes for sharing." },
5122
+ { slug: "merch", name: "Merch & More", description: "Branded goods, wholesale flour, downloadable recipes, gift cards." },
5123
+ { slug: "classes", name: "Classes & Stays", description: "Hands-on baking classes, kitchen rentals, monthly bread subscriptions." }
5099
5124
  ];
5100
5125
  const catIds = /* @__PURE__ */ new Map();
5101
5126
  for (const c of categoryDefs) {
@@ -5409,6 +5434,154 @@ function seedDefault(registry) {
5409
5434
  imageUrl: img("1486427944299-d1955d23e34d"),
5410
5435
  tags: ["composite", "build-your-own", "gift"],
5411
5436
  productType: "composite"
5437
+ },
5438
+ // ── Merch (Retail card — render_hint=physical) ──
5439
+ {
5440
+ id: "prod_apron",
5441
+ name: "Akua's Bakery Apron",
5442
+ slug: "apron",
5443
+ price: "85.00",
5444
+ description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
5445
+ category: "merch",
5446
+ imageUrl: img("1556905055-8f358a7a47b2"),
5447
+ tags: ["merch", "physical"],
5448
+ renderHint: "physical"
5449
+ },
5450
+ {
5451
+ id: "prod_tote",
5452
+ name: "Bakery Tote Bag",
5453
+ slug: "tote-bag",
5454
+ price: "35.00",
5455
+ description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
5456
+ category: "merch",
5457
+ imageUrl: img("1591561954557-26941169b49e"),
5458
+ tags: ["merch", "physical", "gift"],
5459
+ renderHint: "physical",
5460
+ isNew: true
5461
+ },
5462
+ // ── Wholesale (Wholesale card — quantity_pricing tiers) ──
5463
+ {
5464
+ id: "prod_flour-wholesale",
5465
+ name: "Heritage Flour \u2014 25kg Sack",
5466
+ slug: "flour-25kg",
5467
+ price: "320.00",
5468
+ description: "Stone-milled heritage wheat flour, the same we use in our country sourdough. Tiered pricing for caf\xE9s, restaurants, and home-baking co-ops.",
5469
+ category: "merch",
5470
+ imageUrl: img("1568254183919-78a4f43a2877"),
5471
+ tags: ["wholesale", "physical", "trade"],
5472
+ renderHint: "physical",
5473
+ quantityPricing: [
5474
+ { min_quantity: 1, unit_price: "320.00" },
5475
+ { min_quantity: 5, unit_price: "295.00" },
5476
+ { min_quantity: 10, unit_price: "270.00" },
5477
+ { min_quantity: 25, unit_price: "245.00" }
5478
+ ]
5479
+ },
5480
+ // ── Digital products (Digital card — type=digital) ──
5481
+ {
5482
+ id: "prod_recipe-ebook",
5483
+ name: "Sourdough Starter eBook",
5484
+ slug: "sourdough-ebook",
5485
+ price: "45.00",
5486
+ description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
5487
+ category: "merch",
5488
+ imageUrl: img("1543002588-bfa74002ed7e"),
5489
+ tags: ["digital", "download"],
5490
+ productType: "digital",
5491
+ digitalProductType: "download"
5492
+ },
5493
+ {
5494
+ id: "prod_gift-card",
5495
+ name: "Bakery Gift Card",
5496
+ slug: "gift-card",
5497
+ price: "100.00",
5498
+ description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
5499
+ category: "merch",
5500
+ imageUrl: img("1556905055-8f358a7a47b2"),
5501
+ tags: ["digital", "gift"],
5502
+ productType: "digital",
5503
+ digitalProductType: "gift_code",
5504
+ isSignature: true
5505
+ },
5506
+ // ── Services (Standard service card — type=service + duration_minutes) ──
5507
+ {
5508
+ id: "prod_baking-class",
5509
+ name: "Sourdough Baking Class",
5510
+ slug: "baking-class",
5511
+ price: "320.00",
5512
+ description: "Two-hour hands-on class: shape your own boule, score it, and take home a baked loaf and a starter jar. Held Saturdays, 10am\u201312pm.",
5513
+ category: "classes",
5514
+ imageUrl: img("1556909114-44e3e9399a2e"),
5515
+ tags: ["class", "service", "hands-on"],
5516
+ productType: "service",
5517
+ durationMinutes: 120
5518
+ },
5519
+ {
5520
+ id: "prod_pastry-workshop",
5521
+ name: "Lamination Workshop",
5522
+ slug: "pastry-workshop",
5523
+ price: "480.00",
5524
+ description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
5525
+ category: "classes",
5526
+ imageUrl: img("1517433367423-c7e5b0f35086"),
5527
+ tags: ["class", "service", "advanced"],
5528
+ productType: "service",
5529
+ durationMinutes: 180,
5530
+ isNew: true
5531
+ },
5532
+ // ── Rental service (Rental card — duration_unit=hours) ──
5533
+ {
5534
+ id: "prod_kitchen-rental",
5535
+ name: "Pro Kitchen Rental",
5536
+ slug: "kitchen-rental",
5537
+ price: "180.00",
5538
+ description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
5539
+ category: "classes",
5540
+ imageUrl: img("1556909114-44e3e9399a2e"),
5541
+ tags: ["rental", "service", "commercial"],
5542
+ productType: "service",
5543
+ durationUnit: "hours"
5544
+ },
5545
+ // ── Accommodation (Accommodation card — duration_unit=nights) ──
5546
+ {
5547
+ id: "prod_loft-stay",
5548
+ name: "Bakery Loft \u2014 Weekend Stay",
5549
+ slug: "loft-stay",
5550
+ price: "650.00",
5551
+ description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
5552
+ category: "classes",
5553
+ imageUrl: img("1564013799919-ab600027ffc6"),
5554
+ tags: ["stay", "service", "premium"],
5555
+ productType: "service",
5556
+ durationUnit: "nights"
5557
+ },
5558
+ // ── Subscription (Subscription card — billing_plans, no duration_minutes) ──
5559
+ {
5560
+ id: "prod_loaf-subscription",
5561
+ name: "Weekly Loaf Subscription",
5562
+ slug: "loaf-subscription",
5563
+ price: "0.00",
5564
+ description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
5565
+ category: "classes",
5566
+ imageUrl: img("1509440159596-0249088772ff"),
5567
+ tags: ["subscription", "service", "delivery"],
5568
+ productType: "service",
5569
+ billingPlans: [
5570
+ {
5571
+ id: "plan_loaf_monthly",
5572
+ name: "Monthly",
5573
+ interval: "month",
5574
+ interval_count: 1,
5575
+ price: "90.00"
5576
+ },
5577
+ {
5578
+ id: "plan_loaf_quarterly",
5579
+ name: "Quarterly (save 10%)",
5580
+ interval: "month",
5581
+ interval_count: 3,
5582
+ price: "243.00"
5583
+ }
5584
+ ]
5412
5585
  }
5413
5586
  ];
5414
5587
  for (const input of productInputs) {