@mohasinac/appkit 2.3.2 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (677) hide show
  1. package/dist/client.d.ts +48 -12
  2. package/dist/client.js +25 -6
  3. package/dist/constants/api-endpoints.d.ts +380 -22
  4. package/dist/constants/api-endpoints.js +66 -13
  5. package/dist/constants/index.d.ts +1 -1
  6. package/dist/constants/index.js +1 -1
  7. package/dist/core/hooks/useSyncManager.d.ts +1 -0
  8. package/dist/core/hooks/useSyncManager.js +83 -0
  9. package/dist/core/integration-keys.d.ts +4 -0
  10. package/dist/core/integration-keys.js +8 -0
  11. package/dist/features/about/components/FAQPageView.js +9 -11
  12. package/dist/features/about/components/PolicyPageView.js +32 -11
  13. package/dist/features/about/components/PublicProfileView.js +77 -11
  14. package/dist/features/account/components/AddressesIndexListing.js +63 -38
  15. package/dist/features/account/components/UserOffersPanel.d.ts +8 -0
  16. package/dist/features/account/components/UserOffersPanel.js +81 -0
  17. package/dist/features/account/components/UserSettingsView.d.ts +2 -1
  18. package/dist/features/account/components/UserSettingsView.js +2 -1
  19. package/dist/features/account/components/UserSidebar.d.ts +6 -1
  20. package/dist/features/account/components/UserSidebar.js +48 -42
  21. package/dist/features/account/components/index.d.ts +2 -0
  22. package/dist/features/account/components/index.js +1 -0
  23. package/dist/features/admin/actions/admin-actions.d.ts +1 -1
  24. package/dist/features/admin/actions/admin-actions.js +13 -3
  25. package/dist/features/admin/components/AdminAdEditorView.js +6 -7
  26. package/dist/features/admin/components/AdminAllEventEntriesView.d.ts +4 -0
  27. package/dist/features/admin/components/AdminAllEventEntriesView.js +102 -0
  28. package/dist/features/admin/components/AdminBidsView.js +94 -8
  29. package/dist/features/admin/components/AdminBlogEditorView.d.ts +7 -0
  30. package/dist/features/admin/components/AdminBlogEditorView.js +162 -0
  31. package/dist/features/admin/components/AdminBlogView.d.ts +4 -1
  32. package/dist/features/admin/components/AdminBlogView.js +61 -31
  33. package/dist/features/admin/components/AdminBrandEditorView.d.ts +7 -0
  34. package/dist/features/admin/components/AdminBrandEditorView.js +104 -0
  35. package/dist/features/admin/components/AdminBrandsView.d.ts +4 -0
  36. package/dist/features/admin/components/AdminBrandsView.js +76 -0
  37. package/dist/features/admin/components/AdminCarouselEditorView.d.ts +8 -0
  38. package/dist/features/admin/components/AdminCarouselEditorView.js +204 -0
  39. package/dist/features/admin/components/AdminCarouselView.js +153 -34
  40. package/dist/features/admin/components/AdminCartsView.d.ts +4 -0
  41. package/dist/features/admin/components/AdminCartsView.js +82 -0
  42. package/dist/features/admin/components/AdminCategoriesView.d.ts +4 -1
  43. package/dist/features/admin/components/AdminCategoriesView.js +66 -48
  44. package/dist/features/admin/components/AdminCategoryEditorView.d.ts +7 -0
  45. package/dist/features/admin/components/AdminCategoryEditorView.js +115 -0
  46. package/dist/features/admin/components/AdminContactEditorView.d.ts +11 -0
  47. package/dist/features/admin/components/AdminContactEditorView.js +32 -0
  48. package/dist/features/admin/components/AdminContactView.js +111 -20
  49. package/dist/features/admin/components/AdminCouponEditorView.d.ts +7 -0
  50. package/dist/features/admin/components/AdminCouponEditorView.js +179 -0
  51. package/dist/features/admin/components/AdminCouponsView.d.ts +4 -1
  52. package/dist/features/admin/components/AdminCouponsView.js +57 -9
  53. package/dist/features/admin/components/AdminDashboardView.js +3 -0
  54. package/dist/features/admin/components/AdminFaqEditorView.d.ts +7 -0
  55. package/dist/features/admin/components/AdminFaqEditorView.js +128 -0
  56. package/dist/features/admin/components/AdminFaqsView.d.ts +4 -1
  57. package/dist/features/admin/components/AdminFaqsView.js +55 -23
  58. package/dist/features/admin/components/AdminFeatureFlagsView.js +33 -24
  59. package/dist/features/admin/components/AdminListingScaffold.d.ts +7 -1
  60. package/dist/features/admin/components/AdminListingScaffold.js +2 -2
  61. package/dist/features/admin/components/AdminMediaView.js +18 -8
  62. package/dist/features/admin/components/AdminNavEditorView.d.ts +20 -0
  63. package/dist/features/admin/components/AdminNavEditorView.js +84 -0
  64. package/dist/features/admin/components/AdminNavigationView.d.ts +1 -7
  65. package/dist/features/admin/components/AdminNavigationView.js +84 -72
  66. package/dist/features/admin/components/AdminNewsletterView.js +102 -20
  67. package/dist/features/admin/components/AdminNotificationsView.d.ts +4 -0
  68. package/dist/features/admin/components/AdminNotificationsView.js +119 -0
  69. package/dist/features/admin/components/AdminOrderEditorView.d.ts +8 -0
  70. package/dist/features/admin/components/AdminOrderEditorView.js +74 -0
  71. package/dist/features/admin/components/AdminOrdersView.js +64 -8
  72. package/dist/features/admin/components/AdminPayoutsView.js +122 -13
  73. package/dist/features/admin/components/AdminProductEditorView.d.ts +7 -0
  74. package/dist/features/admin/components/AdminProductEditorView.js +143 -0
  75. package/dist/features/admin/components/AdminProductsView.d.ts +4 -1
  76. package/dist/features/admin/components/AdminProductsView.js +119 -30
  77. package/dist/features/admin/components/AdminReturnRequestsView.d.ts +5 -0
  78. package/dist/features/admin/components/AdminReturnRequestsView.js +101 -0
  79. package/dist/features/admin/components/AdminReviewsView.js +138 -28
  80. package/dist/features/admin/components/AdminSectionsView.js +361 -472
  81. package/dist/features/admin/components/AdminSessionsView.d.ts +4 -0
  82. package/dist/features/admin/components/AdminSessionsView.js +119 -0
  83. package/dist/features/admin/components/AdminSidebar.d.ts +18 -3
  84. package/dist/features/admin/components/AdminSidebar.js +51 -4
  85. package/dist/features/admin/components/AdminSiteSettingsView.d.ts +7 -0
  86. package/dist/features/admin/components/AdminSiteSettingsView.js +319 -0
  87. package/dist/features/admin/components/AdminStoreAddressesView.d.ts +5 -0
  88. package/dist/features/admin/components/AdminStoreAddressesView.js +52 -0
  89. package/dist/features/admin/components/AdminStoreEditorView.d.ts +9 -0
  90. package/dist/features/admin/components/AdminStoreEditorView.js +55 -0
  91. package/dist/features/admin/components/AdminStoresView.js +62 -20
  92. package/dist/features/admin/components/AdminUserEditorView.d.ts +10 -0
  93. package/dist/features/admin/components/AdminUserEditorView.js +72 -0
  94. package/dist/features/admin/components/AdminUsersView.js +70 -36
  95. package/dist/features/admin/components/AdminWishlistsView.d.ts +4 -0
  96. package/dist/features/admin/components/AdminWishlistsView.js +53 -0
  97. package/dist/features/admin/components/BrandQuickCreateForm.d.ts +5 -0
  98. package/dist/features/admin/components/BrandQuickCreateForm.js +36 -0
  99. package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +5 -0
  100. package/dist/features/admin/components/CategoryQuickCreateForm.js +35 -0
  101. package/dist/features/admin/components/DataTable.d.ts +4 -2
  102. package/dist/features/admin/components/DataTable.js +26 -6
  103. package/dist/features/admin/components/index.d.ts +47 -1
  104. package/dist/features/admin/components/index.js +23 -0
  105. package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +48 -0
  106. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +653 -0
  107. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +298 -0
  108. package/dist/features/admin/components/sections/adminSectionsTypes.js +278 -0
  109. package/dist/features/admin/schemas/firestore.d.ts +26 -0
  110. package/dist/features/admin/schemas/firestore.js +1 -0
  111. package/dist/features/admin/types/product.types.d.ts +2 -3
  112. package/dist/features/auctions/actions/bid-actions.js +6 -2
  113. package/dist/features/auctions/components/AuctionDetailPageView.d.ts +3 -1
  114. package/dist/features/auctions/components/AuctionDetailPageView.js +38 -12
  115. package/dist/features/auctions/components/AuctionFilters.d.ts +3 -1
  116. package/dist/features/auctions/components/AuctionFilters.js +6 -2
  117. package/dist/features/auctions/components/CollapsibleBidHistory.d.ts +7 -0
  118. package/dist/features/auctions/components/CollapsibleBidHistory.js +8 -0
  119. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +4 -0
  120. package/dist/features/auctions/components/MarketplaceAuctionCard.js +43 -9
  121. package/dist/features/auctions/components/MarketplaceAuctionGrid.js +1 -0
  122. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +18 -0
  123. package/dist/features/auctions/components/PlaceBidFormClient.js +33 -0
  124. package/dist/features/auctions/hooks/useAuctions.d.ts +1 -0
  125. package/dist/features/auctions/hooks/useAuctions.js +1 -0
  126. package/dist/features/auctions/schemas/index.d.ts +22 -12
  127. package/dist/features/auth/actions/profile-actions.d.ts +5 -3
  128. package/dist/features/auth/actions/profile-actions.js +30 -11
  129. package/dist/features/auth/auth-helpers.js +1 -0
  130. package/dist/features/auth/components/LoginForm.js +2 -1
  131. package/dist/features/auth/hooks/useAuth.js +16 -4
  132. package/dist/features/auth/permissions/constants.d.ts +63 -0
  133. package/dist/features/auth/permissions/constants.js +323 -0
  134. package/dist/features/auth/schemas/firestore.d.ts +20 -0
  135. package/dist/features/auth/schemas/index.d.ts +4 -4
  136. package/dist/features/auth/schemas/index.js +3 -2
  137. package/dist/features/auth/types/index.d.ts +1 -1
  138. package/dist/features/before-after/schemas/index.d.ts +2 -2
  139. package/dist/features/blog/actions/blog-actions.d.ts +15 -15
  140. package/dist/features/blog/components/BlogFilters.js +1 -1
  141. package/dist/features/blog/components/BlogIndexListing.js +57 -5
  142. package/dist/features/blog/components/BlogIndexPageView.js +14 -2
  143. package/dist/features/blog/components/BlogPostForm.js +6 -2
  144. package/dist/features/blog/components/BlogPostView.js +2 -1
  145. package/dist/features/blog/hooks/useBlog.d.ts +2 -0
  146. package/dist/features/blog/hooks/useBlog.js +2 -0
  147. package/dist/features/blog/schemas/index.d.ts +46 -12
  148. package/dist/features/brands/actions/brand-actions.d.ts +2 -0
  149. package/dist/features/brands/actions/brand-actions.js +5 -0
  150. package/dist/features/brands/index.d.ts +3 -0
  151. package/dist/features/brands/index.js +3 -0
  152. package/dist/features/brands/repository/brands.repository.d.ts +13 -0
  153. package/dist/features/brands/repository/brands.repository.js +60 -0
  154. package/dist/features/brands/schemas/index.d.ts +33 -0
  155. package/dist/features/brands/schemas/index.js +15 -0
  156. package/dist/features/brands/server.d.ts +7 -0
  157. package/dist/features/brands/server.js +7 -0
  158. package/dist/features/cart/actions/cart-actions.js +2 -2
  159. package/dist/features/cart/components/CartDrawer.d.ts +5 -1
  160. package/dist/features/cart/components/CartDrawer.js +3 -3
  161. package/dist/features/cart/hooks/useCartCount.d.ts +3 -2
  162. package/dist/features/cart/hooks/useCartCount.js +4 -2
  163. package/dist/features/cart/hooks/useGuestCartMerge.js +1 -1
  164. package/dist/features/cart/index.d.ts +1 -0
  165. package/dist/features/cart/index.js +1 -0
  166. package/dist/features/cart/repository/cart.repository.d.ts +5 -1
  167. package/dist/features/cart/repository/cart.repository.js +36 -5
  168. package/dist/features/cart/schemas/firestore.d.ts +25 -6
  169. package/dist/features/cart/schemas/firestore.js +2 -2
  170. package/dist/features/cart/schemas/index.d.ts +9 -9
  171. package/dist/features/cart/schemas/index.js +1 -1
  172. package/dist/features/cart/types/index.d.ts +1 -1
  173. package/dist/features/cart/utils/pending-ops.d.ts +33 -0
  174. package/dist/features/cart/utils/pending-ops.js +102 -0
  175. package/dist/features/categories/components/BrandDetailPageView.d.ts +4 -0
  176. package/dist/features/categories/components/BrandDetailPageView.js +54 -0
  177. package/dist/features/categories/components/BrandDetailTabs.d.ts +10 -0
  178. package/dist/features/categories/components/BrandDetailTabs.js +22 -0
  179. package/dist/features/categories/components/CategoriesIndexListing.d.ts +3 -1
  180. package/dist/features/categories/components/CategoriesIndexListing.js +83 -7
  181. package/dist/features/categories/components/CategoryDetailPageView.js +42 -21
  182. package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
  183. package/dist/features/categories/components/CategoryDetailTabs.js +12 -7
  184. package/dist/features/categories/components/CategoryFilters.js +1 -1
  185. package/dist/features/categories/components/CategoryForm.js +10 -4
  186. package/dist/features/categories/components/CategoryProductsListing.d.ts +4 -1
  187. package/dist/features/categories/components/CategoryProductsListing.js +34 -5
  188. package/dist/features/categories/components/ConcernCard.js +1 -1
  189. package/dist/features/categories/hooks/useCategories.js +2 -0
  190. package/dist/features/categories/repository/categories.repository.js +2 -3
  191. package/dist/features/categories/schemas/firestore.d.ts +23 -2
  192. package/dist/features/categories/schemas/firestore.js +8 -0
  193. package/dist/features/categories/schemas/index.d.ts +8 -8
  194. package/dist/features/categories/types/index.d.ts +1 -0
  195. package/dist/features/collections/schemas/index.d.ts +2 -2
  196. package/dist/features/events/components/AdminEventEditorView.js +2 -2
  197. package/dist/features/events/components/AdminEventsView.d.ts +4 -1
  198. package/dist/features/events/components/AdminEventsView.js +64 -38
  199. package/dist/features/events/components/EventCard.js +1 -1
  200. package/dist/features/events/components/EventFilters.js +1 -1
  201. package/dist/features/events/components/EventPollWidget.d.ts +12 -0
  202. package/dist/features/events/components/EventPollWidget.js +62 -0
  203. package/dist/features/events/components/EventsIndexListing.js +57 -5
  204. package/dist/features/events/components/EventsListPageView.js +1 -1
  205. package/dist/features/events/components/index.d.ts +2 -0
  206. package/dist/features/events/components/index.js +1 -0
  207. package/dist/features/events/hooks/useEvents.d.ts +1 -0
  208. package/dist/features/events/hooks/useEvents.js +1 -0
  209. package/dist/features/events/repository/events.repository.js +3 -0
  210. package/dist/features/events/schemas/firestore.d.ts +1 -0
  211. package/dist/features/events/schemas/index.d.ts +44 -0
  212. package/dist/features/events/types/index.d.ts +2 -0
  213. package/dist/features/faq/actions/faq-actions.d.ts +16 -16
  214. package/dist/features/faq/hooks/useFaqList.js +1 -1
  215. package/dist/features/faq/schemas/firestore.d.ts +2 -2
  216. package/dist/features/faq/schemas/firestore.js +2 -1
  217. package/dist/features/faq/schemas/index.d.ts +4 -4
  218. package/dist/features/filters/FilterFacetSection.d.ts +1 -0
  219. package/dist/features/filters/FilterFacetSection.js +13 -1
  220. package/dist/features/filters/SwitchFilter.js +1 -1
  221. package/dist/features/grouped/schemas/firestore.d.ts +32 -0
  222. package/dist/features/grouped/schemas/firestore.js +19 -0
  223. package/dist/features/homepage/components/AdSlot.d.ts +1 -3
  224. package/dist/features/homepage/components/AdSlot.js +15 -14
  225. package/dist/features/homepage/components/BlogArticlesSection.d.ts +3 -1
  226. package/dist/features/homepage/components/BlogArticlesSection.js +2 -2
  227. package/dist/features/homepage/components/BrandsSection.d.ts +3 -1
  228. package/dist/features/homepage/components/BrandsSection.js +4 -3
  229. package/dist/features/homepage/components/CustomCardsSection.d.ts +3 -0
  230. package/dist/features/homepage/components/CustomCardsSection.js +76 -0
  231. package/dist/features/homepage/components/EventsSection.d.ts +3 -1
  232. package/dist/features/homepage/components/EventsSection.js +2 -2
  233. package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +4 -1
  234. package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
  235. package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +4 -1
  236. package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
  237. package/dist/features/homepage/components/FeaturedProductsSection.d.ts +4 -1
  238. package/dist/features/homepage/components/FeaturedProductsSection.js +8 -3
  239. package/dist/features/homepage/components/FeaturedStoresSection.d.ts +3 -1
  240. package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
  241. package/dist/features/homepage/components/GoogleReviewsSection.d.ts +3 -0
  242. package/dist/features/homepage/components/GoogleReviewsSection.js +65 -0
  243. package/dist/features/homepage/components/HeroCarousel.js +128 -84
  244. package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +2 -20
  245. package/dist/features/homepage/components/MarketplaceHomepageView.js +73 -230
  246. package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
  247. package/dist/features/homepage/components/SectionCarousel.js +2 -0
  248. package/dist/features/homepage/components/ShopByCategorySection.d.ts +3 -1
  249. package/dist/features/homepage/components/ShopByCategorySection.js +8 -4
  250. package/dist/features/homepage/components/SocialFeedSection.d.ts +3 -0
  251. package/dist/features/homepage/components/SocialFeedSection.js +86 -0
  252. package/dist/features/homepage/components/SocialPostCard.d.ts +7 -0
  253. package/dist/features/homepage/components/SocialPostCard.js +39 -0
  254. package/dist/features/homepage/components/StatsCounterSection.js +1 -1
  255. package/dist/features/homepage/components/WelcomeSection.js +1 -1
  256. package/dist/features/homepage/components/WhatsAppCommunitySection.js +1 -1
  257. package/dist/features/homepage/hooks/useActiveAd.d.ts +23 -0
  258. package/dist/features/homepage/hooks/useActiveAd.js +20 -0
  259. package/dist/features/homepage/hooks/useBlogArticles.d.ts +1 -0
  260. package/dist/features/homepage/hooks/useBlogArticles.js +10 -0
  261. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +4 -1
  262. package/dist/features/homepage/hooks/useFeaturedAuctions.js +8 -4
  263. package/dist/features/homepage/hooks/useFeaturedPreOrders.d.ts +4 -1
  264. package/dist/features/homepage/hooks/useFeaturedPreOrders.js +8 -4
  265. package/dist/features/homepage/hooks/useFeaturedProducts.d.ts +1 -0
  266. package/dist/features/homepage/hooks/useFeaturedProducts.js +6 -3
  267. package/dist/features/homepage/hooks/useFeaturedStores.d.ts +3 -1
  268. package/dist/features/homepage/hooks/useFeaturedStores.js +2 -1
  269. package/dist/features/homepage/hooks/useHomepageEvents.d.ts +3 -1
  270. package/dist/features/homepage/hooks/useHomepageEvents.js +2 -1
  271. package/dist/features/homepage/hooks/useTopBrands.d.ts +3 -1
  272. package/dist/features/homepage/hooks/useTopBrands.js +2 -1
  273. package/dist/features/homepage/index.d.ts +2 -0
  274. package/dist/features/homepage/index.js +1 -0
  275. package/dist/features/homepage/lib/google-reviews-fetcher.d.ts +14 -0
  276. package/dist/features/homepage/lib/google-reviews-fetcher.js +27 -0
  277. package/dist/features/homepage/lib/live-stats.d.ts +14 -0
  278. package/dist/features/homepage/lib/live-stats.js +62 -0
  279. package/dist/features/homepage/lib/section-defaults.d.ts +11 -0
  280. package/dist/features/homepage/lib/section-defaults.js +45 -0
  281. package/dist/features/homepage/lib/section-helpers.d.ts +5 -0
  282. package/dist/features/homepage/lib/section-helpers.js +25 -0
  283. package/dist/features/homepage/lib/section-renderer.d.ts +33 -0
  284. package/dist/features/homepage/lib/section-renderer.js +164 -0
  285. package/dist/features/homepage/lib/social-feed-fetcher.d.ts +5 -0
  286. package/dist/features/homepage/lib/social-feed-fetcher.js +193 -0
  287. package/dist/features/homepage/schemas/firestore.d.ts +180 -29
  288. package/dist/features/homepage/schemas/firestore.js +5 -0
  289. package/dist/features/homepage/types/index.d.ts +48 -19
  290. package/dist/features/layout/AppLayoutShell.d.ts +6 -1
  291. package/dist/features/layout/AppLayoutShell.js +25 -9
  292. package/dist/features/layout/BottomActions.js +1 -1
  293. package/dist/features/layout/BottomNavbar.d.ts +15 -1
  294. package/dist/features/layout/BottomNavbar.js +8 -2
  295. package/dist/features/layout/FooterLayout.d.ts +7 -1
  296. package/dist/features/layout/FooterLayout.js +3 -3
  297. package/dist/features/layout/ListingLayout.js +2 -2
  298. package/dist/features/layout/MainNavbar.d.ts +6 -14
  299. package/dist/features/layout/MainNavbar.js +4 -16
  300. package/dist/features/layout/NavItem.js +1 -1
  301. package/dist/features/layout/NavbarLayout.d.ts +3 -1
  302. package/dist/features/layout/NavbarLayout.js +5 -5
  303. package/dist/features/layout/TitleBar.d.ts +4 -2
  304. package/dist/features/layout/TitleBar.js +5 -3
  305. package/dist/features/layout/TitleBarLayout.d.ts +3 -1
  306. package/dist/features/layout/TitleBarLayout.js +2 -2
  307. package/dist/features/layout/index.d.ts +1 -1
  308. package/dist/features/media/MediaPickerModal.d.ts +30 -0
  309. package/dist/features/media/MediaPickerModal.js +72 -0
  310. package/dist/features/media/index.d.ts +3 -1
  311. package/dist/features/media/index.js +1 -0
  312. package/dist/features/media/types/index.d.ts +12 -0
  313. package/dist/features/media/types/index.js +4 -2
  314. package/dist/features/media/upload/MediaUploadField.d.ts +5 -1
  315. package/dist/features/media/upload/MediaUploadField.js +56 -3
  316. package/dist/features/messages/schemas/firestore.d.ts +36 -0
  317. package/dist/features/messages/schemas/firestore.js +16 -0
  318. package/dist/features/orders/repository/orders.repository.d.ts +2 -2
  319. package/dist/features/orders/repository/orders.repository.js +2 -2
  320. package/dist/features/orders/schemas/firestore.d.ts +17 -4
  321. package/dist/features/orders/schemas/firestore.js +2 -2
  322. package/dist/features/orders/schemas/index.d.ts +18 -18
  323. package/dist/features/orders/schemas/index.js +3 -3
  324. package/dist/features/orders/types/index.d.ts +1 -1
  325. package/dist/features/orders/utils/order-splitter.d.ts +1 -1
  326. package/dist/features/orders/utils/order-splitter.js +2 -2
  327. package/dist/features/payments/repository/payout.repository.d.ts +4 -4
  328. package/dist/features/payments/repository/payout.repository.js +7 -7
  329. package/dist/features/payments/schemas/firestore.d.ts +6 -6
  330. package/dist/features/payments/schemas/firestore.js +6 -6
  331. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +11 -10
  332. package/dist/features/pre-orders/components/PreOrderActionsClient.d.ts +11 -0
  333. package/dist/features/pre-orders/components/PreOrderActionsClient.js +28 -0
  334. package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +2 -1
  335. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +27 -9
  336. package/dist/features/pre-orders/components/PreOrderFilters.d.ts +3 -1
  337. package/dist/features/pre-orders/components/PreOrderFilters.js +9 -6
  338. package/dist/features/pre-orders/components/PreOrdersIndexListing.d.ts +3 -1
  339. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +132 -36
  340. package/dist/features/pre-orders/components/PreOrdersListView.js +3 -3
  341. package/dist/features/pre-orders/components/PreorderCard.js +1 -1
  342. package/dist/features/pre-orders/schemas/index.d.ts +10 -0
  343. package/dist/features/products/actions/product-actions.d.ts +2 -2
  344. package/dist/features/products/actions/product-actions.js +5 -5
  345. package/dist/features/products/api/[id]/route.js +5 -2
  346. package/dist/features/products/api/route.js +10 -14
  347. package/dist/features/products/columns/productTableColumns.js +2 -2
  348. package/dist/features/products/components/AuctionDetailView.d.ts +2 -1
  349. package/dist/features/products/components/AuctionDetailView.js +2 -2
  350. package/dist/features/products/components/AuctionsIndexListing.d.ts +3 -1
  351. package/dist/features/products/components/AuctionsIndexListing.js +93 -31
  352. package/dist/features/products/components/BidHistory.d.ts +2 -1
  353. package/dist/features/products/components/BidHistory.js +18 -2
  354. package/dist/features/products/components/MakeOfferButton.d.ts +10 -0
  355. package/dist/features/products/components/MakeOfferButton.js +68 -0
  356. package/dist/features/products/components/ProductDetailPageView.d.ts +11 -1
  357. package/dist/features/products/components/ProductDetailPageView.js +27 -8
  358. package/dist/features/products/components/ProductFilters.d.ts +7 -1
  359. package/dist/features/products/components/ProductFilters.js +4 -2
  360. package/dist/features/products/components/ProductForm.d.ts +19 -1
  361. package/dist/features/products/components/ProductForm.js +24 -6
  362. package/dist/features/products/components/ProductGrid.d.ts +10 -2
  363. package/dist/features/products/components/ProductGrid.js +76 -29
  364. package/dist/features/products/components/ProductsIndexListing.js +131 -45
  365. package/dist/features/products/components/RelatedProductsCarousel.js +1 -1
  366. package/dist/features/products/components/ShareButton.d.ts +7 -0
  367. package/dist/features/products/components/ShareButton.js +22 -0
  368. package/dist/features/products/components/index.d.ts +2 -0
  369. package/dist/features/products/components/index.js +1 -0
  370. package/dist/features/products/hooks/useProducts.d.ts +7 -0
  371. package/dist/features/products/hooks/useProducts.js +6 -4
  372. package/dist/features/products/repository/products.repository.d.ts +4 -8
  373. package/dist/features/products/repository/products.repository.js +17 -50
  374. package/dist/features/products/schemas/firestore.d.ts +11 -9
  375. package/dist/features/products/schemas/firestore.js +11 -3
  376. package/dist/features/products/schemas/index.d.ts +51 -50
  377. package/dist/features/products/schemas/index.js +2 -5
  378. package/dist/features/products/types/index.d.ts +13 -5
  379. package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
  380. package/dist/features/promotions/actions/coupon-actions.js +1 -1
  381. package/dist/features/promotions/actions/seller-coupon-actions.js +11 -6
  382. package/dist/features/promotions/api/route.js +3 -3
  383. package/dist/features/promotions/components/CouponCard.js +16 -7
  384. package/dist/features/promotions/components/CouponsIndexListing.js +3 -9
  385. package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
  386. package/dist/features/promotions/hooks/usePromotions.js +2 -2
  387. package/dist/features/promotions/repository/coupons.repository.d.ts +21 -15
  388. package/dist/features/promotions/repository/coupons.repository.js +97 -125
  389. package/dist/features/promotions/schemas/firestore.d.ts +31 -2
  390. package/dist/features/promotions/schemas/firestore.js +29 -0
  391. package/dist/features/promotions/schemas/index.d.ts +9 -12
  392. package/dist/features/promotions/schemas/index.js +1 -2
  393. package/dist/features/promotions/types/index.d.ts +1 -2
  394. package/dist/features/reviews/actions/review-actions.js +3 -2
  395. package/dist/features/reviews/components/ReviewDetailPageView.js +5 -9
  396. package/dist/features/reviews/components/ReviewFilters.js +1 -1
  397. package/dist/features/reviews/components/ReviewsIndexListing.js +58 -7
  398. package/dist/features/reviews/components/ReviewsList.js +2 -2
  399. package/dist/features/reviews/hooks/useReviews.d.ts +1 -0
  400. package/dist/features/reviews/hooks/useReviews.js +2 -1
  401. package/dist/features/reviews/repository/reviews.repository.d.ts +9 -4
  402. package/dist/features/reviews/repository/reviews.repository.js +18 -7
  403. package/dist/features/reviews/schemas/firestore.d.ts +5 -2
  404. package/dist/features/reviews/schemas/firestore.js +1 -0
  405. package/dist/features/reviews/schemas/index.d.ts +19 -16
  406. package/dist/features/reviews/schemas/index.js +3 -2
  407. package/dist/features/reviews/types/index.d.ts +3 -2
  408. package/dist/features/scams/actions/scam-actions.d.ts +29 -0
  409. package/dist/features/scams/actions/scam-actions.js +62 -0
  410. package/dist/features/scams/components/ScamProfileView.d.ts +10 -0
  411. package/dist/features/scams/components/ScamProfileView.js +51 -0
  412. package/dist/features/scams/components/ScamRegistryView.d.ts +6 -0
  413. package/dist/features/scams/components/ScamRegistryView.js +41 -0
  414. package/dist/features/scams/components/index.d.ts +4 -0
  415. package/dist/features/scams/components/index.js +2 -0
  416. package/dist/features/scams/constants/scam-types.d.ts +38 -0
  417. package/dist/features/scams/constants/scam-types.js +443 -0
  418. package/dist/features/scams/repository/scammer.repository.d.ts +67 -0
  419. package/dist/features/scams/repository/scammer.repository.js +160 -0
  420. package/dist/features/scams/schemas/firestore.d.ts +362 -0
  421. package/dist/features/scams/schemas/firestore.js +233 -0
  422. package/dist/features/search/components/Search.d.ts +12 -2
  423. package/dist/features/search/components/Search.js +26 -7
  424. package/dist/features/search/components/index.d.ts +1 -1
  425. package/dist/features/search/hooks/useNavSuggestions.d.ts +1 -1
  426. package/dist/features/search/hooks/useNavSuggestions.js +2 -2
  427. package/dist/features/search/schemas/index.d.ts +7 -7
  428. package/dist/features/seller/actions/offer-actions.js +52 -36
  429. package/dist/features/seller/actions/seller-actions.js +19 -13
  430. package/dist/features/seller/api/products/route.js +9 -4
  431. package/dist/features/seller/components/SellerAddressesView.d.ts +3 -12
  432. package/dist/features/seller/components/SellerAddressesView.js +144 -4
  433. package/dist/features/seller/components/SellerAuctionsView.js +58 -5
  434. package/dist/features/seller/components/SellerBidsView.d.ts +4 -0
  435. package/dist/features/seller/components/SellerBidsView.js +131 -0
  436. package/dist/features/seller/components/SellerCouponEditorView.d.ts +19 -0
  437. package/dist/features/seller/components/SellerCouponEditorView.js +67 -0
  438. package/dist/features/seller/components/SellerCouponsView.d.ts +5 -3
  439. package/dist/features/seller/components/SellerCouponsView.js +135 -13
  440. package/dist/features/seller/components/SellerCreateProductView.d.ts +4 -10
  441. package/dist/features/seller/components/SellerCreateProductView.js +4 -3
  442. package/dist/features/seller/components/SellerEditProductView.d.ts +4 -10
  443. package/dist/features/seller/components/SellerEditProductView.js +4 -3
  444. package/dist/features/seller/components/SellerOffersPanel.d.ts +20 -0
  445. package/dist/features/seller/components/SellerOffersPanel.js +138 -0
  446. package/dist/features/seller/components/SellerOffersView.js +56 -5
  447. package/dist/features/seller/components/SellerOrdersView.d.ts +2 -1
  448. package/dist/features/seller/components/SellerOrdersView.js +185 -16
  449. package/dist/features/seller/components/SellerPayoutRequestView.d.ts +7 -0
  450. package/dist/features/seller/components/SellerPayoutRequestView.js +63 -0
  451. package/dist/features/seller/components/SellerPayoutSettingsView.d.ts +3 -10
  452. package/dist/features/seller/components/SellerPayoutSettingsView.js +89 -3
  453. package/dist/features/seller/components/SellerPayoutsView.js +56 -5
  454. package/dist/features/seller/components/SellerProductShell.d.ts +68 -0
  455. package/dist/features/seller/components/SellerProductShell.js +179 -0
  456. package/dist/features/seller/components/SellerProductsView.d.ts +2 -3
  457. package/dist/features/seller/components/SellerProductsView.js +194 -18
  458. package/dist/features/seller/components/SellerReviewsView.d.ts +5 -0
  459. package/dist/features/seller/components/SellerReviewsView.js +100 -0
  460. package/dist/features/seller/components/SellerShippingView.d.ts +3 -11
  461. package/dist/features/seller/components/SellerShippingView.js +87 -3
  462. package/dist/features/seller/components/SellerSidebar.d.ts +11 -3
  463. package/dist/features/seller/components/SellerSidebar.js +52 -8
  464. package/dist/features/seller/components/SellerStorefrontView.d.ts +26 -11
  465. package/dist/features/seller/components/SellerStorefrontView.js +45 -7
  466. package/dist/features/seller/components/index.d.ts +16 -2
  467. package/dist/features/seller/components/index.js +7 -0
  468. package/dist/features/seller/hooks/useSellerListingData.d.ts +3 -1
  469. package/dist/features/seller/hooks/useSellerListingData.js +6 -4
  470. package/dist/features/seller/repository/offer.repository.d.ts +3 -3
  471. package/dist/features/seller/repository/offer.repository.js +6 -6
  472. package/dist/features/seller/schemas/firestore.d.ts +7 -7
  473. package/dist/features/seller/schemas/firestore.js +4 -4
  474. package/dist/features/seller/schemas/index.d.ts +16 -16
  475. package/dist/features/shell/FormShell.d.ts +29 -0
  476. package/dist/features/shell/FormShell.js +103 -0
  477. package/dist/features/shell/QuickFormDrawer.d.ts +29 -0
  478. package/dist/features/shell/QuickFormDrawer.js +117 -0
  479. package/dist/features/shell/StepForm.d.ts +44 -0
  480. package/dist/features/shell/StepForm.js +81 -0
  481. package/dist/features/shell/index.d.ts +6 -0
  482. package/dist/features/shell/index.js +3 -0
  483. package/dist/features/stores/actions/store-query-actions.js +3 -3
  484. package/dist/features/stores/api/[storeSlug]/auctions/route.js +1 -1
  485. package/dist/features/stores/api/[storeSlug]/products/route.js +1 -1
  486. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  487. package/dist/features/stores/components/InteractiveStoreCard.d.ts +2 -2
  488. package/dist/features/stores/components/InteractiveStoreCard.js +21 -7
  489. package/dist/features/stores/components/StoreAboutView.js +1 -1
  490. package/dist/features/stores/components/StoreAuctionsListing.d.ts +5 -2
  491. package/dist/features/stores/components/StoreAuctionsListing.js +81 -8
  492. package/dist/features/stores/components/StoreAuctionsPageView.js +8 -7
  493. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -0
  494. package/dist/features/stores/components/StoreDetailLayoutView.js +29 -5
  495. package/dist/features/stores/components/StoreHeader.js +2 -1
  496. package/dist/features/stores/components/StorePreOrdersListing.d.ts +4 -2
  497. package/dist/features/stores/components/StorePreOrdersListing.js +59 -7
  498. package/dist/features/stores/components/StorePreOrdersPageView.js +8 -7
  499. package/dist/features/stores/components/StoreProductsListing.d.ts +5 -2
  500. package/dist/features/stores/components/StoreProductsListing.js +97 -8
  501. package/dist/features/stores/components/StoreProductsPageView.js +8 -7
  502. package/dist/features/stores/components/StoreReviewsListing.js +2 -2
  503. package/dist/features/stores/components/StoresIndexListing.js +74 -11
  504. package/dist/features/stores/components/StoresListView.js +1 -1
  505. package/dist/features/stores/hooks/useStores.d.ts +1 -0
  506. package/dist/features/stores/hooks/useStores.js +1 -0
  507. package/dist/features/stores/schemas/firestore.d.ts +34 -0
  508. package/dist/features/stores/schemas/index.d.ts +8 -8
  509. package/dist/features/sublisting/schemas/firestore.d.ts +30 -0
  510. package/dist/features/sublisting/schemas/firestore.js +19 -0
  511. package/dist/features/support/schemas/firestore.d.ts +113 -0
  512. package/dist/features/support/schemas/firestore.js +95 -0
  513. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +5 -0
  514. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +143 -0
  515. package/dist/features/whatsapp-bot/components/index.d.ts +2 -0
  516. package/dist/features/whatsapp-bot/components/index.js +1 -0
  517. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +23 -1
  518. package/dist/features/whatsapp-bot/helpers/whatsapp.js +104 -0
  519. package/dist/features/whatsapp-bot/server.d.ts +1 -0
  520. package/dist/features/whatsapp-bot/server.js +1 -0
  521. package/dist/features/whatsapp-bot/types/index.d.ts +49 -0
  522. package/dist/features/wishlist/components/WishlistView.d.ts +0 -10
  523. package/dist/features/wishlist/components/WishlistView.js +13 -6
  524. package/dist/features/wishlist/hooks/useWishlist.js +2 -0
  525. package/dist/features/wishlist/hooks/useWishlistCount.d.ts +11 -3
  526. package/dist/features/wishlist/hooks/useWishlistCount.js +89 -25
  527. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  528. package/dist/features/wishlist/schemas/index.d.ts +2 -2
  529. package/dist/features/wishlist/types/index.d.ts +16 -0
  530. package/dist/http/api-handler.js +8 -1
  531. package/dist/index.d.ts +114 -16
  532. package/dist/index.js +136 -28
  533. package/dist/monitoring/server-logger.js +9 -3
  534. package/dist/next/routing/route-map.d.ts +120 -6
  535. package/dist/next/routing/route-map.js +53 -2
  536. package/dist/providers/db-firebase/realtime.d.ts +1 -1
  537. package/dist/react/contexts/SessionContext.js +17 -26
  538. package/dist/react/hooks/useBulkSelection.d.ts +7 -24
  539. package/dist/react/hooks/useBulkSelection.js +27 -34
  540. package/dist/react/hooks/useLongPress.d.ts +3 -16
  541. package/dist/react/hooks/useLongPress.js +6 -25
  542. package/dist/react/index.d.ts +1 -0
  543. package/dist/react/index.js +2 -0
  544. package/dist/repositories/index.d.ts +3 -0
  545. package/dist/repositories/index.js +2 -0
  546. package/dist/seed/actions/demo-seed-actions.d.ts +2 -2
  547. package/dist/seed/actions/demo-seed-actions.js +1 -1
  548. package/dist/seed/anime-figures-seed-data.d.ts +8 -0
  549. package/dist/seed/anime-figures-seed-data.js +1033 -0
  550. package/dist/seed/beyblade-seed-data.js +206 -24
  551. package/dist/seed/bids-seed-data.d.ts +4 -10
  552. package/dist/seed/bids-seed-data.js +365 -238
  553. package/dist/seed/blog-posts-seed-data.d.ts +3 -2
  554. package/dist/seed/blog-posts-seed-data.js +250 -511
  555. package/dist/seed/brands-seed-data.d.ts +7 -0
  556. package/dist/seed/brands-seed-data.js +410 -0
  557. package/dist/seed/carousel-slides-seed-data.d.ts +3 -2
  558. package/dist/seed/carousel-slides-seed-data.js +177 -216
  559. package/dist/seed/cart-seed-data.d.ts +9 -9
  560. package/dist/seed/cart-seed-data.js +73 -73
  561. package/dist/seed/categories-seed-data.d.ts +4 -2
  562. package/dist/seed/categories-seed-data.js +720 -879
  563. package/dist/seed/conversations-seed-data.d.ts +8 -0
  564. package/dist/seed/conversations-seed-data.js +388 -0
  565. package/dist/seed/cosplay-accessories-seed-data.d.ts +8 -0
  566. package/dist/seed/cosplay-accessories-seed-data.js +647 -0
  567. package/dist/seed/coupon-usage-seed-data.d.ts +25 -0
  568. package/dist/seed/coupon-usage-seed-data.js +69 -0
  569. package/dist/seed/coupons-seed-data.d.ts +6 -3
  570. package/dist/seed/coupons-seed-data.js +375 -3
  571. package/dist/seed/events-seed-data.d.ts +4 -2
  572. package/dist/seed/events-seed-data.js +128 -430
  573. package/dist/seed/factories/cart.factory.d.ts +0 -1
  574. package/dist/seed/factories/cart.factory.js +2 -2
  575. package/dist/seed/faq-seed-data.d.ts +11 -18
  576. package/dist/seed/faq-seed-data.js +786 -1817
  577. package/dist/seed/grouped-listings-seed-data.d.ts +8 -0
  578. package/dist/seed/grouped-listings-seed-data.js +201 -0
  579. package/dist/seed/homepage-sections-seed-data.d.ts +3 -13
  580. package/dist/seed/homepage-sections-seed-data.js +228 -252
  581. package/dist/seed/hot-wheels-seed-data.js +285 -38
  582. package/dist/seed/index.d.ts +12 -11
  583. package/dist/seed/index.js +10 -12
  584. package/dist/seed/letitrip-official-seed-data.d.ts +8 -0
  585. package/dist/seed/letitrip-official-seed-data.js +399 -0
  586. package/dist/seed/manifest.d.ts +15 -0
  587. package/dist/seed/manifest.js +140 -0
  588. package/dist/seed/notifications-seed-data.d.ts +4 -2
  589. package/dist/seed/notifications-seed-data.js +117 -440
  590. package/dist/seed/orders-seed-data.d.ts +4 -2
  591. package/dist/seed/orders-seed-data.js +1090 -521
  592. package/dist/seed/payouts-seed-data.d.ts +4 -2
  593. package/dist/seed/payouts-seed-data.js +522 -145
  594. package/dist/seed/pokemon-carousel-slides-seed-data.js +6 -1
  595. package/dist/seed/pokemon-categories-seed-data.js +81 -81
  596. package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +1 -1
  597. package/dist/seed/pokemon-homepage-sections-seed-data.js +116 -23
  598. package/dist/seed/pokemon-products-seed-data.d.ts +1 -1
  599. package/dist/seed/pokemon-products-seed-data.js +83 -73
  600. package/dist/seed/pokemon-seed-bundle.d.ts +5 -1
  601. package/dist/seed/pokemon-seed-bundle.js +21 -2
  602. package/dist/seed/pokemon-stores-seed-data.js +85 -9
  603. package/dist/seed/pokemon-users-seed-data.js +107 -8
  604. package/dist/seed/products-auctions-seed-data.d.ts +10 -0
  605. package/dist/seed/products-auctions-seed-data.js +689 -0
  606. package/dist/seed/products-preorders-seed-data.d.ts +9 -0
  607. package/dist/seed/products-preorders-seed-data.js +483 -0
  608. package/dist/seed/products-seed-data.js +34 -13
  609. package/dist/seed/products-standard-seed-data.d.ts +8 -0
  610. package/dist/seed/products-standard-seed-data.js +4179 -0
  611. package/dist/seed/retro-gaming-seed-data.d.ts +8 -0
  612. package/dist/seed/retro-gaming-seed-data.js +801 -0
  613. package/dist/seed/reviews-seed-data.d.ts +4 -17
  614. package/dist/seed/reviews-seed-data.js +1043 -515
  615. package/dist/seed/scammers-seed-data.d.ts +17 -0
  616. package/dist/seed/scammers-seed-data.js +118 -0
  617. package/dist/seed/site-settings-seed-data.js +25 -2
  618. package/dist/seed/store-addresses-seed-data.js +188 -84
  619. package/dist/seed/stores-seed-data.d.ts +3 -9
  620. package/dist/seed/stores-seed-data.js +212 -102
  621. package/dist/seed/sublisting-categories-seed-data.d.ts +7 -0
  622. package/dist/seed/sublisting-categories-seed-data.js +315 -0
  623. package/dist/seed/transformers-seed-data.js +34 -14
  624. package/dist/seed/users-seed-data.d.ts +3 -2
  625. package/dist/seed/users-seed-data.js +531 -440
  626. package/dist/seed/wishlists-seed-data.js +13 -13
  627. package/dist/server.d.ts +9 -2
  628. package/dist/server.js +12 -4
  629. package/dist/tokens/tokens.css +76 -31
  630. package/dist/ui/components/Avatar.style.css +10 -12
  631. package/dist/ui/components/BaseListingCard.d.ts +8 -3
  632. package/dist/ui/components/BaseListingCard.js +17 -6
  633. package/dist/ui/components/BaseListingCard.style.css +3 -1
  634. package/dist/ui/components/BulkActionsBar.d.ts +16 -0
  635. package/dist/ui/components/BulkActionsBar.js +22 -0
  636. package/dist/ui/components/Button.style.css +23 -23
  637. package/dist/ui/components/Card.style.css +60 -62
  638. package/dist/ui/components/Checkbox.style.css +19 -21
  639. package/dist/ui/components/DashboardStatsCard.style.css +12 -14
  640. package/dist/ui/components/Drawer.style.css +18 -14
  641. package/dist/ui/components/Dropdown.style.css +25 -27
  642. package/dist/ui/components/EmptyState.style.css +2 -4
  643. package/dist/ui/components/HorizontalScroller.d.ts +3 -1
  644. package/dist/ui/components/HorizontalScroller.js +116 -21
  645. package/dist/ui/components/HorizontalScroller.style.css +2 -2
  646. package/dist/ui/components/ImageLightbox.d.ts +0 -9
  647. package/dist/ui/components/ImageLightbox.js +43 -9
  648. package/dist/ui/components/InlineCreateSelect.d.ts +38 -0
  649. package/dist/ui/components/InlineCreateSelect.js +70 -0
  650. package/dist/ui/components/ListingLayout.style.css +41 -77
  651. package/dist/ui/components/ListingToolbar.d.ts +54 -0
  652. package/dist/ui/components/ListingToolbar.js +34 -0
  653. package/dist/ui/components/Modal.style.css +14 -10
  654. package/dist/ui/components/PageLoader.d.ts +11 -0
  655. package/dist/ui/components/PageLoader.js +21 -0
  656. package/dist/ui/components/Radio.style.css +34 -36
  657. package/dist/ui/components/RichTextEditor.js +1 -1
  658. package/dist/ui/components/RowActionMenu.d.ts +1 -0
  659. package/dist/ui/components/RowActionMenu.js +4 -2
  660. package/dist/ui/components/SectionTabs.js +1 -1
  661. package/dist/ui/components/SectionTabs.style.css +1 -0
  662. package/dist/ui/components/SideModal.style.css +4 -8
  663. package/dist/ui/components/Slider.style.css +2 -4
  664. package/dist/ui/components/Tabs.style.css +8 -10
  665. package/dist/ui/components/Toast.style.css +22 -24
  666. package/dist/ui/components/Toggle.style.css +11 -13
  667. package/dist/ui/index.d.ts +9 -0
  668. package/dist/ui/index.js +5 -0
  669. package/dist/ui/rich-text/RichText.js +2 -1
  670. package/dist/ui/rich-text/RichText.style.css +292 -5
  671. package/dist/ui/rich-text/RichTextRenderer.d.ts +15 -0
  672. package/dist/ui/rich-text/RichTextRenderer.js +15 -0
  673. package/dist/utils/id-generators.d.ts +10 -0
  674. package/dist/utils/id-generators.js +12 -0
  675. package/dist/validation/schemas.d.ts +9 -9
  676. package/package.json +5 -1
  677. package/README.md +0 -116
@@ -2,365 +2,18 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
5
- import { Alert, Button, Checkbox, Div, Form, FormActions, Input, Modal, Select, Text, Textarea, } from "../../../ui";
5
+ import { Button, Checkbox, ConfirmDeleteModal, Div, Form, FormActions, Input, Modal, Select, Text, Textarea, useToast, } from "../../../ui";
6
6
  import { apiClient } from "../../../http";
7
- import { ADMIN_ENDPOINTS } from "../../../constants";
7
+ import { ADMIN_ENDPOINTS, DEMO_ENDPOINTS } from "../../../constants";
8
8
  import { useAdminSectionsListing } from "../hooks/useAdminSectionsListing";
9
- import { AdminListingScaffold } from "./AdminListingScaffold";
10
- const SECTION_TYPE_OPTIONS = [
11
- "welcome",
12
- "stats",
13
- "trust-indicators",
14
- "categories",
15
- "brands",
16
- "products",
17
- "pre-orders",
18
- "auctions",
19
- "banner",
20
- "features",
21
- "reviews",
22
- "whatsapp-community",
23
- "faq",
24
- "blog-articles",
25
- "newsletter",
26
- "stores",
27
- "events",
28
- ];
29
- const DEFAULT_PRODUCTS_BUILDER = {
30
- title: "Featured Products",
31
- subtitle: "",
32
- maxItems: 18,
33
- status: "published",
34
- sortBy: "featured",
35
- featuredOnly: true,
36
- inStockOnly: true,
37
- autoScroll: false,
38
- scrollInterval: 5000,
39
- resourceMode: "automatic",
40
- selectedCategoryIds: [],
41
- manualResourceIds: "",
42
- };
43
- const DEFAULT_AUCTIONS_BUILDER = {
44
- title: "Live Auctions",
45
- subtitle: "",
46
- maxItems: 18,
47
- status: "active",
48
- sortBy: "ending-soon",
49
- autoScroll: false,
50
- scrollInterval: 5000,
51
- resourceMode: "automatic",
52
- selectedCategoryIds: [],
53
- manualResourceIds: "",
54
- };
55
- const DEFAULT_STATS_BUILDER = {
56
- title: "Marketplace Stats",
57
- stats: [
58
- { key: "products", label: "Products Listed", value: "10,000+" },
59
- { key: "sellers", label: "Verified Sellers", value: "2,000+" },
60
- { key: "buyers", label: "Happy Buyers", value: "50,000+" },
61
- { key: "rating", label: "Average Rating", value: "4.8/5" },
62
- ],
63
- };
64
- const DEFAULT_PRE_ORDERS_BUILDER = {
65
- title: "Reserve Before It Ships",
66
- subtitle: "",
67
- maxItems: 18,
68
- status: "active",
69
- sortBy: "shipping-soon",
70
- autoScroll: false,
71
- scrollInterval: 5000,
72
- resourceMode: "automatic",
73
- selectedCategoryIds: [],
74
- manualResourceIds: "",
75
- };
76
- const DEFAULT_STORES_BUILDER = {
77
- title: "Featured Stores",
78
- subtitle: "",
79
- maxItems: 8,
80
- status: "active",
81
- sortBy: "rating-desc",
82
- verifiedOnly: true,
83
- autoScroll: false,
84
- scrollInterval: 5000,
85
- resourceMode: "automatic",
86
- selectedCategoryIds: [],
87
- manualResourceIds: "",
88
- };
89
- const DEFAULT_EVENTS_BUILDER = {
90
- title: "Events & Offers",
91
- subtitle: "",
92
- maxItems: 6,
93
- status: "active",
94
- sortBy: "start-date",
95
- featuredOnly: false,
96
- autoScroll: false,
97
- scrollInterval: 5000,
98
- resourceMode: "automatic",
99
- selectedCategoryIds: [],
100
- manualResourceIds: "",
101
- };
102
- const SUPPORTED_TYPED_BUILDERS = [
103
- "products",
104
- "auctions",
105
- "stats",
106
- "pre-orders",
107
- "stores",
108
- "events",
109
- ];
110
- function parseCsvValues(value) {
111
- return value
112
- .split(",")
113
- .map((part) => part.trim())
114
- .filter(Boolean);
115
- }
116
- function toNumberValue(value, fallback) {
117
- if (typeof value === "number" && Number.isFinite(value)) {
118
- return value;
119
- }
120
- if (typeof value === "string") {
121
- const parsed = Number(value);
122
- if (Number.isFinite(parsed)) {
123
- return parsed;
124
- }
125
- }
126
- return fallback;
127
- }
128
- function toStringValue(value, fallback = "") {
129
- return typeof value === "string" ? value : fallback;
130
- }
131
- function toBooleanValue(value, fallback = false) {
132
- return typeof value === "boolean" ? value : fallback;
133
- }
134
- function toStringArray(value) {
135
- return Array.isArray(value)
136
- ? value.filter((item) => typeof item === "string")
137
- : [];
138
- }
139
- function buildProductsConfig(builder) {
140
- return {
141
- title: builder.title,
142
- subtitle: builder.subtitle || undefined,
143
- maxProducts: builder.maxItems,
144
- rows: 2,
145
- itemsPerRow: 3,
146
- mobileItemsPerRow: 1,
147
- autoScroll: builder.autoScroll,
148
- scrollInterval: builder.scrollInterval,
149
- filters: {
150
- categoryIds: builder.selectedCategoryIds,
151
- status: builder.status,
152
- sortBy: builder.sortBy,
153
- featuredOnly: builder.featuredOnly,
154
- inStockOnly: builder.inStockOnly,
155
- },
156
- resources: {
157
- mode: builder.resourceMode,
158
- ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
159
- },
160
- };
161
- }
162
- function buildAuctionsConfig(builder) {
163
- return {
164
- title: builder.title,
165
- subtitle: builder.subtitle || undefined,
166
- maxAuctions: builder.maxItems,
167
- rows: 2,
168
- itemsPerRow: 3,
169
- mobileItemsPerRow: 1,
170
- autoScroll: builder.autoScroll,
171
- scrollInterval: builder.scrollInterval,
172
- filters: {
173
- categoryIds: builder.selectedCategoryIds,
174
- status: builder.status,
175
- sortBy: builder.sortBy,
176
- },
177
- resources: {
178
- mode: builder.resourceMode,
179
- ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
180
- },
181
- };
182
- }
183
- function buildStatsConfig(builder) {
184
- return {
185
- title: builder.title || undefined,
186
- stats: builder.stats.map((item, index) => ({
187
- key: item.key.trim() || `stat-${index + 1}`,
188
- label: item.label,
189
- value: item.value,
190
- })),
191
- };
192
- }
193
- function buildPreOrdersConfig(builder) {
194
- return {
195
- title: builder.title,
196
- subtitle: builder.subtitle || undefined,
197
- maxItems: builder.maxItems,
198
- rows: 2,
199
- itemsPerRow: 3,
200
- mobileItemsPerRow: 1,
201
- autoScroll: builder.autoScroll,
202
- scrollInterval: builder.scrollInterval,
203
- filters: {
204
- categoryIds: builder.selectedCategoryIds,
205
- status: builder.status,
206
- sortBy: builder.sortBy,
207
- },
208
- resources: {
209
- mode: builder.resourceMode,
210
- ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
211
- },
212
- };
213
- }
214
- function buildStoresConfig(builder) {
215
- return {
216
- title: builder.title,
217
- subtitle: builder.subtitle || undefined,
218
- maxStores: builder.maxItems,
219
- autoScroll: builder.autoScroll,
220
- scrollInterval: builder.scrollInterval,
221
- filters: {
222
- categoryIds: builder.selectedCategoryIds,
223
- status: builder.status,
224
- sortBy: builder.sortBy,
225
- verifiedOnly: builder.verifiedOnly,
226
- },
227
- resources: {
228
- mode: builder.resourceMode,
229
- ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
230
- },
231
- };
232
- }
233
- function buildEventsConfig(builder) {
234
- return {
235
- title: builder.title,
236
- subtitle: builder.subtitle || undefined,
237
- maxEvents: builder.maxItems,
238
- autoScroll: builder.autoScroll,
239
- scrollInterval: builder.scrollInterval,
240
- filters: {
241
- categoryIds: builder.selectedCategoryIds,
242
- status: builder.status,
243
- sortBy: builder.sortBy,
244
- featuredOnly: builder.featuredOnly,
245
- },
246
- resources: {
247
- mode: builder.resourceMode,
248
- ids: builder.resourceMode === "manual" ? parseCsvValues(builder.manualResourceIds) : [],
249
- },
250
- };
251
- }
252
- function parseProductsBuilder(config) {
253
- const filters = (config.filters ?? {});
254
- const resources = (config.resources ?? {});
255
- return {
256
- title: toStringValue(config.title, DEFAULT_PRODUCTS_BUILDER.title),
257
- subtitle: toStringValue(config.subtitle),
258
- maxItems: toNumberValue(config.maxProducts, DEFAULT_PRODUCTS_BUILDER.maxItems),
259
- status: toStringValue(filters.status, DEFAULT_PRODUCTS_BUILDER.status),
260
- sortBy: toStringValue(filters.sortBy, DEFAULT_PRODUCTS_BUILDER.sortBy),
261
- featuredOnly: toBooleanValue(filters.featuredOnly, DEFAULT_PRODUCTS_BUILDER.featuredOnly),
262
- inStockOnly: toBooleanValue(filters.inStockOnly, DEFAULT_PRODUCTS_BUILDER.inStockOnly),
263
- autoScroll: toBooleanValue(config.autoScroll, DEFAULT_PRODUCTS_BUILDER.autoScroll),
264
- scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_PRODUCTS_BUILDER.scrollInterval),
265
- resourceMode: toStringValue(resources.mode, DEFAULT_PRODUCTS_BUILDER.resourceMode),
266
- selectedCategoryIds: toStringArray(filters.categoryIds),
267
- manualResourceIds: toStringArray(resources.ids).join(", "),
268
- };
269
- }
270
- function parseAuctionsBuilder(config) {
271
- const filters = (config.filters ?? {});
272
- const resources = (config.resources ?? {});
273
- return {
274
- title: toStringValue(config.title, DEFAULT_AUCTIONS_BUILDER.title),
275
- subtitle: toStringValue(config.subtitle),
276
- maxItems: toNumberValue(config.maxAuctions, DEFAULT_AUCTIONS_BUILDER.maxItems),
277
- status: toStringValue(filters.status, DEFAULT_AUCTIONS_BUILDER.status),
278
- sortBy: toStringValue(filters.sortBy, DEFAULT_AUCTIONS_BUILDER.sortBy),
279
- autoScroll: toBooleanValue(config.autoScroll, DEFAULT_AUCTIONS_BUILDER.autoScroll),
280
- scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_AUCTIONS_BUILDER.scrollInterval),
281
- resourceMode: toStringValue(resources.mode, DEFAULT_AUCTIONS_BUILDER.resourceMode),
282
- selectedCategoryIds: toStringArray(filters.categoryIds),
283
- manualResourceIds: toStringArray(resources.ids).join(", "),
284
- };
285
- }
286
- function parseStatsBuilder(config) {
287
- const statsArray = Array.isArray(config.stats) ? config.stats : [];
288
- const parsedStats = statsArray
289
- .slice(0, 4)
290
- .map((item, index) => {
291
- const row = (item ?? {});
292
- return {
293
- key: toStringValue(row.key, `stat-${index + 1}`),
294
- label: toStringValue(row.label),
295
- value: toStringValue(row.value),
296
- };
297
- });
298
- while (parsedStats.length < 4) {
299
- parsedStats.push({
300
- key: `stat-${parsedStats.length + 1}`,
301
- label: "",
302
- value: "",
303
- });
304
- }
305
- return {
306
- title: toStringValue(config.title, DEFAULT_STATS_BUILDER.title),
307
- stats: parsedStats,
308
- };
309
- }
310
- function parsePreOrdersBuilder(config) {
311
- const filters = (config.filters ?? {});
312
- const resources = (config.resources ?? {});
313
- return {
314
- title: toStringValue(config.title, DEFAULT_PRE_ORDERS_BUILDER.title),
315
- subtitle: toStringValue(config.subtitle),
316
- maxItems: toNumberValue(config.maxItems, DEFAULT_PRE_ORDERS_BUILDER.maxItems),
317
- status: toStringValue(filters.status, DEFAULT_PRE_ORDERS_BUILDER.status),
318
- sortBy: toStringValue(filters.sortBy, DEFAULT_PRE_ORDERS_BUILDER.sortBy),
319
- autoScroll: toBooleanValue(config.autoScroll, DEFAULT_PRE_ORDERS_BUILDER.autoScroll),
320
- scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_PRE_ORDERS_BUILDER.scrollInterval),
321
- resourceMode: toStringValue(resources.mode, DEFAULT_PRE_ORDERS_BUILDER.resourceMode),
322
- selectedCategoryIds: toStringArray(filters.categoryIds),
323
- manualResourceIds: toStringArray(resources.ids).join(", "),
324
- };
325
- }
326
- function parseStoresBuilder(config) {
327
- const filters = (config.filters ?? {});
328
- const resources = (config.resources ?? {});
329
- return {
330
- title: toStringValue(config.title, DEFAULT_STORES_BUILDER.title),
331
- subtitle: toStringValue(config.subtitle),
332
- maxItems: toNumberValue(config.maxStores, DEFAULT_STORES_BUILDER.maxItems),
333
- status: toStringValue(filters.status, DEFAULT_STORES_BUILDER.status),
334
- sortBy: toStringValue(filters.sortBy, DEFAULT_STORES_BUILDER.sortBy),
335
- verifiedOnly: toBooleanValue(filters.verifiedOnly, DEFAULT_STORES_BUILDER.verifiedOnly),
336
- autoScroll: toBooleanValue(config.autoScroll, DEFAULT_STORES_BUILDER.autoScroll),
337
- scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_STORES_BUILDER.scrollInterval),
338
- resourceMode: toStringValue(resources.mode, DEFAULT_STORES_BUILDER.resourceMode),
339
- selectedCategoryIds: toStringArray(filters.categoryIds),
340
- manualResourceIds: toStringArray(resources.ids).join(", "),
341
- };
342
- }
343
- function parseEventsBuilder(config) {
344
- const filters = (config.filters ?? {});
345
- const resources = (config.resources ?? {});
346
- return {
347
- title: toStringValue(config.title, DEFAULT_EVENTS_BUILDER.title),
348
- subtitle: toStringValue(config.subtitle),
349
- maxItems: toNumberValue(config.maxEvents, DEFAULT_EVENTS_BUILDER.maxItems),
350
- status: toStringValue(filters.status, DEFAULT_EVENTS_BUILDER.status),
351
- sortBy: toStringValue(filters.sortBy, DEFAULT_EVENTS_BUILDER.sortBy),
352
- featuredOnly: toBooleanValue(filters.featuredOnly, DEFAULT_EVENTS_BUILDER.featuredOnly),
353
- autoScroll: toBooleanValue(config.autoScroll, DEFAULT_EVENTS_BUILDER.autoScroll),
354
- scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_EVENTS_BUILDER.scrollInterval),
355
- resourceMode: toStringValue(resources.mode, DEFAULT_EVENTS_BUILDER.resourceMode),
356
- selectedCategoryIds: toStringArray(filters.categoryIds),
357
- manualResourceIds: toStringArray(resources.ids).join(", "),
358
- };
359
- }
9
+ import { DataTable } from "./DataTable";
10
+ import { SECTION_TYPE_OPTIONS, SUPPORTED_TYPED_BUILDERS, RESOURCE_SORT_OPTIONS, FAQ_CATEGORY_OPTIONS, DEFAULT_PRODUCTS_BUILDER, DEFAULT_AUCTIONS_BUILDER, DEFAULT_STATS_BUILDER, DEFAULT_PRE_ORDERS_BUILDER, DEFAULT_STORES_BUILDER, DEFAULT_EVENTS_BUILDER, DEFAULT_SOCIAL_FEED_BUILDER, DEFAULT_WELCOME_BUILDER, DEFAULT_TRUST_INDICATORS_BUILDER, DEFAULT_CATEGORIES_BUILDER, DEFAULT_BRANDS_BUILDER, DEFAULT_BANNER_BUILDER, DEFAULT_FEATURES_BUILDER, DEFAULT_REVIEWS_BUILDER, DEFAULT_WHATSAPP_BUILDER, DEFAULT_FAQ_BUILDER, DEFAULT_BLOG_BUILDER, DEFAULT_NEWSLETTER_BUILDER, DEFAULT_CAROUSEL_BUILDER, DEFAULT_CUSTOM_CARDS_BUILDER, DEFAULT_GOOGLE_REVIEWS_BUILDER, } from "./sections/adminSectionsTypes";
11
+ import { toStringValue, buildProductsConfig, buildAuctionsConfig, buildStatsConfig, buildPreOrdersConfig, buildStoresConfig, buildEventsConfig, buildSocialFeedConfig, buildWelcomeConfig, buildTrustIndicatorsConfig, buildCategoriesConfig, buildBrandsConfig, buildBannerConfig, buildFeaturesConfig, buildReviewsConfig, buildWhatsAppConfig, buildFAQConfig, buildBlogConfig, buildNewsletterConfig, buildCarouselConfig, buildCustomCardsConfig, buildGoogleReviewsConfig, parseProductsBuilder, parseAuctionsBuilder, parseStatsBuilder, parsePreOrdersBuilder, parseStoresBuilder, parseEventsBuilder, parseSocialFeedBuilder, parseWelcomeBuilder, parseTrustIndicatorsBuilder, parseCategoriesBuilder, parseBrandsBuilder, parseBannerBuilder, parseFeaturesBuilder, parseReviewsBuilder, parseWhatsAppBuilder, parseFAQBuilder, parseBlogBuilder, parseNewsletterBuilder, parseCarouselBuilder, parseCustomCardsBuilder, parseGoogleReviewsBuilder, } from "./sections/adminSectionsBuildParse";
360
12
  export function AdminSectionsView({ children }) {
361
13
  const hasChildren = React.Children.count(children) > 0;
362
14
  const queryClient = useQueryClient();
363
15
  const [isModalOpen, setIsModalOpen] = React.useState(false);
16
+ const [seedResetOpen, setSeedResetOpen] = React.useState(false);
364
17
  const [mode, setMode] = React.useState("create");
365
18
  const [selectedSectionId, setSelectedSectionId] = React.useState("");
366
19
  const [sectionType, setSectionType] = React.useState("products");
@@ -373,11 +26,26 @@ export function AdminSectionsView({ children }) {
373
26
  const [preOrdersBuilder, setPreOrdersBuilder] = React.useState(DEFAULT_PRE_ORDERS_BUILDER);
374
27
  const [storesBuilder, setStoresBuilder] = React.useState(DEFAULT_STORES_BUILDER);
375
28
  const [eventsBuilder, setEventsBuilder] = React.useState(DEFAULT_EVENTS_BUILDER);
29
+ const [socialFeedBuilder, setSocialFeedBuilder] = React.useState(DEFAULT_SOCIAL_FEED_BUILDER);
30
+ const [welcomeBuilder, setWelcomeBuilder] = React.useState(DEFAULT_WELCOME_BUILDER);
31
+ const [trustIndicatorsBuilder, setTrustIndicatorsBuilder] = React.useState(DEFAULT_TRUST_INDICATORS_BUILDER);
32
+ const [categoriesBuilder, setCategoriesBuilder] = React.useState(DEFAULT_CATEGORIES_BUILDER);
33
+ const [brandsBuilder, setBrandsBuilder] = React.useState(DEFAULT_BRANDS_BUILDER);
34
+ const [bannerBuilder, setBannerBuilder] = React.useState(DEFAULT_BANNER_BUILDER);
35
+ const [featuresBuilder, setFeaturesBuilder] = React.useState(DEFAULT_FEATURES_BUILDER);
36
+ const [reviewsBuilder, setReviewsBuilder] = React.useState(DEFAULT_REVIEWS_BUILDER);
37
+ const [whatsappBuilder, setWhatsappBuilder] = React.useState(DEFAULT_WHATSAPP_BUILDER);
38
+ const [faqBuilder, setFaqBuilder] = React.useState(DEFAULT_FAQ_BUILDER);
39
+ const [blogBuilder, setBlogBuilder] = React.useState(DEFAULT_BLOG_BUILDER);
40
+ const [newsletterBuilder, setNewsletterBuilder] = React.useState(DEFAULT_NEWSLETTER_BUILDER);
41
+ const [carouselBuilder, setCarouselBuilder] = React.useState(DEFAULT_CAROUSEL_BUILDER);
42
+ const [customCardsBuilder, setCustomCardsBuilder] = React.useState(DEFAULT_CUSTOM_CARDS_BUILDER);
43
+ const [googleReviewsBuilder, setGoogleReviewsBuilder] = React.useState(DEFAULT_GOOGLE_REVIEWS_BUILDER);
376
44
  const [reorderDraft, setReorderDraft] = React.useState([]);
377
45
  const [reorderServerSnapshot, setReorderServerSnapshot] = React.useState([]);
378
46
  const [reorderUndoStack, setReorderUndoStack] = React.useState([]);
379
47
  const [dragIndex, setDragIndex] = React.useState(null);
380
- const [formMessage, setFormMessage] = React.useState(null);
48
+ const toast = useToast();
381
49
  const isTypedBuilder = SUPPORTED_TYPED_BUILDERS.includes(sectionType);
382
50
  const { sections, isLoading, errorMessage } = useAdminSectionsListing({
383
51
  page: 1,
@@ -405,25 +73,30 @@ export function AdminSectionsView({ children }) {
405
73
  .filter((item) => item !== null);
406
74
  }, [categoriesQuery.data?.items]);
407
75
  const typedConfig = React.useMemo(() => {
408
- if (sectionType === "products") {
409
- return buildProductsConfig(productsBuilder);
410
- }
411
- if (sectionType === "auctions") {
412
- return buildAuctionsConfig(auctionsBuilder);
413
- }
414
- if (sectionType === "stats") {
415
- return buildStatsConfig(statsBuilder);
416
- }
417
- if (sectionType === "pre-orders") {
418
- return buildPreOrdersConfig(preOrdersBuilder);
419
- }
420
- if (sectionType === "stores") {
421
- return buildStoresConfig(storesBuilder);
76
+ switch (sectionType) {
77
+ case "products": return buildProductsConfig(productsBuilder);
78
+ case "auctions": return buildAuctionsConfig(auctionsBuilder);
79
+ case "stats": return buildStatsConfig(statsBuilder);
80
+ case "pre-orders": return buildPreOrdersConfig(preOrdersBuilder);
81
+ case "stores": return buildStoresConfig(storesBuilder);
82
+ case "events": return buildEventsConfig(eventsBuilder);
83
+ case "social-feed": return buildSocialFeedConfig(socialFeedBuilder);
84
+ case "welcome": return buildWelcomeConfig(welcomeBuilder);
85
+ case "trust-indicators": return buildTrustIndicatorsConfig(trustIndicatorsBuilder);
86
+ case "categories": return buildCategoriesConfig(categoriesBuilder);
87
+ case "brands": return buildBrandsConfig(brandsBuilder);
88
+ case "banner": return buildBannerConfig(bannerBuilder);
89
+ case "features": return buildFeaturesConfig(featuresBuilder);
90
+ case "reviews": return buildReviewsConfig(reviewsBuilder);
91
+ case "whatsapp-community": return buildWhatsAppConfig(whatsappBuilder);
92
+ case "faq": return buildFAQConfig(faqBuilder);
93
+ case "blog-articles": return buildBlogConfig(blogBuilder);
94
+ case "newsletter": return buildNewsletterConfig(newsletterBuilder);
95
+ case "carousel": return buildCarouselConfig(carouselBuilder);
96
+ case "custom-cards": return buildCustomCardsConfig(customCardsBuilder);
97
+ case "google-reviews": return buildGoogleReviewsConfig(googleReviewsBuilder);
98
+ default: return null;
422
99
  }
423
- if (sectionType === "events") {
424
- return buildEventsConfig(eventsBuilder);
425
- }
426
- return null;
427
100
  }, [
428
101
  sectionType,
429
102
  productsBuilder,
@@ -432,6 +105,21 @@ export function AdminSectionsView({ children }) {
432
105
  preOrdersBuilder,
433
106
  storesBuilder,
434
107
  eventsBuilder,
108
+ socialFeedBuilder,
109
+ welcomeBuilder,
110
+ trustIndicatorsBuilder,
111
+ categoriesBuilder,
112
+ brandsBuilder,
113
+ bannerBuilder,
114
+ featuresBuilder,
115
+ reviewsBuilder,
116
+ whatsappBuilder,
117
+ faqBuilder,
118
+ blogBuilder,
119
+ newsletterBuilder,
120
+ carouselBuilder,
121
+ customCardsBuilder,
122
+ googleReviewsBuilder,
435
123
  ]);
436
124
  React.useEffect(() => {
437
125
  if (!typedConfig) {
@@ -484,11 +172,25 @@ export function AdminSectionsView({ children }) {
484
172
  },
485
173
  onSuccess: async () => {
486
174
  await queryClient.invalidateQueries({ queryKey: ["admin", "sections", "listing"] });
487
- setFormMessage(mode === "create" ? "Section created." : "Section updated.");
175
+ toast.showToast(mode === "create" ? "Section created." : "Section updated.", "success");
488
176
  setIsModalOpen(false);
489
177
  },
490
178
  onError: (error) => {
491
- setFormMessage(error instanceof Error ? error.message : "Failed to save section.");
179
+ toast.showToast(error instanceof Error ? error.message : "Failed to save section.", "error");
180
+ },
181
+ });
182
+ const resetSeed = useMutation({
183
+ mutationFn: () => apiClient.post(DEMO_ENDPOINTS.SEED, {
184
+ action: "load",
185
+ collections: ["homepageSections"],
186
+ }),
187
+ onSuccess: async () => {
188
+ await queryClient.invalidateQueries({ queryKey: ["admin", "sections", "listing"] });
189
+ setSeedResetOpen(false);
190
+ toast.showToast("Homepage sections seed data reloaded.", "success");
191
+ },
192
+ onError: () => {
193
+ toast.showToast("Seed reset failed.", "error");
492
194
  },
493
195
  });
494
196
  const reorderSections = useMutation({
@@ -501,10 +203,10 @@ export function AdminSectionsView({ children }) {
501
203
  await queryClient.invalidateQueries({ queryKey: ["admin", "sections", "listing"] });
502
204
  setReorderServerSnapshot(cloneReorderItems(reorderDraft));
503
205
  setReorderUndoStack([]);
504
- setFormMessage("Section order updated.");
206
+ toast.showToast("Section order updated.", "success");
505
207
  },
506
208
  onError: (error) => {
507
- setFormMessage(error instanceof Error ? error.message : "Failed to reorder sections.");
209
+ toast.showToast(error instanceof Error ? error.message : "Failed to reorder sections.", "error");
508
210
  },
509
211
  });
510
212
  React.useEffect(() => {
@@ -518,46 +220,140 @@ export function AdminSectionsView({ children }) {
518
220
  setOrder(String(selected.order ?? ""));
519
221
  const selectedConfig = (selected.config ?? {});
520
222
  setConfigJson(JSON.stringify(selectedConfig, null, 2));
521
- if (selected.type === "products") {
522
- setProductsBuilder(parseProductsBuilder(selectedConfig));
523
- }
524
- if (selected.type === "auctions") {
525
- setAuctionsBuilder(parseAuctionsBuilder(selectedConfig));
526
- }
527
- if (selected.type === "stats") {
528
- setStatsBuilder(parseStatsBuilder(selectedConfig));
529
- }
530
- if (selected.type === "pre-orders") {
531
- setPreOrdersBuilder(parsePreOrdersBuilder(selectedConfig));
532
- }
533
- if (selected.type === "stores") {
534
- setStoresBuilder(parseStoresBuilder(selectedConfig));
535
- }
536
- if (selected.type === "events") {
537
- setEventsBuilder(parseEventsBuilder(selectedConfig));
223
+ switch (selected.type) {
224
+ case "products":
225
+ setProductsBuilder(parseProductsBuilder(selectedConfig));
226
+ break;
227
+ case "auctions":
228
+ setAuctionsBuilder(parseAuctionsBuilder(selectedConfig));
229
+ break;
230
+ case "stats":
231
+ setStatsBuilder(parseStatsBuilder(selectedConfig));
232
+ break;
233
+ case "pre-orders":
234
+ setPreOrdersBuilder(parsePreOrdersBuilder(selectedConfig));
235
+ break;
236
+ case "stores":
237
+ setStoresBuilder(parseStoresBuilder(selectedConfig));
238
+ break;
239
+ case "events":
240
+ setEventsBuilder(parseEventsBuilder(selectedConfig));
241
+ break;
242
+ case "social-feed":
243
+ setSocialFeedBuilder(parseSocialFeedBuilder(selectedConfig));
244
+ break;
245
+ case "welcome":
246
+ setWelcomeBuilder(parseWelcomeBuilder(selectedConfig));
247
+ break;
248
+ case "trust-indicators":
249
+ setTrustIndicatorsBuilder(parseTrustIndicatorsBuilder(selectedConfig));
250
+ break;
251
+ case "categories":
252
+ setCategoriesBuilder(parseCategoriesBuilder(selectedConfig));
253
+ break;
254
+ case "brands":
255
+ setBrandsBuilder(parseBrandsBuilder(selectedConfig));
256
+ break;
257
+ case "banner":
258
+ setBannerBuilder(parseBannerBuilder(selectedConfig));
259
+ break;
260
+ case "features":
261
+ setFeaturesBuilder(parseFeaturesBuilder(selectedConfig));
262
+ break;
263
+ case "reviews":
264
+ setReviewsBuilder(parseReviewsBuilder(selectedConfig));
265
+ break;
266
+ case "whatsapp-community":
267
+ setWhatsappBuilder(parseWhatsAppBuilder(selectedConfig));
268
+ break;
269
+ case "faq":
270
+ setFaqBuilder(parseFAQBuilder(selectedConfig));
271
+ break;
272
+ case "blog-articles":
273
+ setBlogBuilder(parseBlogBuilder(selectedConfig));
274
+ break;
275
+ case "newsletter":
276
+ setNewsletterBuilder(parseNewsletterBuilder(selectedConfig));
277
+ break;
278
+ case "carousel":
279
+ setCarouselBuilder(parseCarouselBuilder(selectedConfig));
280
+ break;
281
+ case "custom-cards":
282
+ setCustomCardsBuilder(parseCustomCardsBuilder(selectedConfig));
283
+ break;
284
+ case "google-reviews":
285
+ setGoogleReviewsBuilder(parseGoogleReviewsBuilder(selectedConfig));
286
+ break;
538
287
  }
539
288
  }, [mode, sections, selectedSectionId]);
540
289
  React.useEffect(() => {
541
290
  if (!isModalOpen || mode !== "create") {
542
291
  return;
543
292
  }
544
- if (sectionType === "products") {
545
- setProductsBuilder(DEFAULT_PRODUCTS_BUILDER);
546
- }
547
- if (sectionType === "auctions") {
548
- setAuctionsBuilder(DEFAULT_AUCTIONS_BUILDER);
549
- }
550
- if (sectionType === "stats") {
551
- setStatsBuilder(DEFAULT_STATS_BUILDER);
552
- }
553
- if (sectionType === "pre-orders") {
554
- setPreOrdersBuilder(DEFAULT_PRE_ORDERS_BUILDER);
555
- }
556
- if (sectionType === "stores") {
557
- setStoresBuilder(DEFAULT_STORES_BUILDER);
558
- }
559
- if (sectionType === "events") {
560
- setEventsBuilder(DEFAULT_EVENTS_BUILDER);
293
+ switch (sectionType) {
294
+ case "products":
295
+ setProductsBuilder(DEFAULT_PRODUCTS_BUILDER);
296
+ break;
297
+ case "auctions":
298
+ setAuctionsBuilder(DEFAULT_AUCTIONS_BUILDER);
299
+ break;
300
+ case "stats":
301
+ setStatsBuilder(DEFAULT_STATS_BUILDER);
302
+ break;
303
+ case "pre-orders":
304
+ setPreOrdersBuilder(DEFAULT_PRE_ORDERS_BUILDER);
305
+ break;
306
+ case "stores":
307
+ setStoresBuilder(DEFAULT_STORES_BUILDER);
308
+ break;
309
+ case "events":
310
+ setEventsBuilder(DEFAULT_EVENTS_BUILDER);
311
+ break;
312
+ case "social-feed":
313
+ setSocialFeedBuilder(DEFAULT_SOCIAL_FEED_BUILDER);
314
+ break;
315
+ case "welcome":
316
+ setWelcomeBuilder(DEFAULT_WELCOME_BUILDER);
317
+ break;
318
+ case "trust-indicators":
319
+ setTrustIndicatorsBuilder(DEFAULT_TRUST_INDICATORS_BUILDER);
320
+ break;
321
+ case "categories":
322
+ setCategoriesBuilder(DEFAULT_CATEGORIES_BUILDER);
323
+ break;
324
+ case "brands":
325
+ setBrandsBuilder(DEFAULT_BRANDS_BUILDER);
326
+ break;
327
+ case "banner":
328
+ setBannerBuilder(DEFAULT_BANNER_BUILDER);
329
+ break;
330
+ case "features":
331
+ setFeaturesBuilder(DEFAULT_FEATURES_BUILDER);
332
+ break;
333
+ case "reviews":
334
+ setReviewsBuilder(DEFAULT_REVIEWS_BUILDER);
335
+ break;
336
+ case "whatsapp-community":
337
+ setWhatsappBuilder(DEFAULT_WHATSAPP_BUILDER);
338
+ break;
339
+ case "faq":
340
+ setFaqBuilder(DEFAULT_FAQ_BUILDER);
341
+ break;
342
+ case "blog-articles":
343
+ setBlogBuilder(DEFAULT_BLOG_BUILDER);
344
+ break;
345
+ case "newsletter":
346
+ setNewsletterBuilder(DEFAULT_NEWSLETTER_BUILDER);
347
+ break;
348
+ case "carousel":
349
+ setCarouselBuilder(DEFAULT_CAROUSEL_BUILDER);
350
+ break;
351
+ case "custom-cards":
352
+ setCustomCardsBuilder(DEFAULT_CUSTOM_CARDS_BUILDER);
353
+ break;
354
+ case "google-reviews":
355
+ setGoogleReviewsBuilder(DEFAULT_GOOGLE_REVIEWS_BUILDER);
356
+ break;
561
357
  }
562
358
  }, [isModalOpen, mode, sectionType]);
563
359
  function toggleCategorySelection(ids, categoryId, checked) {
@@ -658,15 +454,7 @@ export function AdminSectionsView({ children }) {
658
454
  { label: "All", value: "all" },
659
455
  { label: "Published", value: "published" },
660
456
  { label: "Draft", value: "draft" },
661
- ] }), _jsx(Select, { label: "Sort", value: productsBuilder.sortBy, onValueChange: (value) => setProductsBuilder((prev) => ({
662
- ...prev,
663
- sortBy: value,
664
- })), options: [
665
- { label: "Featured", value: "featured" },
666
- { label: "Newest", value: "newest" },
667
- { label: "Price (Low to High)", value: "price-asc" },
668
- { label: "Price (High to Low)", value: "price-desc" },
669
- ] }), _jsx(Select, { label: "Resource mode", value: productsBuilder.resourceMode, onValueChange: (value) => setProductsBuilder((prev) => ({
457
+ ] }), _jsx(Select, { label: "Sort by", value: productsBuilder.sortBy, onValueChange: (value) => setProductsBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: productsBuilder.filterByCategory, onChange: (e) => setProductsBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-pokemon-cards" }), _jsx(Select, { label: "Max items to show", value: String(productsBuilder.maxCount), onValueChange: (v) => setProductsBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: productsBuilder.loop, label: "Loop carousel", onChange: (e) => setProductsBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: productsBuilder.resourceMode, onValueChange: (value) => setProductsBuilder((prev) => ({
670
458
  ...prev,
671
459
  resourceMode: value,
672
460
  })), options: [
@@ -704,14 +492,7 @@ export function AdminSectionsView({ children }) {
704
492
  { label: "Active", value: "active" },
705
493
  { label: "Scheduled", value: "scheduled" },
706
494
  { label: "Ended", value: "ended" },
707
- ] }), _jsx(Select, { label: "Sort", value: auctionsBuilder.sortBy, onValueChange: (value) => setAuctionsBuilder((prev) => ({
708
- ...prev,
709
- sortBy: value,
710
- })), options: [
711
- { label: "Ending Soon", value: "ending-soon" },
712
- { label: "Highest Bid", value: "highest-bid" },
713
- { label: "Newest", value: "newest" },
714
- ] }), _jsx(Select, { label: "Resource mode", value: auctionsBuilder.resourceMode, onValueChange: (value) => setAuctionsBuilder((prev) => ({
495
+ ] }), _jsx(Select, { label: "Sort by", value: auctionsBuilder.sortBy, onValueChange: (value) => setAuctionsBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: auctionsBuilder.filterByCategory, onChange: (e) => setAuctionsBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-pokemon-cards" }), _jsx(Select, { label: "Max items to show", value: String(auctionsBuilder.maxCount), onValueChange: (v) => setAuctionsBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: auctionsBuilder.loop, label: "Loop carousel", onChange: (e) => setAuctionsBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: auctionsBuilder.resourceMode, onValueChange: (value) => setAuctionsBuilder((prev) => ({
715
496
  ...prev,
716
497
  resourceMode: value,
717
498
  })), options: [
@@ -761,15 +542,7 @@ export function AdminSectionsView({ children }) {
761
542
  { label: "Active", value: "active" },
762
543
  { label: "Upcoming", value: "upcoming" },
763
544
  { label: "Closed", value: "closed" },
764
- ] }), _jsx(Select, { label: "Sort", value: preOrdersBuilder.sortBy, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
765
- ...prev,
766
- sortBy: value,
767
- })), options: [
768
- { label: "Shipping Soon", value: "shipping-soon" },
769
- { label: "Newest", value: "newest" },
770
- { label: "Price (Low to High)", value: "price-asc" },
771
- { label: "Price (High to Low)", value: "price-desc" },
772
- ] }), _jsx(Select, { label: "Resource mode", value: preOrdersBuilder.resourceMode, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
545
+ ] }), _jsx(Select, { label: "Sort by", value: preOrdersBuilder.sortBy, onValueChange: (value) => setPreOrdersBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: preOrdersBuilder.filterByCategory, onChange: (e) => setPreOrdersBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-beyblade-tops" }), _jsx(Select, { label: "Max items to show", value: String(preOrdersBuilder.maxCount), onValueChange: (v) => setPreOrdersBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: preOrdersBuilder.loop, label: "Loop carousel", onChange: (e) => setPreOrdersBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: preOrdersBuilder.resourceMode, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
773
546
  ...prev,
774
547
  resourceMode: value,
775
548
  })), options: [
@@ -803,14 +576,7 @@ export function AdminSectionsView({ children }) {
803
576
  { label: "Active", value: "active" },
804
577
  { label: "Pending", value: "pending" },
805
578
  { label: "Disabled", value: "disabled" },
806
- ] }), _jsx(Select, { label: "Sort", value: storesBuilder.sortBy, onValueChange: (value) => setStoresBuilder((prev) => ({
807
- ...prev,
808
- sortBy: value,
809
- })), options: [
810
- { label: "Rating (High to Low)", value: "rating-desc" },
811
- { label: "Newest", value: "newest" },
812
- { label: "Popular", value: "popular" },
813
- ] }), _jsx(Select, { label: "Resource mode", value: storesBuilder.resourceMode, onValueChange: (value) => setStoresBuilder((prev) => ({
579
+ ] }), _jsx(Select, { label: "Sort by", value: storesBuilder.sortBy, onValueChange: (value) => setStoresBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: storesBuilder.filterByCategory, onChange: (e) => setStoresBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-pokemon-cards" }), _jsx(Select, { label: "Max items to show", value: String(storesBuilder.maxCount), onValueChange: (v) => setStoresBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: storesBuilder.loop, label: "Loop carousel", onChange: (e) => setStoresBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: storesBuilder.resourceMode, onValueChange: (value) => setStoresBuilder((prev) => ({
814
580
  ...prev,
815
581
  resourceMode: value,
816
582
  })), options: [
@@ -847,14 +613,7 @@ export function AdminSectionsView({ children }) {
847
613
  { label: "Active", value: "active" },
848
614
  { label: "Upcoming", value: "upcoming" },
849
615
  { label: "Ended", value: "ended" },
850
- ] }), _jsx(Select, { label: "Sort", value: eventsBuilder.sortBy, onValueChange: (value) => setEventsBuilder((prev) => ({
851
- ...prev,
852
- sortBy: value,
853
- })), options: [
854
- { label: "Start Date", value: "start-date" },
855
- { label: "Newest", value: "newest" },
856
- { label: "Popular", value: "popular" },
857
- ] }), _jsx(Select, { label: "Resource mode", value: eventsBuilder.resourceMode, onValueChange: (value) => setEventsBuilder((prev) => ({
616
+ ] }), _jsx(Select, { label: "Sort by", value: eventsBuilder.sortBy, onValueChange: (value) => setEventsBuilder((prev) => ({ ...prev, sortBy: value })), options: [...RESOURCE_SORT_OPTIONS] }), _jsx(Input, { label: "Filter by category slug", value: eventsBuilder.filterByCategory, onChange: (e) => setEventsBuilder((prev) => ({ ...prev, filterByCategory: e.target.value })), placeholder: "category-events" }), _jsx(Select, { label: "Max items to show", value: String(eventsBuilder.maxCount), onValueChange: (v) => setEventsBuilder((prev) => ({ ...prev, maxCount: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Checkbox, { checked: eventsBuilder.loop, label: "Loop carousel", onChange: (e) => setEventsBuilder((prev) => ({ ...prev, loop: e.target.checked })) }), _jsx(Select, { label: "Resource mode", value: eventsBuilder.resourceMode, onValueChange: (value) => setEventsBuilder((prev) => ({
858
617
  ...prev,
859
618
  resourceMode: value,
860
619
  })), options: [
@@ -879,26 +638,156 @@ export function AdminSectionsView({ children }) {
879
638
  scrollInterval: Math.max(1000, Number(event.target.value) || 1000),
880
639
  })) })] }));
881
640
  }
641
+ function renderFAQBuilder() {
642
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "FAQ Section Builder" }), _jsx(Input, { label: "Section title", value: faqBuilder.title, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: faqBuilder.subtitle, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Display count", type: "number", min: 1, max: 20, value: String(faqBuilder.displayCount), onChange: (e) => setFaqBuilder((prev) => ({ ...prev, displayCount: Math.min(20, Math.max(1, Number(e.target.value) || 1)) })) }), _jsx(Checkbox, { checked: faqBuilder.showOnHomepage, label: "Show on homepage", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, showOnHomepage: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.expandedByDefault, label: "Expanded by default", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, expandedByDefault: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.linkToFullPage, label: "Link to full FAQ page", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, linkToFullPage: e.target.checked })) }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Categories" }), _jsx(Div, { className: "grid grid-cols-2 gap-2", children: FAQ_CATEGORY_OPTIONS.map((opt) => (_jsx(Checkbox, { checked: faqBuilder.categories.includes(opt.value), label: opt.label, onChange: (e) => setFaqBuilder((prev) => ({
643
+ ...prev,
644
+ categories: e.target.checked
645
+ ? [...prev.categories, opt.value]
646
+ : prev.categories.filter((c) => c !== opt.value),
647
+ })) }, opt.value))) })] })] }));
648
+ }
649
+ function renderBlogBuilder() {
650
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Blog Articles Builder" }), _jsx(Input, { label: "Section title", value: blogBuilder.title, onChange: (e) => setBlogBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Max articles", value: String(blogBuilder.maxArticles), onValueChange: (v) => setBlogBuilder((prev) => ({ ...prev, maxArticles: Number(v) })), options: [{ label: "3", value: "3" }, { label: "4", value: "4" }, { label: "6", value: "6" }] }), _jsx(Checkbox, { checked: blogBuilder.showReadTime, label: "Show read time", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showReadTime: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showAuthor, label: "Show author", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showAuthor: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showThumbnails, label: "Show thumbnails", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showThumbnails: e.target.checked })) })] }));
651
+ }
652
+ function renderNewsletterBuilder() {
653
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Newsletter Section Builder" }), _jsx(Input, { label: "Title", value: newsletterBuilder.title, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: newsletterBuilder.description, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "Email placeholder", value: newsletterBuilder.placeholder, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, placeholder: e.target.value })) }), _jsx(Input, { label: "Button text", value: newsletterBuilder.buttonText, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, buttonText: e.target.value })) }), _jsx(Input, { label: "Privacy text", value: newsletterBuilder.privacyText, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, privacyText: e.target.value })) }), _jsx(Input, { label: "Privacy link", value: newsletterBuilder.privacyLink, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, privacyLink: e.target.value })), placeholder: "/privacy" })] }));
654
+ }
655
+ function renderBannerBuilder() {
656
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Banner Section Builder" }), _jsx(Select, { label: "Height", value: bannerBuilder.height, onValueChange: (v) => setBannerBuilder((prev) => ({ ...prev, height: v })), options: [{ label: "Small (200px)", value: "sm" }, { label: "Medium (300px)", value: "md" }, { label: "Large (400px)", value: "lg" }, { label: "Extra Large (500px)", value: "xl" }] }), _jsx(Input, { label: "Background image URL", type: "url", value: bannerBuilder.backgroundImage, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, backgroundImage: e.target.value })), placeholder: "https://..." }), _jsx(Input, { label: "Background color (CSS token)", value: bannerBuilder.backgroundColor, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, backgroundColor: e.target.value })), placeholder: "var(--appkit-color-primary)" }), _jsx(Input, { label: "Gradient from (CSS token)", value: bannerBuilder.gradientFrom, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, gradientFrom: e.target.value })), placeholder: "var(--appkit-color-primary)" }), _jsx(Input, { label: "Gradient to (CSS token)", value: bannerBuilder.gradientTo, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, gradientTo: e.target.value })), placeholder: "var(--appkit-color-secondary)" }), _jsx(Input, { label: "Content title", value: bannerBuilder.contentTitle, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentTitle: e.target.value })) }), _jsx(Input, { label: "Content subtitle", value: bannerBuilder.contentSubtitle, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentSubtitle: e.target.value })) }), _jsx(Textarea, { label: "Content description", value: bannerBuilder.contentDescription, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentDescription: e.target.value })), rows: 2 }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Buttons (max 3)" }), bannerBuilder.buttons.map((btn, index) => (_jsxs(Div, { className: "space-y-2 rounded-md border border-zinc-200 p-2 dark:border-slate-700", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs text-zinc-500", children: ["Button ", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setBannerBuilder((prev) => ({ ...prev, buttons: prev.buttons.filter((_, i) => i !== index) })), children: "Remove" })] }), _jsx(Input, { label: "Text", value: btn.text, onChange: (e) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], text: e.target.value }; return { ...prev, buttons: next }; }) }), _jsx(Input, { label: "Link", value: btn.link, onChange: (e) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], link: e.target.value }; return { ...prev, buttons: next }; }) }), _jsx(Select, { label: "Variant", value: btn.variant, onValueChange: (v) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], variant: v }; return { ...prev, buttons: next }; }), options: [{ label: "Primary", value: "primary" }, { label: "Secondary", value: "secondary" }, { label: "Outline", value: "outline" }] })] }, `banner-btn-${index}`))), bannerBuilder.buttons.length < 3 ? (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setBannerBuilder((prev) => ({ ...prev, buttons: [...prev.buttons, { text: "", link: "", variant: "primary" }] })), children: "+ Add button" })) : null] }), _jsx(Checkbox, { checked: bannerBuilder.clickable, label: "Make entire banner clickable", onChange: (e) => setBannerBuilder((prev) => ({ ...prev, clickable: e.target.checked })) }), bannerBuilder.clickable ? (_jsx(Input, { label: "Click link", value: bannerBuilder.clickLink, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, clickLink: e.target.value })), placeholder: "/products" })) : null] }));
657
+ }
658
+ function renderFeaturesBuilder() {
659
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Features Section Builder" }), _jsx(Input, { label: "Section title", value: featuresBuilder.title, onChange: (e) => setFeaturesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Feature items" }), featuresBuilder.features.map((feature, index) => (_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Input, { value: feature, onChange: (e) => setFeaturesBuilder((prev) => { const next = [...prev.features]; next[index] = e.target.value; return { ...prev, features: next }; }), className: "flex-1" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setFeaturesBuilder((prev) => ({ ...prev, features: prev.features.filter((_, i) => i !== index) })), children: "\u2715" })] }, `feat-${index}`))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setFeaturesBuilder((prev) => ({ ...prev, features: [...prev.features, ""] })), children: "+ Add feature" })] })] }));
660
+ }
661
+ function renderReviewsBuilder() {
662
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Reviews Section Builder" }), _jsx(Input, { label: "Section title", value: reviewsBuilder.title, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Reviews source", value: reviewsBuilder.source, onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, source: v })), options: [
663
+ { label: "Platform reviews (LetItRip)", value: "platform" },
664
+ { label: "Google Business Reviews", value: "google" },
665
+ ] }), reviewsBuilder.source === "google" ? (_jsx(Input, { label: "Google Place ID", value: reviewsBuilder.placeId, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, placeId: e.target.value })), placeholder: "ChIJ...", helperText: "Find your Place ID at maps.google.com/placesinventory" })) : null, _jsx(Select, { label: "Max reviews", value: String(reviewsBuilder.maxReviews), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, maxReviews: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Select, { label: "Items per view", value: String(reviewsBuilder.itemsPerView), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, itemsPerView: Number(v) })), options: [{ label: "1", value: "1" }, { label: "2", value: "2" }, { label: "3", value: "3" }] }), _jsx(Checkbox, { checked: reviewsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(reviewsBuilder.scrollInterval), onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) })] }));
666
+ }
667
+ function renderWhatsAppBuilder() {
668
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "WhatsApp Community Builder" }), _jsx(Input, { label: "Title", value: whatsappBuilder.title, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: whatsappBuilder.description, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "WhatsApp group link", type: "url", value: whatsappBuilder.groupLink, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, groupLink: e.target.value })), placeholder: "https://chat.whatsapp.com/..." }), _jsx(Input, { label: "Member count", type: "number", min: 0, value: String(whatsappBuilder.memberCount), onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, memberCount: Math.max(0, Number(e.target.value) || 0) })) }), _jsxs(Div, { className: "space-y-2", children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: "Benefits" }), whatsappBuilder.benefits.map((benefit, index) => (_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Input, { value: benefit, onChange: (e) => setWhatsappBuilder((prev) => { const next = [...prev.benefits]; next[index] = e.target.value; return { ...prev, benefits: next }; }), className: "flex-1" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setWhatsappBuilder((prev) => ({ ...prev, benefits: prev.benefits.filter((_, i) => i !== index) })), children: "\u2715" })] }, `wb-${index}`))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setWhatsappBuilder((prev) => ({ ...prev, benefits: [...prev.benefits, ""] })), children: "+ Add benefit" })] }), _jsx(Input, { label: "Button text", value: whatsappBuilder.buttonText, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, buttonText: e.target.value })) }), _jsx(Input, { label: "Testimonial (optional)", value: whatsappBuilder.testimonial, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, testimonial: e.target.value })) })] }));
669
+ }
670
+ function renderWelcomeBuilder() {
671
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Welcome Section Builder" }), _jsx(Input, { label: "Headline (h1)", value: welcomeBuilder.h1, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, h1: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: welcomeBuilder.subtitle, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Textarea, { label: "Description", value: welcomeBuilder.description, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 3 }), _jsx(Checkbox, { checked: welcomeBuilder.showCTA, label: "Show CTA button", onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, showCTA: e.target.checked })) }), welcomeBuilder.showCTA ? (_jsxs(_Fragment, { children: [_jsx(Input, { label: "CTA text", value: welcomeBuilder.ctaText, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, ctaText: e.target.value })) }), _jsx(Input, { label: "CTA link", value: welcomeBuilder.ctaLink, onChange: (e) => setWelcomeBuilder((prev) => ({ ...prev, ctaLink: e.target.value })), placeholder: "/products" })] })) : null] }));
672
+ }
673
+ function renderTrustIndicatorsBuilder() {
674
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Trust Indicators Builder" }), _jsx(Input, { label: "Section title", value: trustIndicatorsBuilder.title, onChange: (e) => setTrustIndicatorsBuilder((prev) => ({ ...prev, title: e.target.value })) }), trustIndicatorsBuilder.indicators.map((ind, index) => (_jsxs(Div, { className: "space-y-2 rounded-md border border-zinc-200 p-3 dark:border-slate-700", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: ["Indicator ", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setTrustIndicatorsBuilder((prev) => ({ ...prev, indicators: prev.indicators.filter((_, i) => i !== index) })), children: "Remove" })] }), _jsx(Input, { label: "Icon (emoji or text)", value: ind.icon, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], icon: e.target.value }; return { ...prev, indicators: next }; }) }), _jsx(Input, { label: "Title", value: ind.title, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], title: e.target.value }; return { ...prev, indicators: next }; }) }), _jsx(Input, { label: "Description", value: ind.description, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], description: e.target.value }; return { ...prev, indicators: next }; }) })] }, ind.id))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setTrustIndicatorsBuilder((prev) => ({ ...prev, indicators: [...prev.indicators, { id: `ti-${Date.now()}`, icon: "✨", title: "", description: "" }] })), children: "+ Add indicator" })] }));
675
+ }
676
+ function renderCategoriesBuilder() {
677
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Categories Section Builder" }), _jsx(Input, { label: "Section title", value: categoriesBuilder.title, onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Max categories (4\u201312)", type: "number", min: 4, max: 12, value: String(categoriesBuilder.maxCategories), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, maxCategories: Math.min(12, Math.max(4, Number(e.target.value) || 4)) })) }), _jsx(Checkbox, { checked: categoriesBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(categoriesBuilder.scrollInterval), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) })] }));
678
+ }
679
+ function renderBrandsBuilder() {
680
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Brands Section Builder" }), _jsx(Input, { label: "Section title", value: brandsBuilder.title, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: brandsBuilder.subtitle, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Max brands", type: "number", min: 1, max: 30, value: String(brandsBuilder.maxBrands), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, maxBrands: Math.max(1, Number(e.target.value) || 1) })) }), _jsx(Checkbox, { checked: brandsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(brandsBuilder.scrollInterval), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) })] }));
681
+ }
682
+ function renderCarouselBuilder() {
683
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Carousel Section Builder" }), _jsx(Input, { label: "Section title", value: carouselBuilder.title, onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, title: e.target.value })), placeholder: "Hero Carousel" }), _jsx(Select, { label: "Slide height", value: carouselBuilder.height, onValueChange: (value) => setCarouselBuilder((prev) => ({ ...prev, height: value })), options: [
684
+ { label: "Viewport (100vh)", value: "viewport" },
685
+ { label: "Tall (80vh)", value: "tall" },
686
+ { label: "Medium (60vh)", value: "medium" },
687
+ ] }), _jsx(Input, { label: "Default autoplay delay (ms)", type: "number", min: 1000, step: 500, value: String(carouselBuilder.defaultAutoplayDelayMs), onChange: (e) => setCarouselBuilder((prev) => ({
688
+ ...prev,
689
+ defaultAutoplayDelayMs: Math.max(1000, Number(e.target.value) || 5000),
690
+ })) }), _jsx(Checkbox, { checked: carouselBuilder.pauseOnHover, label: "Pause on hover", onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, pauseOnHover: e.target.checked })) }), _jsx(Checkbox, { checked: carouselBuilder.showDots, label: "Show navigation dots", onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, showDots: e.target.checked })) }), _jsx(Checkbox, { checked: carouselBuilder.showArrows, label: "Show prev/next arrows", onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, showArrows: e.target.checked })) })] }));
691
+ }
692
+ function renderCustomCardsBuilder() {
693
+ function addCard() {
694
+ setCustomCardsBuilder((prev) => ({
695
+ ...prev,
696
+ cards: [
697
+ ...prev.cards,
698
+ {
699
+ id: `card-${prev.cards.length + 1}`,
700
+ image: "",
701
+ imageAlt: "",
702
+ eyebrow: "",
703
+ title: "",
704
+ body: "",
705
+ link: "",
706
+ backgroundColor: "",
707
+ textColor: "",
708
+ borderRadius: "md",
709
+ shadowLevel: "sm",
710
+ },
711
+ ],
712
+ }));
713
+ }
714
+ function removeCard(index) {
715
+ setCustomCardsBuilder((prev) => ({
716
+ ...prev,
717
+ cards: prev.cards.filter((_, i) => i !== index),
718
+ }));
719
+ }
720
+ function updateCard(index, patch) {
721
+ setCustomCardsBuilder((prev) => {
722
+ const next = [...prev.cards];
723
+ next[index] = { ...next[index], ...patch };
724
+ return { ...prev, cards: next };
725
+ });
726
+ }
727
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Custom Cards Builder" }), _jsx(Input, { label: "Section title", value: customCardsBuilder.title, onChange: (e) => setCustomCardsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Layout", value: customCardsBuilder.layout, onValueChange: (value) => setCustomCardsBuilder((prev) => ({ ...prev, layout: value })), options: [
728
+ { label: "Grid", value: "grid" },
729
+ { label: "Row (horizontal scroll)", value: "row" },
730
+ { label: "Masonry", value: "masonry" },
731
+ ] }), _jsx(Select, { label: "Columns", value: String(customCardsBuilder.columns), onValueChange: (value) => setCustomCardsBuilder((prev) => ({ ...prev, columns: Number(value) })), options: [
732
+ { label: "1 column", value: "1" },
733
+ { label: "2 columns", value: "2" },
734
+ { label: "3 columns", value: "3" },
735
+ { label: "4 columns", value: "4" },
736
+ ] }), _jsx(Checkbox, { checked: customCardsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setCustomCardsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: "Scroll interval (ms)", type: "number", min: 1000, step: 500, value: String(customCardsBuilder.scrollIntervalMs), onChange: (e) => setCustomCardsBuilder((prev) => ({
737
+ ...prev,
738
+ scrollIntervalMs: Math.max(1000, Number(e.target.value) || 4000),
739
+ })) }), _jsxs(Div, { className: "space-y-3", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: ["Cards (", customCardsBuilder.cards.length, ")"] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: addCard, children: "Add card" })] }), customCardsBuilder.cards.map((card, index) => (_jsxs(Div, { className: "space-y-3 rounded-md border border-zinc-200 p-3 dark:border-slate-700", children: [_jsxs(Div, { className: "flex items-center justify-between", children: [_jsxs(Text, { className: "text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400", children: ["Card ", index + 1] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => removeCard(index), children: "Remove" })] }), _jsx(Input, { label: "ID / slug", value: card.id, onChange: (e) => updateCard(index, { id: e.target.value }), placeholder: "card-1" }), _jsx(Input, { label: "Image URL", value: card.image, onChange: (e) => updateCard(index, { image: e.target.value }), placeholder: "https://..." }), _jsx(Input, { label: "Image alt text", value: card.imageAlt, onChange: (e) => updateCard(index, { imageAlt: e.target.value }) }), _jsx(Input, { label: "Eyebrow (small label above title)", value: card.eyebrow, onChange: (e) => updateCard(index, { eyebrow: e.target.value }) }), _jsx(Input, { label: "Title", value: card.title, onChange: (e) => updateCard(index, { title: e.target.value }) }), _jsx(Input, { label: "Body / description", value: card.body, onChange: (e) => updateCard(index, { body: e.target.value }) }), _jsx(Input, { label: "Link (href)", value: card.link, onChange: (e) => updateCard(index, { link: e.target.value }), placeholder: "/categories/..." }), _jsx(Input, { label: "Background colour", value: card.backgroundColor, onChange: (e) => updateCard(index, { backgroundColor: e.target.value }), placeholder: "#ffffff or var(--appkit-color-primary)" }), _jsx(Input, { label: "Text colour", value: card.textColor, onChange: (e) => updateCard(index, { textColor: e.target.value }), placeholder: "#000000" }), _jsx(Select, { label: "Border radius", value: card.borderRadius, onValueChange: (value) => updateCard(index, { borderRadius: value }), options: [
740
+ { label: "None", value: "none" },
741
+ { label: "Small", value: "sm" },
742
+ { label: "Medium", value: "md" },
743
+ { label: "Large", value: "lg" },
744
+ { label: "XL", value: "xl" },
745
+ { label: "Full (pill)", value: "full" },
746
+ ] }), _jsx(Select, { label: "Shadow level", value: card.shadowLevel, onValueChange: (value) => updateCard(index, { shadowLevel: value }), options: [
747
+ { label: "None", value: "none" },
748
+ { label: "Small", value: "sm" },
749
+ { label: "Medium", value: "md" },
750
+ { label: "Large", value: "lg" },
751
+ ] })] }, `custom-card-${index}`))), customCardsBuilder.cards.length === 0 ? (_jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "No cards added yet. Click \"Add card\" to start." })) : null] })] }));
752
+ }
753
+ function renderGoogleReviewsBuilder() {
754
+ return (_jsxs(Div, { className: "space-y-4 rounded-lg border border-zinc-200 p-4 dark:border-slate-700", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-800 dark:text-zinc-200", children: "Google Reviews Builder" }), _jsx(Input, { label: "Google Place ID", value: googleReviewsBuilder.placeId, onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, placeId: e.target.value })), placeholder: "ChIJ...", helperText: "Find your Place ID at developers.google.com/maps/documentation/places/web-service/place-id" }), _jsx(Input, { label: "Max reviews to show", type: "number", min: 1, max: 20, value: String(googleReviewsBuilder.maxReviews), onChange: (e) => setGoogleReviewsBuilder((prev) => ({
755
+ ...prev,
756
+ maxReviews: Math.max(1, Math.min(20, Number(e.target.value) || 6)),
757
+ })) }), _jsx(Select, { label: "Minimum star rating to show", value: String(googleReviewsBuilder.minRating), onValueChange: (value) => setGoogleReviewsBuilder((prev) => ({ ...prev, minRating: Number(value) })), options: [
758
+ { label: "All ratings (0★+)", value: "0" },
759
+ { label: "3★ and above", value: "3" },
760
+ { label: "4★ and above", value: "4" },
761
+ { label: "5★ only", value: "5" },
762
+ ] }), _jsx(Select, { label: "Layout", value: googleReviewsBuilder.layout, onValueChange: (value) => setGoogleReviewsBuilder((prev) => ({ ...prev, layout: value })), options: [
763
+ { label: "Grid", value: "grid" },
764
+ { label: "Carousel", value: "carousel" },
765
+ ] }), _jsx(Checkbox, { checked: googleReviewsBuilder.showRating, label: "Show star rating on each review", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, showRating: e.target.checked })) }), _jsx(Checkbox, { checked: googleReviewsBuilder.showDate, label: "Show review date", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, showDate: e.target.checked })) }), _jsx(Checkbox, { checked: googleReviewsBuilder.linkToGoogleMaps, label: "Link to Google Maps listing", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, linkToGoogleMaps: e.target.checked })) }), googleReviewsBuilder.linkToGoogleMaps ? (_jsx(Input, { label: "Google Maps URL", value: googleReviewsBuilder.googleMapsUrl, onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, googleMapsUrl: e.target.value })), placeholder: "https://maps.google.com/..." })) : null] }));
766
+ }
882
767
  function renderTypedBuilder() {
883
- if (sectionType === "products") {
884
- return renderProductsBuilder();
885
- }
886
- if (sectionType === "auctions") {
887
- return renderAuctionsBuilder();
888
- }
889
- if (sectionType === "stats") {
890
- return renderStatsBuilder();
891
- }
892
- if (sectionType === "pre-orders") {
893
- return renderPreOrdersBuilder();
894
- }
895
- if (sectionType === "stores") {
896
- return renderStoresBuilder();
897
- }
898
- if (sectionType === "events") {
899
- return renderEventsBuilder();
768
+ switch (sectionType) {
769
+ case "products": return renderProductsBuilder();
770
+ case "auctions": return renderAuctionsBuilder();
771
+ case "stats": return renderStatsBuilder();
772
+ case "pre-orders": return renderPreOrdersBuilder();
773
+ case "stores": return renderStoresBuilder();
774
+ case "events": return renderEventsBuilder();
775
+ case "welcome": return renderWelcomeBuilder();
776
+ case "trust-indicators": return renderTrustIndicatorsBuilder();
777
+ case "categories": return renderCategoriesBuilder();
778
+ case "brands": return renderBrandsBuilder();
779
+ case "banner": return renderBannerBuilder();
780
+ case "features": return renderFeaturesBuilder();
781
+ case "reviews": return renderReviewsBuilder();
782
+ case "whatsapp-community": return renderWhatsAppBuilder();
783
+ case "faq": return renderFAQBuilder();
784
+ case "blog-articles": return renderBlogBuilder();
785
+ case "newsletter": return renderNewsletterBuilder();
786
+ case "carousel": return renderCarouselBuilder();
787
+ case "custom-cards": return renderCustomCardsBuilder();
788
+ case "google-reviews": return renderGoogleReviewsBuilder();
789
+ default: return null;
900
790
  }
901
- return null;
902
791
  }
903
792
  // If children exist, render passthrough mode (detail view)
904
793
  if (hasChildren) {
@@ -917,12 +806,12 @@ export function AdminSectionsView({ children }) {
917
806
  }, [sections]);
918
807
  const hasReorderChanges = reorderDraft.some((item) => sectionOrderMap.get(item.id) !== item.order);
919
808
  const canUndoReorderChanges = reorderUndoStack.length > 0;
920
- return (_jsxs(_Fragment, { children: [_jsx(AdminListingScaffold, { title: "Homepage Sections", subtitle: "Manage homepage sections and their display order", actionLabel: "Manage Sections", searchPlaceholder: "Search sections...", rows: rows, isLoading: isLoading, errorMessage: errorMessage, emptyLabel: "No sections found", actionsSlot: _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => setIsModalOpen(true), children: "Manage Sections" }) }), _jsxs(Div, { className: "mt-4 space-y-3 rounded-xl border border-zinc-200 bg-white p-4 dark:border-slate-700 dark:bg-slate-900", children: [_jsxs(Div, { className: "flex items-center justify-between gap-3", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-900 dark:text-zinc-100", children: "Reorder Sections" }), _jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: reindexDraft, disabled: reorderSections.isPending || reorderDraft.length === 0, children: "Reindex 1..N" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: undoReorderChange, disabled: reorderSections.isPending || !canUndoReorderChanges, children: "Undo unsaved" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: resetToServerOrder, disabled: reorderSections.isPending || !hasReorderChanges, children: "Reset to server" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => reorderSections.mutate(), disabled: !hasReorderChanges || reorderSections.isPending, children: reorderSections.isPending ? "Saving order..." : "Save order" })] })] }), reorderDraft.length === 0 ? (_jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "No sections to reorder." })) : (_jsx(Div, { className: "space-y-2", children: reorderDraft.map((item, index) => (_jsxs(Div, { className: "grid grid-cols-[auto_1fr_auto_auto_auto] items-center gap-2 rounded-md border border-zinc-200 p-2 dark:border-slate-700", draggable: true, onDragStart: () => setDragIndex(index), onDragOver: (event) => event.preventDefault(), onDrop: () => {
809
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "py-4 px-3 sm:px-4", children: [_jsxs(Div, { className: "mb-4 flex items-center justify-between gap-3", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-base font-semibold text-zinc-900 dark:text-zinc-100", children: "Homepage Sections" }), _jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "Manage homepage sections and their display order" })] }), _jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setSeedResetOpen(true), children: "Reset seed data" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => setIsModalOpen(true), children: "Manage Sections" })] })] }), errorMessage && (_jsx("div", { className: "mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-900/60 dark:bg-red-950/40 dark:text-red-200", children: errorMessage })), _jsx(DataTable, { rows: rows, isLoading: isLoading, emptyLabel: "No sections found" })] }), _jsxs(Div, { className: "mt-4 space-y-3 rounded-xl border border-zinc-200 bg-white p-4 dark:border-slate-700 dark:bg-slate-900", children: [_jsxs(Div, { className: "flex items-center justify-between gap-3", children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-900 dark:text-zinc-100", children: "Reorder Sections" }), _jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: reindexDraft, disabled: reorderSections.isPending || reorderDraft.length === 0, children: "Reindex 1..N" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: undoReorderChange, disabled: reorderSections.isPending || !canUndoReorderChanges, children: "Undo unsaved" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: resetToServerOrder, disabled: reorderSections.isPending || !hasReorderChanges, children: "Reset to server" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: () => reorderSections.mutate(), disabled: !hasReorderChanges || reorderSections.isPending, children: reorderSections.isPending ? "Saving order..." : "Save order" })] })] }), reorderDraft.length === 0 ? (_jsx(Text, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "No sections to reorder." })) : (_jsx(Div, { className: "space-y-2", children: reorderDraft.map((item, index) => (_jsxs(Div, { className: "grid grid-cols-[auto_1fr_auto_auto_auto] items-center gap-2 rounded-md border border-zinc-200 p-2 dark:border-slate-700", draggable: true, onDragStart: () => setDragIndex(index), onDragOver: (event) => event.preventDefault(), onDrop: () => {
921
810
  if (dragIndex !== null) {
922
811
  moveItemToIndex(dragIndex, index);
923
812
  }
924
813
  setDragIndex(null);
925
- }, onDragEnd: () => setDragIndex(null), children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-500 dark:text-zinc-400", children: "\u2261" }), _jsxs(Text, { className: "text-sm text-zinc-800 dark:text-zinc-200", children: [item.type, " #", item.order] }), _jsx(Input, { type: "number", min: 1, max: reorderDraft.length, value: String(item.order), onChange: (event) => updateReorderItemOrder(index, Number(event.target.value) || 1), className: "w-24" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, -1), disabled: index === 0, children: "Up" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, 1), disabled: index === reorderDraft.length - 1, children: "Down" })] }, `reorder-${item.id}`))) }))] }), formMessage ? (_jsx(Alert, { variant: formMessage.includes("Failed") || formMessage.includes("must") ? "error" : "success", title: "Sections", children: formMessage })) : null, _jsx(Modal, { isOpen: isModalOpen, onClose: () => setIsModalOpen(false), title: "Manage Homepage Section", size: "lg", children: _jsxs(Form, { className: "space-y-4", onSubmit: (event) => {
814
+ }, onDragEnd: () => setDragIndex(null), children: [_jsx(Text, { className: "text-sm font-semibold text-zinc-500 dark:text-zinc-400", children: "\u2261" }), _jsxs(Text, { className: "text-sm text-zinc-800 dark:text-zinc-200", children: [item.type, " #", item.order] }), _jsx(Input, { type: "number", min: 1, max: reorderDraft.length, value: String(item.order), onChange: (event) => updateReorderItemOrder(index, Number(event.target.value) || 1), className: "w-24" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, -1), disabled: index === 0, children: "Up" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => moveReorderItem(index, 1), disabled: index === reorderDraft.length - 1, children: "Down" })] }, `reorder-${item.id}`))) }))] }), _jsx(ConfirmDeleteModal, { isOpen: seedResetOpen, onClose: () => setSeedResetOpen(false), onConfirm: () => resetSeed.mutate(), title: "Reset homepage sections seed data?", message: "This will reload the 19 default homepage sections from seed data. Any manual changes made in Firestore will be overwritten.", confirmText: "Reset seed", cancelText: "Cancel", isDeleting: resetSeed.isPending, variant: "danger" }), _jsx(Modal, { isOpen: isModalOpen, onClose: () => setIsModalOpen(false), title: "Manage Homepage Section", size: "lg", children: _jsxs(Form, { className: "space-y-4", onSubmit: (event) => {
926
815
  event.preventDefault();
927
816
  saveSection.mutate();
928
817
  }, children: [_jsx(Select, { label: "Mode", value: mode, onValueChange: (value) => setMode(value), options: [