@mohasinac/appkit 3.0.3 → 3.0.6

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 (402) hide show
  1. package/dist/_internal/client/features/filters/filter-load-options.js +11 -1
  2. package/dist/_internal/client/features/layout/filterNavItems.js +0 -1
  3. package/dist/_internal/client/features/layout/index.js +0 -1
  4. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +0 -1
  5. package/dist/_internal/client/features/maintenance/views/ServerErrorDetailView.js +0 -1
  6. package/dist/_internal/server/features/auctions/data.d.ts +2 -4
  7. package/dist/_internal/server/features/auctions/data.js +3 -9
  8. package/dist/_internal/server/features/checkout/actions.js +9 -9
  9. package/dist/_internal/server/features/classified/adapters.d.ts +2 -15
  10. package/dist/_internal/server/features/classified/adapters.js +2 -17
  11. package/dist/_internal/server/features/classified/data.d.ts +1 -6
  12. package/dist/_internal/server/features/classified/data.js +2 -10
  13. package/dist/_internal/server/features/digital-code/adapters.d.ts +2 -15
  14. package/dist/_internal/server/features/digital-code/adapters.js +2 -17
  15. package/dist/_internal/server/features/digital-code/data.d.ts +1 -6
  16. package/dist/_internal/server/features/digital-code/data.js +2 -10
  17. package/dist/_internal/server/features/live/adapters.d.ts +2 -15
  18. package/dist/_internal/server/features/live/adapters.js +2 -17
  19. package/dist/_internal/server/features/live/data.d.ts +1 -6
  20. package/dist/_internal/server/features/live/data.js +2 -10
  21. package/dist/_internal/server/features/pre-orders/data.d.ts +2 -4
  22. package/dist/_internal/server/features/pre-orders/data.js +3 -9
  23. package/dist/_internal/server/features/prize-draws/actions.d.ts +2 -0
  24. package/dist/_internal/server/features/prize-draws/actions.js +22 -0
  25. package/dist/_internal/server/features/prize-draws/data.d.ts +1 -17
  26. package/dist/_internal/server/features/prize-draws/data.js +2 -20
  27. package/dist/_internal/server/features/prize-draws/index.d.ts +3 -1
  28. package/dist/_internal/server/features/prize-draws/index.js +2 -0
  29. package/dist/_internal/server/features/prize-draws/service.d.ts +3 -0
  30. package/dist/_internal/server/features/prize-draws/service.js +19 -0
  31. package/dist/_internal/server/features/shared/listing-adapters.d.ts +19 -0
  32. package/dist/_internal/server/features/shared/listing-adapters.js +20 -0
  33. package/dist/_internal/server/features/shared/listing-data-factory.d.ts +9 -0
  34. package/dist/_internal/server/features/shared/listing-data-factory.js +33 -0
  35. package/dist/_internal/server/features/stores/data.d.ts +3 -14
  36. package/dist/_internal/server/features/stores/data.js +6 -44
  37. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +1 -1
  38. package/dist/_internal/shared/features/cart/schema.d.ts +8 -8
  39. package/dist/_internal/shared/features/cart/schema.js +3 -0
  40. package/dist/_internal/shared/listing-types/_registry.js +2 -0
  41. package/dist/_internal/shared/listing-types/action-tracker.js +1 -1
  42. package/dist/_internal/shared/listing-types/auction/schema.d.ts +3 -1
  43. package/dist/_internal/shared/listing-types/auction/schema.js +7 -1
  44. package/dist/_internal/shared/listing-types/classified/schema.d.ts +2 -1
  45. package/dist/_internal/shared/listing-types/classified/schema.js +3 -1
  46. package/dist/_internal/shared/listing-types/digital-code/schema.d.ts +3 -1
  47. package/dist/_internal/shared/listing-types/digital-code/schema.js +7 -1
  48. package/dist/_internal/shared/listing-types/live/schema.d.ts +2 -1
  49. package/dist/_internal/shared/listing-types/live/schema.js +3 -1
  50. package/dist/_internal/shared/listing-types/pre-order/schema.d.ts +3 -1
  51. package/dist/_internal/shared/listing-types/pre-order/schema.js +7 -1
  52. package/dist/_internal/shared/listing-types/prize-draw/schema.d.ts +3 -1
  53. package/dist/_internal/shared/listing-types/prize-draw/schema.js +13 -1
  54. package/dist/_internal/shared/listing-types/standard/schema.d.ts +2 -1
  55. package/dist/_internal/shared/listing-types/standard/schema.js +4 -1
  56. package/dist/_internal/shared/types/base-document.d.ts +15 -0
  57. package/dist/_internal/shared/types/base-document.js +1 -0
  58. package/dist/_internal/shared/types/index.d.ts +2 -0
  59. package/dist/_internal/shared/types/index.js +1 -0
  60. package/dist/client/api/ApiError.d.ts +10 -4
  61. package/dist/client/api/surface-error.js +0 -1
  62. package/dist/client.d.ts +8 -4
  63. package/dist/client.js +4 -2
  64. package/dist/constants/api-endpoints.d.ts +12 -0
  65. package/dist/constants/api-endpoints.js +4 -0
  66. package/dist/core/hooks/useSyncManager.js +4 -4
  67. package/dist/features/_guide-cls.d.ts +1 -1
  68. package/dist/features/_guide-cls.js +1 -1
  69. package/dist/features/about/components/AboutView.js +1 -4
  70. package/dist/features/about/components/FAQPageView.js +1 -1
  71. package/dist/features/about/components/FeesView.js +1 -1
  72. package/dist/features/about/components/HelpPageView.js +1 -1
  73. package/dist/features/about/components/HowOrdersWorkView.js +1 -1
  74. package/dist/features/about/components/PublicProfileView.js +6 -6
  75. package/dist/features/about/components/TrackOrderView.js +1 -1
  76. package/dist/features/account/components/AddressBook.js +1 -1
  77. package/dist/features/account/components/AddressForm.js +10 -2
  78. package/dist/features/account/components/AddressesIndexListing.js +1 -1
  79. package/dist/features/account/components/BuyerAccountGuideView.js +1 -1
  80. package/dist/features/account/components/BuyerAuctionsGuideView.js +1 -1
  81. package/dist/features/account/components/BuyerOrdersGuideView.js +1 -1
  82. package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
  83. package/dist/features/account/components/ChatWindow.js +1 -1
  84. package/dist/features/account/components/MessagesView.js +1 -1
  85. package/dist/features/account/components/NotificationBell.js +25 -10
  86. package/dist/features/account/components/NotificationPreferencesPanel.js +2 -2
  87. package/dist/features/account/components/UserOffersPanel.js +1 -0
  88. package/dist/features/account/components/UserSidebar.js +1 -6
  89. package/dist/features/account/components/UserSupportView.js +1 -1
  90. package/dist/features/addresses/schemas/firestore.d.ts +2 -4
  91. package/dist/features/admin/components/AdminAnalyticsGuideView.js +2 -2
  92. package/dist/features/admin/components/AdminBlogEditorView.js +1 -1
  93. package/dist/features/admin/components/AdminBundlesView.js +1 -1
  94. package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
  95. package/dist/features/admin/components/AdminCatalogGuideView.js +2 -2
  96. package/dist/features/admin/components/AdminContentGuideView.js +2 -2
  97. package/dist/features/admin/components/AdminEmployeeEditorView.js +2 -2
  98. package/dist/features/admin/components/AdminFulfillmentView.d.ts +6 -0
  99. package/dist/features/admin/components/AdminFulfillmentView.js +107 -0
  100. package/dist/features/admin/components/AdminGuideHubView.js +1 -5
  101. package/dist/features/admin/components/AdminMediaView.js +1 -1
  102. package/dist/features/admin/components/AdminNavigationView.js +1 -1
  103. package/dist/features/admin/components/AdminOrdersGuideView.js +3 -3
  104. package/dist/features/admin/components/AdminPayoutsView.js +1 -4
  105. package/dist/features/admin/components/AdminProductEditorView.js +21 -9
  106. package/dist/features/admin/components/AdminProductsView.js +3 -0
  107. package/dist/features/admin/components/AdminSidebar.js +1 -6
  108. package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
  109. package/dist/features/admin/components/AdminSiteSettingsView.js +9 -1
  110. package/dist/features/admin/components/AdminStoreEditorView.js +1 -1
  111. package/dist/features/admin/components/AdminStoresGuideView.js +2 -2
  112. package/dist/features/admin/components/AdminSupportTicketDetailView.js +7 -7
  113. package/dist/features/admin/components/AdminTeamGuideView.js +2 -2
  114. package/dist/features/admin/components/AdminTrustGuideView.js +3 -3
  115. package/dist/features/admin/components/AdminUsersGuideView.js +3 -3
  116. package/dist/features/admin/components/DashboardStats.js +6 -5
  117. package/dist/features/admin/components/DataListingView.d.ts +1 -0
  118. package/dist/features/admin/components/DataTable.js +2 -2
  119. package/dist/features/admin/components/analytics/AdminAnalyticsCharts.js +4 -6
  120. package/dist/features/admin/components/analytics/AdminStatCard.js +4 -3
  121. package/dist/features/admin/components/analytics/AdminTopProductsTable.js +1 -1
  122. package/dist/features/admin/components/index.d.ts +2 -0
  123. package/dist/features/admin/components/index.js +1 -0
  124. package/dist/features/admin/schemas/firestore.d.ts +3 -8
  125. package/dist/features/auctions/components/AuctionBidsTable.js +1 -1
  126. package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
  127. package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -3
  128. package/dist/features/auctions/schemas/firestore.d.ts +2 -4
  129. package/dist/features/auctions/schemas/index.d.ts +2 -2
  130. package/dist/features/auth/components/ForgotPasswordView.js +19 -8
  131. package/dist/features/auth/components/LoginForm.js +10 -2
  132. package/dist/features/auth/components/RegisterForm.js +10 -2
  133. package/dist/features/auth/components/ResetPasswordView.js +19 -8
  134. package/dist/features/auth/components/SocialAuthButtons.js +1 -1
  135. package/dist/features/before-after/components/BeforeAfterSlider.js +1 -1
  136. package/dist/features/before-after/schemas/index.d.ts +2 -2
  137. package/dist/features/blog/api/[slug]/route.js +1 -1
  138. package/dist/features/blog/components/BlogFeaturedCard.js +1 -1
  139. package/dist/features/blog/components/BlogListView.js +1 -1
  140. package/dist/features/blog/components/BlogPostView.js +1 -1
  141. package/dist/features/blog/schemas/firestore.d.ts +2 -4
  142. package/dist/features/blog/schemas/index.d.ts +6 -6
  143. package/dist/features/cart/components/CartDrawer.js +2 -2
  144. package/dist/features/cart/components/CartView.js +1 -1
  145. package/dist/features/cart/components/CheckoutView.js +1 -1
  146. package/dist/features/cart/schemas/firestore.d.ts +2 -4
  147. package/dist/features/categories/components/BrandDetailPageView.js +2 -1
  148. package/dist/features/categories/components/BundleDetailView.js +1 -1
  149. package/dist/features/categories/components/BundleItemsPicker.js +1 -1
  150. package/dist/features/categories/components/CategoryBundlesListing.js +3 -1
  151. package/dist/features/categories/components/CategoryDetailPageView.js +1 -1
  152. package/dist/features/categories/components/CategoryGrid.js +2 -1
  153. package/dist/features/categories/components/CategoryTableColumns.js +5 -2
  154. package/dist/features/categories/components/CategoryTree.js +3 -2
  155. package/dist/features/categories/components/ConcernCard.js +1 -1
  156. package/dist/features/categories/schemas/firestore.d.ts +2 -4
  157. package/dist/features/categories/schemas/index.d.ts +6 -6
  158. package/dist/features/checkout/components/CheckoutStepper.js +1 -1
  159. package/dist/features/collections/components/CollectionCard.js +1 -1
  160. package/dist/features/contact/components/ContactPageView.js +27 -27
  161. package/dist/features/contact/email.js +4 -4
  162. package/dist/features/copilot/components/AdminCopilotView.js +3 -3
  163. package/dist/features/email/primitives.d.ts +4 -0
  164. package/dist/features/email/primitives.js +4 -0
  165. package/dist/features/events/components/EventCard.js +2 -2
  166. package/dist/features/events/components/EventOfferCard.js +1 -1
  167. package/dist/features/events/components/EventRaffleEntryForm.js +1 -1
  168. package/dist/features/events/components/EventRaffleWinnerView.js +2 -2
  169. package/dist/features/events/components/EventSaleBanner.js +0 -1
  170. package/dist/features/events/schemas/firestore.d.ts +2 -4
  171. package/dist/features/events/schemas/index.d.ts +4 -4
  172. package/dist/features/faq/components/ContactCTA.js +1 -1
  173. package/dist/features/faq/components/FAQAccordion.js +2 -2
  174. package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
  175. package/dist/features/faq/components/FAQHelpfulButtons.js +2 -2
  176. package/dist/features/faq/components/RelatedFAQs.js +1 -1
  177. package/dist/features/faq/schemas/firestore.d.ts +2 -4
  178. package/dist/features/faq/schemas/index.d.ts +4 -4
  179. package/dist/features/filters/AsyncFacetSection.js +3 -3
  180. package/dist/features/filters/FilterFacetSection.js +6 -6
  181. package/dist/features/filters/RangeFilter.js +2 -2
  182. package/dist/features/filters/SwitchFilter.js +1 -1
  183. package/dist/features/forms/Checkbox.js +1 -1
  184. package/dist/features/forms/Slider.js +7 -2
  185. package/dist/features/forms/utils.d.ts +2 -2
  186. package/dist/features/forms/utils.js +2 -2
  187. package/dist/features/grouped/schemas/index.d.ts +2 -2
  188. package/dist/features/history/hooks/useHistory.js +1 -1
  189. package/dist/features/homepage/components/AdSlot.js +3 -3
  190. package/dist/features/homepage/components/AdvertisementBanner.js +5 -4
  191. package/dist/features/homepage/components/BeforeAfterCard.js +9 -1
  192. package/dist/features/homepage/components/CharacterHotspot.js +42 -49
  193. package/dist/features/homepage/components/CharacterHotspotForm.js +18 -20
  194. package/dist/features/homepage/components/CollectionCardsSection.js +2 -2
  195. package/dist/features/homepage/components/CustomCardsSection.js +3 -6
  196. package/dist/features/homepage/components/CustomerReviewsSection.js +1 -1
  197. package/dist/features/homepage/components/FAQSection.js +2 -2
  198. package/dist/features/homepage/components/FeaturedResultsSection.js +1 -1
  199. package/dist/features/homepage/components/GoogleReviewsSection.js +4 -4
  200. package/dist/features/homepage/components/HeroBanner.js +12 -63
  201. package/dist/features/homepage/components/HeroCarousel.js +6 -6
  202. package/dist/features/homepage/components/HeroSection.js +1 -1
  203. package/dist/features/homepage/components/HowItWorksInfoView.js +1 -1
  204. package/dist/features/homepage/components/HowItWorksSection.js +5 -3
  205. package/dist/features/homepage/components/NewsletterBanner.js +3 -7
  206. package/dist/features/homepage/components/PromoGrid.js +2 -26
  207. package/dist/features/homepage/components/SectionCarousel.js +1 -1
  208. package/dist/features/homepage/components/SecurityHighlightsSection.js +6 -3
  209. package/dist/features/homepage/components/ShopByCategorySection.js +3 -3
  210. package/dist/features/homepage/components/SiteFeaturesSection.js +1 -1
  211. package/dist/features/homepage/components/SocialPostCard.js +2 -3
  212. package/dist/features/homepage/components/StatsCounterSection.js +6 -3
  213. package/dist/features/homepage/components/TestimonialsCarousel.js +2 -25
  214. package/dist/features/homepage/components/TrustBadges.js +1 -9
  215. package/dist/features/homepage/components/TrustFeaturesSection.js +6 -3
  216. package/dist/features/homepage/components/TrustIndicatorsSection.js +1 -1
  217. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  218. package/dist/features/homepage/components/WhatsAppCommunitySection.js +1 -1
  219. package/dist/features/homepage/lib/franchise-colors.d.ts +7 -0
  220. package/dist/features/homepage/lib/franchise-colors.js +7 -0
  221. package/dist/features/homepage/lib/live-stats.js +5 -5
  222. package/dist/features/homepage/schemas/firestore.d.ts +4 -12
  223. package/dist/features/homepage/schemas/index.d.ts +2 -2
  224. package/dist/features/layout/AppLayoutShell.js +7 -9
  225. package/dist/features/layout/BottomNavbar.js +1 -2
  226. package/dist/features/messages/hooks/useConversation.js +2 -1
  227. package/dist/features/messages/hooks/useConversations.js +1 -0
  228. package/dist/features/messages/schemas/firestore.d.ts +2 -4
  229. package/dist/features/messages/schemas/index.d.ts +2 -2
  230. package/dist/features/orders/components/OrdersList.js +1 -1
  231. package/dist/features/orders/components/RefundHistoryTable.d.ts +6 -0
  232. package/dist/features/orders/components/RefundHistoryTable.js +3 -2
  233. package/dist/features/orders/repository/orders.repository.d.ts +5 -0
  234. package/dist/features/orders/repository/orders.repository.js +26 -0
  235. package/dist/features/orders/schemas/firestore.d.ts +9 -5
  236. package/dist/features/orders/schemas/firestore.js +3 -0
  237. package/dist/features/payments/schemas/firestore.d.ts +2 -4
  238. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +2 -2
  239. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
  240. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -1
  241. package/dist/features/pre-orders/schemas/index.d.ts +2 -2
  242. package/dist/features/products/components/CompareOverlay.js +11 -8
  243. package/dist/features/products/components/CustomSectionTabContent.js +1 -1
  244. package/dist/features/products/components/FeatureBadge.js +11 -1
  245. package/dist/features/products/components/GroupSettingsPanel.js +2 -2
  246. package/dist/features/products/components/MarketplaceBundleCard.js +1 -1
  247. package/dist/features/products/components/MarketplacePrizeDrawCard.js +2 -2
  248. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  249. package/dist/features/products/components/PrizeDrawsIndexListing.js +1 -1
  250. package/dist/features/products/components/ProductCardMetadataSection.js +0 -1
  251. package/dist/features/products/components/ProductDetailPageView.js +1 -1
  252. package/dist/features/products/components/ProductFeatureBadges.js +1 -1
  253. package/dist/features/products/components/ProductGalleryClient.js +1 -1
  254. package/dist/features/products/components/ProductGrid.js +7 -7
  255. package/dist/features/products/components/ShareButton.js +1 -1
  256. package/dist/features/products/components/ShowGroupSection.js +7 -5
  257. package/dist/features/products/components/SublistingCarouselSection.js +2 -2
  258. package/dist/features/products/constants/action-defs.d.ts +16 -0
  259. package/dist/features/products/constants/action-defs.js +16 -0
  260. package/dist/features/products/constants/listing-tabs.d.ts +48 -0
  261. package/dist/features/products/constants/listing-tabs.js +12 -0
  262. package/dist/features/products/repository/products.repository.d.ts +37 -0
  263. package/dist/features/products/repository/products.repository.js +28 -1
  264. package/dist/features/products/schemas/firestore.d.ts +8 -6
  265. package/dist/features/products/schemas/firestore.js +2 -0
  266. package/dist/features/products/schemas/index.d.ts +8 -8
  267. package/dist/features/products/types/index.d.ts +2 -0
  268. package/dist/features/promotions/components/CouponCard.js +2 -2
  269. package/dist/features/promotions/schemas/firestore.d.ts +2 -4
  270. package/dist/features/promotions/schemas/index.d.ts +6 -6
  271. package/dist/features/reviews/components/ReviewDetailShell.js +3 -3
  272. package/dist/features/reviews/components/ReviewModal.js +2 -4
  273. package/dist/features/reviews/components/ReviewSummary.js +3 -2
  274. package/dist/features/reviews/components/ReviewsList.js +1 -1
  275. package/dist/features/reviews/schemas/firestore.d.ts +2 -4
  276. package/dist/features/reviews/schemas/index.d.ts +2 -2
  277. package/dist/features/scams/actions/scam-actions.js +1 -1
  278. package/dist/features/scams/components/ScamProfileView.js +1 -1
  279. package/dist/features/scams/schemas/firestore.d.ts +2 -4
  280. package/dist/features/scams/schemas/index.d.ts +4 -4
  281. package/dist/features/search/components/Search.js +2 -2
  282. package/dist/features/search/components/SearchFiltersRow.js +1 -1
  283. package/dist/features/search/schemas/index.d.ts +3 -3
  284. package/dist/features/seller/components/BarcodeField.d.ts +17 -0
  285. package/dist/features/seller/components/BarcodeField.js +30 -0
  286. package/dist/features/seller/components/FulfillmentView.d.ts +5 -0
  287. package/dist/features/seller/components/FulfillmentView.js +120 -0
  288. package/dist/features/seller/components/PhysicalLocationModal.js +2 -3
  289. package/dist/features/seller/components/PrintCenterView.d.ts +3 -1
  290. package/dist/features/seller/components/PrintCenterView.js +52 -4
  291. package/dist/features/seller/components/SellerAddressesView.js +2 -1
  292. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +1 -1
  293. package/dist/features/seller/components/SellerBidsView.js +1 -1
  294. package/dist/features/seller/components/SellerCouponEditorView.js +1 -1
  295. package/dist/features/seller/components/SellerGoogleReviewsView.js +1 -1
  296. package/dist/features/seller/components/SellerLiveView.js +1 -1
  297. package/dist/features/seller/components/SellerOffersPanel.js +1 -0
  298. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  299. package/dist/features/seller/components/SellerPayoutMethodsView.js +8 -2
  300. package/dist/features/seller/components/SellerPayoutRequestView.js +1 -1
  301. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  302. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  303. package/dist/features/seller/components/SellerProductShell.js +4 -3
  304. package/dist/features/seller/components/SellerProductsCards.js +1 -1
  305. package/dist/features/seller/components/SellerProductsView.js +1 -1
  306. package/dist/features/seller/components/SellerReviewsView.js +2 -1
  307. package/dist/features/seller/components/SellerShippingConfigsView.js +9 -3
  308. package/dist/features/seller/components/SellerShippingView.js +1 -1
  309. package/dist/features/seller/components/SellerSidebar.js +3 -8
  310. package/dist/features/seller/components/SellerStoreCategoriesView.js +11 -3
  311. package/dist/features/seller/components/SellerTemplatesView.js +8 -2
  312. package/dist/features/seller/components/analytics/SellerRevenueChart.js +1 -1
  313. package/dist/features/seller/components/analytics/SellerTopProducts.js +1 -1
  314. package/dist/features/seller/components/index.d.ts +4 -0
  315. package/dist/features/seller/components/index.js +2 -0
  316. package/dist/features/seller/schemas/index.d.ts +4 -4
  317. package/dist/features/shell/FormShell.js +2 -2
  318. package/dist/features/shell/QuickFormDrawer.js +1 -1
  319. package/dist/features/site-settings/components/NavPermissionsManager.js +1 -1
  320. package/dist/features/store-extensions/schemas/firestore.d.ts +12 -44
  321. package/dist/features/stores/components/StoreCapabilitiesGuideView.js +1 -1
  322. package/dist/features/stores/components/StoreClassifiedsListing.d.ts +5 -0
  323. package/dist/features/stores/components/StoreClassifiedsListing.js +48 -0
  324. package/dist/features/stores/components/StoreClassifiedsPageView.d.ts +4 -0
  325. package/dist/features/stores/components/StoreClassifiedsPageView.js +20 -0
  326. package/dist/features/stores/components/StoreDetailLayoutView.js +23 -2
  327. package/dist/features/stores/components/StoreDigitalCodesListing.d.ts +5 -0
  328. package/dist/features/stores/components/StoreDigitalCodesListing.js +48 -0
  329. package/dist/features/stores/components/StoreDigitalCodesPageView.d.ts +4 -0
  330. package/dist/features/stores/components/StoreDigitalCodesPageView.js +20 -0
  331. package/dist/features/stores/components/StoreGuideHubView.js +2 -9
  332. package/dist/features/stores/components/StoreHeader.js +1 -1
  333. package/dist/features/stores/components/StoreListingsGuideView.js +4 -4
  334. package/dist/features/stores/components/StoreLiveItemsListing.d.ts +5 -0
  335. package/dist/features/stores/components/StoreLiveItemsListing.js +48 -0
  336. package/dist/features/stores/components/StoreLiveItemsPageView.d.ts +4 -0
  337. package/dist/features/stores/components/StoreLiveItemsPageView.js +20 -0
  338. package/dist/features/stores/components/StoreOrdersGuideView.js +2 -2
  339. package/dist/features/stores/components/StoresIndexListing.js +1 -1
  340. package/dist/features/stores/components/index.d.ts +9 -0
  341. package/dist/features/stores/components/index.js +3 -0
  342. package/dist/features/stores/schemas/firestore.d.ts +2 -4
  343. package/dist/features/stores/schemas/index.d.ts +4 -4
  344. package/dist/features/support/schemas/firestore.d.ts +2 -4
  345. package/dist/features/support/schemas/index.d.ts +2 -2
  346. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +2 -2
  347. package/dist/features/wishlist/components/WishlistPage.js +1 -1
  348. package/dist/features/wishlist/components/WishlistToggleButton.js +3 -3
  349. package/dist/features/wishlist/hooks/useWishlistCount.js +1 -1
  350. package/dist/http/ApiClient.d.ts +1 -0
  351. package/dist/http/ApiClient.js +20 -0
  352. package/dist/monitoring/error-tracking.d.ts +0 -3
  353. package/dist/monitoring/error-tracking.js +1 -1
  354. package/dist/monitoring/server-logger.js +3 -3
  355. package/dist/next/components/GlobalError.js +1 -1
  356. package/dist/next/routing/route-map.d.ts +11 -0
  357. package/dist/next/routing/route-map.js +5 -0
  358. package/dist/react/ErrorBoundary.js +1 -1
  359. package/dist/schemas/registry.d.ts +24 -24
  360. package/dist/seed/grouped-listings-seed-data.d.ts +2 -1
  361. package/dist/seed/products-preorders-seed-data.d.ts +2 -1
  362. package/dist/seed/products-standard-seed-data.js +8 -0
  363. package/dist/server-entry.d.ts +3 -0
  364. package/dist/server-entry.js +3 -0
  365. package/dist/server.d.ts +4 -4
  366. package/dist/styles.css +45 -7
  367. package/dist/tailwind-utilities.css +1 -1
  368. package/dist/tokens/themes/default-light.js +3 -0
  369. package/dist/tokens/tokens.css +43 -6
  370. package/dist/ui/components/Anchor.d.ts +8 -1
  371. package/dist/ui/components/Anchor.js +16 -2
  372. package/dist/ui/components/Button.d.ts +5 -2
  373. package/dist/ui/components/Button.js +5 -2
  374. package/dist/ui/components/Details.d.ts +33 -2
  375. package/dist/ui/components/Details.js +73 -4
  376. package/dist/ui/components/Div.d.ts +3 -0
  377. package/dist/ui/components/Div.js +12 -1
  378. package/dist/ui/components/DynamicBgDiv.d.ts +13 -0
  379. package/dist/ui/components/DynamicBgDiv.js +18 -0
  380. package/dist/ui/components/Form.d.ts +3 -19
  381. package/dist/ui/components/Form.js +8 -1
  382. package/dist/ui/components/Layout.d.ts +12 -1
  383. package/dist/ui/components/Layout.js +9 -1
  384. package/dist/ui/components/Progress.d.ts +1 -1
  385. package/dist/ui/components/Progress.js +1 -0
  386. package/dist/ui/components/Progress.style.css +1 -0
  387. package/dist/ui/components/ProgressBarFill.d.ts +6 -0
  388. package/dist/ui/components/ProgressBarFill.js +11 -0
  389. package/dist/ui/components/Semantic.d.ts +26 -7
  390. package/dist/ui/components/Semantic.js +33 -8
  391. package/dist/ui/components/TextLink.d.ts +36 -1
  392. package/dist/ui/components/TextLink.js +30 -2
  393. package/dist/ui/components/Typography.d.ts +26 -6
  394. package/dist/ui/components/Typography.js +37 -13
  395. package/dist/ui/components/VacationBanner.js +0 -1
  396. package/dist/ui/components/surface-tokens.d.ts +12 -2
  397. package/dist/ui/components/surface-tokens.js +19 -1
  398. package/dist/ui/rich-text/RichText.js +1 -1
  399. package/dist/utils/id-generators.d.ts +8 -0
  400. package/dist/utils/id-generators.js +14 -0
  401. package/dist/validation/schemas.d.ts +1 -1
  402. package/package.json +2 -1
@@ -68,7 +68,7 @@ function renderFeeTableSection(t, themed, rows) {
68
68
  return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-6", children: t("tableTitle") }), _jsx(Div, { className: `${__O.xAuto}`, border: "default", rounded: "xl", children: _jsxs(Table, { size: "sm", children: [_jsx(Thead, { className: themed.bgSecondary, children: _jsxs(Tr, { children: [_jsx(Th, { className: "text-left", padding: "md", weight: "semibold", children: t("colFeeType") }), _jsx(Th, { className: "text-left", padding: "md", weight: "semibold", children: t("colRate") }), _jsx(Th, { className: "text-left", padding: "md", weight: "semibold", children: t("colPaidBy") }), _jsx(Th, { className: "text-left hidden md:table-cell", padding: "md", weight: "semibold", children: t("colNote") })] }) }), _jsx(Tbody, { className: "divide-y divide-neutral-100 dark:divide-neutral-800", children: rows.map((row) => (_jsxs(Tr, { className: `${themed.bgPrimary} hover:bg-neutral-50 dark:hover:bg-neutral-800/50`, children: [_jsx(Td, { weight: "medium", padding: "md", children: row.category }), _jsx(Td, { className: CLS_RATE_CELL, children: row.rate }), _jsx(Td, { padding: "md", children: _jsx(Caption, { children: row.who }) }), _jsx(Td, { className: "text-neutral-500 dark:text-neutral-400 hidden md:table-cell", padding: "md", size: "xs", children: row.note })] }, row.category))) })] }) }), _jsx(Caption, { className: "mt-3 block", color: "muted", children: t("tableNote") })] }));
69
69
  }
70
70
  function renderPayoutExampleSection(t, themed, rows) {
71
- return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-3", children: t("payoutExampleTitle") }), _jsx(Text, { variant: "secondary", className: "mb-6", children: t("payoutExampleSubtitle") }), _jsxs(Div, { className: `${__P.p5} max-w-sm`, border: "default", surface: "muted", rounded: "xl", children: [_jsx(Heading, { level: 3, className: "mb-4", size: "base", children: t("payoutExampleProduct") }), _jsx(Stack, { gap: "sm", children: rows.map((row, i) => (_jsxs(Row, { textWeight: "bold", textSize: "sm", className: `${row.highlight ? "border-t border-neutral-200 dark:border-neutral-700 pt-2 mt-2 " : ""}`, justify: "between", children: [_jsx(Text, { className: row.highlight ? "font-bold" : "text-neutral-600 dark:text-neutral-400", children: row.label }), _jsx(Text, { className: row.highlight ? CLS_HIGHLIGHT : "", children: row.example })] }, i))) })] })] }));
71
+ return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-3", children: t("payoutExampleTitle") }), _jsx(Text, { variant: "secondary", className: "mb-6", children: t("payoutExampleSubtitle") }), _jsxs(Div, { className: `${__P.p5} max-w-sm`, border: "default", surface: "muted", rounded: "xl", children: [_jsx(Heading, { level: 3, className: "mb-4", size: "base", children: t("payoutExampleProduct") }), _jsx(Stack, { gap: "sm", children: rows.map((row, i) => (_jsxs(Row, { textWeight: "bold", textSize: "sm", className: `${row.highlight ? "border-t border-neutral-200 dark:border-neutral-700 mt-2" : ""}`, paddingY: row.highlight ? "t-xs" : undefined, justify: "between", children: [_jsx(Text, { className: row.highlight ? "font-bold" : "text-neutral-600 dark:text-neutral-400", children: row.label }), _jsx(Text, { className: row.highlight ? CLS_HIGHLIGHT : "", children: row.example })] }, i))) })] })] }));
72
72
  }
73
73
  function renderDisclaimerSection(t, themed) {
74
74
  return (_jsxs(Section, { className: `${__P.p5}`, border: "default", surface: "subtle", rounded: "xl", children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", children: t("disclaimerTitle") }), _jsx(Caption, { className: "leading-relaxed", children: t("disclaimerText") })] }));
@@ -67,7 +67,7 @@ export async function HelpPageView({} = {}) {
67
67
  return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [_jsx(Section, { color: "inverse", tone: "accent-banner", padding: "banner", children: _jsxs(Div, { className: `${page.container.md} text-center`, children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-4", children: t("title") }), _jsx(Text, { color: "inverse", variant: "none", className: "/80 max-w-2xl mx-auto", children: t("subtitle") })] }) }), _jsxs(Stack, { gap: "14", className: `${page.container.md}`, padding: "content-banner", children: [renderTopicsGrid(t, flex, TOPICS), renderScamAwarenessAlert(t), renderTrackOrderSection(t), renderContactCtaSection(t)] })] }));
68
68
  }
69
69
  function renderTopicsGrid(t, flex, topics) {
70
- return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-6", align: "center", children: t("browseTopics") }), _jsx(Div, { layout: "grid", gap: "4", className: "sm:grid-cols-2 lg:grid-cols-3", children: topics.map(({ icon: Icon, title, desc, href, color, iconColor }) => (_jsxs(TextLink, { rounded: "xl", href: href, className: `group border p-5 transition-shadow hover:shadow-md ${color} no-underline`, children: [_jsx(Row, { align: "center", justify: "center", className: `w-10 h-10 mb-3`, surface: "default", rounded: "lg", children: _jsx(Icon, { className: `w-5 h-5 ${iconColor}` }) }), _jsxs(Div, { layout: "flex", justify: "between", align: "start", className: flex.row, children: [_jsxs(Div, { children: [_jsx(Text, { className: "mb-1", weight: "semibold", children: title }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "sm", children: desc })] }), _jsx(ChevronRight, { className: "w-4 h-4 mt-1 flex-shrink-0 opacity-40 group-hover:opacity-80 transition-opacity" })] })] }, href))) })] }));
70
+ return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-6", align: "center", children: t("browseTopics") }), _jsx(Div, { layout: "grid", gap: "4", className: "sm:grid-cols-2 lg:grid-cols-3", children: topics.map(({ icon: Icon, title, desc, href, color, iconColor }) => (_jsxs(TextLink, { rounded: "xl", href: href, shadow: "hover-md", className: `group border p-[1.25rem] transition ${color} no-underline`, children: [_jsx(Row, { align: "center", justify: "center", className: `w-10 h-10 mb-3`, surface: "default", rounded: "lg", children: _jsx(Icon, { className: `w-5 h-5 ${iconColor}` }) }), _jsxs(Div, { layout: "flex", justify: "between", align: "start", className: flex.row, children: [_jsxs(Div, { children: [_jsx(Text, { className: "mb-1", weight: "semibold", children: title }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "sm", children: desc })] }), _jsx(ChevronRight, { className: "w-4 h-4 mt-1 flex-shrink-0 opacity-40 group-hover:opacity-80 transition-opacity" })] })] }, href))) })] }));
71
71
  }
72
72
  function renderScamAwarenessAlert(t) {
73
73
  return (_jsxs(Alert, { variant: "warning", title: t("scamAwarenessTitle"), children: [t("scamAwarenessText"), " ", _jsx(TextLink, { href: String(ROUTES.PUBLIC.SCAMS), className: "underline", weight: "semibold", children: t("scamAwarenessCta") })] }));
@@ -134,7 +134,7 @@ export async function HowOrdersWorkView({} = {}) {
134
134
  return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [_jsx(Section, { color: "inverse", tone: "accent-banner", padding: "banner", children: _jsxs(Div, { className: `${page.container.md} text-center`, children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-4", children: t("title") }), _jsx(Text, { color: "inverse", variant: "none", className: "/80 max-w-2xl mx-auto", children: t("subtitle") })] }) }), _jsxs(Stack, { gap: "14", className: `${page.container.md}`, padding: "content-banner", children: [renderOrderStatusesSection(t, ORDER_STATUSES), _jsx(Section, { children: _jsx(FlowDiagram, { title: `📦 ${t("diagramTitle")}`, titleClass: "text-primary", connectorClass: "bg-primary/20 dark:bg-primary/30", steps: DIAGRAM_STEPS, centered: true }) }), renderOrderInfoCardsSection(INFO_CARDS), renderOrdersCtaSection(t)] })] }));
135
135
  }
136
136
  function renderOrderStatusesSection(t, statuses) {
137
- return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-6", children: t("statusesTitle") }), _jsx(Stack, { gap: "3", children: statuses.map(({ status, icon, badge, desc }) => (_jsxs(Row, { className: `${__P.p4}`, border: "default", surface: "muted", align: "start", gap: "md", rounded: "xl", children: [_jsxs(Row, { align: "center", gap: "sm", className: "flex-shrink-0 pt-0.5", children: [_jsx(Span, { size: "xl", children: icon }), _jsx(Span, { size: "xs", weight: "semibold", className: `${badge}`, rounded: "full", padding: "pill-xs", children: status })] }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "sm", children: desc })] }, status))) })] }));
137
+ return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-6", children: t("statusesTitle") }), _jsx(Stack, { gap: "3", children: statuses.map(({ status, icon, badge, desc }) => (_jsxs(Row, { className: `${__P.p4}`, border: "default", surface: "muted", align: "start", gap: "md", rounded: "xl", children: [_jsxs(Row, { align: "center", gap: "sm", className: "flex-shrink-0 pt-[0.125rem]", children: [_jsx(Span, { size: "xl", children: icon }), _jsx(Span, { size: "xs", weight: "semibold", className: `${badge}`, rounded: "full", padding: "pill-xs", children: status })] }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "sm", children: desc })] }, status))) })] }));
138
138
  }
139
139
  function renderOrderInfoCardsSection(cards) {
140
140
  return (_jsx(Section, { children: _jsx(Div, { layout: "grid", gap: "5", className: "md:grid-cols-2", children: cards.map(({ icon: Icon, title, text, color, iconColor }) => (_jsxs(Div, { className: `border ${__P.p5} ${color}`, rounded: "xl", children: [_jsx(Row, { align: "center", justify: "center", className: `w-10 h-10 mb-3`, surface: "default", rounded: "lg", children: _jsx(Icon, { className: `w-5 h-5 ${iconColor}` }) }), _jsx(Text, { className: "mb-1", weight: "semibold", children: title }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "sm", children: text })] }, title))) }) }));
@@ -92,7 +92,7 @@ export async function PublicProfileView({ userId, }) {
92
92
  const storeDescription = store?.storeDescription ?? pub?.storeDescription;
93
93
  const profileHeroCtx = { displayName, photoURL, memberSince, isSeller, storeSlug, flex, page };
94
94
  const statItems = buildProfileStatItems(t, { listingCount, reviewCount, itemsSold, auctionsWon, totalOrders, isSeller });
95
- return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [renderProfileHero(t, profileHeroCtx), _jsxs(Stack, { gap: "2xl", className: `${page.container.md} md:py-12`, padding: "y-2xl", children: [renderProfileStatsRow(flex, statItems), renderProfileBioSection(pub), renderStoreDescriptionSection(isSeller, storeSlug ?? null, storeDescription ?? null, storeName, t), renderProfileListingsSection(t, products, storeSlug ?? null), renderAuthoredReviewsSection(t, reviewsAuthored, displayName), isSeller && storeSlug && renderProfileReviewsSection(t, reviewsReceived, storeSlug), _jsx(Row, { justify: "center", padding: "t-xs", children: _jsxs(Link, { href: String(ROUTES.HOME), className: "text-sm text-zinc-400 dark:text-zinc-400 hover:text-neutral-600 dark:hover:text-zinc-300", children: ["\u2190 ", t("backHome")] }) })] })] }));
95
+ return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [renderProfileHero(t, profileHeroCtx), _jsxs(Stack, { gap: "2xl", className: `${page.container.md}`, paddingY: "y-3xl", children: [renderProfileStatsRow(flex, statItems), renderProfileBioSection(pub), renderStoreDescriptionSection(isSeller, storeSlug ?? null, storeDescription ?? null, storeName, t), renderProfileListingsSection(t, products, storeSlug ?? null), renderAuthoredReviewsSection(t, reviewsAuthored, displayName), isSeller && storeSlug && renderProfileReviewsSection(t, reviewsReceived, storeSlug), _jsx(Row, { justify: "center", padding: "t-xs", children: _jsxs(Link, { href: String(ROUTES.HOME), className: "text-sm text-zinc-400 dark:text-zinc-400 hover:text-neutral-600 dark:hover:text-zinc-300", children: ["\u2190 ", t("backHome")] }) })] })] }));
96
96
  }
97
97
  function buildProfileStatItems(t, ctx) {
98
98
  const { listingCount, reviewCount, itemsSold, auctionsWon, totalOrders, isSeller } = ctx;
@@ -112,7 +112,7 @@ function buildProfileStatItems(t, ctx) {
112
112
  }
113
113
  function renderProfileHero(t, ctx) {
114
114
  const { displayName, photoURL, memberSince, isSeller, storeSlug, flex, page } = ctx;
115
- return (_jsx(Section, { color: "inverse", tone: "accent-banner", className: "md:py-14", padding: "y-2xl", children: _jsx(Div, { className: `${page.container.md}`, children: _jsxs(Stack, { direction: "sm-row", className: "flex-wrap sm:items-end", align: "center", gap: "md", children: [_jsx(Row, { align: "center", justify: "center", className: `w-20 h-20 flex-shrink-0 ${__O.hidden}`, surface: "default", rounded: "full", children: photoURL ? _jsx(MediaImage, { src: photoURL, alt: displayName, size: "avatar", fallback: "\uD83D\uDC64" }) : _jsx(User, { className: "w-10 h-10 text-white/60" }) }), _jsxs(Stack, { gap: "xs", className: "text-center sm:text-left", children: [_jsxs(Row, { className: "sm:justify-start", justify: "center", gap: "xs", wrap: true, children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-0", children: displayName }), isSeller && _jsx(Span, { color: "inverse", size: "xs", weight: "semibold", className: "bg-white/20", padding: "pill-sm", rounded: "full", children: t("roleSeller") })] }), _jsx(Text, { color: "inverse", variant: "none", size: "sm", children: memberSince })] }), isSeller && storeSlug && (_jsx(Div, { className: "sm:ml-auto", children: _jsxs(Link, { href: String(ROUTES.PUBLIC.STORE_DETAIL(storeSlug)), className: "inline-flex items-center gap-1.5 rounded-full border border-white/30 bg-white/10 hover:bg-white/20 px-4 py-2 text-sm font-medium text-white transition-colors", children: [_jsx(ExternalLink, { className: "w-3.5 h-3.5" }), t("visitStore")] }) }))] }) }) }));
115
+ return (_jsx(Section, { color: "inverse", tone: "accent-banner", paddingY: "y-2-5xl", children: _jsx(Div, { className: `${page.container.md}`, children: _jsxs(Stack, { direction: "sm-row", wrap: true, align: "center", smAlign: "end", gap: "md", children: [_jsx(Row, { align: "center", justify: "center", className: `w-20 h-20 flex-shrink-0 ${__O.hidden}`, surface: "default", rounded: "full", children: photoURL ? _jsx(MediaImage, { src: photoURL, alt: displayName, size: "avatar", fallback: "\uD83D\uDC64" }) : _jsx(User, { className: "w-10 h-10 text-white/60" }) }), _jsxs(Stack, { gap: "xs", className: "text-center sm:text-left", children: [_jsxs(Row, { justify: "start", gap: "xs", wrap: true, children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-0", children: displayName }), isSeller && _jsx(Span, { color: "inverse", size: "xs", weight: "semibold", className: "bg-[white]/20", padding: "pill-sm", rounded: "full", children: t("roleSeller") })] }), _jsx(Text, { color: "inverse", variant: "none", size: "sm", children: memberSince })] }), isSeller && storeSlug && (_jsx(Div, { className: "sm:ml-auto", children: _jsxs(Link, { href: String(ROUTES.PUBLIC.STORE_DETAIL(storeSlug)), className: "inline-flex items-center gap-1.5 rounded-full border border-white/30 bg-white/10 hover:bg-white/20 px-4 py-2 text-sm font-medium text-white transition-colors", children: [_jsx(ExternalLink, { className: "w-3.5 h-3.5" }), t("visitStore")] }) }))] }) }) }));
116
116
  }
117
117
  function renderProfileStatsRow(flex, statItems) {
118
118
  return (_jsx(Grid, { gap: "md", className: "grid-cols-2 sm:grid-cols-4", children: statItems.map(({ icon: Icon, label, value }) => (_jsxs(Div, { rounded: "xl", className: `${__P.p4} text-center`, border: "default", surface: "muted", children: [_jsx(Row, { centered: true, className: `${flex.center} mb-1`, children: _jsx(Icon, { className: "w-4 h-4 text-neutral-400" }) }), _jsx(Text, { size: "lg", weight: "bold", children: value }), _jsx(Text, { variant: "secondary", size: "xs", children: label })] }, label))) }));
@@ -120,7 +120,7 @@ function renderProfileStatsRow(flex, statItems) {
120
120
  function renderProfileBioSection(pub) {
121
121
  if (!pub?.bio && !pub?.location && !pub?.website)
122
122
  return null;
123
- return (_jsx(Section, { children: _jsxs(Stack, { gap: "sm", className: `${__P.p6}`, border: "default", surface: "muted", rounded: "2xl", children: [pub.bio && _jsx(Text, { className: "leading-relaxed text-neutral-700", size: "sm", children: pub.bio }), _jsxs(Row, { gap: "md", wrap: true, children: [pub.location && _jsxs(Span, { layout: "flex", gap: "xs", size: "sm", className: "text-neutral-500 dark:text-neutral-400", children: [_jsx(MapPin, { className: "w-4 h-4" }), pub.location] }), pub.website && _jsxs(Anchor, { href: pub.website, className: "flex items-center gap-1.5", children: [_jsx(Globe, { className: "w-4 h-4" }), _jsx(Span, { size: "sm", children: pub.website.replace(/^https?:\/\//, "") })] })] })] }) }));
123
+ return (_jsx(Section, { children: _jsxs(Stack, { gap: "sm", className: `${__P.p6}`, border: "default", surface: "muted", rounded: "2xl", children: [pub.bio && _jsx(Text, { className: "leading-relaxed text-neutral-700", size: "sm", children: pub.bio }), _jsxs(Row, { gap: "md", wrap: true, children: [pub.location && _jsxs(Span, { layout: "flex", gap: "xs", size: "sm", className: "text-neutral-500 dark:text-neutral-400", children: [_jsx(MapPin, { className: "w-4 h-4" }), pub.location] }), pub.website && _jsxs(Anchor, { href: pub.website, layout: "inline-flex", className: "gap-[0.375rem]", children: [_jsx(Globe, { className: "w-4 h-4" }), _jsx(Span, { size: "sm", children: pub.website.replace(/^https?:\/\//, "") })] })] })] }) }));
124
124
  }
125
125
  function renderStoreDescriptionSection(isSeller, storeSlug, storeDescription, storeName, t) {
126
126
  if (!isSeller || !storeSlug || !storeDescription)
@@ -128,11 +128,11 @@ function renderStoreDescriptionSection(isSeller, storeSlug, storeDescription, st
128
128
  return (_jsx(Section, { children: _jsxs(Div, { rounded: "2xl", className: `${__P.p6}`, border: "default", surface: "subtle", children: [_jsx(Heading, { level: 3, className: "mb-2", children: storeName }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "sm", children: storeDescription }), _jsxs(Link, { href: String(ROUTES.PUBLIC.STORE_DETAIL(storeSlug)), className: "mt-3 inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline", children: [t("visitStore"), " \u2192"] })] }) }));
129
129
  }
130
130
  function renderProfileListingsSection(t, products, storeSlug) {
131
- return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-4", children: t("listingsTitle") }), products.length === 0 ? (_jsxs(Div, { rounded: "2xl", className: `p-12 text-center`, border: "default", surface: "subtle", children: [_jsx(ShoppingBag, { className: CLS_EMPTY_ICON }), _jsx(Text, { variant: "secondary", size: "sm", children: t("noListings") })] })) : (_jsx(Grid, { gap: "md", className: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4", children: products.slice(0, 8).map((p) => _jsx(ProductCard, { product: toProductItem(p), href: getProductHref(p) }, p.id)) })), products.length > 8 && storeSlug && (_jsx(Div, { className: "mt-4 text-center", children: _jsx(Link, { href: String(ROUTES.PUBLIC.STORE_PRODUCTS(storeSlug)), className: "text-sm font-medium text-primary hover:underline", children: t("viewAllListings", { count: products.length }) }) }))] }));
131
+ return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-4", children: t("listingsTitle") }), products.length === 0 ? (_jsxs(Div, { rounded: "2xl", padding: "3xl", className: "text-center", border: "default", surface: "subtle", children: [_jsx(ShoppingBag, { className: CLS_EMPTY_ICON }), _jsx(Text, { variant: "secondary", size: "sm", children: t("noListings") })] })) : (_jsx(Grid, { gap: "md", className: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4", children: products.slice(0, 8).map((p) => _jsx(ProductCard, { product: toProductItem(p), href: getProductHref(p) }, p.id)) })), products.length > 8 && storeSlug && (_jsx(Div, { className: "mt-4 text-center", children: _jsx(Link, { href: String(ROUTES.PUBLIC.STORE_PRODUCTS(storeSlug)), className: "text-sm font-medium text-primary hover:underline", children: t("viewAllListings", { count: products.length }) }) }))] }));
132
132
  }
133
133
  function renderProfileReviewsSection(t, reviews, storeSlug) {
134
- return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-4", children: t("reviewsReceivedTitle") }), reviews.length === 0 ? (_jsxs(Div, { rounded: "2xl", className: `p-12 text-center`, border: "default", surface: "subtle", children: [_jsx(Star, { className: CLS_EMPTY_ICON }), _jsx(Text, { variant: "secondary", size: "sm", children: t("noReviewsReceived") })] })) : (_jsx(Grid, { gap: "md", className: "grid-cols-1 sm:grid-cols-2", children: reviews.slice(0, 6).map((review) => _jsx(ReviewCard, { review: review }, review.id)) })), reviews.length > 6 && storeSlug && (_jsx(Div, { className: "mt-4 text-center", children: _jsx(Link, { href: String(ROUTES.PUBLIC.STORE_REVIEWS(storeSlug)), className: "text-sm font-medium text-primary hover:underline", children: t("viewAllReviews", { count: reviews.length }) }) }))] }));
134
+ return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-4", children: t("reviewsReceivedTitle") }), reviews.length === 0 ? (_jsxs(Div, { rounded: "2xl", padding: "3xl", className: "text-center", border: "default", surface: "subtle", children: [_jsx(Star, { className: CLS_EMPTY_ICON }), _jsx(Text, { variant: "secondary", size: "sm", children: t("noReviewsReceived") })] })) : (_jsx(Grid, { gap: "md", className: "grid-cols-1 sm:grid-cols-2", children: reviews.slice(0, 6).map((review) => _jsx(ReviewCard, { review: review }, review.id)) })), reviews.length > 6 && storeSlug && (_jsx(Div, { className: "mt-4 text-center", children: _jsx(Link, { href: String(ROUTES.PUBLIC.STORE_REVIEWS(storeSlug)), className: "text-sm font-medium text-primary hover:underline", children: t("viewAllReviews", { count: reviews.length }) }) }))] }));
135
135
  }
136
136
  function renderAuthoredReviewsSection(t, reviews, displayName) {
137
- return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-4", children: t("reviewsAuthoredTitle", { name: displayName }) }), reviews.length === 0 ? (_jsxs(Div, { rounded: "2xl", className: `p-12 text-center`, border: "default", surface: "subtle", children: [_jsx(Star, { className: CLS_EMPTY_ICON }), _jsx(Text, { variant: "secondary", size: "sm", children: t("noReviewsAuthored", { name: displayName }) })] })) : (_jsx(Grid, { gap: "md", className: "grid-cols-1 sm:grid-cols-2", children: reviews.slice(0, 6).map((review) => _jsx(ReviewCard, { review: review }, review.id)) }))] }));
137
+ return (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-4", children: t("reviewsAuthoredTitle", { name: displayName }) }), reviews.length === 0 ? (_jsxs(Div, { rounded: "2xl", padding: "3xl", className: "text-center", border: "default", surface: "subtle", children: [_jsx(Star, { className: CLS_EMPTY_ICON }), _jsx(Text, { variant: "secondary", size: "sm", children: t("noReviewsAuthored", { name: displayName }) })] })) : (_jsx(Grid, { gap: "md", className: "grid-cols-1 sm:grid-cols-2", children: reviews.slice(0, 6).map((review) => _jsx(ReviewCard, { review: review }, review.id)) }))] }));
138
138
  }
@@ -47,5 +47,5 @@ export async function TrackOrderView({} = {}) {
47
47
  bg: "bg-emerald-100 dark:bg-emerald-900/40",
48
48
  },
49
49
  ];
50
- return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [_jsx(Section, { color: "inverse", tone: "accent-banner", padding: "banner", children: _jsxs(Div, { className: `${page.container.sm} text-center`, children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-4", children: t("title") }), _jsx(Text, { color: "inverse", variant: "none", className: "/80", children: t("subtitle") })] }) }), _jsxs(Div, { className: `${page.container.md} md:py-16 space-y-14 md:space-y-16`, padding: "y-2-5xl", children: [_jsxs(Section, { className: `text-center`, border: "default", surface: "subtle", rounded: "2xl", padding: "xl", children: [_jsx(Row, { align: "center", justify: "center", className: `w-16 h-16 bg-primary/10 dark:bg-primary/15 mx-auto mb-4`, rounded: "full", children: _jsx(ShoppingBag, { className: "w-8 h-8 text-primary" }) }), _jsx(Heading, { level: 2, className: "mb-3", children: t("signInPrompt") }), _jsxs(Stack, { direction: "sm-row", justify: "center", className: "mt-6", gap: "3", children: [_jsx(TextLink, { rounded: "lg", paddingX: "xl", paddingY: "md", href: String(ROUTES.AUTH.LOGIN), className: `inline-flex items-center gap-2 bg-primary hover:bg-primary/90 text-white transition-colors`, weight: "medium", children: t("signIn") }), _jsx(TextLink, { rounded: "lg", paddingX: "xl", paddingY: "md", href: String(ROUTES.USER.ORDERS), className: `inline-flex items-center gap-2 ${themed.bgPrimary} border ${themed.border} ${themed.textPrimary} hover:opacity-80 transition-opacity`, weight: "medium", children: t("viewOrders") })] })] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-10", align: "center", children: t("howItWorksTitle") }), _jsx(Grid, { className: "grid-cols-1 sm:grid-cols-2 xl:grid-cols-4", gap: "lg", children: STEPS.map(({ icon: Icon, title, text, color, bg }, index) => (_jsxs("div", { className: `${themed.bgSecondary} rounded-xl border ${themed.border} p-6 relative`, children: [_jsx(Caption, { className: "absolute top-4 right-4", weight: "bold", children: String(index + 1).padStart(2, "0") }), _jsx(Row, { align: "center", justify: "center", className: `w-12 h-12 ${bg} mb-4`, rounded: "xl", children: _jsx(Icon, { className: `w-6 h-6 ${color}` }) }), _jsx(Heading, { level: 3, className: "mb-2", children: title }), _jsx(Text, { variant: "secondary", size: "sm", className: "leading-relaxed", children: text })] }, title))) })] }), _jsxs(Section, { layout: "flex-sm-row-between", gap: "md", border: "default", surface: "subtle", rounded: "xl", padding: "lg", children: [_jsxs(Div, { children: [_jsx(Heading, { level: 2, className: "mb-1", children: t("needHelpTitle") }), _jsx(Text, { variant: "secondary", size: "sm", children: t("needHelpText") })] }), _jsxs(Row, { gap: "3", className: "flex-shrink-0", children: [_jsx(TextLink, { href: String(ROUTES.PUBLIC.HELP), className: `${themed.textSecondary} hover:text-primary underline underline-offset-4 transition-colors`, size: "sm", children: t("helpCenter") }), _jsx(TextLink, { rounded: "lg", paddingX: "md", paddingY: "xs", href: String(ROUTES.PUBLIC.CONTACT), className: "bg-primary hover:bg-primary/90 text-white transition-colors", size: "sm", children: t("contactSupport") })] })] })] })] }));
50
+ return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [_jsx(Section, { color: "inverse", tone: "accent-banner", padding: "banner", children: _jsxs(Div, { className: `${page.container.sm} text-center`, children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-4", children: t("title") }), _jsx(Text, { color: "inverse", variant: "none", className: "/80", children: t("subtitle") })] }) }), _jsx(Div, { className: page.container.md, padding: "y-4xl", children: _jsxs(Stack, { gap: "hero", children: [_jsxs(Section, { className: `text-center`, border: "default", surface: "subtle", rounded: "2xl", padding: "xl", children: [_jsx(Row, { align: "center", justify: "center", className: `w-16 h-16 bg-primary/10 dark:bg-primary/15 mx-auto mb-4`, rounded: "full", children: _jsx(ShoppingBag, { className: "w-8 h-8 text-primary" }) }), _jsx(Heading, { level: 2, className: "mb-3", children: t("signInPrompt") }), _jsxs(Stack, { direction: "sm-row", justify: "center", className: "mt-6", gap: "3", children: [_jsx(TextLink, { rounded: "lg", paddingX: "xl", paddingY: "md", layout: "inline-flex", align: "center", justify: "center", gap: "sm", href: String(ROUTES.AUTH.LOGIN), className: `bg-primary hover:bg-primary/90 text-white transition-colors`, weight: "medium", children: t("signIn") }), _jsx(TextLink, { rounded: "lg", paddingX: "xl", paddingY: "md", layout: "inline-flex", align: "center", justify: "center", gap: "sm", href: String(ROUTES.USER.ORDERS), className: `${themed.bgPrimary} border ${themed.border} ${themed.textPrimary} hover:opacity-80 transition-opacity`, weight: "medium", children: t("viewOrders") })] })] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-10", align: "center", children: t("howItWorksTitle") }), _jsx(Grid, { className: "grid-cols-1 sm:grid-cols-2 xl:grid-cols-4", gap: "lg", children: STEPS.map(({ icon: Icon, title, text, color, bg }, index) => (_jsxs("div", { className: `${themed.bgSecondary} rounded-xl border ${themed.border} p-6 relative`, children: [_jsx(Caption, { className: "absolute top-4 right-4", weight: "bold", children: String(index + 1).padStart(2, "0") }), _jsx(Row, { align: "center", justify: "center", className: `w-12 h-12 ${bg} mb-4`, rounded: "xl", children: _jsx(Icon, { className: `w-6 h-6 ${color}` }) }), _jsx(Heading, { level: 3, className: "mb-2", children: title }), _jsx(Text, { variant: "secondary", size: "sm", className: "leading-relaxed", children: text })] }, title))) })] }), _jsxs(Section, { layout: "flex-sm-row-between", gap: "md", border: "default", surface: "subtle", rounded: "xl", padding: "lg", children: [_jsxs(Div, { children: [_jsx(Heading, { level: 2, className: "mb-1", children: t("needHelpTitle") }), _jsx(Text, { variant: "secondary", size: "sm", children: t("needHelpText") })] }), _jsxs(Row, { gap: "3", className: "flex-shrink-0", children: [_jsx(TextLink, { href: String(ROUTES.PUBLIC.HELP), className: `${themed.textSecondary} hover:text-primary underline underline-offset-4 transition-colors`, size: "sm", children: t("helpCenter") }), _jsx(TextLink, { rounded: "lg", paddingX: "md", paddingY: "xs", href: String(ROUTES.PUBLIC.CONTACT), className: "bg-primary hover:bg-primary/90 text-white transition-colors", size: "sm", children: t("contactSupport") })] })] })] }) })] }));
51
51
  }
@@ -10,5 +10,5 @@ export function AddressCard({ address, onEdit, onDelete, onSetDefault, labels =
10
10
  return (_jsxs(Div, { surface: "card", padding: "sm", className: "relative", children: [address.isDefault && (_jsx(Span, { color: "success", surface: "success-surface", size: "xs", weight: "medium", className: "absolute right-3 top-3", rounded: "full", padding: "pill-xs", children: labels.defaultBadge ?? "Default" })), address.label && (_jsx(Text, { className: "mb-1 tracking-wide text-neutral-500 dark:text-neutral-400", size: "xs", weight: "semibold", transform: "uppercase", children: address.label })), _jsx(Text, { className: "text-neutral-900 dark:text-neutral-100", size: "sm", children: line1 }), line2 && _jsx(Text, { className: "text-neutral-900 dark:text-neutral-100", size: "sm", children: line2 }), _jsxs(Text, { className: "text-neutral-900 dark:text-neutral-100", size: "sm", children: [address.city, ", ", address.state, " ", address.postalCode] }), _jsx(Text, { className: "text-neutral-900 dark:text-neutral-100", size: "sm", children: address.country }), address.phone && (_jsx(Text, { className: "mt-1 text-neutral-500 dark:text-neutral-400", size: "sm", children: address.phone })), _jsxs(Div, { layout: "flex", gap: "1", className: "mt-3", children: [onEdit && (_jsx(Button, { onClick: () => onEdit(address), variant: "ghost", size: "sm", className: "text-xs font-medium text-primary hover:underline", children: labels.edit ?? "Edit" })), onDelete && (_jsx(Button, { onClick: () => onDelete(address.id), variant: "ghost", size: "sm", className: "text-xs font-medium text-error hover:underline", children: labels.delete ?? "Delete" })), !address.isDefault && onSetDefault && (_jsx(Button, { onClick: () => onSetDefault(address.id), variant: "outline", size: "sm", className: "ml-auto text-xs font-medium", children: labels.setDefault ?? "Set default" }))] })] }));
11
11
  }
12
12
  export function AddressBook({ addresses, onEdit, onDelete, onSetDefault, onAdd, emptyLabel = "No saved addresses", addLabel = "Add Address", }) {
13
- return (_jsxs(Stack, { gap: "md", children: [addresses.length === 0 && (_jsx(Text, { className: "text-neutral-500 dark:text-neutral-400", size: "sm", children: emptyLabel })), _jsx(Div, { layout: "grid", gap: "4", className: "sm:grid-cols-2", children: addresses.map((addr) => (_jsx(AddressCard, { address: addr, onEdit: onEdit, onDelete: onDelete, onSetDefault: onSetDefault }, addr.id))) }), onAdd && (_jsxs(Button, { rounded: "lg", onClick: onAdd, variant: "outline", paddingX: "md", paddingY: "md", textSize: "sm", weight: "medium", className: "mt-2 border border-dashed border-neutral-300 dark:border-slate-600 text-neutral-500 dark:text-zinc-400 transition hover:border-neutral-400 dark:hover:border-slate-500 hover:text-neutral-700 dark:hover:text-zinc-200", children: ["+ ", addLabel] }))] }));
13
+ return (_jsxs(Stack, { gap: "md", children: [addresses.length === 0 && (_jsx(Text, { className: "text-neutral-500 dark:text-neutral-400", size: "sm", children: emptyLabel })), _jsx(Div, { layout: "grid", gap: "4", className: "sm:grid-cols-2", children: addresses.map((addr) => (_jsx(AddressCard, { address: addr, onEdit: onEdit, onDelete: onDelete, onSetDefault: onSetDefault }, addr.id))) }), onAdd && (_jsxs(Button, { rounded: "lg", onClick: onAdd, variant: "outline", paddingX: "md", paddingY: "md", textSize: "sm", weight: "medium", className: "mt-2 border border-dashed border-neutral-300 dark:border-[var(--appkit-color-border)] text-neutral-500 dark:text-[var(--appkit-color-text-muted)] transition hover:border-neutral-400 dark:hover:border-[var(--appkit-color-border-subtle)] hover:text-neutral-700 dark:hover:text-[var(--appkit-color-text)]", children: ["+ ", addLabel] }))] }));
14
14
  }
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { normalizeError } from "../../../errors/normalize";
3
4
  import { useState } from "react";
4
- import { Button, Checkbox, FormField, FormGroup, Row } from "../../../ui";
5
+ import { Button, Checkbox, FormField, FormGroup, Row, useToast } from "../../../ui";
5
6
  import { Form } from "../../../ui/components/Form";
6
7
  const DEFAULT_LABELS = {
7
8
  label: "Address Label",
@@ -30,6 +31,7 @@ const DEFAULT_PLACEHOLDERS = {
30
31
  country: "Country",
31
32
  };
32
33
  export function AddressForm({ initialData, onSubmit, onCancel, isLoading = false, submitLabel, defaultCountry = "India", labels, placeholders, }) {
34
+ const { showToast } = useToast();
33
35
  const mergedLabels = { ...DEFAULT_LABELS, ...labels };
34
36
  const mergedPlaceholders = { ...DEFAULT_PLACEHOLDERS, ...placeholders };
35
37
  const effectiveSubmitLabel = submitLabel ?? mergedLabels.save;
@@ -67,6 +69,12 @@ export function AddressForm({ initialData, onSubmit, onCancel, isLoading = false
67
69
  Object.entries(errs).forEach(([k, v]) => setFieldError(k, v));
68
70
  return;
69
71
  }
70
- await onSubmit(formData);
72
+ try {
73
+ await onSubmit(formData);
74
+ }
75
+ catch (err) {
76
+ void normalizeError(err);
77
+ showToast(err instanceof Error ? err.message : "Failed to save address", "error");
78
+ }
71
79
  }, children: isLoading ? mergedLabels.loading : effectiveSubmitLabel })] })] })) }));
72
80
  }
@@ -74,5 +74,5 @@ export function AddressesIndexListing({ onAdd, onEdit, onDelete, }) {
74
74
  },
75
75
  });
76
76
  return (_jsxs(Stack, { gap: "md", children: [_jsx(ListingToolbar, { filterCount: activeFilterCount, onFiltersClick: openFilters, searchValue: searchInput, searchPlaceholder: "Search by address, postcode or label...", onSearchChange: setSearchInput, onSearchCommit: commitSearch, view: view, onViewChange: (v) => { if (v === "table")
77
- return; setView(v); }, onResetAll: resetAll, hasActiveState: hasActiveState }), _jsx(Div, { className: "sm:px-4", padding: "x-sm", children: isLoading ? (_jsx(Div, { layout: "grid", gap: "4", className: "sm:grid-cols-2", children: Array.from({ length: 4 }).map((_, i) => (_jsxs("div", { className: "rounded-xl border border-zinc-200 dark:border-slate-700 animate-pulse p-4 space-y-2", children: [_jsx(Div, { className: "h-4 w-1/3", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-3 w-3/4", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-3 w-1/2", surface: "subtle", rounded: "default" })] }, i))) })) : addresses.length === 0 ? (_jsx(Text, { paddingY: "xl", color: "muted", size: "sm", align: "center", children: table.get(TABLE_KEYS.QUERY) ? `No addresses matching "${table.get(TABLE_KEYS.QUERY)}"` : "No saved addresses." })) : (_jsx(AddressBook, { addresses: addresses, onEdit: onEdit, onDelete: onDelete, onAdd: onAdd })) }), _jsx(ListingFilterDrawer, { open: filterOpen, onClose: () => setFilterOpen(false), onApply: applyFilters, onClear: clearFilters, activeCount: activeFilterCount, children: _jsx(AddressFilters, { table: pendingTable }) })] }));
77
+ return; setView(v); }, onResetAll: resetAll, hasActiveState: hasActiveState }), _jsx(Div, { className: "sm:px-[1rem]", padding: "x-sm", children: isLoading ? (_jsx(Div, { layout: "grid", gap: "4", className: "sm:grid-cols-2", children: Array.from({ length: 4 }).map((_, i) => (_jsxs("div", { className: "rounded-xl border border-zinc-200 dark:border-slate-700 animate-pulse p-4 space-y-2", children: [_jsx(Div, { className: "h-4 w-1/3", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-3 w-3/4", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-3 w-1/2", surface: "subtle", rounded: "default" })] }, i))) })) : addresses.length === 0 ? (_jsx(Text, { paddingY: "xl", color: "muted", size: "sm", align: "center", children: table.get(TABLE_KEYS.QUERY) ? `No addresses matching "${table.get(TABLE_KEYS.QUERY)}"` : "No saved addresses." })) : (_jsx(AddressBook, { addresses: addresses, onEdit: onEdit, onDelete: onDelete, onAdd: onAdd })) }), _jsx(ListingFilterDrawer, { open: filterOpen, onClose: () => setFilterOpen(false), onApply: applyFilters, onClear: clearFilters, activeCount: activeFilterCount, children: _jsx(AddressFilters, { table: pendingTable }) })] }));
78
78
  }
@@ -35,5 +35,5 @@ const SECTIONS = [
35
35
  ];
36
36
  // ─── Component ────────────────────────────────────────────────────────────────
37
37
  export function BuyerAccountGuideView() {
38
- return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", align: "center", justify: "center", rounded: "xl", style: { background: GC.pageHeaderGradient }, children: _jsx(UserCheck, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Account & Safety" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Manage your LetItRip profile, stay safe from scams, and know how to report problems." })] }), SECTIONS.map(({ Icon, iconCls, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: iconCls ?? GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
38
+ return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: `flex-shrink-0 w-10 h-10 ${GC.iconBg}`, align: "center", justify: "center", rounded: "xl", children: _jsx(UserCheck, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Account & Safety" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Manage your LetItRip profile, stay safe from scams, and know how to report problems." })] }), SECTIONS.map(({ Icon, iconCls, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: iconCls ?? GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
39
39
  }
@@ -34,5 +34,5 @@ const SECTIONS = [
34
34
  ];
35
35
  // ─── Component ────────────────────────────────────────────────────────────────
36
36
  export function BuyerAuctionsGuideView() {
37
- return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", align: "center", justify: "center", rounded: "xl", style: { background: GC.pageHeaderGradient }, children: _jsx(Gavel, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Auctions & Pre-orders" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "How bidding works, how to win, and everything you need to know about pre-orders on LetItRip." })] }), SECTIONS.map(({ Icon, iconCls, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: iconCls ?? GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
37
+ return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: `flex-shrink-0 w-10 h-10 ${GC.iconBg}`, align: "center", justify: "center", rounded: "xl", children: _jsx(Gavel, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Auctions & Pre-orders" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "How bidding works, how to win, and everything you need to know about pre-orders on LetItRip." })] }), SECTIONS.map(({ Icon, iconCls, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: iconCls ?? GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
38
38
  }
@@ -44,5 +44,5 @@ const SECTIONS = [
44
44
  ];
45
45
  // ─── Component ────────────────────────────────────────────────────────────────
46
46
  export function BuyerOrdersGuideView() {
47
- return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", align: "center", justify: "center", rounded: "xl", style: { background: GC.pageHeaderGradient }, children: _jsx(PackageCheck, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Orders, Returns & Support" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "From placing an order to getting a refund \u2014 everything you need to know about managing your orders on LetItRip." })] }), SECTIONS.map(({ Icon, iconCls, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: iconCls ?? GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
47
+ return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: `flex-shrink-0 w-10 h-10 ${GC.iconBg}`, align: "center", justify: "center", rounded: "xl", children: _jsx(PackageCheck, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Orders, Returns & Support" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "From placing an order to getting a refund \u2014 everything you need to know about managing your orders on LetItRip." })] }), SECTIONS.map(({ Icon, iconCls, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: iconCls ?? GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
48
48
  }
@@ -34,5 +34,5 @@ const SECTIONS = [
34
34
  ];
35
35
  // ─── Component ────────────────────────────────────────────────────────────────
36
36
  export function BuyerShoppingGuideView() {
37
- return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", align: "center", justify: "center", rounded: "xl", style: { background: GC.pageHeaderGradient }, children: _jsx(ShoppingBag, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Shopping & Checkout" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Everything you need to know about finding, evaluating, and buying collectibles on LetItRip." })] }), SECTIONS.map(({ Icon, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
37
+ return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: `flex-shrink-0 w-10 h-10 ${GC.iconBg}`, align: "center", justify: "center", rounded: "xl", children: _jsx(ShoppingBag, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Buyer Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Shopping & Checkout" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Everything you need to know about finding, evaluating, and buying collectibles on LetItRip." })] }), SECTIONS.map(({ Icon, title, content }) => (_jsxs(Section, { className: GC.sectionWrap, children: [_jsxs(Div, { className: GC.sectionHeader, children: [_jsx(Icon, { className: GC.iconPrimary }), _jsx(Heading, { level: 2, className: GC.sectionTitle, children: title })] }), _jsx(Div, { className: GC.sectionBody, children: content })] }, title)))] }));
38
38
  }
@@ -2,5 +2,5 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Div, Heading, Row, Span } from "../../../ui";
3
3
  const CLS_DOT_ON = "bg-success-surface";
4
4
  export function ChatWindow({ labels = {}, isConnected = true, isLoading = false, error, renderLoadingIndicator, renderMessages, renderInput, className = "", }) {
5
- return (_jsxs(Div, { className: className, children: [_jsxs(Row, { justify: "between", className: "border-b border-neutral-200 dark:border-neutral-700 mb-3", padding: "b-sm", children: [_jsxs(Row, { gap: "xs", children: [labels.title && _jsx(Heading, { level: 4, children: labels.title }), _jsx(Span, { className: `w-2 h-2 ${isConnected ? CLS_DOT_ON : "bg-zinc-400"}`, rounded: "full", "aria-label": isConnected ? labels.connected : labels.disconnected })] }), isLoading && (renderLoadingIndicator?.() ?? null)] }), error ?? null, renderMessages(), renderInput()] }));
5
+ return (_jsxs(Div, { className: className, children: [_jsxs(Row, { justify: "between", className: "border-b border-neutral-200 dark:border-neutral-700 mb-3", padding: "b-sm", children: [_jsxs(Row, { gap: "xs", children: [labels.title && _jsx(Heading, { level: 4, children: labels.title }), _jsx(Span, { className: `w-2 h-2 ${isConnected ? CLS_DOT_ON : "bg-[var(--appkit-color-text-faint)]"}`, rounded: "full", "aria-label": isConnected ? labels.connected : labels.disconnected })] }), isLoading && (renderLoadingIndicator?.() ?? null)] }), error ?? null, renderMessages(), renderInput()] }));
6
6
  }
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Div, Heading, Span, Stack } from "../../../ui";
3
3
  export function MessagesView({ labels = {}, chatId, renderChatList, renderChatWindow, renderMobileBack, renderEmptyState, className = "", }) {
4
- return (_jsxs(Div, { layout: "grid", gap: "4", className: `grid-cols-1 md:grid-cols-[280px_1fr] xl:grid-cols-[320px_1fr] 2xl:grid-cols-[360px_1fr] h-full min-h-[600px] ${className}`, children: [_jsxs(Div, { className: chatId ? "hidden md:block" : "block", children: [labels.title && (_jsx(Heading, { level: 3, className: "mb-3", weight: "semibold", children: labels.title })), renderChatList?.()] }), chatId ? (_jsxs(Stack, { gap: "xs", children: [renderMobileBack?.(), renderChatWindow?.()] })) : (_jsx(Div, { className: "hidden md:flex items-center justify-center text-zinc-400 dark:text-zinc-400 border border-dashed border-neutral-200 dark:border-neutral-700", rounded: "xl", children: renderEmptyState?.() ?? (_jsx(Span, { children: labels.selectRoom ?? "Select a conversation" })) }))] }));
4
+ return (_jsxs(Div, { layout: "grid", gap: "4", className: `grid-cols-1 md:grid-cols-[280px_1fr] xl:grid-cols-[320px_1fr] 2xl:grid-cols-[360px_1fr] h-full min-h-[600px] ${className}`, children: [_jsxs(Div, { className: chatId ? "hidden md:block" : "block", children: [labels.title && (_jsx(Heading, { level: 3, className: "mb-3", weight: "semibold", children: labels.title })), renderChatList?.()] }), chatId ? (_jsxs(Stack, { gap: "xs", children: [renderMobileBack?.(), renderChatWindow?.()] })) : (_jsx(Div, { className: "hidden md:flex text-[var(--appkit-color-text-faint)] border border-dashed border-neutral-200 dark:border-neutral-700", align: "center", justify: "center", rounded: "xl", children: renderEmptyState?.() ?? (_jsx(Span, { children: labels.selectRoom ?? "Select a conversation" })) }))] }));
5
5
  }
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { normalizeError } from "../../../errors/normalize";
3
4
  import { useCallback, useRef, useState } from "react";
4
- import { Button, Div, Heading, Li, Row, Span, Spinner, Stack, Text, TextLink, Ul } from "../../../ui";
5
+ import { Button, Div, Heading, Li, Row, Span, Spinner, Stack, Text, TextLink, Ul, useToast } from "../../../ui";
5
6
  import { useClickOutside, useMessage } from "../../../react";
6
7
  import { formatRelativeTime } from "../../../utils";
7
8
  import { useNotifications } from "../hooks/useNotifications";
@@ -32,6 +33,7 @@ export function NotificationBell({ limit = 10, viewAllHref, labels, icons, rende
32
33
  const [isOpen, setIsOpen] = useState(false);
33
34
  const dropdownRef = useRef(null);
34
35
  const { showSuccess, showError } = useMessage();
36
+ const { showToast } = useToast();
35
37
  const { notifications, unreadCount, isLoading, refetch, markRead, markAllRead, isMarkingAll, } = useNotifications(limit);
36
38
  const notificationIcons = { ...DEFAULT_ICONS, ...icons };
37
39
  useClickOutside(dropdownRef, () => setIsOpen(false), { enabled: isOpen });
@@ -43,9 +45,15 @@ export function NotificationBell({ limit = 10, viewAllHref, labels, icons, rende
43
45
  });
44
46
  }, [refetch]);
45
47
  const handleMarkRead = useCallback(async (id) => {
46
- await markRead(id);
47
- refetch();
48
- }, [markRead, refetch]);
48
+ try {
49
+ await markRead(id);
50
+ refetch();
51
+ }
52
+ catch (err) {
53
+ void normalizeError(err);
54
+ showToast(err instanceof Error ? err.message : "Failed to mark notification as read", "error");
55
+ }
56
+ }, [markRead, refetch, showToast]);
49
57
  const emitSuccess = onMarkAllReadSuccess ?? showSuccess;
50
58
  const emitError = onMarkAllReadError ?? showError;
51
59
  const handleMarkAllRead = useCallback(async () => {
@@ -54,16 +62,23 @@ export function NotificationBell({ limit = 10, viewAllHref, labels, icons, rende
54
62
  refetch();
55
63
  emitSuccess(labels.markAllRead);
56
64
  }
57
- catch {
58
- emitError(labels.error);
65
+ catch (err) {
66
+ void normalizeError(err);
67
+ if (onMarkAllReadError) {
68
+ onMarkAllReadError(labels.error);
69
+ }
70
+ else {
71
+ showToast(err instanceof Error ? err.message : labels.error, "error");
72
+ }
59
73
  }
60
74
  }, [
61
- emitError,
75
+ onMarkAllReadError,
62
76
  emitSuccess,
63
77
  labels.error,
64
78
  labels.markAllRead,
65
79
  markAllRead,
66
80
  refetch,
81
+ showToast,
67
82
  ]);
68
83
  const handleMarkReadAndClose = useCallback((notification) => {
69
84
  if (!notification.isRead)
@@ -81,11 +96,11 @@ export function NotificationBell({ limit = 10, viewAllHref, labels, icons, rende
81
96
  }
82
97
  function renderBellButton(props) {
83
98
  const { hideOnMobile, buttonClassName, labels, unreadCount, handleToggle, isOpen } = props;
84
- return (_jsxs(Button, { onClick: handleToggle, className: `${hideOnMobile ? "hidden md:flex" : "flex"} p-2.5 md:p-3 rounded-xl transition-colors relative text-zinc-600 hover:bg-zinc-100 hover:text-zinc-900 dark:text-zinc-300 dark:hover:bg-slate-800 dark:hover:text-white ${buttonClassName}`, "aria-label": labels.title, "aria-expanded": isOpen, children: [_jsx("svg", { className: "w-6 h-6 md:w-7 md:h-7", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" }) }), unreadCount > 0 && (_jsx(Span, { size: "xs", weight: "semibold", className: CLS_UNREAD_BADGE, children: unreadCount > 99 ? "99+" : unreadCount }))] }));
99
+ return (_jsxs(Button, { onClick: handleToggle, rounded: "xl", className: `${hideOnMobile ? "hidden md:flex" : "flex"} p-[0.625rem] md:p-[0.75rem] transition-colors relative text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-bg)] hover:text-[var(--appkit-color-text)] ${buttonClassName}`, "aria-label": labels.title, "aria-expanded": isOpen, children: [_jsx("svg", { className: "w-6 h-6 md:w-7 md:h-7", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" }) }), unreadCount > 0 && (_jsx(Span, { size: "xs", weight: "semibold", className: CLS_UNREAD_BADGE, children: unreadCount > 99 ? "99+" : unreadCount }))] }));
85
100
  }
86
101
  function renderNotificationDropdown(props) {
87
102
  const { dropdownClassName, labels, unreadCount, isMarkingAll, handleMarkAllRead, isLoading, notifications, notificationIcons, handleMarkRead, handleMarkReadAndClose, renderActionLink, viewAllHref, setIsOpen } = props;
88
- return (_jsxs(Div, { className: `absolute right-0 top-full mt-2 w-80 sm:w-96 shadow-2xl z-50 ${__O.hidden} ${dropdownClassName}`, rounded: "xl", surface: "default", border: "default", children: [_jsxs(Row, { border: "default", justify: "between", gap: "none", className: "border-b dark:border-slate-800", padding: "inline", children: [_jsxs(Heading, { level: 3, weight: "semibold", color: "primary", children: [labels.title, unreadCount > 0 && _jsxs(Span, { size: "xs", weight: "medium", className: CLS_UNREAD_PILL, children: [unreadCount, " ", labels.unread] })] }), unreadCount > 0 && (_jsx(Button, { onClick: handleMarkAllRead, disabled: isMarkingAll, className: "text-xs text-primary hover:underline font-medium disabled:opacity-50", children: isMarkingAll ? labels.loading : labels.markAllRead }))] }), _jsx(Div, { className: `max-h-96 ${__O.yAuto}`, children: renderNotificationListContent({ isLoading, notifications, notificationIcons, labels, handleMarkRead, handleMarkReadAndClose, renderActionLink }) }), viewAllHref && (_jsx(Div, { border: "default", className: "border-t dark:border-slate-800 text-center", padding: "inline", children: renderActionLink({ href: viewAllHref, onClick: () => setIsOpen(false), className: "text-sm text-primary hover:underline font-medium", children: labels.viewAll }) }))] }));
103
+ return (_jsxs(Div, { className: `absolute right-0 top-full mt-2 w-80 sm:w-96 z-50 ${__O.hidden} ${dropdownClassName}`, rounded: "xl", surface: "default", border: "default", shadow: "2xl", children: [_jsxs(Row, { border: "default", justify: "between", gap: "none", className: "border-b border-[var(--appkit-color-border)]", padding: "inline", children: [_jsxs(Heading, { level: 3, weight: "semibold", color: "primary", children: [labels.title, unreadCount > 0 && _jsxs(Span, { size: "xs", weight: "medium", className: CLS_UNREAD_PILL, children: [unreadCount, " ", labels.unread] })] }), unreadCount > 0 && (_jsx(Button, { onClick: handleMarkAllRead, disabled: isMarkingAll, textSize: "xs", weight: "medium", className: "text-primary hover:underline disabled:opacity-50", children: isMarkingAll ? labels.loading : labels.markAllRead }))] }), _jsx(Div, { className: `max-h-96 ${__O.yAuto}`, children: renderNotificationListContent({ isLoading, notifications, notificationIcons, labels, handleMarkRead, handleMarkReadAndClose, renderActionLink }) }), viewAllHref && (_jsx(Div, { border: "default", className: "border-t border-[var(--appkit-color-border)] text-center", padding: "inline", children: renderActionLink({ href: viewAllHref, onClick: () => setIsOpen(false), className: "text-sm text-primary hover:underline font-medium", children: labels.viewAll }) }))] }));
89
104
  }
90
105
  function renderNotificationListContent(props) {
91
106
  const { isLoading, notifications, notificationIcons, labels, handleMarkRead, handleMarkReadAndClose, renderActionLink } = props;
@@ -93,5 +108,5 @@ function renderNotificationListContent(props) {
93
108
  return _jsx(Row, { align: "center", justify: "center", padding: "y-2xl", children: _jsx(Spinner, { size: "md" }) });
94
109
  if (notifications.length === 0)
95
110
  return (_jsxs(Stack, { justify: "center", className: "text-center", paddingY: "y-2xl", paddingX: "x-md", align: "center", children: [_jsx("svg", { className: "w-12 h-12 text-zinc-300 dark:text-zinc-600 mb-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" }) }), _jsx(Text, { weight: "medium", color: "primary", children: labels.empty }), _jsx(Text, { size: "sm", className: "mt-1", color: "muted", children: labels.emptyDesc })] }));
96
- return (_jsx(Ul, { children: notifications.map((notification) => (_jsxs(Li, { className: `group flex items-start gap-3 px-4 py-3 border-b border-zinc-200 dark:border-slate-800 last:border-0 transition-colors hover:bg-zinc-50 dark:hover:bg-slate-900 ${!notification.isRead ? "bg-primary/5 dark:bg-primary/10" : ""}`, children: [_jsx(Span, { size: "xl", className: "flex-shrink-0 mt-0.5", children: notificationIcons[notification.type] ?? "🔔" }), _jsxs(Div, { className: "flex-1 min-w-0", children: [_jsxs(Row, { align: "start", justify: "between", gap: "xs", children: [_jsxs(Text, { size: "sm", className: "leading-tight", color: "primary", weight: "medium", children: [notification.title, !notification.isRead && _jsx(Span, { className: "ml-1.5 inline-block w-2 h-2 bg-primary flex-shrink-0 align-middle", rounded: "full" })] }), _jsx(Span, { size: "xs", className: "flex-shrink-0", color: "muted", children: formatRelativeTime(notification.createdAt) })] }), _jsx(Text, { size: "sm", className: `mt-0.5`, truncate: 2, color: "muted", children: notification.message }), _jsxs(Row, { gap: "3", className: "mt-1.5", children: [notification.actionUrl && renderActionLink({ href: notification.actionUrl, onClick: () => { void handleMarkReadAndClose(notification); }, className: "text-xs text-primary hover:underline font-medium", children: notification.actionLabel ?? labels.viewAction }), !notification.isRead && _jsx(Button, { variant: "ghost", onClick: () => void handleMarkRead(notification.id), className: "text-xs text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200 hover:underline p-0 h-auto", children: labels.markRead })] })] })] }, notification.id))) }));
111
+ return (_jsx(Ul, { children: notifications.map((notification) => (_jsxs(Li, { layout: "flex-start", gap: "3", padding: "inline", className: `group border-b border-[var(--appkit-color-border)] last:border-0 transition-colors hover:bg-[var(--appkit-color-bg)] dark:hover:bg-[var(--appkit-color-surface-elevated)] ${!notification.isRead ? "bg-primary/5 dark:bg-primary/10" : ""}`, children: [_jsx(Span, { size: "xl", className: "flex-shrink-0 mt-0.5", children: notificationIcons[notification.type] ?? "🔔" }), _jsxs(Div, { className: "flex-1 min-w-0", children: [_jsxs(Row, { align: "start", justify: "between", gap: "xs", children: [_jsxs(Text, { size: "sm", className: "leading-tight", color: "primary", weight: "medium", children: [notification.title, !notification.isRead && _jsx(Span, { className: "ml-1.5 inline-block w-2 h-2 bg-primary flex-shrink-0 align-middle", rounded: "full" })] }), _jsx(Span, { size: "xs", className: "flex-shrink-0", color: "muted", children: formatRelativeTime(notification.createdAt) })] }), _jsx(Text, { size: "sm", className: `mt-0.5`, truncate: 2, color: "muted", children: notification.message }), _jsxs(Row, { gap: "3", className: "mt-1.5", children: [notification.actionUrl && renderActionLink({ href: notification.actionUrl, onClick: () => { void handleMarkReadAndClose(notification); }, className: "text-xs text-primary hover:underline font-medium", children: notification.actionLabel ?? labels.viewAction }), !notification.isRead && _jsx(Button, { variant: "ghost", onClick: () => void handleMarkRead(notification.id), className: "text-xs text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200 hover:underline p-0 h-auto", children: labels.markRead })] })] })] }, notification.id))) }));
97
112
  }
@@ -56,7 +56,7 @@ export function NotificationPreferencesPanel({ fetchUrl = "/api/user/notificatio
56
56
  if (prefs?.types)
57
57
  setTypes((prev) => ({ ...prev, ...prefs.types }));
58
58
  })
59
- .catch(() => { })
59
+ .catch(console.error)
60
60
  .finally(() => setLoading(false));
61
61
  }, [fetchUrl]);
62
62
  const setChannel = useCallback((key, val) => {
@@ -101,5 +101,5 @@ export function NotificationPreferencesPanel({ fetchUrl = "/api/user/notificatio
101
101
  const whatsappAdminEnabled = adminChannels?.whatsapp?.enabled ?? false;
102
102
  const smsAdminEnabled = adminChannels?.sms?.enabled ?? false;
103
103
  const anyChannelEnabled = emailAdminEnabled || whatsappAdminEnabled || smsAdminEnabled;
104
- return (_jsxs(Stack, { gap: "lg", children: [_jsx(SectionCard, { title: "In-app notifications", children: _jsxs(Row, { align: "center", justify: "between", gap: "md", padding: "y-sm", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: "In-app notifications" }), _jsx(Text, { variant: "secondary", className: "mt-0.5", size: "xs", children: "Always on \u2014 displayed in the notification bell and inbox" })] }), _jsx(Row, { className: "h-5 w-9 bg-[var(--appkit-color-primary)] px-0.5", align: "center", justify: "end", rounded: "full", "aria-label": "Always on", children: _jsx(Span, { className: "h-4 w-4 shadow", rounded: "full", surface: "default" }) })] }) }), anyChannelEnabled && (_jsxs(SectionCard, { title: "Notification channels", children: [emailAdminEnabled && (_jsx(ToggleRow, { label: "Email", description: "Receive notifications by email", checked: channels.email !== false, onChange: (v) => setChannel("email", v) })), whatsappAdminEnabled && (_jsx(ToggleRow, { label: "WhatsApp", description: "Receive notifications on WhatsApp", checked: channels.whatsapp !== false, onChange: (v) => setChannel("whatsapp", v) })), smsAdminEnabled && (_jsx(ToggleRow, { label: "SMS", description: "Receive SMS text notifications", checked: channels.sms !== false, onChange: (v) => setChannel("sms", v) }))] })), _jsx(SectionCard, { title: "Notification types", children: TYPE_ROWS.map((row) => (_jsx(ToggleRow, { label: row.label, description: row.description, checked: types[row.key] !== false, onChange: (v) => setType(row.key, v) }, row.key))) }), _jsxs(Row, { justify: "end", gap: "sm", children: [saved && (_jsx(Text, { className: "text-[var(--appkit-color-success)] self-center", size: "sm", children: "Preferences saved \u2713" })), _jsx(Button, { onClick: handleSave, isLoading: saving, size: "sm", children: "Save preferences" })] })] }));
104
+ return (_jsxs(Stack, { gap: "lg", children: [_jsx(SectionCard, { title: "In-app notifications", children: _jsxs(Row, { align: "center", justify: "between", gap: "md", padding: "y-sm", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: "In-app notifications" }), _jsx(Text, { variant: "secondary", className: "mt-0.5", size: "xs", children: "Always on \u2014 displayed in the notification bell and inbox" })] }), _jsx(Row, { className: "h-5 w-9 bg-[var(--appkit-color-primary)] px-[0.125rem]", align: "center", justify: "end", rounded: "full", "aria-label": "Always on", children: _jsx(Span, { className: "h-4 w-4", rounded: "full", surface: "default", shadow: "default" }) })] }) }), anyChannelEnabled && (_jsxs(SectionCard, { title: "Notification channels", children: [emailAdminEnabled && (_jsx(ToggleRow, { label: "Email", description: "Receive notifications by email", checked: channels.email !== false, onChange: (v) => setChannel("email", v) })), whatsappAdminEnabled && (_jsx(ToggleRow, { label: "WhatsApp", description: "Receive notifications on WhatsApp", checked: channels.whatsapp !== false, onChange: (v) => setChannel("whatsapp", v) })), smsAdminEnabled && (_jsx(ToggleRow, { label: "SMS", description: "Receive SMS text notifications", checked: channels.sms !== false, onChange: (v) => setChannel("sms", v) }))] })), _jsx(SectionCard, { title: "Notification types", children: TYPE_ROWS.map((row) => (_jsx(ToggleRow, { label: row.label, description: row.description, checked: types[row.key] !== false, onChange: (v) => setType(row.key, v) }, row.key))) }), _jsxs(Row, { justify: "end", gap: "sm", children: [saved && (_jsx(Text, { className: "text-[var(--appkit-color-success)] self-center", size: "sm", children: "Preferences saved \u2713" })), _jsx(Button, { onClick: handleSave, isLoading: saving, size: "sm", children: "Save preferences" })] })] }));
105
105
  }
@@ -83,6 +83,7 @@ export function UserOffersPanel({ fetchEndpoint = "/api/user/offers", onAcceptCo
83
83
  setOffers(items);
84
84
  }
85
85
  catch (err) {
86
+ // toast-intentionally-silent: data load, error surfaced via fetchError state
86
87
  void normalizeError(err);
87
88
  setFetchError(err instanceof Error ? err.message : "Failed to load offers.");
88
89
  }
@@ -77,12 +77,7 @@ export function UserSidebar({ items, groups, mobileOpen = false, onCloseMobile,
77
77
  // ── Persistent sidebar variant (desktop left slide-over, mobile bottom-sheet) ──────
78
78
  if (variant === "sidebar") {
79
79
  const handleToggle = onToggle ?? close;
80
- return (_jsxs(_Fragment, { children: [desktopOpen && (_jsx(Div, { surface: "overlay-xs", className: "hidden md:block fixed inset-0 backdrop-blur-[2px] z-30", onClick: handleToggle, "aria-hidden": "true" })), _jsxs(Div, { className: "hidden md:flex fixed left-0 z-40 transition-transform duration-300", style: {
81
- top: "var(--header-height, 3.5rem)",
82
- height: "calc(100vh - var(--header-height, 3.5rem))",
83
- width: "13rem",
84
- transform: desktopOpen ? "translateX(0)" : "translateX(calc(-100% + 1.25rem))",
85
- }, children: [_jsxs(Stack, { border: "default", surface: "default", className: `flex-1 border-r dark:border-slate-800 ${__O.hidden}`, shadow: "xl", children: [_jsx(Div, { border: "bottom-subtle", paddingY: "y-sm-tall", className: "shrink-0", padding: "x-md", children: _jsx(Span, { size: "xs", weight: "semibold", transform: "uppercase", color: "muted", children: "My Account" }) }), _jsx(Div, { className: `flex-1 ${__O.yAuto}`, children: _jsx(DrawerContent, { groups: groups, items: items, activeHref: pathname }) })] }), _jsx(SidebarCollapseToggle, { expanded: desktopOpen, onToggle: handleToggle })] }), _jsx(Div, { className: "md:hidden", children: _jsx(BottomSheet, { open: mobileOpen, onClose: close, title: "My Account", children: _jsx(DrawerContent, { groups: groups, items: items, activeHref: pathname, onItemClick: close }) }) })] }));
80
+ return (_jsxs(_Fragment, { children: [desktopOpen && (_jsx(Div, { surface: "overlay-xs", className: "hidden md:block fixed inset-0 backdrop-blur-[2px] z-30", onClick: handleToggle, "aria-hidden": "true" })), _jsxs(Div, { className: `hidden md:flex fixed left-0 z-40 transition-transform duration-300 top-[var(--header-height,3.5rem)] h-[calc(100vh-var(--header-height,3.5rem))] w-[13rem] ${desktopOpen ? "translate-x-0" : "-translate-x-[calc(100%-1.25rem)]"}`, children: [_jsxs(Stack, { border: "default", surface: "default", className: `flex-1 border-r dark:border-[var(--appkit-color-border)] ${__O.hidden}`, shadow: "xl", children: [_jsx(Div, { border: "bottom-subtle", paddingY: "y-sm-tall", className: "shrink-0", padding: "x-md", children: _jsx(Span, { size: "xs", weight: "semibold", transform: "uppercase", color: "muted", children: "My Account" }) }), _jsx(Div, { className: `flex-1 ${__O.yAuto}`, children: _jsx(DrawerContent, { groups: groups, items: items, activeHref: pathname }) })] }), _jsx(SidebarCollapseToggle, { expanded: desktopOpen, onToggle: handleToggle })] }), _jsx(Div, { className: "md:hidden", children: _jsx(BottomSheet, { open: mobileOpen, onClose: close, title: "My Account", children: _jsx(DrawerContent, { groups: groups, items: items, activeHref: pathname, onItemClick: close }) }) })] }));
86
81
  }
87
82
  // ── Overlay variant (default) — portal on desktop, bottom-sheet on mobile ─
88
83
  const content = (_jsx(DrawerContent, { groups: groups, items: items, activeHref: pathname, onItemClick: close }));
@@ -106,7 +106,7 @@ export function UserSupportView(_props) {
106
106
  }
107
107
  function renderTicketListArea(props) {
108
108
  const { isLoading, error, tickets, setSelectedTicket, setDetailOpen } = props;
109
- return (_jsxs(_Fragment, { children: [isLoading && (_jsx(Stack, { gap: "3", children: [1, 2, 3].map((i) => _jsx(Div, { className: "h-16 animate-pulse", surface: "subtle", rounded: "lg" }, i)) })), error && (_jsx(Div, { textSize: "sm", className: "border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: "Failed to load support tickets." })), !isLoading && tickets.length === 0 && (_jsx(Div, { className: "text-center", surface: "muted", paddingY: "y-2xl", paddingX: "x-lg", rounded: "xl", border: "default", children: _jsx(Text, { size: "sm", color: "muted", children: "You haven't opened any support tickets yet." }) })), _jsx(Ul, { spacing: "loose", children: tickets.map((ticket) => (_jsx(Li, { children: _jsx(Button, { rounded: "xl", variant: "ghost", type: "button", className: "w-full border border-zinc-200 bg-white p-4 text-left shadow-sm hover:border-primary-300 transition-colors dark:border-zinc-700 dark:bg-zinc-900", onClick: () => { setSelectedTicket(ticket); setDetailOpen(true); }, children: _jsxs(Row, { align: "start", justify: "between", gap: "sm", children: [_jsxs(Div, { className: "min-w-0 flex-1", children: [_jsx(Text, { className: "truncate", color: "primary", weight: "medium", children: ticket.subject }), _jsxs(Text, { size: "xs", color: "muted", children: [ticket.category.replace(/_/g, " "), ticket.orderId ? ` · Order: ${ticket.orderId}` : ""] })] }), _jsx(Span, { size: "xs", weight: "medium", className: `shrink-0 inline-flex ${STATUS_BADGE[ticket.status] ?? STATUS_BADGE.open}`, padding: "pill-sm", rounded: "full", children: ticket.status.replace(/_/g, " ") })] }) }) }, ticket.id))) })] }));
109
+ return (_jsxs(_Fragment, { children: [isLoading && (_jsx(Stack, { gap: "3", children: [1, 2, 3].map((i) => _jsx(Div, { className: "h-16 animate-pulse", surface: "subtle", rounded: "lg" }, i)) })), error && (_jsx(Div, { textSize: "sm", className: "border border-error/20", color: "error", surface: "danger-surface", padding: "inline", rounded: "xl", children: "Failed to load support tickets." })), !isLoading && tickets.length === 0 && (_jsx(Div, { className: "text-center", surface: "muted", paddingY: "y-2xl", paddingX: "x-lg", rounded: "xl", border: "default", children: _jsx(Text, { size: "sm", color: "muted", children: "You haven't opened any support tickets yet." }) })), _jsx(Ul, { spacing: "loose", children: tickets.map((ticket) => (_jsx(Li, { children: _jsx(Button, { rounded: "xl", variant: "ghost", type: "button", shadow: "sm", border: "default", paddingX: "md", paddingY: "md", className: "w-full bg-[var(--appkit-color-surface)] text-left hover:border-[var(--appkit-color-primary-300)] transition-colors", onClick: () => { setSelectedTicket(ticket); setDetailOpen(true); }, children: _jsxs(Row, { align: "start", justify: "between", gap: "sm", children: [_jsxs(Div, { className: "min-w-0 flex-1", children: [_jsx(Text, { className: "truncate", color: "primary", weight: "medium", children: ticket.subject }), _jsxs(Text, { size: "xs", color: "muted", children: [ticket.category.replace(/_/g, " "), ticket.orderId ? ` · Order: ${ticket.orderId}` : ""] })] }), _jsx(Span, { size: "xs", weight: "medium", className: `shrink-0 inline-flex ${STATUS_BADGE[ticket.status] ?? STATUS_BADGE.open}`, padding: "pill-sm", rounded: "full", children: ticket.status.replace(/_/g, " ") })] }) }) }, ticket.id))) })] }));
110
110
  }
111
111
  function renderNewTicketDrawer(props) {
112
112
  const { newTicketOpen, setNewTicketOpen, newCategory, setNewCategory, newSubject, setNewSubject, newOrderId, setNewOrderId, newDescription, setNewDescription, createMutation } = props;
@@ -7,9 +7,9 @@
7
7
  * are encrypted at rest via the existing `encryptPiiFields` pipeline; the
8
8
  * repository overrides `createWithId` and `create` to inject encryption.
9
9
  */
10
+ import type { BaseDocument } from "../../../_internal/shared/types/base-document";
10
11
  export type AddressOwnerType = "user" | "store";
11
- export interface AddressDocument {
12
- id: string;
12
+ export interface AddressDocument extends BaseDocument {
13
13
  ownerType: AddressOwnerType;
14
14
  ownerId: string;
15
15
  label: string;
@@ -23,8 +23,6 @@ export interface AddressDocument {
23
23
  postalCode: string;
24
24
  country: string;
25
25
  isDefault: boolean;
26
- createdAt: Date;
27
- updatedAt: Date;
28
26
  }
29
27
  export declare const ADDRESSES_COLLECTION: "addresses";
30
28
  export declare const ADDRESS_INDEXED_FIELDS: readonly ["ownerType", "ownerId", "isDefault", "createdAt"];
@@ -3,7 +3,7 @@ import { BarChart2 } from "lucide-react";
3
3
  import { Alert, Div, Heading, Li, Row, Section, Span, Stack, Text, Ul } from "../../../ui";
4
4
  import { GC } from "../../_guide-cls";
5
5
  export function AdminAnalyticsGuideView() {
6
- return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", align: "center", justify: "center", rounded: "xl", style: { background: "linear-gradient(135deg,var(--appkit-color-primary-700) 0%,var(--appkit-color-cobalt) 100%)" }, children: _jsx(BarChart2, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Admin Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Analytics" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Revenue, order funnel, product performance, and store metrics on LetItRip." })] }), [
6
+ return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10 [background:linear-gradient(135deg,var(--appkit-color-primary-700)_0%,var(--appkit-color-cobalt)_100%)]", align: "center", justify: "center", rounded: "xl", children: _jsx(BarChart2, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Admin Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Analytics" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Revenue, order funnel, product performance, and store metrics on LetItRip." })] }), [
7
7
  {
8
8
  title: "Revenue Dashboard",
9
9
  content: (_jsxs(Ul, { className: GC.listMuted, children: [_jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "GMV (Gross Merchandise Value)" }), ": Total order subtotals across all stores. Does not deduct platform commission or refunds."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Net Revenue" }), ": GMV \u00D7 platformFee \u2014 refunded orders excluded."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Period filter" }), ": Last 7 / 30 / 90 days, or custom date range. All monetary values shown in INR."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Payout total" }), ": Total disbursed to sellers in the same period. Revenue - Payout = Platform earnings."] })] })),
@@ -20,5 +20,5 @@ export function AdminAnalyticsGuideView() {
20
20
  title: "Store-Level Metrics",
21
21
  content: (_jsxs(_Fragment, { children: [_jsx(Text, { className: "text-[var(--appkit-color-text-muted)] mb-3", size: "sm", children: "Filter analytics by store to see individual seller performance. Available metrics:" }), _jsxs(Ul, { className: "list-inside text-[var(--appkit-color-text-muted)]", marker: "disc", spacing: "tight", size: "sm", children: [_jsx(Li, { children: "Total orders and completion rate" }), _jsx(Li, { children: "Average order value" }), _jsx(Li, { children: "Return and refund rate" }), _jsx(Li, { children: "Average seller rating" }), _jsx(Li, { children: "Payout history" })] }), _jsx(Alert, { variant: "info", className: "mt-4", children: "Store analytics are visible to the store owner in their seller dashboard. Admin sees the full platform view. Do not share a specific store's metrics with other stores." })] })),
22
22
  },
23
- ].map(({ title, content }) => (_jsxs(Section, { className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] overflow-hidden", rounded: "2xl", children: [_jsxs(Row, { className: "border-b border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-2,var(--appkit-color-border))]/20", padding: "inlineLg", align: "center", gap: "3", children: [_jsx(BarChart2, { className: "w-5 h-5 text-[var(--appkit-color-primary)]" }), _jsx(Heading, { level: 2, size: "base", weight: "semibold", children: title })] }), _jsx(Div, { paddingY: "y-md-lg", padding: "x-lg", children: content })] }, title)))] }));
23
+ ].map(({ title, content }) => (_jsxs(Section, { overflow: "hidden", className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)]", rounded: "2xl", children: [_jsxs(Row, { className: "border-b border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-2,var(--appkit-color-border))]/20", padding: "inlineLg", align: "center", gap: "3", children: [_jsx(BarChart2, { className: "w-5 h-5 text-[var(--appkit-color-primary)]" }), _jsx(Heading, { level: 2, size: "base", weight: "semibold", children: title })] }), _jsx(Div, { paddingY: "y-md-lg", padding: "x-lg", children: content })] }, title)))] }));
24
24
  }
@@ -200,6 +200,6 @@ export function AdminBlogEditorView({ postId, onSaved, onDeleted, embedded, ...r
200
200
  }
201
201
  const previewSection = (_jsxs("div", { className: "rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-raised)] p-5 max-h-[calc(100vh-12rem)] overflow-y-auto", children: [_jsx(Row, { textSize: "xs", textWeight: "semibold", color: "muted", className: "mb-3 uppercase tracking-wide", align: "center", gap: "sm", children: _jsx(Span, { children: "Live preview" }) }), draft.coverImage ? (_jsx("img", { src: draft.coverImage, alt: "", className: "w-full rounded-md mb-4 object-cover max-h-64" })) : null, _jsx(Heading, { level: 1, className: "mb-1", size: "2xl", weight: "bold", children: draft.title || "Untitled post" }), _jsxs(Text, { className: "text-[var(--appkit-color-text-muted)] mb-4", size: "xs", children: [draft.authorName || "Anonymous", draft.category ? ` · ${draft.category}` : ""] }), draft.excerpt ? (_jsx(Text, { className: "italic text-[var(--appkit-color-text-secondary)] mb-4", children: draft.excerpt })) : null, _jsx(RichTextRenderer, { html: draft.content || "<em>No content yet…</em>" }), draft.tags.length > 0 ? (_jsx(Row, { wrap: true, gap: "xs", className: "mt-6", children: draft.tags.map((t) => (_jsxs(Span, { size: "xs", className: "bg-[var(--appkit-color-surface)] border border-[var(--appkit-color-border)]", rounded: "full", padding: "pill-xs", children: ["#", t] }, t))) })) : null] }, "preview"));
202
202
  return (_jsx(StackedViewShell, { portal: "admin", ...rest, title: isEdit ? "Edit Post" : "New Blog Post", sections: [
203
- _jsxs(Div, { className: "lg:grid lg:grid-cols-[3fr_2fr] lg:gap-6", children: [_jsx(Div, { children: formContent }), _jsx(Div, { className: "mt-6 lg:mt-0 lg:sticky lg:top-4 lg:self-start", children: previewSection })] }, "split"),
203
+ _jsxs(Div, { className: "lg:grid lg:grid-cols-[3fr_2fr] lg:gap-[1.5rem]", children: [_jsx(Div, { children: formContent }), _jsx(Div, { className: "mt-6 lg:mt-0 lg:sticky lg:top-4 lg:self-start", children: previewSection })] }, "split"),
204
204
  ] }));
205
205
  }
@@ -98,7 +98,7 @@ export function AdminBundlesView({ getEditHref, newHref }) {
98
98
  return parts.join(",") || undefined;
99
99
  },
100
100
  getRowHref: getEditHref,
101
- toolbarExtra: (_jsx(Button, { asChild: true, size: "sm", variant: "primary", children: _jsxs(TextLink, { href: newHref, className: "flex items-center gap-1.5", children: ["+ ", BUNDLE_COPY.adminList.newButton] }) })),
101
+ toolbarExtra: (_jsx(Button, { asChild: true, size: "sm", variant: "primary", children: _jsxs(TextLink, { href: newHref, layout: "flex", align: "center", gap: "xs", children: ["+ ", BUNDLE_COPY.adminList.newButton] }) })),
102
102
  buildBulkActions: (selection) => [
103
103
  buildBulkAction(ACTIONS.ADMIN["activate-bundle"], async () => {
104
104
  await Promise.all(selection.selectedIds.map((id) => fetch(ADMIN_ENDPOINTS.BUNDLE_BY_ID(id), {
@@ -67,7 +67,7 @@ const TEXT_ALIGN_OPTIONS = [
67
67
  // ── Zone Picker ──────────────────────────────────────────────────────────────
68
68
  function ZonePicker({ selected, onChange, disabled, }) {
69
69
  const zones = [1, 2, 3, 4, 5, 6];
70
- return (_jsxs(Div, { children: [_jsx(Text, { className: "mb-1", color: "muted", size: "xs", children: "Zone (row \u00D7 col grid)" }), _jsx("div", { className: "grid gap-1", style: { gridTemplateRows: "repeat(2, 1fr)", gridTemplateColumns: "repeat(3, 1fr)", width: 150 }, children: zones.map((z) => {
70
+ return (_jsxs(Div, { children: [_jsx(Text, { className: "mb-1", color: "muted", size: "xs", children: "Zone (row \u00D7 col grid)" }), _jsx(Div, { layout: "grid", gap: "1", className: "grid-rows-2 grid-cols-3 w-[150px]", children: zones.map((z) => {
71
71
  const isDisabled = disabled?.(z) ?? false;
72
72
  return (_jsx("button", { type: "button", disabled: isDisabled, onClick: () => !isDisabled && onChange(z), className: `rounded text-xs font-mono py-2 border transition-colors ${selected === z
73
73
  ? "bg-primary text-white border-primary"
@@ -4,7 +4,7 @@ import { Alert, Code, Div, Heading, Li, Row, Section, Span, Stack, Text, Ul } fr
4
4
  import { GC } from "../../_guide-cls";
5
5
  const CLS_CODE = "text-xs bg-amber-100 dark:bg-amber-900/30 px-1 rounded";
6
6
  export function AdminCatalogGuideView() {
7
- return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", align: "center", justify: "center", rounded: "xl", style: { background: "linear-gradient(135deg,var(--appkit-color-primary-700) 0%,var(--appkit-color-cobalt) 100%)" }, children: _jsx(Package, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Admin Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Catalog" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Products, categories, brands, and reviews \u2014 how the LetItRip catalog is structured and managed." })] }), [
7
+ return (_jsxs(Stack, { className: "max-w-3xl mx-auto", padding: "b-2xl", gap: "xl", children: [_jsxs(Section, { children: [_jsxs(Row, { className: "mb-2", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10 [background:linear-gradient(135deg,var(--appkit-color-primary-700)_0%,var(--appkit-color-cobalt)_100%)]", align: "center", justify: "center", rounded: "xl", children: _jsx(Package, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Admin Guide" })] }), _jsx(Heading, { level: 1, className: "text-[var(--appkit-color-text)] mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: "Catalog" }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: "Products, categories, brands, and reviews \u2014 how the LetItRip catalog is structured and managed." })] }), [
8
8
  {
9
9
  Icon: Package, title: "Product Management",
10
10
  content: (_jsxs(Ul, { className: GC.listMuted, children: [_jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Listing types" }), ": ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "standard" }), " (prefix ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "product-" }), "), ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "auction" }), " (prefix ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "auction-" }), "), ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "pre-order" }), " (prefix ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "preorder-" }), ")."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Admin vs store creation" }), ": Admins can create products on behalf of any store via the store picker in AdminProductEditorView."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Status lifecycle" }), ": DRAFT \u2192 PUBLISHED \u2192 ARCHIVED. Published products appear in search. Archived products are hidden but not deleted."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "J13 rule" }), ": Always use ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "listingType" }), " field \u2014 the legacy ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "isAuction" }), "/", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "isPreOrder" }), " booleans have been removed. All queries use ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "where(\"listingType\", \"==\", x)" }), "."] }), _jsxs(Li, { children: [_jsx(Span, { weight: "bold", children: "Media URLs" }), ": Never write raw Firebase Storage URLs to Firestore. All product image URLs must use the ", _jsx(Code, { size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "/api/media/[slug]" }), " proxy format."] })] })),
@@ -25,5 +25,5 @@ export function AdminCatalogGuideView() {
25
25
  Icon: AlertTriangle, title: "Common Admin Mistakes",
26
26
  content: (_jsx(Alert, { variant: "warning", children: _jsxs(Ul, { spacing: "tight", size: "sm", children: [_jsx(Li, { children: "\u2717 Publishing a product with no images \u2014 buyers cannot evaluate it." }), _jsxs(Li, { children: ["\u2717 Creating a subcategory without setting ", _jsx(Code, { className: CLS_CODE, children: "rootId" }), " \u2014 category tree breaks."] }), _jsxs(Li, { children: ["\u2717 Setting ", _jsx(Code, { className: CLS_CODE, children: "parentId" }), " of a root category to anything other than ", _jsx(Code, { className: CLS_CODE, children: "null" }), " \u2014 creates circular hierarchy."] }), _jsx(Li, { children: "\u2717 Duplicating brand slugs \u2014 Firestore document ID collision, second write silently overwrites the first." }), _jsx(Li, { children: "\u2717 Writing raw Firebase Storage URLs to Firestore \u2014 breaks the media watermark proxy and CDN caching." })] }) })),
27
27
  },
28
- ].map(({ Icon, title, content }) => (_jsxs(Section, { className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] overflow-hidden", rounded: "2xl", children: [_jsxs(Row, { className: "border-b border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-2,var(--appkit-color-border))]/20", padding: "inlineLg", align: "center", gap: "3", children: [_jsx(Icon, { className: "w-5 h-5 text-[var(--appkit-color-primary)]" }), _jsx(Heading, { level: 2, size: "base", weight: "semibold", children: title })] }), _jsx(Div, { paddingY: "y-md-lg", padding: "x-lg", children: content })] }, title)))] }));
28
+ ].map(({ Icon, title, content }) => (_jsxs(Section, { overflow: "hidden", className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)]", rounded: "2xl", children: [_jsxs(Row, { className: "border-b border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-2,var(--appkit-color-border))]/20", padding: "inlineLg", align: "center", gap: "3", children: [_jsx(Icon, { className: "w-5 h-5 text-[var(--appkit-color-primary)]" }), _jsx(Heading, { level: 2, size: "base", weight: "semibold", children: title })] }), _jsx(Div, { paddingY: "y-md-lg", padding: "x-lg", children: content })] }, title)))] }));
29
29
  }