@mohasinac/appkit 4.52.5 → 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 (630) 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 +11 -0
  336. package/dist/features/layout/AppLayoutShell.js +64 -12
  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.js +1 -1
  348. package/dist/features/layout/cta-anchor.d.ts +31 -0
  349. package/dist/features/layout/cta-anchor.js +31 -0
  350. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  351. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  352. package/dist/features/layout/index.d.ts +9 -1
  353. package/dist/features/layout/index.js +9 -1
  354. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  355. package/dist/features/layout/useCtaReveal.js +82 -0
  356. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  357. package/dist/features/layout/useHoldToOpen.js +84 -0
  358. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  359. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  360. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  361. package/dist/features/loyalty/api/balance/route.js +1 -1
  362. package/dist/features/loyalty/api/history/route.js +1 -1
  363. package/dist/features/media/MediaImage.js +0 -1
  364. package/dist/features/media/MediaPickerModal.js +7 -1
  365. package/dist/features/media/modals/ImageEditor.js +5 -1
  366. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  367. package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
  368. package/dist/features/media/upload/CameraCapture.js +16 -1
  369. package/dist/features/media/upload/ImageUpload.js +42 -4
  370. package/dist/features/media/upload/MediaUploadField.js +69 -13
  371. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  372. package/dist/features/media/upload/downscale-image.js +150 -0
  373. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  374. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  375. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  376. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  377. package/dist/features/orders/hooks/useOrders.js +4 -2
  378. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  379. package/dist/features/orders/repository/orders.repository.js +52 -20
  380. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  381. package/dist/features/orders/schemas/index.d.ts +8 -8
  382. package/dist/features/orders/types/index.d.ts +2 -2
  383. package/dist/features/payments/repository/payments.repository.js +2 -2
  384. package/dist/features/payments/repository/payout.repository.d.ts +23 -6
  385. package/dist/features/payments/repository/payout.repository.js +63 -23
  386. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  387. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  388. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  389. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  390. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  391. package/dist/features/pre-orders/api/admin/route.js +1 -1
  392. package/dist/features/pre-orders/api/route.js +1 -1
  393. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  394. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  395. package/dist/features/products/api/[id]/route.js +1 -1
  396. package/dist/features/products/components/ListingBottomActions.js +4 -0
  397. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  398. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  399. package/dist/features/products/components/ProductGrid.js +12 -1
  400. package/dist/features/products/components/index.d.ts +0 -2
  401. package/dist/features/products/components/index.js +0 -1
  402. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  403. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  404. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  405. package/dist/features/products/constants/listing-tabs.js +3 -2
  406. package/dist/features/products/hooks/useProducts.js +2 -2
  407. package/dist/features/products/repository/products.repository.js +13 -1
  408. package/dist/features/products/schemas/index.d.ts +2 -2
  409. package/dist/features/products/types/index.d.ts +1 -1
  410. package/dist/features/promotions/api/route.js +1 -1
  411. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  412. package/dist/features/reviews/actions/review-actions.js +22 -8
  413. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  414. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  415. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  416. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  417. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  418. package/dist/features/reviews/schemas/index.d.ts +2 -2
  419. package/dist/features/scams/actions/scam-actions.js +16 -4
  420. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  421. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  422. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  423. package/dist/features/search/repository/search.repository.js +2 -2
  424. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  425. package/dist/features/seller/actions/offer-actions.js +38 -8
  426. package/dist/features/seller/actions/seller-actions.js +34 -7
  427. package/dist/features/seller/api/coupons/route.js +1 -1
  428. package/dist/features/seller/api/products/route.js +1 -1
  429. package/dist/features/seller/api/store/route.js +1 -1
  430. package/dist/features/seller/components/SellerBidsView.js +1 -1
  431. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  432. package/dist/features/seller/components/SellerListingTypeView.js +9 -1
  433. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  434. package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
  435. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  436. package/dist/features/seller/components/SellerProductShell.js +0 -1
  437. package/dist/features/seller/components/SellerProductsView.js +1 -1
  438. package/dist/features/seller/components/SellerShippingView.js +0 -1
  439. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  440. package/dist/features/seller/components/index.d.ts +0 -4
  441. package/dist/features/seller/components/index.js +0 -2
  442. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  443. package/dist/features/seller/repository/offer.repository.js +43 -7
  444. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  445. package/dist/features/seller/schemas/index.d.ts +4 -4
  446. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  447. package/dist/features/seller/schemas/order-forms.js +37 -0
  448. package/dist/features/shell/FormShell.js +6 -2
  449. package/dist/features/shell/QuickFormDrawer.js +15 -1
  450. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  451. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  452. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  453. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  454. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  455. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  456. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  457. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  458. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  459. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  460. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  461. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  462. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  463. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  464. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  465. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  466. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  467. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  468. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  469. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  470. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  471. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  472. package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
  473. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  474. package/dist/features/sticker-trace/server.d.ts +8 -0
  475. package/dist/features/sticker-trace/server.js +51 -0
  476. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  477. package/dist/features/stores/actions/store-query-actions.js +7 -2
  478. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  479. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  480. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  481. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  482. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  483. package/dist/features/stores/manifest.js +8 -4
  484. package/dist/features/support/repository/support.repository.d.ts +14 -3
  485. package/dist/features/support/repository/support.repository.js +93 -13
  486. package/dist/features/support/schemas/firestore.d.ts +16 -5
  487. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  488. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  489. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  490. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
  491. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  492. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  493. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  494. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  495. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  496. package/dist/features/tester/seed-data/authored/index.js +8 -0
  497. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  498. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  499. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  500. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
  501. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +192 -22
  502. package/dist/index.d.ts +10 -23
  503. package/dist/index.js +27 -19
  504. package/dist/next/api/routeHandler.js +9 -0
  505. package/dist/next/routing/require-record.d.ts +13 -0
  506. package/dist/next/routing/require-record.js +62 -0
  507. package/dist/next/routing/route-map.d.ts +4 -4
  508. package/dist/next/routing/route-map.js +25 -3
  509. package/dist/providers/db-firebase/base.d.ts +4 -2
  510. package/dist/providers/db-firebase/base.js +21 -5
  511. package/dist/providers/db-firebase/base.repository.d.ts +11 -9
  512. package/dist/providers/db-firebase/base.repository.js +19 -0
  513. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  514. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  515. package/dist/react/ErrorBoundary.js +6 -1
  516. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  517. package/dist/react/hooks/realtime-event-constants.js +8 -0
  518. package/dist/react/hooks/useEntityDelete.js +5 -1
  519. package/dist/react/hooks/useMessage.js +5 -1
  520. package/dist/repositories/index.d.ts +2 -2
  521. package/dist/repositories/index.js +6 -1
  522. package/dist/schemas/registry.d.ts +13 -20
  523. package/dist/schemas/registry.js +31 -14
  524. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  525. package/dist/security/encrypted.d.ts +117 -0
  526. package/dist/security/encrypted.js +100 -0
  527. package/dist/security/index.d.ts +5 -2
  528. package/dist/security/index.js +16 -2
  529. package/dist/security/pii-accessors.d.ts +71 -0
  530. package/dist/security/pii-accessors.js +150 -0
  531. package/dist/security/pii-encrypt.d.ts +0 -8
  532. package/dist/security/pii-encrypt.js +22 -15
  533. package/dist/security/pii-mask.d.ts +18 -0
  534. package/dist/security/pii-mask.js +27 -0
  535. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  536. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  537. package/dist/seed/addresses-seed-data.d.ts +2 -2
  538. package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
  539. package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
  540. package/dist/seed/bids-seed-data.d.ts +2 -2
  541. package/dist/seed/bids-seed-data.js +23 -2
  542. package/dist/seed/events-seed-data.d.ts +2 -2
  543. package/dist/seed/events-seed-data.js +5 -0
  544. package/dist/seed/faq-seed-data.js +175 -5
  545. package/dist/seed/homepage-sections-seed-data.js +39 -23
  546. package/dist/seed/index.d.ts +1 -0
  547. package/dist/seed/index.js +1 -0
  548. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  549. package/dist/seed/offers-seed-data.d.ts +2 -2
  550. package/dist/seed/offers-seed-data.js +1 -1
  551. package/dist/seed/orders-seed-data.d.ts +2 -2
  552. package/dist/seed/payouts-seed-data.d.ts +2 -2
  553. package/dist/seed/payouts-seed-data.js +1 -1
  554. package/dist/seed/reviews-seed-data.d.ts +1 -2
  555. package/dist/seed/seed-purpose.js +7 -0
  556. package/dist/seed/sessions-seed-data.d.ts +2 -2
  557. package/dist/seed/sessions-seed-data.js +5 -0
  558. package/dist/seed/site-settings-seed-data.js +1 -1
  559. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  560. package/dist/seed/support-tickets-seed-data.js +1 -1
  561. package/dist/seed/users-seed-data.d.ts +2 -2
  562. package/dist/seed/users-seed-data.js +1 -1
  563. package/dist/seo/json-ld.js +5 -1
  564. package/dist/server.d.ts +18 -3
  565. package/dist/server.js +59 -3
  566. package/dist/styles.css +237 -1
  567. package/dist/tailwind-utilities.css +1 -1
  568. package/dist/ui/components/Button.js +7 -1
  569. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  570. package/dist/ui/components/FilterChipGroup.js +1 -1
  571. package/dist/ui/components/ImageGallery.js +6 -1
  572. package/dist/ui/components/ListingLayout.js +14 -8
  573. package/dist/ui/components/OverflowRow.d.ts +92 -0
  574. package/dist/ui/components/OverflowRow.js +203 -0
  575. package/dist/ui/components/OverflowRow.style.css +235 -0
  576. package/dist/ui/components/RecordDetailModal.js +14 -1
  577. package/dist/ui/components/RowActionMenu.js +5 -1
  578. package/dist/ui/components/SideDrawer.js +5 -1
  579. package/dist/ui/components/SideModal.js +9 -1
  580. package/dist/ui/components/TabBarShell.d.ts +12 -1
  581. package/dist/ui/components/TabBarShell.js +3 -2
  582. package/dist/ui/components/Tabs.js +36 -24
  583. package/dist/ui/components/Toast.d.ts +3 -24
  584. package/dist/ui/components/Toast.js +2 -19
  585. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  586. package/dist/ui/components/TopBannerPortal.js +19 -0
  587. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  588. package/dist/ui/components/index.style.css +1 -0
  589. package/dist/ui/components/row-collapse.d.ts +15 -0
  590. package/dist/ui/components/row-collapse.js +127 -0
  591. package/dist/ui/components/toast-context.d.ts +63 -0
  592. package/dist/ui/components/toast-context.js +48 -0
  593. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  594. package/dist/ui/components/top-banner-slot.js +45 -0
  595. package/dist/ui/icons/icon-registry.d.ts +6 -0
  596. package/dist/ui/icons/icon-registry.js +17 -1
  597. package/dist/ui/index.d.ts +2 -0
  598. package/dist/ui/index.js +1 -0
  599. package/dist/utils/array.helper.d.ts +2 -2
  600. package/dist/utils/array.helper.js +5 -5
  601. package/dist/utils/id-generators.d.ts +6 -0
  602. package/dist/utils/id-generators.js +10 -0
  603. package/dist/utils/media-url.js +0 -2
  604. package/dist/utils/search-txt-builders.d.ts +28 -4
  605. package/dist/utils/search-txt-builders.js +41 -1
  606. package/dist/validation/schemas.d.ts +8 -8
  607. package/package.json +6 -2
  608. package/scripts/seed-cli.mjs +3 -0
  609. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  610. package/dist/features/account/components/UserAddressesView.js +0 -5
  611. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  612. package/dist/features/account/components/UserNotificationsView.js +0 -12
  613. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  614. package/dist/features/account/components/UserSettingsView.js +0 -13
  615. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  616. package/dist/features/account/components/UserSupportView.js +0 -166
  617. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  618. package/dist/features/admin/components/DemoSeedView.js +0 -5
  619. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  620. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  621. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  622. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  623. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  624. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  625. package/dist/features/layout/BottomActions.d.ts +0 -1
  626. package/dist/features/layout/BottomActions.js +0 -311
  627. package/dist/features/products/components/ProductsView.d.ts +0 -6
  628. package/dist/features/products/components/ProductsView.js +0 -5
  629. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  630. package/dist/features/seller/components/SellerStoreView.js +0 -8
@@ -29,6 +29,7 @@ export { paymentReviewAutoApproveHandler } from "./paymentReviewAutoApprove";
29
29
  export { productStatsSyncHandler } from "./productStatsSync";
30
30
  export { revenueRollupHandler } from "./revenueRollup";
31
31
  export { priceIndexRollupHandler } from "./priceIndexRollup";
32
+ export { searchIndexBuildHandler } from "./searchIndexBuild";
32
33
  export { analyticsAlertEvaluateHandler } from "./analyticsAlertEvaluate";
33
34
  export { pageViewRollupHandler } from "./pageViewRollup";
34
35
  export { pageViewPruneHandler } from "./pageViewPrune";
@@ -29,6 +29,7 @@ export { paymentReviewAutoApproveHandler } from "./paymentReviewAutoApprove.js";
29
29
  export { productStatsSyncHandler } from "./productStatsSync.js";
30
30
  export { revenueRollupHandler } from "./revenueRollup.js";
31
31
  export { priceIndexRollupHandler } from "./priceIndexRollup.js";
32
+ export { searchIndexBuildHandler } from "./searchIndexBuild.js";
32
33
  export { analyticsAlertEvaluateHandler } from "./analyticsAlertEvaluate.js";
33
34
  export { pageViewRollupHandler } from "./pageViewRollup.js";
34
35
  export { pageViewPruneHandler } from "./pageViewPrune.js";
@@ -1,8 +1,26 @@
1
+ import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
1
2
  import { handleCategoryWrite } from "../core/onCategoryWrite.js";
3
+ /*
4
+ * 🛑 Also marks the public search index stale.
5
+ *
6
+ * Added here rather than in the core so all five content triggers share one
7
+ * shape, and so each core keeps doing exactly the one thing it is named for.
8
+ *
9
+ * Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
10
+ * because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
11
+ * one this trigger watches, the same argument `priceIndexRollup` makes for
12
+ * writing `priceIndex/{leafId}` and never `categories`. #92's other half is
13
+ * handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
14
+ * never a deep compare, so a burst of 50 writes costs 50 reads and one write.
15
+ *
16
+ * It never throws: a missed mark delays the index by one 15-minute cadence,
17
+ * and failing the content write that triggered it would be far worse.
18
+ */
2
19
  export const onCategoryWriteHandler = async (event, ctx) => {
3
20
  await handleCategoryWrite({
4
21
  categoryId: event.params.categoryId,
5
22
  before: event.before,
6
23
  after: event.after,
7
24
  }, ctx);
25
+ await markSearchIndexDirty(ctx.db, "onCategoryWrite");
8
26
  };
@@ -1,8 +1,26 @@
1
+ import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
1
2
  import { handleProductWrite } from "../core/onProductWrite.js";
3
+ /*
4
+ * 🛑 Also marks the public search index stale.
5
+ *
6
+ * Added here rather than in the core so all five content triggers share one
7
+ * shape, and so each core keeps doing exactly the one thing it is named for.
8
+ *
9
+ * Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
10
+ * because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
11
+ * one this trigger watches, the same argument `priceIndexRollup` makes for
12
+ * writing `priceIndex/{leafId}` and never `categories`. #92's other half is
13
+ * handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
14
+ * never a deep compare, so a burst of 50 writes costs 50 reads and one write.
15
+ *
16
+ * It never throws: a missed mark delays the index by one 15-minute cadence,
17
+ * and failing the content write that triggered it would be far worse.
18
+ */
2
19
  export const onProductWriteHandler = async (event, ctx) => {
3
20
  await handleProductWrite({
4
21
  productId: event.params.productId,
5
22
  before: event.before,
6
23
  after: event.after,
7
24
  }, ctx);
25
+ await markSearchIndexDirty(ctx.db, "onProductWrite");
8
26
  };
@@ -1,4 +1,22 @@
1
+ import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
1
2
  import { handleReviewWrite } from "../core/onReviewWrite.js";
3
+ /*
4
+ * 🛑 Also marks the public search index stale.
5
+ *
6
+ * Added here rather than in the core so all five content triggers share one
7
+ * shape, and so each core keeps doing exactly the one thing it is named for.
8
+ *
9
+ * Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
10
+ * because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
11
+ * one this trigger watches, the same argument `priceIndexRollup` makes for
12
+ * writing `priceIndex/{leafId}` and never `categories`. #92's other half is
13
+ * handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
14
+ * never a deep compare, so a burst of 50 writes costs 50 reads and one write.
15
+ *
16
+ * It never throws: a missed mark delays the index by one 15-minute cadence,
17
+ * and failing the content write that triggered it would be far worse.
18
+ */
2
19
  export const onReviewWriteHandler = async (event, ctx) => {
3
20
  await handleReviewWrite({ reviewId: event.params.reviewId, before: event.before, after: event.after }, ctx);
21
+ await markSearchIndexDirty(ctx.db, "onReviewWrite");
4
22
  };
@@ -1,5 +1,22 @@
1
+ import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
1
2
  import { handleScamReportVerified } from "../core/onScamReportVerified.js";
2
3
  import { handleScamReportRejected } from "../core/onScamReportRejected.js";
4
+ /*
5
+ * 🛑 Also marks the public search index stale.
6
+ *
7
+ * Added here rather than in the core so all five content triggers share one
8
+ * shape, and so each core keeps doing exactly the one thing it is named for.
9
+ *
10
+ * Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
11
+ * because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
12
+ * one this trigger watches, the same argument `priceIndexRollup` makes for
13
+ * writing `priceIndex/{leafId}` and never `categories`. #92's other half is
14
+ * handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
15
+ * never a deep compare, so a burst of 50 writes costs 50 reads and one write.
16
+ *
17
+ * It never throws: a missed mark delays the index by one 15-minute cadence,
18
+ * and failing the content write that triggered it would be far worse.
19
+ */
3
20
  export const onScamReportUpdateHandler = async (event, ctx) => {
4
21
  const before = event.before;
5
22
  const after = event.after;
@@ -22,4 +39,5 @@ export const onScamReportUpdateHandler = async (event, ctx) => {
22
39
  else if (nextStatus === "rejected") {
23
40
  await handleScamReportRejected(baseInput, ctx);
24
41
  }
42
+ await markSearchIndexDirty(ctx.db, "onScamReportUpdate");
25
43
  };
@@ -1,8 +1,26 @@
1
+ import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
1
2
  import { handleStoreWrite } from "../core/onStoreWrite.js";
3
+ /*
4
+ * 🛑 Also marks the public search index stale.
5
+ *
6
+ * Added here rather than in the core so all five content triggers share one
7
+ * shape, and so each core keeps doing exactly the one thing it is named for.
8
+ *
9
+ * Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
10
+ * because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
11
+ * one this trigger watches, the same argument `priceIndexRollup` makes for
12
+ * writing `priceIndex/{leafId}` and never `categories`. #92's other half is
13
+ * handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
14
+ * never a deep compare, so a burst of 50 writes costs 50 reads and one write.
15
+ *
16
+ * It never throws: a missed mark delays the index by one 15-minute cadence,
17
+ * and failing the content write that triggered it would be far worse.
18
+ */
2
19
  export const onStoreWriteHandler = async (event, ctx) => {
3
20
  await handleStoreWrite({
4
21
  storeId: event.params.storeId,
5
22
  before: event.before,
6
23
  after: event.after,
7
24
  }, ctx);
25
+ await markSearchIndexDirty(ctx.db, "onStoreWrite");
8
26
  };
@@ -0,0 +1,2 @@
1
+ import type { ScheduleHandler } from "../runtime/types";
2
+ export declare const searchIndexBuildHandler: ScheduleHandler;
@@ -0,0 +1,2 @@
1
+ import { runSearchIndexBuild } from "../core/searchIndexBuild.js";
2
+ export const searchIndexBuildHandler = runSearchIndexBuild;
@@ -1,3 +1,11 @@
1
1
  import type { CallableHandler } from "../runtime/types";
2
2
  import { type TriggerEventRaffleInput, type TriggerEventRaffleResult } from "../core/triggerEventRaffle";
3
+ /**
4
+ * Statuses come from `reasonToHttp`, shared with
5
+ * `POST /api/admin/events/[id]/trigger-raffle`.
6
+ *
7
+ * The hand-written chain this replaces knew two reasons (404 / 422) while the
8
+ * route mapped everything to 409 — so the same refusal had two different
9
+ * statuses depending on which door it came through (Root Cause #85).
10
+ */
3
11
  export declare const triggerEventRaffleHandler: CallableHandler<TriggerEventRaffleInput, TriggerEventRaffleResult>;
@@ -1,16 +1,25 @@
1
1
  import { runTriggerEventRaffle, } from "../core/triggerEventRaffle.js";
2
- function httpError(message, status) {
2
+ import { reasonToHttp } from "../core/event-draw-reasons.js";
3
+ function httpError(message, status, code) {
3
4
  const err = new Error(message);
4
5
  err.httpStatus = status;
6
+ err.code = code;
5
7
  return err;
6
8
  }
9
+ /**
10
+ * Statuses come from `reasonToHttp`, shared with
11
+ * `POST /api/admin/events/[id]/trigger-raffle`.
12
+ *
13
+ * The hand-written chain this replaces knew two reasons (404 / 422) while the
14
+ * route mapped everything to 409 — so the same refusal had two different
15
+ * statuses depending on which door it came through (Root Cause #85).
16
+ */
7
17
  export const triggerEventRaffleHandler = async (input, ctx) => {
8
18
  const result = await runTriggerEventRaffle(input, ctx);
9
- if (result.reason === "event_not_found") {
10
- throw httpError("Event not found", 404);
11
- }
12
- if (result.reason === "no_eligible_entries") {
13
- throw httpError("No eligible entries for raffle", 422);
19
+ // Mirrors the route's own success test: a reason with no winner is a refusal.
20
+ if (result.reason && !result.raffleWinnerUserId) {
21
+ const { status, code, message } = reasonToHttp(result.reason);
22
+ throw httpError(message, status, code);
14
23
  }
15
24
  return result;
16
25
  };
@@ -1063,6 +1063,35 @@ export const ACTIONS = {
1063
1063
  confirmKind: "danger",
1064
1064
  },
1065
1065
  },
1066
+ /*
1067
+ * The raffle draw. Added 2026-10-19 — before this there was NO control to
1068
+ * draw a raffle anywhere in the product: the endpoint and its
1069
+ * `ADMIN_ENDPOINTS.EVENT_TRIGGER_RAFFLE` constant existed with zero
1070
+ * callers, and the tester case whose step 3 reads "trigger the raffle
1071
+ * draw" was literally unexecutable.
1072
+ *
1073
+ * `kind: "danger"` with a REQUIRED confirmation, because a draw is
1074
+ * genuinely irreversible: it writes the winner onto the event, and the
1075
+ * winner's notification cannot be recalled. The server enforces the
1076
+ * one-draw invariant transactionally and answers 409
1077
+ * `RAFFLE_ALREADY_DRAWN` on a second attempt, so this dialog is the
1078
+ * courtesy and that 409 is the guarantee.
1079
+ */
1080
+ "draw-raffle-winner": {
1081
+ iconKey: "verify",
1082
+ id: "event.draw-raffle-winner",
1083
+ label: "Draw raffle winner",
1084
+ ariaLabel: "Pick a random winner from the approved entries",
1085
+ description: "Picks one winner at random from this event's approved entries, records them on the event, and notifies them.",
1086
+ kind: "danger",
1087
+ permissions: ["admin"],
1088
+ confirmation: {
1089
+ title: "Draw the raffle winner?",
1090
+ body: "One winner will be picked at random from the approved entries, announced on the event page, and notified. A raffle can only be drawn once — this action cannot be undone.",
1091
+ confirmLabel: "Yes, draw the winner",
1092
+ confirmKind: "danger",
1093
+ },
1094
+ },
1066
1095
  },
1067
1096
  USER: {
1068
1097
  "cancel-order": {
@@ -31,7 +31,6 @@
31
31
  * render). Under-revalidating is the failure that shows a buyer a sold-out
32
32
  * listing as in stock, so when in doubt this returns MORE paths, not fewer.
33
33
  */
34
- /** What the caller knows about the written document, when it knows anything. */
35
34
  export interface RevalidateHints {
36
35
  /** `standard` | `auction` | `pre-order` | … — picks the right detail route. */
37
36
  listingType?: string;
@@ -31,6 +31,8 @@
31
31
  * render). Under-revalidating is the failure that shows a buyer a sold-out
32
32
  * listing as in stock, so when in doubt this returns MORE paths, not fewer.
33
33
  */
34
+ /** What the caller knows about the written document, when it knows anything. */
35
+ import { ROUTES } from "../../../next/routing/route-map.js";
34
36
  /** Detail route per listing type. Mirrors `ListingTypePlugin.detailRoute`. */
35
37
  const PRODUCT_DETAIL_BY_TYPE = {
36
38
  standard: (id) => `/products/${id}`,
@@ -73,7 +75,7 @@ function listingTypeFromId(id) {
73
75
  return undefined;
74
76
  }
75
77
  function productTargets(id, hints) {
76
- const out = ["/", "/products"];
78
+ const out = [ROUTES.HOME, ROUTES.PUBLIC.PRODUCTS];
77
79
  if (!id)
78
80
  return out;
79
81
  const type = hints?.listingType ?? listingTypeFromId(id);
@@ -81,7 +83,7 @@ function productTargets(id, hints) {
81
83
  out.push(PRODUCT_DETAIL_BY_TYPE[type](id));
82
84
  // The type's own browse page, when it has one distinct from /products.
83
85
  const browse = PRODUCT_DETAIL_BY_TYPE[type](id).replace(/\/[^/]+$/, "");
84
- if (browse && browse !== "/products")
86
+ if (browse && browse !== ROUTES.PUBLIC.PRODUCTS)
85
87
  out.push(browse);
86
88
  }
87
89
  else {
@@ -119,26 +121,26 @@ export function revalidateTargetsFor(collection, id, hints) {
119
121
  case "categories":
120
122
  // Brands and pricing bundles are `categories` rows discriminated by
121
123
  // `categoryType`, so all three detail shapes are marked.
122
- paths = ["/", "/categories"];
124
+ paths = [ROUTES.HOME, ROUTES.PUBLIC.CATEGORIES];
123
125
  if (id)
124
126
  paths.push(`/categories/${id}`, `/brands/${id}`, `/bundles/${id}`);
125
127
  break;
126
128
  case "blogPosts":
127
- paths = ["/", "/blog"];
129
+ paths = [ROUTES.HOME, ROUTES.BLOG.LIST];
128
130
  if (id)
129
131
  paths.push(`/blog/${id}`);
130
132
  break;
131
133
  case "events":
132
- paths = ["/", "/events"];
134
+ paths = [ROUTES.HOME, ROUTES.PUBLIC.EVENTS];
133
135
  if (id)
134
136
  paths.push(`/events/${id}`);
135
137
  break;
136
138
  case "reviews":
137
139
  // A new review changes the product's rating and the homepage stat.
138
- paths = ["/", "/reviews"];
140
+ paths = [ROUTES.HOME, ROUTES.PUBLIC.REVIEWS];
139
141
  break;
140
142
  case "stores":
141
- paths = ["/", "/stores"];
143
+ paths = [ROUTES.HOME, ROUTES.PUBLIC.STORES];
142
144
  if (id)
143
145
  paths.push(`/stores/${id}`);
144
146
  break;
@@ -148,7 +150,7 @@ export function revalidateTargetsFor(collection, id, hints) {
148
150
  paths = ["/"];
149
151
  break;
150
152
  case "faqs":
151
- paths = ["/", "/faqs"];
153
+ paths = [ROUTES.HOME, ROUTES.PUBLIC.FAQS];
152
154
  break;
153
155
  default:
154
156
  paths = [];
@@ -3,3 +3,17 @@ export declare const EVENTS_UPCOMING_LIMIT = 10;
3
3
  export declare const EVENT_MAX_ENTRIES_DEFAULT = 500;
4
4
  export declare const EVENT_TITLE_MAX_LENGTH = 200;
5
5
  export declare const EVENT_DESCRIPTION_MAX_LENGTH = 5000;
6
+ /**
7
+ * Entries one person may put into a raffle.
8
+ *
9
+ * One, because a raffle is one ticket per person and there is nothing to
10
+ * configure: `maxEntriesPerUser` exists on `SurveyConfig` only, and
11
+ * `EventDocument` has no `raffleConfig` at all.
12
+ *
13
+ * 🛑 Shared deliberately, by BOTH `enterEvent`'s server-side dedupe and the
14
+ * `EventRaffleEntryForm` prop that renders "you've used all N entry slots".
15
+ * Two mirrored literals is the shape that made this bug survive: the form
16
+ * already defaulted to 1 and displayed that sentence, while the server
17
+ * enforced nothing, so the UI claimed a limit that did not exist.
18
+ */
19
+ export declare const RAFFLE_MAX_ENTRIES_PER_USER = 1;
@@ -3,3 +3,17 @@ export const EVENTS_UPCOMING_LIMIT = 10;
3
3
  export const EVENT_MAX_ENTRIES_DEFAULT = 500;
4
4
  export const EVENT_TITLE_MAX_LENGTH = 200;
5
5
  export const EVENT_DESCRIPTION_MAX_LENGTH = 5000;
6
+ /**
7
+ * Entries one person may put into a raffle.
8
+ *
9
+ * One, because a raffle is one ticket per person and there is nothing to
10
+ * configure: `maxEntriesPerUser` exists on `SurveyConfig` only, and
11
+ * `EventDocument` has no `raffleConfig` at all.
12
+ *
13
+ * 🛑 Shared deliberately, by BOTH `enterEvent`'s server-side dedupe and the
14
+ * `EventRaffleEntryForm` prop that renders "you've used all N entry slots".
15
+ * Two mirrored literals is the shape that made this bug survive: the form
16
+ * already defaulted to 1 and displayed that sentence, while the server
17
+ * enforced nothing, so the UI claimed a limit that did not exist.
18
+ */
19
+ export const RAFFLE_MAX_ENTRIES_PER_USER = 1;
@@ -97,6 +97,14 @@ export function resolveNotificationActionUrl(relatedType, relatedId, audience) {
97
97
  return audience === "admin"
98
98
  ? String(ROUTES.ADMIN.STORE_DETAIL(relatedId))
99
99
  : String(ROUTES.STORE.DASHBOARD);
100
+ case "event":
101
+ /*
102
+ * The public winner page — the same destination for everyone, like
103
+ * `product` and `review`. An admin who drew the raffle and the buyer who
104
+ * won it both want to see the announcement, and that announcement IS the
105
+ * public page; there is no admin-side winner view to send them to.
106
+ */
107
+ return String(ROUTES.PUBLIC.EVENT_WINNER(relatedId));
100
108
  case "conversation":
101
109
  // D9 — one universal inbox, reachable from any portal; there is no
102
110
  // admin-specific thread view (admins moderate via reports, not a
@@ -42,6 +42,17 @@ export interface PublicSiteSettings {
42
42
  chat?: {
43
43
  enabled: boolean;
44
44
  };
45
+ /**
46
+ * The browser-side search index kill switch. **ON by default** — the
47
+ * projection emits `indexEnabled: doc.search?.indexEnabled !== false`, so
48
+ * an unseeded settings document and an absent group both mean "search
49
+ * works". The property itself is optional only because an OLD cached
50
+ * `/api/site-settings` response predates the field; `useSearchIndex`
51
+ * therefore reads it as `!== false` a second time rather than `=== true`.
52
+ */
53
+ search?: {
54
+ indexEnabled: boolean;
55
+ };
45
56
  notificationChannels?: NotificationChannelConfig;
46
57
  announcementBar?: SiteSettingsDocument["announcementBar"];
47
58
  navConfig?: SiteSettingsDocument["navConfig"];
@@ -0,0 +1,81 @@
1
+ import type { DecodedRaster, EncodedImage, Rect } from "./types";
2
+ export interface ProbeResult {
3
+ readonly width: number;
4
+ readonly height: number;
5
+ /**
6
+ * The density the FILE declares, unvalidated. Five of the nine reference
7
+ * scans say 72 or 96 — an encoder default, not a measurement — so a caller
8
+ * must treat this as a suggestion to confirm, never as truth.
9
+ */
10
+ readonly dpi?: number;
11
+ }
12
+ export interface DecodeOptions {
13
+ /**
14
+ * The memory cap, enforced INSIDE the codec.
15
+ *
16
+ * This is the single most important line in the seam. sharp downscales in
17
+ * native code during decode and canvas does it in `drawImage`, so a 34 MP
18
+ * source never materialises as a JS buffer. If a codec implementation ignores
19
+ * this and returns full-resolution pixels, every Float32Array downstream
20
+ * scales with it and the Function runs out of memory — with no error that
21
+ * points here.
22
+ */
23
+ readonly maxLongEdge: number;
24
+ }
25
+ export interface PreviewOptions {
26
+ readonly maxLongEdge: number;
27
+ readonly format: "png" | "webp";
28
+ }
29
+ export interface ImageCodec {
30
+ /** Header-only. Must not decode pixels — it runs on the full upload. */
31
+ probe(source: Uint8Array): Promise<ProbeResult>;
32
+ /**
33
+ * Decode, downscale to `maxLongEdge`, apply EXIF orientation, drop ICC.
34
+ *
35
+ * The last two matter for correctness, not tidiness: both codecs must hand
36
+ * back the SAME pixels for the same file, or a path tuned in the browser
37
+ * lands somewhere else when the Function re-renders it.
38
+ */
39
+ decode(source: Uint8Array, opts: DecodeOptions): Promise<DecodedRaster>;
40
+ /**
41
+ * Decode one tile at native resolution, for the `max` tier's tiled ridge pass.
42
+ *
43
+ * 🛑 Tiles must overlap by at least the ridge kernel radius. A cut line
44
+ * crossing a seam with insufficient overlap is detected on neither side and
45
+ * breaks silently — producing worse output than the cheaper `precise` tier,
46
+ * which is the one way that tier can quietly be a downgrade.
47
+ */
48
+ decodeTile(source: Uint8Array, tile: Rect): Promise<DecodedRaster>;
49
+ encodePng(raster: DecodedRaster): Promise<EncodedImage>;
50
+ /**
51
+ * Crop to `region` and apply `alpha` (length === region.width * region.height),
52
+ * in one call.
53
+ *
54
+ * One call rather than crop-then-composite so that neither codec needs its own
55
+ * pixel loop, and — the real reason — so a full-resolution part render never
56
+ * materialises a full-resolution RGBA buffer. The caller rasterises that one
57
+ * part's Bézier path into `alpha` over its own bounding box, and the codec
58
+ * reads only that box out of the source file. Sixty parts therefore cost
59
+ * sixty small allocations rather than one enormous one.
60
+ */
61
+ encodePngRegion(source: Uint8Array, region: Rect, alpha: Uint8Array): Promise<EncodedImage>;
62
+ /** The ≤1 MB review image the UI loads instead of the scan. */
63
+ encodePreview(source: Uint8Array, opts: PreviewOptions): Promise<EncodedImage>;
64
+ /**
65
+ * Pack already-encoded tiles into one sprite atlas.
66
+ *
67
+ * Exists because object COUNT is metered separately from bytes: sixty
68
+ * thumbnail objects per run spend the Class A/B allowance sixty times faster
69
+ * than one atlas of the same pixels, and the part list loads in one request
70
+ * rather than sixty.
71
+ */
72
+ encodeAtlas(tiles: readonly {
73
+ readonly raster: DecodedRaster;
74
+ readonly ordinal: number;
75
+ }[], opts: {
76
+ readonly maxLongEdge: number;
77
+ }): Promise<{
78
+ readonly image: EncodedImage;
79
+ readonly frames: Readonly<Record<number, Rect>>;
80
+ }>;
81
+ }
@@ -0,0 +1,30 @@
1
+ /*
2
+ * WHY: The tracing algorithm must be ONE implementation, but it has to run in a
3
+ * browser (live threshold tuning, ~1s per tweak) and in a Firebase Function
4
+ * (full-resolution render on save). Two implementations drift, and the one
5
+ * that drifts is always the one you are not currently looking at
6
+ * (CLAUDE.md Root Cause #59/#73). So the algorithm is shared and only the
7
+ * pixel I/O differs — this file is that seam, and it is the whole of it.
8
+ * WHAT: The codec interface. Declaration only: no implementation, no imports, no
9
+ * dependency on sharp, canvas, node:* or providers/*. Keeping this tree
10
+ * import-free is what lets the browser bundle it at all (Root Cause #24),
11
+ * and `audit-sticker-trace-purity` enforces it.
12
+ *
13
+ * The division of labour is deliberate and worth stating, because getting it
14
+ * wrong reintroduces the memory problem the design exists to avoid:
15
+ *
16
+ * codec — owns BYTES. Decodes, downscales, crops, encodes.
17
+ * core — owns MATHS. Takes a DecodedRaster, returns geometry. Never resizes
18
+ * anything, never allocates at source resolution, never sees a file.
19
+ *
20
+ * EXPORTS:
21
+ * ImageCodec, DecodeOptions, PreviewOptions, ProbeResult
22
+ *
23
+ * @tag domain:sticker-trace
24
+ * @tag layer:shared
25
+ * @tag pattern:port
26
+ * @tag access:isomorphic
27
+ * @tag consumers:canvas-codec,sharp-codec,run,coordinator,shard
28
+ * @tag sideEffects:none
29
+ */
30
+ export {};
@@ -0,0 +1,81 @@
1
+ import type { PrecisionTier, TraceParams } from "./types";
2
+ /**
3
+ * The memory cap, and the reason the core never sees a 34 MP buffer.
4
+ *
5
+ * The downscale happens inside the CODEC, not here — sharp does it in native
6
+ * code, canvas in `drawImage` — so no Float32Array is ever allocated at source
7
+ * resolution. At 3000px long edge a mask is ~9 MB as Uint8 and a distance
8
+ * transform ~36 MB as Float32, with several live at once; that fits a 2 GiB
9
+ * Function with room. The `max` tier deliberately exceeds it and pays for that
10
+ * by tiling the ridge pass instead (see trace/tiling).
11
+ */
12
+ export declare const WORKING_LONG_EDGE = 3000;
13
+ /** The review image. Must stay ≤1 MB — the UI loads it on every sheet open. */
14
+ export declare const PREVIEW_LONG_EDGE = 2000;
15
+ /** Per-part review thumbnails, packed into ONE sprite atlas rather than N objects. */
16
+ export declare const THUMB_LONG_EDGE = 220;
17
+ /**
18
+ * Upload ceiling. Deliberately its own constant rather than the shared
19
+ * MAX_IMAGE_BYTES (10 MB), which is sized for product photography and must not
20
+ * be raised — a 4948x6955 scan is legitimately 80 MB.
21
+ */
22
+ export declare const STICKER_SHEET_MAX_BYTES: number;
23
+ /**
24
+ * A hard bound, not a tuning knob. A noise-dominated scan whose ridges survive
25
+ * hysteresis produces thousands of components, and without this the failure
26
+ * mode is thousands of Storage writes rather than an error message.
27
+ */
28
+ export declare const MAX_PARTS_PER_SHEET = 400;
29
+ /**
30
+ * Gap between physical sheets in one scan. Stickers on a sheet sit a few mm
31
+ * apart; separate sheets land centimetres apart, so the threshold has a wide
32
+ * safe margin either side.
33
+ */
34
+ export declare const SHEET_CLUSTER_GAP_MM = 12;
35
+ /**
36
+ * Cricut's documented minimum reliable detail / line spacing: 0.25 in. A part
37
+ * with an internal neck below this tears instead of cutting.
38
+ */
39
+ export declare const CRICUT_MIN_FEATURE_MM = 6.35;
40
+ /**
41
+ * Design Space degrades past roughly 50,000 nodes. The exporter re-simplifies
42
+ * to this budget INDEPENDENTLY of the trace tolerance — tying the two together
43
+ * would mean a more precise trace producing a file Design Space cannot open.
44
+ */
45
+ export declare const CRICUT_NODE_BUDGET = 45000;
46
+ interface TierPreset {
47
+ readonly workingLongEdge: number;
48
+ readonly prefilter: TraceParams["prefilter"];
49
+ readonly prefilterRadius: number;
50
+ readonly simplifyMm: number;
51
+ readonly smoothMm: number;
52
+ readonly subPixelContours: boolean;
53
+ readonly tiled: boolean;
54
+ }
55
+ /**
56
+ * `draft` exists for the browser's live loop and nothing else — 1200px traces
57
+ * in about a second, which is what makes threshold tuning feel like a slider
58
+ * rather than a job submission.
59
+ *
60
+ * `max` is the only tier that tiles. Its simplify tolerance is fine enough that
61
+ * the Cricut exporter will almost certainly have to re-simplify; that is
62
+ * expected and reported, not a misconfiguration.
63
+ */
64
+ export declare const TIER_PRESETS: Readonly<Record<PrecisionTier, TierPreset>>;
65
+ /**
66
+ * Defaults measured against the reference corpus, not guessed:
67
+ *
68
+ * - `ridgeHysteresisLow/High` — the cut line reads as a dark-trough/light-ridge
69
+ * doublet at 10-20x scan noise on four sampled scanlines (−40/+27 against ±2
70
+ * on yellow-on-yellow, +22 against ±1 on red-on-red). The low threshold sits
71
+ * just above the worst measured noise floor (±7, a JPEG scan) so a faint but
72
+ * continuous line links, while isolated speckle does not seed.
73
+ * - `quantiseWeight` below 1 on purpose: the colour channel REINFORCES a weak
74
+ * ridge but must not invent a cut where only a colour change exists, or every
75
+ * gradient band inside a sticker becomes an outline.
76
+ * - `bridgeMm` closes white channels narrower than 2x itself. It must sit
77
+ * between the widest intra-sticker band and the narrowest real gap between
78
+ * neighbours; 0.45 was measured on the Driger G sheet.
79
+ */
80
+ export declare function paramsForTier(tier: PrecisionTier, overrides?: Partial<TraceParams>): TraceParams;
81
+ export {};