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