@mohasinac/appkit 4.53.1 → 4.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/theme/ThemeProvider.js +15 -1
  3. package/dist/_internal/server/features/auth/capabilities.js +7 -5
  4. package/dist/_internal/server/features/categories/price-guidance-resolve.d.ts +66 -0
  5. package/dist/_internal/server/features/categories/price-guidance-resolve.js +138 -0
  6. package/dist/_internal/server/features/checkout/actions.d.ts +22 -6
  7. package/dist/_internal/server/features/checkout/actions.js +96 -51
  8. package/dist/_internal/server/features/checkout/index.d.ts +1 -1
  9. package/dist/_internal/server/features/checkout/index.js +1 -1
  10. package/dist/_internal/server/features/checkout/supplier-identity.js +28 -6
  11. package/dist/_internal/server/features/orders/adapters.js +1 -3
  12. package/dist/_internal/server/features/price-index/market.d.ts +57 -0
  13. package/dist/_internal/server/features/price-index/market.js +120 -0
  14. package/dist/_internal/server/features/products/list-public.d.ts +12 -0
  15. package/dist/_internal/server/features/products/list-public.js +10 -1
  16. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +25 -1
  17. package/dist/_internal/server/features/products/listing-tab-counts.js +184 -10
  18. package/dist/_internal/server/features/search/index-build/sources.js +43 -2
  19. package/dist/_internal/server/features/site-settings/adapters.js +1 -1
  20. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  21. package/dist/_internal/server/features/stores/adapters.js +0 -1
  22. package/dist/_internal/server/features/stores/tabs.d.ts +7 -2
  23. package/dist/_internal/server/features/stores/tabs.js +5 -3
  24. package/dist/_internal/server/jobs/core/analyticsAlertEvaluate.js +2 -5
  25. package/dist/_internal/server/jobs/core/jobRunners.js +0 -10
  26. package/dist/_internal/server/jobs/core/onOrderCreate.js +10 -104
  27. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +0 -2
  28. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +0 -1
  29. package/dist/_internal/server/jobs/core/onScamReportCreate.js +0 -1
  30. package/dist/_internal/server/jobs/core/onScamReportRejected.js +0 -1
  31. package/dist/_internal/server/jobs/core/onScamReportVerified.js +0 -1
  32. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +0 -1
  33. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +0 -1
  34. package/dist/_internal/server/notifications/channel-health.d.ts +7 -3
  35. package/dist/_internal/server/notifications/channel-health.js +2 -2
  36. package/dist/_internal/server/notifications/send-guard.d.ts +1 -1
  37. package/dist/_internal/server/notifications/send-guard.js +2 -4
  38. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  39. package/dist/_internal/shared/actions/action-registry.js +128 -28
  40. package/dist/_internal/shared/checkout/order-math.d.ts +1 -1
  41. package/dist/_internal/shared/checkout/order-math.js +1 -1
  42. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +1 -1
  43. package/dist/_internal/shared/features/checkout/config.d.ts +0 -2
  44. package/dist/_internal/shared/features/checkout/config.js +0 -2
  45. package/dist/_internal/shared/features/messaging/config.d.ts +7 -5
  46. package/dist/_internal/shared/features/messaging/config.js +1 -4
  47. package/dist/_internal/shared/features/site-settings/fees.d.ts +0 -2
  48. package/dist/_internal/shared/features/site-settings/fees.js +0 -2
  49. package/dist/_internal/shared/features/site-settings/supplier-of-record.d.ts +56 -0
  50. package/dist/_internal/shared/features/site-settings/supplier-of-record.js +57 -0
  51. package/dist/_internal/shared/fees/calculator.d.ts +0 -8
  52. package/dist/_internal/shared/fees/calculator.js +0 -7
  53. package/dist/_internal/shared/listing-types/tiers.d.ts +94 -0
  54. package/dist/_internal/shared/listing-types/tiers.js +150 -0
  55. package/dist/_internal/shared/search/match.js +28 -2
  56. package/dist/cli/index.js +0 -2
  57. package/dist/client.d.ts +25 -4
  58. package/dist/client.js +36 -5
  59. package/dist/constants/api-endpoints.d.ts +28 -15
  60. package/dist/constants/api-endpoints.js +14 -8
  61. package/dist/constants/field-names.d.ts +1 -0
  62. package/dist/constants/field-names.js +1 -0
  63. package/dist/constants/notification-types.d.ts +1 -1
  64. package/dist/constants/notification-types.js +1 -1
  65. package/dist/core/integration-keys.d.ts +5 -5
  66. package/dist/core/integration-keys.js +21 -10
  67. package/dist/features/about/components/FeesView.js +0 -6
  68. package/dist/features/about/components/GuidesHubView.js +15 -2
  69. package/dist/features/account/components/NotificationPreferencesPanel.js +3 -4
  70. package/dist/features/account/components/UserOrdersView.js +26 -7
  71. package/dist/features/account/types/index.d.ts +0 -2
  72. package/dist/features/addresses/utils/postal-autofill.d.ts +39 -0
  73. package/dist/features/addresses/utils/postal-autofill.js +54 -0
  74. package/dist/features/admin/actions/notification-actions.d.ts +2 -8
  75. package/dist/features/admin/actions/notification-actions.js +9 -104
  76. package/dist/features/admin/components/AdminGuideHubView.js +1 -8
  77. package/dist/features/admin/components/AdminOrderEditorView.d.ts +1 -1
  78. package/dist/features/admin/components/AdminOrdersView.js +0 -2
  79. package/dist/features/admin/components/AdminSectionsView.js +3 -2
  80. package/dist/features/admin/components/AdminSiteSettingsView.js +22 -68
  81. package/dist/features/admin/components/AdminStoreEditorView.js +72 -34
  82. package/dist/features/admin/components/OwnerQuickActions.d.ts +29 -0
  83. package/dist/features/admin/components/OwnerQuickActions.js +142 -0
  84. package/dist/features/admin/components/sections/adminSectionsTypes.js +13 -4
  85. package/dist/features/admin/components/sections/icon-options.d.ts +21 -0
  86. package/dist/features/admin/components/sections/icon-options.js +23 -0
  87. package/dist/features/admin/components/sections/sectionTemplates.js +4 -1
  88. package/dist/features/admin/constants/site-settings-tabs.d.ts +7 -12
  89. package/dist/features/admin/constants/site-settings-tabs.js +6 -12
  90. package/dist/features/admin/repository/site-settings.repository.js +1 -1
  91. package/dist/features/admin/schemas/admin-editor-forms.d.ts +1 -1
  92. package/dist/features/admin/schemas/admin-editor-forms.js +4 -1
  93. package/dist/features/admin/schemas/admin-user-form.d.ts +0 -61
  94. package/dist/features/admin/schemas/admin-user-form.js +3 -44
  95. package/dist/features/admin/schemas/firestore.d.ts +28 -54
  96. package/dist/features/admin/schemas/firestore.js +40 -18
  97. package/dist/features/auctions/components/AuctionDetailPageView.js +12 -10
  98. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -1
  99. package/dist/features/auctions/components/MarketplaceAuctionCard.js +9 -2
  100. package/dist/features/auth/checkout-value-otp.d.ts +1 -1
  101. package/dist/features/auth/checkout-value-otp.js +1 -1
  102. package/dist/features/auth/permissions/constants.d.ts +29 -2
  103. package/dist/features/auth/permissions/constants.js +67 -1
  104. package/dist/features/blog/components/BlogFeaturedCard.d.ts +11 -1
  105. package/dist/features/blog/components/BlogFeaturedCard.js +9 -2
  106. package/dist/features/cart/components/CartDrawer.js +3 -2
  107. package/dist/features/cart/components/CartGroupLineRow.js +2 -1
  108. package/dist/features/cart/components/CartPriceBreakdown.d.ts +0 -2
  109. package/dist/features/cart/components/CartPriceBreakdown.js +1 -1
  110. package/dist/features/cart/components/StoreAddonsPicker.d.ts +2 -5
  111. package/dist/features/cart/components/StoreAddonsPicker.js +4 -5
  112. package/dist/features/cart/hooks/useAddToCart.js +10 -5
  113. package/dist/features/cart/repository/cart.repository.js +1 -2
  114. package/dist/features/cart/schemas/firestore.d.ts +1 -2
  115. package/dist/features/cart/utils/pending-ops.d.ts +11 -1
  116. package/dist/features/cart/utils/pending-ops.js +14 -2
  117. package/dist/features/categories/api/[id]/price-guidance/route.js +1 -24
  118. package/dist/features/categories/components/BrandDetailPageView.js +15 -6
  119. package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -1
  120. package/dist/features/categories/components/BrandDetailTabs.js +18 -3
  121. package/dist/features/categories/components/BundleCollage.js +3 -2
  122. package/dist/features/categories/components/BundleDetailView.js +2 -1
  123. package/dist/features/categories/components/BundleItemsPicker.js +3 -4
  124. package/dist/features/categories/components/CategoryDetailPageView.js +19 -8
  125. package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
  126. package/dist/features/categories/components/CategoryDetailTabs.js +29 -7
  127. package/dist/features/categories/components/CategoryGrid.d.ts +11 -1
  128. package/dist/features/categories/components/CategoryGrid.js +9 -2
  129. package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +10 -5
  130. package/dist/features/checkout/actions/checkout-value-otp-actions.js +2 -88
  131. package/dist/features/classified/components/ClassifiedDetailPageView.js +12 -2
  132. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +12 -2
  133. package/dist/features/events/components/EventCard.d.ts +11 -1
  134. package/dist/features/events/components/EventCard.js +9 -2
  135. package/dist/features/grouped/components/GroupedListingDetailView.js +3 -1
  136. package/dist/features/homepage/components/CTABannerSection.d.ts +3 -1
  137. package/dist/features/homepage/components/CTABannerSection.js +6 -3
  138. package/dist/features/homepage/components/HeroCarousel.js +8 -6
  139. package/dist/features/homepage/components/MarketplaceHomepageView.js +33 -7
  140. package/dist/features/homepage/components/SectionCarousel.js +13 -5
  141. package/dist/features/homepage/components/SecurityHighlightsSection.d.ts +8 -3
  142. package/dist/features/homepage/components/SecurityHighlightsSection.js +2 -2
  143. package/dist/features/homepage/components/StatsCounterSection.d.ts +9 -4
  144. package/dist/features/homepage/components/StatsCounterSection.js +2 -2
  145. package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
  146. package/dist/features/homepage/components/TrustFeaturesSection.d.ts +18 -4
  147. package/dist/features/homepage/components/TrustFeaturesSection.js +5 -5
  148. package/dist/features/homepage/components/WelcomeSection.d.ts +13 -2
  149. package/dist/features/homepage/components/WelcomeSection.js +3 -3
  150. package/dist/features/homepage/components/WhatsAppCommunitySection.d.ts +28 -0
  151. package/dist/features/homepage/components/WhatsAppCommunitySection.js +42 -6
  152. package/dist/features/homepage/components/WhatsAppGlyph.d.ts +20 -0
  153. package/dist/features/homepage/components/WhatsAppGlyph.js +20 -0
  154. package/dist/features/homepage/constants/hero-carousel-styles.d.ts +8 -6
  155. package/dist/features/homepage/constants/hero-carousel-styles.js +8 -6
  156. package/dist/features/homepage/constants/section-copy.d.ts +12 -10
  157. package/dist/features/homepage/constants/section-copy.js +28 -6
  158. package/dist/features/homepage/constants/stat-icons.d.ts +12 -0
  159. package/dist/features/homepage/constants/stat-icons.js +17 -0
  160. package/dist/features/homepage/constants/trust-icon-aliases.d.ts +8 -0
  161. package/dist/features/homepage/constants/trust-icon-aliases.js +75 -0
  162. package/dist/features/homepage/lib/section-defaults.d.ts +16 -1
  163. package/dist/features/homepage/lib/section-defaults.js +24 -4
  164. package/dist/features/homepage/lib/section-renderer.js +48 -8
  165. package/dist/features/homepage/schemas/firestore.d.ts +18 -1
  166. package/dist/features/layout/AppLayoutShell.js +2 -1
  167. package/dist/features/layout/BottomActions.d.ts +1 -0
  168. package/dist/features/layout/BottomActions.js +330 -0
  169. package/dist/features/layout/BottomChrome.d.ts +45 -0
  170. package/dist/features/layout/BottomChrome.js +5 -17
  171. package/dist/features/layout/SideActionDock.js +36 -13
  172. package/dist/features/layout/index.d.ts +2 -7
  173. package/dist/features/layout/index.js +7 -7
  174. package/dist/features/layout/useIsDesktop.d.ts +36 -0
  175. package/dist/features/layout/useIsDesktop.js +48 -0
  176. package/dist/features/live/components/LiveItemDetailPageView.js +12 -2
  177. package/dist/features/orders/actions/refund-actions.js +0 -1
  178. package/dist/features/orders/components/OrderAddonBadges.d.ts +1 -3
  179. package/dist/features/orders/components/OrderAddonBadges.js +3 -4
  180. package/dist/features/orders/components/OrderPaymentSummary.js +15 -2
  181. package/dist/features/orders/components/YourPurchaseStrip.d.ts +24 -0
  182. package/dist/features/orders/components/YourPurchaseStrip.js +77 -0
  183. package/dist/features/orders/components/index.d.ts +2 -1
  184. package/dist/features/orders/components/index.js +1 -1
  185. package/dist/features/orders/repository/orders.repository.d.ts +0 -8
  186. package/dist/features/orders/repository/orders.repository.js +0 -2
  187. package/dist/features/orders/schemas/firestore.d.ts +17 -9
  188. package/dist/features/orders/types/index.d.ts +2 -5
  189. package/dist/features/orders/utils/order-announcement-message.d.ts +18 -0
  190. package/dist/features/orders/utils/order-announcement-message.js +16 -0
  191. package/dist/features/orders/utils/payment-proof-message.d.ts +20 -0
  192. package/dist/features/orders/utils/payment-proof-message.js +17 -0
  193. package/dist/features/parts/components/PartDetailPageView.js +96 -1
  194. package/dist/features/parts/schemas/firestore.d.ts +247 -0
  195. package/dist/features/parts/schemas/firestore.js +6 -6
  196. package/dist/features/pre-orders/components/MarketplacePreorderCard.d.ts +11 -1
  197. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +10 -3
  198. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +12 -10
  199. package/dist/features/price-index/components/PriceIndexToolView.d.ts +21 -0
  200. package/dist/features/price-index/components/PriceIndexToolView.js +230 -27
  201. package/dist/features/price-index/lookup-target.d.ts +48 -0
  202. package/dist/features/price-index/lookup-target.js +107 -0
  203. package/dist/features/products/api/[id]/route.js +8 -1
  204. package/dist/features/products/api/route.js +16 -4
  205. package/dist/features/products/components/AvailabilityScopeHint.d.ts +22 -0
  206. package/dist/features/products/components/AvailabilityScopeHint.js +27 -0
  207. package/dist/features/products/components/CompareOverlay.d.ts +2 -1
  208. package/dist/features/products/components/CompareOverlay.js +2 -1
  209. package/dist/features/products/components/GroupSettingsPanel.js +2 -1
  210. package/dist/features/products/components/InteractiveProductCard.d.ts +7 -1
  211. package/dist/features/products/components/InteractiveProductCard.js +16 -4
  212. package/dist/features/products/components/MarketplaceBundleCard.d.ts +11 -1
  213. package/dist/features/products/components/MarketplaceBundleCard.js +9 -2
  214. package/dist/features/products/components/MarketplacePrizeDrawCard.d.ts +11 -1
  215. package/dist/features/products/components/MarketplacePrizeDrawCard.js +9 -2
  216. package/dist/features/products/components/PrizeDrawDetailPageView.js +2 -1
  217. package/dist/features/products/components/ProductDetailPageView.js +34 -4
  218. package/dist/features/products/components/ProductGrid.d.ts +14 -1
  219. package/dist/features/products/components/ProductGrid.js +22 -5
  220. package/dist/features/products/components/ProductsIndexListing.js +2 -2
  221. package/dist/features/products/components/SublistingCarouselSection.js +2 -1
  222. package/dist/features/products/repository/products.repository.d.ts +1 -0
  223. package/dist/features/products/repository/products.repository.js +5 -1
  224. package/dist/features/products/utils/group-member-image.d.ts +9 -2
  225. package/dist/features/products/utils/group-member-image.js +2 -1
  226. package/dist/features/reviews/api/[id]/route.js +83 -23
  227. package/dist/features/reviews/components/PurchaseReviewAffordance.d.ts +6 -0
  228. package/dist/features/reviews/components/PurchaseReviewAffordance.js +42 -0
  229. package/dist/features/reviews/components/ReviewFormDrawer.d.ts +34 -0
  230. package/dist/features/reviews/components/ReviewFormDrawer.js +127 -0
  231. package/dist/features/reviews/components/index.d.ts +4 -0
  232. package/dist/features/reviews/components/index.js +2 -0
  233. package/dist/features/scams/schemas/index.d.ts +10 -10
  234. package/dist/features/search/action-index/settings-entries.js +0 -9
  235. package/dist/features/seller/actions/seller-actions.d.ts +1 -1
  236. package/dist/features/seller/actions/seller-actions.js +49 -3
  237. package/dist/features/seller/components/SellerPayoutSettingsView.js +30 -2
  238. package/dist/features/seller/components/SellerProductShell.d.ts +17 -1
  239. package/dist/features/seller/components/SellerProductsView.js +3 -2
  240. package/dist/features/seller/hooks/useStoreListingEntitlements.d.ts +8 -0
  241. package/dist/features/seller/hooks/useStoreListingEntitlements.js +70 -0
  242. package/dist/features/store-extensions/repository/store-extensions.repositories.d.ts +1 -6
  243. package/dist/features/store-extensions/repository/store-extensions.repositories.js +1 -10
  244. package/dist/features/store-extensions/schemas/firestore.d.ts +1 -17
  245. package/dist/features/store-extensions/schemas/firestore.js +0 -10
  246. package/dist/features/stores/components/InteractiveStoreCard.d.ts +11 -1
  247. package/dist/features/stores/components/InteractiveStoreCard.js +9 -2
  248. package/dist/features/stores/components/StoreAuctionsListing.js +2 -1
  249. package/dist/features/stores/components/StoreCapabilitiesGuideView.js +0 -1
  250. package/dist/features/stores/components/StoreGuideHubView.js +2 -8
  251. package/dist/features/stores/components/StoreSettingsGuideView.js +2 -6
  252. package/dist/features/stores/components/index.d.ts +0 -2
  253. package/dist/features/stores/components/index.js +0 -1
  254. package/dist/features/stores/repository/store.repository.d.ts +1 -26
  255. package/dist/features/stores/repository/store.repository.js +5 -60
  256. package/dist/features/stores/schemas/firestore.d.ts +6 -25
  257. package/dist/features/stores/schemas/firestore.js +6 -3
  258. package/dist/features/stores/schemas/index.d.ts +1 -87
  259. package/dist/features/stores/schemas/index.js +10 -15
  260. package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -48
  261. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -40
  262. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +114 -2
  263. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -16
  264. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +1 -1
  265. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -79
  266. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +1 -1
  267. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +427 -69
  268. package/dist/index.d.ts +20 -32
  269. package/dist/index.js +34 -43
  270. package/dist/next/routing/route-map.d.ts +2 -8
  271. package/dist/next/routing/route-map.js +21 -4
  272. package/dist/providers/db-firebase/base.repository.d.ts +1 -1
  273. package/dist/providers/db-firebase/base.repository.js +1 -1
  274. package/dist/providers/payment-razorpay/index.d.ts +125 -0
  275. package/dist/providers/payment-razorpay/index.js +232 -0
  276. package/dist/providers/payment-razorpay/signature.d.ts +53 -0
  277. package/dist/providers/payment-razorpay/signature.js +71 -0
  278. package/dist/providers/shipping-shiprocket/index.d.ts +98 -0
  279. package/dist/providers/shipping-shiprocket/index.js +356 -0
  280. package/dist/providers.d.ts +3 -0
  281. package/dist/providers.js +3 -0
  282. package/dist/react/hooks/useCanSeePrices.d.ts +0 -27
  283. package/dist/react/hooks/useCanSeePrices.js +25 -0
  284. package/dist/repositories/index.d.ts +1 -1
  285. package/dist/repositories/index.js +1 -1
  286. package/dist/schemas/registry.d.ts +10 -115
  287. package/dist/schemas/registry.js +1 -2
  288. package/dist/security/pii-encrypt.js +1 -1
  289. package/dist/seed/_helpers/category-forest.js +27 -0
  290. package/dist/seed/_helpers/category-parts-glossary-map.js +1816 -86
  291. package/dist/seed/_helpers/category-parts.d.ts +1 -1
  292. package/dist/seed/_helpers/category-parts.js +13412 -3020
  293. package/dist/seed/carousel-slides-seed-data.js +47 -10
  294. package/dist/seed/categories-seed-data.js +48 -6
  295. package/dist/seed/faq-seed-data.js +2 -2
  296. package/dist/seed/homepage-sections-seed-data.js +286 -54
  297. package/dist/seed/index.d.ts +1 -1
  298. package/dist/seed/index.js +1 -1
  299. package/dist/seed/manifest.d.ts +1 -1
  300. package/dist/seed/manifest.js +1 -2
  301. package/dist/seed/model-composition-seed-data.js +6 -8
  302. package/dist/seed/part-glossary/chunk0.d.ts +9 -0
  303. package/dist/seed/part-glossary/chunk0.js +35448 -0
  304. package/dist/seed/part-glossary/chunk1.d.ts +9 -0
  305. package/dist/seed/part-glossary/chunk1.js +40494 -0
  306. package/dist/seed/part-glossary/chunk2.d.ts +9 -0
  307. package/dist/seed/part-glossary/chunk2.js +51242 -0
  308. package/dist/seed/part-glossary/chunk3.d.ts +9 -0
  309. package/dist/seed/part-glossary/chunk3.js +53337 -0
  310. package/dist/seed/part-glossary/chunk4.d.ts +9 -0
  311. package/dist/seed/part-glossary/chunk4.js +51454 -0
  312. package/dist/seed/part-glossary-seed-data.d.ts +1 -1
  313. package/dist/seed/part-glossary-seed-data.js +23 -47483
  314. package/dist/seed/products-beyblade-x-seed-data.js +36 -1
  315. package/dist/seed/site-settings-seed-data.js +34 -35
  316. package/dist/seed/store-extensions-seed-data.d.ts +1 -2
  317. package/dist/seed/store-extensions-seed-data.js +1 -23
  318. package/dist/seed/stores-seed-data.js +0 -1
  319. package/dist/server-entry.d.ts +1 -1
  320. package/dist/server-entry.js +1 -1
  321. package/dist/server.d.ts +10 -10
  322. package/dist/server.js +24 -22
  323. package/dist/styles.css +392 -43
  324. package/dist/tailwind-utilities.css +1 -1
  325. package/dist/tokens/themes/default-dark.js +1 -1
  326. package/dist/tokens/themes/default-light.js +2 -1
  327. package/dist/tokens/tokens.css +6 -2
  328. package/dist/ui/components/Button.d.ts +11 -0
  329. package/dist/ui/components/Button.js +11 -0
  330. package/dist/ui/components/Button.style.css +29 -0
  331. package/dist/ui/components/CarouselNav.d.ts +57 -0
  332. package/dist/ui/components/CarouselNav.js +25 -0
  333. package/dist/ui/components/CarouselNav.style.css +265 -0
  334. package/dist/ui/components/GatedPrice.js +30 -3
  335. package/dist/ui/components/GatedPrice.style.css +43 -40
  336. package/dist/ui/components/HorizontalScroller.d.ts +12 -1
  337. package/dist/ui/components/HorizontalScroller.js +43 -3
  338. package/dist/ui/components/ImageMosaic.d.ts +8 -1
  339. package/dist/ui/components/ImageMosaic.js +3 -2
  340. package/dist/ui/components/ImageMosaic.style.css +22 -0
  341. package/dist/ui/components/Layout.style.css +6 -0
  342. package/dist/ui/components/Semantic.d.ts +3 -2
  343. package/dist/ui/components/Semantic.js +1 -0
  344. package/dist/ui/components/Typography.d.ts +2 -0
  345. package/dist/ui/components/Typography.js +2 -0
  346. package/dist/ui/components/Typography.style.css +19 -0
  347. package/dist/ui/components/index.style.css +1 -0
  348. package/dist/ui/index.d.ts +3 -1
  349. package/dist/ui/index.js +4 -0
  350. package/package.json +3 -2
  351. package/scripts/seed-cli.mjs +133 -27
  352. package/dist/_internal/server/jobs/core/whatsappCatalogImport.d.ts +0 -27
  353. package/dist/_internal/server/jobs/core/whatsappCatalogImport.js +0 -172
  354. package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +0 -35
  355. package/dist/_internal/server/jobs/core/whatsappNotify.js +0 -140
  356. package/dist/features/admin/components/AdminWhatsAppGuideView.d.ts +0 -2
  357. package/dist/features/admin/components/AdminWhatsAppGuideView.js +0 -35
  358. package/dist/features/orders/components/MarketplaceOrderCard.d.ts +0 -36
  359. package/dist/features/orders/components/MarketplaceOrderCard.js +0 -57
  360. package/dist/features/stores/components/StoreWhatsAppGuideView.d.ts +0 -3
  361. package/dist/features/stores/components/StoreWhatsAppGuideView.js +0 -12
  362. package/dist/features/whatsapp-bot/api/send-status/route.d.ts +0 -12
  363. package/dist/features/whatsapp-bot/api/send-status/route.js +0 -38
  364. package/dist/features/whatsapp-bot/api/webhook/route.d.ts +0 -12
  365. package/dist/features/whatsapp-bot/api/webhook/route.js +0 -43
  366. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +0 -6
  367. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +0 -270
  368. package/dist/features/whatsapp-bot/components/WhatsAppChatButton.d.ts +0 -9
  369. package/dist/features/whatsapp-bot/components/WhatsAppChatButton.js +0 -7
  370. package/dist/features/whatsapp-bot/components/index.d.ts +0 -3
  371. package/dist/features/whatsapp-bot/components/index.js +0 -2
  372. package/dist/features/whatsapp-bot/helpers/payment-proof-message.d.ts +0 -14
  373. package/dist/features/whatsapp-bot/helpers/payment-proof-message.js +0 -17
  374. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +0 -52
  375. package/dist/features/whatsapp-bot/helpers/whatsapp.js +0 -283
  376. package/dist/features/whatsapp-bot/index.d.ts +0 -3
  377. package/dist/features/whatsapp-bot/index.js +0 -3
  378. package/dist/features/whatsapp-bot/manifest.d.ts +0 -2
  379. package/dist/features/whatsapp-bot/manifest.js +0 -13
  380. package/dist/features/whatsapp-bot/messages/en.json +0 -7
  381. package/dist/features/whatsapp-bot/server.d.ts +0 -7
  382. package/dist/features/whatsapp-bot/server.js +0 -7
  383. package/dist/features/whatsapp-bot/types/index.d.ts +0 -126
  384. package/dist/features/whatsapp-bot/types/index.js +0 -1
@@ -1,14 +1,22 @@
1
1
  /*
2
2
  * WHY: Seeds the homepage layout — which sections render, in what order, with what copy.
3
- * WHAT: 24 sections (23 enabled + 1 deliberately disabled), ordered 1..24 contiguously.
3
+ * WHAT: 26 sections (21 enabled + 5 deliberately disabled), ordered 1..26 contiguously.
4
+ *
5
+ * 🛑 Four of those five were disabled on 2026-10-20 — auctions (3),
6
+ * featured-bundles (9), event-raffles (13) and prize-draws (14) — each with its
7
+ * own note on the switch that did it. A disabled row KEEPS its order slot, so
8
+ * the range stays contiguous and re-enabling one puts it back where it was
9
+ * rather than at the end.
4
10
  * `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.
11
+ * beside the deliberate budget-tile omission below for why.
12
+ *
13
+ * `how-it-works` (25) and `promo-grid` (26) were in that same unseeded set and
14
+ * were SEEDED 2026-10-20, on the terms the rule always allowed: there is now
15
+ * real copy for them. How-it-works quotes the three-tier authenticity policy
16
+ * the carousel already leads with; promo-grid routes to the four generation
17
+ * categories using the same `/media/` covers those categories use. Neither
18
+ * invents a claim. `testimonials` stays unseeded — the site has never had a
19
+ * customer, so every quote would be fabricated.
12
20
  *
13
21
  * 🛑 That count and range are ASSERTED, not described — `order` must stay unique
14
22
  * and contiguous. Until 2026-10-19 this header read "22 sections … 1..21" while
@@ -21,24 +29,33 @@
21
29
  * section type with a renderer and zero seeded rows is the same class of gap,
22
30
  * just silent rather than colliding.
23
31
  *
24
- * ORDER follows current marketplace-homepage research rather than the previous
25
- * arbitrary arrangement: hero → trust → orient (categories, systems matrix) →
26
- * shop (products, auctions, pre-orders, bundles) → supply (stores) → social
27
- * proof (reviews) → engage (events, raffles, prize draws) → editorial (blog) →
28
- * convert (seller banner, newsletter) → reassure (stats, security, community,
29
- * FAQ, brands).
32
+ * ORDER: hero → SHOP (products, auctions, pre-orders) → carousel → trust →
33
+ * orient (categories, systems matrix) → shop cont. (bundles) → supply
34
+ * (stores) → social proof (reviews) → engage (events, raffles, prize draws) →
35
+ * editorial (blog) → convert (seller banner, newsletter) → reassure (stats,
36
+ * security, community, FAQ, brands).
37
+ *
38
+ * 🛑 Products (2), auctions (3) and pre-orders (4) were lifted above the
39
+ * carousel on 2026-10-20 at the owner's request — real merchandise directly
40
+ * under the hero, promotions below it. That OVERRIDES the research arrangement
41
+ * this header used to describe (trust → orient → shop), so do not "restore"
42
+ * the old order on the strength of the paragraphs below; they explain the
43
+ * reasoning for the sections that are still in a research-driven position,
44
+ * not a mandate for the three that were deliberately moved. Pre-orders came
45
+ * up from 8 in a second pass, which is why the carousel/trust/categories/
46
+ * matrix block reads 5 → 8 rather than 4 → 7.
30
47
  *
31
- * The systems matrix sits at 5, between the generation tiles and the first
32
- * product rail, because that is where the measured leader puts it: on
33
- * worldhobbyshop "Browse Beyblade Systems & Series" (25 text links) follows
34
- * "Shop Beyblades by Generation" (6 image tiles) and precedes the one product
35
- * rail — taxonomy routing before merchandising. See
48
+ * The systems matrix still sits immediately after the generation tiles (7 → 8)
49
+ * because that is where the measured leader puts it: on worldhobbyshop
50
+ * "Browse Beyblade Systems & Series" (25 text links) follows "Shop Beyblades
51
+ * by Generation" (6 image tiles) — taxonomy routing stays together. See
36
52
  * docs/research/competitor-crawl-2026-10/layout.md.
37
53
  *
38
- * Baymard's finding drives the top: a static hero outperforms a carousel, and
39
- * the one documented carousel win came from demoting it BELOW a static hero.
40
- * So `welcome` is first and owns the page's single <h1>; `carousel` sits under
41
- * it and its slide titles render as <h2>.
54
+ * Baymard's finding still drives the hero: a static hero outperforms a
55
+ * carousel, and the one documented carousel win came from demoting it BELOW a
56
+ * static hero. So `welcome` is first and owns the page's single <h1>; the
57
+ * `carousel` is now demoted further still, under the first three product
58
+ * rails, and its slide titles render as <h2>.
42
59
  *
43
60
  * COPY IS CATALOGUE-NEUTRAL on purpose. "Shop by Category" stays correct
44
61
  * however the catalogue changes; "Burst & X Series" goes stale the moment it
@@ -62,7 +79,6 @@
62
79
  * @tag consumers:seed/index.ts,seed/runner.ts
63
80
  * @tag sideEffects:none
64
81
  */
65
- import { seedPhoto } from "./_helpers/media.js";
66
82
  import { ROUTES } from "../next/routing/route-map.js";
67
83
  const NOW = new Date();
68
84
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
@@ -76,26 +92,43 @@ export const homepageSectionsSeedData = [
76
92
  order: 1,
77
93
  enabled: true,
78
94
  config: {
79
- h1: "Buy, Sell & Auction Collectibles",
95
+ /*
96
+ * 🛑 NO AUCTIONS IN THE HERO, and nothing else that the site does not
97
+ * currently do.
98
+ *
99
+ * The h1 read "Buy, Sell & Auction Collectibles" and the second CTA sent
100
+ * visitors to /auctions — which `listings.listingTypes.auction: false`
101
+ * now switches off (2026-10-20). The first screen of the site is the
102
+ * worst place to advertise a type whose browse page returns nothing.
103
+ *
104
+ * The description lost "bid in live auctions" for the same reason, and
105
+ * "escrow-backed payments" because that claim was withdrawn from the
106
+ * seller guide and the Become-a-Seller copy on the same day.
107
+ *
108
+ * ⚠️ This is SEED data. The live hero is a `homepageSections` document and
109
+ * is NOT rewritten by editing this file — change it in the admin
110
+ * homepage-sections editor, or re-seed.
111
+ */
112
+ h1: "Buy & Sell Collectibles",
80
113
  subtitle: "Verified sellers, secure payments, and authenticity checks on every listing.",
81
- description: "A marketplace built for collectors — browse thousands of listings, bid in live auctions, reserve upcoming releases, and buy with escrow-backed payments.",
114
+ description: "A marketplace built for collectors — browse thousands of listings, reserve upcoming releases, and buy with secure, verified payments.",
82
115
  showCTA: true,
83
116
  pillLabel: "Buy, sell & collect",
84
117
  ctaText: "Start Shopping",
85
118
  ctaLink: String(ROUTES.PUBLIC.PRODUCTS),
86
- secondaryCtaText: "Browse Auctions",
87
- secondaryCtaLink: String(ROUTES.PUBLIC.AUCTIONS),
119
+ secondaryCtaText: "Explore Categories",
120
+ secondaryCtaLink: String(ROUTES.PUBLIC.CATEGORIES),
88
121
  },
89
122
  createdAt: daysAgo(90),
90
123
  updatedAt: daysAgo(2),
91
124
  },
92
- // ---- 2. Promo carousel ---------------------------------------------------
125
+ // ---- 5. Promo carousel ---------------------------------------------------
93
126
  // "medium" rather than "tall": it now sits UNDER a full hero, so a
94
127
  // viewport-height band would push everything else below the fold.
95
128
  {
96
129
  id: "section-hero-carousel",
97
130
  type: "carousel",
98
- order: 2,
131
+ order: 5,
99
132
  enabled: true,
100
133
  config: {
101
134
  title: "Featured promotions",
@@ -108,13 +141,13 @@ export const homepageSectionsSeedData = [
108
141
  createdAt: daysAgo(90),
109
142
  updatedAt: daysAgo(5),
110
143
  },
111
- // ---- 3. Trust bar --------------------------------------------------------
112
- // Moved up from 4. Research: ~80% of attention is above the fold and the
113
- // first 3–4 trust elements carry nearly all of the lift.
144
+ // ---- 6. Trust bar --------------------------------------------------------
145
+ // Research: ~80% of attention is above the fold and the first 3–4 trust
146
+ // elements carry nearly all of the lift.
114
147
  {
115
148
  id: "section-trust-indicators",
116
149
  type: "trust-indicators",
117
- order: 3,
150
+ order: 6,
118
151
  enabled: true,
119
152
  config: {
120
153
  title: "Why buyers trust us",
@@ -126,10 +159,16 @@ export const homepageSectionsSeedData = [
126
159
  description: "Every seller is verified before their first listing goes live.",
127
160
  },
128
161
  {
162
+ // Was "Escrow-backed payments". The escrow claim was withdrawn from
163
+ // the seller guide, the Become-a-Seller copy and the hero description
164
+ // on 2026-10-20; a trust badge is the last place it should have
165
+ // survived, because it is the claim a buyer is most likely to rely
166
+ // on. The `id` is deliberately unchanged — it is this seed document's
167
+ // identity, not its copy.
129
168
  id: "trust-escrow",
130
169
  icon: "lock",
131
- title: "Escrow-backed payments",
132
- description: "Your money is held until the item is delivered and accepted.",
170
+ title: "Secure payments",
171
+ description: "Your money reaches the seller after the item is delivered and accepted.",
133
172
  },
134
173
  {
135
174
  id: "trust-returns",
@@ -148,12 +187,12 @@ export const homepageSectionsSeedData = [
148
187
  createdAt: daysAgo(90),
149
188
  updatedAt: daysAgo(20),
150
189
  },
151
- // ---- 4. Orient: categories ----------------------------------------------
190
+ // ---- 7. Orient: categories ----------------------------------------------
152
191
  // Baymard's top homepage guideline, and the main internal-linking surface.
153
192
  {
154
193
  id: "section-collectibles-categories",
155
194
  type: "categories",
156
- order: 4,
195
+ order: 7,
157
196
  enabled: true,
158
197
  config: {
159
198
  title: "Shop by Category",
@@ -173,13 +212,17 @@ export const homepageSectionsSeedData = [
173
212
  createdAt: daysAgo(90),
174
213
  updatedAt: daysAgo(10),
175
214
  },
176
- // ---- 5–8. Shop -----------------------------------------------------------
215
+ // ---- 2–4, 9. Shop --------------------------------------------------------
216
+ // Products (2), auctions (3) and pre-orders (4) sit directly under the hero,
217
+ // ABOVE the carousel — a merchandising-first top of page, asked for
218
+ // 2026-10-20. Bundles (9) stay below the orientation band.
219
+ //
177
220
  // maxItems stays <= 12 everywhere: SSR supplies exactly 12 via
178
221
  // getFeatured*(12), so a larger cap would promise rows that cannot fill.
179
222
  {
180
223
  id: "section-featured-products",
181
224
  type: "products",
182
- order: 6,
225
+ order: 2,
183
226
  enabled: true,
184
227
  config: {
185
228
  title: "Featured Products",
@@ -207,11 +250,24 @@ export const homepageSectionsSeedData = [
207
250
  createdAt: daysAgo(90),
208
251
  updatedAt: daysAgo(1),
209
252
  },
253
+ /*
254
+ * 🛑 DISABLED, NOT DELETED — and the `order: 3` slot is held.
255
+ *
256
+ * `listings.listingTypes.auction: false` already stops this rail rendering
257
+ * (HOMEPAGE_SECTION_LISTING_TYPE in MarketplaceHomepageView), so `enabled:
258
+ * false` is the second of two locks, not the only one. It is worth having
259
+ * because it is the one an ADMIN sees: a section listed as enabled in the
260
+ * homepage builder, silently filtered out at render, reads as a bug in the
261
+ * builder. Both switches say the same thing now.
262
+ *
263
+ * The copy and the "⚡ LIVE AUCTIONS" pill stay exactly as they were, so
264
+ * re-enabling the type and this flag restores the rail intact.
265
+ */
210
266
  {
211
267
  id: "section-live-auctions",
212
268
  type: "auctions",
213
- order: 7,
214
- enabled: true,
269
+ order: 3,
270
+ enabled: false,
215
271
  config: {
216
272
  title: "Live Auctions",
217
273
  subtitle: "Bidding open now — place yours before the timer runs out.",
@@ -228,7 +284,7 @@ export const homepageSectionsSeedData = [
228
284
  {
229
285
  id: "section-pre-orders",
230
286
  type: "pre-orders",
231
- order: 8,
287
+ order: 4,
232
288
  enabled: true,
233
289
  config: {
234
290
  title: "Reserve Before It Ships",
@@ -243,11 +299,13 @@ export const homepageSectionsSeedData = [
243
299
  createdAt: daysAgo(90),
244
300
  updatedAt: daysAgo(3),
245
301
  },
302
+ // Disabled 2026-10-20 with `listings.categoryTypes.bundle: false`. Same
303
+ // two-lock arrangement as the auctions rail above — see that note.
246
304
  {
247
305
  id: "section-featured-bundles",
248
306
  type: "featured-bundles",
249
307
  order: 9,
250
- enabled: true,
308
+ enabled: false,
251
309
  config: {
252
310
  title: "Curated Bundles",
253
311
  subtitle: "Multiple items, one discounted price.",
@@ -316,8 +374,18 @@ export const homepageSectionsSeedData = [
316
374
  {
317
375
  id: "section-event-raffles",
318
376
  type: "event-raffles",
377
+ /*
378
+ * 🛑 DISABLED, and here `enabled: false` is the ONLY lock there is.
379
+ *
380
+ * Raffles and spin wheels are EVENT types, not listing types and not
381
+ * category types, so no Site Settings toggle reaches them and
382
+ * `HOMEPAGE_SECTION_LISTING_TYPE` has nothing to map them to. The same gap
383
+ * put Lotteries, Bundles and Promotions in the footer's hand-written hidden
384
+ * block (src/constants/navigation.tsx) — a per-document flag is the whole
385
+ * mechanism for this one, which is exactly why it is spelled out.
386
+ */
319
387
  order: 13,
320
- enabled: true,
388
+ enabled: false,
321
389
  config: {
322
390
  title: "Raffles & Spin Wheels",
323
391
  subtitle: "Enter for free and see if the odds are with you.",
@@ -332,8 +400,10 @@ export const homepageSectionsSeedData = [
332
400
  {
333
401
  id: "section-prize-draws",
334
402
  type: "prize-draws",
403
+ // Disabled 2026-10-20 with `listings.listingTypes.prize-draw: false` — the
404
+ // same two-lock arrangement as the auctions rail.
335
405
  order: 14,
336
- enabled: true,
406
+ enabled: false,
337
407
  config: {
338
408
  title: "Prize Draws",
339
409
  subtitle: "Buy an entry for a shot at something rare.",
@@ -378,7 +448,13 @@ export const homepageSectionsSeedData = [
378
448
  enabled: true,
379
449
  config: {
380
450
  height: "md",
381
- backgroundImage: seedPhoto("marketplace-seller-banner", 1600, 500),
451
+ /* Real imagery instead of a `seedPhoto()` grey tile — see the MEDIA block
452
+ in carousel-slides-seed-data.ts for why that helper produces one of six
453
+ flat SVG rectangles and why a third-party host is not the alternative.
454
+ 🛑 A seller pitch wants a HUMAN packing an order, which the wiki corpus
455
+ does not contain; this generation cover is a stand-in until a real photo
456
+ exists for the slot. */
457
+ backgroundImage: "/media/category-beyblade-x-image",
382
458
  content: {
383
459
  title: "Have collectibles to sell?",
384
460
  subtitle: "Open a store in minutes.",
@@ -419,12 +495,40 @@ export const homepageSectionsSeedData = [
419
495
  order: 18,
420
496
  enabled: true,
421
497
  config: {
498
+ /*
499
+ * 🛑 VERIFIABLE FACTS, not volume claims.
500
+ *
501
+ * This read "200+ Listings · 8+ Verified Sellers · 35+ Buyer Reviews ·
502
+ * 50+ Orders Completed". Those were `source: "live"` FALLBACKS, shown
503
+ * whenever the metric fetch fails — and all four were falsifiable in the
504
+ * same breath as the page that showed them: `realListingsOnly()` in
505
+ * seed-cli.mjs loads on the order of a dozen products, and the site has
506
+ * never taken a real order, so "50+ Orders Completed" was a number about
507
+ * nothing. A visitor who reads it and then browses the catalogue
508
+ * concludes the whole page is decoration.
509
+ *
510
+ * The replacements are things a visitor can CHECK by clicking through,
511
+ * and each was counted from source in the change that wrote it:
512
+ * - parts `PART_LEAF_COUNT` (_helpers/category-parts.ts:17528) = 2490.
513
+ * 🛑 CLAUDE.md says 752; that is stale, the corpus grew.
514
+ * - generations 4 tier-1 rows under `category-spinning-tops`.
515
+ * - brands 28 `BRAND_SEED_INPUTS` entries (`BRAND_ROW_COUNT`).
516
+ * Re-count before editing any of them rather than trusting this comment.
517
+ *
518
+ * `total_listings` stays LIVE and keeps a `"0"` fallback: a live number is
519
+ * verifiable by definition, and a zero fallback can only ever understate.
520
+ * `total_orders` and `total_reviews` are dropped rather than zeroed — a
521
+ * giant "0" in 48pt type is worse than not raising the subject.
522
+ *
523
+ * `iconName` is required on a static stat; a live one derives its glyph
524
+ * from `metric` via STAT_PRESET_ICON.
525
+ */
422
526
  title: "By the numbers",
423
527
  stats: [
424
- { key: "products", label: "Listings", value: "200", source: "live", metric: "total_listings", suffix: "+" },
425
- { key: "sellers", label: "Verified Sellers", value: "8", source: "live", metric: "verified_sellers", suffix: "+" },
426
- { key: "reviews", label: "Buyer Reviews", value: "35", source: "live", metric: "total_reviews", suffix: "+" },
427
- { key: "orders", label: "Orders Completed", value: "50", source: "live", metric: "total_orders", suffix: "+" },
528
+ { key: "products", label: "Listings", value: "0", source: "live", metric: "total_listings", suffix: "+" },
529
+ { key: "parts", label: "Parts catalogued", value: "2,490", source: "static", iconName: "spares" },
530
+ { key: "generations", label: "Generations covered", value: "4", source: "static", iconName: "archive" },
531
+ { key: "brands", label: "Brands", value: "28", source: "static", iconName: "deals" },
428
532
  ],
429
533
  },
430
534
  createdAt: daysAgo(90),
@@ -474,8 +578,17 @@ export const homepageSectionsSeedData = [
474
578
  config: {
475
579
  title: "Join the community",
476
580
  description: "Deal alerts, auction reminders, and early access to drops.",
477
- // Keep this link verbatim — a tester-checklist case asserts it.
478
- groupLink: "https://chat.whatsapp.com/",
581
+ /* 🛑 The line that used to sit here — "Keep this link verbatim — a
582
+ tester-checklist case asserts it" — was FALSE and is deleted. Verified:
583
+ zero hits for `chat.whatsapp.com` anywhere under
584
+ `appkit/src/features/tester/seed-data/`. It had also outlived its
585
+ subject: the value it was protecting (a bare `https://chat.whatsapp.com/`
586
+ with no invite code) is gone, so the comment defended a string that no
587
+ longer existed while discouraging anyone from touching the field. */
588
+ // Left unset: a bare chat.whatsapp.com URL is not a valid invite code and
589
+ // opens a page that resolves to no group. The real link is env-owned
590
+ // (WHATSAPP_GROUP_INVITE) and reaches the card through appkit.config.
591
+ groupLink: undefined,
479
592
  benefits: [
480
593
  "Deal alerts before they hit the homepage",
481
594
  "Reminders when auctions you watch are closing",
@@ -635,7 +748,7 @@ export const homepageSectionsSeedData = [
635
748
  {
636
749
  id: "section-systems-matrix",
637
750
  type: "custom-cards",
638
- order: 5,
751
+ order: 8,
639
752
  enabled: true,
640
753
  config: {
641
754
  title: "Every system, every part family",
@@ -746,6 +859,125 @@ export const homepageSectionsSeedData = [
746
859
  createdAt: daysAgo(1),
747
860
  updatedAt: daysAgo(1),
748
861
  },
862
+ /*
863
+ * ---- 25. How it works ----------------------------------------------------
864
+ *
865
+ * `how-it-works` and `promo-grid` (26) were registered types with renderers,
866
+ * admin create-picker entries and ZERO seeded rows — so both returned `null`
867
+ * and the page was missing the two blocks a 2026 marketplace homepage most
868
+ * obviously has. They were left unseeded on the principle that this file must
869
+ * not invent placeholder content, which was the right call: the reason they
870
+ * can be seeded NOW is that there is real, checkable copy to put in them.
871
+ *
872
+ * 🛑 Every step below is a claim the site actually honours. No "ships in 24
873
+ * hours", no "100% buyer protection" — the authenticity labelling in step 2
874
+ * is the one genuine differentiator the carousel already leads with, quoted
875
+ * from the same policy.
876
+ *
877
+ * 🛑 NO BIDDING STEP. `listings.listingTypes.auction` is false, so a step
878
+ * telling visitors to place a bid would route them to a browse page with
879
+ * nothing in it.
880
+ *
881
+ * 🛑 PLACEMENT IS PROVISIONAL. Appended at 25/26 rather than inserted mid-page
882
+ * (how-it-works belongs nearer the top, after the trust bar) because the
883
+ * section order is being tuned with the owner in a parallel change and
884
+ * renumbering 24 rows underneath that would collide. Reposition from
885
+ * /admin/sections, which is cheaper than a reseed.
886
+ */
887
+ {
888
+ id: "section-how-it-works",
889
+ type: "how-it-works",
890
+ order: 25,
891
+ enabled: true,
892
+ config: {
893
+ title: "How buying here works",
894
+ subtitle: "Three steps, and the second one is the part other marketplaces skip.",
895
+ pillLabel: "New here?",
896
+ ctaLabel: "Browse the catalogue →",
897
+ ctaLink: String(ROUTES.PUBLIC.PRODUCTS),
898
+ steps: [
899
+ {
900
+ number: 1,
901
+ iconKey: "search",
902
+ title: "Find the piece",
903
+ desc: "Filter by generation, part family, condition and price across every seller on the marketplace.",
904
+ },
905
+ {
906
+ number: 2,
907
+ iconKey: "verify",
908
+ title: "Read the authenticity label",
909
+ desc: "Every listing carries one of three labels — original, reproduction or unverified. If a seller does not say which, it reads “unverified”; we will not claim “original” on their behalf.",
910
+ },
911
+ {
912
+ number: 3,
913
+ iconKey: "lock",
914
+ title: "Buy with the seller verified",
915
+ desc: "Identity and payout details are checked before a store can publish, and your address and phone number are encrypted at rest.",
916
+ },
917
+ ],
918
+ },
919
+ createdAt: daysAgo(1),
920
+ updatedAt: daysAgo(1),
921
+ },
922
+ /*
923
+ * ---- 26. Promo grid ------------------------------------------------------
924
+ *
925
+ * The always-dark 4-tile editorial mosaic: one large slot plus three, each a
926
+ * full-bleed image under a bottom-up scrim. Routes to the four generations,
927
+ * which is the one set of destinations guaranteed to be populated however the
928
+ * product catalogue changes — a promo tile pointing at an empty page is worse
929
+ * than no tile.
930
+ *
931
+ * 🛑 `image` is a `/media/<shortId>` slug backed by a real `mediaAssets` row,
932
+ * never `seedPhoto()` (six flat grey tiles) and never a third-party host
933
+ * (Root Cause #104). These four covers are the same ones the generation
934
+ * categories use, so they are known-present.
935
+ *
936
+ * 🛑 The component caps at `PROMO_GRID_MAX_BANNERS` (4) and silently drops a
937
+ * fifth — the layout has exactly one hero slot and three regular ones.
938
+ */
939
+ {
940
+ id: "section-generation-promos",
941
+ type: "promo-grid",
942
+ order: 26,
943
+ enabled: true,
944
+ config: {
945
+ eyebrow: "FOUR GENERATIONS",
946
+ heading: "Pick your era",
947
+ banners: [
948
+ {
949
+ id: "promo-beyblade-x",
950
+ title: "Beyblade X",
951
+ ctaLabel: "Shop Beyblade X",
952
+ ctaUrl: "/categories/category-beyblade-x",
953
+ image: "/media/category-beyblade-x-image",
954
+ },
955
+ {
956
+ id: "promo-beyblade-burst",
957
+ title: "Burst",
958
+ ctaLabel: "Shop Burst",
959
+ ctaUrl: "/categories/category-beyblade-burst",
960
+ image: "/media/category-beyblade-burst-image",
961
+ },
962
+ {
963
+ id: "promo-beyblade-metal",
964
+ title: "Metal Fight",
965
+ ctaLabel: "Shop Metal Fight",
966
+ ctaUrl: "/categories/category-beyblade-metal",
967
+ image: "/media/category-beyblade-metal-image",
968
+ },
969
+ {
970
+ id: "promo-beyblade-original",
971
+ title: "The Originals",
972
+ ctaLabel: "Shop the originals",
973
+ ctaUrl: "/categories/category-beyblade-original",
974
+ image: "/media/category-beyblade-original-image",
975
+ },
976
+ ],
977
+ },
978
+ createdAt: daysAgo(1),
979
+ updatedAt: daysAgo(1),
980
+ },
749
981
  /*
750
982
  * 🛑 `google-reviews` stays DELIBERATELY UNSEEDED — not an oversight, the
751
983
  * same decision already made for `googleMapsApiKey`/`googlePlaceId` in
@@ -86,7 +86,7 @@ export { productFeaturesSeedData } from "./product-features-seed-data";
86
86
  export { authenticityKnowledgeSeedData, AUTHENTICITY_KNOWLEDGE_COLLECTION, AUTHENTICITY_KNOWLEDGE_COUNT, } from "./authenticity-knowledge-seed-data";
87
87
  export { taxCodesSeedData } from "./tax-codes-seed-data";
88
88
  export { offersSeedData } from "./offers-seed-data";
89
- export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
89
+ export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
90
90
  export type { SeedManifest, SeedManifestEntry, SeedCollectionName } from "./manifest";
91
91
  export { SEED_MANIFEST } from "./manifest";
92
92
  export type { FirestoreIndexConfig } from "./firestore-indexes";
@@ -95,7 +95,7 @@ export { authenticityKnowledgeSeedData, AUTHENTICITY_KNOWLEDGE_COLLECTION, AUTHE
95
95
  export { taxCodesSeedData } from "./tax-codes-seed-data.js";
96
96
  export { offersSeedData } from "./offers-seed-data.js";
97
97
  // S-STORE Extensions (Tier S-STORE) — 11 new collections
98
- export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data.js";
98
+ export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data.js";
99
99
  export { SEED_MANIFEST } from "./manifest.js";
100
100
  export { mergeFirestoreIndices, generateMergedFirestoreIndexFile, } from "./firestore-indexes.js";
101
101
  // Test utilities (Firestore emulator + PII assertion)
@@ -11,6 +11,6 @@ export interface SeedManifestEntry {
11
11
  type?: string;
12
12
  }
13
13
  /** Every collection name the CLI seeder (appkit/scripts/seed-cli.mjs) and this manifest cover. */
14
- export type SeedCollectionName = "users" | "addresses" | "categories" | "stores" | "products" | "orders" | "reviews" | "bids" | "coupons" | "carousels" | "carouselSlides" | "homepageSections" | "siteSettings" | "faqs" | "notifications" | "payouts" | "blogPosts" | "events" | "eventEntries" | "sessions" | "carts" | "wishlists" | "history" | "groupedListings" | "scammerProfiles" | "supportTickets" | "productFeatures" | "taxCodes" | "offers" | "couponUsage" | "claimedCoupons" | "payoutMethods" | "shippingConfigs" | "analyticsCards" | "analyticsAlerts" | "storeCategories" | "listingTemplates" | "moderationQueue" | "reports" | "itemRequests" | "storeWhatsAppConfig" | "storeGoogleConfig" | "roleOverrides" | "customRoles" | "adminNotifications" | "lotteryEntries" | "shipments" | "shipmentLots" | "shipmentItems" | "catalogueItems" | "testerChecklistItems";
14
+ export type SeedCollectionName = "users" | "addresses" | "categories" | "stores" | "products" | "orders" | "reviews" | "bids" | "coupons" | "carousels" | "carouselSlides" | "homepageSections" | "siteSettings" | "faqs" | "notifications" | "payouts" | "blogPosts" | "events" | "eventEntries" | "sessions" | "carts" | "wishlists" | "history" | "groupedListings" | "scammerProfiles" | "supportTickets" | "productFeatures" | "taxCodes" | "offers" | "couponUsage" | "claimedCoupons" | "payoutMethods" | "shippingConfigs" | "analyticsCards" | "analyticsAlerts" | "storeCategories" | "listingTemplates" | "moderationQueue" | "reports" | "itemRequests" | "storeGoogleConfig" | "roleOverrides" | "customRoles" | "adminNotifications" | "lotteryEntries" | "shipments" | "shipmentLots" | "shipmentItems" | "catalogueItems" | "testerChecklistItems";
15
15
  export type SeedManifest = Record<SeedCollectionName, SeedManifestEntry[]>;
16
16
  export declare const SEED_MANIFEST: SeedManifest;
@@ -5,7 +5,7 @@
5
5
  * name/id pairs without loading the full seed data payload.
6
6
  * Auto-derived from the live seed data files — stays in sync automatically.
7
7
  */
8
- import { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data.js";
8
+ import { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data.js";
9
9
  // SB-UNI-C — brandsSeedData merged into categoriesSeedData.
10
10
  import { categoriesSeedData } from "./categories-seed-data.js";
11
11
  import { usersSeedData } from "./users-seed-data.js";
@@ -223,7 +223,6 @@ export const SEED_MANIFEST = {
223
223
  moderationQueue: pick(asArr(moderationQueueSeedData)),
224
224
  reports: pick(asArr(reportsSeedData)),
225
225
  itemRequests: pick(asArr(itemRequestsSeedData).map((r) => ({ ...r, name: r.title ?? r.id }))),
226
- storeWhatsAppConfig: pick(asArr(storeWhatsAppConfigSeedData)),
227
226
  storeGoogleConfig: pick(asArr(storeGoogleConfigSeedData)),
228
227
  // RBAC + admin notifications — no seed docs yet; manifest stays empty until populated.
229
228
  roleOverrides: [],
@@ -2493,7 +2493,7 @@ export const modelCompositionSeedData = [
2493
2493
  "slotKey": "blade-base",
2494
2494
  "slotLabel": "BLADE BASE (BB)",
2495
2495
  "partName": "Metal Sharp Base",
2496
- "partId": "blade-base--metal-sharp-base"
2496
+ "partId": "blade-base--blade-base"
2497
2497
  }
2498
2498
  ],
2499
2499
  "source": "gen1/plastic/flash-leopard-2.md",
@@ -6587,14 +6587,12 @@ export const modelCompositionSeedData = [
6587
6587
  {
6588
6588
  "slotKey": "disc",
6589
6589
  "slotLabel": "FORGE DISC",
6590
- "partName": "variable per combo",
6591
- "partId": "disc--variable-per-combo"
6590
+ "partName": "variable per combo"
6592
6591
  },
6593
6592
  {
6594
6593
  "slotKey": "performance-tip",
6595
6594
  "slotLabel": "PERFORMANCE TIP",
6596
- "partName": "variable per combo",
6597
- "partId": "performance-tip--variable-per-combo"
6595
+ "partName": "variable per combo"
6598
6596
  }
6599
6597
  ],
6600
6598
  "source": "gen3/bu/draciel-fortress.md",
@@ -7415,7 +7413,7 @@ export const modelCompositionSeedData = [
7415
7413
  "slotKey": "driver",
7416
7414
  "slotLabel": "DRIVER",
7417
7415
  "partName": "Destroy'",
7418
- "partId": "driver--destroy-dash"
7416
+ "partId": "driver--destroy"
7419
7417
  }
7420
7418
  ],
7421
7419
  "source": "gen3/db/rage-longinus-s5.md"
@@ -7925,7 +7923,7 @@ export const modelCompositionSeedData = [
7925
7923
  "slotKey": "driver",
7926
7924
  "slotLabel": "PERFORMANCE DRIVER",
7927
7925
  "partName": "Evolution'",
7928
- "partId": "driver--evolution-dash"
7926
+ "partId": "driver--evolution"
7929
7927
  }
7930
7928
  ],
7931
7929
  "source": "gen3/superking/brave-valtryek.md"
@@ -7972,7 +7970,7 @@ export const modelCompositionSeedData = [
7972
7970
  "slotKey": "driver",
7973
7971
  "slotLabel": "DRIVER",
7974
7972
  "partName": "Destroy'",
7975
- "partId": "driver--destroy-dash"
7973
+ "partId": "driver--destroy"
7976
7974
  }
7977
7975
  ],
7978
7976
  "source": "gen3/superking/rage-longinus-d3a.md"
@@ -0,0 +1,9 @@
1
+ /**
2
+ * GENERATED by `scripts/generate-parts-seed.mjs` — do not hand-edit.
3
+ *
4
+ * Chunk 0 of the part glossary. See `../part-glossary-seed-data.ts` for
5
+ * provenance and for why the chunks are separate FILES rather than separate
6
+ * consts in one file.
7
+ */
8
+ import type { PartGlossaryDocument } from "../../features/parts/schemas/firestore";
9
+ export declare const glossaryChunk0: Partial<PartGlossaryDocument>[];