@mohasinac/appkit 4.52.4 → 4.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (633) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
  3. package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
  4. package/dist/_internal/server/features/auctions/actions.js +1 -1
  5. package/dist/_internal/server/features/categories/data.js +23 -7
  6. package/dist/_internal/server/features/checkout/actions.js +10 -3
  7. package/dist/_internal/server/features/checkout/data.d.ts +15 -0
  8. package/dist/_internal/server/features/checkout/data.js +20 -3
  9. package/dist/_internal/server/features/lottery/actions.js +9 -1
  10. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  11. package/dist/_internal/server/features/lottery/og.js +79 -0
  12. package/dist/_internal/server/features/messages/actions.js +4 -0
  13. package/dist/_internal/server/features/offers/adapters.js +17 -3
  14. package/dist/_internal/server/features/orders/actions.js +7 -2
  15. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  16. package/dist/_internal/server/features/raffle/actions.js +25 -0
  17. package/dist/_internal/server/features/reviews/actions.js +1 -1
  18. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  19. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  20. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  21. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  22. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  23. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  24. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  25. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  26. package/dist/_internal/server/features/search/search-sources.js +142 -7
  27. package/dist/_internal/server/features/seo/robots.js +21 -1
  28. package/dist/_internal/server/features/seo/sitemap.js +1 -1
  29. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  30. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  31. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  32. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  33. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  34. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
  35. package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
  36. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  37. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  38. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  39. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  40. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  41. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  42. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  43. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  44. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  45. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  46. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  47. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  48. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  49. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  50. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  51. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  52. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
  53. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
  54. package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
  55. package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
  56. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  57. package/dist/_internal/server/functions/scheduled.js +25 -1
  58. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  59. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  60. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  61. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  62. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  63. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  64. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  65. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  66. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  67. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  68. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  69. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  70. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  71. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  72. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  73. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  74. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  75. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  76. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  77. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  78. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  79. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  80. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  81. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  83. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  84. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  85. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  86. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  87. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  88. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  89. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  90. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  91. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  92. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  93. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  94. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  95. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  96. package/dist/_internal/shared/actions/action-registry.js +29 -0
  97. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  98. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  99. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  100. package/dist/_internal/shared/features/events/config.js +14 -0
  101. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  102. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  103. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  104. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  105. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  106. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  107. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  108. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  109. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  110. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  111. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  112. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  113. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  114. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  115. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  116. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  117. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  118. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  119. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  120. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  121. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  122. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  123. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  124. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  125. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  126. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  127. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  128. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  129. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  130. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  131. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  132. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  133. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  134. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  135. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  136. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  137. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  138. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  139. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  140. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  141. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  142. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  143. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  144. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  145. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  146. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  147. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  148. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  149. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  150. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  151. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  152. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  153. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  154. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  155. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  156. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  157. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  158. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  159. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  160. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  161. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  162. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  163. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  164. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  165. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  166. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  167. package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
  168. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  169. package/dist/_internal/shared/listing-types/art/config.js +1 -0
  170. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  171. package/dist/_internal/shared/listing-types/auction/config.js +1 -0
  172. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  173. package/dist/_internal/shared/listing-types/classified/config.js +1 -0
  174. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  175. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
  176. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  177. package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
  178. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  179. package/dist/_internal/shared/listing-types/live/config.js +1 -0
  180. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  181. package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
  182. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  183. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
  184. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  185. package/dist/_internal/shared/listing-types/standard/config.js +1 -0
  186. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  187. package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
  188. package/dist/_internal/shared/media/limits.d.ts +12 -2
  189. package/dist/_internal/shared/media/limits.js +12 -2
  190. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  191. package/dist/_internal/shared/search/artifact-url.js +119 -0
  192. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  193. package/dist/_internal/shared/search/index-record.js +96 -0
  194. package/dist/_internal/shared/search/match.d.ts +65 -0
  195. package/dist/_internal/shared/search/match.js +263 -0
  196. package/dist/client.d.ts +8 -7
  197. package/dist/client.js +12 -5
  198. package/dist/configs/eslint.js +22 -2
  199. package/dist/constants/api-endpoints.d.ts +68 -0
  200. package/dist/constants/api-endpoints.js +32 -0
  201. package/dist/constants/field-names.d.ts +7 -1
  202. package/dist/constants/field-names.js +36 -1
  203. package/dist/contracts/repository.d.ts +8 -7
  204. package/dist/contracts/search.d.ts +2 -2
  205. package/dist/contracts/table.d.ts +3 -3
  206. package/dist/contracts/table.js +3 -3
  207. package/dist/core/contact-submissions.repository.js +2 -2
  208. package/dist/core/integration-keys.js +7 -1
  209. package/dist/core/newsletter.repository.js +2 -2
  210. package/dist/core/site-config.js +1 -1
  211. package/dist/errors/error-codes.d.ts +30 -0
  212. package/dist/errors/error-codes.js +30 -0
  213. package/dist/errors/error-display-map.js +40 -1
  214. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  215. package/dist/features/account/components/UserBidsView.js +1 -1
  216. package/dist/features/account/components/index.d.ts +0 -8
  217. package/dist/features/account/components/index.js +0 -4
  218. package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
  219. package/dist/features/addresses/repository/addresses.repository.js +65 -9
  220. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  221. package/dist/features/admin/actions/notification-actions.js +15 -6
  222. package/dist/features/admin/api/bids/route.js +1 -1
  223. package/dist/features/admin/api/coupons/route.js +1 -1
  224. package/dist/features/admin/api/products/route.js +1 -1
  225. package/dist/features/admin/api/reviews/route.js +1 -1
  226. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  227. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  228. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  229. package/dist/features/admin/components/AdminBlogView.js +1 -1
  230. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  231. package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
  232. package/dist/features/admin/components/AdminContactView.js +1 -1
  233. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  234. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  235. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  236. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  237. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  238. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  239. package/dist/features/admin/components/AdminProductEditorView.js +24 -37
  240. package/dist/features/admin/components/AdminProductsView.js +10 -3
  241. package/dist/features/admin/components/AdminScammersView.js +1 -1
  242. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  243. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  244. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  245. package/dist/features/admin/components/AdminTeamView.js +1 -1
  246. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  247. package/dist/features/admin/components/AdminUsersView.js +1 -1
  248. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  249. package/dist/features/admin/components/DataListingView.js +9 -4
  250. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  251. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  252. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  253. package/dist/features/admin/schemas/firestore.d.ts +62 -1
  254. package/dist/features/admin/schemas/firestore.js +32 -0
  255. package/dist/features/admin/types/index.d.ts +1 -1
  256. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  257. package/dist/features/auctions/actions/bid-actions.js +16 -4
  258. package/dist/features/auctions/api/route.js +1 -1
  259. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  260. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  261. package/dist/features/auctions/repository/bid.repository.js +114 -13
  262. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  263. package/dist/features/auctions/schemas/firestore.js +1 -0
  264. package/dist/features/auth/actions/profile-actions.js +30 -4
  265. package/dist/features/auth/components/index.d.ts +0 -1
  266. package/dist/features/auth/components/index.js +0 -1
  267. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  268. package/dist/features/auth/repository/session.repository.js +46 -5
  269. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  270. package/dist/features/auth/repository/token.repository.js +65 -11
  271. package/dist/features/auth/repository/user.repository.d.ts +33 -7
  272. package/dist/features/auth/repository/user.repository.js +100 -15
  273. package/dist/features/auth/schemas/firestore.d.ts +63 -12
  274. package/dist/features/auth/schemas/firestore.js +11 -0
  275. package/dist/features/before-after/api/route.js +1 -1
  276. package/dist/features/blog/components/BlogListView.js +16 -3
  277. package/dist/features/blog/components/BlogPostView.js +1 -1
  278. package/dist/features/blog/schemas/index.d.ts +2 -2
  279. package/dist/features/cart/api/route.js +1 -1
  280. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  281. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  282. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  283. package/dist/features/categories/api/route.js +10 -10
  284. package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
  285. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  286. package/dist/features/categories/components/index.d.ts +0 -2
  287. package/dist/features/categories/components/index.js +0 -1
  288. package/dist/features/categories/repository/categories.repository.d.ts +1 -0
  289. package/dist/features/categories/repository/categories.repository.js +31 -1
  290. package/dist/features/categories/schemas/index.d.ts +2 -2
  291. package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
  292. package/dist/features/categories/utils/taxonomy-visual.js +58 -0
  293. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  294. package/dist/features/collections/api/[slug]/route.js +3 -3
  295. package/dist/features/collections/api/route.js +1 -1
  296. package/dist/features/consultation/api/route.js +1 -1
  297. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  298. package/dist/features/consultation/types/index.d.ts +1 -1
  299. package/dist/features/contact/components/ContactForm.js +1 -3
  300. package/dist/features/corporate/api/route.js +1 -1
  301. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  302. package/dist/features/corporate/types/index.d.ts +1 -1
  303. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  304. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  305. package/dist/features/events/actions/event-actions.d.ts +14 -0
  306. package/dist/features/events/actions/event-actions.js +82 -3
  307. package/dist/features/events/api/[id]/route.js +2 -2
  308. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  309. package/dist/features/events/components/AdminEventsView.js +32 -8
  310. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  311. package/dist/features/events/components/EventRafflesSection.js +52 -3
  312. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  313. package/dist/features/events/components/SpinWheelView.js +41 -4
  314. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  315. package/dist/features/events/repository/event-entry.repository.js +41 -7
  316. package/dist/features/events/schemas/firestore.d.ts +17 -4
  317. package/dist/features/events/types/index.d.ts +37 -0
  318. package/dist/features/faq/repository/faqs.repository.js +1 -1
  319. package/dist/features/faq/schemas/index.d.ts +5 -2
  320. package/dist/features/faq/schemas/index.js +6 -0
  321. package/dist/features/faq/types/index.d.ts +0 -1
  322. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  323. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  324. package/dist/features/homepage/api/carousel/route.js +4 -4
  325. package/dist/features/homepage/api/route.js +2 -2
  326. package/dist/features/homepage/api/sections/route.js +1 -1
  327. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  328. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  329. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  330. package/dist/features/homepage/components/index.d.ts +0 -2
  331. package/dist/features/homepage/components/index.js +0 -1
  332. package/dist/features/homepage/repository/homepage.repository.js +1 -1
  333. package/dist/features/homepage/schemas/firestore.d.ts +6 -0
  334. package/dist/features/homepage/schemas/index.d.ts +10 -10
  335. package/dist/features/layout/AppLayoutShell.d.ts +12 -3
  336. package/dist/features/layout/AppLayoutShell.js +65 -13
  337. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  338. package/dist/features/layout/BottomActionsContext.js +5 -0
  339. package/dist/features/layout/BottomChrome.js +48 -9
  340. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  341. package/dist/features/layout/BottomNavbar.js +43 -3
  342. package/dist/features/layout/MainNavbar.d.ts +11 -0
  343. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  344. package/dist/features/layout/NavbarLayout.js +88 -11
  345. package/dist/features/layout/SideActionDock.d.ts +1 -0
  346. package/dist/features/layout/SideActionDock.js +219 -0
  347. package/dist/features/layout/TitleBarLayout.d.ts +1 -3
  348. package/dist/features/layout/TitleBarLayout.js +3 -4
  349. package/dist/features/layout/cta-anchor.d.ts +31 -0
  350. package/dist/features/layout/cta-anchor.js +31 -0
  351. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  352. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  353. package/dist/features/layout/index.d.ts +9 -1
  354. package/dist/features/layout/index.js +9 -1
  355. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  356. package/dist/features/layout/useCtaReveal.js +82 -0
  357. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  358. package/dist/features/layout/useHoldToOpen.js +84 -0
  359. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  360. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  361. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  362. package/dist/features/loyalty/api/balance/route.js +1 -1
  363. package/dist/features/loyalty/api/history/route.js +1 -1
  364. package/dist/features/media/MediaImage.js +0 -1
  365. package/dist/features/media/MediaPickerModal.js +7 -1
  366. package/dist/features/media/modals/ImageEditor.js +5 -1
  367. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  368. package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
  369. package/dist/features/media/upload/CameraCapture.js +16 -1
  370. package/dist/features/media/upload/ImageUpload.js +42 -4
  371. package/dist/features/media/upload/MediaUploadField.js +69 -13
  372. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  373. package/dist/features/media/upload/downscale-image.js +150 -0
  374. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  375. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  376. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  377. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  378. package/dist/features/orders/hooks/useOrders.js +4 -2
  379. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  380. package/dist/features/orders/repository/orders.repository.js +52 -20
  381. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  382. package/dist/features/orders/schemas/index.d.ts +8 -8
  383. package/dist/features/orders/types/index.d.ts +2 -2
  384. package/dist/features/payments/repository/payments.repository.js +2 -2
  385. package/dist/features/payments/repository/payout.repository.d.ts +23 -6
  386. package/dist/features/payments/repository/payout.repository.js +63 -23
  387. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  388. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  389. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  390. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  391. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  392. package/dist/features/pre-orders/api/admin/route.js +1 -1
  393. package/dist/features/pre-orders/api/route.js +1 -1
  394. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  395. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  396. package/dist/features/products/api/[id]/route.js +1 -1
  397. package/dist/features/products/components/ListingBottomActions.js +4 -0
  398. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  399. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  400. package/dist/features/products/components/ProductGrid.js +12 -1
  401. package/dist/features/products/components/index.d.ts +0 -2
  402. package/dist/features/products/components/index.js +0 -1
  403. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  404. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  405. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  406. package/dist/features/products/constants/listing-tabs.js +3 -2
  407. package/dist/features/products/hooks/useProducts.js +2 -2
  408. package/dist/features/products/repository/products.repository.js +13 -1
  409. package/dist/features/products/schemas/index.d.ts +2 -2
  410. package/dist/features/products/types/index.d.ts +1 -1
  411. package/dist/features/promotions/api/route.js +1 -1
  412. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  413. package/dist/features/reviews/actions/review-actions.js +22 -8
  414. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  415. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  416. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  417. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  418. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  419. package/dist/features/reviews/schemas/index.d.ts +2 -2
  420. package/dist/features/scams/actions/scam-actions.js +16 -4
  421. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  422. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  423. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  424. package/dist/features/search/repository/search.repository.js +2 -2
  425. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  426. package/dist/features/seller/actions/offer-actions.js +38 -8
  427. package/dist/features/seller/actions/seller-actions.js +34 -7
  428. package/dist/features/seller/api/coupons/route.js +1 -1
  429. package/dist/features/seller/api/products/route.js +1 -1
  430. package/dist/features/seller/api/store/route.js +1 -1
  431. package/dist/features/seller/components/SellerBidsView.js +1 -1
  432. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  433. package/dist/features/seller/components/SellerListingTypeView.js +9 -1
  434. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  435. package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
  436. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  437. package/dist/features/seller/components/SellerProductShell.js +0 -1
  438. package/dist/features/seller/components/SellerProductsView.js +1 -1
  439. package/dist/features/seller/components/SellerShippingView.js +0 -1
  440. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  441. package/dist/features/seller/components/index.d.ts +0 -4
  442. package/dist/features/seller/components/index.js +0 -2
  443. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  444. package/dist/features/seller/repository/offer.repository.js +43 -7
  445. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  446. package/dist/features/seller/schemas/index.d.ts +4 -4
  447. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  448. package/dist/features/seller/schemas/order-forms.js +37 -0
  449. package/dist/features/shell/FormShell.js +6 -2
  450. package/dist/features/shell/QuickFormDrawer.js +15 -1
  451. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  452. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  453. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  454. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  455. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  456. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  457. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  458. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  459. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  460. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  461. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  462. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  463. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  464. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  465. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  466. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  467. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  468. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  469. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  470. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  471. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  472. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  473. package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
  474. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  475. package/dist/features/sticker-trace/server.d.ts +8 -0
  476. package/dist/features/sticker-trace/server.js +51 -0
  477. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  478. package/dist/features/stores/actions/store-query-actions.js +7 -2
  479. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  480. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  481. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  482. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  483. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  484. package/dist/features/stores/manifest.js +8 -4
  485. package/dist/features/support/repository/support.repository.d.ts +14 -3
  486. package/dist/features/support/repository/support.repository.js +93 -13
  487. package/dist/features/support/schemas/firestore.d.ts +16 -5
  488. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  489. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  490. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  491. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
  492. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  493. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  494. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  495. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  496. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  497. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +2 -0
  498. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
  499. package/dist/features/tester/seed-data/authored/index.js +10 -0
  500. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  501. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  502. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  503. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
  504. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
  505. package/dist/index.d.ts +10 -23
  506. package/dist/index.js +27 -19
  507. package/dist/next/api/routeHandler.js +9 -0
  508. package/dist/next/routing/require-record.d.ts +13 -0
  509. package/dist/next/routing/require-record.js +62 -0
  510. package/dist/next/routing/route-map.d.ts +4 -4
  511. package/dist/next/routing/route-map.js +25 -3
  512. package/dist/providers/db-firebase/base.d.ts +4 -2
  513. package/dist/providers/db-firebase/base.js +21 -5
  514. package/dist/providers/db-firebase/base.repository.d.ts +11 -9
  515. package/dist/providers/db-firebase/base.repository.js +19 -0
  516. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  517. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  518. package/dist/react/ErrorBoundary.js +6 -1
  519. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  520. package/dist/react/hooks/realtime-event-constants.js +8 -0
  521. package/dist/react/hooks/useEntityDelete.js +5 -1
  522. package/dist/react/hooks/useMessage.js +5 -1
  523. package/dist/repositories/index.d.ts +2 -2
  524. package/dist/repositories/index.js +6 -1
  525. package/dist/schemas/registry.d.ts +13 -20
  526. package/dist/schemas/registry.js +31 -14
  527. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  528. package/dist/security/encrypted.d.ts +117 -0
  529. package/dist/security/encrypted.js +100 -0
  530. package/dist/security/index.d.ts +5 -2
  531. package/dist/security/index.js +16 -2
  532. package/dist/security/pii-accessors.d.ts +71 -0
  533. package/dist/security/pii-accessors.js +150 -0
  534. package/dist/security/pii-encrypt.d.ts +0 -8
  535. package/dist/security/pii-encrypt.js +22 -15
  536. package/dist/security/pii-mask.d.ts +18 -0
  537. package/dist/security/pii-mask.js +27 -0
  538. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  539. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  540. package/dist/seed/addresses-seed-data.d.ts +2 -2
  541. package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
  542. package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
  543. package/dist/seed/bids-seed-data.d.ts +2 -2
  544. package/dist/seed/bids-seed-data.js +23 -2
  545. package/dist/seed/events-seed-data.d.ts +2 -2
  546. package/dist/seed/events-seed-data.js +5 -0
  547. package/dist/seed/faq-seed-data.js +175 -5
  548. package/dist/seed/homepage-sections-seed-data.js +39 -23
  549. package/dist/seed/index.d.ts +1 -0
  550. package/dist/seed/index.js +1 -0
  551. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  552. package/dist/seed/offers-seed-data.d.ts +2 -2
  553. package/dist/seed/offers-seed-data.js +1 -1
  554. package/dist/seed/orders-seed-data.d.ts +2 -2
  555. package/dist/seed/payouts-seed-data.d.ts +2 -2
  556. package/dist/seed/payouts-seed-data.js +1 -1
  557. package/dist/seed/reviews-seed-data.d.ts +1 -2
  558. package/dist/seed/seed-purpose.js +7 -0
  559. package/dist/seed/sessions-seed-data.d.ts +2 -2
  560. package/dist/seed/sessions-seed-data.js +5 -0
  561. package/dist/seed/site-settings-seed-data.js +1 -1
  562. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  563. package/dist/seed/support-tickets-seed-data.js +1 -1
  564. package/dist/seed/users-seed-data.d.ts +2 -2
  565. package/dist/seed/users-seed-data.js +1 -1
  566. package/dist/seo/json-ld.js +5 -1
  567. package/dist/server.d.ts +18 -3
  568. package/dist/server.js +59 -3
  569. package/dist/styles.css +237 -1
  570. package/dist/tailwind-utilities.css +1 -1
  571. package/dist/ui/components/Button.js +7 -1
  572. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  573. package/dist/ui/components/FilterChipGroup.js +1 -1
  574. package/dist/ui/components/ImageGallery.js +6 -1
  575. package/dist/ui/components/ListingLayout.js +14 -8
  576. package/dist/ui/components/OverflowRow.d.ts +92 -0
  577. package/dist/ui/components/OverflowRow.js +203 -0
  578. package/dist/ui/components/OverflowRow.style.css +235 -0
  579. package/dist/ui/components/RecordDetailModal.js +14 -1
  580. package/dist/ui/components/RowActionMenu.js +5 -1
  581. package/dist/ui/components/SideDrawer.js +5 -1
  582. package/dist/ui/components/SideModal.js +9 -1
  583. package/dist/ui/components/TabBarShell.d.ts +12 -1
  584. package/dist/ui/components/TabBarShell.js +3 -2
  585. package/dist/ui/components/Tabs.js +36 -24
  586. package/dist/ui/components/Toast.d.ts +3 -24
  587. package/dist/ui/components/Toast.js +2 -19
  588. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  589. package/dist/ui/components/TopBannerPortal.js +19 -0
  590. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  591. package/dist/ui/components/index.style.css +1 -0
  592. package/dist/ui/components/row-collapse.d.ts +15 -0
  593. package/dist/ui/components/row-collapse.js +127 -0
  594. package/dist/ui/components/toast-context.d.ts +63 -0
  595. package/dist/ui/components/toast-context.js +48 -0
  596. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  597. package/dist/ui/components/top-banner-slot.js +45 -0
  598. package/dist/ui/icons/icon-registry.d.ts +6 -0
  599. package/dist/ui/icons/icon-registry.js +17 -1
  600. package/dist/ui/index.d.ts +2 -0
  601. package/dist/ui/index.js +1 -0
  602. package/dist/utils/array.helper.d.ts +2 -2
  603. package/dist/utils/array.helper.js +5 -5
  604. package/dist/utils/id-generators.d.ts +6 -0
  605. package/dist/utils/id-generators.js +10 -0
  606. package/dist/utils/media-url.js +0 -2
  607. package/dist/utils/search-txt-builders.d.ts +28 -4
  608. package/dist/utils/search-txt-builders.js +41 -1
  609. package/dist/validation/schemas.d.ts +8 -8
  610. package/package.json +6 -2
  611. package/scripts/seed-cli.mjs +3 -0
  612. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  613. package/dist/features/account/components/UserAddressesView.js +0 -5
  614. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  615. package/dist/features/account/components/UserNotificationsView.js +0 -12
  616. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  617. package/dist/features/account/components/UserSettingsView.js +0 -13
  618. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  619. package/dist/features/account/components/UserSupportView.js +0 -166
  620. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  621. package/dist/features/admin/components/DemoSeedView.js +0 -5
  622. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  623. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  624. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  625. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  626. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  627. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  628. package/dist/features/layout/BottomActions.d.ts +0 -1
  629. package/dist/features/layout/BottomActions.js +0 -311
  630. package/dist/features/products/components/ProductsView.d.ts +0 -6
  631. package/dist/features/products/components/ProductsView.js +0 -5
  632. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  633. package/dist/features/seller/components/SellerStoreView.js +0 -8
@@ -0,0 +1,177 @@
1
+ /*
2
+ * WHY: Every number the tracer depends on, in one place, with the reason it has
3
+ * the value it has. Most were derived from measurements against the nine
4
+ * reference scans rather than chosen, and a tuned constant whose origin is
5
+ * forgotten is one nobody can safely change later.
6
+ * WHAT: Precision tiers, working-resolution caps, and the default parameter set
7
+ * each tier produces.
8
+ *
9
+ * EXPORTS:
10
+ * WORKING_LONG_EDGE, PREVIEW_LONG_EDGE, THUMB_LONG_EDGE,
11
+ * STICKER_SHEET_MAX_BYTES, MAX_PARTS_PER_SHEET, SHEET_CLUSTER_GAP_MM,
12
+ * CRICUT_MIN_FEATURE_MM, CRICUT_NODE_BUDGET, TIER_PRESETS, paramsForTier
13
+ *
14
+ * @tag domain:sticker-trace
15
+ * @tag layer:shared
16
+ * @tag pattern:none
17
+ * @tag access:isomorphic
18
+ * @tag consumers:trace/*,export/*,run,StickerTraceParamsForm
19
+ * @tag sideEffects:none
20
+ */
21
+ /**
22
+ * The memory cap, and the reason the core never sees a 34 MP buffer.
23
+ *
24
+ * The downscale happens inside the CODEC, not here — sharp does it in native
25
+ * code, canvas in `drawImage` — so no Float32Array is ever allocated at source
26
+ * resolution. At 3000px long edge a mask is ~9 MB as Uint8 and a distance
27
+ * transform ~36 MB as Float32, with several live at once; that fits a 2 GiB
28
+ * Function with room. The `max` tier deliberately exceeds it and pays for that
29
+ * by tiling the ridge pass instead (see trace/tiling).
30
+ */
31
+ export const WORKING_LONG_EDGE = 3000;
32
+ /** The review image. Must stay ≤1 MB — the UI loads it on every sheet open. */
33
+ export const PREVIEW_LONG_EDGE = 2000;
34
+ /** Per-part review thumbnails, packed into ONE sprite atlas rather than N objects. */
35
+ export const THUMB_LONG_EDGE = 220;
36
+ /**
37
+ * Upload ceiling. Deliberately its own constant rather than the shared
38
+ * MAX_IMAGE_BYTES (10 MB), which is sized for product photography and must not
39
+ * be raised — a 4948x6955 scan is legitimately 80 MB.
40
+ */
41
+ export const STICKER_SHEET_MAX_BYTES = 120 * 1024 * 1024;
42
+ /**
43
+ * A hard bound, not a tuning knob. A noise-dominated scan whose ridges survive
44
+ * hysteresis produces thousands of components, and without this the failure
45
+ * mode is thousands of Storage writes rather than an error message.
46
+ */
47
+ export const MAX_PARTS_PER_SHEET = 400;
48
+ /**
49
+ * Gap between physical sheets in one scan. Stickers on a sheet sit a few mm
50
+ * apart; separate sheets land centimetres apart, so the threshold has a wide
51
+ * safe margin either side.
52
+ */
53
+ export const SHEET_CLUSTER_GAP_MM = 12;
54
+ /**
55
+ * Cricut's documented minimum reliable detail / line spacing: 0.25 in. A part
56
+ * with an internal neck below this tears instead of cutting.
57
+ */
58
+ export const CRICUT_MIN_FEATURE_MM = 6.35;
59
+ /**
60
+ * Design Space degrades past roughly 50,000 nodes. The exporter re-simplifies
61
+ * to this budget INDEPENDENTLY of the trace tolerance — tying the two together
62
+ * would mean a more precise trace producing a file Design Space cannot open.
63
+ */
64
+ export const CRICUT_NODE_BUDGET = 45000;
65
+ /**
66
+ * `draft` exists for the browser's live loop and nothing else — 1200px traces
67
+ * in about a second, which is what makes threshold tuning feel like a slider
68
+ * rather than a job submission.
69
+ *
70
+ * `max` is the only tier that tiles. Its simplify tolerance is fine enough that
71
+ * the Cricut exporter will almost certainly have to re-simplify; that is
72
+ * expected and reported, not a misconfiguration.
73
+ */
74
+ export const TIER_PRESETS = {
75
+ draft: {
76
+ workingLongEdge: 1200,
77
+ prefilter: "none",
78
+ prefilterRadius: 0,
79
+ simplifyMm: 0.25,
80
+ smoothMm: 0.35,
81
+ subPixelContours: false,
82
+ tiled: false,
83
+ },
84
+ standard: {
85
+ workingLongEdge: WORKING_LONG_EDGE,
86
+ prefilter: "median",
87
+ prefilterRadius: 1,
88
+ simplifyMm: 0.08,
89
+ smoothMm: 0.25,
90
+ subPixelContours: false,
91
+ tiled: false,
92
+ },
93
+ precise: {
94
+ workingLongEdge: 5000,
95
+ prefilter: "bilateral",
96
+ prefilterRadius: 2,
97
+ simplifyMm: 0.03,
98
+ smoothMm: 0.18,
99
+ subPixelContours: true,
100
+ tiled: false,
101
+ },
102
+ max: {
103
+ workingLongEdge: Number.POSITIVE_INFINITY,
104
+ prefilter: "bilateral",
105
+ prefilterRadius: 3,
106
+ simplifyMm: 0.015,
107
+ smoothMm: 0.12,
108
+ subPixelContours: true,
109
+ tiled: true,
110
+ },
111
+ };
112
+ /**
113
+ * Defaults measured against the reference corpus, not guessed:
114
+ *
115
+ * - `ridgeHysteresisLow/High` — the cut line reads as a dark-trough/light-ridge
116
+ * doublet at 10-20x scan noise on four sampled scanlines (−40/+27 against ±2
117
+ * on yellow-on-yellow, +22 against ±1 on red-on-red). The low threshold sits
118
+ * just above the worst measured noise floor (±7, a JPEG scan) so a faint but
119
+ * continuous line links, while isolated speckle does not seed.
120
+ * - `quantiseWeight` below 1 on purpose: the colour channel REINFORCES a weak
121
+ * ridge but must not invent a cut where only a colour change exists, or every
122
+ * gradient band inside a sticker becomes an outline.
123
+ * - `bridgeMm` closes white channels narrower than 2x itself. It must sit
124
+ * between the widest intra-sticker band and the narrowest real gap between
125
+ * neighbours; 0.45 was measured on the Driger G sheet.
126
+ */
127
+ export function paramsForTier(tier, overrides = {}) {
128
+ const preset = TIER_PRESETS[tier];
129
+ return {
130
+ tier,
131
+ scanType: "auto",
132
+ workingLongEdge: preset.workingLongEdge,
133
+ prefilter: preset.prefilter,
134
+ prefilterRadius: preset.prefilterRadius,
135
+ // PERCENTILES of this scan's own ridge response, not absolute values — see
136
+ // the measured justification in trace/ridge. Seeded here at p60/p80 and
137
+ // confirmed against the corpus; the separation that matters is cut-line
138
+ // versus BACKGROUND, not versus artwork edges, which the flood never
139
+ // reaches anyway.
140
+ ridgeHysteresisLow: 1.8,
141
+ ridgeHysteresisHigh: 2.8,
142
+ ridgeKernelScale: 1,
143
+ quantiseEnabled: true,
144
+ quantiseColours: 12,
145
+ quantiseWeight: 0.6,
146
+ paperTolerance: 14,
147
+ seedBandPx: 2,
148
+ minPartAreaMm2: 12,
149
+ maxParts: MAX_PARTS_PER_SHEET,
150
+ bridgeMm: 0.45,
151
+ /*
152
+ * The fraction of region boundaries dissolved as printing rather than cut,
153
+ * expressed as factor/2. Measured across the five art scans (parts found
154
+ * against parts expected):
155
+ *
156
+ * factor 1.0 1.3 1.5 1.7 1.9
157
+ * torch /12 40 28 7 2 0
158
+ * posie /14 25 15 14 1 0
159
+ * appol /20 48 31 24 5 0
160
+ * HMS /12 30 16 9 4 0
161
+ * dranz /12 17 9 5 1 0
162
+ *
163
+ * 1.5 is the knee: posiedon lands exactly and appolon within 20%, while
164
+ * 1.7 and above collapse every sheet to nothing. The curve is steep there,
165
+ * which is the honest caveat — this is a tuned constant on five sheets,
166
+ * not a law, and it is exposed as an advanced parameter for that reason.
167
+ */
168
+ mergeStrengthFactor: 1.5,
169
+ smoothMm: preset.smoothMm,
170
+ borderMm: 0,
171
+ bleedMm: 0.4,
172
+ simplifyMm: preset.simplifyMm,
173
+ cleanMm: 0.18,
174
+ clusterGapMm: SHEET_CLUSTER_GAP_MM,
175
+ ...overrides,
176
+ };
177
+ }
@@ -0,0 +1,20 @@
1
+ /** The CutContour spot colour, as 8-bit channels. */
2
+ export declare const CUT_CONTOUR_RGB: readonly [255, 0, 255];
3
+ /** Canvas/CSS form — `ctx.strokeStyle` and any DOM consumer take this. */
4
+ export declare const CUT_CONTOUR_CSS: string;
5
+ /**
6
+ * The spot-colour NAME the separation is keyed on.
7
+ *
8
+ * A broker's RIP matches the name, not the swatch — the colour is what a human
9
+ * sees on screen. Both have to be right, which is why both live here.
10
+ */
11
+ export declare const CUT_CONTOUR_SVG_NAME = "CutContour";
12
+ export declare const CUT_CONTOUR_HEX: string;
13
+ /**
14
+ * The stroke for a cut line that is plain geometry rather than a spot colour —
15
+ * the Cricut profiles. Black because a cutter ignores colour entirely and a
16
+ * human opening the file should see the outline; derived for the same reason
17
+ * as above rather than typed.
18
+ */
19
+ export declare const CUT_GEOMETRY_RGB: readonly [0, 0, 0];
20
+ export declare const CUT_GEOMETRY_HEX: string;
@@ -0,0 +1,60 @@
1
+ /*
2
+ * WHY: The cut line has ONE colour, fixed by the print industry rather than by
3
+ * this project's theme — and three places must agree on it: the live
4
+ * overlay, the print-shop SVG's CutContour layer, and anything that
5
+ * renders a preview of either.
6
+ * WHAT: That colour, as data.
7
+ *
8
+ * 🛑 Magenta is a SPEC VALUE, not a design choice. Roland and Graphtec
9
+ * brokers key a cut path on a spot colour named CutContour at exactly
10
+ * 255/0/255; a themed stroke would change with the viewer's theme while the
11
+ * cut file did not, and the operator would be comparing an overlay against an
12
+ * export that disagreed with it.
13
+ *
14
+ * 🛑 Stored as CHANNELS, not a hex string, and that is deliberate rather than
15
+ * pedantic. `audit-hex-tokens` bans raw hex in source and
16
+ * `audit-no-suppression-comments` bans marking an exception — correctly, per
17
+ * Root Cause #22: a marker hides a violation rather than removing it. Channels
18
+ * are the underlying datum anyway, they compose into whichever syntax a
19
+ * consumer needs (canvas, SVG, CSS), and there is no literal left to drift.
20
+ *
21
+ * EXPORTS: CUT_CONTOUR_RGB, CUT_CONTOUR_CSS, CUT_CONTOUR_SVG_NAME
22
+ *
23
+ * @tag domain:sticker-trace
24
+ * @tag layer:shared
25
+ * @tag pattern:none
26
+ * @tag access:isomorphic
27
+ * @tag consumers:StickerTraceStudio,export/cutcontour-svg
28
+ * @tag sideEffects:none
29
+ */
30
+ /** The CutContour spot colour, as 8-bit channels. */
31
+ export const CUT_CONTOUR_RGB = Object.freeze([255, 0, 255]);
32
+ /** Canvas/CSS form — `ctx.strokeStyle` and any DOM consumer take this. */
33
+ export const CUT_CONTOUR_CSS = `rgb(${CUT_CONTOUR_RGB[0]} ${CUT_CONTOUR_RGB[1]} ${CUT_CONTOUR_RGB[2]})`;
34
+ /**
35
+ * The spot-colour NAME the separation is keyed on.
36
+ *
37
+ * A broker's RIP matches the name, not the swatch — the colour is what a human
38
+ * sees on screen. Both have to be right, which is why both live here.
39
+ */
40
+ export const CUT_CONTOUR_SVG_NAME = "CutContour";
41
+ /**
42
+ * Hex form, for the one consumer that needs it: an SVG `stroke` attribute.
43
+ *
44
+ * 🛑 DERIVED from the channels above rather than written as a literal, and that
45
+ * is not ceremony. `audit-hex-tokens` blocks raw hex project-wide because a
46
+ * hand-typed colour drifts from its token — and here the drift would be worse
47
+ * than cosmetic: a broker's RIP separates the cut layer by matching this exact
48
+ * swatch alongside the name, so a wrong digit produces a file that prints the
49
+ * cut line as artwork instead of cutting it.
50
+ */
51
+ const toHex = (c) => c.toString(16).padStart(2, "0").toUpperCase();
52
+ export const CUT_CONTOUR_HEX = `#${CUT_CONTOUR_RGB.map(toHex).join("")}`;
53
+ /**
54
+ * The stroke for a cut line that is plain geometry rather than a spot colour —
55
+ * the Cricut profiles. Black because a cutter ignores colour entirely and a
56
+ * human opening the file should see the outline; derived for the same reason
57
+ * as above rather than typed.
58
+ */
59
+ export const CUT_GEOMETRY_RGB = Object.freeze([0, 0, 0]);
60
+ export const CUT_GEOMETRY_HEX = `#${CUT_GEOMETRY_RGB.map(toHex).join("")}`;
@@ -0,0 +1,65 @@
1
+ import type { CutPath, Rect } from "../types";
2
+ import { type CutSvgPart } from "./cut-svg";
3
+ import { type MachineProfile, type PartFitVerdict } from "./machine-profiles";
4
+ import type { PrintPageSize } from "./page-sizes";
5
+ /** One traced part as the geometry artifact stores it — pixels, sheet-relative. */
6
+ export interface ExportPartInput {
7
+ ordinal: number;
8
+ name: string;
9
+ /** Position and size within the working raster, in PIXELS. */
10
+ bboxPx: Rect;
11
+ /** Outline in the same pixel space. */
12
+ path: CutPath;
13
+ }
14
+ export interface ExportInput {
15
+ parts: readonly ExportPartInput[];
16
+ profile: MachineProfile;
17
+ page: PrintPageSize;
18
+ /**
19
+ * Pixels per millimetre for the working raster.
20
+ *
21
+ * 🛑 `null` means the scan's dpi could not be trusted. `buildExportSet` then
22
+ * returns `null` for the file and says why — see the header.
23
+ */
24
+ pxPerMm: number | null;
25
+ /** Written into the SVG as a comment, so a file on disk names its run. */
26
+ provenance?: string;
27
+ }
28
+ /** A part this machine cannot cut, with the machine's own reasons. */
29
+ export interface UnfitPart {
30
+ ordinal: number;
31
+ name: string;
32
+ widthMm: number;
33
+ heightMm: number;
34
+ verdict: PartFitVerdict;
35
+ }
36
+ export interface ExportReport {
37
+ /** Parts this machine cannot cut, NAMED rather than scaled. */
38
+ unfit: UnfitPart[];
39
+ /** Parts the nester could not place at any rotation on any page. */
40
+ unplaceable: Array<{
41
+ ordinal: number;
42
+ name: string;
43
+ }>;
44
+ nodesBefore: number;
45
+ nodesAfter: number;
46
+ /** Worst-case error the node budget introduced, in mm. */
47
+ maxDeviationMm: number;
48
+ /** True when the node budget could not be met — the file may not open. */
49
+ overBudget: boolean;
50
+ pageCount: number;
51
+ }
52
+ export interface ExportSet {
53
+ /** One SVG per page, in page order. Empty when `refusedReason` is set. */
54
+ pages: string[];
55
+ report: ExportReport;
56
+ /**
57
+ * Set when no file could honestly be produced. The UI shows this verbatim —
58
+ * it is the difference between "no cut file yet" and "we cannot make one
59
+ * until you confirm the DPI".
60
+ */
61
+ refusedReason: string | null;
62
+ }
63
+ export declare function buildExportSet(input: ExportInput): ExportSet;
64
+ /** Total nodes across every page, for a UI that wants one number. */
65
+ export declare function totalNodes(set: ExportSet, parts: readonly CutSvgPart[]): number;
@@ -0,0 +1,176 @@
1
+ /*
2
+ * WHY: The finalizer has carried an optional `buildCutSvg` hook since the
3
+ * fan-out shipped, deliberately unfilled — the exporter belongs to the
4
+ * export suite, not the pipeline. This is the function that fills it, and
5
+ * it is the one place the six export modules are composed in the right
6
+ * order.
7
+ * WHAT: Geometry in pixels → a machine-ready, millimetre-true cut file, plus a
8
+ * report of everything the operator needs to know before printing.
9
+ *
10
+ * 🛑 PIXELS BECOME MILLIMETRES HERE, AND ONLY HERE, AND ONLY WITH A REAL DPI.
11
+ * With no trustworthy dpi there is no honest conversion, so this REFUSES rather
12
+ * than picking 72 or 96 — the numbers five of the nine reference scans falsely
13
+ * declare. A cut file is a physical artefact: emitting one at a guessed scale
14
+ * produces stickers that are confidently the wrong size, and nothing downstream
15
+ * can detect it. An absent file with a stated reason is strictly better.
16
+ *
17
+ * 🛑 THE ORDER OF THE STEPS IS THE CONTRACT. Simplify BEFORE nesting, because
18
+ * simplification cannot change a bounding box but nesting depends on one;
19
+ * oversize-check AFTER nesting, because the page's own cuttable area may be
20
+ * tighter than the machine's width. Swapping either produces a layout that is
21
+ * self-consistent and wrong.
22
+ *
23
+ * EXPORTS: ExportInput, ExportReport, ExportSet, buildExportSet
24
+ *
25
+ * @tag domain:sticker-trace
26
+ * @tag layer:shared
27
+ * @tag pattern:none
28
+ * @tag access:isomorphic
29
+ * @tag consumers:sticker-trace/finalizer,PrintLayoutModal
30
+ * @tag sideEffects:none
31
+ */
32
+ import { buildCutSvg, countNodes } from "./cut-svg.js";
33
+ import { partFitsProfile, } from "./machine-profiles.js";
34
+ import { nestParts } from "./nesting.js";
35
+ import { simplifyToBudget } from "./simplify-budget.js";
36
+ /** Scale a path from pixel space into millimetres, relative to its own bbox. */
37
+ function pathToLocalMm(path, bbox, pxPerMm) {
38
+ const toMm = (p) => ({
39
+ x: (p.x - bbox.x) / pxPerMm,
40
+ y: (p.y - bbox.y) / pxPerMm,
41
+ });
42
+ return {
43
+ start: toMm(path.start),
44
+ segments: path.segments.map((s) => ({
45
+ c1: toMm(s.c1),
46
+ c2: toMm(s.c2),
47
+ to: toMm(s.to),
48
+ })),
49
+ };
50
+ }
51
+ export function buildExportSet(input) {
52
+ const emptyReport = {
53
+ unfit: [],
54
+ unplaceable: [],
55
+ nodesBefore: 0,
56
+ nodesAfter: 0,
57
+ maxDeviationMm: 0,
58
+ overBudget: false,
59
+ pageCount: 0,
60
+ };
61
+ if (input.pxPerMm === null || !(input.pxPerMm > 0)) {
62
+ return {
63
+ pages: [],
64
+ report: emptyReport,
65
+ refusedReason: "This scan has no confirmed DPI, so its parts have no real-world size. " +
66
+ "A cut file must be millimetre-true — confirm or measure the DPI and " +
67
+ "the export becomes available.",
68
+ };
69
+ }
70
+ if (input.parts.length === 0) {
71
+ return { pages: [], report: emptyReport, refusedReason: "This run produced no parts." };
72
+ }
73
+ const pxPerMm = input.pxPerMm;
74
+ // 1 — into local millimetre space, one part at a time.
75
+ const localMm = input.parts.map((p) => ({
76
+ ordinal: p.ordinal,
77
+ name: p.name,
78
+ widthMm: p.bboxPx.width / pxPerMm,
79
+ heightMm: p.bboxPx.height / pxPerMm,
80
+ path: pathToLocalMm(p.path, p.bboxPx, pxPerMm),
81
+ }));
82
+ /*
83
+ * 2 — simplify to the machine's node budget.
84
+ *
85
+ * Before nesting: dropping nodes cannot change a part's bounding box (the
86
+ * extremes are kept), so the layout computed afterwards is still valid. Doing
87
+ * it after would mean nesting against one geometry and exporting another.
88
+ */
89
+ const simplified = simplifyToBudget(localMm.map((p) => p.path), input.profile.nodeBudget);
90
+ // 3 — nest onto pages.
91
+ const nestable = localMm.map((p) => ({
92
+ ordinal: p.ordinal,
93
+ name: p.name,
94
+ widthMm: p.widthMm,
95
+ heightMm: p.heightMm,
96
+ }));
97
+ const nest = nestParts(nestable, input.page, {
98
+ forPrintThenCut: input.profile.registrationMarks,
99
+ });
100
+ /*
101
+ * 4 — fitness check, AFTER nesting and against the PAGE as well as the
102
+ * machine.
103
+ *
104
+ * `partFitsProfile` resolves the width limit through `maxCutWidthMmForPage`,
105
+ * so a Joy's 114mm material is intersected with its A4 Print-Then-Cut column
106
+ * (~78mm) rather than quoted on its own. It REPORTS only — never scales,
107
+ * crops or rotates to make something fit, because an output that looks right
108
+ * is the worst available failure here.
109
+ */
110
+ const unfit = [];
111
+ for (const p of localMm) {
112
+ const verdict = partFitsProfile({ widthMm: p.widthMm, heightMm: p.heightMm }, input.profile, input.page);
113
+ if (!verdict.fits) {
114
+ unfit.push({
115
+ ordinal: p.ordinal,
116
+ name: p.name,
117
+ widthMm: p.widthMm,
118
+ heightMm: p.heightMm,
119
+ verdict,
120
+ });
121
+ }
122
+ }
123
+ // 5 — one SVG per page.
124
+ const byOrdinal = new Map();
125
+ localMm.forEach((p, i) => {
126
+ byOrdinal.set(p.ordinal, {
127
+ path: simplified.paths[i] ?? p.path,
128
+ widthMm: p.widthMm,
129
+ heightMm: p.heightMm,
130
+ });
131
+ });
132
+ const pages = [];
133
+ for (let pageIndex = 0; pageIndex < nest.pageCount; pageIndex++) {
134
+ const onThisPage = nest.placed
135
+ .filter((pl) => pl.page === pageIndex)
136
+ .map((pl) => {
137
+ const geo = byOrdinal.get(pl.ordinal);
138
+ return {
139
+ ordinal: pl.ordinal,
140
+ name: pl.name,
141
+ path: geo.path,
142
+ xMm: pl.xMm,
143
+ yMm: pl.yMm,
144
+ rotated: pl.rotated,
145
+ widthMm: geo.widthMm,
146
+ heightMm: geo.heightMm,
147
+ };
148
+ });
149
+ pages.push(buildCutSvg(onThisPage, {
150
+ page: input.page,
151
+ // The spot colour is the print-shop contract; a Cricut ignores the name
152
+ // and wants plain geometry, so the emit kind decides rather than a flag.
153
+ cutContourSpot: input.profile.emits === "cutcontour-svg",
154
+ provenance: input.provenance
155
+ ? `${input.provenance} · page ${pageIndex + 1}/${nest.pageCount} · ${input.profile.label}`
156
+ : undefined,
157
+ }));
158
+ }
159
+ return {
160
+ pages,
161
+ report: {
162
+ unfit,
163
+ unplaceable: nest.unplaceable.map((u) => ({ ordinal: u.ordinal, name: u.name })),
164
+ nodesBefore: simplified.nodesBefore,
165
+ nodesAfter: simplified.nodesAfter,
166
+ maxDeviationMm: simplified.maxDeviationMm,
167
+ overBudget: simplified.overBudget,
168
+ pageCount: nest.pageCount,
169
+ },
170
+ refusedReason: null,
171
+ };
172
+ }
173
+ /** Total nodes across every page, for a UI that wants one number. */
174
+ export function totalNodes(set, parts) {
175
+ return set.pages.length === 0 ? 0 : countNodes(parts);
176
+ }
@@ -0,0 +1,56 @@
1
+ import type { CutPath } from "../types";
2
+ import type { PrintPageSize } from "./page-sizes";
3
+ /** One part, already positioned on a page by the nester. */
4
+ export interface CutSvgPart {
5
+ ordinal: number;
6
+ name: string;
7
+ /** The outline, in the part's own local millimetre space (origin at 0,0). */
8
+ path: CutPath;
9
+ /** Where the part's top-left corner sits on the page. */
10
+ xMm: number;
11
+ yMm: number;
12
+ /** Turned 90° clockwise by the nester. */
13
+ rotated: boolean;
14
+ /** The part's own size, before rotation. */
15
+ widthMm: number;
16
+ heightMm: number;
17
+ }
18
+ export interface CutSvgOptions {
19
+ page: PrintPageSize;
20
+ /**
21
+ * Emit the cut line as a CutContour spot colour.
22
+ *
23
+ * 🛑 This is what a print broker's RIP looks for: a named spot colour on a
24
+ * magenta stroke, which their workflow separates into a cut path. A Cricut
25
+ * wants ordinary geometry and ignores the name — so this is `true` for the
26
+ * print-shop profile and `false` for both Cricut profiles.
27
+ */
28
+ cutContourSpot: boolean;
29
+ /** Stroke width in mm. Hairline for a cutter; a cut has no width. */
30
+ strokeMm?: number;
31
+ /** Rendered as an SVG comment, so the file says which run produced it. */
32
+ provenance?: string;
33
+ }
34
+ /**
35
+ * Serialise one closed outline to an SVG `d` attribute.
36
+ *
37
+ * 🛑 Always closed with `Z`. An open cut path makes a cutter travel back to the
38
+ * start with the blade DOWN, scoring a line across the artwork — the one
39
+ * failure here that damages the material rather than just the file.
40
+ */
41
+ export declare function pathToSvgD(path: CutPath, offsetXMm?: number, offsetYMm?: number): string;
42
+ /**
43
+ * Node count for the whole file, against a machine's budget.
44
+ *
45
+ * One per cubic segment plus the start point — the same thing Design Space
46
+ * counts, and the number that decides whether it can open the file at all.
47
+ */
48
+ export declare function countNodes(parts: readonly CutSvgPart[]): number;
49
+ /**
50
+ * Build the cut file for one page.
51
+ *
52
+ * Rotation is applied as a TRANSFORM rather than by rewriting coordinates: the
53
+ * geometry then stays byte-identical to what the tracer produced, so a part can
54
+ * be checked against its own outline without undoing an arithmetic step.
55
+ */
56
+ export declare function buildCutSvg(parts: readonly CutSvgPart[], opts: CutSvgOptions): string;
@@ -0,0 +1,120 @@
1
+ /*
2
+ * WHY: All three machine profiles emit the same geometry and differ only in how
3
+ * the cut line is LABELLED — a CutContour spot colour for a print broker,
4
+ * plain stroked geometry for a Cricut. Writing three SVG serialisers would
5
+ * be three places for a coordinate convention to drift, and a drifted
6
+ * coordinate is a sticker cut in the wrong place.
7
+ * WHAT: One millimetre-true SVG writer, with the per-profile differences passed
8
+ * in rather than branched on internally.
9
+ *
10
+ * 🛑 MILLIMETRE-TRUE, which means `width="210mm"` AND a `viewBox` in the same
11
+ * units. An SVG with only a viewBox is scaled by whatever opens it, and
12
+ * "whatever opens it" includes Design Space — a file that looks right in a
13
+ * browser and imports at 96/25.4 the intended size is the classic version of
14
+ * this bug. Both attributes, always, and the numbers must agree.
15
+ *
16
+ * 🛑 Y GROWS DOWNWARD in both SVG and the tracer's raster space, so no flip is
17
+ * applied anywhere. Writing one in "to be safe" mirrors every sticker, which is
18
+ * invisible on a symmetric part and obvious on lettering — i.e. discovered
19
+ * after cutting.
20
+ *
21
+ * EXPORTS: CutSvgPart, CutSvgOptions, buildCutSvg, pathToSvgD, countNodes
22
+ *
23
+ * @tag domain:sticker-trace
24
+ * @tag layer:shared
25
+ * @tag pattern:none
26
+ * @tag access:isomorphic
27
+ * @tag consumers:sticker-trace/export,finalizer
28
+ * @tag sideEffects:none
29
+ */
30
+ import { CUT_CONTOUR_HEX, CUT_CONTOUR_SVG_NAME, CUT_GEOMETRY_HEX, } from "../cut-contour.js";
31
+ /** A cut line has no width; this is only so the path is VISIBLE when opened. */
32
+ const DEFAULT_STROKE_MM = 0.1;
33
+ /** Trim to 0.001mm — a micron, far below any cutter's mechanical tolerance. */
34
+ function mm(n) {
35
+ const r = Math.round(n * 1000) / 1000;
36
+ return Object.is(r, -0) ? "0" : String(r);
37
+ }
38
+ /**
39
+ * Serialise one closed outline to an SVG `d` attribute.
40
+ *
41
+ * 🛑 Always closed with `Z`. An open cut path makes a cutter travel back to the
42
+ * start with the blade DOWN, scoring a line across the artwork — the one
43
+ * failure here that damages the material rather than just the file.
44
+ */
45
+ export function pathToSvgD(path, offsetXMm = 0, offsetYMm = 0) {
46
+ const parts = [
47
+ `M ${mm(path.start.x + offsetXMm)} ${mm(path.start.y + offsetYMm)}`,
48
+ ];
49
+ for (const seg of path.segments) {
50
+ parts.push(`C ${mm(seg.c1.x + offsetXMm)} ${mm(seg.c1.y + offsetYMm)} ` +
51
+ `${mm(seg.c2.x + offsetXMm)} ${mm(seg.c2.y + offsetYMm)} ` +
52
+ `${mm(seg.to.x + offsetXMm)} ${mm(seg.to.y + offsetYMm)}`);
53
+ }
54
+ parts.push("Z");
55
+ return parts.join(" ");
56
+ }
57
+ /**
58
+ * Node count for the whole file, against a machine's budget.
59
+ *
60
+ * One per cubic segment plus the start point — the same thing Design Space
61
+ * counts, and the number that decides whether it can open the file at all.
62
+ */
63
+ export function countNodes(parts) {
64
+ let total = 0;
65
+ for (const p of parts)
66
+ total += p.path.segments.length + 1;
67
+ return total;
68
+ }
69
+ /** XML text escape. Part names are human-entered and reach an attribute. */
70
+ function esc(s) {
71
+ return s
72
+ .replace(/&/g, "&amp;")
73
+ .replace(/</g, "&lt;")
74
+ .replace(/>/g, "&gt;")
75
+ .replace(/"/g, "&quot;");
76
+ }
77
+ /**
78
+ * Build the cut file for one page.
79
+ *
80
+ * Rotation is applied as a TRANSFORM rather than by rewriting coordinates: the
81
+ * geometry then stays byte-identical to what the tracer produced, so a part can
82
+ * be checked against its own outline without undoing an arithmetic step.
83
+ */
84
+ export function buildCutSvg(parts, opts) {
85
+ const { page, cutContourSpot } = opts;
86
+ const stroke = opts.strokeMm ?? DEFAULT_STROKE_MM;
87
+ const body = parts
88
+ .map((part) => {
89
+ /*
90
+ * A rotated part is placed by its top-left corner, so the rotation has to
91
+ * carry the part back into that box: rotate 90° about the origin, then
92
+ * translate right by its own height. Getting this wrong puts the part
93
+ * exactly one dimension off the page — which is at least obvious.
94
+ */
95
+ const transform = part.rotated
96
+ ? ` transform="translate(${mm(part.xMm + part.heightMm)} ${mm(part.yMm)}) rotate(90)"`
97
+ : ` transform="translate(${mm(part.xMm)} ${mm(part.yMm)})"`;
98
+ return (` <path id="part-${part.ordinal}" data-name="${esc(part.name)}"` +
99
+ `${transform} d="${pathToSvgD(part.path)}" fill="none" ` +
100
+ `stroke="${cutContourSpot ? CUT_CONTOUR_HEX : CUT_GEOMETRY_HEX}" stroke-width="${mm(stroke)}" />`);
101
+ })
102
+ .join("\n");
103
+ /*
104
+ * 🛑 The CutContour wrapper is a NAMED GROUP, and the name is the contract —
105
+ * brokers key their cut separation on it. It comes from the shared constant
106
+ * rather than a literal so the studio overlay, this file and the print-shop
107
+ * export cannot disagree about what the cut layer is called.
108
+ */
109
+ const inner = cutContourSpot
110
+ ? `<g id="${CUT_CONTOUR_SVG_NAME}" data-cut-layer="true">\n${body}\n</g>`
111
+ : body;
112
+ const provenance = opts.provenance
113
+ ? `\n <!-- ${esc(opts.provenance)} -->`
114
+ : "";
115
+ return (`<?xml version="1.0" encoding="UTF-8"?>\n` +
116
+ `<svg xmlns="http://www.w3.org/2000/svg" version="1.1" ` +
117
+ `width="${mm(page.widthMm)}mm" height="${mm(page.heightMm)}mm" ` +
118
+ `viewBox="0 0 ${mm(page.widthMm)} ${mm(page.heightMm)}">${provenance}\n` +
119
+ `${inner}\n</svg>\n`);
120
+ }