@mohasinac/appkit 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/dist/_internal/client/features/layout/SidebarCollapseToggle.js +1 -5
  2. package/dist/_internal/server/features/auctions/actions.js +0 -1
  3. package/dist/_internal/server/features/auctions/og.js +0 -1
  4. package/dist/_internal/server/features/auctions/service.js +0 -4
  5. package/dist/_internal/server/features/auth/capabilities.js +0 -1
  6. package/dist/_internal/server/features/blog/actions.js +0 -2
  7. package/dist/_internal/server/features/brands/actions.js +0 -2
  8. package/dist/_internal/server/features/cart/actions.js +0 -3
  9. package/dist/_internal/server/features/checkout/actions.js +11 -20
  10. package/dist/_internal/server/features/events/actions.js +0 -3
  11. package/dist/_internal/server/features/events/og.js +0 -1
  12. package/dist/_internal/server/features/events/service.js +0 -2
  13. package/dist/_internal/server/features/grouped/data.js +0 -2
  14. package/dist/_internal/server/features/orders/actions.js +0 -4
  15. package/dist/_internal/server/features/pre-orders/actions.js +0 -1
  16. package/dist/_internal/server/features/pre-orders/og.js +0 -1
  17. package/dist/_internal/server/features/pre-orders/service.js +0 -1
  18. package/dist/_internal/server/features/products/actions.js +0 -6
  19. package/dist/_internal/server/features/products/service.js +0 -1
  20. package/dist/_internal/server/features/promotions/actions.js +0 -3
  21. package/dist/_internal/server/features/reviews/actions.js +0 -3
  22. package/dist/_internal/server/functions/https.js +0 -6
  23. package/dist/_internal/server/functions/manifest.js +0 -1
  24. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +1 -1
  25. package/dist/_internal/server/jobs/core/wrapJobHandler.js +0 -1
  26. package/dist/_internal/shared/listing-types/action-tracker.js +1 -1
  27. package/dist/_internal/shared/serialization/index.js +0 -4
  28. package/dist/_internal/shared/styles/themed.js +0 -3
  29. package/dist/client/api/ApiError.js +1 -4
  30. package/dist/client/api/surface-error.js +0 -1
  31. package/dist/client/api/useApiQuery.js +0 -1
  32. package/dist/configs/next.js +0 -1
  33. package/dist/configs/tailwind.js +0 -1
  34. package/dist/contracts/field-ops.js +0 -2
  35. package/dist/core/EventBus.js +0 -2
  36. package/dist/core/Logger.js +0 -6
  37. package/dist/core/Queue.js +0 -2
  38. package/dist/core/hooks/useSyncManager.js +4 -4
  39. package/dist/core/mutation-events.js +0 -1
  40. package/dist/core/newsletter.repository.js +2 -6
  41. package/dist/errors/api-error.js +0 -1
  42. package/dist/errors/authentication-error.js +0 -1
  43. package/dist/errors/authorization-error.js +0 -1
  44. package/dist/errors/base-error.js +1 -3
  45. package/dist/errors/database-error.js +0 -1
  46. package/dist/errors/error-handler.js +1 -5
  47. package/dist/errors/error-mapping.js +1 -6
  48. package/dist/errors/normalize.js +0 -4
  49. package/dist/errors/not-found-error.js +0 -1
  50. package/dist/errors/razorpay-unreachable.js +0 -1
  51. package/dist/errors/validation-error.js +0 -1
  52. package/dist/features/about/components/FAQPageView.js +1 -3
  53. package/dist/features/about/components/FeesView.js +1 -3
  54. package/dist/features/about/components/HelpPageView.js +1 -3
  55. package/dist/features/about/components/PublicProfileView.js +4 -4
  56. package/dist/features/account/components/AddressBook.js +1 -3
  57. package/dist/features/account/components/AddressForm.js +0 -1
  58. package/dist/features/account/components/AddressesIndexListing.js +0 -1
  59. package/dist/features/account/components/MessagesView.js +1 -3
  60. package/dist/features/account/components/NotificationBell.js +3 -14
  61. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  62. package/dist/features/account/components/UserOffersPanel.js +0 -2
  63. package/dist/features/account/components/UserSidebar.js +1 -3
  64. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  65. package/dist/features/admin/components/AdminBundleEditorView.js +0 -1
  66. package/dist/features/admin/components/AdminBundlesView.js +0 -1
  67. package/dist/features/admin/components/AdminCarouselEditorView.js +1 -5
  68. package/dist/features/admin/components/AdminCarouselView.js +1 -4
  69. package/dist/features/admin/components/AdminCartsView.js +0 -1
  70. package/dist/features/admin/components/AdminMediaView.js +1 -3
  71. package/dist/features/admin/components/AdminPayoutsView.js +0 -1
  72. package/dist/features/admin/components/AdminProductsView.js +1 -3
  73. package/dist/features/admin/components/AdminSidebar.js +1 -3
  74. package/dist/features/admin/components/AdminSiteSettingsView.js +1 -5
  75. package/dist/features/admin/components/AdminSupportTicketDetailView.js +7 -13
  76. package/dist/features/admin/components/DashboardStats.js +1 -7
  77. package/dist/features/admin/components/DataListingView.js +1 -5
  78. package/dist/features/admin/components/DataTable.js +1 -3
  79. package/dist/features/admin/components/analytics/AdminAnalyticsCharts.js +1 -3
  80. package/dist/features/admin/components/analytics/AdminStatCard.js +1 -7
  81. package/dist/features/admin/components/analytics/AdminTopProductsTable.js +1 -3
  82. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +0 -5
  83. package/dist/features/admin/hooks/useAdminListingData.js +0 -5
  84. package/dist/features/admin/hooks/useChat.js +0 -3
  85. package/dist/features/admin/repository/chat.repository.js +0 -1
  86. package/dist/features/admin/repository/notification.repository.js +1 -4
  87. package/dist/features/auctions/components/AuctionBidsTable.js +1 -7
  88. package/dist/features/auctions/components/AuctionDetailPageView.js +1 -6
  89. package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -15
  90. package/dist/features/auctions/components/PlaceBidFormClient.js +0 -3
  91. package/dist/features/auctions/repository/bid.repository.js +0 -1
  92. package/dist/features/auth/components/ForgotPasswordView.js +0 -1
  93. package/dist/features/auth/components/LoginForm.js +0 -1
  94. package/dist/features/auth/components/RegisterForm.js +0 -1
  95. package/dist/features/auth/components/ResetPasswordView.js +0 -1
  96. package/dist/features/auth/hooks/useAuth.js +0 -1
  97. package/dist/features/auth/repository/session.repository.js +0 -1
  98. package/dist/features/auth/repository/token.repository.js +0 -2
  99. package/dist/features/auth/repository/user.repository.js +0 -1
  100. package/dist/features/blog/api/[slug]/route.js +1 -1
  101. package/dist/features/blog/components/BlogFeaturedCard.js +1 -5
  102. package/dist/features/blog/components/BlogIndexListing.js +0 -1
  103. package/dist/features/blog/components/BlogListView.js +1 -5
  104. package/dist/features/blog/components/BlogPostView.js +1 -3
  105. package/dist/features/cart/components/CartDrawer.js +2 -6
  106. package/dist/features/cart/repository/cart.repository.js +0 -1
  107. package/dist/features/categories/api/route.js +0 -1
  108. package/dist/features/categories/components/BrandDetailPageView.js +1 -13
  109. package/dist/features/categories/components/BundleDetailView.js +1 -5
  110. package/dist/features/categories/components/BundleItemsPicker.js +1 -5
  111. package/dist/features/categories/components/CategoriesIndexListing.js +0 -1
  112. package/dist/features/categories/components/CategoriesIndexPageView.js +0 -1
  113. package/dist/features/categories/components/CategoryBundlesListing.js +1 -3
  114. package/dist/features/categories/components/CategoryDetailPageView.js +1 -16
  115. package/dist/features/categories/components/CategoryGrid.js +1 -5
  116. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  117. package/dist/features/categories/components/CategoryTableColumns.js +2 -6
  118. package/dist/features/categories/components/CategoryTree.js +1 -3
  119. package/dist/features/categories/components/ConcernCard.js +1 -3
  120. package/dist/features/collections/components/CollectionCard.js +1 -5
  121. package/dist/features/contact/email.js +0 -1
  122. package/dist/features/events/actions/event-actions.js +0 -1
  123. package/dist/features/events/api/[id]/route.js +0 -1
  124. package/dist/features/events/components/AdminEventEditorView.js +1 -2
  125. package/dist/features/events/components/EventCard.js +2 -8
  126. package/dist/features/events/components/EventRaffleEntryForm.js +1 -3
  127. package/dist/features/events/components/EventRaffleWinnerView.js +1 -3
  128. package/dist/features/events/components/EventRafflesSection.js +0 -1
  129. package/dist/features/events/components/EventsIndexListing.js +0 -1
  130. package/dist/features/events/hooks/useBulkEvent.js +0 -1
  131. package/dist/features/events/repository/event-entry.repository.js +0 -1
  132. package/dist/features/faq/components/ContactCTA.js +1 -3
  133. package/dist/features/faq/components/FAQAccordion.js +1 -3
  134. package/dist/features/faq/components/FAQCategorySidebar.js +1 -3
  135. package/dist/features/faq/components/RelatedFAQs.js +1 -5
  136. package/dist/features/filters/AsyncFacetSection.js +1 -3
  137. package/dist/features/filters/FilterFacetSection.js +4 -14
  138. package/dist/features/forms/Checkbox.js +1 -3
  139. package/dist/features/forms/Slider.js +1 -3
  140. package/dist/features/history/hooks/useHistory.js +0 -1
  141. package/dist/features/history/repository/user-history.repository.js +0 -2
  142. package/dist/features/homepage/actions/carousel-actions.js +0 -1
  143. package/dist/features/homepage/actions/homepage-section-actions.js +1 -3
  144. package/dist/features/homepage/api/carousel/route.js +0 -1
  145. package/dist/features/homepage/api/route.js +0 -1
  146. package/dist/features/homepage/components/AdSlot.js +3 -9
  147. package/dist/features/homepage/components/AdvertisementBanner.js +2 -12
  148. package/dist/features/homepage/components/BeforeAfterCard.js +1 -5
  149. package/dist/features/homepage/components/CharacterHotspotForm.js +2 -10
  150. package/dist/features/homepage/components/CollectionCardsSection.js +1 -3
  151. package/dist/features/homepage/components/CustomCardsSection.js +1 -5
  152. package/dist/features/homepage/components/FeaturedResultsSection.js +1 -3
  153. package/dist/features/homepage/components/GoogleReviewsSection.js +1 -3
  154. package/dist/features/homepage/components/HeroCarousel.js +5 -26
  155. package/dist/features/homepage/components/HeroSection.js +2 -6
  156. package/dist/features/homepage/components/HowItWorksSection.js +2 -8
  157. package/dist/features/homepage/components/MarketplaceHomepageView.js +0 -8
  158. package/dist/features/homepage/components/NewsletterBanner.js +2 -10
  159. package/dist/features/homepage/components/PromoGrid.js +1 -3
  160. package/dist/features/homepage/components/SecurityHighlightsSection.js +2 -6
  161. package/dist/features/homepage/components/ShopByCategorySection.js +2 -6
  162. package/dist/features/homepage/components/SocialPostCard.js +1 -3
  163. package/dist/features/homepage/components/StatsCounterSection.js +1 -5
  164. package/dist/features/homepage/components/TrustBadges.js +1 -3
  165. package/dist/features/homepage/components/TrustFeaturesSection.js +1 -3
  166. package/dist/features/homepage/components/WelcomeSection.js +2 -16
  167. package/dist/features/homepage/components/WhatsAppCommunitySection.js +1 -5
  168. package/dist/features/homepage/lib/social-feed-fetcher.js +0 -8
  169. package/dist/features/layout/AppLayoutShell.js +1 -3
  170. package/dist/features/layout/BottomNavbar.js +1 -11
  171. package/dist/features/media/MediaAudio.js +2 -6
  172. package/dist/features/media/MediaImage.js +0 -1
  173. package/dist/features/media/MediaLightbox.js +3 -9
  174. package/dist/features/media/MediaVideo.js +2 -8
  175. package/dist/features/media/upload/MediaUploadField.js +1 -3
  176. package/dist/features/messages/hooks/useConversation.js +0 -2
  177. package/dist/features/messages/hooks/useConversations.js +0 -1
  178. package/dist/features/messages/repository/conversations.repository.js +0 -1
  179. package/dist/features/orders/api/track/[trackingId]/route.js +0 -1
  180. package/dist/features/orders/components/OrdersList.js +1 -3
  181. package/dist/features/orders/components/RefundHistoryTable.js +1 -3
  182. package/dist/features/orders/repository/orders.repository.js +0 -2
  183. package/dist/features/payments/repository/payout.repository.js +0 -1
  184. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +2 -6
  185. package/dist/features/pre-orders/components/PreOrderActionsClient.js +0 -1
  186. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -3
  187. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -5
  188. package/dist/features/products/api/route.js +1 -3
  189. package/dist/features/products/components/CompareOverlay.js +1 -6
  190. package/dist/features/products/components/FeatureBadge.js +1 -3
  191. package/dist/features/products/components/MakeOfferButton.js +0 -2
  192. package/dist/features/products/components/MarketplaceBundleCard.js +1 -3
  193. package/dist/features/products/components/MarketplacePrizeDrawCard.js +1 -3
  194. package/dist/features/products/components/PrizeDrawDetailPageView.js +0 -2
  195. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -3
  196. package/dist/features/products/components/PrizeDrawsSection.js +1 -3
  197. package/dist/features/products/components/ProductDetailPageView.js +0 -6
  198. package/dist/features/products/components/ProductFeatureBadges.js +1 -3
  199. package/dist/features/products/components/ProductFeaturesSelector.js +0 -1
  200. package/dist/features/products/components/ProductGrid.js +5 -15
  201. package/dist/features/products/components/ShareButton.js +1 -1
  202. package/dist/features/products/components/ShowGroupSection.js +3 -7
  203. package/dist/features/products/components/SublistingCarouselSection.js +2 -4
  204. package/dist/features/products/repository/product-features.repository.js +0 -1
  205. package/dist/features/products/repository/products.repository.js +0 -1
  206. package/dist/features/promotions/components/CouponCard.js +2 -5
  207. package/dist/features/promotions/repository/coupons.repository.js +0 -1
  208. package/dist/features/reviews/api/route.js +0 -1
  209. package/dist/features/reviews/components/ReviewDetailShell.js +3 -13
  210. package/dist/features/reviews/components/ReviewModal.js +1 -5
  211. package/dist/features/reviews/components/ReviewSummary.js +2 -6
  212. package/dist/features/reviews/components/ReviewsIndexListing.js +0 -1
  213. package/dist/features/reviews/components/ReviewsList.js +1 -7
  214. package/dist/features/reviews/repository/reviews.repository.js +0 -3
  215. package/dist/features/scams/actions/scam-actions.js +1 -1
  216. package/dist/features/scams/components/ScamProfileView.js +1 -3
  217. package/dist/features/search/components/Search.js +2 -8
  218. package/dist/features/search/components/SearchFiltersRow.js +1 -3
  219. package/dist/features/seller/components/PhysicalLocationModal.js +1 -5
  220. package/dist/features/seller/components/SellerAddressesView.js +1 -6
  221. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +1 -4
  222. package/dist/features/seller/components/SellerBidsView.js +1 -3
  223. package/dist/features/seller/components/SellerBundlesView.js +0 -1
  224. package/dist/features/seller/components/SellerCouponEditorView.js +1 -3
  225. package/dist/features/seller/components/SellerFeaturesView.js +0 -1
  226. package/dist/features/seller/components/SellerGoogleReviewsView.js +1 -1
  227. package/dist/features/seller/components/SellerLiveView.js +1 -3
  228. package/dist/features/seller/components/SellerOffersPanel.js +0 -2
  229. package/dist/features/seller/components/SellerOrdersView.js +1 -6
  230. package/dist/features/seller/components/SellerPayoutMethodsView.js +0 -1
  231. package/dist/features/seller/components/SellerPayoutRequestView.js +1 -1
  232. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  233. package/dist/features/seller/components/SellerProductShell.js +2 -4
  234. package/dist/features/seller/components/SellerProductsCards.js +1 -3
  235. package/dist/features/seller/components/SellerProductsView.js +1 -7
  236. package/dist/features/seller/components/SellerReviewsView.js +1 -4
  237. package/dist/features/seller/components/SellerShippingConfigsView.js +1 -4
  238. package/dist/features/seller/components/SellerShippingView.js +1 -1
  239. package/dist/features/seller/components/SellerSidebar.js +4 -12
  240. package/dist/features/seller/components/SellerStoreCategoriesView.js +0 -2
  241. package/dist/features/seller/components/SellerTemplatesView.js +0 -1
  242. package/dist/features/seller/components/analytics/SellerRevenueChart.js +1 -3
  243. package/dist/features/seller/components/analytics/SellerTopProducts.js +1 -3
  244. package/dist/features/seller/hooks/useSellerListingData.js +0 -5
  245. package/dist/features/seller/repository/offer.repository.js +0 -1
  246. package/dist/features/shell/FormShell.js +2 -15
  247. package/dist/features/shell/QuickFormDrawer.js +1 -5
  248. package/dist/features/site-settings/components/NavPermissionsManager.js +1 -3
  249. package/dist/features/site-settings/components/ThemeManagerView.js +0 -1
  250. package/dist/features/stores/api/[storeSlug]/reviews/route.js +0 -1
  251. package/dist/features/stores/components/StoreHeader.js +1 -7
  252. package/dist/features/stores/components/StoreReviewsListing.js +0 -1
  253. package/dist/features/stores/components/StoresIndexListing.js +0 -1
  254. package/dist/features/stores/repository/store.repository.js +0 -2
  255. package/dist/features/support/repository/support.repository.js +0 -1
  256. package/dist/features/wishlist/components/WishlistPage.js +1 -3
  257. package/dist/features/wishlist/hooks/useWishlistCount.js +1 -1
  258. package/dist/features/wishlist/repository/user-wishlist.repository.js +0 -2
  259. package/dist/http/ApiClient.js +4 -12
  260. package/dist/index.js +0 -1
  261. package/dist/monitoring/client-logger.js +7 -22
  262. package/dist/monitoring/error-tracking.js +0 -1
  263. package/dist/monitoring/performance.js +0 -1
  264. package/dist/monitoring/server-logger.js +11 -33
  265. package/dist/next/api/api-response.js +1 -4
  266. package/dist/next/api/apiHandler.js +1 -5
  267. package/dist/next/api/errorHandler.js +0 -3
  268. package/dist/next/api/parseJsonBody.js +0 -1
  269. package/dist/next/api/routeHandler.js +1 -6
  270. package/dist/next/cache-middleware.js +1 -3
  271. package/dist/next/middleware/chain.js +0 -1
  272. package/dist/next/middleware/pii-scrubber.js +0 -2
  273. package/dist/providers/auth-firebase/provider.js +0 -1
  274. package/dist/providers/db-firebase/admin.js +0 -1
  275. package/dist/providers/db-firebase/base.js +0 -4
  276. package/dist/providers/db-firebase/base.repository.js +0 -3
  277. package/dist/providers/db-firebase/field-ops.js +0 -2
  278. package/dist/providers/db-firebase/helpers.js +0 -4
  279. package/dist/providers/db-firebase/realtime.js +3 -15
  280. package/dist/providers/db-firebase/sieve.js +2 -8
  281. package/dist/providers/payment-razorpay/index.js +0 -3
  282. package/dist/providers/shipping-shiprocket/index.js +0 -1
  283. package/dist/providers/storage-firebase/client.js +0 -4
  284. package/dist/react/contexts/SessionContext.js +0 -1
  285. package/dist/react/hooks/useCountdown.js +0 -1
  286. package/dist/security/authorization.js +0 -1
  287. package/dist/security/pii-encrypt.js +0 -4
  288. package/dist/security/pii-redact.js +0 -3
  289. package/dist/seed/manifest.js +1 -6
  290. package/dist/seed/runner.js +0 -2
  291. package/dist/ui/DataTable.js +2 -6
  292. package/dist/ui/components/Anchor.js +0 -1
  293. package/dist/ui/components/AvatarDisplay.js +1 -3
  294. package/dist/ui/components/BackgroundRenderer.js +2 -6
  295. package/dist/ui/components/BaseListingCard.js +0 -1
  296. package/dist/ui/components/Button.js +0 -3
  297. package/dist/ui/components/Card.js +2 -6
  298. package/dist/ui/components/Details.js +2 -8
  299. package/dist/ui/components/Dialog.js +0 -1
  300. package/dist/ui/components/FallbackShell.js +5 -17
  301. package/dist/ui/components/Fieldset.js +2 -6
  302. package/dist/ui/components/HorizontalRule.js +0 -1
  303. package/dist/ui/components/HotspotMarker.js +1 -3
  304. package/dist/ui/components/IconBox.js +0 -1
  305. package/dist/ui/components/Iframe.js +0 -1
  306. package/dist/ui/components/ImageGallery.js +1 -3
  307. package/dist/ui/components/ImageLightbox.js +1 -5
  308. package/dist/ui/components/Kbd.js +0 -1
  309. package/dist/ui/components/Motion.js +1 -3
  310. package/dist/ui/components/NavbarChevron.js +0 -1
  311. package/dist/ui/components/PasswordStrengthIndicator.js +1 -3
  312. package/dist/ui/components/Progress.js +2 -6
  313. package/dist/ui/components/Quote.js +1 -4
  314. package/dist/ui/components/Responsive.js +0 -4
  315. package/dist/ui/components/RowActionMenu.js +1 -3
  316. package/dist/ui/components/Scrim.js +0 -1
  317. package/dist/ui/components/SiteLogo.js +1 -9
  318. package/dist/ui/components/Skeleton.js +1 -3
  319. package/dist/ui/components/Slider.js +1 -3
  320. package/dist/ui/components/StickyToolbar.js +0 -1
  321. package/dist/ui/components/TabStrip.js +1 -3
  322. package/dist/ui/components/Toast.js +1 -3
  323. package/dist/ui/components/Tooltip.js +1 -4
  324. package/dist/ui/components/UnsavedChangesModal.js +1 -3
  325. package/dist/ui/rich-text/RichText.js +1 -1
  326. package/dist/utils/action-response.js +0 -1
  327. package/dist/utils/date.formatter.js +0 -1
  328. package/dist/utils/object.helper.js +0 -2
  329. package/dist/utils/schema-ui.js +1 -3
  330. package/dist/validation/input.validator.js +0 -1
  331. package/dist/validation/schemas.js +1 -3
  332. package/package.json +5 -2
  333. package/scripts/bundle-css.mjs +47 -0
  334. package/scripts/copy-assets.mjs +34 -0
  335. package/scripts/dedupe-peer-deps.mjs +81 -0
@@ -65,7 +65,6 @@ export function defineTailwindConfig(override = {}) {
65
65
  surface: "var(--appkit-color-info-surface)",
66
66
  },
67
67
  },
68
- // audit-unknown-ok: Tailwind config — third-party shape, plugins can be functions
69
68
  ...(consumerTheme.extend ?? {}),
70
69
  },
71
70
  ...Object.fromEntries(Object.entries(consumerTheme).filter(([k]) => k !== "extend")),
@@ -24,11 +24,9 @@ export function serverTimestamp() {
24
24
  export function increment(n) {
25
25
  return getOps().increment(n);
26
26
  }
27
- // audit-unknown-ok: Firestore arrayUnion/arrayRemove SDK boundary — accepts any FirestoreValue
28
27
  export function arrayUnion(...elements) {
29
28
  return getOps().arrayUnion(...elements);
30
29
  }
31
- // audit-unknown-ok: Firestore arrayUnion/arrayRemove SDK boundary — accepts any FirestoreValue
32
30
  export function arrayRemove(...elements) {
33
31
  return getOps().arrayRemove(...elements);
34
32
  }
@@ -25,7 +25,6 @@ export class EventBus {
25
25
  return { unsubscribe: () => this.off(event, callback) };
26
26
  }
27
27
  once(event, callback) {
28
- // audit-unknown-ok: EventBus variadic payload — caller-defined event shapes
29
28
  const wrapped = (...args) => {
30
29
  callback(...args);
31
30
  this.off(event, wrapped);
@@ -42,7 +41,6 @@ export class EventBus {
42
41
  if (callbacks.length === 0)
43
42
  this.events.delete(event);
44
43
  }
45
- // audit-unknown-ok: EventBus variadic payload — caller-defined event shapes
46
44
  emit(event, ...args) {
47
45
  const callbacks = this.events.get(event);
48
46
  if (!callbacks)
@@ -37,14 +37,12 @@ export class Logger {
37
37
  return Logger.instance;
38
38
  }
39
39
  /** Set or update the data sanitizer (e.g., for PII redaction). */
40
- // audit-unknown-ok: callback entry point — accepts arbitrary payload value
41
40
  static setSanitizer(fn) {
42
41
  Logger.getInstance().options.sanitizer = fn;
43
42
  }
44
43
  shouldLog(level) {
45
44
  return (this.levelPriority[level] >= this.levelPriority[this.options.minLevel]);
46
45
  }
47
- // audit-unknown-ok: logger entry-point — accepts arbitrary serialisable values
48
46
  addLog(level, message, data) {
49
47
  if (!this.shouldLog(level))
50
48
  return;
@@ -116,19 +114,15 @@ export class Logger {
116
114
  // Silently fail
117
115
  }
118
116
  }
119
- // audit-unknown-ok: logger entry-point — accepts arbitrary serialisable values
120
117
  debug(message, data) {
121
118
  this.addLog("debug", message, data);
122
119
  }
123
- // audit-unknown-ok: logger entry-point — accepts arbitrary serialisable values
124
120
  info(message, data) {
125
121
  this.addLog("info", message, data);
126
122
  }
127
- // audit-unknown-ok: logger entry-point — accepts arbitrary serialisable values
128
123
  warn(message, data) {
129
124
  this.addLog("warn", message, data);
130
125
  }
131
- // audit-unknown-ok: logger entry-point — accepts arbitrary serialisable values
132
126
  error(message, data) {
133
127
  this.addLog("error", message, data);
134
128
  }
@@ -34,7 +34,6 @@ export class Queue {
34
34
  .then((result) => {
35
35
  this.results.set(task.id, result);
36
36
  })
37
- // audit-unknown-ok: error-handler entry point — accepts thrown values of any shape
38
37
  .catch((error) => {
39
38
  this.errors.set(task.id, error);
40
39
  })
@@ -42,7 +41,6 @@ export class Queue {
42
41
  this.running--;
43
42
  this.process();
44
43
  })
45
- // audit-unknown-ok: error-handler entry point — accepts thrown values of any shape
46
44
  .catch((err) => {
47
45
  qLogger.error("Queue.process error in finally", { err });
48
46
  });
@@ -30,12 +30,12 @@ async function replayCartOps() {
30
30
  productId: op.productId,
31
31
  quantity: op.quantity ?? 1,
32
32
  })
33
- .catch(() => { }); // audit-silent-catch-ok: offline-replay; failed ops stay queued for next sync tick
33
+ .catch(() => { });
34
34
  }
35
35
  else if (op.op === "remove") {
36
36
  await apiClient
37
37
  .delete(`/api/cart/${op.productId}`)
38
- .catch(() => { }); // audit-silent-catch-ok: offline-replay; failed ops stay queued for next sync tick
38
+ .catch(() => { });
39
39
  }
40
40
  }
41
41
  clearCartOps();
@@ -50,12 +50,12 @@ async function replayWishlistOps() {
50
50
  if (op.op === "add") {
51
51
  await apiClient
52
52
  .post("/api/user/wishlist", { productId: op.itemId })
53
- .catch(() => { }); // audit-silent-catch-ok: offline-replay; failed ops stay queued for next sync tick
53
+ .catch(() => { });
54
54
  }
55
55
  else if (op.op === "remove") {
56
56
  await apiClient
57
57
  .delete(`/api/user/wishlist/${op.itemId}`)
58
- .catch(() => { }); // audit-silent-catch-ok: offline-replay; failed ops stay queued for next sync tick
58
+ .catch(() => { });
59
59
  }
60
60
  }
61
61
  clearWishlistOps();
@@ -127,7 +127,6 @@ export function emitMutation(eventName, payload) {
127
127
  * @param handler Called with the `MutationEventPayload` whenever the event fires.
128
128
  */
129
129
  export function onMutation(eventName, handler) {
130
- // audit-unknown-ok: callback entry point — accepts arbitrary payload value
131
130
  return eventBus.on(eventName, handler);
132
131
  }
133
132
  /**
@@ -25,9 +25,7 @@ function resolveRepository() {
25
25
  return provider.getRepository("newsletterSubscribers");
26
26
  }
27
27
  function decryptNewsletterDoc(doc) {
28
- return decryptPiiFields(
29
- // audit-unknown-ok: TS structural escape — Record
30
- doc, NEWSLETTER_PII_FIELDS);
28
+ return decryptPiiFields(doc, NEWSLETTER_PII_FIELDS);
31
29
  }
32
30
  export class NewsletterRepository {
33
31
  constructor(repo = null) {
@@ -80,9 +78,7 @@ export class NewsletterRepository {
80
78
  adminNote: undefined,
81
79
  emailIndex: hmacBlindIndex(input.email.toLowerCase()),
82
80
  };
83
- const encrypted = encryptPiiFields(
84
- // audit-unknown-ok: arbitrary payload — newsletter wrapper
85
- plaintext, NEWSLETTER_PII_FIELDS);
81
+ const encrypted = encryptPiiFields(plaintext, NEWSLETTER_PII_FIELDS);
86
82
  const created = await this.repo.create(encrypted);
87
83
  return decryptNewsletterDoc(created);
88
84
  }
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class ApiError extends AppError {
3
- // audit-unknown-ok: ApiError subclass — cause/issues canonical
4
3
  constructor(statusCode, message, data) {
5
4
  super(statusCode, message, "API_ERROR", data);
6
5
  }
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class AuthenticationError extends AppError {
3
- // audit-unknown-ok: AuthError data — caller-defined
4
3
  constructor(message, data) {
5
4
  super(401, message, "AUTHENTICATION_ERROR", data);
6
5
  }
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class AuthorizationError extends AppError {
3
- // audit-unknown-ok: AuthorizationError data
4
3
  constructor(message, data) {
5
4
  super(403, message, "AUTHORIZATION_ERROR", data);
6
5
  }
@@ -1,7 +1,5 @@
1
1
  export class AppError extends Error {
2
- constructor(statusCode, message, code,
3
- // audit-unknown-ok: base-error data — accepts arbitrary serialisable values
4
- data) {
2
+ constructor(statusCode, message, code, data) {
5
3
  super(message);
6
4
  this.statusCode = statusCode;
7
5
  this.message = message;
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class DatabaseError extends AppError {
3
- // audit-unknown-ok: DatabaseError data
4
3
  constructor(message, data) {
5
4
  super(500, message, "DATABASE_ERROR", data);
6
5
  }
@@ -5,7 +5,6 @@ import { ERROR_CODES, ERROR_MESSAGES_BY_CODE } from "./error-codes";
5
5
  * Handle API errors with consistent response format.
6
6
  * Use in Next.js API route catch blocks.
7
7
  */
8
- // audit-unknown-ok: type-narrowing entry point — accepts any value, narrows by typeof/Array.isArray
9
8
  export function handleApiError(error) {
10
9
  if (error instanceof AppError) {
11
10
  if (error.statusCode >= 500) {
@@ -42,9 +41,7 @@ export function handleApiError(error) {
42
41
  * Log an error with optional context. Wraps console.error for package portability;
43
42
  * replace with your structured logger if needed.
44
43
  */
45
- export function logError(
46
- // audit-unknown-ok: error-handler entry point — accepts thrown values of any shape
47
- error, context) {
44
+ export function logError(error, context) {
48
45
  console.error("[Application Error]", {
49
46
  ...(context && { context }),
50
47
  error: error instanceof Error
@@ -55,7 +52,6 @@ error, context) {
55
52
  /**
56
53
  * Type guard — check if a value is an AppError instance.
57
54
  */
58
- // audit-unknown-ok: type-narrowing entry point — accepts any value, narrows by typeof/Array.isArray
59
55
  export function isAppError(error) {
60
56
  return error instanceof AppError;
61
57
  }
@@ -34,14 +34,12 @@ export const HTTP_ERROR_CODES = {
34
34
  CLIENT_WINDOW_ERROR: "CLIENT_WINDOW_ERROR",
35
35
  CLIENT_UNHANDLED: "CLIENT_UNHANDLED",
36
36
  };
37
- // audit-unknown-ok: type-narrowing entry point — accepts any value, narrows by typeof/Array.isArray
38
37
  function isZodLikeError(err) {
39
38
  return (typeof err === "object" &&
40
39
  err !== null &&
41
40
  "issues" in err &&
42
41
  Array.isArray(err.issues));
43
42
  }
44
- // audit-unknown-ok: type-narrowing entry point — accepts any value, narrows by typeof/Array.isArray
45
43
  function isFirestoreLikeError(err) {
46
44
  if (typeof err !== "object" || err === null)
47
45
  return false;
@@ -98,9 +96,7 @@ function mapFirestore(err) {
98
96
  * - ZodError shape maps to 400 VALIDATION_FAILED + issues
99
97
  * - Unknown Error → 500 INTERNAL; message scrubbed when isProduction
100
98
  */
101
- export function mapToHttpError(
102
- // audit-unknown-ok: error-handler entry point — accepts thrown values of any shape
103
- err, opts) {
99
+ export function mapToHttpError(err, opts) {
104
100
  const isProduction = opts?.isProduction ?? false;
105
101
  // AppError subclasses first — they carry status + code authoritatively
106
102
  if (err instanceof ValidationError) {
@@ -176,7 +172,6 @@ err, opts) {
176
172
  }
177
173
  // Object with explicit { status, message } shape (legacy throw-with-status)
178
174
  if (typeof err === "object" && err !== null) {
179
- // audit-unknown-ok: error-shape predicates (isZodLikeError, etc.) — TS requires unknown for type-guard params
180
175
  const e = err;
181
176
  const status = typeof e.statusCode === "number"
182
177
  ? e.statusCode
@@ -36,19 +36,16 @@ function hasStringProp(value, key) {
36
36
  function isFirebaseAuthErrorShape(e) {
37
37
  if (!hasStringProp(e, "code"))
38
38
  return false;
39
- // audit-unknown-ok: TS structural escape — CodedError
40
39
  return e.code.startsWith("auth/");
41
40
  }
42
41
  function isFirebaseStorageErrorShape(e) {
43
42
  if (!hasStringProp(e, "code"))
44
43
  return false;
45
- // audit-unknown-ok: TS structural escape — CodedError
46
44
  return e.code.startsWith("storage/");
47
45
  }
48
46
  function isFirebaseFirestoreErrorShape(e) {
49
47
  if (!hasStringProp(e, "code"))
50
48
  return false;
51
- // audit-unknown-ok: TS structural escape — CodedError
52
49
  const code = e.code;
53
50
  // Firestore codes are bare strings: "permission-denied", "not-found", etc.
54
51
  return (/^[a-z-]+$/.test(code) &&
@@ -80,7 +77,6 @@ function isNetworkErrorShape(e) {
80
77
  // ---------------------------------------------------------------------------
81
78
  // normalizeError — the single funnel for every `catch (e: unknown)`.
82
79
  // ---------------------------------------------------------------------------
83
- // audit-unknown-ok: type-narrowing entry point — accepts any value, narrows by typeof/Array.isArray
84
80
  export function normalizeError(e) {
85
81
  // ApiError (client-side API failure with stable code + status).
86
82
  if (e instanceof ApiError) {
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class NotFoundError extends AppError {
3
- // audit-unknown-ok: NotFoundError data
4
3
  constructor(message, data) {
5
4
  super(404, message, "NOT_FOUND", data);
6
5
  }
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class RazorpayUnreachableError extends AppError {
3
- // audit-unknown-ok: RazorpayUnreachable data
4
3
  constructor(message = "Payment provider unreachable", data) {
5
4
  super(503, message, "UPSTREAM_UNAVAILABLE", data);
6
5
  }
@@ -1,6 +1,5 @@
1
1
  import { AppError } from "./base-error";
2
2
  export class ValidationError extends AppError {
3
- // audit-unknown-ok: ValidationError issues from Zod
4
3
  constructor(message, fields) {
5
4
  super(400, message, "VALIDATION_ERROR", fields);
6
5
  }
@@ -20,7 +20,5 @@ export async function FAQPageView({ category, } = {}) {
20
20
  ? allItems.filter((item) => item.category === category)
21
21
  : allItems;
22
22
  const activeCategory = categories.find((c) => c.slug === category);
23
- 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(Container, { size: "md", className: "text-center", children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-3", children: activeCategory ? activeCategory.label : t("title") }), _jsx(Text, { color: "inverse", variant: "none", className: "/80 max-w-2xl mx-auto", children: t("subtitle") })] }) }), _jsx(Container, { size: "md", padding: "content-banner", children: _jsxs(Stack, { direction: "md-row", gap: "xl", children: [categories.length > 0 && (_jsxs(Aside, { className: "md:w-56 flex-shrink-0", children: [_jsx(Heading, { level: 3, className: "uppercase tracking-wide mb-3", color: "muted", size: "sm", weight: "semibold", children: t("categoriesLabel") }), _jsxs(Nav, { "aria-label": "FAQ categories", spacing: "xs", children: [_jsxs(TextLink, { rounded: "lg", href: String(ROUTES.PUBLIC.FAQS), className: `flex items-center justify-between px-3 py-2 transition-colors ${!category ? "bg-primary/10 text-primary font-semibold" : "hover:bg-neutral-100 dark:bg-neutral-800 dark:hover:bg-neutral-800"}`, size: "sm", children: [_jsxs(Span, { className: `${flex.row} gap-2`, children: [_jsx(HelpCircle, { className: "w-4 h-4" }), t("allCategories")] }), _jsx(ChevronRight, { className: "w-3.5 h-3.5 opacity-50" })] }), categories.map((cat) => (
24
- // audit-variant-ok: nav item — conditional active (primary-tinted) vs hover bg; TextLink lacks active-state variant
25
- _jsxs(TextLink, { rounded: "lg", href: String(ROUTES.PUBLIC.FAQ_CATEGORY(cat.slug)), className: `flex items-center justify-between px-3 py-2 transition-colors ${category === cat.slug ? "bg-primary/10 text-primary font-semibold" : "hover:bg-neutral-100 dark:bg-neutral-800 dark:hover:bg-neutral-800"}`, size: "sm", children: [_jsxs(Span, { className: `${flex.row} gap-2`, children: [_jsx(Span, { children: cat.icon }), cat.label] }), _jsx(ChevronRight, { className: "w-3.5 h-3.5 opacity-50" })] }, cat.slug)))] })] })), _jsxs(Div, { className: "flex-1 min-w-0", children: [visibleItems.length === 0 ? (_jsxs(Section, { className: `text-center`, border: "default", surface: "subtle", rounded: "2xl", padding: "y-4xl", children: [_jsx(HelpCircle, { className: "w-10 h-10 mx-auto mb-3 text-zinc-300 dark:text-zinc-600 dark:text-zinc-400" }), _jsx(Heading, { level: 3, className: "mb-2", size: "base", children: t("emptyTitle") }), _jsx(Text, { variant: "secondary", size: "sm", children: t("emptyText") })] })) : (_jsx(Stack, { gap: "sm", children: visibleItems.map((item, i) => (_jsxs(Details, { tone: "card", className: "group overflow-hidden", children: [_jsxs(Summary, { className: `flex items-center justify-between px-5 py-4 cursor-pointer list-none select-none font-medium text-sm hover:bg-neutral-50 dark:hover:bg-neutral-800/50 transition-colors`, children: [_jsx(Span, { children: item.question }), _jsx(ChevronRight, { className: "w-4 h-4 flex-shrink-0 ml-3 transition-transform group-open:rotate-90" })] }), _jsx(Div, { className: "pb-5 pt-1", padding: "x-md", children: _jsx(RichTextRenderer, { html: item.answer, proseClass: "prose prose-sm max-w-none dark:prose-invert" }) })] }, i))) })), _jsxs(Section, { className: `mt-10 text-center`, border: "default", surface: "subtle", rounded: "2xl", padding: "lg", children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", children: t("stillNeedHelpTitle") }), _jsx(Text, { variant: "secondary", className: "mb-4", size: "sm", children: t("stillNeedHelpText") }), _jsxs(Row, { align: "center", justify: "center", gap: "md", wrap: true, children: [_jsx(TextLink, { href: String(ROUTES.PUBLIC.HELP), children: t("helpCenter") }), _jsx(TextLink, { href: String(ROUTES.PUBLIC.CONTACT), variant: "muted", children: t("contactUs") })] })] })] })] }) })] }));
23
+ 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(Container, { size: "md", className: "text-center", children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-3", children: activeCategory ? activeCategory.label : t("title") }), _jsx(Text, { color: "inverse", variant: "none", className: "/80 max-w-2xl mx-auto", children: t("subtitle") })] }) }), _jsx(Container, { size: "md", padding: "content-banner", children: _jsxs(Stack, { direction: "md-row", gap: "xl", children: [categories.length > 0 && (_jsxs(Aside, { className: "md:w-56 flex-shrink-0", children: [_jsx(Heading, { level: 3, className: "uppercase tracking-wide mb-3", color: "muted", size: "sm", weight: "semibold", children: t("categoriesLabel") }), _jsxs(Nav, { "aria-label": "FAQ categories", spacing: "xs", children: [_jsxs(TextLink, { rounded: "lg", href: String(ROUTES.PUBLIC.FAQS), className: `flex items-center justify-between px-3 py-2 transition-colors ${!category ? "bg-primary/10 text-primary font-semibold" : "hover:bg-neutral-100 dark:bg-neutral-800 dark:hover:bg-neutral-800"}`, size: "sm", children: [_jsxs(Span, { className: `${flex.row} gap-2`, children: [_jsx(HelpCircle, { className: "w-4 h-4" }), t("allCategories")] }), _jsx(ChevronRight, { className: "w-3.5 h-3.5 opacity-50" })] }), categories.map((cat) => (_jsxs(TextLink, { rounded: "lg", href: String(ROUTES.PUBLIC.FAQ_CATEGORY(cat.slug)), className: `flex items-center justify-between px-3 py-2 transition-colors ${category === cat.slug ? "bg-primary/10 text-primary font-semibold" : "hover:bg-neutral-100 dark:bg-neutral-800 dark:hover:bg-neutral-800"}`, size: "sm", children: [_jsxs(Span, { className: `${flex.row} gap-2`, children: [_jsx(Span, { children: cat.icon }), cat.label] }), _jsx(ChevronRight, { className: "w-3.5 h-3.5 opacity-50" })] }, cat.slug)))] })] })), _jsxs(Div, { className: "flex-1 min-w-0", children: [visibleItems.length === 0 ? (_jsxs(Section, { className: `text-center`, border: "default", surface: "subtle", rounded: "2xl", padding: "y-4xl", children: [_jsx(HelpCircle, { className: "w-10 h-10 mx-auto mb-3 text-zinc-300 dark:text-zinc-600 dark:text-zinc-400" }), _jsx(Heading, { level: 3, className: "mb-2", size: "base", children: t("emptyTitle") }), _jsx(Text, { variant: "secondary", size: "sm", children: t("emptyText") })] })) : (_jsx(Stack, { gap: "sm", children: visibleItems.map((item, i) => (_jsxs(Details, { tone: "card", className: "group overflow-hidden", children: [_jsxs(Summary, { className: `flex items-center justify-between px-5 py-4 cursor-pointer list-none select-none font-medium text-sm hover:bg-neutral-50 dark:hover:bg-neutral-800/50 transition-colors`, children: [_jsx(Span, { children: item.question }), _jsx(ChevronRight, { className: "w-4 h-4 flex-shrink-0 ml-3 transition-transform group-open:rotate-90" })] }), _jsx(Div, { className: "pb-5 pt-1", padding: "x-md", children: _jsx(RichTextRenderer, { html: item.answer, proseClass: "prose prose-sm max-w-none dark:prose-invert" }) })] }, i))) })), _jsxs(Section, { className: `mt-10 text-center`, border: "default", surface: "subtle", rounded: "2xl", padding: "lg", children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", children: t("stillNeedHelpTitle") }), _jsx(Text, { variant: "secondary", className: "mb-4", size: "sm", children: t("stillNeedHelpText") }), _jsxs(Row, { align: "center", justify: "center", gap: "md", wrap: true, children: [_jsx(TextLink, { href: String(ROUTES.PUBLIC.HELP), children: t("helpCenter") }), _jsx(TextLink, { href: String(ROUTES.PUBLIC.CONTACT), variant: "muted", children: t("contactUs") })] })] })] })] }) })] }));
26
24
  }
@@ -68,9 +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) => (
72
- // audit-variant-ok: payout row — conditional border-top + pt-2/mt-2 separator for highlighted (final) row
73
- _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 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))) })] })] }));
74
72
  }
75
73
  function renderDisclaimerSection(t, themed) {
76
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,9 +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 }) => (
71
- // audit-variant-ok: topic card TextLink — border + p-5 + hover-shadow-md transition + dynamic color class
72
- _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, 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))) })] }));
73
71
  }
74
72
  function renderScamAwarenessAlert(t) {
75
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") })] }));
@@ -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 (_jsxs(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", 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")] }) }))] }) }) }));
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))) }));
@@ -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", 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 }) }) }))] }));
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", 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 }) }) }))] }));
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", 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)) }))] }));
138
138
  }
@@ -10,7 +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 && (
14
- // audit-variant-ok: add-address Button — dashed border + hover-shade transitions; Button.border lacks dashed variant + hover state
15
- _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-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] }))] }));
16
14
  }
@@ -49,7 +49,6 @@ export function AddressForm({ initialData, onSubmit, onCancel, isLoading = false
49
49
  setFormData((prev) => ({ ...prev, [field]: value }));
50
50
  };
51
51
  return (_jsx(Form, { onSubmit: (e) => e.preventDefault(), spacing: "md", children: ({ setFieldError, clearErrors }) => (_jsxs(_Fragment, { children: [_jsx(FormField, { label: mergedLabels.label, name: "label", type: "text", value: formData.label, onChange: (value) => handleChange("label", value), placeholder: mergedPlaceholders.label, required: true }), _jsx(FormField, { label: mergedLabels.fullName, name: "fullName", type: "text", value: formData.fullName, onChange: (value) => handleChange("fullName", value), placeholder: mergedPlaceholders.fullName, required: true }), _jsx(FormField, { label: mergedLabels.phone, name: "phone", type: "tel", value: formData.phone, onChange: (value) => handleChange("phone", value), placeholder: mergedPlaceholders.phone, required: true }), _jsx(FormField, { label: mergedLabels.addressLine1, name: "addressLine1", type: "text", value: formData.addressLine1, onChange: (value) => handleChange("addressLine1", value), placeholder: mergedPlaceholders.addressLine1, required: true }), _jsx(FormField, { label: mergedLabels.addressLine2, name: "addressLine2", type: "text", value: formData.addressLine2, onChange: (value) => handleChange("addressLine2", value), placeholder: mergedPlaceholders.addressLine2 }), _jsxs(FormGroup, { columns: 3, children: [_jsx(FormField, { label: mergedLabels.city, name: "city", type: "text", value: formData.city, onChange: (value) => handleChange("city", value), placeholder: mergedPlaceholders.city, required: true }), _jsx(FormField, { label: mergedLabels.state, name: "state", type: "text", value: formData.state, onChange: (value) => handleChange("state", value), placeholder: mergedPlaceholders.state, required: true }), _jsx(FormField, { label: mergedLabels.postalCode, name: "postalCode", type: "text", value: formData.postalCode, onChange: (value) => handleChange("postalCode", value), placeholder: mergedPlaceholders.postalCode, required: true })] }), _jsx(FormField, { label: mergedLabels.country, name: "country", type: "text", value: formData.country, onChange: (value) => handleChange("country", value), placeholder: mergedPlaceholders.country, required: true }), _jsx(Checkbox, { checked: formData.isDefault, onChange: (e) => handleChange("isDefault", e.target.checked), label: mergedLabels.setDefault }), _jsxs(Row, { padding: "t-xs", align: "center", justify: "start", gap: "xs", children: [_jsx(Button, { type: "button", variant: "outline", onClick: onCancel, disabled: isLoading, children: mergedLabels.cancel }), _jsx(Button, { type: "submit", variant: "primary", disabled: isLoading, isLoading: isLoading, onClick: async () => {
52
- // toast-handled-by-hook: onSubmit prop's mutation hook owns toast UX
53
52
  clearErrors();
54
53
  const errs = {};
55
54
  if (!formData.fullName.trim())
@@ -38,7 +38,6 @@ export function AddressesIndexListing({ onAdd, onEdit, onDelete, }) {
38
38
  buildSieveParams: () => "",
39
39
  buildSearchParams: () => "",
40
40
  params: new URLSearchParams(),
41
- // audit-unknown-ok: TS structural escape — table-state type
42
41
  }), [pendingFilters]);
43
42
  const openFilters = useCallback(() => {
44
43
  setPendingFilters(Object.fromEntries(FILTER_KEYS.map((k) => [k, table.get(k)])));
@@ -1,7 +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?.()] })) : (
5
- // audit-variant-ok: empty-state — hidden md:flex breakpoint + dashed border + text-zinc-400 composition
6
- _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 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" })) }))] }));
7
5
  }
@@ -49,7 +49,6 @@ export function NotificationBell({ limit = 10, viewAllHref, labels, icons, rende
49
49
  const emitSuccess = onMarkAllReadSuccess ?? showSuccess;
50
50
  const emitError = onMarkAllReadError ?? showError;
51
51
  const handleMarkAllRead = useCallback(async () => {
52
- // toast-intentionally-silent — uses emitError(labels.error) callback for feedback
53
52
  try {
54
53
  await markAllRead(undefined);
55
54
  refetch();
@@ -82,19 +81,11 @@ export function NotificationBell({ limit = 10, viewAllHref, labels, icons, rende
82
81
  }
83
82
  function renderBellButton(props) {
84
83
  const { hideOnMobile, buttonClassName, labels, unreadCount, handleToggle, isOpen } = props;
85
- return (
86
- // audit-variant-ok: bell trigger Button — responsive p-2.5/p-3 + conditional hidden/visible + explicit hover/dark token pairs; Button.variant ghost lacks this composition
87
- _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 }))] }));
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 }))] }));
88
85
  }
89
86
  function renderNotificationDropdown(props) {
90
87
  const { dropdownClassName, labels, unreadCount, isMarkingAll, handleMarkAllRead, isLoading, notifications, notificationIcons, handleMarkRead, handleMarkReadAndClose, renderActionLink, viewAllHref, setIsOpen } = props;
91
- return (
92
- // audit-variant-ok: floating dropdown panel — responsive width w-80→sm:w-96 + shadow-2xl beyond SHADOW_MAP xl ceiling
93
- _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 && (
94
- // audit-variant-ok: mark-all-read text link styled as Button — primary text + underline-on-hover; Button.variant link would lose disabled opacity
95
- _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 && (
96
- // audit-variant-ok: dropdown footer — explicit dark:border-slate-800 token pair for theme contrast on top of border="default"
97
- _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 }) }))] }));
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 }) }))] }));
98
89
  }
99
90
  function renderNotificationListContent(props) {
100
91
  const { isLoading, notifications, notificationIcons, labels, handleMarkRead, handleMarkReadAndClose, renderActionLink } = props;
@@ -102,7 +93,5 @@ function renderNotificationListContent(props) {
102
93
  return _jsx(Row, { align: "center", justify: "center", padding: "y-2xl", children: _jsx(Spinner, { size: "md" }) });
103
94
  if (notifications.length === 0)
104
95
  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 })] }));
105
- return (_jsx(Ul, { children: notifications.map((notification) => (
106
- // audit-variant-ok: notification row — flex items-start gap-3 + px-4 py-3 padding + divider + conditional unread bg-primary tint; Li lacks composite variant
107
- _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))) }));
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))) }));
108
97
  }
@@ -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(() => { }) // audit-silent-catch-ok: defaults render if fetch fails; user can still edit and save
59
+ .catch(() => { })
60
60
  .finally(() => setLoading(false));
61
61
  }, [fetchUrl]);
62
62
  const setChannel = useCallback((key, val) => {
@@ -47,7 +47,6 @@ function BuyerOfferCard({ offer, onAcceptCounter, onWithdraw, onCheckout, onUpda
47
47
  await fn();
48
48
  onUpdate(offer.id, patch);
49
49
  setConfirming(null);
50
- // audit-unknown-ok: error-handler entry point — accepts thrown values of any shape
51
50
  }
52
51
  catch (err) {
53
52
  void normalizeError(err);
@@ -68,7 +67,6 @@ export function UserOffersPanel({ fetchEndpoint = "/api/user/offers", onAcceptCo
68
67
  const [fetchError, setFetchError] = useState("");
69
68
  const [showLoginModal, setShowLoginModal] = useState(false);
70
69
  const loadOffers = useCallback(async () => {
71
- // toast-intentionally-silent — error rendered inline via setFetchError()
72
70
  setLoading(true);
73
71
  setFetchError("");
74
72
  try {
@@ -77,9 +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",
81
- // audit-inline-style-ok: dynamic CSS
82
- style: {
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: {
83
81
  top: "var(--header-height, 3.5rem)",
84
82
  height: "calc(100vh - var(--header-height, 3.5rem))",
85
83
  width: "13rem",
@@ -200,7 +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
- // audit-variant-ok: split layout — lg:grid 3fr_2fr custom grid-cols + lg:gap-6
204
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"),
205
204
  ] }));
206
205
  }
@@ -111,7 +111,6 @@ export function AdminBundleEditorView({ bundleId, onSaved, onDeleted, }) {
111
111
  const doc = json?.data ?? null;
112
112
  setForm(bundleToForm(doc));
113
113
  })
114
- // audit-unknown-ok: error-handler entry point — accepts thrown values of any shape
115
114
  .catch((err) => {
116
115
  if (cancelled)
117
116
  return;
@@ -10,7 +10,6 @@ import { DataListingView } from "./DataListingView";
10
10
  import { BUNDLE_COPY, BUNDLE_STOCK_VARIANT, } from "../../../_internal/shared/features/categories/bundle-copy";
11
11
  import { ACTIONS } from "../../../_internal/shared/actions/action-registry";
12
12
  import { buildBulkAction } from "../../../_internal/shared/actions/bulk-helpers";
13
- // audit-unknown-ok: type-narrowing entry point — accepts any value, narrows by typeof/Array.isArray
14
13
  function formatPrice(paise) {
15
14
  if (typeof paise !== "number" || paise <= 0)
16
15
  return "—";