@mohasinac/appkit 4.52.5 → 4.53.1
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.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/client/scaffolds/AppShell.js +1 -1
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/auctions/og.d.ts +3 -1
- package/dist/_internal/server/features/auctions/og.js +3 -1
- package/dist/_internal/server/features/bundles/actions.js +1 -1
- package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
- package/dist/_internal/server/features/business-documents/download.js +91 -0
- package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
- package/dist/_internal/server/features/categories/adapters.js +10 -0
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
- package/dist/_internal/server/features/checkout/actions.js +116 -15
- package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
- package/dist/_internal/server/features/checkout/data.d.ts +37 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
- package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
- package/dist/_internal/server/features/classified/metadata.js +1 -1
- package/dist/_internal/server/features/classified/og.d.ts +3 -1
- package/dist/_internal/server/features/classified/og.js +3 -1
- package/dist/_internal/server/features/digital-code/metadata.js +1 -1
- package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
- package/dist/_internal/server/features/digital-code/og.js +3 -1
- package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
- package/dist/_internal/server/features/digital-code/pool.js +19 -4
- package/dist/_internal/server/features/live/metadata.js +1 -1
- package/dist/_internal/server/features/live/og.d.ts +3 -1
- package/dist/_internal/server/features/live/og.js +3 -1
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +5 -1
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/parts/og.js +1 -1
- package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
- package/dist/_internal/server/features/pre-orders/og.js +3 -1
- package/dist/_internal/server/features/price-index/search.d.ts +18 -0
- package/dist/_internal/server/features/price-index/search.js +47 -7
- package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
- package/dist/_internal/server/features/prize-draws/og.js +3 -1
- package/dist/_internal/server/features/products/group-members.d.ts +26 -0
- package/dist/_internal/server/features/products/group-members.js +7 -1
- package/dist/_internal/server/features/products/og.d.ts +3 -1
- package/dist/_internal/server/features/products/og.js +3 -1
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
- package/dist/_internal/server/features/search/scoped-sources.js +252 -0
- package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
- package/dist/_internal/server/features/search/search-everything.js +70 -20
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +7 -1
- package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +16 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
- package/dist/_internal/server/features/stores/tabs.js +122 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
- package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
- package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +9 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
- package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
- package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
- package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
- package/dist/_internal/shared/config/schema.d.ts +122 -0
- package/dist/_internal/shared/features/cart/schema.js +3 -2
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
- package/dist/_internal/shared/features/products/group-rules.js +142 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
- package/dist/_internal/shared/listing-types/_registry.js +39 -1
- package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art/config.js +3 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/auction/config.js +3 -0
- package/dist/_internal/shared/listing-types/availability.js +48 -0
- package/dist/_internal/shared/listing-types/capabilities.js +19 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/classified/config.js +3 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/live/config.js +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
- package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/spares/config.js +60 -0
- package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
- package/dist/_internal/shared/listing-types/spares/og.js +1 -0
- package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/standard/config.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +76 -0
- package/dist/_internal/shared/search/match.js +264 -0
- package/dist/_internal/shared/search/to-groups.d.ts +52 -0
- package/dist/_internal/shared/search/to-groups.js +141 -0
- package/dist/client.d.ts +16 -9
- package/dist/client.js +16 -6
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +107 -15
- package/dist/constants/api-endpoints.js +60 -5
- package/dist/constants/cache-invalidation.js +3 -1
- package/dist/constants/field-names.d.ts +13 -1
- package/dist/constants/field-names.js +42 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/about/components/PolicyPageView.d.ts +22 -2
- package/dist/features/about/components/PolicyPageView.js +14 -2
- package/dist/features/about/components/PublicProfileView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +42 -2
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/account/hooks/useProfileStats.js +5 -1
- package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
- package/dist/features/addresses/repository/addresses.repository.js +86 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/admin-actions.js +16 -1
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNavigationView.js +1 -1
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +41 -39
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSidebar.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
- package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
- package/dist/features/admin/components/AdminSparesView.js +30 -0
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +10 -8
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +88 -3
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +46 -7
- package/dist/features/auth/repository/user.repository.js +128 -15
- package/dist/features/auth/schemas/firestore.d.ts +65 -12
- package/dist/features/auth/schemas/firestore.js +13 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
- package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
- package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
- package/dist/features/business-documents/schemas/firestore.js +75 -0
- package/dist/features/cart/actions/cart-actions.js +83 -6
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/cart/repository/cart.repository.js +32 -4
- package/dist/features/cart/schemas/firestore.d.ts +20 -0
- package/dist/features/cart/schemas/index.d.ts +2 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
- package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/BrandDetailPageView.js +19 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
- package/dist/features/categories/components/CategoryGrid.js +10 -1
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
- package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
- package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
- package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/constants/category-tabs.d.ts +20 -25
- package/dist/features/categories/constants/category-tabs.js +22 -39
- package/dist/features/categories/repository/categories.repository.d.ts +13 -0
- package/dist/features/categories/repository/categories.repository.js +51 -1
- package/dist/features/categories/schemas/firestore.d.ts +22 -1
- package/dist/features/categories/schemas/firestore.js +10 -0
- package/dist/features/categories/schemas/index.d.ts +8 -2
- package/dist/features/categories/schemas/index.js +2 -0
- package/dist/features/categories/types/index.d.ts +8 -0
- package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
- package/dist/features/categories/utils/taxonomy-visual.js +74 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/contact/components/ContactPageView.d.ts +33 -1
- package/dist/features/contact/components/ContactPageView.js +58 -28
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/grouped/schemas/firestore.d.ts +5 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
- package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
- package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
- package/dist/features/homepage/components/HowItWorksSection.js +4 -4
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
- package/dist/features/homepage/components/PromoGrid.js +12 -3
- package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/index.d.ts +0 -22
- package/dist/features/homepage/components/index.js +0 -12
- package/dist/features/homepage/index.d.ts +0 -2
- package/dist/features/homepage/index.js +0 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
- package/dist/features/homepage/lib/section-renderer.js +202 -58
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
- package/dist/features/homepage/schemas/firestore.d.ts +112 -3
- package/dist/features/homepage/schemas/firestore.js +32 -2
- package/dist/features/homepage/schemas/index.d.ts +46 -17
- package/dist/features/homepage/schemas/index.js +39 -27
- package/dist/features/homepage/server.d.ts +0 -3
- package/dist/features/homepage/server.js +0 -3
- package/dist/features/homepage/types/index.d.ts +0 -47
- package/dist/features/homepage/types/index.js +49 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/hooks/useMedia.js +17 -0
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
- package/dist/features/media/repository/media-assets.repository.js +31 -0
- package/dist/features/media/trust-signals.d.ts +85 -0
- package/dist/features/media/trust-signals.js +126 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
- package/dist/features/parts/components/PartDetailPageView.js +2 -2
- package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
- package/dist/features/parts/components/PartsIndexPageView.js +2 -2
- package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
- package/dist/features/parts/components/PartsSearchBox.js +57 -0
- package/dist/features/parts/schemas/firestore.d.ts +149 -3
- package/dist/features/parts/schemas/firestore.js +184 -0
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +38 -6
- package/dist/features/payments/repository/payout.repository.js +84 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/CompareOverlay.d.ts +18 -1
- package/dist/features/products/components/CompareOverlay.js +21 -2
- package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
- package/dist/features/products/components/CustomSectionTabContent.js +29 -3
- package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
- package/dist/features/products/components/GroupMemberPicker.js +46 -8
- package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
- package/dist/features/products/components/GroupSettingsPanel.js +91 -3
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
- package/dist/features/products/components/ProductDetailPageView.js +75 -15
- package/dist/features/products/components/ProductForm.d.ts +13 -1
- package/dist/features/products/components/ProductForm.js +16 -2
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
- package/dist/features/products/components/ProductsIndexListing.js +3 -3
- package/dist/features/products/components/ShowGroupSection.js +15 -2
- package/dist/features/products/components/SparesListView.d.ts +7 -0
- package/dist/features/products/components/SparesListView.js +39 -0
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/action-defs.d.ts +1 -0
- package/dist/features/products/constants/action-defs.js +1 -0
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.d.ts +98 -0
- package/dist/features/products/repository/products.repository.js +248 -18
- package/dist/features/products/schemas/firestore.d.ts +97 -4
- package/dist/features/products/schemas/firestore.js +104 -0
- package/dist/features/products/schemas/index.d.ts +12 -21
- package/dist/features/products/schemas/index.js +23 -6
- package/dist/features/products/types/index.d.ts +46 -2
- package/dist/features/products/utils/group-member-image.d.ts +39 -0
- package/dist/features/products/utils/group-member-image.js +3 -0
- package/dist/features/products/utils/listing-badge-variant.js +4 -0
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/scams/components/ScamProfileView.js +1 -1
- package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
- package/dist/features/search/components/EntityTypeahead.js +92 -0
- package/dist/features/search/components/Search.d.ts +12 -1
- package/dist/features/search/components/Search.js +47 -3
- package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
- package/dist/features/search/components/SearchFacetRail.js +92 -0
- package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
- package/dist/features/search/components/SearchResultsClient.js +103 -0
- package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
- package/dist/features/search/components/SearchResultsPageView.js +3 -2
- package/dist/features/search/components/index.d.ts +0 -6
- package/dist/features/search/components/index.js +0 -3
- package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
- package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
- package/dist/features/search/hooks/useScopedSearch.js +114 -0
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
- package/dist/features/search/hooks/useSiteSearch.js +149 -0
- package/dist/features/search/index.d.ts +0 -4
- package/dist/features/search/index.js +0 -4
- package/dist/features/search/manifest.d.ts +12 -0
- package/dist/features/search/manifest.js +17 -2
- package/dist/features/search/server.d.ts +0 -3
- package/dist/features/search/server.js +0 -3
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +29 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
- package/dist/features/seller/components/SellerProductShell.js +2 -2
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
- package/dist/features/seller/components/SellerSparesView.js +6 -0
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +2 -4
- package/dist/features/seller/components/index.js +1 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/CommandPalette.js +1 -1
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
- package/dist/features/stores/components/StoreHeader.js +1 -2
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
- package/dist/features/stores/components/StoreSparesPageView.js +48 -0
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/stores/schemas/firestore.d.ts +19 -0
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/index.js +24 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
- package/dist/index.d.ts +27 -80
- package/dist/index.js +62 -115
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +46 -5
- package/dist/next/routing/route-map.js +70 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +33 -9
- package/dist/providers/db-firebase/base.repository.js +55 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +28 -26
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/blind-index-tokens.d.ts +54 -0
- package/dist/security/blind-index-tokens.js +152 -0
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +6 -3
- package/dist/security/index.js +17 -3
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/security/settings-encryption.d.ts +35 -0
- package/dist/security/settings-encryption.js +91 -0
- package/dist/seed/_helpers/brand-rows.js +38 -14
- package/dist/seed/_helpers/category-forest.js +73 -7
- package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
- package/dist/seed/_helpers/category-images-generated.js +81 -6
- package/dist/seed/_helpers/category-models.d.ts +1 -1
- package/dist/seed/_helpers/category-models.js +7 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +50 -2
- package/dist/seed/_helpers/character-features.d.ts +1 -1
- package/dist/seed/_helpers/character-features.js +2 -1
- package/dist/seed/_helpers/franchise-rows.js +10 -2
- package/dist/seed/_helpers/media.d.ts +47 -0
- package/dist/seed/_helpers/media.js +34 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/categories-seed-data.js +124 -20
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/grouped-listings-seed-data.js +16 -0
- package/dist/seed/homepage-sections-seed-data.js +131 -26
- package/dist/seed/index.d.ts +3 -3
- package/dist/seed/index.js +3 -2
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/manifest.js +3 -0
- package/dist/seed/media-assets-seed-data.d.ts +1 -1
- package/dist/seed/media-assets-seed-data.js +746 -196
- package/dist/seed/model-composition-seed-data.js +122 -6
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +37219 -463
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/products-art-seed-data.js +7 -18
- package/dist/seed/products-auctions-seed-data.js +56 -47
- package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
- package/dist/seed/products-beyblade-x-seed-data.js +441 -0
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +1500 -1240
- package/dist/seed/products-classifieds-seed-data.js +9 -27
- package/dist/seed/products-digital-codes-seed-data.js +9 -18
- package/dist/seed/products-live-items-seed-data.js +5 -13
- package/dist/seed/products-preorders-seed-data.js +67 -33
- package/dist/seed/products-prize-draws-seed-data.js +8 -17
- package/dist/seed/products-spares-seed-data.d.ts +2 -0
- package/dist/seed/products-spares-seed-data.js +368 -0
- package/dist/seed/products-standard-seed-data.js +39 -126
- package/dist/seed/products-stickers-seed-data.js +59 -15
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +9 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.d.ts +25 -0
- package/dist/seo/json-ld.js +33 -1
- package/dist/server-entry.d.ts +3 -1
- package/dist/server-entry.js +2 -2
- package/dist/server.d.ts +27 -12
- package/dist/server.js +86 -28
- package/dist/styles.css +438 -1
- package/dist/tailwind-input.css +31 -17
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Accordion.js +1 -1
- package/dist/ui/components/Breadcrumb.js +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/DetailPageGallery.js +0 -2
- package/dist/ui/components/DetailPageHero.js +0 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/Divider.js +3 -3
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/GatedPrice.js +5 -1
- package/dist/ui/components/HorizontalScroller.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +17 -11
- package/dist/ui/components/MediaTabs.style.css +81 -0
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/Pagination.js +1 -1
- package/dist/ui/components/PendingValue.d.ts +45 -0
- package/dist/ui/components/PendingValue.js +7 -0
- package/dist/ui/components/Radio.style.css +119 -0
- package/dist/ui/components/RatingDisplay.js +2 -2
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SettingsSection.js +0 -2
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/SiteLogo.js +3 -0
- package/dist/ui/components/SiteMark.js +3 -0
- package/dist/ui/components/SortDropdown.js +1 -1
- package/dist/ui/components/SpecTable.d.ts +58 -0
- package/dist/ui/components/SpecTable.js +8 -0
- package/dist/ui/components/StarRating.js +1 -3
- package/dist/ui/components/SummaryCard.js +1 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +2 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +7 -0
- package/dist/ui/icons/icon-registry.js +25 -1
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +3 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/utils/search-txt-query.d.ts +12 -0
- package/dist/utils/search-txt-query.js +12 -0
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/dedupe-peer-deps.mjs +18 -0
- package/scripts/seed-cli.mjs +138 -26
- package/scripts/verify-css-build.mjs +118 -37
- package/dist/_internal/server/features/search/actions.d.ts +0 -7
- package/dist/_internal/server/features/search/actions.js +0 -21
- package/dist/_internal/server/features/search/data.d.ts +0 -15
- package/dist/_internal/server/features/search/data.js +0 -18
- package/dist/_internal/server/features/search/index.d.ts +0 -3
- package/dist/_internal/server/features/search/index.js +0 -2
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/api/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/[id]/route.js +0 -103
- package/dist/features/homepage/api/route.d.ts +0 -14
- package/dist/features/homepage/api/route.js +0 -140
- package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
- package/dist/features/homepage/api/sections/[id]/route.js +0 -95
- package/dist/features/homepage/api/sections/route.d.ts +0 -13
- package/dist/features/homepage/api/sections/route.js +0 -82
- package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
- package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
- package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
- package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
- package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
- package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
- package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
- package/dist/features/homepage/components/HeroBanner.js +0 -43
- package/dist/features/homepage/components/HeroSection.d.ts +0 -7
- package/dist/features/homepage/components/HeroSection.js +0 -6
- package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
- package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
- package/dist/features/homepage/components/HomepageView.d.ts +0 -25
- package/dist/features/homepage/components/HomepageView.js +0 -5
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
- package/dist/features/homepage/components/NewsletterBanner.js +0 -37
- package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
- package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
- package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
- package/dist/features/homepage/components/TrustBadges.js +0 -46
- package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
- package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
- package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
- package/dist/features/homepage/hooks/useHomepage.js +0 -17
- package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
- package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
- package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
- package/dist/features/homepage/repository/homepage.repository.js +0 -25
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/search/actions/index.d.ts +0 -1
- package/dist/features/search/actions/index.js +0 -1
- package/dist/features/search/actions/search-actions.d.ts +0 -18
- package/dist/features/search/actions/search-actions.js +0 -43
- package/dist/features/search/api/route.d.ts +0 -22
- package/dist/features/search/api/route.js +0 -128
- package/dist/features/search/columns/index.d.ts +0 -17
- package/dist/features/search/columns/index.js +0 -49
- package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
- package/dist/features/search/components/SearchFiltersRow.js +0 -21
- package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
- package/dist/features/search/components/SearchResultsSection.js +0 -35
- package/dist/features/search/components/SearchView.d.ts +0 -27
- package/dist/features/search/components/SearchView.js +0 -8
- package/dist/features/search/hooks/useSearch.d.ts +0 -21
- package/dist/features/search/hooks/useSearch.js +0 -33
- package/dist/features/search/repository/search.repository.d.ts +0 -14
- package/dist/features/search/repository/search.repository.js +0 -59
- package/dist/features/search/schemas/index.d.ts +0 -70
- package/dist/features/search/schemas/index.js +0 -36
- package/dist/features/search/types/index.d.ts +0 -48
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
- package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
- package/dist/features/stores/components/StoreScopedSearch.js +0 -27
- package/dist/seed/defaults/homepage-sections.d.ts +0 -2
- package/dist/seed/defaults/homepage-sections.js +0 -60
- package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
- package/dist/seed/factories/homepage-section.factory.js +0 -13
- /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
|
@@ -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;
|