@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,138 @@
1
+ /*
2
+ * WHY: Four measured attempts at art-background sheets all failed the same
3
+ * way, and the reason was the primitive rather than its constants. The
4
+ * local-range detector in trace/ridge is an EDGE detector, and on an art
5
+ * sheet the strongest edges are the artwork — torch-pegases' cut line
6
+ * measured +22 against +-1 noise while that sheet's own lettering is far
7
+ * higher contrast. No threshold on an edge detector separates the two.
8
+ * WHAT: A Hessian line filter, which asks a different question entirely.
9
+ *
10
+ * The distinction is geometric, not photometric:
11
+ *
12
+ * a LINE (a kiss cut — a groove a few pixels wide) has a large second
13
+ * derivative ACROSS it, maximal exactly at its centre;
14
+ *
15
+ * a STEP (an artwork boundary between two printed colours) has a second
16
+ * derivative with a ZERO CROSSING at the edge — large on the flanks either
17
+ * side, ~0 on the edge itself.
18
+ *
19
+ * So evaluating curvature at the feature centre keeps cuts and suppresses
20
+ * artwork boundaries, which is exactly inverted from what amplitude does.
21
+ * That is why this is a different detector and not a retuned one.
22
+ *
23
+ * EXPORTS: LineFilterResult, detectLines
24
+ *
25
+ * @tag domain:sticker-trace
26
+ * @tag layer:shared
27
+ * @tag pattern:none
28
+ * @tag access:isomorphic
29
+ * @tag consumers:segment
30
+ * @tag sideEffects:none
31
+ */
32
+ /** Separable Gaussian. Scale sets which line WIDTH the filter is tuned to. */
33
+ function gaussian(src, width, height, sigma) {
34
+ const radius = Math.max(1, Math.ceil(sigma * 3));
35
+ const k = new Float32Array(radius * 2 + 1);
36
+ const denom = 2 * sigma * sigma;
37
+ let sum = 0;
38
+ for (let i = -radius; i <= radius; i++) {
39
+ const v = Math.exp(-(i * i) / denom);
40
+ k[i + radius] = v;
41
+ sum += v;
42
+ }
43
+ for (let i = 0; i < k.length; i++)
44
+ k[i] = k[i] / sum;
45
+ const tmp = new Float32Array(src.length);
46
+ const out = new Float32Array(src.length);
47
+ for (let y = 0; y < height; y++) {
48
+ const row = y * width;
49
+ for (let x = 0; x < width; x++) {
50
+ let acc = 0;
51
+ for (let d = -radius; d <= radius; d++) {
52
+ const sx = Math.min(width - 1, Math.max(0, x + d));
53
+ acc += src[row + sx] * k[d + radius];
54
+ }
55
+ tmp[row + x] = acc;
56
+ }
57
+ }
58
+ for (let x = 0; x < width; x++) {
59
+ for (let y = 0; y < height; y++) {
60
+ let acc = 0;
61
+ for (let d = -radius; d <= radius; d++) {
62
+ const sy = Math.min(height - 1, Math.max(0, y + d));
63
+ acc += tmp[sy * width + x] * k[d + radius];
64
+ }
65
+ out[y * width + x] = acc;
66
+ }
67
+ }
68
+ return out;
69
+ }
70
+ /**
71
+ * Line-ness at one scale.
72
+ *
73
+ * The Hessian eigenvalues are ordered |l1| <= |l2|. For an ideal line l2 is
74
+ * large and l1 ~ 0; for a blob both are large and similar; for flat ink both
75
+ * are ~0. So `|l2| * (1 - |l1/l2|)` rewards elongation and penalises
76
+ * blob-likeness, which is the Frangi criterion reduced to the single term that
77
+ * matters here — the full vesselness adds exponentials whose constants would
78
+ * be two more numbers to tune for no gain on this corpus.
79
+ *
80
+ * 🛑 Both polarities are kept. A kiss cut scans as a doublet — a shadow beside
81
+ * a highlight — so along one edge of the groove the line is DARK and along the
82
+ * other it is BRIGHT. Keeping only one sign finds half of every outline, which
83
+ * reads as a detector that nearly works and produces open paths.
84
+ */
85
+ function lineness(luma, width, height, sigma) {
86
+ const g = gaussian(luma, width, height, sigma);
87
+ const out = new Float32Array(luma.length);
88
+ // Normalise by sigma^2 so responses at different scales are comparable —
89
+ // required for the multi-scale max below to mean anything.
90
+ const norm = sigma * sigma;
91
+ for (let y = 1; y < height - 1; y++) {
92
+ for (let x = 1; x < width - 1; x++) {
93
+ const i = y * width + x;
94
+ const c = g[i];
95
+ const dxx = g[i + 1] - 2 * c + g[i - 1];
96
+ const dyy = g[i + width] - 2 * c + g[i - width];
97
+ const dxy = (g[i + width + 1] - g[i + width - 1] - g[i - width + 1] + g[i - width - 1]) / 4;
98
+ // Closed-form eigenvalues of [[dxx, dxy], [dxy, dyy]].
99
+ const tr = dxx + dyy;
100
+ const diff = dxx - dyy;
101
+ const root = Math.sqrt(diff * diff + 4 * dxy * dxy);
102
+ const ea = (tr + root) / 2;
103
+ const eb = (tr - root) / 2;
104
+ const absA = Math.abs(ea);
105
+ const absB = Math.abs(eb);
106
+ const l1 = Math.min(absA, absB);
107
+ const l2 = Math.max(absA, absB);
108
+ if (l2 < 1e-6)
109
+ continue;
110
+ out[i] = norm * l2 * (1 - l1 / l2);
111
+ }
112
+ }
113
+ return out;
114
+ }
115
+ /**
116
+ * Multi-scale line detection.
117
+ *
118
+ * A scan's cut lines are not all one width — resolution, paper and how hard
119
+ * the die pressed all vary — so a single scale finds the ones it is tuned to
120
+ * and misses the rest, producing exactly the broken outlines that make a
121
+ * region partition collapse. Taking the per-pixel maximum across a few scales
122
+ * is the standard answer and costs one Gaussian per scale.
123
+ */
124
+ export function detectLines(luma, width, height, scales = [1, 1.6, 2.4]) {
125
+ const response = new Float32Array(luma.length);
126
+ for (const sigma of scales) {
127
+ const r = lineness(luma, width, height, sigma);
128
+ for (let i = 0; i < response.length; i++) {
129
+ if (r[i] > response[i])
130
+ response[i] = r[i];
131
+ }
132
+ }
133
+ let max = 0;
134
+ for (let i = 0; i < response.length; i++)
135
+ if (response[i] > max)
136
+ max = response[i];
137
+ return { response, maxResponse: max };
138
+ }
@@ -0,0 +1,27 @@
1
+ export interface MergeResult {
2
+ /** Region id per pixel after merging; 0 stays background/barrier. */
3
+ readonly labels: Int32Array;
4
+ readonly regionCount: number;
5
+ readonly mergesApplied: number;
6
+ /** Median boundary strength across the graph — the scale the cut is judged against. */
7
+ readonly medianStrength: number;
8
+ }
9
+ /**
10
+ * Merge adjacent regions whose shared boundary is weak.
11
+ *
12
+ * `strengthFactor` is a multiple of the MEDIAN boundary strength in this
13
+ * sheet's own graph, not an absolute response value — for the same reason the
14
+ * ridge thresholds are local (the response scale varies by two orders of
15
+ * magnitude across the corpus). A boundary below that multiple is treated as
16
+ * printing; at or above it, as a cut.
17
+ *
18
+ * 🛑 Single-pass greedy, not true hierarchical merging. Pair strengths are
19
+ * computed once and never recomputed as regions combine, so a chain of weak
20
+ * links can merge two regions whose own shared boundary was never measured.
21
+ * That is acceptable HERE and would not be in general: the thing those chains
22
+ * reunify is precisely the waste matrix, which is the outcome wanted. A proper
23
+ * recomputing merge would cost a priority queue and a rebuild per step for a
24
+ * result that is the same on this corpus — revisit only if a real sheet shows
25
+ * two stickers merging through a chain.
26
+ */
27
+ export declare function mergeWeakBoundaries(labels: Int32Array, regionCount: number, response: Float32Array, width: number, height: number, strengthFactor: number): MergeResult;
@@ -0,0 +1,187 @@
1
+ /*
2
+ * WHY: Measured on the reference corpus, the art-background sheets came back
3
+ * with 209 parts against ~12 real ones, and a threshold sweep showed it
4
+ * was structural: even at 1.0% barrier coverage the count stayed 3x too
5
+ * high, monotonically, with no minimum. Thresholds cannot fix it because
6
+ * the extra regions are not noise — they are the sheet's own ARTWORK
7
+ * fragmenting the waste matrix into pieces.
8
+ *
9
+ * The physical fact the fix rests on: between the stickers there is ONE
10
+ * continuous piece of backing. Artwork printed across it does not cut it.
11
+ * So regions separated by a weak boundary belong together, and the matrix
12
+ * reunifies into a single large region — which the sheet-fraction rule
13
+ * then drops on its own.
14
+ * WHAT: A region-adjacency merge driven by BOUNDARY STRENGTH rather than by
15
+ * region appearance.
16
+ *
17
+ * Strength, not length or shape. A long artwork edge is still an artwork edge,
18
+ * and a short cut line is still a cut. The question "did somebody's blade go
19
+ * through here" is answered by how hard the ridge detector saw that specific
20
+ * boundary — which is a number this already has, per pixel, and was throwing
21
+ * away by reducing the response to a binary barrier.
22
+ *
23
+ * EXPORTS: mergeWeakBoundaries
24
+ *
25
+ * @tag domain:sticker-trace
26
+ * @tag layer:shared
27
+ * @tag pattern:none
28
+ * @tag access:isomorphic
29
+ * @tag consumers:segment
30
+ * @tag sideEffects:none
31
+ */
32
+ import { edtWithIndices } from "../math/edt.js";
33
+ /**
34
+ * Merge adjacent regions whose shared boundary is weak.
35
+ *
36
+ * `strengthFactor` is a multiple of the MEDIAN boundary strength in this
37
+ * sheet's own graph, not an absolute response value — for the same reason the
38
+ * ridge thresholds are local (the response scale varies by two orders of
39
+ * magnitude across the corpus). A boundary below that multiple is treated as
40
+ * printing; at or above it, as a cut.
41
+ *
42
+ * 🛑 Single-pass greedy, not true hierarchical merging. Pair strengths are
43
+ * computed once and never recomputed as regions combine, so a chain of weak
44
+ * links can merge two regions whose own shared boundary was never measured.
45
+ * That is acceptable HERE and would not be in general: the thing those chains
46
+ * reunify is precisely the waste matrix, which is the outcome wanted. A proper
47
+ * recomputing merge would cost a priority queue and a rebuild per step for a
48
+ * result that is the same on this corpus — revisit only if a real sheet shows
49
+ * two stickers merging through a chain.
50
+ */
51
+ export function mergeWeakBoundaries(labels, regionCount, response, width, height, strengthFactor) {
52
+ if (regionCount < 2) {
53
+ return { labels, regionCount, mergesApplied: 0, medianStrength: 0 };
54
+ }
55
+ // Accumulate, per adjacent region PAIR, the ridge response along the barrier
56
+ // that separates them. A barrier pixel is attributed to every pair of
57
+ // distinct regions it touches, so a junction where three regions meet feeds
58
+ // all three pairs rather than being dropped for ambiguity.
59
+ const edges = new Map();
60
+ const key = (a, b) => (a < b ? a * 1e6 + b : b * 1e6 + a);
61
+ const touch = (a, b, strength) => {
62
+ if (a === 0 || b === 0 || a === b)
63
+ return;
64
+ const k = key(a, b);
65
+ const e = edges.get(k);
66
+ if (e) {
67
+ e.sum += strength;
68
+ e.count++;
69
+ }
70
+ else {
71
+ edges.set(k, { a: Math.min(a, b), b: Math.max(a, b), sum: strength, count: 1 });
72
+ }
73
+ };
74
+ /*
75
+ * 🛑 Territory assignment, not a look-across.
76
+ *
77
+ * The first version sampled `labels[i-1]` and `labels[i+1]` either side of
78
+ * each barrier pixel. That records NOTHING whenever the barrier is more than
79
+ * one pixel thick — both sides are themselves barrier, so both read 0 and the
80
+ * pair is skipped. The barrier here is hysteresis-GROWN and therefore always
81
+ * several pixels thick, so the edge set came out empty and the merge silently
82
+ * performed zero merges on every sheet. It read as "the merge decided not
83
+ * to" for four measured runs.
84
+ *
85
+ * Assigning every barrier pixel to its nearest region first — a watershed by
86
+ * another name, using the exact EDT that already exists — makes adjacency a
87
+ * plain neighbour test again, and it is correct for a barrier of any
88
+ * thickness.
89
+ */
90
+ const regionMask = new Uint8Array(labels.length);
91
+ for (let i = 0; i < labels.length; i++)
92
+ regionMask[i] = labels[i] !== 0 ? 1 : 0;
93
+ const { index } = edtWithIndices(regionMask, width, height);
94
+ const owner = new Int32Array(labels.length);
95
+ for (let i = 0; i < labels.length; i++) {
96
+ owner[i] = labels[i] !== 0 ? labels[i] : labels[index[i]];
97
+ }
98
+ for (let y = 0; y < height; y++) {
99
+ for (let x = 0; x < width; x++) {
100
+ const i = y * width + x;
101
+ const a = owner[i];
102
+ if (a === 0)
103
+ continue;
104
+ // Strength is sampled from the BARRIER pixels only. A boundary's
105
+ // evidence is what the detector saw on the line itself, not on the
106
+ // territory either side of it, which carries no cut signal at all.
107
+ const s = labels[i] === 0 ? response[i] : 0;
108
+ const weighted = labels[i] === 0;
109
+ if (x < width - 1 && owner[i + 1] !== a && weighted)
110
+ touch(a, owner[i + 1], s);
111
+ if (y < height - 1 && owner[i + width] !== a && weighted)
112
+ touch(a, owner[i + width], s);
113
+ }
114
+ }
115
+ if (edges.size === 0) {
116
+ return { labels, regionCount, mergesApplied: 0, medianStrength: 0 };
117
+ }
118
+ const list = [...edges.values()].map((e) => ({ ...e, strength: e.sum / e.count }));
119
+ const sortedStrengths = list.map((e) => e.strength).sort((a, b) => a - b);
120
+ const medianStrength = sortedStrengths[sortedStrengths.length >> 1];
121
+ /*
122
+ * 🛑 A multiple of the median is wrong when the median is ZERO, and it was
123
+ * measured doing exactly that: with the same-material score most boundaries
124
+ * sit at 0, so `median * factor` was 0, the first edge tripped
125
+ * `strength >= threshold`, and the loop broke having merged nothing — a
126
+ * silent no-op that looked like "the merge decided not to".
127
+ *
128
+ * A PERCENTILE of the edge distribution cannot degenerate that way: it always
129
+ * names a real position in the list, whatever the values are. `factor` is
130
+ * reinterpreted as that percentile (1 => merge the weakest half).
131
+ */
132
+ const quantile = Math.min(0.98, Math.max(0.02, strengthFactor * 0.5));
133
+ list.sort((p, q) => p.strength - q.strength);
134
+ /*
135
+ * 🛑 Merge a COUNT of the weakest edges, not everything below a value.
136
+ *
137
+ * A value threshold still degenerates under TIES, and ties are the normal
138
+ * case here: the same-material score is 0 for most boundaries, so the median
139
+ * is 0, and `strength >= 0` tripped on the very first edge — measured as
140
+ * 2271 -> 2271 regions with zero merges at the default factor, while the
141
+ * same function at factor 1.9 collapsed 2271 -> 35. A fraction of the sorted
142
+ * list cannot do that: it always dissolves exactly the weakest share asked
143
+ * for, whatever the values are.
144
+ */
145
+ const mergeBudget = Math.floor(list.length * quantile);
146
+ const parent = new Int32Array(regionCount + 1);
147
+ for (let i = 0; i <= regionCount; i++)
148
+ parent[i] = i;
149
+ const find = (x) => {
150
+ let r = x;
151
+ while (parent[r] !== r) {
152
+ parent[r] = parent[parent[r]];
153
+ r = parent[r];
154
+ }
155
+ return r;
156
+ };
157
+ let merges = 0;
158
+ let considered = 0;
159
+ for (const e of list) {
160
+ if (considered >= mergeBudget)
161
+ break;
162
+ considered++;
163
+ const ra = find(e.a);
164
+ const rb = find(e.b);
165
+ if (ra !== rb) {
166
+ parent[rb] = ra;
167
+ merges++;
168
+ }
169
+ }
170
+ // Renumber densely so downstream code can size arrays by the count.
171
+ const remap = new Int32Array(regionCount + 1);
172
+ let next = 0;
173
+ for (let r = 1; r <= regionCount; r++) {
174
+ const root = find(r);
175
+ if (remap[root] === 0) {
176
+ next++;
177
+ remap[root] = next;
178
+ }
179
+ remap[r] = remap[root];
180
+ }
181
+ const out = new Int32Array(labels.length);
182
+ for (let i = 0; i < labels.length; i++) {
183
+ const l = labels[i];
184
+ out[i] = l === 0 ? 0 : remap[l];
185
+ }
186
+ return { labels: out, regionCount: next, mergesApplied: merges, medianStrength };
187
+ }
@@ -0,0 +1,32 @@
1
+ import type { DecodedRaster, ScanType } from "../types";
2
+ export interface PaperEstimate {
3
+ readonly colour: readonly [number, number, number];
4
+ /**
5
+ * Spread of the border band around that colour, in the same distance units
6
+ * as `backgroundLikeMask`. A printed art sheet has a wide spread because its
7
+ * border is artwork; bare paper has a narrow one.
8
+ */
9
+ readonly spread: number;
10
+ /**
11
+ * What the border band suggests this scan IS. Only consulted when the caller
12
+ * asked for `auto` — an explicit choice always wins, because a human looking
13
+ * at the sheet beats a statistic about its edge.
14
+ */
15
+ readonly detectedType: Exclude<ScanType, "auto">;
16
+ }
17
+ /**
18
+ * Sample the outermost band and take the modal colour.
19
+ *
20
+ * The band is 2% of the short edge, floored at 4px: wide enough to carry a
21
+ * useful sample on a small scan, narrow enough that a sheet filling the frame
22
+ * still contributes mostly its own margin rather than its artwork.
23
+ */
24
+ export declare function estimatePaper(raster: DecodedRaster, requested: ScanType): PaperEstimate;
25
+ /**
26
+ * Pixels the flood may travel through, on colour alone.
27
+ *
28
+ * `tolerance` is in the same weighted-distance units as `spread`, and the two
29
+ * are added: a noisy scan earns a proportionally looser test rather than
30
+ * needing the caller to notice and compensate.
31
+ */
32
+ export declare function backgroundLikeMask(raster: DecodedRaster, paper: PaperEstimate, tolerance: number): Uint8Array;
@@ -0,0 +1,147 @@
1
+ /*
2
+ * WHY: The flood fill has to start somewhere it is certain is OUTSIDE every
3
+ * sticker, and it has to know what "outside" looks like so it can travel.
4
+ * Both answers come from the sheet's border band — the one region of a
5
+ * scan that is background by construction.
6
+ * WHAT: Modal background colour from the border, plus a per-pixel
7
+ * "is this background-like" test in a perceptually sane colour space.
8
+ *
9
+ * 🛑 It estimates a MODE, not a mean. Averaging the border band over a scan
10
+ * whose sheet runs near the edge mixes paper with sticker ink and yields a
11
+ * colour that is neither — and then nothing matches it. A histogram peak is
12
+ * unmoved by a minority of contaminating pixels, which is exactly the property
13
+ * needed when "most of the border is background" is the only guarantee.
14
+ *
15
+ * EXPORTS: PaperEstimate, estimatePaper, backgroundLikeMask
16
+ *
17
+ * @tag domain:sticker-trace
18
+ * @tag layer:shared
19
+ * @tag pattern:none
20
+ * @tag access:isomorphic
21
+ * @tag consumers:flood,segment
22
+ * @tag sideEffects:none
23
+ */
24
+ /**
25
+ * Squared distance in a cheap perceptual weighting.
26
+ *
27
+ * Plain RGB Euclidean treats a blue shift as being as visible as a green one,
28
+ * which it is not — so a tolerance loose enough to accept real paper variation
29
+ * in green also accepts colours a human reads as plainly different. The 2/4/3
30
+ * weighting is the standard low-cost approximation and costs two multiplies.
31
+ */
32
+ function colourDistanceSq(r1, g1, b1, r2, g2, b2) {
33
+ const dr = r1 - r2;
34
+ const dg = g1 - g2;
35
+ const db = b1 - b2;
36
+ return 2 * dr * dr + 4 * dg * dg + 3 * db * db;
37
+ }
38
+ /**
39
+ * Sample the outermost band and take the modal colour.
40
+ *
41
+ * The band is 2% of the short edge, floored at 4px: wide enough to carry a
42
+ * useful sample on a small scan, narrow enough that a sheet filling the frame
43
+ * still contributes mostly its own margin rather than its artwork.
44
+ */
45
+ export function estimatePaper(raster, requested) {
46
+ const { width, height, data } = raster;
47
+ const band = Math.max(4, Math.round(Math.min(width, height) * 0.02));
48
+ // 5 bits per channel — 32768 bins. Fine enough to separate cream from white,
49
+ // coarse enough that scanner noise lands in one bin rather than smearing the
50
+ // peak across a dozen.
51
+ const BITS = 5;
52
+ const SHIFT = 8 - BITS;
53
+ const SIZE = 1 << BITS;
54
+ const hist = new Int32Array(SIZE * SIZE * SIZE);
55
+ const samples = [];
56
+ const visit = (x, y) => {
57
+ const p = (y * width + x) * 4;
58
+ const r = data[p];
59
+ const g = data[p + 1];
60
+ const b = data[p + 2];
61
+ const bin = ((r >> SHIFT) << (BITS * 2)) | ((g >> SHIFT) << BITS) | (b >> SHIFT);
62
+ hist[bin] = hist[bin] + 1;
63
+ samples.push(p);
64
+ };
65
+ for (let y = 0; y < height; y++) {
66
+ const edgeRow = y < band || y >= height - band;
67
+ for (let x = 0; x < width; x++) {
68
+ if (edgeRow || x < band || x >= width - band)
69
+ visit(x, y);
70
+ }
71
+ }
72
+ let peak = 0;
73
+ let peakBin = 0;
74
+ for (let i = 0; i < hist.length; i++) {
75
+ if (hist[i] > peak) {
76
+ peak = hist[i];
77
+ peakBin = i;
78
+ }
79
+ }
80
+ // Refine: average the real pixels that fell in the winning bin, so the result
81
+ // is a true colour rather than the bin's centre.
82
+ const binR = (peakBin >> (BITS * 2)) & (SIZE - 1);
83
+ const binG = (peakBin >> BITS) & (SIZE - 1);
84
+ const binB = peakBin & (SIZE - 1);
85
+ let sr = 0;
86
+ let sg = 0;
87
+ let sb = 0;
88
+ let n = 0;
89
+ for (const p of samples) {
90
+ const r = data[p];
91
+ const g = data[p + 1];
92
+ const b = data[p + 2];
93
+ if ((r >> SHIFT) === binR && (g >> SHIFT) === binG && (b >> SHIFT) === binB) {
94
+ sr += r;
95
+ sg += g;
96
+ sb += b;
97
+ n++;
98
+ }
99
+ }
100
+ const colour = n > 0 ? [sr / n, sg / n, sb / n] : [binR << SHIFT, binG << SHIFT, binB << SHIFT];
101
+ // Spread: median distance of the band from that colour. Median rather than
102
+ // mean for the same reason the mode was chosen over the mean above — a
103
+ // sticker intruding into the band must not widen the tolerance for everything.
104
+ const distances = new Float64Array(samples.length);
105
+ for (let i = 0; i < samples.length; i++) {
106
+ const p = samples[i];
107
+ distances[i] = Math.sqrt(colourDistanceSq(data[p], data[p + 1], data[p + 2], colour[0], colour[1], colour[2]));
108
+ }
109
+ distances.sort();
110
+ const spread = distances.length > 0 ? distances[distances.length >> 1] : 0;
111
+ /*
112
+ * A bare-paper scan has a tight border: most of it is the same colour, so the
113
+ * modal bin dominates and the median distance from it is small. A printed
114
+ * art sheet's border is artwork, so neither holds.
115
+ *
116
+ * The threshold is deliberately generous toward `art`. Misreading paper as
117
+ * art costs some flood reach, which the ridge barrier still bounds; misreading
118
+ * art as paper lets the flood treat a printed field as background and eat the
119
+ * stickers sitting on it, which is the failure that has no recovery.
120
+ */
121
+ const dominance = samples.length > 0 ? peak / samples.length : 0;
122
+ const detectedType = dominance > 0.25 && spread < 40 ? "paper" : "art";
123
+ return {
124
+ colour,
125
+ spread,
126
+ detectedType: requested === "auto" ? detectedType : requested,
127
+ };
128
+ }
129
+ /**
130
+ * Pixels the flood may travel through, on colour alone.
131
+ *
132
+ * `tolerance` is in the same weighted-distance units as `spread`, and the two
133
+ * are added: a noisy scan earns a proportionally looser test rather than
134
+ * needing the caller to notice and compensate.
135
+ */
136
+ export function backgroundLikeMask(raster, paper, tolerance) {
137
+ const { width, height, data } = raster;
138
+ const out = new Uint8Array(width * height);
139
+ const [pr, pg, pb] = paper.colour;
140
+ const limit = tolerance + paper.spread;
141
+ const limitSq = limit * limit * 9; // weights sum to 9; keep the comparison squared
142
+ for (let i = 0, p = 0; i < out.length; i++, p += 4) {
143
+ out[i] =
144
+ colourDistanceSq(data[p], data[p + 1], data[p + 2], pr, pg, pb) <= limitSq ? 1 : 0;
145
+ }
146
+ return out;
147
+ }
@@ -0,0 +1,30 @@
1
+ import type { DecodedRaster, PrefilterKind } from "../types";
2
+ /**
3
+ * Rec. 601 luma. The ridge detector works on a single channel because the
4
+ * emboss signature is a brightness doublet — it appears in all three channels
5
+ * at once, so running the detector three times would triple the cost to find
6
+ * the same edge.
7
+ */
8
+ export declare function toLuminance(raster: DecodedRaster): Float32Array;
9
+ /**
10
+ * Median over a (2r+1)^2 window.
11
+ *
12
+ * Median rather than mean because a rosette is an impulse pattern: the mean of
13
+ * a dot and its surround is a grey that still carries the dot's energy, while
14
+ * the median discards it outright. The cut line survives because it is a
15
+ * CONTINUOUS feature — more than half the window sits on it when the window is
16
+ * centred there — which is precisely the property a median preserves and a
17
+ * blur does not.
18
+ */
19
+ export declare function medianFilter(src: Float32Array, width: number, height: number, radius: number): Float32Array;
20
+ /**
21
+ * Edge-preserving smoothing: weight neighbours by both distance and intensity
22
+ * similarity.
23
+ *
24
+ * This is the `precise`/`max` choice because it suppresses the rosette like a
25
+ * blur while refusing to average across a step — and the cut line IS a step.
26
+ * A plain Gaussian at the radius needed to kill a rosette also halves the
27
+ * doublet amplitude, which on the ~3x scan is the whole signal.
28
+ */
29
+ export declare function bilateralFilter(src: Float32Array, width: number, height: number, radius: number, sigmaSpace?: number, sigmaRange?: number): Float32Array;
30
+ export declare function applyPrefilter(luma: Float32Array, width: number, height: number, kind: PrefilterKind, radius: number): Float32Array;