@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
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* @tag consumers:seed/index.ts,seed/runner.ts
|
|
19
19
|
* @tag sideEffects:none
|
|
20
20
|
*/
|
|
21
|
+
import { PRODUCT_MAX_IMAGES, PRODUCT_MAX_VIDEOS, } from "../../../_internal/shared/media/limits.js";
|
|
21
22
|
import { assignDefaultPhases } from "../utils/phases.js";
|
|
22
23
|
import { happyPathPages } from "./_happy-path.js";
|
|
23
24
|
import { moneyFlowsPages } from "./_money-flows.js";
|
|
@@ -217,6 +218,49 @@ const rawTesterChecklistItems = [
|
|
|
217
218
|
},
|
|
218
219
|
]),
|
|
219
220
|
...group("buying", "Buying", [
|
|
221
|
+
{
|
|
222
|
+
/*
|
|
223
|
+
* Part Two B/C/D/E — spares, made-to-order, promoted sticker parts and
|
|
224
|
+
* the group discount, all together on the one page a buyer actually
|
|
225
|
+
* uses. Each case is an explicit BEFORE -> AFTER: a spare page returning
|
|
226
|
+
* 200 with plausible cards is not evidence any of this works.
|
|
227
|
+
*/
|
|
228
|
+
pageKey: "spares-and-groups",
|
|
229
|
+
pageLabel: "Spares browse, made-to-order, and group selections",
|
|
230
|
+
href: "/spares",
|
|
231
|
+
cases: [
|
|
232
|
+
{
|
|
233
|
+
key: "spares-not-in-general-catalogue",
|
|
234
|
+
label: "A spare does NOT appear on /products, but does appear on /spares",
|
|
235
|
+
description: "BEFORE: there was no tenth listing type. AFTER: open /products and search for a known spare's title (e.g. \"Cross Dranzer\") — it must NOT appear, because `spares` sets `inGeneralCatalogue: false`. The same title DOES appear on /spares. If it appears on both, the exclusion broke; if it appears on neither, the nav/page wiring broke.",
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
key: "spares-nav-entry-present",
|
|
239
|
+
label: "The main nav's Products dropdown has a \"Spares\" child linking to /spares",
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
key: "made-to-order-buyable-at-zero-stock",
|
|
243
|
+
label: "A made-to-order listing at zero stock is buyable and says \"Made to order\", never \"Out of Stock\"",
|
|
244
|
+
description: "Open the seeded \"Custom Beyblade Sticker Sheet — Print on Demand\" (stockQuantity 0, madeToOrder true). It must show \"Made to order — printed when you order\" rather than an Out of Stock badge, Add to Cart must work, and checkout must complete. This is the exact case C exists for: stock must gate nothing on this listing.",
|
|
245
|
+
href: "/products/sticker-beyblade-custom-print-on-demand",
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
key: "group-picker-shows-rules-before-choosing",
|
|
249
|
+
label: "A group with selection rules states them BEFORE the buyer picks anything",
|
|
250
|
+
description: "Open the seeded \"Burst & X Attackers You Might Like\" group (via one of its member products' Group section). The picker must show its rules (min 2, max 3, max 2 of any one, 10% off) as text near the top — not only as a refusal after submitting.",
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
key: "group-picker-blocks-and-explains-invalid-selection",
|
|
254
|
+
label: "Picking an invalid combination (e.g. only 1 item, or 3 of one item) shows the reason and disables Add",
|
|
255
|
+
description: "On the same group, select only 1 item: the Add button must be disabled and a message naming the rule must appear (\"Pick at least 2…\"). Select 3 of one item: a different message naming the per-item cap must appear. Fixing the selection must re-enable Add without a page reload.",
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
key: "group-discount-applied-and-shown",
|
|
259
|
+
label: "The group discount is shown on the picker AND the cart line is actually discounted by that percentage",
|
|
260
|
+
description: "Select a valid combination (e.g. 2 different items) on the 10%-off group and note the total shown in the picker. Add to cart, then open the cart and the checkout review: the line total must be 10% below the sum of the two items' individual prices, to the paisa, in all three places (picker, cart, checkout).",
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
},
|
|
220
264
|
{
|
|
221
265
|
/*
|
|
222
266
|
* The post-purchase money surface. `/user/orders/[id]/` has five
|
|
@@ -2211,6 +2255,39 @@ const rawTesterChecklistItems = [
|
|
|
2211
2255
|
},
|
|
2212
2256
|
]),
|
|
2213
2257
|
...group("selling", "Selling", [
|
|
2258
|
+
{
|
|
2259
|
+
/*
|
|
2260
|
+
* Part Two B/E — the seller side of spares, and the shared group-stock
|
|
2261
|
+
* editor. "Stock is independent per listing" is the whole premise, so
|
|
2262
|
+
* the editor-save-and-reload round trip is what actually proves that —
|
|
2263
|
+
* a shared pool bug would show up exactly here, as one listing's stock
|
|
2264
|
+
* silently changing another's.
|
|
2265
|
+
*/
|
|
2266
|
+
pageKey: "spares-seller-and-group-editing",
|
|
2267
|
+
pageLabel: "Seller spares dashboard and group stock/rules editing",
|
|
2268
|
+
href: "/store/spares",
|
|
2269
|
+
cases: [
|
|
2270
|
+
{
|
|
2271
|
+
key: "seller-can-list-a-spare",
|
|
2272
|
+
label: "A seller can create, publish and see a spare on their own /store/spares list",
|
|
2273
|
+
},
|
|
2274
|
+
{
|
|
2275
|
+
key: "group-stock-edit-is-independent",
|
|
2276
|
+
label: "Editing one group member's stock does NOT change any other member's stock",
|
|
2277
|
+
description: "Open a group parent's editor, note two children's stock figures, change ONLY one of them in the shared stock editor, save, reload. The edited child shows the new figure; the other child is UNCHANGED. This is the premise the whole feature rests on — a shared pool would fail exactly this check.",
|
|
2278
|
+
},
|
|
2279
|
+
{
|
|
2280
|
+
key: "group-rules-save-and-reload",
|
|
2281
|
+
label: "Saved group rules (min/max/per-item cap/discount) survive a reload and reach the public picker",
|
|
2282
|
+
description: "In the group parent's editor, set min/max/per-item/discount to new values, save, reload the editor — the same values must still be there. Then open the group's public picker (as a buyer) and confirm the NEW rule text is what shows, not the old one.",
|
|
2283
|
+
},
|
|
2284
|
+
{
|
|
2285
|
+
key: "group-stock-partial-failure-reported",
|
|
2286
|
+
label: "Saving group stock for a member no longer in the group reports it, without losing the other saved rows",
|
|
2287
|
+
description: "Unlink a child from a group in one tab, then (without reloading) try to save that same child's stock from a second tab holding the stale member list. The response must name that row as rejected while the OTHER rows in the same save still succeed — not a blanket failure.",
|
|
2288
|
+
},
|
|
2289
|
+
],
|
|
2290
|
+
},
|
|
2214
2291
|
{
|
|
2215
2292
|
/*
|
|
2216
2293
|
* The UPDATE path. The create path has 57 cases on /store/products/new
|
|
@@ -2314,20 +2391,21 @@ const rawTesterChecklistItems = [
|
|
|
2314
2391
|
/*
|
|
2315
2392
|
* REMOVED 2026-09-11 — `media-upload-images-capped-at-5`.
|
|
2316
2393
|
*
|
|
2317
|
-
* It asserted the gallery caps at "5 images (not 10)". The cap
|
|
2318
|
-
* raised
|
|
2319
|
-
*
|
|
2320
|
-
* "
|
|
2321
|
-
*
|
|
2322
|
-
*
|
|
2323
|
-
* would fail against correct code, and anyone "fixing" the product to
|
|
2324
|
-
* satisfy it would re-break ten-image support. Its id encoded the wrong
|
|
2325
|
-
* number too, so correcting the label alone would still mislead.
|
|
2394
|
+
* It asserted the gallery caps at "5 images (not 10)". The cap had been
|
|
2395
|
+
* raised (`PRODUCT_MAX_IMAGES`), so the case documented the OLD
|
|
2396
|
+
* behaviour as the expectation: it would fail against correct code, and
|
|
2397
|
+
* anyone "fixing" the product to satisfy it would re-break multi-image
|
|
2398
|
+
* support. Its id encoded the wrong number too, so correcting the label
|
|
2399
|
+
* alone would still mislead.
|
|
2326
2400
|
*
|
|
2327
2401
|
* The invariant it really tested — the stated limit equals the enforced
|
|
2328
|
-
* limit — survives in `media-
|
|
2329
|
-
* requires the refusal to
|
|
2330
|
-
*
|
|
2402
|
+
* limit — survives in `media-over-cap-image-refused-client-side`, which
|
|
2403
|
+
* requires the refusal to NAME the limit. Nothing was lost.
|
|
2404
|
+
*
|
|
2405
|
+
* 🛑 And the lesson got applied rather than just recorded: the cap moved
|
|
2406
|
+
* again on 2026-10-19 (10 -> 24), and the two cases that would have gone
|
|
2407
|
+
* stale now interpolate `PRODUCT_MAX_IMAGES` and carry no number in
|
|
2408
|
+
* their ids. See the note on the `media-limits` page below.
|
|
2331
2409
|
*/
|
|
2332
2410
|
{
|
|
2333
2411
|
key: "media-upload-video-duration",
|
|
@@ -2903,25 +2981,44 @@ const rawTesterChecklistItems = [
|
|
|
2903
2981
|
},
|
|
2904
2982
|
{
|
|
2905
2983
|
pageKey: "media-limits",
|
|
2906
|
-
pageLabel:
|
|
2984
|
+
pageLabel: `Media \u2014 ${PRODUCT_MAX_IMAGES} images and ${PRODUCT_MAX_VIDEOS} video, on every listing type`,
|
|
2907
2985
|
href: "/store/products/new",
|
|
2908
2986
|
cases: [
|
|
2909
2987
|
{
|
|
2910
2988
|
key: "media-gallery-accepts-images-and-video",
|
|
2911
2989
|
label: "The gallery takes BOTH images and a video, and shows a live per-type count",
|
|
2912
|
-
description:
|
|
2990
|
+
description: `Changed 2026-09-04. BEFORE the single-media control on the listing form was video-only (\`kind="video"\`), so the one "add media" affordance a seller saw refused photos. AFTER: the gallery accepts image files and a video file in the same control, and a counter under it reads "N/${PRODUCT_MAX_IMAGES} images \u00b7 N/${PRODUCT_MAX_VIDEOS} video" as you add them.`,
|
|
2913
2991
|
href: "/store/products/new",
|
|
2914
2992
|
},
|
|
2993
|
+
/*
|
|
2994
|
+
* \ud83d\uded1 These two cases state the cap by INTERPOLATING `PRODUCT_MAX_IMAGES`,
|
|
2995
|
+
* and their keys no longer encode a number.
|
|
2996
|
+
*
|
|
2997
|
+
* The pair they replace (`media-tenth-image-uploads`,
|
|
2998
|
+
* `media-eleventh-image-refused-client-side`) hard-coded 10 in the key,
|
|
2999
|
+
* the label, the description and the authored procedure's `inputs` \u2014
|
|
3000
|
+
* so raising the cap to 24 on 2026-10-19 would have left four cases
|
|
3001
|
+
* asserting the OLD number and failing against correct code. That is
|
|
3002
|
+
* exactly what the removal note above this page records happening the
|
|
3003
|
+
* last time the cap moved, including its warning that "its id encoded
|
|
3004
|
+
* the wrong number too, so correcting the label alone would still
|
|
3005
|
+
* mislead".
|
|
3006
|
+
*
|
|
3007
|
+
* What is actually under test is the BOUNDARY, not the number: that the
|
|
3008
|
+
* last allowed image succeeds (the off-by-one), and that the first one
|
|
3009
|
+
* over is refused client-side. Both are stated cap-agnostically, so the
|
|
3010
|
+
* next change to the cap needs no edit here at all.
|
|
3011
|
+
*/
|
|
2915
3012
|
{
|
|
2916
|
-
key: "media-
|
|
2917
|
-
label: "The
|
|
2918
|
-
description:
|
|
3013
|
+
key: "media-last-allowed-image-uploads",
|
|
3014
|
+
label: "The LAST allowed gallery image uploads \u2014 the cap is inclusive of its own number",
|
|
3015
|
+
description: `Add images one at a time, counting previews, until the control refuses one. BEFORE: the gallery sent its Nth image as index N+1 while the server's signed-URL guard rejected any index above the cap \u2014 so the LAST slot of every product form returned a 400 that read as a random upload failure. AFTER: the count you reach before any refusal must be exactly ${PRODUCT_MAX_IMAGES}, not ${PRODUCT_MAX_IMAGES - 1}. An off-by-one here is the most likely error and the least likely to be noticed, because one short of the cap still looks like plenty.`,
|
|
2919
3016
|
href: "/store/products/new",
|
|
2920
3017
|
},
|
|
2921
3018
|
{
|
|
2922
|
-
key: "media-
|
|
2923
|
-
label: "The
|
|
2924
|
-
description:
|
|
3019
|
+
key: "media-over-cap-image-refused-client-side",
|
|
3020
|
+
label: "The first image OVER the cap is refused by the FORM, not by the server",
|
|
3021
|
+
description: `With ${PRODUCT_MAX_IMAGES} images already added, attempt one more with the browser's Network panel open. The control must refuse it before requesting a signed URL, and the message must NAME the limit ("You can upload up to ${PRODUCT_MAX_IMAGES} images."). A server-side 400 arriving after the bytes have gone up is the wrong behaviour twice over \u2014 the seller has already waited, and an orphaned object is left in storage.`,
|
|
2925
3022
|
href: "/store/products/new",
|
|
2926
3023
|
},
|
|
2927
3024
|
{
|
|
@@ -2932,8 +3029,8 @@ const rawTesterChecklistItems = [
|
|
|
2932
3029
|
},
|
|
2933
3030
|
{
|
|
2934
3031
|
key: "media-caps-flat-across-types",
|
|
2935
|
-
label:
|
|
2936
|
-
description:
|
|
3032
|
+
label: `The same ${PRODUCT_MAX_IMAGES} + ${PRODUCT_MAX_VIDEOS} applies to an auction and a pre-order \u2014 there is no per-type table`,
|
|
3033
|
+
description: `Repeat the boundary check on /store/auctions/new and /store/pre-orders/new. Both must allow ${PRODUCT_MAX_IMAGES}. BEFORE the server carried separate AUCTION_IMAGE_MAX and PREORDER_IMAGE_MAX constants, both 5, disagreeing with everything else.`,
|
|
2937
3034
|
href: "/store/auctions/new",
|
|
2938
3035
|
},
|
|
2939
3036
|
{
|
|
@@ -3093,8 +3190,169 @@ const rawTesterChecklistItems = [
|
|
|
3093
3190
|
},
|
|
3094
3191
|
{
|
|
3095
3192
|
/*
|
|
3096
|
-
*
|
|
3097
|
-
*
|
|
3193
|
+
* Overflowing pill and tab rows — 2026-10-18.
|
|
3194
|
+
*
|
|
3195
|
+
* 🛑 Every case here is written as an explicit BEFORE → AFTER, because
|
|
3196
|
+
* the defect's symptom is not an error: a row that overflows renders
|
|
3197
|
+
* perfectly, returns HTTP 200, and simply puts some of its items past
|
|
3198
|
+
* the right edge where nothing indicates they exist. A case reading
|
|
3199
|
+
* "check the subcategories show" PASSES against the bug.
|
|
3200
|
+
*
|
|
3201
|
+
* The reported instance had 12 subcategory pills on a 1440px viewport
|
|
3202
|
+
* with the last four unreachable — no scrollbar, no arrow, no hint.
|
|
3203
|
+
*
|
|
3204
|
+
* Width is the thing under test, so every case NAMES A VIEWPORT. A run
|
|
3205
|
+
* at an unstated width cannot distinguish "collapsed correctly" from
|
|
3206
|
+
* "collapsed when it had room", which are opposite defects.
|
|
3207
|
+
*/
|
|
3208
|
+
pageKey: "overflowing-pill-rows",
|
|
3209
|
+
pageLabel: "Pill and tab rows that do not fit collapse into a searchable dropdown",
|
|
3210
|
+
href: "/categories",
|
|
3211
|
+
cases: [
|
|
3212
|
+
{ key: "wide-row-stays-pills", label: "A subcategory row that FITS still renders as pills, not a dropdown" },
|
|
3213
|
+
{ key: "narrow-row-collapses", label: "The same row at a phone width collapses to one dropdown trigger" },
|
|
3214
|
+
{ key: "collapsed-dropdown-is-searchable", label: "The collapsed dropdown has a search box that filters as you type" },
|
|
3215
|
+
{ key: "collapsed-dropdown-keyboard", label: "Arrow keys and Enter pick an item without touching the mouse" },
|
|
3216
|
+
{ key: "every-item-reachable-when-collapsed", label: "Every subcategory is reachable from the dropdown, including ones that used to be off-screen" },
|
|
3217
|
+
{ key: "pills-carry-a-leading-image", label: "Subcategory pills and dropdown rows show the category's own cover image" },
|
|
3218
|
+
{ key: "missing-image-falls-back-to-initial", label: "A subcategory with no cover image shows an initial, not a blank box or a broken image" },
|
|
3219
|
+
{ key: "widening-restores-the-pills", label: "Widening the window back expands the dropdown into pills again" },
|
|
3220
|
+
{ key: "subcategory-click-is-client-side", label: "Clicking a subcategory navigates without a full page reload" },
|
|
3221
|
+
{ key: "tabs-collapse-by-width-not-count", label: "A tab bar with six short tabs stays a row on desktop instead of collapsing on a count" },
|
|
3222
|
+
{ key: "event-tabs-do-not-jump-to-top", label: "Switching event tabs does not scroll the page back to the top" },
|
|
3223
|
+
],
|
|
3224
|
+
},
|
|
3225
|
+
{
|
|
3226
|
+
/*
|
|
3227
|
+
* The authenticity checker — 2026-10-18.
|
|
3228
|
+
*
|
|
3229
|
+
* 🛑 Every case here asserts the presence of a HEDGE, or compares two
|
|
3230
|
+
* inputs, because this tool's failure mode is not a crash: it is a
|
|
3231
|
+
* confident, plausible, wrong answer served with HTTP 200. Code-matching
|
|
3232
|
+
* alone cannot detect a counterfeit (one crawled counterfeit catalogue
|
|
3233
|
+
* printed 900+ genuine Takara Tomy codes), the Metal Fight date-code
|
|
3234
|
+
* decoding is disputed with no manufacturer statement, and two of the
|
|
3235
|
+
* spellings a naive build would flag as fake tells are Takara Tomy's own
|
|
3236
|
+
* romanisation and a licensed Indian importer's name.
|
|
3237
|
+
*/
|
|
3238
|
+
pageKey: "authenticity-checker",
|
|
3239
|
+
pageLabel: "Authenticity checker — box codes, per-generation checks and the regional code tables",
|
|
3240
|
+
href: "/tools/authenticity",
|
|
3241
|
+
cases: [
|
|
3242
|
+
/* ── Guards for the near-miss work (2026-10-19) ──────────────────
|
|
3243
|
+
* All three protect behaviour that is ALREADY CORRECT. They exist
|
|
3244
|
+
* because a "did you mean" feature is precisely the change that
|
|
3245
|
+
* could turn an absent code into an accusation, and this tool's
|
|
3246
|
+
* third rule is that a false counterfeit accusation against a real
|
|
3247
|
+
* seller is worse than a missed one.
|
|
3248
|
+
*/
|
|
3249
|
+
{
|
|
3250
|
+
key: "authenticity-unknown-code-is-not-fake",
|
|
3251
|
+
label: "An invented but well-formed box code returns NEUTRAL + inconclusive — never a counterfeit verdict",
|
|
3252
|
+
description: "Type a code that is well-formed (one letter, four digits) but not in any table — try Z9999. The verdict must be \"Inconclusive\", the signal must read neutral, and the text must say the code is NOT RECORDED rather than fake. Any wording that implies the item is counterfeit is the failure, and so is any verdict more severe than inconclusive. New genuine codes appear regularly, and counterfeiters use real codes anyway, so an absent code proves nothing in either direction.",
|
|
3253
|
+
href: "/tools/authenticity",
|
|
3254
|
+
},
|
|
3255
|
+
{
|
|
3256
|
+
key: "authenticity-near-miss-suggests",
|
|
3257
|
+
label: "A one-character-off code offers \"did you mean …?\" as a SUGGESTION, with no change to the verdict",
|
|
3258
|
+
description: "BEFORE: a transposed code said only \"not in either table\". AFTER: enter A0831 when A0813 is a known code — you get a neutral \"did you mean A0813?\" line. It must sit OUTSIDE the \"What I checked\" list, must not appear as a signal, must not fire any evasion or counterfeit warning, and the verdict must stay exactly what it was without the suggestion. A near-miss is ambiguous between a typo and a batch mimicking a real code; it is input correction, never evidence.",
|
|
3259
|
+
href: "/tools/authenticity",
|
|
3260
|
+
},
|
|
3261
|
+
{
|
|
3262
|
+
key: "authenticity-inconclusive-asks-for-more",
|
|
3263
|
+
label: "Code-only input prompts for the model name and offers the ask-the-seller next step",
|
|
3264
|
+
description: "Enter a code and a generation but NO model name. The inconclusive result must now say that supplying the name lets it cross-check name against code, and must offer asking the seller for a photo of the box bottom and the screws. BEFORE: you got the physical checklist and no indication that a second field would unlock a real check.",
|
|
3265
|
+
href: "/tools/authenticity",
|
|
3266
|
+
},
|
|
3267
|
+
{
|
|
3268
|
+
key: "authenticity-evasion-warning-survives",
|
|
3269
|
+
label: "Typing \"Pegasis\" still reaches the tool's own verdict with the evasion warning intact",
|
|
3270
|
+
description: "SECURITY-SHAPED, and it exists because of a specific hazard. The site search matcher deliberately treats \"Pegasis\" as a match for \"Storm Pegasus\" — its alias table is built FROM a counterfeit seller's spellings. This tool treats that same spelling as EVIDENCE of trademark evasion. Type Pegasis here: the fuzzy/evasion signal must still fire. If a name typeahead is offered and you pick a canonical name from it, the tool must STILL analyse what you typed — a case asserting only \"the typeahead found it\" would pass against exactly the bug this guards.",
|
|
3271
|
+
href: "/tools/authenticity",
|
|
3272
|
+
},
|
|
3273
|
+
{
|
|
3274
|
+
key: "authenticity-name-typeahead",
|
|
3275
|
+
label: "Typing a partial model name offers canonical releases, and picking one does NOT change what gets checked",
|
|
3276
|
+
description: "BEFORE: you had to already know the exact release name. AFTER: type a partial name (e.g. \"Drago\") and canonical releases appear beneath the field as suggestions. Click one — a confirmation line appears (\"We have a record close to this: …\"), but the TEXT YOU TYPED in the field must stay exactly as you typed it. Submit the check and confirm the result is consistent with what you typed, not with the suggestion you clicked.",
|
|
3277
|
+
href: "/tools/authenticity",
|
|
3278
|
+
},
|
|
3279
|
+
{
|
|
3280
|
+
key: "authenticity-box-code-still-instant",
|
|
3281
|
+
label: "A box date code (e.g. A0813) resolves instantly with no network request — it is NOT in the search index",
|
|
3282
|
+
description: "GUARD CASE. Open DevTools -> Network, clear it, and submit a known box date code. No fetch to the search artifact or any search endpoint should appear — the date-code table is bundled locally and always was. This case exists because the site-wide index work added a name typeahead to this same page, and the two must stay on separate code paths.",
|
|
3283
|
+
href: "/tools/authenticity",
|
|
3284
|
+
},
|
|
3285
|
+
{ key: "guest-sees-reference-not-a-wall", label: "Signed out, the LOOKUP ITSELF runs — no sign-in card anywhere on the page" },
|
|
3286
|
+
{ key: "no-signin-flash-when-authenticated", label: "No session placeholder and no sign-in card during a hard reload, signed in or out" },
|
|
3287
|
+
{ key: "midfake-code-reads-as-batch-not-accusation", label: "A matched midfake code reports a batch, never a counterfeit accusation against the seller" },
|
|
3288
|
+
{ key: "date-code-shows-both-readings", label: "A box date code shows BOTH circulating readings and says neither is official" },
|
|
3289
|
+
{ key: "real-product-code-is-not-evidence", label: "A well-formed product code is marked neutral and states that real codes appear on fakes" },
|
|
3290
|
+
{ key: "name-code-mismatch-asks-rather-than-accuses", label: "A name/code mismatch is a question, and answering 'How it was sold' re-reads it as expected" },
|
|
3291
|
+
{ key: "ambiguous-name-asks-which-model", label: "An ambiguous name asks which release instead of confidently naming one" },
|
|
3292
|
+
{ key: "takara-spelling-is-not-flagged", label: "'Storm Pegasis' (the Takara Tomy spelling) is not flagged, while 'Scythee' is" },
|
|
3293
|
+
{ key: "funskool-is-not-a-fake-signal", label: "Funskool reads as a licensed importer; Rapidity reads as an unlicensed producer" },
|
|
3294
|
+
{ key: "unknown-code-is-not-called-fake", label: "An unrecorded code says 'not recorded' and explicitly not 'fake'" },
|
|
3295
|
+
{ key: "asks-generation-when-nothing-inferable", label: "With no generation inferable the tool asks instead of returning a verdict" },
|
|
3296
|
+
{ key: "api-refuses-signed-out", label: "POST /api/tools/authenticity answers a signed-out caller, and still 400s an undeclared key" },
|
|
3297
|
+
{ key: "json-ld-declares-no-false-gate", label: "The WebApplication JSON-LD declares NO paywalled region, now that there is none" },
|
|
3298
|
+
{ key: "defaults-to-metal-fight", label: "Generation opens on Metal Fight, and a Burst code against it raises a mismatch signal rather than passing silently" },
|
|
3299
|
+
{ key: "contested-code-reports-the-disagreement", label: "A code two sources disagree about reports the disagreement instead of picking a side" },
|
|
3300
|
+
{ key: "font-midfake-does-not-accuse", label: "A midfake row whose own source calls the code authentic does NOT reach 'likely reproduction'" },
|
|
3301
|
+
{ key: "regional-code-reads-as-regional", label: "A Korean or Middle-East code names its region instead of coming back unrecorded" },
|
|
3302
|
+
{ key: "series-window-names-the-production-run", label: "A derivable date names its Metal-series production window, or names none outside all four" },
|
|
3303
|
+
{ key: "temporal-context-for-an-unmatched-code", label: "An unmatched code reports what else the tables record from the same month, framed as context not a match" },
|
|
3304
|
+
],
|
|
3305
|
+
},
|
|
3306
|
+
{
|
|
3307
|
+
pageKey: "price-index-tool",
|
|
3308
|
+
pageLabel: "What it sold for — realised prices",
|
|
3309
|
+
href: "/tools/price-index",
|
|
3310
|
+
cases: [
|
|
3311
|
+
{
|
|
3312
|
+
key: "price-index-resolves-locally",
|
|
3313
|
+
label: "Candidate names appear with no network delay while typing; only the bands themselves come from the server",
|
|
3314
|
+
description: "BEFORE: resolving a free-text query to a category leaf was a Firestore searchTxt query on every lookup. AFTER: open /tools/price-index, open DevTools -> Network, clear the log, and search a real model name. The suggestion/candidate step must feel instant and correspond to the local search artifact (a .json fetched once, not per search); only ONE further request — to the bands endpoint — should fire, carrying just the resolved id(s), and it must return real min/median/mean/max figures for a model with recorded sales.",
|
|
3315
|
+
href: "/tools/price-index",
|
|
3316
|
+
},
|
|
3317
|
+
{
|
|
3318
|
+
key: "price-index-falls-back-when-index-off",
|
|
3319
|
+
label: "Price lookup still works end-to-end if the search index is unavailable",
|
|
3320
|
+
description: "GUARD CASE for the fallback path. If the admin search-index kill switch is off (or the artifact fails to load), the price lookup must still return real results via the original query-based endpoint — the feature must not go blank just because the faster path is unavailable.",
|
|
3321
|
+
href: "/tools/price-index",
|
|
3322
|
+
needsReview: true,
|
|
3323
|
+
reviewNote: "Needs the kill switch flipped off to observe, which an ordinary run does not do — flagged for a human or admin-tooling pass.",
|
|
3324
|
+
},
|
|
3325
|
+
],
|
|
3326
|
+
},
|
|
3327
|
+
{
|
|
3328
|
+
pageKey: "compare-overlay-add-item",
|
|
3329
|
+
pageLabel: "Compare overlay — add another item",
|
|
3330
|
+
href: "/products",
|
|
3331
|
+
cases: [
|
|
3332
|
+
{
|
|
3333
|
+
key: "compare-add-another-via-typeahead",
|
|
3334
|
+
label: "The compare overlay's \"Add another\" typeahead adds a real item without leaving the page",
|
|
3335
|
+
description: "BEFORE: the compare overlay only ever showed items selected via listing-page checkboxes before opening it — there was no way to add a further item once the overlay was open. AFTER: open the compare overlay with at least one item selected, find the 'Add another to compare' box, type a product name, and pick a suggestion. The picked item's full column (image, price, specs) appears in the overlay without closing it or returning to the listing grid.",
|
|
3336
|
+
href: "/products",
|
|
3337
|
+
},
|
|
3338
|
+
{
|
|
3339
|
+
key: "compare-add-hidden-at-column-limit",
|
|
3340
|
+
label: "The \"Add another\" box disappears once the compare overlay is full",
|
|
3341
|
+
description: "Add items via checkboxes (or the typeahead) until the overlay holds its maximum number of columns. The 'Add another' box must then be absent entirely — not merely disabled — since a picker that cannot add anything is worse than none.",
|
|
3342
|
+
href: "/products",
|
|
3343
|
+
},
|
|
3344
|
+
],
|
|
3345
|
+
},
|
|
3346
|
+
{
|
|
3347
|
+
/*
|
|
3348
|
+
* D12 — the Beyblade parts gallery, the composition panel, and the part
|
|
3349
|
+
* line in a seller's auto-filled description.
|
|
3350
|
+
*
|
|
3351
|
+
* 🛑 `pageKey` stays `parts-database` even though the surface is now
|
|
3352
|
+
* called the Beyblade parts gallery. It keys all nine case ids, every
|
|
3353
|
+
* `testerChecklistResponses` row already recorded against them, and
|
|
3354
|
+
* `audit-tester-checklist-hrefs`. A label is a label; a key is an
|
|
3355
|
+
* identifier.
|
|
3098
3356
|
*
|
|
3099
3357
|
* 🛑 Four defects this feature has already produced, every one of them a
|
|
3100
3358
|
* 200 with plausible content: a read against a field the collection does
|
|
@@ -3105,7 +3363,7 @@ const rawTesterChecklistItems = [
|
|
|
3105
3363
|
* ABSENT panel — indistinguishable from a model we have no data for.
|
|
3106
3364
|
*/
|
|
3107
3365
|
pageKey: "parts-database",
|
|
3108
|
-
pageLabel: "
|
|
3366
|
+
pageLabel: "Beyblade parts gallery, composition panel and the part line in a description",
|
|
3109
3367
|
href: "/parts",
|
|
3110
3368
|
cases: [
|
|
3111
3369
|
{ key: "index-lists-every-classification", label: "The parts index lists all 20 classifications, labelled as names and not as URL slugs" },
|
|
@@ -3130,30 +3388,33 @@ const rawTesterChecklistItems = [
|
|
|
3130
3388
|
*
|
|
3131
3389
|
* 1. The index rendered all 1,185 rows flat. Nothing errored; it just
|
|
3132
3390
|
* buried the six roots under 752 part leaves.
|
|
3133
|
-
* 2.
|
|
3134
|
-
* classification NODES, whose own parentIds pass through a
|
|
3135
|
-
* `*-parts` node. A tab mixing "Attack Rings" with the attack rings
|
|
3136
|
-
* inside it looks entirely reasonable.
|
|
3137
|
-
* 3. Seven franchises have NO stock. Seeded active they would each be
|
|
3391
|
+
* 2. Seven franchises have NO stock. Seeded active they would each be
|
|
3138
3392
|
* a card opening an empty shop; omitted entirely, seventeen
|
|
3139
3393
|
* CharacterHotspot links stay 404. Both failure modes look fine
|
|
3140
3394
|
* from one page.
|
|
3141
|
-
*
|
|
3395
|
+
* 3. Every bundle carries a placeholder cover image, so a collage
|
|
3142
3396
|
* checked AFTER the cover would never render — and a card showing
|
|
3143
3397
|
* one grey tile is not visibly broken.
|
|
3398
|
+
*
|
|
3399
|
+
* 🛑 There was a fifth tab, Parts, removed 2026-10-20 — parts belong to
|
|
3400
|
+
* `/parts` and the spares listing type, not to a flat tab over 752
|
|
3401
|
+
* leaves. Its own case went with it. The product-detail Parts
|
|
3402
|
+
* COMPOSITION tab is a different surface and still has cases, on the
|
|
3403
|
+
* `parts-database` page above.
|
|
3144
3404
|
*/
|
|
3145
3405
|
pageKey: "category-tabs-franchise-bundles",
|
|
3146
3406
|
pageLabel: "Categories index tabs, the franchise unit and the bundle collage",
|
|
3147
3407
|
href: "/categories",
|
|
3148
3408
|
cases: [
|
|
3149
3409
|
{ key: "index-shows-roots-only", label: "The Categories tab lists the six roots and NO deeper category" },
|
|
3150
|
-
{ key: "
|
|
3151
|
-
{ key: "parts-tab-is-leaves-only", label: "The Parts tab lists part leaves and NOT the 20 classification nodes" },
|
|
3410
|
+
{ key: "four-tabs-no-all-no-parts", label: "There are exactly four tabs — no 'All', and no 'Parts'" },
|
|
3152
3411
|
{ key: "tabs-do-not-overlap", label: "No single row appears on two tabs" },
|
|
3153
3412
|
{ key: "franchise-index-hides-unstocked", label: "The franchise index shows only stocked franchises, not all eight" },
|
|
3154
3413
|
{ key: "unstocked-franchise-page-resolves", label: "An unstocked franchise page loads and says so, rather than 404ing or showing an empty grid" },
|
|
3155
3414
|
{ key: "franchise-detail-lists-its-products", label: "The Beyblade franchise page lists its listings, with a nonsense slug as the control" },
|
|
3156
3415
|
{ key: "bundle-card-shows-a-collage", label: "A bundle card shows a collage of its members, not its placeholder cover" },
|
|
3416
|
+
{ key: "tabs-collapse-on-narrow-viewport", label: "On a phone-width viewport the four tabs collapse into a searchable dropdown, not a row running off-screen" },
|
|
3417
|
+
{ key: "tabs-hover-changes-ink", label: "On desktop, hovering an inactive tab visibly changes its text colour" },
|
|
3157
3418
|
],
|
|
3158
3419
|
},
|
|
3159
3420
|
{
|
|
@@ -3363,7 +3624,7 @@ const rawTesterChecklistItems = [
|
|
|
3363
3624
|
{
|
|
3364
3625
|
key: "search-typeahead-differs",
|
|
3365
3626
|
label: "Typing \"dranzer\" and then \"dragoon\" in the header search gives DIFFERENT suggestions",
|
|
3366
|
-
description: "WAS: the same 5 newest rows appeared for every keystroke, because no search term reached the query at all. If both terms give an identical list, the term is still being ignored.",
|
|
3627
|
+
description: "WAS: the same 5 newest rows appeared for every keystroke, because no search term reached the query at all. If both terms give an identical list, the term is still being ignored. UPDATED 2026-10-19: suggestions now come from the local index and span all 21 content types rather than the four the old endpoint could produce — so expect categories, parts and FAQs among the rows, not only products. ALSO CHECK, in DevTools -> Network: after the first index download there must be NO request per keystroke.",
|
|
3367
3628
|
},
|
|
3368
3629
|
{
|
|
3369
3630
|
key: "search-typeahead-no-drafts",
|
|
@@ -3478,6 +3739,138 @@ const rawTesterChecklistItems = [
|
|
|
3478
3739
|
description: "Write this one carefully. Every other case here passes on freshly seeded data while real production documents stay invisible, because search tokens are only written when a record is saved. Pick a listing that has NOT been edited recently and confirm it is findable; if it is not, the backfill did not cover it.",
|
|
3479
3740
|
href: "/products",
|
|
3480
3741
|
},
|
|
3742
|
+
/* ── The site-wide index (2026-10-19) ─────────────────────────────
|
|
3743
|
+
* Every case below is written as an explicit BEFORE -> AFTER,
|
|
3744
|
+
* because almost all of them describe behaviour that previously
|
|
3745
|
+
* returned HTTP 200 with plausible rows. A case reading "check
|
|
3746
|
+
* search works" passes AGAINST the bug it is meant to catch.
|
|
3747
|
+
*/
|
|
3748
|
+
{
|
|
3749
|
+
key: "search-finds-every-type",
|
|
3750
|
+
label: "Searching \"dranzer\" from the header lands on /search and returns hits in SEVERAL sections",
|
|
3751
|
+
description: "BEFORE: the header sent you to /products?q=dranzer — one browse page — so you never learned there is also a category, a part, a blog post and an FAQ about it. AFTER: you land on /search and see grouped results across several sections. CONTROL, and it is the only assertion here that cannot pass by accident: search \"zzzznope\" and the page must say nothing matched, with ZERO result rows.",
|
|
3752
|
+
href: "/search",
|
|
3753
|
+
},
|
|
3754
|
+
{
|
|
3755
|
+
key: "search-finds-a-part",
|
|
3756
|
+
label: "Searching \"Rubber Flat\" and then \"RF\" both find the part",
|
|
3757
|
+
description: "BEFORE: zero results for either — all 752 parts had no search tokens at all, so they were reachable only by drilling /parts -> classification -> code. AFTER: both queries return the part, and the row shows its classification underneath the name.",
|
|
3758
|
+
href: "/search",
|
|
3759
|
+
},
|
|
3760
|
+
{
|
|
3761
|
+
key: "search-ambiguous-part-code",
|
|
3762
|
+
label: "Searching \"105\" returns SEVERAL parts, each showing a DIFFERENT classification",
|
|
3763
|
+
description: "BEFORE: there was no way to search parts at all. AFTER: \"105\" is deliberately ambiguous — it is a Metal Fight spin-track height, while a bare number in Burst is a disc — so the right answer is several rows, each naming its own classification and each linking to a different two-segment /parts/<classification>/<code> page. ONE row is the failure: it means something picked a winner.",
|
|
3764
|
+
href: "/search",
|
|
3765
|
+
},
|
|
3766
|
+
{
|
|
3767
|
+
key: "search-midword",
|
|
3768
|
+
label: "Searching \"ariza\" finds Charizard",
|
|
3769
|
+
description: "BEFORE: impossible. Firestore token search is word-PREFIX only, so a mid-word fragment matched nothing. AFTER: it matches, because the browser scans the whole index. CONTROL: \"zzzz\" must still return nothing — a matcher that returns everything for any fragment would also pass the first half.",
|
|
3770
|
+
href: "/search",
|
|
3771
|
+
},
|
|
3772
|
+
{
|
|
3773
|
+
key: "search-typo",
|
|
3774
|
+
label: "Searching \"dragon g\" finds Dragoon G, and \"Pegasis\" finds Storm Pegasus",
|
|
3775
|
+
description: "Misspellings are expanded at index time from a crawl of a counterfeit seller's real titles, on the basis that an evasion spelling is the same string a buyer mistypes. BEFORE: neither matched. AFTER: both do.",
|
|
3776
|
+
href: "/search",
|
|
3777
|
+
},
|
|
3778
|
+
{
|
|
3779
|
+
key: "search-normalised-away",
|
|
3780
|
+
label: "Searching \"!!!\" shows the \"no searchable words\" state — NOT every listing",
|
|
3781
|
+
description: "BEFORE (the inverse bug, on /api/products): a punctuation-only query produced no filter clause, so it returned the ENTIRE published catalogue as search results. AFTER: the page says the query had no searchable words in it. Note this is a different message from \"nothing matched\" and both must be distinguishable.",
|
|
3782
|
+
href: "/search",
|
|
3783
|
+
},
|
|
3784
|
+
{
|
|
3785
|
+
key: "search-zero-reads",
|
|
3786
|
+
label: "After the first search, typing produces NO further network requests",
|
|
3787
|
+
description: "Open DevTools -> Network, signed out. Type a query: you should see ONE fetch of the index artifact (a .json from firebasestorage, a few hundred KB) and nothing per keystroke thereafter. BEFORE: every keystroke hit /api/search/suggestions. A request per character is the failure even though the results look identical.",
|
|
3788
|
+
href: "/search",
|
|
3789
|
+
},
|
|
3790
|
+
{
|
|
3791
|
+
key: "search-no-prices",
|
|
3792
|
+
label: "No rupee amount appears anywhere in the header suggestions or /search results, signed out",
|
|
3793
|
+
description: "BEFORE: the header dropdown printed the product price as the suggestion subtitle, from a route cached PUBLIC for 60s — a live guest-price leak on every page. AFTER: suggestions show the brand and category instead, and no ₹ appears anywhere for a signed-out visitor.",
|
|
3794
|
+
href: "/search",
|
|
3795
|
+
},
|
|
3796
|
+
{
|
|
3797
|
+
key: "search-no-sandbox",
|
|
3798
|
+
label: "No tester-sandbox row appears in search results for a signed-out visitor",
|
|
3799
|
+
description: "The index is ONE shared file every browser downloads, with no per-viewer filter anywhere after it is built — so a sandbox row in it is published to the world for that version's lifetime. Search \"sandbox\" and \"tester\" signed out; nothing seeded as test data may appear.",
|
|
3800
|
+
href: "/search",
|
|
3801
|
+
},
|
|
3802
|
+
{
|
|
3803
|
+
key: "search-freshness",
|
|
3804
|
+
label: "A newly published listing becomes findable within ~15 minutes, and unpublishing removes it",
|
|
3805
|
+
description: "Publish a listing, note the time, and search its exact title. It should appear within about 15 minutes. Then unpublish it and search again — it must disappear within the same window. BEFORE: there was no index to go stale. A row that never appears, or never leaves, both mean the rebuild stopped.",
|
|
3806
|
+
href: "/search",
|
|
3807
|
+
},
|
|
3808
|
+
{
|
|
3809
|
+
key: "search-facet-counts",
|
|
3810
|
+
label: "Facet chips on /search show counts that match the rows actually displayed, and ticking one narrows BOTH",
|
|
3811
|
+
description: "Search a broad term. The rail shows chips like Type/Brand/Condition with a number on each. Tick one: the results narrow AND the other chips' numbers drop to match. A chip whose count does not change the result set, or a count that disagrees with the rows you can see, is the failure.",
|
|
3812
|
+
href: "/search",
|
|
3813
|
+
},
|
|
3814
|
+
{
|
|
3815
|
+
key: "search-guest-no-private",
|
|
3816
|
+
label: "Signed out, /search shows no account sections and makes ZERO authenticated requests",
|
|
3817
|
+
description: "SECURITY. In a private window with no session, search a broad term and watch DevTools -> Network. There must be no request to /api/search/scoped at all — not a 401, not an empty 200. An authenticated request firing for a guest means a session the page did not expect.",
|
|
3818
|
+
href: "/search",
|
|
3819
|
+
},
|
|
3820
|
+
{
|
|
3821
|
+
key: "search-buyer-isolation",
|
|
3822
|
+
label: "Buyer A cannot find Buyer B's order — by the UI AND by calling the API directly",
|
|
3823
|
+
description: "SECURITY, and the API half is the half that matters. Signed in as one buyer, search a term from another buyer's order. Then call /api/search/scoped?q=<term> directly in the same session and read the JSON. Neither may contain the other buyer's row. A UI that hides it while the API returns it is the failure this case exists for.",
|
|
3824
|
+
href: "/search",
|
|
3825
|
+
},
|
|
3826
|
+
{
|
|
3827
|
+
key: "search-seller-own-store",
|
|
3828
|
+
label: "A seller finds their own DRAFT listing; another seller's draft is absent",
|
|
3829
|
+
description: "Signed in as a seller, search a draft listing's title. It appears under \"Your listings (incl. drafts)\" — that section exists precisely because published listings are deduped away into the public results, so what is left is your drafts. Then confirm a different store's draft title returns nothing.",
|
|
3830
|
+
href: "/search",
|
|
3831
|
+
},
|
|
3832
|
+
{
|
|
3833
|
+
key: "search-listing-boxes-still-filter",
|
|
3834
|
+
label: "The per-collection search boxes still filter — one public, one seller, one admin",
|
|
3835
|
+
description: "REGRESSION GUARD. The box on /stores, the one on /store/orders and the one on /admin/users are a DIFFERENT system from site-wide search and must be untouched. For each: a real term narrows the list, a nonsense term returns zero, pagination still works, and the filter-drawer badge still counts correctly.",
|
|
3836
|
+
href: "/stores",
|
|
3837
|
+
},
|
|
3838
|
+
{
|
|
3839
|
+
key: "search-support-ticket-two-words",
|
|
3840
|
+
label: "A TWO-WORD support-ticket search narrows to tickets matching BOTH words",
|
|
3841
|
+
description: "BEFORE: the second word was discarded entirely, so the search returned everything matching the longer word and looked like it was working. AFTER: search two words you know appear in one ticket's subject but not together in others — only the matching ticket should remain.",
|
|
3842
|
+
href: "/admin/support-tickets",
|
|
3843
|
+
},
|
|
3844
|
+
{
|
|
3845
|
+
key: "search-parts-page-has-a-box",
|
|
3846
|
+
label: "/parts has a search box that finds a part by name or by code",
|
|
3847
|
+
description: "BEFORE: /parts was browse-only — 752 parts reachable only by clicking a classification then a code. AFTER: there is a search input above the classification grid. Type \"RF\" and the part appears with its classification; type \"zzzznope\" and it says nothing matches. The classification grid must still be there below it.",
|
|
3848
|
+
href: "/parts",
|
|
3849
|
+
},
|
|
3850
|
+
{
|
|
3851
|
+
key: "search-facet-carries-through",
|
|
3852
|
+
label: "\"See all →\" on a group with a facet ticked lands on the browse page WITH that facet still applied",
|
|
3853
|
+
description: "Search a broad term and tick a facet chip (e.g. a brand). Click the group's own \"See all →\" link. BEFORE: the link always went to the plain, unfiltered browse page, so refining on /search and then following through threw the refinement away. AFTER: the destination URL carries the same filter (e.g. ?f=brand==Takara-Tomy) and the browse page opens already narrowed.",
|
|
3854
|
+
href: "/search",
|
|
3855
|
+
},
|
|
3856
|
+
{
|
|
3857
|
+
key: "search-admin-person-exact",
|
|
3858
|
+
label: "Admin can find a user by typing just their FIRST name — but a prefix of it finds nothing",
|
|
3859
|
+
description: "Signed in as admin, open /admin/users and type a real user's first name only (not their full \"First Last\"). BEFORE: the search was an exact match on the WHOLE displayName string, so typing only the first name found nobody. AFTER: it is a whole-WORD match and finds them. Then type only the first 3-4 letters of that name (a prefix, not the whole word) — this must find NOTHING. That second half is the design, not a bug: the index is whole-word only so it cannot be unpicked by counting partial-match frequencies.",
|
|
3860
|
+
href: "/admin/users",
|
|
3861
|
+
},
|
|
3862
|
+
{
|
|
3863
|
+
key: "search-no-plaintext-pii",
|
|
3864
|
+
label: "The stored search-index values are HMAC digests, never a readable name",
|
|
3865
|
+
description: "For an admin or engineer with Firestore console access: open a `users` document and find `nameTokensIndex`. Every entry must be an opaque hex digest (prefixed `hmac:`), never the person's actual name or email in any form. Also confirm no such field exists on, or is reachable from, the public search artifact (the .json file fetched by a signed-out visitor) — a deterministic per-person identifier published to every browser is a disclosure even though it cannot be reversed.",
|
|
3866
|
+
href: "/admin/users",
|
|
3867
|
+
},
|
|
3868
|
+
{
|
|
3869
|
+
key: "faq-punctuation-search",
|
|
3870
|
+
label: "Searching \"!!!\" in the FAQ box shows the normalised-away state, not every FAQ",
|
|
3871
|
+
description: "GUARD CASE — this behaviour is already correct and this case exists to pin it so it cannot regress while the site-wide index work is in motion elsewhere. Open /faqs and search \"!!!\". It must say the search had no searchable words, and show zero FAQs — not the entire FAQ list.",
|
|
3872
|
+
href: "/faqs",
|
|
3873
|
+
},
|
|
3481
3874
|
],
|
|
3482
3875
|
},
|
|
3483
3876
|
{
|
|
@@ -3935,6 +4328,49 @@ const rawTesterChecklistItems = [
|
|
|
3935
4328
|
},
|
|
3936
4329
|
],
|
|
3937
4330
|
},
|
|
4331
|
+
{
|
|
4332
|
+
pageKey: "header-brand-mark-centring",
|
|
4333
|
+
pageLabel: "Header — Centred Brand Mark Never Collides With the Icons",
|
|
4334
|
+
href: "/products",
|
|
4335
|
+
cases: [
|
|
4336
|
+
{
|
|
4337
|
+
key: "mark-clear-of-icons-across-the-lg-band",
|
|
4338
|
+
label: "Sweeping the window from 1024px to 1280px, the centred leaf mark never overlaps the notification, messages, wishlist or cart icons",
|
|
4339
|
+
description: "Fixed 2026-10-19. BEFORE: the mark was `position: absolute; left: 50%` inside the title row, so the row's `justify-between` reserved no space for it and the right-hand cluster grew leftward straight over it. The mark reveals at md (768px) and those four icons reveal at lg (1024px), so from 1024px to roughly 1150px the cluster's left edge crossed the row midpoint and the leaf painted across the bell and the heart. AFTER: resize in ~32px steps from 1024px to 1280px and watch the gap between the wordmark and the first icon. The leaf must sit in clear space at every single step — no part of it may touch an icon's 44px box.",
|
|
4340
|
+
href: "/products",
|
|
4341
|
+
},
|
|
4342
|
+
{
|
|
4343
|
+
key: "mark-clear-signed-out-worst-case",
|
|
4344
|
+
label: "SIGNED OUT at ~1100px — where 'Sign in' and 'Register' make the cluster widest — the mark is still clear of everything",
|
|
4345
|
+
description: "Signed out is the worst case, not the easiest: the two auth buttons (~160px together) stand in for a single 44px avatar, so the cluster reaches ~120px further left than it does signed in. This is the exact width and session the original screenshot was taken at. Compare the same width signed in and signed out; both must be clean, and if only one fails say which.",
|
|
4346
|
+
href: "/products",
|
|
4347
|
+
},
|
|
4348
|
+
{
|
|
4349
|
+
key: "mark-shifts-rather-than-overlapping",
|
|
4350
|
+
label: "When the cluster is too wide to leave room, the mark moves off-centre — it never ends up underneath an icon, and no control is clipped at the window edge",
|
|
4351
|
+
description: "The mark is now one of three in-flow tracks, so a crowded row makes it YIELD. Narrow past the point where a perfectly centred mark would no longer fit and confirm the degradation: the leaf slides toward the wordmark and stays fully visible, the icons keep their full 44px boxes, and nothing is cut off at the right edge. A leaf that vanishes under an icon, or a hamburger sliced by the edge, are both failures — record which.",
|
|
4352
|
+
href: "/products",
|
|
4353
|
+
},
|
|
4354
|
+
{
|
|
4355
|
+
key: "mark-centred-at-wide-widths",
|
|
4356
|
+
label: "At 1440px and wider the leaf is centred in the header, not nudged to one side",
|
|
4357
|
+
description: "With room to spare the two side tracks split the free space evenly, which should put the leaf on the header's midpoint. Maximise the window and eyeball it against the centre of the page — a mark that is visibly off-centre at a wide width means the tracks are no longer balanced, which is a different fault from the collision and should be reported separately.",
|
|
4358
|
+
href: "/products",
|
|
4359
|
+
},
|
|
4360
|
+
{
|
|
4361
|
+
key: "mark-absent-below-md",
|
|
4362
|
+
label: "At 767px and below there is no centred leaf, the wordmark keeps its own small leaf prefix, and the header has no odd empty gap",
|
|
4363
|
+
description: "The centred mark is `hidden` below md, which removes it as a layout item entirely — so the header should look exactly as it always has on mobile. Check 767px, 640px and 320px: no centred leaf, a small leaf immediately left of the 'LetItRip' wordmark, the action cluster still flush to the right edge with no stray gap, and the hamburger fully visible and tappable at 320px.",
|
|
4364
|
+
href: "/products",
|
|
4365
|
+
},
|
|
4366
|
+
{
|
|
4367
|
+
key: "mark-centred-in-left-hand-mode",
|
|
4368
|
+
label: "In left-hand mode the wordmark and the icons swap sides, the leaf stays centred, and it still overlaps nothing",
|
|
4369
|
+
description: "Hand mode mirrors the row, so this is where a layout fix most easily half-works. Turn on left-hand mode, then repeat the 1024px–1280px sweep: the wordmark must sit flush against the RIGHT edge with no gap, the icon cluster flush against the LEFT edge with the hamburger outermost, and the leaf still centred and untouched. A wordmark floating away from its edge means a side track lost its mirrored alignment.",
|
|
4370
|
+
href: "/products",
|
|
4371
|
+
},
|
|
4372
|
+
],
|
|
4373
|
+
},
|
|
3938
4374
|
{
|
|
3939
4375
|
pageKey: "nav-reachability",
|
|
3940
4376
|
pageLabel: "Navigation — Every Item Reachable at Every Width",
|
|
@@ -6626,6 +7062,24 @@ const rawTesterChecklistItems = [
|
|
|
6626
7062
|
pageLabel: "Header search",
|
|
6627
7063
|
href: "/",
|
|
6628
7064
|
cases: [
|
|
7065
|
+
{
|
|
7066
|
+
key: "header-search-submit-lands-on-search",
|
|
7067
|
+
label: "Submitting the header search lands on /search with GROUPED results — not on one browse page",
|
|
7068
|
+
description: "BEFORE: submitting sent you to the browse route for whichever type was selected in the dropdown — /products?q=dranzer — so a cross-resource search was unreachable and the /search page it should have used had no users at all. AFTER: you land on /search?q=dranzer and see results grouped by type, each group with its own \"See all … →\" link pointing at that browse page. The per-type destinations are not lost; they moved to where they belong.",
|
|
7069
|
+
href: "/",
|
|
7070
|
+
},
|
|
7071
|
+
{
|
|
7072
|
+
key: "header-search-type-is-a-filter",
|
|
7073
|
+
label: "The type dropdown NARROWS the results — it no longer decides where you land",
|
|
7074
|
+
description: "BEFORE: choosing \"Stores\" meant submitting took you to /stores. AFTER: choosing \"Stores\" narrows what you see, and the Stores group's own \"See all stores →\" link is what takes you to /stores. Also confirm an EMPTY query does nothing at all on submit — landing on a bare browse page you did not ask for is worse than staying put.",
|
|
7075
|
+
href: "/",
|
|
7076
|
+
},
|
|
7077
|
+
{
|
|
7078
|
+
key: "header-search-no-price-for-guest",
|
|
7079
|
+
label: "Signed out, no suggestion row shows a price",
|
|
7080
|
+
description: "BEFORE: the suggestion subtitle was the product's price, served from a route cached PUBLIC for 60 seconds — so every signed-out visitor saw prices in the header on every page. AFTER: the subtitle is the brand and category. Any ₹ in the dropdown while signed out is a FAIL.",
|
|
7081
|
+
href: "/",
|
|
7082
|
+
},
|
|
6629
7083
|
{
|
|
6630
7084
|
key: "search-finds-maintenance-toggle",
|
|
6631
7085
|
label: "Searching 'maintenance' reaches the maintenance TOGGLE, not just Site Settings",
|
|
@@ -6711,6 +7165,76 @@ const rawTesterChecklistItems = [
|
|
|
6711
7165
|
* tester reporting "I did the actions" as if it were "the outcome was right".
|
|
6712
7166
|
* ══════════════════════════════════════════════════════════════════════════ */
|
|
6713
7167
|
...group("money-flows", "Money Flows (end to end)", moneyFlowsPages),
|
|
7168
|
+
/*
|
|
7169
|
+
* The sticker-sheet kiss-cut tracer. Admin-only, under a PUBLIC prefix.
|
|
7170
|
+
*
|
|
7171
|
+
* 🛑 `adminOnly` is a presentation flag for the checklist, not the gate. The
|
|
7172
|
+
* real boundary is the layout's server-side session read, which redirects a
|
|
7173
|
+
* non-admin before any HTML exists — which is exactly what the buyer and
|
|
7174
|
+
* guest cases below assert. Marking it admin-only here only keeps it out of a
|
|
7175
|
+
* non-admin tester's list.
|
|
7176
|
+
*
|
|
7177
|
+
* Every case is an explicit BEFORE -> AFTER, because almost every defect this
|
|
7178
|
+
* feature can have returns 200 with plausible content: a wrong part count, a
|
|
7179
|
+
* watermarked original, a millimetre derived from a DPI nobody confirmed. A
|
|
7180
|
+
* case reading "check the tracer works" would pass against all three.
|
|
7181
|
+
*/
|
|
7182
|
+
...group("tools", "Tools", [
|
|
7183
|
+
{
|
|
7184
|
+
pageKey: "sticker-tracer",
|
|
7185
|
+
pageLabel: "Sticker sheet tracer",
|
|
7186
|
+
href: "/tools/sticker-tracer",
|
|
7187
|
+
cases: [
|
|
7188
|
+
{ key: "enclosed-region-opaque", label: "An enclosed region matching the paper colour stays OPAQUE inside its sticker" },
|
|
7189
|
+
{ key: "white-on-white-edge", label: "A white sticker edge on white paper is found with no per-sticker parameter" },
|
|
7190
|
+
{ key: "background-model-named", label: "The result names which background model ran (paper vs art)" },
|
|
7191
|
+
{ key: "name-required", label: "A run cannot be committed without a name" },
|
|
7192
|
+
{ key: "no-watermark-on-original", label: "A downloaded original carries NO watermark and comes from a signed GCS URL" },
|
|
7193
|
+
{ key: "progress-names-stage", label: "Live progress names the current STAGE, not just a percentage" },
|
|
7194
|
+
{ key: "failure-names-stage", label: "A failed run names the stage it died in and survives a reload" },
|
|
7195
|
+
{ key: "runs-never-overwrite", label: "A second run never overwrites the first — both stay in history" },
|
|
7196
|
+
{ key: "accepted-differs-from-succeeded", label: "'accepted' and 'succeeded' are distinct, and exactly one run is accepted" },
|
|
7197
|
+
{ key: "fullres-only-after-accept", label: "Full-resolution parts and the export surface appear only after accepting" },
|
|
7198
|
+
{ key: "no-dpi-no-mm", label: "With no confirmed DPI the export REFUSES rather than inventing a scale" },
|
|
7199
|
+
{ key: "oversized-named-not-scaled", label: "A part too wide for the machine is NAMED before export, never scaled" },
|
|
7200
|
+
{ key: "node-budget-reported", label: "The export node budget reports its cost in millimetres of deviation" },
|
|
7201
|
+
{ key: "retry-shows-clamp", label: "A retry SHOWS the resume clamp before it is applied" },
|
|
7202
|
+
{ key: "buyer-redirected", label: "A signed-in buyer is redirected and sees no Tools entry for it" },
|
|
7203
|
+
{ key: "guest-redirected", label: "A signed-out visitor is redirected; /tools itself is unaffected" },
|
|
7204
|
+
{ key: "storage-meter-honest", label: "The storage meter reports object COUNT beside bytes, and says when it truncated" },
|
|
7205
|
+
],
|
|
7206
|
+
},
|
|
7207
|
+
{
|
|
7208
|
+
/*
|
|
7209
|
+
* Part Two D — promoting a traced, accepted, promoted-to-full-res
|
|
7210
|
+
* sheet into real marketplace listings. Distinct from the tracer's
|
|
7211
|
+
* own "promote" (run -> sheet, full-res pixels); this is sheet ->
|
|
7212
|
+
* marketplace (real products). Needs a real traced sheet to reach, so
|
|
7213
|
+
* these cases follow the tracer's own happy path rather than
|
|
7214
|
+
* standing alone.
|
|
7215
|
+
*/
|
|
7216
|
+
pageKey: "sticker-promote-to-listings",
|
|
7217
|
+
pageLabel: "Promoting a sheet to real listings",
|
|
7218
|
+
href: "/tools/sticker-tracer",
|
|
7219
|
+
cases: [
|
|
7220
|
+
{
|
|
7221
|
+
key: "promote-creates-one-group",
|
|
7222
|
+
label: "Promoting a sheet creates one parent listing plus one child per UNIQUE part, all in one group",
|
|
7223
|
+
description: "On a sheet with at least one part marked a duplicate of another, promote it to listings. The group must contain the parent plus exactly the UNIQUE parts — a duplicate part must NOT get its own listing — and the picker on the parent's product page must show every member, not just one (this is exactly the `linkChildToGroup` stale-append bug: linking N children in a loop used to leave only one).",
|
|
7224
|
+
},
|
|
7225
|
+
{
|
|
7226
|
+
key: "promoted-part-image-watermarked",
|
|
7227
|
+
label: "A promoted part's marketplace image is watermarked; the admin's original download is NOT",
|
|
7228
|
+
description: "Open the promoted CHILD listing's public page and note its image carries a visible watermark. Then, from the tracer's own UI, download that same part's original — it must be clean, with no watermark. Same pixels, same object, two different responses: that is the point.",
|
|
7229
|
+
},
|
|
7230
|
+
{
|
|
7231
|
+
key: "promote-refuses-before-full-res-render",
|
|
7232
|
+
label: "Promoting a sheet that has not been accepted-and-rendered is refused, naming the fix",
|
|
7233
|
+
description: "Attempt to promote a sheet whose active run has not had \"Accept & render\" run on it (or try on a fresh trace with no promoted run). The action must refuse with a message naming the required step (accept/render the run first) — not create partial listings.",
|
|
7234
|
+
},
|
|
7235
|
+
],
|
|
7236
|
+
},
|
|
7237
|
+
], { adminOnly: true }),
|
|
6714
7238
|
];
|
|
6715
7239
|
const defaultPhases = assignDefaultPhases(rawTesterChecklistItems);
|
|
6716
7240
|
export const testerChecklistSeedData = rawTesterChecklistItems.map((item, index) => ({
|