@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,15 +0,0 @@
1
- import type { SearchQuery } from "../../../../features/search/types";
2
- /**
3
- * SSR-compatible search read — deduplicated per request via React.cache().
4
- * Used by the /search page to pre-render results without a client fetch.
5
- */
6
- export declare const getSearchResults: (query: SearchQuery) => Promise<import("../../../..").SearchProductsResult | {
7
- items: never[];
8
- q: string;
9
- total: number;
10
- page: number;
11
- pageSize: number;
12
- totalPages: number;
13
- hasMore: boolean;
14
- backend: "in-memory";
15
- }>;
@@ -1,18 +0,0 @@
1
- import { cache } from "react";
2
- import { searchProducts } from "../../../../features/search/actions/search-actions.js";
3
- /**
4
- * SSR-compatible search read — deduplicated per request via React.cache().
5
- * Used by the /search page to pre-render results without a client fetch.
6
- */
7
- export const getSearchResults = cache(async (query) => {
8
- return searchProducts(query).catch(() => ({
9
- items: [],
10
- q: query.q ?? "",
11
- total: 0,
12
- page: 1,
13
- pageSize: query.pageSize ?? 20,
14
- totalPages: 0,
15
- hasMore: false,
16
- backend: "in-memory",
17
- }));
18
- });
@@ -1,3 +0,0 @@
1
- export { getSearchResults } from "./data";
2
- export { searchAction } from "./actions";
3
- export type { SearchQuery } from "../../../../features/search/types";
@@ -1,2 +0,0 @@
1
- export { getSearchResults } from "./data.js";
2
- export { searchAction } from "./actions.js";
@@ -1,23 +0,0 @@
1
- /**
2
- * feat-homepage — GET / PATCH / DELETE /api/homepage-sections/[id]
3
- *
4
- * Pure stub:
5
- * ```ts
6
- * // app/api/homepage-sections/[id]/route.ts
7
- * export { homepageSectionItemGET as GET, homepageSectionItemPATCH as PATCH, homepageSectionItemDELETE as DELETE }
8
- * from "@mohasinac/feat-homepage";
9
- * ```
10
- */
11
- import { NextResponse } from "next/server.js";
12
- export declare function GET(_request: Request, context: {
13
- params: Promise<{
14
- id: string;
15
- }>;
16
- }): Promise<NextResponse>;
17
- export { GET as homepageSectionItemGET };
18
- export declare const homepageSectionItemPATCH: (request: Request, context?: {
19
- params: Promise<Record<string, string>>;
20
- } | undefined) => Promise<Response>;
21
- export declare const homepageSectionItemDELETE: (request: Request, context?: {
22
- params: Promise<Record<string, string>>;
23
- } | undefined) => Promise<Response>;
@@ -1,103 +0,0 @@
1
- /**
2
- * feat-homepage — GET / PATCH / DELETE /api/homepage-sections/[id]
3
- *
4
- * Pure stub:
5
- * ```ts
6
- * // app/api/homepage-sections/[id]/route.ts
7
- * export { homepageSectionItemGET as GET, homepageSectionItemPATCH as PATCH, homepageSectionItemDELETE as DELETE }
8
- * from "@mohasinac/feat-homepage";
9
- * ```
10
- */
11
- import { NextResponse } from "next/server.js";
12
- import { z } from "zod";
13
- import { getProviders } from "../../../../contracts/index.js";
14
- import { createRouteHandler } from "../../../../next/api/routeHandler.js";
15
- import { normalizeError } from "../../../../errors/normalize.js";
16
- const ERR_SECTION_NOT_FOUND = "Section not found";
17
- // ---- GET /api/homepage-sections/[id] ----------------------------------------
18
- export async function GET(_request, context) {
19
- try {
20
- const { id } = await context.params;
21
- const { db } = getProviders();
22
- if (!db) {
23
- return NextResponse.json({ success: false, error: "Database provider not registered" }, { status: 503 });
24
- }
25
- const repo = db.getRepository("homepageSections");
26
- const section = await repo.findById(id);
27
- if (!section) {
28
- return NextResponse.json({ success: false, error: ERR_SECTION_NOT_FOUND }, { status: 404 });
29
- }
30
- return NextResponse.json({ success: true, data: section });
31
- }
32
- catch (error) {
33
- void normalizeError(error);
34
- console.error("[feat-homepage] GET /api/homepage-sections/[id] failed", error);
35
- return NextResponse.json({ success: false, error: "Failed to fetch homepage section" }, { status: 500 });
36
- }
37
- }
38
- export { GET as homepageSectionItemGET };
39
- // ---- PATCH /api/homepage-sections/[id] -----------------------------------
40
- const homepageSectionUpdateSchema = z
41
- .object({
42
- type: z
43
- .enum([
44
- "hero",
45
- "featured_categories",
46
- "featured_products",
47
- "banner",
48
- "testimonials",
49
- "promotions",
50
- "blog_posts",
51
- "sellers",
52
- "custom",
53
- ])
54
- .optional(),
55
- title: z.string().optional(),
56
- enabled: z.boolean().optional(),
57
- isVisible: z.boolean().optional(),
58
- order: z.number().int().min(0).optional(),
59
- content: z.object({}).passthrough().optional(),
60
- mobile: z.object({}).passthrough().optional(),
61
- })
62
- .passthrough();
63
- export const homepageSectionItemPATCH = createRouteHandler({
64
- auth: true,
65
- roles: ["admin"],
66
- schema: homepageSectionUpdateSchema,
67
- handler: async ({ request, body }) => {
68
- const url = new URL(request.url);
69
- const segments = url.pathname.split("/");
70
- const id = segments[segments.length - 1];
71
- const { db } = getProviders();
72
- if (!db)
73
- return NextResponse.json({ success: false, error: "DB not configured" }, { status: 503 });
74
- const repo = db.getRepository("homepageSections");
75
- const section = await repo.findById(id);
76
- if (!section)
77
- return NextResponse.json({ success: false, error: ERR_SECTION_NOT_FOUND }, { status: 404 });
78
- const updated = await repo.update(id, {
79
- ...body,
80
- updatedAt: new Date().toISOString(),
81
- });
82
- return NextResponse.json({ success: true, data: updated });
83
- },
84
- });
85
- // ---- DELETE /api/homepage-sections/[id] ---------------------------------
86
- export const homepageSectionItemDELETE = createRouteHandler({
87
- auth: true,
88
- roles: ["admin"],
89
- handler: async ({ request }) => {
90
- const url = new URL(request.url);
91
- const segments = url.pathname.split("/");
92
- const id = segments[segments.length - 1];
93
- const { db } = getProviders();
94
- if (!db)
95
- return NextResponse.json({ success: false, error: "DB not configured" }, { status: 503 });
96
- const repo = db.getRepository("homepageSections");
97
- const section = await repo.findById(id);
98
- if (!section)
99
- return NextResponse.json({ success: false, error: ERR_SECTION_NOT_FOUND }, { status: 404 });
100
- await repo.delete(id);
101
- return NextResponse.json({ success: true });
102
- },
103
- });
@@ -1,14 +0,0 @@
1
- /**
2
- * feat-homepage — Next.js App Router API handlers (GET/POST /api/homepage-sections)
3
- *
4
- * Pure stub:
5
- * ```ts
6
- * // app/api/homepage-sections/route.ts
7
- * export { GET, POST } from "@mohasinac/feat-homepage";
8
- * ```
9
- */
10
- import { NextResponse } from "next/server.js";
11
- export declare function GET(request: Request): Promise<NextResponse>;
12
- export declare const POST: (request: Request, context?: {
13
- params: Promise<Record<string, string>>;
14
- } | undefined) => Promise<Response>;
@@ -1,140 +0,0 @@
1
- /**
2
- * feat-homepage — Next.js App Router API handlers (GET/POST /api/homepage-sections)
3
- *
4
- * Pure stub:
5
- * ```ts
6
- * // app/api/homepage-sections/route.ts
7
- * export { GET, POST } from "@mohasinac/feat-homepage";
8
- * ```
9
- */
10
- import { NextResponse } from "next/server.js";
11
- import { z } from "zod";
12
- import { mediaUrlSchema } from "../../../validation/schemas.js";
13
- import { getProviders } from "../../../contracts/index.js";
14
- import { createRouteHandler } from "../../../next/api/routeHandler.js";
15
- /** Read `__session` cookie from request headers (HTTP cookie string). */
16
- import { normalizeError } from "../../../errors/normalize.js";
17
- function getSessionCookie(request) {
18
- const cookieHeader = request.headers.get("cookie") ?? "";
19
- const match = cookieHeader.match(/(?:^|;\s*)__session=([^;]+)/);
20
- return match ? match[1] : null;
21
- }
22
- /** Returns the role from the session cookie, or null if invalid / no session provider. */
23
- async function getRoleFromSession(request) {
24
- try {
25
- const { session } = getProviders();
26
- if (!session)
27
- return null;
28
- const cookie = getSessionCookie(request);
29
- if (!cookie)
30
- return null;
31
- const payload = await session.verifySession(cookie);
32
- return payload.role ?? null;
33
- }
34
- catch (_err) {
35
- void normalizeError(_err);
36
- return null;
37
- }
38
- }
39
- // --- GET /api/homepage-sections -----------------------------------------------
40
- export async function GET(request) {
41
- try {
42
- const url = new URL(request.url);
43
- const typeFilter = url.searchParams.get("type");
44
- const includeDisabled = url.searchParams.get("includeDisabled") === "true";
45
- // Admin auth guard for includeDisabled
46
- if (includeDisabled) {
47
- const role = await getRoleFromSession(request);
48
- if (role !== "admin") {
49
- return NextResponse.json({ success: false, error: "Admin access required" }, { status: 403 });
50
- }
51
- }
52
- const filterParts = includeDisabled ? [] : ["enabled==true"];
53
- if (typeFilter)
54
- filterParts.push(`type==${typeFilter}`);
55
- const { db } = getProviders();
56
- if (!db) {
57
- return NextResponse.json({ success: false, error: "Database provider not registered" }, { status: 503 });
58
- }
59
- const repo = db.getRepository("homepageSections");
60
- const result = await repo.findAll({
61
- filters: filterParts.join(",") || undefined,
62
- sort: "order",
63
- order: "asc",
64
- pageSize: 50,
65
- });
66
- const sections = result.data.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
67
- const res = NextResponse.json({ success: true, data: sections });
68
- res.headers.set("Cache-Control", includeDisabled
69
- ? "private, no-cache"
70
- : "public, max-age=300, s-maxage=600, stale-while-revalidate=120");
71
- return res;
72
- }
73
- catch (error) {
74
- void normalizeError(error);
75
- console.error("[feat-homepage] GET /api/homepage-sections failed", error);
76
- return NextResponse.json({ success: false, error: "Failed to fetch homepage sections" }, { status: 500 });
77
- }
78
- }
79
- // ---------------------------------------------------------------------------
80
- // POST /api/homepage-sections — create a new section (admin only)
81
- // ---------------------------------------------------------------------------
82
- const homepageSectionCreateSchema = z
83
- .object({
84
- type: z.enum([
85
- "hero",
86
- "featured_categories",
87
- "featured_products",
88
- "banner",
89
- "testimonials",
90
- "promotions",
91
- "blog_posts",
92
- "sellers",
93
- "custom",
94
- ]),
95
- title: z.string().optional(),
96
- enabled: z.boolean().optional(),
97
- order: z.number().int().min(0).optional(),
98
- content: z
99
- .object({
100
- title: z.string().optional(),
101
- subtitle: z.string().optional(),
102
- ctaLabel: z.string().optional(),
103
- ctaUrl: z.string().optional(),
104
- imageUrl: mediaUrlSchema.optional(),
105
- videoUrl: mediaUrlSchema.optional(),
106
- itemIds: z.array(z.string()).optional(),
107
- html: z.string().optional(),
108
- })
109
- .optional(),
110
- mobile: z.object({}).passthrough().optional(),
111
- })
112
- .passthrough();
113
- export const POST = createRouteHandler({
114
- auth: true,
115
- roles: ["admin"],
116
- schema: homepageSectionCreateSchema,
117
- handler: async ({ body }) => {
118
- const { db } = getProviders();
119
- if (!db) {
120
- return NextResponse.json({ success: false, error: "DB not configured" }, { status: 503 });
121
- }
122
- const repo = db.getRepository("homepageSections");
123
- // Auto-assign order: place at end of existing sections
124
- const existing = await repo.findAll({
125
- sort: "order",
126
- order: "desc",
127
- pageSize: 1,
128
- });
129
- const maxOrder = existing.data[0]?.order ?? -1;
130
- const now = new Date().toISOString();
131
- const created = await repo.create({
132
- ...body,
133
- order: body.order ?? maxOrder + 1,
134
- enabled: body.enabled ?? true,
135
- createdAt: now,
136
- updatedAt: now,
137
- });
138
- return NextResponse.json({ success: true, data: created }, { status: 201 });
139
- },
140
- });
@@ -1,26 +0,0 @@
1
- /**
2
- * feat-homepage — GET/PATCH/DELETE /api/homepage/sections/[id]
3
- *
4
- * Homepage section retrieval, updates, and deletion.
5
- *
6
- * Consumer stub:
7
- * ```ts
8
- * export { sectionDetailGET as GET, sectionDetailPATCH as PATCH, sectionDetailDELETE as DELETE } from "@mohasinac/feat-homepage";
9
- * ```
10
- */
11
- import { NextResponse } from "next/server.js";
12
- export declare function GET(request: Request, { params }: {
13
- params: {
14
- id: string;
15
- };
16
- }): Promise<NextResponse>;
17
- export declare function PATCH(request: Request, { params }: {
18
- params: {
19
- id: string;
20
- };
21
- }): Promise<NextResponse>;
22
- export declare function DELETE(request: Request, { params }: {
23
- params: {
24
- id: string;
25
- };
26
- }): Promise<NextResponse>;
@@ -1,95 +0,0 @@
1
- /**
2
- * feat-homepage — GET/PATCH/DELETE /api/homepage/sections/[id]
3
- *
4
- * Homepage section retrieval, updates, and deletion.
5
- *
6
- * Consumer stub:
7
- * ```ts
8
- * export { sectionDetailGET as GET, sectionDetailPATCH as PATCH, sectionDetailDELETE as DELETE } from "@mohasinac/feat-homepage";
9
- * ```
10
- */
11
- import { NextResponse } from "next/server.js";
12
- import { getProviders } from "../../../../../contracts/index.js";
13
- import { normalizeError } from "../../../../../errors/normalize.js";
14
- const ERR_SECTION_ID_REQUIRED = "Section ID is required";
15
- const ERR_DB_NOT_CONFIGURED = "Database provider not configured";
16
- const ERR_INTERNAL_SERVER_ERROR = "Internal server error";
17
- export async function GET(request, { params }) {
18
- try {
19
- const { id } = await params;
20
- if (!id) {
21
- return NextResponse.json({ success: false, error: ERR_SECTION_ID_REQUIRED }, { status: 400 });
22
- }
23
- const { db } = getProviders();
24
- if (!db)
25
- return NextResponse.json({ success: false, error: ERR_DB_NOT_CONFIGURED }, { status: 503 });
26
- const repo = db.getRepository("homepage_sections");
27
- const section = await repo.findById(id);
28
- if (!section) {
29
- return NextResponse.json({ success: false, error: "Section not found" }, { status: 404 });
30
- }
31
- return NextResponse.json({
32
- success: true,
33
- data: section,
34
- });
35
- }
36
- catch (error) {
37
- void normalizeError(error);
38
- return NextResponse.json({
39
- success: false,
40
- error: error instanceof Error ? error.message : ERR_INTERNAL_SERVER_ERROR,
41
- }, { status: 500 });
42
- }
43
- }
44
- export async function PATCH(request, { params }) {
45
- try {
46
- const { id } = await params;
47
- if (!id) {
48
- return NextResponse.json({ success: false, error: ERR_SECTION_ID_REQUIRED }, { status: 400 });
49
- }
50
- const body = await request.json();
51
- const { db } = getProviders();
52
- if (!db)
53
- return NextResponse.json({ success: false, error: ERR_DB_NOT_CONFIGURED }, { status: 503 });
54
- const repo = db.getRepository("homepage_sections");
55
- const updated = await repo.update(id, body);
56
- if (!updated) {
57
- return NextResponse.json({ success: false, error: "Section not found" }, { status: 404 });
58
- }
59
- return NextResponse.json({
60
- success: true,
61
- data: updated,
62
- });
63
- }
64
- catch (error) {
65
- void normalizeError(error);
66
- return NextResponse.json({
67
- success: false,
68
- error: error instanceof Error ? error.message : ERR_INTERNAL_SERVER_ERROR,
69
- }, { status: 500 });
70
- }
71
- }
72
- export async function DELETE(request, { params }) {
73
- try {
74
- const { id } = await params;
75
- if (!id) {
76
- return NextResponse.json({ success: false, error: ERR_SECTION_ID_REQUIRED }, { status: 400 });
77
- }
78
- const { db } = getProviders();
79
- if (!db)
80
- return NextResponse.json({ success: false, error: ERR_DB_NOT_CONFIGURED }, { status: 503 });
81
- const repo = db.getRepository("homepage_sections");
82
- await repo.delete(id);
83
- return NextResponse.json({
84
- success: true,
85
- data: { id },
86
- });
87
- }
88
- catch (error) {
89
- void normalizeError(error);
90
- return NextResponse.json({
91
- success: false,
92
- error: error instanceof Error ? error.message : ERR_INTERNAL_SERVER_ERROR,
93
- }, { status: 500 });
94
- }
95
- }
@@ -1,13 +0,0 @@
1
- /**
2
- * feat-homepage — GET/POST /api/homepage/sections
3
- *
4
- * Homepage sections list with Sieve filtering and creation.
5
- *
6
- * Consumer stub:
7
- * ```ts
8
- * export { sectionsListGET as GET, sectionsListPOST as POST } from "@mohasinac/feat-homepage";
9
- * ```
10
- */
11
- import { NextResponse } from "next/server.js";
12
- export declare function GET(request: Request): Promise<NextResponse>;
13
- export declare function POST(request: Request): Promise<NextResponse>;
@@ -1,82 +0,0 @@
1
- /**
2
- * feat-homepage — GET/POST /api/homepage/sections
3
- *
4
- * Homepage sections list with Sieve filtering and creation.
5
- *
6
- * Consumer stub:
7
- * ```ts
8
- * export { sectionsListGET as GET, sectionsListPOST as POST } from "@mohasinac/feat-homepage";
9
- * ```
10
- */
11
- import { NextResponse } from "next/server.js";
12
- import { getProviders } from "../../../../contracts/index.js";
13
- import { normalizeError } from "../../../../errors/normalize.js";
14
- function numParam(url, key, fallback) {
15
- const v = url.searchParams.get(key);
16
- const n = v !== null ? Number(v) : NaN;
17
- return Number.isFinite(n) ? n : fallback;
18
- }
19
- export async function GET(request) {
20
- try {
21
- const url = new URL(request.url);
22
- const page = Math.max(1, numParam(url, "page", 1));
23
- const pageSize = Math.min(100, Math.max(1, numParam(url, "pageSize", 20)));
24
- const filters = url.searchParams.get("filters") ?? undefined;
25
- const sort = url.searchParams.get("sorts") ??
26
- url.searchParams.get("sort") ??
27
- "-createdAt";
28
- const { db } = getProviders();
29
- if (!db)
30
- return NextResponse.json({ success: false, error: "DB not configured" }, { status: 503 });
31
- const repo = db.getRepository("homepage_sections");
32
- const result = await repo.findAll({
33
- filters,
34
- sort,
35
- page,
36
- pageSize: pageSize,
37
- });
38
- const totalPages = Math.max(1, Math.ceil(result.total / pageSize));
39
- return NextResponse.json({
40
- success: true,
41
- data: {
42
- items: result.data,
43
- total: result.total,
44
- page,
45
- pageSize,
46
- totalPages,
47
- hasMore: page < totalPages,
48
- },
49
- });
50
- }
51
- catch (error) {
52
- void normalizeError(error);
53
- return NextResponse.json({
54
- success: false,
55
- error: error instanceof Error ? error.message : "Internal server error",
56
- }, { status: 500 });
57
- }
58
- }
59
- export async function POST(request) {
60
- try {
61
- const body = await request.json();
62
- const { db } = getProviders();
63
- if (!db)
64
- return NextResponse.json({ success: false, error: "DB not configured" }, { status: 503 });
65
- const repo = db.getRepository("homepage_sections");
66
- const created = await repo.create({
67
- ...body,
68
- createdAt: new Date(),
69
- });
70
- return NextResponse.json({
71
- success: true,
72
- data: created,
73
- }, { status: 201 });
74
- }
75
- catch (error) {
76
- void normalizeError(error);
77
- return NextResponse.json({
78
- success: false,
79
- error: error instanceof Error ? error.message : "Internal server error",
80
- }, { status: 500 });
81
- }
82
- }
@@ -1,14 +0,0 @@
1
- import React from "react";
2
- export interface AdvertisementBannerProps {
3
- title: string;
4
- subtitle?: string;
5
- ctaLabel?: string;
6
- onCtaClick?: () => void;
7
- backgroundImage?: string;
8
- backgroundColor?: string;
9
- tagLabel?: string;
10
- isLoading?: boolean;
11
- compact?: boolean;
12
- className?: string;
13
- }
14
- export declare function AdvertisementBanner({ title, subtitle, ctaLabel, onCtaClick, backgroundImage, backgroundColor, tagLabel, isLoading, compact, className, }: AdvertisementBannerProps): React.JSX.Element;
@@ -1,35 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { CARD_ASPECT_BANNER, GRID_COLS_2_MD } from "../../../_internal/shared/styles/grid.js";
3
- import { Button, Div, Grid, Heading, Row, Scrim, Section, Span, Stack, Text } from "../../../ui/index.js";
4
- import { DynamicBgDiv } from "../../../ui/components/DynamicBgDiv.js";
5
- import { MediaImage } from "../../media/MediaImage.js";
6
- import { ArrowRight, Sparkles } from "lucide-react";
7
- const __P = {
8
- p8: "p-[var(--appkit-space-8)]",
9
- };
10
- const __O = {
11
- hidden: "overflow-hidden",
12
- };
13
- const CLS_GRADIENT_BG = "absolute inset-0 bg-[image:var(--appkit-gradient-promotion)]";
14
- const CLS_CTA_BTN_SM = "bg-[var(--appkit-color-surface)] bg-[var(--appkit-color-surface)] text-indigo-700 hover:bg-surface-hover font-semibold gap-[var(--appkit-space-1-5)] flex-shrink-0";
15
- const CLS_CTA_BTN_LG = "bg-[var(--appkit-color-surface)] bg-[var(--appkit-color-surface)] text-indigo-700 hover:bg-surface-hover font-semibold shadow-lg gap-[var(--appkit-space-2)]";
16
- // --- Constants ---------------------------------------------------------------
17
- const CLS_CONTAINER = "w-full max-w-7xl mx-auto";
18
- // --- Component ---------------------------------------------------------------
19
- export function AdvertisementBanner({ title, subtitle, ctaLabel = "Shop now", onCtaClick, backgroundImage, backgroundColor, tagLabel, isLoading = false, compact = false, className = "", }) {
20
- const wrapClass = "bg-[image:var(--appkit-gradient-section-warm)]";
21
- if (isLoading) {
22
- return (_jsx(Section, { className: `${__P.p8} ${wrapClass} ${className}`, children: _jsx(Div, { className: CLS_CONTAINER, children: _jsx(Div, { className: "h-72 animate-pulse", surface: "subtle", rounded: "2xl" }) }) }));
23
- }
24
- // -- Split layout: when a backgroundImage is provided --
25
- if (backgroundImage) {
26
- return (_jsx(Section, { className: `${__P.p8} ${wrapClass} ${className}`, children: _jsx(Div, { className: CLS_CONTAINER, children: _jsx(Div, { className: `relative ${__O.hidden} bg-neutral-900`, rounded: "2xl", shadow: "xl", children: _jsxs(Grid, { className: `${GRID_COLS_2_MD} min-h-[clamp(300px,40vh,420px)]`, children: [_jsxs(Div, { className: `relative ${CARD_ASPECT_BANNER} order-last md:order-first min-h-0 min-h-[clamp(300px,40vh,420px)]`, children: [_jsx(MediaImage, { src: backgroundImage, alt: title, size: "banner", priority: true }), _jsx(Scrim, { direction: "right-to-left", intensity: "medium", className: "hidden md:block absolute inset-y-0 right-0 w-24" })] }), _jsxs(Stack, { justify: "center", className: "relative", paddingX: "x-xl", padding: "y-2xl", children: [_jsx(Div, { className: "absolute top-0 right-0 w-32 h-32 opacity-10 pointer-events-none bg-[radial-gradient(circle,_white_1px,_transparent_1px)] bg-[length:12px_12px]", "aria-hidden": true }), tagLabel && (_jsxs(Span, { layout: "inline-flex", gap: "xs", color: "inverse", size: "xs", weight: "semibold", className: "self-start bg-[rgba(255,255,255,0.1)] /80 tracking-widest mb-5 backdrop-blur-sm", rounded: "full", padding: "pill-md", transform: "uppercase", children: [_jsx(Sparkles, { className: "w-3.5 h-3.5" }), tagLabel] })), _jsx(Heading, { color: "inverse", level: 2, variant: "none", className: "font-extrabold mb-4 leading-tight", mdSize: "4xl", lgSize: "5xl", size: "3xl", children: title }), subtitle && (_jsx(Text, { color: "inverse", variant: "none", className: "/75 mb-8 leading-relaxed", mdSize: "lg", size: "base", children: subtitle })), ctaLabel && onCtaClick && (_jsxs(Button, { gap: "md", variant: "secondary", size: "lg", onClick: onCtaClick, className: "self-start bg-[var(--appkit-color-surface)] text-[var(--appkit-color-text)] hover:bg-[var(--appkit-color-surface)] dark:bg-[var(--appkit-color-surface)] dark:text-[var(--appkit-color-text)] dark:hover:bg-neutral-200 font-[600]", shadow: "lg", children: [ctaLabel, _jsx(ArrowRight, { className: "w-4 h-4" })] }))] })] }) }) }) }));
27
- }
28
- // -- Full-width gradient layout --
29
- return (_jsx(Section, { className: `${__P.p8} ${wrapClass} ${className}`, children: _jsx(Div, { className: CLS_CONTAINER, children: _jsxs(DynamicBgDiv, { color: backgroundColor, className: [
30
- "flex items-center relative overflow-hidden rounded-2xl",
31
- compact
32
- ? "h-[clamp(112px,16vh,160px)]"
33
- : "min-h-[clamp(240px,34vh,360px)]",
34
- ].join(" "), children: [!backgroundColor && (_jsx(Div, { className: CLS_GRADIENT_BG, "aria-hidden": true })), _jsxs(Div, { className: `absolute inset-0 ${__O.hidden}`, "aria-hidden": true, children: [_jsx(Div, { className: "absolute -top-16 -left-16 w-64 h-64 bg-primary/20 blur-3xl animate-pulse", rounded: "full" }), _jsx(Div, { className: "absolute -bottom-16 right-0 w-80 h-80 bg-cobalt/20 blur-3xl animate-pulse", rounded: "full" })] }), compact ? (_jsxs(Row, { justify: "between", className: "relative z-10 w-full", gap: "md", padding: "inlineLg", children: [_jsxs(Span, { layout: "inline-flex", gap: "md", children: [_jsx(Sparkles, { className: "w-4 h-4 text-white/80" }), _jsx(Span, { color: "inverse", size: "sm", weight: "semibold", children: title })] }), ctaLabel && onCtaClick && (_jsxs(Button, { variant: "secondary", size: "sm", onClick: onCtaClick, className: CLS_CTA_BTN_SM, children: [ctaLabel, _jsx(ArrowRight, { className: "w-3.5 h-3.5" })] }))] })) : (_jsxs(Div, { className: "relative z-10 w-full max-w-4xl mx-auto md:py-[4rem] text-left", paddingY: "y-3xl", paddingX: "x-lg", children: [tagLabel && (_jsxs(Span, { layout: "inline-flex", gap: "xs", color: "inverse", size: "xs", weight: "semibold", className: "bg-[rgba(255,255,255,0.15)] /90 tracking-widest mb-5 backdrop-blur-sm", shadow: "sm", rounded: "full", padding: "pill-lg", transform: "uppercase", children: [_jsx(Sparkles, { className: "w-3.5 h-3.5" }), tagLabel] })), _jsx(Heading, { color: "inverse", level: 2, variant: "none", className: "font-extrabold mb-4 leading-tight", mdSize: "5xl", lgSize: "6xl", size: "3xl", shadow: "lg", children: title }), subtitle && (_jsx(Text, { color: "inverse", variant: "none", className: "mb-10 max-w-2xl", mdSize: "xl", size: "base", children: subtitle })), ctaLabel && onCtaClick && (_jsxs(Button, { variant: "secondary", size: "lg", onClick: onCtaClick, className: CLS_CTA_BTN_LG, children: [ctaLabel, _jsx(ArrowRight, { className: "w-4 h-4" })] }))] }))] }) }) }));
35
- }
@@ -1,9 +0,0 @@
1
- import type { BeforeAfterItem } from "../types";
2
- export interface BeforeAfterCardProps {
3
- item: BeforeAfterItem;
4
- /** Label shown on the left (before) side. Default: "Before". */
5
- beforeLabel?: string;
6
- /** Label shown on the right (after) side. Default: "After". */
7
- afterLabel?: string;
8
- }
9
- export declare function BeforeAfterCard({ item, beforeLabel, afterLabel, }: BeforeAfterCardProps): import("react").JSX.Element;