@mohasinac/appkit 4.52.5 โ†’ 4.53.1

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 (1018) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
  3. package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
  4. package/dist/_internal/client/scaffolds/AppShell.js +1 -1
  5. package/dist/_internal/server/features/auctions/actions.js +1 -1
  6. package/dist/_internal/server/features/auctions/og.d.ts +3 -1
  7. package/dist/_internal/server/features/auctions/og.js +3 -1
  8. package/dist/_internal/server/features/bundles/actions.js +1 -1
  9. package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
  10. package/dist/_internal/server/features/business-documents/download.js +91 -0
  11. package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
  12. package/dist/_internal/server/features/categories/adapters.js +10 -0
  13. package/dist/_internal/server/features/categories/data.js +23 -7
  14. package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
  15. package/dist/_internal/server/features/checkout/actions.js +116 -15
  16. package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
  17. package/dist/_internal/server/features/checkout/data.d.ts +37 -0
  18. package/dist/_internal/server/features/checkout/data.js +20 -3
  19. package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
  20. package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
  21. package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
  22. package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
  23. package/dist/_internal/server/features/classified/metadata.js +1 -1
  24. package/dist/_internal/server/features/classified/og.d.ts +3 -1
  25. package/dist/_internal/server/features/classified/og.js +3 -1
  26. package/dist/_internal/server/features/digital-code/metadata.js +1 -1
  27. package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
  28. package/dist/_internal/server/features/digital-code/og.js +3 -1
  29. package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
  30. package/dist/_internal/server/features/digital-code/pool.js +19 -4
  31. package/dist/_internal/server/features/live/metadata.js +1 -1
  32. package/dist/_internal/server/features/live/og.d.ts +3 -1
  33. package/dist/_internal/server/features/live/og.js +3 -1
  34. package/dist/_internal/server/features/lottery/actions.js +9 -1
  35. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  36. package/dist/_internal/server/features/lottery/og.js +79 -0
  37. package/dist/_internal/server/features/messages/actions.js +5 -1
  38. package/dist/_internal/server/features/offers/adapters.js +17 -3
  39. package/dist/_internal/server/features/orders/actions.js +7 -2
  40. package/dist/_internal/server/features/parts/og.js +1 -1
  41. package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
  42. package/dist/_internal/server/features/pre-orders/og.js +3 -1
  43. package/dist/_internal/server/features/price-index/search.d.ts +18 -0
  44. package/dist/_internal/server/features/price-index/search.js +47 -7
  45. package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
  46. package/dist/_internal/server/features/prize-draws/og.js +3 -1
  47. package/dist/_internal/server/features/products/group-members.d.ts +26 -0
  48. package/dist/_internal/server/features/products/group-members.js +7 -1
  49. package/dist/_internal/server/features/products/og.d.ts +3 -1
  50. package/dist/_internal/server/features/products/og.js +3 -1
  51. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  52. package/dist/_internal/server/features/raffle/actions.js +25 -0
  53. package/dist/_internal/server/features/reviews/actions.js +1 -1
  54. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  55. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  56. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  57. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  58. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  59. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  60. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  61. package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
  62. package/dist/_internal/server/features/search/scoped-sources.js +252 -0
  63. package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
  64. package/dist/_internal/server/features/search/search-everything.js +70 -20
  65. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  66. package/dist/_internal/server/features/search/search-sources.js +142 -7
  67. package/dist/_internal/server/features/seo/robots.js +21 -1
  68. package/dist/_internal/server/features/seo/sitemap.js +7 -1
  69. package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
  70. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  71. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  72. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  73. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  74. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  75. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
  76. package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
  77. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  78. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  79. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  80. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  81. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  82. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  83. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  84. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  85. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  86. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  87. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  88. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  89. package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
  90. package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
  91. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  92. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  93. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  94. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  95. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
  96. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
  97. package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
  98. package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
  99. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  100. package/dist/_internal/server/features/stores/adapters.js +16 -0
  101. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  102. package/dist/_internal/server/features/stores/index.js +1 -0
  103. package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
  104. package/dist/_internal/server/features/stores/tabs.js +122 -0
  105. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  106. package/dist/_internal/server/functions/scheduled.js +25 -1
  107. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  108. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  109. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  110. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  111. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  112. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  113. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  114. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  115. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  116. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  117. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  118. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  119. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  120. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  121. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  122. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  123. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  124. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  125. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  126. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  127. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  128. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  129. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  130. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  131. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  132. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  133. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  134. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  135. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  136. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  137. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  138. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  139. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  140. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  141. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  142. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  143. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  144. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  145. package/dist/_internal/shared/actions/action-registry.js +29 -0
  146. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  147. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  148. package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
  149. package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
  150. package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
  151. package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
  152. package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
  153. package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
  154. package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
  155. package/dist/_internal/shared/checkout/rules/index.js +9 -0
  156. package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
  157. package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
  158. package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
  159. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
  160. package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
  161. package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
  162. package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
  163. package/dist/_internal/shared/config/schema.d.ts +122 -0
  164. package/dist/_internal/shared/features/cart/schema.js +3 -2
  165. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  166. package/dist/_internal/shared/features/events/config.js +14 -0
  167. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  168. package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
  169. package/dist/_internal/shared/features/products/group-rules.js +142 -0
  170. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  171. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  172. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  173. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  174. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  175. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  176. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  177. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  178. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  179. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  180. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  181. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  182. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  183. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  184. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  185. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  186. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  187. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  188. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  189. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  190. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  191. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  192. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  193. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  194. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  195. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  196. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  197. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  198. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  199. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  200. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  201. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  202. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  203. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  204. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  205. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  206. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  207. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  208. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  209. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  210. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  211. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  212. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  213. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  214. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  215. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  216. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  217. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  218. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  219. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  220. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  221. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  222. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  223. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  224. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  225. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  226. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  227. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  228. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  229. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  230. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  231. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  232. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  233. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  234. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  235. package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
  236. package/dist/_internal/shared/listing-types/_registry.js +39 -1
  237. package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
  238. package/dist/_internal/shared/listing-types/art/config.js +3 -0
  239. package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
  240. package/dist/_internal/shared/listing-types/auction/config.js +3 -0
  241. package/dist/_internal/shared/listing-types/availability.js +48 -0
  242. package/dist/_internal/shared/listing-types/capabilities.js +19 -0
  243. package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
  244. package/dist/_internal/shared/listing-types/classified/config.js +3 -0
  245. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
  246. package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
  247. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  248. package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
  249. package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
  250. package/dist/_internal/shared/listing-types/live/config.js +3 -0
  251. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
  252. package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
  253. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
  254. package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
  255. package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
  256. package/dist/_internal/shared/listing-types/spares/config.js +60 -0
  257. package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
  258. package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
  259. package/dist/_internal/shared/listing-types/spares/og.js +1 -0
  260. package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
  261. package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
  262. package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
  263. package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
  264. package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
  265. package/dist/_internal/shared/listing-types/standard/config.js +3 -0
  266. package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
  267. package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
  268. package/dist/_internal/shared/media/limits.d.ts +12 -2
  269. package/dist/_internal/shared/media/limits.js +12 -2
  270. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  271. package/dist/_internal/shared/search/artifact-url.js +119 -0
  272. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  273. package/dist/_internal/shared/search/index-record.js +96 -0
  274. package/dist/_internal/shared/search/match.d.ts +76 -0
  275. package/dist/_internal/shared/search/match.js +264 -0
  276. package/dist/_internal/shared/search/to-groups.d.ts +52 -0
  277. package/dist/_internal/shared/search/to-groups.js +141 -0
  278. package/dist/client.d.ts +16 -9
  279. package/dist/client.js +16 -6
  280. package/dist/configs/eslint.js +22 -2
  281. package/dist/constants/api-endpoints.d.ts +107 -15
  282. package/dist/constants/api-endpoints.js +60 -5
  283. package/dist/constants/cache-invalidation.js +3 -1
  284. package/dist/constants/field-names.d.ts +13 -1
  285. package/dist/constants/field-names.js +42 -1
  286. package/dist/contracts/repository.d.ts +8 -7
  287. package/dist/contracts/search.d.ts +2 -2
  288. package/dist/contracts/table.d.ts +3 -3
  289. package/dist/contracts/table.js +3 -3
  290. package/dist/core/contact-submissions.repository.js +2 -2
  291. package/dist/core/integration-keys.js +7 -1
  292. package/dist/core/newsletter.repository.js +2 -2
  293. package/dist/core/site-config.js +1 -1
  294. package/dist/errors/error-codes.d.ts +30 -0
  295. package/dist/errors/error-codes.js +30 -0
  296. package/dist/errors/error-display-map.js +40 -1
  297. package/dist/features/about/components/PolicyPageView.d.ts +22 -2
  298. package/dist/features/about/components/PolicyPageView.js +14 -2
  299. package/dist/features/about/components/PublicProfileView.js +2 -1
  300. package/dist/features/about/components/ShippingPolicyView.js +42 -2
  301. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  302. package/dist/features/account/components/NotificationBell.js +1 -1
  303. package/dist/features/account/components/UserBidsView.js +1 -1
  304. package/dist/features/account/components/index.d.ts +0 -8
  305. package/dist/features/account/components/index.js +0 -4
  306. package/dist/features/account/hooks/useProfileStats.js +5 -1
  307. package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
  308. package/dist/features/addresses/repository/addresses.repository.js +86 -9
  309. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  310. package/dist/features/admin/actions/admin-actions.js +16 -1
  311. package/dist/features/admin/actions/notification-actions.js +15 -6
  312. package/dist/features/admin/api/bids/route.js +1 -1
  313. package/dist/features/admin/api/coupons/route.js +1 -1
  314. package/dist/features/admin/api/products/route.js +1 -1
  315. package/dist/features/admin/api/reviews/route.js +1 -1
  316. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  317. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  318. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  319. package/dist/features/admin/components/AdminBlogView.js +1 -1
  320. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  321. package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
  322. package/dist/features/admin/components/AdminContactView.js +1 -1
  323. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  324. package/dist/features/admin/components/AdminNavigationView.js +1 -1
  325. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  326. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  327. package/dist/features/admin/components/AdminPageHeader.js +1 -1
  328. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  329. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  330. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  331. package/dist/features/admin/components/AdminProductEditorView.js +41 -39
  332. package/dist/features/admin/components/AdminProductsView.js +10 -3
  333. package/dist/features/admin/components/AdminScammersView.js +1 -1
  334. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  335. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  336. package/dist/features/admin/components/AdminSidebar.js +1 -1
  337. package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
  338. package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
  339. package/dist/features/admin/components/AdminSparesView.js +30 -0
  340. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  341. package/dist/features/admin/components/AdminTeamView.js +1 -1
  342. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  343. package/dist/features/admin/components/AdminUsersView.js +10 -8
  344. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  345. package/dist/features/admin/components/DataListingView.js +9 -4
  346. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  347. package/dist/features/admin/components/index.d.ts +2 -0
  348. package/dist/features/admin/components/index.js +1 -0
  349. package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
  350. package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
  351. package/dist/features/admin/constants/filter-tabs.js +1 -0
  352. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  353. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  354. package/dist/features/admin/schemas/firestore.d.ts +88 -3
  355. package/dist/features/admin/schemas/firestore.js +32 -0
  356. package/dist/features/admin/types/index.d.ts +1 -1
  357. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  358. package/dist/features/auctions/actions/bid-actions.js +16 -4
  359. package/dist/features/auctions/api/route.js +1 -1
  360. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  361. package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
  362. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  363. package/dist/features/auctions/repository/bid.repository.js +114 -13
  364. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  365. package/dist/features/auctions/schemas/firestore.js +1 -0
  366. package/dist/features/auth/actions/profile-actions.js +30 -4
  367. package/dist/features/auth/components/index.d.ts +0 -1
  368. package/dist/features/auth/components/index.js +0 -1
  369. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  370. package/dist/features/auth/repository/session.repository.js +46 -5
  371. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  372. package/dist/features/auth/repository/token.repository.js +65 -11
  373. package/dist/features/auth/repository/user.repository.d.ts +46 -7
  374. package/dist/features/auth/repository/user.repository.js +128 -15
  375. package/dist/features/auth/schemas/firestore.d.ts +65 -12
  376. package/dist/features/auth/schemas/firestore.js +13 -0
  377. package/dist/features/before-after/api/route.js +1 -1
  378. package/dist/features/blog/components/BlogListView.js +16 -3
  379. package/dist/features/blog/components/BlogPostView.js +1 -1
  380. package/dist/features/blog/schemas/index.d.ts +2 -2
  381. package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
  382. package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
  383. package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
  384. package/dist/features/business-documents/schemas/firestore.js +75 -0
  385. package/dist/features/cart/actions/cart-actions.js +83 -6
  386. package/dist/features/cart/api/route.js +1 -1
  387. package/dist/features/cart/repository/cart.repository.js +32 -4
  388. package/dist/features/cart/schemas/firestore.d.ts +20 -0
  389. package/dist/features/cart/schemas/index.d.ts +2 -2
  390. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
  391. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  392. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  393. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  394. package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
  395. package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
  396. package/dist/features/categories/api/route.js +10 -10
  397. package/dist/features/categories/components/BrandDetailPageView.js +19 -3
  398. package/dist/features/categories/components/BrandDetailTabs.js +10 -0
  399. package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
  400. package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
  401. package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
  402. package/dist/features/categories/components/CategoryGrid.js +10 -1
  403. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  404. package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
  405. package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
  406. package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
  407. package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
  408. package/dist/features/categories/components/index.d.ts +0 -2
  409. package/dist/features/categories/components/index.js +0 -1
  410. package/dist/features/categories/constants/category-tabs.d.ts +20 -25
  411. package/dist/features/categories/constants/category-tabs.js +22 -39
  412. package/dist/features/categories/repository/categories.repository.d.ts +13 -0
  413. package/dist/features/categories/repository/categories.repository.js +51 -1
  414. package/dist/features/categories/schemas/firestore.d.ts +22 -1
  415. package/dist/features/categories/schemas/firestore.js +10 -0
  416. package/dist/features/categories/schemas/index.d.ts +8 -2
  417. package/dist/features/categories/schemas/index.js +2 -0
  418. package/dist/features/categories/types/index.d.ts +8 -0
  419. package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
  420. package/dist/features/categories/utils/taxonomy-visual.js +74 -0
  421. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  422. package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
  423. package/dist/features/collections/api/[slug]/route.js +3 -3
  424. package/dist/features/collections/api/route.js +1 -1
  425. package/dist/features/consultation/api/route.js +1 -1
  426. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  427. package/dist/features/consultation/types/index.d.ts +1 -1
  428. package/dist/features/contact/components/ContactForm.js +1 -3
  429. package/dist/features/contact/components/ContactPageView.d.ts +33 -1
  430. package/dist/features/contact/components/ContactPageView.js +58 -28
  431. package/dist/features/corporate/api/route.js +1 -1
  432. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  433. package/dist/features/corporate/types/index.d.ts +1 -1
  434. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  435. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  436. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
  437. package/dist/features/events/actions/event-actions.d.ts +14 -0
  438. package/dist/features/events/actions/event-actions.js +82 -3
  439. package/dist/features/events/api/[id]/route.js +2 -2
  440. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  441. package/dist/features/events/components/AdminEventsView.js +32 -8
  442. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  443. package/dist/features/events/components/EventRafflesSection.js +52 -3
  444. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  445. package/dist/features/events/components/SpinWheelView.js +41 -4
  446. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  447. package/dist/features/events/repository/event-entry.repository.js +41 -7
  448. package/dist/features/events/schemas/firestore.d.ts +17 -4
  449. package/dist/features/events/types/index.d.ts +37 -0
  450. package/dist/features/faq/repository/faqs.repository.js +1 -1
  451. package/dist/features/faq/schemas/index.d.ts +5 -2
  452. package/dist/features/faq/schemas/index.js +6 -0
  453. package/dist/features/faq/types/index.d.ts +0 -1
  454. package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
  455. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  456. package/dist/features/grouped/schemas/firestore.d.ts +5 -0
  457. package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
  458. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  459. package/dist/features/homepage/api/carousel/route.js +4 -4
  460. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  461. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  462. package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
  463. package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
  464. package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
  465. package/dist/features/homepage/components/HowItWorksSection.js +4 -4
  466. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  467. package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
  468. package/dist/features/homepage/components/PromoGrid.js +12 -3
  469. package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
  470. package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
  471. package/dist/features/homepage/components/index.d.ts +0 -22
  472. package/dist/features/homepage/components/index.js +0 -12
  473. package/dist/features/homepage/index.d.ts +0 -2
  474. package/dist/features/homepage/index.js +0 -2
  475. package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
  476. package/dist/features/homepage/lib/section-renderer.js +202 -58
  477. package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
  478. package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
  479. package/dist/features/homepage/schemas/firestore.d.ts +112 -3
  480. package/dist/features/homepage/schemas/firestore.js +32 -2
  481. package/dist/features/homepage/schemas/index.d.ts +46 -17
  482. package/dist/features/homepage/schemas/index.js +39 -27
  483. package/dist/features/homepage/server.d.ts +0 -3
  484. package/dist/features/homepage/server.js +0 -3
  485. package/dist/features/homepage/types/index.d.ts +0 -47
  486. package/dist/features/homepage/types/index.js +49 -0
  487. package/dist/features/layout/AppLayoutShell.d.ts +11 -0
  488. package/dist/features/layout/AppLayoutShell.js +65 -13
  489. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  490. package/dist/features/layout/BottomActionsContext.js +5 -0
  491. package/dist/features/layout/BottomChrome.js +48 -9
  492. package/dist/features/layout/BottomNavItem.js +1 -1
  493. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  494. package/dist/features/layout/BottomNavbar.js +43 -3
  495. package/dist/features/layout/BottomSheet.js +1 -1
  496. package/dist/features/layout/MainNavbar.d.ts +11 -0
  497. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  498. package/dist/features/layout/NavbarLayout.js +88 -11
  499. package/dist/features/layout/SideActionDock.d.ts +1 -0
  500. package/dist/features/layout/SideActionDock.js +219 -0
  501. package/dist/features/layout/TitleBarLayout.js +1 -1
  502. package/dist/features/layout/cta-anchor.d.ts +31 -0
  503. package/dist/features/layout/cta-anchor.js +31 -0
  504. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  505. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  506. package/dist/features/layout/index.d.ts +9 -1
  507. package/dist/features/layout/index.js +9 -1
  508. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  509. package/dist/features/layout/useCtaReveal.js +82 -0
  510. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  511. package/dist/features/layout/useHoldToOpen.js +84 -0
  512. package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
  513. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  514. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  515. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  516. package/dist/features/loyalty/api/balance/route.js +1 -1
  517. package/dist/features/loyalty/api/history/route.js +1 -1
  518. package/dist/features/media/MediaImage.js +0 -1
  519. package/dist/features/media/MediaPickerModal.js +7 -1
  520. package/dist/features/media/hooks/useMedia.js +17 -0
  521. package/dist/features/media/modals/ImageEditor.js +5 -1
  522. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  523. package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
  524. package/dist/features/media/repository/media-assets.repository.js +31 -0
  525. package/dist/features/media/trust-signals.d.ts +85 -0
  526. package/dist/features/media/trust-signals.js +126 -0
  527. package/dist/features/media/upload/CameraCapture.js +16 -1
  528. package/dist/features/media/upload/ImageUpload.js +42 -4
  529. package/dist/features/media/upload/MediaUploadField.js +69 -13
  530. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  531. package/dist/features/media/upload/downscale-image.js +150 -0
  532. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  533. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  534. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  535. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  536. package/dist/features/orders/hooks/useOrders.js +4 -2
  537. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  538. package/dist/features/orders/repository/orders.repository.js +52 -20
  539. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  540. package/dist/features/orders/schemas/index.d.ts +8 -8
  541. package/dist/features/orders/types/index.d.ts +2 -2
  542. package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
  543. package/dist/features/parts/components/PartDetailPageView.js +2 -2
  544. package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
  545. package/dist/features/parts/components/PartsIndexPageView.js +2 -2
  546. package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
  547. package/dist/features/parts/components/PartsSearchBox.js +57 -0
  548. package/dist/features/parts/schemas/firestore.d.ts +149 -3
  549. package/dist/features/parts/schemas/firestore.js +184 -0
  550. package/dist/features/payments/repository/payments.repository.js +2 -2
  551. package/dist/features/payments/repository/payout.repository.d.ts +38 -6
  552. package/dist/features/payments/repository/payout.repository.js +84 -23
  553. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  554. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  555. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  556. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  557. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  558. package/dist/features/pre-orders/api/admin/route.js +1 -1
  559. package/dist/features/pre-orders/api/route.js +1 -1
  560. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
  561. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
  562. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  563. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  564. package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
  565. package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
  566. package/dist/features/products/api/[id]/route.js +1 -1
  567. package/dist/features/products/components/CompareOverlay.d.ts +18 -1
  568. package/dist/features/products/components/CompareOverlay.js +21 -2
  569. package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
  570. package/dist/features/products/components/CustomSectionTabContent.js +29 -3
  571. package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
  572. package/dist/features/products/components/GroupMemberPicker.js +46 -8
  573. package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
  574. package/dist/features/products/components/GroupSettingsPanel.js +91 -3
  575. package/dist/features/products/components/ListingBottomActions.js +4 -0
  576. package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
  577. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
  578. package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
  579. package/dist/features/products/components/ProductDetailPageView.js +75 -15
  580. package/dist/features/products/components/ProductForm.d.ts +13 -1
  581. package/dist/features/products/components/ProductForm.js +16 -2
  582. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  583. package/dist/features/products/components/ProductGrid.js +12 -1
  584. package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
  585. package/dist/features/products/components/ProductsIndexListing.js +3 -3
  586. package/dist/features/products/components/ShowGroupSection.js +15 -2
  587. package/dist/features/products/components/SparesListView.d.ts +7 -0
  588. package/dist/features/products/components/SparesListView.js +39 -0
  589. package/dist/features/products/components/index.d.ts +0 -2
  590. package/dist/features/products/components/index.js +0 -1
  591. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  592. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  593. package/dist/features/products/constants/action-defs.d.ts +1 -0
  594. package/dist/features/products/constants/action-defs.js +1 -0
  595. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  596. package/dist/features/products/constants/listing-tabs.js +3 -2
  597. package/dist/features/products/hooks/useProducts.js +2 -2
  598. package/dist/features/products/repository/products.repository.d.ts +98 -0
  599. package/dist/features/products/repository/products.repository.js +248 -18
  600. package/dist/features/products/schemas/firestore.d.ts +97 -4
  601. package/dist/features/products/schemas/firestore.js +104 -0
  602. package/dist/features/products/schemas/index.d.ts +12 -21
  603. package/dist/features/products/schemas/index.js +23 -6
  604. package/dist/features/products/types/index.d.ts +46 -2
  605. package/dist/features/products/utils/group-member-image.d.ts +39 -0
  606. package/dist/features/products/utils/group-member-image.js +3 -0
  607. package/dist/features/products/utils/listing-badge-variant.js +4 -0
  608. package/dist/features/promotions/api/route.js +1 -1
  609. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  610. package/dist/features/reviews/actions/review-actions.js +22 -8
  611. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  612. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  613. package/dist/features/reviews/components/ReviewsList.js +1 -1
  614. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  615. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  616. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  617. package/dist/features/reviews/schemas/index.d.ts +2 -2
  618. package/dist/features/scams/actions/scam-actions.js +16 -4
  619. package/dist/features/scams/components/ScamProfileView.js +1 -1
  620. package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
  621. package/dist/features/search/components/EntityTypeahead.js +92 -0
  622. package/dist/features/search/components/Search.d.ts +12 -1
  623. package/dist/features/search/components/Search.js +47 -3
  624. package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
  625. package/dist/features/search/components/SearchFacetRail.js +92 -0
  626. package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
  627. package/dist/features/search/components/SearchResultsClient.js +103 -0
  628. package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
  629. package/dist/features/search/components/SearchResultsPageView.js +3 -2
  630. package/dist/features/search/components/index.d.ts +0 -6
  631. package/dist/features/search/components/index.js +0 -3
  632. package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
  633. package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
  634. package/dist/features/search/hooks/useScopedSearch.js +114 -0
  635. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  636. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  637. package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
  638. package/dist/features/search/hooks/useSiteSearch.js +149 -0
  639. package/dist/features/search/index.d.ts +0 -4
  640. package/dist/features/search/index.js +0 -4
  641. package/dist/features/search/manifest.d.ts +12 -0
  642. package/dist/features/search/manifest.js +17 -2
  643. package/dist/features/search/server.d.ts +0 -3
  644. package/dist/features/search/server.js +0 -3
  645. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  646. package/dist/features/seller/actions/offer-actions.js +38 -8
  647. package/dist/features/seller/actions/seller-actions.js +34 -7
  648. package/dist/features/seller/api/coupons/route.js +1 -1
  649. package/dist/features/seller/api/products/route.js +1 -1
  650. package/dist/features/seller/api/store/route.js +1 -1
  651. package/dist/features/seller/components/SellerBidsView.js +1 -1
  652. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  653. package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
  654. package/dist/features/seller/components/SellerListingTypeView.js +29 -1
  655. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  656. package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
  657. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  658. package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
  659. package/dist/features/seller/components/SellerProductShell.js +2 -2
  660. package/dist/features/seller/components/SellerProductsView.js +1 -1
  661. package/dist/features/seller/components/SellerShippingView.js +0 -1
  662. package/dist/features/seller/components/SellerSidebar.js +1 -1
  663. package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
  664. package/dist/features/seller/components/SellerSparesView.js +6 -0
  665. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  666. package/dist/features/seller/components/index.d.ts +2 -4
  667. package/dist/features/seller/components/index.js +1 -2
  668. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  669. package/dist/features/seller/repository/offer.repository.js +43 -7
  670. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  671. package/dist/features/seller/schemas/index.d.ts +4 -4
  672. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  673. package/dist/features/seller/schemas/order-forms.js +37 -0
  674. package/dist/features/shell/CommandPalette.js +1 -1
  675. package/dist/features/shell/FormShell.js +6 -2
  676. package/dist/features/shell/QuickFormDrawer.js +15 -1
  677. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  678. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  679. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  680. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  681. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  682. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  683. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  684. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  685. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  686. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  687. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  688. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  689. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  690. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  691. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  692. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  693. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  694. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  695. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  696. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  697. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  698. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  699. package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
  700. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  701. package/dist/features/sticker-trace/server.d.ts +8 -0
  702. package/dist/features/sticker-trace/server.js +51 -0
  703. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  704. package/dist/features/stores/actions/store-query-actions.js +7 -2
  705. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  706. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  707. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  708. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  709. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  710. package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
  711. package/dist/features/stores/components/StoreHeader.js +1 -2
  712. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  713. package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
  714. package/dist/features/stores/components/StoreSparesPageView.js +48 -0
  715. package/dist/features/stores/manifest.js +8 -4
  716. package/dist/features/stores/schemas/firestore.d.ts +19 -0
  717. package/dist/features/support/repository/support.repository.d.ts +14 -3
  718. package/dist/features/support/repository/support.repository.js +93 -13
  719. package/dist/features/support/schemas/firestore.d.ts +16 -5
  720. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  721. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  722. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
  723. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
  724. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
  725. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
  726. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
  727. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  728. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  729. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  730. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
  731. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
  732. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
  733. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
  734. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
  735. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  736. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  737. package/dist/features/tester/seed-data/authored/index.js +24 -0
  738. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
  739. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
  740. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  741. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  742. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
  743. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
  744. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
  745. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
  746. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  747. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
  748. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
  749. package/dist/index.d.ts +27 -80
  750. package/dist/index.js +62 -115
  751. package/dist/next/api/routeHandler.js +9 -0
  752. package/dist/next/routing/require-record.d.ts +13 -0
  753. package/dist/next/routing/require-record.js +62 -0
  754. package/dist/next/routing/route-map.d.ts +46 -5
  755. package/dist/next/routing/route-map.js +70 -3
  756. package/dist/providers/db-firebase/base.d.ts +4 -2
  757. package/dist/providers/db-firebase/base.js +21 -5
  758. package/dist/providers/db-firebase/base.repository.d.ts +33 -9
  759. package/dist/providers/db-firebase/base.repository.js +55 -0
  760. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  761. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  762. package/dist/react/ErrorBoundary.js +6 -1
  763. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  764. package/dist/react/hooks/realtime-event-constants.js +8 -0
  765. package/dist/react/hooks/useEntityDelete.js +5 -1
  766. package/dist/react/hooks/useMessage.js +5 -1
  767. package/dist/repositories/index.d.ts +2 -2
  768. package/dist/repositories/index.js +6 -1
  769. package/dist/schemas/registry.d.ts +28 -26
  770. package/dist/schemas/registry.js +31 -14
  771. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  772. package/dist/security/blind-index-tokens.d.ts +54 -0
  773. package/dist/security/blind-index-tokens.js +152 -0
  774. package/dist/security/encrypted.d.ts +117 -0
  775. package/dist/security/encrypted.js +100 -0
  776. package/dist/security/index.d.ts +6 -3
  777. package/dist/security/index.js +17 -3
  778. package/dist/security/pii-accessors.d.ts +71 -0
  779. package/dist/security/pii-accessors.js +150 -0
  780. package/dist/security/pii-encrypt.d.ts +0 -8
  781. package/dist/security/pii-encrypt.js +22 -15
  782. package/dist/security/pii-mask.d.ts +18 -0
  783. package/dist/security/pii-mask.js +27 -0
  784. package/dist/security/settings-encryption.d.ts +35 -0
  785. package/dist/security/settings-encryption.js +91 -0
  786. package/dist/seed/_helpers/brand-rows.js +38 -14
  787. package/dist/seed/_helpers/category-forest.js +73 -7
  788. package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
  789. package/dist/seed/_helpers/category-images-generated.js +81 -6
  790. package/dist/seed/_helpers/category-models.d.ts +1 -1
  791. package/dist/seed/_helpers/category-models.js +7 -1
  792. package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
  793. package/dist/seed/_helpers/category-parts.d.ts +1 -1
  794. package/dist/seed/_helpers/category-parts.js +50 -2
  795. package/dist/seed/_helpers/character-features.d.ts +1 -1
  796. package/dist/seed/_helpers/character-features.js +2 -1
  797. package/dist/seed/_helpers/franchise-rows.js +10 -2
  798. package/dist/seed/_helpers/media.d.ts +47 -0
  799. package/dist/seed/_helpers/media.js +34 -0
  800. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  801. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  802. package/dist/seed/addresses-seed-data.d.ts +2 -2
  803. package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
  804. package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
  805. package/dist/seed/bids-seed-data.d.ts +2 -2
  806. package/dist/seed/bids-seed-data.js +23 -2
  807. package/dist/seed/categories-seed-data.js +124 -20
  808. package/dist/seed/events-seed-data.d.ts +2 -2
  809. package/dist/seed/events-seed-data.js +5 -0
  810. package/dist/seed/faq-seed-data.js +175 -5
  811. package/dist/seed/grouped-listings-seed-data.js +16 -0
  812. package/dist/seed/homepage-sections-seed-data.js +131 -26
  813. package/dist/seed/index.d.ts +3 -3
  814. package/dist/seed/index.js +3 -2
  815. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  816. package/dist/seed/manifest.js +3 -0
  817. package/dist/seed/media-assets-seed-data.d.ts +1 -1
  818. package/dist/seed/media-assets-seed-data.js +746 -196
  819. package/dist/seed/model-composition-seed-data.js +122 -6
  820. package/dist/seed/offers-seed-data.d.ts +2 -2
  821. package/dist/seed/offers-seed-data.js +1 -1
  822. package/dist/seed/orders-seed-data.d.ts +2 -2
  823. package/dist/seed/part-glossary-seed-data.d.ts +1 -1
  824. package/dist/seed/part-glossary-seed-data.js +37219 -463
  825. package/dist/seed/payouts-seed-data.d.ts +2 -2
  826. package/dist/seed/payouts-seed-data.js +1 -1
  827. package/dist/seed/products-art-seed-data.js +7 -18
  828. package/dist/seed/products-auctions-seed-data.js +56 -47
  829. package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
  830. package/dist/seed/products-beyblade-x-seed-data.js +441 -0
  831. package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
  832. package/dist/seed/products-catalogue-seed-data.js +1500 -1240
  833. package/dist/seed/products-classifieds-seed-data.js +9 -27
  834. package/dist/seed/products-digital-codes-seed-data.js +9 -18
  835. package/dist/seed/products-live-items-seed-data.js +5 -13
  836. package/dist/seed/products-preorders-seed-data.js +67 -33
  837. package/dist/seed/products-prize-draws-seed-data.js +8 -17
  838. package/dist/seed/products-spares-seed-data.d.ts +2 -0
  839. package/dist/seed/products-spares-seed-data.js +368 -0
  840. package/dist/seed/products-standard-seed-data.js +39 -126
  841. package/dist/seed/products-stickers-seed-data.js +59 -15
  842. package/dist/seed/reviews-seed-data.d.ts +1 -2
  843. package/dist/seed/seed-purpose.js +7 -0
  844. package/dist/seed/sessions-seed-data.d.ts +2 -2
  845. package/dist/seed/sessions-seed-data.js +5 -0
  846. package/dist/seed/site-settings-seed-data.js +9 -1
  847. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  848. package/dist/seed/support-tickets-seed-data.js +1 -1
  849. package/dist/seed/users-seed-data.d.ts +2 -2
  850. package/dist/seed/users-seed-data.js +1 -1
  851. package/dist/seo/json-ld.d.ts +25 -0
  852. package/dist/seo/json-ld.js +33 -1
  853. package/dist/server-entry.d.ts +3 -1
  854. package/dist/server-entry.js +2 -2
  855. package/dist/server.d.ts +27 -12
  856. package/dist/server.js +86 -28
  857. package/dist/styles.css +438 -1
  858. package/dist/tailwind-input.css +31 -17
  859. package/dist/tailwind-utilities.css +1 -1
  860. package/dist/ui/components/Accordion.js +1 -1
  861. package/dist/ui/components/Breadcrumb.js +1 -1
  862. package/dist/ui/components/Button.js +7 -1
  863. package/dist/ui/components/DetailPageGallery.js +0 -2
  864. package/dist/ui/components/DetailPageHero.js +0 -1
  865. package/dist/ui/components/DetailPageTabs.js +1 -1
  866. package/dist/ui/components/Divider.js +3 -3
  867. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  868. package/dist/ui/components/FilterChipGroup.js +1 -1
  869. package/dist/ui/components/GatedPrice.js +5 -1
  870. package/dist/ui/components/HorizontalScroller.js +1 -1
  871. package/dist/ui/components/ImageGallery.js +6 -1
  872. package/dist/ui/components/ListingLayout.js +17 -11
  873. package/dist/ui/components/MediaTabs.style.css +81 -0
  874. package/dist/ui/components/OverflowRow.d.ts +92 -0
  875. package/dist/ui/components/OverflowRow.js +203 -0
  876. package/dist/ui/components/OverflowRow.style.css +235 -0
  877. package/dist/ui/components/Pagination.js +1 -1
  878. package/dist/ui/components/PendingValue.d.ts +45 -0
  879. package/dist/ui/components/PendingValue.js +7 -0
  880. package/dist/ui/components/Radio.style.css +119 -0
  881. package/dist/ui/components/RatingDisplay.js +2 -2
  882. package/dist/ui/components/RecordDetailModal.js +14 -1
  883. package/dist/ui/components/RowActionMenu.js +5 -1
  884. package/dist/ui/components/SettingsSection.js +0 -2
  885. package/dist/ui/components/SideDrawer.js +5 -1
  886. package/dist/ui/components/SideModal.js +9 -1
  887. package/dist/ui/components/SiteLogo.js +3 -0
  888. package/dist/ui/components/SiteMark.js +3 -0
  889. package/dist/ui/components/SortDropdown.js +1 -1
  890. package/dist/ui/components/SpecTable.d.ts +58 -0
  891. package/dist/ui/components/SpecTable.js +8 -0
  892. package/dist/ui/components/StarRating.js +1 -3
  893. package/dist/ui/components/SummaryCard.js +1 -1
  894. package/dist/ui/components/TabBarShell.d.ts +12 -1
  895. package/dist/ui/components/TabBarShell.js +3 -2
  896. package/dist/ui/components/Tabs.js +36 -24
  897. package/dist/ui/components/Toast.d.ts +3 -24
  898. package/dist/ui/components/Toast.js +2 -19
  899. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  900. package/dist/ui/components/TopBannerPortal.js +19 -0
  901. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  902. package/dist/ui/components/index.style.css +2 -0
  903. package/dist/ui/components/row-collapse.d.ts +15 -0
  904. package/dist/ui/components/row-collapse.js +127 -0
  905. package/dist/ui/components/toast-context.d.ts +63 -0
  906. package/dist/ui/components/toast-context.js +48 -0
  907. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  908. package/dist/ui/components/top-banner-slot.js +45 -0
  909. package/dist/ui/icons/icon-registry.d.ts +7 -0
  910. package/dist/ui/icons/icon-registry.js +25 -1
  911. package/dist/ui/index.d.ts +6 -0
  912. package/dist/ui/index.js +3 -0
  913. package/dist/utils/array.helper.d.ts +2 -2
  914. package/dist/utils/array.helper.js +5 -5
  915. package/dist/utils/id-generators.d.ts +6 -0
  916. package/dist/utils/id-generators.js +10 -0
  917. package/dist/utils/media-url.js +0 -2
  918. package/dist/utils/search-txt-builders.d.ts +28 -4
  919. package/dist/utils/search-txt-builders.js +41 -1
  920. package/dist/utils/search-txt-query.d.ts +12 -0
  921. package/dist/utils/search-txt-query.js +12 -0
  922. package/dist/validation/schemas.d.ts +8 -8
  923. package/package.json +6 -2
  924. package/scripts/dedupe-peer-deps.mjs +18 -0
  925. package/scripts/seed-cli.mjs +138 -26
  926. package/scripts/verify-css-build.mjs +118 -37
  927. package/dist/_internal/server/features/search/actions.d.ts +0 -7
  928. package/dist/_internal/server/features/search/actions.js +0 -21
  929. package/dist/_internal/server/features/search/data.d.ts +0 -15
  930. package/dist/_internal/server/features/search/data.js +0 -18
  931. package/dist/_internal/server/features/search/index.d.ts +0 -3
  932. package/dist/_internal/server/features/search/index.js +0 -2
  933. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  934. package/dist/features/account/components/UserAddressesView.js +0 -5
  935. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  936. package/dist/features/account/components/UserNotificationsView.js +0 -12
  937. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  938. package/dist/features/account/components/UserSettingsView.js +0 -13
  939. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  940. package/dist/features/account/components/UserSupportView.js +0 -166
  941. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  942. package/dist/features/admin/components/DemoSeedView.js +0 -5
  943. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  944. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  945. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  946. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  947. package/dist/features/homepage/api/[id]/route.d.ts +0 -23
  948. package/dist/features/homepage/api/[id]/route.js +0 -103
  949. package/dist/features/homepage/api/route.d.ts +0 -14
  950. package/dist/features/homepage/api/route.js +0 -140
  951. package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
  952. package/dist/features/homepage/api/sections/[id]/route.js +0 -95
  953. package/dist/features/homepage/api/sections/route.d.ts +0 -13
  954. package/dist/features/homepage/api/sections/route.js +0 -82
  955. package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
  956. package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
  957. package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
  958. package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
  959. package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
  960. package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
  961. package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
  962. package/dist/features/homepage/components/HeroBanner.js +0 -43
  963. package/dist/features/homepage/components/HeroSection.d.ts +0 -7
  964. package/dist/features/homepage/components/HeroSection.js +0 -6
  965. package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
  966. package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
  967. package/dist/features/homepage/components/HomepageView.d.ts +0 -25
  968. package/dist/features/homepage/components/HomepageView.js +0 -5
  969. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  970. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  971. package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
  972. package/dist/features/homepage/components/NewsletterBanner.js +0 -37
  973. package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
  974. package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
  975. package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
  976. package/dist/features/homepage/components/TrustBadges.js +0 -46
  977. package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
  978. package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
  979. package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
  980. package/dist/features/homepage/hooks/useHomepage.js +0 -17
  981. package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
  982. package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
  983. package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
  984. package/dist/features/homepage/repository/homepage.repository.js +0 -25
  985. package/dist/features/layout/BottomActions.d.ts +0 -1
  986. package/dist/features/layout/BottomActions.js +0 -311
  987. package/dist/features/products/components/ProductsView.d.ts +0 -6
  988. package/dist/features/products/components/ProductsView.js +0 -5
  989. package/dist/features/search/actions/index.d.ts +0 -1
  990. package/dist/features/search/actions/index.js +0 -1
  991. package/dist/features/search/actions/search-actions.d.ts +0 -18
  992. package/dist/features/search/actions/search-actions.js +0 -43
  993. package/dist/features/search/api/route.d.ts +0 -22
  994. package/dist/features/search/api/route.js +0 -128
  995. package/dist/features/search/columns/index.d.ts +0 -17
  996. package/dist/features/search/columns/index.js +0 -49
  997. package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
  998. package/dist/features/search/components/SearchFiltersRow.js +0 -21
  999. package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
  1000. package/dist/features/search/components/SearchResultsSection.js +0 -35
  1001. package/dist/features/search/components/SearchView.d.ts +0 -27
  1002. package/dist/features/search/components/SearchView.js +0 -8
  1003. package/dist/features/search/hooks/useSearch.d.ts +0 -21
  1004. package/dist/features/search/hooks/useSearch.js +0 -33
  1005. package/dist/features/search/repository/search.repository.d.ts +0 -14
  1006. package/dist/features/search/repository/search.repository.js +0 -59
  1007. package/dist/features/search/schemas/index.d.ts +0 -70
  1008. package/dist/features/search/schemas/index.js +0 -36
  1009. package/dist/features/search/types/index.d.ts +0 -48
  1010. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  1011. package/dist/features/seller/components/SellerStoreView.js +0 -8
  1012. package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
  1013. package/dist/features/stores/components/StoreScopedSearch.js +0 -27
  1014. package/dist/seed/defaults/homepage-sections.d.ts +0 -2
  1015. package/dist/seed/defaults/homepage-sections.js +0 -60
  1016. package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
  1017. package/dist/seed/factories/homepage-section.factory.js +0 -13
  1018. /package/dist/{features/search/types/index.js โ†’ _internal/shared/listing-types/spares/og.d.ts} +0 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * BusinessDocumentsRepository โ€” thin wrapper over the `businessDocuments`
3
+ * collection. See `../schemas/firestore.ts` for the doc shape and for why the
4
+ * bytes are not in Firestore.
5
+ */
6
+ import { BaseRepository, parseSieveDateValue, } from "../../../providers/db-firebase/index.js";
7
+ import { BUSINESS_DOCUMENTS_COLLECTION, } from "../schemas/firestore.js";
8
+ export class BusinessDocumentsRepository extends BaseRepository {
9
+ constructor() {
10
+ super(BUSINESS_DOCUMENTS_COLLECTION);
11
+ }
12
+ async list(model) {
13
+ return this.sieveQuery(model, BusinessDocumentsRepository.SIEVE_FIELDS, { defaultPageSize: 25, maxPageSize: 100 });
14
+ }
15
+ /**
16
+ * The current document of a given kind โ€” newest `uploadedAt` wins.
17
+ *
18
+ * Re-uploading a re-issued certificate is normal and both copies are kept:
19
+ * the superseded one is the evidence of what was true at the time, which is
20
+ * the entire point of keeping a registration document. So this resolves the
21
+ * current one rather than assuming a single row per kind.
22
+ *
23
+ * ๐Ÿ›‘ Ordered by `createdAt`, NOT `uploadedAt`, even though the latter reads
24
+ * more naturally here. `BaseRepository.create()` stamps `createdAt` on every
25
+ * document it writes, so it is guaranteed present; `uploadedAt` is set by the
26
+ * caller and a single write path that forgot it would make that row vanish
27
+ * from this query โ€” a Firestore `orderBy` on a field a document lacks is a
28
+ * silent `WHERE field IS NOT NULL` (Root Cause #100). The two are written in
29
+ * the same operation and agree, so there is nothing to gain by taking the
30
+ * field that can be missed.
31
+ */
32
+ async findCurrentByKind(kind) {
33
+ const result = await this.list({
34
+ filters: `kind==${kind}`,
35
+ sorts: "-createdAt",
36
+ page: 1,
37
+ pageSize: 1,
38
+ });
39
+ return result.items[0] ?? null;
40
+ }
41
+ }
42
+ BusinessDocumentsRepository.SIEVE_FIELDS = {
43
+ id: { canFilter: true, canSort: false },
44
+ kind: { canFilter: true, canSort: true },
45
+ fileName: { canFilter: true, canSort: true },
46
+ uploadedBy: { canFilter: true, canSort: false },
47
+ // Timestamp fields that are filterable MUST carry parseValue, or an ISO
48
+ // string reaches Firestore as a string, the type does not match the stored
49
+ // Timestamp, and the query matches ZERO documents with no error anywhere
50
+ // (Root Cause #47).
51
+ uploadedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
52
+ createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
53
+ };
54
+ export const businessDocumentsRepository = new BusinessDocumentsRepository();
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Business Documents Firestore Document Types & Constants
3
+ *
4
+ * Collection: businessDocuments
5
+ * Document ID: Firestore auto-ID (no slug prefix โ€” same convention as
6
+ * `adminAuditLog` / `notifications` / `sessions` / `jobs`; see CLAUDE.md's
7
+ * "True Firestore auto-IDs" list).
8
+ *
9
+ * The statutory registration documents of the business itself โ€” GST
10
+ * certificate, Udyam registration, bank passbook. These are NOT product media
11
+ * and NOT user uploads; there is exactly one current document per `kind`.
12
+ *
13
+ * ## ๐Ÿ›‘ Metadata only. The bytes are never in Firestore.
14
+ *
15
+ * A Firestore document is capped at 1 MiB and the Udyam certificate alone is
16
+ * 680 KB, which base64-encodes to ~907 KB โ€” so an "encrypt the PDF into a
17
+ * string field" design is one slightly larger certificate away from an
18
+ * unrecoverable write failure, at upload time, after the user has handed over
19
+ * the document. The ciphertext lives in Storage; this collection records where.
20
+ *
21
+ * ## ๐Ÿ›‘ Why `storagePath` must never be served through /api/media
22
+ *
23
+ * `GET /api/media/[...slug]` applies NO authentication โ€” deliberately, because
24
+ * its job is serving public product photography through a watermarker โ€” and
25
+ * `storage.rules` is `allow read: if true` for every object in the bucket. So
26
+ * the only thing standing between these documents and the public internet is
27
+ * that nothing routes them there, and that they carry no `mediaAssets` row (the
28
+ * row IS the public `/media/<shortId>` slug, so no row means no public URL).
29
+ *
30
+ * Read them through `GET /api/admin/business-documents/[id]` and nothing else.
31
+ */
32
+ import type { BaseDocument } from "../../../_internal/shared/types/base-document";
33
+ export declare const BUSINESS_DOCUMENTS_COLLECTION = "businessDocuments";
34
+ export declare const BusinessDocumentKindValues: {
35
+ readonly GST_CERTIFICATE: "gst_certificate";
36
+ readonly UDYAM_CERTIFICATE: "udyam_certificate";
37
+ readonly BANK_PASSBOOK: "bank_passbook";
38
+ };
39
+ export type BusinessDocumentKind = (typeof BusinessDocumentKindValues)[keyof typeof BusinessDocumentKindValues];
40
+ export declare const ALL_BUSINESS_DOCUMENT_KINDS: readonly BusinessDocumentKind[];
41
+ /**
42
+ * A `Record<BusinessDocumentKind, string>` rather than a lookup with a
43
+ * fallback, so adding a fourth kind is a COMPILE error here instead of
44
+ * rendering as a raw snake_case id in the admin list.
45
+ */
46
+ export declare const BUSINESS_DOCUMENT_KIND_LABELS: Record<BusinessDocumentKind, string>;
47
+ export interface BusinessDocumentDocument extends BaseDocument {
48
+ kind: BusinessDocumentKind;
49
+ /**
50
+ * Path inside the Storage bucket, e.g.
51
+ * `private/business-documents/3f2aโ€ฆ-gst-certificate.pdf`.
52
+ *
53
+ * ๐Ÿ›‘ Never returned by any API, to anyone. The download route resolves it
54
+ * server-side and streams the decrypted bytes; handing the path to a client
55
+ * would let it be fetched straight from Storage, where the rules permit any
56
+ * read.
57
+ */
58
+ storagePath: string;
59
+ /** Original filename as uploaded โ€” shown in the admin list and used for Content-Disposition. */
60
+ fileName: string;
61
+ /** Verified against the file's magic bytes at upload; never trusted from the client. */
62
+ contentType: string;
63
+ /** Size of the PLAINTEXT, before the envelope. What an admin expects to see downloaded. */
64
+ sizeBytes: number;
65
+ /**
66
+ * Whether the stored object carries the `enc:v1:` binary envelope.
67
+ *
68
+ * Always `true` for anything this codebase writes โ€” `encryptBuffer` throws
69
+ * rather than degrading when `SETTINGS_ENCRYPTION_KEY` is unset, so there is
70
+ * no path that produces a plaintext object. It is recorded anyway because
71
+ * the download route must not GUESS: a future hand-uploaded object would
72
+ * otherwise be fed to `decryptBuffer` and throw an envelope error that
73
+ * describes the crypto rather than the upload.
74
+ */
75
+ encrypted: boolean;
76
+ /** Auth UID of the admin who uploaded it. */
77
+ uploadedBy: string;
78
+ uploadedAt: Date;
79
+ }
80
+ export declare const BUSINESS_DOCUMENT_FIELDS: {
81
+ readonly KIND: "kind";
82
+ readonly STORAGE_PATH: "storagePath";
83
+ readonly FILE_NAME: "fileName";
84
+ readonly CONTENT_TYPE: "contentType";
85
+ readonly SIZE_BYTES: "sizeBytes";
86
+ readonly ENCRYPTED: "encrypted";
87
+ readonly UPLOADED_BY: "uploadedBy";
88
+ readonly UPLOADED_AT: "uploadedAt";
89
+ readonly CREATED_AT: "createdAt";
90
+ readonly KIND_VALUES: {
91
+ readonly GST_CERTIFICATE: "gst_certificate";
92
+ readonly UDYAM_CERTIFICATE: "udyam_certificate";
93
+ readonly BANK_PASSBOOK: "bank_passbook";
94
+ };
95
+ };
96
+ /** Storage prefix. Mirrors `private/digital-content/` โ€” outside any public read path. */
97
+ export declare const BUSINESS_DOCUMENTS_STORAGE_PREFIX = "private/business-documents";
98
+ /**
99
+ * Accepted upload types. PDFs and scans only.
100
+ *
101
+ * Checked against the file's MAGIC BYTES, not the declared Content-Type: a
102
+ * declared type is a claim by the uploader, and an HTML document served from
103
+ * this origin would be stored XSS against a signed-in admin.
104
+ */
105
+ export declare const BUSINESS_DOCUMENT_ALLOWED_TYPES: readonly ["application/pdf", "image/jpeg", "image/png", "image/webp"];
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Business Documents Firestore Document Types & Constants
3
+ *
4
+ * Collection: businessDocuments
5
+ * Document ID: Firestore auto-ID (no slug prefix โ€” same convention as
6
+ * `adminAuditLog` / `notifications` / `sessions` / `jobs`; see CLAUDE.md's
7
+ * "True Firestore auto-IDs" list).
8
+ *
9
+ * The statutory registration documents of the business itself โ€” GST
10
+ * certificate, Udyam registration, bank passbook. These are NOT product media
11
+ * and NOT user uploads; there is exactly one current document per `kind`.
12
+ *
13
+ * ## ๐Ÿ›‘ Metadata only. The bytes are never in Firestore.
14
+ *
15
+ * A Firestore document is capped at 1 MiB and the Udyam certificate alone is
16
+ * 680 KB, which base64-encodes to ~907 KB โ€” so an "encrypt the PDF into a
17
+ * string field" design is one slightly larger certificate away from an
18
+ * unrecoverable write failure, at upload time, after the user has handed over
19
+ * the document. The ciphertext lives in Storage; this collection records where.
20
+ *
21
+ * ## ๐Ÿ›‘ Why `storagePath` must never be served through /api/media
22
+ *
23
+ * `GET /api/media/[...slug]` applies NO authentication โ€” deliberately, because
24
+ * its job is serving public product photography through a watermarker โ€” and
25
+ * `storage.rules` is `allow read: if true` for every object in the bucket. So
26
+ * the only thing standing between these documents and the public internet is
27
+ * that nothing routes them there, and that they carry no `mediaAssets` row (the
28
+ * row IS the public `/media/<shortId>` slug, so no row means no public URL).
29
+ *
30
+ * Read them through `GET /api/admin/business-documents/[id]` and nothing else.
31
+ */
32
+ export const BUSINESS_DOCUMENTS_COLLECTION = "businessDocuments";
33
+ export const BusinessDocumentKindValues = {
34
+ GST_CERTIFICATE: "gst_certificate",
35
+ UDYAM_CERTIFICATE: "udyam_certificate",
36
+ BANK_PASSBOOK: "bank_passbook",
37
+ };
38
+ export const ALL_BUSINESS_DOCUMENT_KINDS = Object.values(BusinessDocumentKindValues);
39
+ /**
40
+ * A `Record<BusinessDocumentKind, string>` rather than a lookup with a
41
+ * fallback, so adding a fourth kind is a COMPILE error here instead of
42
+ * rendering as a raw snake_case id in the admin list.
43
+ */
44
+ export const BUSINESS_DOCUMENT_KIND_LABELS = {
45
+ [BusinessDocumentKindValues.GST_CERTIFICATE]: "GST Certificate",
46
+ [BusinessDocumentKindValues.UDYAM_CERTIFICATE]: "Udyam Registration Certificate",
47
+ [BusinessDocumentKindValues.BANK_PASSBOOK]: "Bank Passbook",
48
+ };
49
+ export const BUSINESS_DOCUMENT_FIELDS = {
50
+ KIND: "kind",
51
+ STORAGE_PATH: "storagePath",
52
+ FILE_NAME: "fileName",
53
+ CONTENT_TYPE: "contentType",
54
+ SIZE_BYTES: "sizeBytes",
55
+ ENCRYPTED: "encrypted",
56
+ UPLOADED_BY: "uploadedBy",
57
+ UPLOADED_AT: "uploadedAt",
58
+ CREATED_AT: "createdAt",
59
+ KIND_VALUES: BusinessDocumentKindValues,
60
+ };
61
+ /** Storage prefix. Mirrors `private/digital-content/` โ€” outside any public read path. */
62
+ export const BUSINESS_DOCUMENTS_STORAGE_PREFIX = "private/business-documents";
63
+ /**
64
+ * Accepted upload types. PDFs and scans only.
65
+ *
66
+ * Checked against the file's MAGIC BYTES, not the declared Content-Type: a
67
+ * declared type is a claim by the uploader, and an HTML document served from
68
+ * this origin would be stored XSS against a signed-in admin.
69
+ */
70
+ export const BUSINESS_DOCUMENT_ALLOWED_TYPES = [
71
+ "application/pdf",
72
+ "image/jpeg",
73
+ "image/png",
74
+ "image/webp",
75
+ ];
@@ -15,6 +15,7 @@ import { CART_LANE, activeLane, canAddNewItems, } from "../../../_internal/share
15
15
  import { CART_MAX_ITEMS } from "../../../constants/limits.js";
16
16
  import { getExpandedDecrements, validateCartItemStock, } from "../../../_internal/server/features/checkout/bundle-expansion.js";
17
17
  import { safeRead } from "../../../errors/safe-read.js";
18
+ import { checkGroupRules, readGroupRules, } from "../../../_internal/shared/features/products/group-rules.js";
18
19
  /**
19
20
  * Product documents don't always carry a denormalized `storeName` โ€” the
20
21
  * create routes only set it when the caller explicitly passes one, so
@@ -133,7 +134,13 @@ export async function addGroupLineToCart(userId, input) {
133
134
  if (!rule.cartEligible) {
134
135
  throw new ValidationError(`"${product.title}" can't be added to the cart. ${rule.cartIneligibleHint ?? ""}`.trim());
135
136
  }
136
- if ((product.availableQuantity ?? 0) < m.quantity) {
137
+ /*
138
+ * ๐Ÿ›‘ Made to order: no stock CHECK for this member. Nothing is held in
139
+ * reserve โ€” it is printed or built when the order arrives โ€” so the only
140
+ * honest answer to "how many are left" is "as many as you want". The
141
+ * decrement still happens at checkout; see `validateCartItemStock`.
142
+ */
143
+ if (product.madeToOrder !== true && (product.availableQuantity ?? 0) < m.quantity) {
137
144
  throw new ValidationError(`Only ${product.availableQuantity ?? 0} left of "${product.title}".`);
138
145
  }
139
146
  resolved.push({
@@ -141,7 +148,7 @@ export async function addGroupLineToCart(userId, input) {
141
148
  quantity: m.quantity,
142
149
  unitPrice: product.price,
143
150
  title: product.title,
144
- image: product.images?.[0] ?? product.mainImage,
151
+ image: product.images?.[0]?.url ?? product.mainImage,
145
152
  gstRate: product.gstRate,
146
153
  hsnCode: product.hsnCode,
147
154
  listingType,
@@ -164,7 +171,7 @@ export async function addGroupLineToCart(userId, input) {
164
171
  return addItemToCart(userId, {
165
172
  productId: first.id,
166
173
  productTitle: first.title,
167
- productImage: first.images?.[0] ?? first.mainImage,
174
+ productImage: first.images?.[0]?.url ?? first.mainImage,
168
175
  price: first.price,
169
176
  currency: first.currency,
170
177
  quantity: resolved[0].quantity,
@@ -192,6 +199,25 @@ export async function addGroupLineToCart(userId, input) {
192
199
  throw new ValidationError(`Only ${shortfall.availableQty} left of "${short?.title ?? shortfall.productId}" once your cart is counted.`);
193
200
  }
194
201
  const groupTitle = await resolveGroupTitle(groupId, groupSource, first ?? null);
202
+ /*
203
+ * ๐Ÿ›‘ SERVER-SIDE ENFORCEMENT OF THE GROUP'S OWN RULES.
204
+ *
205
+ * `GroupMemberPicker` mirrors this so a buyer is not told "no" only after
206
+ * submitting โ€” but the picker is a convenience and this is the boundary. The
207
+ * two share `checkGroupRules`, so they cannot disagree about what a valid
208
+ * selection is; only about WHEN the buyer finds out.
209
+ *
210
+ * It throws on the FIRST violation while the picker shows all of them
211
+ * together, which is each surface doing the right thing for its own job: a
212
+ * form lists everything to fix, an API answers one reason.
213
+ */
214
+ const rules = await resolveGroupRules(groupId, groupSource, first ?? null);
215
+ const violations = checkGroupRules(rules, resolved.map((r) => ({ productId: r.productId, quantity: r.quantity, title: r.title })));
216
+ if (violations.length > 0) {
217
+ throw Object.assign(new ValidationError(violations[0].message), {
218
+ code: violations[0].code,
219
+ });
220
+ }
195
221
  return cartRepository.addGroupLine(userId, {
196
222
  productId: groupId,
197
223
  productTitle: groupTitle,
@@ -208,9 +234,51 @@ export async function addGroupLineToCart(userId, input) {
208
234
  groupId,
209
235
  groupSlug: groupSource === "product-group" ? groupId : undefined,
210
236
  groupTitle,
237
+ /*
238
+ * Snapshotted at add time โ€” see `CartItemDocument.groupDiscountPercent`.
239
+ * Omitted entirely when there is no discount, so a line with no group
240
+ * pricing carries no field rather than a zero that reads as "0% off".
241
+ */
242
+ ...(rules.groupDiscountPercent !== undefined && rules.groupDiscountPercent > 0
243
+ ? { groupDiscountPercent: rules.groupDiscountPercent }
244
+ : {}),
211
245
  groupMembers: resolved,
212
246
  });
213
247
  }
248
+ /**
249
+ * The group's selection rules, from whichever of the two homes owns them.
250
+ *
251
+ * ๐Ÿ›‘ ONE resolver, because there are TWO homes: a product group keeps them on
252
+ * its PARENT PRODUCT (identified by the parent's slug, which IS the groupId),
253
+ * while a `groupedListing` keeps them on its own document. Reading them at each
254
+ * call site is how the picker and the server come to disagree.
255
+ *
256
+ * Fails OPEN โ€” an unreadable group yields no rules rather than refusing the
257
+ * add. A transient Firestore error must not look like "your selection is
258
+ * invalid", which is a statement about the buyer's choice and would send them
259
+ * to change something that was already correct.
260
+ */
261
+ async function resolveGroupRules(groupId, groupSource, sample) {
262
+ if (groupSource === "grouped-listing") {
263
+ const { groupedListingsRepository } = await import("../../grouped/repository/grouped-listings.repository.js");
264
+ const group = await safeRead(() => groupedListingsRepository.findById(groupId), {
265
+ route: "/cart", key: "groupedListings.rules", fallback: null,
266
+ });
267
+ return readGroupRules(group);
268
+ }
269
+ /*
270
+ * A product group's rules live on the PARENT, and `sample` is an arbitrary
271
+ * member โ€” so the parent has to be fetched unless the sample happens to BE
272
+ * it. `groupId` is the parent's slug and products are pure slugs
273
+ * (`id === slug`), so `findById` resolves it directly.
274
+ */
275
+ if (sample?.isGroupParent && sample.id === groupId)
276
+ return readGroupRules(sample);
277
+ const parent = await safeRead(() => productRepository.findById(groupId), {
278
+ route: "/cart", key: "products.groupParentRules", fallback: null,
279
+ });
280
+ return readGroupRules(parent);
281
+ }
214
282
  /** Is this product listed on that `groupedListings` document? */
215
283
  async function isGroupedListingMember(groupId, productId) {
216
284
  const { groupedListingsRepository } = await import("../../grouped/repository/grouped-listings.repository.js");
@@ -263,14 +331,23 @@ export async function mergeGuestCart(userId, items) {
263
331
  const product = await productRepository.findById(item.productId);
264
332
  if (!product || product.status !== "published")
265
333
  continue;
266
- if (product.availableQuantity < 1)
334
+ /*
335
+ * A made-to-order row survives the guest-cart merge at its full requested
336
+ * quantity. Dropping it (or clamping it to 0) would silently delete the
337
+ * line a signed-out visitor had chosen, which reads as the cart losing
338
+ * items on login โ€” and there is no stock level for the clamp to clamp to.
339
+ */
340
+ const unlimited = product.madeToOrder === true;
341
+ if (!unlimited && product.availableQuantity < 1)
267
342
  continue;
268
- const safeQty = Math.min(item.quantity, product.availableQuantity);
343
+ const safeQty = unlimited
344
+ ? item.quantity
345
+ : Math.min(item.quantity, product.availableQuantity);
269
346
  const storeName = await resolveStoreName(product.storeId, product.storeName);
270
347
  await cartRepository.addItem(userId, {
271
348
  productId: product.id,
272
349
  productTitle: product.title,
273
- productImage: product.images?.[0] ?? "",
350
+ productImage: product.images?.[0]?.url ?? "",
274
351
  price: product.price,
275
352
  currency: product.currency ?? getDefaultCurrency(),
276
353
  quantity: safeQty,
@@ -33,7 +33,7 @@ export async function GET(request) {
33
33
  filters,
34
34
  sort,
35
35
  page,
36
- perPage: pageSize,
36
+ pageSize: pageSize,
37
37
  });
38
38
  const totalPages = Math.max(1, Math.ceil(result.total / pageSize));
39
39
  return NextResponse.json({
@@ -162,10 +162,33 @@ export class CartRepository extends BaseRepository {
162
162
  * subtotals all compute `price ร— quantity`, and a grouped line pins
163
163
  * `quantity` to 1, so all four stay correct with no changes of their own.
164
164
  */
165
- deriveLinePrice(members) {
165
+ deriveLinePrice(members, discountPercent) {
166
166
  const raw = members.reduce((sum, m) => sum + m.unitPrice * m.quantity, 0);
167
+ /*
168
+ * ๐Ÿ›‘ THE GROUP DISCOUNT IS APPLIED HERE AND NOWHERE ELSE.
169
+ *
170
+ * This function is the only writer of `item.price` on a multi-member line,
171
+ * and `item.price` is what `getSubtotal`, the cart page's per-seller
172
+ * subtotal, both lane subtotals, `unitPriceFor` and
173
+ * `expandCartLineToOrderRows`' per-member GST proration (via
174
+ * `allocateAcrossMembers`) all read. So discounting here reaches every one
175
+ * of them with no change of their own โ€” and discounting anywhere else means
176
+ * the cart total and the invoice are computed from two different numbers,
177
+ * which is exactly what Root Cause #75 cost.
178
+ *
179
+ * In particular `allocateAcrossMembers` prorates the LOCKED line price
180
+ * across members for tax, so a discount applied after it would under- or
181
+ * over-report GST against the amount actually charged.
182
+ *
183
+ * Clamped 0โ€“100 rather than trusted: the percent is a snapshot copied off a
184
+ * seller-editable rule, and a negative value would silently INFLATE the
185
+ * line while a value over 100 would make it negative.
186
+ */
187
+ const pct = Math.min(100, Math.max(0, discountPercent ?? 0));
188
+ // audit-money-units-ok: pct/100 is a PERCENTAGE divisor (0-100 -> 0-1 fraction), not a paise conversion โ€” raw/discounted are decimal rupees throughout.
189
+ const discounted = pct > 0 ? raw * (1 - pct / 100) : raw;
167
190
  // audit-money-units-ok: decimal rupees throughout; rounding to 2dp, not paise conversion.
168
- return Math.round(raw * 100) / 100;
191
+ return Math.round(discounted * 100) / 100;
169
192
  }
170
193
  /**
171
194
  * Create a multi-member line. Deliberately never merges into an existing
@@ -182,7 +205,7 @@ export class CartRepository extends BaseRepository {
182
205
  productId: input.productId,
183
206
  productTitle: input.productTitle,
184
207
  productImage: input.productImage,
185
- price: this.deriveLinePrice(input.groupMembers),
208
+ price: this.deriveLinePrice(input.groupMembers, input.groupDiscountPercent),
186
209
  currency: input.currency,
187
210
  quantity: input.quantity,
188
211
  storeId: input.storeId,
@@ -264,7 +287,12 @@ export class CartRepository extends BaseRepository {
264
287
  items[itemIndex] = {
265
288
  ...target,
266
289
  groupMembers: nextMembers,
267
- price: this.deriveLinePrice(nextMembers),
290
+ /*
291
+ * The line's OWN stored percent, so changing a member quantity
292
+ * preserves the discount the buyer was quoted. Re-resolving the rule
293
+ * here would silently reprice a line mid-edit.
294
+ */
295
+ price: this.deriveLinePrice(nextMembers, target.groupDiscountPercent),
268
296
  updatedAt: new Date(),
269
297
  };
270
298
  const updatedCart = { ...cart, items, updatedAt: new Date() };
@@ -148,6 +148,24 @@ export interface CartItemDocument {
148
148
  groupSlug?: string;
149
149
  /** Display snapshot of the group/bundle name. */
150
150
  groupTitle?: string;
151
+ /**
152
+ * The group discount, as a percentage, AS QUOTED WHEN THIS LINE WAS ADDED.
153
+ *
154
+ * ๐Ÿ›‘ Stored on the line rather than resolved at read time, and that is not
155
+ * the mirror-drift mistake it resembles (Root Cause #42). It has to be here
156
+ * for a mechanical reason โ€” `updateGroupMembers` recomputes `price` from
157
+ * `groupMembers` and holds only the CART, so with nothing on the line a
158
+ * buyer changing a quantity would silently lose the discount โ€” and for a
159
+ * commercial one: this is the basis of the price the buyer was shown.
160
+ *
161
+ * ๐Ÿ›‘ Because it is a snapshot it is RE-VALIDATED at checkout against the
162
+ * group's current rule, and a disagreement is REPORTED, never silently
163
+ * resolved either way. Honouring a stale percent would charge less than the
164
+ * seller now offers; re-deriving silently would change a total the buyer has
165
+ * already read. Same discipline as `revalidateAppliedCoupons`, which drops a
166
+ * lapsed coupon and tells the caller.
167
+ */
168
+ groupDiscountPercent?: number;
151
169
  /**
152
170
  * The members of a multi-member line, AUTHORITATIVE over `bundleProductIds`.
153
171
  * See `CartLineMember` for the quantity invariant.
@@ -300,6 +318,8 @@ export type AddToCartInput = {
300
318
  groupId?: string;
301
319
  groupSlug?: string;
302
320
  groupTitle?: string;
321
+ /** See `CartItemDocument.groupDiscountPercent` โ€” a quoted-at-add snapshot. */
322
+ groupDiscountPercent?: number;
303
323
  groupMembers?: CartLineMember[];
304
324
  };
305
325
  /**
@@ -174,8 +174,8 @@ export declare const cartSummarySchema: z.ZodObject<{
174
174
  sessionId?: string | undefined;
175
175
  addedAt?: string | undefined;
176
176
  }[];
177
- itemCount: number;
178
177
  subtotal: number;
178
+ itemCount: number;
179
179
  }, {
180
180
  items: {
181
181
  id: string;
@@ -193,7 +193,7 @@ export declare const cartSummarySchema: z.ZodObject<{
193
193
  sessionId?: string | undefined;
194
194
  addedAt?: string | undefined;
195
195
  }[];
196
- itemCount: number;
197
196
  subtotal: number;
197
+ itemCount: number;
198
198
  currency?: string | undefined;
199
199
  }>;
@@ -29,5 +29,5 @@ export function PublicCatalogueItemDetailView({ ownerSlug, itemId }) {
29
29
  }
30
30
  const { owner, item, linkedProductHref } = data;
31
31
  const images = item.images.length > 0 ? item.images : item.mainImage ? [item.mainImage] : [];
32
- return (_jsx(Main, { children: _jsxs(Container, { size: "lg", padding: "y-lg", children: [_jsxs(Row, { className: "mb-4", align: "center", gap: "xs", textSize: "xs", color: "muted", children: [_jsx(Link, { href: "/", className: "hover:text-primary-600 transition-colors", children: "Home" }), _jsx(Span, { "aria-hidden": true, children: "/" }), _jsx(Link, { href: `${ROUTES.PUBLIC.PROFILE(ownerSlug)}/catalogue`, className: "hover:text-primary-600 transition-colors", children: owner.displayName ?? "Catalogue" }), _jsx(Span, { "aria-hidden": true, children: "/" }), _jsx(Span, { className: "truncate max-w-[200px]", color: "muted", children: item.title })] }), _jsxs(Grid, { cols: 2, gap: "lg", children: [images.length > 0 ? (_jsx(Div, { className: `relative aspect-square w-full ${__O.hidden}`, rounded: "xl", surface: "muted", children: _jsx(MediaImage, { src: images[0], alt: item.title, size: "hero", objectFit: "contain" }) })) : (_jsx(Div, { className: "relative aspect-square w-full", rounded: "xl", surface: "muted" })), images.length > 1 && (_jsx(Row, { gap: "sm", wrap: true, className: "col-span-2", children: images.slice(1).map((src, i) => (_jsx(Div, { className: `relative h-20 w-20 ${__O.hidden}`, rounded: "lg", surface: "muted", children: _jsx(MediaImage, { src: src, alt: `${item.title} photo ${i + 2}`, size: "thumbnail", objectFit: "cover" }) }, i))) })), _jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 1, size: "2xl", weight: "bold", color: "primary", children: item.title }), typeof item.price === "number" && item.price > 0 && (_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "2xl", weight: "bold", color: "primary", children: _jsx(GatedPrice, { label: "Sign in to see the estimated value", children: formatCurrency(item.price) }) }), _jsx(Text, { size: "xs", color: "muted", children: "Estimated value \u2014 not for direct sale from this page." })] })), _jsxs(Row, { gap: "sm", wrap: true, children: [item.condition && (_jsx(Span, { size: "xs", weight: "medium", padding: "pill-sm", rounded: "full", surface: "subtle", color: "muted", children: item.condition })), typeof item.quantity === "number" && (_jsxs(Span, { size: "xs", weight: "medium", padding: "pill-sm", rounded: "full", surface: "subtle", color: "muted", children: ["Qty: ", item.quantity] }))] }), item.description && (_jsx(Text, { color: "muted", className: "whitespace-pre-line", children: item.description })), owner.displayName && (_jsxs(Div, { border: "subtle", rounded: "xl", surface: "muted", padding: "md", children: [_jsx(Text, { className: "text-[10px] tracking-wide mb-0.5", color: "faint", transform: "uppercase", children: "Owned by" }), _jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: owner.displayName })] })), linkedProductHref && (_jsx(Link, { href: linkedProductHref, className: "inline-flex w-fit items-center rounded-lg bg-primary px-[var(--appkit-space-4)] py-[var(--appkit-space-2)] text-[length:var(--appkit-text-sm)] font-semibold text-white transition-colors hover:opacity-90", children: "View live listing \u2192" }))] })] })] }) }));
32
+ return (_jsx(Main, { children: _jsxs(Container, { size: "lg", padding: "y-lg", children: [_jsxs(Row, { className: "mb-4", align: "center", gap: "xs", textSize: "xs", color: "muted", children: [_jsx(Link, { href: "/", className: "hover:text-primary-600 dark:hover:text-primary-400 transition-colors", children: "Home" }), _jsx(Span, { "aria-hidden": true, children: "/" }), _jsx(Link, { href: `${ROUTES.PUBLIC.PROFILE(ownerSlug)}/catalogue`, className: "hover:text-primary-600 dark:hover:text-primary-400 transition-colors", children: owner.displayName ?? "Catalogue" }), _jsx(Span, { "aria-hidden": true, children: "/" }), _jsx(Span, { className: "truncate max-w-[200px]", color: "muted", children: item.title })] }), _jsxs(Grid, { cols: 2, gap: "lg", children: [images.length > 0 ? (_jsx(Div, { className: `relative aspect-square w-full ${__O.hidden}`, rounded: "xl", surface: "muted", children: _jsx(MediaImage, { src: images[0], alt: item.title, size: "hero", objectFit: "contain" }) })) : (_jsx(Div, { className: "relative aspect-square w-full", rounded: "xl", surface: "muted" })), images.length > 1 && (_jsx(Row, { gap: "sm", wrap: true, className: "col-span-2", children: images.slice(1).map((src, i) => (_jsx(Div, { className: `relative h-20 w-20 ${__O.hidden}`, rounded: "lg", surface: "muted", children: _jsx(MediaImage, { src: src, alt: `${item.title} photo ${i + 2}`, size: "thumbnail", objectFit: "cover" }) }, i))) })), _jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 1, size: "2xl", weight: "bold", color: "primary", children: item.title }), typeof item.price === "number" && item.price > 0 && (_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "2xl", weight: "bold", color: "primary", children: _jsx(GatedPrice, { label: "Sign in to see the estimated value", children: formatCurrency(item.price) }) }), _jsx(Text, { size: "xs", color: "muted", children: "Estimated value \u2014 not for direct sale from this page." })] })), _jsxs(Row, { gap: "sm", wrap: true, children: [item.condition && (_jsx(Span, { size: "xs", weight: "medium", padding: "pill-sm", rounded: "full", surface: "subtle", color: "muted", children: item.condition })), typeof item.quantity === "number" && (_jsxs(Span, { size: "xs", weight: "medium", padding: "pill-sm", rounded: "full", surface: "subtle", color: "muted", children: ["Qty: ", item.quantity] }))] }), item.description && (_jsx(Text, { color: "muted", className: "whitespace-pre-line", children: item.description })), owner.displayName && (_jsxs(Div, { border: "subtle", rounded: "xl", surface: "muted", padding: "md", children: [_jsx(Text, { className: "text-[10px] tracking-wide mb-0.5", color: "faint", transform: "uppercase", children: "Owned by" }), _jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: owner.displayName })] })), linkedProductHref && (_jsx(Link, { href: linkedProductHref, className: "inline-flex w-fit items-center rounded-lg bg-primary px-[var(--appkit-space-4)] py-[var(--appkit-space-2)] text-[length:var(--appkit-text-sm)] font-semibold text-white transition-colors hover:opacity-90", children: "View live listing \u2192" }))] })] })] }) }));
33
33
  }
@@ -1,4 +1,3 @@
1
- import type { DocumentSnapshot } from "firebase-admin/firestore";
2
1
  /**
3
2
  * Personal Catalogue Repository (Feature B).
4
3
  */
@@ -14,16 +13,17 @@ export interface CatalogueWriteContext {
14
13
  }
15
14
  export declare class CatalogueRepository extends BaseRepository<CatalogueItemDocument> {
16
15
  /**
17
- * `ownerEmail` only โ€” NOT `ownerName`.
16
+ * ๐Ÿ›‘ DEAD as written: `CatalogueItemDocument` has no `ownerEmail`.
18
17
  *
19
- * Per decision D1 names stay partial-match searchable, and catalogue items are
20
- * searchable by owner in the admin approvals queue. `CATALOGUE_HISTORY_PII_FIELDS`
21
- * lists both, but that constant scrubs status *history*, which has no search
22
- * requirement โ€” the two lists are intentionally different.
18
+ * Kept rather than deleted because it is the declaration that would start
19
+ * working the moment an owner email is added to the document, and deleting
20
+ * it would hand that future field plaintext storage by default. The reasoning
21
+ * it used to carry โ€” "`ownerEmail` only, NOT `ownerName`, because D1 keeps
22
+ * names searchable" โ€” described a choice between two fields that neither
23
+ * exist nor can arrive through `CatalogueItemCreateInput`.
23
24
  */
24
25
  protected piiFields: readonly ["ownerEmail"];
25
26
  /** Decrypt on read so callers see the shape they wrote. */
26
- protected mapDoc<D = CatalogueItemDocument>(snap: DocumentSnapshot): D;
27
27
  constructor();
28
28
  create(input: CatalogueItemCreateInput): Promise<CatalogueItemDocument>;
29
29
  /**
@@ -1,4 +1,3 @@
1
- import { decryptPiiFields } from "../../../security/pii-encrypt.js";
2
1
  /**
3
2
  * Personal Catalogue Repository (Feature B).
4
3
  */
@@ -7,19 +6,38 @@ import { CATALOGUE_COLLECTION, CATALOGUE_FIELDS, CATALOGUE_TRACKED_FIELDS, CATAL
7
6
  import { withHistory } from "../../../_internal/shared/history/index.js";
8
7
  export class CatalogueRepository extends BaseRepository {
9
8
  /** Decrypt on read so callers see the shape they wrote. */
10
- mapDoc(snap) {
11
- const raw = super.mapDoc(snap);
12
- return decryptPiiFields(raw, [...this.piiFields]);
13
- }
9
+ /*
10
+ * ๐Ÿ›‘ `mapDoc` is NOT overridden โ€” it used to call `decryptPiiFields`, and
11
+ * that call had ALWAYS BEEN A NO-OP.
12
+ *
13
+ * Measured 2026-10-17: `CatalogueItemDocument` declares `ownerId` and
14
+ * `ownerRole` and NO owner name or email. `CatalogueItemCreateInput` is
15
+ * `Omit<CatalogueItemDocument, โ€ฆ>`, so `ownerEmail` cannot arrive through
16
+ * the create path either โ€” the `piiFields` override below encrypts a field
17
+ * that is never present, and the decrypt undid nothing.
18
+ *
19
+ * So this repository gets NO `reveal*`/`masked*` accessors: there is no PII
20
+ * on the document to reveal or to mask, and adding a pair for fields that do
21
+ * not exist would be the same fiction one level up โ€” a named method whose
22
+ * name is the only evidence it does anything (Root Cause #92).
23
+ *
24
+ * `CATALOGUE_HISTORY_PII_FIELDS` is a different and legitimate thing: it is
25
+ * the scrub list passed to `withHistory` below, and a history entry listing
26
+ * PII keys it does not currently carry is DEFENSIVE by design โ€” ยง "Status
27
+ * History" requires every adopter to pass the list explicitly so the next
28
+ * field added has to be triaged rather than defaulting in silently.
29
+ */
14
30
  constructor() {
15
31
  super(CATALOGUE_COLLECTION);
16
32
  /**
17
- * `ownerEmail` only โ€” NOT `ownerName`.
33
+ * ๐Ÿ›‘ DEAD as written: `CatalogueItemDocument` has no `ownerEmail`.
18
34
  *
19
- * Per decision D1 names stay partial-match searchable, and catalogue items are
20
- * searchable by owner in the admin approvals queue. `CATALOGUE_HISTORY_PII_FIELDS`
21
- * lists both, but that constant scrubs status *history*, which has no search
22
- * requirement โ€” the two lists are intentionally different.
35
+ * Kept rather than deleted because it is the declaration that would start
36
+ * working the moment an owner email is added to the document, and deleting
37
+ * it would hand that future field plaintext storage by default. The reasoning
38
+ * it used to carry โ€” "`ownerEmail` only, NOT `ownerName`, because D1 keeps
39
+ * names searchable" โ€” described a choice between two fields that neither
40
+ * exist nor can arrive through `CatalogueItemCreateInput`.
23
41
  */
24
42
  this.piiFields = ["ownerEmail"];
25
43
  }
@@ -10,10 +10,21 @@ import { type GenerateCatalogueItemIdInput } from "../../../utils/id-generators"
10
10
  import type { StatusChangeEntry } from "../../../_internal/shared/history/types";
11
11
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
12
12
  import type { ProductDraftFields } from "../../shipments/schemas/firestore";
13
+ import type { Plaintext } from "../../../security/encrypted";
13
14
  export declare const CATALOGUE_COLLECTION: "catalogueItems";
14
15
  export type CatalogueVisibility = "public" | "private";
15
16
  export type CatalogueOwnerRole = "user" | "seller" | "admin";
16
17
  export type CatalogueListingStatus = "not_listed" | "pending_admin_approval" | "listed" | "rejected";
18
+ /**
19
+ * `CatalogueItemDocument` with its PII as plain `string` โ€” what the named repository
20
+ * accessors return, and what a WRITE path accepts (the repository encrypts).
21
+ *
22
+ * `Plaintext<T>` is the one definition of this shape; see `security/encrypted.ts`.
23
+ * It is deliberately NOT distinguishable from a MASKED value โ€” `maskPii`
24
+ * returns plain strings too, and no type can express "these characters are
25
+ * asterisks". The distinction is which named method you called.
26
+ */
27
+ export type CatalogueItemPlain = Plaintext<CatalogueItemDocument>;
17
28
  export interface CatalogueItemDocument extends BaseDocument, Partial<Omit<ProductDraftFields, "title" | "images" | "mainImage">> {
18
29
  ownerId: string;
19
30
  ownerRole: CatalogueOwnerRole;