@mohasinac/appkit 4.53.0 → 4.53.2

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 (520) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/scaffolds/AppShell.js +1 -1
  3. package/dist/_internal/client/theme/ThemeProvider.js +15 -1
  4. package/dist/_internal/server/features/auctions/og.d.ts +3 -1
  5. package/dist/_internal/server/features/auctions/og.js +3 -1
  6. package/dist/_internal/server/features/bundles/actions.js +1 -1
  7. package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
  8. package/dist/_internal/server/features/business-documents/download.js +91 -0
  9. package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
  10. package/dist/_internal/server/features/categories/adapters.js +10 -0
  11. package/dist/_internal/server/features/categories/price-guidance-resolve.d.ts +66 -0
  12. package/dist/_internal/server/features/categories/price-guidance-resolve.js +138 -0
  13. package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
  14. package/dist/_internal/server/features/checkout/actions.js +106 -12
  15. package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
  16. package/dist/_internal/server/features/checkout/data.d.ts +22 -0
  17. package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
  18. package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
  19. package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
  20. package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
  21. package/dist/_internal/server/features/classified/metadata.js +1 -1
  22. package/dist/_internal/server/features/classified/og.d.ts +3 -1
  23. package/dist/_internal/server/features/classified/og.js +3 -1
  24. package/dist/_internal/server/features/digital-code/metadata.js +1 -1
  25. package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
  26. package/dist/_internal/server/features/digital-code/og.js +3 -1
  27. package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
  28. package/dist/_internal/server/features/digital-code/pool.js +19 -4
  29. package/dist/_internal/server/features/live/metadata.js +1 -1
  30. package/dist/_internal/server/features/live/og.d.ts +3 -1
  31. package/dist/_internal/server/features/live/og.js +3 -1
  32. package/dist/_internal/server/features/messages/actions.js +1 -1
  33. package/dist/_internal/server/features/parts/og.js +1 -1
  34. package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
  35. package/dist/_internal/server/features/pre-orders/og.js +3 -1
  36. package/dist/_internal/server/features/price-index/market.d.ts +57 -0
  37. package/dist/_internal/server/features/price-index/market.js +120 -0
  38. package/dist/_internal/server/features/price-index/search.d.ts +18 -0
  39. package/dist/_internal/server/features/price-index/search.js +47 -7
  40. package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
  41. package/dist/_internal/server/features/prize-draws/og.js +3 -1
  42. package/dist/_internal/server/features/products/group-members.d.ts +26 -0
  43. package/dist/_internal/server/features/products/group-members.js +7 -1
  44. package/dist/_internal/server/features/products/list-public.d.ts +12 -0
  45. package/dist/_internal/server/features/products/list-public.js +10 -1
  46. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +25 -1
  47. package/dist/_internal/server/features/products/listing-tab-counts.js +128 -10
  48. package/dist/_internal/server/features/products/og.d.ts +3 -1
  49. package/dist/_internal/server/features/products/og.js +3 -1
  50. package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
  51. package/dist/_internal/server/features/search/scoped-sources.js +252 -0
  52. package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
  53. package/dist/_internal/server/features/search/search-everything.js +70 -20
  54. package/dist/_internal/server/features/seo/sitemap.js +6 -0
  55. package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
  56. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +11 -0
  57. package/dist/_internal/server/features/sticker-trace/adapters.js +1 -0
  58. package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
  59. package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
  60. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +3 -1
  61. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +32 -0
  62. package/dist/_internal/server/features/sticker-trace/storage.d.ts +20 -1
  63. package/dist/_internal/server/features/sticker-trace/storage.js +20 -1
  64. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  65. package/dist/_internal/server/features/stores/adapters.js +16 -0
  66. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  67. package/dist/_internal/server/features/stores/index.js +1 -0
  68. package/dist/_internal/server/features/stores/tabs.d.ts +30 -0
  69. package/dist/_internal/server/features/stores/tabs.js +124 -0
  70. package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
  71. package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
  72. package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
  73. package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
  74. package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
  75. package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
  76. package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
  77. package/dist/_internal/shared/checkout/rules/index.js +9 -0
  78. package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
  79. package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
  80. package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
  81. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
  82. package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
  83. package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
  84. package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
  85. package/dist/_internal/shared/config/schema.d.ts +122 -0
  86. package/dist/_internal/shared/features/cart/schema.js +3 -2
  87. package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
  88. package/dist/_internal/shared/features/products/group-rules.js +142 -0
  89. package/dist/_internal/shared/listing-types/_registry.d.ts +24 -0
  90. package/dist/_internal/shared/listing-types/_registry.js +39 -1
  91. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  92. package/dist/_internal/shared/listing-types/art/config.js +2 -0
  93. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  94. package/dist/_internal/shared/listing-types/auction/config.js +2 -0
  95. package/dist/_internal/shared/listing-types/availability.js +48 -0
  96. package/dist/_internal/shared/listing-types/capabilities.js +19 -0
  97. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  98. package/dist/_internal/shared/listing-types/classified/config.js +2 -0
  99. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  100. package/dist/_internal/shared/listing-types/digital-code/config.js +2 -0
  101. package/dist/_internal/shared/listing-types/feature-flags.js +1 -0
  102. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  103. package/dist/_internal/shared/listing-types/live/config.js +2 -0
  104. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  105. package/dist/_internal/shared/listing-types/pre-order/config.js +2 -0
  106. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  107. package/dist/_internal/shared/listing-types/prize-draw/config.js +2 -0
  108. package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
  109. package/dist/_internal/shared/listing-types/spares/config.js +60 -0
  110. package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
  111. package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
  112. package/dist/_internal/shared/listing-types/spares/og.js +1 -0
  113. package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
  114. package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
  115. package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
  116. package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
  117. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  118. package/dist/_internal/shared/listing-types/standard/config.js +2 -0
  119. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  120. package/dist/_internal/shared/listing-types/stickers/config.js +2 -0
  121. package/dist/_internal/shared/search/match.d.ts +11 -0
  122. package/dist/_internal/shared/search/match.js +30 -3
  123. package/dist/_internal/shared/search/to-groups.d.ts +52 -0
  124. package/dist/_internal/shared/search/to-groups.js +141 -0
  125. package/dist/client.d.ts +8 -2
  126. package/dist/client.js +4 -1
  127. package/dist/constants/api-endpoints.d.ts +46 -15
  128. package/dist/constants/api-endpoints.js +35 -5
  129. package/dist/constants/cache-invalidation.js +3 -1
  130. package/dist/constants/field-names.d.ts +6 -0
  131. package/dist/constants/field-names.js +6 -0
  132. package/dist/features/about/components/PolicyPageView.d.ts +22 -2
  133. package/dist/features/about/components/PolicyPageView.js +14 -2
  134. package/dist/features/about/components/PublicProfileView.js +2 -1
  135. package/dist/features/about/components/ShippingPolicyView.js +42 -2
  136. package/dist/features/account/components/NotificationBell.js +1 -1
  137. package/dist/features/account/hooks/useProfileStats.js +5 -1
  138. package/dist/features/addresses/repository/addresses.repository.d.ts +16 -0
  139. package/dist/features/addresses/repository/addresses.repository.js +21 -0
  140. package/dist/features/admin/actions/admin-actions.js +16 -1
  141. package/dist/features/admin/components/AdminCategoryEditorView.js +19 -2
  142. package/dist/features/admin/components/AdminNavigationView.js +1 -1
  143. package/dist/features/admin/components/AdminPageHeader.js +1 -1
  144. package/dist/features/admin/components/AdminProductEditorView.js +17 -2
  145. package/dist/features/admin/components/AdminSidebar.js +1 -1
  146. package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
  147. package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
  148. package/dist/features/admin/components/AdminSparesView.js +30 -0
  149. package/dist/features/admin/components/AdminUsersView.js +9 -7
  150. package/dist/features/admin/components/index.d.ts +2 -0
  151. package/dist/features/admin/components/index.js +1 -0
  152. package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
  153. package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
  154. package/dist/features/admin/constants/filter-tabs.js +1 -0
  155. package/dist/features/admin/schemas/firestore.d.ts +26 -2
  156. package/dist/features/auctions/components/AuctionDetailPageView.js +12 -18
  157. package/dist/features/auth/repository/user.repository.d.ts +13 -0
  158. package/dist/features/auth/repository/user.repository.js +28 -0
  159. package/dist/features/auth/schemas/firestore.d.ts +2 -0
  160. package/dist/features/auth/schemas/firestore.js +2 -0
  161. package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
  162. package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
  163. package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
  164. package/dist/features/business-documents/schemas/firestore.js +75 -0
  165. package/dist/features/cart/actions/cart-actions.js +83 -6
  166. package/dist/features/cart/repository/cart.repository.js +32 -4
  167. package/dist/features/cart/schemas/firestore.d.ts +20 -0
  168. package/dist/features/cart/schemas/index.d.ts +2 -2
  169. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
  170. package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
  171. package/dist/features/categories/api/[id]/price-guidance/route.js +90 -0
  172. package/dist/features/categories/components/BrandDetailPageView.js +32 -8
  173. package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -1
  174. package/dist/features/categories/components/BrandDetailTabs.js +28 -3
  175. package/dist/features/categories/components/BundleCollage.js +3 -2
  176. package/dist/features/categories/components/BundleItemsPicker.js +3 -4
  177. package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
  178. package/dist/features/categories/components/CategoryDetailPageView.js +157 -20
  179. package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
  180. package/dist/features/categories/components/CategoryDetailTabs.js +41 -7
  181. package/dist/features/categories/components/CategoryGrid.js +10 -1
  182. package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
  183. package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
  184. package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
  185. package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
  186. package/dist/features/categories/constants/category-tabs.d.ts +20 -25
  187. package/dist/features/categories/constants/category-tabs.js +22 -39
  188. package/dist/features/categories/repository/categories.repository.d.ts +12 -0
  189. package/dist/features/categories/repository/categories.repository.js +20 -0
  190. package/dist/features/categories/schemas/firestore.d.ts +22 -1
  191. package/dist/features/categories/schemas/firestore.js +10 -0
  192. package/dist/features/categories/schemas/index.d.ts +6 -0
  193. package/dist/features/categories/schemas/index.js +2 -0
  194. package/dist/features/categories/types/index.d.ts +8 -0
  195. package/dist/features/categories/utils/taxonomy-visual.d.ts +16 -3
  196. package/dist/features/categories/utils/taxonomy-visual.js +26 -10
  197. package/dist/features/classified/components/ClassifiedDetailPageView.js +14 -10
  198. package/dist/features/contact/components/ContactPageView.d.ts +33 -1
  199. package/dist/features/contact/components/ContactPageView.js +58 -28
  200. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +14 -10
  201. package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
  202. package/dist/features/grouped/schemas/firestore.d.ts +5 -0
  203. package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
  204. package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
  205. package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
  206. package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
  207. package/dist/features/homepage/components/HowItWorksSection.js +4 -4
  208. package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
  209. package/dist/features/homepage/components/PromoGrid.js +12 -3
  210. package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
  211. package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
  212. package/dist/features/homepage/components/index.d.ts +0 -20
  213. package/dist/features/homepage/components/index.js +0 -11
  214. package/dist/features/homepage/index.d.ts +0 -2
  215. package/dist/features/homepage/index.js +0 -2
  216. package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
  217. package/dist/features/homepage/lib/section-renderer.js +202 -58
  218. package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
  219. package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
  220. package/dist/features/homepage/schemas/firestore.d.ts +106 -3
  221. package/dist/features/homepage/schemas/firestore.js +32 -2
  222. package/dist/features/homepage/schemas/index.d.ts +36 -7
  223. package/dist/features/homepage/schemas/index.js +39 -27
  224. package/dist/features/homepage/server.d.ts +0 -3
  225. package/dist/features/homepage/server.js +0 -3
  226. package/dist/features/homepage/types/index.d.ts +0 -47
  227. package/dist/features/homepage/types/index.js +49 -0
  228. package/dist/features/layout/AppLayoutShell.js +1 -1
  229. package/dist/features/layout/BottomNavItem.js +1 -1
  230. package/dist/features/layout/BottomSheet.js +1 -1
  231. package/dist/features/layout/TitleBarLayout.js +1 -1
  232. package/dist/features/live/components/LiveItemDetailPageView.js +14 -10
  233. package/dist/features/media/hooks/useMedia.js +17 -0
  234. package/dist/features/media/repository/media-assets.repository.d.ts +46 -0
  235. package/dist/features/media/repository/media-assets.repository.js +31 -0
  236. package/dist/features/media/trust-signals.d.ts +85 -0
  237. package/dist/features/media/trust-signals.js +126 -0
  238. package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
  239. package/dist/features/parts/components/PartDetailPageView.js +2 -2
  240. package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
  241. package/dist/features/parts/components/PartsIndexPageView.js +2 -2
  242. package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
  243. package/dist/features/parts/components/PartsSearchBox.js +57 -0
  244. package/dist/features/parts/schemas/firestore.d.ts +149 -3
  245. package/dist/features/parts/schemas/firestore.js +184 -0
  246. package/dist/features/payments/repository/payout.repository.d.ts +15 -0
  247. package/dist/features/payments/repository/payout.repository.js +21 -0
  248. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +12 -18
  249. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
  250. package/dist/features/price-index/components/PriceIndexToolView.d.ts +24 -1
  251. package/dist/features/price-index/components/PriceIndexToolView.js +299 -17
  252. package/dist/features/price-index/lookup-target.d.ts +48 -0
  253. package/dist/features/price-index/lookup-target.js +107 -0
  254. package/dist/features/products/components/AvailabilityScopeHint.d.ts +22 -0
  255. package/dist/features/products/components/AvailabilityScopeHint.js +27 -0
  256. package/dist/features/products/components/CompareOverlay.d.ts +20 -2
  257. package/dist/features/products/components/CompareOverlay.js +23 -3
  258. package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
  259. package/dist/features/products/components/CustomSectionTabContent.js +29 -3
  260. package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
  261. package/dist/features/products/components/GroupMemberPicker.js +46 -8
  262. package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
  263. package/dist/features/products/components/GroupSettingsPanel.js +92 -3
  264. package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
  265. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
  266. package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
  267. package/dist/features/products/components/ProductDetailPageView.js +81 -17
  268. package/dist/features/products/components/ProductForm.d.ts +13 -1
  269. package/dist/features/products/components/ProductForm.js +16 -2
  270. package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
  271. package/dist/features/products/components/ProductsIndexListing.js +3 -3
  272. package/dist/features/products/components/ShowGroupSection.js +15 -2
  273. package/dist/features/products/components/SparesListView.d.ts +7 -0
  274. package/dist/features/products/components/SparesListView.js +39 -0
  275. package/dist/features/products/components/SublistingCarouselSection.js +2 -1
  276. package/dist/features/products/constants/action-defs.d.ts +1 -0
  277. package/dist/features/products/constants/action-defs.js +1 -0
  278. package/dist/features/products/repository/products.repository.d.ts +99 -0
  279. package/dist/features/products/repository/products.repository.js +240 -18
  280. package/dist/features/products/schemas/firestore.d.ts +97 -4
  281. package/dist/features/products/schemas/firestore.js +104 -0
  282. package/dist/features/products/schemas/index.d.ts +10 -19
  283. package/dist/features/products/schemas/index.js +23 -6
  284. package/dist/features/products/types/index.d.ts +45 -1
  285. package/dist/features/products/utils/group-member-image.d.ts +46 -0
  286. package/dist/features/products/utils/group-member-image.js +4 -0
  287. package/dist/features/products/utils/listing-badge-variant.js +4 -0
  288. package/dist/features/reviews/components/ReviewsList.js +1 -1
  289. package/dist/features/scams/components/ScamProfileView.js +1 -1
  290. package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
  291. package/dist/features/search/components/EntityTypeahead.js +92 -0
  292. package/dist/features/search/components/Search.d.ts +12 -1
  293. package/dist/features/search/components/Search.js +47 -3
  294. package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
  295. package/dist/features/search/components/SearchFacetRail.js +92 -0
  296. package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
  297. package/dist/features/search/components/SearchResultsClient.js +103 -0
  298. package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
  299. package/dist/features/search/components/SearchResultsPageView.js +2 -2
  300. package/dist/features/search/components/index.d.ts +0 -6
  301. package/dist/features/search/components/index.js +0 -3
  302. package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
  303. package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
  304. package/dist/features/search/hooks/useScopedSearch.js +114 -0
  305. package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
  306. package/dist/features/search/hooks/useSiteSearch.js +149 -0
  307. package/dist/features/search/index.d.ts +0 -4
  308. package/dist/features/search/index.js +0 -4
  309. package/dist/features/search/manifest.d.ts +12 -0
  310. package/dist/features/search/manifest.js +17 -2
  311. package/dist/features/search/server.d.ts +0 -3
  312. package/dist/features/search/server.js +0 -3
  313. package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
  314. package/dist/features/seller/components/SellerListingTypeView.js +20 -0
  315. package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -14
  316. package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
  317. package/dist/features/seller/components/SellerProductShell.js +2 -1
  318. package/dist/features/seller/components/SellerProductsView.js +3 -2
  319. package/dist/features/seller/components/SellerSidebar.js +1 -1
  320. package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
  321. package/dist/features/seller/components/SellerSparesView.js +6 -0
  322. package/dist/features/seller/components/index.d.ts +2 -0
  323. package/dist/features/seller/components/index.js +1 -0
  324. package/dist/features/shell/CommandPalette.js +1 -1
  325. package/dist/features/sticker-trace/schemas/firestore.d.ts +19 -0
  326. package/dist/features/stores/components/StoreAuctionsListing.js +2 -1
  327. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  328. package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
  329. package/dist/features/stores/components/StoreHeader.js +1 -2
  330. package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
  331. package/dist/features/stores/components/StoreSparesPageView.js +48 -0
  332. package/dist/features/stores/schemas/firestore.d.ts +19 -0
  333. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
  334. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
  335. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  336. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +392 -45
  337. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
  338. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
  339. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
  340. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
  341. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
  342. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
  343. package/dist/features/tester/seed-data/authored/index.js +16 -0
  344. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
  345. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
  346. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
  347. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
  348. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
  349. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
  350. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +5 -4
  351. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +384 -18
  352. package/dist/index.d.ts +17 -57
  353. package/dist/index.js +35 -96
  354. package/dist/next/routing/route-map.d.ts +42 -1
  355. package/dist/next/routing/route-map.js +45 -0
  356. package/dist/providers/db-firebase/base.repository.d.ts +22 -0
  357. package/dist/providers/db-firebase/base.repository.js +36 -0
  358. package/dist/schemas/registry.d.ts +15 -6
  359. package/dist/security/blind-index-tokens.d.ts +54 -0
  360. package/dist/security/blind-index-tokens.js +152 -0
  361. package/dist/security/index.d.ts +1 -1
  362. package/dist/security/index.js +1 -1
  363. package/dist/security/settings-encryption.d.ts +35 -0
  364. package/dist/security/settings-encryption.js +91 -0
  365. package/dist/seed/_helpers/brand-rows.js +38 -14
  366. package/dist/seed/_helpers/category-forest.js +73 -7
  367. package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
  368. package/dist/seed/_helpers/category-images-generated.js +81 -6
  369. package/dist/seed/_helpers/category-models.d.ts +1 -1
  370. package/dist/seed/_helpers/category-models.js +7 -1
  371. package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
  372. package/dist/seed/_helpers/category-parts.d.ts +1 -1
  373. package/dist/seed/_helpers/category-parts.js +50 -2
  374. package/dist/seed/_helpers/character-features.d.ts +1 -1
  375. package/dist/seed/_helpers/character-features.js +2 -1
  376. package/dist/seed/_helpers/franchise-rows.js +10 -2
  377. package/dist/seed/_helpers/media.d.ts +47 -0
  378. package/dist/seed/_helpers/media.js +34 -0
  379. package/dist/seed/authenticity-knowledge-seed-data.d.ts +49 -5
  380. package/dist/seed/authenticity-knowledge-seed-data.js +10001 -549
  381. package/dist/seed/categories-seed-data.js +124 -20
  382. package/dist/seed/grouped-listings-seed-data.js +16 -0
  383. package/dist/seed/homepage-sections-seed-data.js +94 -5
  384. package/dist/seed/index.d.ts +2 -3
  385. package/dist/seed/index.js +2 -2
  386. package/dist/seed/manifest.js +3 -0
  387. package/dist/seed/media-assets-seed-data.d.ts +1 -1
  388. package/dist/seed/media-assets-seed-data.js +746 -196
  389. package/dist/seed/model-composition-seed-data.js +122 -6
  390. package/dist/seed/part-glossary-seed-data.d.ts +1 -1
  391. package/dist/seed/part-glossary-seed-data.js +37219 -463
  392. package/dist/seed/products-art-seed-data.js +7 -18
  393. package/dist/seed/products-auctions-seed-data.js +56 -47
  394. package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
  395. package/dist/seed/products-beyblade-x-seed-data.js +476 -0
  396. package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
  397. package/dist/seed/products-catalogue-seed-data.js +1500 -1240
  398. package/dist/seed/products-classifieds-seed-data.js +9 -27
  399. package/dist/seed/products-digital-codes-seed-data.js +9 -18
  400. package/dist/seed/products-live-items-seed-data.js +5 -13
  401. package/dist/seed/products-preorders-seed-data.js +67 -33
  402. package/dist/seed/products-prize-draws-seed-data.js +8 -17
  403. package/dist/seed/products-spares-seed-data.d.ts +2 -0
  404. package/dist/seed/products-spares-seed-data.js +368 -0
  405. package/dist/seed/products-standard-seed-data.js +39 -126
  406. package/dist/seed/products-stickers-seed-data.js +59 -15
  407. package/dist/seed/site-settings-seed-data.js +8 -0
  408. package/dist/seo/json-ld.d.ts +25 -0
  409. package/dist/seo/json-ld.js +28 -0
  410. package/dist/server-entry.d.ts +3 -1
  411. package/dist/server-entry.js +2 -2
  412. package/dist/server.d.ts +11 -9
  413. package/dist/server.js +35 -25
  414. package/dist/styles.css +202 -1
  415. package/dist/tailwind-input.css +31 -17
  416. package/dist/tailwind-utilities.css +1 -1
  417. package/dist/ui/components/Accordion.js +1 -1
  418. package/dist/ui/components/Breadcrumb.js +1 -1
  419. package/dist/ui/components/DetailPageGallery.js +0 -2
  420. package/dist/ui/components/DetailPageHero.js +0 -1
  421. package/dist/ui/components/DetailPageTabs.js +1 -1
  422. package/dist/ui/components/Divider.js +3 -3
  423. package/dist/ui/components/GatedPrice.js +5 -1
  424. package/dist/ui/components/HorizontalScroller.js +1 -1
  425. package/dist/ui/components/ListingLayout.js +3 -3
  426. package/dist/ui/components/MediaTabs.style.css +81 -0
  427. package/dist/ui/components/Pagination.js +1 -1
  428. package/dist/ui/components/PendingValue.d.ts +45 -0
  429. package/dist/ui/components/PendingValue.js +7 -0
  430. package/dist/ui/components/Radio.style.css +119 -0
  431. package/dist/ui/components/RatingDisplay.js +2 -2
  432. package/dist/ui/components/SettingsSection.js +0 -2
  433. package/dist/ui/components/SiteLogo.js +3 -0
  434. package/dist/ui/components/SiteMark.js +3 -0
  435. package/dist/ui/components/SortDropdown.js +1 -1
  436. package/dist/ui/components/SpecTable.d.ts +58 -0
  437. package/dist/ui/components/SpecTable.js +8 -0
  438. package/dist/ui/components/StarRating.js +1 -3
  439. package/dist/ui/components/SummaryCard.js +1 -1
  440. package/dist/ui/components/index.style.css +1 -0
  441. package/dist/ui/icons/icon-registry.d.ts +1 -0
  442. package/dist/ui/icons/icon-registry.js +9 -1
  443. package/dist/ui/index.d.ts +4 -0
  444. package/dist/ui/index.js +2 -0
  445. package/dist/utils/search-txt-query.d.ts +12 -0
  446. package/dist/utils/search-txt-query.js +12 -0
  447. package/package.json +1 -1
  448. package/scripts/dedupe-peer-deps.mjs +18 -0
  449. package/scripts/seed-cli.mjs +250 -35
  450. package/scripts/verify-css-build.mjs +118 -37
  451. package/dist/_internal/server/features/search/actions.d.ts +0 -7
  452. package/dist/_internal/server/features/search/actions.js +0 -21
  453. package/dist/_internal/server/features/search/data.d.ts +0 -15
  454. package/dist/_internal/server/features/search/data.js +0 -18
  455. package/dist/_internal/server/features/search/index.d.ts +0 -3
  456. package/dist/_internal/server/features/search/index.js +0 -2
  457. package/dist/features/homepage/api/[id]/route.d.ts +0 -23
  458. package/dist/features/homepage/api/[id]/route.js +0 -103
  459. package/dist/features/homepage/api/route.d.ts +0 -14
  460. package/dist/features/homepage/api/route.js +0 -140
  461. package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
  462. package/dist/features/homepage/api/sections/[id]/route.js +0 -95
  463. package/dist/features/homepage/api/sections/route.d.ts +0 -13
  464. package/dist/features/homepage/api/sections/route.js +0 -82
  465. package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
  466. package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
  467. package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
  468. package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
  469. package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
  470. package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
  471. package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
  472. package/dist/features/homepage/components/HeroBanner.js +0 -43
  473. package/dist/features/homepage/components/HeroSection.d.ts +0 -7
  474. package/dist/features/homepage/components/HeroSection.js +0 -6
  475. package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
  476. package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
  477. package/dist/features/homepage/components/HomepageView.d.ts +0 -25
  478. package/dist/features/homepage/components/HomepageView.js +0 -5
  479. package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
  480. package/dist/features/homepage/components/NewsletterBanner.js +0 -37
  481. package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
  482. package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
  483. package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
  484. package/dist/features/homepage/components/TrustBadges.js +0 -46
  485. package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
  486. package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
  487. package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
  488. package/dist/features/homepage/hooks/useHomepage.js +0 -17
  489. package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
  490. package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
  491. package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
  492. package/dist/features/homepage/repository/homepage.repository.js +0 -25
  493. package/dist/features/search/actions/index.d.ts +0 -1
  494. package/dist/features/search/actions/index.js +0 -1
  495. package/dist/features/search/actions/search-actions.d.ts +0 -18
  496. package/dist/features/search/actions/search-actions.js +0 -43
  497. package/dist/features/search/api/route.d.ts +0 -22
  498. package/dist/features/search/api/route.js +0 -128
  499. package/dist/features/search/columns/index.d.ts +0 -17
  500. package/dist/features/search/columns/index.js +0 -49
  501. package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
  502. package/dist/features/search/components/SearchFiltersRow.js +0 -21
  503. package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
  504. package/dist/features/search/components/SearchResultsSection.js +0 -35
  505. package/dist/features/search/components/SearchView.d.ts +0 -27
  506. package/dist/features/search/components/SearchView.js +0 -8
  507. package/dist/features/search/hooks/useSearch.d.ts +0 -21
  508. package/dist/features/search/hooks/useSearch.js +0 -33
  509. package/dist/features/search/repository/search.repository.d.ts +0 -14
  510. package/dist/features/search/repository/search.repository.js +0 -59
  511. package/dist/features/search/schemas/index.d.ts +0 -70
  512. package/dist/features/search/schemas/index.js +0 -36
  513. package/dist/features/search/types/index.d.ts +0 -48
  514. package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
  515. package/dist/features/stores/components/StoreScopedSearch.js +0 -27
  516. package/dist/seed/defaults/homepage-sections.d.ts +0 -2
  517. package/dist/seed/defaults/homepage-sections.js +0 -60
  518. package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
  519. package/dist/seed/factories/homepage-section.factory.js +0 -13
  520. /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
@@ -18,6 +18,7 @@ export declare const config: {
18
18
  chipLabel: string;
19
19
  browseRoute: string;
20
20
  inGeneralCatalogue: boolean;
21
+ canJoinProductGroup: boolean;
21
22
  iconKey: "preOrder";
22
23
  hideDefault: "closed";
23
24
  isAvailable: (row: AvailabilityRow) => boolean;
@@ -21,6 +21,8 @@ export const config = {
21
21
  browseRoute: String(ROUTES.PUBLIC.PRE_ORDERS),
22
22
  // /pre-orders is in MAIN_NAV_ITEMS.
23
23
  inGeneralCatalogue: false,
24
+ // a deposit against a future release; members would ship at different times
25
+ canJoinProductGroup: false,
24
26
  iconKey: "preOrder",
25
27
  hideDefault: "closed",
26
28
  // A pre-order closes when its allocation fills, NOT when its delivery date
@@ -18,6 +18,7 @@ export declare const config: {
18
18
  chipLabel: string;
19
19
  browseRoute: string;
20
20
  inGeneralCatalogue: boolean;
21
+ canJoinProductGroup: boolean;
21
22
  iconKey: "prizeDraw";
22
23
  hideDefault: "closed";
23
24
  isAvailable: (row: AvailabilityRow) => boolean;
@@ -21,6 +21,8 @@ export const config = {
21
21
  // /prize-draws is in MAIN_NAV_ITEMS. Entry-based pricing reads wrong beside
22
22
  // ordinary unit prices in the general grid.
23
23
  inGeneralCatalogue: false,
24
+ // sells ENTRIES at a fixed price; a group line would blur what was entered
25
+ canJoinProductGroup: false,
24
26
  iconKey: "prizeDraw",
25
27
  hideDefault: "closed",
26
28
  // `prizeRevealStatus`, NOT remaining entries: a draw can close with slots
@@ -0,0 +1,74 @@
1
+ import { alwaysAvailable } from "../availability";
2
+ export declare const LISTING_TYPE: "spares";
3
+ export declare const capability: import("../capabilities").ListingTypeCapability;
4
+ export declare const config: {
5
+ listingType: "spares";
6
+ slugPrefix: string;
7
+ cartLine: "single-product";
8
+ detailRoute: (idOrSlug: string) => string;
9
+ badge: {
10
+ label: string;
11
+ className: string;
12
+ };
13
+ priceLabel: string;
14
+ typeLabel: string;
15
+ showsStockQuantity: boolean;
16
+ tabSlug: string;
17
+ pluralLabel: string;
18
+ chipLabel: string;
19
+ browseRoute: string;
20
+ inGeneralCatalogue: boolean;
21
+ canJoinProductGroup: boolean;
22
+ iconKey: "spares";
23
+ hideDefault: "sold";
24
+ isAvailable: typeof alwaysAvailable;
25
+ unavailableClauses: readonly import("../availability").UnavailableClause[];
26
+ sortOptions: readonly [{
27
+ readonly value: string;
28
+ readonly label: "Newest First";
29
+ }, {
30
+ readonly value: string;
31
+ readonly label: "Oldest First";
32
+ }, {
33
+ readonly value: string;
34
+ readonly label: "Price: Low to High";
35
+ }, {
36
+ readonly value: string;
37
+ readonly label: "Price: High to Low";
38
+ }, {
39
+ readonly value: string;
40
+ readonly label: "Name: A–Z";
41
+ }, {
42
+ readonly value: string;
43
+ readonly label: "Name: Z–A";
44
+ }, {
45
+ readonly value: string;
46
+ readonly label: "Featured First";
47
+ }, {
48
+ readonly value: string;
49
+ readonly label: "Promoted First";
50
+ }, {
51
+ readonly value: string;
52
+ readonly label: "Recently Updated";
53
+ }];
54
+ publicSortOptions: readonly [{
55
+ readonly value: string;
56
+ readonly label: "Newest First";
57
+ }, {
58
+ readonly value: string;
59
+ readonly label: "Oldest First";
60
+ }, {
61
+ readonly value: string;
62
+ readonly label: "Price: Low to High";
63
+ }, {
64
+ readonly value: string;
65
+ readonly label: "Price: High to Low";
66
+ }, {
67
+ readonly value: string;
68
+ readonly label: "Name: A–Z";
69
+ }, {
70
+ readonly value: string;
71
+ readonly label: "Name: Z–A";
72
+ }];
73
+ extraFacetKeys: readonly string[];
74
+ };
@@ -0,0 +1,60 @@
1
+ import { LISTING_TYPE_CAPABILITIES } from "../capabilities.js";
2
+ import { alwaysAvailable, STOCK_ONLY_UNAVAILABLE_CLAUSES, } from "../availability.js";
3
+ import { ROUTES } from "../../../../next/routing/route-map.js";
4
+ import { STANDARD_SORT_OPTIONS, STANDARD_PUBLIC_SORT_OPTIONS, } from "../../../../features/products/constants/sieve.js";
5
+ export const LISTING_TYPE = "spares";
6
+ export const capability = LISTING_TYPE_CAPABILITIES.spares;
7
+ export const config = {
8
+ listingType: LISTING_TYPE,
9
+ /*
10
+ * Singular, matching `sticker-` rather than the plural type name.
11
+ *
12
+ * 🛑 Matched by `startsWith`, so this exact string must open every seeded id
13
+ * or `audit-seed-listing-type`'s R3 fails on every row — that audit calls the
14
+ * shipped `detectListingTypeFromSlug` rather than re-deriving the map, which
15
+ * is how it caught five `stickers-` ids against a registered `sticker-`.
16
+ */
17
+ slugPrefix: "spare-",
18
+ cartLine: "single-product",
19
+ detailRoute: (idOrSlug) => String(ROUTES.PUBLIC.PRODUCT_DETAIL(idOrSlug)),
20
+ badge: { label: "Spare Part", className: "bg-primary-700 text-white" },
21
+ priceLabel: "Price (₹)",
22
+ typeLabel: "Spares",
23
+ showsStockQuantity: true,
24
+ tabSlug: "spares",
25
+ pluralLabel: "Spares",
26
+ chipLabel: "Spares",
27
+ browseRoute: String(ROUTES.PUBLIC.SPARES),
28
+ /*
29
+ * 🛑 `false`, and it obliges the nav entry that lands in the same change.
30
+ *
31
+ * The rule for this flag is nav reachability, not taste: a type kept out of
32
+ * the general catalogue must own a page that `MAIN_NAV_ITEMS` links, or it is
33
+ * reachable from nowhere (Root Cause #61). `/spares` is that page.
34
+ *
35
+ * The reason to keep it out is the catalogue itself. A seller who strips one
36
+ * Beyblade lists eight parts, so a few disassembled items would outnumber
37
+ * every complete listing on `/products` — and a buyer looking for a loose
38
+ * attack ring wants a page where everything is a loose part, not one where
39
+ * they are scattered among bundles and sealed boxes.
40
+ */
41
+ inGeneralCatalogue: false,
42
+ /*
43
+ * A sheet-plus-parts group is the shape this exists for on the sticker side,
44
+ * and the same shape sells a stripped bey: the whole item as the parent, each
45
+ * salvaged part as a child, buyer takes any mix.
46
+ */
47
+ canJoinProductGroup: true,
48
+ iconKey: "spares",
49
+ hideDefault: "sold",
50
+ /*
51
+ * A spare runs out rather than ending — there is no time dimension at all, so
52
+ * the shared stock-only rules are the whole story. Usually quantity 1: it is
53
+ * one physical object the seller happens to have.
54
+ */
55
+ isAvailable: alwaysAvailable,
56
+ unavailableClauses: STOCK_ONLY_UNAVAILABLE_CLAUSES,
57
+ sortOptions: STANDARD_SORT_OPTIONS,
58
+ publicSortOptions: STANDARD_PUBLIC_SORT_OPTIONS,
59
+ extraFacetKeys: [],
60
+ };
@@ -0,0 +1 @@
1
+ export declare const ctas: readonly string[];
@@ -0,0 +1,4 @@
1
+ // Spares reuse the standard "Add to Cart" / "Buy Now" CTAs — plus the shared
2
+ // Make-an-Offer control, which is driven by `capability.canMakeOffer` rather
3
+ // than by anything here (mirrors the art/stickers/live placeholders).
4
+ export const ctas = [];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ProductDocument } from "../../../../features/products/schemas/firestore";
2
+ export declare function isSparesProduct(doc: ProductDocument): boolean;
@@ -0,0 +1,3 @@
1
+ export function isSparesProduct(doc) {
2
+ return doc.listingType === "spares";
3
+ }
@@ -18,6 +18,7 @@ export declare const config: {
18
18
  chipLabel: string;
19
19
  browseRoute: string;
20
20
  inGeneralCatalogue: boolean;
21
+ canJoinProductGroup: boolean;
21
22
  iconKey: "order";
22
23
  hideDefault: "sold";
23
24
  isAvailable: typeof alwaysAvailable;
@@ -19,6 +19,8 @@ export const config = {
19
19
  browseRoute: String(ROUTES.PUBLIC.PRODUCTS),
20
20
  // The general catalogue IS this type's page.
21
21
  inGeneralCatalogue: true,
22
+ // the ordinary case — a complete item whose parts can be sold beside it
23
+ canJoinProductGroup: true,
22
24
  iconKey: "order",
23
25
  hideDefault: "sold",
24
26
  // Runs out rather than ending — no time dimension, so the shared
@@ -18,6 +18,7 @@ export declare const config: {
18
18
  chipLabel: string;
19
19
  browseRoute: string;
20
20
  inGeneralCatalogue: boolean;
21
+ canJoinProductGroup: boolean;
21
22
  iconKey: "stickers";
22
23
  hideDefault: "sold";
23
24
  isAvailable: typeof alwaysAvailable;
@@ -22,6 +22,8 @@ export const config = {
22
22
  browseRoute: String(ROUTES.PUBLIC.ART),
23
23
  // /art ("Art & Stickers") is in MAIN_NAV_ITEMS and spans art + stickers.
24
24
  inGeneralCatalogue: false,
25
+ // THE case this exists for: a sheet plus its individual cut-out stickers
26
+ canJoinProductGroup: true,
25
27
  iconKey: "stickers",
26
28
  hideDefault: "sold",
27
29
  // Runs out rather than ending — no time dimension, so the shared
@@ -7,6 +7,17 @@ export interface ResolvedEntity {
7
7
  readonly detail: string;
8
8
  readonly href: string;
9
9
  readonly score: number;
10
+ /**
11
+ * The record's raw compact facet string (`"lt:auction|br:takara-tomy"`), or
12
+ * `""`. Carried on the hit so a facet rail can count what the CURRENT result
13
+ * set contains without going back to the artifact and re-finding each row.
14
+ *
15
+ * 🛑 Raw rather than parsed, on purpose. Parsing is `facetsOf(rec)` and it
16
+ * allocates an array per record; a rail counts over every hit on every
17
+ * keystroke, and most queries never render one. The consumer parses the
18
+ * handful it actually needs.
19
+ */
20
+ readonly facets: string;
10
21
  }
11
22
  export interface ResolveOptions {
12
23
  readonly limit?: number;
@@ -57,7 +57,7 @@
57
57
  import { normalizeSearchText, parseSearchTxtQuery } from "../../../utils/search-txt.js";
58
58
  import { aliasVariantsForName } from "./alias-variants.js";
59
59
  import { partAliasTokens } from "./part-aliases.js";
60
- import { facetsOf, hrefFor, REC_DETAIL, REC_TITLE, REC_TYPE, } from "./index-record.js";
60
+ import { facetsOf, hrefFor, REC_DETAIL, REC_FACETS, REC_TITLE, REC_TYPE, } from "./index-record.js";
61
61
  /** Field weights. Title dominates; a detail match is corroboration. */
62
62
  const W_TITLE = 3;
63
63
  const W_DETAIL = 1;
@@ -119,6 +119,30 @@ export function prepareIndex(artifact) {
119
119
  };
120
120
  });
121
121
  }
122
+ /**
123
+ * The shortest term allowed to match MID-WORD.
124
+ *
125
+ * 🛑 This exists because of a reported bug, and the mechanism is worth stating:
126
+ * the substring tier is `flat.includes(term)`, and for a one-character term
127
+ * that is satisfied by almost every record in the artifact. A category's
128
+ * `detail` is its " › "-joined path, so `"g"` matches
129
+ * `"Spinning Tops › Beyblade Original › Dragoon Line"` on the `g` in
130
+ * "Spinning". AND semantics then cannot narrow anything: `"dragoon g"` scored
131
+ * identically to `"dragoon"` and returned every Dragoon in the catalogue —
132
+ * which is the "even if I type dragoon g the results show everything"
133
+ * complaint, and it was never the AND logic's fault.
134
+ *
135
+ * 🛑 It does NOT reintroduce a minimum query length. This module's header is
136
+ * explicit that typing `"d"` and seeing something is what a local index is FOR,
137
+ * and it still does: the EXACT and PREFIX tiers are untouched, so a
138
+ * one-character term still matches any word starting with it. Only the mid-word
139
+ * tier is gated, because one character appearing somewhere inside a string is
140
+ * not evidence of intent.
141
+ *
142
+ * Two rather than three: `"cx"`, `"bu"`, `"gt"` and `"1b"` are real product
143
+ * vocabulary a collector types, and they discriminate.
144
+ */
145
+ const MIN_SUBSTRING_TERM = 2;
122
146
  /** Best match quality for one term against one field. 0 means no match. */
123
147
  function fieldScore(term, words, flat) {
124
148
  if (!flat)
@@ -129,8 +153,10 @@ function fieldScore(term, words, flat) {
129
153
  for (const w of words)
130
154
  if (w.startsWith(term))
131
155
  return S_PREFIX;
132
- // Mid-word. The capability the token index cannot have.
133
- if (flat.includes(term))
156
+ // Mid-word. The capability the token index cannot have — but see
157
+ // MIN_SUBSTRING_TERM: for a single character it is not a capability, it is a
158
+ // match against everything.
159
+ if (term.length >= MIN_SUBSTRING_TERM && flat.includes(term))
134
160
  return S_SUBSTRING;
135
161
  return 0;
136
162
  }
@@ -198,6 +224,7 @@ export function searchIndex(artifact, prepared, query, opts = {}) {
198
224
  title: p.rec[REC_TITLE],
199
225
  detail: p.rec[REC_DETAIL],
200
226
  href: hrefFor(artifact, p.rec),
227
+ facets: p.rec[REC_FACETS] ?? "",
201
228
  // An alias hit is a weaker signal than a direct one and must not
202
229
  // outrank it when both are present in a later, wider query.
203
230
  score: aliasPass ? score - S_ALIAS : score,
@@ -0,0 +1,52 @@
1
+ import type { SearchEverythingResult, SearchGroup } from "../../server/features/search/search-everything";
2
+ import type { ResolvedEntity } from "./match";
3
+ import type { SearchIndexArtifact } from "./index-record";
4
+ /** Rows shown per group before "see all". Matches the server tier's PER_GROUP. */
5
+ export declare const LOCAL_PER_GROUP = 6;
6
+ export interface ToGroupsOptions {
7
+ readonly perGroup?: number;
8
+ /**
9
+ * `typeKey` -> human heading. REQUIRED, and the artifact deliberately does
10
+ * not carry it: a label baked into a shared immutable artifact cannot be
11
+ * translated, and this app is `[locale]`-routed. The caller resolves it
12
+ * through the label system at render time.
13
+ */
14
+ readonly label: (typeKey: string) => string;
15
+ /** `typeKey` -> the type's browse page, from the artifact's type table. */
16
+ readonly moreHref: (typeKey: string) => string;
17
+ }
18
+ /**
19
+ * Group score-ordered hits by type, preserving the order the types first
20
+ * appear in.
21
+ *
22
+ * 🛑 Group ORDER follows the best hit in each group, not the type table's
23
+ * `weight`. Weight already biased the scores; applying it again as an
24
+ * ordering key would double-count it, and a query that matched one FAQ
25
+ * exactly would still rank a weak product match above it.
26
+ */
27
+ export declare function toSearchGroups(hits: readonly ResolvedEntity[], opts: ToGroupsOptions): SearchGroup[];
28
+ /** Assemble the full result envelope the page component expects. */
29
+ export declare function toSearchResult(q: string, terms: readonly string[], hits: readonly ResolvedEntity[], opts: ToGroupsOptions): SearchEverythingResult;
30
+ export interface FacetCount {
31
+ readonly key: string;
32
+ readonly value: string;
33
+ readonly count: number;
34
+ }
35
+ /**
36
+ * Count facet values across a result set.
37
+ *
38
+ * ## 🛑 This is the thing the server tier structurally cannot afford
39
+ *
40
+ * `BaseRepository.facetCounts` runs ONE aggregation query per facet value,
41
+ * each needing its own composite index, and on a missing index it logs and
42
+ * returns `undefined` so the facet "stays visible" with no count. Here it is
43
+ * a `reduce` over an array already in memory: zero queries, zero indexes, and
44
+ * a count that cannot silently fail.
45
+ *
46
+ * Counts are over the hits the CURRENT query produced, so ticking one facet
47
+ * and watching the others shrink is truthful rather than an approximation of
48
+ * the whole catalogue.
49
+ */
50
+ export declare function countFacets(hits: readonly ResolvedEntity[]): FacetCount[];
51
+ /** Look up a type's `moreHref` from the artifact's own table. */
52
+ export declare function moreHrefResolver(artifact: Pick<SearchIndexArtifact, "types">): (typeKey: string) => string;
@@ -0,0 +1,141 @@
1
+ /*
2
+ * WHY: Tier 1 and Tier 2 must render through the SAME component, or the page
3
+ * grows two layouts that drift.
4
+ * WHAT: `ResolvedEntity[]` (browser matcher) -> `SearchGroup[]` (the shape
5
+ * `SearchResultsPageView` already renders), plus facet counting.
6
+ *
7
+ * ## 🛑 Written against the server's types, not beside them
8
+ *
9
+ * `SearchGroup` / `SearchHit` / `SearchEverythingResult` are declared in
10
+ * `_internal/server/features/search/search-everything.ts` and imported here
11
+ * as TYPES ONLY — erased at runtime, so nothing of the server reaches a
12
+ * browser bundle. `SearchResultsPageView` already does exactly this, so the
13
+ * boundary is established rather than invented here.
14
+ *
15
+ * Defining a parallel `LocalSearchGroup` would have been the easy call and
16
+ * the wrong one: two near-identical result shapes is how a page ends up with
17
+ * two renderers, and then a fix to one of them (Root Cause #59's shape).
18
+ *
19
+ * ## 🛑 `truncated` is FALSE here, and that is a real difference
20
+ *
21
+ * The server tier reads a bounded window per collection, so a saturated fetch
22
+ * makes its count a FLOOR and it must render "6+". Tier 1 holds the entire
23
+ * corpus in memory, so the count is EXACT — there is no window to saturate.
24
+ * Reporting `truncated: true` because a group was capped for DISPLAY would be
25
+ * a different claim ("there may be more we could not see") and a false one.
26
+ * `total` carries the real figure; `hits` is the slice shown.
27
+ *
28
+ * @tag domain:search
29
+ * @tag layer:shared
30
+ * @tag pattern:none
31
+ * @tag access:isomorphic
32
+ * @tag consumers:useSiteSearch,SearchResultsClient
33
+ * @tag sideEffects:none
34
+ */
35
+ /** Rows shown per group before "see all". Matches the server tier's PER_GROUP. */
36
+ export const LOCAL_PER_GROUP = 6;
37
+ /**
38
+ * Group score-ordered hits by type, preserving the order the types first
39
+ * appear in.
40
+ *
41
+ * 🛑 Group ORDER follows the best hit in each group, not the type table's
42
+ * `weight`. Weight already biased the scores; applying it again as an
43
+ * ordering key would double-count it, and a query that matched one FAQ
44
+ * exactly would still rank a weak product match above it.
45
+ */
46
+ export function toSearchGroups(hits, opts) {
47
+ const perGroup = opts.perGroup ?? LOCAL_PER_GROUP;
48
+ const order = [];
49
+ const byType = new Map();
50
+ for (const hit of hits) {
51
+ let bucket = byType.get(hit.typeKey);
52
+ if (!bucket) {
53
+ bucket = [];
54
+ byType.set(hit.typeKey, bucket);
55
+ order.push(hit.typeKey);
56
+ }
57
+ bucket.push(hit);
58
+ }
59
+ return order.map((typeKey) => {
60
+ const bucket = byType.get(typeKey) ?? [];
61
+ const groupHits = bucket.slice(0, perGroup).map((h) => ({
62
+ /*
63
+ * The href IS the identity here. The artifact has no document id — it
64
+ * carries a slug, and two types can share a destination (a model
65
+ * composition and its category leaf both render `/categories/{s}`),
66
+ * which the matcher already dedupes on. Using the same key keeps the
67
+ * two consistent; inventing `${typeKey}:${slug}` would give the same
68
+ * row two identities depending on which layer you asked.
69
+ */
70
+ id: h.href,
71
+ title: h.title,
72
+ href: h.href,
73
+ detail: h.detail || undefined,
74
+ }));
75
+ return {
76
+ key: typeKey,
77
+ label: opts.label(typeKey),
78
+ hits: groupHits,
79
+ truncated: false, // see the header — the count is exact, not a floor
80
+ moreHref: opts.moreHref(typeKey),
81
+ };
82
+ });
83
+ }
84
+ /** Assemble the full result envelope the page component expects. */
85
+ export function toSearchResult(q, terms, hits, opts) {
86
+ const groups = toSearchGroups(hits, opts);
87
+ return {
88
+ q,
89
+ terms: [...terms],
90
+ groups,
91
+ /*
92
+ * The TOTAL matched, not the total shown. A page that says "24 results"
93
+ * and renders 12 because each group capped at 6 is lying in the direction
94
+ * that matters least; one that says "12" when 24 matched hides half the
95
+ * corpus from someone deciding whether to refine.
96
+ */
97
+ totalHits: hits.length,
98
+ };
99
+ }
100
+ /**
101
+ * Count facet values across a result set.
102
+ *
103
+ * ## 🛑 This is the thing the server tier structurally cannot afford
104
+ *
105
+ * `BaseRepository.facetCounts` runs ONE aggregation query per facet value,
106
+ * each needing its own composite index, and on a missing index it logs and
107
+ * returns `undefined` so the facet "stays visible" with no count. Here it is
108
+ * a `reduce` over an array already in memory: zero queries, zero indexes, and
109
+ * a count that cannot silently fail.
110
+ *
111
+ * Counts are over the hits the CURRENT query produced, so ticking one facet
112
+ * and watching the others shrink is truthful rather than an approximation of
113
+ * the whole catalogue.
114
+ */
115
+ export function countFacets(hits) {
116
+ const tally = new Map();
117
+ for (const hit of hits) {
118
+ if (!hit.facets)
119
+ continue;
120
+ for (const pair of hit.facets.split("|")) {
121
+ // Guard the shape rather than trusting it: a malformed pair is one
122
+ // record's problem, not a reason to drop the whole rail.
123
+ if (pair.indexOf(":") > 0)
124
+ tally.set(pair, (tally.get(pair) ?? 0) + 1);
125
+ }
126
+ }
127
+ const out = [];
128
+ for (const [pair, count] of tally) {
129
+ const i = pair.indexOf(":");
130
+ out.push({ key: pair.slice(0, i), value: pair.slice(i + 1), count });
131
+ }
132
+ // Commonest first within a key, then alphabetical — a rail ordered by raw
133
+ // string would bury the useful refinement below the rare ones.
134
+ out.sort((a, b) => a.key.localeCompare(b.key) || b.count - a.count || a.value.localeCompare(b.value));
135
+ return out;
136
+ }
137
+ /** Look up a type's `moreHref` from the artifact's own table. */
138
+ export function moreHrefResolver(artifact) {
139
+ const map = new Map(artifact.types.map((t) => [t.key, t.moreHref]));
140
+ return (typeKey) => map.get(typeKey) ?? "/";
141
+ }
package/dist/client.d.ts CHANGED
@@ -292,9 +292,11 @@ export { StoreSidebar } from "./features/seller/components/SellerSidebar";
292
292
  export type { StoreNavItem, StoreNavGroup } from "./features/seller/components/SellerSidebar";
293
293
  export { StoreProductsView, StoreAboutView } from "./features/stores/index";
294
294
  export type { StoreProductItem, StoreAboutViewProps, StoreDetail } from "./features/stores/index";
295
- export { SearchView } from "./features/search/index";
296
- export type { SearchViewProps } from "./features/search/index";
297
295
  export { useSearchIndex, ensureSearchIndex } from "./features/search/hooks/useSearchIndex";
296
+ export { useSiteSearch } from "./features/search/hooks/useSiteSearch";
297
+ export { useScopedSearch, mergeSearchTiers } from "./features/search/hooks/useScopedSearch";
298
+ export type { UseScopedSearchResult } from "./features/search/hooks/useScopedSearch";
299
+ export type { UseSiteSearchOptions, UseSiteSearchResult } from "./features/search/hooks/useSiteSearch";
298
300
  export type { SearchIndexState, SearchIndexStatus, LoadedSearchIndex, UseSearchIndexOptions, } from "./features/search/hooks/useSearchIndex";
299
301
  export { AdSlot } from "./features/homepage/components/AdSlot";
300
302
  export { useActiveAd } from "./features/homepage/hooks/useActiveAd";
@@ -456,6 +458,8 @@ export { SellerArtView } from "./features/seller/components/SellerArtView";
456
458
  export type { SellerArtViewProps } from "./features/seller/components/SellerArtView";
457
459
  export { SellerStickersView } from "./features/seller/components/SellerStickersView";
458
460
  export type { SellerStickersViewProps } from "./features/seller/components/SellerStickersView";
461
+ export { SellerSparesView } from "./features/seller/components/SellerSparesView";
462
+ export type { SellerSparesViewProps } from "./features/seller/components/SellerSparesView";
459
463
  export { SellerDigitalCodesView } from "./features/seller/components/SellerDigitalCodesView";
460
464
  export type { SellerDigitalCodesViewProps } from "./features/seller/components/SellerDigitalCodesView";
461
465
  export { SellerLiveView } from "./features/seller/components/SellerLiveView";
@@ -501,6 +505,8 @@ export type { FAQCategory, FAQCategoryItem, FAQSortOption } from "./features/faq
501
505
  export { CategoryInlineSelect } from "./features/seller/components/CategoryInlineSelect";
502
506
  export { CategoryTemplatePicker, variantForCondition } from "./features/categories/components/CategoryTemplatePicker";
503
507
  export type { CategoryTemplatePickerProps, CategoryTemplateApply } from "./features/categories/components/CategoryTemplatePicker";
508
+ export { PriceGuidanceHint } from "./features/categories/components/PriceGuidanceHint";
509
+ export type { PriceGuidanceHintProps } from "./features/categories/components/PriceGuidanceHint";
504
510
  export { BrandInlineSelect } from "./features/seller/components/BrandInlineSelect";
505
511
  export { API_ENDPOINTS } from "./constants/index";
506
512
  export { SELLER_LISTING_TABS, type SellerListingTabId, } from "./features/products/constants/listing-tabs";
package/dist/client.js CHANGED
@@ -327,7 +327,6 @@ export { updateProfileSchema } from "./features/account/index.js";
327
327
  export { MediaImage } from "./features/media/index.js";
328
328
  export { StoreSidebar } from "./features/seller/components/SellerSidebar.js";
329
329
  export { StoreProductsView, StoreAboutView } from "./features/stores/index.js";
330
- export { SearchView } from "./features/search/index.js";
331
330
  /*
332
331
  * The browser-side search index. Exported from its DEFINING module rather
333
332
  * than through `features/search/index` (Root Cause #18) — `ensureSearchIndex`
@@ -336,6 +335,8 @@ export { SearchView } from "./features/search/index.js";
336
335
  * fetch per page session" guarantee quietly becomes two.
337
336
  */
338
337
  export { useSearchIndex, ensureSearchIndex } from "./features/search/hooks/useSearchIndex.js";
338
+ export { useSiteSearch } from "./features/search/hooks/useSiteSearch.js";
339
+ export { useScopedSearch, mergeSearchTiers } from "./features/search/hooks/useScopedSearch.js";
339
340
  export { AdSlot } from "./features/homepage/components/AdSlot.js";
340
341
  export { useActiveAd } from "./features/homepage/hooks/useActiveAd.js";
341
342
  export { registerAdSlot, registerAdSlots, unregisterAdSlot, clearAdRegistry, setAdConsentGranted, isAdConsentGranted, isAdSlotRenderable, } from "./features/homepage/ad-registry.js";
@@ -466,6 +467,7 @@ export { SellerBundlesView } from "./features/seller/components/SellerBundlesVie
466
467
  export { SellerClassifiedView } from "./features/seller/components/SellerClassifiedView.js";
467
468
  export { SellerArtView } from "./features/seller/components/SellerArtView.js";
468
469
  export { SellerStickersView } from "./features/seller/components/SellerStickersView.js";
470
+ export { SellerSparesView } from "./features/seller/components/SellerSparesView.js";
469
471
  export { SellerDigitalCodesView } from "./features/seller/components/SellerDigitalCodesView.js";
470
472
  export { SellerLiveView } from "./features/seller/components/SellerLiveView.js";
471
473
  // ── Central schema registry (W1) ──────────────────────────────────────────────
@@ -502,6 +504,7 @@ export { computeCodHandlingFee } from "./_internal/shared/fees/calculator.js"; /
502
504
  export { FAQPageContent } from "./features/faq/index.js";
503
505
  export { CategoryInlineSelect } from "./features/seller/components/CategoryInlineSelect.js";
504
506
  export { CategoryTemplatePicker, variantForCondition } from "./features/categories/components/CategoryTemplatePicker.js";
507
+ export { PriceGuidanceHint } from "./features/categories/components/PriceGuidanceHint.js";
505
508
  export { BrandInlineSelect } from "./features/seller/components/BrandInlineSelect.js";
506
509
  export { API_ENDPOINTS } from "./constants/index.js";
507
510
  // [CLIENT-SAFE] Pure, zero-import constant files — dashboard filter-tab