@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
@@ -0,0 +1,195 @@
1
+ /*
2
+ * WHY: A flat-colour sticker — a solid red claw, a DRIGER G wordmark — traces
3
+ * into clean filled shapes that scale to any size. A gradient or a
4
+ * halftone screen does not: it bands, it explodes the node count, and the
5
+ * result is worse than the raster it replaced.
6
+ * WHAT: Optional per-part artwork vectorisation, which MEASURES whether it
7
+ * helped and says so.
8
+ *
9
+ * 🛑 IT IS OPT-IN PER PART AND THE RASTER ALWAYS SURVIVES. This is the one
10
+ * export in the suite that can make a part worse, so it never replaces
11
+ * anything — it produces an additional file, and the report says whether it is
12
+ * worth using.
13
+ *
14
+ * 🛑 IT REPORTS A MEASURED DEVIATION, NOT A CONFIDENCE. The honest question is
15
+ * "how far does the vector sit from the pixels", and that is computable: fill
16
+ * the traced regions back into a mask and count the pixels that disagree. A
17
+ * heuristic score would be a number nobody could check.
18
+ *
19
+ * 🛑 Built on the modules that already exist — `quantiseBoundaries`,
20
+ * `traceContours`, `simplifyRdp`. A second posteriser here would be a second
21
+ * answer to "which colours are in this image", and the trace pipeline's
22
+ * fused-channel detector already depends on the first one.
23
+ *
24
+ * EXPORTS: VectoriseResult, VectorRegion, vectoriseArtwork
25
+ *
26
+ * @tag domain:sticker-trace
27
+ * @tag layer:shared
28
+ * @tag pattern:none
29
+ * @tag access:isomorphic
30
+ * @tag consumers:sticker-trace/export
31
+ * @tag sideEffects:none
32
+ */
33
+ import { simplifyRdp } from "../math/rdp.js";
34
+ import { traceContours } from "../math/marching-squares.js";
35
+ import { quantiseBoundaries } from "../trace/quantise.js";
36
+ /**
37
+ * Above this share of mismatched pixels, the vector is visibly not the artwork.
38
+ *
39
+ * 🛑 PICKED, NOT MEASURED — and said so deliberately. Every other threshold in
40
+ * this feature was chosen against the nine reference scans; this one has not
41
+ * been, because nobody has yet run the quantiser over the corpus and compared
42
+ * the deviation on a flat-colour part against an airbrushed one. 8% is a
43
+ * starting guess.
44
+ *
45
+ * That is exactly why the measured deviation is reported ALONGSIDE the verdict
46
+ * rather than hidden behind it: the number is trustworthy, the threshold is
47
+ * not, and an operator can disagree with the verdict using the figure. Run the
48
+ * corpus and replace this comment with what it says.
49
+ */
50
+ const DEVIATION_LIMIT = 0.08;
51
+ /**
52
+ * Above this, Design Space struggles and the file stops being usable.
53
+ *
54
+ * Deliberately lower than the machine node budget: that budget applies to the
55
+ * CUT path, which is one outline per part. This is fill artwork, where a
56
+ * banded gradient can produce tens of thousands of nodes on its own.
57
+ */
58
+ const NODE_LIMIT = 20000;
59
+ /**
60
+ * @param raster the part's own RGBA crop
61
+ * @param alpha its cut mask — which pixels belong to the sticker at all
62
+ */
63
+ export function vectoriseArtwork(raster, alpha, opts = {}) {
64
+ const colours = Math.max(2, Math.min(32, opts.colours ?? 8));
65
+ const simplify = opts.simplifyPx ?? 0.75;
66
+ const { width, height, data: rgba } = raster;
67
+ /*
68
+ * The SAME quantiser the trace pipeline's fused detector uses — not a second
69
+ * posteriser. Two answers to "which colours are in this image" would mean the
70
+ * artwork banded along boundaries the cut line never saw.
71
+ */
72
+ const quant = quantiseBoundaries(raster, colours);
73
+ const { labels } = quant;
74
+ /*
75
+ * Average each region's real colour rather than using the palette entry.
76
+ * Median cut picks a representative, not a mean, so the palette colour can
77
+ * sit visibly outside the pixels it stands for — and on a sticker the fill
78
+ * colour IS the product.
79
+ */
80
+ const sums = new Float64Array(colours * 3);
81
+ const counts = new Int32Array(colours);
82
+ for (let i = 0; i < width * height; i++) {
83
+ if ((alpha[i] ?? 0) < 128)
84
+ continue;
85
+ const label = labels[i] ?? 0;
86
+ if (label < 0 || label >= colours)
87
+ continue;
88
+ counts[label] += 1;
89
+ sums[label * 3] += rgba[i * 4] ?? 0;
90
+ sums[label * 3 + 1] += rgba[i * 4 + 1] ?? 0;
91
+ sums[label * 3 + 2] += rgba[i * 4 + 2] ?? 0;
92
+ }
93
+ const opaque = counts.reduce((a, b) => a + b, 0);
94
+ if (opaque === 0) {
95
+ return {
96
+ regions: [],
97
+ nodeCount: 0,
98
+ deviation: 1,
99
+ notRecommended: true,
100
+ reason: "This part has no opaque pixels to vectorise.",
101
+ };
102
+ }
103
+ const regions = [];
104
+ let nodeCount = 0;
105
+ for (let label = 0; label < colours; label++) {
106
+ const n = counts[label] ?? 0;
107
+ if (n === 0)
108
+ continue;
109
+ /*
110
+ * One binary mask per palette entry, traced independently. Tracing all
111
+ * boundaries at once would give edges with no inside — a filled shape needs
112
+ * to know which side it is on, and a per-label mask answers that by
113
+ * construction.
114
+ */
115
+ const mask = new Uint8Array(width * height);
116
+ for (let i = 0; i < width * height; i++) {
117
+ if ((alpha[i] ?? 0) >= 128 && labels[i] === label)
118
+ mask[i] = 1;
119
+ }
120
+ const rings = traceContours(mask, width, height, 0.5)
121
+ .map((ring) => simplifyRdp(ring.points, simplify))
122
+ // A ring of fewer than 3 points encloses no area; keeping it would add
123
+ // nodes and paint nothing.
124
+ .filter((pts) => pts.length >= 3);
125
+ if (rings.length === 0)
126
+ continue;
127
+ for (const r of rings)
128
+ nodeCount += r.length;
129
+ regions.push({
130
+ rgb: [
131
+ Math.round(sums[label * 3] / n),
132
+ Math.round(sums[label * 3 + 1] / n),
133
+ Math.round(sums[label * 3 + 2] / n),
134
+ ],
135
+ rings,
136
+ coverage: n / opaque,
137
+ });
138
+ }
139
+ /*
140
+ * The deviation, MEASURED.
141
+ *
142
+ * Every opaque pixel is compared against the colour its own region would
143
+ * paint. This is a lower bound on the real error — it ignores the rings'
144
+ * simplification, which moves a boundary by at most `simplifyPx` — and a
145
+ * lower bound is the honest direction: it never flatters the result.
146
+ */
147
+ let wrong = 0;
148
+ for (let i = 0; i < width * height; i++) {
149
+ if ((alpha[i] ?? 0) < 128)
150
+ continue;
151
+ const label = labels[i] ?? 0;
152
+ const n = counts[label] ?? 0;
153
+ if (n === 0)
154
+ continue;
155
+ const dr = (rgba[i * 4] ?? 0) - sums[label * 3] / n;
156
+ const dg = (rgba[i * 4 + 1] ?? 0) - sums[label * 3 + 1] / n;
157
+ const db = (rgba[i * 4 + 2] ?? 0) - sums[label * 3 + 2] / n;
158
+ // ~12 levels per channel: below this a human reading a printed sticker
159
+ // cannot tell the band from the gradient.
160
+ if (Math.sqrt(dr * dr + dg * dg + db * db) > 20)
161
+ wrong++;
162
+ }
163
+ const deviation = wrong / opaque;
164
+ const tooFar = deviation > DEVIATION_LIMIT;
165
+ const tooMany = nodeCount > NODE_LIMIT;
166
+ return {
167
+ regions,
168
+ nodeCount,
169
+ deviation: Math.round(deviation * 1000) / 1000,
170
+ notRecommended: tooFar || tooMany,
171
+ reason: tooFar
172
+ ? `${Math.round(deviation * 100)}% of this part's pixels shift visibly — it is a gradient or a halftone, and vectorising will band it. Keep the raster.`
173
+ : tooMany
174
+ ? `${nodeCount.toLocaleString()} nodes is past what Design Space handles comfortably. Keep the raster, or trace with fewer colours.`
175
+ : "",
176
+ };
177
+ }
178
+ /** Serialise the regions to SVG paths, for an artwork layer. */
179
+ export function regionsToSvgPaths(regions) {
180
+ const hex = (c) => c.toString(16).padStart(2, "0").toUpperCase();
181
+ return regions
182
+ .map((region) => {
183
+ const d = region.rings
184
+ .map((ring) => `M ${ring.map((p) => `${Math.round(p.x * 100) / 100} ${Math.round(p.y * 100) / 100}`).join(" L ")} Z`)
185
+ .join(" ");
186
+ /*
187
+ * `fill-rule="evenodd"` so a ring inside another ring cuts a hole rather
188
+ * than painting over it. A letter's counter — the gap in an O — is
189
+ * exactly this case, and nonzero would fill it solid.
190
+ */
191
+ const fill = `#${hex(region.rgb[0])}${hex(region.rgb[1])}${hex(region.rgb[2])}`;
192
+ return `<path d="${d}" fill="${fill}" fill-rule="evenodd" />`;
193
+ })
194
+ .join("\n");
195
+ }
@@ -0,0 +1,2 @@
1
+ import type { DecodedRaster, TraceParams, TraceResult } from "./types";
2
+ export declare function traceStickerSheet(raster: DecodedRaster, params: TraceParams, sourceWidth?: number): TraceResult;
@@ -0,0 +1,59 @@
1
+ /*
2
+ * WHY: One entry point, so the browser's live-tuning loop and the Firebase
3
+ * Function's full-resolution render provably run the same algorithm rather
4
+ * than two implementations that agree today (CLAUDE.md Root Cause #59/#73).
5
+ * WHAT: `traceStickerSheet(raster, params)` — synchronous, codec-free, pure.
6
+ *
7
+ * It takes decoded pixels and returns geometry. It never decodes, never
8
+ * resizes, never writes, and never touches a file: the memory cap lives in the
9
+ * codec's `decode`, so by the time anything here runs the raster is already
10
+ * bounded. That is what keeps a 34 MP scan from becoming a 136 MB Float32Array
11
+ * inside the maths.
12
+ *
13
+ * EXPORTS: traceStickerSheet
14
+ *
15
+ * @tag domain:sticker-trace
16
+ * @tag layer:shared
17
+ * @tag pattern:none
18
+ * @tag access:isomorphic
19
+ * @tag consumers:run,canvas-codec,probe-sticker-trace
20
+ * @tag sideEffects:none
21
+ */
22
+ import { TIER_PRESETS } from "./config.js";
23
+ import { clusterParts } from "./trace/cluster.js";
24
+ import { buildPartGeometry } from "./trace/geometry.js";
25
+ import { segmentSheet } from "./trace/segment.js";
26
+ export function traceStickerSheet(raster, params, sourceWidth) {
27
+ const pxPerMm = raster.dpi ? raster.dpi / 25.4 : null;
28
+ const subPixel = TIER_PRESETS[params.tier].subPixelContours;
29
+ const segmented = segmentSheet(raster, params);
30
+ const geometry = [];
31
+ let ordinal = 1;
32
+ for (const stat of segmented.parts) {
33
+ if (geometry.length >= params.maxParts)
34
+ break;
35
+ const part = buildPartGeometry(segmented.labels, raster.width, raster.height, stat, ordinal, params, pxPerMm, subPixel);
36
+ // A component whose contour would not close is DROPPED rather than emitted
37
+ // open. An open cut path is a sticker the machine slices most of the way
38
+ // around and leaves attached — worse than one it never cut at all, because
39
+ // the sheet is now damaged.
40
+ if (part) {
41
+ geometry.push(part);
42
+ ordinal++;
43
+ }
44
+ }
45
+ const { clusters, assigned } = clusterParts(geometry, pxPerMm, params.clusterGapMm);
46
+ return {
47
+ parts: assigned,
48
+ clusters,
49
+ diagnostics: segmented.diagnostics,
50
+ pxPerMm,
51
+ /*
52
+ * The scale a caller multiplies this geometry by to reach the SOURCE image.
53
+ * Carrying vectors rather than masks is what makes that multiplication
54
+ * exact — a mask would have to be upsampled, and an upsampled mask has
55
+ * stair-steps the blade would trace.
56
+ */
57
+ sourceScale: sourceWidth && raster.width > 0 ? sourceWidth / raster.width : 1,
58
+ };
59
+ }
@@ -0,0 +1,11 @@
1
+ import type { CutPath, Point } from "../types";
2
+ /**
3
+ * Fit a closed cubic path through `points`.
4
+ *
5
+ * Closed only — a kiss cut is always a closed outline, and an open path would
6
+ * mean a sticker the machine cuts most of the way around and leaves attached.
7
+ * The wrap-around indexing is what makes the seam between the last and first
8
+ * point as smooth as every other joint; fitting open and then closing the gap
9
+ * leaves a visible corner exactly where the path started.
10
+ */
11
+ export declare function catmullRomToBezier(points: readonly Point[]): CutPath | null;
@@ -0,0 +1,66 @@
1
+ /*
2
+ * WHY: A simplified polyline is still a polyline, and a blade cutting one
3
+ * chatters audibly on every curve — these stickers are almost entirely
4
+ * curves. Fitting smooth cubics through the simplified points is what
5
+ * turns a traced raster into something a cutter follows cleanly.
6
+ * WHAT: Uniform Catmull-Rom through the points, converted to cubic Béziers,
7
+ * with the control-arm clamp that keeps sharp corners from looping.
8
+ *
9
+ * EXPORTS: catmullRomToBezier
10
+ *
11
+ * @tag domain:sticker-trace
12
+ * @tag layer:shared
13
+ * @tag pattern:none
14
+ * @tag access:isomorphic
15
+ * @tag consumers:geometry,export/*
16
+ * @tag sideEffects:none
17
+ */
18
+ /**
19
+ * Cap a control arm's length.
20
+ *
21
+ * 🛑 This is not a refinement, it is a correctness fix. Uniform Catmull-Rom
22
+ * overshoots badly when neighbouring segments differ in length: at a sharp
23
+ * corner — which every claw-shaped sticker on these sheets has — the arm grows
24
+ * longer than the segment itself and the curve ties a small loop. A blade cuts
25
+ * that loop as a nick in the sticker's edge.
26
+ *
27
+ * Capping at a third of the span is the standard guard and leaves collinear
28
+ * runs perfectly straight, so nothing is lost on the flat sections.
29
+ */
30
+ function clampArm(vx, vy, limit) {
31
+ const len = Math.hypot(vx, vy);
32
+ if (len <= limit || len === 0)
33
+ return { x: vx, y: vy };
34
+ const s = limit / len;
35
+ return { x: vx * s, y: vy * s };
36
+ }
37
+ /**
38
+ * Fit a closed cubic path through `points`.
39
+ *
40
+ * Closed only — a kiss cut is always a closed outline, and an open path would
41
+ * mean a sticker the machine cuts most of the way around and leaves attached.
42
+ * The wrap-around indexing is what makes the seam between the last and first
43
+ * point as smooth as every other joint; fitting open and then closing the gap
44
+ * leaves a visible corner exactly where the path started.
45
+ */
46
+ export function catmullRomToBezier(points) {
47
+ const n = points.length;
48
+ if (n < 3)
49
+ return null;
50
+ const segments = [];
51
+ for (let i = 0; i < n; i++) {
52
+ const p0 = points[(i - 1 + n) % n];
53
+ const p1 = points[i];
54
+ const p2 = points[(i + 1) % n];
55
+ const p3 = points[(i + 2) % n];
56
+ const span = Math.hypot(p2.x - p1.x, p2.y - p1.y) / 3;
57
+ const a1 = clampArm((p2.x - p0.x) / 6, (p2.y - p0.y) / 6, span);
58
+ const a2 = clampArm((p3.x - p1.x) / 6, (p3.y - p1.y) / 6, span);
59
+ segments.push({
60
+ c1: { x: p1.x + a1.x, y: p1.y + a1.y },
61
+ c2: { x: p2.x - a2.x, y: p2.y - a2.y },
62
+ to: { x: p2.x, y: p2.y },
63
+ });
64
+ }
65
+ return { start: points[0], segments };
66
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Squared Euclidean distance from every pixel to the nearest `true` in `mask`.
3
+ *
4
+ * Squared because that is what the algorithm computes natively and because
5
+ * every caller that only needs a comparison (`is this within r?`) can compare
6
+ * against r*r and skip ~9 million square roots on a 3000px raster.
7
+ */
8
+ export declare function edtSquared(mask: Uint8Array, width: number, height: number): Float32Array;
9
+ /** Euclidean distance in pixels. Prefer {@link edtSquared} when comparing. */
10
+ export declare function edt(mask: Uint8Array, width: number, height: number): Float32Array;
11
+ export interface EdtIndices {
12
+ /** Squared distance to the nearest seed. */
13
+ readonly dist: Float32Array;
14
+ /** Flat index (y * width + x) of that nearest seed. */
15
+ readonly index: Int32Array;
16
+ }
17
+ /**
18
+ * Distance transform that also reports the nearest seed's index.
19
+ *
20
+ * The de-halo pass needs this rather than the distance: it repaints the bleed
21
+ * ring with the colour of the nearest INTERIOR pixel, so it has to know which
22
+ * pixel that was. Tracking the argmin through both passes is why this is a
23
+ * separate function — carrying it costs an extra Int32Array and a second
24
+ * envelope evaluation, which the three callers that only want distance should
25
+ * not pay.
26
+ */
27
+ export declare function edtWithIndices(mask: Uint8Array, width: number, height: number): EdtIndices;
@@ -0,0 +1,165 @@
1
+ /*
2
+ * WHY: Four separate things this tracer does are the same operation underneath —
3
+ * morphological dilate/erode by a true disc, the bleed ring, pushing solid
4
+ * colour outward into that ring, and measuring a sticker's narrowest neck.
5
+ * All four are "distance to the nearest set pixel", so there is one exact
6
+ * distance transform rather than four approximations.
7
+ * WHAT: Felzenszwalb & Huttenlocher's exact Euclidean distance transform, O(n)
8
+ * per row and column, plus a variant that also reports WHICH seed pixel
9
+ * was nearest (the de-halo pass needs the index, not the distance).
10
+ *
11
+ * Exact matters here. A chamfer/approximate transform is off by a few percent,
12
+ * which is invisible on a screen and is a real error on a 0.4 mm bleed ring —
13
+ * and it rounds corners anisotropically, so a dilated outline comes out
14
+ * subtly faceted in a way a blade traces.
15
+ *
16
+ * EXPORTS: edtSquared, edt, edtWithIndices
17
+ *
18
+ * @tag domain:sticker-trace
19
+ * @tag layer:shared
20
+ * @tag pattern:none
21
+ * @tag access:isomorphic
22
+ * @tag consumers:morphology,geometry,dehalo,segment
23
+ * @tag sideEffects:none
24
+ */
25
+ const INF = 1e20;
26
+ /**
27
+ * Lower envelope of parabolas along one axis.
28
+ *
29
+ * `f` is the squared-distance cost at each position, `d` receives the result.
30
+ * `v` (parabola vertices) and `z` (intersection boundaries) are scratch buffers
31
+ * owned by the caller so the 2-D driver allocates them once rather than once
32
+ * per row — on a 3000px raster that is the difference between 3000 small
33
+ * allocations and none.
34
+ */
35
+ function lowerEnvelope(f, d, v, z, n) {
36
+ let k = 0;
37
+ v[0] = 0;
38
+ z[0] = -INF;
39
+ z[1] = INF;
40
+ for (let q = 1; q < n; q++) {
41
+ // Intersection of the parabola at q with the one currently on top.
42
+ let s = (f[q] + q * q - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);
43
+ while (s <= z[k]) {
44
+ k--;
45
+ s = (f[q] + q * q - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);
46
+ }
47
+ k++;
48
+ v[k] = q;
49
+ z[k] = s;
50
+ z[k + 1] = INF;
51
+ }
52
+ k = 0;
53
+ for (let q = 0; q < n; q++) {
54
+ while (z[k + 1] < q)
55
+ k++;
56
+ const dx = q - v[k];
57
+ d[q] = dx * dx + f[v[k]];
58
+ }
59
+ }
60
+ /**
61
+ * Squared Euclidean distance from every pixel to the nearest `true` in `mask`.
62
+ *
63
+ * Squared because that is what the algorithm computes natively and because
64
+ * every caller that only needs a comparison (`is this within r?`) can compare
65
+ * against r*r and skip ~9 million square roots on a 3000px raster.
66
+ */
67
+ export function edtSquared(mask, width, height) {
68
+ const out = new Float32Array(width * height);
69
+ const maxDim = Math.max(width, height);
70
+ const f = new Float64Array(maxDim);
71
+ const d = new Float64Array(maxDim);
72
+ const v = new Int32Array(maxDim);
73
+ const z = new Float64Array(maxDim + 1);
74
+ // Columns first.
75
+ for (let x = 0; x < width; x++) {
76
+ for (let y = 0; y < height; y++) {
77
+ f[y] = mask[y * width + x] ? 0 : INF;
78
+ }
79
+ lowerEnvelope(f, d, v, z, height);
80
+ for (let y = 0; y < height; y++) {
81
+ out[y * width + x] = d[y];
82
+ }
83
+ }
84
+ // Then rows, over the column result.
85
+ for (let y = 0; y < height; y++) {
86
+ const row = y * width;
87
+ for (let x = 0; x < width; x++) {
88
+ f[x] = out[row + x];
89
+ }
90
+ lowerEnvelope(f, d, v, z, width);
91
+ for (let x = 0; x < width; x++) {
92
+ out[row + x] = d[x];
93
+ }
94
+ }
95
+ return out;
96
+ }
97
+ /** Euclidean distance in pixels. Prefer {@link edtSquared} when comparing. */
98
+ export function edt(mask, width, height) {
99
+ const sq = edtSquared(mask, width, height);
100
+ for (let i = 0; i < sq.length; i++)
101
+ sq[i] = Math.sqrt(sq[i]);
102
+ return sq;
103
+ }
104
+ /**
105
+ * Distance transform that also reports the nearest seed's index.
106
+ *
107
+ * The de-halo pass needs this rather than the distance: it repaints the bleed
108
+ * ring with the colour of the nearest INTERIOR pixel, so it has to know which
109
+ * pixel that was. Tracking the argmin through both passes is why this is a
110
+ * separate function — carrying it costs an extra Int32Array and a second
111
+ * envelope evaluation, which the three callers that only want distance should
112
+ * not pay.
113
+ */
114
+ export function edtWithIndices(mask, width, height) {
115
+ const dist = new Float32Array(width * height);
116
+ const index = new Int32Array(width * height);
117
+ const maxDim = Math.max(width, height);
118
+ const f = new Float64Array(maxDim);
119
+ const d = new Float64Array(maxDim);
120
+ const v = new Int32Array(maxDim);
121
+ const z = new Float64Array(maxDim + 1);
122
+ // Nearest source position along the axis currently being processed.
123
+ const srcAxis = new Int32Array(maxDim);
124
+ // The y the column pass settled on, carried into the row pass.
125
+ const colSrcY = new Int32Array(width * height);
126
+ for (let x = 0; x < width; x++) {
127
+ for (let y = 0; y < height; y++) {
128
+ f[y] = mask[y * width + x] ? 0 : INF;
129
+ }
130
+ lowerEnvelope(f, d, v, z, height);
131
+ // Re-walk the envelope to recover which vertex each position resolved to.
132
+ let k = 0;
133
+ for (let y = 0; y < height; y++) {
134
+ while (z[k + 1] < y)
135
+ k++;
136
+ srcAxis[y] = v[k];
137
+ }
138
+ for (let y = 0; y < height; y++) {
139
+ dist[y * width + x] = d[y];
140
+ colSrcY[y * width + x] = srcAxis[y];
141
+ }
142
+ }
143
+ for (let y = 0; y < height; y++) {
144
+ const row = y * width;
145
+ for (let x = 0; x < width; x++) {
146
+ f[x] = dist[row + x];
147
+ }
148
+ lowerEnvelope(f, d, v, z, width);
149
+ let k = 0;
150
+ for (let x = 0; x < width; x++) {
151
+ while (z[k + 1] < x)
152
+ k++;
153
+ srcAxis[x] = v[k];
154
+ }
155
+ for (let x = 0; x < width; x++) {
156
+ const srcX = srcAxis[x];
157
+ dist[row + x] = d[x];
158
+ // The seed is at (srcX, the y the COLUMN pass chose for srcX) — not at
159
+ // (srcX, y). Reading the current row here is the classic way to get a
160
+ // plausible-looking but wrong nearest-neighbour field.
161
+ index[row + x] = colSrcY[row + srcX] * width + srcX;
162
+ }
163
+ }
164
+ return { dist, index };
165
+ }
@@ -0,0 +1,15 @@
1
+ import type { Rect } from "../types";
2
+ export interface ComponentStats {
3
+ readonly label: number;
4
+ readonly area: number;
5
+ readonly bbox: Rect;
6
+ /** True when the component touches the raster edge — see trace/segment. */
7
+ readonly touchesBorder: boolean;
8
+ }
9
+ export interface LabelResult {
10
+ /** 0 = background; components are 1..count. */
11
+ readonly labels: Int32Array;
12
+ readonly count: number;
13
+ readonly stats: readonly ComponentStats[];
14
+ }
15
+ export declare function labelComponents(mask: Uint8Array, width: number, height: number): LabelResult;