@mohasinac/appkit 4.52.5 → 4.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- 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 +4 -0
- 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/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/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 +1 -1
- 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 +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -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.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 +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -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/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/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 +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -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 +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -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/account/api/[userId]/addresses/route.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/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- 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 +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- 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 +24 -37
- 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/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 +1 -1
- 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/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 +62 -1
- 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/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 +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -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/cart/api/route.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/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- 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/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/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/GroupedListingEditorView.js +17 -2
- 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/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +64 -12
- 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/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- 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/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/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -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/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -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/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- 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/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.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- 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/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/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- 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.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -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/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 +248 -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/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- 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/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- 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/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 +8 -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/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +192 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- 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 +4 -4
- package/dist/next/routing/route-map.js +25 -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 +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -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 +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- 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/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 +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- 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/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- 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/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- 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 +1 -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.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- 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/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -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 +1 -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 +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -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/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- 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/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- 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/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/** Decoded pixels. Always RGBA8, row-major, tightly packed. */
|
|
2
|
+
export interface DecodedRaster {
|
|
3
|
+
readonly width: number;
|
|
4
|
+
readonly height: number;
|
|
5
|
+
/** length === width * height * 4 */
|
|
6
|
+
readonly data: Uint8Array;
|
|
7
|
+
/**
|
|
8
|
+
* Scan resolution, when the source declared one AND an operator confirmed it.
|
|
9
|
+
*
|
|
10
|
+
* Absent is a real answer and must stay representable: five of the nine
|
|
11
|
+
* reference scans declare 72 or 96 dpi, which is a default the encoder wrote
|
|
12
|
+
* rather than a measurement. Millimetre output is WITHHELD when this is
|
|
13
|
+
* undefined — a fabricated mm figure on a cut file is a physical production
|
|
14
|
+
* error, which is a different class of wrong from a missing number.
|
|
15
|
+
*/
|
|
16
|
+
readonly dpi?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface EncodedImage {
|
|
19
|
+
readonly bytes: Uint8Array;
|
|
20
|
+
readonly contentType: string;
|
|
21
|
+
}
|
|
22
|
+
export interface Rect {
|
|
23
|
+
readonly x: number;
|
|
24
|
+
readonly y: number;
|
|
25
|
+
readonly width: number;
|
|
26
|
+
readonly height: number;
|
|
27
|
+
}
|
|
28
|
+
export interface Point {
|
|
29
|
+
readonly x: number;
|
|
30
|
+
readonly y: number;
|
|
31
|
+
}
|
|
32
|
+
/** One cubic Bézier segment; the start point is the previous segment's end. */
|
|
33
|
+
export interface CubicSegment {
|
|
34
|
+
readonly c1: Point;
|
|
35
|
+
readonly c2: Point;
|
|
36
|
+
readonly to: Point;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* One closed outline. Kiss-cut sheets cut the outer boundary only — interior
|
|
40
|
+
* holes are never cut, or the sticker falls apart on the backing — so a part
|
|
41
|
+
* carries exactly one path and `segments` always closes back to `start`.
|
|
42
|
+
*/
|
|
43
|
+
export interface CutPath {
|
|
44
|
+
readonly start: Point;
|
|
45
|
+
readonly segments: readonly CubicSegment[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The pipeline, in order. A failure reports the stage it died in, which is the
|
|
49
|
+
* difference between "it broke" and "the ridge detector found nothing on a
|
|
50
|
+
* halftone scan" — so the union is shared by the runner, the progress channel
|
|
51
|
+
* and the retry panel rather than restated in each.
|
|
52
|
+
*/
|
|
53
|
+
export declare const TRACE_STAGES: readonly ["decode", "prefilter", "ridge", "quantise", "fuse", "flood", "segment", "cluster", "geometry", "parts", "exports"];
|
|
54
|
+
export type TraceStage = (typeof TRACE_STAGES)[number];
|
|
55
|
+
/**
|
|
56
|
+
* `paper` — stickers sit on bare backing; the sheet border is background.
|
|
57
|
+
* `art` — the whole sheet is printed and the only signal is the cut line.
|
|
58
|
+
* `auto` — decide from the border band's colour spread (see trace/paper).
|
|
59
|
+
*
|
|
60
|
+
* Several real sheets are BOTH (black-dranzer is paper on the left, solid red
|
|
61
|
+
* and blue panels on the right), which is why this selects an emphasis rather
|
|
62
|
+
* than switching algorithms: the ridge pass runs regardless, and this only
|
|
63
|
+
* weights how much the paper-flood is trusted.
|
|
64
|
+
*/
|
|
65
|
+
export type ScanType = "auto" | "paper" | "art";
|
|
66
|
+
export type PrecisionTier = "draft" | "standard" | "precise" | "max";
|
|
67
|
+
export type PrefilterKind = "none" | "median" | "bilateral";
|
|
68
|
+
/**
|
|
69
|
+
* Grouped BY STAGE, and that grouping is load-bearing rather than cosmetic: a
|
|
70
|
+
* resumed run may only skip stages whose parameters did not change. Without the
|
|
71
|
+
* grouping, "resume from `parts` with a different ridge threshold" yields a run
|
|
72
|
+
* whose stored artifacts were produced under different parameters than the run
|
|
73
|
+
* records, and nothing anywhere contradicts it.
|
|
74
|
+
*/
|
|
75
|
+
export interface TraceParams {
|
|
76
|
+
readonly tier: PrecisionTier;
|
|
77
|
+
readonly scanType: ScanType;
|
|
78
|
+
/** decode */
|
|
79
|
+
readonly workingLongEdge: number;
|
|
80
|
+
readonly dpi?: number;
|
|
81
|
+
/** prefilter */
|
|
82
|
+
readonly prefilter: PrefilterKind;
|
|
83
|
+
readonly prefilterRadius: number;
|
|
84
|
+
/** ridge */
|
|
85
|
+
readonly ridgeHysteresisLow: number;
|
|
86
|
+
readonly ridgeHysteresisHigh: number;
|
|
87
|
+
readonly ridgeKernelScale: number;
|
|
88
|
+
/** quantise — the second detector channel; see trace/quantise */
|
|
89
|
+
readonly quantiseEnabled: boolean;
|
|
90
|
+
readonly quantiseColours: number;
|
|
91
|
+
readonly quantiseWeight: number;
|
|
92
|
+
/** flood */
|
|
93
|
+
readonly paperTolerance: number;
|
|
94
|
+
readonly seedBandPx: number;
|
|
95
|
+
/** segment */
|
|
96
|
+
readonly minPartAreaMm2: number;
|
|
97
|
+
readonly maxParts: number;
|
|
98
|
+
readonly bridgeMm: number;
|
|
99
|
+
/**
|
|
100
|
+
* Art sheets only. A region boundary below this multiple of the sheet's
|
|
101
|
+
* MEDIAN boundary strength is treated as printing rather than a cut, and the
|
|
102
|
+
* two regions merge. See trace/merge for why this exists at all.
|
|
103
|
+
*/
|
|
104
|
+
readonly mergeStrengthFactor: number;
|
|
105
|
+
/** geometry */
|
|
106
|
+
readonly smoothMm: number;
|
|
107
|
+
readonly borderMm: number;
|
|
108
|
+
readonly bleedMm: number;
|
|
109
|
+
readonly simplifyMm: number;
|
|
110
|
+
readonly cleanMm: number;
|
|
111
|
+
/** cluster */
|
|
112
|
+
readonly clusterGapMm: number;
|
|
113
|
+
}
|
|
114
|
+
export interface PartGeometry {
|
|
115
|
+
/** 1-based, stable within a run; what the admin renames and references. */
|
|
116
|
+
readonly ordinal: number;
|
|
117
|
+
/** Which physical sheet this part belongs to, when one scan holds several. */
|
|
118
|
+
readonly groupIndex: number;
|
|
119
|
+
readonly bboxPx: Rect;
|
|
120
|
+
readonly areaPx: number;
|
|
121
|
+
/** Null whenever DPI is unknown — never a guess. */
|
|
122
|
+
readonly bboxMm: Rect | null;
|
|
123
|
+
readonly areaMm2: number | null;
|
|
124
|
+
/**
|
|
125
|
+
* Narrowest internal width, in mm when DPI is known. Cricut's minimum
|
|
126
|
+
* reliable detail is 0.25in (6mm); a part with a neck below that tears rather
|
|
127
|
+
* than cuts, so the exporter needs this to warn before a sheet is wasted.
|
|
128
|
+
*/
|
|
129
|
+
readonly minFeatureMm: number | null;
|
|
130
|
+
readonly path: CutPath;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* One physical sheet within a scan. A 4948x6955 scan can hold several, and
|
|
134
|
+
* grouping them by large border gaps is what makes the part list navigable
|
|
135
|
+
* rather than one run of sixty.
|
|
136
|
+
*/
|
|
137
|
+
export interface SheetCluster {
|
|
138
|
+
readonly index: number;
|
|
139
|
+
readonly bboxPx: Rect;
|
|
140
|
+
readonly partOrdinals: readonly number[];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Reported whether or not the trace succeeded, because the numbers that explain
|
|
144
|
+
* a BAD result are the same ones that explain a good one. `ridgeCoverage` near
|
|
145
|
+
* zero on an `art` scan means the detector found nothing — which is a different
|
|
146
|
+
* remedy from `droppedBelowMinArea` in the hundreds, which means it found noise.
|
|
147
|
+
*/
|
|
148
|
+
export interface TraceDiagnostics {
|
|
149
|
+
readonly workingSize: Rect;
|
|
150
|
+
readonly paperColour: readonly [number, number, number] | null;
|
|
151
|
+
readonly ridgeCoverage: number;
|
|
152
|
+
readonly quantiseCoverage: number;
|
|
153
|
+
readonly fusedCoverage: number;
|
|
154
|
+
readonly componentsFound: number;
|
|
155
|
+
readonly droppedBelowMinArea: number;
|
|
156
|
+
/**
|
|
157
|
+
* Components covering more than MAX_PART_FRACTION of the raster.
|
|
158
|
+
*
|
|
159
|
+
* 🛑 Named for what it counts. It was `droppedTouchingBorder`, which told a
|
|
160
|
+
* reader diagnosing a zero-part scan that a sticker had run off the edge —
|
|
161
|
+
* a different and wrong story. A sheet-sized component means the flood never
|
|
162
|
+
* got IN, and that is the one thing worth knowing at that moment.
|
|
163
|
+
*/
|
|
164
|
+
readonly droppedSheetSized: number;
|
|
165
|
+
/**
|
|
166
|
+
* Fraction of the raster the paper path could flood through.
|
|
167
|
+
*
|
|
168
|
+
* The paper model needs real background; `isAvailable`-style negation has
|
|
169
|
+
* nothing to work with when there is none. Measured across this corpus at
|
|
170
|
+
* `standard`, the three paper scans that segment correctly sit at 27.7%,
|
|
171
|
+
* 51.3% and 74.2%, and the one that returns zero parts sits at **7.8%** — so
|
|
172
|
+
* this is the statistic that separates "this sheet has no stickers" from
|
|
173
|
+
* "this model cannot read this scan", which otherwise look identical.
|
|
174
|
+
*
|
|
175
|
+
* 1 on an art scan, where the question does not arise.
|
|
176
|
+
*/
|
|
177
|
+
readonly backgroundCoverage: number;
|
|
178
|
+
readonly bridgedComponents: number;
|
|
179
|
+
/**
|
|
180
|
+
* Reserved. Art-background sheets WERE unsupported — see the git history for
|
|
181
|
+
* the four approaches that failed and why — and are now handled by the
|
|
182
|
+
* Hessian line filter plus the region merge. Kept as a field rather than
|
|
183
|
+
* deleted because the art path is the one whose accuracy depends on a tuned
|
|
184
|
+
* constant (mergeStrengthFactor), so a future sheet that defeats it needs a
|
|
185
|
+
* way to say so without a schema change.
|
|
186
|
+
*/
|
|
187
|
+
readonly artBackgroundUnsupported: boolean;
|
|
188
|
+
}
|
|
189
|
+
export interface TraceResult {
|
|
190
|
+
readonly parts: readonly PartGeometry[];
|
|
191
|
+
readonly clusters: readonly SheetCluster[];
|
|
192
|
+
readonly diagnostics: TraceDiagnostics;
|
|
193
|
+
/** Pixels per millimetre, or null when DPI is unknown. */
|
|
194
|
+
readonly pxPerMm: number | null;
|
|
195
|
+
/** Scale from working-raster pixels back to the source image. */
|
|
196
|
+
readonly sourceScale: number;
|
|
197
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: A scanned sticker sheet has to become cut-ready geometry, and the same
|
|
3
|
+
* algorithm has to run in two places — a browser tuning it live, and a
|
|
4
|
+
* Firebase Function rendering it at full resolution. Two implementations
|
|
5
|
+
* would drift (CLAUDE.md Root Cause #59/#73), so there is exactly one, and
|
|
6
|
+
* these are the shapes it speaks in.
|
|
7
|
+
* WHAT: Every type the tracing core exchanges with its callers. Deliberately
|
|
8
|
+
* free of any image-codec, Firestore or DOM type: the core takes decoded
|
|
9
|
+
* pixels and returns geometry, and knows nothing about where either came
|
|
10
|
+
* from.
|
|
11
|
+
*
|
|
12
|
+
* Coordinates are a constant source of error here, so the rule is stated once:
|
|
13
|
+
* every geometric value in this module is in WORKING-RASTER PIXELS unless its
|
|
14
|
+
* name ends in `Mm`. The working raster is a downscale of the source (see
|
|
15
|
+
* config.WORKING_LONG_EDGE), so a caller rendering at full resolution scales by
|
|
16
|
+
* `source.width / raster.width`. Carrying vectors rather than masks is what
|
|
17
|
+
* makes that rescale exact.
|
|
18
|
+
*
|
|
19
|
+
* EXPORTS:
|
|
20
|
+
* DecodedRaster, EncodedImage, Rect, Point, CubicSegment, CutPath,
|
|
21
|
+
* TraceStage, TRACE_STAGES, ScanType, PrecisionTier, PrefilterKind,
|
|
22
|
+
* TraceParams, PartGeometry, SheetCluster, TraceResult, TraceDiagnostics
|
|
23
|
+
*
|
|
24
|
+
* @tag domain:sticker-trace
|
|
25
|
+
* @tag layer:shared
|
|
26
|
+
* @tag pattern:none
|
|
27
|
+
* @tag access:isomorphic
|
|
28
|
+
* @tag consumers:trace/*,math/*,export/*,canvas-codec,sharp-codec,run
|
|
29
|
+
* @tag sideEffects:none
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* The pipeline, in order. A failure reports the stage it died in, which is the
|
|
33
|
+
* difference between "it broke" and "the ridge detector found nothing on a
|
|
34
|
+
* halftone scan" — so the union is shared by the runner, the progress channel
|
|
35
|
+
* and the retry panel rather than restated in each.
|
|
36
|
+
*/
|
|
37
|
+
export const TRACE_STAGES = [
|
|
38
|
+
"decode",
|
|
39
|
+
"prefilter",
|
|
40
|
+
"ridge",
|
|
41
|
+
"quantise",
|
|
42
|
+
"fuse",
|
|
43
|
+
"flood",
|
|
44
|
+
"segment",
|
|
45
|
+
"cluster",
|
|
46
|
+
"geometry",
|
|
47
|
+
"parts",
|
|
48
|
+
"exports",
|
|
49
|
+
];
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { LISTING_TYPE_CAPABILITIES } from "./capabilities";
|
|
25
25
|
import { type AvailabilityRow, type UnavailableClause } from "./availability";
|
|
26
|
+
import type { IconKey } from "../../../ui/icons/icon-registry";
|
|
26
27
|
import type { ListingType } from "../../../features/products/types/index";
|
|
27
28
|
import type { SortOption } from "../../../features/products/constants/sieve";
|
|
28
29
|
import { type AvailabilityFilter } from "../../../constants/field-names";
|
|
@@ -107,6 +108,16 @@ export interface ListingTypePlugin {
|
|
|
107
108
|
* reachable only by typing the URL.
|
|
108
109
|
*/
|
|
109
110
|
inGeneralCatalogue: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Leading glyph for this type's chip, tab and dropdown row.
|
|
113
|
+
*
|
|
114
|
+
* 🛑 REQUIRED, like `inGeneralCatalogue` and for the same reason: a tenth
|
|
115
|
+
* listing type must not compile until someone has answered what it looks
|
|
116
|
+
* like. An optional field would be silently omitted and that type would be
|
|
117
|
+
* the one unlabelled row in every picker — the gap being invisible is
|
|
118
|
+
* exactly the failure the required fields on this interface exist to stop.
|
|
119
|
+
*/
|
|
120
|
+
iconKey: IconKey;
|
|
110
121
|
/**
|
|
111
122
|
* Which "Show X" default this type's browse surfaces apply. Since 2026-08-24
|
|
112
123
|
* this drives the LABEL of the availability tab bar's middle tab
|
|
@@ -18,6 +18,7 @@ export declare const config: {
|
|
|
18
18
|
chipLabel: string;
|
|
19
19
|
browseRoute: string;
|
|
20
20
|
inGeneralCatalogue: boolean;
|
|
21
|
+
iconKey: "art";
|
|
21
22
|
hideDefault: "sold";
|
|
22
23
|
isAvailable: typeof alwaysAvailable;
|
|
23
24
|
unavailableClauses: readonly import("../availability").UnavailableClause[];
|
|
@@ -22,6 +22,7 @@ export const config = {
|
|
|
22
22
|
browseRoute: String(ROUTES.PUBLIC.ART),
|
|
23
23
|
// /art ("Art & Stickers") is in MAIN_NAV_ITEMS and spans art + stickers.
|
|
24
24
|
inGeneralCatalogue: false,
|
|
25
|
+
iconKey: "art",
|
|
25
26
|
hideDefault: "sold",
|
|
26
27
|
// Runs out rather than ending — no time dimension, so the shared
|
|
27
28
|
// stock-only rules are the whole story for this type.
|
|
@@ -22,6 +22,7 @@ export const config = {
|
|
|
22
22
|
// /auctions is in MAIN_NAV_ITEMS. An auction card in the general grid renders
|
|
23
23
|
// Buy-Now chrome rather than bid affordances, so it belongs on its own page.
|
|
24
24
|
inGeneralCatalogue: false,
|
|
25
|
+
iconKey: "bid",
|
|
25
26
|
// An auction is never "sold out" — it ends. Hiding by stock would hide
|
|
26
27
|
// every live auction, since auctions don't carry meaningful stock.
|
|
27
28
|
hideDefault: "ended",
|
|
@@ -18,6 +18,7 @@ export declare const config: {
|
|
|
18
18
|
chipLabel: string;
|
|
19
19
|
browseRoute: string;
|
|
20
20
|
inGeneralCatalogue: boolean;
|
|
21
|
+
iconKey: "deals";
|
|
21
22
|
hideDefault: "sold";
|
|
22
23
|
isAvailable: typeof alwaysAvailable;
|
|
23
24
|
unavailableClauses: readonly import("../availability").UnavailableClause[];
|
|
@@ -21,6 +21,7 @@ export const config = {
|
|
|
21
21
|
// Has a dedicated page but NO MAIN_NAV_ITEMS entry, so /products is its only
|
|
22
22
|
// discovery path. Dropping it here would orphan the type (Root Cause #61).
|
|
23
23
|
inGeneralCatalogue: true,
|
|
24
|
+
iconKey: "deals",
|
|
24
25
|
hideDefault: "sold",
|
|
25
26
|
// Runs out rather than ending — no time dimension, so the shared
|
|
26
27
|
// stock-only rules are the whole story for this type.
|
|
@@ -34,6 +34,7 @@ export const config = {
|
|
|
34
34
|
// Has a dedicated page but NO MAIN_NAV_ITEMS entry, so /products is its only
|
|
35
35
|
// discovery path. Dropping it here would orphan the type (Root Cause #61).
|
|
36
36
|
inGeneralCatalogue: true,
|
|
37
|
+
iconKey: "digitalCode",
|
|
37
38
|
// "Sold out" for a code pool means codesAvailable hit 0. That was ASSUMED to
|
|
38
39
|
// be mirrored by stockQuantity, and it isn't — seed and production rows exist
|
|
39
40
|
// with a drained pool and non-zero stock. The pool count is authoritative.
|
|
@@ -34,6 +34,13 @@ interface FeatureFlagSnapshot {
|
|
|
34
34
|
export declare function isListingTypeEnabled(type: ListingType, settings: FeatureFlagSnapshot | null | undefined): boolean;
|
|
35
35
|
export declare function isCategoryTypeEnabled(type: CategoryType, settings: FeatureFlagSnapshot | null | undefined): boolean;
|
|
36
36
|
export declare const ALL_LISTING_TYPES: ListingType[];
|
|
37
|
+
/**
|
|
38
|
+
* Narrow an untrusted string — a `?listingType=` param, a form value — to a
|
|
39
|
+
* real member of the union. Backed by the same `Record<ListingType, true>` as
|
|
40
|
+
* `ALL_LISTING_TYPES`, so it cannot fall behind the union the way a
|
|
41
|
+
* hand-written list would (Root Cause #61).
|
|
42
|
+
*/
|
|
43
|
+
export declare function isListingType(value: unknown): value is ListingType;
|
|
37
44
|
/** Pull the full list of enabled listing types in canonical iteration order. */
|
|
38
45
|
export declare function enabledListingTypes(settings: FeatureFlagSnapshot | null | undefined): ListingType[];
|
|
39
46
|
export declare function enabledCategoryTypes(settings: FeatureFlagSnapshot | null | undefined): CategoryType[];
|
|
@@ -54,6 +54,15 @@ const ALL_LISTING_TYPES_MAP = {
|
|
|
54
54
|
stickers: true,
|
|
55
55
|
};
|
|
56
56
|
export const ALL_LISTING_TYPES = Object.keys(ALL_LISTING_TYPES_MAP);
|
|
57
|
+
/**
|
|
58
|
+
* Narrow an untrusted string — a `?listingType=` param, a form value — to a
|
|
59
|
+
* real member of the union. Backed by the same `Record<ListingType, true>` as
|
|
60
|
+
* `ALL_LISTING_TYPES`, so it cannot fall behind the union the way a
|
|
61
|
+
* hand-written list would (Root Cause #61).
|
|
62
|
+
*/
|
|
63
|
+
export function isListingType(value) {
|
|
64
|
+
return typeof value === "string" && value in ALL_LISTING_TYPES_MAP;
|
|
65
|
+
}
|
|
57
66
|
/** Pull the full list of enabled listing types in canonical iteration order. */
|
|
58
67
|
export function enabledListingTypes(settings) {
|
|
59
68
|
return ALL_LISTING_TYPES.filter((t) => isListingTypeEnabled(t, settings));
|
|
@@ -18,6 +18,7 @@ export declare const config: {
|
|
|
18
18
|
chipLabel: string;
|
|
19
19
|
browseRoute: string;
|
|
20
20
|
inGeneralCatalogue: boolean;
|
|
21
|
+
iconKey: "live";
|
|
21
22
|
hideDefault: "sold";
|
|
22
23
|
isAvailable: typeof alwaysAvailable;
|
|
23
24
|
unavailableClauses: readonly import("../availability").UnavailableClause[];
|
|
@@ -21,6 +21,7 @@ export const config = {
|
|
|
21
21
|
// Has a dedicated page but NO MAIN_NAV_ITEMS entry, so /products is its only
|
|
22
22
|
// discovery path. Dropping it here would orphan the type (Root Cause #61).
|
|
23
23
|
inGeneralCatalogue: true,
|
|
24
|
+
iconKey: "live",
|
|
24
25
|
hideDefault: "sold",
|
|
25
26
|
// Runs out rather than ending — no time dimension, so the shared
|
|
26
27
|
// stock-only rules are the whole story for this type.
|
|
@@ -18,6 +18,7 @@ export declare const config: {
|
|
|
18
18
|
chipLabel: string;
|
|
19
19
|
browseRoute: string;
|
|
20
20
|
inGeneralCatalogue: boolean;
|
|
21
|
+
iconKey: "preOrder";
|
|
21
22
|
hideDefault: "closed";
|
|
22
23
|
isAvailable: (row: AvailabilityRow) => boolean;
|
|
23
24
|
unavailableClauses: readonly import("../availability").UnavailableClause[];
|
|
@@ -21,6 +21,7 @@ export const config = {
|
|
|
21
21
|
browseRoute: String(ROUTES.PUBLIC.PRE_ORDERS),
|
|
22
22
|
// /pre-orders is in MAIN_NAV_ITEMS.
|
|
23
23
|
inGeneralCatalogue: false,
|
|
24
|
+
iconKey: "preOrder",
|
|
24
25
|
hideDefault: "closed",
|
|
25
26
|
// A pre-order closes when its allocation fills, NOT when its delivery date
|
|
26
27
|
// passes — a shipped-soon pre-order is still orderable. `preOrderClosed`
|
|
@@ -21,6 +21,7 @@ export const config = {
|
|
|
21
21
|
// /prize-draws is in MAIN_NAV_ITEMS. Entry-based pricing reads wrong beside
|
|
22
22
|
// ordinary unit prices in the general grid.
|
|
23
23
|
inGeneralCatalogue: false,
|
|
24
|
+
iconKey: "prizeDraw",
|
|
24
25
|
hideDefault: "closed",
|
|
25
26
|
// `prizeRevealStatus`, NOT remaining entries: a draw can close with slots
|
|
26
27
|
// unsold (the seller ends it early, or the reveal window lapses), and it can
|
|
@@ -18,6 +18,7 @@ export declare const config: {
|
|
|
18
18
|
chipLabel: string;
|
|
19
19
|
browseRoute: string;
|
|
20
20
|
inGeneralCatalogue: boolean;
|
|
21
|
+
iconKey: "order";
|
|
21
22
|
hideDefault: "sold";
|
|
22
23
|
isAvailable: typeof alwaysAvailable;
|
|
23
24
|
unavailableClauses: readonly import("../availability").UnavailableClause[];
|
|
@@ -19,6 +19,7 @@ export const config = {
|
|
|
19
19
|
browseRoute: String(ROUTES.PUBLIC.PRODUCTS),
|
|
20
20
|
// The general catalogue IS this type's page.
|
|
21
21
|
inGeneralCatalogue: true,
|
|
22
|
+
iconKey: "order",
|
|
22
23
|
hideDefault: "sold",
|
|
23
24
|
// Runs out rather than ending — no time dimension, so the shared
|
|
24
25
|
// stock-only rules are the whole story for this type.
|
|
@@ -18,6 +18,7 @@ export declare const config: {
|
|
|
18
18
|
chipLabel: string;
|
|
19
19
|
browseRoute: string;
|
|
20
20
|
inGeneralCatalogue: boolean;
|
|
21
|
+
iconKey: "stickers";
|
|
21
22
|
hideDefault: "sold";
|
|
22
23
|
isAvailable: typeof alwaysAvailable;
|
|
23
24
|
unavailableClauses: readonly import("../availability").UnavailableClause[];
|
|
@@ -22,6 +22,7 @@ export const config = {
|
|
|
22
22
|
browseRoute: String(ROUTES.PUBLIC.ART),
|
|
23
23
|
// /art ("Art & Stickers") is in MAIN_NAV_ITEMS and spans art + stickers.
|
|
24
24
|
inGeneralCatalogue: false,
|
|
25
|
+
iconKey: "stickers",
|
|
25
26
|
hideDefault: "sold",
|
|
26
27
|
// Runs out rather than ending — no time dimension, so the shared
|
|
27
28
|
// stock-only rules are the whole story for this type.
|
|
@@ -13,8 +13,18 @@ export declare const MAX_IMAGE_BYTES: number;
|
|
|
13
13
|
export declare const MAX_PDF_BYTES: number;
|
|
14
14
|
export declare const MAX_VIDEO_BYTES: number;
|
|
15
15
|
export type MediaKind = "image" | "video" | "pdf";
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Gallery images per listing.
|
|
18
|
+
*
|
|
19
|
+
* 24, raised from 10 on 2026-10-19 against measured competitor data
|
|
20
|
+
* (docs/research/competitor-crawl-2026-10/images.md): sampled maxima are
|
|
21
|
+
* raikagesbeybladestore 21, hobsoncollectibles 20, toycollectorsindia 31.
|
|
22
|
+
* 24 covers a pre-owned lot with headroom; 31 is a single outlier and sizing
|
|
23
|
+
* for it would be sizing for one listing.
|
|
24
|
+
*
|
|
25
|
+
* The market MEDIAN is 1-4, so this is a ceiling, not a target.
|
|
26
|
+
*/
|
|
27
|
+
export declare const PRODUCT_MAX_IMAGES = 24;
|
|
18
28
|
/** Videos per listing. Bounded by `ProductDocument.video` being singular. */
|
|
19
29
|
export declare const PRODUCT_MAX_VIDEOS = 1;
|
|
20
30
|
/**
|
|
@@ -27,8 +27,18 @@ export const MAX_VIDEO_BYTES = 50 * MEGABYTE;
|
|
|
27
27
|
// The video cap is 1 because `ProductDocument.video` is a single field, not an
|
|
28
28
|
// array — raising it is a schema change, not a constant change.
|
|
29
29
|
// ---------------------------------------------------------------------------
|
|
30
|
-
/**
|
|
31
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Gallery images per listing.
|
|
32
|
+
*
|
|
33
|
+
* 24, raised from 10 on 2026-10-19 against measured competitor data
|
|
34
|
+
* (docs/research/competitor-crawl-2026-10/images.md): sampled maxima are
|
|
35
|
+
* raikagesbeybladestore 21, hobsoncollectibles 20, toycollectorsindia 31.
|
|
36
|
+
* 24 covers a pre-owned lot with headroom; 31 is a single outlier and sizing
|
|
37
|
+
* for it would be sizing for one listing.
|
|
38
|
+
*
|
|
39
|
+
* The market MEDIAN is 1-4, so this is a ceiling, not a target.
|
|
40
|
+
*/
|
|
41
|
+
export const PRODUCT_MAX_IMAGES = 24;
|
|
32
42
|
/** Videos per listing. Bounded by `ProductDocument.video` being singular. */
|
|
33
43
|
export const PRODUCT_MAX_VIDEOS = 1;
|
|
34
44
|
/**
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** `search-index/v{n}.json` — the version IS the cache key. */
|
|
2
|
+
export declare const SEARCH_INDEX_PREFIX = "search-index";
|
|
3
|
+
/**
|
|
4
|
+
* The manifest mirror's object name.
|
|
5
|
+
*
|
|
6
|
+
* 🛑 A MIRROR of `searchIndex/manifest` in Firestore, never the source of
|
|
7
|
+
* truth. The build writes Firestore first and this second, because the
|
|
8
|
+
* Firestore document is what the next build reads to decide its mode — a
|
|
9
|
+
* mirror that disagrees costs a stale client for 60 seconds, whereas a
|
|
10
|
+
* manifest the builder cannot trust costs a full rebuild.
|
|
11
|
+
*
|
|
12
|
+
* It exists so the client bootstrap is two plain `fetch`es and no Firebase
|
|
13
|
+
* SDK: pulling in the client SDK to read one small document would cost more
|
|
14
|
+
* bytes than the index it is pointing at.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SEARCH_MANIFEST_OBJECT = "search-index/manifest.json";
|
|
17
|
+
export declare function searchIndexObjectPath(version: number): string;
|
|
18
|
+
/** Public download URL for any object in the app's Storage bucket. */
|
|
19
|
+
export declare function firebaseDownloadUrl(bucket: string, objectPath: string): string;
|
|
20
|
+
export declare function searchManifestUrl(bucket: string): string;
|
|
21
|
+
export declare function searchArtifactUrl(bucket: string, version: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* What the client needs out of the manifest, and nothing more.
|
|
24
|
+
*
|
|
25
|
+
* Deliberately NOT the server's `SearchIndexManifest`: that one carries
|
|
26
|
+
* `dirty`, `lastFullAt` and `perType`, which are build bookkeeping. A client
|
|
27
|
+
* type that structurally accepts them would invite someone to render build
|
|
28
|
+
* state in the UI, and then the mirror could never drop a field.
|
|
29
|
+
*/
|
|
30
|
+
export interface SearchIndexManifestPublic {
|
|
31
|
+
readonly schema: number;
|
|
32
|
+
readonly version: number;
|
|
33
|
+
readonly builtAt: string;
|
|
34
|
+
readonly recordCount: number;
|
|
35
|
+
}
|