@mohasinac/appkit 4.13.1 → 4.14.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/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
- package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
- package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
- package/dist/_internal/server/features/auctions/actions.js +6 -0
- package/dist/_internal/server/features/bundles/data.d.ts +16 -0
- package/dist/_internal/server/features/bundles/data.js +26 -0
- package/dist/_internal/server/features/bundles/index.d.ts +1 -1
- package/dist/_internal/server/features/bundles/index.js +1 -1
- package/dist/_internal/server/features/checkout/actions.js +6 -0
- package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
- package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
- package/dist/_internal/server/features/homepage/index.d.ts +0 -1
- package/dist/_internal/server/features/homepage/index.js +7 -1
- package/dist/_internal/server/features/lottery/adapters.js +4 -0
- package/dist/_internal/server/features/products/data.js +15 -37
- package/dist/_internal/server/features/products/index.d.ts +1 -1
- package/dist/_internal/server/features/products/index.js +1 -1
- package/dist/_internal/server/features/products/list-public.d.ts +46 -20
- package/dist/_internal/server/features/products/list-public.js +266 -90
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
- package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
- package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
- package/dist/_internal/server/features/site-settings/adapters.js +75 -0
- package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
- package/dist/_internal/server/features/site-settings/index.js +1 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
- package/dist/_internal/server/features/stores/adapters.js +91 -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/jobs/core/auctionSettlement.js +56 -2
- package/dist/_internal/server/jobs/core/offerExpiry.js +45 -9
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
- package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
- package/dist/_internal/server/jobs/handlers/messages.js +10 -0
- package/dist/_internal/shared/actions/action-registry.js +15 -1
- package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
- package/dist/_internal/shared/checkout/lanes.js +26 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
- package/dist/_internal/shared/features/auctions/config.js +27 -0
- package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
- package/dist/_internal/shared/features/cart/schema.d.ts +12 -12
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
- package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
- package/dist/_internal/shared/features/emi/schedule.js +20 -5
- package/dist/_internal/shared/features/events/schema.d.ts +2 -2
- package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
- package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
- package/dist/_internal/shared/features/offers/config.d.ts +30 -0
- package/dist/_internal/shared/features/offers/config.js +59 -0
- package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
- package/dist/_internal/shared/features/products/schema.d.ts +32 -32
- package/dist/_internal/shared/features/products/to-product-item.js +6 -0
- package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
- package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
- package/dist/_internal/shared/features/site-settings/fees.js +39 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
- package/dist/_internal/shared/features/site-settings/types.js +1 -0
- package/dist/_internal/shared/history/history.d.ts +66 -0
- package/dist/_internal/shared/history/history.js +158 -0
- package/dist/_internal/shared/history/index.d.ts +4 -0
- package/dist/_internal/shared/history/index.js +2 -0
- package/dist/_internal/shared/history/types.d.ts +61 -0
- package/dist/_internal/shared/history/types.js +6 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
- package/dist/_internal/shared/listing-types/_registry.js +67 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/art/config.js +5 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
- package/dist/_internal/shared/listing-types/auction/config.js +21 -0
- package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
- package/dist/_internal/shared/listing-types/availability.js +104 -0
- package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
- package/dist/_internal/shared/listing-types/capabilities.js +12 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/classified/config.js +5 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
- package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/live/config.js +5 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/standard/config.js +5 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
- package/dist/client.d.ts +7 -5
- package/dist/client.js +2 -2
- package/dist/constants/api-endpoints.d.ts +6 -0
- package/dist/constants/api-endpoints.js +2 -0
- package/dist/constants/field-names.d.ts +49 -2
- package/dist/constants/field-names.js +53 -2
- package/dist/constants/table-keys.d.ts +17 -0
- package/dist/constants/table-keys.js +17 -0
- package/dist/errors/error-codes.d.ts +13 -1
- package/dist/errors/error-codes.js +13 -1
- package/dist/errors/error-display-map.js +12 -3
- package/dist/errors/messages.d.ts +10 -2
- package/dist/errors/messages.js +10 -2
- package/dist/features/about/components/AboutView.d.ts +3 -0
- package/dist/features/about/components/AboutView.js +3 -2
- package/dist/features/about/components/PolicyPageView.d.ts +2 -1
- package/dist/features/about/components/PolicyPageView.js +61 -23
- package/dist/features/about/components/PublicProfileView.js +5 -0
- package/dist/features/about/schemas/firestore.d.ts +3 -0
- package/dist/features/account/components/UserOrdersView.js +7 -0
- package/dist/features/account/components/index.d.ts +0 -2
- package/dist/features/account/components/index.js +0 -1
- package/dist/features/account/schemas/index.d.ts +2 -2
- package/dist/features/account/types/index.d.ts +21 -2
- package/dist/features/addresses/schemas/index.d.ts +4 -4
- package/dist/features/admin/components/AdminArtView.js +8 -3
- package/dist/features/admin/components/AdminClassifiedView.js +8 -3
- package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
- package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
- package/dist/features/admin/components/AdminLiveView.js +8 -3
- package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
- package/dist/features/admin/components/AdminOffersView.js +186 -0
- package/dist/features/admin/components/AdminOrdersView.js +10 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
- package/dist/features/admin/components/AdminProductsView.js +16 -29
- package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
- package/dist/features/admin/components/AdminSiteView.js +6 -2
- package/dist/features/admin/components/AdminStickersView.js +8 -3
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +86 -0
- package/dist/features/admin/constants/filter-tabs.js +55 -0
- package/dist/features/admin/schemas/firestore.d.ts +122 -3
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
- package/dist/features/auctions/actions/bid-actions.js +93 -20
- package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
- package/dist/features/auctions/components/AuctionsListView.js +5 -6
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
- package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
- package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
- package/dist/features/auctions/repository/bid.repository.js +23 -0
- package/dist/features/auctions/schemas/firestore.d.ts +17 -0
- package/dist/features/auctions/schemas/index.d.ts +12 -12
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +10 -1
- package/dist/features/blog/actions/blog-actions.d.ts +7 -7
- package/dist/features/blog/schemas/index.d.ts +6 -6
- package/dist/features/cart/repository/cart.repository.js +1 -0
- package/dist/features/cart/schemas/firestore.d.ts +15 -0
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/categories/components/BrandDetailPageView.js +23 -40
- package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
- package/dist/features/categories/components/BrandDetailTabs.js +8 -12
- package/dist/features/categories/components/BundleCollage.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
- package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
- package/dist/features/categories/components/CategoryProductsListing.js +11 -1
- package/dist/features/categories/components/ConcernCard.js +7 -1
- package/dist/features/categories/schemas/firestore.d.ts +13 -0
- package/dist/features/categories/schemas/index.d.ts +26 -26
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
- package/dist/features/events/components/AdminEventsView.js +15 -11
- package/dist/features/events/components/EventFilters.d.ts +9 -1
- package/dist/features/events/components/EventFilters.js +45 -21
- package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
- package/dist/features/events/components/EventsIndexListing.js +2 -2
- package/dist/features/events/components/EventsListPageView.js +13 -4
- package/dist/features/events/repository/events.repository.d.ts +17 -0
- package/dist/features/events/repository/events.repository.js +27 -0
- package/dist/features/events/schemas/firestore.d.ts +12 -0
- package/dist/features/events/schemas/firestore.js +12 -0
- package/dist/features/events/schemas/index.d.ts +50 -50
- package/dist/features/events/types/index.d.ts +11 -0
- package/dist/features/events/types/index.js +57 -1
- package/dist/features/faq/actions/faq-actions.d.ts +12 -12
- package/dist/features/faq/schemas/index.d.ts +8 -8
- package/dist/features/filters/FilterFacetSection.d.ts +7 -1
- package/dist/features/filters/FilterFacetSection.js +11 -3
- package/dist/features/grouped/schemas/index.d.ts +4 -4
- package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
- package/dist/features/homepage/components/AnnouncementBar.js +3 -3
- package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
- package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
- package/dist/features/homepage/hooks/homepage-query.js +45 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
- package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
- package/dist/features/homepage/schemas/index.d.ts +2 -2
- package/dist/features/layout/AppLayoutShell.d.ts +11 -1
- package/dist/features/layout/AppLayoutShell.js +15 -14
- package/dist/features/layout/BackToTop.d.ts +9 -0
- package/dist/features/layout/BackToTop.js +10 -1
- package/dist/features/layout/BottomActions.js +28 -25
- package/dist/features/layout/BottomChrome.d.ts +34 -0
- package/dist/features/layout/BottomChrome.js +55 -0
- package/dist/features/layout/BottomNavLayout.d.ts +6 -0
- package/dist/features/layout/BottomNavLayout.js +7 -1
- package/dist/features/layout/BottomNavbar.js +15 -2
- package/dist/features/layout/FooterLayout.js +11 -1
- package/dist/features/layout/NavbarLayout.js +1 -1
- package/dist/features/layout/TitleBarLayout.d.ts +7 -0
- package/dist/features/layout/TitleBarLayout.js +28 -5
- package/dist/features/layout/index.d.ts +2 -0
- package/dist/features/layout/index.js +1 -0
- package/dist/features/lottery/types/index.d.ts +3 -0
- package/dist/features/media/MediaPickerModal.js +5 -1
- package/dist/features/messages/schemas/index.d.ts +2 -2
- package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
- package/dist/features/orders/components/OrderScopeTabs.js +31 -0
- package/dist/features/orders/constants/order-scope.d.ts +48 -0
- package/dist/features/orders/constants/order-scope.js +111 -0
- package/dist/features/orders/repository/orders.repository.d.ts +54 -7
- package/dist/features/orders/repository/orders.repository.js +116 -22
- package/dist/features/orders/schemas/firestore.d.ts +117 -0
- package/dist/features/orders/schemas/firestore.js +30 -0
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
- package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
- package/dist/features/pre-orders/schemas/index.d.ts +1 -1
- package/dist/features/products/actions/product-actions.d.ts +14 -0
- package/dist/features/products/actions/product-actions.js +49 -11
- package/dist/features/products/api/route.d.ts +12 -0
- package/dist/features/products/api/route.js +42 -100
- package/dist/features/products/components/ArtStickersListView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.js +13 -11
- package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
- package/dist/features/products/components/AvailabilityTabs.js +47 -0
- package/dist/features/products/components/MakeOfferButton.js +48 -49
- package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
- package/dist/features/products/components/PrizeDrawCollage.js +9 -1
- package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
- package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
- package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
- package/dist/features/products/components/PrizeDrawsSection.js +23 -18
- package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +5 -2
- package/dist/features/products/components/ProductGrid.js +6 -1
- package/dist/features/products/components/ProductsIndexListing.js +22 -32
- package/dist/features/products/components/ProductsIndexPageView.js +6 -9
- package/dist/features/products/components/index.d.ts +2 -2
- package/dist/features/products/components/index.js +1 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
- package/dist/features/products/config/listing-type-listing-config.js +22 -10
- package/dist/features/products/constants/action-defs.d.ts +2 -0
- package/dist/features/products/constants/action-defs.js +6 -0
- package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
- package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
- package/dist/features/products/hooks/useProducts.d.ts +5 -0
- package/dist/features/products/hooks/useProducts.js +13 -2
- package/dist/features/products/repository/products.repository.d.ts +31 -2
- package/dist/features/products/repository/products.repository.js +53 -21
- package/dist/features/products/schemas/firestore.d.ts +17 -3
- package/dist/features/products/schemas/firestore.js +7 -2
- package/dist/features/products/schemas/index.d.ts +66 -66
- package/dist/features/products/schemas/product-features.validators.d.ts +6 -6
- package/dist/features/products/types/index.d.ts +16 -1
- package/dist/features/promotions/schemas/index.d.ts +2 -2
- package/dist/features/reviews/schemas/index.d.ts +16 -16
- package/dist/features/search/schemas/index.d.ts +4 -4
- package/dist/features/seller/actions/offer-actions.js +25 -2
- package/dist/features/seller/components/SellerArtView.js +5 -0
- package/dist/features/seller/components/SellerAuctionsView.js +13 -15
- package/dist/features/seller/components/SellerClassifiedView.js +5 -0
- package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
- package/dist/features/seller/components/SellerLiveView.js +5 -0
- package/dist/features/seller/components/SellerOrdersView.js +31 -9
- package/dist/features/seller/components/SellerPayoutSettingsView.js +19 -18
- package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
- package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
- package/dist/features/seller/components/SellerProductShell.js +7 -1
- package/dist/features/seller/components/SellerProductsView.js +11 -8
- package/dist/features/seller/components/SellerStickersView.js +5 -0
- package/dist/features/seller/components/index.d.ts +0 -2
- package/dist/features/seller/components/index.js +0 -1
- package/dist/features/seller/repository/offer.repository.d.ts +73 -16
- package/dist/features/seller/repository/offer.repository.js +38 -3
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/seller/schemas/offer-forms.d.ts +25 -0
- package/dist/features/seller/schemas/offer-forms.js +21 -0
- package/dist/features/seller/server.d.ts +0 -1
- package/dist/features/seller/server.js +0 -1
- package/dist/features/shell/SectionForm.d.ts +99 -0
- package/dist/features/shell/SectionForm.js +128 -0
- package/dist/features/shell/entity-form.d.ts +109 -0
- package/dist/features/shell/entity-form.js +96 -0
- package/dist/features/shell/index.d.ts +4 -0
- package/dist/features/shell/index.js +2 -0
- package/dist/features/stores/api/[storeSlug]/route.js +2 -25
- package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
- package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
- package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
- package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
- package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
- package/dist/features/stores/components/StoreProductsListing.js +11 -1
- package/dist/features/stores/repository/store.repository.js +6 -0
- package/dist/features/stores/schemas/index.d.ts +6 -6
- package/dist/features/support/schemas/index.d.ts +4 -4
- package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
- package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
- package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +105 -1
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/index.d.ts +13 -10
- package/dist/index.js +14 -9
- package/dist/next/routing/route-map.d.ts +7 -1
- package/dist/next/routing/route-map.js +5 -0
- package/dist/providers/db-firebase/base.repository.d.ts +30 -0
- package/dist/providers/db-firebase/base.repository.js +50 -1
- package/dist/providers/db-firebase/index.d.ts +1 -1
- package/dist/providers/db-firebase/index.js +1 -1
- package/dist/providers/db-firebase/sieve.d.ts +25 -0
- package/dist/providers/db-firebase/sieve.js +52 -18
- package/dist/react/hooks/useUrlTable.js +10 -1
- package/dist/schemas/registry.d.ts +68 -68
- package/dist/seed/_helpers/category-forest.d.ts +2 -0
- package/dist/seed/_helpers/category-forest.js +309 -0
- package/dist/seed/_helpers/category-tree.d.ts +27 -0
- package/dist/seed/_helpers/category-tree.js +103 -0
- package/dist/seed/catalogue-seed-data.js +12 -12
- package/dist/seed/categories-seed-data.js +177 -162
- package/dist/seed/events-seed-data.js +61 -10
- package/dist/seed/homepage-sections-seed-data.js +5 -1
- package/dist/seed/offers-seed-data.js +32 -27
- package/dist/seed/products-art-seed-data.js +50 -12
- package/dist/seed/products-auctions-seed-data.js +97 -18
- package/dist/seed/products-classifieds-seed-data.js +80 -16
- package/dist/seed/products-digital-codes-seed-data.js +66 -18
- package/dist/seed/products-live-items-seed-data.js +64 -13
- package/dist/seed/products-preorders-seed-data.d.ts +0 -1
- package/dist/seed/products-preorders-seed-data.js +52 -13
- package/dist/seed/products-prize-draws-seed-data.js +63 -14
- package/dist/seed/products-standard-seed-data.js +99 -26
- package/dist/seed/products-stickers-seed-data.js +47 -12
- package/dist/seed/reviews-seed-data.js +6 -1
- package/dist/seed/site-settings-seed-data.d.ts +1 -38
- package/dist/seed/site-settings-seed-data.js +38 -76
- package/dist/seed/stores-seed-data.js +71 -1
- package/dist/seed/users-seed-data.js +15 -5
- package/dist/server-entry.d.ts +1 -2
- package/dist/server-entry.js +4 -3
- package/dist/server.d.ts +4 -3
- package/dist/server.js +8 -4
- package/dist/styles.css +78 -12
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.style.css +19 -4
- package/dist/ui/components/CollapsibleSection.d.ts +17 -1
- package/dist/ui/components/CollapsibleSection.js +6 -2
- package/dist/ui/components/FilterChipGroup.d.ts +25 -1
- package/dist/ui/components/FilterChipGroup.js +21 -4
- package/dist/ui/components/HandMode.style.css +47 -0
- package/dist/ui/components/Layout.d.ts +9 -2
- package/dist/ui/components/Layout.js +1 -1
- package/dist/ui/components/ListingLayout.js +8 -8
- package/dist/ui/components/ListingLayout.style.css +8 -7
- package/dist/ui/components/StickyToolbar.d.ts +3 -1
- package/dist/ui/components/StickyToolbar.js +62 -20
- package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
- package/dist/ui/components/bottom-chrome-slot.js +29 -0
- package/dist/ui/components/index.style.css +3 -0
- package/dist/ui/forms/FormShell.d.ts +43 -13
- package/dist/ui/forms/FormShell.js +22 -11
- package/dist/ui/forms/index.d.ts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -410,13 +410,12 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
410
410
|
updatedAt: string | Date | z.objectOutputType<{
|
|
411
411
|
toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
|
|
412
412
|
}, z.ZodTypeAny, "passthrough">;
|
|
413
|
-
storeName: string;
|
|
414
413
|
ownerId: string;
|
|
414
|
+
storeName: string;
|
|
415
415
|
storeSlug: string;
|
|
416
416
|
isPublic: boolean;
|
|
417
417
|
location?: string | undefined;
|
|
418
418
|
returnPolicy?: string | undefined;
|
|
419
|
-
isFeatured?: boolean | undefined;
|
|
420
419
|
stats?: {
|
|
421
420
|
itemsSold: number;
|
|
422
421
|
totalProducts: number;
|
|
@@ -427,6 +426,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
427
426
|
storeDescription?: string | undefined;
|
|
428
427
|
storeLogoURL?: string | undefined;
|
|
429
428
|
storeBannerURL?: string | undefined;
|
|
429
|
+
isFeatured?: boolean | undefined;
|
|
430
430
|
capabilities?: string[] | undefined;
|
|
431
431
|
shippingConfig?: {
|
|
432
432
|
providers: {
|
|
@@ -495,13 +495,12 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
495
495
|
updatedAt: string | Date | z.objectInputType<{
|
|
496
496
|
toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
|
|
497
497
|
}, z.ZodTypeAny, "passthrough">;
|
|
498
|
-
storeName: string;
|
|
499
498
|
ownerId: string;
|
|
499
|
+
storeName: string;
|
|
500
500
|
storeSlug: string;
|
|
501
501
|
isPublic: boolean;
|
|
502
502
|
location?: string | undefined;
|
|
503
503
|
returnPolicy?: string | undefined;
|
|
504
|
-
isFeatured?: boolean | undefined;
|
|
505
504
|
stats?: {
|
|
506
505
|
itemsSold: number;
|
|
507
506
|
totalProducts: number;
|
|
@@ -512,6 +511,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
|
|
|
512
511
|
storeDescription?: string | undefined;
|
|
513
512
|
storeLogoURL?: string | undefined;
|
|
514
513
|
storeBannerURL?: string | undefined;
|
|
514
|
+
isFeatured?: boolean | undefined;
|
|
515
515
|
capabilities?: string[] | undefined;
|
|
516
516
|
shippingConfig?: {
|
|
517
517
|
providers: {
|
|
@@ -607,8 +607,8 @@ export declare const storeListItemSchema: z.ZodObject<{
|
|
|
607
607
|
}, "strip", z.ZodTypeAny, {
|
|
608
608
|
status: string;
|
|
609
609
|
id: string;
|
|
610
|
-
storeName: string;
|
|
611
610
|
ownerId: string;
|
|
611
|
+
storeName: string;
|
|
612
612
|
storeSlug: string;
|
|
613
613
|
isPublic: boolean;
|
|
614
614
|
createdAt?: string | undefined;
|
|
@@ -623,8 +623,8 @@ export declare const storeListItemSchema: z.ZodObject<{
|
|
|
623
623
|
}, {
|
|
624
624
|
status: string;
|
|
625
625
|
id: string;
|
|
626
|
-
storeName: string;
|
|
627
626
|
ownerId: string;
|
|
627
|
+
storeName: string;
|
|
628
628
|
storeSlug: string;
|
|
629
629
|
isPublic: boolean;
|
|
630
630
|
createdAt?: string | undefined;
|
|
@@ -158,12 +158,12 @@ export declare const supportTicketFirestoreSchema: z.ZodObject<{
|
|
|
158
158
|
toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
|
|
159
159
|
}, z.ZodTypeAny, "passthrough">;
|
|
160
160
|
userId: string;
|
|
161
|
-
category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
|
|
162
161
|
description: string;
|
|
163
|
-
|
|
162
|
+
category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
|
|
164
163
|
userEmail: string;
|
|
165
164
|
userDisplayName: string;
|
|
166
165
|
subject: string;
|
|
166
|
+
priority: "normal" | "high" | "low" | "urgent";
|
|
167
167
|
messages: {
|
|
168
168
|
id: string;
|
|
169
169
|
body: string;
|
|
@@ -201,12 +201,12 @@ export declare const supportTicketFirestoreSchema: z.ZodObject<{
|
|
|
201
201
|
toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
|
|
202
202
|
}, z.ZodTypeAny, "passthrough">;
|
|
203
203
|
userId: string;
|
|
204
|
-
category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
|
|
205
204
|
description: string;
|
|
206
|
-
|
|
205
|
+
category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
|
|
207
206
|
userEmail: string;
|
|
208
207
|
userDisplayName: string;
|
|
209
208
|
subject: string;
|
|
209
|
+
priority: "normal" | "high" | "low" | "urgent";
|
|
210
210
|
messages: {
|
|
211
211
|
id: string;
|
|
212
212
|
body: string;
|
|
@@ -14,8 +14,8 @@ export declare const checklistItemCreateSchema: z.ZodObject<{
|
|
|
14
14
|
adminOnly: z.ZodDefault<z.ZodBoolean>;
|
|
15
15
|
}, "strip", z.ZodTypeAny, {
|
|
16
16
|
label: string;
|
|
17
|
-
order: number;
|
|
18
17
|
isActive: boolean;
|
|
18
|
+
order: number;
|
|
19
19
|
groupKey: string;
|
|
20
20
|
pageKey: string;
|
|
21
21
|
phase: number;
|
|
@@ -32,8 +32,8 @@ export declare const checklistItemCreateSchema: z.ZodObject<{
|
|
|
32
32
|
pageLabel: string;
|
|
33
33
|
href?: string | undefined;
|
|
34
34
|
description?: string | undefined;
|
|
35
|
-
order?: number | undefined;
|
|
36
35
|
isActive?: boolean | undefined;
|
|
36
|
+
order?: number | undefined;
|
|
37
37
|
phase?: number | undefined;
|
|
38
38
|
adminOnly?: boolean | undefined;
|
|
39
39
|
}>;
|
|
@@ -53,8 +53,8 @@ export declare const checklistItemUpdateSchema: z.ZodObject<{
|
|
|
53
53
|
label?: string | undefined;
|
|
54
54
|
href?: string | undefined;
|
|
55
55
|
description?: string | undefined;
|
|
56
|
-
order?: number | undefined;
|
|
57
56
|
isActive?: boolean | undefined;
|
|
57
|
+
order?: number | undefined;
|
|
58
58
|
groupKey?: string | undefined;
|
|
59
59
|
pageKey?: string | undefined;
|
|
60
60
|
phase?: number | undefined;
|
|
@@ -65,8 +65,8 @@ export declare const checklistItemUpdateSchema: z.ZodObject<{
|
|
|
65
65
|
label?: string | undefined;
|
|
66
66
|
href?: string | undefined;
|
|
67
67
|
description?: string | undefined;
|
|
68
|
-
order?: number | undefined;
|
|
69
68
|
isActive?: boolean | undefined;
|
|
69
|
+
order?: number | undefined;
|
|
70
70
|
groupKey?: string | undefined;
|
|
71
71
|
pageKey?: string | undefined;
|
|
72
72
|
phase?: number | undefined;
|
|
@@ -39,11 +39,15 @@ export const offersTesterSeedData = [
|
|
|
39
39
|
buyerUid: "user-tester-qa",
|
|
40
40
|
buyerName: "QA Tester",
|
|
41
41
|
buyerEmail: "tester@letitrip.in",
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// Realigned 2026-08-24: this carried listedPrice 1899 / offer 1450 against
|
|
43
|
+
// a product that costs ₹999 — an offer ABOVE the listing price, which
|
|
44
|
+
// `makeOffer` would reject outright. Same stale-snapshot drift the main
|
|
45
|
+
// offers seed had.
|
|
46
|
+
listedPrice: 999,
|
|
47
|
+
offerAmount: 780,
|
|
44
48
|
// The agreed price. Checkout MUST bill this, not `listedPrice` — that
|
|
45
49
|
// divergence is exactly what the paired checklist case checks.
|
|
46
|
-
lockedPrice:
|
|
50
|
+
lockedPrice: 780,
|
|
47
51
|
currency: "INR",
|
|
48
52
|
status: OfferStatusValues.ACCEPTED,
|
|
49
53
|
buyerNote: "Sandbox offer — already accepted so testers can drive checkout.",
|
|
@@ -58,4 +62,116 @@ export const offersTesterSeedData = [
|
|
|
58
62
|
isTestData: true,
|
|
59
63
|
testDataExpiresAt: testDataExpiresAt(),
|
|
60
64
|
},
|
|
65
|
+
/**
|
|
66
|
+
* COUNTERED. The buyer-accepts-a-counter path had no fixture at all, so
|
|
67
|
+
* `acceptCounterOffer` was unreachable for a tester working solo.
|
|
68
|
+
*/
|
|
69
|
+
{
|
|
70
|
+
id: "offer-tester-sandbox-countered",
|
|
71
|
+
productId: "product-beyblade-metal-storm-pegasus",
|
|
72
|
+
productTitle: "Beyblade Metal Storm Pegasus",
|
|
73
|
+
productSlug: "product-beyblade-metal-storm-pegasus",
|
|
74
|
+
storeId: "store-beyblade-arena",
|
|
75
|
+
storeName: "Beyblade Arena",
|
|
76
|
+
buyerUid: "user-tester-qa",
|
|
77
|
+
buyerName: "QA Tester",
|
|
78
|
+
buyerEmail: "tester@letitrip.in",
|
|
79
|
+
listedPrice: 1299,
|
|
80
|
+
offerAmount: 1000,
|
|
81
|
+
counterAmount: 1150,
|
|
82
|
+
currency: "INR",
|
|
83
|
+
status: OfferStatusValues.COUNTERED,
|
|
84
|
+
buyerNote: "Sandbox offer — seller has countered, accept it to test the counter path.",
|
|
85
|
+
sellerNote: "Counter: ₹1,150.",
|
|
86
|
+
expiresAt: hoursFromNow(24),
|
|
87
|
+
respondedAt: hoursAgo(1),
|
|
88
|
+
createdAt: hoursAgo(2),
|
|
89
|
+
updatedAt: hoursAgo(1),
|
|
90
|
+
isTestData: true,
|
|
91
|
+
testDataExpiresAt: testDataExpiresAt(),
|
|
92
|
+
},
|
|
93
|
+
/**
|
|
94
|
+
* ACCEPTED with a deliberately SHORT window, so the live countdown and the
|
|
95
|
+
* "pay before it closes" case are observable inside one test session rather
|
|
96
|
+
* than needing a 36-hour wait.
|
|
97
|
+
*/
|
|
98
|
+
{
|
|
99
|
+
id: "offer-tester-sandbox-expiring",
|
|
100
|
+
productId: "product-beyblade-x-wizard-arrow",
|
|
101
|
+
productTitle: "Beyblade X Wizard Arrow",
|
|
102
|
+
productSlug: "product-beyblade-x-wizard-arrow",
|
|
103
|
+
storeId: "store-beyblade-arena",
|
|
104
|
+
storeName: "Beyblade Arena",
|
|
105
|
+
buyerUid: "user-tester-qa",
|
|
106
|
+
buyerName: "QA Tester",
|
|
107
|
+
buyerEmail: "tester@letitrip.in",
|
|
108
|
+
listedPrice: 899,
|
|
109
|
+
offerAmount: 700,
|
|
110
|
+
lockedPrice: 700,
|
|
111
|
+
currency: "INR",
|
|
112
|
+
status: OfferStatusValues.ACCEPTED,
|
|
113
|
+
buyerNote: "Sandbox offer — accepted with a short checkout window.",
|
|
114
|
+
sellerNote: "Accepted. Pay soon!",
|
|
115
|
+
expiresAt: hoursFromNow(1),
|
|
116
|
+
acceptedAt: hoursAgo(0),
|
|
117
|
+
respondedAt: hoursAgo(0),
|
|
118
|
+
checkoutDeadline: new Date(NOW.getTime() + 30 * 60000),
|
|
119
|
+
createdAt: hoursAgo(1),
|
|
120
|
+
updatedAt: hoursAgo(0),
|
|
121
|
+
isTestData: true,
|
|
122
|
+
testDataExpiresAt: testDataExpiresAt(),
|
|
123
|
+
},
|
|
124
|
+
/**
|
|
125
|
+
* PENDING. Two cases need this: withdrawing an offer, and the
|
|
126
|
+
* "you already have an active offer on this item" rejection when the tester
|
|
127
|
+
* tries to offer on the same listing again.
|
|
128
|
+
*/
|
|
129
|
+
{
|
|
130
|
+
id: "offer-tester-sandbox-pending",
|
|
131
|
+
productId: "product-beyblade-original-driger-v",
|
|
132
|
+
productTitle: "Beyblade Original Driger V",
|
|
133
|
+
productSlug: "product-beyblade-original-driger-v",
|
|
134
|
+
storeId: "store-beyblade-arena",
|
|
135
|
+
storeName: "Beyblade Arena",
|
|
136
|
+
buyerUid: "user-tester-qa",
|
|
137
|
+
buyerName: "QA Tester",
|
|
138
|
+
buyerEmail: "tester@letitrip.in",
|
|
139
|
+
listedPrice: 1799,
|
|
140
|
+
offerAmount: 1450,
|
|
141
|
+
currency: "INR",
|
|
142
|
+
status: OfferStatusValues.PENDING,
|
|
143
|
+
buyerNote: "Sandbox offer — still pending, withdraw it to test that path.",
|
|
144
|
+
expiresAt: hoursFromNow(24),
|
|
145
|
+
createdAt: hoursAgo(1),
|
|
146
|
+
updatedAt: hoursAgo(1),
|
|
147
|
+
isTestData: true,
|
|
148
|
+
testDataExpiresAt: testDataExpiresAt(),
|
|
149
|
+
},
|
|
150
|
+
/**
|
|
151
|
+
* The SELLER side. Every fixture above has the tester as the buyer, so
|
|
152
|
+
* accept / decline / counter at /store/offers were unreachable for them —
|
|
153
|
+
* you cannot respond to your own offer. This one is addressed TO the
|
|
154
|
+
* tester's own sandbox store from a different persona.
|
|
155
|
+
*/
|
|
156
|
+
{
|
|
157
|
+
id: "offer-tester-sandbox-inbound",
|
|
158
|
+
productId: "product-tester-standard-1",
|
|
159
|
+
productTitle: "Test Gadget — Standard Listing #1",
|
|
160
|
+
productSlug: "product-tester-standard-1",
|
|
161
|
+
storeId: "store-tester-qa-seller",
|
|
162
|
+
storeName: "Tester QA Seller",
|
|
163
|
+
buyerUid: "user-yugi-muto",
|
|
164
|
+
buyerName: "Mock User 3",
|
|
165
|
+
buyerEmail: "rehan.sheikh@gmail.com",
|
|
166
|
+
listedPrice: 150,
|
|
167
|
+
offerAmount: 120,
|
|
168
|
+
currency: "INR",
|
|
169
|
+
status: OfferStatusValues.PENDING,
|
|
170
|
+
buyerNote: "Sandbox inbound offer — accept, counter, or decline it from your store dashboard.",
|
|
171
|
+
expiresAt: hoursFromNow(24),
|
|
172
|
+
createdAt: hoursAgo(2),
|
|
173
|
+
updatedAt: hoursAgo(2),
|
|
174
|
+
isTestData: true,
|
|
175
|
+
testDataExpiresAt: testDataExpiresAt(),
|
|
176
|
+
},
|
|
61
177
|
];
|
|
@@ -83,8 +83,132 @@ const stagedAuctions = AUCTION_CYCLE_STAGGER_HOURS.map((hours, i) => withTokens(
|
|
|
83
83
|
createdAt: new Date(),
|
|
84
84
|
updatedAt: new Date(),
|
|
85
85
|
}));
|
|
86
|
+
/**
|
|
87
|
+
* Buy-Now (buyout) fixtures. Four states, because the 2026-08-24 rework made
|
|
88
|
+
* buyout availability depend on `buyNowPrice > currentBid` rather than on
|
|
89
|
+
* "nobody has bid yet" — so the interesting cases are now about PRICE, and
|
|
90
|
+
* three of them were previously unreachable as test data.
|
|
91
|
+
*
|
|
92
|
+
* Every date is Date.now()-relative at module import, per CLAUDE.md's tester
|
|
93
|
+
* fixture standard, so the 4-hour testerSandboxRefresh re-arms them.
|
|
94
|
+
*/
|
|
95
|
+
const buyoutAuctions = [
|
|
96
|
+
{
|
|
97
|
+
key: "buyout",
|
|
98
|
+
title: "Test Auction — Buy It Now available",
|
|
99
|
+
desc: "The clean buyout case. Buy Now is offered, there is plenty of clock, and completing checkout within the hour should close the auction as sold with your bid recorded at the buyout price.",
|
|
100
|
+
currentBid: 8000,
|
|
101
|
+
buyNowPrice: 12000,
|
|
102
|
+
bidCount: 0,
|
|
103
|
+
bidsHaveStarted: false,
|
|
104
|
+
endsInHours: 6,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
key: "buyout-contested",
|
|
108
|
+
title: "Test Auction — Buy It Now with live bidding",
|
|
109
|
+
desc: "Buy Now is STILL offered even though bidding has started, because the buyout price is above the current bid. Buying it out should mark the other bidders lost. This case did not exist before the bidsHaveStarted gate was dropped.",
|
|
110
|
+
currentBid: 9500,
|
|
111
|
+
buyNowPrice: 12000,
|
|
112
|
+
bidCount: 2,
|
|
113
|
+
bidsHaveStarted: true,
|
|
114
|
+
endsInHours: 6,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
key: "buyout-passed",
|
|
118
|
+
title: "Test Auction — bidding passed Buy It Now",
|
|
119
|
+
desc: "Negative control. Bidding has overtaken the buyout price, so Buy Now must appear NOWHERE — no button, no advertised price on the detail page, no Buyout chip on the card.",
|
|
120
|
+
currentBid: 9500,
|
|
121
|
+
buyNowPrice: 9000,
|
|
122
|
+
bidCount: 5,
|
|
123
|
+
bidsHaveStarted: true,
|
|
124
|
+
endsInHours: 6,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
key: "buyout-expiring",
|
|
128
|
+
title: "Test Auction — Buy It Now, ends in ~20 minutes",
|
|
129
|
+
desc: "The buyout hold is clamped to the auction's own end time rather than the full hour. Start a buyout here and DON'T finish checkout: when the clock runs out the buyout must fail and the item must go to the bidding, not to you.",
|
|
130
|
+
currentBid: 3000,
|
|
131
|
+
buyNowPrice: 5000,
|
|
132
|
+
bidCount: 1,
|
|
133
|
+
bidsHaveStarted: true,
|
|
134
|
+
endsInMinutes: 20,
|
|
135
|
+
},
|
|
136
|
+
].map((f) => withTokens({
|
|
137
|
+
id: `auction-tester-sandbox-${f.key}`,
|
|
138
|
+
slug: `auction-tester-sandbox-${f.key}`,
|
|
139
|
+
title: f.title,
|
|
140
|
+
description: f.desc,
|
|
141
|
+
categorySlugs: COLLECTIBLES_CATEGORY_SLUGS,
|
|
142
|
+
categoryNames: COLLECTIBLES_CATEGORY_NAMES,
|
|
143
|
+
brandSlug: "brand-tester-sandbox",
|
|
144
|
+
brand: "TestBrand",
|
|
145
|
+
startingBid: 8000,
|
|
146
|
+
currentBid: f.currentBid,
|
|
147
|
+
buyNowPrice: f.buyNowPrice,
|
|
148
|
+
currency: "INR",
|
|
149
|
+
price: f.currentBid,
|
|
150
|
+
stockQuantity: 1,
|
|
151
|
+
availableQuantity: 1,
|
|
152
|
+
auctionEndDate: new Date(Date.now() +
|
|
153
|
+
(f.endsInMinutes ? f.endsInMinutes * 60 * 1000 : (f.endsInHours ?? 6) * 60 * 60 * 1000)),
|
|
154
|
+
bidCount: f.bidCount,
|
|
155
|
+
bidsHaveStarted: f.bidsHaveStarted,
|
|
156
|
+
isSold: false,
|
|
157
|
+
mainImage: seedExtMedia(`https://picsum.photos/seed/auction-image-tester-sandbox-${f.key}-20260101/900/900`),
|
|
158
|
+
images: [seedExtMedia(`https://picsum.photos/seed/auction-image-tester-sandbox-${f.key}-20260101/900/900`)],
|
|
159
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
160
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
161
|
+
listingType: "auction",
|
|
162
|
+
customFields: [],
|
|
163
|
+
customSections: [],
|
|
164
|
+
isPromoted: false,
|
|
165
|
+
isOnSale: false,
|
|
166
|
+
createdAt: new Date(),
|
|
167
|
+
updatedAt: new Date(),
|
|
168
|
+
}));
|
|
169
|
+
/**
|
|
170
|
+
* An offerable standard listing, owned by the tester's OWN sandbox store
|
|
171
|
+
* (`withTokens` supplies `storeId: TESTER_STORE_ID`).
|
|
172
|
+
*
|
|
173
|
+
* That ownership is the point: one tester can drive the whole negotiation
|
|
174
|
+
* solo — make the offer at /products/product-tester-offerable as the buyer,
|
|
175
|
+
* then accept/counter/decline it at /store/offers as the seller. The
|
|
176
|
+
* complementary fixture `offer-tester-sandbox-accepted` covers the other half
|
|
177
|
+
* (an already-accepted offer on somebody ELSE's store, so the checkout lane can
|
|
178
|
+
* be exercised without the tester having accepted it themselves).
|
|
179
|
+
*/
|
|
180
|
+
const offerableProduct = withTokens({
|
|
181
|
+
id: "product-tester-offerable",
|
|
182
|
+
slug: "product-tester-offerable",
|
|
183
|
+
title: "Test Gadget — Accepts Offers",
|
|
184
|
+
description: "Disposable test product with buyer offers enabled. Make an offer below the listed price and watch it appear under My Offers. Minimum accepted offer is 70% of the listed price.",
|
|
185
|
+
categorySlugs: COLLECTIBLES_CATEGORY_SLUGS,
|
|
186
|
+
categoryNames: COLLECTIBLES_CATEGORY_NAMES,
|
|
187
|
+
brandSlug: "brand-tester-sandbox",
|
|
188
|
+
brand: "TestBrand",
|
|
189
|
+
price: 2000,
|
|
190
|
+
currency: "INR",
|
|
191
|
+
allowOffers: true,
|
|
192
|
+
minOfferPercent: 70,
|
|
193
|
+
stockQuantity: 5,
|
|
194
|
+
availableQuantity: 5,
|
|
195
|
+
isSold: false,
|
|
196
|
+
mainImage: seedExtMedia("https://picsum.photos/seed/product-image-tester-offerable-20260101/900/900"),
|
|
197
|
+
images: [seedExtMedia("https://picsum.photos/seed/product-image-tester-offerable-20260101/900/900")],
|
|
198
|
+
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
199
|
+
condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
|
|
200
|
+
listingType: "standard",
|
|
201
|
+
customFields: [],
|
|
202
|
+
customSections: [],
|
|
203
|
+
isPromoted: false,
|
|
204
|
+
isOnSale: false,
|
|
205
|
+
createdAt: new Date(),
|
|
206
|
+
updatedAt: new Date(),
|
|
207
|
+
});
|
|
86
208
|
export const productsTesterSeedData = [
|
|
87
209
|
...stagedAuctions,
|
|
210
|
+
...buyoutAuctions,
|
|
211
|
+
offerableProduct,
|
|
88
212
|
withTokens({
|
|
89
213
|
id: "product-tester-standard-1",
|
|
90
214
|
slug: "product-tester-standard-1",
|
|
@@ -327,13 +451,19 @@ export const productsTesterSeedData = [
|
|
|
327
451
|
id: "classified-tester-sandbox-1",
|
|
328
452
|
slug: "classified-tester-sandbox-1",
|
|
329
453
|
title: "Test Classified — Contact Me!",
|
|
330
|
-
description: "Disposable test classified listing for the tester QA program. No checkout — contact the seller. Auto-expires in 7 days.",
|
|
454
|
+
description: "Disposable test classified listing for the tester QA program. No checkout — make an offer or contact the seller. Auto-expires in 7 days.",
|
|
331
455
|
categorySlugs: COLLECTIBLES_CATEGORY_SLUGS,
|
|
332
456
|
categoryNames: COLLECTIBLES_CATEGORY_NAMES,
|
|
333
457
|
brandSlug: "brand-tester-sandbox",
|
|
334
458
|
brand: "TestBrand",
|
|
335
459
|
price: 250,
|
|
336
460
|
currency: "INR",
|
|
461
|
+
// Classifieds are the one non-standard type with `canMakeOffer: true`.
|
|
462
|
+
// Until 2026-08-24 the sticky "Make an Offer" CTA on this page only
|
|
463
|
+
// scrolled to the chat box and created no offer at all — this flag is what
|
|
464
|
+
// makes the real form render there.
|
|
465
|
+
allowOffers: true,
|
|
466
|
+
minOfferPercent: 70,
|
|
337
467
|
condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
|
|
338
468
|
status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
|
|
339
469
|
listingType: "classified",
|
|
@@ -400,6 +400,53 @@ const rawTesterChecklistItems = [
|
|
|
400
400
|
},
|
|
401
401
|
],
|
|
402
402
|
},
|
|
403
|
+
{
|
|
404
|
+
// Root Cause #68, part 2. Every case here is a LAYOUT assertion — an image
|
|
405
|
+
// that renders at 0x0, or a tile that lays out sideways, is invisible to
|
|
406
|
+
// tsc, to lint and to jsdom, so a human eye is the only gate that catches
|
|
407
|
+
// a regression. Bundle tiles rendered blank for weeks before this.
|
|
408
|
+
pageKey: "image-tile-layout",
|
|
409
|
+
pageLabel: "Image Tiles & Collages",
|
|
410
|
+
href: "/bundles/bundle-burst-battlers-pack",
|
|
411
|
+
cases: [
|
|
412
|
+
{
|
|
413
|
+
key: "bundle-member-thumbnails",
|
|
414
|
+
label: "A bundle's member tiles show the real product photo, filling the whole square tile — not a blank/grey box",
|
|
415
|
+
description: "The three members of \"Burst Battlers Pack\" each have a mainImage. If you see grey boxes, the image collapsed to 0x0 — check whether a `block`/`flex`/`hidden` Tailwind class has been added back onto the tile's <Button>, which silently overrides appkit's own display and voids the fix.",
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
key: "bundle-badge-position",
|
|
419
|
+
label: "The #1 / #2 / #3 badge sits at the TOP-LEFT corner of each bundle tile, not floating in the middle of it",
|
|
420
|
+
description: "The badge is absolutely positioned. If it drifts toward the centre, it is anchoring to the button's collapsed inner span instead of the tile box — the same root cause as a blank thumbnail, and often the first visible symptom.",
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
key: "bundle-tile-opens-lightbox",
|
|
424
|
+
label: "Clicking a bundle tile opens the lightbox at that item and cycles through the others; the product title below the tile still links to the product page",
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
key: "prizedraw-collage-stacked",
|
|
428
|
+
label: "Prize-draw collage tiles stack the image ABOVE the title/value caption at full card width — the image is never squashed beside the text at half width",
|
|
429
|
+
href: "/prize-draws/prizedraw-tester-sandbox-1",
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
key: "concern-card-icon-above-label",
|
|
433
|
+
label: "Category concern cards show their icon ABOVE the label, not beside it",
|
|
434
|
+
description: "This is a deliberate visual change: the card always asked for a vertical layout but had been rendering side-by-side. Confirm the stacked layout looks right rather than assuming the old side-by-side was intended.",
|
|
435
|
+
href: "/categories",
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
key: "media-picker-existing-grid",
|
|
439
|
+
label: "In any media field, \"Choose existing\" shows each file as a square thumbnail with the filename underneath — not thumbnail-beside-filename with a shrunken image",
|
|
440
|
+
href: "/admin/media",
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
key: "icon-button-spacing",
|
|
444
|
+
label: "Buttons that combine an icon and a label still have normal spacing between them, and a loading button's spinner stays centred against its text",
|
|
445
|
+
description: "Regression check for the shared Button change that fixed the tiles — it altered how the button's own alignment reaches its children, so spot-check a few ordinary buttons anywhere in the app.",
|
|
446
|
+
href: "/products",
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
},
|
|
403
450
|
{
|
|
404
451
|
pageKey: "buying-checkout",
|
|
405
452
|
pageLabel: "Buying & Checkout",
|
|
@@ -1651,6 +1698,18 @@ const rawTesterChecklistItems = [
|
|
|
1651
1698
|
cases: [
|
|
1652
1699
|
{ key: "view-event", label: "Viewing an event detail page works", href: "/user/events" },
|
|
1653
1700
|
{ key: "events-listing-cards-images", label: "The events listing page shows each event's real cover image (not a generic icon placeholder) when one is set, and all cards in a row are the same height", href: "/events" },
|
|
1701
|
+
{
|
|
1702
|
+
key: "lottery-cover-image",
|
|
1703
|
+
label: "A lottery's cover image renders on both the lottery listing card and its detail page — not the 🎰 emoji placeholder",
|
|
1704
|
+
description: "Both views used to read a field the data never populates, so every lottery fell back to the emoji. Verify against \"Pokémon Number Draw — July 2026\" (event-pokemon-number-draw-july-2026), which has a real cover image.",
|
|
1705
|
+
href: "/lottery/event-pokemon-number-draw-july-2026",
|
|
1706
|
+
},
|
|
1707
|
+
{
|
|
1708
|
+
key: "lottery-prize-previews",
|
|
1709
|
+
label: "A lottery detail page shows a \"Prizes\" collage of prize photos above the numbered \"Slots\" grid, and the numbered grid itself still shows every slot as a plain number",
|
|
1710
|
+
description: "Only slots that actually have a photo get a collage tile — the seeded fixture has photos on the first 8 of its 25 slots, so expect 8 tiles above a 25-square grid. Claimed slots show a \"Claimed\" stamp. Prices and odds must never appear anywhere on this page.",
|
|
1711
|
+
href: "/lottery/event-pokemon-number-draw-july-2026",
|
|
1712
|
+
},
|
|
1654
1713
|
{
|
|
1655
1714
|
key: "related-events-section",
|
|
1656
1715
|
label: "An event's Overview tab shows a \"Related Events\" carousel of other active events sharing at least one tag, with real events (not empty)",
|
|
@@ -2071,7 +2130,16 @@ const rawTesterChecklistItems = [
|
|
|
2071
2130
|
{ key: "hero-carousel-arrows-flip", label: "With Left-hand mode ON, the homepage hero carousel's Prev/Next arrow pair appears in the bottom-left corner instead of bottom-right; the dots stay centered either way", href: "/" },
|
|
2072
2131
|
{ key: "gallery-arrows-unaffected", label: "Left-hand mode does NOT change a product image gallery/lightbox's Prev/Next arrows — Prev stays on the left edge and Next stays on the right edge in both modes" },
|
|
2073
2132
|
{ key: "homepage-section-buttons-mirror", label: "With Left-hand mode ON, homepage section header rows (e.g. Brands, Featured Bundles, Google Reviews) have their \"View All\" button on the opposite side from default — title and button swap sides", href: "/" },
|
|
2074
|
-
{ key: "
|
|
2133
|
+
{ key: "titlebar-actions-mirror", label: "With Left-hand mode ON, the top bar's action icons (search, Today's Deals, theme toggle, hamburger) move from the right edge to the LEFT edge and their order is mirrored — the hamburger ends up in the far-left corner — while the brand wordmark moves to the right edge; with it OFF (default), everything is the other way round", href: "/" },
|
|
2134
|
+
{ key: "titlebar-centre-mark-unaffected", label: "Left-hand mode does NOT move the centred logo mark in the middle of the desktop top bar — it stays exactly centred in both modes", href: "/" },
|
|
2135
|
+
{ key: "titlebar-row2-mirror", label: "On a phone-width viewport with Left-hand mode ON, the top bar's SECOND row (notifications / wishlist / cart / profile icons) packs against the LEFT edge in mirrored order with profile leftmost; with it OFF it packs against the right edge with notifications leftmost", href: "/" },
|
|
2136
|
+
{ key: "titlebar-actions-no-overflow-narrow", label: "With Left-hand mode ON at the narrowest phone width (~320px), no top-bar icon is clipped or pushed off-screen — the mirrored row fits exactly as well as the default row does", href: "/" },
|
|
2137
|
+
{ key: "bottom-nav-mirror", label: "With Left-hand mode ON, the mobile bottom tab bar's slots appear in reverse order (Profile leftmost, Home rightmost); with it OFF, Home is leftmost. Slot widths stay equal in both modes.", href: "/" },
|
|
2138
|
+
{ key: "dashboard-bottom-nav-mirror", label: "With Left-hand mode ON, the dashboard's own mobile bottom tab bar (on admin/store/user routes) mirrors the same way the public one does — both bars behave identically", href: "/user" },
|
|
2139
|
+
{ key: "count-badges-mirror", label: "With Left-hand mode ON, the red count bubbles on the cart / wishlist / notification icons sit on the TOP-LEFT corner of their icon instead of top-right — in BOTH the top bar and the mobile bottom tab bar — and neither is clipped by the icon's edge", href: "/" },
|
|
2140
|
+
{ key: "nav-scroll-arrows-unaffected", label: "Left-hand mode does NOT flip the main navigation bar's overflow scroll chevrons — the left chevron still scrolls the nav left and the right chevron still scrolls it right, in both modes", href: "/" },
|
|
2141
|
+
{ key: "header-tab-order-sane", label: "With Left-hand mode ON, pressing Tab repeatedly from the top of the page still reaches every top-bar control with none skipped or trapped", description: "The visual left-to-right order will NOT match the tab order in left-hand mode — that is expected and accepted (the mirror is visual only, DOM order is deliberately unchanged so screen-reader reading order stays stable). What must not happen is a control becoming unreachable.", href: "/" },
|
|
2142
|
+
{ key: "hand-mode-no-fouc", label: "On a hard page reload with Left-hand mode already ON, panels/sidebars AND the top bar / bottom tab bar render in their left-hand positions immediately — there is no visible flash of the header icons or tab bar briefly appearing in their default positions before snapping over" },
|
|
2075
2143
|
],
|
|
2076
2144
|
},
|
|
2077
2145
|
{
|
|
@@ -2232,6 +2300,12 @@ const rawTesterChecklistItems = [
|
|
|
2232
2300
|
description: "Updated 2026-08-20 — the founder card previously used a fictional placeholder name with no GitHub link. Confirm the founder card's name matches the real developer and the GitHub link opens their actual profile.",
|
|
2233
2301
|
href: "/about",
|
|
2234
2302
|
},
|
|
2303
|
+
{
|
|
2304
|
+
key: "about-values-expanded",
|
|
2305
|
+
label: "The About page's \"Our Values\" section shows six values, each with a second smaller paragraph, plus a \"How we hold ourselves to this →\" link that opens the Ethics page",
|
|
2306
|
+
description: "Added 2026-08-24 — the section previously had three values, no subtitle, and no onward link. Confirm the subtitle line renders under the heading and the link lands on /ethics.",
|
|
2307
|
+
href: "/about",
|
|
2308
|
+
},
|
|
2235
2309
|
{
|
|
2236
2310
|
key: "developer-page-loads",
|
|
2237
2311
|
label: "The Developer page loads correctly, is linked from the footer's Support column next to About Us, shows the real developer's name, and its \"GitHub ↗\" link opens their actual GitHub profile",
|
|
@@ -2362,7 +2436,37 @@ const rawTesterChecklistItems = [
|
|
|
2362
2436
|
href: "/help",
|
|
2363
2437
|
cases: [
|
|
2364
2438
|
{ key: "shipping-refund-policy", label: "Shipping-policy and refund-policy pages load correctly" },
|
|
2439
|
+
{
|
|
2440
|
+
key: "refund-policy-not-raw-json",
|
|
2441
|
+
label: "The Refund Policy page shows readable policy text — NOT a wall of raw JSON starting with {\"type\":\"doc\"",
|
|
2442
|
+
description: "Fixed 2026-08-24. The seeded siteSettings.legalPages.refundPolicy held a TipTap JSON document, but PolicyPageView injects that field as raw HTML — so the page rendered the JSON source as visible text. The seeded overrides are now empty strings, which makes the page fall back to its proper i18n copy. Re-seed before testing this one.",
|
|
2443
|
+
href: "/refund-policy",
|
|
2444
|
+
},
|
|
2365
2445
|
{ key: "privacy-cookies-security", label: "Privacy, cookies, and security pages load correctly" },
|
|
2446
|
+
{
|
|
2447
|
+
key: "ethics-page-loads",
|
|
2448
|
+
label: "The Our Ethics page loads, and its live-animal section describes vendor verification, a lawful-destination check, CITES paperwork, and specialist transport",
|
|
2449
|
+
description: "Added 2026-08-24. Reachable from the footer under Support, and from the Values section on the About page.",
|
|
2450
|
+
href: "/ethics",
|
|
2451
|
+
},
|
|
2452
|
+
{
|
|
2453
|
+
key: "code-of-conduct-loads",
|
|
2454
|
+
label: "The Code of Conduct page loads and covers listing honestly, bidding in good faith, review integrity, and the enforcement/appeal ladder",
|
|
2455
|
+
description: "Added 2026-08-24. Reachable from the footer under Legal.",
|
|
2456
|
+
href: "/code-of-conduct",
|
|
2457
|
+
},
|
|
2458
|
+
{
|
|
2459
|
+
key: "policy-related-links-exclude-self",
|
|
2460
|
+
label: "On EVERY policy page, the \"Related Policies\" footer lists the other five policies and never links to the page you are already on",
|
|
2461
|
+
description: "All six pages (Terms, Privacy, Cookies, Refund, Ethics, Code of Conduct) share one renderer whose related-links list is derived from a single registry. Open each and confirm you see exactly five links and that none of them is the current page.",
|
|
2462
|
+
href: "/ethics",
|
|
2463
|
+
},
|
|
2464
|
+
{
|
|
2465
|
+
key: "policy-admin-html-override",
|
|
2466
|
+
label: "As an admin: pasting HTML into Site Settings → Legal → \"Our Ethics\" and saving replaces the default Ethics page content immediately (no waiting)",
|
|
2467
|
+
description: "Added 2026-08-24. Exercises the full chain — admin textarea → legalPages.ethics → PolicyPageView read → cache bust. These pages are cached for an hour, so saving now also revalidates them; if the change only appears after a long wait, the revalidation step regressed. Clear the textarea and save again to restore the default copy.",
|
|
2468
|
+
href: "/admin/site",
|
|
2469
|
+
},
|
|
2366
2470
|
],
|
|
2367
2471
|
},
|
|
2368
2472
|
{
|
|
@@ -29,7 +29,7 @@ export declare function useWishlistWithGuest(userId: string | null | undefined,
|
|
|
29
29
|
productPrice: number;
|
|
30
30
|
productSlug: string;
|
|
31
31
|
addedAt: string | undefined;
|
|
32
|
-
type: "classified" | "auction" | "digital-code" | "live" | "
|
|
32
|
+
type: "classified" | "category" | "auction" | "digital-code" | "live" | "store" | "product" | "preorder";
|
|
33
33
|
}[];
|
|
34
34
|
total: number;
|
|
35
35
|
wishlistedIds: Set<string>;
|