@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
@@ -51,7 +51,7 @@
51
51
  * @tag sideEffects:none
52
52
  */
53
53
  import { CATEGORY_FIELDS } from "../constants/field-names.js";
54
- import { seedPhoto } from "./_helpers/media.js";
54
+ import { seedPhoto, isSeedPlaceholderImage } from "./_helpers/media.js";
55
55
  import { buildCategoryTree } from "./_helpers/category-tree.js";
56
56
  import { withCategorySearchTxt } from "./_helpers/search-txt-wrappers.js";
57
57
  import { CATEGORY_FOREST } from "./_helpers/category-forest.js";
@@ -61,8 +61,9 @@ import { MODEL_LEAF_COUNT } from "./_helpers/category-models.js";
61
61
  import { PART_LEAF_COUNT } from "./_helpers/category-parts.js";
62
62
  import { MARKET_BAND_LEAF_IDS } from "./_helpers/category-content.js";
63
63
  import { GENERATED_CATEGORY_CONTENT, GENERATED_CATEGORY_CONTENT_COUNT, } from "./_helpers/category-content-generated.js";
64
- import { GENERATED_CATEGORY_IMAGES, GENERATED_CATEGORY_IMAGE_COUNT, } from "./_helpers/category-images-generated.js";
64
+ import { GENERATED_CATEGORY_IMAGES, GENERATED_CATEGORY_IMAGE_COUNT, GENERATED_CATEGORY_HASBRO_IMAGES, } from "./_helpers/category-images-generated.js";
65
65
  import { productsStandardSeedData } from "./products-standard-seed-data.js";
66
+ import { productsBeybladeXSeedData } from "./products-beyblade-x-seed-data.js";
66
67
  const NOW = new Date();
67
68
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
68
69
  const emptyMetrics = {
@@ -228,19 +229,36 @@ const franchiseRows = buildFranchiseRows({
228
229
  * Deriving from the members' own chains means the union cannot disagree with
229
230
  * them, and a member whose chain moves updates every bundle holding it.
230
231
  */
231
- const PRODUCT_CHAINS = new Map(productsStandardSeedData.map((p) => [String(p.id), (p.categorySlugs ?? [])]));
232
+ /*
233
+ * Both real-product arrays, not just the standard one.
234
+ *
235
+ * `productsBeybladeXSeedData` was added 2026-10-19 as a separate file (real,
236
+ * wiki-verified Beyblade X listings under store-letitrip-official). A bundle
237
+ * may legitimately hold one of those, and resolving only the standard array
238
+ * would make `bundleCategorySlugsFor` throw "not in productsStandardSeedData"
239
+ * for a product that genuinely exists — which is exactly what happened when
240
+ * the two fictional X fixtures this file's bundles used to reference were
241
+ * removed in favour of real ones.
242
+ */
243
+ const PRODUCT_CHAINS = new Map([...productsStandardSeedData, ...productsBeybladeXSeedData].map((p) => [
244
+ String(p.id),
245
+ (p.categorySlugs ?? []),
246
+ ]));
232
247
  function bundleCategorySlugsFor(productIds) {
233
248
  const out = [];
234
249
  for (const id of productIds) {
235
250
  const chain = PRODUCT_CHAINS.get(id);
236
251
  /*
237
- * A member missing from the standard seed is a BUG, not something to shrug
238
- * past: the bundle would silently lose that member's categories and the
239
- * Bundles tab would under-report. All eight current members are standard
240
- * products; if that changes, widen the map rather than softening this.
252
+ * A member missing from the real-product seeds is a BUG, not something to
253
+ * shrug past: the bundle would silently lose that member's categories and
254
+ * the Bundles tab would under-report. The map was widened (rather than
255
+ * this check softened) on 2026-10-19 to cover
256
+ * `productsBeybladeXSeedData` as well — if another real-product file is
257
+ * added, widen it again.
241
258
  */
242
- if (!chain)
243
- throw new Error(`bundle member ${id} is not in productsStandardSeedData`);
259
+ if (!chain) {
260
+ throw new Error(`bundle member ${id} is in neither productsStandardSeedData nor productsBeybladeXSeedData`);
261
+ }
244
262
  for (const c of chain)
245
263
  if (!out.includes(c))
246
264
  out.push(c);
@@ -268,8 +286,11 @@ function withBundleMosaic(row) {
268
286
  // half-built.
269
287
  if (ids.length === 0 || !row.display)
270
288
  return row;
289
+ // Both real-product arrays, for the same reason as PRODUCT_CHAINS above —
290
+ // otherwise a bundle holding a Beyblade X member silently loses that tile.
271
291
  const images = ids
272
- .map((id) => productsStandardSeedData.find((p) => p.id === id)?.mainImage)
292
+ .map((id) => [...productsStandardSeedData, ...productsBeybladeXSeedData].find((p) => p.id === id)
293
+ ?.mainImage)
273
294
  .filter((src) => typeof src === "string" && src.length > 0);
274
295
  if (images.length === 0)
275
296
  return row;
@@ -387,18 +408,21 @@ const bundleRows = [
387
408
  id: "bundle-x-series-starter",
388
409
  name: "X-Series Starter Set",
389
410
  slug: "bundle-x-series-starter",
390
- description: "Wizard Arrow and Knife Shinobi — the newest X-series tops for new battlers.",
411
+ description: "WizardArrow and KnightShield Ver.2.0 — the re-tuned Stamina and Defense tops from the BX-53 set, paired with a Burst-era Valkyrie.",
391
412
  categoryType: "bundle",
392
413
  bundleKind: "special",
393
414
  brandSlug: "brand-takara-tomy",
394
415
  bundlePrice: 2499,
395
416
  bundleQueryRule: {
396
417
  type: "static",
397
- productIds: ["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"],
418
+ productIds: ["product-beyblade-x-bx-53-wizardarrow-v2", "product-beyblade-x-bx-53-knightshield-v2", "product-beyblade-burst-valkyrie"],
398
419
  },
399
- bundleProductIds: ["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"],
400
- bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"]),
401
- bundleOriginalTotal: 2847, // 899 + 949 + 999
420
+ bundleProductIds: ["product-beyblade-x-bx-53-wizardarrow-v2", "product-beyblade-x-bx-53-knightshield-v2", "product-beyblade-burst-valkyrie"],
421
+ bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-x-bx-53-wizardarrow-v2", "product-beyblade-x-bx-53-knightshield-v2", "product-beyblade-burst-valkyrie"]),
422
+ // 1500 + 1500 + 999. Recomputed 2026-10-19 when the two fictional X
423
+ // fixtures (899 + 949) were replaced by the real BX-53 component
424
+ // listings — a stale total here drives a wrong discount-% badge.
425
+ bundleOriginalTotal: 3999,
402
426
  bundleStockStatus: "in_stock",
403
427
  display: { coverImage: seedPhoto("bundle-x-series-starter-20260101", 1200, 900), showInFooter: false },
404
428
  isActive: true,
@@ -436,17 +460,20 @@ const bundleRows = [
436
460
  "product-beyblade-original-driger-v",
437
461
  "product-beyblade-metal-storm-pegasus",
438
462
  "product-beyblade-burst-valkyrie",
439
- "product-beyblade-x-wizard-arrow",
463
+ "product-beyblade-x-bx-53-wizardarrow-v2",
440
464
  ],
441
465
  },
442
466
  bundleProductIds: [
443
467
  "product-beyblade-original-driger-v",
444
468
  "product-beyblade-metal-storm-pegasus",
445
469
  "product-beyblade-burst-valkyrie",
446
- "product-beyblade-x-wizard-arrow",
470
+ "product-beyblade-x-bx-53-wizardarrow-v2",
447
471
  ],
448
- bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus", "product-beyblade-burst-valkyrie", "product-beyblade-x-wizard-arrow"]),
449
- bundleOriginalTotal: 4996, // 1799 + 1299 + 999 + 899
472
+ bundleCategorySlugs: bundleCategorySlugsFor(["product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus", "product-beyblade-burst-valkyrie", "product-beyblade-x-bx-53-wizardarrow-v2"]),
473
+ // 1799 + 1299 + 999 + 1500. Recomputed 2026-10-19 — the X member changed
474
+ // from the fictional "wizard-arrow" (899) to the real BX-53 WizardArrow
475
+ // 4-80B Ver.2.0 (1500).
476
+ bundleOriginalTotal: 5597,
450
477
  bundleStockStatus: "in_stock",
451
478
  display: { coverImage: seedPhoto("bundle-every-generation-starter-pack-20260101", 1200, 900), showInFooter: false },
452
479
  isActive: true,
@@ -530,13 +557,51 @@ function withGeneratedContent(row) {
530
557
  */
531
558
  function withGeneratedCoverImage(row) {
532
559
  const existing = row.display?.coverImage;
533
- if (typeof existing === "string" && existing.trim().length > 0)
560
+ /*
561
+ * 🛑 A seed PLACEHOLDER tile does not count as hand-authored.
562
+ *
563
+ * The rule is still "a hand-authored cover wins", but a `seedPhoto(...)`
564
+ * tile was never authored — it is what the seed emits when it has nothing
565
+ * better. Treating it as a decision is what made the placeholder BLOCK every
566
+ * fetched wordmark: a logo could be downloaded, uploaded to Storage, mapped,
567
+ * and the card would still show a grey tile, with nothing anywhere
568
+ * reporting why.
569
+ *
570
+ * So the precedence is: real authored path > generated image > placeholder
571
+ * tile. That lets every branch row keep an honest tile in source — which is
572
+ * what it falls back to when no image exists, and is much better than the
573
+ * empty grey box a brand row would otherwise render, since brand rows carry
574
+ * no `color` and no `icon` either.
575
+ */
576
+ if (typeof existing === "string" && existing.trim().length > 0 && !isSeedPlaceholderImage(existing)) {
534
577
  return row;
578
+ }
535
579
  const generated = row.id ? GENERATED_CATEGORY_IMAGES[row.id] : undefined;
536
580
  if (!generated)
537
581
  return row;
538
582
  return { ...row, display: { ...(row.display ?? {}), coverImage: generated } };
539
583
  }
584
+ /**
585
+ * Attach the REGIONAL-VARIANT logo to a row that names a Hasbro equivalent.
586
+ *
587
+ * 🛑 Gated on `hasbroName`, not merely on the map having an entry. The image is
588
+ * rendered beside the "Also known as" line, so without the name there is
589
+ * nothing to label it and a bare second logo reads as a duplicate of the
590
+ * cover. The name is the fact; the image only illustrates it.
591
+ *
592
+ * Same hand-authored-wins rule as the cover, for the same reason: the admin
593
+ * editor can set `hasbroCoverImage` on a row the generator knows nothing
594
+ * about, and a reseed must not take that away.
595
+ */
596
+ function withGeneratedHasbroCover(row) {
597
+ if (!row.hasbroName)
598
+ return row;
599
+ const existing = row.hasbroCoverImage;
600
+ if (typeof existing === "string" && existing.trim().length > 0)
601
+ return row;
602
+ const generated = row.id ? GENERATED_CATEGORY_HASBRO_IMAGES[row.id] : undefined;
603
+ return generated ? { ...row, hasbroCoverImage: generated } : row;
604
+ }
540
605
  const allCategoryRows = [
541
606
  ...rawCategories.map((c) => ({ ancestors: [], ...c, createdByType: "admin" })),
542
607
  ...sublistingRows.map((s) => ({ ancestors: [], ...s, createdByType: "admin" })),
@@ -546,6 +611,7 @@ const allCategoryRows = [
546
611
  ]
547
612
  .map(withGeneratedContent)
548
613
  .map(withGeneratedCoverImage)
614
+ .map(withGeneratedHasbroCover)
549
615
  .map(withCategorySearchTxt);
550
616
  /*
551
617
  * ── Assertions, at MODULE LOAD, so a silent drop is loud ─────────────────────
@@ -626,6 +692,44 @@ if (generatedImagesApplied < Math.floor(GENERATED_CATEGORY_IMAGE_COUNT * 0.9)) {
626
692
  `scripts/fetch-taxonomy-images.mjs against the current forest. Nothing would error ` +
627
693
  `at load time: the category grids would just go back to blank cards.`);
628
694
  }
695
+ /*
696
+ * The regional-variant logos. This catches ORPHANED logos, and deliberately
697
+ * only those.
698
+ *
699
+ * 🛑 The two directions are NOT symmetric, which a first draft of this comment
700
+ * got wrong until a negative control was actually run against it:
701
+ *
702
+ * - **A map entry whose row does not name a Hasbro wave is an ERROR.**
703
+ * `withGeneratedHasbroCover` gates on `hasbroName`, so that image can
704
+ * never render — it was fetched, uploaded to Storage and mapped, and is
705
+ * now a stored object nothing will ever serve. Silent waste. Throw.
706
+ *
707
+ * - **A named wave with no logo is FINE.** The "Also known as" block renders
708
+ * the name and omits the image (`CategoryDetailPageView` makes the picture
709
+ * conditional), which is a correct, intentional-looking page. Setting a
710
+ * name we can evidence while having no logo we can source is exactly the
711
+ * honest-gap rule the rest of this work follows, so failing the seed for
712
+ * it would punish the right behaviour.
713
+ *
714
+ * Hence `covered !== keys` and NOT `covered !== named`. Exact equality rather
715
+ * than a 90% floor because there are five, hand-set against five confirmed
716
+ * pairings: "most of them" is not a meaningful tolerance at that size.
717
+ */
718
+ const hasbroNamed = allCategoryRows.filter((c) => typeof c.hasbroName === "string" && c.hasbroName);
719
+ const hasbroCovered = hasbroNamed.filter((c) => typeof c.id === "string" && GENERATED_CATEGORY_HASBRO_IMAGES[c.id] === c.hasbroCoverImage);
720
+ const hasbroMapKeys = Object.keys(GENERATED_CATEGORY_HASBRO_IMAGES);
721
+ if (hasbroCovered.length !== hasbroMapKeys.length) {
722
+ const namedIds = new Set(hasbroNamed.map((c) => c.id));
723
+ const orphanLogos = hasbroMapKeys.filter((k) => !namedIds.has(k));
724
+ throw new Error(`category seed: ${hasbroCovered.length} of ${hasbroMapKeys.length} regional-variant logos ` +
725
+ `reached a row that names one. ` +
726
+ (orphanLogos.length > 0
727
+ ? `These have a logo but no hasbroName: ${orphanLogos.join(", ")}. `
728
+ : "") +
729
+ `Either set hasbroName in category-forest.ts, or drop the entry from the manifest and ` +
730
+ `re-run scripts/fetch-category-images.mjs. Nothing would error at load time — the ` +
731
+ `"Also known as" block would just render without its logo.`);
732
+ }
629
733
  const allIds = allCategoryRows.map((c) => c.id).filter((x) => typeof x === "string");
630
734
  const duplicateIds = [...new Set(allIds.filter((id, i) => allIds.indexOf(id) !== i))];
631
735
  if (duplicateIds.length > 0) {
@@ -96,6 +96,22 @@ export const groupedListingsSeedData = [
96
96
  createdBy: "user-admin-letitrip",
97
97
  createdAt: daysAgo(15),
98
98
  updatedAt: daysAgo(3),
99
+ /*
100
+ * Part Two E — the one seeded fixture exercising self-assembled-selection
101
+ * rules end to end (`GroupMemberPicker` ↔ `checkGroupRules` ↔
102
+ * `deriveLinePrice`'s discount), without requiring the sticker tracer's
103
+ * multi-step admin flow to produce one first.
104
+ *
105
+ * 🛑 Deliberately NOT `minActiveMembers` (above) — that is visibility ("hide
106
+ * the whole group below 2 ACTIVE members"). `groupMinMembers` constrains
107
+ * what ONE BUYER'S SELECTION may contain, and the two can legitimately
108
+ * disagree: this group stays visible at 2 active members while requiring a
109
+ * buyer to pick at least 2 of the 4.
110
+ */
111
+ groupMinMembers: 2,
112
+ groupMaxMembers: 3,
113
+ groupMaxUnitsPerMember: 2,
114
+ groupDiscountPercent: 10,
99
115
  },
100
116
  // --- Coverage for every other listing type — previously only standard products had a
101
117
  // group, so the public GroupedListingsCarousel (Phase 3) had nothing to render on
@@ -1,6 +1,14 @@
1
1
  /*
2
2
  * WHY: Seeds the homepage layout — which sections render, in what order, with what copy.
3
- * WHAT: 23 sections (22 enabled + 1 deliberately disabled), ordered 1..23 contiguously.
3
+ * WHAT: 24 sections (23 enabled + 1 deliberately disabled), ordered 1..24 contiguously.
4
+ * `google-reviews` is a REGISTERED type with no document — see the note
5
+ * beside the deliberate budget-tile omission below for why. Three more joined
6
+ * it 2026-10-19 (`how-it-works`/`testimonials`/`promo-grid`, promoted out of
7
+ * the orphan-component set into real `SectionType`s + `SECTION_REGISTRY`
8
+ * entries) — deliberately left unseeded too: each is now available in the
9
+ * admin section builder's create picker, so an admin can add one when there is
10
+ * real copy to put in it, rather than this file inventing placeholder "How It
11
+ * Works" steps or testimonials nobody actually said.
4
12
  *
5
13
  * 🛑 That count and range are ASSERTED, not described — `order` must stay unique
6
14
  * and contiguous. Until 2026-10-19 this header read "22 sections … 1..21" while
@@ -8,7 +16,10 @@
8
16
  * `section-featured-products` BOTH claimed `order: 5`. `MarketplaceHomepageView`
9
17
  * tie-breaks on `updatedAt` (identical for both) and then `id.localeCompare`, so
10
18
  * the live running order of the homepage was decided alphabetically — a silent
11
- * accident, not a layout decision.
19
+ * accident, not a layout decision. The 24th document (`collection-cards`,
20
+ * added the same day) closed the other half of that finding: a registered
21
+ * section type with a renderer and zero seeded rows is the same class of gap,
22
+ * just silent rather than colliding.
12
23
  *
13
24
  * ORDER follows current marketplace-homepage research rather than the previous
14
25
  * arbitrary arrangement: hero → trust → orient (categories, systems matrix) →
@@ -146,7 +157,14 @@ export const homepageSectionsSeedData = [
146
157
  enabled: true,
147
158
  config: {
148
159
  title: "Shop by Category",
149
- maxCategories: 8,
160
+ /*
161
+ * 6, from the `categories-generation-tiles` SECTION_TEMPLATE — and 6 is a
162
+ * measured number, not a round one: worldhobbyshop's "Shop Beyblades by
163
+ * Generation" is exactly six tiles (Beyblade X, Burst, Metal, Plastic
164
+ * Generation, Launchers & Grips, Stadiums & Arenas), 3 columns at 1280 and
165
+ * 1 at 390. See docs/research/competitor-crawl-2026-10/layout.md.
166
+ */
167
+ maxCategories: 6,
150
168
  viewMoreLabel: "All categories →",
151
169
  autoScroll: false,
152
170
  scrollInterval: 5000,
@@ -166,7 +184,20 @@ export const homepageSectionsSeedData = [
166
184
  config: {
167
185
  title: "Featured Products",
168
186
  subtitle: "Hand-picked listings from verified sellers.",
169
- maxItems: 12,
187
+ /*
188
+ * 8, from the `products-recently-added` SECTION_TEMPLATE, which took it
189
+ * from worldhobbyshop's one product rail — measured 2026-10-19 at exactly
190
+ * 8 cards, 4 columns (docs/research/competitor-crawl-2026-10/layout.md).
191
+ * The SEO leader ships the fewest products on its homepage; its advantage
192
+ * is taxonomy routing, not merchandising volume.
193
+ *
194
+ * Safe against the `<= 12` rule above: SSR still supplies 12 via
195
+ * getFeatured*(12) and this renders 8 of them, so it can never under-fill.
196
+ * The 4-row over-fetch is deliberate — `getFeaturedProducts(12)` is shared
197
+ * with the auctions and pre-orders rails, so narrowing it to match would
198
+ * couple three sections' counts to one fetch.
199
+ */
200
+ maxItems: 8,
170
201
  viewMoreLabel: "View all products →",
171
202
  rows: 1,
172
203
  autoScroll: false,
@@ -324,7 +355,10 @@ export const homepageSectionsSeedData = [
324
355
  enabled: true,
325
356
  config: {
326
357
  title: "From Our Blog",
327
- maxArticles: 6,
358
+ // 4, from the `blog-four-excerpts` SECTION_TEMPLATE (beybladeartshop ships
359
+ // four article excerpts). Safe against the SSR fetch, which supplies 6 via
360
+ // getFeaturedBlogPosts(6) — this renders 4 of them.
361
+ maxArticles: 4,
328
362
  viewMoreLabel: "View all posts →",
329
363
  showReadTime: true,
330
364
  showAuthor: true,
@@ -676,6 +710,61 @@ export const homepageSectionsSeedData = [
676
710
  createdAt: daysAgo(1),
677
711
  updatedAt: daysAgo(1),
678
712
  },
713
+ /*
714
+ * `collection-cards` had a renderer and a builder with zero seeded rows — a
715
+ * type nobody ever saw, structurally identical to 22 missing-order or
716
+ * mis-ordered sections elsewhere in this file: a gap only a human reading
717
+ * the schema would ever notice.
718
+ *
719
+ * 🛑 Deliberately scoped to `categories` / `brands` / `stores` — the three
720
+ * axes that are PERMANENT regardless of product count. Even if every one of
721
+ * the 1,237 generated catalogue products were deleted, these three entry
722
+ * types would still resolve to real, populated rows: 1,185 categories, 28
723
+ * brand rows, 5 stores, all seeded independently of the product catalogue.
724
+ * A `"products"` or `"auctions"` entry here would be the opposite — a card
725
+ * that goes empty the moment the catalogue does, on a section whose entire
726
+ * point is to always have something to show.
727
+ */
728
+ {
729
+ id: "section-top-collections",
730
+ type: "collection-cards",
731
+ order: 24,
732
+ enabled: true,
733
+ config: {
734
+ title: "Explore the Marketplace",
735
+ subtitle: "Three ways into the catalogue that never go empty.",
736
+ layout: "grid",
737
+ itemsPerRow: 3,
738
+ showCollectionTabs: false,
739
+ collections: [
740
+ { type: "categories", label: "Shop by Generation", limit: 6 },
741
+ { type: "brands", label: "Shop by Brand", limit: 8 },
742
+ { type: "stores", label: "Verified Sellers", limit: 5 },
743
+ ],
744
+ cta: { label: "View all categories →", href: String(ROUTES.PUBLIC.CATEGORIES), variant: "text" },
745
+ },
746
+ createdAt: daysAgo(1),
747
+ updatedAt: daysAgo(1),
748
+ },
749
+ /*
750
+ * 🛑 `google-reviews` stays DELIBERATELY UNSEEDED — not an oversight, the
751
+ * same decision already made for `googleMapsApiKey`/`googlePlaceId` in
752
+ * `site-settings-seed-data.ts`: those are seeded `""` on purpose, because
753
+ * their consumers (`GoogleReviewsSectionConfig.placeId` is this section's
754
+ * only REQUIRED field) read them directly and would treat a placeholder as
755
+ * a usable credential, producing a failed, possibly BILLED Google Places
756
+ * API call instead of skipping cleanly.
757
+ *
758
+ * Reviews pulled from this section are real third-party content keyed to a
759
+ * real Google Business Profile this project does not have. Fabricating a
760
+ * `placeId` would either hit Google's API with an invalid key (cost, for a
761
+ * call that can never succeed) or — worse — a VALID placeId for a real,
762
+ * unrelated business, rendering someone else's reviews as this store's own.
763
+ * Neither is a seed-data problem to paper over; it is a real business
764
+ * prerequisite (a Google Business Profile must exist) that has not happened
765
+ * yet. The type stays in `SectionType` and `SECTION_REGISTRY` — it is a real
766
+ * feature with zero fabricated data, not a bug.
767
+ */
679
768
  /*
680
769
  * 🛑 TCI's five BUDGET TILES ("Under ₹499 / ₹799 / ₹999 / ₹1499") are
681
770
  * DELIBERATELY NOT SEEDED, and this is a decision rather than an omission.
@@ -19,8 +19,6 @@ export type { SeedCategoryDocument } from "./factories/category.factory";
19
19
  export { makeCategory } from "./factories/category.factory";
20
20
  export type { SeedCarouselSlideDocument } from "./factories/carousel.factory";
21
21
  export { makeCarouselSlide } from "./factories/carousel.factory";
22
- export type { SeedHomepageSectionDocument, HomepageSectionType, } from "./factories/homepage-section.factory";
23
- export { makeHomepageSection } from "./factories/homepage-section.factory";
24
22
  export type { SeedAddressDocument } from "./factories/address.factory";
25
23
  export { makeAddress, makeFullAddress, ADDRESS_FIXTURES, } from "./factories/address.factory";
26
24
  export type { SeedCartDocument, SeedCartItemDocument, } from "./factories/cart.factory";
@@ -37,7 +35,6 @@ export type { SeedPayoutDocument, PayoutStatus, } from "./factories/payout.facto
37
35
  export { makePayout, makeFullPayout, PAYOUT_FIXTURES, } from "./factories/payout.factory";
38
36
  export { DEFAULT_CATEGORIES } from "./defaults/categories";
39
37
  export { DEFAULT_FAQS } from "./defaults/faqs";
40
- export { DEFAULT_HOMEPAGE_SECTIONS } from "./defaults/homepage-sections";
41
38
  export { usersSeedData } from "./users-seed-data";
42
39
  export { sessionsSeedData, SESSION_COLLECTION } from "./sessions-seed-data";
43
40
  export { addressesSeedData } from "./addresses-seed-data";
@@ -45,6 +42,7 @@ export { storesSeedData } from "./stores-seed-data";
45
42
  export { storeAddressesSeedData } from "./store-addresses-seed-data";
46
43
  export { categoriesSeedData, categoriesP1SeedData } from "./categories-seed-data";
47
44
  export { productsStandardSeedData } from "./products-standard-seed-data";
45
+ export { productsBeybladeXSeedData } from "./products-beyblade-x-seed-data";
48
46
  export { productsAuctionsSeedData } from "./products-auctions-seed-data";
49
47
  export { productsPreordersSeedData } from "./products-preorders-seed-data";
50
48
  export { productsPrizeDrawsSeedData } from "./products-prize-draws-seed-data";
@@ -53,6 +51,7 @@ export { productsDigitalCodesSeedData } from "./products-digital-codes-seed-data
53
51
  export { productsLiveItemsSeedData } from "./products-live-items-seed-data";
54
52
  export { productsArtSeedData } from "./products-art-seed-data";
55
53
  export { productsStickersSeedData } from "./products-stickers-seed-data";
54
+ export { productsSparesSeedData } from "./products-spares-seed-data";
56
55
  export { ordersSeedData } from "./orders-seed-data";
57
56
  export { reviewsSeedData } from "./reviews-seed-data";
58
57
  export { cartsSeedData } from "./cart-seed-data";
@@ -14,7 +14,6 @@ export { makeBlogPost } from "./factories/blog-post.factory.js";
14
14
  export { makeFaq } from "./factories/faq.factory.js";
15
15
  export { makeCategory } from "./factories/category.factory.js";
16
16
  export { makeCarouselSlide } from "./factories/carousel.factory.js";
17
- export { makeHomepageSection } from "./factories/homepage-section.factory.js";
18
17
  export { makeAddress, makeFullAddress, ADDRESS_FIXTURES, } from "./factories/address.factory.js";
19
18
  export { makeCart, makeCartItem, makeFullCart, CART_FIXTURES, } from "./factories/cart.factory.js";
20
19
  export { makeBid, makeWinningBid, BID_FIXTURES } from "./factories/bid.factory.js";
@@ -25,7 +24,6 @@ export { makePayout, makeFullPayout, PAYOUT_FIXTURES, } from "./factories/payout
25
24
  // Defaults
26
25
  export { DEFAULT_CATEGORIES } from "./defaults/categories.js";
27
26
  export { DEFAULT_FAQS } from "./defaults/faqs.js";
28
- export { DEFAULT_HOMEPAGE_SECTIONS } from "./defaults/homepage-sections.js";
29
27
  // Migrated seed datasets from consumer repositories
30
28
  // SB-UNI-C — brandsSeedData merged into categoriesSeedData with categoryType:"brand".
31
29
  export { usersSeedData } from "./users-seed-data.js";
@@ -35,6 +33,7 @@ export { storesSeedData } from "./stores-seed-data.js";
35
33
  export { storeAddressesSeedData } from "./store-addresses-seed-data.js";
36
34
  export { categoriesSeedData, categoriesP1SeedData } from "./categories-seed-data.js";
37
35
  export { productsStandardSeedData } from "./products-standard-seed-data.js";
36
+ export { productsBeybladeXSeedData } from "./products-beyblade-x-seed-data.js";
38
37
  /*
39
38
  * 🛑 `productsCatalogueSeedData` DELETED (I6, 2026-10-13) — 968 generated
40
39
  * listings, one per tier-4 leaf. "I do not need products ... rest is either
@@ -53,6 +52,7 @@ export { productsDigitalCodesSeedData } from "./products-digital-codes-seed-data
53
52
  export { productsLiveItemsSeedData } from "./products-live-items-seed-data.js";
54
53
  export { productsArtSeedData } from "./products-art-seed-data.js";
55
54
  export { productsStickersSeedData } from "./products-stickers-seed-data.js";
55
+ export { productsSparesSeedData } from "./products-spares-seed-data.js";
56
56
  export { ordersSeedData } from "./orders-seed-data.js";
57
57
  export { reviewsSeedData } from "./reviews-seed-data.js";
58
58
  export { cartsSeedData } from "./cart-seed-data.js";
@@ -19,6 +19,7 @@ import { productsDigitalCodesSeedData } from "./products-digital-codes-seed-data
19
19
  import { productsLiveItemsSeedData } from "./products-live-items-seed-data.js";
20
20
  import { productsArtSeedData } from "./products-art-seed-data.js";
21
21
  import { productsStickersSeedData } from "./products-stickers-seed-data.js";
22
+ import { productsSparesSeedData } from "./products-spares-seed-data.js";
22
23
  import { ordersSeedData } from "./orders-seed-data.js";
23
24
  import { reviewsSeedData } from "./reviews-seed-data.js";
24
25
  import { bidsSeedData } from "./bids-seed-data.js";
@@ -68,6 +69,7 @@ function pick(items, nameKey = "name") {
68
69
  // "bundle" is a categoryType, not a ListingType — falls through to "bundle" below.
69
70
  const LISTING_TYPE_TO_MANIFEST_TAG = {
70
71
  standard: "standard",
72
+ spares: "spares",
71
73
  auction: "auction",
72
74
  "pre-order": "preorder",
73
75
  "prize-draw": "prize-draw",
@@ -97,6 +99,7 @@ export const SEED_MANIFEST = {
97
99
  ...asArr(productsLiveItemsSeedData),
98
100
  ...asArr(productsArtSeedData),
99
101
  ...asArr(productsStickersSeedData),
102
+ ...asArr(productsSparesSeedData),
100
103
  ].map((p) => ({
101
104
  ...p,
102
105
  type: p.listingType === "bundle"
@@ -19,4 +19,4 @@
19
19
  */
20
20
  import type { MediaAssetDocument } from "../features/media/repository/media-assets.repository";
21
21
  export declare const mediaAssetsSeedData: Partial<MediaAssetDocument>[];
22
- export declare const MEDIA_ASSET_SEED_COUNT = 504;
22
+ export declare const MEDIA_ASSET_SEED_COUNT = 559;