@mohasinac/appkit 4.52.4 → 4.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +4 -0
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +24 -37
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +1 -1
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +62 -1
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +12 -3
- 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/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.d.ts +1 -3
- package/dist/features/layout/TitleBarLayout.js +3 -4
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
- package/dist/features/tester/seed-data/authored/index.js +10 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +4 -4
- package/dist/next/routing/route-map.js +25 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +1 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
|
@@ -179,17 +179,27 @@ export const authored = {
|
|
|
179
179
|
startPage: "/events",
|
|
180
180
|
steps: [
|
|
181
181
|
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
182
|
-
"Open event-
|
|
182
|
+
"Open event-win-burst-regalia-genesis and click the Participate tab.",
|
|
183
183
|
"Read the entry conditions stated.",
|
|
184
184
|
"Enter the raffle.",
|
|
185
185
|
"Read what the page shows immediately, without reloading.",
|
|
186
|
-
"
|
|
186
|
+
"RELOAD and read the tab again BEFORE touching the form — note whether it already shows you as entered, or presents an empty form as though you had not.",
|
|
187
187
|
"Try to enter a second time.",
|
|
188
188
|
],
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
/*
|
|
190
|
+
* 🛑 The fixture changed, 2026-10-19 — it pointed at
|
|
191
|
+
* `event-won-original-set-raffle`, which is seeded `status: ENDED` with a
|
|
192
|
+
* winner ALREADY DRAWN. `enterEvent` refuses any event that is not active,
|
|
193
|
+
* so every step after "Enter the raffle" was unreachable: the case could
|
|
194
|
+
* only ever record the generic closed-entries refusal, which looks like a
|
|
195
|
+
* correct result and proves nothing about one-entry-per-user.
|
|
196
|
+
* `event-win-burst-regalia-genesis` is the active open_raffle.
|
|
197
|
+
*/
|
|
198
|
+
inputs: { eventId: "event-win-burst-regalia-genesis" },
|
|
199
|
+
expectedBehaviour: "An open raffle records one entry per user, enforced SERVER-side. The entry is what makes the user eligible for the draw, so a duplicate would literally double their odds against everyone else. A limit held in the browser is no limit: the form's counter starts at zero on every page load.",
|
|
200
|
+
expectedUiState: "The entry is confirmed in place. After reloading — before any interaction — the tab already shows the user as entered, not an inviting empty form. The second attempt is refused with a message naming the existing entry.",
|
|
201
|
+
expectedData: { entriesPerUser: 1, entriesAfterSecondAttempt: 1 },
|
|
202
|
+
endResult: "BEFORE: a reload reset the form's counter to zero and presented an empty form, and submitting it was ACCEPTED with the same 'You're entered in the raffle!' toast — two entries for one person, because only surveys and polls had a per-user check and raffle had none. AFTER: the reloaded page shows the entry, and a forced second submit is refused. Exactly one entry exists.",
|
|
193
203
|
},
|
|
194
204
|
/*
|
|
195
205
|
* 🛑 THESE TWO CASES CHANGED SHAPE, 2026-09-15.
|
|
@@ -247,16 +257,32 @@ export const authored = {
|
|
|
247
257
|
startPage: "/events",
|
|
248
258
|
steps: [
|
|
249
259
|
"Sign in as rehan.sheikh@gmail.com / TempPass123!.",
|
|
250
|
-
"
|
|
260
|
+
"Navigate to the wheel BY CLICKING its card from /events — do not type the URL. The link uses the event's slug, which is the path a real visitor takes.",
|
|
261
|
+
"Click the Participate tab.",
|
|
251
262
|
"Click the spin control ONCE and watch the wheel.",
|
|
252
263
|
"Read the prize shown and how long it took to appear.",
|
|
264
|
+
"If anything is refused, open the network panel and record the spin request's STATUS CODE and the `code` field in its response body.",
|
|
253
265
|
"Reload the page and read the Participate tab.",
|
|
254
266
|
],
|
|
255
267
|
inputs: { eventId: "event-daily-beyblade-pull-wheel" },
|
|
256
|
-
expectedBehaviour: "The very first spin succeeds and
|
|
268
|
+
expectedBehaviour: "The very first spin succeeds and names a prize. The spin is a plain POST to /api/events/{id}/spin and its response carries the prize — there is no realtime channel involved, so a failure is the request itself failing, not a subscription timing problem.",
|
|
257
269
|
expectedUiState: "The wheel spins and lands on a named prize within a few seconds. No 'Spin failed' error appears on the first attempt. After reloading, the result is still shown rather than the wheel offering another free spin.",
|
|
258
|
-
expectedData: { spinsUsed: 1 },
|
|
259
|
-
|
|
270
|
+
expectedData: { spinsUsed: 1, spinHttpStatus: 200 },
|
|
271
|
+
/*
|
|
272
|
+
* 🛑 Two recorded production failures, and the SLUG step above is what
|
|
273
|
+
* reaches the second one.
|
|
274
|
+
*
|
|
275
|
+
* The feature was gated on `FEATURE_PRIZE_DRAWS`, an env var belonging to a
|
|
276
|
+
* mechanism that had already been retired and was therefore set nowhere —
|
|
277
|
+
* so every spin returned 503 while the button rendered enabled. Underneath
|
|
278
|
+
* that, the spin core looked the event up by document id only, with no slug
|
|
279
|
+
* fallback, while every card links by slug. Fixing the gate alone turns the
|
|
280
|
+
* 503 into a 404.
|
|
281
|
+
*
|
|
282
|
+
* So "type the doc-id URL and spin" would have passed against the live bug.
|
|
283
|
+
* Arriving by click is the test.
|
|
284
|
+
*/
|
|
285
|
+
endResult: "BEFORE: the spin returned HTTP 503 with code `feature_disabled` on every attempt (and, once that was fixed, HTTP 404 `EVENT_NOT_FOUND` whenever the page was reached by its slug — i.e. from any card). Both rendered as 'Spin failed. Please try again.'. AFTER: the first click returns 200 and names a prize. The recorded spin and its prize survive the reload.",
|
|
260
286
|
},
|
|
261
287
|
"checklist-content-discovery-events-spin-wheel-max-per-user": {
|
|
262
288
|
roles: ["buyer"],
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the content-discovery/overflowing-pill-rows page.
|
|
3
|
+
* WHAT: 11 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* 🛑 WIDTH IS THE SUBJECT, SO EVERY CASE STATES ONE.
|
|
6
|
+
*
|
|
7
|
+
* These cases test a MEASUREMENT. A run that does not pin the viewport cannot
|
|
8
|
+
* tell "collapsed because it did not fit" from "collapsed when it had room" —
|
|
9
|
+
* and those are opposite defects with the same screenshot. Each case therefore
|
|
10
|
+
* names an explicit width and the tester must set it before looking.
|
|
11
|
+
*
|
|
12
|
+
* The defect being guarded is silent by construction: an overflowing row
|
|
13
|
+
* renders cleanly, returns 200, and puts its tail past the right edge with no
|
|
14
|
+
* scrollbar and no arrow. Nothing errors, nothing logs. Measured on the report
|
|
15
|
+
* that prompted this: 12 pills on a 1440px viewport, last four unreachable.
|
|
16
|
+
*
|
|
17
|
+
* FIXTURE: `category-original-attack-rings` — **87 direct children**, counted
|
|
18
|
+
* from `_helpers/category-parts.ts`, and the node the reported screenshot came
|
|
19
|
+
* from (Draciel F, Dragoon F, Dragoon Storm, Dranzer F, Dranzer S, Driger F,
|
|
20
|
+
* Galeon, Galman, Galzzly, Griffolyon, Metal Draciel…).
|
|
21
|
+
*
|
|
22
|
+
* 🛑 It is chosen for being FAR past the threshold at every viewport, so these
|
|
23
|
+
* cases cannot silently stop testing anything if the catalogue is regenerated
|
|
24
|
+
* a little smaller. If it ever drops near a dozen, replace the fixture rather
|
|
25
|
+
* than loosen the assertion — a row that fits proves nothing about a row that
|
|
26
|
+
* does not. The first draft of this file invented an id that does not exist,
|
|
27
|
+
* and `audit-tester-plugin-wiring` R7 caught it: a tester following a bad id
|
|
28
|
+
* finds nothing and reports a bug that is really a typo (Root Cause #32).
|
|
29
|
+
*
|
|
30
|
+
* @tag domain:tester
|
|
31
|
+
* @tag layer:seed
|
|
32
|
+
* @tag pattern:none
|
|
33
|
+
* @tag access:server-only
|
|
34
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
35
|
+
* @tag sideEffects:none
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* 87 direct children — collapses at EVERY viewport. Use for the search,
|
|
39
|
+
* keyboard and reachability cases.
|
|
40
|
+
*/
|
|
41
|
+
const CATEGORY = "/categories/category-original-attack-rings";
|
|
42
|
+
/**
|
|
43
|
+
* 5 direct children (the four generations plus Battle Gear) — fits a desktop
|
|
44
|
+
* and overflows a phone, which is the only fixture that can prove the control
|
|
45
|
+
* tracks WIDTH rather than just always collapsing.
|
|
46
|
+
*
|
|
47
|
+
* 🛑 Both fixtures are needed and neither is redundant. A suite that only ever
|
|
48
|
+
* looked at the 87-child row would pass identically against an implementation
|
|
49
|
+
* that collapsed unconditionally — the bug one size larger than the one being
|
|
50
|
+
* fixed.
|
|
51
|
+
*/
|
|
52
|
+
const SMALL_CATEGORY = "/categories/category-spinning-tops";
|
|
53
|
+
export const authored = {
|
|
54
|
+
"checklist-content-discovery-overflowing-pill-rows-wide-row-stays-pills": {
|
|
55
|
+
roles: ["guest"],
|
|
56
|
+
startPage: SMALL_CATEGORY,
|
|
57
|
+
steps: [
|
|
58
|
+
"Set the browser window to 1440x900.",
|
|
59
|
+
`Open ${SMALL_CATEGORY}.`,
|
|
60
|
+
"Find the 'Subcategories' label and look at the row directly beneath it.",
|
|
61
|
+
"Count the pills and check whether any is cut off at the right edge.",
|
|
62
|
+
],
|
|
63
|
+
expectedBehaviour: "The row is measured against its container, not counted. When the pills fit, they stay pills — collapsing a row that had room would hide items behind an extra click for no reason.",
|
|
64
|
+
expectedUiState: "A horizontal row of rounded pills under 'Subcategories', each reading a name and a number. Every pill is fully visible: none is clipped by the right edge and there is no horizontal scrollbar. There is NO single dropdown trigger.",
|
|
65
|
+
endResult: "Nothing persists; this is a read-only page. Reloading at the same width shows the same pill row.",
|
|
66
|
+
},
|
|
67
|
+
"checklist-content-discovery-overflowing-pill-rows-narrow-row-collapses": {
|
|
68
|
+
roles: ["guest"],
|
|
69
|
+
startPage: SMALL_CATEGORY,
|
|
70
|
+
steps: [
|
|
71
|
+
"Set the browser window to 390x844 (a phone width).",
|
|
72
|
+
`Open ${SMALL_CATEGORY}.`,
|
|
73
|
+
"Find the 'Subcategories' label and look at the control directly beneath it.",
|
|
74
|
+
"🛑 This is the SAME page as the previous case at a different width — that is the point. If it renders a dropdown here and pills there, the control is tracking width.",
|
|
75
|
+
],
|
|
76
|
+
expectedBehaviour: "BEFORE: the pills simply ran past the right edge. There was no scrollbar, no arrow and no indication the row continued, so the subcategories beyond the fold were unreachable — the page looked complete while hiding items. AFTER: the row measures wider than the container and collapses to one trigger.",
|
|
77
|
+
expectedUiState: "A single bordered control reading 'Browse subcategories' followed by the total count and a chevron. The pill row is NOT present. Nothing is clipped at the right edge.",
|
|
78
|
+
endResult: "Nothing persists. Reloading at 390px wide shows the collapsed trigger again.",
|
|
79
|
+
},
|
|
80
|
+
"checklist-content-discovery-overflowing-pill-rows-collapsed-dropdown-is-searchable": {
|
|
81
|
+
roles: ["guest"],
|
|
82
|
+
startPage: CATEGORY,
|
|
83
|
+
steps: [
|
|
84
|
+
"Set the browser window to 390x844.",
|
|
85
|
+
`Open ${CATEGORY}.`,
|
|
86
|
+
"Click the 'Browse subcategories' trigger.",
|
|
87
|
+
"Read the full list of rows offered.",
|
|
88
|
+
"Type drag into the search box.",
|
|
89
|
+
"Read the list again.",
|
|
90
|
+
"Clear the search box.",
|
|
91
|
+
],
|
|
92
|
+
inputs: { search: "drag" },
|
|
93
|
+
expectedBehaviour: "BEFORE: the collapsed control was a native <select>, which cannot be typed at — a 12-row picker had to be scrolled. AFTER: the dropdown opens with a focused search box that filters the list on every keystroke, case-insensitively, matching anywhere in the name rather than only the start.",
|
|
94
|
+
expectedUiState: "A panel containing a search field and a scrollable list. With 'drag' typed, only rows whose name contains 'drag' remain (e.g. 'Dragoon F', 'Dragoon Storm') and non-matching rows such as 'Draciel F' are gone. Clearing the box restores the full list.",
|
|
95
|
+
endResult: "Nothing persists. Closing and reopening the dropdown shows an empty search box and the full list.",
|
|
96
|
+
},
|
|
97
|
+
"checklist-content-discovery-overflowing-pill-rows-collapsed-dropdown-keyboard": {
|
|
98
|
+
roles: ["guest"],
|
|
99
|
+
startPage: CATEGORY,
|
|
100
|
+
steps: [
|
|
101
|
+
"Set the browser window to 390x844.",
|
|
102
|
+
`Open ${CATEGORY}.`,
|
|
103
|
+
"Click the 'Browse subcategories' trigger.",
|
|
104
|
+
"Press ArrowDown three times without touching the mouse.",
|
|
105
|
+
"Note which row is highlighted.",
|
|
106
|
+
"Press Enter.",
|
|
107
|
+
],
|
|
108
|
+
expectedBehaviour: "The search box keeps focus and the arrow keys move a highlight through the filtered list, wrapping at the ends. Enter opens the highlighted subcategory. Escape closes the panel and returns focus to the trigger. The highlight is the same one the mouse sets, so there are never two cursors in the list.",
|
|
109
|
+
expectedUiState: "After three ArrowDowns the third row is visibly highlighted and no other row is. After Enter the browser is on that subcategory's own page, whose heading matches the row that was highlighted.",
|
|
110
|
+
endResult: "The navigation is real: the URL is the chosen subcategory's and reloading stays there.",
|
|
111
|
+
},
|
|
112
|
+
"checklist-content-discovery-overflowing-pill-rows-every-item-reachable-when-collapsed": {
|
|
113
|
+
roles: ["guest"],
|
|
114
|
+
startPage: SMALL_CATEGORY,
|
|
115
|
+
steps: [
|
|
116
|
+
"Set the browser window to 1440x900.",
|
|
117
|
+
`Open ${SMALL_CATEGORY}.`,
|
|
118
|
+
"Write down the name of the LAST pill visible in the Subcategories row.",
|
|
119
|
+
"Resize the window to 390x844.",
|
|
120
|
+
"Click 'Browse subcategories' and scroll the list to the bottom.",
|
|
121
|
+
"Compare the list against the names seen at the wide width.",
|
|
122
|
+
],
|
|
123
|
+
expectedBehaviour: "BEFORE: items past the right edge existed in the DOM but had no affordance — no scrollbar, no arrow — so they could not be reached at all at a narrow width. AFTER: the collapsed list contains EVERY direct child, including the ones that used to be cut off.",
|
|
124
|
+
expectedUiState: "The dropdown list is scrollable and its row count equals the number shown on the trigger. Every pill name seen at 1440px appears as a row, and so do the ones that were clipped.",
|
|
125
|
+
endResult: "Nothing persists. The list contents are the same on every open.",
|
|
126
|
+
},
|
|
127
|
+
"checklist-content-discovery-overflowing-pill-rows-pills-carry-a-leading-image": {
|
|
128
|
+
roles: ["guest"],
|
|
129
|
+
startPage: SMALL_CATEGORY,
|
|
130
|
+
steps: [
|
|
131
|
+
"Set the browser window to 1440x900.",
|
|
132
|
+
`Open ${SMALL_CATEGORY}.`,
|
|
133
|
+
"Look at the left-hand side of each pill in the Subcategories row.",
|
|
134
|
+
"Resize to 390x844 and open 'Browse subcategories'.",
|
|
135
|
+
"Look at the left-hand side of each row in the list.",
|
|
136
|
+
],
|
|
137
|
+
expectedBehaviour: "A subcategory's cover image is shown as a small leading thumbnail so the row can be scanned by sight rather than by reading every label. The SAME visual appears in both states — a pill and its dropdown row are the same item and must not look like different things.",
|
|
138
|
+
expectedUiState: "Each pill shows a small square image immediately left of its name, at roughly text height, without making the pill taller than it was. The dropdown rows show the same images. No image is stretched or letterboxed.",
|
|
139
|
+
endResult: "Nothing persists. The same images appear on reload.",
|
|
140
|
+
},
|
|
141
|
+
"checklist-content-discovery-overflowing-pill-rows-missing-image-falls-back-to-initial": {
|
|
142
|
+
roles: ["guest"],
|
|
143
|
+
startPage: "/categories/category-spinning-tops",
|
|
144
|
+
steps: [
|
|
145
|
+
"Set the browser window to 1440x900.",
|
|
146
|
+
"Open /categories/category-spinning-tops.",
|
|
147
|
+
"Look at the Subcategories row for any entry whose category has no cover image.",
|
|
148
|
+
"Check what is drawn where the thumbnail would be.",
|
|
149
|
+
],
|
|
150
|
+
expectedBehaviour: "Roughly 650 of the intermediate branch categories have neither an icon nor a cover image, so the fallback is the common case rather than an edge case. It must be a drawn initial, never an empty reserved box and never a broken-image glyph — a blank square reads as a failed load and invites a bug report against working code.",
|
|
151
|
+
expectedUiState: "A pill with no cover shows a small circle containing the first letter of its name. There is no broken-image icon anywhere in the row, and the pills all sit on the same baseline with equal height whether or not they have an image.",
|
|
152
|
+
endResult: "Nothing persists.",
|
|
153
|
+
},
|
|
154
|
+
"checklist-content-discovery-overflowing-pill-rows-widening-restores-the-pills": {
|
|
155
|
+
roles: ["guest"],
|
|
156
|
+
startPage: CATEGORY,
|
|
157
|
+
steps: [
|
|
158
|
+
"Set the browser window to 390x844.",
|
|
159
|
+
`Open ${SMALL_CATEGORY} and confirm the Subcategories control is a single dropdown trigger.`,
|
|
160
|
+
"Without reloading, resize the window back to 1440x900.",
|
|
161
|
+
"Look at the Subcategories area again.",
|
|
162
|
+
"Resize back down to 390 and up to 1440 twice more, watching for flicker.",
|
|
163
|
+
],
|
|
164
|
+
expectedBehaviour: "🛑 This is the case most likely to fail. Collapsing REMOVES the row, so there is nothing left to measure and a naive implementation can never expand again — a one-way door that looks correct until someone widens the window. The row's natural width is cached while it is still rendered, and expanding requires a clear margin above that width rather than an exact fit, so the two states cannot oscillate at the boundary.",
|
|
165
|
+
expectedUiState: "At 1440px the pill row is back and the dropdown trigger is gone. During the resize the control does not flicker, alternate, or rapidly toggle between the two states at any intermediate width.",
|
|
166
|
+
endResult: "Nothing persists. The state always matches the current width, not the width the page loaded at.",
|
|
167
|
+
},
|
|
168
|
+
"checklist-content-discovery-overflowing-pill-rows-subcategory-click-is-client-side": {
|
|
169
|
+
roles: ["guest"],
|
|
170
|
+
startPage: SMALL_CATEGORY,
|
|
171
|
+
steps: [
|
|
172
|
+
"Set the browser window to 1440x900.",
|
|
173
|
+
`Open ${SMALL_CATEGORY}.`,
|
|
174
|
+
"Open the browser devtools Network tab and clear it.",
|
|
175
|
+
"Click any subcategory pill.",
|
|
176
|
+
"Look at whether the page performed a full document navigation.",
|
|
177
|
+
],
|
|
178
|
+
expectedBehaviour: "Subcategory pills are client-side links, not plain anchors. A plain <a> would make every click re-download the whole document — a silent performance regression that looks identical to working navigation apart from the flash.",
|
|
179
|
+
expectedUiState: "The destination category page renders. The page does not white-flash, and the Network tab shows an RSC payload fetch rather than a full document request for the destination HTML.",
|
|
180
|
+
endResult: "The URL is the clicked subcategory's; going Back returns to the previous category with its row intact.",
|
|
181
|
+
},
|
|
182
|
+
"checklist-content-discovery-overflowing-pill-rows-tabs-collapse-by-width-not-count": {
|
|
183
|
+
roles: ["guest"],
|
|
184
|
+
startPage: SMALL_CATEGORY,
|
|
185
|
+
steps: [
|
|
186
|
+
"Set the browser window to 1440x900.",
|
|
187
|
+
`Open ${SMALL_CATEGORY} and scroll to the Products / Auctions / Pre-Orders tab bar.`,
|
|
188
|
+
"Count the tabs and check whether they render as a row or a dropdown.",
|
|
189
|
+
"Resize to 390x844 and look at the same tab bar.",
|
|
190
|
+
],
|
|
191
|
+
expectedBehaviour: "BEFORE: the tab bar collapsed whenever it had more than five tabs, regardless of width — so six short tabs became a dropdown on a 1440px desktop with room to spare, while four long ones stayed a row on a phone and overflowed. AFTER: the decision is the measured width of the rendered row against its container, so the same bar can be a row on desktop and a dropdown on a phone.",
|
|
192
|
+
expectedUiState: "At 1440px the tabs render as a horizontal row with the underline rail on the active one, even when there are six or more. At 390px the same bar is a single dropdown trigger. The resting appearance of the expanded row is unchanged from before — still an underline rail, not pills.",
|
|
193
|
+
endResult: "Nothing persists. The tab bar's form follows the current width on every render.",
|
|
194
|
+
},
|
|
195
|
+
"checklist-content-discovery-overflowing-pill-rows-event-tabs-do-not-jump-to-top": {
|
|
196
|
+
roles: ["guest"],
|
|
197
|
+
startPage: "/events",
|
|
198
|
+
steps: [
|
|
199
|
+
"Set the browser window to 1440x900.",
|
|
200
|
+
"Open /events and click into any event with an Overview / Participate / Leaderboard tab bar.",
|
|
201
|
+
"Scroll down until the tab bar is near the top of the viewport.",
|
|
202
|
+
"Click a different tab.",
|
|
203
|
+
"Note the scroll position immediately after the panel swaps.",
|
|
204
|
+
],
|
|
205
|
+
expectedBehaviour: "The app mounts a global ScrollToTop keyed on pathname, so a tab that navigates must opt out explicitly or every switch yanks the page to the top. The tab bar passes that opt-out through to its links.",
|
|
206
|
+
expectedUiState: "After clicking, the newly selected tab is active and its panel is shown, while the page stays at roughly the scroll position it was at — the tab bar does not leap back down the screen.",
|
|
207
|
+
endResult: "The URL is the new tab's; reloading lands on that tab.",
|
|
208
|
+
},
|
|
209
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the design-ux/header-brand-mark-centring page.
|
|
3
|
+
* WHAT: 6 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* @tag domain:tester
|
|
6
|
+
* @tag layer:seed
|
|
7
|
+
* @tag pattern:none
|
|
8
|
+
* @tag access:server-only
|
|
9
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
10
|
+
* @tag sideEffects:none
|
|
11
|
+
*/
|
|
12
|
+
export const authored = {
|
|
13
|
+
"checklist-design-ux-header-brand-mark-centring-mark-clear-of-icons-across-the-lg-band": {
|
|
14
|
+
roles: ["guest"],
|
|
15
|
+
startPage: "/products",
|
|
16
|
+
steps: [
|
|
17
|
+
"Open /products signed out.",
|
|
18
|
+
"Set the window to exactly 1024px wide.",
|
|
19
|
+
"Widen in roughly 32px steps to 1280px, pausing at each step.",
|
|
20
|
+
"At each step look at the space between the 'LetItRip' wordmark and the first icon of the right-hand cluster.",
|
|
21
|
+
],
|
|
22
|
+
expectedBehaviour: "The mark is one of three in-flow tracks in the title row, so the row's layout reserves its width and the action cluster cannot be laid out across it at any width. Previously it was absolutely positioned and the cluster simply grew over it between 1024px and ~1150px.",
|
|
23
|
+
expectedUiState: "At every step the leaf mark sits in clear space with visible gap on both sides. No part of it overlaps the notification bell, the messages icon, the wishlist heart or the cart. Each icon's full 44px square is unobstructed. If an overlap appears, record the exact window width it starts and stops at — the band is the finding, not the single screenshot.",
|
|
24
|
+
endResult: "Pure layout; nothing persists. Reloading at any width in the band reproduces the same clean header, and the band must not reappear after a reload.",
|
|
25
|
+
},
|
|
26
|
+
"checklist-design-ux-header-brand-mark-centring-mark-clear-signed-out-worst-case": {
|
|
27
|
+
roles: ["guest", "buyer"],
|
|
28
|
+
startPage: "/products",
|
|
29
|
+
steps: [
|
|
30
|
+
"Sign out completely and load /products.",
|
|
31
|
+
"Set the window to approximately 1100px wide.",
|
|
32
|
+
"Screenshot the header.",
|
|
33
|
+
"Sign in as any buyer and, without changing the window width, screenshot the header again.",
|
|
34
|
+
],
|
|
35
|
+
expectedBehaviour: "Signed out the cluster is at its widest, because 'Sign in' and 'Register' (~160px together) replace a single 44px avatar. ~1100px signed out is the exact combination the original bug report was captured at, so it is the case most likely to regress.",
|
|
36
|
+
expectedUiState: "Both screenshots show the leaf mark clear of every control. Signed out the cluster reads search, Today's Deals, theme and hamburger plus 'Sign in' and 'Register'; signed in it reads bell, messages, heart, cart, avatar and the same four. In neither does the leaf touch an icon. If exactly one of the two fails, say which — signed-out-only failure means the auth buttons' extra width is still unaccounted for.",
|
|
37
|
+
endResult: "Navigation and session change only. Signing back out at the same width must return to the clean signed-out header, not to an overlapping one.",
|
|
38
|
+
},
|
|
39
|
+
"checklist-design-ux-header-brand-mark-centring-mark-shifts-rather-than-overlapping": {
|
|
40
|
+
roles: ["guest"],
|
|
41
|
+
startPage: "/products",
|
|
42
|
+
steps: [
|
|
43
|
+
"Signed out at /products, start from 1280px.",
|
|
44
|
+
"Narrow the window slowly toward 1024px.",
|
|
45
|
+
"Watch the leaf mark's horizontal position as the gap closes.",
|
|
46
|
+
"Stop at the narrowest point where the cluster still shows all of its icons.",
|
|
47
|
+
],
|
|
48
|
+
expectedBehaviour: "When the cluster needs more than its half of the row, the side track holding the wordmark yields and the mark is pushed off-centre. Shifting is the intended degradation — the alternative designs either hide the mark under the icons (the old bug) or let the cluster shrink below its own content and be clipped, and the app shell is overflow-clipped, so clipped is gone rather than scrollable.",
|
|
49
|
+
expectedUiState: "As the window narrows the leaf drifts toward the wordmark and stays fully visible the whole way — it never slides beneath an icon and never gets cropped. Every icon keeps its full box, the hamburger stays entirely inside the right edge, and nothing is cut off. Report separately whether the failure was an overlap, a clipped control, or a disappearing leaf; they have different causes.",
|
|
50
|
+
endResult: "Nothing persists. Widening back to 1280px returns the leaf to the centre, which also confirms the shift is layout-driven and not a one-way state.",
|
|
51
|
+
},
|
|
52
|
+
"checklist-design-ux-header-brand-mark-centring-mark-centred-at-wide-widths": {
|
|
53
|
+
roles: ["guest"],
|
|
54
|
+
startPage: "/products",
|
|
55
|
+
steps: [
|
|
56
|
+
"Load /products and maximise the window (1440px or wider).",
|
|
57
|
+
"Compare the leaf mark's position against the horizontal centre of the page content.",
|
|
58
|
+
"Repeat at 1920px if the display allows it.",
|
|
59
|
+
],
|
|
60
|
+
expectedBehaviour: "With room to spare the two side tracks each take an equal share of the free space, which places the middle track on the row's midpoint — the mark is centred by the layout rather than by a `left: 50%` offset.",
|
|
61
|
+
expectedUiState: "The leaf is centred in the header to the eye, lining up with the centre of the page beneath it. A mark that is visibly nudged to one side at a wide width is a DIFFERENT fault from the collision — the side tracks are no longer balanced — and should be filed as such, with the window width noted.",
|
|
62
|
+
endResult: "No state. The centring must hold across a reload and across a soft navigation to another page.",
|
|
63
|
+
},
|
|
64
|
+
"checklist-design-ux-header-brand-mark-centring-mark-absent-below-md": {
|
|
65
|
+
roles: ["guest"],
|
|
66
|
+
startPage: "/products",
|
|
67
|
+
steps: [
|
|
68
|
+
"Load /products signed out.",
|
|
69
|
+
"Set the window to 767px, then 640px, then 320px.",
|
|
70
|
+
"At each width inspect the whole header row end to end.",
|
|
71
|
+
"At 320px tap the hamburger.",
|
|
72
|
+
],
|
|
73
|
+
expectedBehaviour: "The centred mark is hidden below md, which removes it as a layout item entirely rather than merely making it invisible — so the mobile header should be identical to how it has always rendered, with the two side tracks splitting the full width.",
|
|
74
|
+
expectedUiState: "No centred leaf at any of the three widths. A small leaf sits immediately left of the 'LetItRip' wordmark. The action cluster is still flush against the right edge with no unexplained empty gap between it and the edge. At 320px the hamburger is fully visible, not sliced by the edge, and tapping it opens the menu.",
|
|
75
|
+
endResult: "Nothing is written. Widening back past 768px brings the centred leaf back, confirming the hide is width-driven.",
|
|
76
|
+
},
|
|
77
|
+
"checklist-design-ux-header-brand-mark-centring-mark-centred-in-left-hand-mode": {
|
|
78
|
+
roles: ["guest"],
|
|
79
|
+
startPage: "/products",
|
|
80
|
+
steps: [
|
|
81
|
+
"Load /products and switch the interface to left-hand mode.",
|
|
82
|
+
"Set the window to 1024px.",
|
|
83
|
+
"Widen in ~32px steps to 1280px, checking the header at each step.",
|
|
84
|
+
"Narrow to 320px and check the header once more.",
|
|
85
|
+
],
|
|
86
|
+
expectedBehaviour: "Hand mode reverses the row's main axis, so the two side tracks swap ends. Each side carries its own mirrored alignment, and the middle track is deliberately hand-neutral — a centred brand mark must not move when the hands swap.",
|
|
87
|
+
expectedUiState: "The wordmark sits flush against the RIGHT edge with no gap between it and the edge; the icon cluster sits flush against the LEFT edge with the hamburger outermost; the leaf stays centred and overlaps nothing at any step. A wordmark floating away from the right edge means a side track lost its mirrored alignment — that is a fix that only works in right-hand mode, and it is the most likely way this regresses.",
|
|
88
|
+
endResult: "The hand-mode preference persists across a reload; the header must render the same way after it. Switching back to right-hand mode mirrors everything again with the leaf still centred.",
|
|
89
|
+
},
|
|
90
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Authored six-part procedures for the design-ux/header-controls-and-messages page.
|
|
3
|
+
* WHAT: 6 case(s), keyed by full checklist id.
|
|
4
|
+
*
|
|
5
|
+
* @tag domain:tester
|
|
6
|
+
* @tag layer:seed
|
|
7
|
+
* @tag pattern:none
|
|
8
|
+
* @tag access:server-only
|
|
9
|
+
* @tag consumers:seed-data/authored/index.ts
|
|
10
|
+
* @tag sideEffects:none
|
|
11
|
+
*/
|
|
12
|
+
export const authored = {
|
|
13
|
+
"checklist-design-ux-header-controls-and-messages-no-help-or-tour-icon": {
|
|
14
|
+
roles: ["guest"],
|
|
15
|
+
startPage: "/products",
|
|
16
|
+
steps: [
|
|
17
|
+
"Open /products at a maximised window.",
|
|
18
|
+
"Read every icon in the top header row, right of the logo.",
|
|
19
|
+
"Repeat at 1024px, 768px and 320px.",
|
|
20
|
+
],
|
|
21
|
+
expectedBehaviour: "The tour control was removed outright, along with the prop that fed it, so there is no width at which it can reappear.",
|
|
22
|
+
expectedUiState: "No '?' icon anywhere in the header at any of the four widths. The right-hand cluster is search, Today's Deals (640px and up), theme toggle and hamburger — plus the signed-in icons at 1024px and up. The removed control previously sat between the theme toggle and the hamburger.",
|
|
23
|
+
endResult: "Nothing persists; this is a pure chrome check. The hamburger must still be present and fully visible at 320px.",
|
|
24
|
+
},
|
|
25
|
+
"checklist-design-ux-header-controls-and-messages-tour-does-not-autostart": {
|
|
26
|
+
roles: ["guest", "buyer"],
|
|
27
|
+
startPage: "/",
|
|
28
|
+
steps: [
|
|
29
|
+
"Signed out, load /, then /products, then a product detail page.",
|
|
30
|
+
"Wait a few seconds on each without clicking anything.",
|
|
31
|
+
"Sign in and repeat the same three pages.",
|
|
32
|
+
],
|
|
33
|
+
expectedBehaviour: "Removing the header button removed the only call to `startTour`. Nothing else should be able to begin a tour, on any route or for any role.",
|
|
34
|
+
expectedUiState: "No tour popover, spotlight, highlight ring or step counter appears at any point, signed in or out. A tour appearing means something still calls startTour and the removal is incomplete — record which page it fired on.",
|
|
35
|
+
endResult: "No tour state is written. Reloading any of the pages produces no tour either.",
|
|
36
|
+
},
|
|
37
|
+
"checklist-design-ux-header-controls-and-messages-messages-icon-visible-when-signed-in": {
|
|
38
|
+
roles: ["buyer"],
|
|
39
|
+
startPage: "/messages",
|
|
40
|
+
steps: [
|
|
41
|
+
"Sign in as any buyer.",
|
|
42
|
+
"At a window 1024px or wider, look at the header beside the notification bell.",
|
|
43
|
+
"Click the messages icon.",
|
|
44
|
+
],
|
|
45
|
+
expectedBehaviour: "The header renders the messages control only when `siteSettings.chat.enabled` is true — and renders nothing at all when it is not, rather than a disabled icon. The flag is now on, so the control should exist and route to the inbox.",
|
|
46
|
+
expectedUiState: "A messages/inbox icon is present beside the notification bell and carries an unread badge when there are unread messages. Clicking it navigates to /messages, which loads — not a 404 and not /unauthorized.",
|
|
47
|
+
endResult: "Navigation only; nothing is written. Going back returns to the previous page with the icon still present.",
|
|
48
|
+
},
|
|
49
|
+
"checklist-design-ux-header-controls-and-messages-messages-icon-on-mobile-row": {
|
|
50
|
+
roles: ["buyer"],
|
|
51
|
+
startPage: "/messages",
|
|
52
|
+
steps: [
|
|
53
|
+
"Still signed in, narrow the window to 320px.",
|
|
54
|
+
"Look at BOTH header rows — the main row and the secondary row beneath it.",
|
|
55
|
+
"Tap the messages icon.",
|
|
56
|
+
],
|
|
57
|
+
expectedBehaviour: "Several signed-in icons are hidden from the main row below 1024px and carried on a secondary row instead, so the control moves rather than disappearing.",
|
|
58
|
+
expectedUiState: "The messages icon is present and fully visible in the secondary header row at 320px — not clipped at the edge and not absent. Tapping it opens /messages.",
|
|
59
|
+
endResult: "Nothing persists. Widening back past 1024px moves the icon to the main row again.",
|
|
60
|
+
},
|
|
61
|
+
"checklist-design-ux-header-controls-and-messages-messages-absent-for-guests": {
|
|
62
|
+
roles: ["guest"],
|
|
63
|
+
startPage: "/products",
|
|
64
|
+
steps: [
|
|
65
|
+
"Sign out completely.",
|
|
66
|
+
"Reload /products.",
|
|
67
|
+
"Inspect both header rows at a desktop width and again at 320px.",
|
|
68
|
+
],
|
|
69
|
+
expectedBehaviour: "A message inbox is per-user, so enabling the feature site-wide must not expose the control to visitors who have no inbox.",
|
|
70
|
+
expectedUiState: "No messages icon in either header row at either width. The guest header shows search, deals, theme, hamburger and the sign-in affordances only.",
|
|
71
|
+
endResult: "No state. Signing back in brings the icon back, which also confirms the gate is on the session and not on the page.",
|
|
72
|
+
},
|
|
73
|
+
"checklist-design-ux-header-controls-and-messages-messages-inbox-loads": {
|
|
74
|
+
roles: ["buyer"],
|
|
75
|
+
startPage: "/messages",
|
|
76
|
+
steps: [
|
|
77
|
+
"Signed in, navigate directly to /messages.",
|
|
78
|
+
"Wait for the page to settle.",
|
|
79
|
+
"Reload once.",
|
|
80
|
+
],
|
|
81
|
+
expectedBehaviour: "The messaging feature has been dormant behind a disabled flag, so this is the first real exercise of the page. It must handle having no conversations as a normal state.",
|
|
82
|
+
expectedUiState: "The inbox shell renders with either a list of conversations or an explicit empty state saying there are none. It must NOT be a crash, an error boundary, a redirect to /unauthorized, or a spinner that never resolves. Note the exact empty-state wording so a later run can tell 'empty' from 'failed to load'.",
|
|
83
|
+
endResult: "Reloading shows the same state. Visiting /messages signed out should send you to sign-in rather than rendering an empty inbox.",
|
|
84
|
+
},
|
|
85
|
+
};
|
|
@@ -77,6 +77,7 @@ import { authored as a_content_discovery__blog } from "./content-discovery__blog
|
|
|
77
77
|
import { authored as a_content_discovery__coupons } from "./content-discovery__coupons.js";
|
|
78
78
|
import { authored as a_content_discovery__events } from "./content-discovery__events.js";
|
|
79
79
|
import { authored as a_content_discovery__faq_help } from "./content-discovery__faq-help.js";
|
|
80
|
+
import { authored as a_content_discovery__authenticity_checker } from "./content-discovery__authenticity-checker.js";
|
|
80
81
|
import { authored as a_content_discovery__parts_database } from "./content-discovery__parts-database.js";
|
|
81
82
|
import { authored as a_content_discovery__category_tabs_franchise_bundles } from "./content-discovery__category-tabs-franchise-bundles.js";
|
|
82
83
|
import { authored as a_content_discovery__notifications } from "./content-discovery__notifications.js";
|
|
@@ -89,6 +90,8 @@ import { authored as a_design_ux__back_to_top_button } from "./design-ux__back-t
|
|
|
89
90
|
import { authored as a_design_ux__rich_text_readability } from "./design-ux__rich-text-readability.js";
|
|
90
91
|
import { authored as a_design_ux__action_bar_placement } from "./design-ux__action-bar-placement.js";
|
|
91
92
|
import { authored as a_design_ux__nav_reachability } from "./design-ux__nav-reachability.js";
|
|
93
|
+
import { authored as a_design_ux__header_brand_mark_centring } from "./design-ux__header-brand-mark-centring.js";
|
|
94
|
+
import { authored as a_design_ux__header_controls_and_messages } from "./design-ux__header-controls-and-messages.js";
|
|
92
95
|
import { authored as a_design_ux__feature_badge_picker } from "./design-ux__feature-badge-picker.js";
|
|
93
96
|
import { authored as a_design_ux__dashboard_layout } from "./design-ux__dashboard-layout.js";
|
|
94
97
|
import { authored as a_design_ux__footer_theme } from "./design-ux__footer-theme.js";
|
|
@@ -113,6 +116,7 @@ import { authored as a_selling__final_sale_authoring } from "./selling__final-sa
|
|
|
113
116
|
import { authored as a_selling__listing_type_fields_roundtrip } from "./selling__listing-type-fields-roundtrip.js";
|
|
114
117
|
import { authored as a_selling__media_limits } from "./selling__media-limits.js";
|
|
115
118
|
import { authored as a_selling__seller_bids_bundles_filters } from "./selling__seller-bids-bundles-filters.js";
|
|
119
|
+
import { authored as a_tools__sticker_tracer } from "./tools__sticker-tracer.js";
|
|
116
120
|
import { authored as a_selling__seller_catalog_org } from "./selling__seller-catalog-org.js";
|
|
117
121
|
import { authored as a_selling__seller_custom_brands } from "./selling__seller-custom-brands.js";
|
|
118
122
|
import { authored as a_selling__seller_guide } from "./selling__seller-guide.js";
|
|
@@ -139,6 +143,7 @@ import { authored as a_selling__listing_edit_roundtrip } from "./selling__listin
|
|
|
139
143
|
import { authored as a_selling__digital_content_delivery } from "./selling__digital-content-delivery.js";
|
|
140
144
|
import { authored as a_selling__seller_orders_at_scale } from "./selling__seller-orders-at-scale.js";
|
|
141
145
|
import { authored as a_content_discovery__category_counts_and_rollup } from "./content-discovery__category-counts-and-rollup.js";
|
|
146
|
+
import { authored as a_content_discovery__overflowing_pill_rows } from "./content-discovery__overflowing-pill-rows.js";
|
|
142
147
|
import { authored as a_content_discovery__store_reviews_aggregate } from "./content-discovery__store-reviews-aggregate.js";
|
|
143
148
|
import { authored as a_buying__order_detail_actions } from "./buying__order-detail-actions.js";
|
|
144
149
|
import { authored as a_admin__admin_detail_round_trips } from "./admin__admin-detail-round-trips.js";
|
|
@@ -203,6 +208,7 @@ export const AUTHORED_CASES = {
|
|
|
203
208
|
...a_content_discovery__coupons,
|
|
204
209
|
...a_content_discovery__events,
|
|
205
210
|
...a_content_discovery__faq_help,
|
|
211
|
+
...a_content_discovery__authenticity_checker,
|
|
206
212
|
...a_content_discovery__parts_database,
|
|
207
213
|
...a_content_discovery__category_tabs_franchise_bundles,
|
|
208
214
|
...a_content_discovery__notifications,
|
|
@@ -215,6 +221,8 @@ export const AUTHORED_CASES = {
|
|
|
215
221
|
...a_design_ux__rich_text_readability,
|
|
216
222
|
...a_design_ux__action_bar_placement,
|
|
217
223
|
...a_design_ux__nav_reachability,
|
|
224
|
+
...a_design_ux__header_brand_mark_centring,
|
|
225
|
+
...a_design_ux__header_controls_and_messages,
|
|
218
226
|
...a_design_ux__feature_badge_picker,
|
|
219
227
|
...a_design_ux__dashboard_layout,
|
|
220
228
|
...a_design_ux__footer_theme,
|
|
@@ -239,6 +247,7 @@ export const AUTHORED_CASES = {
|
|
|
239
247
|
...a_selling__listing_type_fields_roundtrip,
|
|
240
248
|
...a_selling__media_limits,
|
|
241
249
|
...a_selling__seller_bids_bundles_filters,
|
|
250
|
+
...a_tools__sticker_tracer,
|
|
242
251
|
...a_selling__seller_catalog_org,
|
|
243
252
|
...a_selling__seller_custom_brands,
|
|
244
253
|
...a_selling__seller_guide,
|
|
@@ -265,6 +274,7 @@ export const AUTHORED_CASES = {
|
|
|
265
274
|
...a_selling__digital_content_delivery,
|
|
266
275
|
...a_selling__seller_orders_at_scale,
|
|
267
276
|
...a_content_discovery__category_counts_and_rollup,
|
|
277
|
+
...a_content_discovery__overflowing_pill_rows,
|
|
268
278
|
...a_content_discovery__store_reviews_aggregate,
|
|
269
279
|
...a_buying__order_detail_actions,
|
|
270
280
|
...a_admin__admin_detail_round_trips,
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* @tag consumers:seed-data/authored/index.ts
|
|
19
19
|
* @tag sideEffects:none
|
|
20
20
|
*/
|
|
21
|
+
import { PRODUCT_MAX_IMAGES } from "../../../../_internal/shared/media/limits.js";
|
|
21
22
|
export const authored = {
|
|
22
23
|
"checklist-selling-media-limits-media-gallery-accepts-images-and-video": {
|
|
23
24
|
roles: ["seller"],
|
|
@@ -41,39 +42,40 @@ export const authored = {
|
|
|
41
42
|
expectedUiState: "Three image previews and one video poster frame, each showing its own content rather than a generic icon. No error toast on any of the four.",
|
|
42
43
|
endResult: "Leave the editor without saving so no draft product is created.",
|
|
43
44
|
},
|
|
44
|
-
"checklist-selling-media-limits-media-
|
|
45
|
+
"checklist-selling-media-limits-media-last-allowed-image-uploads": {
|
|
45
46
|
roles: ["seller"],
|
|
46
47
|
startPage: "/store/products/new",
|
|
47
48
|
steps: [
|
|
48
49
|
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
49
|
-
"Open /store/products/new and type 'QA Product media-
|
|
50
|
+
"Open /store/products/new and type 'QA Product media-boundary' as the title.",
|
|
50
51
|
"Click 'Show all fields (advanced)' before touching any media. 🛑 /store/products/new opens the QUICK form by default for a create of a standard listing, and it has ONE field — 'Product Image' — with no gallery and no video field at all. Every media step below needs the advanced form.",
|
|
51
|
-
|
|
52
|
-
"Upload
|
|
53
|
-
"
|
|
52
|
+
`Read the counter under the gallery and note the cap it advertises. It must read ${PRODUCT_MAX_IMAGES}. 🛑 Do NOT assume a number here — the cap is one constant (\`PRODUCT_MAX_IMAGES\`) and this case is written against whatever it currently is.`,
|
|
53
|
+
"Upload public/test-media/sample-image.png to the gallery repeatedly, one at a time, counting the previews after each, until the control refuses one.",
|
|
54
|
+
"Record the preview count reached at the moment of the first refusal.",
|
|
54
55
|
],
|
|
55
|
-
inputs: { title: "QA Product media-
|
|
56
|
-
expectedBehaviour:
|
|
57
|
-
expectedUiState:
|
|
58
|
-
expectedData: { imageCount:
|
|
56
|
+
inputs: { title: "QA Product media-boundary", cap: PRODUCT_MAX_IMAGES },
|
|
57
|
+
expectedBehaviour: `Every upload up to and including the ${PRODUCT_MAX_IMAGES}th is accepted, because a cap is inclusive of its own number. An off-by-one that refuses the last one is the most likely error and the least likely to be noticed, since one short of the cap still looks like plenty.`,
|
|
58
|
+
expectedUiState: `The preview count reached before the first refusal is exactly ${PRODUCT_MAX_IMAGES}. The counter's own advertised cap and the count actually reachable must be the SAME number — a form that says ${PRODUCT_MAX_IMAGES} and allows ${PRODUCT_MAX_IMAGES - 1} is the failure, whichever number it says.`,
|
|
59
|
+
expectedData: { imageCount: PRODUCT_MAX_IMAGES },
|
|
59
60
|
endResult: "Leave the editor without saving.",
|
|
60
61
|
},
|
|
61
|
-
"checklist-selling-media-limits-media-
|
|
62
|
+
"checklist-selling-media-limits-media-over-cap-image-refused-client-side": {
|
|
62
63
|
roles: ["seller"],
|
|
63
64
|
startPage: "/store/products/new",
|
|
64
65
|
steps: [
|
|
65
66
|
"Sign in as tyson@beybladearena.in / TempPass123!.",
|
|
66
|
-
"Open /store/products/new
|
|
67
|
+
"Open /store/products/new.",
|
|
67
68
|
"Click 'Show all fields (advanced)' before touching any media. 🛑 /store/products/new opens the QUICK form by default for a create of a standard listing, and it has ONE field — 'Product Image' — with no gallery and no video field at all. Every media step below needs the advanced form.",
|
|
69
|
+
`Fill the gallery to its cap with public/test-media/sample-image.png (${PRODUCT_MAX_IMAGES} uploads).`,
|
|
68
70
|
"Open the browser's Network panel.",
|
|
69
|
-
"Attempt
|
|
71
|
+
"Attempt one more upload of the same file.",
|
|
70
72
|
"Read the message shown and count the previews.",
|
|
71
|
-
"Check the Network panel for any upload request made by that
|
|
73
|
+
"Check the Network panel for any signed-URL or upload request made by that over-cap attempt.",
|
|
72
74
|
],
|
|
73
|
-
inputs: { cap:
|
|
74
|
-
expectedBehaviour: "The
|
|
75
|
-
expectedUiState:
|
|
76
|
-
expectedData: { imageCount:
|
|
75
|
+
inputs: { cap: PRODUCT_MAX_IMAGES, attemptCount: PRODUCT_MAX_IMAGES + 1 },
|
|
76
|
+
expectedBehaviour: "The over-cap file is refused in the browser, before any signed URL is requested. Refusing it only after the bytes have reached storage leaves an orphaned object behind and spends the seller's upload time on a file that was never going to be kept.",
|
|
77
|
+
expectedUiState: `A readable message NAMES the limit as ${PRODUCT_MAX_IMAGES}, the preview count stays at ${PRODUCT_MAX_IMAGES}, and the Network panel shows NO upload request for the over-cap attempt. A refusal that appears only after a round trip is the failure, and so is a refusal that does not say what the limit is.`,
|
|
78
|
+
expectedData: { imageCount: PRODUCT_MAX_IMAGES, uploadRequestsForOverCap: 0 },
|
|
77
79
|
endResult: "Leave the editor without saving.",
|
|
78
80
|
},
|
|
79
81
|
"checklist-selling-media-limits-media-second-video-refused-first-kept": {
|