@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
@@ -3784,6 +3784,10 @@ function toApiProduct(p, ctx) {
3784
3784
  duration_unit: p.duration_unit,
3785
3785
  duration_minutes: p.duration_minutes,
3786
3786
  billing_plans: p.billing_plans,
3787
+ /** Per-product customer inputs (prescription upload, consent
3788
+ * signature, etc.). The Rust backend emits this on ProductView; the
3789
+ * SDK's React components branch on its presence to render inputs. */
3790
+ input_fields: p.input_fields ?? [],
3787
3791
  created_at: p.created_at,
3788
3792
  updated_at: p.updated_at,
3789
3793
  metadata: {
@@ -5675,8 +5679,8 @@ function createLinkService({ clock, ids }) {
5675
5679
 
5676
5680
  // src/mock/seeds/image.ts
5677
5681
  var CDN_BASE_URL = "https://static-tmp.cimplify.io";
5678
- function seedImage(industry, photoId) {
5679
- return `${CDN_BASE_URL}/seed/${industry}/${photoId}.jpg`;
5682
+ function seedImage(industry, slug) {
5683
+ return `${CDN_BASE_URL}/seed/${industry}/${slug}.jpg`;
5680
5684
  }
5681
5685
 
5682
5686
  // src/mock/seeds/default.ts
@@ -5739,7 +5743,7 @@ function seedDefault(registry) {
5739
5743
  default_address: "12 Independence Ave, Accra",
5740
5744
  default_offers_table_service: true,
5741
5745
  default_accepts_online_orders: true,
5742
- image: img("1568254183919-78a4f43a2877"),
5746
+ image: img("business-hero"),
5743
5747
  status: "active",
5744
5748
  created_at: ISO,
5745
5749
  updated_at: ISO,
@@ -5794,8 +5798,8 @@ function seedDefault(registry) {
5794
5798
  price: "25.00",
5795
5799
  description: "24-hour fermented country loaf with our heritage starter \u2014 open crumb, blistered crust, naturally tangy. Baked fresh every morning.",
5796
5800
  category: "breads",
5797
- imageUrl: img("1509440159596-0249088772ff"),
5798
- images: [img("1509440159596-0249088772ff"), img("1486887396153-fa416526c108")],
5801
+ imageUrl: img("sourdough-loaf"),
5802
+ images: [img("sourdough-loaf"), img("whole-wheat")],
5799
5803
  tags: ["bread", "vegan", "signature"],
5800
5804
  isSignature: true,
5801
5805
  ingredients: ["Wheat flour", "Sourdough starter", "Sea salt", "Filtered water"],
@@ -5810,7 +5814,7 @@ function seedDefault(registry) {
5810
5814
  price: "20.00",
5811
5815
  description: "Hearty 100% whole wheat with sunflower, sesame, and pumpkin seeds. Slow-fermented for a soft crumb and nutty depth.",
5812
5816
  category: "breads",
5813
- imageUrl: img("1486887396153-fa416526c108"),
5817
+ imageUrl: img("whole-wheat"),
5814
5818
  tags: ["bread", "vegan", "high-fibre"],
5815
5819
  ingredients: ["Whole wheat flour", "Sunflower seeds", "Sesame", "Pumpkin seeds"],
5816
5820
  allergies: ["wheat", "gluten", "sesame"],
@@ -5823,7 +5827,7 @@ function seedDefault(registry) {
5823
5827
  price: "15.00",
5824
5828
  description: "Crackling crust, airy crumb. Best eaten warm, within an hour of baking.",
5825
5829
  category: "breads",
5826
- imageUrl: img("1568471173242-461f0a730452"),
5830
+ imageUrl: img("baguette"),
5827
5831
  tags: ["bread", "vegan"],
5828
5832
  ingredients: ["Wheat flour", "Yeast", "Sea salt", "Water"],
5829
5833
  allergies: ["wheat", "gluten"],
@@ -5836,7 +5840,7 @@ function seedDefault(registry) {
5836
5840
  price: "30.00",
5837
5841
  description: "High-hydration focaccia drenched in olive oil, scattered with sea salt and fresh rosemary. Sold whole or by the slab.",
5838
5842
  category: "breads",
5839
- imageUrl: img("1571167530149-c1105da4c2c7"),
5843
+ imageUrl: img("focaccia"),
5840
5844
  tags: ["bread", "vegetarian"],
5841
5845
  ingredients: ["00 flour", "Olive oil", "Rosemary", "Maldon salt"],
5842
5846
  pairings: ["Burrata", "Prosciutto", "Caponata"],
@@ -5850,7 +5854,7 @@ function seedDefault(registry) {
5850
5854
  price: "18.00",
5851
5855
  description: "Caramelised brown butter, three over-ripe bananas, walnuts, finished with a salted maple glaze.",
5852
5856
  category: "breads",
5853
- imageUrl: img("1632931057819-4eefffa8e007"),
5857
+ imageUrl: img("banana-bread"),
5854
5858
  tags: ["sweet", "comfort"],
5855
5859
  ingredients: ["Bananas", "Brown butter", "Walnuts", "Maple syrup"],
5856
5860
  allergies: ["wheat", "gluten", "dairy", "nuts", "eggs"],
@@ -5865,8 +5869,8 @@ function seedDefault(registry) {
5865
5869
  price: "12.00",
5866
5870
  description: "27 layers of laminated dough wrapped around French butter. Crisp, shattering crust and a tender honeycomb interior.",
5867
5871
  category: "pastries",
5868
- imageUrl: img("1555507036-ab1f4038808a"),
5869
- images: [img("1555507036-ab1f4038808a"), img("1530610476181-d83430b64dcd")],
5872
+ imageUrl: img("croissant"),
5873
+ images: [img("croissant"), img("pain-au-chocolat")],
5870
5874
  tags: ["pastry", "vegetarian", "signature"],
5871
5875
  isSignature: true,
5872
5876
  ingredients: ["French butter", "Wheat flour", "Milk", "Eggs"],
@@ -5880,7 +5884,7 @@ function seedDefault(registry) {
5880
5884
  price: "14.00",
5881
5885
  description: "Our croissant dough wrapped around two batons of 70% Valrhona dark chocolate.",
5882
5886
  category: "pastries",
5883
- imageUrl: img("1530610476181-d83430b64dcd"),
5887
+ imageUrl: img("pain-au-chocolat"),
5884
5888
  tags: ["pastry", "chocolate"],
5885
5889
  ingredients: ["Croissant dough", "Valrhona chocolate"],
5886
5890
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -5893,7 +5897,7 @@ function seedDefault(registry) {
5893
5897
  price: "16.00",
5894
5898
  description: "Flaky pastry filled with almond cream, dusted with toasted slivers and powdered sugar.",
5895
5899
  category: "pastries",
5896
- imageUrl: img("1517433367423-c7e5b0f35086"),
5900
+ imageUrl: img("almond-danish"),
5897
5901
  tags: ["pastry", "nuts"],
5898
5902
  ingredients: ["Pastry dough", "Almond cream", "Toasted almonds"],
5899
5903
  allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
@@ -5906,7 +5910,7 @@ function seedDefault(registry) {
5906
5910
  price: "13.00",
5907
5911
  description: "Soft enriched dough swirled with butter and Ceylon cinnamon, finished with cream-cheese glaze.",
5908
5912
  category: "pastries",
5909
- imageUrl: img("1607920591413-4ec007e70023"),
5913
+ imageUrl: img("cinnamon-roll"),
5910
5914
  tags: ["pastry", "comfort"],
5911
5915
  ingredients: ["Enriched dough", "Cinnamon", "Brown sugar", "Cream cheese"],
5912
5916
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -5919,7 +5923,7 @@ function seedDefault(registry) {
5919
5923
  price: "12.00",
5920
5924
  description: "Dark, dense, fudgy brownie with a glossy shell. Chocolate four ways. Best slightly warm.",
5921
5925
  category: "pastries",
5922
- imageUrl: img("1606313564200-e75d5e30476c"),
5926
+ imageUrl: img("brownie"),
5923
5927
  tags: ["chocolate", "vegetarian"],
5924
5928
  ingredients: ["Dark chocolate", "Cocoa", "Brown butter", "Eggs"],
5925
5929
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -5932,7 +5936,7 @@ function seedDefault(registry) {
5932
5936
  price: "60.00",
5933
5937
  description: "Six French macarons \u2014 pistachio, raspberry, salted caramel, espresso, vanilla bean, and dark chocolate ganache.",
5934
5938
  category: "pastries",
5935
- imageUrl: img("1558326567-98ae2405596b"),
5939
+ imageUrl: img("macaron-box"),
5936
5940
  tags: ["pastry", "gift", "premium"],
5937
5941
  ingredients: ["Almond flour", "Egg whites", "Sugar", "Various fillings"],
5938
5942
  allergies: ["nuts", "eggs", "dairy"],
@@ -5946,7 +5950,7 @@ function seedDefault(registry) {
5946
5950
  price: "22.00",
5947
5951
  description: "Three layers of dark chocolate sponge with chocolate ganache and cr\xE8me p\xE2tissi\xE8re, finished with a mirror glaze. (Slice)",
5948
5952
  category: "cakes",
5949
- imageUrl: img("1565958011703-44f9829ba187"),
5953
+ imageUrl: img("chocolate-cake"),
5950
5954
  tags: ["cake", "chocolate", "signature"],
5951
5955
  isSignature: true,
5952
5956
  ingredients: ["Dark chocolate", "Cr\xE8me p\xE2tissi\xE8re", "Cocoa", "Eggs"],
@@ -5961,7 +5965,7 @@ function seedDefault(registry) {
5961
5965
  price: "22.00",
5962
5966
  description: "Classic red velvet with cream cheese frosting and white chocolate shavings.",
5963
5967
  category: "cakes",
5964
- imageUrl: img("1586788680434-30d324b2d46f"),
5968
+ imageUrl: img("red-velvet"),
5965
5969
  tags: ["cake"],
5966
5970
  ingredients: ["Buttermilk", "Cocoa", "Cream cheese", "Beetroot"],
5967
5971
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -5974,7 +5978,7 @@ function seedDefault(registry) {
5974
5978
  price: "20.00",
5975
5979
  description: "Spiced carrot cake with toasted walnuts, golden raisins, and cream-cheese frosting.",
5976
5980
  category: "cakes",
5977
- imageUrl: img("1568827999250-3f6afff96e66"),
5981
+ imageUrl: img("carrot-cake"),
5978
5982
  tags: ["cake", "spiced"],
5979
5983
  ingredients: ["Carrot", "Walnuts", "Cinnamon", "Cream cheese"],
5980
5984
  allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
@@ -5987,7 +5991,7 @@ function seedDefault(registry) {
5987
5991
  price: "24.00",
5988
5992
  description: "Dense, creamy New York cheesecake on a butter graham crust. Topped with seasonal berry compote.",
5989
5993
  category: "cakes",
5990
- imageUrl: img("1567306226416-28f0efdc88ce"),
5994
+ imageUrl: img("cheesecake"),
5991
5995
  tags: ["cake", "premium"],
5992
5996
  ingredients: ["Cream cheese", "Sour cream", "Graham crust", "Vanilla"],
5993
5997
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -6000,8 +6004,8 @@ function seedDefault(registry) {
6000
6004
  price: "250.00",
6001
6005
  description: "Made-to-order three-tier cake. Choose size, flavour, and frosting. 48-hour notice required for personalisation.",
6002
6006
  category: "cakes",
6003
- imageUrl: img("1535254973040-607b474cb50d"),
6004
- images: [img("1535254973040-607b474cb50d"), img("1565958011703-44f9829ba187")],
6007
+ imageUrl: img("birthday-cake"),
6008
+ images: [img("birthday-cake"), img("chocolate-cake")],
6005
6009
  tags: ["cake", "made-to-order", "premium"],
6006
6010
  ingredients: ["Sponge cake", "Buttercream", "Custom decoration"],
6007
6011
  allergies: ["wheat", "gluten", "dairy", "eggs"],
@@ -6015,7 +6019,7 @@ function seedDefault(registry) {
6015
6019
  price: "10.00",
6016
6020
  description: "Locally roasted Arabica from Volta Region. Notes of cocoa, dark fruit, and brown sugar.",
6017
6021
  category: "drinks",
6018
- imageUrl: img("1495474472287-4d71bcdd2085"),
6022
+ imageUrl: img("coffee"),
6019
6023
  tags: ["drink", "coffee", "vegan"],
6020
6024
  ingredients: ["Single-origin Arabica beans"],
6021
6025
  pairings: ["Croissant", "Brownie"],
@@ -6028,7 +6032,7 @@ function seedDefault(registry) {
6028
6032
  price: "8.00",
6029
6033
  description: "Choice of English breakfast, Earl Grey, green sencha, or chamomile.",
6030
6034
  category: "drinks",
6031
- imageUrl: img("1576092768241-dec231879fc3"),
6035
+ imageUrl: img("tea"),
6032
6036
  tags: ["drink", "tea", "vegan"],
6033
6037
  calories: 0
6034
6038
  },
@@ -6039,7 +6043,7 @@ function seedDefault(registry) {
6039
6043
  price: "12.00",
6040
6044
  description: "Iced hibiscus tea with ginger, pineapple peel, and a hint of clove. Tart, refreshing, lightly sweet.",
6041
6045
  category: "drinks",
6042
- imageUrl: img("1556679343-c7306c1976bc"),
6046
+ imageUrl: img("sobolo"),
6043
6047
  tags: ["drink", "vegan", "ghana"],
6044
6048
  isSignature: true,
6045
6049
  ingredients: ["Hibiscus", "Ginger", "Pineapple", "Clove"],
@@ -6052,7 +6056,7 @@ function seedDefault(registry) {
6052
6056
  price: "15.00",
6053
6057
  description: "Hand-pressed at sunrise from Ghanaian Valencia oranges. No sugar, no concentrate.",
6054
6058
  category: "drinks",
6055
- imageUrl: img("1622597467836-f3285f2131b8"),
6059
+ imageUrl: img("orange-juice"),
6056
6060
  tags: ["drink", "vegan"],
6057
6061
  calories: 110
6058
6062
  },
@@ -6064,8 +6068,8 @@ function seedDefault(registry) {
6064
6068
  price: "30.00",
6065
6069
  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.",
6066
6070
  category: "boxes",
6067
- imageUrl: img("1533089860892-a7c6f0a88666"),
6068
- images: [img("1533089860892-a7c6f0a88666"), img("1495474472287-4d71bcdd2085")],
6071
+ imageUrl: img("breakfast-box"),
6072
+ images: [img("breakfast-box"), img("coffee")],
6069
6073
  tags: ["bundle", "breakfast"],
6070
6074
  productType: "bundle"
6071
6075
  },
@@ -6076,7 +6080,7 @@ function seedDefault(registry) {
6076
6080
  price: "60.00",
6077
6081
  description: "Pick 6 to 12 of our pastries \u2014 mix and match. Freshly boxed for sharing.",
6078
6082
  category: "boxes",
6079
- imageUrl: img("1486427944299-d1955d23e34d"),
6083
+ imageUrl: img("pastry-box"),
6080
6084
  tags: ["composite", "build-your-own", "gift"],
6081
6085
  productType: "composite"
6082
6086
  },
@@ -6088,7 +6092,7 @@ function seedDefault(registry) {
6088
6092
  price: "85.00",
6089
6093
  description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
6090
6094
  category: "merch",
6091
- imageUrl: img("1556905055-8f358a7a47b2"),
6095
+ imageUrl: img("apron"),
6092
6096
  tags: ["merch", "physical"],
6093
6097
  renderHint: "physical"
6094
6098
  },
@@ -6099,7 +6103,7 @@ function seedDefault(registry) {
6099
6103
  price: "35.00",
6100
6104
  description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
6101
6105
  category: "merch",
6102
- imageUrl: img("1591561954557-26941169b49e"),
6106
+ imageUrl: img("tote-bag"),
6103
6107
  tags: ["merch", "physical", "gift"],
6104
6108
  renderHint: "physical",
6105
6109
  isNew: true
@@ -6112,7 +6116,7 @@ function seedDefault(registry) {
6112
6116
  price: "320.00",
6113
6117
  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.",
6114
6118
  category: "merch",
6115
- imageUrl: img("1568254183919-78a4f43a2877"),
6119
+ imageUrl: img("flour-25kg"),
6116
6120
  tags: ["wholesale", "physical", "trade"],
6117
6121
  renderHint: "physical",
6118
6122
  quantityPricing: [
@@ -6130,7 +6134,7 @@ function seedDefault(registry) {
6130
6134
  price: "45.00",
6131
6135
  description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
6132
6136
  category: "merch",
6133
- imageUrl: img("1543002588-bfa74002ed7e"),
6137
+ imageUrl: img("sourdough-ebook"),
6134
6138
  tags: ["digital", "download"],
6135
6139
  productType: "digital",
6136
6140
  digitalProductType: "download"
@@ -6142,7 +6146,7 @@ function seedDefault(registry) {
6142
6146
  price: "100.00",
6143
6147
  description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
6144
6148
  category: "merch",
6145
- imageUrl: img("1556905055-8f358a7a47b2"),
6149
+ imageUrl: img("gift-card"),
6146
6150
  tags: ["digital", "gift"],
6147
6151
  productType: "digital",
6148
6152
  digitalProductType: "gift_code",
@@ -6156,7 +6160,7 @@ function seedDefault(registry) {
6156
6160
  price: "320.00",
6157
6161
  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.",
6158
6162
  category: "classes",
6159
- imageUrl: img("1517686469429-8bdb88b9f907"),
6163
+ imageUrl: img("baking-class"),
6160
6164
  tags: ["class", "service", "hands-on"],
6161
6165
  productType: "service",
6162
6166
  durationMinutes: 120
@@ -6168,7 +6172,7 @@ function seedDefault(registry) {
6168
6172
  price: "480.00",
6169
6173
  description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
6170
6174
  category: "classes",
6171
- imageUrl: img("1517433367423-c7e5b0f35086"),
6175
+ imageUrl: img("pastry-workshop"),
6172
6176
  tags: ["class", "service", "advanced"],
6173
6177
  productType: "service",
6174
6178
  durationMinutes: 180,
@@ -6182,7 +6186,7 @@ function seedDefault(registry) {
6182
6186
  price: "180.00",
6183
6187
  description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
6184
6188
  category: "classes",
6185
- imageUrl: img("1606755962773-d324e0a13086"),
6189
+ imageUrl: img("kitchen-rental"),
6186
6190
  tags: ["rental", "service", "commercial"],
6187
6191
  productType: "service",
6188
6192
  durationUnit: "hours"
@@ -6195,7 +6199,7 @@ function seedDefault(registry) {
6195
6199
  price: "650.00",
6196
6200
  description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
6197
6201
  category: "classes",
6198
- imageUrl: img("1564013799919-ab600027ffc6"),
6202
+ imageUrl: img("loft-stay"),
6199
6203
  tags: ["stay", "service", "premium"],
6200
6204
  productType: "service",
6201
6205
  durationUnit: "nights"
@@ -6208,7 +6212,7 @@ function seedDefault(registry) {
6208
6212
  price: "0.00",
6209
6213
  description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
6210
6214
  category: "classes",
6211
- imageUrl: img("1509440159596-0249088772ff"),
6215
+ imageUrl: img("loaf-subscription"),
6212
6216
  tags: ["subscription", "service", "delivery"],
6213
6217
  productType: "service",
6214
6218
  billingPlans: [
@@ -7036,31 +7040,7 @@ function seedReesa(registry) {
7036
7040
 
7037
7041
  // src/mock/seeds/restaurant.ts
7038
7042
  var ISO4 = "2026-01-01T00:00:00.000Z";
7039
- var PHOTO = {
7040
- "business-hero": "1414235077428-338989a2e8c0",
7041
- kelewele: "1599487488170-d11ec9c172f0",
7042
- "spring-rolls": "1559339352-11d035aa65de",
7043
- "soup-of-the-day": "1547592180-85f173990554",
7044
- "jollof-rice": "1546069901-d5bfd2cbfb1f",
7045
- "banku-tilapia": "1485921325833-c519f76c4927",
7046
- "fufu-light-soup": "1602253057119-44d745d9b860",
7047
- waakye: "1565299624946-b28f40a0ae38",
7048
- "grilled-chicken": "1598103442097-8b74394b95c6",
7049
- burger: "1568901346375-23c9450c58cd",
7050
- "yam-fries": "1576107232684-1279f390859f",
7051
- "fried-plantain": "1493770348161-369560ae357d",
7052
- salad: "1512621776951-a57141f2eefd",
7053
- "ice-cream": "1488900128323-21503983a07e",
7054
- "cake-slice": "1565958011703-44f9829ba187",
7055
- "fruit-bowl": "1490474418585-ba9bad8fd0ea",
7056
- "soft-drink": "1581636625402-29b2a704ef13",
7057
- sobolo: "1556679343-c7306c1976bc",
7058
- "fresh-juice": "1610970881699-44a5587cabec",
7059
- water: "1564325724739-bae0bd08762c",
7060
- feast: "1559847844-5315695dadae",
7061
- byo: "1551782450-a2132b4ba21d"
7062
- };
7063
- var photoFor = (slug) => seedImage("restaurant", PHOTO[slug] ?? "1414235077428-338989a2e8c0");
7043
+ var photoFor = (slug) => seedImage("restaurant", slug);
7064
7044
  function seedRestaurant(registry) {
7065
7045
  const businessId = "bus_mamas_kitchen";
7066
7046
  const business = {
@@ -7520,29 +7500,7 @@ function seedRestaurant(registry) {
7520
7500
 
7521
7501
  // src/mock/seeds/retail.ts
7522
7502
  var ISO5 = "2026-01-01T00:00:00.000Z";
7523
- var PHOTO2 = {
7524
- "android-flagship": "1592750475338-74b7b21085ab",
7525
- "android-mid": "1511707171634-5f897ff02aa9",
7526
- "phone-budget": "1574944985070-8f3ebc6b79d2",
7527
- "laptop-pro": "1517336714731-489689fd1ca8",
7528
- "laptop-air": "1496181133206-80ce9b88a853",
7529
- "laptop-budget": "1601784551446-20c9e07cdbdb",
7530
- "headphones-anc": "1505740420928-5e560c06d30e",
7531
- "earbuds-pro": "1572569511254-d8f925fe2cbb",
7532
- "speaker-bt": "1612287230202-1ff1d85d1bdf",
7533
- "phone-case": "1611532736597-de2d4265fba3",
7534
- "screen-protector": "1568952433726-3896e3881c65",
7535
- "fast-charger": "1620794108219-aedbaded4eea",
7536
- "laptop-sleeve": "1604671801908-6f0c6a092c05",
7537
- "wireless-mouse": "1594732832278-abd644401426",
7538
- "mech-keyboard": "1583394838336-acd977736f90",
7539
- "gaming-controller": "1542751371-adc38448a05e",
7540
- "gaming-headset": "1606220945770-b5b6c2c55bf1",
7541
- "console-handheld": "1593642634524-b40b5baae6bb",
7542
- wfh: "1605236453806-6ff36851218e",
7543
- "game-pack": "1606144042614-b2417e99c4e3"
7544
- };
7545
- var photoFor2 = (slug) => seedImage("retail", PHOTO2[slug] ?? "1517336714731-489689fd1ca8");
7503
+ var photoFor2 = (slug) => seedImage("retail", slug);
7546
7504
  function seedRetail(registry) {
7547
7505
  const businessId = "bus_currents_electronics";
7548
7506
  const business = {
@@ -8015,29 +7973,7 @@ function seedRetail(registry) {
8015
7973
 
8016
7974
  // src/mock/seeds/services.ts
8017
7975
  var ISO6 = "2026-01-01T00:00:00.000Z";
8018
- var PHOTO3 = {
8019
- "business-hero": "1540555700478-4be289fbecef",
8020
- "swedish-massage-60": "1544161515-4ab6ce6db874",
8021
- "swedish-massage-90": "1519823551278-64ac92734fb1",
8022
- "deep-tissue-60": "1571019613454-1cb2f99b2d8b",
8023
- "couples-massage": "1591343395082-e120087004b4",
8024
- "hot-stone-90": "1620733723572-11c53f73a416",
8025
- "facial-classic": "1487412947147-5cebf100ffc2",
8026
- "facial-anti-aging": "1487412947147-5cebf100ffc2",
8027
- "facial-acne": "1556228720-195a672e8a03",
8028
- manicure: "1604654894610-df63bc536371",
8029
- pedicure: "1519415943484-9fa1873496d4",
8030
- "gel-manicure": "1607779097040-26e80aa78e66",
8031
- haircut: "1622286342621-4bd786c2447c",
8032
- "hair-treatment": "1633681926022-84c23e8cb2d6",
8033
- color: "1560066984-138dadb4c035",
8034
- "yoga-session": "1545205597-3d9d02c29597",
8035
- meditation: "1506126613408-eca07ce68773",
8036
- "spa-day": "1571019613454-1cb2f99b2d8b",
8037
- couples: "1591343395082-e120087004b4",
8038
- custom: "1540555700478-4be289fbecef"
8039
- };
8040
- var photoFor3 = (slug) => seedImage("services", PHOTO3[slug] ?? "1540555700478-4be289fbecef");
7976
+ var photoFor3 = (slug) => seedImage("services", slug);
8041
7977
  function seedServices(registry) {
8042
7978
  const businessId = "bus_serene_spa";
8043
7979
  const business = {
@@ -8417,35 +8353,7 @@ function seedServices(registry) {
8417
8353
 
8418
8354
  // src/mock/seeds/grocery.ts
8419
8355
  var ISO7 = "2026-01-01T00:00:00.000Z";
8420
- var PHOTO4 = {
8421
- "business-hero": "1542838132-92c53300491e",
8422
- "tomatoes-1kg": "1592924357228-91a4daadcfea",
8423
- "onions-1kg": "1620574387735-3624d75b2dbc",
8424
- "ginger-200g": "1594631252845-29fc4cc8cde9",
8425
- "bananas-bunch": "1571771019784-3ff35f4f4277",
8426
- pineapple: "1550258987-190a2d41a8ba",
8427
- "spinach-bunch": "1576045057995-568f588f82fb",
8428
- "milk-1l": "1563636619-e9143da7973b",
8429
- "yogurt-500g": "1488477181946-6428a0291777",
8430
- "eggs-12": "1582722872445-44dc5f7e3c8f",
8431
- "cheese-200g": "1486297678162-eb2a19b0a32d",
8432
- "chicken-1kg": "1604503468506-a8da13d82791",
8433
- "beef-mince-500g": "1607623814075-e51df1bdc82f",
8434
- "tilapia-each": "1535473895227-bdecb20fb157",
8435
- "rice-5kg": "1586201375761-83865001e31c",
8436
- "garri-2kg": "1582284540020-8acbe03f4924",
8437
- "palm-oil-1l": "1611078489935-0cb964de46d6",
8438
- "vegetable-oil-1l": "1474979266404-7eaacbcd87c5",
8439
- "salt-1kg": "1607301406259-dfb186e15de8",
8440
- "sugar-1kg": "1610725664285-7c57e6eeac3f",
8441
- "tomato-paste": "1561136594-7f68413baa99",
8442
- "soap-bar": "1600857062241-98e5dba7f214",
8443
- "detergent-1kg": "1582735689369-4fe89db7114c",
8444
- "tissue-pack": "1583947215259-38e31be8751f",
8445
- "trash-bags": "1605600659908-0ef719419d41",
8446
- essentials: "1542838132-92c53300491e"
8447
- };
8448
- var photoFor4 = (slug) => seedImage("grocery", PHOTO4[slug] ?? "1542838132-92c53300491e");
8356
+ var photoFor4 = (slug) => seedImage("grocery", slug);
8449
8357
  function seedGrocery(registry) {
8450
8358
  const businessId = "bus_freshmart";
8451
8359
  const business = {
@@ -8708,23 +8616,7 @@ function seedGrocery(registry) {
8708
8616
 
8709
8617
  // src/mock/seeds/fashion.ts
8710
8618
  var ISO8 = "2026-01-01T00:00:00.000Z";
8711
- var PHOTO5 = {
8712
- "heavyweight-hoodie-charcoal": "1556905055-8f358a7a47b2",
8713
- "heavyweight-hoodie-cream": "1576566588028-4147f3842f27",
8714
- "heavyweight-hoodie-cobalt": "1542838686-37da4a9fd1b3",
8715
- "studio-tee-black": "1521572163474-6864f9cf17ab",
8716
- "studio-tee-natural": "1485518882345-15568b007407",
8717
- "graphic-tee-frx-mark": "1521223890158-f9f7c3d5d504",
8718
- "carbon-bomber": "1591047139829-d91aecb6caea",
8719
- "field-jacket-olive": "1564859228273-274232fdb516",
8720
- "wide-leg-trouser": "1542272604-787c3835535d",
8721
- "track-pant-charcoal": "1604176354204-9268737828e4",
8722
- "studio-cap": "1620799140408-edc6dcb6d633",
8723
- "tote-natural": "1591195853828-11db59a44f6b",
8724
- "knit-beanie": "1542838132-92c53300491e",
8725
- "studio-sock-3pack": "1602810318383-e386cc2a3ccf"
8726
- };
8727
- var photoFor5 = (slug) => seedImage("fashion", PHOTO5[slug] ?? "1556905055-8f358a7a47b2");
8619
+ var photoFor5 = (slug) => seedImage("fashion", slug);
8728
8620
  var SIZES = ["XS", "S", "M", "L", "XL", "2XL"];
8729
8621
  function seedFashion(registry) {
8730
8622
  const businessId = "bus_studio_frx";
@@ -8739,7 +8631,7 @@ function seedFashion(registry) {
8739
8631
  default_address: "Osu Oxford Street, Accra",
8740
8632
  default_offers_table_service: false,
8741
8633
  default_accepts_online_orders: true,
8742
- image: seedImage("fashion", "1490481651871-ab68de25d43d"),
8634
+ image: seedImage("fashion", "business-hero"),
8743
8635
  status: "active",
8744
8636
  created_at: ISO8,
8745
8637
  updated_at: ISO8,
@@ -9141,6 +9033,553 @@ function seedFashion(registry) {
9141
9033
  return { businessId };
9142
9034
  }
9143
9035
 
9036
+ // src/mock/seeds/pharmacy.ts
9037
+ var ISO9 = "2026-01-01T00:00:00.000Z";
9038
+ var photoFor6 = (slug) => seedImage("pharmacy", slug);
9039
+ function seedPharmacy(registry) {
9040
+ const businessId = "bus_wellspring_pharmacy";
9041
+ const business = {
9042
+ id: businessId,
9043
+ name: "Wellspring Pharmacy",
9044
+ handle: "wellspring",
9045
+ business_type: "retail",
9046
+ email: "care@wellspringpharmacy.test",
9047
+ default_currency: "GHS",
9048
+ default_phone: "+233244778899",
9049
+ default_address: "5 Liberation Road, Ridge, Accra",
9050
+ default_offers_table_service: false,
9051
+ default_accepts_online_orders: true,
9052
+ image: photoFor6("business-hero"),
9053
+ status: "active",
9054
+ created_at: ISO9,
9055
+ updated_at: ISO9,
9056
+ created_by: "seed",
9057
+ preferences: {
9058
+ theme: "clinical",
9059
+ tagline: "Trusted care, delivered same-day",
9060
+ checkout: { allow_guest: true }
9061
+ },
9062
+ is_online_only: false,
9063
+ enabled_payment_types: ["card", "mobile_money", "cash"],
9064
+ default_location_settings: {},
9065
+ country_code: "GH",
9066
+ timezone: "Africa/Accra"
9067
+ };
9068
+ registry.businesses.put(businessId, business);
9069
+ const categories = [
9070
+ { slug: "pain-relief", name: "Pain Relief" },
9071
+ { slug: "cold-flu", name: "Cold & Flu" },
9072
+ { slug: "vitamins", name: "Vitamins & Supplements" },
9073
+ { slug: "first-aid", name: "First Aid" },
9074
+ { slug: "personal-care", name: "Personal Care" },
9075
+ { slug: "devices", name: "Medical Devices" },
9076
+ { slug: "baby", name: "Baby & Mother" }
9077
+ ];
9078
+ const catIds = /* @__PURE__ */ new Map();
9079
+ for (const c of categories) {
9080
+ const id = `cat_${c.slug}`;
9081
+ catIds.set(c.slug, id);
9082
+ const cat = {
9083
+ id,
9084
+ business_id: businessId,
9085
+ name: c.name,
9086
+ slug: c.slug,
9087
+ description: `Wellspring \u2014 ${c.name}`,
9088
+ product_ids: [],
9089
+ display_order: 0,
9090
+ is_active: true,
9091
+ created_at: ISO9,
9092
+ updated_at: ISO9
9093
+ };
9094
+ registry.categories.put(id, cat);
9095
+ }
9096
+ function field(productSlug, f) {
9097
+ return {
9098
+ id: f.id ?? `fld_${productSlug}_${f.slug}`,
9099
+ product_id: `prod_${productSlug}`,
9100
+ ...f
9101
+ };
9102
+ }
9103
+ const products = [
9104
+ // Pain Relief
9105
+ {
9106
+ slug: "paracetamol",
9107
+ name: "Paracetamol 500mg (24 tablets)",
9108
+ price: "12.00",
9109
+ category: "pain-relief",
9110
+ description: "Fever and mild-to-moderate pain. Adults and children over 12.",
9111
+ tags: ["otc", "analgesic"],
9112
+ inputs: [
9113
+ field("paracetamol", {
9114
+ slug: "age_confirmation",
9115
+ name: "Age confirmation",
9116
+ field_type: "checkbox",
9117
+ is_required: true,
9118
+ display_order: 0,
9119
+ help_text: "I confirm this product is for someone aged 12 or over."
9120
+ })
9121
+ ]
9122
+ },
9123
+ { 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"] },
9124
+ { 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"] },
9125
+ { slug: "allergy-relief", name: "Cetirizine 10mg (10 tablets)", price: "22.00", category: "pain-relief", description: "Non-drowsy antihistamine for seasonal allergies.", tags: ["otc", "antihistamine"] },
9126
+ // Cold & Flu
9127
+ { 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"] },
9128
+ { slug: "throat-lozenges", name: "Honey-Lemon Throat Lozenges (24)", price: "18.00", category: "cold-flu", description: "Soothes sore throat and irritation.", tags: ["otc", "lozenge"] },
9129
+ { slug: "decongestant", name: "Nasal Decongestant Spray (10ml)", price: "28.00", category: "cold-flu", description: "Fast-acting relief for blocked nasal passages.", tags: ["otc", "spray"] },
9130
+ // Vitamins & Supplements
9131
+ { 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"] },
9132
+ { slug: "vitamin-c", name: "Vitamin C 1000mg (90 tablets)", price: "65.00", category: "vitamins", description: "Immune-support antioxidant. Time-released.", tags: ["supplement", "immune"] },
9133
+ { 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"] },
9134
+ { 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"] },
9135
+ { slug: "probiotics", name: "Probiotic 10-Strain (30 capsules)", price: "95.00", category: "vitamins", description: "Digestive and immune support.", tags: ["supplement", "digestive"] },
9136
+ // First Aid
9137
+ { 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"] },
9138
+ { slug: "plasters", name: "Assorted Plasters (40 pack)", price: "22.00", category: "first-aid", description: "Waterproof adhesive bandages in five sizes.", tags: ["first-aid"] },
9139
+ { slug: "antiseptic", name: "Antiseptic Cream (30g)", price: "18.00", category: "first-aid", description: "For cuts, grazes, and minor skin infections.", tags: ["first-aid", "cream"] },
9140
+ { 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"] },
9141
+ // Personal Care
9142
+ { 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"] },
9143
+ { slug: "face-mask", name: "Surgical Face Masks (50 pack)", price: "45.00", category: "personal-care", description: "3-ply earloop masks. Disposable.", tags: ["hygiene", "ppe"] },
9144
+ { 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"] },
9145
+ // Medical Devices
9146
+ { slug: "thermometer", name: "Digital Thermometer", price: "65.00", category: "devices", description: "Fast oral / underarm reading in 10 seconds. Auto-shutoff.", tags: ["device", "essential"] },
9147
+ {
9148
+ slug: "blood-pressure-monitor",
9149
+ name: "Automatic BP Monitor",
9150
+ price: "320.00",
9151
+ category: "devices",
9152
+ description: "Upper-arm cuff with memory for two users. Irregular heartbeat detection.",
9153
+ tags: ["device", "premium"],
9154
+ inputs: [
9155
+ field("blood-pressure-monitor", {
9156
+ slug: "arm_size",
9157
+ name: "Arm circumference",
9158
+ field_type: "select",
9159
+ options: ["Standard (22\u201332 cm)", "Large (32\u201342 cm)"],
9160
+ is_required: true,
9161
+ display_order: 0,
9162
+ help_text: "Pick the cuff that fits \u2014 wrong size gives inaccurate readings."
9163
+ })
9164
+ ]
9165
+ },
9166
+ { 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"] },
9167
+ { slug: "pulse-oximeter", name: "Fingertip Pulse Oximeter", price: "145.00", category: "devices", description: "SpO2 + heart-rate reading in under 10 seconds.", tags: ["device"] },
9168
+ // Baby & Mother
9169
+ {
9170
+ slug: "baby-formula",
9171
+ name: "Infant Formula Stage 1 (400g)",
9172
+ price: "150.00",
9173
+ category: "baby",
9174
+ description: "0\u20136 months. Iron-fortified, with prebiotics.",
9175
+ tags: ["baby", "nutrition"],
9176
+ inputs: [
9177
+ field("baby-formula", {
9178
+ slug: "baby_dob",
9179
+ name: "Baby's date of birth",
9180
+ field_type: "date",
9181
+ is_required: true,
9182
+ display_order: 0,
9183
+ help_text: "Confirms stage 1 is the right formula for your baby's age."
9184
+ }),
9185
+ field("baby-formula", {
9186
+ slug: "allergies",
9187
+ name: "Known allergies or intolerances",
9188
+ field_type: "textarea",
9189
+ is_required: false,
9190
+ display_order: 1,
9191
+ placeholder: "e.g. lactose, soy. Leave blank if none.",
9192
+ semantic_kind: "allergen"
9193
+ })
9194
+ ]
9195
+ },
9196
+ { slug: "baby-wipes", name: "Sensitive Baby Wipes (72 pack)", price: "28.00", category: "baby", description: "Alcohol-free, fragrance-free. Dermatologist-tested.", tags: ["baby", "hygiene"] },
9197
+ // ── Prescription medications (Rx; require a verified prescription) ─
9198
+ {
9199
+ slug: "amoxicillin-rx",
9200
+ name: "Amoxicillin 500mg (Rx)",
9201
+ price: "65.00",
9202
+ category: "pain-relief",
9203
+ description: "Broad-spectrum antibiotic. Prescription required \u2014 our pharmacist will verify before dispensing.",
9204
+ tags: ["prescription", "antibiotic"],
9205
+ requiresPrescription: true,
9206
+ inputs: [
9207
+ field("amoxicillin-rx", {
9208
+ slug: "prescription_upload",
9209
+ name: "Upload prescription",
9210
+ field_type: "file",
9211
+ is_required: true,
9212
+ display_order: 0,
9213
+ help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
9214
+ validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
9215
+ }),
9216
+ field("amoxicillin-rx", {
9217
+ slug: "patient_dob",
9218
+ name: "Patient date of birth",
9219
+ field_type: "date",
9220
+ is_required: true,
9221
+ display_order: 1
9222
+ }),
9223
+ field("amoxicillin-rx", {
9224
+ slug: "consent",
9225
+ name: "I confirm this prescription is genuine and issued for the named patient",
9226
+ field_type: "checkbox",
9227
+ is_required: true,
9228
+ display_order: 2,
9229
+ semantic_kind: "consent"
9230
+ })
9231
+ ]
9232
+ },
9233
+ {
9234
+ slug: "insulin-rx",
9235
+ name: "Insulin Glargine 100u/ml (Rx)",
9236
+ price: "240.00",
9237
+ category: "devices",
9238
+ description: "Long-acting basal insulin. Cold-chain delivery; prescription required.",
9239
+ tags: ["prescription", "diabetes", "cold-chain"],
9240
+ requiresPrescription: true,
9241
+ inputs: [
9242
+ field("insulin-rx", {
9243
+ slug: "prescription_upload",
9244
+ name: "Upload prescription",
9245
+ field_type: "file",
9246
+ is_required: true,
9247
+ display_order: 0,
9248
+ help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
9249
+ validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
9250
+ }),
9251
+ field("insulin-rx", {
9252
+ slug: "delivery_temp_acknowledgement",
9253
+ name: "I'll be available to receive a cold-chain delivery",
9254
+ field_type: "checkbox",
9255
+ is_required: true,
9256
+ display_order: 1,
9257
+ help_text: "Insulin must be refrigerated. Delivery driver will hand over directly \u2014 not leave at door.",
9258
+ semantic_kind: "consent"
9259
+ })
9260
+ ]
9261
+ },
9262
+ {
9263
+ slug: "vaccination-consent",
9264
+ name: "Flu Shot \u2014 At-Pharmacy",
9265
+ price: "80.00",
9266
+ category: "personal-care",
9267
+ description: "Pharmacist-administered seasonal influenza vaccine. Walk-in or book a slot.",
9268
+ tags: ["service", "vaccination"],
9269
+ inputs: [
9270
+ field("vaccination-consent", {
9271
+ slug: "patient_name",
9272
+ name: "Patient name",
9273
+ field_type: "text",
9274
+ is_required: true,
9275
+ display_order: 0
9276
+ }),
9277
+ field("vaccination-consent", {
9278
+ slug: "patient_dob",
9279
+ name: "Date of birth",
9280
+ field_type: "date",
9281
+ is_required: true,
9282
+ display_order: 1
9283
+ }),
9284
+ field("vaccination-consent", {
9285
+ slug: "allergies",
9286
+ name: "Known allergies or reactions to past vaccines",
9287
+ field_type: "textarea",
9288
+ is_required: false,
9289
+ display_order: 2,
9290
+ placeholder: "Egg, latex, prior vaccine reactions, etc. Leave blank if none.",
9291
+ semantic_kind: "allergen"
9292
+ }),
9293
+ field("vaccination-consent", {
9294
+ slug: "consent_signature",
9295
+ name: "Signed consent",
9296
+ field_type: "signature",
9297
+ is_required: true,
9298
+ display_order: 3,
9299
+ help_text: "Required by our administering pharmacist before vaccination.",
9300
+ semantic_kind: "consent"
9301
+ })
9302
+ ]
9303
+ }
9304
+ ];
9305
+ for (const p of products) {
9306
+ const id = `prod_${p.slug}`;
9307
+ const catId = catIds.get(p.category);
9308
+ const product = {
9309
+ id,
9310
+ business_id: businessId,
9311
+ name: p.name,
9312
+ slug: p.slug,
9313
+ description: p.description,
9314
+ product_type: "product",
9315
+ base_price: p.price,
9316
+ currency: "GHS",
9317
+ image: photoFor6(p.slug),
9318
+ images: [photoFor6(p.slug)],
9319
+ is_available: true,
9320
+ category_ids: [catId],
9321
+ collection_ids: [],
9322
+ add_on_ids: [],
9323
+ variant_ids: [],
9324
+ tags: p.tags ?? [],
9325
+ input_fields: p.inputs,
9326
+ metadata: p.requiresPrescription ? { requires_prescription: true } : void 0,
9327
+ created_at: ISO9,
9328
+ updated_at: ISO9
9329
+ };
9330
+ registry.products.put(id, product);
9331
+ const cat = registry.categories.get(catId);
9332
+ cat.product_ids.push(id);
9333
+ registry.categories.put(catId, cat);
9334
+ }
9335
+ const essentials = {
9336
+ id: "col_essentials",
9337
+ business_id: businessId,
9338
+ name: "Home Essentials",
9339
+ slug: "essentials",
9340
+ description: "Stock up your medicine cabinet.",
9341
+ product_ids: [
9342
+ "prod_paracetamol",
9343
+ "prod_first-aid-kit",
9344
+ "prod_thermometer",
9345
+ "prod_hand-sanitizer",
9346
+ "prod_multivitamin"
9347
+ ],
9348
+ is_active: true,
9349
+ created_at: ISO9,
9350
+ updated_at: ISO9
9351
+ };
9352
+ registry.collections.put(essentials.id, essentials);
9353
+ for (const pid of essentials.product_ids) {
9354
+ const p = registry.products.get(pid);
9355
+ if (p) {
9356
+ p.collection_ids.push(essentials.id);
9357
+ registry.products.put(pid, p);
9358
+ }
9359
+ }
9360
+ const packAxis = {
9361
+ id: "axis_pack_size",
9362
+ business_id: businessId,
9363
+ product_id: "prod_paracetamol",
9364
+ name: "Pack size",
9365
+ display_order: 0,
9366
+ affects_recipe: false,
9367
+ values: [
9368
+ { id: "axv_pack_24", name: "24 tablets", display: 0 },
9369
+ { id: "axv_pack_48", name: "48 tablets", display: 1 },
9370
+ { id: "axv_pack_100", name: "100 tablets (family)", display: 2 }
9371
+ ].map((v) => ({
9372
+ id: v.id,
9373
+ business_id: businessId,
9374
+ axis_id: "axis_pack_size",
9375
+ name: v.name,
9376
+ display_order: v.display,
9377
+ created_at: ISO9,
9378
+ updated_at: ISO9
9379
+ })),
9380
+ created_at: ISO9,
9381
+ updated_at: ISO9
9382
+ };
9383
+ registry.variantAxes.put(packAxis.id, packAxis);
9384
+ const packAdj = { pack_24: "0.00", pack_48: "8.00", pack_100: "18.00" };
9385
+ const paracetamolVariantIds = [];
9386
+ let firstVariant = true;
9387
+ for (const pk of packAxis.values) {
9388
+ const key = pk.id.replace("axv_pack_", "pack_");
9389
+ const id = `var_paracetamol_${key.replace("pack_", "")}`;
9390
+ const variant = {
9391
+ id,
9392
+ product_id: "prod_paracetamol",
9393
+ business_id: businessId,
9394
+ name: pk.name,
9395
+ sku: `PCM-${key.toUpperCase()}`,
9396
+ price_adjustment: packAdj[key] ?? "0.00",
9397
+ component_multiplier: "1.00",
9398
+ is_default: firstVariant,
9399
+ is_active: true,
9400
+ axis_value_ids: [pk.id],
9401
+ created_at: ISO9,
9402
+ updated_at: ISO9
9403
+ };
9404
+ registry.variants.put(id, variant);
9405
+ paracetamolVariantIds.push(id);
9406
+ firstVariant = false;
9407
+ }
9408
+ const paracetamol = registry.products.get("prod_paracetamol");
9409
+ if (paracetamol) {
9410
+ paracetamol.variant_ids = paracetamolVariantIds;
9411
+ registry.products.put(paracetamol.id, paracetamol);
9412
+ }
9413
+ const formAddOn = {
9414
+ id: "addon_form",
9415
+ business_id: businessId,
9416
+ name: "Format",
9417
+ is_multiple_allowed: false,
9418
+ is_required: false,
9419
+ is_mutually_exclusive: true,
9420
+ min_selections: 0,
9421
+ max_selections: 1,
9422
+ created_at: ISO9,
9423
+ updated_at: ISO9,
9424
+ options: [
9425
+ { 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 },
9426
+ { 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 }
9427
+ ]
9428
+ };
9429
+ registry.addOns.put(formAddOn.id, formAddOn);
9430
+ const medProductIds = ["prod_paracetamol", "prod_ibuprofen", "prod_aspirin", "prod_allergy-relief"];
9431
+ for (const pid of medProductIds) {
9432
+ registry.productAddOns.put(`${pid}:${formAddOn.id}`, { product_id: pid, add_on_id: formAddOn.id });
9433
+ const p = registry.products.get(pid);
9434
+ if (p) {
9435
+ p.add_on_ids.push(formAddOn.id);
9436
+ registry.products.put(pid, p);
9437
+ }
9438
+ }
9439
+ const services = [
9440
+ {
9441
+ id: "svc_bp_check",
9442
+ business_id: businessId,
9443
+ name: "Blood Pressure Check",
9444
+ description: "Free in-store BP reading with our pharmacist.",
9445
+ duration_minutes: 15,
9446
+ price: "0.00",
9447
+ is_available: true
9448
+ },
9449
+ {
9450
+ id: "svc_consultation",
9451
+ business_id: businessId,
9452
+ name: "Pharmacist Consultation",
9453
+ description: "15-minute one-on-one about medications, interactions, or symptoms.",
9454
+ duration_minutes: 15,
9455
+ price: "30.00",
9456
+ is_available: true
9457
+ },
9458
+ {
9459
+ id: "svc_prescription_refill",
9460
+ business_id: businessId,
9461
+ name: "Prescription Refill",
9462
+ description: "Upload your prescription; we prepare it for pickup or delivery same-day.",
9463
+ duration_minutes: 30,
9464
+ price: "0.00",
9465
+ is_available: true
9466
+ },
9467
+ {
9468
+ id: "svc_vaccination",
9469
+ business_id: businessId,
9470
+ name: "Vaccination (Flu, Tetanus)",
9471
+ description: "Walk-in or by appointment. Pharmacist-administered.",
9472
+ duration_minutes: 20,
9473
+ price: "80.00",
9474
+ is_available: true
9475
+ }
9476
+ ];
9477
+ for (const s of services) registry.services.put(s.id, s);
9478
+ const tags = [
9479
+ { id: "tag_otc", business_id: businessId, name: "OTC", slug: "otc", color: "#16a34a", sort_order: 0, usage_count: 11, created_at: ISO9, updated_at: ISO9 },
9480
+ { id: "tag_essential", business_id: businessId, name: "Essential", slug: "essential", color: "#2563eb", sort_order: 1, usage_count: 2, created_at: ISO9, updated_at: ISO9 },
9481
+ { id: "tag_prescription", business_id: businessId, name: "Prescription", slug: "prescription", color: "#dc2626", sort_order: 2, usage_count: 0, created_at: ISO9, updated_at: ISO9 }
9482
+ ];
9483
+ for (const t of tags) registry.tags.put(t.id, t);
9484
+ const medication = {
9485
+ id: "tax_medication",
9486
+ business_id: businessId,
9487
+ name: "Medication",
9488
+ slug: "medication",
9489
+ path: ["Health", "Medication"],
9490
+ attribute_template_ids: ["attr_active_ingredient", "attr_dosage"],
9491
+ created_at: ISO9,
9492
+ updated_at: ISO9
9493
+ };
9494
+ registry.taxonomies.put(medication.id, medication);
9495
+ const attrs = [
9496
+ {
9497
+ id: "attr_active_ingredient",
9498
+ business_id: businessId,
9499
+ namespace: "core",
9500
+ name: "Active ingredient",
9501
+ slug: "active-ingredient",
9502
+ attribute_type: "text",
9503
+ is_required: false,
9504
+ is_filterable: true,
9505
+ visibility: "public",
9506
+ display_order: 0,
9507
+ applies_to: "product",
9508
+ created_at: ISO9,
9509
+ updated_at: ISO9
9510
+ },
9511
+ {
9512
+ id: "attr_dosage",
9513
+ business_id: businessId,
9514
+ namespace: "core",
9515
+ name: "Dosage form",
9516
+ slug: "dosage-form",
9517
+ attribute_type: "select",
9518
+ options: ["tablet", "capsule", "syrup", "spray", "cream", "drops"],
9519
+ is_required: false,
9520
+ is_filterable: true,
9521
+ visibility: "public",
9522
+ display_order: 1,
9523
+ applies_to: "product",
9524
+ created_at: ISO9,
9525
+ updated_at: ISO9
9526
+ },
9527
+ {
9528
+ id: "attr_prescription_required",
9529
+ business_id: businessId,
9530
+ namespace: "core",
9531
+ name: "Prescription required",
9532
+ slug: "prescription-required",
9533
+ attribute_type: "boolean",
9534
+ is_required: false,
9535
+ is_filterable: true,
9536
+ visibility: "public",
9537
+ display_order: 2,
9538
+ applies_to: "product",
9539
+ created_at: ISO9,
9540
+ updated_at: ISO9
9541
+ }
9542
+ ];
9543
+ for (const a of attrs) registry.attributeDefs.put(a.id, a);
9544
+ const articles = [
9545
+ {
9546
+ id: "kb_prescription",
9547
+ business_id: businessId,
9548
+ title: "Prescription handling",
9549
+ slug: "prescription-handling",
9550
+ content: "Upload prescriptions through the prescription-refill service. Our pharmacist verifies before dispensing; same-day pickup or delivery within Accra.",
9551
+ category: "logistics",
9552
+ tags: ["prescription", "delivery"],
9553
+ created_at: ISO9,
9554
+ updated_at: ISO9
9555
+ },
9556
+ {
9557
+ id: "kb_returns",
9558
+ business_id: businessId,
9559
+ title: "Returns & exchanges",
9560
+ slug: "returns",
9561
+ content: "Sealed OTC products may be returned within 7 days with receipt. Opened products, prescriptions, and refrigerated items are non-returnable for safety reasons.",
9562
+ category: "policies",
9563
+ tags: ["returns"],
9564
+ created_at: ISO9,
9565
+ updated_at: ISO9
9566
+ },
9567
+ {
9568
+ id: "kb_consultation",
9569
+ business_id: businessId,
9570
+ title: "Pharmacist consultations",
9571
+ slug: "consultations",
9572
+ content: "15-minute pharmacist appointments cover medication review, side-effect questions, OTC selection, and symptom triage. Book through the services menu.",
9573
+ category: "services",
9574
+ tags: ["consultation"],
9575
+ created_at: ISO9,
9576
+ updated_at: ISO9
9577
+ }
9578
+ ];
9579
+ for (const a of articles) registry.knowledgeArticles.put(a.id, a);
9580
+ return { businessId };
9581
+ }
9582
+
9144
9583
  // src/mock/seeds/registry.ts
9145
9584
  var SEEDS = {
9146
9585
  default: seedDefault,
@@ -9150,7 +9589,8 @@ var SEEDS = {
9150
9589
  retail: seedRetail,
9151
9590
  services: seedServices,
9152
9591
  grocery: seedGrocery,
9153
- fashion: seedFashion
9592
+ fashion: seedFashion,
9593
+ pharmacy: seedPharmacy
9154
9594
  };
9155
9595
  function applySeed(registry, name) {
9156
9596
  const fn = SEEDS[name];