@mohasinac/appkit 3.2.8 → 3.2.9
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.
- package/dist/_internal/client/features/filters/filter-load-options.js +11 -9
- package/dist/_internal/client/theme/ThemeProvider.js +14 -4
- package/dist/_internal/server/features/auth/firebase-identity.d.ts +12 -0
- package/dist/_internal/server/features/auth/firebase-identity.js +25 -0
- package/dist/_internal/server/features/site-settings/safe-settings.d.ts +12 -0
- package/dist/_internal/server/features/site-settings/safe-settings.js +25 -0
- package/dist/_internal/shared/features/layout/config.js +7 -7
- package/dist/_internal/shared/styles/skeleton.d.ts +8 -8
- package/dist/_internal/shared/styles/skeleton.js +10 -10
- package/dist/_internal/shared/styles/themed.d.ts +12 -12
- package/dist/_internal/shared/styles/themed.js +12 -12
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/FAQPageView.js +1 -1
- package/dist/features/about/components/FeesView.js +2 -2
- package/dist/features/about/components/HowAuctionsWorkView.js +2 -2
- package/dist/features/about/components/HowCheckoutWorksView.js +2 -2
- package/dist/features/about/components/HowOffersWorkView.js +2 -2
- package/dist/features/about/components/HowOrdersWorkView.js +2 -2
- package/dist/features/about/components/HowPayoutsWorkView.js +2 -2
- package/dist/features/about/components/HowPreOrdersWorkView.js +2 -2
- package/dist/features/about/components/HowReviewsWorkView.js +2 -2
- package/dist/features/about/components/PublicProfileView.js +3 -3
- package/dist/features/about/components/SecurityPrivacyView.js +2 -2
- package/dist/features/account/components/AddressBook.js +2 -2
- package/dist/features/account/components/AddressesIndexListing.js +1 -1
- package/dist/features/account/components/ChatWindow.js +1 -1
- package/dist/features/account/components/MessagesView.js +1 -1
- package/dist/features/account/components/NotificationBell.js +2 -2
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserSidebar.js +3 -3
- package/dist/features/account/components/UserSupportView.js +3 -3
- package/dist/features/admin/components/AdminAdEditorView.js +1 -1
- package/dist/features/admin/components/AdminAdsView.js +5 -5
- package/dist/features/admin/components/AdminAnalyticsView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +1 -1
- package/dist/features/admin/components/AdminBundlesView.js +2 -2
- package/dist/features/admin/components/AdminCarouselEditorView.js +4 -4
- package/dist/features/admin/components/AdminCarouselView.js +2 -2
- package/dist/features/admin/components/AdminCategoriesView.js +2 -2
- package/dist/features/admin/components/AdminContactEditorView.js +1 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +3 -3
- package/dist/features/admin/components/AdminFaqsView.js +1 -1
- package/dist/features/admin/components/AdminFeatureEditorView.js +2 -2
- package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -1
- package/dist/features/admin/components/AdminFeaturesView.js +2 -2
- package/dist/features/admin/components/AdminNavigationView.js +2 -2
- package/dist/features/admin/components/AdminNotificationsView.js +1 -1
- package/dist/features/admin/components/AdminOrderEditorView.js +1 -1
- package/dist/features/admin/components/AdminPageHeader.d.ts +1 -1
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminReviewsView.js +1 -1
- package/dist/features/admin/components/AdminScammerEditorView.js +3 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +1 -1
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSidebar.js +5 -5
- package/dist/features/admin/components/AdminSiteSettingsView.js +3 -3
- package/dist/features/admin/components/AdminStoreEditorView.js +3 -3
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +3 -3
- package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
- package/dist/features/admin/components/AdminViewCards.js +5 -5
- package/dist/features/admin/components/DataTable.js +1 -1
- package/dist/features/admin/components/DrawerFormFooter.js +1 -1
- package/dist/features/admin/components/QuickActionsPanel.js +1 -1
- package/dist/features/admin/components/analytics/AdminTopProductsTable.js +1 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
- package/dist/features/auctions/components/CollapsibleBidHistory.js +1 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +1 -1
- package/dist/features/auth/components/ForgotPasswordView.js +1 -1
- package/dist/features/auth/components/Guards.js +1 -1
- package/dist/features/auth/components/RegisterForm.js +1 -1
- package/dist/features/auth/components/ResetPasswordView.js +1 -1
- package/dist/features/auth/components/SocialAuthButtons.js +1 -1
- package/dist/features/blog/components/BlogIndexListing.js +1 -1
- package/dist/features/blog/components/BlogListView.js +3 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/cart/components/CartDrawer.js +5 -5
- package/dist/features/categories/components/BrandDetailPageView.js +1 -1
- package/dist/features/categories/components/BrandDetailTabs.js +1 -1
- package/dist/features/categories/components/CategoriesIndexListing.js +2 -2
- package/dist/features/categories/components/CategoryDetailPageView.js +1 -1
- package/dist/features/categories/components/CategoryDetailTabs.js +1 -1
- package/dist/features/categories/components/CategoryGrid.js +3 -3
- package/dist/features/categories/components/CategoryTree.js +2 -2
- package/dist/features/categories/components/ConcernCard.js +1 -1
- package/dist/features/checkout/components/CheckoutStepper.js +1 -1
- package/dist/features/classified/components/ClassifiedIndexListing.js +1 -1
- package/dist/features/collections/components/CollectionCard.js +1 -1
- package/dist/features/collections/hooks/useCollections.js +12 -12
- package/dist/features/contact/components/ContactForm.js +1 -1
- package/dist/features/copilot/components/AdminCopilotView.js +5 -5
- package/dist/features/digital-codes/components/DigitalCodesIndexListing.js +1 -1
- package/dist/features/events/components/AdminEventEntriesView.js +1 -1
- package/dist/features/events/components/EventCard.js +1 -1
- package/dist/features/events/components/EventPollWidget.js +1 -1
- package/dist/features/events/components/EventStatusBadge.js +1 -1
- package/dist/features/events/components/EventsIndexListing.js +1 -1
- package/dist/features/faq/components/ContactCTA.js +2 -2
- package/dist/features/faq/components/FAQAccordion.js +4 -4
- package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
- package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
- package/dist/features/faq/components/RelatedFAQs.js +1 -1
- package/dist/features/filters/AsyncFacetSection.js +3 -3
- package/dist/features/filters/FilterFacetSection.js +5 -5
- package/dist/features/filters/RangeFilter.js +3 -3
- package/dist/features/filters/SwitchFilter.js +2 -2
- package/dist/features/forms/Checkbox.js +1 -1
- package/dist/features/forms/Input.js +2 -2
- package/dist/features/forms/Radio.js +2 -2
- package/dist/features/forms/Select.js +1 -1
- package/dist/features/forms/Slider.js +1 -1
- package/dist/features/forms/Textarea.js +1 -1
- package/dist/features/forms/Toggle.js +3 -3
- package/dist/features/forms/utils.d.ts +4 -4
- package/dist/features/forms/utils.js +4 -4
- package/dist/features/homepage/components/AdSlot.js +1 -1
- package/dist/features/homepage/components/AdvertisementBanner.js +3 -3
- package/dist/features/homepage/components/BrandsSection.js +2 -2
- package/dist/features/homepage/components/GoogleReviewsSection.js +1 -1
- package/dist/features/homepage/components/HeroSection.js +1 -1
- package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +1 -1
- package/dist/features/homepage/components/HowItWorksSection.js +1 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +2 -2
- package/dist/features/homepage/components/SiteFeaturesSection.js +1 -1
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/homepage/components/StatsCounterSection.js +1 -1
- package/dist/features/homepage/components/TrustIndicatorsSection.js +1 -1
- package/dist/features/homepage/constants/hero-carousel-styles.d.ts +3 -3
- package/dist/features/homepage/constants/hero-carousel-styles.js +3 -3
- package/dist/features/homepage/hooks/useActiveAd.d.ts +1 -3
- package/dist/features/homepage/hooks/useActiveAd.js +9 -17
- package/dist/features/layout/AppLayoutShell.js +12 -12
- package/dist/features/layout/AutoBreadcrumbs.js +1 -1
- package/dist/features/layout/BackToTop.js +2 -2
- package/dist/features/layout/BottomActions.js +8 -8
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomNavLayout.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +2 -2
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/Breadcrumbs.js +2 -2
- package/dist/features/layout/FooterLayout.js +2 -2
- package/dist/features/layout/MainNavbar.js +1 -1
- package/dist/features/layout/NavItem.js +1 -1
- package/dist/features/layout/NavbarLayout.js +3 -3
- package/dist/features/layout/SidebarLayout.js +1 -1
- package/dist/features/layout/TitleBarLayout.js +3 -3
- package/dist/features/live/components/LiveItemsIndexListing.js +1 -1
- package/dist/features/loyalty/components/CoinsDisplay.js +1 -1
- package/dist/features/loyalty/hooks/useLoyaltyBalance.js +11 -3
- package/dist/features/media/AvatarUpload.js +1 -1
- package/dist/features/media/MediaPickerModal.js +1 -1
- package/dist/features/media/components/MediaSlider.js +1 -1
- package/dist/features/media/finalize.d.ts +12 -1
- package/dist/features/media/finalize.js +64 -11
- package/dist/features/media/modals/ImageCropModal.js +1 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +33 -0
- package/dist/features/media/repository/media-assets.repository.js +43 -0
- package/dist/features/media/upload/MediaUploadField.js +1 -1
- package/dist/features/messages/hooks/useConversation.js +12 -17
- package/dist/features/messages/hooks/useConversations.js +3 -5
- package/dist/features/orders/components/MarketplaceOrderCard.js +1 -1
- package/dist/features/orders/components/OrdersList.js +3 -3
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +1 -1
- package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -2
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/hooks/usePreOrders.js +12 -12
- package/dist/features/products/columns/productTableColumns.js +3 -3
- package/dist/features/products/components/BidHistory.js +1 -1
- package/dist/features/products/components/CompareOverlay.js +9 -9
- package/dist/features/products/components/CustomSectionTabContent.js +1 -1
- package/dist/features/products/components/CustomSectionsEditor.js +1 -1
- package/dist/features/products/components/FeatureBadge.js +2 -2
- package/dist/features/products/components/GroupSettingsPanel.js +2 -2
- package/dist/features/products/components/PrizeDrawDetailPageView.js +2 -2
- package/dist/features/products/components/PrizeDrawsIndexListing.js +1 -1
- package/dist/features/products/components/ProductDetailPageView.js +4 -4
- package/dist/features/products/components/ProductFeatureBadges.js +2 -2
- package/dist/features/products/components/ProductFeaturesSelector.js +4 -4
- package/dist/features/products/components/ProductGalleryClient.js +1 -1
- package/dist/features/products/components/ProductGrid.js +8 -8
- package/dist/features/products/components/ProductTabs.js +1 -1
- package/dist/features/products/components/ProductTabsShell.js +1 -1
- package/dist/features/products/components/ShareButton.js +1 -1
- package/dist/features/products/components/ShowGroupSection.js +2 -2
- package/dist/features/products/components/SublistingCarouselSection.js +2 -2
- package/dist/features/promotions/components/CouponCard.js +2 -2
- package/dist/features/promotions/components/CouponsIndexListing.js +2 -2
- package/dist/features/reviews/components/ReviewDetailPageView.js +1 -1
- package/dist/features/reviews/components/ReviewDetailShell.js +5 -5
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewSummary.js +2 -2
- package/dist/features/reviews/components/ReviewsIndexListing.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +2 -2
- package/dist/features/scams/components/ScamRegistryView.js +2 -2
- package/dist/features/search/components/Search.js +11 -11
- package/dist/features/search/components/SearchFiltersRow.js +1 -1
- package/dist/features/search/components/SearchResultsSection.js +2 -2
- package/dist/features/seller/components/SellerAddressesView.js +4 -4
- package/dist/features/seller/components/SellerAnalyticsAlertsView.js +1 -1
- package/dist/features/seller/components/SellerCouponEditorView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerFeaturesView.js +2 -2
- package/dist/features/seller/components/SellerGoogleReviewsView.js +1 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutMethodsView.js +1 -1
- package/dist/features/seller/components/SellerSidebar.js +4 -4
- package/dist/features/seller/components/analytics/SellerRevenueChart.js +1 -1
- package/dist/features/seller/components/analytics/SellerTopProducts.js +1 -1
- package/dist/features/site-settings/components/ActionPermissionsManager.js +2 -2
- package/dist/features/site-settings/components/NavPermissionsManager.js +1 -1
- package/dist/features/stores/components/InteractiveStoreCard.js +3 -3
- package/dist/features/stores/components/StoreHeader.js +2 -2
- package/dist/features/stores/components/StoreNavTabs.js +2 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +1 -1
- package/dist/features/stores/components/StoreReviewsListing.js +1 -1
- package/dist/features/stores/components/StoresIndexListing.js +1 -1
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +2 -2
- package/dist/features/wishlist/components/WishlistPage.js +2 -2
- package/dist/features/wishlist/hooks/useWishlistCount.js +5 -13
- package/dist/http/index.d.ts +1 -0
- package/dist/http/index.js +1 -0
- package/dist/http/retry.d.ts +1 -0
- package/dist/http/retry.js +26 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +8 -0
- package/dist/next/ErrorBoundary.js +1 -1
- package/dist/repositories/index.d.ts +2 -0
- package/dist/repositories/index.js +2 -0
- package/dist/seed/site-settings-seed-data.js +476 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +9 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/index.d.ts +6 -6
- package/dist/tokens/index.js +59 -59
- package/dist/ui/DataTable.js +3 -3
- package/dist/ui/components/Avatar.js +1 -1
- package/dist/ui/components/BaseListingCard.js +7 -7
- package/dist/ui/components/Button.js +3 -3
- package/dist/ui/components/DetailPageGallery.js +3 -3
- package/dist/ui/components/DetailPageHero.js +1 -1
- package/dist/ui/components/DetailPageTabs.js +4 -4
- package/dist/ui/components/FilterChipGroup.js +2 -2
- package/dist/ui/components/Input.js +1 -1
- package/dist/ui/components/Layout.d.ts +2 -2
- package/dist/ui/components/ListingFilterDrawer.js +2 -2
- package/dist/ui/components/ListingToolbar.js +6 -6
- package/dist/ui/components/LoginRequiredModal.js +1 -1
- package/dist/ui/components/Modal.js +1 -1
- package/dist/ui/components/NavbarChevron.js +1 -1
- package/dist/ui/components/PageLoader.js +3 -3
- package/dist/ui/components/Radio.js +1 -1
- package/dist/ui/components/RichTextEditor.js +1 -1
- package/dist/ui/components/Select.js +1 -1
- package/dist/ui/components/SettingsSection.js +3 -3
- package/dist/ui/components/SideModal.js +1 -1
- package/dist/ui/components/Slider.js +2 -2
- package/dist/ui/components/StatsGrid.js +1 -1
- package/dist/ui/components/Typography.js +3 -3
- package/dist/ui/components/surface-tokens.d.ts +11 -11
- package/dist/ui/components/surface-tokens.js +12 -12
- package/dist/utils/safe-fire-forget.d.ts +14 -0
- package/dist/utils/safe-fire-forget.js +23 -0
- package/package.json +1 -1
package/dist/tokens/index.d.ts
CHANGED
|
@@ -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-
|
|
268
|
-
readonly navbarBg: "bg-
|
|
269
|
-
readonly sidebarBg: "bg-
|
|
270
|
-
readonly bottomNavBg: "bg-
|
|
271
|
-
readonly footerBg: "bg-zinc-50
|
|
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-
|
|
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 */
|
package/dist/tokens/index.js
CHANGED
|
@@ -195,33 +195,33 @@ export const LOCALE_CONFIG = {
|
|
|
195
195
|
*/
|
|
196
196
|
const THEMED = {
|
|
197
197
|
// Backgrounds
|
|
198
|
-
bgPrimary: "bg-zinc-50
|
|
199
|
-
bgSecondary: "bg-
|
|
200
|
-
bgTertiary: "bg-zinc-200
|
|
201
|
-
bgElevated: "bg-
|
|
202
|
-
bgInput: "bg-
|
|
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-
|
|
205
|
-
textSecondary: "text-
|
|
206
|
-
textMuted: "text-
|
|
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-
|
|
213
|
-
borderSubtle: "border-
|
|
214
|
-
borderLight: "border-zinc-100
|
|
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-
|
|
216
|
+
borderColor: "border-[var(--appkit-color-border)]",
|
|
217
217
|
// Interactive
|
|
218
|
-
hover: "hover:bg-
|
|
219
|
-
hoverCard: "hover:bg-zinc-50
|
|
220
|
-
hoverBorder: "hover:border-
|
|
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
|
|
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-
|
|
240
|
-
navbarBg: "bg-
|
|
241
|
-
sidebarBg: "bg-
|
|
242
|
-
bottomNavBg: "bg-
|
|
243
|
-
footerBg: "bg-zinc-50
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
301
|
-
caption: "text-xs text-
|
|
302
|
-
overline: "text-xs font-semibold uppercase tracking-wider text-
|
|
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-
|
|
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
|
|
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-
|
|
503
|
-
elevated: "rounded-2xl bg-
|
|
504
|
-
interactive: "rounded-2xl border border-
|
|
505
|
-
glass: "rounded-2xl backdrop-blur-md bg-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
614
|
-
text: "animate-pulse rounded bg-zinc-200
|
|
615
|
-
heading: "animate-pulse rounded bg-zinc-200
|
|
616
|
-
image: "animate-pulse rounded-xl bg-zinc-200
|
|
617
|
-
card: "animate-pulse rounded-2xl bg-zinc-200
|
|
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
|
|
620
|
-
shimmerText: "animate-shimmer bg-[length:400%_100%] h-4 rounded bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200
|
|
621
|
-
shimmerCard: "animate-shimmer bg-[length:400%_100%] rounded-2xl bg-gradient-to-r from-zinc-200 via-zinc-100 to-zinc-200
|
|
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-
|
|
648
|
-
scrollbarThinX: "[&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-track]:rounded-full [&::-webkit-scrollbar-track]:bg-
|
|
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-
|
|
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-
|
|
667
|
-
listItem: "bg-
|
|
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-
|
|
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-
|
|
672
|
-
divider: "border-t border-
|
|
673
|
-
emptyState: "flex flex-col items-center justify-center py-12 text-center text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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>,
|
package/dist/ui/DataTable.js
CHANGED
|
@@ -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-
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
84
|
-
subtle: "border border-
|
|
85
|
-
strong: "border border-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
38
|
-
: "border-transparent text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
8
|
-
const CLS_CLEAR_ICON_BTN = "flex shrink-0 items-center justify-center rounded-lg border border-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
}
|