@mohasinac/appkit 4.52.4 → 4.53.0

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 (633) 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/server/features/auctions/actions.js +1 -1
  5. package/dist/_internal/server/features/categories/data.js +23 -7
  6. package/dist/_internal/server/features/checkout/actions.js +10 -3
  7. package/dist/_internal/server/features/checkout/data.d.ts +15 -0
  8. package/dist/_internal/server/features/checkout/data.js +20 -3
  9. package/dist/_internal/server/features/lottery/actions.js +9 -1
  10. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  11. package/dist/_internal/server/features/lottery/og.js +79 -0
  12. package/dist/_internal/server/features/messages/actions.js +4 -0
  13. package/dist/_internal/server/features/offers/adapters.js +17 -3
  14. package/dist/_internal/server/features/orders/actions.js +7 -2
  15. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  16. package/dist/_internal/server/features/raffle/actions.js +25 -0
  17. package/dist/_internal/server/features/reviews/actions.js +1 -1
  18. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  19. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  20. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  21. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  22. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  23. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  24. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  25. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  26. package/dist/_internal/server/features/search/search-sources.js +142 -7
  27. package/dist/_internal/server/features/seo/robots.js +21 -1
  28. package/dist/_internal/server/features/seo/sitemap.js +1 -1
  29. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  30. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  31. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  32. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  33. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  34. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
  35. package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
  36. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  37. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  38. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  39. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  40. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  41. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  42. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  43. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  44. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  45. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  46. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  47. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  48. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  49. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  50. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  51. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  52. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
  53. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
  54. package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
  55. package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
  56. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  57. package/dist/_internal/server/functions/scheduled.js +25 -1
  58. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  59. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  60. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  61. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  62. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  63. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  64. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  65. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  66. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  67. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  68. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  69. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  70. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  71. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  72. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  73. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  74. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  75. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  76. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  77. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  78. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  79. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  80. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  81. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  83. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  84. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  85. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  86. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  87. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  88. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  89. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  90. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  91. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  92. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  93. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  94. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  95. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  96. package/dist/_internal/shared/actions/action-registry.js +29 -0
  97. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  98. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  99. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  100. package/dist/_internal/shared/features/events/config.js +14 -0
  101. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  102. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  103. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  104. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  105. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  106. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  107. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  108. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  109. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  110. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  111. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  112. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  113. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  114. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  115. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  116. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  117. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  118. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  119. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  120. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  121. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  122. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  123. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  124. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  125. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  126. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  127. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  128. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  129. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  130. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  131. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  132. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  133. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  134. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  135. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  136. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  137. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  138. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  139. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  140. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  141. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  142. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  143. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  144. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  145. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  146. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  147. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  148. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  149. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  150. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  151. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  152. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  153. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  154. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  155. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  156. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  157. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  158. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  159. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  160. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  161. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  162. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  163. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  164. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  165. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  166. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  167. package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
  168. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  169. package/dist/_internal/shared/listing-types/art/config.js +1 -0
  170. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  171. package/dist/_internal/shared/listing-types/auction/config.js +1 -0
  172. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  173. package/dist/_internal/shared/listing-types/classified/config.js +1 -0
  174. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  175. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
  176. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  177. package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
  178. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  179. package/dist/_internal/shared/listing-types/live/config.js +1 -0
  180. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  181. package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
  182. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  183. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
  184. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  185. package/dist/_internal/shared/listing-types/standard/config.js +1 -0
  186. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  187. package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
  188. package/dist/_internal/shared/media/limits.d.ts +12 -2
  189. package/dist/_internal/shared/media/limits.js +12 -2
  190. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  191. package/dist/_internal/shared/search/artifact-url.js +119 -0
  192. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  193. package/dist/_internal/shared/search/index-record.js +96 -0
  194. package/dist/_internal/shared/search/match.d.ts +65 -0
  195. package/dist/_internal/shared/search/match.js +263 -0
  196. package/dist/client.d.ts +8 -7
  197. package/dist/client.js +12 -5
  198. package/dist/configs/eslint.js +22 -2
  199. package/dist/constants/api-endpoints.d.ts +68 -0
  200. package/dist/constants/api-endpoints.js +32 -0
  201. package/dist/constants/field-names.d.ts +7 -1
  202. package/dist/constants/field-names.js +36 -1
  203. package/dist/contracts/repository.d.ts +8 -7
  204. package/dist/contracts/search.d.ts +2 -2
  205. package/dist/contracts/table.d.ts +3 -3
  206. package/dist/contracts/table.js +3 -3
  207. package/dist/core/contact-submissions.repository.js +2 -2
  208. package/dist/core/integration-keys.js +7 -1
  209. package/dist/core/newsletter.repository.js +2 -2
  210. package/dist/core/site-config.js +1 -1
  211. package/dist/errors/error-codes.d.ts +30 -0
  212. package/dist/errors/error-codes.js +30 -0
  213. package/dist/errors/error-display-map.js +40 -1
  214. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  215. package/dist/features/account/components/UserBidsView.js +1 -1
  216. package/dist/features/account/components/index.d.ts +0 -8
  217. package/dist/features/account/components/index.js +0 -4
  218. package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
  219. package/dist/features/addresses/repository/addresses.repository.js +65 -9
  220. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  221. package/dist/features/admin/actions/notification-actions.js +15 -6
  222. package/dist/features/admin/api/bids/route.js +1 -1
  223. package/dist/features/admin/api/coupons/route.js +1 -1
  224. package/dist/features/admin/api/products/route.js +1 -1
  225. package/dist/features/admin/api/reviews/route.js +1 -1
  226. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  227. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  228. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  229. package/dist/features/admin/components/AdminBlogView.js +1 -1
  230. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  231. package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
  232. package/dist/features/admin/components/AdminContactView.js +1 -1
  233. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  234. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  235. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  236. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  237. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  238. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  239. package/dist/features/admin/components/AdminProductEditorView.js +24 -37
  240. package/dist/features/admin/components/AdminProductsView.js +10 -3
  241. package/dist/features/admin/components/AdminScammersView.js +1 -1
  242. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  243. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  244. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  245. package/dist/features/admin/components/AdminTeamView.js +1 -1
  246. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  247. package/dist/features/admin/components/AdminUsersView.js +1 -1
  248. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  249. package/dist/features/admin/components/DataListingView.js +9 -4
  250. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  251. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  252. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  253. package/dist/features/admin/schemas/firestore.d.ts +62 -1
  254. package/dist/features/admin/schemas/firestore.js +32 -0
  255. package/dist/features/admin/types/index.d.ts +1 -1
  256. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  257. package/dist/features/auctions/actions/bid-actions.js +16 -4
  258. package/dist/features/auctions/api/route.js +1 -1
  259. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  260. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  261. package/dist/features/auctions/repository/bid.repository.js +114 -13
  262. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  263. package/dist/features/auctions/schemas/firestore.js +1 -0
  264. package/dist/features/auth/actions/profile-actions.js +30 -4
  265. package/dist/features/auth/components/index.d.ts +0 -1
  266. package/dist/features/auth/components/index.js +0 -1
  267. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  268. package/dist/features/auth/repository/session.repository.js +46 -5
  269. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  270. package/dist/features/auth/repository/token.repository.js +65 -11
  271. package/dist/features/auth/repository/user.repository.d.ts +33 -7
  272. package/dist/features/auth/repository/user.repository.js +100 -15
  273. package/dist/features/auth/schemas/firestore.d.ts +63 -12
  274. package/dist/features/auth/schemas/firestore.js +11 -0
  275. package/dist/features/before-after/api/route.js +1 -1
  276. package/dist/features/blog/components/BlogListView.js +16 -3
  277. package/dist/features/blog/components/BlogPostView.js +1 -1
  278. package/dist/features/blog/schemas/index.d.ts +2 -2
  279. package/dist/features/cart/api/route.js +1 -1
  280. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  281. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  282. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  283. package/dist/features/categories/api/route.js +10 -10
  284. package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
  285. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  286. package/dist/features/categories/components/index.d.ts +0 -2
  287. package/dist/features/categories/components/index.js +0 -1
  288. package/dist/features/categories/repository/categories.repository.d.ts +1 -0
  289. package/dist/features/categories/repository/categories.repository.js +31 -1
  290. package/dist/features/categories/schemas/index.d.ts +2 -2
  291. package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
  292. package/dist/features/categories/utils/taxonomy-visual.js +58 -0
  293. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  294. package/dist/features/collections/api/[slug]/route.js +3 -3
  295. package/dist/features/collections/api/route.js +1 -1
  296. package/dist/features/consultation/api/route.js +1 -1
  297. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  298. package/dist/features/consultation/types/index.d.ts +1 -1
  299. package/dist/features/contact/components/ContactForm.js +1 -3
  300. package/dist/features/corporate/api/route.js +1 -1
  301. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  302. package/dist/features/corporate/types/index.d.ts +1 -1
  303. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  304. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  305. package/dist/features/events/actions/event-actions.d.ts +14 -0
  306. package/dist/features/events/actions/event-actions.js +82 -3
  307. package/dist/features/events/api/[id]/route.js +2 -2
  308. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  309. package/dist/features/events/components/AdminEventsView.js +32 -8
  310. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  311. package/dist/features/events/components/EventRafflesSection.js +52 -3
  312. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  313. package/dist/features/events/components/SpinWheelView.js +41 -4
  314. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  315. package/dist/features/events/repository/event-entry.repository.js +41 -7
  316. package/dist/features/events/schemas/firestore.d.ts +17 -4
  317. package/dist/features/events/types/index.d.ts +37 -0
  318. package/dist/features/faq/repository/faqs.repository.js +1 -1
  319. package/dist/features/faq/schemas/index.d.ts +5 -2
  320. package/dist/features/faq/schemas/index.js +6 -0
  321. package/dist/features/faq/types/index.d.ts +0 -1
  322. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  323. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  324. package/dist/features/homepage/api/carousel/route.js +4 -4
  325. package/dist/features/homepage/api/route.js +2 -2
  326. package/dist/features/homepage/api/sections/route.js +1 -1
  327. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  328. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  329. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  330. package/dist/features/homepage/components/index.d.ts +0 -2
  331. package/dist/features/homepage/components/index.js +0 -1
  332. package/dist/features/homepage/repository/homepage.repository.js +1 -1
  333. package/dist/features/homepage/schemas/firestore.d.ts +6 -0
  334. package/dist/features/homepage/schemas/index.d.ts +10 -10
  335. package/dist/features/layout/AppLayoutShell.d.ts +12 -3
  336. package/dist/features/layout/AppLayoutShell.js +65 -13
  337. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  338. package/dist/features/layout/BottomActionsContext.js +5 -0
  339. package/dist/features/layout/BottomChrome.js +48 -9
  340. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  341. package/dist/features/layout/BottomNavbar.js +43 -3
  342. package/dist/features/layout/MainNavbar.d.ts +11 -0
  343. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  344. package/dist/features/layout/NavbarLayout.js +88 -11
  345. package/dist/features/layout/SideActionDock.d.ts +1 -0
  346. package/dist/features/layout/SideActionDock.js +219 -0
  347. package/dist/features/layout/TitleBarLayout.d.ts +1 -3
  348. package/dist/features/layout/TitleBarLayout.js +3 -4
  349. package/dist/features/layout/cta-anchor.d.ts +31 -0
  350. package/dist/features/layout/cta-anchor.js +31 -0
  351. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  352. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  353. package/dist/features/layout/index.d.ts +9 -1
  354. package/dist/features/layout/index.js +9 -1
  355. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  356. package/dist/features/layout/useCtaReveal.js +82 -0
  357. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  358. package/dist/features/layout/useHoldToOpen.js +84 -0
  359. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  360. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  361. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  362. package/dist/features/loyalty/api/balance/route.js +1 -1
  363. package/dist/features/loyalty/api/history/route.js +1 -1
  364. package/dist/features/media/MediaImage.js +0 -1
  365. package/dist/features/media/MediaPickerModal.js +7 -1
  366. package/dist/features/media/modals/ImageEditor.js +5 -1
  367. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  368. package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
  369. package/dist/features/media/upload/CameraCapture.js +16 -1
  370. package/dist/features/media/upload/ImageUpload.js +42 -4
  371. package/dist/features/media/upload/MediaUploadField.js +69 -13
  372. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  373. package/dist/features/media/upload/downscale-image.js +150 -0
  374. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  375. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  376. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  377. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  378. package/dist/features/orders/hooks/useOrders.js +4 -2
  379. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  380. package/dist/features/orders/repository/orders.repository.js +52 -20
  381. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  382. package/dist/features/orders/schemas/index.d.ts +8 -8
  383. package/dist/features/orders/types/index.d.ts +2 -2
  384. package/dist/features/payments/repository/payments.repository.js +2 -2
  385. package/dist/features/payments/repository/payout.repository.d.ts +23 -6
  386. package/dist/features/payments/repository/payout.repository.js +63 -23
  387. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  388. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  389. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  390. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  391. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  392. package/dist/features/pre-orders/api/admin/route.js +1 -1
  393. package/dist/features/pre-orders/api/route.js +1 -1
  394. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  395. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  396. package/dist/features/products/api/[id]/route.js +1 -1
  397. package/dist/features/products/components/ListingBottomActions.js +4 -0
  398. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  399. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  400. package/dist/features/products/components/ProductGrid.js +12 -1
  401. package/dist/features/products/components/index.d.ts +0 -2
  402. package/dist/features/products/components/index.js +0 -1
  403. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  404. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  405. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  406. package/dist/features/products/constants/listing-tabs.js +3 -2
  407. package/dist/features/products/hooks/useProducts.js +2 -2
  408. package/dist/features/products/repository/products.repository.js +13 -1
  409. package/dist/features/products/schemas/index.d.ts +2 -2
  410. package/dist/features/products/types/index.d.ts +1 -1
  411. package/dist/features/promotions/api/route.js +1 -1
  412. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  413. package/dist/features/reviews/actions/review-actions.js +22 -8
  414. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  415. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  416. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  417. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  418. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  419. package/dist/features/reviews/schemas/index.d.ts +2 -2
  420. package/dist/features/scams/actions/scam-actions.js +16 -4
  421. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  422. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  423. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  424. package/dist/features/search/repository/search.repository.js +2 -2
  425. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  426. package/dist/features/seller/actions/offer-actions.js +38 -8
  427. package/dist/features/seller/actions/seller-actions.js +34 -7
  428. package/dist/features/seller/api/coupons/route.js +1 -1
  429. package/dist/features/seller/api/products/route.js +1 -1
  430. package/dist/features/seller/api/store/route.js +1 -1
  431. package/dist/features/seller/components/SellerBidsView.js +1 -1
  432. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  433. package/dist/features/seller/components/SellerListingTypeView.js +9 -1
  434. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  435. package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
  436. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  437. package/dist/features/seller/components/SellerProductShell.js +0 -1
  438. package/dist/features/seller/components/SellerProductsView.js +1 -1
  439. package/dist/features/seller/components/SellerShippingView.js +0 -1
  440. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  441. package/dist/features/seller/components/index.d.ts +0 -4
  442. package/dist/features/seller/components/index.js +0 -2
  443. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  444. package/dist/features/seller/repository/offer.repository.js +43 -7
  445. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  446. package/dist/features/seller/schemas/index.d.ts +4 -4
  447. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  448. package/dist/features/seller/schemas/order-forms.js +37 -0
  449. package/dist/features/shell/FormShell.js +6 -2
  450. package/dist/features/shell/QuickFormDrawer.js +15 -1
  451. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  452. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  453. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  454. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  455. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  456. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  457. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  458. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  459. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  460. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  461. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  462. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  463. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  464. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  465. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  466. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  467. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  468. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  469. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  470. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  471. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  472. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  473. package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
  474. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  475. package/dist/features/sticker-trace/server.d.ts +8 -0
  476. package/dist/features/sticker-trace/server.js +51 -0
  477. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  478. package/dist/features/stores/actions/store-query-actions.js +7 -2
  479. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  480. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  481. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  482. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  483. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  484. package/dist/features/stores/manifest.js +8 -4
  485. package/dist/features/support/repository/support.repository.d.ts +14 -3
  486. package/dist/features/support/repository/support.repository.js +93 -13
  487. package/dist/features/support/schemas/firestore.d.ts +16 -5
  488. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  489. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  490. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  491. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
  492. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  493. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  494. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  495. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  496. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  497. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +2 -0
  498. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
  499. package/dist/features/tester/seed-data/authored/index.js +10 -0
  500. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  501. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  502. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  503. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
  504. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
  505. package/dist/index.d.ts +10 -23
  506. package/dist/index.js +27 -19
  507. package/dist/next/api/routeHandler.js +9 -0
  508. package/dist/next/routing/require-record.d.ts +13 -0
  509. package/dist/next/routing/require-record.js +62 -0
  510. package/dist/next/routing/route-map.d.ts +4 -4
  511. package/dist/next/routing/route-map.js +25 -3
  512. package/dist/providers/db-firebase/base.d.ts +4 -2
  513. package/dist/providers/db-firebase/base.js +21 -5
  514. package/dist/providers/db-firebase/base.repository.d.ts +11 -9
  515. package/dist/providers/db-firebase/base.repository.js +19 -0
  516. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  517. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  518. package/dist/react/ErrorBoundary.js +6 -1
  519. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  520. package/dist/react/hooks/realtime-event-constants.js +8 -0
  521. package/dist/react/hooks/useEntityDelete.js +5 -1
  522. package/dist/react/hooks/useMessage.js +5 -1
  523. package/dist/repositories/index.d.ts +2 -2
  524. package/dist/repositories/index.js +6 -1
  525. package/dist/schemas/registry.d.ts +13 -20
  526. package/dist/schemas/registry.js +31 -14
  527. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  528. package/dist/security/encrypted.d.ts +117 -0
  529. package/dist/security/encrypted.js +100 -0
  530. package/dist/security/index.d.ts +5 -2
  531. package/dist/security/index.js +16 -2
  532. package/dist/security/pii-accessors.d.ts +71 -0
  533. package/dist/security/pii-accessors.js +150 -0
  534. package/dist/security/pii-encrypt.d.ts +0 -8
  535. package/dist/security/pii-encrypt.js +22 -15
  536. package/dist/security/pii-mask.d.ts +18 -0
  537. package/dist/security/pii-mask.js +27 -0
  538. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  539. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  540. package/dist/seed/addresses-seed-data.d.ts +2 -2
  541. package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
  542. package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
  543. package/dist/seed/bids-seed-data.d.ts +2 -2
  544. package/dist/seed/bids-seed-data.js +23 -2
  545. package/dist/seed/events-seed-data.d.ts +2 -2
  546. package/dist/seed/events-seed-data.js +5 -0
  547. package/dist/seed/faq-seed-data.js +175 -5
  548. package/dist/seed/homepage-sections-seed-data.js +39 -23
  549. package/dist/seed/index.d.ts +1 -0
  550. package/dist/seed/index.js +1 -0
  551. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  552. package/dist/seed/offers-seed-data.d.ts +2 -2
  553. package/dist/seed/offers-seed-data.js +1 -1
  554. package/dist/seed/orders-seed-data.d.ts +2 -2
  555. package/dist/seed/payouts-seed-data.d.ts +2 -2
  556. package/dist/seed/payouts-seed-data.js +1 -1
  557. package/dist/seed/reviews-seed-data.d.ts +1 -2
  558. package/dist/seed/seed-purpose.js +7 -0
  559. package/dist/seed/sessions-seed-data.d.ts +2 -2
  560. package/dist/seed/sessions-seed-data.js +5 -0
  561. package/dist/seed/site-settings-seed-data.js +1 -1
  562. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  563. package/dist/seed/support-tickets-seed-data.js +1 -1
  564. package/dist/seed/users-seed-data.d.ts +2 -2
  565. package/dist/seed/users-seed-data.js +1 -1
  566. package/dist/seo/json-ld.js +5 -1
  567. package/dist/server.d.ts +18 -3
  568. package/dist/server.js +59 -3
  569. package/dist/styles.css +237 -1
  570. package/dist/tailwind-utilities.css +1 -1
  571. package/dist/ui/components/Button.js +7 -1
  572. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  573. package/dist/ui/components/FilterChipGroup.js +1 -1
  574. package/dist/ui/components/ImageGallery.js +6 -1
  575. package/dist/ui/components/ListingLayout.js +14 -8
  576. package/dist/ui/components/OverflowRow.d.ts +92 -0
  577. package/dist/ui/components/OverflowRow.js +203 -0
  578. package/dist/ui/components/OverflowRow.style.css +235 -0
  579. package/dist/ui/components/RecordDetailModal.js +14 -1
  580. package/dist/ui/components/RowActionMenu.js +5 -1
  581. package/dist/ui/components/SideDrawer.js +5 -1
  582. package/dist/ui/components/SideModal.js +9 -1
  583. package/dist/ui/components/TabBarShell.d.ts +12 -1
  584. package/dist/ui/components/TabBarShell.js +3 -2
  585. package/dist/ui/components/Tabs.js +36 -24
  586. package/dist/ui/components/Toast.d.ts +3 -24
  587. package/dist/ui/components/Toast.js +2 -19
  588. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  589. package/dist/ui/components/TopBannerPortal.js +19 -0
  590. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  591. package/dist/ui/components/index.style.css +1 -0
  592. package/dist/ui/components/row-collapse.d.ts +15 -0
  593. package/dist/ui/components/row-collapse.js +127 -0
  594. package/dist/ui/components/toast-context.d.ts +63 -0
  595. package/dist/ui/components/toast-context.js +48 -0
  596. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  597. package/dist/ui/components/top-banner-slot.js +45 -0
  598. package/dist/ui/icons/icon-registry.d.ts +6 -0
  599. package/dist/ui/icons/icon-registry.js +17 -1
  600. package/dist/ui/index.d.ts +2 -0
  601. package/dist/ui/index.js +1 -0
  602. package/dist/utils/array.helper.d.ts +2 -2
  603. package/dist/utils/array.helper.js +5 -5
  604. package/dist/utils/id-generators.d.ts +6 -0
  605. package/dist/utils/id-generators.js +10 -0
  606. package/dist/utils/media-url.js +0 -2
  607. package/dist/utils/search-txt-builders.d.ts +28 -4
  608. package/dist/utils/search-txt-builders.js +41 -1
  609. package/dist/validation/schemas.d.ts +8 -8
  610. package/package.json +6 -2
  611. package/scripts/seed-cli.mjs +3 -0
  612. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  613. package/dist/features/account/components/UserAddressesView.js +0 -5
  614. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  615. package/dist/features/account/components/UserNotificationsView.js +0 -12
  616. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  617. package/dist/features/account/components/UserSettingsView.js +0 -13
  618. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  619. package/dist/features/account/components/UserSupportView.js +0 -166
  620. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  621. package/dist/features/admin/components/DemoSeedView.js +0 -5
  622. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  623. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  624. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  625. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  626. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  627. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  628. package/dist/features/layout/BottomActions.d.ts +0 -1
  629. package/dist/features/layout/BottomActions.js +0 -311
  630. package/dist/features/products/components/ProductsView.d.ts +0 -6
  631. package/dist/features/products/components/ProductsView.js +0 -5
  632. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  633. package/dist/features/seller/components/SellerStoreView.js +0 -8
@@ -27,6 +27,8 @@ import { apiClient } from "../../../http/index.js";
27
27
  import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
28
28
  import { ProductForm } from "../../products/components/ProductForm.js";
29
29
  import { normalizeListingType } from "../../products/utils/listing-type.js";
30
+ import { ALL_LISTING_TYPES } from "../../../_internal/shared/listing-types/feature-flags.js";
31
+ import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
30
32
  import { GroupSettingsPanel } from "../../products/components/GroupSettingsPanel.js";
31
33
  import { GroupInlineSelect } from "../../seller/components/GroupInlineSelect.js";
32
34
  import { CategoryQuickCreateForm } from "./CategoryQuickCreateForm.js";
@@ -39,38 +41,12 @@ const __P = {
39
41
  const __O = {
40
42
  yAuto: "overflow-y-auto",
41
43
  };
42
- function modeFromProduct(product) {
43
- const lt = normalizeListingType(product);
44
- if (lt === "auction")
45
- return "auction";
46
- if (lt === "pre-order")
47
- return "preorder";
48
- if (lt === "prize-draw")
49
- return "prize-draw";
50
- if (lt === "classified")
51
- return "classified";
52
- if (lt === "digital-code")
53
- return "digital-code";
54
- if (lt === "live")
55
- return "live";
56
- return "standard";
57
- }
58
- /**
59
- * SB1-G Phase 4 — applies the selected mode by writing the canonical
60
- * `listingType` discriminator. Nothing else needs to be written for the mode flip.
61
- */
62
- function applyMode(product, mode) {
63
- const map = {
64
- standard: "standard",
65
- auction: "auction",
66
- preorder: "pre-order",
67
- "prize-draw": "prize-draw",
68
- classified: "classified",
69
- "digital-code": "digital-code",
70
- live: "live",
71
- };
72
- return { ...product, listingType: map[mode] };
73
- }
44
+ const modeFromProduct = (product) => normalizeListingType(product);
45
+ /** SB1-G Phase 4 — `listingType` is the only listing-kind field on the schema. */
46
+ const applyMode = (product, mode) => ({
47
+ ...product,
48
+ listingType: mode,
49
+ });
74
50
  async function loadStoreOptions(query, page) {
75
51
  const params = new URLSearchParams({ page: String(page), pageSize: "25" });
76
52
  if (query)
@@ -115,12 +91,24 @@ const EMPTY_PRODUCT = {
115
91
  // SB1-G Phase 4 — listingType is the only listing-kind field on the schema.
116
92
  listingType: "standard",
117
93
  };
118
- export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded, enabledListingTypes, initialData, ...rest }) {
94
+ export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded, enabledListingTypes, initialData, initialListingType, ...rest }) {
119
95
  const isEdit = Boolean(productId);
120
- const [product, setProduct] = React.useState(EMPTY_PRODUCT);
121
- const [mode, setMode] = React.useState("standard");
96
+ const startType = initialListingType ?? "standard";
97
+ const [product, setProduct] = React.useState(() => applyMode(EMPTY_PRODUCT, startType));
98
+ const [mode, setMode] = React.useState(startType);
122
99
  const [deleteOpen, setDeleteOpen] = React.useState(false);
123
100
  const { showToast } = useToast();
101
+ /*
102
+ * One tab per listing type, in registry order, labelled by the plugin.
103
+ *
104
+ * `enabledListingTypes` narrows it when a caller passes one — but the type
105
+ * the editor is CURRENTLY on always survives the filter. Without that, an
106
+ * admin opening an existing listing of a disabled type gets a Tabs component
107
+ * whose `value` matches no trigger: no tab reads as selected, and the next
108
+ * save still writes that type back, so the control silently disagrees with
109
+ * the record it is editing.
110
+ */
111
+ const modeTabs = React.useMemo(() => ALL_LISTING_TYPES.filter((t) => !enabledListingTypes || enabledListingTypes.includes(t) || t === mode).map((t) => ({ value: t, label: pluginFor(t).typeLabel })), [enabledListingTypes, mode]);
124
112
  const productQuery = useQuery({
125
113
  queryKey: ["admin", "product", productId],
126
114
  queryFn: async () => {
@@ -198,7 +186,7 @@ export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded
198
186
  label: "Listing type",
199
187
  required: true,
200
188
  fields: ["listingType"],
201
- render: () => (_jsx(Stack, { gap: "md", children: _jsxs(Card, { variant: "outlined", padding: "lg", children: [_jsx(Text, { className: __P.sectionLabel, color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Listing Type" }), _jsxs(Tabs, { value: mode, onChange: handleModeChange, children: [_jsxs(TabsList, { children: [(!enabledListingTypes || enabledListingTypes.includes("standard")) && (_jsx(TabsTrigger, { value: "standard", children: "Standard" })), (!enabledListingTypes || enabledListingTypes.includes("auction")) && (_jsx(TabsTrigger, { value: "auction", children: "Auction" })), (!enabledListingTypes || enabledListingTypes.includes("pre-order")) && (_jsx(TabsTrigger, { value: "preorder", children: "Pre-order" })), (!enabledListingTypes || enabledListingTypes.includes("prize-draw")) && (_jsx(TabsTrigger, { value: "prize-draw", children: "Prize Draw" })), (!enabledListingTypes || enabledListingTypes.includes("classified")) && (_jsx(TabsTrigger, { value: "classified", children: "Classified" })), (!enabledListingTypes || enabledListingTypes.includes("digital-code")) && (_jsx(TabsTrigger, { value: "digital-code", children: "Digital Code" })), (!enabledListingTypes || enabledListingTypes.includes("live")) && (_jsx(TabsTrigger, { value: "live", children: "Live Item" }))] }), _jsx(TabsContent, { value: "standard" }), _jsx(TabsContent, { value: "auction" }), _jsx(TabsContent, { value: "preorder" }), _jsx(TabsContent, { value: "prize-draw" }), _jsx(TabsContent, { value: "classified" }), _jsx(TabsContent, { value: "digital-code" }), _jsx(TabsContent, { value: "live" })] })] }) })),
189
+ render: () => (_jsx(Stack, { gap: "md", children: _jsxs(Card, { variant: "outlined", padding: "lg", children: [_jsx(Text, { className: __P.sectionLabel, color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Listing Type" }), _jsxs(Tabs, { value: mode, onChange: handleModeChange, children: [_jsx(TabsList, { children: modeTabs.map((t) => (_jsx(TabsTrigger, { value: t.value, children: t.label }, t.value))) }), modeTabs.map((t) => (_jsx(TabsContent, { value: t.value }, t.value)))] })] }) })),
202
190
  },
203
191
  {
204
192
  id: "classification",
@@ -239,7 +227,6 @@ export function AdminProductEditorView({ productId, onSaved, onDeleted, embedded
239
227
  // Live validation — re-run on every product change, not just on submit.
240
228
  React.useEffect(() => {
241
229
  validate(product);
242
- // eslint-disable-next-line react-hooks/exhaustive-deps
243
230
  }, [product, validate]);
244
231
  /*
245
232
  * ONE submit path. The sidebar button used `form="product-editor-form"` to
@@ -140,6 +140,16 @@ export function AdminProductsView({ children, ...props }) {
140
140
  throw err;
141
141
  }
142
142
  }, [showToast, overrides]);
143
+ /*
144
+ * 🛑 ABOVE the `children` short-circuit, for the same reason as its twin in
145
+ * `AdminOrdersView`: a hook below a conditional return does not run on every
146
+ * render, so the hook ORDER differs between the two paths and React reads one
147
+ * hook's state into another's slot.
148
+ *
149
+ * Spans every listing type unless the Type chips narrow it, which is what
150
+ * makes the middle tab read "Sold & Ended" here rather than one or the other.
151
+ */
152
+ const scope = useAvailabilityScope(ALL_LISTING_TYPES);
143
153
  if (React.Children.count(children) > 0) {
144
154
  return (_jsx(ListingLayout, { portal: "admin", ...props, children: children }));
145
155
  }
@@ -151,9 +161,6 @@ export function AdminProductsView({ children, ...props }) {
151
161
  void handleToggle(row.id, key, v);
152
162
  } }, key))) })),
153
163
  };
154
- // Spans every listing type unless the Type chips narrow it, which is what
155
- // makes the middle tab read "Sold & Ended" here rather than one or the other.
156
- const scope = useAvailabilityScope(ALL_LISTING_TYPES);
157
164
  const config = {
158
165
  portal: "admin",
159
166
  title: "Products",
@@ -69,7 +69,7 @@ export function AdminScammersView({ children, ...props }) {
69
69
  { value: sortBy("incidentCount", "DESC"), label: "Most incidents" },
70
70
  ],
71
71
  columns: SCAMMER_COLUMNS,
72
- mapRows: (response) => toRecordArray(response.scammers).map((item, index) => ({
72
+ mapRows: (response) => toRecordArray(response.items).map((item, index) => ({
73
73
  id: toStringValue(item.id, `scammer-${index}`),
74
74
  primary: Array.isArray(item.displayNames)
75
75
  ? item.displayNames.join(", ")
@@ -426,7 +426,6 @@ export function AdminSectionsView({ children }) {
426
426
  setCollectionCardsBuilder(pick(DEFAULT_COLLECTION_CARDS_BUILDER));
427
427
  break;
428
428
  }
429
- // eslint-disable-next-line react-hooks/exhaustive-deps -- 25 stable setters
430
429
  }, []);
431
430
  /*
432
431
  * Reset to the type's defaults when the admin picks a different type while
@@ -974,10 +973,6 @@ export function AdminSectionsView({ children }) {
974
973
  const sectionOrderMap = React.useMemo(() => {
975
974
  return new Map(sections.map((section) => [section.id, section.order]));
976
975
  }, [sections]);
977
- // If children exist, render passthrough mode (detail view)
978
- if (hasChildren) {
979
- return _jsx(_Fragment, { children: children });
980
- }
981
976
  // Map sections data to listing rows
982
977
  const rows = sections.map((section) => ({
983
978
  id: section.id,
@@ -1067,6 +1062,27 @@ export function AdminSectionsView({ children }) {
1067
1062
  onGoToSection: nav.goToSection,
1068
1063
  fieldToSectionIndex: nav.fieldToSectionIndex,
1069
1064
  });
1065
+ /*
1066
+ * Passthrough mode (detail view).
1067
+ *
1068
+ * 🛑 The short-circuit sits HERE, after every hook, rather than ~170 lines
1069
+ * up where it used to. Four hooks had accumulated below it — `modalSections`,
1070
+ * `draft`, `nav`, `form` — so passing children skipped all four and the hook
1071
+ * ORDER changed between the two render paths, which is how React ends up
1072
+ * reading one hook's state out of another's slot. The comment on
1073
+ * `sectionOrderMap` above is the record of this same bug being fixed once
1074
+ * already, one hook at a time.
1075
+ *
1076
+ * Moving the RETURN rather than the hooks is deliberate and costs nothing:
1077
+ * a hook must run on every render either way, so hoisting four declarations
1078
+ * past 170 lines of dependent state would do identical work with far more
1079
+ * room to reorder something by accident. `useFormShellState` claims no
1080
+ * bottom bar — `useFormBottomActions` lives in `SectionForm` — so running it
1081
+ * here has no side effect on the detail view below.
1082
+ */
1083
+ if (hasChildren) {
1084
+ return _jsx(_Fragment, { children: children });
1085
+ }
1070
1086
  return (_jsxs(_Fragment, { children: [_jsxs(Div, { paddingX: "x-sm-md", padding: "y-md", children: [_jsxs(Row, { className: "mb-4", align: "center", justify: "between", gap: "3", children: [_jsxs(Div, { children: [_jsx(Text, { size: "base", weight: "semibold", color: "primary", children: "Homepage Sections" }), _jsx(Text, { size: "sm", color: "muted", children: "Manage homepage sections and their display order" })] }), _jsx(Row, { align: "center", gap: "sm", children: _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => setIsModalOpen(true), children: "Manage Sections" }) })] }), errorMessage && (_jsx(Div, { textSize: "sm", className: "mb-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: errorMessage })), _jsx(DataTable, { rows: rows, isLoading: isLoading, emptyLabel: "No sections found" })] }), _jsxs(Stack, { className: `mt-4 ${__P.p4}`, gap: "3", rounded: "xl", surface: "default", border: "default", children: [_jsxs(Row, { align: "center", justify: "between", gap: "3", children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Reorder Sections" }), _jsxs(Row, { align: "center", gap: "sm", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: reindexDraft, disabled: reorderSections.isPending || reorderDraft.length === 0, children: "Reindex 1..N" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: undoReorderChange, disabled: reorderSections.isPending || !canUndoReorderChanges, children: "Undo unsaved" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: resetToServerOrder, disabled: reorderSections.isPending || !hasReorderChanges, children: "Reset to server" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => reorderSections.mutate(), disabled: !hasReorderChanges || reorderSections.isPending, children: reorderSections.isPending ? "Saving order..." : "Save order" })] })] }), reorderDraft.length === 0 ? (_jsx(Text, { size: "sm", color: "muted", children: "No sections to reorder." })) : (_jsx(Stack, { gap: "sm", children: reorderDraft.map((item, index) => (_jsxs(Div, { layout: "grid", gap: "2", align: "center", className: "grid-cols-[auto_1fr_auto_auto_auto]", rounded: "md", padding: "xs", border: "default", draggable: true, onDragStart: () => setDragIndex(index), onDragOver: (event) => event.preventDefault(), onDrop: () => handleReorderDrop(index), onDragEnd: () => setDragIndex(null), children: [_jsx(Text, { size: "sm", weight: "semibold", color: "muted", children: "\u2261" }), _jsxs(Text, { size: "sm", color: "primary", children: [item.type, " #", item.order] }), _jsx(Input, { type: "number", min: 1, max: reorderDraft.length, value: String(item.order), onChange: (event) => updateReorderItemOrder(index, Number(event.target.value) || 1), className: "w-24" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, -1), disabled: index === 0, children: "Up" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, 1), disabled: index === reorderDraft.length - 1, children: "Down" })] }, `reorder-${item.id}`))) }))] }), _jsx(Modal, { isOpen: isModalOpen, onClose: () => setIsModalOpen(false), title: "Manage Homepage Section", size: "lg", children: _jsxs(FormShellContext.Provider, { value: form.shellCtx, children: [_jsx(FormErrorSummary, {}), _jsx(SectionForm, { sections: modalSections, values: draft,
1071
1087
  /*
1072
1088
  * Each control writes through its own setter — `setMode`,
@@ -55,7 +55,7 @@ export function AdminSessionsView({ children, ...props }) {
55
55
  // Opening a row is what makes the destructive actions beside it
56
56
  // safe to offer at all.
57
57
  onRowClick: (row) => setDetail(row),
58
- mapRows: (response) => toRecordArray(response.sessions).map((item, index) => {
58
+ mapRows: (response) => toRecordArray(response.items).map((item, index) => {
59
59
  const deviceInfo = (item.deviceInfo ?? {});
60
60
  const userLabel = toStringValue(item.user &&
61
61
  item.user?.displayName, toStringValue(item.userId, `user-${index}`));
@@ -11,7 +11,19 @@ export function AdminSublistingCategoriesView({ onBulkDelete, }) {
11
11
  const config = {
12
12
  portal: "admin",
13
13
  title: "Sub-listing Categories",
14
- // Search intentionally absent: this endpoint does not read `q`, so the box accepted typing and changed nothing. Restore it when the collection gains searchTxt — audit-listing-search-capability tracks it.
14
+ /*
15
+ * Restored 2026-10-17, same reasoning as `AdminBrandsView`. `itemCode` is
16
+ * named because it is genuinely in `buildCategorySearchTxt`'s source list —
17
+ * the store-side sibling route was reaching for exactly that lookup with an
18
+ * in-memory `.includes()` over one page, which could not find a code that
19
+ * sorted past the page boundary.
20
+ */
21
+ search: {
22
+ placeholder: "Search by name, item code or description…",
23
+ mode: "partial",
24
+ fields: ["name", "itemCode", "description"],
25
+ commit: "debounce",
26
+ },
15
27
  emptyLabel: "No sub-listing categories found",
16
28
  filterKeys: [],
17
29
  defaultSort: sortBy("name", "ASC"),
@@ -38,6 +50,15 @@ export function AdminSublistingCategoriesView({ onBulkDelete, }) {
38
50
  getTotal: (response, mappedRows) => typeof response.total === "number" ? response.total : mappedRows.length,
39
51
  buildFilters: () => undefined,
40
52
  rowHrefTemplate: String(ROUTES.ADMIN.SUBLISTING_CATEGORIES_EDIT("{id}")),
53
+ /*
54
+ * `/admin/sublisting-categories/new`, its ROUTES key and its POST route all
55
+ * already existed — the list simply never linked to them, so the page was
56
+ * reachable only by typing the URL (Root Cause #37's shape).
57
+ */
58
+ primaryAction: {
59
+ label: "Add Sub-listing Category",
60
+ href: String(ROUTES.ADMIN.SUBLISTING_CATEGORIES_NEW),
61
+ },
41
62
  buildBulkActions: onBulkDelete
42
63
  ? (selection) => [
43
64
  buildBulkAction(ACTIONS.ADMIN["delete-sublisting-category"], async () => {
@@ -78,7 +78,7 @@ export function AdminTeamView({ children, onBulkRemove, ...props }) {
78
78
  { value: sortBy("createdAt", "ASC"), label: "Oldest" },
79
79
  { value: "displayName", label: "Name A–Z" },
80
80
  ],
81
- mapRows: (response) => toRecordArray(response.users).map((item, index) => ({
81
+ mapRows: (response) => toRecordArray(response.items).map((item, index) => ({
82
82
  id: toStringValue(item.id ?? item.uid, `employee-${index}`),
83
83
  primary: toStringValue(item.displayName, "Unnamed employee"),
84
84
  secondary: [
@@ -71,7 +71,6 @@ export function AdminTesterChecklistItemEditorView({ itemId, onSaved, onDeleted,
71
71
  isActive: item.isActive ?? true,
72
72
  adminOnly: item.adminOnly ?? false,
73
73
  });
74
- // eslint-disable-next-line react-hooks/exhaustive-deps
75
74
  }, [itemQuery.data]);
76
75
  const saveMutation = useApiMutation({
77
76
  errorMessage: "Failed to save checklist item.",
@@ -120,7 +120,7 @@ export function AdminUsersView({ children, ...props }) {
120
120
  { value: sortBy("createdAt", "ASC"), label: "Oldest" },
121
121
  { value: "displayName", label: "Name A–Z" },
122
122
  ],
123
- mapRows: (response) => toRecordArray(response.users).map((item, index) => {
123
+ mapRows: (response) => toRecordArray(response.items).map((item, index) => {
124
124
  const isDisabled = Boolean(item.isDisabled ?? item.disabled);
125
125
  const isHardBanned = isDisabled && Boolean(item.hardBanReason);
126
126
  const softBanCount = Array.isArray(item.softBans) ? item.softBans.length : 0;
@@ -136,9 +136,10 @@ export interface ListingViewConfig<TResponse, TRow extends {
136
136
  renderCards?: (rows: TRow[], view: "grid" | "list", selection: ListingSelectionContext<TRow>, isLoading: boolean) => React.ReactNode;
137
137
  primaryAction?: {
138
138
  label: string;
139
- onClick: (panel: {
139
+ onClick?: (panel: {
140
140
  openCreatePanel: () => void;
141
141
  }) => void;
142
+ href?: string;
142
143
  icon?: React.ReactNode;
143
144
  };
144
145
  /** Extra arbitrary content in the toolbar (e.g. export buttons). Rendered alongside primaryAction. */
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Plus } from "lucide-react";
4
- import { BulkActionBar, Button, Div, ListingFilterDrawer, ListingToolbar, Pagination, Row, SideDrawer, StickyToolbar } from "../../../ui/index.js";
4
+ import { BulkActionBar, Button, Div, ListingFilterDrawer, ListingToolbar, Pagination, Row, SideDrawer, StickyToolbar, TextLink } from "../../../ui/index.js";
5
5
  import { useBottomActions } from "../../layout/index.js";
6
6
  import { useAdminListing } from "../hooks/useAdminListing.js";
7
7
  import { getResourceIcon } from "../../../ui/columns/column-renderers.js";
@@ -91,9 +91,14 @@ export function DataListingView({ config, }) {
91
91
  // Passing this is what renders the box — ListingToolbar gates on it.
92
92
  // Undefined when the config declares no search, so a view whose
93
93
  // endpoint cannot search no longer shows an input that does nothing.
94
- onSearchChange: searchEnabled ? setSearchInput : undefined, onSearchCommit: searchEnabled ? commitSearch : undefined, sortValue: table.get("sort") || config.defaultSort, sortOptions: config.sortOptions, onSortChange: (v) => table.set("sort", v), showTableView: !config.hideTableView, toggles: config.toggles, view: view, onViewChange: (v) => setView(v), onResetAll: resetAll, hasActiveState: hasActiveState, extra: config.primaryAction || config.toolbarExtra ? (_jsxs(Row, { align: "center", gap: "sm", children: [config.toolbarExtra, config.primaryAction && (_jsxs(Button, { gap: "sm", size: "sm", onClick: () => config.primaryAction.onClick({
95
- openCreatePanel: panel.openCreatePanel,
96
- }), children: [config.primaryAction.icon ?? _jsx(Plus, { className: "h-4 w-4" }), config.primaryAction.label] }))] })) : undefined }), config.renderAboveContent?.(), bulkActionItems && (_jsx(BulkActionBar, { selectedCount: selection.selectedCount, onClearSelection: selection.clearSelection, actions: bulkActionItems })), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: (p) => table.setPage(p), pageSize: pageSize, onPageSizeChange: setPageSize, paginationConfig: { showPageSizeSelector: true, pageSizeOptions: [10, 25, 50, 100] } }) }) })), _jsxs(Div, { paddingX: "x-sm-md", padding: "y-md", children: [errorMessage && (_jsx(Div, { textSize: "sm", className: "mb-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: errorMessage })), view === "table" && !config.hideTableView && !isMobile ? (_jsx(DataTable, { columns: config.columns, rows: rows, resourceIcon: resourceIcon, isLoading: isLoading, emptyLabel: config.emptyLabel ?? `No ${config.title.toLowerCase()} found`, selectedIds: selection.selectedIdSet, onToggleSelect: selection.toggle, onToggleSelectAll: (next) => next
94
+ onSearchChange: searchEnabled ? setSearchInput : undefined, onSearchCommit: searchEnabled ? commitSearch : undefined, sortValue: table.get("sort") || config.defaultSort, sortOptions: config.sortOptions, onSortChange: (v) => table.set("sort", v), showTableView: !config.hideTableView, toggles: config.toggles, view: view, onViewChange: (v) => setView(v), onResetAll: resetAll, hasActiveState: hasActiveState, extra: config.primaryAction || config.toolbarExtra ? (_jsxs(Row, { align: "center", gap: "sm", children: [config.toolbarExtra, config.primaryAction &&
95
+ (config.primaryAction.href ? (
96
+ // `asChild` so the create PAGE is a real anchor — middle-click
97
+ // and copy-link work, and it is not a button that happens to
98
+ // navigate (a Known-TS-Pattern this repo bans outright).
99
+ _jsx(Button, { gap: "sm", size: "sm", asChild: true, children: _jsxs(TextLink, { variant: "inherit", href: config.primaryAction.href, children: [config.primaryAction.icon ?? _jsx(Plus, { className: "h-4 w-4" }), config.primaryAction.label] }) })) : (_jsxs(Button, { gap: "sm", size: "sm", onClick: () => config.primaryAction.onClick?.({
100
+ openCreatePanel: panel.openCreatePanel,
101
+ }), children: [config.primaryAction.icon ?? _jsx(Plus, { className: "h-4 w-4" }), config.primaryAction.label] })))] })) : undefined }), config.renderAboveContent?.(), bulkActionItems && (_jsx(BulkActionBar, { selectedCount: selection.selectedCount, onClearSelection: selection.clearSelection, actions: bulkActionItems })), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: (p) => table.setPage(p), pageSize: pageSize, onPageSizeChange: setPageSize, paginationConfig: { showPageSizeSelector: true, pageSizeOptions: [10, 25, 50, 100] } }) }) })), _jsxs(Div, { paddingX: "x-sm-md", padding: "y-md", children: [errorMessage && (_jsx(Div, { textSize: "sm", className: "mb-4 border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: errorMessage })), view === "table" && !config.hideTableView && !isMobile ? (_jsx(DataTable, { columns: config.columns, rows: rows, resourceIcon: resourceIcon, isLoading: isLoading, emptyLabel: config.emptyLabel ?? `No ${config.title.toLowerCase()} found`, selectedIds: selection.selectedIdSet, onToggleSelect: selection.toggle, onToggleSelectAll: (next) => next
97
102
  ? selection.setSelectedIds(rows.map((r) => r.id))
98
103
  : selection.clearSelection(), rowHrefTemplate: config.rowHrefTemplate, onRowClick: config.onRowClick
99
104
  ? (row) => config.onRowClick(row, {
@@ -8,11 +8,9 @@ import { ADMIN_ENDPOINTS } from "../../../../constants/api-endpoints.js";
8
8
  import { PAGE_VIEW_ENTITY_TYPES } from "../../../analytics/types.js";
9
9
  const ENTITY_TYPE_OPTIONS = PAGE_VIEW_ENTITY_TYPES.map((t) => ({ value: t, label: t }));
10
10
  function today() {
11
- // eslint-disable-next-line lir/no-raw-date
12
11
  return new Date().toISOString().slice(0, 10);
13
12
  }
14
13
  function daysAgo(n) {
15
- // eslint-disable-next-line lir/no-raw-date
16
14
  const d = new Date();
17
15
  d.setDate(d.getDate() - n);
18
16
  return d.toISOString().slice(0, 10);
@@ -69,7 +69,7 @@ export declare function useAdminListing<TResponse, TRow extends {
69
69
  refetch: () => void;
70
70
  currentPage: number;
71
71
  totalPages: number;
72
- selection: import("../../../client").UseBulkSelectionReturn;
72
+ selection: import("../../../react").UseBulkSelectionReturn;
73
73
  defaultSort: string;
74
74
  pageSize: number;
75
75
  setPageSize: (next: number) => void;
@@ -6,7 +6,14 @@ import { serverLogger } from "../../../monitoring/server-logger.js";
6
6
  * Manages site-wide configuration settings (singleton document)
7
7
  */
8
8
  import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase/index.js";
9
- import { cacheManager } from "../../../core/index.js";
9
+ /*
10
+ * The DEFINING module, not the `core` barrel — Root Cause #18. `core/index.ts`
11
+ * re-exports `unitOfWork`, which imports this very repository, so reaching
12
+ * `cacheManager` through the barrel closed a six-module import cycle
13
+ * (`audit-import-cycles` component 2). `CacheManager.ts` imports nothing from
14
+ * here, so the deep path has one direction only.
15
+ */
16
+ import { cacheManager } from "../../../core/CacheManager.js";
10
17
  import { SITE_SETTINGS_COLLECTION, DEFAULT_SITE_SETTINGS_DATA, } from "../schemas/index.js";
11
18
  import { DatabaseError } from "../../../errors/index.js";
12
19
  import { decryptSecret, encryptSecret, maskSecret } from "../../../security/index.js";
@@ -73,13 +80,11 @@ export class SiteSettingsRepository extends BaseRepository {
73
80
  const encrypted = { ...existing };
74
81
  for (const [key, value] of Object.entries(updates)) {
75
82
  if (typeof value === "string" && value.trim()) {
76
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
83
  encrypted[key] = encryptSecret(value.trim());
78
84
  }
79
85
  else if (value !== undefined && typeof value !== "string") {
80
86
  // Non-string credential fields (e.g. whatsappTemplates: Record<string,string>)
81
87
  // are stored as-is — they are not secret values to encrypt.
82
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
88
  encrypted[key] = value;
84
89
  }
85
90
  // Empty / undefined → keep whatever was already stored
@@ -14,7 +14,7 @@ export type NotificationType = (typeof NOTIFICATION_TYPE_VALUES)[number];
14
14
  * Runtime array for the same reason as the type union above — and
15
15
  * `catalogueItem` was being sent with an `as never` cast rather than added.
16
16
  */
17
- export declare const NOTIFICATION_RELATED_TYPE_VALUES: readonly ["order", "product", "bid", "review", "blog", "user", "offer", "support_ticket", "scammer", "catalogueItem", "payout", "store", "conversation"];
17
+ export declare const NOTIFICATION_RELATED_TYPE_VALUES: readonly ["order", "product", "bid", "review", "blog", "user", "offer", "support_ticket", "scammer", "catalogueItem", "payout", "store", "conversation", "event"];
18
18
  export type NotificationRelatedType = (typeof NOTIFICATION_RELATED_TYPE_VALUES)[number];
19
19
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
20
20
  export type NotificationPriority = "low" | "normal" | "high";
@@ -525,6 +525,46 @@ export interface SiteSettingsDocument extends BaseDocument {
525
525
  chat?: {
526
526
  enabled: boolean;
527
527
  };
528
+ /**
529
+ * The public search index — the browser-side artifact, not the per-listing
530
+ * search boxes, which this flag cannot reach.
531
+ *
532
+ * ## 🛑 Why a group of its own and not `featureFlags`
533
+ *
534
+ * The plan for this feature said "a kill switch in `siteSettings.featureFlags`".
535
+ * That group was DELETED on 2026-08-29 because 11 of its 14 keys had zero
536
+ * readers, and the two survivors moved into `payment` as real settings. Its
537
+ * deletion note draws the line this honours: *"A flag is a temporary switch
538
+ * around unfinished work."* This is exactly that — so it is a flag, and it
539
+ * earns the one thing the deleted keys could not show: a named reader
540
+ * (`useSearchIndex`).
541
+ *
542
+ * 🛑 It is NOT in `payment` or any other existing group, and that is
543
+ * defensive rather than tidy. `AdminSiteSettingsView.buildFullPayload`
544
+ * writes `payment: { phonepeEnabled, upiManualEnabled, codEnabled,
545
+ * otpCheckoutThreshold }` — the WHOLE group, from four pieces of form
546
+ * state — so any fifth key in there is silently erased the next time an
547
+ * admin saves anything on that page (Root Cause #76). A kill switch that a
548
+ * routine save turns back on is worse than none, because it fails in the
549
+ * direction of the thing it exists to stop.
550
+ *
551
+ * ## 🛑 Default ON — the opposite polarity to `chat.enabled`
552
+ *
553
+ * `chat` is an opt-in feature and its readers test `=== true`. This is a
554
+ * kill switch on the primary path, so its reader tests `!== false`: an
555
+ * absent field, an unseeded document and a failed settings fetch must all
556
+ * mean "search works". The only state that disables it is somebody
557
+ * deliberately writing `false`.
558
+ *
559
+ * Recovery exists because the index can be wrong in a way nothing errors
560
+ * on — a bad patch, a schema the client does not understand — and the
561
+ * alternative route back is a Vercel deploy. Flipping this sends every
562
+ * client to the server `SEARCH_SOURCES` path, which is why that path is
563
+ * kept rather than deleted.
564
+ */
565
+ search?: {
566
+ indexEnabled?: boolean;
567
+ };
528
568
  emailSettings: {
529
569
  fromName: string;
530
570
  fromEmail: string;
@@ -756,6 +796,27 @@ export declare const SITE_SETTINGS_INDEXED_FIELDS: readonly [];
756
796
  */
757
797
  export declare const DEFAULT_SITE_SETTINGS_THEME: SiteSettingsTheme;
758
798
  export declare const DEFAULT_SITE_SETTINGS_DATA: Partial<SiteSettingsDocument>;
799
+ /**
800
+ * 🛑 DEAD, AND IT DISAGREES WITH THE REAL PROJECTION. Do not add to it.
801
+ *
802
+ * Measured 2026-10-19 while adding `search`: this constant has **zero
803
+ * consumers** — it is re-exported from the barrel and read by nothing. The
804
+ * list that actually decides what leaves the server is
805
+ * `PUBLIC_SITE_SETTINGS_FIELDS` in
806
+ * `_internal/server/features/site-settings/adapters.ts`, which is audited by
807
+ * `audit-public-projection-parity`.
808
+ *
809
+ * The two already disagree, in the dangerous direction: this one names
810
+ * `commissions` (the real projection marks it PRIVATE — "internal economics")
811
+ * and `featureFlags`, a settings group DELETED in 2026-08-29. So anyone who
812
+ * reached for it as authoritative would publish platform fee structure and
813
+ * key a feature off a group that no longer exists.
814
+ *
815
+ * Left in place rather than deleted here only because removing a barrel
816
+ * export is a breaking change that needs its own version bump; it belongs
817
+ * with the other search-subsystem deletions. Adding a field to it would make
818
+ * it look maintained, which is the one thing it must not look.
819
+ */
759
820
  export declare const SITE_SETTINGS_PUBLIC_FIELDS: readonly ["siteName", "motto", "logo", "background", "contact.email", "contact.phone", "payment", "commissions", "socialLinks", "seo", "features", "featureFlags", "faq.variables", "announcementBar"];
760
821
  export type SiteSettingsUpdateInput = Partial<Omit<SiteSettingsDocument, "id" | "createdAt" | "updatedAt">>;
761
822
  export declare const DEFAULT_TRUST_BAR_ITEMS: TrustBarItem[];
@@ -114,6 +114,17 @@ export const NOTIFICATION_RELATED_TYPE_VALUES = [
114
114
  "store",
115
115
  // D9 — the chat thread the message belongs to.
116
116
  "conversation",
117
+ /*
118
+ * The event a raffle win belongs to. Added 2026-10-19 with the raffle-winner
119
+ * notification: `runTriggerEventRaffle` recorded a winner and told nobody,
120
+ * so the only way to learn you had won was to revisit the event page.
121
+ *
122
+ * Declared here rather than sent behind an `as never` — see the note above
123
+ * this array about `catalogueItem`, and the exhaustiveness check in
124
+ * `resolveNotificationActionUrl` that makes the destination a compile-time
125
+ * question.
126
+ */
127
+ "event",
117
128
  ];
118
129
  export const NOTIFICATIONS_COLLECTION = "notifications";
119
130
  export const NOTIFICATIONS_INDEXED_FIELDS = [
@@ -337,6 +348,27 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
337
348
  navConfig: {},
338
349
  disabledRoutes: [],
339
350
  };
351
+ /**
352
+ * 🛑 DEAD, AND IT DISAGREES WITH THE REAL PROJECTION. Do not add to it.
353
+ *
354
+ * Measured 2026-10-19 while adding `search`: this constant has **zero
355
+ * consumers** — it is re-exported from the barrel and read by nothing. The
356
+ * list that actually decides what leaves the server is
357
+ * `PUBLIC_SITE_SETTINGS_FIELDS` in
358
+ * `_internal/server/features/site-settings/adapters.ts`, which is audited by
359
+ * `audit-public-projection-parity`.
360
+ *
361
+ * The two already disagree, in the dangerous direction: this one names
362
+ * `commissions` (the real projection marks it PRIVATE — "internal economics")
363
+ * and `featureFlags`, a settings group DELETED in 2026-08-29. So anyone who
364
+ * reached for it as authoritative would publish platform fee structure and
365
+ * key a feature off a group that no longer exists.
366
+ *
367
+ * Left in place rather than deleted here only because removing a barrel
368
+ * export is a breaking change that needs its own version bump; it belongs
369
+ * with the other search-subsystem deletions. Adding a field to it would make
370
+ * it look maintained, which is the one thing it must not look.
371
+ */
340
372
  export const SITE_SETTINGS_PUBLIC_FIELDS = [
341
373
  "siteName",
342
374
  "motto",
@@ -23,7 +23,7 @@ export interface DashboardStats {
23
23
  export interface AdminListParams {
24
24
  q?: string;
25
25
  page?: number;
26
- perPage?: number;
26
+ pageSize?: number;
27
27
  sort?: string;
28
28
  filters?: string;
29
29
  }
@@ -1,4 +1,4 @@
1
- import type { BidDocument } from "../schemas";
1
+ import type { BidDocument, BidPlain } from "../schemas";
2
2
  import type { FirebaseSieveResult } from "../../../providers/db-firebase";
3
3
  export interface PlaceBidInput {
4
4
  productId: string;
@@ -6,7 +6,7 @@ export interface PlaceBidInput {
6
6
  autoMaxBid?: number;
7
7
  }
8
8
  export interface PlaceBidResult {
9
- bid: BidDocument;
9
+ bid: BidPlain;
10
10
  }
11
11
  export declare function placeBid(userId: string, userEmail: string, input: PlaceBidInput): Promise<PlaceBidResult>;
12
12
  export interface BuyNowAuctionInput {
@@ -150,12 +150,18 @@ export async function placeBid(userId, userEmail, input) {
150
150
  visibleBid = newCap;
151
151
  bumpedPreviousVisible = Math.min(prevCap, target);
152
152
  }
153
- const bid = await bidRepository.create({
153
+ const bid = await bidRepository.createBid({
154
154
  productId,
155
155
  productTitle: product.title,
156
156
  userId,
157
157
  userName: profile?.displayName ?? userEmail ?? "Anonymous",
158
- userEmail: profile?.email ?? userEmail ?? "",
158
+ /*
159
+ * 🛑 Revealed, not passed through. `profile` comes from a user read, which
160
+ * is ciphertext-by-default now — and `createBid` ENCRYPTS what it is given,
161
+ * so the raw value would be encrypted a SECOND time and become
162
+ * undecryptable. The `userEmail` parameter is already plaintext.
163
+ */
164
+ userEmail: (profile ? userRepository.revealUser(profile).email : null) ?? userEmail ?? "",
159
165
  bidAmount: visibleBid,
160
166
  currency: product.currency || getDefaultCurrency(),
161
167
  bidDate: new Date(),
@@ -333,12 +339,18 @@ export async function buyNowAuction(userId, userName, userEmail, input) {
333
339
  // buyout price by the buyer" means. It starts `active`/`isWinning: false`
334
340
  // like any other bid (bidRepository.create forces both) and is promoted to
335
341
  // `won` by claimAuctionForCheckout when the order actually lands.
336
- const bid = await bidRepository.create({
342
+ const bid = await bidRepository.createBid({
337
343
  productId,
338
344
  productTitle: product.title,
339
345
  userId,
340
346
  userName: profile?.displayName ?? userName ?? userEmail ?? "Anonymous",
341
- userEmail: profile?.email ?? userEmail ?? "",
347
+ /*
348
+ * 🛑 Revealed, not passed through. `profile` comes from a user read, which
349
+ * is ciphertext-by-default now — and `createBid` ENCRYPTS what it is given,
350
+ * so the raw value would be encrypted a SECOND time and become
351
+ * undecryptable. The `userEmail` parameter is already plaintext.
352
+ */
353
+ userEmail: (profile ? userRepository.revealUser(profile).email : null) ?? userEmail ?? "",
342
354
  bidAmount: buyNowPrice,
343
355
  currency,
344
356
  bidDate: new Date(),
@@ -50,7 +50,7 @@ export async function GET(request) {
50
50
  filters,
51
51
  sort,
52
52
  page,
53
- perPage: pageSize,
53
+ pageSize: pageSize,
54
54
  });
55
55
  const body = {
56
56
  items: result.data,
@@ -80,6 +80,10 @@ export function AuctionBottomActions(props) {
80
80
  ? `${formatCurrency(currentBid, currency)} · ${bidCount} bid${bidCount !== 1 ? "s" : ""}`
81
81
  : `Sign in to see the bid · ${bidCount} bid${bidCount !== 1 ? "s" : ""}`,
82
82
  desktop: "after-scroll",
83
+ // The inline bid panel on the detail page. The dock stays shut until
84
+ // a bidder has actually seen it and scrolled past — beside it, the
85
+ // dock would just be a second "Place bid" button.
86
+ ctaAnchorId: "auction-bid-form",
83
87
  });
84
88
  return (_jsx(Modal, { isOpen: open, onClose: () => setOpen(false), size: "md", title: "Place your bid", children: _jsx(PlaceBidFormClient, { ...props }) }));
85
89
  }