@mohasinac/appkit 4.53.0 → 4.53.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/scaffolds/AppShell.js +1 -1
  3. package/dist/_internal/server/features/auctions/og.d.ts +3 -1
  4. package/dist/_internal/server/features/auctions/og.js +3 -1
  5. package/dist/_internal/server/features/bundles/actions.js +1 -1
  6. package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
  7. package/dist/_internal/server/features/business-documents/download.js +91 -0
  8. package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
  9. package/dist/_internal/server/features/categories/adapters.js +10 -0
  10. package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
  11. package/dist/_internal/server/features/checkout/actions.js +106 -12
  12. package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
  13. package/dist/_internal/server/features/checkout/data.d.ts +22 -0
  14. package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
  15. package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
  16. package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
  17. package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
  18. package/dist/_internal/server/features/classified/metadata.js +1 -1
  19. package/dist/_internal/server/features/classified/og.d.ts +3 -1
  20. package/dist/_internal/server/features/classified/og.js +3 -1
  21. package/dist/_internal/server/features/digital-code/metadata.js +1 -1
  22. package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
  23. package/dist/_internal/server/features/digital-code/og.js +3 -1
  24. package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
  25. package/dist/_internal/server/features/digital-code/pool.js +19 -4
  26. package/dist/_internal/server/features/live/metadata.js +1 -1
  27. package/dist/_internal/server/features/live/og.d.ts +3 -1
  28. package/dist/_internal/server/features/live/og.js +3 -1
  29. package/dist/_internal/server/features/messages/actions.js +1 -1
  30. package/dist/_internal/server/features/parts/og.js +1 -1
  31. package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
  32. package/dist/_internal/server/features/pre-orders/og.js +3 -1
  33. package/dist/_internal/server/features/price-index/search.d.ts +18 -0
  34. package/dist/_internal/server/features/price-index/search.js +47 -7
  35. package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
  36. package/dist/_internal/server/features/prize-draws/og.js +3 -1
  37. package/dist/_internal/server/features/products/group-members.d.ts +26 -0
  38. package/dist/_internal/server/features/products/group-members.js +7 -1
  39. package/dist/_internal/server/features/products/og.d.ts +3 -1
  40. package/dist/_internal/server/features/products/og.js +3 -1
  41. package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
  42. package/dist/_internal/server/features/search/scoped-sources.js +252 -0
  43. package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
  44. package/dist/_internal/server/features/search/search-everything.js +70 -20
  45. package/dist/_internal/server/features/seo/sitemap.js +6 -0
  46. package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
  47. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +11 -0
  48. package/dist/_internal/server/features/sticker-trace/adapters.js +1 -0
  49. package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
  50. package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
  51. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +3 -1
  52. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +32 -0
  53. package/dist/_internal/server/features/sticker-trace/storage.d.ts +20 -1
  54. package/dist/_internal/server/features/sticker-trace/storage.js +20 -1
  55. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  56. package/dist/_internal/server/features/stores/adapters.js +16 -0
  57. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  58. package/dist/_internal/server/features/stores/index.js +1 -0
  59. package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
  60. package/dist/_internal/server/features/stores/tabs.js +122 -0
  61. package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
  62. package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
  63. package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
  64. package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
  65. package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
  66. package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
  67. package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
  68. package/dist/_internal/shared/checkout/rules/index.js +9 -0
  69. package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
  70. package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
  71. package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
  72. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
  73. package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
  74. package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
  75. package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
  76. package/dist/_internal/shared/config/schema.d.ts +122 -0
  77. package/dist/_internal/shared/features/cart/schema.js +3 -2
  78. package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
  79. package/dist/_internal/shared/features/products/group-rules.js +142 -0
  80. package/dist/_internal/shared/listing-types/_registry.d.ts +24 -0
  81. package/dist/_internal/shared/listing-types/_registry.js +39 -1
  82. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  83. package/dist/_internal/shared/listing-types/art/config.js +2 -0
  84. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  85. package/dist/_internal/shared/listing-types/auction/config.js +2 -0
  86. package/dist/_internal/shared/listing-types/availability.js +48 -0
  87. package/dist/_internal/shared/listing-types/capabilities.js +19 -0
  88. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  89. package/dist/_internal/shared/listing-types/classified/config.js +2 -0
  90. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  91. package/dist/_internal/shared/listing-types/digital-code/config.js +2 -0
  92. package/dist/_internal/shared/listing-types/feature-flags.js +1 -0
  93. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  94. package/dist/_internal/shared/listing-types/live/config.js +2 -0
  95. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  96. package/dist/_internal/shared/listing-types/pre-order/config.js +2 -0
  97. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  98. package/dist/_internal/shared/listing-types/prize-draw/config.js +2 -0
  99. package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
  100. package/dist/_internal/shared/listing-types/spares/config.js +60 -0
  101. package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
  102. package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
  103. package/dist/_internal/shared/listing-types/spares/og.js +1 -0
  104. package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
  105. package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
  106. package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
  107. package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
  108. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  109. package/dist/_internal/shared/listing-types/standard/config.js +2 -0
  110. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  111. package/dist/_internal/shared/listing-types/stickers/config.js +2 -0
  112. package/dist/_internal/shared/search/match.d.ts +11 -0
  113. package/dist/_internal/shared/search/match.js +2 -1
  114. package/dist/_internal/shared/search/to-groups.d.ts +52 -0
  115. package/dist/_internal/shared/search/to-groups.js +141 -0
  116. package/dist/client.d.ts +8 -2
  117. package/dist/client.js +4 -1
  118. package/dist/constants/api-endpoints.d.ts +39 -15
  119. package/dist/constants/api-endpoints.js +28 -5
  120. package/dist/constants/cache-invalidation.js +3 -1
  121. package/dist/constants/field-names.d.ts +6 -0
  122. package/dist/constants/field-names.js +6 -0
  123. package/dist/features/about/components/PolicyPageView.d.ts +22 -2
  124. package/dist/features/about/components/PolicyPageView.js +14 -2
  125. package/dist/features/about/components/PublicProfileView.js +2 -1
  126. package/dist/features/about/components/ShippingPolicyView.js +42 -2
  127. package/dist/features/account/components/NotificationBell.js +1 -1
  128. package/dist/features/account/hooks/useProfileStats.js +5 -1
  129. package/dist/features/addresses/repository/addresses.repository.d.ts +16 -0
  130. package/dist/features/addresses/repository/addresses.repository.js +21 -0
  131. package/dist/features/admin/actions/admin-actions.js +16 -1
  132. package/dist/features/admin/components/AdminCategoryEditorView.js +19 -2
  133. package/dist/features/admin/components/AdminNavigationView.js +1 -1
  134. package/dist/features/admin/components/AdminPageHeader.js +1 -1
  135. package/dist/features/admin/components/AdminProductEditorView.js +17 -2
  136. package/dist/features/admin/components/AdminSidebar.js +1 -1
  137. package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
  138. package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
  139. package/dist/features/admin/components/AdminSparesView.js +30 -0
  140. package/dist/features/admin/components/AdminUsersView.js +9 -7
  141. package/dist/features/admin/components/index.d.ts +2 -0
  142. package/dist/features/admin/components/index.js +1 -0
  143. package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
  144. package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
  145. package/dist/features/admin/constants/filter-tabs.js +1 -0
  146. package/dist/features/admin/schemas/firestore.d.ts +26 -2
  147. package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
  148. package/dist/features/auth/repository/user.repository.d.ts +13 -0
  149. package/dist/features/auth/repository/user.repository.js +28 -0
  150. package/dist/features/auth/schemas/firestore.d.ts +2 -0
  151. package/dist/features/auth/schemas/firestore.js +2 -0
  152. package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
  153. package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
  154. package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
  155. package/dist/features/business-documents/schemas/firestore.js +75 -0
  156. package/dist/features/cart/actions/cart-actions.js +83 -6
  157. package/dist/features/cart/repository/cart.repository.js +32 -4
  158. package/dist/features/cart/schemas/firestore.d.ts +20 -0
  159. package/dist/features/cart/schemas/index.d.ts +2 -2
  160. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
  161. package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
  162. package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
  163. package/dist/features/categories/components/BrandDetailPageView.js +19 -3
  164. package/dist/features/categories/components/BrandDetailTabs.js +10 -0
  165. package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
  166. package/dist/features/categories/components/CategoryDetailPageView.js +141 -14
  167. package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
  168. package/dist/features/categories/components/CategoryGrid.js +10 -1
  169. package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
  170. package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
  171. package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
  172. package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
  173. package/dist/features/categories/constants/category-tabs.d.ts +20 -25
  174. package/dist/features/categories/constants/category-tabs.js +22 -39
  175. package/dist/features/categories/repository/categories.repository.d.ts +12 -0
  176. package/dist/features/categories/repository/categories.repository.js +20 -0
  177. package/dist/features/categories/schemas/firestore.d.ts +22 -1
  178. package/dist/features/categories/schemas/firestore.js +10 -0
  179. package/dist/features/categories/schemas/index.d.ts +6 -0
  180. package/dist/features/categories/schemas/index.js +2 -0
  181. package/dist/features/categories/types/index.d.ts +8 -0
  182. package/dist/features/categories/utils/taxonomy-visual.d.ts +16 -3
  183. package/dist/features/categories/utils/taxonomy-visual.js +26 -10
  184. package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
  185. package/dist/features/contact/components/ContactPageView.d.ts +33 -1
  186. package/dist/features/contact/components/ContactPageView.js +58 -28
  187. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
  188. package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
  189. package/dist/features/grouped/schemas/firestore.d.ts +5 -0
  190. package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
  191. package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
  192. package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
  193. package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
  194. package/dist/features/homepage/components/HowItWorksSection.js +4 -4
  195. package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
  196. package/dist/features/homepage/components/PromoGrid.js +12 -3
  197. package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
  198. package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
  199. package/dist/features/homepage/components/index.d.ts +0 -20
  200. package/dist/features/homepage/components/index.js +0 -11
  201. package/dist/features/homepage/index.d.ts +0 -2
  202. package/dist/features/homepage/index.js +0 -2
  203. package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
  204. package/dist/features/homepage/lib/section-renderer.js +202 -58
  205. package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
  206. package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
  207. package/dist/features/homepage/schemas/firestore.d.ts +106 -3
  208. package/dist/features/homepage/schemas/firestore.js +32 -2
  209. package/dist/features/homepage/schemas/index.d.ts +36 -7
  210. package/dist/features/homepage/schemas/index.js +39 -27
  211. package/dist/features/homepage/server.d.ts +0 -3
  212. package/dist/features/homepage/server.js +0 -3
  213. package/dist/features/homepage/types/index.d.ts +0 -47
  214. package/dist/features/homepage/types/index.js +49 -0
  215. package/dist/features/layout/AppLayoutShell.js +1 -1
  216. package/dist/features/layout/BottomNavItem.js +1 -1
  217. package/dist/features/layout/BottomSheet.js +1 -1
  218. package/dist/features/layout/TitleBarLayout.js +1 -1
  219. package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
  220. package/dist/features/media/hooks/useMedia.js +17 -0
  221. package/dist/features/media/repository/media-assets.repository.d.ts +46 -0
  222. package/dist/features/media/repository/media-assets.repository.js +31 -0
  223. package/dist/features/media/trust-signals.d.ts +85 -0
  224. package/dist/features/media/trust-signals.js +126 -0
  225. package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
  226. package/dist/features/parts/components/PartDetailPageView.js +2 -2
  227. package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
  228. package/dist/features/parts/components/PartsIndexPageView.js +2 -2
  229. package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
  230. package/dist/features/parts/components/PartsSearchBox.js +57 -0
  231. package/dist/features/parts/schemas/firestore.d.ts +149 -3
  232. package/dist/features/parts/schemas/firestore.js +184 -0
  233. package/dist/features/payments/repository/payout.repository.d.ts +15 -0
  234. package/dist/features/payments/repository/payout.repository.js +21 -0
  235. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
  236. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
  237. package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
  238. package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
  239. package/dist/features/products/components/CompareOverlay.d.ts +18 -1
  240. package/dist/features/products/components/CompareOverlay.js +21 -2
  241. package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
  242. package/dist/features/products/components/CustomSectionTabContent.js +29 -3
  243. package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
  244. package/dist/features/products/components/GroupMemberPicker.js +46 -8
  245. package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
  246. package/dist/features/products/components/GroupSettingsPanel.js +91 -3
  247. package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
  248. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
  249. package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
  250. package/dist/features/products/components/ProductDetailPageView.js +74 -15
  251. package/dist/features/products/components/ProductForm.d.ts +13 -1
  252. package/dist/features/products/components/ProductForm.js +16 -2
  253. package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
  254. package/dist/features/products/components/ProductsIndexListing.js +3 -3
  255. package/dist/features/products/components/ShowGroupSection.js +15 -2
  256. package/dist/features/products/components/SparesListView.d.ts +7 -0
  257. package/dist/features/products/components/SparesListView.js +39 -0
  258. package/dist/features/products/constants/action-defs.d.ts +1 -0
  259. package/dist/features/products/constants/action-defs.js +1 -0
  260. package/dist/features/products/repository/products.repository.d.ts +98 -0
  261. package/dist/features/products/repository/products.repository.js +235 -17
  262. package/dist/features/products/schemas/firestore.d.ts +97 -4
  263. package/dist/features/products/schemas/firestore.js +104 -0
  264. package/dist/features/products/schemas/index.d.ts +10 -19
  265. package/dist/features/products/schemas/index.js +23 -6
  266. package/dist/features/products/types/index.d.ts +45 -1
  267. package/dist/features/products/utils/group-member-image.d.ts +39 -0
  268. package/dist/features/products/utils/group-member-image.js +3 -0
  269. package/dist/features/products/utils/listing-badge-variant.js +4 -0
  270. package/dist/features/reviews/components/ReviewsList.js +1 -1
  271. package/dist/features/scams/components/ScamProfileView.js +1 -1
  272. package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
  273. package/dist/features/search/components/EntityTypeahead.js +92 -0
  274. package/dist/features/search/components/Search.d.ts +12 -1
  275. package/dist/features/search/components/Search.js +47 -3
  276. package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
  277. package/dist/features/search/components/SearchFacetRail.js +92 -0
  278. package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
  279. package/dist/features/search/components/SearchResultsClient.js +103 -0
  280. package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
  281. package/dist/features/search/components/SearchResultsPageView.js +2 -2
  282. package/dist/features/search/components/index.d.ts +0 -6
  283. package/dist/features/search/components/index.js +0 -3
  284. package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
  285. package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
  286. package/dist/features/search/hooks/useScopedSearch.js +114 -0
  287. package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
  288. package/dist/features/search/hooks/useSiteSearch.js +149 -0
  289. package/dist/features/search/index.d.ts +0 -4
  290. package/dist/features/search/index.js +0 -4
  291. package/dist/features/search/manifest.d.ts +12 -0
  292. package/dist/features/search/manifest.js +17 -2
  293. package/dist/features/search/server.d.ts +0 -3
  294. package/dist/features/search/server.js +0 -3
  295. package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
  296. package/dist/features/seller/components/SellerListingTypeView.js +20 -0
  297. package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -14
  298. package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
  299. package/dist/features/seller/components/SellerProductShell.js +2 -1
  300. package/dist/features/seller/components/SellerSidebar.js +1 -1
  301. package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
  302. package/dist/features/seller/components/SellerSparesView.js +6 -0
  303. package/dist/features/seller/components/index.d.ts +2 -0
  304. package/dist/features/seller/components/index.js +1 -0
  305. package/dist/features/shell/CommandPalette.js +1 -1
  306. package/dist/features/sticker-trace/schemas/firestore.d.ts +19 -0
  307. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  308. package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
  309. package/dist/features/stores/components/StoreHeader.js +1 -2
  310. package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
  311. package/dist/features/stores/components/StoreSparesPageView.js +48 -0
  312. package/dist/features/stores/schemas/firestore.d.ts +19 -0
  313. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
  314. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
  315. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  316. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +280 -45
  317. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
  318. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
  319. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
  320. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
  321. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
  322. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
  323. package/dist/features/tester/seed-data/authored/index.js +16 -0
  324. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
  325. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
  326. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
  327. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
  328. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
  329. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
  330. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +5 -4
  331. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +372 -18
  332. package/dist/index.d.ts +17 -57
  333. package/dist/index.js +35 -96
  334. package/dist/next/routing/route-map.d.ts +42 -1
  335. package/dist/next/routing/route-map.js +45 -0
  336. package/dist/providers/db-firebase/base.repository.d.ts +22 -0
  337. package/dist/providers/db-firebase/base.repository.js +36 -0
  338. package/dist/schemas/registry.d.ts +15 -6
  339. package/dist/security/blind-index-tokens.d.ts +54 -0
  340. package/dist/security/blind-index-tokens.js +152 -0
  341. package/dist/security/index.d.ts +1 -1
  342. package/dist/security/index.js +1 -1
  343. package/dist/security/settings-encryption.d.ts +35 -0
  344. package/dist/security/settings-encryption.js +91 -0
  345. package/dist/seed/_helpers/brand-rows.js +38 -14
  346. package/dist/seed/_helpers/category-forest.js +73 -7
  347. package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
  348. package/dist/seed/_helpers/category-images-generated.js +81 -6
  349. package/dist/seed/_helpers/category-models.d.ts +1 -1
  350. package/dist/seed/_helpers/category-models.js +7 -1
  351. package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
  352. package/dist/seed/_helpers/category-parts.d.ts +1 -1
  353. package/dist/seed/_helpers/category-parts.js +50 -2
  354. package/dist/seed/_helpers/character-features.d.ts +1 -1
  355. package/dist/seed/_helpers/character-features.js +2 -1
  356. package/dist/seed/_helpers/franchise-rows.js +10 -2
  357. package/dist/seed/_helpers/media.d.ts +47 -0
  358. package/dist/seed/_helpers/media.js +34 -0
  359. package/dist/seed/authenticity-knowledge-seed-data.d.ts +49 -5
  360. package/dist/seed/authenticity-knowledge-seed-data.js +10001 -549
  361. package/dist/seed/categories-seed-data.js +124 -20
  362. package/dist/seed/grouped-listings-seed-data.js +16 -0
  363. package/dist/seed/homepage-sections-seed-data.js +94 -5
  364. package/dist/seed/index.d.ts +2 -3
  365. package/dist/seed/index.js +2 -2
  366. package/dist/seed/manifest.js +3 -0
  367. package/dist/seed/media-assets-seed-data.d.ts +1 -1
  368. package/dist/seed/media-assets-seed-data.js +746 -196
  369. package/dist/seed/model-composition-seed-data.js +122 -6
  370. package/dist/seed/part-glossary-seed-data.d.ts +1 -1
  371. package/dist/seed/part-glossary-seed-data.js +37219 -463
  372. package/dist/seed/products-art-seed-data.js +7 -18
  373. package/dist/seed/products-auctions-seed-data.js +56 -47
  374. package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
  375. package/dist/seed/products-beyblade-x-seed-data.js +441 -0
  376. package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
  377. package/dist/seed/products-catalogue-seed-data.js +1500 -1240
  378. package/dist/seed/products-classifieds-seed-data.js +9 -27
  379. package/dist/seed/products-digital-codes-seed-data.js +9 -18
  380. package/dist/seed/products-live-items-seed-data.js +5 -13
  381. package/dist/seed/products-preorders-seed-data.js +67 -33
  382. package/dist/seed/products-prize-draws-seed-data.js +8 -17
  383. package/dist/seed/products-spares-seed-data.d.ts +2 -0
  384. package/dist/seed/products-spares-seed-data.js +368 -0
  385. package/dist/seed/products-standard-seed-data.js +39 -126
  386. package/dist/seed/products-stickers-seed-data.js +59 -15
  387. package/dist/seed/site-settings-seed-data.js +8 -0
  388. package/dist/seo/json-ld.d.ts +25 -0
  389. package/dist/seo/json-ld.js +28 -0
  390. package/dist/server-entry.d.ts +3 -1
  391. package/dist/server-entry.js +2 -2
  392. package/dist/server.d.ts +9 -9
  393. package/dist/server.js +27 -25
  394. package/dist/styles.css +202 -1
  395. package/dist/tailwind-input.css +31 -17
  396. package/dist/tailwind-utilities.css +1 -1
  397. package/dist/ui/components/Accordion.js +1 -1
  398. package/dist/ui/components/Breadcrumb.js +1 -1
  399. package/dist/ui/components/DetailPageGallery.js +0 -2
  400. package/dist/ui/components/DetailPageHero.js +0 -1
  401. package/dist/ui/components/DetailPageTabs.js +1 -1
  402. package/dist/ui/components/Divider.js +3 -3
  403. package/dist/ui/components/GatedPrice.js +5 -1
  404. package/dist/ui/components/HorizontalScroller.js +1 -1
  405. package/dist/ui/components/ListingLayout.js +3 -3
  406. package/dist/ui/components/MediaTabs.style.css +81 -0
  407. package/dist/ui/components/Pagination.js +1 -1
  408. package/dist/ui/components/PendingValue.d.ts +45 -0
  409. package/dist/ui/components/PendingValue.js +7 -0
  410. package/dist/ui/components/Radio.style.css +119 -0
  411. package/dist/ui/components/RatingDisplay.js +2 -2
  412. package/dist/ui/components/SettingsSection.js +0 -2
  413. package/dist/ui/components/SiteLogo.js +3 -0
  414. package/dist/ui/components/SiteMark.js +3 -0
  415. package/dist/ui/components/SortDropdown.js +1 -1
  416. package/dist/ui/components/SpecTable.d.ts +58 -0
  417. package/dist/ui/components/SpecTable.js +8 -0
  418. package/dist/ui/components/StarRating.js +1 -3
  419. package/dist/ui/components/SummaryCard.js +1 -1
  420. package/dist/ui/components/index.style.css +1 -0
  421. package/dist/ui/icons/icon-registry.d.ts +1 -0
  422. package/dist/ui/icons/icon-registry.js +9 -1
  423. package/dist/ui/index.d.ts +4 -0
  424. package/dist/ui/index.js +2 -0
  425. package/dist/utils/search-txt-query.d.ts +12 -0
  426. package/dist/utils/search-txt-query.js +12 -0
  427. package/package.json +1 -1
  428. package/scripts/dedupe-peer-deps.mjs +18 -0
  429. package/scripts/seed-cli.mjs +135 -26
  430. package/scripts/verify-css-build.mjs +118 -37
  431. package/dist/_internal/server/features/search/actions.d.ts +0 -7
  432. package/dist/_internal/server/features/search/actions.js +0 -21
  433. package/dist/_internal/server/features/search/data.d.ts +0 -15
  434. package/dist/_internal/server/features/search/data.js +0 -18
  435. package/dist/_internal/server/features/search/index.d.ts +0 -3
  436. package/dist/_internal/server/features/search/index.js +0 -2
  437. package/dist/features/homepage/api/[id]/route.d.ts +0 -23
  438. package/dist/features/homepage/api/[id]/route.js +0 -103
  439. package/dist/features/homepage/api/route.d.ts +0 -14
  440. package/dist/features/homepage/api/route.js +0 -140
  441. package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
  442. package/dist/features/homepage/api/sections/[id]/route.js +0 -95
  443. package/dist/features/homepage/api/sections/route.d.ts +0 -13
  444. package/dist/features/homepage/api/sections/route.js +0 -82
  445. package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
  446. package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
  447. package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
  448. package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
  449. package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
  450. package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
  451. package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
  452. package/dist/features/homepage/components/HeroBanner.js +0 -43
  453. package/dist/features/homepage/components/HeroSection.d.ts +0 -7
  454. package/dist/features/homepage/components/HeroSection.js +0 -6
  455. package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
  456. package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
  457. package/dist/features/homepage/components/HomepageView.d.ts +0 -25
  458. package/dist/features/homepage/components/HomepageView.js +0 -5
  459. package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
  460. package/dist/features/homepage/components/NewsletterBanner.js +0 -37
  461. package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
  462. package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
  463. package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
  464. package/dist/features/homepage/components/TrustBadges.js +0 -46
  465. package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
  466. package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
  467. package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
  468. package/dist/features/homepage/hooks/useHomepage.js +0 -17
  469. package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
  470. package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
  471. package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
  472. package/dist/features/homepage/repository/homepage.repository.js +0 -25
  473. package/dist/features/search/actions/index.d.ts +0 -1
  474. package/dist/features/search/actions/index.js +0 -1
  475. package/dist/features/search/actions/search-actions.d.ts +0 -18
  476. package/dist/features/search/actions/search-actions.js +0 -43
  477. package/dist/features/search/api/route.d.ts +0 -22
  478. package/dist/features/search/api/route.js +0 -128
  479. package/dist/features/search/columns/index.d.ts +0 -17
  480. package/dist/features/search/columns/index.js +0 -49
  481. package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
  482. package/dist/features/search/components/SearchFiltersRow.js +0 -21
  483. package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
  484. package/dist/features/search/components/SearchResultsSection.js +0 -35
  485. package/dist/features/search/components/SearchView.d.ts +0 -27
  486. package/dist/features/search/components/SearchView.js +0 -8
  487. package/dist/features/search/hooks/useSearch.d.ts +0 -21
  488. package/dist/features/search/hooks/useSearch.js +0 -33
  489. package/dist/features/search/repository/search.repository.d.ts +0 -14
  490. package/dist/features/search/repository/search.repository.js +0 -59
  491. package/dist/features/search/schemas/index.d.ts +0 -70
  492. package/dist/features/search/schemas/index.js +0 -36
  493. package/dist/features/search/types/index.d.ts +0 -48
  494. package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
  495. package/dist/features/stores/components/StoreScopedSearch.js +0 -27
  496. package/dist/seed/defaults/homepage-sections.d.ts +0 -2
  497. package/dist/seed/defaults/homepage-sections.js +0 -60
  498. package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
  499. package/dist/seed/factories/homepage-section.factory.js +0 -13
  500. /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
@@ -0,0 +1,368 @@
1
+ /*
2
+ * WHY: `listingType: "spares"` is the user's own case, in their words — *"if I
3
+ * have a spare attack ring for Galeon I can sell it to someone who wants
4
+ * it in the same colour, instead of wasting time with it."* A spare is one
5
+ * physical component off a disassembled top, usually quantity 1, priced by
6
+ * condition and colourway rather than by a catalogue number.
7
+ * WHAT: Six spares on Beyblade Arena, one per part classification that has a
8
+ * real glossary row and a real cover image, spanning three generations.
9
+ *
10
+ * 🛑 Each one links to a REAL `partGlossary` id and files under the REAL
11
+ * generated part leaf. Both were verified against the committed seed rather
12
+ * than composed by hand:
13
+ *
14
+ * node -e '…/"id": "(attack-ring--[a-z0-9-]+)"/…' → the glossary rows
15
+ * grep partGlossaryId products-catalogue-seed-data → the category chains
16
+ *
17
+ * A fabricated id here would be invisible: `partGlossaryId` is optional by
18
+ * design (the glossary holds 752 rows and does not cover every component ever
19
+ * moulded), so a wrong value does not error — the glossary cross-sell simply
20
+ * never matches, which reads as "no spares listed" rather than as a bad link.
21
+ *
22
+ * 🛑 `mainImage` points at the part leaf's OWN cover, which exists because the
23
+ * taxonomy-image pipeline uploaded it — `/media/<shortId>` resolves through
24
+ * `mediaAssets/{slug}` → `storagePath`, so a slug with no row is a silent 404
25
+ * that renders as an ordinary broken image (the 2026-10-17 incident where 504
26
+ * covers were missing). Five of the six were CHECKED present in
27
+ * `media-assets-seed-data.ts`; the sixth part (`spin-gear--right-sg`) has no
28
+ * uploaded cover, so it is not in this file at all rather than carrying a slug
29
+ * that 404s.
30
+ *
31
+ * EXPORTS:
32
+ * productsSparesSeedData — 6 Partial<ProductDocument> with listingType:"spares"
33
+ *
34
+ * @tag domain:products,spares
35
+ * @tag layer:seed
36
+ * @tag pattern:none
37
+ * @tag access:server-only
38
+ * @tag consumers:seed/index.ts,seed/manifest.ts
39
+ * @tag sideEffects:none
40
+ */
41
+ import { seedGallery } from "./_helpers/media.js";
42
+ import { PRODUCT_FIELDS } from "../constants/field-names.js";
43
+ import { buildSearchTxt } from "../utils/search-txt.js";
44
+ import { withFinalSale } from "./_helpers/final-sale-fixtures.js";
45
+ import { withDerivedCategoryNames } from "./_helpers/category-names.js";
46
+ const _rawProductsSparesSeedData = [
47
+ {
48
+ id: "spare-cross-dranzer-attack-ring-red",
49
+ slug: "spare-cross-dranzer-attack-ring-red",
50
+ title: "Cross Dranzer Attack Ring — red, Dranzer V2 pull",
51
+ description: "A loose Cross Dranzer attack ring pulled from a Dranzer V2. Red, with the usual contact-point scuffing on two of the four blades and no cracks. Fits any Plastic-Generation combo that takes a standard attack ring.",
52
+ categorySlugs: [
53
+ "category-cross-dranzer",
54
+ "category-original-attack-rings",
55
+ "category-original-parts",
56
+ "category-beyblade-original",
57
+ "category-spinning-tops",
58
+ ],
59
+ brandSlug: "brand-beyblade",
60
+ brand: "Beyblade",
61
+ price: 320,
62
+ currency: "INR",
63
+ gstRate: 5,
64
+ hsnCode: "95030020",
65
+ // Quantity 1 is the NORMAL case for this type, not an edge case: it is one
66
+ // object the seller happens to have. A spare at quantity 12 is the unusual
67
+ // row, which is why `-sg-metal-ball-base` below exists.
68
+ stockQuantity: 1,
69
+ availableQuantity: 1,
70
+ isSold: false,
71
+ mainImage: "/media/category-cross-dranzer-image",
72
+ images: seedGallery("/media/category-cross-dranzer-image"),
73
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
74
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
75
+ listingType: "spares",
76
+ storeId: "store-beyblade-arena",
77
+ storeName: "Beyblade Arena",
78
+ partGlossaryId: "attack-ring--cross-dranzer",
79
+ colourway: "Red",
80
+ unitLabel: "Dranzer V2 pull",
81
+ customFields: [],
82
+ customSections: [],
83
+ featured: false,
84
+ isPromoted: false,
85
+ isOnSale: false,
86
+ tags: ["spares", "attack-ring", "plastic-gen"],
87
+ createdAt: new Date("2026-10-19"),
88
+ updatedAt: new Date("2026-10-19"),
89
+ searchTxt: buildSearchTxt([
90
+ "Cross Dranzer Attack Ring — red, Dranzer V2 pull",
91
+ "A loose Cross Dranzer attack ring pulled from a Dranzer V2.",
92
+ "Beyblade",
93
+ "brand-beyblade",
94
+ ["Cross Dranzer", "Attack Rings", "Original Parts"],
95
+ ["spares", "attack-ring", "plastic-gen"],
96
+ ]),
97
+ },
98
+ {
99
+ id: "spare-bit-chip-galeon-gold",
100
+ slug: "spare-bit-chip-galeon-gold",
101
+ title: "Galeon Bit Chip — gold foil",
102
+ description: "The Galeon bit chip in gold foil, lifted cleanly from a spare attack ring. Foil is intact with no lift at the edges. This is the exact case this listing type exists for — a single chip somebody rebuilding a Galeon needs in this colour.",
103
+ categorySlugs: [
104
+ "category-bit-chip-galeon",
105
+ "category-original-bit-chips",
106
+ "category-original-parts",
107
+ "category-beyblade-original",
108
+ "category-spinning-tops",
109
+ ],
110
+ brandSlug: "brand-beyblade",
111
+ brand: "Beyblade",
112
+ price: 180,
113
+ currency: "INR",
114
+ gstRate: 5,
115
+ hsnCode: "95030020",
116
+ stockQuantity: 1,
117
+ availableQuantity: 1,
118
+ isSold: false,
119
+ mainImage: "/media/category-bit-chip-galeon-image",
120
+ images: seedGallery("/media/category-bit-chip-galeon-image"),
121
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
122
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
123
+ listingType: "spares",
124
+ storeId: "store-beyblade-arena",
125
+ storeName: "Beyblade Arena",
126
+ partGlossaryId: "bit-chip--galeon",
127
+ colourway: "Gold foil",
128
+ customFields: [],
129
+ customSections: [],
130
+ featured: false,
131
+ isPromoted: false,
132
+ isOnSale: false,
133
+ tags: ["spares", "bit-chip", "plastic-gen"],
134
+ createdAt: new Date("2026-10-19"),
135
+ updatedAt: new Date("2026-10-19"),
136
+ searchTxt: buildSearchTxt([
137
+ "Galeon Bit Chip — gold foil",
138
+ "The Galeon bit chip in gold foil, lifted cleanly from a spare attack ring.",
139
+ "Beyblade",
140
+ "brand-beyblade",
141
+ ["Galeon", "Bit Chips", "Original Parts"],
142
+ ["spares", "bit-chip", "plastic-gen"],
143
+ ]),
144
+ },
145
+ {
146
+ id: "spare-eight-heavy-weight-disk-lot",
147
+ slug: "spare-eight-heavy-weight-disk-lot",
148
+ title: "Eight Heavy Weight Disk — pick one of four",
149
+ description: "Four Eight Heavy weight disks from a parts drawer, all original Takara. Surface oxidation varies between them and is shown in the photos; none is bent. Sold individually — the quantity is how many are left.",
150
+ categorySlugs: [
151
+ "category-eight-heavy",
152
+ "category-original-weight-disks",
153
+ "category-original-parts",
154
+ "category-beyblade-original",
155
+ "category-spinning-tops",
156
+ ],
157
+ brandSlug: "brand-beyblade",
158
+ brand: "Beyblade",
159
+ price: 140,
160
+ currency: "INR",
161
+ gstRate: 5,
162
+ hsnCode: "95030020",
163
+ /*
164
+ * The counter-example to quantity 1: a seller who stripped several tops has
165
+ * four interchangeable disks and does not want four listings. Worth seeding
166
+ * because every stock-path test (cart cap, decrement, sell-out) needs a
167
+ * spare with room above 1 to exercise it at all.
168
+ */
169
+ stockQuantity: 4,
170
+ availableQuantity: 4,
171
+ isSold: false,
172
+ mainImage: "/media/category-eight-heavy-image",
173
+ images: seedGallery("/media/category-eight-heavy-image"),
174
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
175
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
176
+ listingType: "spares",
177
+ storeId: "store-beyblade-arena",
178
+ storeName: "Beyblade Arena",
179
+ partGlossaryId: "weight-disk--eight-heavy",
180
+ customFields: [],
181
+ customSections: [],
182
+ featured: false,
183
+ isPromoted: false,
184
+ isOnSale: false,
185
+ tags: ["spares", "weight-disk", "plastic-gen"],
186
+ createdAt: new Date("2026-10-19"),
187
+ updatedAt: new Date("2026-10-19"),
188
+ searchTxt: buildSearchTxt([
189
+ "Eight Heavy Weight Disk — pick one of four",
190
+ "Four Eight Heavy weight disks from a parts drawer, all original Takara.",
191
+ "Beyblade",
192
+ "brand-beyblade",
193
+ ["Eight Heavy", "Weight Disks", "Original Parts"],
194
+ ["spares", "weight-disk", "plastic-gen"],
195
+ ]),
196
+ },
197
+ {
198
+ id: "spare-final-drive-performance-tip",
199
+ slug: "spare-final-drive-performance-tip",
200
+ title: "4D Bottom: Final Drive (F:D) — spare tip",
201
+ description: "A spare F:D performance tip off a Big Bang Pegasis. The free-spinning mode still engages cleanly and the rubber flat is worn but not flattened. Metal Fight 4D fitment only.",
202
+ categorySlugs: [
203
+ "category-f-d",
204
+ "category-metal-performance-tips",
205
+ "category-metal-parts",
206
+ "category-beyblade-metal",
207
+ "category-spinning-tops",
208
+ ],
209
+ brandSlug: "brand-beyblade",
210
+ brand: "Beyblade",
211
+ price: 450,
212
+ currency: "INR",
213
+ gstRate: 5,
214
+ hsnCode: "95030020",
215
+ stockQuantity: 1,
216
+ availableQuantity: 1,
217
+ isSold: false,
218
+ mainImage: "/media/category-f-d-image",
219
+ images: seedGallery("/media/category-f-d-image"),
220
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
221
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
222
+ listingType: "spares",
223
+ storeId: "store-beyblade-arena",
224
+ storeName: "Beyblade Arena",
225
+ partGlossaryId: "performance-tip--f-d",
226
+ unitLabel: "Big Bang Pegasis pull",
227
+ customFields: [],
228
+ customSections: [],
229
+ featured: false,
230
+ isPromoted: false,
231
+ isOnSale: false,
232
+ tags: ["spares", "performance-tip", "metal-fight"],
233
+ createdAt: new Date("2026-10-19"),
234
+ updatedAt: new Date("2026-10-19"),
235
+ searchTxt: buildSearchTxt([
236
+ "4D Bottom: Final Drive (F:D) — spare tip",
237
+ "A spare F:D performance tip off a Big Bang Pegasis.",
238
+ "Beyblade",
239
+ "brand-beyblade",
240
+ ["4D Bottom: Final Drive", "Performance Tips", "Metal Fight Parts"],
241
+ ["spares", "performance-tip", "metal-fight"],
242
+ ]),
243
+ },
244
+ {
245
+ id: "spare-atomic-driver-burst",
246
+ slug: "spare-atomic-driver-burst",
247
+ title: "Atomic Driver — spare, Burst",
248
+ description: "An Atomic driver off a Maximum Garuda. The free-spinning ring turns without catching and the tip has even wear. Fits any Burst layer-and-disc combo.",
249
+ categorySlugs: [
250
+ "category-driver-atomic",
251
+ "category-burst-drivers",
252
+ "category-burst-parts",
253
+ "category-beyblade-burst",
254
+ "category-spinning-tops",
255
+ ],
256
+ brandSlug: "brand-beyblade",
257
+ brand: "Beyblade",
258
+ price: 260,
259
+ currency: "INR",
260
+ gstRate: 5,
261
+ hsnCode: "95030020",
262
+ stockQuantity: 2,
263
+ availableQuantity: 2,
264
+ isSold: false,
265
+ mainImage: "/media/category-driver-atomic-image",
266
+ images: seedGallery("/media/category-driver-atomic-image"),
267
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
268
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
269
+ listingType: "spares",
270
+ storeId: "store-beyblade-arena",
271
+ storeName: "Beyblade Arena",
272
+ partGlossaryId: "driver--atomic",
273
+ unitLabel: "Maximum Garuda pull",
274
+ customFields: [],
275
+ customSections: [],
276
+ featured: false,
277
+ isPromoted: false,
278
+ isOnSale: false,
279
+ tags: ["spares", "driver", "burst"],
280
+ createdAt: new Date("2026-10-19"),
281
+ updatedAt: new Date("2026-10-19"),
282
+ searchTxt: buildSearchTxt([
283
+ "Atomic Driver — spare, Burst",
284
+ "An Atomic driver off a Maximum Garuda.",
285
+ "Beyblade",
286
+ "brand-beyblade",
287
+ ["Atomic", "Drivers", "Burst Parts"],
288
+ ["spares", "driver", "burst"],
289
+ ]),
290
+ },
291
+ {
292
+ /*
293
+ * 🛑 The SOLD fixture, and it is not optional.
294
+ *
295
+ * The "Sold & Ended" availability scope is otherwise EMPTY for this type,
296
+ * so the middle tab on `/spares` would render nothing and be untestable —
297
+ * the same gap CLAUDE.md records being closed for every other listing type
298
+ * on 2026-08-24. Status stays `published`: an archived row is removed by
299
+ * the status filter before the availability predicate ever runs, so an
300
+ * archived fixture proves nothing about the scope.
301
+ */
302
+ id: "spare-eight-heavy-weight-disk-sold",
303
+ slug: "spare-eight-heavy-weight-disk-sold",
304
+ title: "Eight Heavy Weight Disk — mint, sold",
305
+ description: "A mint Eight Heavy weight disk with no oxidation at all, from a sealed Galeon. Sold.",
306
+ categorySlugs: [
307
+ "category-eight-heavy",
308
+ "category-original-weight-disks",
309
+ "category-original-parts",
310
+ "category-beyblade-original",
311
+ "category-spinning-tops",
312
+ ],
313
+ brandSlug: "brand-beyblade",
314
+ brand: "Beyblade",
315
+ price: 390,
316
+ currency: "INR",
317
+ gstRate: 5,
318
+ hsnCode: "95030020",
319
+ stockQuantity: 1,
320
+ availableQuantity: 0,
321
+ isSold: true,
322
+ mainImage: "/media/category-eight-heavy-image",
323
+ images: seedGallery("/media/category-eight-heavy-image"),
324
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
325
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
326
+ listingType: "spares",
327
+ storeId: "store-beyblade-arena",
328
+ storeName: "Beyblade Arena",
329
+ partGlossaryId: "weight-disk--eight-heavy",
330
+ colourway: "Unoxidised silver",
331
+ unitLabel: "Sealed Galeon pull",
332
+ customFields: [],
333
+ customSections: [],
334
+ featured: false,
335
+ isPromoted: false,
336
+ isOnSale: false,
337
+ tags: ["spares", "weight-disk", "sold-out"],
338
+ createdAt: new Date("2026-10-19"),
339
+ updatedAt: new Date("2026-10-19"),
340
+ searchTxt: buildSearchTxt([
341
+ "Eight Heavy Weight Disk — mint, sold",
342
+ "A mint Eight Heavy weight disk with no oxidation at all.",
343
+ "Beyblade",
344
+ "brand-beyblade",
345
+ ["Eight Heavy", "Weight Disks", "Original Parts"],
346
+ ["spares", "weight-disk", "sold-out"],
347
+ ]),
348
+ },
349
+ ];
350
+ /*
351
+ * 🛑 The wrappers go AFTER the closing `]`, applied to the whole array — never
352
+ * to a spread inside it.
353
+ *
354
+ * This file's siblings carry the scar: `products-auctions-seed-data.ts` had
355
+ * `..._raw.map(withTokens)` with fixtures appended after the spread, so the
356
+ * appended rows got none of it. That was found once for `searchTxt`, fixed, and
357
+ * documented in a comment directly above the pipeline — and `listingType`
358
+ * stayed inside the spread, so the same bug survived its own fix one field
359
+ * over, under a comment describing it. A missing `listingType` is silent in the
360
+ * worst way: `normalizeListingType` returns `?? "standard"` so the row looks
361
+ * right in every inspection, while a Firestore equality cannot match an absent
362
+ * field — the row is absent from its own catalogue while rendering perfectly by
363
+ * slug (Root Cause #101).
364
+ *
365
+ * `audit-seed-listing-type` is strict-zero on exactly that, with no suppression
366
+ * marker, and it checks the slug prefix agrees too.
367
+ */
368
+ export const productsSparesSeedData = _rawProductsSparesSeedData.map(withFinalSale).map(withDerivedCategoryNames);
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * WHY: Seeds a minimal, Beyblade-focused catalog of standard product listings — 2 products per
3
- * generation (Original, Metal Fight, Burst, X), all from the Beyblade Arena store, plus
3
+ * generation (Original, Metal Fight, Burst), all from the Beyblade Arena store, plus
4
4
  * 4 video-demo products so the product gallery's video slide (theater-mode playback,
5
5
  * zoom/rotate, fullscreen) has real, playable fixtures covering every supported video
6
6
  * source: a raw file from Google's public sample-video bucket (x2, one per Original/X),
@@ -9,11 +9,19 @@
9
9
  * 2026-08-21). A real MediaUploadField file-upload video can't be reproduced from seed
10
10
  * data (no Storage object actually exists for a seeded URL to point at) — that path is
11
11
  * covered by a tester-checklist manual test case instead, not a fixture here.
12
- * WHAT: Exports 14 standard products with listingType:"standard", covering all 4 generation
13
- * leaf categories (tagged with both leaf + root category slugs).
12
+ *
13
+ * 🛑 The Beyblade X pair (2 of the original "2 per generation") was REMOVED 2026-10-19 —
14
+ * both were fictional (one named itself "Wizard Arrow 4-60F" while filed under the real
15
+ * `category-wizardarrow-4-80b`, a different model; the other, "CrimsonGaruda 4-70TP",
16
+ * matches nothing in the research corpus). Real, wiki-verified Beyblade X products —
17
+ * including a real WizardArrow 4-80B — now live in `products-beyblade-x-seed-data.ts`.
18
+ *
19
+ * WHAT: Exports 13 standard products with listingType:"standard", covering the Original,
20
+ * Metal Fight and Burst generation leaf categories (tagged with both leaf + root
21
+ * category slugs). Beyblade X real content is a separate file — see above.
14
22
  *
15
23
  * EXPORTS:
16
- * productsStandardSeedData — Array of 14 standard products with listingType:"standard"
24
+ * productsStandardSeedData — Array of 13 standard products with listingType:"standard"
17
25
  *
18
26
  * @tag domain:products,catalog
19
27
  * @tag layer:seed
@@ -24,7 +32,7 @@
24
32
  */
25
33
  import { PRODUCT_FIELDS } from "../constants/field-names.js";
26
34
  import { buildSearchTxt } from "../utils/search-txt.js";
27
- import { seedPhoto } from "./_helpers/media.js";
35
+ import { seedPhoto, seedGallery } from "./_helpers/media.js";
28
36
  import { withFinalSale } from "./_helpers/final-sale-fixtures.js";
29
37
  import { withDerivedCategoryNames } from "./_helpers/category-names.js";
30
38
  /*
@@ -199,11 +207,7 @@ const _rawProductsStandardSeedData = [
199
207
  availableQuantity: 4,
200
208
  isSold: false,
201
209
  mainImage: seedPhoto("product-image-beyblade-original-dranzer-s-1-20260101", 900, 900),
202
- images: [
203
- seedPhoto("product-image-beyblade-original-dranzer-s-1-20260101", 900, 900),
204
- seedPhoto("product-image-beyblade-original-dranzer-s-2-20260101", 900, 900),
205
- seedPhoto("product-image-beyblade-original-dranzer-s-3-20260101", 900, 900),
206
- ],
210
+ images: seedGallery(seedPhoto("product-image-beyblade-original-dranzer-s-1-20260101", 900, 900), seedPhoto("product-image-beyblade-original-dranzer-s-2-20260101", 900, 900), seedPhoto("product-image-beyblade-original-dranzer-s-3-20260101", 900, 900)),
207
211
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
208
212
  condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
209
213
  featured: true,
@@ -245,11 +249,7 @@ const _rawProductsStandardSeedData = [
245
249
  availableQuantity: 2,
246
250
  isSold: false,
247
251
  mainImage: seedPhoto("product-image-beyblade-original-driger-v-1-20260101", 900, 900),
248
- images: [
249
- seedPhoto("product-image-beyblade-original-driger-v-1-20260101", 900, 900),
250
- seedPhoto("product-image-beyblade-original-driger-v-2-20260101", 900, 900),
251
- seedPhoto("product-image-beyblade-original-driger-v-3-20260101", 900, 900),
252
- ],
252
+ images: seedGallery(seedPhoto("product-image-beyblade-original-driger-v-1-20260101", 900, 900), seedPhoto("product-image-beyblade-original-driger-v-2-20260101", 900, 900), seedPhoto("product-image-beyblade-original-driger-v-3-20260101", 900, 900)),
253
253
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
254
254
  condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
255
255
  tags: ["vintage-collectible"],
@@ -277,11 +277,7 @@ const _rawProductsStandardSeedData = [
277
277
  availableQuantity: 6,
278
278
  isSold: false,
279
279
  mainImage: seedPhoto("product-image-beyblade-metal-storm-pegasus-1-20260101", 900, 900),
280
- images: [
281
- seedPhoto("product-image-beyblade-metal-storm-pegasus-1-20260101", 900, 900),
282
- seedPhoto("product-image-beyblade-metal-storm-pegasus-2-20260101", 900, 900),
283
- seedPhoto("product-image-beyblade-metal-storm-pegasus-3-20260101", 900, 900),
284
- ],
280
+ images: seedGallery(seedPhoto("product-image-beyblade-metal-storm-pegasus-1-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-storm-pegasus-2-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-storm-pegasus-3-20260101", 900, 900)),
285
281
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
286
282
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
287
283
  featured: true,
@@ -309,11 +305,7 @@ const _rawProductsStandardSeedData = [
309
305
  availableQuantity: 3,
310
306
  isSold: false,
311
307
  mainImage: seedPhoto("product-image-beyblade-metal-flame-sagittario-1-20260101", 900, 900),
312
- images: [
313
- seedPhoto("product-image-beyblade-metal-flame-sagittario-1-20260101", 900, 900),
314
- seedPhoto("product-image-beyblade-metal-flame-sagittario-2-20260101", 900, 900),
315
- seedPhoto("product-image-beyblade-metal-flame-sagittario-3-20260101", 900, 900),
316
- ],
308
+ images: seedGallery(seedPhoto("product-image-beyblade-metal-flame-sagittario-1-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-flame-sagittario-2-20260101", 900, 900), seedPhoto("product-image-beyblade-metal-flame-sagittario-3-20260101", 900, 900)),
317
309
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
318
310
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
319
311
  tags: ["balance-type", "tournament-grade"],
@@ -341,11 +333,7 @@ const _rawProductsStandardSeedData = [
341
333
  availableQuantity: 10,
342
334
  isSold: false,
343
335
  mainImage: seedPhoto("product-image-beyblade-burst-valkyrie-1-20260101", 900, 900),
344
- images: [
345
- seedPhoto("product-image-beyblade-burst-valkyrie-1-20260101", 900, 900),
346
- seedPhoto("product-image-beyblade-burst-valkyrie-2-20260101", 900, 900),
347
- seedPhoto("product-image-beyblade-burst-valkyrie-3-20260101", 900, 900),
348
- ],
336
+ images: seedGallery(seedPhoto("product-image-beyblade-burst-valkyrie-1-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-valkyrie-2-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-valkyrie-3-20260101", 900, 900)),
349
337
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
350
338
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
351
339
  featured: true,
@@ -373,11 +361,7 @@ const _rawProductsStandardSeedData = [
373
361
  availableQuantity: 5,
374
362
  isSold: false,
375
363
  mainImage: seedPhoto("product-image-beyblade-burst-regalia-genesis-1-20260101", 900, 900),
376
- images: [
377
- seedPhoto("product-image-beyblade-burst-regalia-genesis-1-20260101", 900, 900),
378
- seedPhoto("product-image-beyblade-burst-regalia-genesis-2-20260101", 900, 900),
379
- seedPhoto("product-image-beyblade-burst-regalia-genesis-3-20260101", 900, 900),
380
- ],
364
+ images: seedGallery(seedPhoto("product-image-beyblade-burst-regalia-genesis-1-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-regalia-genesis-2-20260101", 900, 900), seedPhoto("product-image-beyblade-burst-regalia-genesis-3-20260101", 900, 900)),
381
365
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
382
366
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
383
367
  tags: ["attack-type"],
@@ -386,70 +370,19 @@ const _rawProductsStandardSeedData = [
386
370
  createdAt: new Date("2026-04-20"),
387
371
  updatedAt: new Date("2026-05-03"),
388
372
  },
389
- // ===== Beyblade X =====
390
- {
391
- id: "product-beyblade-x-wizard-arrow",
392
- slug: "product-beyblade-x-wizard-arrow",
393
- barcodeId: "LIR-BEY-X-001",
394
- title: "Beyblade X BX-01 Wizard Arrow",
395
- description: "Wizard Arrow 4-60F, a starter top from the Beyblade X Xtreme Gear generation.",
396
- categorySlugs: ["category-wizardarrow-4-80b", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
397
- categoryNames: ["Basic Line", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
398
- brandSlug: "brand-takara-tomy",
399
- brand: "Takara-Tomy",
400
- price: 899,
401
- allowOffers: true,
402
- minOfferPercent: 70,
403
- currency: "INR",
404
- stockQuantity: 12,
405
- availableQuantity: 12,
406
- isSold: false,
407
- mainImage: seedPhoto("product-image-beyblade-x-wizard-arrow-1-20260101", 900, 900),
408
- images: [
409
- seedPhoto("product-image-beyblade-x-wizard-arrow-1-20260101", 900, 900),
410
- seedPhoto("product-image-beyblade-x-wizard-arrow-2-20260101", 900, 900),
411
- seedPhoto("product-image-beyblade-x-wizard-arrow-3-20260101", 900, 900),
412
- ],
413
- status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
414
- condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
415
- featured: true,
416
- tags: ["attack-type", "starter-set"],
417
- storeId: "store-beyblade-arena",
418
- storeName: "Beyblade Arena",
419
- createdAt: new Date("2026-04-22"),
420
- updatedAt: new Date("2026-05-04"),
421
- },
422
- {
423
- id: "product-beyblade-x-knife-shinobi",
424
- slug: "product-beyblade-x-knife-shinobi",
425
- barcodeId: "LIR-BEY-X-002",
426
- title: "Beyblade X CrimsonGaruda 4-70TP",
427
- description: "CrimsonGaruda 4-70TP, a balance-type top with tournament-grade stamina parts.",
428
- categorySlugs: ["category-crimsongaruda-4-70tp", "category-x-basic", "category-x-tops", "category-beyblade-x", "category-spinning-tops"],
429
- categoryNames: ["Basic Line", "Beyblade X Tops", "Beyblade X", "Spinning Tops"],
430
- brandSlug: "brand-takara-tomy",
431
- brand: "Takara-Tomy",
432
- price: 949,
433
- allowOffers: true,
434
- minOfferPercent: 70,
435
- currency: "INR",
436
- stockQuantity: 7,
437
- availableQuantity: 7,
438
- isSold: false,
439
- mainImage: seedPhoto("product-image-beyblade-x-knife-shinobi-1-20260101", 900, 900),
440
- images: [
441
- seedPhoto("product-image-beyblade-x-knife-shinobi-1-20260101", 900, 900),
442
- seedPhoto("product-image-beyblade-x-knife-shinobi-2-20260101", 900, 900),
443
- seedPhoto("product-image-beyblade-x-knife-shinobi-3-20260101", 900, 900),
444
- ],
445
- status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
446
- condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
447
- tags: ["balance-type", "tournament-grade"],
448
- storeId: "store-beyblade-arena",
449
- storeName: "Beyblade Arena",
450
- createdAt: new Date("2026-04-24"),
451
- updatedAt: new Date("2026-05-04"),
452
- },
373
+ /*
374
+ * ===== Beyblade X ===== — REMOVED 2026-10-19.
375
+ *
376
+ * Two fictional fixtures lived here: "Beyblade X BX-01 Wizard Arrow"
377
+ * (described as "Wizard Arrow 4-60F" while its own categorySlugs pointed at
378
+ * `category-wizardarrow-4-80b` — a different real model, 4-80B not 4-60F)
379
+ * and "Beyblade X CrimsonGaruda 4-70TP" (no such model exists in the
380
+ * research corpus at all). Both predate the real Beyblade X product seed
381
+ * (`products-beyblade-x-seed-data.ts`), which now occupies
382
+ * `category-wizardarrow-4-80b` with the real WizardArrow 4-80B Ver.2.0 —
383
+ * leaving the old entry in place would have put two differently-named
384
+ * "WizardArrow" products in the same category, one of them fictional.
385
+ */
453
386
  // ===== Video-demo fixtures — real playable video field for gallery testing =====
454
387
  {
455
388
  id: "product-beyblade-original-dragoon-f-video-demo",
@@ -467,10 +400,7 @@ const _rawProductsStandardSeedData = [
467
400
  availableQuantity: 5,
468
401
  isSold: false,
469
402
  mainImage: seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-1-20260819", 900, 900),
470
- images: [
471
- seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-1-20260819", 900, 900),
472
- seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-2-20260819", 900, 900),
473
- ],
403
+ images: seedGallery(seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-1-20260819", 900, 900), seedPhoto("product-image-beyblade-original-dragoon-f-video-demo-2-20260819", 900, 900)),
474
404
  video: {
475
405
  url: "/demo-media/sample-video.mp4",
476
406
  thumbnailUrl: seedPhoto("product-video-thumb-beyblade-original-dragoon-f-video-demo-20260819", 800, 450),
@@ -500,10 +430,7 @@ const _rawProductsStandardSeedData = [
500
430
  availableQuantity: 8,
501
431
  isSold: false,
502
432
  mainImage: seedPhoto("product-image-beyblade-x-dran-sword-video-demo-1-20260819", 900, 900),
503
- images: [
504
- seedPhoto("product-image-beyblade-x-dran-sword-video-demo-1-20260819", 900, 900),
505
- seedPhoto("product-image-beyblade-x-dran-sword-video-demo-2-20260819", 900, 900),
506
- ],
433
+ images: seedGallery(seedPhoto("product-image-beyblade-x-dran-sword-video-demo-1-20260819", 900, 900), seedPhoto("product-image-beyblade-x-dran-sword-video-demo-2-20260819", 900, 900)),
507
434
  video: {
508
435
  url: "/demo-media/sample-video.mp4",
509
436
  thumbnailUrl: seedPhoto("product-video-thumb-beyblade-x-dran-sword-video-demo-20260819", 800, 450),
@@ -541,10 +468,7 @@ const _rawProductsStandardSeedData = [
541
468
  availableQuantity: 4,
542
469
  isSold: false,
543
470
  mainImage: seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-1-20260821", 900, 900),
544
- images: [
545
- seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-1-20260821", 900, 900),
546
- seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-2-20260821", 900, 900),
547
- ],
471
+ images: seedGallery(seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-1-20260821", 900, 900), seedPhoto("product-image-beyblade-metal-dark-bull-video-demo-2-20260821", 900, 900)),
548
472
  video: {
549
473
  // audit-seed-external-url-ok: MediaUploadField's YouTube tab always stores a
550
474
  // youtube.com/watch?v= URL — this is exactly that shape, not a raw file.
@@ -583,10 +507,7 @@ const _rawProductsStandardSeedData = [
583
507
  availableQuantity: 7,
584
508
  isSold: false,
585
509
  mainImage: seedPhoto("product-image-beyblade-burst-spryzen-video-demo-1-20260821", 900, 900),
586
- images: [
587
- seedPhoto("product-image-beyblade-burst-spryzen-video-demo-1-20260821", 900, 900),
588
- seedPhoto("product-image-beyblade-burst-spryzen-video-demo-2-20260821", 900, 900),
589
- ],
510
+ images: seedGallery(seedPhoto("product-image-beyblade-burst-spryzen-video-demo-1-20260821", 900, 900), seedPhoto("product-image-beyblade-burst-spryzen-video-demo-2-20260821", 900, 900)),
590
511
  video: {
591
512
  url: "https://upload.wikimedia.org/wikipedia/commons/4/42/Slow_motion_of_running_greyhound.webm", // audit-seed-external-url-ok: raw <video> src, CC-BY-SA 4.0 (Wikimedia Commons)
592
513
  thumbnailUrl: seedPhoto("product-video-thumb-beyblade-burst-spryzen-video-demo-20260821", 800, 450),
@@ -619,10 +540,7 @@ const _rawProductsStandardSeedData = [
619
540
  availableQuantity: 0,
620
541
  isSold: true,
621
542
  mainImage: seedPhoto("product-image-dran-buster-sold-out-1-20260824", 900, 900),
622
- images: [
623
- seedPhoto("product-image-dran-buster-sold-out-1-20260824", 900, 900),
624
- seedPhoto("product-image-dran-buster-sold-out-2-20260824", 900, 900),
625
- ],
543
+ images: seedGallery(seedPhoto("product-image-dran-buster-sold-out-1-20260824", 900, 900), seedPhoto("product-image-dran-buster-sold-out-2-20260824", 900, 900)),
626
544
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
627
545
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
628
546
  tags: ["attack-type", "sold-out"],
@@ -646,9 +564,7 @@ const _rawProductsStandardSeedData = [
646
564
  availableQuantity: 0,
647
565
  isSold: true,
648
566
  mainImage: seedPhoto("product-image-valtryek-v3-sold-out-1-20260824", 900, 900),
649
- images: [
650
- seedPhoto("product-image-valtryek-v3-sold-out-1-20260824", 900, 900),
651
- ],
567
+ images: seedGallery(seedPhoto("product-image-valtryek-v3-sold-out-1-20260824", 900, 900)),
652
568
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
653
569
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
654
570
  tags: ["balance-type", "sold-out"],
@@ -697,10 +613,7 @@ const _rawProductsStandardSeedData = [
697
613
  availableQuantity: 6,
698
614
  isSold: false,
699
615
  mainImage: seedPhoto("product-image-beypointer-digital-battle-counter-1-20261012", 900, 900),
700
- images: [
701
- seedPhoto("product-image-beypointer-digital-battle-counter-1-20261012", 900, 900),
702
- seedPhoto("product-image-beypointer-digital-battle-counter-2-20261012", 900, 900),
703
- ],
616
+ images: seedGallery(seedPhoto("product-image-beypointer-digital-battle-counter-1-20261012", 900, 900), seedPhoto("product-image-beypointer-digital-battle-counter-2-20261012", 900, 900)),
704
617
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
705
618
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
706
619
  tags: ["accessory"],