@mohasinac/appkit 3.2.8 → 3.2.10

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 (269) hide show
  1. package/dist/_internal/client/features/filters/filter-load-options.js +12 -9
  2. package/dist/_internal/client/theme/ThemeProvider.js +14 -4
  3. package/dist/_internal/server/features/auth/firebase-identity.d.ts +12 -0
  4. package/dist/_internal/server/features/auth/firebase-identity.js +25 -0
  5. package/dist/_internal/server/features/site-settings/safe-settings.d.ts +12 -0
  6. package/dist/_internal/server/features/site-settings/safe-settings.js +25 -0
  7. package/dist/_internal/shared/features/layout/config.js +7 -7
  8. package/dist/_internal/shared/styles/skeleton.d.ts +8 -8
  9. package/dist/_internal/shared/styles/skeleton.js +10 -10
  10. package/dist/_internal/shared/styles/themed.d.ts +12 -12
  11. package/dist/_internal/shared/styles/themed.js +12 -12
  12. package/dist/features/about/components/AboutView.js +1 -1
  13. package/dist/features/about/components/FAQPageView.js +1 -1
  14. package/dist/features/about/components/FeesView.js +2 -2
  15. package/dist/features/about/components/HowAuctionsWorkView.js +2 -2
  16. package/dist/features/about/components/HowCheckoutWorksView.js +2 -2
  17. package/dist/features/about/components/HowOffersWorkView.js +2 -2
  18. package/dist/features/about/components/HowOrdersWorkView.js +2 -2
  19. package/dist/features/about/components/HowPayoutsWorkView.js +2 -2
  20. package/dist/features/about/components/HowPreOrdersWorkView.js +2 -2
  21. package/dist/features/about/components/HowReviewsWorkView.js +2 -2
  22. package/dist/features/about/components/PublicProfileView.js +3 -3
  23. package/dist/features/about/components/SecurityPrivacyView.js +2 -2
  24. package/dist/features/account/components/AddressBook.js +2 -2
  25. package/dist/features/account/components/AddressesIndexListing.js +1 -1
  26. package/dist/features/account/components/ChatWindow.js +1 -1
  27. package/dist/features/account/components/MessagesView.js +1 -1
  28. package/dist/features/account/components/NotificationBell.js +2 -2
  29. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  30. package/dist/features/account/components/UserSidebar.js +3 -3
  31. package/dist/features/account/components/UserSupportView.js +3 -3
  32. package/dist/features/admin/components/AdminAdEditorView.js +1 -1
  33. package/dist/features/admin/components/AdminAdsView.js +5 -5
  34. package/dist/features/admin/components/AdminAnalyticsView.js +1 -1
  35. package/dist/features/admin/components/AdminBrandsView.js +1 -1
  36. package/dist/features/admin/components/AdminBundlesView.js +2 -2
  37. package/dist/features/admin/components/AdminCarouselEditorView.js +4 -4
  38. package/dist/features/admin/components/AdminCarouselView.js +2 -2
  39. package/dist/features/admin/components/AdminCategoriesView.js +2 -2
  40. package/dist/features/admin/components/AdminContactEditorView.js +1 -1
  41. package/dist/features/admin/components/AdminCouponEditorView.js +1 -1
  42. package/dist/features/admin/components/AdminEmployeeEditorView.js +3 -3
  43. package/dist/features/admin/components/AdminFaqsView.js +1 -1
  44. package/dist/features/admin/components/AdminFeatureEditorView.js +2 -2
  45. package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -1
  46. package/dist/features/admin/components/AdminFeaturesView.js +2 -2
  47. package/dist/features/admin/components/AdminNavigationView.js +2 -2
  48. package/dist/features/admin/components/AdminNotificationsView.js +1 -1
  49. package/dist/features/admin/components/AdminOrderEditorView.js +1 -1
  50. package/dist/features/admin/components/AdminPageHeader.d.ts +1 -1
  51. package/dist/features/admin/components/AdminPageHeader.js +1 -1
  52. package/dist/features/admin/components/AdminReviewsView.js +1 -1
  53. package/dist/features/admin/components/AdminScammerEditorView.js +3 -3
  54. package/dist/features/admin/components/AdminScammersView.js +1 -1
  55. package/dist/features/admin/components/AdminSectionsView.js +1 -1
  56. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  57. package/dist/features/admin/components/AdminSidebar.js +5 -5
  58. package/dist/features/admin/components/AdminSiteSettingsView.js +3 -3
  59. package/dist/features/admin/components/AdminStoreEditorView.js +3 -3
  60. package/dist/features/admin/components/AdminSupportTicketDetailView.js +3 -3
  61. package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
  62. package/dist/features/admin/components/AdminViewCards.js +5 -5
  63. package/dist/features/admin/components/DataTable.js +1 -1
  64. package/dist/features/admin/components/DrawerFormFooter.js +1 -1
  65. package/dist/features/admin/components/QuickActionsPanel.js +1 -1
  66. package/dist/features/admin/components/analytics/AdminTopProductsTable.js +1 -1
  67. package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
  68. package/dist/features/auctions/components/CollapsibleBidHistory.js +1 -1
  69. package/dist/features/auctions/components/MarketplaceAuctionCard.js +1 -1
  70. package/dist/features/auth/components/ForgotPasswordView.js +1 -1
  71. package/dist/features/auth/components/Guards.js +1 -1
  72. package/dist/features/auth/components/RegisterForm.js +1 -1
  73. package/dist/features/auth/components/ResetPasswordView.js +1 -1
  74. package/dist/features/auth/components/SocialAuthButtons.js +1 -1
  75. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  76. package/dist/features/blog/components/BlogListView.js +3 -3
  77. package/dist/features/blog/components/BlogPostView.js +1 -1
  78. package/dist/features/cart/components/CartDrawer.js +5 -5
  79. package/dist/features/categories/components/BrandDetailPageView.js +1 -1
  80. package/dist/features/categories/components/BrandDetailTabs.js +1 -1
  81. package/dist/features/categories/components/CategoriesIndexListing.js +2 -2
  82. package/dist/features/categories/components/CategoryDetailPageView.js +1 -1
  83. package/dist/features/categories/components/CategoryDetailTabs.js +1 -1
  84. package/dist/features/categories/components/CategoryGrid.js +3 -3
  85. package/dist/features/categories/components/CategoryTree.js +2 -2
  86. package/dist/features/categories/components/ConcernCard.js +1 -1
  87. package/dist/features/checkout/components/CheckoutStepper.js +1 -1
  88. package/dist/features/classified/components/ClassifiedIndexListing.js +1 -1
  89. package/dist/features/collections/components/CollectionCard.js +1 -1
  90. package/dist/features/collections/hooks/useCollections.js +12 -12
  91. package/dist/features/contact/components/ContactForm.js +1 -1
  92. package/dist/features/copilot/components/AdminCopilotView.js +5 -5
  93. package/dist/features/digital-codes/components/DigitalCodesIndexListing.js +1 -1
  94. package/dist/features/events/components/AdminEventEntriesView.js +1 -1
  95. package/dist/features/events/components/EventCard.js +1 -1
  96. package/dist/features/events/components/EventPollWidget.js +1 -1
  97. package/dist/features/events/components/EventStatusBadge.js +1 -1
  98. package/dist/features/events/components/EventsIndexListing.js +1 -1
  99. package/dist/features/faq/components/ContactCTA.js +2 -2
  100. package/dist/features/faq/components/FAQAccordion.js +4 -4
  101. package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
  102. package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
  103. package/dist/features/faq/components/RelatedFAQs.js +1 -1
  104. package/dist/features/filters/AsyncFacetSection.js +3 -3
  105. package/dist/features/filters/FilterFacetSection.js +5 -5
  106. package/dist/features/filters/RangeFilter.js +3 -3
  107. package/dist/features/filters/SwitchFilter.js +2 -2
  108. package/dist/features/forms/Checkbox.js +1 -1
  109. package/dist/features/forms/Input.js +2 -2
  110. package/dist/features/forms/Radio.js +2 -2
  111. package/dist/features/forms/Select.js +1 -1
  112. package/dist/features/forms/Slider.js +1 -1
  113. package/dist/features/forms/Textarea.js +1 -1
  114. package/dist/features/forms/Toggle.js +3 -3
  115. package/dist/features/forms/utils.d.ts +4 -4
  116. package/dist/features/forms/utils.js +4 -4
  117. package/dist/features/homepage/components/AdSlot.js +1 -1
  118. package/dist/features/homepage/components/AdvertisementBanner.js +3 -3
  119. package/dist/features/homepage/components/BrandsSection.js +2 -2
  120. package/dist/features/homepage/components/GoogleReviewsSection.js +1 -1
  121. package/dist/features/homepage/components/HeroSection.js +1 -1
  122. package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +1 -1
  123. package/dist/features/homepage/components/HowItWorksSection.js +1 -1
  124. package/dist/features/homepage/components/ShopByCategorySection.js +2 -2
  125. package/dist/features/homepage/components/SiteFeaturesSection.js +1 -1
  126. package/dist/features/homepage/components/SocialPostCard.js +1 -1
  127. package/dist/features/homepage/components/StatsCounterSection.js +1 -1
  128. package/dist/features/homepage/components/TrustIndicatorsSection.js +1 -1
  129. package/dist/features/homepage/constants/hero-carousel-styles.d.ts +3 -3
  130. package/dist/features/homepage/constants/hero-carousel-styles.js +3 -3
  131. package/dist/features/homepage/hooks/useActiveAd.d.ts +1 -3
  132. package/dist/features/homepage/hooks/useActiveAd.js +9 -17
  133. package/dist/features/layout/AppLayoutShell.js +12 -12
  134. package/dist/features/layout/AutoBreadcrumbs.js +1 -1
  135. package/dist/features/layout/BackToTop.js +2 -2
  136. package/dist/features/layout/BottomActions.js +8 -8
  137. package/dist/features/layout/BottomNavItem.js +1 -1
  138. package/dist/features/layout/BottomNavLayout.js +1 -1
  139. package/dist/features/layout/BottomNavbar.d.ts +1 -1
  140. package/dist/features/layout/BottomNavbar.js +2 -2
  141. package/dist/features/layout/BottomSheet.js +1 -1
  142. package/dist/features/layout/Breadcrumbs.js +2 -2
  143. package/dist/features/layout/FooterLayout.js +2 -2
  144. package/dist/features/layout/MainNavbar.js +1 -1
  145. package/dist/features/layout/NavItem.js +1 -1
  146. package/dist/features/layout/NavbarLayout.js +3 -3
  147. package/dist/features/layout/SidebarLayout.js +1 -1
  148. package/dist/features/layout/TitleBarLayout.js +3 -3
  149. package/dist/features/live/components/LiveItemsIndexListing.js +1 -1
  150. package/dist/features/loyalty/components/CoinsDisplay.js +1 -1
  151. package/dist/features/loyalty/hooks/useLoyaltyBalance.js +11 -3
  152. package/dist/features/media/AvatarUpload.js +1 -1
  153. package/dist/features/media/MediaPickerModal.js +1 -1
  154. package/dist/features/media/components/MediaSlider.js +1 -1
  155. package/dist/features/media/finalize.d.ts +12 -1
  156. package/dist/features/media/finalize.js +64 -11
  157. package/dist/features/media/modals/ImageCropModal.js +1 -1
  158. package/dist/features/media/modals/ImageEditor.js +1 -1
  159. package/dist/features/media/repository/media-assets.repository.d.ts +33 -0
  160. package/dist/features/media/repository/media-assets.repository.js +43 -0
  161. package/dist/features/media/upload/MediaUploadField.js +1 -1
  162. package/dist/features/messages/hooks/useConversation.js +12 -17
  163. package/dist/features/messages/hooks/useConversations.js +3 -5
  164. package/dist/features/orders/components/MarketplaceOrderCard.js +1 -1
  165. package/dist/features/orders/components/OrdersList.js +3 -3
  166. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +1 -1
  167. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
  168. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -2
  169. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
  170. package/dist/features/pre-orders/hooks/usePreOrders.js +12 -12
  171. package/dist/features/products/columns/productTableColumns.js +3 -3
  172. package/dist/features/products/components/BidHistory.js +1 -1
  173. package/dist/features/products/components/CompareOverlay.js +9 -9
  174. package/dist/features/products/components/CustomSectionTabContent.js +1 -1
  175. package/dist/features/products/components/CustomSectionsEditor.js +1 -1
  176. package/dist/features/products/components/FeatureBadge.js +2 -2
  177. package/dist/features/products/components/GroupSettingsPanel.js +2 -2
  178. package/dist/features/products/components/PrizeDrawDetailPageView.js +2 -2
  179. package/dist/features/products/components/PrizeDrawsIndexListing.js +1 -1
  180. package/dist/features/products/components/ProductDetailPageView.js +4 -4
  181. package/dist/features/products/components/ProductFeatureBadges.js +2 -2
  182. package/dist/features/products/components/ProductFeaturesSelector.js +4 -4
  183. package/dist/features/products/components/ProductGalleryClient.js +1 -1
  184. package/dist/features/products/components/ProductGrid.js +8 -8
  185. package/dist/features/products/components/ProductTabs.js +1 -1
  186. package/dist/features/products/components/ProductTabsShell.js +1 -1
  187. package/dist/features/products/components/ShareButton.js +1 -1
  188. package/dist/features/products/components/ShowGroupSection.js +2 -2
  189. package/dist/features/products/components/SublistingCarouselSection.js +2 -2
  190. package/dist/features/promotions/components/CouponCard.js +2 -2
  191. package/dist/features/promotions/components/CouponsIndexListing.js +2 -2
  192. package/dist/features/reviews/components/ReviewDetailPageView.js +1 -1
  193. package/dist/features/reviews/components/ReviewDetailShell.js +5 -5
  194. package/dist/features/reviews/components/ReviewModal.js +1 -1
  195. package/dist/features/reviews/components/ReviewSummary.js +2 -2
  196. package/dist/features/reviews/components/ReviewsIndexListing.js +1 -1
  197. package/dist/features/reviews/components/ReviewsList.js +2 -2
  198. package/dist/features/scams/components/ScamRegistryView.js +2 -2
  199. package/dist/features/search/components/Search.js +11 -11
  200. package/dist/features/search/components/SearchFiltersRow.js +1 -1
  201. package/dist/features/search/components/SearchResultsSection.js +2 -2
  202. package/dist/features/seller/components/SellerAddressesView.js +4 -4
  203. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +1 -1
  204. package/dist/features/seller/components/SellerCouponEditorView.js +1 -1
  205. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  206. package/dist/features/seller/components/SellerFeaturesView.js +2 -2
  207. package/dist/features/seller/components/SellerGoogleReviewsView.js +1 -1
  208. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  209. package/dist/features/seller/components/SellerPayoutMethodsView.js +1 -1
  210. package/dist/features/seller/components/SellerSidebar.js +4 -4
  211. package/dist/features/seller/components/analytics/SellerRevenueChart.js +1 -1
  212. package/dist/features/seller/components/analytics/SellerTopProducts.js +1 -1
  213. package/dist/features/site-settings/components/ActionPermissionsManager.js +2 -2
  214. package/dist/features/site-settings/components/NavPermissionsManager.js +1 -1
  215. package/dist/features/stores/components/InteractiveStoreCard.js +3 -3
  216. package/dist/features/stores/components/StoreHeader.js +2 -2
  217. package/dist/features/stores/components/StoreNavTabs.js +2 -2
  218. package/dist/features/stores/components/StorePreOrdersListing.js +1 -1
  219. package/dist/features/stores/components/StoreReviewsListing.js +1 -1
  220. package/dist/features/stores/components/StoresIndexListing.js +1 -1
  221. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +2 -2
  222. package/dist/features/wishlist/components/WishlistPage.js +2 -2
  223. package/dist/features/wishlist/hooks/useWishlistCount.js +5 -13
  224. package/dist/http/index.d.ts +1 -0
  225. package/dist/http/index.js +1 -0
  226. package/dist/http/retry.d.ts +1 -0
  227. package/dist/http/retry.js +26 -0
  228. package/dist/index.d.ts +4 -0
  229. package/dist/index.js +8 -0
  230. package/dist/next/ErrorBoundary.js +1 -1
  231. package/dist/providers/storage-firebase/provider.js +109 -55
  232. package/dist/repositories/index.d.ts +2 -0
  233. package/dist/repositories/index.js +2 -0
  234. package/dist/seed/site-settings-seed-data.js +476 -0
  235. package/dist/server.d.ts +4 -0
  236. package/dist/server.js +9 -0
  237. package/dist/styles.css +1 -1
  238. package/dist/tailwind-utilities.css +1 -1
  239. package/dist/tokens/index.d.ts +6 -6
  240. package/dist/tokens/index.js +59 -59
  241. package/dist/ui/DataTable.js +3 -3
  242. package/dist/ui/components/Avatar.js +1 -1
  243. package/dist/ui/components/BaseListingCard.js +7 -7
  244. package/dist/ui/components/Button.js +3 -3
  245. package/dist/ui/components/DetailPageGallery.js +3 -3
  246. package/dist/ui/components/DetailPageHero.js +1 -1
  247. package/dist/ui/components/DetailPageTabs.js +4 -4
  248. package/dist/ui/components/FilterChipGroup.js +2 -2
  249. package/dist/ui/components/Input.js +1 -1
  250. package/dist/ui/components/Layout.d.ts +2 -2
  251. package/dist/ui/components/ListingFilterDrawer.js +2 -2
  252. package/dist/ui/components/ListingToolbar.js +6 -6
  253. package/dist/ui/components/LoginRequiredModal.js +1 -1
  254. package/dist/ui/components/Modal.js +1 -1
  255. package/dist/ui/components/NavbarChevron.js +1 -1
  256. package/dist/ui/components/PageLoader.js +3 -3
  257. package/dist/ui/components/Radio.js +1 -1
  258. package/dist/ui/components/RichTextEditor.js +1 -1
  259. package/dist/ui/components/Select.js +1 -1
  260. package/dist/ui/components/SettingsSection.js +3 -3
  261. package/dist/ui/components/SideModal.js +1 -1
  262. package/dist/ui/components/Slider.js +2 -2
  263. package/dist/ui/components/StatsGrid.js +1 -1
  264. package/dist/ui/components/Typography.js +3 -3
  265. package/dist/ui/components/surface-tokens.d.ts +11 -11
  266. package/dist/ui/components/surface-tokens.js +12 -12
  267. package/dist/utils/safe-fire-forget.d.ts +14 -0
  268. package/dist/utils/safe-fire-forget.js +23 -0
  269. package/package.json +1 -1
@@ -264,11 +264,11 @@ export declare const LAYOUT: {
264
264
  readonly containerWidth: "max-w-[1920px]";
265
265
  readonly contentPadding: "px-4 md:px-6 lg:px-8";
266
266
  readonly navPadding: "px-4 sm:px-6 lg:px-8";
267
- readonly titleBarBg: "bg-white/90 dark:bg-slate-950/90 backdrop-blur-md border-b border-zinc-200/80 dark:border-slate-800/80";
268
- readonly navbarBg: "bg-white/90 dark:bg-slate-950/90 backdrop-blur-md border-b border-zinc-200/80 dark:border-slate-800/80";
269
- readonly sidebarBg: "bg-white dark:bg-slate-900 border-l border-zinc-200 dark:border-slate-800";
270
- readonly bottomNavBg: "bg-white/90 dark:bg-slate-950/90 backdrop-blur-md border-t border-zinc-200/80 dark:border-slate-800/80";
271
- readonly footerBg: "bg-zinc-50 dark:bg-slate-900 border-t border-zinc-200 dark:border-slate-800";
267
+ readonly titleBarBg: "bg-[color-mix(in_srgb,var(--appkit-color-bg)_90%,transparent)] backdrop-blur-md border-b border-[var(--appkit-color-border)]";
268
+ readonly navbarBg: "bg-[color-mix(in_srgb,var(--appkit-color-bg)_90%,transparent)] backdrop-blur-md border-b border-[var(--appkit-color-border)]";
269
+ readonly sidebarBg: "bg-[var(--appkit-color-surface)] border-l border-[var(--appkit-color-border-subtle)]";
270
+ readonly bottomNavBg: "bg-[color-mix(in_srgb,var(--appkit-color-bg)_90%,transparent)] backdrop-blur-md border-t border-[var(--appkit-color-border)]";
271
+ readonly footerBg: "bg-zinc-50 bg-[var(--appkit-color-surface)] border-t border-[var(--appkit-color-border-subtle)]";
272
272
  readonly fullScreen: "min-h-screen";
273
273
  readonly flexCenter: "flex items-center justify-center";
274
274
  readonly centerText: "text-center";
@@ -291,7 +291,7 @@ export declare const LAYOUT: {
291
291
  /** Kill bottom margin from last element in a zone */
292
292
  readonly lastChild: "mb-0 pb-0";
293
293
  /** Combined bottom-nav bar (hidden on lg+, iPhone safe-area aware) */
294
- readonly bottomNav: "fixed bottom-0 inset-x-0 z-50 flex justify-around items-center h-16 bg-white dark:bg-zinc-900 border-t border-zinc-200 dark:border-zinc-800 lg:hidden pb-[env(safe-area-inset-bottom)]";
294
+ readonly bottomNav: "fixed bottom-0 inset-x-0 z-50 flex justify-around items-center h-16 bg-[var(--appkit-color-surface)] border-t border-[var(--appkit-color-border-subtle)] lg:hidden pb-[env(safe-area-inset-bottom)]";
295
295
  /** Main content bottom padding to clear the bottom nav on mobile */
296
296
  readonly mainPadBottomNav: "pb-20 lg:pb-0";
297
297
  /** Standard card heights for consistency */
@@ -195,33 +195,33 @@ export const LOCALE_CONFIG = {
195
195
  */
196
196
  const THEMED = {
197
197
  // Backgrounds
198
- bgPrimary: "bg-zinc-50 dark:bg-slate-950",
199
- bgSecondary: "bg-zinc-100 dark:bg-slate-900",
200
- bgTertiary: "bg-zinc-200 dark:bg-slate-800",
201
- bgElevated: "bg-white dark:bg-slate-900/90",
202
- bgInput: "bg-white dark:bg-slate-800/60",
198
+ bgPrimary: "bg-zinc-50 bg-[var(--appkit-color-bg)]",
199
+ bgSecondary: "bg-[var(--appkit-color-surface)] bg-[var(--appkit-color-surface)]",
200
+ bgTertiary: "bg-zinc-200 bg-[var(--appkit-color-surface-elevated)]",
201
+ bgElevated: "bg-[var(--appkit-color-surface)]",
202
+ bgInput: "bg-[var(--appkit-color-surface-input)]",
203
203
  // Text
204
- textPrimary: "text-zinc-900 dark:text-zinc-50",
205
- textSecondary: "text-zinc-500 dark:text-zinc-400",
206
- textMuted: "text-zinc-400 dark:text-zinc-400",
204
+ textPrimary: "text-[var(--appkit-color-text)]",
205
+ textSecondary: "text-[var(--appkit-color-text-muted)]",
206
+ textMuted: "text-[var(--appkit-color-text-faint)]",
207
207
  textError: "text-red-600 dark:text-red-400",
208
208
  textSuccess: "text-emerald-600 dark:text-emerald-400",
209
209
  textOnPrimary: "text-white",
210
210
  textOnDark: "text-white",
211
211
  // Borders
212
- border: "border-zinc-200 dark:border-slate-700",
213
- borderSubtle: "border-zinc-100 dark:border-slate-800/60",
214
- borderLight: "border-zinc-100 dark:border-slate-700/60",
212
+ border: "border-[var(--appkit-color-border)]",
213
+ borderSubtle: "border-[var(--appkit-color-border-subtle)]",
214
+ borderLight: "border-zinc-100 border-[var(--appkit-color-border)]/60",
215
215
  borderError: "border-red-500",
216
- borderColor: "border-zinc-200 dark:border-slate-700",
216
+ borderColor: "border-[var(--appkit-color-border)]",
217
217
  // Interactive
218
- hover: "hover:bg-zinc-100 dark:hover:bg-slate-800",
219
- hoverCard: "hover:bg-zinc-50 dark:hover:bg-slate-800/60",
220
- hoverBorder: "hover:border-zinc-300 dark:hover:border-slate-600",
218
+ hover: "hover:bg-[var(--appkit-color-surface)] hover:bg-[var(--appkit-color-surface-elevated)]",
219
+ hoverCard: "hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)]/60",
220
+ hoverBorder: "hover:border-[var(--appkit-color-border)]",
221
221
  hoverText: "hover:text-zinc-800 dark:hover:text-zinc-100",
222
222
  activeRow: "bg-primary-50 dark:bg-secondary-950/30",
223
223
  focusRing: "focus:ring-primary-500 dark:focus:ring-secondary-400",
224
- divider: "divide-zinc-200 dark:divide-slate-700",
224
+ divider: "divide-zinc-200 divide-[var(--appkit-color-border)]",
225
225
  placeholder: "placeholder-zinc-400 dark:placeholder-zinc-500",
226
226
  };
227
227
  /**
@@ -236,11 +236,11 @@ export const LAYOUT = {
236
236
  containerWidth: "max-w-[1920px]",
237
237
  contentPadding: "px-4 md:px-6 lg:px-8",
238
238
  navPadding: "px-4 sm:px-6 lg:px-8",
239
- titleBarBg: "bg-white/90 dark:bg-slate-950/90 backdrop-blur-md border-b border-zinc-200/80 dark:border-slate-800/80",
240
- navbarBg: "bg-white/90 dark:bg-slate-950/90 backdrop-blur-md border-b border-zinc-200/80 dark:border-slate-800/80",
241
- sidebarBg: "bg-white dark:bg-slate-900 border-l border-zinc-200 dark:border-slate-800",
242
- bottomNavBg: "bg-white/90 dark:bg-slate-950/90 backdrop-blur-md border-t border-zinc-200/80 dark:border-slate-800/80",
243
- footerBg: "bg-zinc-50 dark:bg-slate-900 border-t border-zinc-200 dark:border-slate-800",
239
+ titleBarBg: "bg-[color-mix(in_srgb,var(--appkit-color-bg)_90%,transparent)] backdrop-blur-md border-b border-[var(--appkit-color-border)]",
240
+ navbarBg: "bg-[color-mix(in_srgb,var(--appkit-color-bg)_90%,transparent)] backdrop-blur-md border-b border-[var(--appkit-color-border)]",
241
+ sidebarBg: "bg-[var(--appkit-color-surface)] border-l border-[var(--appkit-color-border-subtle)]",
242
+ bottomNavBg: "bg-[color-mix(in_srgb,var(--appkit-color-bg)_90%,transparent)] backdrop-blur-md border-t border-[var(--appkit-color-border)]",
243
+ footerBg: "bg-zinc-50 bg-[var(--appkit-color-surface)] border-t border-[var(--appkit-color-border-subtle)]",
244
244
  fullScreen: "min-h-screen",
245
245
  flexCenter: "flex items-center justify-center",
246
246
  centerText: "text-center",
@@ -264,7 +264,7 @@ export const LAYOUT = {
264
264
  /** Kill bottom margin from last element in a zone */
265
265
  lastChild: "mb-0 pb-0",
266
266
  /** Combined bottom-nav bar (hidden on lg+, iPhone safe-area aware) */
267
- bottomNav: "fixed bottom-0 inset-x-0 z-50 flex justify-around items-center h-16 bg-white dark:bg-zinc-900 border-t border-zinc-200 dark:border-zinc-800 lg:hidden pb-[env(safe-area-inset-bottom)]",
267
+ bottomNav: "fixed bottom-0 inset-x-0 z-50 flex justify-around items-center h-16 bg-[var(--appkit-color-surface)] border-t border-[var(--appkit-color-border-subtle)] lg:hidden pb-[env(safe-area-inset-bottom)]",
268
268
  /** Main content bottom padding to clear the bottom nav on mobile */
269
269
  mainPadBottomNav: "pb-20 lg:pb-0",
270
270
  /** Standard card heights for consistency */
@@ -292,14 +292,14 @@ export const LAYOUT = {
292
292
  */
293
293
  const TYPOGRAPHY = {
294
294
  pageTitle: "text-2xl md:text-3xl lg:text-4xl font-bold tracking-tight leading-tight",
295
- pageSubtitle: "text-base md:text-lg text-zinc-500 dark:text-zinc-400 leading-relaxed mt-1",
295
+ pageSubtitle: "text-base md:text-lg text-[var(--appkit-color-text-muted)] leading-relaxed mt-1",
296
296
  sectionTitle: "text-xl md:text-2xl lg:text-3xl font-semibold tracking-tight",
297
- sectionSubtitle: "text-sm md:text-base lg:text-lg text-zinc-500 dark:text-zinc-400",
297
+ sectionSubtitle: "text-sm md:text-base lg:text-lg text-[var(--appkit-color-text-muted)]",
298
298
  cardTitle: "text-base md:text-lg font-semibold leading-snug",
299
299
  cardBody: "text-sm md:text-base leading-relaxed",
300
- label: "text-sm font-medium text-zinc-700 dark:text-zinc-300",
301
- caption: "text-xs text-zinc-500 dark:text-zinc-400",
302
- overline: "text-xs font-semibold uppercase tracking-wider text-zinc-500 dark:text-zinc-400",
300
+ label: "text-sm font-medium text-[var(--appkit-color-text-muted)]",
301
+ caption: "text-xs text-[var(--appkit-color-text-muted)]",
302
+ overline: "text-xs font-semibold uppercase tracking-wider text-[var(--appkit-color-text-muted)]",
303
303
  h1: "text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight font-display",
304
304
  h2: "text-2xl md:text-3xl lg:text-4xl font-bold tracking-tight font-display",
305
305
  h3: "text-xl md:text-2xl lg:text-3xl font-bold tracking-tight font-display",
@@ -485,10 +485,10 @@ const PAGE = {
485
485
  * Form input styles — border, bg, focus ring, error/success/disabled states.
486
486
  */
487
487
  const INPUT = {
488
- base: "rounded-lg border border-zinc-200 dark:border-slate-700 bg-white dark:bg-slate-800/60 px-3.5 py-2.5 text-base sm:text-sm text-zinc-900 dark:text-zinc-100 focus:ring-2 focus:ring-primary-500/40 dark:focus:ring-secondary-400/40 focus:border-primary-500 dark:focus:border-secondary-400 focus:outline-none transition-colors duration-150 placeholder:text-zinc-400 dark:placeholder:text-zinc-500",
488
+ base: "rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-input)] px-3.5 py-2.5 text-base sm:text-sm text-[var(--appkit-color-text)] focus:ring-2 focus:ring-primary-500/40 focus:border-primary-500 focus:outline-none transition-colors duration-150 placeholder:text-[var(--appkit-color-text-faint)]",
489
489
  error: "border-red-400 dark:border-red-500 focus:ring-red-500/20 focus:border-red-500 bg-red-50/30 dark:bg-red-950/10",
490
490
  success: "border-emerald-400 dark:border-emerald-500 focus:ring-emerald-500/20 focus:border-emerald-500",
491
- disabled: "bg-zinc-50 dark:bg-slate-800/30 text-zinc-400 dark:text-zinc-400 cursor-not-allowed opacity-60",
491
+ disabled: "bg-zinc-50 bg-[var(--appkit-color-surface)] text-[var(--appkit-color-text-faint)] cursor-not-allowed opacity-60",
492
492
  withIcon: "pl-10",
493
493
  };
494
494
  /**
@@ -499,17 +499,17 @@ const CARD = {
499
499
  shadow: "shadow-sm",
500
500
  shadowElevated: "shadow-lg",
501
501
  hover: "hover:shadow-md dark:hover:shadow-xl cursor-pointer transition-shadow duration-200",
502
- standard: "rounded-2xl border border-zinc-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm hover:shadow-md transition-all duration-200",
503
- elevated: "rounded-2xl bg-white dark:bg-slate-900 border border-zinc-200 dark:border-slate-700 shadow-md hover:shadow-lg transition-shadow duration-200",
504
- interactive: "rounded-2xl border border-zinc-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm hover:shadow-md hover:border-primary-300/60 dark:hover:border-secondary-500/60 transition-all duration-200 cursor-pointer",
505
- glass: "rounded-2xl backdrop-blur-md bg-white/85 dark:bg-slate-900/85 border border-zinc-200/60 dark:border-slate-700/40 shadow-lg",
502
+ standard: "rounded-2xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] shadow-sm hover:shadow-md transition-all duration-200",
503
+ elevated: "rounded-2xl bg-[var(--appkit-color-surface)] border border-[var(--appkit-color-border)] shadow-md hover:shadow-lg transition-shadow duration-200",
504
+ interactive: "rounded-2xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] shadow-sm hover:shadow-md hover:border-primary-300/60 dark:hover:border-secondary-500/60 transition-all duration-200 cursor-pointer",
505
+ glass: "rounded-2xl backdrop-blur-md bg-[color-mix(in_srgb,var(--appkit-color-surface)_85%,transparent)] border border-[var(--appkit-color-border-subtle)] shadow-lg",
506
506
  // Card anatomy tokens (Phase 20)
507
507
  /** Product card image wrapper — portrait aspect ratio */
508
- image: "relative aspect-[3/4] overflow-hidden bg-zinc-100 dark:bg-zinc-800",
508
+ image: "relative aspect-[3/4] overflow-hidden bg-[var(--appkit-color-surface)]",
509
509
  /** Wide image wrapper — video/landscape ratio */
510
- imageWide: "relative aspect-video overflow-hidden bg-zinc-100 dark:bg-zinc-800",
510
+ imageWide: "relative aspect-video overflow-hidden bg-[var(--appkit-color-surface)]",
511
511
  /** Square image wrapper */
512
- imageSquare: "relative aspect-square overflow-hidden bg-zinc-100 dark:bg-zinc-800",
512
+ imageSquare: "relative aspect-square overflow-hidden bg-[var(--appkit-color-surface)]",
513
513
  /** Banner aspect ratio — 4:3 on mobile, auto on md+ */
514
514
  aspectBanner: "aspect-[4/3] md:aspect-auto",
515
515
  /** Card body — flex-column, responsive padding */
@@ -578,10 +578,10 @@ const POSITION = {
578
578
  const STATES = {
579
579
  disabled: "opacity-50 cursor-not-allowed pointer-events-none",
580
580
  loading: "opacity-75 cursor-wait",
581
- readonly: "bg-zinc-100 dark:bg-slate-800 cursor-default",
581
+ readonly: "bg-[var(--appkit-color-surface)] bg-[var(--appkit-color-surface-elevated)] cursor-default",
582
582
  error: "border-red-500 dark:border-red-500",
583
583
  success: "border-green-500 dark:border-green-500",
584
- focus: "focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-secondary-400 dark:focus:ring-offset-slate-950",
584
+ focus: "focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-secondary-400 dark:focus:ring-offset-[var(--appkit-color-bg)]",
585
585
  };
586
586
  /**
587
587
  * Transition classes.
@@ -610,15 +610,15 @@ const TRANSITIONS = {
610
610
  */
611
611
  const SKELETON = {
612
612
  // - Pulse (fade) variant ----------------------------------------------------------------
613
- base: "animate-pulse rounded bg-zinc-200 dark:bg-slate-700/60",
614
- text: "animate-pulse rounded bg-zinc-200 dark:bg-slate-700/60 h-4",
615
- heading: "animate-pulse rounded bg-zinc-200 dark:bg-slate-700/60 h-7",
616
- image: "animate-pulse rounded-xl bg-zinc-200 dark:bg-slate-700/60",
617
- card: "animate-pulse rounded-2xl bg-zinc-200 dark:bg-slate-700/60",
613
+ base: "animate-pulse rounded bg-zinc-200 bg-[var(--appkit-color-border-subtle)]",
614
+ text: "animate-pulse rounded bg-zinc-200 bg-[var(--appkit-color-border-subtle)] h-4",
615
+ heading: "animate-pulse rounded bg-zinc-200 bg-[var(--appkit-color-border-subtle)] h-7",
616
+ image: "animate-pulse rounded-xl bg-zinc-200 bg-[var(--appkit-color-border-subtle)]",
617
+ card: "animate-pulse rounded-2xl bg-zinc-200 bg-[var(--appkit-color-border-subtle)]",
618
618
  // - Shimmer (sweep) variant ----------------------------------------------------------
619
- shimmer: "animate-shimmer bg-[length:400%_100%] rounded bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200 dark:from-slate-800 dark:via-slate-700/60 dark:to-slate-800",
620
- shimmerText: "animate-shimmer bg-[length:400%_100%] h-4 rounded bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200 dark:from-slate-800 dark:via-slate-700/60 dark:to-slate-800",
621
- shimmerCard: "animate-shimmer bg-[length:400%_100%] rounded-2xl bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200 dark:from-slate-800 dark:via-slate-700/60 dark:to-slate-800",
619
+ shimmer: "animate-shimmer bg-[length:400%_100%] rounded bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200 from-[var(--appkit-color-border-subtle)] via-[var(--appkit-color-bg)] to-[var(--appkit-color-border-subtle)]",
620
+ shimmerText: "animate-shimmer bg-[length:400%_100%] h-4 rounded bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200 from-[var(--appkit-color-border-subtle)] via-[var(--appkit-color-bg)] to-[var(--appkit-color-border-subtle)]",
621
+ shimmerCard: "animate-shimmer bg-[length:400%_100%] rounded-2xl bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200 from-[var(--appkit-color-border-subtle)] via-[var(--appkit-color-bg)] to-[var(--appkit-color-border-subtle)]",
622
622
  };
623
623
  /**
624
624
  * Touch target sizes — WCAG 2.5.5 (minimum 44 × 44 px).
@@ -644,8 +644,8 @@ const TOUCH = {
644
644
  */
645
645
  const UTILITIES = {
646
646
  scrollbarHide: "scrollbar-hide [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]",
647
- scrollbarThin: "scrollbar-thin [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-zinc-100 dark:[&::-webkit-scrollbar-track]:bg-slate-800/60 [&::-webkit-scrollbar-track]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300 dark:[&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb:hover]:bg-zinc-400 dark:[&::-webkit-scrollbar-thumb:hover]:bg-slate-500",
648
- scrollbarThinX: "[&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-track]:rounded-full [&::-webkit-scrollbar-track]:bg-zinc-100 dark:[&::-webkit-scrollbar-track]:bg-slate-800/60 [&::-webkit-scrollbar-thumb]:bg-zinc-300 dark:[&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb:hover]:bg-zinc-400 dark:[&::-webkit-scrollbar-thumb:hover]:bg-slate-500",
647
+ scrollbarThin: "scrollbar-thin [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-[var(--appkit-color-surface)] dark:[&::-webkit-scrollbar-track]:bg-slate-800/60 [&::-webkit-scrollbar-track]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300 dark:[&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb:hover]:bg-zinc-400 dark:[&::-webkit-scrollbar-thumb:hover]:bg-slate-500",
648
+ scrollbarThinX: "[&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-track]:rounded-full [&::-webkit-scrollbar-track]:bg-[var(--appkit-color-surface)] dark:[&::-webkit-scrollbar-track]:bg-slate-800/60 [&::-webkit-scrollbar-thumb]:bg-zinc-300 dark:[&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb:hover]:bg-zinc-400 dark:[&::-webkit-scrollbar-thumb:hover]:bg-slate-500",
649
649
  safeAreaBottom: "pb-[env(safe-area-inset-bottom)]",
650
650
  safeAreaTop: "pt-[env(safe-area-inset-top)]",
651
651
  safeAreaInline: "px-[env(safe-area-inset-left)] px-[env(safe-area-inset-right)]",
@@ -661,20 +661,20 @@ const UTILITIES = {
661
661
  * Common component pattern compositions.
662
662
  */
663
663
  const PATTERNS = {
664
- pageContainer: "min-h-screen bg-white dark:bg-slate-950",
664
+ pageContainer: "min-h-screen bg-[var(--appkit-color-bg)]",
665
665
  sectionContainer: "max-w-7xl mx-auto px-4 md:px-6 lg:px-8 py-8 lg:py-12",
666
- formContainer: "bg-white dark:bg-slate-900 rounded-2xl border border-zinc-200 dark:border-slate-700 shadow-sm p-6 lg:p-8 space-y-6",
667
- listItem: "bg-white dark:bg-slate-900 border border-zinc-200 dark:border-slate-700 rounded-xl p-4 hover:border-zinc-300 dark:hover:border-slate-600 transition-colors",
666
+ formContainer: "bg-[var(--appkit-color-surface)] rounded-2xl border border-[var(--appkit-color-border)] shadow-sm p-6 lg:p-8 space-y-6",
667
+ listItem: "bg-[var(--appkit-color-surface)] border border-[var(--appkit-color-border)] rounded-xl p-4 hover:border-[var(--appkit-color-border)] transition-colors",
668
668
  linkDefault: "text-primary-600 dark:text-secondary-400 hover:text-primary-500 dark:hover:text-secondary-300 transition-colors underline-offset-2 hover:underline",
669
- iconButton: "p-2 rounded-lg transition-colors hover:bg-zinc-100 dark:hover:bg-slate-800 active:bg-zinc-200 dark:active:bg-slate-700 min-h-[44px] min-w-[44px] flex items-center justify-center",
669
+ iconButton: "p-2 rounded-lg transition-colors hover:bg-[var(--appkit-color-surface)] hover:bg-[var(--appkit-color-surface-elevated)] active:bg-zinc-200 dark:active:bg-slate-700 min-h-[44px] min-w-[44px] flex items-center justify-center",
670
670
  modalOverlay: "fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50",
671
- modalContent: "bg-white dark:bg-slate-900 rounded-2xl border border-zinc-200 dark:border-slate-700 shadow-xl max-w-lg w-full mx-4 overflow-hidden",
672
- divider: "border-t border-zinc-200 dark:border-slate-700",
673
- emptyState: "flex flex-col items-center justify-center py-12 text-center text-zinc-500 dark:text-zinc-400",
671
+ modalContent: "bg-[var(--appkit-color-surface)] rounded-2xl border border-[var(--appkit-color-border)] shadow-xl max-w-lg w-full mx-4 overflow-hidden",
672
+ divider: "border-t border-[var(--appkit-color-border)]",
673
+ emptyState: "flex flex-col items-center justify-center py-12 text-center text-[var(--appkit-color-text-muted)]",
674
674
  };
675
675
  /** Icon colour variants and sizes. */
676
676
  const ICON = {
677
- muted: "text-zinc-400 dark:text-zinc-400",
677
+ muted: "text-[var(--appkit-color-text-faint)]",
678
678
  primary: "text-primary-600 dark:text-secondary-400",
679
679
  success: "text-emerald-500 dark:text-emerald-400",
680
680
  danger: "text-red-500 dark:text-red-400",
@@ -689,7 +689,7 @@ const ICON = {
689
689
  /** Horizontal tab active / inactive states. */
690
690
  const TAB = {
691
691
  active: "border-b-2 border-primary-600 dark:border-secondary-400 text-primary-600 dark:text-secondary-400 font-semibold",
692
- inactive: "border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300",
692
+ inactive: "border-transparent text-[var(--appkit-color-text-muted)] hover:text-[var(--appkit-color-text-muted)]",
693
693
  };
694
694
  /**
695
695
  * Motion tokens — respect prefers-reduced-motion via motion-safe: prefix.
@@ -719,14 +719,14 @@ const TEXT = {
719
719
  label: "text-xs font-medium uppercase tracking-wide",
720
720
  price: "text-lg sm:text-xl font-bold tabular-nums",
721
721
  priceLg: "text-2xl sm:text-3xl font-bold tabular-nums",
722
- muted: "text-zinc-500 dark:text-zinc-400",
722
+ muted: "text-[var(--appkit-color-text-muted)]",
723
723
  error: "text-red-600 dark:text-red-400",
724
724
  success: "text-green-600 dark:text-green-400",
725
725
  };
726
726
  /** Star rating colours. */
727
727
  const RATING = {
728
728
  filled: "text-yellow-400",
729
- empty: "text-zinc-300 dark:text-zinc-600",
729
+ empty: "text-[var(--appkit-color-text-faint)]",
730
730
  };
731
731
  // THEME_CONSTANTS deleted 2026-06-17 in Phase 8 of the Three-Layer Style
732
732
  // System refactor. Use primitive variant props (<Card>, <Section>, <Stack>,
@@ -100,7 +100,7 @@ pageSize: pageSizeProp, stickyHeader: stickyHeaderProp, striped: stripedProp, sh
100
100
  if (data.length === 0) {
101
101
  if (emptyState)
102
102
  return _jsx(_Fragment, { children: emptyState });
103
- return (_jsx(Div, { className: "appkit-data-table__wrapper", children: _jsx(Div, { className: "appkit-data-table__empty", children: _jsxs(Div, { className: "text-center", padding: "x-md", children: [emptyIcon ?? (_jsx("svg", { className: "mx-auto h-12 w-12 text-zinc-400 dark:text-zinc-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" }) })), _jsx(Text, { size: "sm", weight: "semibold", className: "mt-4", children: emptyTitle ?? noDataTitle }), _jsx(Text, { size: "sm", variant: "secondary", className: "mt-1", children: emptyMessage ?? noDataDescription })] }) }) }));
103
+ return (_jsx(Div, { className: "appkit-data-table__wrapper", children: _jsx(Div, { className: "appkit-data-table__empty", children: _jsxs(Div, { className: "text-center", padding: "x-md", children: [emptyIcon ?? (_jsx("svg", { className: "mx-auto h-12 w-12 text-[var(--appkit-color-text-faint)]", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" }) })), _jsx(Text, { size: "sm", weight: "semibold", className: "mt-4", children: emptyTitle ?? noDataTitle }), _jsx(Text, { size: "sm", variant: "secondary", className: "mt-1", children: emptyMessage ?? noDataDescription })] }) }) }));
104
104
  }
105
105
  const renderViewToggle = () => {
106
106
  if (!showViewToggle)
@@ -134,7 +134,7 @@ pageSize: pageSizeProp, stickyHeader: stickyHeaderProp, striped: stripedProp, sh
134
134
  ? "ascending"
135
135
  : "descending"
136
136
  : "none"
137
- : undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`, style: { width: col.width }, onClick: () => col.sortable && handleSort(col.key), children: _jsxs(Row, { gap: "sm", children: [col.header, col.sortable && (_jsx(Span, { "aria-hidden": "true", color: "faint", children: sortKey === col.key ? (sortDirection === "asc" ? ("↑") : ("↓")) : (_jsx(Span, { className: "opacity-30", children: "\u2195" })) }))] }) }, col.key))), actions && (_jsx("th", { scope: "col", className: "appkit-data-table__th appkit-data-table__td--actions", children: labelActions }))] }) }), _jsx("tbody", { className: "appkit-data-table__tbody divide-y divide-zinc-200 dark:divide-slate-700", children: paginatedData.map((item, index) => (_jsxs("tr", { className: [
137
+ : undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`, style: { width: col.width }, onClick: () => col.sortable && handleSort(col.key), children: _jsxs(Row, { gap: "sm", children: [col.header, col.sortable && (_jsx(Span, { "aria-hidden": "true", color: "faint", children: sortKey === col.key ? (sortDirection === "asc" ? ("↑") : ("↓")) : (_jsx(Span, { className: "opacity-30", children: "\u2195" })) }))] }) }, col.key))), actions && (_jsx("th", { scope: "col", className: "appkit-data-table__th appkit-data-table__td--actions", children: labelActions }))] }) }), _jsx("tbody", { className: "appkit-data-table__tbody divide-y divide-zinc-200 divide-[var(--appkit-color-border)]", children: paginatedData.map((item, index) => (_jsxs("tr", { className: [
138
138
  "appkit-data-table__row",
139
139
  striped && index % 2 === 1
140
140
  ? "appkit-data-table__row--striped"
@@ -159,7 +159,7 @@ function DataTableTableView({ columns, paginatedData, keyExtractor, selectable,
159
159
  ? sortKey === col.key
160
160
  ? sortDirection === "asc" ? "ascending" : "descending"
161
161
  : "none"
162
- : undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`, style: { width: col.width }, onClick: () => col.sortable && onSort(col.key), children: _jsxs(Row, { gap: "sm", children: [col.header, col.sortable && (_jsx(Span, { "aria-hidden": "true", color: "faint", children: sortKey === col.key ? (sortDirection === "asc" ? "↑" : "↓") : _jsx(Span, { className: "opacity-30", children: "\u2195" }) }))] }) }, col.key))), actions && (_jsx("th", { scope: "col", className: "appkit-data-table__th appkit-data-table__td--actions", children: labelActions }))] }) }), _jsx("tbody", { className: "appkit-data-table__tbody divide-y divide-zinc-200 dark:divide-slate-700", children: paginatedData.map((item, index) => (_jsxs("tr", { className: [
162
+ : undefined, className: `appkit-data-table__th ${col.sortable ? "appkit-data-table__th--sortable" : ""}`, style: { width: col.width }, onClick: () => col.sortable && onSort(col.key), children: _jsxs(Row, { gap: "sm", children: [col.header, col.sortable && (_jsx(Span, { "aria-hidden": "true", color: "faint", children: sortKey === col.key ? (sortDirection === "asc" ? "↑" : "↓") : _jsx(Span, { className: "opacity-30", children: "\u2195" }) }))] }) }, col.key))), actions && (_jsx("th", { scope: "col", className: "appkit-data-table__th appkit-data-table__td--actions", children: labelActions }))] }) }), _jsx("tbody", { className: "appkit-data-table__tbody divide-y divide-zinc-200 divide-[var(--appkit-color-border)]", children: paginatedData.map((item, index) => (_jsxs("tr", { className: [
163
163
  "appkit-data-table__row",
164
164
  striped && index % 2 === 1 ? "appkit-data-table__row--striped" : "",
165
165
  onRowClick ? "appkit-data-table__row--clickable" : "",
@@ -36,6 +36,6 @@ export function Avatar({ src, alt, fallback, name, size = "md", className = "",
36
36
  export function AvatarGroup({ avatars, max = 4, size = "sm", className = "", }) {
37
37
  const visible = avatars.slice(0, max);
38
38
  const extra = avatars.length - visible.length;
39
- return (_jsxs("div", { className: [UI_AVATAR.group, className].filter(Boolean).join(" "), "data-section": "avatar-div-453", children: [visible.map((avatar, index) => (_jsx(Avatar, { ...avatar, size: size, className: "ring-2 ring-white dark:ring-slate-900" }, `${avatar.src ?? avatar.name ?? "avatar"}-${index}`))), extra > 0 ? (_jsxs("span", { className: [UI_AVATAR.overflow, UI_AVATAR.sizes[size]].join(" "), children: ["+", extra] })) : null] }));
39
+ return (_jsxs("div", { className: [UI_AVATAR.group, className].filter(Boolean).join(" "), "data-section": "avatar-div-453", children: [visible.map((avatar, index) => (_jsx(Avatar, { ...avatar, size: size, className: "ring-2 ring-white ring-[var(--appkit-color-bg)]" }, `${avatar.src ?? avatar.name ?? "avatar"}-${index}`))), extra > 0 ? (_jsxs("span", { className: [UI_AVATAR.overflow, UI_AVATAR.sizes[size]].join(" "), children: ["+", extra] })) : null] }));
40
40
  }
41
41
  export default Avatar;
@@ -2,11 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Span } from "./Typography";
3
3
  function BaseListingCardRoot({ className = "", isSelected, isDisabled, variant = "grid", onClick, onMouseDown, onMouseUp, onMouseLeave, onTouchStart, onTouchEnd, children, }) {
4
4
  return (_jsx("div", { onClick: onClick, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onMouseLeave: onMouseLeave, onTouchStart: onTouchStart, onTouchEnd: onTouchEnd, className: [
5
- "group relative w-full min-w-0 overflow-hidden rounded-xl border bg-white dark:bg-zinc-900 transition-shadow",
5
+ "group relative w-full min-w-0 overflow-hidden rounded-xl border bg-[var(--appkit-color-surface)] transition-shadow",
6
6
  variant === "list" ? "flex flex-row items-stretch" : "flex flex-col",
7
7
  isSelected
8
8
  ? "border-primary outline outline-2 outline-primary shadow-sm"
9
- : "border-zinc-200 dark:border-zinc-700 shadow-sm hover:shadow-md",
9
+ : "border-[var(--appkit-color-border)] shadow-sm hover:shadow-md",
10
10
  isDisabled ? "opacity-60" : "",
11
11
  onClick ? "cursor-pointer" : "",
12
12
  className,
@@ -17,7 +17,7 @@ function BaseListingCardRoot({ className = "", isSelected, isDisabled, variant =
17
17
  function BaseListingCardHero({ aspect, variant = "grid", className = "", children, onMouseEnter, onMouseLeave, }) {
18
18
  if (variant === "list") {
19
19
  return (_jsx("div", { className: [
20
- "relative overflow-hidden bg-zinc-100 dark:bg-zinc-800 flex-shrink-0",
20
+ "relative overflow-hidden bg-[var(--appkit-color-surface)] flex-shrink-0",
21
21
  "w-20 h-20 sm:w-28 sm:h-28",
22
22
  className,
23
23
  ]
@@ -30,7 +30,7 @@ function BaseListingCardHero({ aspect, variant = "grid", className = "", childre
30
30
  ? "aspect-[4/3]"
31
31
  : `aspect-[${aspect}]`;
32
32
  return (_jsx("div", { className: [
33
- "relative overflow-hidden bg-zinc-100 dark:bg-zinc-800 flex-shrink-0",
33
+ "relative overflow-hidden bg-[var(--appkit-color-surface)] flex-shrink-0",
34
34
  aspectClass,
35
35
  className,
36
36
  ]
@@ -56,7 +56,7 @@ function BaseListingCardCheckbox({ selected, onSelect, label, position = "top-2
56
56
  "focus-visible:ring-2 focus-visible:ring-primary/50",
57
57
  selected
58
58
  ? "bg-primary border-primary shadow-sm"
59
- : "bg-white/80 border-zinc-300/80 hover:border-primary/60 hover:bg-white dark:bg-zinc-800/80 dark:border-zinc-600",
59
+ : "bg-white/80 border-zinc-300/80 hover:border-primary/60 hover:bg-[var(--appkit-color-surface)]/80 border-[var(--appkit-color-border)]",
60
60
  position,
61
61
  className,
62
62
  ]
@@ -71,9 +71,9 @@ function BaseListingCardIconOverlay({ groupIcon, sublistingIcon, position = "top
71
71
  if (isMediaUrl) {
72
72
  return (
73
73
  // eslint-disable-next-line @next/next/no-img-element
74
- _jsx("img", { src: icon, alt: "", className: "w-5 h-5 rounded-full border border-white/80 shadow-sm bg-white dark:bg-zinc-900 object-cover" }, key));
74
+ _jsx("img", { src: icon, alt: "", className: "w-5 h-5 rounded-full border border-white/80 shadow-sm bg-[var(--appkit-color-surface)] object-cover" }, key));
75
75
  }
76
- return (_jsx(Span, { size: "sm", className: "inline-flex items-center justify-center w-5 h-5 rounded-full border border-white/80 bg-white/95 dark:bg-zinc-900/95 shadow-sm leading-none", children: icon }, key));
76
+ return (_jsx(Span, { size: "sm", className: "inline-flex items-center justify-center w-5 h-5 rounded-full border border-white/80 bg-white/95 bg-[var(--appkit-color-surface)]/95 shadow-sm leading-none", children: icon }, key));
77
77
  };
78
78
  return (_jsxs("div", { className: `absolute z-10 flex items-center gap-1 ${position}`, "aria-hidden": "true", children: [groupIcon && renderOne(groupIcon, "group"), sublistingIcon && renderOne(sublistingIcon, "sublisting")] }));
79
79
  }
@@ -80,9 +80,9 @@ const BUTTON_TEXT_COLOR_MAP = {
80
80
  };
81
81
  const BUTTON_BORDER_MAP = {
82
82
  none: "",
83
- default: "border border-zinc-200 dark:border-slate-700",
84
- subtle: "border border-zinc-100 dark:border-slate-800/60",
85
- strong: "border border-zinc-300 dark:border-slate-600",
83
+ default: "border border-[var(--appkit-color-border)]",
84
+ subtle: "border border-[var(--appkit-color-border-subtle)]",
85
+ strong: "border border-[var(--appkit-color-border)]",
86
86
  };
87
87
  const BUTTON_PADDING_Y_MAP = {
88
88
  none: "",
@@ -24,7 +24,7 @@ export function DetailPageGallery({ images, title, aspect = "square", fallback,
24
24
  if (!images.length) {
25
25
  return (_jsx(Div, { className: [
26
26
  "appkit-detail-gallery",
27
- "w-full overflow-hidden rounded-2xl bg-zinc-100 dark:bg-zinc-800",
27
+ "w-full overflow-hidden rounded-2xl bg-[var(--appkit-color-surface)]",
28
28
  ASPECT_CLASS[aspect],
29
29
  className,
30
30
  ]
@@ -39,12 +39,12 @@ export function DetailPageGallery({ images, title, aspect = "square", fallback,
39
39
  ]
40
40
  .filter(Boolean)
41
41
  .join(" "), children: [_jsx(Div, { className: [
42
- "w-full overflow-hidden rounded-2xl bg-zinc-100 dark:bg-zinc-800",
42
+ "w-full overflow-hidden rounded-2xl bg-[var(--appkit-color-surface)]",
43
43
  ASPECT_CLASS[aspect],
44
44
  ].join(" "), children: _jsx("img", { src: active.url, alt: active.alt ?? title ?? "", className: "h-full w-full object-cover" }) }), images.length > 1 ? (_jsx(Div, { className: `flex gap-2 ${__O.xAuto} pb-1`, children: images.map((img, idx) => (_jsx("button", { type: "button", "aria-label": `View image ${idx + 1}`, onClick: () => setActiveIndex(idx), className: [
45
45
  "flex-shrink-0 h-16 w-16 overflow-hidden rounded-md border-2 transition-colors",
46
46
  idx === activeIndex
47
47
  ? "border-[var(--appkit-color-primary)]"
48
48
  : "border-transparent hover:border-zinc-300 dark:hover:border-zinc-600",
49
- ].join(" "), children: _jsx("img", { src: img.url, alt: img.alt ?? `${title ?? ""} ${idx + 1}`, className: "h-full w-full object-cover" }) }, img.url + idx))) })) : null, active.caption ? (_jsx(Div, { className: "text-xs text-zinc-500 dark:text-zinc-400", children: active.caption })) : null] }));
49
+ ].join(" "), children: _jsx("img", { src: img.url, alt: img.alt ?? `${title ?? ""} ${idx + 1}`, className: "h-full w-full object-cover" }) }, img.url + idx))) })) : null, active.caption ? (_jsx(Div, { className: "text-xs text-[var(--appkit-color-text-muted)]", children: active.caption })) : null] }));
50
50
  }
@@ -18,5 +18,5 @@ export function DetailPageHero({ title, eyebrow, subtitle, metaRow, description,
18
18
  className,
19
19
  ]
20
20
  .filter(Boolean)
21
- .join(" "), children: [mediaSlot ? _jsx(Div, { className: "w-full md:w-2/5", children: mediaSlot }) : null, _jsxs(Stack, { gap: "md", className: "flex-1 min-w-0", children: [eyebrow ? (_jsx(Div, { className: "text-sm text-zinc-500 dark:text-zinc-400", children: eyebrow })) : null, _jsx(Heading, { level: 1, className: "text-3xl font-semibold text-zinc-900 dark:text-zinc-100", children: title }), subtitle ? (_jsx(Text, { size: "lg", color: "muted", children: subtitle })) : null, metaRow ? _jsx(Row, { gap: "sm", align: "center", className: "flex-wrap", children: metaRow }) : null, description ? (_jsx(Text, { className: "whitespace-pre-line", children: description })) : null, actionsSlot, belowActions] })] }));
21
+ .join(" "), children: [mediaSlot ? _jsx(Div, { className: "w-full md:w-2/5", children: mediaSlot }) : null, _jsxs(Stack, { gap: "md", className: "flex-1 min-w-0", children: [eyebrow ? (_jsx(Div, { className: "text-sm text-[var(--appkit-color-text-muted)]", children: eyebrow })) : null, _jsx(Heading, { level: 1, className: "text-3xl font-semibold text-[var(--appkit-color-text)]", children: title }), subtitle ? (_jsx(Text, { size: "lg", color: "muted", children: subtitle })) : null, metaRow ? _jsx(Row, { gap: "sm", align: "center", className: "flex-wrap", children: metaRow }) : null, description ? (_jsx(Text, { className: "whitespace-pre-line", children: description })) : null, actionsSlot, belowActions] })] }));
22
22
  }
@@ -29,14 +29,14 @@ export function DetailPageTabs({ tabs, activeTab: activeTabProp, defaultTab, onT
29
29
  className,
30
30
  ]
31
31
  .filter(Boolean)
32
- .join(" "), children: [_jsx(Div, { role: "tablist", "aria-orientation": "horizontal", className: `flex gap-2 border-b border-zinc-200 dark:border-zinc-700 ${__O.xAuto}`, children: tabs.map((tab) => {
32
+ .join(" "), children: [_jsx(Div, { role: "tablist", "aria-orientation": "horizontal", className: `flex gap-2 border-b border-[var(--appkit-color-border)] ${__O.xAuto}`, children: tabs.map((tab) => {
33
33
  const isActive = tab.id === active?.id;
34
34
  return (_jsxs("button", { type: "button", role: "tab", "aria-selected": isActive, "aria-controls": `detail-tab-panel-${tab.id}`, id: `detail-tab-trigger-${tab.id}`, disabled: tab.disabled, onClick: () => handleChange(tab.id), className: [
35
35
  "flex-shrink-0 px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors",
36
36
  isActive
37
- ? "border-[var(--appkit-color-primary)] text-zinc-900 dark:text-zinc-100"
38
- : "border-transparent text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200",
37
+ ? "border-[var(--appkit-color-primary)] text-[var(--appkit-color-text)]"
38
+ : "border-transparent text-[var(--appkit-color-text-muted)] hover:text-zinc-700 hover:text-[var(--appkit-color-text-muted)]",
39
39
  tab.disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer",
40
- ].join(" "), children: [tab.label, typeof tab.count === "number" ? (_jsx(Span, { size: "xs", className: "ml-2 inline-flex items-center justify-center rounded-full bg-zinc-100 dark:bg-zinc-800 px-2 py-0.5", children: tab.count })) : null] }, tab.id));
40
+ ].join(" "), children: [tab.label, typeof tab.count === "number" ? (_jsx(Span, { size: "xs", className: "ml-2 inline-flex items-center justify-center rounded-full bg-[var(--appkit-color-surface)] px-2 py-0.5", children: tab.count })) : null] }, tab.id));
41
41
  }) }), active ? (_jsx(Div, { role: "tabpanel", id: `detail-tab-panel-${active.id}`, "aria-labelledby": `detail-tab-trigger-${active.id}`, children: active.content })) : null] }));
42
42
  }
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Div } from "./Div";
4
4
  import { Text } from "./Typography";
5
5
  const ACTIVE_CLS = "bg-[var(--appkit-color-primary)] text-white border-[var(--appkit-color-primary)]";
6
- const INACTIVE_CLS = "border-zinc-300 dark:border-slate-600 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-slate-800";
6
+ const INACTIVE_CLS = "border-[var(--appkit-color-border)] text-[var(--appkit-color-text-muted)] hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)]";
7
7
  const CHIP_BASE_CLS = "rounded-full px-3 py-1 text-xs font-medium border transition-colors";
8
- const LABEL_CLS = "text-xs font-semibold uppercase tracking-widest text-zinc-500 dark:text-zinc-400";
8
+ const LABEL_CLS = "text-xs font-semibold uppercase tracking-widest text-[var(--appkit-color-text-muted)]";
9
9
  export function FilterChipGroup({ label, tabs, value, onChange, allId = "All", className, }) {
10
10
  const current = value || allId;
11
11
  return (_jsxs(Div, { className: `space-y-2 ${className ?? ""}`.trim(), children: [_jsx(Text, { as: "p", className: LABEL_CLS, children: label }), _jsx(Div, { className: "flex flex-wrap gap-2", children: tabs.map((tab) => {
@@ -27,6 +27,6 @@ export const Input = React.forwardRef(function Input({ label, error, helperText,
27
27
  }
28
28
  const adornment = rightIcon ??
29
29
  (success && !error ? (_jsx("svg", { className: CLS_INPUT_SUCCESS_ICON, viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": "true", children: _jsx("path", { fillRule: "evenodd", d: "M16.704 5.29a1 1 0 010 1.42l-7.2 7.2a1 1 0 01-1.415 0l-3.2-3.2a1 1 0 111.414-1.42l2.493 2.494 6.493-6.494a1 1 0 011.415 0z", clipRule: "evenodd" }) })) : null);
30
- return (_jsxs("div", { className: "w-full", "data-section": "input-div-527", children: [label && (_jsx(Label, { htmlFor: inputId, required: required, children: label })), _jsxs("div", { className: "relative", "data-section": "input-div-528", children: [icon && (_jsx(Div, { className: "pointer-events-none absolute inset-y-0 left-3 flex items-center text-zinc-400 dark:text-zinc-400", "data-section": "input-div-529", children: icon })), _jsx("input", { ...props, ref: ref, id: inputId, disabled: disabled, "aria-invalid": error ? "true" : undefined, className: inputClassName }), adornment && (_jsx(Div, { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-zinc-400 dark:text-zinc-400", "data-section": "input-div-530", children: adornment }))] }), error ? (_jsx(Text, { size: "sm", variant: "error", className: "mt-1.5", role: "alert", children: error })) : helperText ? (_jsx(Text, { size: "sm", variant: "secondary", className: "mt-1.5", children: helperText })) : null] }));
30
+ return (_jsxs("div", { className: "w-full", "data-section": "input-div-527", children: [label && (_jsx(Label, { htmlFor: inputId, required: required, children: label })), _jsxs("div", { className: "relative", "data-section": "input-div-528", children: [icon && (_jsx(Div, { className: "pointer-events-none absolute inset-y-0 left-3 flex items-center text-[var(--appkit-color-text-faint)]", "data-section": "input-div-529", children: icon })), _jsx("input", { ...props, ref: ref, id: inputId, disabled: disabled, "aria-invalid": error ? "true" : undefined, className: inputClassName }), adornment && (_jsx(Div, { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-[var(--appkit-color-text-faint)]", "data-section": "input-div-530", children: adornment }))] }), error ? (_jsx(Text, { size: "sm", variant: "error", className: "mt-1.5", role: "alert", children: error })) : helperText ? (_jsx(Text, { size: "sm", variant: "secondary", className: "mt-1.5", children: helperText })) : null] }));
31
31
  });
32
32
  Input.displayName = "Input";
@@ -219,7 +219,7 @@ export interface StackProps extends React.HTMLAttributes<HTMLElement>, SurfacePr
219
219
  /**
220
220
  * Render a themed top-border between adjacent children. `true` / `"default"`
221
221
  * uses the active theme's border colour; `"subtle"` uses border-subtle.
222
- * Replaces the recurrent `divide-y divide-zinc-200 dark:divide-zinc-700`
222
+ * Replaces the recurrent `divide-y divide-[var(--appkit-color-border)]`
223
223
  * className pattern (which bypasses theme tokens).
224
224
  */
225
225
  divide?: boolean | "default" | "subtle";
@@ -284,7 +284,7 @@ export interface RowProps extends React.HTMLAttributes<HTMLElement>, SurfaceProp
284
284
  /**
285
285
  * Render a themed left-border between adjacent children. `true` / `"default"`
286
286
  * uses the active theme's border colour; `"subtle"` uses border-subtle.
287
- * Replaces the recurrent `divide-x divide-zinc-200 dark:divide-zinc-700`
287
+ * Replaces the recurrent `divide-x divide-[var(--appkit-color-border)]`
288
288
  * className pattern (which bypasses theme tokens).
289
289
  */
290
290
  divide?: boolean | "default" | "subtle";
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { X } from "lucide-react";
4
4
  import { Button } from "./Button";
5
5
  import { Span } from "./Typography";
6
- const CLS_CLEAR_BTN = "text-xs text-zinc-500 hover:text-error dark:text-zinc-400 transition-colors min-h-0 h-auto p-0";
6
+ const CLS_CLEAR_BTN = "text-xs text-[var(--appkit-color-text-muted)] hover:text-error text-[var(--appkit-color-text-muted)] transition-colors min-h-0 h-auto p-0";
7
7
  export function ListingFilterDrawer({ open, onClose, onApply, onClear, activeCount, children, }) {
8
8
  if (!open)
9
9
  return null;
10
- return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40 bg-black/40", "aria-hidden": "true", onClick: onClose }), _jsxs("div", { className: "fixed inset-y-0 left-0 z-50 flex w-80 flex-col bg-white dark:bg-slate-900 shadow-2xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-zinc-200 dark:border-slate-700 px-4 py-3.5", children: [_jsx(Span, { size: "base", weight: "semibold", className: "text-zinc-900 dark:text-zinc-100", children: "Filters" }), _jsxs("div", { className: "flex items-center gap-2", children: [activeCount > 0 && (_jsx(Button, { variant: "ghost", type: "button", onClick: onClear, className: CLS_CLEAR_BTN, children: "Clear all" })), _jsx(Button, { variant: "ghost", type: "button", onClick: onClose, "aria-label": "Close", className: "rounded-lg p-1.5 text-zinc-500 dark:text-zinc-400 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors min-h-0 h-auto", children: _jsx(X, { className: "h-5 w-5" }) })] })] }), _jsx("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-5", children: children }), _jsx("div", { className: "border-t border-zinc-200 dark:border-slate-700 px-4 py-3.5", children: _jsxs(Button, { type: "button", onClick: onApply, className: "w-full", children: ["Apply Filters", activeCount > 0 ? ` (${activeCount})` : ""] }) })] })] }));
10
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40 bg-black/40", "aria-hidden": "true", onClick: onClose }), _jsxs("div", { className: "fixed inset-y-0 left-0 z-50 flex w-80 flex-col bg-[var(--appkit-color-surface)] shadow-2xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-[var(--appkit-color-border)] px-4 py-3.5", children: [_jsx(Span, { size: "base", weight: "semibold", className: "text-[var(--appkit-color-text)]", children: "Filters" }), _jsxs("div", { className: "flex items-center gap-2", children: [activeCount > 0 && (_jsx(Button, { variant: "ghost", type: "button", onClick: onClear, className: CLS_CLEAR_BTN, children: "Clear all" })), _jsx(Button, { variant: "ghost", type: "button", onClick: onClose, "aria-label": "Close", className: "rounded-lg p-1.5 text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-surface-elevated)] transition-colors min-h-0 h-auto", children: _jsx(X, { className: "h-5 w-5" }) })] })] }), _jsx("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-5", children: children }), _jsx("div", { className: "border-t border-[var(--appkit-color-border)] px-4 py-3.5", children: _jsxs(Button, { type: "button", onClick: onApply, className: "w-full", children: ["Apply Filters", activeCount > 0 ? ` (${activeCount})` : ""] }) })] })] }));
11
11
  }
@@ -4,8 +4,8 @@ import { CheckSquare, Search, SlidersHorizontal, LayoutGrid, List, Table2, Rotat
4
4
  import { SortDropdown } from "./SortDropdown";
5
5
  import { Div } from "./Div";
6
6
  import { Span } from "./Typography";
7
- const CLS_CLEAR_LINK = "text-xs text-zinc-400 hover:text-error dark:text-zinc-400 transition-colors";
8
- const CLS_CLEAR_ICON_BTN = "flex shrink-0 items-center justify-center rounded-lg border border-zinc-300 dark:border-slate-600 p-1.5 sm:p-2 text-zinc-500 dark:text-zinc-400 hover:bg-zinc-50 dark:hover:bg-slate-800 hover:text-error dark:hover:text-error transition-colors";
7
+ const CLS_CLEAR_LINK = "text-xs text-zinc-400 hover:text-error text-[var(--appkit-color-text-muted)] transition-colors";
8
+ const CLS_CLEAR_ICON_BTN = "flex shrink-0 items-center justify-center rounded-lg border border-[var(--appkit-color-border)] p-1.5 sm:p-2 text-[var(--appkit-color-text-muted)] hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)] hover:text-error dark:hover:text-error transition-colors";
9
9
  const DEFAULT_LABELS = {
10
10
  search: "Search",
11
11
  filters: "Filters",
@@ -21,7 +21,7 @@ const DEFAULT_LABELS = {
21
21
  };
22
22
  const VIEW_BTN_BASE = "p-1.5 sm:p-2 transition-colors";
23
23
  const VIEW_BTN_ACTIVE = "bg-[var(--appkit-color-primary,theme(colors.violet.600))] text-white";
24
- const VIEW_BTN_INACTIVE = "text-zinc-500 hover:bg-zinc-50 dark:hover:bg-slate-800 dark:text-zinc-400";
24
+ const VIEW_BTN_INACTIVE = "text-[var(--appkit-color-text-muted)] hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)] text-[var(--appkit-color-text-muted)]";
25
25
  export function ListingToolbar({ filterCount = 0, onFiltersClick, searchValue = "", searchPlaceholder = "Search…", onSearchChange, onSearchCommit, onSearchKeyDown, sortValue, sortOptions, onSortChange, view = "grid", onViewChange, hideViewToggle = false, showTableView = false, onResetAll, hasActiveState = false, bulkMode = false, bulkSelectedCount = 0, bulkTotalCount = 0, onBulkSelectAll, onBulkClear, toggles, extra, labels, className = "", }) {
26
26
  const l = { ...DEFAULT_LABELS, ...labels };
27
27
  const handleKeyDown = (e) => {
@@ -33,9 +33,9 @@ export function ListingToolbar({ filterCount = 0, onFiltersClick, searchValue =
33
33
  }
34
34
  };
35
35
  const allSelected = bulkTotalCount > 0 && bulkSelectedCount === bulkTotalCount;
36
- return (_jsx("div", { "data-testid": "listing-toolbar", className: `sticky top-[var(--header-height,0px)] z-20 border-b border-zinc-200 dark:border-slate-700 bg-white/95 dark:bg-slate-900/95 backdrop-blur-sm py-2 px-3 sm:py-2.5 sm:px-4 ${className}`, children: _jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-2.5", children: [bulkMode ? (_jsxs("div", { className: "flex flex-1 items-center gap-2", children: [_jsxs("button", { type: "button", onClick: onBulkSelectAll, className: "flex items-center gap-1.5 rounded-lg border border-zinc-300 dark:border-slate-600 px-3 py-1.5 text-sm font-medium text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-slate-800 transition-colors", children: [allSelected
36
+ return (_jsx("div", { "data-testid": "listing-toolbar", className: `sticky top-[var(--header-height,0px)] z-20 border-b border-[var(--appkit-color-border)] bg-white/95 bg-[var(--appkit-color-surface)]/95 backdrop-blur-sm py-2 px-3 sm:py-2.5 sm:px-4 ${className}`, children: _jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-2.5", children: [bulkMode ? (_jsxs("div", { className: "flex flex-1 items-center gap-2", children: [_jsxs("button", { type: "button", onClick: onBulkSelectAll, className: "flex items-center gap-1.5 rounded-lg border border-[var(--appkit-color-border)] px-3 py-1.5 text-sm font-medium text-[var(--appkit-color-text-muted)] hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)] transition-colors", children: [allSelected
37
37
  ? _jsx(CheckSquare, { className: "h-4 w-4 text-[var(--appkit-color-primary,theme(colors.violet.600))]" })
38
- : _jsx(Square, { className: "h-4 w-4" }), allSelected ? l.deselectAll : l.selectAll(bulkTotalCount)] }), _jsx(Span, { size: "sm", color: "muted", children: l.selected(bulkSelectedCount) }), _jsx("button", { type: "button", onClick: onBulkClear, className: CLS_CLEAR_LINK, children: l.clearSelection })] })) : onSearchChange ? (_jsxs("div", { className: "flex flex-1 items-center overflow-hidden rounded-lg border border-zinc-300 dark:border-slate-600 bg-white dark:bg-slate-900 min-w-0", children: [_jsx("input", { type: "text", value: searchValue, onChange: (e) => onSearchChange(e.target.value), onKeyDown: handleKeyDown, placeholder: searchPlaceholder, className: "min-w-0 flex-1 bg-transparent px-3 py-2 text-sm text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 outline-none" }), _jsx("button", { type: "button", onClick: onSearchCommit, className: "flex shrink-0 items-center justify-center px-2.5 py-2 text-zinc-400 hover:text-[var(--appkit-color-primary,theme(colors.violet.600))] transition-colors", "aria-label": l.search, children: _jsx(Search, { className: "h-4 w-4" }) })] })) : null, _jsxs("div", { className: "flex items-center gap-1.5 sm:gap-2 shrink-0", children: [onFiltersClick && (_jsxs("button", { type: "button", onClick: onFiltersClick, className: "relative flex shrink-0 items-center gap-1.5 rounded-lg border border-zinc-300 dark:border-slate-600 px-2.5 py-1.5 sm:px-3.5 sm:py-2 text-sm font-medium text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-slate-800 transition-colors", children: [_jsx(SlidersHorizontal, { className: "h-4 w-4" }), _jsx("span", { className: "hidden sm:inline", children: l.filters }), filterCount > 0 && (_jsx(Span, { weight: "bold", className: "absolute -top-1.5 -right-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-[var(--appkit-color-primary,theme(colors.violet.600))] text-[10px] text-white", children: filterCount }))] })), sortOptions && sortValue !== undefined && onSortChange && (_jsxs(Div, { className: "flex items-center gap-1.5 text-zinc-500 dark:text-zinc-400", children: [_jsx(Span, { size: "xs", className: "hidden md:inline whitespace-nowrap", children: l.sort }), _jsx(SortDropdown, { value: sortValue, onChange: onSortChange, options: sortOptions })] })), !hideViewToggle && onViewChange && (_jsxs("div", { className: "flex items-center rounded-lg border border-zinc-300 dark:border-slate-600 overflow-hidden", children: [_jsx("button", { type: "button", onClick: () => onViewChange("grid"), "aria-label": l.gridView, className: `${VIEW_BTN_BASE} ${view === "grid" ? VIEW_BTN_ACTIVE : VIEW_BTN_INACTIVE}`, children: _jsx(LayoutGrid, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: () => onViewChange("list"), "aria-label": l.listView, className: `${VIEW_BTN_BASE} ${view === "list" ? VIEW_BTN_ACTIVE : VIEW_BTN_INACTIVE}`, children: _jsx(List, { className: "h-4 w-4" }) }), showTableView && (_jsx("button", { type: "button", onClick: () => onViewChange("table"), "aria-label": l.tableView, className: `${VIEW_BTN_BASE} ${view === "table" ? VIEW_BTN_ACTIVE : VIEW_BTN_INACTIVE}`, children: _jsx(Table2, { className: "h-4 w-4" }) }))] })), onResetAll && hasActiveState && (_jsx("button", { type: "button", onClick: onResetAll, "aria-label": l.resetAll, title: l.resetAll, className: CLS_CLEAR_ICON_BTN, children: _jsx(RotateCcw, { className: "h-4 w-4" }) })), toggles && toggles.length > 0 && (_jsx("div", { className: "flex items-center gap-1", children: toggles.map((t) => (_jsx("button", { type: "button", role: "switch", "aria-checked": t.active, onClick: () => t.onChange(!t.active), className: `rounded-full border px-2.5 py-1 text-xs font-medium transition-colors whitespace-nowrap ${t.active
38
+ : _jsx(Square, { className: "h-4 w-4" }), allSelected ? l.deselectAll : l.selectAll(bulkTotalCount)] }), _jsx(Span, { size: "sm", color: "muted", children: l.selected(bulkSelectedCount) }), _jsx("button", { type: "button", onClick: onBulkClear, className: CLS_CLEAR_LINK, children: l.clearSelection })] })) : onSearchChange ? (_jsxs("div", { className: "flex flex-1 items-center overflow-hidden rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] min-w-0", children: [_jsx("input", { type: "text", value: searchValue, onChange: (e) => onSearchChange(e.target.value), onKeyDown: handleKeyDown, placeholder: searchPlaceholder, className: "min-w-0 flex-1 bg-transparent px-3 py-2 text-sm text-[var(--appkit-color-text)] placeholder-zinc-400 outline-none" }), _jsx("button", { type: "button", onClick: onSearchCommit, className: "flex shrink-0 items-center justify-center px-2.5 py-2 text-zinc-400 hover:text-[var(--appkit-color-primary,theme(colors.violet.600))] transition-colors", "aria-label": l.search, children: _jsx(Search, { className: "h-4 w-4" }) })] })) : null, _jsxs("div", { className: "flex items-center gap-1.5 sm:gap-2 shrink-0", children: [onFiltersClick && (_jsxs("button", { type: "button", onClick: onFiltersClick, className: "relative flex shrink-0 items-center gap-1.5 rounded-lg border border-[var(--appkit-color-border)] px-2.5 py-1.5 sm:px-3.5 sm:py-2 text-sm font-medium text-[var(--appkit-color-text-muted)] hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)] transition-colors", children: [_jsx(SlidersHorizontal, { className: "h-4 w-4" }), _jsx("span", { className: "hidden sm:inline", children: l.filters }), filterCount > 0 && (_jsx(Span, { weight: "bold", className: "absolute -top-1.5 -right-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-[var(--appkit-color-primary,theme(colors.violet.600))] text-[10px] text-white", children: filterCount }))] })), sortOptions && sortValue !== undefined && onSortChange && (_jsxs(Div, { className: "flex items-center gap-1.5 text-[var(--appkit-color-text-muted)]", children: [_jsx(Span, { size: "xs", className: "hidden md:inline whitespace-nowrap", children: l.sort }), _jsx(SortDropdown, { value: sortValue, onChange: onSortChange, options: sortOptions })] })), !hideViewToggle && onViewChange && (_jsxs("div", { className: "flex items-center rounded-lg border border-[var(--appkit-color-border)] overflow-hidden", children: [_jsx("button", { type: "button", onClick: () => onViewChange("grid"), "aria-label": l.gridView, className: `${VIEW_BTN_BASE} ${view === "grid" ? VIEW_BTN_ACTIVE : VIEW_BTN_INACTIVE}`, children: _jsx(LayoutGrid, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: () => onViewChange("list"), "aria-label": l.listView, className: `${VIEW_BTN_BASE} ${view === "list" ? VIEW_BTN_ACTIVE : VIEW_BTN_INACTIVE}`, children: _jsx(List, { className: "h-4 w-4" }) }), showTableView && (_jsx("button", { type: "button", onClick: () => onViewChange("table"), "aria-label": l.tableView, className: `${VIEW_BTN_BASE} ${view === "table" ? VIEW_BTN_ACTIVE : VIEW_BTN_INACTIVE}`, children: _jsx(Table2, { className: "h-4 w-4" }) }))] })), onResetAll && hasActiveState && (_jsx("button", { type: "button", onClick: onResetAll, "aria-label": l.resetAll, title: l.resetAll, className: CLS_CLEAR_ICON_BTN, children: _jsx(RotateCcw, { className: "h-4 w-4" }) })), toggles && toggles.length > 0 && (_jsx("div", { className: "flex items-center gap-1", children: toggles.map((t) => (_jsx("button", { type: "button", role: "switch", "aria-checked": t.active, onClick: () => t.onChange(!t.active), className: `rounded-full border px-2.5 py-1 text-xs font-medium transition-colors whitespace-nowrap ${t.active
39
39
  ? "border-transparent bg-[var(--appkit-color-primary,theme(colors.violet.600))] text-white"
40
- : "border-zinc-300 dark:border-slate-600 text-zinc-600 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-slate-800"}`, children: t.label }, t.label))) })), extra] })] }) }));
40
+ : "border-[var(--appkit-color-border)] text-[var(--appkit-color-text-muted)] hover:bg-zinc-50 hover:bg-[var(--appkit-color-surface-elevated)]"}`, children: t.label }, t.label))) })), extra] })] }) }));
41
41
  }
@@ -7,5 +7,5 @@ import { Text } from "./Typography";
7
7
  import { ROUTES } from "../../next/routing/route-map";
8
8
  export function LoginRequiredModal({ isOpen, onClose, message = "You need to be signed in to continue. Please log in or create an account.", loginHref, }) {
9
9
  const href = loginHref ?? String(ROUTES.AUTH.LOGIN);
10
- return (_jsx(Modal, { isOpen: isOpen, onClose: onClose, title: "Sign in required", size: "sm", actions: _jsxs(Div, { className: "flex gap-3 justify-end", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: "Cancel" }), _jsx(Button, { variant: "primary", size: "sm", onClick: () => { window.location.href = href; }, children: "Go to Login" })] }), children: _jsx(Text, { className: "text-sm text-zinc-600 dark:text-zinc-300", children: message }) }));
10
+ return (_jsx(Modal, { isOpen: isOpen, onClose: onClose, title: "Sign in required", size: "sm", actions: _jsxs(Div, { className: "flex gap-3 justify-end", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: "Cancel" }), _jsx(Button, { variant: "primary", size: "sm", onClick: () => { window.location.href = href; }, children: "Go to Login" })] }), children: _jsx(Text, { className: "text-sm text-[var(--appkit-color-text-muted)]", children: message }) }));
11
11
  }