@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
@@ -1,128 +0,0 @@
1
- import { normalizeError } from "../../../errors/normalize.js";
2
- /**
3
- * feat-search — Next.js App Router API handler (GET /api/search)
4
- *
5
- * 2-line stub:
6
- * ```ts
7
- * // app/api/search/route.ts
8
- * export { GET } from "@mohasinac/feat-search";
9
- * ```
10
- *
11
- * Performs Sieve-based product search via SearchRepository.
12
- * Supports: q, category, subcategory, minPrice, maxPrice, condition,
13
- * listingType, inStock, minRating, sort, page, pageSize.
14
- *
15
- * Note: external search providers are not built into this route. To enable one,
16
- * register an ISearchProvider via registerProviders() and handle it at
17
- * the application layer (middleware / wrapper route) before delegating here.
18
- *
19
- * Requires `db` registered in providers.config via `registerProviders()`.
20
- * Collection: "products"
21
- */
22
- import { NextResponse } from "next/server.js";
23
- import { getProviders } from "../../../contracts/index.js";
24
- import { SearchRepository } from "../repository/search.repository.js";
25
- import { isListingTypeEnabled, enabledListingTypes, } from "../../../_internal/shared/listing-types/feature-flags.js";
26
- import { getSiteSettingsGlobal } from "../../admin/utils/getSiteSettingsGlobal.js";
27
- function param(url, key) {
28
- return url.searchParams.get(key);
29
- }
30
- function numParam(url, key, fallback) {
31
- const v = url.searchParams.get(key);
32
- const n = v !== null ? Number(v) : NaN;
33
- return Number.isFinite(n) ? n : fallback;
34
- }
35
- // --- GET /api/search ----------------------------------------------------------
36
- export async function GET(request) {
37
- try {
38
- const url = new URL(request.url);
39
- const { db } = getProviders();
40
- if (!db) {
41
- return NextResponse.json({ success: false, error: "Database provider not registered" }, { status: 503 });
42
- }
43
- // SB1-G Phase 4 — canonical `?listingType=auction|pre-order|standard|prize-draw`.
44
- // SB-UNI-D — "bundle" removed; bundles are a categoryType, not a listingType.
45
- const listingTypeRaw = param(url, "listingType");
46
- const VALID_LISTING_TYPES = new Set([
47
- "standard",
48
- "auction",
49
- "pre-order",
50
- "prize-draw",
51
- ]);
52
- const listingType = listingTypeRaw && VALID_LISTING_TYPES.has(listingTypeRaw)
53
- ? listingTypeRaw
54
- : undefined;
55
- const inStockRaw = param(url, "inStock");
56
- const inStock = inStockRaw === "true" ? true : undefined;
57
- const minPriceRaw = numParam(url, "minPrice", 0);
58
- const maxPriceRaw = numParam(url, "maxPrice", 0);
59
- const page = numParam(url, "page", 1);
60
- const pageSize = Math.min(numParam(url, "pageSize", 20), 100);
61
- // W1-43 — listing-type feature flag gating. Reject a search scoped to a
62
- // disabled listing type with an empty result; for unscoped searches,
63
- // strip disabled types post-query so search-bar suggestions stay clean.
64
- let siteSettings = null;
65
- try {
66
- siteSettings = await getSiteSettingsGlobal();
67
- }
68
- catch (_err) {
69
- void normalizeError(_err);
70
- siteSettings = null;
71
- }
72
- if (listingType && siteSettings && !isListingTypeEnabled(listingType, siteSettings)) {
73
- return NextResponse.json({
74
- success: true,
75
- data: {
76
- items: [],
77
- total: 0,
78
- page,
79
- pageSize,
80
- totalPages: 0,
81
- hasMore: false,
82
- backend: "firestore",
83
- listingTypeDisabled: true,
84
- },
85
- });
86
- }
87
- const enabledSet = new Set(siteSettings ? enabledListingTypes(siteSettings) : []);
88
- const repo = new SearchRepository(db.getRepository("products"));
89
- const result = await repo.search({
90
- q: param(url, "q") ?? undefined,
91
- category: param(url, "category") ?? undefined,
92
- subcategory: param(url, "subcategory") ?? undefined,
93
- minPrice: minPriceRaw > 0 ? minPriceRaw : undefined,
94
- maxPrice: maxPriceRaw > 0 ? maxPriceRaw : undefined,
95
- condition: param(url, "condition") ?? undefined,
96
- listingType,
97
- inStock,
98
- minRating: numParam(url, "minRating", 0) || undefined,
99
- sort: param(url, "sort") ?? "-createdAt",
100
- page,
101
- pageSize,
102
- });
103
- // W1-43 — when no specific listingType filter, strip disabled types from
104
- // the surface. Skipped when all types are enabled or settings failed to load.
105
- let filteredItems = result.items;
106
- let filteredTotal = result.total;
107
- if (!listingType && enabledSet.size > 0 && enabledSet.size < 7) {
108
- const before = filteredItems.length;
109
- filteredItems = filteredItems.filter((it) => enabledSet.has(it.listingType ?? "standard"));
110
- const removed = before - filteredItems.length;
111
- filteredTotal = Math.max(0, filteredTotal - removed);
112
- }
113
- return NextResponse.json({
114
- success: true,
115
- data: {
116
- ...result,
117
- items: filteredItems,
118
- total: filteredTotal,
119
- backend: "firestore",
120
- },
121
- });
122
- }
123
- catch (error) {
124
- void normalizeError(error);
125
- console.error("[feat-search] GET /api/search failed", error);
126
- return NextResponse.json({ success: false, error: "Search failed" }, { status: 500 });
127
- }
128
- }
@@ -1,17 +0,0 @@
1
- import type { TableColumn, ColumnExtensionOpts } from "../../../contracts";
2
- import type { SearchProductItem } from "../types";
3
- /**
4
- * Default admin columns for search result product items.
5
- * Use `buildSearchResultColumns()` to customise via overrides / extras / omit.
6
- */
7
- export declare const searchResultAdminColumns: TableColumn<SearchProductItem>[];
8
- /**
9
- * Factory that returns columns for the search results admin table.
10
- *
11
- * @example
12
- * const cols = buildSearchResultColumns<MySearchItem>({
13
- * extras: [{ key: "brandTag", header: "Brand", render: (s) => s.brandTag }],
14
- * omit: ["listingType"],
15
- * });
16
- */
17
- export declare function buildSearchResultColumns<T extends SearchProductItem = SearchProductItem>(opts?: ColumnExtensionOpts<T>): TableColumn<T>[];
@@ -1,49 +0,0 @@
1
- import { buildColumns, renderCurrencyCompact, renderBoolean, } from "../../../ui/columns/index.js";
2
- /**
3
- * Default admin columns for search result product items.
4
- * Use `buildSearchResultColumns()` to customise via overrides / extras / omit.
5
- */
6
- export const searchResultAdminColumns = [
7
- {
8
- key: "title",
9
- header: "Title",
10
- sortable: true,
11
- },
12
- {
13
- key: "price",
14
- header: "Price",
15
- sortable: true,
16
- render: (item) => item.price != null
17
- ? renderCurrencyCompact(item.price, item.currency)
18
- : "—",
19
- },
20
- {
21
- key: "status",
22
- header: "Status",
23
- sortable: false,
24
- },
25
- {
26
- key: "featured",
27
- header: "Featured",
28
- sortable: false,
29
- render: (item) => renderBoolean(item.featured),
30
- },
31
- {
32
- key: "listingType",
33
- header: "Type",
34
- sortable: false,
35
- render: (item) => item.listingType ?? "standard",
36
- },
37
- ];
38
- /**
39
- * Factory that returns columns for the search results admin table.
40
- *
41
- * @example
42
- * const cols = buildSearchResultColumns<MySearchItem>({
43
- * extras: [{ key: "brandTag", header: "Brand", render: (s) => s.brandTag }],
44
- * omit: ["listingType"],
45
- * });
46
- */
47
- export function buildSearchResultColumns(opts) {
48
- return buildColumns(searchResultAdminColumns, opts);
49
- }
@@ -1,22 +0,0 @@
1
- import type { SearchCategoryOption } from "../types";
2
- interface SearchFiltersRowProps {
3
- urlCategory: string;
4
- categories: SearchCategoryOption[];
5
- urlMinPrice: string;
6
- urlMaxPrice: string;
7
- showClear: boolean;
8
- onCategoryChange: (value: string) => void;
9
- onPriceFilter: (min: string, max: string) => void;
10
- onClearFilters: () => void;
11
- labels?: {
12
- categoryFilter?: string;
13
- allCategories?: string;
14
- priceRange?: string;
15
- minPrice?: string;
16
- maxPrice?: string;
17
- apply?: string;
18
- clearFilters?: string;
19
- };
20
- }
21
- export declare function SearchFiltersRow({ urlCategory, categories, urlMinPrice, urlMaxPrice, showClear, onCategoryChange, onPriceFilter, onClearFilters, labels, }: SearchFiltersRowProps): import("react").JSX.Element;
22
- export {};
@@ -1,21 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from "react";
4
- import { Button, Input, Label, Row, Select, Span, Stack } from "../../../ui/index.js";
5
- export function SearchFiltersRow({ urlCategory, categories, urlMinPrice, urlMaxPrice, showClear, onCategoryChange, onPriceFilter, onClearFilters, labels = {}, }) {
6
- const [minPrice, setMinPrice] = useState(urlMinPrice);
7
- const [maxPrice, setMaxPrice] = useState(urlMaxPrice);
8
- const L = {
9
- categoryFilter: labels.categoryFilter ?? "Category",
10
- allCategories: labels.allCategories ?? "All Categories",
11
- priceRange: labels.priceRange ?? "Price Range",
12
- minPrice: labels.minPrice ?? "Min",
13
- maxPrice: labels.maxPrice ?? "Max",
14
- apply: labels.apply ?? "Apply",
15
- clearFilters: labels.clearFilters ?? "Clear Filters",
16
- };
17
- return (_jsxs(Row, { wrap: true, gap: "md", align: "end", children: [_jsxs(Stack, { gap: "xs", children: [_jsx(Label, { size: "sm", weight: "medium", color: "muted", children: L.categoryFilter }), _jsx(Select, { value: urlCategory, onValueChange: (value) => onCategoryChange(value), options: [
18
- { value: "", label: L.allCategories },
19
- ...categories.map((cat) => ({ value: cat.id, label: cat.name })),
20
- ], className: "rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-input)] px-[var(--appkit-space-3)] py-[var(--appkit-space-2)] text-[length:var(--appkit-text-sm)] text-[var(--appkit-color-text)] focus:outline-none focus:ring-2 focus:ring-primary-500/20" })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Label, { size: "sm", weight: "medium", color: "muted", children: L.priceRange }), _jsxs(Row, { align: "center", gap: "sm", children: [_jsx(Input, { type: "number", min: 0, value: minPrice, onChange: (e) => setMinPrice(e.target.value), placeholder: L.minPrice, className: "w-28 rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-input)] px-[var(--appkit-space-3)] py-[var(--appkit-space-2)] text-[length:var(--appkit-text-sm)] text-[var(--appkit-color-text)] focus:outline-none focus:ring-2 focus:ring-primary-500/20" }), _jsx(Span, { size: "sm", color: "muted", children: "\u2013" }), _jsx(Input, { type: "number", min: 0, value: maxPrice, onChange: (e) => setMaxPrice(e.target.value), placeholder: L.maxPrice, className: "w-28 rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-input)] px-[var(--appkit-space-3)] py-[var(--appkit-space-2)] text-[length:var(--appkit-text-sm)] text-[var(--appkit-color-text)] focus:outline-none focus:ring-2 focus:ring-primary-500/20" }), _jsx(Button, { rounded: "lg", type: "button", variant: "primary", size: "sm", onClick: () => onPriceFilter(minPrice, maxPrice), className: "h-10 px-[var(--appkit-space-4)] bg-primary-600 hover:bg-primary-700 text-white text-[length:var(--appkit-text-sm)] font-medium transition-colors", children: L.apply })] })] }), showClear && (_jsx(Button, { rounded: "lg", type: "button", variant: "outline", size: "sm", onClick: onClearFilters, paddingX: "md", textSize: "sm", className: "h-10 border border-[var(--appkit-color-border)] text-[var(--appkit-color-text)] hover:bg-[var(--appkit-color-surface-elevated)] transition-colors", children: L.clearFilters }))] }));
21
- }
@@ -1,53 +0,0 @@
1
- import React from "react";
2
- import type { SearchProductItem } from "../types";
3
- export interface SearchResultsSectionProps {
4
- products: SearchProductItem[];
5
- total: number;
6
- totalPages: number;
7
- urlQ: string;
8
- urlSort: string;
9
- urlPage: number;
10
- isLoading: boolean;
11
- /** Called with new sort value */
12
- onSortChange: (sort: string) => void;
13
- /** Called with new page number */
14
- onPageChange: (page: number) => void;
15
- /** Slot for rendering a single product card */
16
- renderItem: (product: SearchProductItem) => React.ReactNode;
17
- /** Optional custom loading renderer. */
18
- renderLoading?: (opts: {
19
- skeletonCount: number;
20
- }) => React.ReactNode;
21
- /** Optional custom empty-state renderer. */
22
- renderEmpty?: (opts: {
23
- query: string;
24
- }) => React.ReactNode;
25
- /** Optional custom products renderer. */
26
- renderProducts?: (products: SearchProductItem[]) => React.ReactNode;
27
- /** Optional custom sort/count toolbar renderer. */
28
- renderSortBar?: (opts: {
29
- total: number;
30
- showing: number;
31
- urlSort: string;
32
- onSortChange: (sort: string) => void;
33
- }) => React.ReactNode;
34
- /** Optional custom pagination renderer. */
35
- renderPagination?: (opts: {
36
- urlPage: number;
37
- totalPages: number;
38
- onPageChange: (page: number) => void;
39
- }) => React.ReactNode;
40
- sortOptions?: Array<{
41
- value: string;
42
- label: string;
43
- }>;
44
- labels?: {
45
- sortLabel?: string;
46
- noResultsTitle?: string;
47
- noResultsSubtitle?: string;
48
- showing?: (count: number, total: number) => string;
49
- prevPage?: string;
50
- nextPage?: string;
51
- };
52
- }
53
- export declare function SearchResultsSection({ products, total, totalPages, urlQ, urlSort, urlPage, isLoading, onSortChange, onPageChange, renderItem, renderLoading, renderEmpty, renderProducts, renderSortBar, renderPagination, sortOptions, labels, }: SearchResultsSectionProps): React.JSX.Element;
@@ -1,35 +0,0 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Button, Div, Grid, Row, Select, Span, Stack, Text } from "../../../ui/index.js";
3
- const PAGE_SIZE = 24;
4
- export function SearchResultsSection({ products, total, totalPages, urlQ, urlSort, urlPage, isLoading, onSortChange, onPageChange, renderItem, renderLoading, renderEmpty, renderProducts, renderSortBar, renderPagination, sortOptions = [], labels = {}, }) {
5
- const L = {
6
- noResultsTitle: labels.noResultsTitle ?? "No results found",
7
- noResultsSubtitle: labels.noResultsSubtitle,
8
- showing: labels.showing ?? ((c, t) => `Showing ${c} of ${t}`),
9
- prevPage: labels.prevPage ?? "Previous",
10
- nextPage: labels.nextPage ?? "Next",
11
- };
12
- if (isLoading) {
13
- if (renderLoading) {
14
- return _jsx(_Fragment, { children: renderLoading({ skeletonCount: PAGE_SIZE }) });
15
- }
16
- return (_jsx(Grid, { cols: "statTiles", children: Array.from({ length: PAGE_SIZE }).map((_, i) => (_jsx(Div, { className: "aspect-square animate-pulse", surface: "subtle", rounded: "xl" }, i))) }));
17
- }
18
- if (products.length === 0) {
19
- if (renderEmpty) {
20
- return _jsx(_Fragment, { children: renderEmpty({ query: urlQ }) });
21
- }
22
- return (_jsxs(Stack, { justify: "center", padding: "y-5xl", className: "text-left", align: "start", gap: "3", children: [_jsx(Span, { "aria-hidden": "true", size: "5xl", children: "\uD83D\uDD0D" }), _jsx(Text, { size: "lg", weight: "semibold", color: "primary", children: L.noResultsTitle }), urlQ && L.noResultsSubtitle && (_jsx(Text, { size: "sm", color: "muted", children: L.noResultsSubtitle }))] }));
23
- }
24
- return (_jsxs(Stack, { gap: "5", children: [renderSortBar ? (renderSortBar({
25
- total,
26
- showing: products.length,
27
- urlSort,
28
- onSortChange,
29
- })) : (_jsxs(Row, { justify: "between", children: [_jsx(Text, { size: "sm", color: "muted", children: L.showing(products.length, total) }), sortOptions.length > 0 && (_jsx(Select, { value: urlSort, onValueChange: onSortChange, options: sortOptions, className: "rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-input)] px-[var(--appkit-space-3)] py-[var(--appkit-space-1-5)] text-[length:var(--appkit-text-sm)] text-[var(--appkit-color-text)] focus:outline-none" }))] })), renderProducts ? (renderProducts(products)) : (_jsx(Grid, { cols: "statTiles", children: products.map((p) => (_jsx(Div, { children: renderItem(p) }, p.id))) })), totalPages > 1 &&
30
- (renderPagination ? (renderPagination({
31
- urlPage,
32
- totalPages,
33
- onPageChange,
34
- })) : (_jsxs(Row, { align: "center", justify: "center", gap: "sm", padding: "t-md", children: [_jsx(Button, { rounded: "lg", type: "button", variant: "outline", size: "sm", onClick: () => onPageChange(urlPage - 1), disabled: urlPage <= 1, className: "px-[var(--appkit-space-4)] py-[var(--appkit-space-2)] border border-[var(--appkit-color-border)] text-[length:var(--appkit-text-sm)] text-[var(--appkit-color-text-muted)] disabled:opacity-40 hover:bg-surface-hover transition-colors", children: L.prevPage }), _jsxs(Span, { size: "sm", className: "tabular-nums", color: "muted", children: [urlPage, " / ", totalPages] }), _jsx(Button, { rounded: "lg", type: "button", variant: "outline", size: "sm", onClick: () => onPageChange(urlPage + 1), disabled: urlPage >= totalPages, className: "px-[var(--appkit-space-4)] py-[var(--appkit-space-2)] border border-[var(--appkit-color-border)] text-[length:var(--appkit-text-sm)] text-[var(--appkit-color-text-muted)] disabled:opacity-40 hover:bg-surface-hover transition-colors", children: L.nextPage })] })))] }));
35
- }
@@ -1,27 +0,0 @@
1
- import React from "react";
2
- export interface SearchViewProps {
3
- /** Current search query string */
4
- query?: string;
5
- /** Total result count */
6
- total: number;
7
- labels?: {
8
- searchTitle?: string;
9
- resultsCount?: (count: number, query: string) => string;
10
- noQuery?: string;
11
- noQueryDescription?: string;
12
- };
13
- /** Render the search input */
14
- renderSearchInput: () => React.ReactNode;
15
- /** Render the filters panel (drawer/sidebar) */
16
- renderFilters?: () => React.ReactNode;
17
- /** Render active filter chips */
18
- renderActiveFilters?: () => React.ReactNode;
19
- /** Render the sort + view-mode toolbar */
20
- renderToolbar?: () => React.ReactNode;
21
- /** Render results grid / list */
22
- renderResults: () => React.ReactNode;
23
- /** Render pagination */
24
- renderPagination?: () => React.ReactNode;
25
- className?: string;
26
- }
27
- export declare function SearchView({ query, total, labels, renderSearchInput, renderFilters, renderActiveFilters, renderToolbar, renderResults, renderPagination, className, }: SearchViewProps): React.JSX.Element;
@@ -1,8 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Div, Heading, Main, Row, Span, Stack, Text } from "../../../ui/index.js";
3
- export function SearchView({ query, total, labels = {}, renderSearchInput, renderFilters, renderActiveFilters, renderToolbar, renderResults, renderPagination, className = "", }) {
4
- const hasQuery = !!query?.trim();
5
- return (_jsx(Main, { className: `min-h-screen ${className}`, children: _jsxs(Stack, { padding: "y-lg", gap: "md", children: [_jsx(Div, { children: renderSearchInput() }), hasQuery && (_jsx(Div, { children: _jsx(Heading, { level: 1, size: "xl", weight: "semibold", children: labels.resultsCount
6
- ? labels.resultsCount(total, query)
7
- : `${total} results for "${query}"` }) })), !hasQuery && (_jsxs(Div, { className: "text-left", padding: "y-4xl", children: [_jsx(Span, { className: "mb-4 block", size: "4xl", children: "\uD83D\uDD0D" }), _jsx(Heading, { level: 2, className: "mb-2", children: labels.searchTitle ?? "Search" }), _jsx(Text, { variant: "secondary", children: labels.noQueryDescription ?? "Start typing to find products" })] })), hasQuery && (_jsxs(_Fragment, { children: [renderActiveFilters?.(), _jsxs(Row, { wrap: true, justify: "between", gap: "3", children: [renderFilters?.(), renderToolbar?.()] }), renderResults(), renderPagination?.()] }))] }) }));
8
- }
@@ -1,21 +0,0 @@
1
- import type { SearchResponse, SearchCategoryOption } from "../types";
2
- interface UseSearchOptions {
3
- initialCategories?: SearchCategoryOption[];
4
- categoriesEndpoint?: string;
5
- searchEndpoint?: string;
6
- }
7
- /**
8
- * useSearch
9
- * Fetches search results via GET /api/search.
10
- * `searchParams` is a pre-built URLSearchParams string produced by the component.
11
- * `options.initialCategories` — server-prefetched category list for filter facets.
12
- */
13
- export declare function useSearch(searchParams: string, options?: UseSearchOptions): {
14
- results: SearchResponse | null;
15
- items: import("..").SearchProductItem[];
16
- total: number;
17
- totalPages: number;
18
- isLoading: boolean;
19
- categories: SearchCategoryOption[];
20
- };
21
- export {};
@@ -1,33 +0,0 @@
1
- import { useQuery } from "@tanstack/react-query";
2
- import { apiClient } from "../../../http/index.js";
3
- import { CATEGORY_ENDPOINTS, SEARCH_ENDPOINTS } from "../../../constants/api-endpoints.js";
4
- /**
5
- * useSearch
6
- * Fetches search results via GET /api/search.
7
- * `searchParams` is a pre-built URLSearchParams string produced by the component.
8
- * `options.initialCategories` — server-prefetched category list for filter facets.
9
- */
10
- export function useSearch(searchParams, options) {
11
- const categoriesEndpoint = options?.categoriesEndpoint ?? CATEGORY_ENDPOINTS.FLAT;
12
- const { data: categories } = useQuery({
13
- queryKey: ["search", "categories"],
14
- queryFn: () => apiClient.get(categoriesEndpoint),
15
- initialData: options?.initialCategories,
16
- staleTime: 1000 * 60 * 5, // 5 min
17
- });
18
- const searchEndpoint = options?.searchEndpoint ?? SEARCH_ENDPOINTS.RAW(searchParams);
19
- const { data: searchData, isLoading } = useQuery({
20
- queryKey: ["search", searchParams],
21
- queryFn: () => apiClient.get(searchEndpoint),
22
- enabled: searchParams.length > 0,
23
- placeholderData: (prev) => prev,
24
- });
25
- return {
26
- results: searchData ?? null,
27
- items: searchData?.items ?? [],
28
- total: searchData?.total ?? 0,
29
- totalPages: searchData?.totalPages ?? 0,
30
- isLoading,
31
- categories: categories ?? [],
32
- };
33
- }
@@ -1,14 +0,0 @@
1
- import type { IReadRepository } from "../../../contracts";
2
- import type { SearchProductItem, SearchQuery, SearchResponse } from "../types";
3
- /**
4
- * SearchRepository
5
- *
6
- * Wraps IReadRepository<SearchProductItem> to provide domain-specific
7
- * search query building. Injected at the application layer — this class
8
- * has zero knowledge of Firestore, Prisma, or any concrete DB.
9
- */
10
- export declare class SearchRepository {
11
- private readonly repo;
12
- constructor(repo: IReadRepository<SearchProductItem>);
13
- search(query: SearchQuery): Promise<SearchResponse>;
14
- }
@@ -1,59 +0,0 @@
1
- import { SIEVE_OP, sieveFilter } from "../../../utils/sieve-builder.js";
2
- import { PRODUCT_FIELDS } from "../../../constants/field-names.js";
3
- /**
4
- * SearchRepository
5
- *
6
- * Wraps IReadRepository<SearchProductItem> to provide domain-specific
7
- * search query building. Injected at the application layer — this class
8
- * has zero knowledge of Firestore, Prisma, or any concrete DB.
9
- */
10
- export class SearchRepository {
11
- constructor(repo) {
12
- this.repo = repo;
13
- }
14
- async search(query) {
15
- const filterParts = [];
16
- if (query.q)
17
- filterParts.push(`title_=${query.q}`);
18
- if (query.category)
19
- filterParts.push(`category==${query.category}`);
20
- if (query.subcategory)
21
- filterParts.push(`subcategory==${query.subcategory}`);
22
- if (query.minPrice !== undefined)
23
- filterParts.push(`price>=${String(query.minPrice)}`);
24
- if (query.maxPrice !== undefined)
25
- filterParts.push(`price<=${String(query.maxPrice)}`);
26
- if (query.condition)
27
- filterParts.push(`condition==${query.condition}`);
28
- // SB1-G Phase 4 — canonical listingType discriminator.
29
- if (query.listingType) {
30
- filterParts.push(sieveFilter(PRODUCT_FIELDS.LISTING_TYPE, SIEVE_OP.EQ, query.listingType));
31
- }
32
- if (query.inStock === true)
33
- filterParts.push("availableQuantity>0");
34
- if (query.minRating !== undefined)
35
- filterParts.push(`averageRating>=${String(query.minRating)}`);
36
- filterParts.push("status==published");
37
- const sieveQuery = {
38
- filters: filterParts.join(","),
39
- sort: query.sort
40
- ? query.sort.startsWith("-")
41
- ? query.sort.slice(1)
42
- : query.sort
43
- : "createdAt",
44
- order: query.sort?.startsWith("-") ? "desc" : "asc",
45
- page: query.page ?? 1,
46
- pageSize: query.pageSize ?? 24,
47
- };
48
- const result = await this.repo.findAll(sieveQuery);
49
- return {
50
- items: result.data,
51
- q: query.q ?? "",
52
- total: result.total,
53
- page: result.page,
54
- pageSize: result.pageSize,
55
- totalPages: result.totalPages,
56
- hasMore: result.page < result.totalPages,
57
- };
58
- }
59
- }
@@ -1,70 +0,0 @@
1
- import { z } from "zod";
2
- /**
3
- * Schema for a search result product item.
4
- *
5
- * @example
6
- * import { searchProductItemSchema } from "@mohasinac/feat-search";
7
- *
8
- * const mySchema = searchProductItemSchema.extend({
9
- * brandTag: z.string().optional(),
10
- * });
11
- */
12
- export declare const searchProductItemSchema: z.ZodObject<{
13
- id: z.ZodString;
14
- title: z.ZodString;
15
- price: z.ZodOptional<z.ZodNumber>;
16
- currency: z.ZodOptional<z.ZodString>;
17
- mainImage: z.ZodOptional<z.ZodString>;
18
- status: z.ZodOptional<z.ZodString>;
19
- featured: z.ZodOptional<z.ZodBoolean>;
20
- listingType: z.ZodOptional<z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle"]>>;
21
- isPromoted: z.ZodOptional<z.ZodBoolean>;
22
- slug: z.ZodString;
23
- }, "strip", z.ZodTypeAny, {
24
- id: string;
25
- title: string;
26
- slug: string;
27
- currency?: string | undefined;
28
- status?: string | undefined;
29
- price?: number | undefined;
30
- listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | undefined;
31
- mainImage?: string | undefined;
32
- featured?: boolean | undefined;
33
- isPromoted?: boolean | undefined;
34
- }, {
35
- id: string;
36
- title: string;
37
- slug: string;
38
- currency?: string | undefined;
39
- status?: string | undefined;
40
- price?: number | undefined;
41
- listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | undefined;
42
- mainImage?: string | undefined;
43
- featured?: boolean | undefined;
44
- isPromoted?: boolean | undefined;
45
- }>;
46
- /**
47
- * Form/query schema for a search request.
48
- */
49
- export declare const searchQuerySchema: z.ZodObject<{
50
- q: z.ZodString;
51
- category: z.ZodOptional<z.ZodString>;
52
- minPrice: z.ZodOptional<z.ZodNumber>;
53
- maxPrice: z.ZodOptional<z.ZodNumber>;
54
- sort: z.ZodOptional<z.ZodString>;
55
- page: z.ZodDefault<z.ZodNumber>;
56
- }, "strip", z.ZodTypeAny, {
57
- page: number;
58
- q: string;
59
- sort?: string | undefined;
60
- category?: string | undefined;
61
- minPrice?: number | undefined;
62
- maxPrice?: number | undefined;
63
- }, {
64
- q: string;
65
- sort?: string | undefined;
66
- page?: number | undefined;
67
- category?: string | undefined;
68
- minPrice?: number | undefined;
69
- maxPrice?: number | undefined;
70
- }>;
@@ -1,36 +0,0 @@
1
- import { z } from "zod";
2
- /**
3
- * Schema for a search result product item.
4
- *
5
- * @example
6
- * import { searchProductItemSchema } from "@mohasinac/feat-search";
7
- *
8
- * const mySchema = searchProductItemSchema.extend({
9
- * brandTag: z.string().optional(),
10
- * });
11
- */
12
- export const searchProductItemSchema = z.object({
13
- id: z.string(),
14
- title: z.string(),
15
- price: z.number().optional(),
16
- currency: z.string().optional(),
17
- mainImage: z.string().optional(),
18
- status: z.string().optional(),
19
- featured: z.boolean().optional(),
20
- listingType: z
21
- .enum(["standard", "auction", "pre-order", "prize-draw", "bundle"])
22
- .optional(),
23
- isPromoted: z.boolean().optional(),
24
- slug: z.string(),
25
- });
26
- /**
27
- * Form/query schema for a search request.
28
- */
29
- export const searchQuerySchema = z.object({
30
- q: z.string().min(1),
31
- category: z.string().optional(),
32
- minPrice: z.number().optional(),
33
- maxPrice: z.number().optional(),
34
- sort: z.string().optional(),
35
- page: z.number().int().positive().default(1),
36
- });
@@ -1,48 +0,0 @@
1
- import type { ListingType } from "../../products/types";
2
- export interface SearchProductItem {
3
- id: string;
4
- title: string;
5
- description?: string;
6
- price: number;
7
- currency: string;
8
- mainImage?: string;
9
- images?: string[];
10
- status: string;
11
- featured?: boolean;
12
- /** Canonical listing-kind discriminator (SB1-G Phase 4). */
13
- listingType?: ListingType;
14
- currentBid?: number;
15
- isPromoted?: boolean;
16
- slug: string;
17
- availableQuantity?: number;
18
- }
19
- export interface SearchResponse {
20
- items: SearchProductItem[];
21
- q: string;
22
- total: number;
23
- page: number;
24
- pageSize: number;
25
- totalPages: number;
26
- hasMore: boolean;
27
- }
28
- export interface SearchQuery {
29
- q?: string;
30
- category?: string;
31
- subcategory?: string;
32
- minPrice?: number;
33
- maxPrice?: number;
34
- condition?: string;
35
- /** Canonical listing-kind discriminator (SB1-G Phase 4). */
36
- listingType?: ListingType;
37
- inStock?: boolean;
38
- minRating?: number;
39
- sort?: string;
40
- page?: number;
41
- pageSize?: number;
42
- }
43
- export interface SearchCategoryOption {
44
- id: string;
45
- name: string;
46
- slug?: string;
47
- tier?: number;
48
- }