@cimplify/sdk 0.45.2 → 0.45.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.
Files changed (52) hide show
  1. package/dist/advanced.d.mts +3 -2
  2. package/dist/advanced.d.ts +3 -2
  3. package/dist/{chunk-JNXCY43J.js → chunk-3OPVWRIP.js} +2 -2
  4. package/dist/{chunk-F4CGIOIJ.js → chunk-CJN5SPXN.js} +598 -158
  5. package/dist/{chunk-EMEUSFSR.mjs → chunk-DZGOF7CA.mjs} +598 -158
  6. package/dist/{chunk-YVIIBCJR.mjs → chunk-GDGDDGAE.mjs} +1 -1
  7. package/dist/{client-DjzIoewX.d.ts → client-B0RPhAvp.d.ts} +2 -2
  8. package/dist/{client-EM8xKCPO.d.mts → client-BUtbmHv-.d.mts} +2 -2
  9. package/dist/{client-C5LcbNxL.d.mts → client-CDUY-6nC.d.mts} +2 -1
  10. package/dist/{client-Bsd4Vi_y.d.ts → client-aZInadOY.d.ts} +2 -1
  11. package/dist/{index-yMe4VZqR.d.mts → index-3C9J8Wb-.d.mts} +3 -2
  12. package/dist/{index-PbBuEWp7.d.ts → index-DC_ZcSgO.d.ts} +3 -2
  13. package/dist/index.d.mts +6 -5
  14. package/dist/index.d.ts +6 -5
  15. package/dist/mock/cli.mjs +598 -158
  16. package/dist/mock/library.d.mts +2 -2
  17. package/dist/mock/library.d.ts +2 -2
  18. package/dist/mock/library.js +598 -158
  19. package/dist/mock/library.mjs +598 -158
  20. package/dist/mock/msw.d.mts +1 -1
  21. package/dist/mock/msw.d.ts +1 -1
  22. package/dist/mock/msw.js +598 -158
  23. package/dist/mock/msw.mjs +598 -158
  24. package/dist/payment-Bse2XJ-c.d.mts +113 -0
  25. package/dist/payment-JcNqOf_T.d.ts +113 -0
  26. package/dist/{price-DMijJ6_3.d.mts → price-YBGk5seG.d.mts} +1 -1
  27. package/dist/{price-DmQTOnjj.d.ts → price-mHkRncgW.d.ts} +1 -1
  28. package/dist/{payment-4JSLNTVM.d.ts → product-DiX-HGkT.d.mts} +1 -111
  29. package/dist/{payment-4JSLNTVM.d.mts → product-DiX-HGkT.d.ts} +1 -111
  30. package/dist/react.d.mts +4 -3
  31. package/dist/react.d.ts +4 -3
  32. package/dist/{server-UARbamIZ.d.ts → server-BY-DDUM0.d.mts} +10 -1
  33. package/dist/{server-Bs295U0t.d.ts → server-CiUhgjZA.d.mts} +43 -1
  34. package/dist/{server-Bs295U0t.d.mts → server-CiUhgjZA.d.ts} +43 -1
  35. package/dist/{server-UARbamIZ.d.mts → server-DkrQ4Idn.d.ts} +10 -1
  36. package/dist/server.d.mts +4 -3
  37. package/dist/server.d.ts +4 -3
  38. package/dist/testing/msw.d.mts +2 -1
  39. package/dist/testing/msw.d.ts +2 -1
  40. package/dist/testing/msw.js +2 -2
  41. package/dist/testing/msw.mjs +1 -1
  42. package/dist/testing/suite.d.mts +6 -5
  43. package/dist/testing/suite.d.ts +6 -5
  44. package/dist/testing/suite.js +21 -21
  45. package/dist/testing/suite.mjs +2 -2
  46. package/dist/testing.d.mts +5 -4
  47. package/dist/testing.d.ts +5 -4
  48. package/dist/testing.js +77 -77
  49. package/dist/testing.mjs +3 -3
  50. package/dist/utils.d.mts +4 -3
  51. package/dist/utils.d.ts +4 -3
  52. package/package.json +1 -1
@@ -3854,6 +3854,10 @@ function toApiProduct(p, ctx) {
3854
3854
  duration_unit: p.duration_unit,
3855
3855
  duration_minutes: p.duration_minutes,
3856
3856
  billing_plans: p.billing_plans,
3857
+ /** Per-product customer inputs (prescription upload, consent
3858
+ * signature, etc.). The Rust backend emits this on ProductView; the
3859
+ * SDK's React components branch on its presence to render inputs. */
3860
+ input_fields: p.input_fields ?? [],
3857
3861
  created_at: p.created_at,
3858
3862
  updated_at: p.updated_at,
3859
3863
  metadata: {
@@ -5745,8 +5749,8 @@ function createLinkService({ clock, ids }) {
5745
5749
 
5746
5750
  // src/mock/seeds/image.ts
5747
5751
  var CDN_BASE_URL = "https://static-tmp.cimplify.io";
5748
- function seedImage(industry, photoId) {
5749
- return `${CDN_BASE_URL}/seed/${industry}/${photoId}.jpg`;
5752
+ function seedImage(industry, slug) {
5753
+ return `${CDN_BASE_URL}/seed/${industry}/${slug}.jpg`;
5750
5754
  }
5751
5755
 
5752
5756
  // src/mock/seeds/default.ts
@@ -5809,7 +5813,7 @@ function seedDefault(registry) {
5809
5813
  default_address: "12 Independence Ave, Accra",
5810
5814
  default_offers_table_service: true,
5811
5815
  default_accepts_online_orders: true,
5812
- image: img("1568254183919-78a4f43a2877"),
5816
+ image: img("business-hero"),
5813
5817
  status: "active",
5814
5818
  created_at: ISO,
5815
5819
  updated_at: ISO,
@@ -5864,8 +5868,8 @@ function seedDefault(registry) {
5864
5868
  price: "25.00",
5865
5869
  description: "24-hour fermented country loaf with our heritage starter \u2014 open crumb, blistered crust, naturally tangy. Baked fresh every morning.",
5866
5870
  category: "breads",
5867
- imageUrl: img("1509440159596-0249088772ff"),
5868
- images: [img("1509440159596-0249088772ff"), img("1486887396153-fa416526c108")],
5871
+ imageUrl: img("sourdough-loaf"),
5872
+ images: [img("sourdough-loaf"), img("whole-wheat")],
5869
5873
  tags: ["bread", "vegan", "signature"],
5870
5874
  isSignature: true,
5871
5875
  ingredients: ["Wheat flour", "Sourdough starter", "Sea salt", "Filtered water"],
@@ -5880,7 +5884,7 @@ function seedDefault(registry) {
5880
5884
  price: "20.00",
5881
5885
  description: "Hearty 100% whole wheat with sunflower, sesame, and pumpkin seeds. Slow-fermented for a soft crumb and nutty depth.",
5882
5886
  category: "breads",
5883
- imageUrl: img("1486887396153-fa416526c108"),
5887
+ imageUrl: img("whole-wheat"),
5884
5888
  tags: ["bread", "vegan", "high-fibre"],
5885
5889
  ingredients: ["Whole wheat flour", "Sunflower seeds", "Sesame", "Pumpkin seeds"],
5886
5890
  allergies: ["wheat", "gluten", "sesame"],
@@ -5893,7 +5897,7 @@ function seedDefault(registry) {
5893
5897
  price: "15.00",
5894
5898
  description: "Crackling crust, airy crumb. Best eaten warm, within an hour of baking.",
5895
5899
  category: "breads",
5896
- imageUrl: img("1568471173242-461f0a730452"),
5900
+ imageUrl: img("baguette"),
5897
5901
  tags: ["bread", "vegan"],
5898
5902
  ingredients: ["Wheat flour", "Yeast", "Sea salt", "Water"],
5899
5903
  allergies: ["wheat", "gluten"],
@@ -5906,7 +5910,7 @@ function seedDefault(registry) {
5906
5910
  price: "30.00",
5907
5911
  description: "High-hydration focaccia drenched in olive oil, scattered with sea salt and fresh rosemary. Sold whole or by the slab.",
5908
5912
  category: "breads",
5909
- imageUrl: img("1571167530149-c1105da4c2c7"),
5913
+ imageUrl: img("focaccia"),
5910
5914
  tags: ["bread", "vegetarian"],
5911
5915
  ingredients: ["00 flour", "Olive oil", "Rosemary", "Maldon salt"],
5912
5916
  pairings: ["Burrata", "Prosciutto", "Caponata"],
@@ -5920,7 +5924,7 @@ function seedDefault(registry) {
5920
5924
  price: "18.00",
5921
5925
  description: "Caramelised brown butter, three over-ripe bananas, walnuts, finished with a salted maple glaze.",
5922
5926
  category: "breads",
5923
- imageUrl: img("1632931057819-4eefffa8e007"),
5927
+ imageUrl: img("banana-bread"),
5924
5928
  tags: ["sweet", "comfort"],
5925
5929
  ingredients: ["Bananas", "Brown butter", "Walnuts", "Maple syrup"],
5926
5930
  allergies: ["wheat", "gluten", "dairy", "nuts", "eggs"],
@@ -5935,8 +5939,8 @@ function seedDefault(registry) {
5935
5939
  price: "12.00",
5936
5940
  description: "27 layers of laminated dough wrapped around French butter. Crisp, shattering crust and a tender honeycomb interior.",
5937
5941
  category: "pastries",
5938
- imageUrl: img("1555507036-ab1f4038808a"),
5939
- images: [img("1555507036-ab1f4038808a"), img("1530610476181-d83430b64dcd")],
5942
+ imageUrl: img("croissant"),
5943
+ images: [img("croissant"), img("pain-au-chocolat")],
5940
5944
  tags: ["pastry", "vegetarian", "signature"],
5941
5945
  isSignature: true,
5942
5946
  ingredients: ["French butter", "Wheat flour", "Milk", "Eggs"],
@@ -5950,7 +5954,7 @@ function seedDefault(registry) {
5950
5954
  price: "14.00",
5951
5955
  description: "Our croissant dough wrapped around two batons of 70% Valrhona dark chocolate.",
5952
5956
  category: "pastries",
5953
- imageUrl: img("1530610476181-d83430b64dcd"),
5957
+ imageUrl: img("pain-au-chocolat"),
5954
5958
  tags: ["pastry", "chocolate"],
5955
5959
  ingredients: ["Croissant dough", "Valrhona chocolate"],
5956
5960
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -5963,7 +5967,7 @@ function seedDefault(registry) {
5963
5967
  price: "16.00",
5964
5968
  description: "Flaky pastry filled with almond cream, dusted with toasted slivers and powdered sugar.",
5965
5969
  category: "pastries",
5966
- imageUrl: img("1517433367423-c7e5b0f35086"),
5970
+ imageUrl: img("almond-danish"),
5967
5971
  tags: ["pastry", "nuts"],
5968
5972
  ingredients: ["Pastry dough", "Almond cream", "Toasted almonds"],
5969
5973
  allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
@@ -5976,7 +5980,7 @@ function seedDefault(registry) {
5976
5980
  price: "13.00",
5977
5981
  description: "Soft enriched dough swirled with butter and Ceylon cinnamon, finished with cream-cheese glaze.",
5978
5982
  category: "pastries",
5979
- imageUrl: img("1607920591413-4ec007e70023"),
5983
+ imageUrl: img("cinnamon-roll"),
5980
5984
  tags: ["pastry", "comfort"],
5981
5985
  ingredients: ["Enriched dough", "Cinnamon", "Brown sugar", "Cream cheese"],
5982
5986
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -5989,7 +5993,7 @@ function seedDefault(registry) {
5989
5993
  price: "12.00",
5990
5994
  description: "Dark, dense, fudgy brownie with a glossy shell. Chocolate four ways. Best slightly warm.",
5991
5995
  category: "pastries",
5992
- imageUrl: img("1606313564200-e75d5e30476c"),
5996
+ imageUrl: img("brownie"),
5993
5997
  tags: ["chocolate", "vegetarian"],
5994
5998
  ingredients: ["Dark chocolate", "Cocoa", "Brown butter", "Eggs"],
5995
5999
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -6002,7 +6006,7 @@ function seedDefault(registry) {
6002
6006
  price: "60.00",
6003
6007
  description: "Six French macarons \u2014 pistachio, raspberry, salted caramel, espresso, vanilla bean, and dark chocolate ganache.",
6004
6008
  category: "pastries",
6005
- imageUrl: img("1558326567-98ae2405596b"),
6009
+ imageUrl: img("macaron-box"),
6006
6010
  tags: ["pastry", "gift", "premium"],
6007
6011
  ingredients: ["Almond flour", "Egg whites", "Sugar", "Various fillings"],
6008
6012
  allergies: ["nuts", "eggs", "dairy"],
@@ -6016,7 +6020,7 @@ function seedDefault(registry) {
6016
6020
  price: "22.00",
6017
6021
  description: "Three layers of dark chocolate sponge with chocolate ganache and cr\xE8me p\xE2tissi\xE8re, finished with a mirror glaze. (Slice)",
6018
6022
  category: "cakes",
6019
- imageUrl: img("1565958011703-44f9829ba187"),
6023
+ imageUrl: img("chocolate-cake"),
6020
6024
  tags: ["cake", "chocolate", "signature"],
6021
6025
  isSignature: true,
6022
6026
  ingredients: ["Dark chocolate", "Cr\xE8me p\xE2tissi\xE8re", "Cocoa", "Eggs"],
@@ -6031,7 +6035,7 @@ function seedDefault(registry) {
6031
6035
  price: "22.00",
6032
6036
  description: "Classic red velvet with cream cheese frosting and white chocolate shavings.",
6033
6037
  category: "cakes",
6034
- imageUrl: img("1586788680434-30d324b2d46f"),
6038
+ imageUrl: img("red-velvet"),
6035
6039
  tags: ["cake"],
6036
6040
  ingredients: ["Buttermilk", "Cocoa", "Cream cheese", "Beetroot"],
6037
6041
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -6044,7 +6048,7 @@ function seedDefault(registry) {
6044
6048
  price: "20.00",
6045
6049
  description: "Spiced carrot cake with toasted walnuts, golden raisins, and cream-cheese frosting.",
6046
6050
  category: "cakes",
6047
- imageUrl: img("1568827999250-3f6afff96e66"),
6051
+ imageUrl: img("carrot-cake"),
6048
6052
  tags: ["cake", "spiced"],
6049
6053
  ingredients: ["Carrot", "Walnuts", "Cinnamon", "Cream cheese"],
6050
6054
  allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
@@ -6057,7 +6061,7 @@ function seedDefault(registry) {
6057
6061
  price: "24.00",
6058
6062
  description: "Dense, creamy New York cheesecake on a butter graham crust. Topped with seasonal berry compote.",
6059
6063
  category: "cakes",
6060
- imageUrl: img("1567306226416-28f0efdc88ce"),
6064
+ imageUrl: img("cheesecake"),
6061
6065
  tags: ["cake", "premium"],
6062
6066
  ingredients: ["Cream cheese", "Sour cream", "Graham crust", "Vanilla"],
6063
6067
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -6070,8 +6074,8 @@ function seedDefault(registry) {
6070
6074
  price: "250.00",
6071
6075
  description: "Made-to-order three-tier cake. Choose size, flavour, and frosting. 48-hour notice required for personalisation.",
6072
6076
  category: "cakes",
6073
- imageUrl: img("1535254973040-607b474cb50d"),
6074
- images: [img("1535254973040-607b474cb50d"), img("1565958011703-44f9829ba187")],
6077
+ imageUrl: img("birthday-cake"),
6078
+ images: [img("birthday-cake"), img("chocolate-cake")],
6075
6079
  tags: ["cake", "made-to-order", "premium"],
6076
6080
  ingredients: ["Sponge cake", "Buttercream", "Custom decoration"],
6077
6081
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -6085,7 +6089,7 @@ function seedDefault(registry) {
6085
6089
  price: "10.00",
6086
6090
  description: "Locally roasted Arabica from Volta Region. Notes of cocoa, dark fruit, and brown sugar.",
6087
6091
  category: "drinks",
6088
- imageUrl: img("1495474472287-4d71bcdd2085"),
6092
+ imageUrl: img("coffee"),
6089
6093
  tags: ["drink", "coffee", "vegan"],
6090
6094
  ingredients: ["Single-origin Arabica beans"],
6091
6095
  pairings: ["Croissant", "Brownie"],
@@ -6098,7 +6102,7 @@ function seedDefault(registry) {
6098
6102
  price: "8.00",
6099
6103
  description: "Choice of English breakfast, Earl Grey, green sencha, or chamomile.",
6100
6104
  category: "drinks",
6101
- imageUrl: img("1576092768241-dec231879fc3"),
6105
+ imageUrl: img("tea"),
6102
6106
  tags: ["drink", "tea", "vegan"],
6103
6107
  calories: 0
6104
6108
  },
@@ -6109,7 +6113,7 @@ function seedDefault(registry) {
6109
6113
  price: "12.00",
6110
6114
  description: "Iced hibiscus tea with ginger, pineapple peel, and a hint of clove. Tart, refreshing, lightly sweet.",
6111
6115
  category: "drinks",
6112
- imageUrl: img("1556679343-c7306c1976bc"),
6116
+ imageUrl: img("sobolo"),
6113
6117
  tags: ["drink", "vegan", "ghana"],
6114
6118
  isSignature: true,
6115
6119
  ingredients: ["Hibiscus", "Ginger", "Pineapple", "Clove"],
@@ -6122,7 +6126,7 @@ function seedDefault(registry) {
6122
6126
  price: "15.00",
6123
6127
  description: "Hand-pressed at sunrise from Ghanaian Valencia oranges. No sugar, no concentrate.",
6124
6128
  category: "drinks",
6125
- imageUrl: img("1622597467836-f3285f2131b8"),
6129
+ imageUrl: img("orange-juice"),
6126
6130
  tags: ["drink", "vegan"],
6127
6131
  calories: 110
6128
6132
  },
@@ -6134,8 +6138,8 @@ function seedDefault(registry) {
6134
6138
  price: "30.00",
6135
6139
  description: "A buttery croissant, a single-origin coffee, and a fresh-pressed orange juice. Everything you need to start the day. Save GH\u20B57 vs buying separately.",
6136
6140
  category: "boxes",
6137
- imageUrl: img("1533089860892-a7c6f0a88666"),
6138
- images: [img("1533089860892-a7c6f0a88666"), img("1495474472287-4d71bcdd2085")],
6141
+ imageUrl: img("breakfast-box"),
6142
+ images: [img("breakfast-box"), img("coffee")],
6139
6143
  tags: ["bundle", "breakfast"],
6140
6144
  productType: "bundle"
6141
6145
  },
@@ -6146,7 +6150,7 @@ function seedDefault(registry) {
6146
6150
  price: "60.00",
6147
6151
  description: "Pick 6 to 12 of our pastries \u2014 mix and match. Freshly boxed for sharing.",
6148
6152
  category: "boxes",
6149
- imageUrl: img("1486427944299-d1955d23e34d"),
6153
+ imageUrl: img("pastry-box"),
6150
6154
  tags: ["composite", "build-your-own", "gift"],
6151
6155
  productType: "composite"
6152
6156
  },
@@ -6158,7 +6162,7 @@ function seedDefault(registry) {
6158
6162
  price: "85.00",
6159
6163
  description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
6160
6164
  category: "merch",
6161
- imageUrl: img("1556905055-8f358a7a47b2"),
6165
+ imageUrl: img("apron"),
6162
6166
  tags: ["merch", "physical"],
6163
6167
  renderHint: "physical"
6164
6168
  },
@@ -6169,7 +6173,7 @@ function seedDefault(registry) {
6169
6173
  price: "35.00",
6170
6174
  description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
6171
6175
  category: "merch",
6172
- imageUrl: img("1591561954557-26941169b49e"),
6176
+ imageUrl: img("tote-bag"),
6173
6177
  tags: ["merch", "physical", "gift"],
6174
6178
  renderHint: "physical",
6175
6179
  isNew: true
@@ -6182,7 +6186,7 @@ function seedDefault(registry) {
6182
6186
  price: "320.00",
6183
6187
  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.",
6184
6188
  category: "merch",
6185
- imageUrl: img("1568254183919-78a4f43a2877"),
6189
+ imageUrl: img("flour-25kg"),
6186
6190
  tags: ["wholesale", "physical", "trade"],
6187
6191
  renderHint: "physical",
6188
6192
  quantityPricing: [
@@ -6200,7 +6204,7 @@ function seedDefault(registry) {
6200
6204
  price: "45.00",
6201
6205
  description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
6202
6206
  category: "merch",
6203
- imageUrl: img("1543002588-bfa74002ed7e"),
6207
+ imageUrl: img("sourdough-ebook"),
6204
6208
  tags: ["digital", "download"],
6205
6209
  productType: "digital",
6206
6210
  digitalProductType: "download"
@@ -6212,7 +6216,7 @@ function seedDefault(registry) {
6212
6216
  price: "100.00",
6213
6217
  description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
6214
6218
  category: "merch",
6215
- imageUrl: img("1556905055-8f358a7a47b2"),
6219
+ imageUrl: img("gift-card"),
6216
6220
  tags: ["digital", "gift"],
6217
6221
  productType: "digital",
6218
6222
  digitalProductType: "gift_code",
@@ -6226,7 +6230,7 @@ function seedDefault(registry) {
6226
6230
  price: "320.00",
6227
6231
  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.",
6228
6232
  category: "classes",
6229
- imageUrl: img("1517686469429-8bdb88b9f907"),
6233
+ imageUrl: img("baking-class"),
6230
6234
  tags: ["class", "service", "hands-on"],
6231
6235
  productType: "service",
6232
6236
  durationMinutes: 120
@@ -6238,7 +6242,7 @@ function seedDefault(registry) {
6238
6242
  price: "480.00",
6239
6243
  description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
6240
6244
  category: "classes",
6241
- imageUrl: img("1517433367423-c7e5b0f35086"),
6245
+ imageUrl: img("pastry-workshop"),
6242
6246
  tags: ["class", "service", "advanced"],
6243
6247
  productType: "service",
6244
6248
  durationMinutes: 180,
@@ -6252,7 +6256,7 @@ function seedDefault(registry) {
6252
6256
  price: "180.00",
6253
6257
  description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
6254
6258
  category: "classes",
6255
- imageUrl: img("1606755962773-d324e0a13086"),
6259
+ imageUrl: img("kitchen-rental"),
6256
6260
  tags: ["rental", "service", "commercial"],
6257
6261
  productType: "service",
6258
6262
  durationUnit: "hours"
@@ -6265,7 +6269,7 @@ function seedDefault(registry) {
6265
6269
  price: "650.00",
6266
6270
  description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
6267
6271
  category: "classes",
6268
- imageUrl: img("1564013799919-ab600027ffc6"),
6272
+ imageUrl: img("loft-stay"),
6269
6273
  tags: ["stay", "service", "premium"],
6270
6274
  productType: "service",
6271
6275
  durationUnit: "nights"
@@ -6278,7 +6282,7 @@ function seedDefault(registry) {
6278
6282
  price: "0.00",
6279
6283
  description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
6280
6284
  category: "classes",
6281
- imageUrl: img("1509440159596-0249088772ff"),
6285
+ imageUrl: img("loaf-subscription"),
6282
6286
  tags: ["subscription", "service", "delivery"],
6283
6287
  productType: "service",
6284
6288
  billingPlans: [
@@ -7106,31 +7110,7 @@ function seedReesa(registry) {
7106
7110
 
7107
7111
  // src/mock/seeds/restaurant.ts
7108
7112
  var ISO4 = "2026-01-01T00:00:00.000Z";
7109
- var PHOTO = {
7110
- "business-hero": "1414235077428-338989a2e8c0",
7111
- kelewele: "1599487488170-d11ec9c172f0",
7112
- "spring-rolls": "1559339352-11d035aa65de",
7113
- "soup-of-the-day": "1547592180-85f173990554",
7114
- "jollof-rice": "1546069901-d5bfd2cbfb1f",
7115
- "banku-tilapia": "1485921325833-c519f76c4927",
7116
- "fufu-light-soup": "1602253057119-44d745d9b860",
7117
- waakye: "1565299624946-b28f40a0ae38",
7118
- "grilled-chicken": "1598103442097-8b74394b95c6",
7119
- burger: "1568901346375-23c9450c58cd",
7120
- "yam-fries": "1576107232684-1279f390859f",
7121
- "fried-plantain": "1493770348161-369560ae357d",
7122
- salad: "1512621776951-a57141f2eefd",
7123
- "ice-cream": "1488900128323-21503983a07e",
7124
- "cake-slice": "1565958011703-44f9829ba187",
7125
- "fruit-bowl": "1490474418585-ba9bad8fd0ea",
7126
- "soft-drink": "1581636625402-29b2a704ef13",
7127
- sobolo: "1556679343-c7306c1976bc",
7128
- "fresh-juice": "1610970881699-44a5587cabec",
7129
- water: "1564325724739-bae0bd08762c",
7130
- feast: "1559847844-5315695dadae",
7131
- byo: "1551782450-a2132b4ba21d"
7132
- };
7133
- var photoFor = (slug) => seedImage("restaurant", PHOTO[slug] ?? "1414235077428-338989a2e8c0");
7113
+ var photoFor = (slug) => seedImage("restaurant", slug);
7134
7114
  function seedRestaurant(registry) {
7135
7115
  const businessId = "bus_mamas_kitchen";
7136
7116
  const business = {
@@ -7590,29 +7570,7 @@ function seedRestaurant(registry) {
7590
7570
 
7591
7571
  // src/mock/seeds/retail.ts
7592
7572
  var ISO5 = "2026-01-01T00:00:00.000Z";
7593
- var PHOTO2 = {
7594
- "android-flagship": "1592750475338-74b7b21085ab",
7595
- "android-mid": "1511707171634-5f897ff02aa9",
7596
- "phone-budget": "1574944985070-8f3ebc6b79d2",
7597
- "laptop-pro": "1517336714731-489689fd1ca8",
7598
- "laptop-air": "1496181133206-80ce9b88a853",
7599
- "laptop-budget": "1601784551446-20c9e07cdbdb",
7600
- "headphones-anc": "1505740420928-5e560c06d30e",
7601
- "earbuds-pro": "1572569511254-d8f925fe2cbb",
7602
- "speaker-bt": "1612287230202-1ff1d85d1bdf",
7603
- "phone-case": "1611532736597-de2d4265fba3",
7604
- "screen-protector": "1568952433726-3896e3881c65",
7605
- "fast-charger": "1620794108219-aedbaded4eea",
7606
- "laptop-sleeve": "1604671801908-6f0c6a092c05",
7607
- "wireless-mouse": "1594732832278-abd644401426",
7608
- "mech-keyboard": "1583394838336-acd977736f90",
7609
- "gaming-controller": "1542751371-adc38448a05e",
7610
- "gaming-headset": "1606220945770-b5b6c2c55bf1",
7611
- "console-handheld": "1593642634524-b40b5baae6bb",
7612
- wfh: "1605236453806-6ff36851218e",
7613
- "game-pack": "1606144042614-b2417e99c4e3"
7614
- };
7615
- var photoFor2 = (slug) => seedImage("retail", PHOTO2[slug] ?? "1517336714731-489689fd1ca8");
7573
+ var photoFor2 = (slug) => seedImage("retail", slug);
7616
7574
  function seedRetail(registry) {
7617
7575
  const businessId = "bus_currents_electronics";
7618
7576
  const business = {
@@ -8085,29 +8043,7 @@ function seedRetail(registry) {
8085
8043
 
8086
8044
  // src/mock/seeds/services.ts
8087
8045
  var ISO6 = "2026-01-01T00:00:00.000Z";
8088
- var PHOTO3 = {
8089
- "business-hero": "1540555700478-4be289fbecef",
8090
- "swedish-massage-60": "1544161515-4ab6ce6db874",
8091
- "swedish-massage-90": "1519823551278-64ac92734fb1",
8092
- "deep-tissue-60": "1571019613454-1cb2f99b2d8b",
8093
- "couples-massage": "1591343395082-e120087004b4",
8094
- "hot-stone-90": "1620733723572-11c53f73a416",
8095
- "facial-classic": "1487412947147-5cebf100ffc2",
8096
- "facial-anti-aging": "1487412947147-5cebf100ffc2",
8097
- "facial-acne": "1556228720-195a672e8a03",
8098
- manicure: "1604654894610-df63bc536371",
8099
- pedicure: "1519415943484-9fa1873496d4",
8100
- "gel-manicure": "1607779097040-26e80aa78e66",
8101
- haircut: "1622286342621-4bd786c2447c",
8102
- "hair-treatment": "1633681926022-84c23e8cb2d6",
8103
- color: "1560066984-138dadb4c035",
8104
- "yoga-session": "1545205597-3d9d02c29597",
8105
- meditation: "1506126613408-eca07ce68773",
8106
- "spa-day": "1571019613454-1cb2f99b2d8b",
8107
- couples: "1591343395082-e120087004b4",
8108
- custom: "1540555700478-4be289fbecef"
8109
- };
8110
- var photoFor3 = (slug) => seedImage("services", PHOTO3[slug] ?? "1540555700478-4be289fbecef");
8046
+ var photoFor3 = (slug) => seedImage("services", slug);
8111
8047
  function seedServices(registry) {
8112
8048
  const businessId = "bus_serene_spa";
8113
8049
  const business = {
@@ -8487,35 +8423,7 @@ function seedServices(registry) {
8487
8423
 
8488
8424
  // src/mock/seeds/grocery.ts
8489
8425
  var ISO7 = "2026-01-01T00:00:00.000Z";
8490
- var PHOTO4 = {
8491
- "business-hero": "1542838132-92c53300491e",
8492
- "tomatoes-1kg": "1592924357228-91a4daadcfea",
8493
- "onions-1kg": "1620574387735-3624d75b2dbc",
8494
- "ginger-200g": "1594631252845-29fc4cc8cde9",
8495
- "bananas-bunch": "1571771019784-3ff35f4f4277",
8496
- pineapple: "1550258987-190a2d41a8ba",
8497
- "spinach-bunch": "1576045057995-568f588f82fb",
8498
- "milk-1l": "1563636619-e9143da7973b",
8499
- "yogurt-500g": "1488477181946-6428a0291777",
8500
- "eggs-12": "1582722872445-44dc5f7e3c8f",
8501
- "cheese-200g": "1486297678162-eb2a19b0a32d",
8502
- "chicken-1kg": "1604503468506-a8da13d82791",
8503
- "beef-mince-500g": "1607623814075-e51df1bdc82f",
8504
- "tilapia-each": "1535473895227-bdecb20fb157",
8505
- "rice-5kg": "1586201375761-83865001e31c",
8506
- "garri-2kg": "1582284540020-8acbe03f4924",
8507
- "palm-oil-1l": "1611078489935-0cb964de46d6",
8508
- "vegetable-oil-1l": "1474979266404-7eaacbcd87c5",
8509
- "salt-1kg": "1607301406259-dfb186e15de8",
8510
- "sugar-1kg": "1610725664285-7c57e6eeac3f",
8511
- "tomato-paste": "1561136594-7f68413baa99",
8512
- "soap-bar": "1600857062241-98e5dba7f214",
8513
- "detergent-1kg": "1582735689369-4fe89db7114c",
8514
- "tissue-pack": "1583947215259-38e31be8751f",
8515
- "trash-bags": "1605600659908-0ef719419d41",
8516
- essentials: "1542838132-92c53300491e"
8517
- };
8518
- var photoFor4 = (slug) => seedImage("grocery", PHOTO4[slug] ?? "1542838132-92c53300491e");
8426
+ var photoFor4 = (slug) => seedImage("grocery", slug);
8519
8427
  function seedGrocery(registry) {
8520
8428
  const businessId = "bus_freshmart";
8521
8429
  const business = {
@@ -8778,23 +8686,7 @@ function seedGrocery(registry) {
8778
8686
 
8779
8687
  // src/mock/seeds/fashion.ts
8780
8688
  var ISO8 = "2026-01-01T00:00:00.000Z";
8781
- var PHOTO5 = {
8782
- "heavyweight-hoodie-charcoal": "1556905055-8f358a7a47b2",
8783
- "heavyweight-hoodie-cream": "1576566588028-4147f3842f27",
8784
- "heavyweight-hoodie-cobalt": "1542838686-37da4a9fd1b3",
8785
- "studio-tee-black": "1521572163474-6864f9cf17ab",
8786
- "studio-tee-natural": "1485518882345-15568b007407",
8787
- "graphic-tee-frx-mark": "1521223890158-f9f7c3d5d504",
8788
- "carbon-bomber": "1591047139829-d91aecb6caea",
8789
- "field-jacket-olive": "1564859228273-274232fdb516",
8790
- "wide-leg-trouser": "1542272604-787c3835535d",
8791
- "track-pant-charcoal": "1604176354204-9268737828e4",
8792
- "studio-cap": "1620799140408-edc6dcb6d633",
8793
- "tote-natural": "1591195853828-11db59a44f6b",
8794
- "knit-beanie": "1542838132-92c53300491e",
8795
- "studio-sock-3pack": "1602810318383-e386cc2a3ccf"
8796
- };
8797
- var photoFor5 = (slug) => seedImage("fashion", PHOTO5[slug] ?? "1556905055-8f358a7a47b2");
8689
+ var photoFor5 = (slug) => seedImage("fashion", slug);
8798
8690
  var SIZES = ["XS", "S", "M", "L", "XL", "2XL"];
8799
8691
  function seedFashion(registry) {
8800
8692
  const businessId = "bus_studio_frx";
@@ -8809,7 +8701,7 @@ function seedFashion(registry) {
8809
8701
  default_address: "Osu Oxford Street, Accra",
8810
8702
  default_offers_table_service: false,
8811
8703
  default_accepts_online_orders: true,
8812
- image: seedImage("fashion", "1490481651871-ab68de25d43d"),
8704
+ image: seedImage("fashion", "business-hero"),
8813
8705
  status: "active",
8814
8706
  created_at: ISO8,
8815
8707
  updated_at: ISO8,
@@ -9211,6 +9103,553 @@ function seedFashion(registry) {
9211
9103
  return { businessId };
9212
9104
  }
9213
9105
 
9106
+ // src/mock/seeds/pharmacy.ts
9107
+ var ISO9 = "2026-01-01T00:00:00.000Z";
9108
+ var photoFor6 = (slug) => seedImage("pharmacy", slug);
9109
+ function seedPharmacy(registry) {
9110
+ const businessId = "bus_wellspring_pharmacy";
9111
+ const business = {
9112
+ id: businessId,
9113
+ name: "Wellspring Pharmacy",
9114
+ handle: "wellspring",
9115
+ business_type: "retail",
9116
+ email: "care@wellspringpharmacy.test",
9117
+ default_currency: "GHS",
9118
+ default_phone: "+233244778899",
9119
+ default_address: "5 Liberation Road, Ridge, Accra",
9120
+ default_offers_table_service: false,
9121
+ default_accepts_online_orders: true,
9122
+ image: photoFor6("business-hero"),
9123
+ status: "active",
9124
+ created_at: ISO9,
9125
+ updated_at: ISO9,
9126
+ created_by: "seed",
9127
+ preferences: {
9128
+ theme: "clinical",
9129
+ tagline: "Trusted care, delivered same-day",
9130
+ checkout: { allow_guest: true }
9131
+ },
9132
+ is_online_only: false,
9133
+ enabled_payment_types: ["card", "mobile_money", "cash"],
9134
+ default_location_settings: {},
9135
+ country_code: "GH",
9136
+ timezone: "Africa/Accra"
9137
+ };
9138
+ registry.businesses.put(businessId, business);
9139
+ const categories = [
9140
+ { slug: "pain-relief", name: "Pain Relief" },
9141
+ { slug: "cold-flu", name: "Cold & Flu" },
9142
+ { slug: "vitamins", name: "Vitamins & Supplements" },
9143
+ { slug: "first-aid", name: "First Aid" },
9144
+ { slug: "personal-care", name: "Personal Care" },
9145
+ { slug: "devices", name: "Medical Devices" },
9146
+ { slug: "baby", name: "Baby & Mother" }
9147
+ ];
9148
+ const catIds = /* @__PURE__ */ new Map();
9149
+ for (const c of categories) {
9150
+ const id = `cat_${c.slug}`;
9151
+ catIds.set(c.slug, id);
9152
+ const cat = {
9153
+ id,
9154
+ business_id: businessId,
9155
+ name: c.name,
9156
+ slug: c.slug,
9157
+ description: `Wellspring \u2014 ${c.name}`,
9158
+ product_ids: [],
9159
+ display_order: 0,
9160
+ is_active: true,
9161
+ created_at: ISO9,
9162
+ updated_at: ISO9
9163
+ };
9164
+ registry.categories.put(id, cat);
9165
+ }
9166
+ function field(productSlug, f) {
9167
+ return {
9168
+ id: f.id ?? `fld_${productSlug}_${f.slug}`,
9169
+ product_id: `prod_${productSlug}`,
9170
+ ...f
9171
+ };
9172
+ }
9173
+ const products = [
9174
+ // Pain Relief
9175
+ {
9176
+ slug: "paracetamol",
9177
+ name: "Paracetamol 500mg (24 tablets)",
9178
+ price: "12.00",
9179
+ category: "pain-relief",
9180
+ description: "Fever and mild-to-moderate pain. Adults and children over 12.",
9181
+ tags: ["otc", "analgesic"],
9182
+ inputs: [
9183
+ field("paracetamol", {
9184
+ slug: "age_confirmation",
9185
+ name: "Age confirmation",
9186
+ field_type: "checkbox",
9187
+ is_required: true,
9188
+ display_order: 0,
9189
+ help_text: "I confirm this product is for someone aged 12 or over."
9190
+ })
9191
+ ]
9192
+ },
9193
+ { slug: "ibuprofen", name: "Ibuprofen 200mg (20 tablets)", price: "18.00", category: "pain-relief", description: "Anti-inflammatory for headaches, muscle pain, menstrual cramps.", tags: ["otc", "nsaid"] },
9194
+ { slug: "aspirin", name: "Aspirin 300mg (30 tablets)", price: "15.00", category: "pain-relief", description: "Pain relief and low-dose daily cardiovascular protection.", tags: ["otc", "analgesic"] },
9195
+ { slug: "allergy-relief", name: "Cetirizine 10mg (10 tablets)", price: "22.00", category: "pain-relief", description: "Non-drowsy antihistamine for seasonal allergies.", tags: ["otc", "antihistamine"] },
9196
+ // Cold & Flu
9197
+ { slug: "cold-flu-syrup", name: "Cold & Flu Syrup (200ml)", price: "35.00", category: "cold-flu", description: "Multi-symptom relief: blocked nose, sore throat, dry cough.", tags: ["otc", "syrup"] },
9198
+ { slug: "throat-lozenges", name: "Honey-Lemon Throat Lozenges (24)", price: "18.00", category: "cold-flu", description: "Soothes sore throat and irritation.", tags: ["otc", "lozenge"] },
9199
+ { slug: "decongestant", name: "Nasal Decongestant Spray (10ml)", price: "28.00", category: "cold-flu", description: "Fast-acting relief for blocked nasal passages.", tags: ["otc", "spray"] },
9200
+ // Vitamins & Supplements
9201
+ { slug: "multivitamin", name: "Daily Multivitamin (60 tablets)", price: "85.00", category: "vitamins", description: "Once-daily formula with 22 essential vitamins and minerals.", tags: ["supplement", "daily"] },
9202
+ { slug: "vitamin-c", name: "Vitamin C 1000mg (90 tablets)", price: "65.00", category: "vitamins", description: "Immune-support antioxidant. Time-released.", tags: ["supplement", "immune"] },
9203
+ { slug: "vitamin-d", name: "Vitamin D3 1000IU (120 capsules)", price: "55.00", category: "vitamins", description: "Bone and immune health. 4-month supply.", tags: ["supplement", "bone-health"] },
9204
+ { slug: "omega-3", name: "Omega-3 Fish Oil (90 softgels)", price: "120.00", category: "vitamins", description: "1000mg EPA+DHA for heart and brain health.", tags: ["supplement", "heart-health"] },
9205
+ { slug: "probiotics", name: "Probiotic 10-Strain (30 capsules)", price: "95.00", category: "vitamins", description: "Digestive and immune support.", tags: ["supplement", "digestive"] },
9206
+ // First Aid
9207
+ { slug: "first-aid-kit", name: "Home First Aid Kit", price: "180.00", category: "first-aid", description: "60-piece kit with plasters, gauze, antiseptic, scissors, and quick-reference guide.", tags: ["kit", "essential"] },
9208
+ { slug: "plasters", name: "Assorted Plasters (40 pack)", price: "22.00", category: "first-aid", description: "Waterproof adhesive bandages in five sizes.", tags: ["first-aid"] },
9209
+ { slug: "antiseptic", name: "Antiseptic Cream (30g)", price: "18.00", category: "first-aid", description: "For cuts, grazes, and minor skin infections.", tags: ["first-aid", "cream"] },
9210
+ { slug: "bandages", name: "Elastic Crepe Bandage (5cm x 4.5m)", price: "15.00", category: "first-aid", description: "Reusable compression bandage for sprains.", tags: ["first-aid"] },
9211
+ // Personal Care
9212
+ { slug: "hand-sanitizer", name: "Hand Sanitizer 70% Alcohol (500ml)", price: "32.00", category: "personal-care", description: "Kills 99.9% of germs. Moisturising formula.", tags: ["hygiene"] },
9213
+ { slug: "face-mask", name: "Surgical Face Masks (50 pack)", price: "45.00", category: "personal-care", description: "3-ply earloop masks. Disposable.", tags: ["hygiene", "ppe"] },
9214
+ { slug: "lip-balm", name: "Medicated Lip Balm (4g)", price: "12.00", category: "personal-care", description: "SPF 15 with cocoa butter and beeswax.", tags: ["skin-care"] },
9215
+ // Medical Devices
9216
+ { slug: "thermometer", name: "Digital Thermometer", price: "65.00", category: "devices", description: "Fast oral / underarm reading in 10 seconds. Auto-shutoff.", tags: ["device", "essential"] },
9217
+ {
9218
+ slug: "blood-pressure-monitor",
9219
+ name: "Automatic BP Monitor",
9220
+ price: "320.00",
9221
+ category: "devices",
9222
+ description: "Upper-arm cuff with memory for two users. Irregular heartbeat detection.",
9223
+ tags: ["device", "premium"],
9224
+ inputs: [
9225
+ field("blood-pressure-monitor", {
9226
+ slug: "arm_size",
9227
+ name: "Arm circumference",
9228
+ field_type: "select",
9229
+ options: ["Standard (22\u201332 cm)", "Large (32\u201342 cm)"],
9230
+ is_required: true,
9231
+ display_order: 0,
9232
+ help_text: "Pick the cuff that fits \u2014 wrong size gives inaccurate readings."
9233
+ })
9234
+ ]
9235
+ },
9236
+ { slug: "glucometer", name: "Blood Glucose Meter Starter Kit", price: "280.00", category: "devices", description: "Meter, 25 test strips, lancing device, 25 lancets, carry case.", tags: ["device", "diabetes"] },
9237
+ { slug: "pulse-oximeter", name: "Fingertip Pulse Oximeter", price: "145.00", category: "devices", description: "SpO2 + heart-rate reading in under 10 seconds.", tags: ["device"] },
9238
+ // Baby & Mother
9239
+ {
9240
+ slug: "baby-formula",
9241
+ name: "Infant Formula Stage 1 (400g)",
9242
+ price: "150.00",
9243
+ category: "baby",
9244
+ description: "0\u20136 months. Iron-fortified, with prebiotics.",
9245
+ tags: ["baby", "nutrition"],
9246
+ inputs: [
9247
+ field("baby-formula", {
9248
+ slug: "baby_dob",
9249
+ name: "Baby's date of birth",
9250
+ field_type: "date",
9251
+ is_required: true,
9252
+ display_order: 0,
9253
+ help_text: "Confirms stage 1 is the right formula for your baby's age."
9254
+ }),
9255
+ field("baby-formula", {
9256
+ slug: "allergies",
9257
+ name: "Known allergies or intolerances",
9258
+ field_type: "textarea",
9259
+ is_required: false,
9260
+ display_order: 1,
9261
+ placeholder: "e.g. lactose, soy. Leave blank if none.",
9262
+ semantic_kind: "allergen"
9263
+ })
9264
+ ]
9265
+ },
9266
+ { slug: "baby-wipes", name: "Sensitive Baby Wipes (72 pack)", price: "28.00", category: "baby", description: "Alcohol-free, fragrance-free. Dermatologist-tested.", tags: ["baby", "hygiene"] },
9267
+ // ── Prescription medications (Rx; require a verified prescription) ─
9268
+ {
9269
+ slug: "amoxicillin-rx",
9270
+ name: "Amoxicillin 500mg (Rx)",
9271
+ price: "65.00",
9272
+ category: "pain-relief",
9273
+ description: "Broad-spectrum antibiotic. Prescription required \u2014 our pharmacist will verify before dispensing.",
9274
+ tags: ["prescription", "antibiotic"],
9275
+ requiresPrescription: true,
9276
+ inputs: [
9277
+ field("amoxicillin-rx", {
9278
+ slug: "prescription_upload",
9279
+ name: "Upload prescription",
9280
+ field_type: "file",
9281
+ is_required: true,
9282
+ display_order: 0,
9283
+ help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
9284
+ validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
9285
+ }),
9286
+ field("amoxicillin-rx", {
9287
+ slug: "patient_dob",
9288
+ name: "Patient date of birth",
9289
+ field_type: "date",
9290
+ is_required: true,
9291
+ display_order: 1
9292
+ }),
9293
+ field("amoxicillin-rx", {
9294
+ slug: "consent",
9295
+ name: "I confirm this prescription is genuine and issued for the named patient",
9296
+ field_type: "checkbox",
9297
+ is_required: true,
9298
+ display_order: 2,
9299
+ semantic_kind: "consent"
9300
+ })
9301
+ ]
9302
+ },
9303
+ {
9304
+ slug: "insulin-rx",
9305
+ name: "Insulin Glargine 100u/ml (Rx)",
9306
+ price: "240.00",
9307
+ category: "devices",
9308
+ description: "Long-acting basal insulin. Cold-chain delivery; prescription required.",
9309
+ tags: ["prescription", "diabetes", "cold-chain"],
9310
+ requiresPrescription: true,
9311
+ inputs: [
9312
+ field("insulin-rx", {
9313
+ slug: "prescription_upload",
9314
+ name: "Upload prescription",
9315
+ field_type: "file",
9316
+ is_required: true,
9317
+ display_order: 0,
9318
+ help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
9319
+ validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
9320
+ }),
9321
+ field("insulin-rx", {
9322
+ slug: "delivery_temp_acknowledgement",
9323
+ name: "I'll be available to receive a cold-chain delivery",
9324
+ field_type: "checkbox",
9325
+ is_required: true,
9326
+ display_order: 1,
9327
+ help_text: "Insulin must be refrigerated. Delivery driver will hand over directly \u2014 not leave at door.",
9328
+ semantic_kind: "consent"
9329
+ })
9330
+ ]
9331
+ },
9332
+ {
9333
+ slug: "vaccination-consent",
9334
+ name: "Flu Shot \u2014 At-Pharmacy",
9335
+ price: "80.00",
9336
+ category: "personal-care",
9337
+ description: "Pharmacist-administered seasonal influenza vaccine. Walk-in or book a slot.",
9338
+ tags: ["service", "vaccination"],
9339
+ inputs: [
9340
+ field("vaccination-consent", {
9341
+ slug: "patient_name",
9342
+ name: "Patient name",
9343
+ field_type: "text",
9344
+ is_required: true,
9345
+ display_order: 0
9346
+ }),
9347
+ field("vaccination-consent", {
9348
+ slug: "patient_dob",
9349
+ name: "Date of birth",
9350
+ field_type: "date",
9351
+ is_required: true,
9352
+ display_order: 1
9353
+ }),
9354
+ field("vaccination-consent", {
9355
+ slug: "allergies",
9356
+ name: "Known allergies or reactions to past vaccines",
9357
+ field_type: "textarea",
9358
+ is_required: false,
9359
+ display_order: 2,
9360
+ placeholder: "Egg, latex, prior vaccine reactions, etc. Leave blank if none.",
9361
+ semantic_kind: "allergen"
9362
+ }),
9363
+ field("vaccination-consent", {
9364
+ slug: "consent_signature",
9365
+ name: "Signed consent",
9366
+ field_type: "signature",
9367
+ is_required: true,
9368
+ display_order: 3,
9369
+ help_text: "Required by our administering pharmacist before vaccination.",
9370
+ semantic_kind: "consent"
9371
+ })
9372
+ ]
9373
+ }
9374
+ ];
9375
+ for (const p of products) {
9376
+ const id = `prod_${p.slug}`;
9377
+ const catId = catIds.get(p.category);
9378
+ const product = {
9379
+ id,
9380
+ business_id: businessId,
9381
+ name: p.name,
9382
+ slug: p.slug,
9383
+ description: p.description,
9384
+ product_type: "product",
9385
+ base_price: p.price,
9386
+ currency: "GHS",
9387
+ image: photoFor6(p.slug),
9388
+ images: [photoFor6(p.slug)],
9389
+ is_available: true,
9390
+ category_ids: [catId],
9391
+ collection_ids: [],
9392
+ add_on_ids: [],
9393
+ variant_ids: [],
9394
+ tags: p.tags ?? [],
9395
+ input_fields: p.inputs,
9396
+ metadata: p.requiresPrescription ? { requires_prescription: true } : void 0,
9397
+ created_at: ISO9,
9398
+ updated_at: ISO9
9399
+ };
9400
+ registry.products.put(id, product);
9401
+ const cat = registry.categories.get(catId);
9402
+ cat.product_ids.push(id);
9403
+ registry.categories.put(catId, cat);
9404
+ }
9405
+ const essentials = {
9406
+ id: "col_essentials",
9407
+ business_id: businessId,
9408
+ name: "Home Essentials",
9409
+ slug: "essentials",
9410
+ description: "Stock up your medicine cabinet.",
9411
+ product_ids: [
9412
+ "prod_paracetamol",
9413
+ "prod_first-aid-kit",
9414
+ "prod_thermometer",
9415
+ "prod_hand-sanitizer",
9416
+ "prod_multivitamin"
9417
+ ],
9418
+ is_active: true,
9419
+ created_at: ISO9,
9420
+ updated_at: ISO9
9421
+ };
9422
+ registry.collections.put(essentials.id, essentials);
9423
+ for (const pid of essentials.product_ids) {
9424
+ const p = registry.products.get(pid);
9425
+ if (p) {
9426
+ p.collection_ids.push(essentials.id);
9427
+ registry.products.put(pid, p);
9428
+ }
9429
+ }
9430
+ const packAxis = {
9431
+ id: "axis_pack_size",
9432
+ business_id: businessId,
9433
+ product_id: "prod_paracetamol",
9434
+ name: "Pack size",
9435
+ display_order: 0,
9436
+ affects_recipe: false,
9437
+ values: [
9438
+ { id: "axv_pack_24", name: "24 tablets", display: 0 },
9439
+ { id: "axv_pack_48", name: "48 tablets", display: 1 },
9440
+ { id: "axv_pack_100", name: "100 tablets (family)", display: 2 }
9441
+ ].map((v) => ({
9442
+ id: v.id,
9443
+ business_id: businessId,
9444
+ axis_id: "axis_pack_size",
9445
+ name: v.name,
9446
+ display_order: v.display,
9447
+ created_at: ISO9,
9448
+ updated_at: ISO9
9449
+ })),
9450
+ created_at: ISO9,
9451
+ updated_at: ISO9
9452
+ };
9453
+ registry.variantAxes.put(packAxis.id, packAxis);
9454
+ const packAdj = { pack_24: "0.00", pack_48: "8.00", pack_100: "18.00" };
9455
+ const paracetamolVariantIds = [];
9456
+ let firstVariant = true;
9457
+ for (const pk of packAxis.values) {
9458
+ const key = pk.id.replace("axv_pack_", "pack_");
9459
+ const id = `var_paracetamol_${key.replace("pack_", "")}`;
9460
+ const variant = {
9461
+ id,
9462
+ product_id: "prod_paracetamol",
9463
+ business_id: businessId,
9464
+ name: pk.name,
9465
+ sku: `PCM-${key.toUpperCase()}`,
9466
+ price_adjustment: packAdj[key] ?? "0.00",
9467
+ component_multiplier: "1.00",
9468
+ is_default: firstVariant,
9469
+ is_active: true,
9470
+ axis_value_ids: [pk.id],
9471
+ created_at: ISO9,
9472
+ updated_at: ISO9
9473
+ };
9474
+ registry.variants.put(id, variant);
9475
+ paracetamolVariantIds.push(id);
9476
+ firstVariant = false;
9477
+ }
9478
+ const paracetamol = registry.products.get("prod_paracetamol");
9479
+ if (paracetamol) {
9480
+ paracetamol.variant_ids = paracetamolVariantIds;
9481
+ registry.products.put(paracetamol.id, paracetamol);
9482
+ }
9483
+ const formAddOn = {
9484
+ id: "addon_form",
9485
+ business_id: businessId,
9486
+ name: "Format",
9487
+ is_multiple_allowed: false,
9488
+ is_required: false,
9489
+ is_mutually_exclusive: true,
9490
+ min_selections: 0,
9491
+ max_selections: 1,
9492
+ created_at: ISO9,
9493
+ updated_at: ISO9,
9494
+ options: [
9495
+ { id: "addopt_generic", add_on_id: "addon_form", business_id: businessId, name: "Generic (default)", default_price: "0.00", is_required: false, is_mutually_exclusive: true, created_at: ISO9, updated_at: ISO9 },
9496
+ { id: "addopt_brand", add_on_id: "addon_form", business_id: businessId, name: "Brand-name (+30%)", default_price: "8.00", is_required: false, is_mutually_exclusive: true, created_at: ISO9, updated_at: ISO9 }
9497
+ ]
9498
+ };
9499
+ registry.addOns.put(formAddOn.id, formAddOn);
9500
+ const medProductIds = ["prod_paracetamol", "prod_ibuprofen", "prod_aspirin", "prod_allergy-relief"];
9501
+ for (const pid of medProductIds) {
9502
+ registry.productAddOns.put(`${pid}:${formAddOn.id}`, { product_id: pid, add_on_id: formAddOn.id });
9503
+ const p = registry.products.get(pid);
9504
+ if (p) {
9505
+ p.add_on_ids.push(formAddOn.id);
9506
+ registry.products.put(pid, p);
9507
+ }
9508
+ }
9509
+ const services = [
9510
+ {
9511
+ id: "svc_bp_check",
9512
+ business_id: businessId,
9513
+ name: "Blood Pressure Check",
9514
+ description: "Free in-store BP reading with our pharmacist.",
9515
+ duration_minutes: 15,
9516
+ price: "0.00",
9517
+ is_available: true
9518
+ },
9519
+ {
9520
+ id: "svc_consultation",
9521
+ business_id: businessId,
9522
+ name: "Pharmacist Consultation",
9523
+ description: "15-minute one-on-one about medications, interactions, or symptoms.",
9524
+ duration_minutes: 15,
9525
+ price: "30.00",
9526
+ is_available: true
9527
+ },
9528
+ {
9529
+ id: "svc_prescription_refill",
9530
+ business_id: businessId,
9531
+ name: "Prescription Refill",
9532
+ description: "Upload your prescription; we prepare it for pickup or delivery same-day.",
9533
+ duration_minutes: 30,
9534
+ price: "0.00",
9535
+ is_available: true
9536
+ },
9537
+ {
9538
+ id: "svc_vaccination",
9539
+ business_id: businessId,
9540
+ name: "Vaccination (Flu, Tetanus)",
9541
+ description: "Walk-in or by appointment. Pharmacist-administered.",
9542
+ duration_minutes: 20,
9543
+ price: "80.00",
9544
+ is_available: true
9545
+ }
9546
+ ];
9547
+ for (const s of services) registry.services.put(s.id, s);
9548
+ const tags = [
9549
+ { id: "tag_otc", business_id: businessId, name: "OTC", slug: "otc", color: "#16a34a", sort_order: 0, usage_count: 11, created_at: ISO9, updated_at: ISO9 },
9550
+ { id: "tag_essential", business_id: businessId, name: "Essential", slug: "essential", color: "#2563eb", sort_order: 1, usage_count: 2, created_at: ISO9, updated_at: ISO9 },
9551
+ { id: "tag_prescription", business_id: businessId, name: "Prescription", slug: "prescription", color: "#dc2626", sort_order: 2, usage_count: 0, created_at: ISO9, updated_at: ISO9 }
9552
+ ];
9553
+ for (const t of tags) registry.tags.put(t.id, t);
9554
+ const medication = {
9555
+ id: "tax_medication",
9556
+ business_id: businessId,
9557
+ name: "Medication",
9558
+ slug: "medication",
9559
+ path: ["Health", "Medication"],
9560
+ attribute_template_ids: ["attr_active_ingredient", "attr_dosage"],
9561
+ created_at: ISO9,
9562
+ updated_at: ISO9
9563
+ };
9564
+ registry.taxonomies.put(medication.id, medication);
9565
+ const attrs = [
9566
+ {
9567
+ id: "attr_active_ingredient",
9568
+ business_id: businessId,
9569
+ namespace: "core",
9570
+ name: "Active ingredient",
9571
+ slug: "active-ingredient",
9572
+ attribute_type: "text",
9573
+ is_required: false,
9574
+ is_filterable: true,
9575
+ visibility: "public",
9576
+ display_order: 0,
9577
+ applies_to: "product",
9578
+ created_at: ISO9,
9579
+ updated_at: ISO9
9580
+ },
9581
+ {
9582
+ id: "attr_dosage",
9583
+ business_id: businessId,
9584
+ namespace: "core",
9585
+ name: "Dosage form",
9586
+ slug: "dosage-form",
9587
+ attribute_type: "select",
9588
+ options: ["tablet", "capsule", "syrup", "spray", "cream", "drops"],
9589
+ is_required: false,
9590
+ is_filterable: true,
9591
+ visibility: "public",
9592
+ display_order: 1,
9593
+ applies_to: "product",
9594
+ created_at: ISO9,
9595
+ updated_at: ISO9
9596
+ },
9597
+ {
9598
+ id: "attr_prescription_required",
9599
+ business_id: businessId,
9600
+ namespace: "core",
9601
+ name: "Prescription required",
9602
+ slug: "prescription-required",
9603
+ attribute_type: "boolean",
9604
+ is_required: false,
9605
+ is_filterable: true,
9606
+ visibility: "public",
9607
+ display_order: 2,
9608
+ applies_to: "product",
9609
+ created_at: ISO9,
9610
+ updated_at: ISO9
9611
+ }
9612
+ ];
9613
+ for (const a of attrs) registry.attributeDefs.put(a.id, a);
9614
+ const articles = [
9615
+ {
9616
+ id: "kb_prescription",
9617
+ business_id: businessId,
9618
+ title: "Prescription handling",
9619
+ slug: "prescription-handling",
9620
+ content: "Upload prescriptions through the prescription-refill service. Our pharmacist verifies before dispensing; same-day pickup or delivery within Accra.",
9621
+ category: "logistics",
9622
+ tags: ["prescription", "delivery"],
9623
+ created_at: ISO9,
9624
+ updated_at: ISO9
9625
+ },
9626
+ {
9627
+ id: "kb_returns",
9628
+ business_id: businessId,
9629
+ title: "Returns & exchanges",
9630
+ slug: "returns",
9631
+ content: "Sealed OTC products may be returned within 7 days with receipt. Opened products, prescriptions, and refrigerated items are non-returnable for safety reasons.",
9632
+ category: "policies",
9633
+ tags: ["returns"],
9634
+ created_at: ISO9,
9635
+ updated_at: ISO9
9636
+ },
9637
+ {
9638
+ id: "kb_consultation",
9639
+ business_id: businessId,
9640
+ title: "Pharmacist consultations",
9641
+ slug: "consultations",
9642
+ content: "15-minute pharmacist appointments cover medication review, side-effect questions, OTC selection, and symptom triage. Book through the services menu.",
9643
+ category: "services",
9644
+ tags: ["consultation"],
9645
+ created_at: ISO9,
9646
+ updated_at: ISO9
9647
+ }
9648
+ ];
9649
+ for (const a of articles) registry.knowledgeArticles.put(a.id, a);
9650
+ return { businessId };
9651
+ }
9652
+
9214
9653
  // src/mock/seeds/registry.ts
9215
9654
  var SEEDS = {
9216
9655
  default: seedDefault,
@@ -9220,7 +9659,8 @@ var SEEDS = {
9220
9659
  retail: seedRetail,
9221
9660
  services: seedServices,
9222
9661
  grocery: seedGrocery,
9223
- fashion: seedFashion
9662
+ fashion: seedFashion,
9663
+ pharmacy: seedPharmacy
9224
9664
  };
9225
9665
  function applySeed(registry, name) {
9226
9666
  const fn = SEEDS[name];