@mohasinac/appkit 4.13.1 → 4.15.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.
Files changed (493) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
  4. package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
  5. package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
  6. package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
  7. package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
  8. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
  9. package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
  10. package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
  11. package/dist/_internal/server/features/auctions/actions.js +8 -2
  12. package/dist/_internal/server/features/bundles/data.d.ts +16 -0
  13. package/dist/_internal/server/features/bundles/data.js +26 -0
  14. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  15. package/dist/_internal/server/features/bundles/index.js +1 -1
  16. package/dist/_internal/server/features/cart/service.d.ts +3 -3
  17. package/dist/_internal/server/features/checkout/actions.js +25 -0
  18. package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
  19. package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
  20. package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
  21. package/dist/_internal/server/features/checkout/source-context.js +157 -0
  22. package/dist/_internal/server/features/homepage/index.d.ts +0 -1
  23. package/dist/_internal/server/features/homepage/index.js +7 -1
  24. package/dist/_internal/server/features/lottery/adapters.js +4 -0
  25. package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
  26. package/dist/_internal/server/features/offers/adapters.js +88 -0
  27. package/dist/_internal/server/features/offers/index.d.ts +2 -0
  28. package/dist/_internal/server/features/offers/index.js +1 -0
  29. package/dist/_internal/server/features/orders/adapters.js +24 -0
  30. package/dist/_internal/server/features/products/data.js +15 -37
  31. package/dist/_internal/server/features/products/index.d.ts +1 -1
  32. package/dist/_internal/server/features/products/index.js +1 -1
  33. package/dist/_internal/server/features/products/list-public.d.ts +46 -20
  34. package/dist/_internal/server/features/products/list-public.js +266 -90
  35. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
  36. package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
  37. package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
  38. package/dist/_internal/server/features/site-settings/adapters.js +75 -0
  39. package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
  40. package/dist/_internal/server/features/site-settings/index.js +1 -0
  41. package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
  42. package/dist/_internal/server/features/stores/adapters.js +91 -0
  43. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  44. package/dist/_internal/server/features/stores/index.js +1 -0
  45. package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
  46. package/dist/_internal/server/jobs/core/offerExpiry.js +55 -19
  47. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
  48. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
  49. package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
  50. package/dist/_internal/server/jobs/handlers/messages.js +10 -0
  51. package/dist/_internal/shared/actions/action-registry.js +17 -1
  52. package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
  53. package/dist/_internal/shared/checkout/lanes.js +26 -0
  54. package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
  55. package/dist/_internal/shared/features/auctions/config.js +27 -0
  56. package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
  57. package/dist/_internal/shared/features/auctions/schema.js +13 -1
  58. package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
  59. package/dist/_internal/shared/features/cart/schema.d.ts +20 -15
  60. package/dist/_internal/shared/features/cart/schema.js +15 -0
  61. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
  62. package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
  63. package/dist/_internal/shared/features/emi/schedule.js +20 -5
  64. package/dist/_internal/shared/features/events/schema.d.ts +2 -2
  65. package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
  66. package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
  67. package/dist/_internal/shared/features/offers/config.d.ts +30 -0
  68. package/dist/_internal/shared/features/offers/config.js +59 -0
  69. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  70. package/dist/_internal/shared/features/products/schema.d.ts +30 -30
  71. package/dist/_internal/shared/features/products/to-product-item.js +6 -0
  72. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  73. package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
  74. package/dist/_internal/shared/features/site-settings/fees.js +39 -0
  75. package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
  76. package/dist/_internal/shared/features/site-settings/types.js +1 -0
  77. package/dist/_internal/shared/history/history.d.ts +88 -0
  78. package/dist/_internal/shared/history/history.js +198 -0
  79. package/dist/_internal/shared/history/index.d.ts +4 -0
  80. package/dist/_internal/shared/history/index.js +2 -0
  81. package/dist/_internal/shared/history/types.d.ts +61 -0
  82. package/dist/_internal/shared/history/types.js +6 -0
  83. package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
  84. package/dist/_internal/shared/listing-types/_registry.js +67 -0
  85. package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
  86. package/dist/_internal/shared/listing-types/art/config.js +5 -0
  87. package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
  88. package/dist/_internal/shared/listing-types/auction/config.js +21 -0
  89. package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
  90. package/dist/_internal/shared/listing-types/availability.js +104 -0
  91. package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
  92. package/dist/_internal/shared/listing-types/capabilities.js +12 -0
  93. package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
  94. package/dist/_internal/shared/listing-types/classified/config.js +5 -0
  95. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
  96. package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
  97. package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
  98. package/dist/_internal/shared/listing-types/live/config.js +5 -0
  99. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
  100. package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
  101. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
  102. package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
  103. package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
  104. package/dist/_internal/shared/listing-types/standard/config.js +5 -0
  105. package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
  106. package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
  107. package/dist/client.d.ts +20 -7
  108. package/dist/client.js +22 -4
  109. package/dist/constants/api-endpoints.d.ts +6 -0
  110. package/dist/constants/api-endpoints.js +2 -0
  111. package/dist/constants/field-names.d.ts +57 -8
  112. package/dist/constants/field-names.js +101 -8
  113. package/dist/constants/table-keys.d.ts +17 -0
  114. package/dist/constants/table-keys.js +17 -0
  115. package/dist/errors/error-codes.d.ts +13 -1
  116. package/dist/errors/error-codes.js +13 -1
  117. package/dist/errors/error-display-map.js +12 -3
  118. package/dist/errors/messages.d.ts +10 -2
  119. package/dist/errors/messages.js +10 -2
  120. package/dist/features/about/components/AboutView.d.ts +3 -0
  121. package/dist/features/about/components/AboutView.js +3 -2
  122. package/dist/features/about/components/PolicyPageView.d.ts +2 -1
  123. package/dist/features/about/components/PolicyPageView.js +61 -23
  124. package/dist/features/about/components/PublicProfileView.js +5 -0
  125. package/dist/features/about/schemas/firestore.d.ts +3 -0
  126. package/dist/features/account/components/UserBidsView.js +12 -4
  127. package/dist/features/account/components/UserOrdersView.js +7 -0
  128. package/dist/features/account/components/UserReturnsView.d.ts +3 -0
  129. package/dist/features/account/components/UserReturnsView.js +17 -1
  130. package/dist/features/account/components/index.d.ts +0 -2
  131. package/dist/features/account/components/index.js +0 -1
  132. package/dist/features/account/schemas/index.d.ts +2 -2
  133. package/dist/features/account/types/index.d.ts +21 -2
  134. package/dist/features/addresses/schemas/index.d.ts +4 -4
  135. package/dist/features/admin/components/AdminArtView.js +8 -3
  136. package/dist/features/admin/components/AdminAuditLogView.js +1 -0
  137. package/dist/features/admin/components/AdminBidsView.js +15 -2
  138. package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
  139. package/dist/features/admin/components/AdminClassifiedView.js +8 -3
  140. package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
  141. package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
  142. package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
  143. package/dist/features/admin/components/AdminLiveView.js +8 -3
  144. package/dist/features/admin/components/AdminNavEditorView.js +15 -5
  145. package/dist/features/admin/components/AdminNewsletterView.js +18 -2
  146. package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
  147. package/dist/features/admin/components/AdminOffersView.js +230 -0
  148. package/dist/features/admin/components/AdminOrdersView.js +10 -1
  149. package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
  150. package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
  151. package/dist/features/admin/components/AdminProductsView.js +16 -29
  152. package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
  153. package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
  154. package/dist/features/admin/components/AdminScammersView.js +3 -8
  155. package/dist/features/admin/components/AdminSectionsView.js +32 -23
  156. package/dist/features/admin/components/AdminSessionsView.js +17 -2
  157. package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
  158. package/dist/features/admin/components/AdminSiteView.js +6 -2
  159. package/dist/features/admin/components/AdminStickersView.js +8 -3
  160. package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
  161. package/dist/features/admin/components/index.d.ts +2 -0
  162. package/dist/features/admin/components/index.js +1 -0
  163. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
  164. package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
  165. package/dist/features/admin/constants/filter-tabs.d.ts +89 -0
  166. package/dist/features/admin/constants/filter-tabs.js +56 -0
  167. package/dist/features/admin/schemas/firestore.d.ts +122 -3
  168. package/dist/features/admin/schemas/firestore.js +1 -0
  169. package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
  170. package/dist/features/admin/schemas/homepage-section-form.js +68 -0
  171. package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
  172. package/dist/features/admin/schemas/nav-item-form.js +72 -0
  173. package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
  174. package/dist/features/auctions/actions/bid-actions.js +93 -20
  175. package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
  176. package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
  177. package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
  178. package/dist/features/auctions/components/AuctionsListView.js +5 -6
  179. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
  180. package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
  181. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
  182. package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
  183. package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
  184. package/dist/features/auctions/components/bid-detail-fields.js +103 -0
  185. package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
  186. package/dist/features/auctions/repository/bid.repository.js +23 -0
  187. package/dist/features/auctions/schemas/firestore.d.ts +17 -0
  188. package/dist/features/auctions/schemas/index.d.ts +12 -12
  189. package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
  190. package/dist/features/audit-log/schemas/firestore.js +7 -0
  191. package/dist/features/auth/permissions/constants.d.ts +1 -1
  192. package/dist/features/auth/permissions/constants.js +10 -1
  193. package/dist/features/blog/actions/blog-actions.d.ts +7 -7
  194. package/dist/features/blog/schemas/blog-form.d.ts +80 -0
  195. package/dist/features/blog/schemas/blog-form.js +100 -0
  196. package/dist/features/blog/schemas/index.d.ts +6 -6
  197. package/dist/features/cart/repository/cart.repository.js +1 -0
  198. package/dist/features/cart/schemas/firestore.d.ts +15 -0
  199. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  200. package/dist/features/categories/components/BrandDetailPageView.js +23 -40
  201. package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
  202. package/dist/features/categories/components/BrandDetailTabs.js +8 -12
  203. package/dist/features/categories/components/BundleCollage.js +1 -1
  204. package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
  205. package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
  206. package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
  207. package/dist/features/categories/components/CategoryProductsListing.js +11 -1
  208. package/dist/features/categories/components/ConcernCard.js +7 -1
  209. package/dist/features/categories/schemas/firestore.d.ts +13 -0
  210. package/dist/features/categories/schemas/index.d.ts +26 -26
  211. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
  212. package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
  213. package/dist/features/events/components/AdminEventEditorView.js +32 -54
  214. package/dist/features/events/components/AdminEventEntriesView.js +22 -3
  215. package/dist/features/events/components/AdminEventsView.js +15 -11
  216. package/dist/features/events/components/EventFilters.d.ts +9 -1
  217. package/dist/features/events/components/EventFilters.js +45 -21
  218. package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
  219. package/dist/features/events/components/EventsIndexListing.js +2 -2
  220. package/dist/features/events/components/EventsListPageView.js +13 -4
  221. package/dist/features/events/repository/events.repository.d.ts +17 -0
  222. package/dist/features/events/repository/events.repository.js +27 -0
  223. package/dist/features/events/schemas/event-form.d.ts +113 -0
  224. package/dist/features/events/schemas/event-form.js +82 -0
  225. package/dist/features/events/schemas/firestore.d.ts +12 -0
  226. package/dist/features/events/schemas/firestore.js +12 -0
  227. package/dist/features/events/schemas/index.d.ts +50 -50
  228. package/dist/features/events/types/index.d.ts +11 -0
  229. package/dist/features/events/types/index.js +57 -1
  230. package/dist/features/faq/actions/faq-actions.d.ts +12 -12
  231. package/dist/features/faq/schemas/index.d.ts +8 -8
  232. package/dist/features/filters/FilterFacetSection.d.ts +7 -1
  233. package/dist/features/filters/FilterFacetSection.js +11 -3
  234. package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
  235. package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
  236. package/dist/features/grouped/schemas/index.d.ts +4 -4
  237. package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
  238. package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
  239. package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
  240. package/dist/features/homepage/components/AnnouncementBar.js +3 -3
  241. package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
  242. package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
  243. package/dist/features/homepage/hooks/homepage-query.js +45 -0
  244. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
  245. package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
  246. package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
  247. package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
  248. package/dist/features/homepage/schemas/index.d.ts +33 -2
  249. package/dist/features/homepage/schemas/index.js +24 -0
  250. package/dist/features/layout/AppLayoutShell.d.ts +11 -1
  251. package/dist/features/layout/AppLayoutShell.js +15 -14
  252. package/dist/features/layout/BackToTop.d.ts +9 -0
  253. package/dist/features/layout/BackToTop.js +10 -1
  254. package/dist/features/layout/BottomActions.js +28 -25
  255. package/dist/features/layout/BottomChrome.d.ts +34 -0
  256. package/dist/features/layout/BottomChrome.js +55 -0
  257. package/dist/features/layout/BottomNavLayout.d.ts +6 -0
  258. package/dist/features/layout/BottomNavLayout.js +7 -1
  259. package/dist/features/layout/BottomNavbar.js +15 -2
  260. package/dist/features/layout/FooterLayout.js +11 -1
  261. package/dist/features/layout/NavbarLayout.js +1 -1
  262. package/dist/features/layout/TitleBarLayout.d.ts +7 -0
  263. package/dist/features/layout/TitleBarLayout.js +28 -5
  264. package/dist/features/layout/index.d.ts +2 -0
  265. package/dist/features/layout/index.js +1 -0
  266. package/dist/features/lottery/types/index.d.ts +3 -0
  267. package/dist/features/media/MediaPickerModal.js +5 -1
  268. package/dist/features/messages/schemas/index.d.ts +2 -2
  269. package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
  270. package/dist/features/orders/components/OrderScopeTabs.js +31 -0
  271. package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
  272. package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
  273. package/dist/features/orders/constants/order-scope.d.ts +48 -0
  274. package/dist/features/orders/constants/order-scope.js +111 -0
  275. package/dist/features/orders/repository/orders.repository.d.ts +54 -7
  276. package/dist/features/orders/repository/orders.repository.js +121 -22
  277. package/dist/features/orders/schemas/firestore.d.ts +152 -0
  278. package/dist/features/orders/schemas/firestore.js +30 -0
  279. package/dist/features/orders/schemas/index.d.ts +18 -18
  280. package/dist/features/orders/types/index.d.ts +35 -7
  281. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
  282. package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
  283. package/dist/features/pre-orders/schemas/index.d.ts +1 -1
  284. package/dist/features/products/actions/product-actions.d.ts +14 -0
  285. package/dist/features/products/actions/product-actions.js +49 -11
  286. package/dist/features/products/api/route.d.ts +12 -0
  287. package/dist/features/products/api/route.js +42 -100
  288. package/dist/features/products/components/ArtStickersListView.js +2 -2
  289. package/dist/features/products/components/AuctionsIndexListing.js +13 -11
  290. package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
  291. package/dist/features/products/components/AvailabilityTabs.js +47 -0
  292. package/dist/features/products/components/GroupSettingsPanel.js +5 -1
  293. package/dist/features/products/components/MakeOfferButton.js +48 -49
  294. package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
  295. package/dist/features/products/components/PrizeDrawCollage.js +9 -1
  296. package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
  297. package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
  298. package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
  299. package/dist/features/products/components/PrizeDrawsSection.js +23 -18
  300. package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
  301. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  302. package/dist/features/products/components/ProductForm.js +5 -2
  303. package/dist/features/products/components/ProductGrid.js +6 -1
  304. package/dist/features/products/components/ProductsIndexListing.js +22 -32
  305. package/dist/features/products/components/ProductsIndexPageView.js +6 -9
  306. package/dist/features/products/components/index.d.ts +2 -2
  307. package/dist/features/products/components/index.js +1 -1
  308. package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
  309. package/dist/features/products/config/listing-type-listing-config.js +22 -10
  310. package/dist/features/products/constants/action-defs.d.ts +2 -0
  311. package/dist/features/products/constants/action-defs.js +6 -0
  312. package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
  313. package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
  314. package/dist/features/products/hooks/useProducts.d.ts +5 -0
  315. package/dist/features/products/hooks/useProducts.js +13 -2
  316. package/dist/features/products/repository/products.repository.d.ts +31 -2
  317. package/dist/features/products/repository/products.repository.js +53 -21
  318. package/dist/features/products/schemas/firestore.d.ts +17 -3
  319. package/dist/features/products/schemas/firestore.js +7 -2
  320. package/dist/features/products/schemas/index.d.ts +64 -64
  321. package/dist/features/products/schemas/product-features.validators.d.ts +79 -6
  322. package/dist/features/products/schemas/product-features.validators.js +63 -0
  323. package/dist/features/products/types/index.d.ts +16 -1
  324. package/dist/features/promotions/schemas/index.d.ts +2 -2
  325. package/dist/features/reviews/schemas/index.d.ts +16 -16
  326. package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
  327. package/dist/features/scams/constants/scammer-status-display.js +79 -0
  328. package/dist/features/search/schemas/index.d.ts +4 -4
  329. package/dist/features/seller/actions/offer-actions.js +57 -4
  330. package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
  331. package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
  332. package/dist/features/seller/components/SellerArtView.js +5 -0
  333. package/dist/features/seller/components/SellerAuctionsView.js +13 -15
  334. package/dist/features/seller/components/SellerBidsView.js +11 -4
  335. package/dist/features/seller/components/SellerClassifiedView.js +5 -0
  336. package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
  337. package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
  338. package/dist/features/seller/components/SellerLiveView.js +5 -0
  339. package/dist/features/seller/components/SellerOffersView.js +2 -1
  340. package/dist/features/seller/components/SellerOrdersView.js +31 -9
  341. package/dist/features/seller/components/SellerPayoutSettingsView.js +56 -31
  342. package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
  343. package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
  344. package/dist/features/seller/components/SellerProductShell.js +7 -1
  345. package/dist/features/seller/components/SellerProductsView.js +11 -8
  346. package/dist/features/seller/components/SellerStickersView.js +5 -0
  347. package/dist/features/seller/components/index.d.ts +0 -2
  348. package/dist/features/seller/components/index.js +0 -1
  349. package/dist/features/seller/repository/offer.repository.d.ts +142 -24
  350. package/dist/features/seller/repository/offer.repository.js +165 -26
  351. package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
  352. package/dist/features/seller/schemas/coupon-form.js +116 -0
  353. package/dist/features/seller/schemas/firestore.d.ts +56 -2
  354. package/dist/features/seller/schemas/firestore.js +27 -0
  355. package/dist/features/seller/schemas/index.d.ts +2 -2
  356. package/dist/features/seller/schemas/offer-forms.d.ts +46 -0
  357. package/dist/features/seller/schemas/offer-forms.js +42 -0
  358. package/dist/features/seller/server.d.ts +0 -1
  359. package/dist/features/seller/server.js +0 -1
  360. package/dist/features/shell/SectionForm.d.ts +99 -0
  361. package/dist/features/shell/SectionForm.js +128 -0
  362. package/dist/features/shell/build-sections.d.ts +63 -0
  363. package/dist/features/shell/build-sections.js +207 -0
  364. package/dist/features/shell/entity-form.d.ts +109 -0
  365. package/dist/features/shell/entity-form.js +96 -0
  366. package/dist/features/shell/field-ui-meta.d.ts +115 -0
  367. package/dist/features/shell/field-ui-meta.js +324 -0
  368. package/dist/features/shell/index.d.ts +8 -0
  369. package/dist/features/shell/index.js +4 -0
  370. package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
  371. package/dist/features/status-history/components/StatusTimeline.js +46 -0
  372. package/dist/features/status-history/index.d.ts +11 -0
  373. package/dist/features/status-history/index.js +10 -0
  374. package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
  375. package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
  376. package/dist/features/store-extensions/index.d.ts +12 -0
  377. package/dist/features/store-extensions/index.js +12 -0
  378. package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
  379. package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
  380. package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
  381. package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
  382. package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
  383. package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
  384. package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
  385. package/dist/features/store-extensions/schemas/firestore.js +60 -0
  386. package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
  387. package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
  388. package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
  389. package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
  390. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
  391. package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
  392. package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
  393. package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
  394. package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
  395. package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
  396. package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
  397. package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
  398. package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
  399. package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
  400. package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
  401. package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
  402. package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
  403. package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
  404. package/dist/features/stores/api/[storeSlug]/route.js +2 -25
  405. package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
  406. package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
  407. package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
  408. package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
  409. package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
  410. package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
  411. package/dist/features/stores/components/StoreProductsListing.js +11 -1
  412. package/dist/features/stores/repository/store.repository.js +6 -0
  413. package/dist/features/stores/schemas/index.d.ts +6 -6
  414. package/dist/features/support/schemas/index.d.ts +4 -4
  415. package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
  416. package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
  417. package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
  418. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +431 -1
  419. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  420. package/dist/index.d.ts +25 -12
  421. package/dist/index.js +26 -11
  422. package/dist/next/routing/route-map.d.ts +23 -3
  423. package/dist/next/routing/route-map.js +14 -2
  424. package/dist/providers/db-firebase/base.repository.d.ts +30 -0
  425. package/dist/providers/db-firebase/base.repository.js +50 -1
  426. package/dist/providers/db-firebase/index.d.ts +1 -1
  427. package/dist/providers/db-firebase/index.js +1 -1
  428. package/dist/providers/db-firebase/sieve.d.ts +25 -0
  429. package/dist/providers/db-firebase/sieve.js +52 -18
  430. package/dist/react/hooks/useUrlTable.js +10 -1
  431. package/dist/schemas/firestore-value.d.ts +8 -0
  432. package/dist/schemas/firestore-value.js +44 -0
  433. package/dist/schemas/index.d.ts +1 -1
  434. package/dist/schemas/index.js +1 -1
  435. package/dist/schemas/registry.d.ts +702 -69
  436. package/dist/schemas/registry.js +64 -1
  437. package/dist/seed/_helpers/category-forest.d.ts +2 -0
  438. package/dist/seed/_helpers/category-forest.js +309 -0
  439. package/dist/seed/_helpers/category-tree.d.ts +27 -0
  440. package/dist/seed/_helpers/category-tree.js +103 -0
  441. package/dist/seed/bids-seed-data.js +30 -0
  442. package/dist/seed/catalogue-seed-data.js +12 -12
  443. package/dist/seed/categories-seed-data.js +177 -162
  444. package/dist/seed/events-seed-data.js +61 -10
  445. package/dist/seed/homepage-sections-seed-data.js +5 -1
  446. package/dist/seed/offers-seed-data.js +244 -34
  447. package/dist/seed/orders-seed-data.js +336 -1
  448. package/dist/seed/products-art-seed-data.js +50 -12
  449. package/dist/seed/products-auctions-seed-data.js +138 -18
  450. package/dist/seed/products-classifieds-seed-data.js +80 -16
  451. package/dist/seed/products-digital-codes-seed-data.js +66 -18
  452. package/dist/seed/products-live-items-seed-data.js +64 -13
  453. package/dist/seed/products-preorders-seed-data.d.ts +0 -1
  454. package/dist/seed/products-preorders-seed-data.js +52 -13
  455. package/dist/seed/products-prize-draws-seed-data.js +63 -14
  456. package/dist/seed/products-standard-seed-data.js +99 -26
  457. package/dist/seed/products-stickers-seed-data.js +47 -12
  458. package/dist/seed/reviews-seed-data.js +6 -1
  459. package/dist/seed/site-settings-seed-data.d.ts +1 -38
  460. package/dist/seed/site-settings-seed-data.js +38 -76
  461. package/dist/seed/stores-seed-data.js +71 -1
  462. package/dist/seed/users-seed-data.js +15 -5
  463. package/dist/server-entry.d.ts +1 -2
  464. package/dist/server-entry.js +4 -3
  465. package/dist/server.d.ts +6 -3
  466. package/dist/server.js +13 -4
  467. package/dist/styles.css +78 -12
  468. package/dist/tailwind-utilities.css +1 -1
  469. package/dist/ui/components/Button.style.css +19 -4
  470. package/dist/ui/components/CollapsibleSection.d.ts +17 -1
  471. package/dist/ui/components/CollapsibleSection.js +6 -2
  472. package/dist/ui/components/FilterChipGroup.d.ts +25 -1
  473. package/dist/ui/components/FilterChipGroup.js +21 -4
  474. package/dist/ui/components/HandMode.style.css +47 -0
  475. package/dist/ui/components/Layout.d.ts +9 -2
  476. package/dist/ui/components/Layout.js +1 -1
  477. package/dist/ui/components/ListingLayout.js +8 -8
  478. package/dist/ui/components/ListingLayout.style.css +8 -7
  479. package/dist/ui/components/RecordDetailModal.d.ts +10 -1
  480. package/dist/ui/components/RecordDetailModal.js +2 -2
  481. package/dist/ui/components/StickyToolbar.d.ts +3 -1
  482. package/dist/ui/components/StickyToolbar.js +62 -20
  483. package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
  484. package/dist/ui/components/bottom-chrome-slot.js +29 -0
  485. package/dist/ui/components/index.style.css +3 -0
  486. package/dist/ui/forms/FormShell.d.ts +43 -13
  487. package/dist/ui/forms/FormShell.js +22 -11
  488. package/dist/ui/forms/index.d.ts +1 -1
  489. package/dist/ui/index.d.ts +1 -1
  490. package/package.json +2 -1
  491. package/scripts/node-esm-loader.mjs +65 -0
  492. package/scripts/seed-cli-loader.mjs +6 -49
  493. package/scripts/seed-cli.mjs +1 -1
@@ -7,13 +7,13 @@
7
7
  * Also fixes a real field-name bug: the two original fixtures set `buyItNowPrice`
8
8
  * (a distinct, no-bids-yet-only BIN field) but AuctionDetailPageView.tsx reads
9
9
  * `buyNowPrice` — so neither auction's Buy Now button/price ever rendered.
10
- * WHAT: Exports 8 auction products with listingType:"auction" — 2 original fixtures
10
+ * WHAT: Exports 9 auction products with listingType:"auction" — 2 original fixtures
11
11
  * (field-bug fixed, specs/tags added) + 6 new: a Buy-Now-only auction (zero bids,
12
12
  * bidsHaveStarted:false), a reserve-not-met auction, a closed/won auction with a
13
13
  * winning bidder, and 3 more active auctions with varied end dates/bid activity.
14
14
  *
15
15
  * EXPORTS:
16
- * productsAuctionsSeedData — Array of 8 auction products with listingType:"auction"
16
+ * productsAuctionsSeedData — Array of 9 auction products with listingType:"auction"
17
17
  *
18
18
  * @tag domain:auctions,products
19
19
  * @tag layer:seed
@@ -48,8 +48,8 @@ const _rawProductsAuctionsSeedData = [
48
48
  slug: "auction-beyblade-original-dragoon-storm",
49
49
  title: "Beyblade Original — Dragoon Storm (Rare Sealed)",
50
50
  description: "Sealed, unopened Dragoon Storm from the original 1999-2003 series. A grail piece for original-generation collectors.",
51
- categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
52
- categoryNames: ["Beyblade Original", "Spinning Tops"],
51
+ categorySlugs: ["category-original-plastic-gen", "category-original-tops", "category-beyblade-original", "category-spinning-tops"],
52
+ categoryNames: ["Plastic Generation", "Original Tops", "Beyblade Original", "Spinning Tops"],
53
53
  brandSlug: "brand-beyblade",
54
54
  brand: "Beyblade",
55
55
  startingBid: 2999,
@@ -92,8 +92,8 @@ const _rawProductsAuctionsSeedData = [
92
92
  slug: "auction-beyblade-metal-lightning-l-drago",
93
93
  title: "Metal Fight Beyblade BB-99 Lightning L-Drago",
94
94
  description: "Lightning L-Drago 100HF/S, a highly sought-after Metal Fury era top in excellent condition.",
95
- categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
96
- categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
95
+ categorySlugs: ["category-metal-masters", "category-metal-tops", "category-beyblade-metal", "category-spinning-tops"],
96
+ categoryNames: ["Metal Masters", "Metal Fight Tops", "Beyblade Metal Fight", "Spinning Tops"],
97
97
  brandSlug: "brand-takara-tomy",
98
98
  brand: "Takara-Tomy",
99
99
  startingBid: 1999,
@@ -124,14 +124,17 @@ const _rawProductsAuctionsSeedData = [
124
124
  createdAt: new Date("2026-05-19"),
125
125
  updatedAt: new Date("2026-05-22"),
126
126
  },
127
- // --- Buy-Now-only: zero bids yet, BIN eligible per bidsHaveStarted:false gate ---
127
+ // --- The clean buyout fixture: BIN price well above the standing bid ---
128
+ // (It also happens to have zero bids, but that is no longer WHY Buy Now is
129
+ // offered — the `bidsHaveStarted` gate was dropped 2026-08-24. What matters
130
+ // now is `buyNowPrice > currentBid`, which holds here 1299 > 799.)
128
131
  {
129
132
  id: "auction-beyblade-x-shark-edge",
130
133
  slug: "auction-beyblade-x-shark-edge",
131
134
  title: "Beyblade X BX-04 Shark Edge (Buy It Now Available)",
132
- description: "Shark Edge 3-60GF straight from a fresh case pull. No bids yet — grab it instantly with Buy It Now before the clock runs, or start the bidding.",
133
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
134
- categoryNames: ["Beyblade X", "Spinning Tops"],
135
+ description: "Shark Edge 3-60GF straight from a fresh case pull. Grab it at the Buy It Now price before the clock runs, or start the bidding.",
136
+ categorySlugs: ["category-x-boosters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
137
+ categoryNames: ["Boosters", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
135
138
  brandSlug: "brand-takara-tomy",
136
139
  brand: "Takara-Tomy",
137
140
  startingBid: 799,
@@ -161,14 +164,54 @@ const _rawProductsAuctionsSeedData = [
161
164
  createdAt: new Date("2026-08-14"),
162
165
  updatedAt: new Date("2026-08-14"),
163
166
  },
167
+ // --- NEGATIVE CONTROL: bidding has passed the buy-now price ---
168
+ // Buy Now must be offered NOWHERE for this listing — not the button on the
169
+ // detail page, not the advertised price above it, not the Buyout chip on the
170
+ // card. Before the 2026-08-24 rework those three sites used three different
171
+ // conditions, so this state was unreachable as a test case.
172
+ {
173
+ id: "auction-beyblade-burst-xcalius-passed-bin",
174
+ slug: "auction-beyblade-burst-xcalius-passed-bin",
175
+ title: "Beyblade Burst Xcalius X2 (bidding passed Buy It Now)",
176
+ description: "Xcalius X2 attack type. The Buy It Now price has already been overtaken by live bidding, so only bidding remains.",
177
+ categorySlugs: ["category-burst-cho-z", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
178
+ categoryNames: ["Cho-Z", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
179
+ brandSlug: "brand-takara-tomy",
180
+ brand: "Takara-Tomy",
181
+ startingBid: 700,
182
+ buyNowPrice: 1400,
183
+ currentBid: 1650,
184
+ currency: "INR",
185
+ auctionEndDate: new Date(Date.now() + 4 * 24 * 60 * 60 * 1000),
186
+ bidCount: 7,
187
+ bidsHaveStarted: true,
188
+ isSold: false,
189
+ mainImage: seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-burst-xcalius-1-20260824/900/900"),
190
+ images: [
191
+ seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-burst-xcalius-1-20260824/900/900"),
192
+ seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-burst-xcalius-2-20260824/900/900"),
193
+ ],
194
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
195
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
196
+ tags: ["attack-type", "burst"],
197
+ specifications: [
198
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
199
+ { name: "Type", value: "Attack" },
200
+ { name: "Weight", value: "33.8", unit: "g" },
201
+ ],
202
+ storeId: "store-beyblade-arena",
203
+ storeName: "Beyblade Arena",
204
+ createdAt: new Date("2026-08-24"),
205
+ updatedAt: new Date("2026-08-24"),
206
+ },
164
207
  // --- Reserve not met: currentBid sits below reservePrice ---
165
208
  {
166
209
  id: "auction-beyblade-original-seaborg",
167
210
  slug: "auction-beyblade-original-seaborg",
168
211
  title: "Beyblade Original — Seaborg 2000 (Reserve Auction)",
169
212
  description: "Rare Seaborg 2000 defense-type top from the original series. Reserve price set by the seller — current bids haven't met it yet.",
170
- categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
171
- categoryNames: ["Beyblade Original", "Spinning Tops"],
213
+ categorySlugs: ["category-original-hms", "category-original-tops", "category-beyblade-original", "category-spinning-tops"],
214
+ categoryNames: ["Heavy Metal System", "Original Tops", "Beyblade Original", "Spinning Tops"],
172
215
  brandSlug: "brand-beyblade",
173
216
  brand: "Beyblade",
174
217
  startingBid: 1499,
@@ -204,8 +247,8 @@ const _rawProductsAuctionsSeedData = [
204
247
  slug: "auction-beyblade-metal-diablo-nemesis",
205
248
  title: "Metal Fight Beyblade BB-122 Diablo Nemesis (Ended — Sold)",
206
249
  description: "Diablo Nemesis XF, the final boss top of Metal Fight Beyblade Zero-G. Auction closed with a winning bidder.",
207
- categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
208
- categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
250
+ categorySlugs: ["category-metal-fury", "category-metal-tops", "category-beyblade-metal", "category-spinning-tops"],
251
+ categoryNames: ["Metal Fury", "Metal Fight Tops", "Beyblade Metal Fight", "Spinning Tops"],
209
252
  brandSlug: "brand-takara-tomy",
210
253
  brand: "Takara-Tomy",
211
254
  startingBid: 3499,
@@ -236,14 +279,55 @@ const _rawProductsAuctionsSeedData = [
236
279
  createdAt: new Date("2026-08-01"),
237
280
  updatedAt: new Date("2026-08-10"),
238
281
  },
282
+ // --- Closed by BUY NOW: ended early, a real buyout bid won it ---
283
+ // Nothing in the seed demonstrated a buyout before W2, so the only fixture
284
+ // for `sourceContext.path === "auction-buy-now"` would have been a dangling
285
+ // FK. A buyout is a REAL bid (`isBuyout: true`), so `bidCount` counts the
286
+ // competitive ladder AND the buyout that ended it — 3 + 1 here.
287
+ {
288
+ id: "auction-beyblade-burst-spriggan-requiem-bought-out",
289
+ slug: "auction-beyblade-burst-spriggan-requiem-bought-out",
290
+ title: "Beyblade Burst B-128 Spriggan Requiem (Ended — Bought Out)",
291
+ description: "Spriggan Requiem, the dual-spin legend of Burst Super Z. Bidding had reached ₹3,100 when a buyer took the ₹4,999 Buy Now price and ended the auction early.",
292
+ categorySlugs: ["category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
293
+ categoryNames: ["Burst Tops", "Beyblade Burst", "Spinning Tops"],
294
+ brandSlug: "brand-takara-tomy",
295
+ brand: "Takara-Tomy",
296
+ startingBid: 2499,
297
+ currentBid: 3100,
298
+ buyNowPrice: 4999,
299
+ currency: "INR",
300
+ auctionEndDate: new Date(Date.now() - 4 * 24 * 60 * 60 * 1000),
301
+ bidCount: 4,
302
+ bidsHaveStarted: true,
303
+ leadingBidderId: "user-seto-kaiba",
304
+ isSold: true,
305
+ mainImage: seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-burst-spriggan-requiem-1-20260810/900/900"),
306
+ images: [
307
+ seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-burst-spriggan-requiem-1-20260810/900/900"),
308
+ seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-burst-spriggan-requiem-2-20260810/900/900"),
309
+ ],
310
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
311
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
312
+ tags: ["balance-type", "dual-spin"],
313
+ specifications: [
314
+ { name: "Spin Direction", value: "Dual (Left / Right)" },
315
+ { name: "Type", value: "Balance" },
316
+ { name: "Weight", value: "51.2", unit: "g" },
317
+ ],
318
+ storeId: "store-beyblade-arena",
319
+ storeName: "Beyblade Arena",
320
+ createdAt: new Date("2026-08-01"),
321
+ updatedAt: new Date("2026-08-20"),
322
+ },
239
323
  // --- Additional active auctions, varied end dates + bid activity ---
240
324
  {
241
325
  id: "auction-beyblade-burst-cho-z-achilles",
242
326
  slug: "auction-beyblade-burst-cho-z-achilles",
243
327
  title: "Beyblade Burst B-100 Cho-Z Achilles",
244
328
  description: "Cho-Z Achilles.Ow.Zn', a Super Zeta stamina-type top from the Cho-Z generation, in excellent spinning condition.",
245
- categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
246
- categoryNames: ["Beyblade Burst", "Spinning Tops"],
329
+ categorySlugs: ["category-burst-superking", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
330
+ categoryNames: ["Superking", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
247
331
  brandSlug: "brand-beyblade",
248
332
  brand: "Beyblade",
249
333
  startingBid: 1199,
@@ -278,8 +362,8 @@ const _rawProductsAuctionsSeedData = [
278
362
  slug: "auction-beyblade-x-wizard-fafnir",
279
363
  title: "Beyblade X BX-06 Wizard Fafnir (Long-Running Auction)",
280
364
  description: "Wizard Fafnir 4-60F, one week left on the clock — a rare Beyblade X chase top with active bidding.",
281
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
282
- categoryNames: ["Beyblade X", "Spinning Tops"],
365
+ categorySlugs: ["category-x-starters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
366
+ categoryNames: ["Starter Sets", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
283
367
  brandSlug: "brand-takara-tomy",
284
368
  brand: "Takara-Tomy",
285
369
  startingBid: 999,
@@ -314,4 +398,40 @@ export const productsAuctionsSeedData = [
314
398
  ...a,
315
399
  listingType: PRODUCT_FIELDS.LISTING_TYPE_VALUES.AUCTION,
316
400
  })),
401
+ {
402
+ // Ended with NO winner — reserve never met, zero bids.
403
+ //
404
+ // Deliberately `isSold: false` with stock still on the document: this is
405
+ // the fixture that proves the auction branch reads `auctionEndDate`
406
+ // rather than falling through to the shared isSold/quantity checks. The
407
+ // other ended auction (diablo-nemesis) is sold AND ended, so it passes
408
+ // the base check and exercises nothing type-specific.
409
+ id: "auction-beyblade-burst-lord-spryzen-ended-unsold",
410
+ slug: "auction-beyblade-burst-lord-spryzen-ended-unsold",
411
+ title: "Beyblade Burst B-174 Lord Spryzen (Ended — Reserve Not Met)",
412
+ description: "Auction closed without meeting its reserve, so no winner was declared. Relisting soon.",
413
+ categorySlugs: ["category-burst-classic", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
414
+ categoryNames: ["Burst Classic", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
415
+ brandSlug: "brand-takara-tomy",
416
+ brand: "Takara-Tomy",
417
+ startingBid: 1999,
418
+ currentBid: 1999,
419
+ reservePrice: 3500,
420
+ currency: "INR",
421
+ auctionEndDate: new Date(Date.now() - 9 * 24 * 60 * 60 * 1000),
422
+ bidCount: 0,
423
+ bidsHaveStarted: false,
424
+ isSold: false,
425
+ mainImage: seedExtMedia("https://picsum.photos/seed/auction-image-lord-spryzen-ended-1-20260824/900/900"),
426
+ images: [
427
+ seedExtMedia("https://picsum.photos/seed/auction-image-lord-spryzen-ended-1-20260824/900/900"),
428
+ ],
429
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
430
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
431
+ tags: ["stamina-type"],
432
+ storeId: "store-beyblade-arena",
433
+ storeName: "Beyblade Arena",
434
+ createdAt: new Date("2026-08-10"),
435
+ updatedAt: new Date("2026-08-24"),
436
+ },
317
437
  ];
@@ -4,12 +4,12 @@
4
4
  * `contactMethod` ("both"), and always `acceptsShipping:false`/`negotiable:true` —
5
5
  * no variety to exercise the classifieds filter UI or the contact-method-specific
6
6
  * copy on the detail page (see CLAUDE.md seed-data blandness sweep, 2026-08-20).
7
- * WHAT: Exports 7 classified listings on Beyblade Arena — local meetups across 5 Indian
7
+ * WHAT: Exports 8 classified listings on Beyblade Arena — local meetups across 5 Indian
8
8
  * cities, covering all 3 contactMethod values and both true/false states of
9
9
  * acceptsShipping/negotiable.
10
10
  *
11
11
  * EXPORTS:
12
- * productsClassifiedsSeedData — Array of 7 Partial<ProductDocument> with listingType:"classified"
12
+ * productsClassifiedsSeedData — Array of 8 Partial<ProductDocument> with listingType:"classified"
13
13
  *
14
14
  * @tag domain:products,classifieds
15
15
  * @tag layer:seed
@@ -27,11 +27,17 @@ export const productsClassifiedsSeedData = [
27
27
  slug: "classified-beyblade-stadium-set",
28
28
  title: "Used Beyblade Stadium Set — Local Pickup Only",
29
29
  description: "Well-loved Beyblade stadium with 6 tops and 2 launchers, sold as-is. Meet up locally — price is negotiable.",
30
- categorySlugs: ["category-spinning-tops"],
31
- categoryNames: ["Spinning Tops"],
30
+ categorySlugs: ["category-storage-cases", "category-gear-storage", "category-battle-gear", "category-spinning-tops"],
31
+ categoryNames: ["Cases & Trays", "Storage & Care", "Battle Gear", "Spinning Tops"],
32
32
  brandSlug: "brand-beyblade",
33
33
  brand: "Beyblade",
34
34
  price: 1200,
35
+ // Matches `classified.negotiable: true` below — that flag is the
36
+ // DISPLAY hint ("₹650 (negotiable)"), this one is what actually
37
+ // turns the Make-an-Offer form on. The three non-negotiable
38
+ // classifieds deliberately leave both off.
39
+ allowOffers: true,
40
+ minOfferPercent: 70,
35
41
  currency: "INR",
36
42
  stockQuantity: 1,
37
43
  availableQuantity: 1,
@@ -67,8 +73,8 @@ export const productsClassifiedsSeedData = [
67
73
  slug: "classified-beyblade-burst-collection-bengaluru",
68
74
  title: "Beyblade Burst Collection (12 Tops) — Bengaluru",
69
75
  description: "Downsizing my Burst collection — 12 tops in good condition, fixed price, will also ship nationwide if you'd rather not meet up.",
70
- categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
71
- categoryNames: ["Beyblade Burst", "Spinning Tops"],
76
+ categorySlugs: ["category-burst-cho-z", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
77
+ categoryNames: ["Cho-Z", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
72
78
  brandSlug: "brand-beyblade",
73
79
  brand: "Beyblade",
74
80
  price: 4500,
@@ -107,11 +113,17 @@ export const productsClassifiedsSeedData = [
107
113
  slug: "classified-beyblade-x-starter-pune",
108
114
  title: "Beyblade X Starter Pack — Pune, Phone Contact Only",
109
115
  description: "Barely used Beyblade X starter pack, selling because I upgraded to a full set. Call or WhatsApp only, no chat.",
110
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
111
- categoryNames: ["Beyblade X", "Spinning Tops"],
116
+ categorySlugs: ["category-x-boosters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
117
+ categoryNames: ["Boosters", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
112
118
  brandSlug: "brand-takara-tomy",
113
119
  brand: "Takara-Tomy",
114
120
  price: 650,
121
+ // Matches `classified.negotiable: true` below — that flag is the
122
+ // DISPLAY hint ("₹650 (negotiable)"), this one is what actually
123
+ // turns the Make-an-Offer form on. The three non-negotiable
124
+ // classifieds deliberately leave both off.
125
+ allowOffers: true,
126
+ minOfferPercent: 70,
115
127
  currency: "INR",
116
128
  stockQuantity: 1,
117
129
  availableQuantity: 1,
@@ -144,8 +156,8 @@ export const productsClassifiedsSeedData = [
144
156
  slug: "classified-beyblade-metal-vintage-delhi",
145
157
  title: "Vintage Metal Fight Lot (5 Tops) — Delhi NCR",
146
158
  description: "A well-preserved 5-top Metal Fight lot from a long-time collector. Firm price, ships anywhere in India.",
147
- categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
148
- categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
159
+ categorySlugs: ["category-metal-fusion", "category-metal-tops", "category-beyblade-metal", "category-spinning-tops"],
160
+ categoryNames: ["Metal Fusion", "Metal Fight Tops", "Beyblade Metal Fight", "Spinning Tops"],
149
161
  brandSlug: "brand-takara-tomy",
150
162
  brand: "Takara-Tomy",
151
163
  price: 3200,
@@ -191,8 +203,8 @@ export const productsClassifiedsSeedData = [
191
203
  slug: "classified-beyblade-original-grail-chennai",
192
204
  title: "Original Series Grail Piece — Chennai, Meet Up Only",
193
205
  description: "A genuine original-series grail piece, only selling to a local buyer I can meet in person to verify authenticity together.",
194
- categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
195
- categoryNames: ["Beyblade Original", "Spinning Tops"],
206
+ categorySlugs: ["category-original-plastic-gen", "category-original-tops", "category-beyblade-original", "category-spinning-tops"],
207
+ categoryNames: ["Plastic Generation", "Original Tops", "Beyblade Original", "Spinning Tops"],
196
208
  brandSlug: "brand-beyblade",
197
209
  brand: "Beyblade",
198
210
  price: 8000,
@@ -231,11 +243,17 @@ export const productsClassifiedsSeedData = [
231
243
  slug: "classified-beyblade-x-tournament-kit-hyderabad",
232
244
  title: "Tournament-Ready Beyblade X Kit — Hyderabad",
233
245
  description: "Complete tournament-legal kit including 3 tops, stadium, and a scorecard pad from our last local meetup event.",
234
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
235
- categoryNames: ["Beyblade X", "Spinning Tops"],
246
+ categorySlugs: ["category-x-starters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
247
+ categoryNames: ["Starter Sets", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
236
248
  brandSlug: "brand-takara-tomy",
237
249
  brand: "Takara-Tomy",
238
250
  price: 2400,
251
+ // Matches `classified.negotiable: true` below — that flag is the
252
+ // DISPLAY hint ("₹650 (negotiable)"), this one is what actually
253
+ // turns the Make-an-Offer form on. The three non-negotiable
254
+ // classifieds deliberately leave both off.
255
+ allowOffers: true,
256
+ minOfferPercent: 70,
239
257
  currency: "INR",
240
258
  stockQuantity: 1,
241
259
  availableQuantity: 1,
@@ -271,11 +289,17 @@ export const productsClassifiedsSeedData = [
271
289
  slug: "classified-beyblade-burst-parts-mumbai",
272
290
  title: "Spare Burst Parts Bundle — Mumbai, Ships Too",
273
291
  description: "Assorted spare Burst layers, discs, and drivers cleared out from my parts box. Happy to meet locally or ship.",
274
- categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
275
- categoryNames: ["Beyblade Burst", "Spinning Tops"],
292
+ categorySlugs: ["category-burst-superking", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
293
+ categoryNames: ["Superking", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
276
294
  brandSlug: "brand-beyblade",
277
295
  brand: "Beyblade",
278
296
  price: 450,
297
+ // Matches `classified.negotiable: true` below — that flag is the
298
+ // DISPLAY hint ("₹650 (negotiable)"), this one is what actually
299
+ // turns the Make-an-Offer form on. The three non-negotiable
300
+ // classifieds deliberately leave both off.
301
+ allowOffers: true,
302
+ minOfferPercent: 70,
279
303
  currency: "INR",
280
304
  stockQuantity: 1,
281
305
  availableQuantity: 1,
@@ -303,4 +327,44 @@ export const productsClassifiedsSeedData = [
303
327
  updatedAt: new Date("2026-08-18"),
304
328
  searchTokens: buildSearchTokens("Spare Burst Parts Bundle — Mumbai, Ships Too", "Assorted spare Burst layers, discs, and drivers.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["classified", "spare-parts"]),
305
329
  },
330
+ {
331
+ // Sold classified. Keeps `meetupArea.city` populated so the City facet
332
+ // still has a row to match inside the Sold scope.
333
+ id: "classified-beyblade-metal-galaxy-pegasus-sold-mumbai",
334
+ slug: "classified-beyblade-metal-galaxy-pegasus-sold-mumbai",
335
+ title: "Galaxy Pegasus W105R2F — Sold (Mumbai)",
336
+ description: "Vintage Metal Fight Galaxy Pegasus, sold to a local collector. Listing kept up for reference.",
337
+ categorySlugs: ["category-metal-masters", "category-metal-tops", "category-beyblade-metal", "category-spinning-tops"],
338
+ categoryNames: ["Metal Masters", "Metal Fight Tops", "Beyblade Metal Fight", "Spinning Tops"],
339
+ brandSlug: "brand-beyblade",
340
+ brand: "Beyblade",
341
+ price: 2200,
342
+ currency: "INR",
343
+ stockQuantity: 0,
344
+ availableQuantity: 0,
345
+ isSold: true,
346
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-galaxy-pegasus-sold-1-20260824/900/900"),
347
+ images: [
348
+ seedExtMedia("https://picsum.photos/seed/classified-image-galaxy-pegasus-sold-1-20260824/900/900"),
349
+ ],
350
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
351
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
352
+ listingType: "classified",
353
+ storeId: "store-beyblade-arena",
354
+ storeName: "Beyblade Arena",
355
+ classified: {
356
+ meetupArea: { city: "Mumbai", locality: "Dadar", pincode: "400014" },
357
+ contactMethod: "chat",
358
+ acceptsShipping: false,
359
+ negotiable: false,
360
+ },
361
+ customFields: [],
362
+ customSections: [],
363
+ featured: false,
364
+ isPromoted: false,
365
+ isOnSale: false,
366
+ tags: ["vintage", "sold"],
367
+ createdAt: new Date("2026-08-24"),
368
+ updatedAt: new Date("2026-08-24"),
369
+ },
306
370
  ];
@@ -4,11 +4,11 @@
4
4
  * `codesAvailable === codePoolSize` (i.e. no fixture ever showed a partially-redeemed
5
5
  * or sold-out pool, and `manual-email` delivery was never exercised at all) — see
6
6
  * CLAUDE.md seed-data blandness sweep, 2026-08-20 session.
7
- * WHAT: Exports 7 digital-code listings on Beyblade Arena — mixed auto-claim/manual-email
7
+ * WHAT: Exports 8 digital-code listings on Beyblade Arena — mixed auto-claim/manual-email
8
8
  * delivery, partially-redeemed and fully-sold-out pools, and expiring codes.
9
9
  *
10
10
  * EXPORTS:
11
- * productsDigitalCodesSeedData — Array of 7 Partial<ProductDocument> with listingType:"digital-code"
11
+ * productsDigitalCodesSeedData — Array of 8 Partial<ProductDocument> with listingType:"digital-code"
12
12
  *
13
13
  * @tag domain:products,digital-codes
14
14
  * @tag layer:seed
@@ -26,8 +26,8 @@ export const productsDigitalCodesSeedData = [
26
26
  slug: "digitalcode-beyblade-x-app-starter-pack",
27
27
  title: "Beyblade X App — Starter Pack Code",
28
28
  description: "Digital redemption code for the Beyblade X companion app's Starter Pack — instantly unlocks 5 exclusive digital tops.",
29
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
30
- categoryNames: ["Beyblade X", "Spinning Tops"],
29
+ categorySlugs: ["category-x-boosters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
30
+ categoryNames: ["Boosters", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
31
31
  brandSlug: "brand-takara-tomy",
32
32
  brand: "Takara-Tomy",
33
33
  price: 199,
@@ -66,8 +66,8 @@ export const productsDigitalCodesSeedData = [
66
66
  slug: "digitalcode-beyblade-x-app-legendary-pack",
67
67
  title: "Beyblade X App — Legendary Pack Code (Partially Claimed)",
68
68
  description: "Unlocks 3 legendary digital tops in the companion app. Popular pack — most of the batch has already been claimed.",
69
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
70
- categoryNames: ["Beyblade X", "Spinning Tops"],
69
+ categorySlugs: ["category-x-starters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
70
+ categoryNames: ["Starter Sets", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
71
71
  brandSlug: "brand-takara-tomy",
72
72
  brand: "Takara-Tomy",
73
73
  price: 349,
@@ -104,15 +104,20 @@ export const productsDigitalCodesSeedData = [
104
104
  slug: "digitalcode-beyblade-burst-app-sold-out",
105
105
  title: "Beyblade Burst App — Anniversary Pack Code (Sold Out)",
106
106
  description: "Limited-run anniversary code pack for the Beyblade Burst app — every code in this batch has been claimed.",
107
- categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
108
- categoryNames: ["Beyblade Burst", "Spinning Tops"],
107
+ categorySlugs: ["category-burst-classic", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
108
+ categoryNames: ["Burst Classic", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
109
109
  brandSlug: "brand-beyblade",
110
110
  brand: "Beyblade",
111
111
  price: 299,
112
112
  currency: "INR",
113
- stockQuantity: 15,
113
+ // `stockQuantity: 15` / `isSold: false` until 2026-08-24, contradicting
114
+ // both `availableQuantity: 0` and the drained `codesAvailable` below.
115
+ // digital-code's own config comment claimed stockQuantity mirrors the pool
116
+ // count; this fixture is the proof it does not, which is why the per-type
117
+ // predicate reads the nested pool counter rather than trusting the mirror.
118
+ stockQuantity: 0,
114
119
  availableQuantity: 0,
115
- isSold: false,
120
+ isSold: true,
116
121
  mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-burst-sold-out-1-20260810/900/900"),
117
122
  images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-burst-sold-out-1-20260810/900/900")],
118
123
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
@@ -141,8 +146,8 @@ export const productsDigitalCodesSeedData = [
141
146
  slug: "digitalcode-beyblade-x-manual-tournament-pass",
142
147
  title: "Beyblade X Regional Tournament — Digital Entry Pass",
143
148
  description: "Digital entry pass for the next regional tournament, emailed manually by the organizer within 24 hours of purchase.",
144
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
145
- categoryNames: ["Beyblade X", "Spinning Tops"],
149
+ categorySlugs: ["category-x-boosters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
150
+ categoryNames: ["Boosters", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
146
151
  brandSlug: "brand-takara-tomy",
147
152
  brand: "Takara-Tomy",
148
153
  price: 499,
@@ -182,8 +187,8 @@ export const productsDigitalCodesSeedData = [
182
187
  slug: "digitalcode-beyblade-metal-app-classic-pack",
183
188
  title: "Beyblade Metal Fight App — Classic Pack Code",
184
189
  description: "Unlocks the Metal Fight classic-era top roster in the companion app — Storm Pegasus, Lightning L-Drago, and more.",
185
- categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
186
- categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
190
+ categorySlugs: ["category-metal-fury", "category-metal-tops", "category-beyblade-metal", "category-spinning-tops"],
191
+ categoryNames: ["Metal Fury", "Metal Fight Tops", "Beyblade Metal Fight", "Spinning Tops"],
187
192
  brandSlug: "brand-takara-tomy",
188
193
  brand: "Takara-Tomy",
189
194
  price: 249,
@@ -219,8 +224,8 @@ export const productsDigitalCodesSeedData = [
219
224
  slug: "digitalcode-beyblade-burst-app-avatar-skins",
220
225
  title: "Beyblade Burst App — Avatar Skin Bundle Code",
221
226
  description: "Cosmetic-only code bundle — unlocks 8 exclusive player avatar skins in the Beyblade Burst app, no gameplay advantage.",
222
- categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
223
- categoryNames: ["Beyblade Burst", "Spinning Tops"],
227
+ categorySlugs: ["category-burst-cho-z", "category-burst-tops", "category-beyblade-burst", "category-spinning-tops"],
228
+ categoryNames: ["Cho-Z", "Burst Tops", "Beyblade Burst", "Spinning Tops"],
224
229
  brandSlug: "brand-beyblade",
225
230
  brand: "Beyblade",
226
231
  price: 149,
@@ -256,8 +261,8 @@ export const productsDigitalCodesSeedData = [
256
261
  slug: "digitalcode-beyblade-x-manual-coaching-session",
257
262
  title: "1-on-1 Beyblade X Coaching Session — Digital Booking Code",
258
263
  description: "Redeem this code for a 30-minute 1-on-1 video coaching session with a tournament-ranked Beyblade X player. Booking link emailed manually.",
259
- categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
260
- categoryNames: ["Beyblade X", "Spinning Tops"],
264
+ categorySlugs: ["category-x-starters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
265
+ categoryNames: ["Starter Sets", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
261
266
  brandSlug: "brand-takara-tomy",
262
267
  brand: "Takara-Tomy",
263
268
  price: 799,
@@ -295,4 +300,47 @@ export const productsDigitalCodesSeedData = [
295
300
  updatedAt: new Date("2026-08-18"),
296
301
  searchTokens: buildSearchTokens("1-on-1 Beyblade X Coaching Session — Digital Booking Code", "30-minute 1-on-1 video coaching session, booking link emailed manually.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["digital-code", "coaching"]),
297
302
  },
303
+ {
304
+ // Pool drained, but `stockQuantity: 5` and `isSold: false`.
305
+ //
306
+ // The NESTED-field fixture: the only row that fails purely on
307
+ // `digitalCode.codesAvailable`. The old related-items predicate read
308
+ // `row.codesAvailable` at the TOP level, which is undefined on every
309
+ // document, so its digital-code branch had never once fired. Without a
310
+ // fixture in this exact shape that bug is untestable.
311
+ id: "digitalcode-beyblade-x-app-launch-codes-depleted",
312
+ slug: "digitalcode-beyblade-x-app-launch-codes-depleted",
313
+ title: "Beyblade X App — Launch Bonus Code (Pool Empty)",
314
+ description: "Launch-bonus codes for the Beyblade X app. Every code in the pool has been claimed; restock pending.",
315
+ categorySlugs: ["category-x-boosters", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
316
+ categoryNames: ["Boosters", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
317
+ brandSlug: "brand-takara-tomy",
318
+ brand: "Takara-Tomy",
319
+ price: 399,
320
+ currency: "INR",
321
+ stockQuantity: 5,
322
+ availableQuantity: 5,
323
+ isSold: false,
324
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-depleted-1-20260824/900/900"),
325
+ images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-depleted-1-20260824/900/900")],
326
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
327
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
328
+ listingType: "digital-code",
329
+ storeId: "store-beyblade-arena",
330
+ storeName: "Beyblade Arena",
331
+ digitalCode: {
332
+ codeDeliveryMethod: "auto-claim",
333
+ codePoolSize: 30,
334
+ codesAvailable: 0,
335
+ redemptionInstructions: "Open the Beyblade X app, tap Settings → Redeem, and paste your code.",
336
+ },
337
+ customFields: [],
338
+ customSections: [],
339
+ featured: false,
340
+ isPromoted: false,
341
+ isOnSale: false,
342
+ tags: ["digital-code"],
343
+ createdAt: new Date("2026-08-24"),
344
+ updatedAt: new Date("2026-08-24"),
345
+ },
298
346
  ];