@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
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* WHY: Provides
|
|
2
|
+
* WHY: Provides the Beyblade-focused category hierarchy plus brand entries for the
|
|
3
3
|
* demo seed. The site itself stays generically branded as a collectibles marketplace —
|
|
4
|
-
* only the seeded catalog data is narrowed to Beyblade so the demo has a coherent
|
|
5
|
-
*
|
|
6
|
-
* WHAT: Exports categoriesSeedData —
|
|
7
|
-
* (
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* only the seeded catalog data is narrowed to Beyblade so the demo has a coherent
|
|
5
|
+
* dataset instead of a sprawling multi-franchise catalog.
|
|
6
|
+
* WHAT: Exports categoriesSeedData — a 4-level, TWO-root category forest
|
|
7
|
+
* (`Spinning Tops` + `Living Collectibles`, see _helpers/category-forest.ts),
|
|
8
|
+
* brand rows (categoryType:"brand") and pricing bundles (categoryType:"bundle").
|
|
9
|
+
*
|
|
10
|
+
* The tree was 2 levels under a single root until 2026-08-24. That made
|
|
11
|
+
* `categoryType:"sublisting"` — documented as "tier-4 leaf groups under a
|
|
12
|
+
* parent category" — structurally unreachable, and left the live-item
|
|
13
|
+
* products with no category at all.
|
|
14
|
+
*
|
|
15
|
+
* Products tag their FULL ancestor chain (leaf -> … -> root) so a single
|
|
16
|
+
* array-contains at any level returns the whole subtree. That is what lets
|
|
17
|
+
* a category page match on its own id alone; expanding descendants into an
|
|
18
|
+
* `array-contains-any` would break past Firestore's 30-value cap.
|
|
19
|
+
*
|
|
20
|
+
* Structural fields (parentIds/ancestors/tier/path/position/subtreeSize/
|
|
21
|
+
* childrenIds/isLeaf) are DERIVED by buildCategoryTree — never hand-written.
|
|
22
|
+
* The old hand-written values were already internally inconsistent: the root
|
|
23
|
+
* claimed subtreeSize 4 at position 0 while its four children also occupied
|
|
24
|
+
* positions 0-3, which is not a valid DFS pre-order numbering.
|
|
10
25
|
*
|
|
11
26
|
* EXPORTS:
|
|
12
27
|
* categoriesSeedData — array of Partial<CategoryDocument> for the seed runner
|
|
@@ -20,6 +35,8 @@
|
|
|
20
35
|
*/
|
|
21
36
|
import { CATEGORY_FIELDS } from "../constants/field-names";
|
|
22
37
|
import { seedExtMedia } from "./_helpers/media";
|
|
38
|
+
import { buildCategoryTree } from "./_helpers/category-tree";
|
|
39
|
+
import { CATEGORY_FOREST } from "./_helpers/category-forest";
|
|
23
40
|
const NOW = new Date();
|
|
24
41
|
const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
|
|
25
42
|
const emptyMetrics = {
|
|
@@ -33,192 +50,116 @@ const emptyMetrics = {
|
|
|
33
50
|
lastUpdated: daysAgo(1),
|
|
34
51
|
};
|
|
35
52
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
36
|
-
// Categories
|
|
53
|
+
// Categories — 47 rows across 4 tiers and 2 roots, all structural fields derived.
|
|
54
|
+
// The shape lives in _helpers/category-forest.ts; the derivation in
|
|
55
|
+
// _helpers/category-tree.ts.
|
|
37
56
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
38
|
-
const rawCategories =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
name: "Spinning Tops",
|
|
44
|
-
description: "Collectible spinning tops and battle systems — Beyblade Original, Metal Fight, Burst, X, and accessories.",
|
|
45
|
-
rootId: "category-spinning-tops",
|
|
46
|
-
parentIds: [],
|
|
47
|
-
childrenIds: ["category-beyblade-original", "category-beyblade-metal", "category-beyblade-burst", "category-beyblade-x"],
|
|
48
|
-
tier: 0,
|
|
49
|
-
path: "spinning-tops",
|
|
50
|
-
order: 1,
|
|
51
|
-
isLeaf: false,
|
|
52
|
-
position: 0,
|
|
53
|
-
subtreeSize: 4,
|
|
54
|
-
metrics: emptyMetrics,
|
|
55
|
-
isFeatured: true,
|
|
56
|
-
featuredPriority: 1,
|
|
57
|
-
isBrand: false,
|
|
58
|
-
highlights: [
|
|
59
|
-
"Every era of Beyblade in one place — Original, Metal Fight, Burst, and X",
|
|
60
|
-
"Verified sellers with condition-graded listings",
|
|
61
|
-
"Auctions, pre-orders, and prize draws alongside straightforward buy-now listings",
|
|
62
|
-
],
|
|
63
|
-
faqs: [
|
|
64
|
-
{ question: "What's the difference between the four Beyblade generations?", answer: "Original (1999-2003) started the franchise with ripcord launchers; Metal Fight (2008-2013) added metal-weighted tops; Burst (2015-present) introduced tops that burst apart on hard hits; X (2023-present) uses the new Xtreme Gear system with clip-on parts." },
|
|
65
|
-
{ question: "Are used tops sold here safe to battle with?", answer: "Every listing shows a condition rating (New/Like New/Good/Used) and sellers are expected to disclose any chips or cracks — check the condition badge and item photos before buying." },
|
|
66
|
-
],
|
|
67
|
-
seo: { title: "Spinning Tops | LetItRip", description: "Buy Beyblade and spinning tops — Original, Metal Fight, Burst, X, and accessories.", keywords: ["beyblade", "spinning tops", "beyblade x", "beyblade burst"] },
|
|
68
|
-
display: { icon: "🌀", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-spinning-tops-20260101/1200/600"), color: "#0891b2", showInMenu: true, showInFooter: true },
|
|
69
|
-
isActive: true,
|
|
70
|
-
isSearchable: true,
|
|
71
|
-
showOnHomepage: true,
|
|
72
|
-
createdBy: "user-admin-letitrip",
|
|
73
|
-
createdAt: daysAgo(300),
|
|
74
|
-
updatedAt: daysAgo(1),
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
id: "category-beyblade-original",
|
|
78
|
-
slug: "category-beyblade-original",
|
|
79
|
-
name: "Beyblade Original",
|
|
80
|
-
description: "The original Beyblade series (1999–2003) by Takara — Plastic Generation tops, Ultimate Beyblade, and the launchers that started the franchise.",
|
|
81
|
-
rootId: "category-spinning-tops",
|
|
82
|
-
parentIds: ["category-spinning-tops"],
|
|
83
|
-
childrenIds: [],
|
|
84
|
-
tier: 1,
|
|
85
|
-
path: "spinning-tops/beyblade-original",
|
|
86
|
-
order: 1,
|
|
87
|
-
isLeaf: true,
|
|
88
|
-
position: 0,
|
|
89
|
-
subtreeSize: 0,
|
|
57
|
+
const rawCategories = buildCategoryTree(CATEGORY_FOREST, {
|
|
58
|
+
createdBy: "user-admin-letitrip",
|
|
59
|
+
createdAt: daysAgo(300),
|
|
60
|
+
updatedAt: daysAgo(1),
|
|
61
|
+
defaults: {
|
|
90
62
|
metrics: emptyMetrics,
|
|
91
63
|
isFeatured: false,
|
|
92
|
-
isBrand: false,
|
|
93
|
-
highlights: [
|
|
94
|
-
"The tops that started it all in 1999",
|
|
95
|
-
"Ripcord launcher compatible with the full original-series lineup",
|
|
96
|
-
"A favorite among vintage collectors — sealed pieces command a premium",
|
|
97
|
-
],
|
|
98
|
-
faqs: [
|
|
99
|
-
{ question: "Will an original-series top work with a Burst or X launcher?", answer: "No — each generation uses its own launcher and ripcord system. Original-series tops need an original-series launcher." },
|
|
100
|
-
{ question: "How do I tell if an original top is a genuine Takara release vs. a reprint?", answer: "Check the sticker finish and base stamp under good lighting — sellers with vintage-collectible tagged listings usually note authentication details in the description." },
|
|
101
|
-
],
|
|
102
|
-
seo: { title: "Beyblade Original | LetItRip", description: "Buy original-series Beyblade tops and launchers — Plastic Generation, 1999-2003.", keywords: ["beyblade original", "plastic generation", "vintage beyblade", "beyblade 1999"] },
|
|
103
|
-
display: { icon: "🪀", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-original-20260101/1200/600"), color: "#b45309", showInMenu: true, showInFooter: false },
|
|
104
64
|
isActive: true,
|
|
105
65
|
isSearchable: true,
|
|
106
66
|
showOnHomepage: false,
|
|
107
|
-
createdBy: "user-admin-letitrip",
|
|
108
|
-
createdAt: daysAgo(300),
|
|
109
|
-
updatedAt: daysAgo(1),
|
|
110
67
|
},
|
|
68
|
+
});
|
|
69
|
+
/**
|
|
70
|
+
* Sublistings — `categoryType:"sublisting"`, documented on `CategoryDocument`
|
|
71
|
+
* as "tier-4 leaf groups under a parent category". This array was EMPTY for the
|
|
72
|
+
* life of the seed, because the tree only went two levels deep and there was no
|
|
73
|
+
* tier-3 leaf to hang a tier-4 group off. Now that there is, these give
|
|
74
|
+
* `itemCode` and `ProductDocument.sublistingCategoryId` / `sublistingIcon`
|
|
75
|
+
* their first real data.
|
|
76
|
+
*
|
|
77
|
+
* `itemCode` is the grading/variant code a collector actually searches by.
|
|
78
|
+
*/
|
|
79
|
+
const sublistingRows = [
|
|
111
80
|
{
|
|
112
|
-
id: "
|
|
113
|
-
slug: "
|
|
114
|
-
name: "
|
|
115
|
-
description: "
|
|
81
|
+
id: "sublisting-dranzer-s-a-5",
|
|
82
|
+
slug: "sublisting-dranzer-s-a-5",
|
|
83
|
+
name: "Dranzer S (A-5)",
|
|
84
|
+
description: "The A-5 Dranzer S release — the original Plastic Generation Dranzer.",
|
|
85
|
+
categoryType: CATEGORY_FIELDS.CATEGORY_TYPE_VALUES.SUBLISTING,
|
|
86
|
+
itemCode: "A-5",
|
|
116
87
|
rootId: "category-spinning-tops",
|
|
117
|
-
parentIds: [
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
isLeaf: true,
|
|
123
|
-
position: 1,
|
|
124
|
-
subtreeSize: 0,
|
|
125
|
-
metrics: emptyMetrics,
|
|
126
|
-
isFeatured: false,
|
|
127
|
-
isBrand: false,
|
|
128
|
-
highlights: [
|
|
129
|
-
"Metal-weighted tops for serious attack and defense power",
|
|
130
|
-
"Covers all four Metal Fight sub-generations: Fusion, Masters, Fury, Zero-G",
|
|
131
|
-
"Popular with tournament players for their heavier base weight",
|
|
132
|
-
],
|
|
133
|
-
faqs: [
|
|
134
|
-
{ question: "What does the number/letter code after a top's name mean (e.g. \"105RF\")?", answer: "It's the track height and bottom type — e.g. 105RF means a 105-height track with a Rubber Flat bottom. Swapping tracks and bottoms lets you tune stamina vs. attack." },
|
|
135
|
-
{ question: "Can Metal Fight tops battle Burst tops in the same stadium?", answer: "Physically yes if the stadium size matches, but they don't burst apart on impact the way Burst tops do — most local groups keep the generations separate for fair play." },
|
|
88
|
+
parentIds: [
|
|
89
|
+
"category-spinning-tops",
|
|
90
|
+
"category-beyblade-original",
|
|
91
|
+
"category-original-tops",
|
|
92
|
+
"category-original-plastic-gen",
|
|
136
93
|
],
|
|
137
|
-
seo: { title: "Beyblade Metal Fight | LetItRip", description: "Buy vintage Beyblade Metal Fight tops — Fusion, Masters, Fury.", keywords: ["beyblade metal fight", "metal fusion", "metal masters", "vintage beyblade"] },
|
|
138
|
-
display: { icon: "⚙️", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-metal-20260101/1200/600"), color: "#64748b", showInMenu: true, showInFooter: false },
|
|
139
|
-
isActive: true,
|
|
140
|
-
isSearchable: true,
|
|
141
|
-
showOnHomepage: false,
|
|
142
|
-
createdBy: "user-admin-letitrip",
|
|
143
|
-
createdAt: daysAgo(300),
|
|
144
|
-
updatedAt: daysAgo(1),
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
id: "category-beyblade-burst",
|
|
148
|
-
slug: "category-beyblade-burst",
|
|
149
|
-
name: "Beyblade Burst",
|
|
150
|
-
description: "Beyblade Burst by Takara-Tomy/Hasbro — Burst system tops, launchers, and stadiums from all Burst sub-generations.",
|
|
151
|
-
rootId: "category-spinning-tops",
|
|
152
|
-
parentIds: ["category-spinning-tops"],
|
|
153
94
|
childrenIds: [],
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
95
|
+
ancestors: [
|
|
96
|
+
{ id: "category-spinning-tops", name: "Spinning Tops", tier: 0 },
|
|
97
|
+
{ id: "category-beyblade-original", name: "Beyblade Original", tier: 1 },
|
|
98
|
+
{ id: "category-original-tops", name: "Original Tops", tier: 2 },
|
|
99
|
+
{ id: "category-original-plastic-gen", name: "Plastic Generation", tier: 3 },
|
|
100
|
+
],
|
|
101
|
+
tier: 4,
|
|
102
|
+
path: "spinning-tops/beyblade-original/original-tops/original-plastic-gen/dranzer-s-a-5",
|
|
157
103
|
isLeaf: true,
|
|
158
|
-
|
|
159
|
-
|
|
104
|
+
order: 1,
|
|
105
|
+
position: 900,
|
|
106
|
+
subtreeSize: 1,
|
|
160
107
|
metrics: emptyMetrics,
|
|
161
108
|
isFeatured: false,
|
|
162
|
-
isBrand: false,
|
|
163
|
-
highlights: [
|
|
164
|
-
"Tops that burst apart on a hard enough hit — a whole new battle mechanic",
|
|
165
|
-
"Swappable Layer / Disc / Driver parts for build customization",
|
|
166
|
-
"The most actively traded generation on the platform",
|
|
167
|
-
],
|
|
168
|
-
faqs: [
|
|
169
|
-
{ question: "What's the difference between a Layer, Disc, and Driver?", answer: "Layer is the top piece (attack profile), Disc sits underneath it (weight/stamina), Driver is the tip that touches the stadium floor (spin behavior). Mixing and matching lets you build custom combos." },
|
|
170
|
-
{ question: "Is a burst during battle bad for the top?", answer: "No — Burst tops are designed to separate on hard impacts as the game's core mechanic, then click back together for the next battle." },
|
|
171
|
-
],
|
|
172
|
-
seo: { title: "Beyblade Burst | LetItRip", description: "Buy Beyblade Burst tops, launchers, and stadiums.", keywords: ["beyblade burst", "burst system", "beyblade burst pro"] },
|
|
173
|
-
display: { icon: "💥", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-burst-20260101/1200/600"), color: "#059669", showInMenu: true, showInFooter: false },
|
|
174
109
|
isActive: true,
|
|
175
110
|
isSearchable: true,
|
|
176
|
-
|
|
111
|
+
display: { icon: "🔥", showInMenu: false, showInFooter: false },
|
|
112
|
+
seo: { title: "Dranzer S (A-5) | LetItRip", description: "The A-5 Dranzer S release.", keywords: ["dranzer s", "a-5", "plastic generation"] },
|
|
177
113
|
createdBy: "user-admin-letitrip",
|
|
178
114
|
createdAt: daysAgo(300),
|
|
179
|
-
updatedAt: daysAgo(
|
|
115
|
+
updatedAt: daysAgo(30),
|
|
180
116
|
},
|
|
181
117
|
{
|
|
182
|
-
id: "
|
|
183
|
-
slug: "
|
|
184
|
-
name: "
|
|
185
|
-
description: "
|
|
118
|
+
id: "sublisting-storm-pegasus-105rf",
|
|
119
|
+
slug: "sublisting-storm-pegasus-105rf",
|
|
120
|
+
name: "Storm Pegasus 105RF",
|
|
121
|
+
description: "Storm Pegasus on a 105 track with a Rubber Flat bottom — the canonical attack build.",
|
|
122
|
+
categoryType: CATEGORY_FIELDS.CATEGORY_TYPE_VALUES.SUBLISTING,
|
|
123
|
+
itemCode: "105RF",
|
|
186
124
|
rootId: "category-spinning-tops",
|
|
187
|
-
parentIds: [
|
|
125
|
+
parentIds: [
|
|
126
|
+
"category-spinning-tops",
|
|
127
|
+
"category-beyblade-metal",
|
|
128
|
+
"category-metal-tops",
|
|
129
|
+
"category-metal-fusion",
|
|
130
|
+
],
|
|
188
131
|
childrenIds: [],
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
132
|
+
ancestors: [
|
|
133
|
+
{ id: "category-spinning-tops", name: "Spinning Tops", tier: 0 },
|
|
134
|
+
{ id: "category-beyblade-metal", name: "Beyblade Metal Fight", tier: 1 },
|
|
135
|
+
{ id: "category-metal-tops", name: "Metal Fight Tops", tier: 2 },
|
|
136
|
+
{ id: "category-metal-fusion", name: "Metal Fusion", tier: 3 },
|
|
137
|
+
],
|
|
138
|
+
tier: 4,
|
|
139
|
+
path: "spinning-tops/beyblade-metal/metal-tops/metal-fusion/storm-pegasus-105rf",
|
|
192
140
|
isLeaf: true,
|
|
193
|
-
|
|
194
|
-
|
|
141
|
+
order: 2,
|
|
142
|
+
position: 901,
|
|
143
|
+
subtreeSize: 1,
|
|
195
144
|
metrics: emptyMetrics,
|
|
196
|
-
isFeatured:
|
|
197
|
-
isBrand: false,
|
|
198
|
-
highlights: [
|
|
199
|
-
"The newest generation — Xtreme Gear system launched in 2023",
|
|
200
|
-
"Faster clip-on part swaps than any previous generation",
|
|
201
|
-
"Actively growing tournament scene with new waves releasing regularly",
|
|
202
|
-
],
|
|
203
|
-
faqs: [
|
|
204
|
-
{ question: "Do I need new stadiums for Beyblade X?", answer: "X-format tops battle best in the wider X-format stadiums, though many X tops still spin in older round stadiums — check a listing's description for stadium compatibility notes." },
|
|
205
|
-
{ question: "What does the Blade / Ratchet / Bit naming mean?", answer: "Beyblade X renamed the part system — Blade (top piece), Ratchet (middle, sets height), Bit (bottom tip) — functionally similar to Burst's Layer/Disc/Driver but not physically interchangeable with them." },
|
|
206
|
-
],
|
|
207
|
-
seo: { title: "Beyblade X | LetItRip", description: "Buy Beyblade X tops and stadiums by Takara-Tomy.", keywords: ["beyblade x", "xtreme gear", "beyblade x starter", "takara tomy beyblade"] },
|
|
208
|
-
display: { icon: "💫", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-x-20260101/1200/600"), color: "#0d9488", showInMenu: true, showInFooter: false },
|
|
145
|
+
isFeatured: false,
|
|
209
146
|
isActive: true,
|
|
210
147
|
isSearchable: true,
|
|
211
|
-
|
|
148
|
+
display: { icon: "🐴", showInMenu: false, showInFooter: false },
|
|
149
|
+
seo: { title: "Storm Pegasus 105RF | LetItRip", description: "Storm Pegasus 105RF builds.", keywords: ["storm pegasus", "105rf", "metal fusion"] },
|
|
212
150
|
createdBy: "user-admin-letitrip",
|
|
213
151
|
createdAt: daysAgo(300),
|
|
214
|
-
updatedAt: daysAgo(
|
|
152
|
+
updatedAt: daysAgo(30),
|
|
215
153
|
},
|
|
216
154
|
];
|
|
217
|
-
const sublistingRows = [];
|
|
218
155
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
219
|
-
// Brands (categoryType:"brand")
|
|
220
|
-
//
|
|
221
|
-
//
|
|
156
|
+
// Brands (categoryType:"brand").
|
|
157
|
+
//
|
|
158
|
+
// ⚠️ `BrandDetailPageView` matches products on the free-text `brand` DISPLAY
|
|
159
|
+
// NAME (`sieveFilter("brand", EQ, brandName)`), not on `brandSlug`. So a brand
|
|
160
|
+
// row's `name` here and the `brand:` string on every product that belongs to it
|
|
161
|
+
// must match EXACTLY — renaming a brand silently orphans its whole catalogue.
|
|
162
|
+
// Keep `brand` and `brandSlug` in lockstep on the product side.
|
|
222
163
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
223
164
|
const brandRows = [
|
|
224
165
|
{
|
|
@@ -289,6 +230,75 @@ const brandRows = [
|
|
|
289
230
|
updatedAt: daysAgo(30),
|
|
290
231
|
seo: { title: "Beyblade | LetItRip", description: "Shop Beyblade — Original, X, Burst, Metal Fight tops and stadiums.", keywords: ["beyblade", "beyblade x", "beyblade burst", "spinning top battle"] },
|
|
291
232
|
},
|
|
233
|
+
{
|
|
234
|
+
id: "brand-hasbro",
|
|
235
|
+
slug: "brand-hasbro",
|
|
236
|
+
name: "Hasbro",
|
|
237
|
+
categoryType: CATEGORY_FIELDS.CATEGORY_TYPE_VALUES.BRAND,
|
|
238
|
+
description: "The international Beyblade licensee — Hasbro distributes its own Beyblade product line outside Japan, with different packaging, part names and sometimes different mould tolerances from the Takara-Tomy originals.",
|
|
239
|
+
brandWebsite: "https://shop.hasbro.com",
|
|
240
|
+
brandCountry: "United States",
|
|
241
|
+
brandFounded: 1923,
|
|
242
|
+
highlights: [
|
|
243
|
+
"The Beyblade line most collectors outside Japan grew up with",
|
|
244
|
+
"Widely available and generally cheaper than Japanese imports",
|
|
245
|
+
"Same-generation parts are usually cross-compatible with Takara-Tomy",
|
|
246
|
+
],
|
|
247
|
+
faqs: [
|
|
248
|
+
{ question: "Is a Hasbro Beyblade worse than the Takara-Tomy version?", answer: "Not worse, but often different — Hasbro releases can use different plastics and slightly looser tolerances, which competitive players notice. For casual play they perform comparably." },
|
|
249
|
+
{ question: "Can I mix Hasbro and Takara-Tomy parts?", answer: "Within the same generation, almost always yes. Across generations, no — the launcher and locking systems differ." },
|
|
250
|
+
],
|
|
251
|
+
rootId: "brand-hasbro",
|
|
252
|
+
parentIds: [],
|
|
253
|
+
tier: 0,
|
|
254
|
+
path: "brand-hasbro",
|
|
255
|
+
isLeaf: true,
|
|
256
|
+
order: 3,
|
|
257
|
+
display: { coverImage: seedExtMedia("https://picsum.photos/seed/brand-logo-hasbro-20260101/800/800"), showInMenu: false, showInFooter: true },
|
|
258
|
+
isFeatured: false,
|
|
259
|
+
isBrand: true,
|
|
260
|
+
isActive: true,
|
|
261
|
+
isSearchable: true,
|
|
262
|
+
createdBy: "user-admin-letitrip",
|
|
263
|
+
createdAt: daysAgo(300),
|
|
264
|
+
updatedAt: daysAgo(30),
|
|
265
|
+
seo: { title: "Hasbro | LetItRip", description: "Shop Hasbro Beyblade — the international product line.", keywords: ["hasbro", "hasbro beyblade", "beyblade burst hasbro"] },
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
// The Living Collectibles root needs a brand of its own: live listings are
|
|
269
|
+
// sold by individual keepers and breeders, not by a manufacturer. Without
|
|
270
|
+
// one, the three live-item products carried a `brand: "Beyblade Arena"`
|
|
271
|
+
// string (a STORE name in a brand field) that matched no brand row, so they
|
|
272
|
+
// were invisible on every brand page.
|
|
273
|
+
id: "brand-independent-keepers",
|
|
274
|
+
slug: "brand-independent-keepers",
|
|
275
|
+
name: "Independent Keepers",
|
|
276
|
+
categoryType: CATEGORY_FIELDS.CATEGORY_TYPE_VALUES.BRAND,
|
|
277
|
+
description: "Live animals and plants come from individual keepers, breeders and growers rather than a manufacturer. This entry groups those listings so they are reachable from brand browsing like everything else.",
|
|
278
|
+
brandCountry: "India",
|
|
279
|
+
highlights: [
|
|
280
|
+
"Every seller is verified before a live listing can go public",
|
|
281
|
+
"Provenance, age and health information disclosed per listing",
|
|
282
|
+
],
|
|
283
|
+
faqs: [
|
|
284
|
+
{ question: "Why is there a \"brand\" for living things at all?", answer: "Purely so live listings behave like every other listing in browse and search. It identifies the class of seller, not a manufacturer." },
|
|
285
|
+
],
|
|
286
|
+
rootId: "brand-independent-keepers",
|
|
287
|
+
parentIds: [],
|
|
288
|
+
tier: 0,
|
|
289
|
+
path: "brand-independent-keepers",
|
|
290
|
+
isLeaf: true,
|
|
291
|
+
order: 4,
|
|
292
|
+
display: { coverImage: seedExtMedia("https://picsum.photos/seed/brand-logo-independent-keepers-20260101/800/800"), showInMenu: false, showInFooter: false },
|
|
293
|
+
isFeatured: false,
|
|
294
|
+
isBrand: true,
|
|
295
|
+
isActive: true,
|
|
296
|
+
isSearchable: true,
|
|
297
|
+
createdBy: "user-admin-letitrip",
|
|
298
|
+
createdAt: daysAgo(300),
|
|
299
|
+
updatedAt: daysAgo(30),
|
|
300
|
+
seo: { title: "Independent Keepers | LetItRip", description: "Live animals and plants from verified independent keepers and growers.", keywords: ["independent keepers", "breeders", "live plants"] },
|
|
301
|
+
},
|
|
292
302
|
];
|
|
293
303
|
// P-17 — 5 bundle rows (categoryType:"bundle") grouping the Beyblade-minimal
|
|
294
304
|
// standard products by generation, plus one cross-generation starter pack.
|
|
@@ -309,6 +319,7 @@ const bundleRows = [
|
|
|
309
319
|
productIds: ["product-beyblade-original-dranzer-s", "product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus"],
|
|
310
320
|
},
|
|
311
321
|
bundleProductIds: ["product-beyblade-original-dranzer-s", "product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus"],
|
|
322
|
+
bundleCategorySlugs: ["category-original-hms", "category-original-tops", "category-beyblade-original", "category-spinning-tops", "category-original-plastic-gen", "category-metal-masters", "category-metal-tops", "category-beyblade-metal"],
|
|
312
323
|
bundleOriginalTotal: 4597, // 1499 + 1799 + 1299
|
|
313
324
|
bundleStockStatus: "in_stock",
|
|
314
325
|
display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-original-collectors-set-20260101/1200/900"), showInFooter: false },
|
|
@@ -343,6 +354,7 @@ const bundleRows = [
|
|
|
343
354
|
productIds: ["product-beyblade-metal-storm-pegasus", "product-beyblade-metal-flame-sagittario", "product-beyblade-original-dranzer-s"],
|
|
344
355
|
},
|
|
345
356
|
bundleProductIds: ["product-beyblade-metal-storm-pegasus", "product-beyblade-metal-flame-sagittario", "product-beyblade-original-dranzer-s"],
|
|
357
|
+
bundleCategorySlugs: ["category-metal-masters", "category-metal-tops", "category-beyblade-metal", "category-spinning-tops", "category-metal-fury", "category-original-hms", "category-original-tops", "category-beyblade-original"],
|
|
346
358
|
bundleOriginalTotal: 3997, // 1299 + 1199 + 1499
|
|
347
359
|
bundleStockStatus: "in_stock",
|
|
348
360
|
display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-metal-fusion-duo-20260101/1200/900"), showInFooter: false },
|
|
@@ -379,6 +391,7 @@ const bundleRows = [
|
|
|
379
391
|
productIds: ["product-beyblade-burst-valkyrie", "product-beyblade-burst-regalia-genesis", "product-beyblade-metal-flame-sagittario"],
|
|
380
392
|
},
|
|
381
393
|
bundleProductIds: ["product-beyblade-burst-valkyrie", "product-beyblade-burst-regalia-genesis", "product-beyblade-metal-flame-sagittario"],
|
|
394
|
+
bundleCategorySlugs: ["category-burst-superking", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops", "category-burst-classic", "category-metal-fury", "category-metal-tops", "category-beyblade-metal"],
|
|
382
395
|
bundleOriginalTotal: 3597, // 999 + 1399 + 1199
|
|
383
396
|
bundleStockStatus: "in_stock",
|
|
384
397
|
display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-burst-battlers-pack-20260101/1200/900"), showInFooter: false },
|
|
@@ -413,6 +426,7 @@ const bundleRows = [
|
|
|
413
426
|
productIds: ["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"],
|
|
414
427
|
},
|
|
415
428
|
bundleProductIds: ["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"],
|
|
429
|
+
bundleCategorySlugs: ["category-x-starters", "category-x-tops", "category-beyblade-x", "category-spinning-tops", "category-x-boosters", "category-burst-superking", "category-burst-tops", "category-beyblade-burst"],
|
|
416
430
|
bundleOriginalTotal: 2847, // 899 + 949 + 999
|
|
417
431
|
bundleStockStatus: "in_stock",
|
|
418
432
|
display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-x-series-starter-20260101/1200/900"), showInFooter: false },
|
|
@@ -460,6 +474,7 @@ const bundleRows = [
|
|
|
460
474
|
"product-beyblade-burst-valkyrie",
|
|
461
475
|
"product-beyblade-x-wizard-arrow",
|
|
462
476
|
],
|
|
477
|
+
bundleCategorySlugs: ["category-original-plastic-gen", "category-original-tops", "category-beyblade-original", "category-spinning-tops", "category-metal-masters", "category-metal-tops", "category-beyblade-metal", "category-burst-superking", "category-burst-tops", "category-beyblade-burst", "category-x-starters", "category-x-tops", "category-beyblade-x"],
|
|
463
478
|
bundleOriginalTotal: 4996, // 1799 + 1299 + 999 + 899
|
|
464
479
|
bundleStockStatus: "in_stock",
|
|
465
480
|
display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-every-generation-starter-pack-20260101/1200/900"), showInFooter: false },
|
|
@@ -228,7 +228,7 @@ export const eventsSeedData = [
|
|
|
228
228
|
{
|
|
229
229
|
id: "event-pokemon-number-draw-july-2026",
|
|
230
230
|
slug: "pokemon-number-draw-july-2026",
|
|
231
|
-
type:
|
|
231
|
+
type: EVENT_FIELDS.TYPE_VALUES.LOTTERY,
|
|
232
232
|
title: "Pokémon Number Draw — July 2026",
|
|
233
233
|
description: "<p>Choose your lucky slot and win rare Pokémon collectibles! 25 slots available. Each slot is assigned a prize from our collection. First-come, first-served.</p>",
|
|
234
234
|
status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
|
|
@@ -243,14 +243,18 @@ export const eventsSeedData = [
|
|
|
243
243
|
maxPullsPerTransaction: 1,
|
|
244
244
|
maxPullsPerUser: 1,
|
|
245
245
|
slots: [
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
{ slotNumber:
|
|
251
|
-
{ slotNumber:
|
|
252
|
-
{ slotNumber:
|
|
253
|
-
{ slotNumber:
|
|
246
|
+
// The first 8 slots carry a prize photo; the rest deliberately do not,
|
|
247
|
+
// so the detail page exercises both sides of the "only photographed
|
|
248
|
+
// slots get a collage tile" rule. `image` is a plain image URL and so
|
|
249
|
+
// is seedExtMedia()-wrapped like every other image in this file.
|
|
250
|
+
{ slotNumber: 1, name: "Charizard Base Set Holo", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-1/600/600"), price: 5000, weight: 1, isBooked: true, bookedByUserId: "user-ravi-k", bookedByDisplayName: "Ravi K", bookedByUserLotteryNumber: 1 },
|
|
251
|
+
{ slotNumber: 2, name: "Blastoise Base Set Holo", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-2/600/600"), price: 3000, weight: 33, isBooked: true, bookedByUserId: "user-priya-s", bookedByDisplayName: "Priya S", bookedByUserLotteryNumber: 2 },
|
|
252
|
+
{ slotNumber: 3, name: "Venusaur Base Set Holo", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-3/600/600"), price: 2500, weight: 40, isBooked: true, bookedByUserId: "user-arjun-m", bookedByDisplayName: "Arjun M", bookedByUserLotteryNumber: 3 },
|
|
253
|
+
{ slotNumber: 4, name: "Pikachu Surfing Promo", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-4/600/600"), price: 1500, weight: 66, isBooked: true, bookedByUserId: "user-sneha-p", bookedByDisplayName: "Sneha P", bookedByUserLotteryNumber: 4 },
|
|
254
|
+
{ slotNumber: 5, name: "Mewtwo Base Set Holo", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-5/600/600"), price: 2000, weight: 50, isBooked: true, bookedByUserId: "user-vikram-r", bookedByDisplayName: "Vikram R", bookedByUserLotteryNumber: 5 },
|
|
255
|
+
{ slotNumber: 6, name: "Gengar First Ed. Fossil", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-6/600/600"), price: 3500, weight: 28, isBooked: false },
|
|
256
|
+
{ slotNumber: 7, name: "Alakazam Base Set Holo", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-7/600/600"), price: 800, weight: 93, isBooked: false },
|
|
257
|
+
{ slotNumber: 8, name: "Machamp 1st Ed. Base Set", image: seedExtMedia("https://picsum.photos/seed/lottery-pokemon-number-draw-slot-8/600/600"), price: 400, weight: 99, isBooked: false },
|
|
254
258
|
{ slotNumber: 9, name: "Clefairy Base Set Holo", price: 600, weight: 95, isBooked: false },
|
|
255
259
|
{ slotNumber: 10, name: "Chansey Base Set Holo", price: 700, weight: 94, isBooked: false },
|
|
256
260
|
{ slotNumber: 11, name: "Ninetales Base Set Holo", price: 1000, weight: 80, isBooked: false },
|
|
@@ -279,7 +283,7 @@ export const eventsSeedData = [
|
|
|
279
283
|
{
|
|
280
284
|
id: "event-beyblade-slot-raffle-draft",
|
|
281
285
|
slug: "beyblade-slot-raffle-draft",
|
|
282
|
-
type:
|
|
286
|
+
type: EVENT_FIELDS.TYPE_VALUES.LOTTERY,
|
|
283
287
|
title: "Beyblade Slot Raffle — Coming Soon",
|
|
284
288
|
description: "<p>10 rare beyblade slots up for grabs. Details coming soon!</p>",
|
|
285
289
|
status: EVENT_FIELDS.STATUS_VALUES.DRAFT,
|
|
@@ -297,6 +301,10 @@ export const eventsSeedData = [
|
|
|
297
301
|
slots: Array.from({ length: 10 }, (_, i) => ({
|
|
298
302
|
slotNumber: i + 1,
|
|
299
303
|
name: `Prize Slot ${i + 1}`,
|
|
304
|
+
// Seed index, not Math.random() — a seed file is re-executed on every
|
|
305
|
+
// CLI invocation, so any non-deterministic value breaks upsert
|
|
306
|
+
// idempotency (Root Cause #25).
|
|
307
|
+
image: seedExtMedia(`https://picsum.photos/seed/lottery-beyblade-slot-raffle-slot-${i + 1}/600/600`),
|
|
300
308
|
price: 500,
|
|
301
309
|
weight: 50,
|
|
302
310
|
isBooked: false,
|
|
@@ -307,6 +315,49 @@ export const eventsSeedData = [
|
|
|
307
315
|
createdAt: daysAgo(1),
|
|
308
316
|
updatedAt: daysAgo(0),
|
|
309
317
|
},
|
|
318
|
+
// ── 11. PAUSED — Sale ────────────────────────────────────────────────────
|
|
319
|
+
// `paused` and `cancelled` are real `EventStatus` values that had no fixture
|
|
320
|
+
// at all: the seed only ever produced active/draft/ended. Their admin filter
|
|
321
|
+
// chips were added 2026-08-24, and a chip that can only ever return an empty
|
|
322
|
+
// list is exactly what the hide-empty rule is meant to remove — so the states
|
|
323
|
+
// need real rows to be worth showing.
|
|
324
|
+
{
|
|
325
|
+
id: "event-monsoon-sale-paused",
|
|
326
|
+
slug: "monsoon-sale-paused",
|
|
327
|
+
type: EVENT_FIELDS.TYPE_VALUES.SALE,
|
|
328
|
+
title: "Monsoon Sale — Paused",
|
|
329
|
+
description: "<p>Temporarily paused while we restock. Discounts resume once stock lands.</p>",
|
|
330
|
+
status: EVENT_FIELDS.STATUS_VALUES.PAUSED,
|
|
331
|
+
startsAt: daysAgo(3),
|
|
332
|
+
endsAt: daysAhead(10),
|
|
333
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/event-cover-monsoon-sale-paused-20260101/1200/600"), alt: "Monsoon Sale" },
|
|
334
|
+
tags: ["sale", "monsoon", "paused"],
|
|
335
|
+
stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
|
|
336
|
+
createdBy: "user-admin-letitrip",
|
|
337
|
+
createdAt: daysAgo(6),
|
|
338
|
+
updatedAt: daysAgo(3),
|
|
339
|
+
},
|
|
340
|
+
// ── 12. CANCELLED — Raffle ───────────────────────────────────────────────
|
|
341
|
+
{
|
|
342
|
+
id: "event-x-launch-raffle-cancelled",
|
|
343
|
+
slug: "x-launch-raffle-cancelled",
|
|
344
|
+
type: EVENT_FIELDS.TYPE_VALUES.RAFFLE,
|
|
345
|
+
title: "Beyblade X Launch Raffle — Cancelled",
|
|
346
|
+
description: "<p>Cancelled after the prize stock could not be sourced in time. Entrants were refunded in full.</p>",
|
|
347
|
+
status: EVENT_FIELDS.STATUS_VALUES.CANCELLED,
|
|
348
|
+
startsAt: daysAgo(20),
|
|
349
|
+
endsAt: daysAgo(6),
|
|
350
|
+
coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/event-cover-x-launch-raffle-cancelled-20260101/1200/600"), alt: "Beyblade X Launch Raffle" },
|
|
351
|
+
tags: ["raffle", "beyblade-x", "cancelled"],
|
|
352
|
+
hasRaffle: true,
|
|
353
|
+
raffleType: "open_raffle",
|
|
354
|
+
rafflePrize: "Beyblade X Dran Sword starter set",
|
|
355
|
+
raffleEntryCount: 0,
|
|
356
|
+
stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
|
|
357
|
+
createdBy: "user-admin-letitrip",
|
|
358
|
+
createdAt: daysAgo(25),
|
|
359
|
+
updatedAt: daysAgo(6),
|
|
360
|
+
},
|
|
310
361
|
];
|
|
311
362
|
// ── Event Entries ────────────────────────────────────────────────────────────
|
|
312
363
|
export const eventEntriesSeedData = [
|
|
@@ -367,7 +367,11 @@ export const homepageSectionsSeedData = [
|
|
|
367
367
|
maxItems: 6,
|
|
368
368
|
showCountdown: true,
|
|
369
369
|
showEntriesRemaining: true,
|
|
370
|
-
|
|
370
|
+
// "all" until 2026-08-24, which is why a closed, already-revealed draw
|
|
371
|
+
// sat on the homepage advertising entries nobody could buy. "all" is
|
|
372
|
+
// still a valid choice — it builds an archive strip — but it is not what
|
|
373
|
+
// a "Prize Draws" strip on the homepage means.
|
|
374
|
+
revealStatus: "open",
|
|
371
375
|
},
|
|
372
376
|
createdAt: daysAgo(2),
|
|
373
377
|
updatedAt: daysAgo(2),
|