@olwiba/ui 0.2.23 → 0.2.24

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/index.d.ts CHANGED
@@ -226,6 +226,8 @@ interface AppShellUser {
226
226
  email: string;
227
227
  name?: string;
228
228
  avatar?: string;
229
+ /** Product-owned artwork shown when no avatar image exists. Defaults to the Olwiba bird. */
230
+ avatarFallback?: ReactNode;
229
231
  /** Displayed as a sub-label (e.g. plan tier). */
230
232
  plan?: string;
231
233
  onSignOut?: () => void;
@@ -256,6 +258,11 @@ type AppShellBreadcrumb = string | {
256
258
  label: string;
257
259
  href?: string;
258
260
  };
261
+ interface AppShellHeaderControls {
262
+ /** Expands the desktop sidebar or opens its native mobile presentation. */
263
+ expandSidebar: () => void;
264
+ }
265
+ type AppShellHeaderStart = ReactNode | ((controls: AppShellHeaderControls) => ReactNode);
259
266
  interface AppShellProps {
260
267
  brand?: AppShellBrand;
261
268
  navItems?: AppNavItem[];
@@ -274,10 +281,16 @@ interface AppShellProps {
274
281
  * and preferred over `pageTitle` when supplied.
275
282
  */
276
283
  breadcrumbs?: AppShellBreadcrumb[];
277
- /** Slot rendered at the start of the top header bar, after the sidebar trigger. */
278
- headerStart?: ReactNode;
284
+ /**
285
+ * Slot rendered at the start of the top header bar, after the sidebar trigger.
286
+ * Use the render form when a custom control needs to expand the shell's own
287
+ * sidebar without importing its private provider context.
288
+ */
289
+ headerStart?: AppShellHeaderStart;
279
290
  /** Slot rendered at the end of the top header bar. */
280
291
  headerEnd?: ReactNode;
292
+ /** Product chrome rendered above the user menu in the sidebar footer. */
293
+ sidebarFooterStart?: ReactNode;
281
294
  /**
282
295
  * App chrome rendered after the page outlet — normally an `AppFooter`. This
283
296
  * belongs to the shell, not to a page pattern: otherwise every route
@@ -300,6 +313,10 @@ interface AppShellProps {
300
313
  * - `"contained"` — fills its parent container; use in docs sandboxes, modals, or embedded previews.
301
314
  */
302
315
  sidebarPosition?: 'viewport' | 'contained';
316
+ /** Remount key for an animated sidebar identity or navigation-mode change. */
317
+ sidebarContentKey?: string;
318
+ /** Classes applied to the sidebar header, content, and footer. */
319
+ sidebarContentClassName?: string;
303
320
  /** Which side the sidebar sits on. @default "left" */
304
321
  side?: 'left' | 'right';
305
322
  /**
@@ -312,7 +329,7 @@ interface AppShellProps {
312
329
  */
313
330
  contentClassName?: string;
314
331
  }
315
- declare function AppShell({ brand, navItems, action, user, pageTitle, breadcrumbs, footer, headerStart, headerEnd, renderLink, collapsible, sidebarPosition, side, contentClassName, children, }?: AppShellProps): react_jsx_runtime.JSX.Element;
332
+ declare function AppShell({ brand, navItems, action, user, pageTitle, breadcrumbs, footer, headerStart, headerEnd, renderLink, collapsible, sidebarPosition, sidebarContentKey, sidebarContentClassName, sidebarFooterStart, side, contentClassName, children, }?: AppShellProps): react_jsx_runtime.JSX.Element;
316
333
 
317
334
  interface AppPageHeroProps {
318
335
  eyebrow?: ReactNode;
@@ -354,8 +371,9 @@ interface AppFooterProps extends HTMLAttributes<HTMLElement> {
354
371
  * the page outlet rather than inside a page pattern. Public marketing pages use
355
372
  * the full `Footer` instead — this exists so long app pages do not end abruptly.
356
373
  *
357
- * The row owns geometry only. What the slots contain live status, version,
358
- * links, product copystays with the product.
374
+ * The row owns its solid chrome surface and geometry so page ambience cannot
375
+ * bleed through it. What the slots contain live status, version, links,
376
+ * product copy — stays with the product.
359
377
  */
360
378
  declare function AppFooter({ start, end, children, className, ...props }: AppFooterProps): react_jsx_runtime.JSX.Element;
361
379
 
@@ -527,10 +545,18 @@ declare function OnboardingWizard({ steps, onComplete, onStepChange, step: stepP
527
545
  interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {
528
546
  icon?: LucideIcon;
529
547
  title: string;
530
- description?: string;
548
+ description?: React.ReactNode;
549
+ eyebrow?: React.ReactNode;
531
550
  action?: React.ReactNode;
551
+ secondaryAction?: React.ReactNode;
552
+ /** Adds the application-card surface used for route-level empty states. */
553
+ variant?: 'plain' | 'card';
554
+ /** Reduces the card presentation's minimum height and padding. */
555
+ compact?: boolean;
556
+ /** Fills a flex-sized parent rather than using a fixed minimum height. */
557
+ fill?: boolean;
532
558
  }
533
- declare function EmptyState({ icon: Icon, title, description, action, className, ...props }: EmptyStateProps): react_jsx_runtime.JSX.Element;
559
+ declare function EmptyState({ icon: Icon, title, description, eyebrow, action, secondaryAction, variant, compact, fill, className, ...props }: EmptyStateProps): react_jsx_runtime.JSX.Element;
534
560
 
535
561
  interface ErrorPageLink {
536
562
  label: string;
@@ -1500,6 +1526,20 @@ interface DataTableProps<TData> {
1500
1526
  */
1501
1527
  declare function DataTable<TData>({ columns, data, searchKey, searchPlaceholder, selectable, onSelectionChange, pageSize, toolbar, onRowClick, emptyMessage, className, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
1502
1528
 
1529
+ interface LoadMoreProps extends React.HTMLAttributes<HTMLDivElement> {
1530
+ hasNextPage: boolean;
1531
+ isFetchingNextPage: boolean;
1532
+ fetchNextPage: () => void | Promise<unknown>;
1533
+ /** Watches the sentinel instead of showing a manual button. */
1534
+ auto?: boolean;
1535
+ /** Plural noun used by the manual button, for example `properties`. */
1536
+ label?: string;
1537
+ /** Starts loading before the sentinel reaches the viewport. */
1538
+ rootMargin?: string;
1539
+ }
1540
+ /** Cursor-pagination footer with either guarded infinite scroll or a manual fallback. */
1541
+ declare function LoadMore({ hasNextPage, isFetchingNextPage, fetchNextPage, auto, label, rootMargin, className, ...props }: LoadMoreProps): react_jsx_runtime.JSX.Element | null;
1542
+
1503
1543
  type ViewMode = 'cards' | 'list';
1504
1544
  interface UseViewModeReturn {
1505
1545
  view: ViewMode;
@@ -2060,7 +2100,11 @@ interface PostListProps {
2060
2100
  posts: PostCardProps[];
2061
2101
  renderLink?: AppShellRenderLink;
2062
2102
  emptyMessage?: string;
2063
- /** Max columns at the widest breakpoint. */
2103
+ /**
2104
+ * Max columns at the widest breakpoint. When omitted, one- and two-post
2105
+ * collections are balanced automatically instead of leaving an empty third
2106
+ * column.
2107
+ */
2064
2108
  columns?: 2 | 3;
2065
2109
  className?: string;
2066
2110
  }
@@ -2148,4 +2192,4 @@ interface UsePaginationReturn {
2148
2192
  }
2149
2193
  declare function usePagination(total: number, pageSize: number): UsePaginationReturn;
2150
2194
 
2151
- export { ActivityFeed, type ActivityFeedItem, type ActivityFeedProps, AnimatedPill, type AnimatedPillProps, AnimatedSwap, type AnimatedSwapEffect, type AnimatedSwapProps, type AnimatedSwapSpec, AppContent, type AppContentProps, AppFooter, type AppFooterProps, AppGrid, AppGridCell, type AppGridCellProps, type AppGridColumns, type AppGridProps, type AppNavItem, AppPageHero, type AppPageHeroProps, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellBreadcrumb, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, type BillingInvoice, BillingPanel, type BillingPanelProps, type BillingPaymentMethod, type BillingUsageMetric, BrandColorSwitchMinimal, Button, type ButtonProps, Card, type CardProps, Carousel, type CarouselProps, ChangelogCard, type ChangelogCardProps, type ChangelogHighlight, ChangelogList, type ChangelogListProps, type ChangelogReleaseType, Chart, type ChartProps, type ChartSeries, Checkbox, type CheckboxProps, CommandMenu, type CommandMenuGroup, type CommandMenuItem, type CommandMenuProps, type ComparisonColumn, ComparisonSection, type ComparisonSectionProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, type ContactInfoItem, ContactSection, type ContactSectionProps, ContextMenu, type ContextMenuDef, type ContextMenuProps, CountUp, type CountUpProps, CountdownTimer, type CountdownTimerProps, CtaSection, type CtaSectionProps, DataTable, type DataTableProps, DataView, type DataViewProps, DevBanner, type DevBannerProps, Dock, type DockItem, type DockProps, EmptyState, type EmptyStateProps, ErrorPage, type ErrorPageProps, FadeIn, type FadeInProps, FaqSection, type FaqSectionProps, FeatureCard, type FeatureCardProps, type FeatureMarqueeItem, type FeatureMarqueeRow, FeatureMarqueeSection, type FeatureMarqueeSectionProps, FeaturesSection, type FeaturesSectionProps, FileUpload, type FileUploadEntry, type FileUploadProps, FlowBracket, type FlowBracketProps, FlowConnector, type FlowConnectorProps, Footer, type FooterProps, FullPageSpinner, GlassCard, type GlassCardProps, Grid, GridItem, type GridItemProps, type GridProps, type GroupedFeatureGroup, GroupedFeaturesSection, type GroupedFeaturesSectionProps, HeroSection, type HeroSectionProps, type Hotkey, ImageCard, type ImageCardProps, Input, type InputProps, LogoStrip, type LogoStripProps, type MarketingSectionSpacing, type MarketingSurface, MarketingSurfaceProvider, MediaCard, type MediaCardProps, ModeSwitchMinimal, Navbar, type NavbarProps, NewsletterSection, type NewsletterSectionProps, type NotificationItem, NotificationToast, type NotificationToastProps, NotificationsPopover, type NotificationsPopoverProps, type NotifyAction, type NotifyOptions, OlwibaUIProvider, type OlwibaUIProviderProps, type OnboardingStep, OnboardingWizard, type OnboardingWizardProps, Overlay, type OverlayProps, type OverlayVariant, PageHeader, type PageHeaderBackButton, type PageHeaderBreadcrumb, type PageHeaderProps, PageTransition, type PageTransitionProps, PhoneFrame, type PhoneFrameProps, type PostAuthor, PostCard, type PostCardProps, PostList, type PostListProps, PricingCard, type PricingCardProps, type PricingFeature, type PricingPlan, PricingSection, type PricingSectionProps, PublicPageFrame, type PublicPageFrameProps, type QualificationColumn, QualificationSection, type QualificationSectionProps, RegisterHotkeys, RootErrorFallback, Section, type SectionProps, SectionTitle, type SectionTitleProps, SettingsSection, type SettingsSectionProps, Sortable, type SortableProps, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, Stack, type StackProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, type StepGroup, type StepItem, StepsSection, type StepsSectionProps, Suspensed, Switch, type SwitchProps, type TeamMember, type TeamMemberRecord, TeamMembersPanel, type TeamMembersPanelProps, TeamSection, type TeamSectionProps, type TechStackItem, TechStackSection, type TechStackSectionProps, TestimonialCard, type TestimonialCardProps, TestimonialsSection, type TestimonialsSectionProps, Textarea, type TextareaProps, ThemeColorUpdater, ThemeSwitchMinimal, type UIMode, Underlay, type UnderlayProps, type UnderlayVariant, UpdateBanner, type UpdateBannerProps, type UpgradeComparisonRow, UpgradePrompt, type UpgradePromptProps, type UseConfirmReturn, type UseControlledOpenReturn, type UsePaginationReturn, type UseViewModeReturn, VersionBanner, type ViewMode, ViewToggle, type ViewToggleProps, cn, marketingSectionSpacing, notify, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMarketingSurface, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useSectionSurface, useUIMode, useViewMode };
2195
+ export { ActivityFeed, type ActivityFeedItem, type ActivityFeedProps, AnimatedPill, type AnimatedPillProps, AnimatedSwap, type AnimatedSwapEffect, type AnimatedSwapProps, type AnimatedSwapSpec, AppContent, type AppContentProps, AppFooter, type AppFooterProps, AppGrid, AppGridCell, type AppGridCellProps, type AppGridColumns, type AppGridProps, type AppNavItem, AppPageHero, type AppPageHeroProps, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellBreadcrumb, type AppShellHeaderControls, type AppShellHeaderStart, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, type BillingInvoice, BillingPanel, type BillingPanelProps, type BillingPaymentMethod, type BillingUsageMetric, BrandColorSwitchMinimal, Button, type ButtonProps, Card, type CardProps, Carousel, type CarouselProps, ChangelogCard, type ChangelogCardProps, type ChangelogHighlight, ChangelogList, type ChangelogListProps, type ChangelogReleaseType, Chart, type ChartProps, type ChartSeries, Checkbox, type CheckboxProps, CommandMenu, type CommandMenuGroup, type CommandMenuItem, type CommandMenuProps, type ComparisonColumn, ComparisonSection, type ComparisonSectionProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, type ContactInfoItem, ContactSection, type ContactSectionProps, ContextMenu, type ContextMenuDef, type ContextMenuProps, CountUp, type CountUpProps, CountdownTimer, type CountdownTimerProps, CtaSection, type CtaSectionProps, DataTable, type DataTableProps, DataView, type DataViewProps, DevBanner, type DevBannerProps, Dock, type DockItem, type DockProps, EmptyState, type EmptyStateProps, ErrorPage, type ErrorPageProps, FadeIn, type FadeInProps, FaqSection, type FaqSectionProps, FeatureCard, type FeatureCardProps, type FeatureMarqueeItem, type FeatureMarqueeRow, FeatureMarqueeSection, type FeatureMarqueeSectionProps, FeaturesSection, type FeaturesSectionProps, FileUpload, type FileUploadEntry, type FileUploadProps, FlowBracket, type FlowBracketProps, FlowConnector, type FlowConnectorProps, Footer, type FooterProps, FullPageSpinner, GlassCard, type GlassCardProps, Grid, GridItem, type GridItemProps, type GridProps, type GroupedFeatureGroup, GroupedFeaturesSection, type GroupedFeaturesSectionProps, HeroSection, type HeroSectionProps, type Hotkey, ImageCard, type ImageCardProps, Input, type InputProps, LoadMore, type LoadMoreProps, LogoStrip, type LogoStripProps, type MarketingSectionSpacing, type MarketingSurface, MarketingSurfaceProvider, MediaCard, type MediaCardProps, ModeSwitchMinimal, Navbar, type NavbarProps, NewsletterSection, type NewsletterSectionProps, type NotificationItem, NotificationToast, type NotificationToastProps, NotificationsPopover, type NotificationsPopoverProps, type NotifyAction, type NotifyOptions, OlwibaUIProvider, type OlwibaUIProviderProps, type OnboardingStep, OnboardingWizard, type OnboardingWizardProps, Overlay, type OverlayProps, type OverlayVariant, PageHeader, type PageHeaderBackButton, type PageHeaderBreadcrumb, type PageHeaderProps, PageTransition, type PageTransitionProps, PhoneFrame, type PhoneFrameProps, type PostAuthor, PostCard, type PostCardProps, PostList, type PostListProps, PricingCard, type PricingCardProps, type PricingFeature, type PricingPlan, PricingSection, type PricingSectionProps, PublicPageFrame, type PublicPageFrameProps, type QualificationColumn, QualificationSection, type QualificationSectionProps, RegisterHotkeys, RootErrorFallback, Section, type SectionProps, SectionTitle, type SectionTitleProps, SettingsSection, type SettingsSectionProps, Sortable, type SortableProps, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, Stack, type StackProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, type StepGroup, type StepItem, StepsSection, type StepsSectionProps, Suspensed, Switch, type SwitchProps, type TeamMember, type TeamMemberRecord, TeamMembersPanel, type TeamMembersPanelProps, TeamSection, type TeamSectionProps, type TechStackItem, TechStackSection, type TechStackSectionProps, TestimonialCard, type TestimonialCardProps, TestimonialsSection, type TestimonialsSectionProps, Textarea, type TextareaProps, ThemeColorUpdater, ThemeSwitchMinimal, type UIMode, Underlay, type UnderlayProps, type UnderlayVariant, UpdateBanner, type UpdateBannerProps, type UpgradeComparisonRow, UpgradePrompt, type UpgradePromptProps, type UseConfirmReturn, type UseControlledOpenReturn, type UsePaginationReturn, type UseViewModeReturn, VersionBanner, type ViewMode, ViewToggle, type ViewToggleProps, cn, marketingSectionSpacing, notify, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMarketingSurface, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useSectionSurface, useUIMode, useViewMode };
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { cn } from './chunk-AMWLSHD6.js';
2
2
  export { MdxContent, cn } from './chunk-AMWLSHD6.js';
3
3
  import * as React21 from 'react';
4
4
  import { useRef, useEffect, useState, useCallback } from 'react';
5
- import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, SidebarProvider, SidebarInset, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Dialog, DialogTrigger, Progress, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, StatusIndicator, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, CommandShortcut, Popover, PopoverTrigger, PopoverContent, Spinner, useSidebar, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarMenuButton, SidebarFooter, SidebarTrigger, CardHeader, CardTitle, CardDescription, CardContent, InputOTP, InputOTPGroup, InputOTPSlot, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup } from '@olwiba/cn';
5
+ import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, SidebarProvider, SidebarInset, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Dialog, DialogTrigger, Progress, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, StatusIndicator, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, CommandShortcut, Spinner, Popover, PopoverTrigger, PopoverContent, useSidebar, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarMenuButton, SidebarFooter, SidebarTrigger, CardHeader, CardTitle, CardDescription, CardContent, InputOTP, InputOTPGroup, InputOTPSlot, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup } from '@olwiba/cn';
6
6
  export { CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Enchanted } from '@olwiba/cn';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import { Search, ArrowUp, ArrowDown, ArrowUpDown, ChevronLeft, ChevronRight, MoreHorizontal, UserPlus, Download, CreditCard, Check, Loader2, ArrowLeft, ArrowUpRight, X, Sparkles, RefreshCw, ArrowRight, Minus, Quote, Star, Twitter, Github, Linkedin, Mail, MessageSquare, ChevronDown, Send, Menu, UploadCloud, File, CheckCircle2, AlertCircle, Bell, Inbox, Activity, TrendingUp, TrendingDown, LayoutGrid, List, Sun, Moon, Palette, AlertTriangle, Rocket, Info, Layers, BirdIcon, MoreVerticalIcon, CreditCardIcon, BellIcon, SettingsIcon, LogOutIcon, ShieldCheck, Building2 } from 'lucide-react';
@@ -302,7 +302,7 @@ function NavUser({ user }) {
302
302
  children: [
303
303
  /* @__PURE__ */ jsxs(Avatar, { mode: avatarMode, size: "sm", children: [
304
304
  user.avatar && /* @__PURE__ */ jsx(AvatarImage, { src: user.avatar, alt: user.name }),
305
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-white", style: identityTint, children: /* @__PURE__ */ jsx(
305
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-white", style: identityTint, children: user.avatarFallback ?? /* @__PURE__ */ jsx(
306
306
  BirdIcon,
307
307
  {
308
308
  "aria-hidden": true,
@@ -329,7 +329,7 @@ function NavUser({ user }) {
329
329
  /* @__PURE__ */ jsx(DropdownMenuLabel, { className: "p-0 font-normal", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: [
330
330
  /* @__PURE__ */ jsxs(Avatar, { mode: avatarMode, size: "sm", children: [
331
331
  user.avatar && /* @__PURE__ */ jsx(AvatarImage, { src: user.avatar, alt: user.name }),
332
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-white", style: identityTint, children: /* @__PURE__ */ jsx(
332
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-white", style: identityTint, children: user.avatarFallback ?? /* @__PURE__ */ jsx(
333
333
  BirdIcon,
334
334
  {
335
335
  "aria-hidden": true,
@@ -379,7 +379,10 @@ function ShellSidebar({
379
379
  renderLink,
380
380
  collapsible,
381
381
  side,
382
- sidebarPosition
382
+ sidebarPosition,
383
+ sidebarContentKey,
384
+ sidebarContentClassName,
385
+ sidebarFooterStart
383
386
  }) {
384
387
  const fallbackLogo = typeof brand.name === "string" ? brand.name.slice(0, 1).toUpperCase() : null;
385
388
  const { isMobile, setOpenMobile } = useSidebar();
@@ -387,59 +390,83 @@ function ShellSidebar({
387
390
  if (isMobile) setOpenMobile(false);
388
391
  }, [isMobile, setOpenMobile]);
389
392
  return /* @__PURE__ */ jsxs(Sidebar, { side, collapsible, sidebarPosition, children: [
390
- /* @__PURE__ */ jsx(SidebarHeader, { className: "py-3", children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: /* @__PURE__ */ jsxs(
391
- "div",
393
+ /* @__PURE__ */ jsx(
394
+ SidebarHeader,
392
395
  {
393
- className: cn$1(
394
- "flex items-center gap-2 overflow-hidden rounded-md p-2 text-left",
395
- RAIL_SQUARE
396
- ),
397
- children: [
398
- brand.logo ? (
399
- // Neutral slot: the consumer's logo owns its own chrome
400
- // (background, radius). Sized to fill the collapsed icon rail.
401
- /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center [&>svg]:size-5", children: brand.logo })
402
- ) : /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary text-sm font-semibold text-primary-foreground", children: fallbackLogo }),
403
- /* @__PURE__ */ jsx("span", { className: "min-w-0 whitespace-nowrap text-base font-semibold leading-none [text-box-edge:ex_alphabetic] [text-box-trim:trim-both] group-data-[collapsible=icon]:hidden", children: brand.name })
404
- ]
405
- }
406
- ) }) }) }),
407
- /* @__PURE__ */ jsx(SidebarContent, { children: /* @__PURE__ */ jsx(SidebarGroup, { children: /* @__PURE__ */ jsxs(SidebarGroupContent, { className: "flex flex-col gap-2", children: [
408
- action && /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: action.href ? /* @__PURE__ */ jsx(
409
- SidebarMenuButton,
410
- {
411
- asChild: true,
412
- tooltip: action.label,
413
- className: "min-w-8 bg-primary text-primary-foreground duration-200 ease-linear hover:bg-primary/90 hover:text-primary-foreground active:bg-primary/90 active:text-primary-foreground",
414
- children: renderLink({
415
- href: action.href,
396
+ className: cn$1("py-3", sidebarContentClassName),
397
+ children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: /* @__PURE__ */ jsxs(
398
+ "div",
399
+ {
400
+ className: cn$1(
401
+ "flex items-center gap-2 overflow-hidden rounded-md p-2 text-left",
402
+ RAIL_SQUARE
403
+ ),
404
+ children: [
405
+ brand.logo ? (
406
+ // Neutral slot: the consumer's logo owns its own chrome
407
+ // (background, radius). Sized to fill the collapsed icon rail.
408
+ /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center [&>svg]:size-5", children: brand.logo })
409
+ ) : /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary text-sm font-semibold text-primary-foreground", children: fallbackLogo }),
410
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 whitespace-nowrap text-base font-semibold leading-none [text-box-edge:ex_alphabetic] [text-box-trim:trim-both] group-data-[collapsible=icon]:hidden", children: brand.name })
411
+ ]
412
+ }
413
+ ) }) })
414
+ },
415
+ `${sidebarContentKey ?? "default"}-header`
416
+ ),
417
+ /* @__PURE__ */ jsx(
418
+ SidebarContent,
419
+ {
420
+ className: sidebarContentClassName,
421
+ children: /* @__PURE__ */ jsx(SidebarGroup, { children: /* @__PURE__ */ jsxs(SidebarGroupContent, { className: "flex flex-col gap-2", children: [
422
+ action && /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: action.href ? /* @__PURE__ */ jsx(
423
+ SidebarMenuButton,
424
+ {
425
+ asChild: true,
426
+ tooltip: action.label,
427
+ className: "min-w-8 bg-primary text-primary-foreground duration-200 ease-linear hover:bg-primary/90 hover:text-primary-foreground active:bg-primary/90 active:text-primary-foreground",
428
+ children: renderLink({
429
+ href: action.href,
430
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
431
+ action.icon && /* @__PURE__ */ jsx(action.icon, {}),
432
+ /* @__PURE__ */ jsx("span", { children: action.label })
433
+ ] })
434
+ })
435
+ }
436
+ ) : /* @__PURE__ */ jsxs(
437
+ SidebarMenuButton,
438
+ {
439
+ tooltip: action.label,
440
+ onClick: action.onClick,
441
+ className: "min-w-8 bg-primary text-primary-foreground duration-200 ease-linear hover:bg-primary/90 hover:text-primary-foreground active:bg-primary/90 active:text-primary-foreground",
442
+ children: [
443
+ action.icon && /* @__PURE__ */ jsx(action.icon, {}),
444
+ /* @__PURE__ */ jsx("span", { children: action.label })
445
+ ]
446
+ }
447
+ ) }) }),
448
+ /* @__PURE__ */ jsx(SidebarMenu, { children: navItems.map((item) => /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: /* @__PURE__ */ jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, isActive: item.isActive, children: renderLink({
449
+ href: item.href,
416
450
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
417
- action.icon && /* @__PURE__ */ jsx(action.icon, {}),
418
- /* @__PURE__ */ jsx("span", { children: action.label })
451
+ /* @__PURE__ */ jsx(item.icon, {}),
452
+ /* @__PURE__ */ jsx("span", { children: item.label })
419
453
  ] })
420
- })
421
- }
422
- ) : /* @__PURE__ */ jsxs(
423
- SidebarMenuButton,
424
- {
425
- tooltip: action.label,
426
- onClick: action.onClick,
427
- className: "min-w-8 bg-primary text-primary-foreground duration-200 ease-linear hover:bg-primary/90 hover:text-primary-foreground active:bg-primary/90 active:text-primary-foreground",
428
- children: [
429
- action.icon && /* @__PURE__ */ jsx(action.icon, {}),
430
- /* @__PURE__ */ jsx("span", { children: action.label })
431
- ]
432
- }
433
- ) }) }),
434
- /* @__PURE__ */ jsx(SidebarMenu, { children: navItems.map((item) => /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: /* @__PURE__ */ jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, isActive: item.isActive, children: renderLink({
435
- href: item.href,
436
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
437
- /* @__PURE__ */ jsx(item.icon, {}),
438
- /* @__PURE__ */ jsx("span", { children: item.label })
439
- ] })
440
- }) }) }, item.label)) })
441
- ] }) }) }),
442
- /* @__PURE__ */ jsx(SidebarFooter, { children: /* @__PURE__ */ jsx(NavUser, { user }) })
454
+ }) }) }, item.label)) })
455
+ ] }) })
456
+ },
457
+ `${sidebarContentKey ?? "default"}-content`
458
+ ),
459
+ /* @__PURE__ */ jsxs(
460
+ SidebarFooter,
461
+ {
462
+ className: sidebarContentClassName,
463
+ children: [
464
+ sidebarFooterStart,
465
+ /* @__PURE__ */ jsx(NavUser, { user })
466
+ ]
467
+ },
468
+ `${sidebarContentKey ?? "default"}-footer`
469
+ )
443
470
  ] });
444
471
  }
445
472
  function ShellHeader({
@@ -449,13 +476,19 @@ function ShellHeader({
449
476
  headerEnd,
450
477
  renderLink
451
478
  }) {
479
+ const { isMobile, setOpen, setOpenMobile } = useSidebar();
480
+ const expandSidebar = useCallback(() => {
481
+ if (isMobile) setOpenMobile(true);
482
+ else setOpen(true);
483
+ }, [isMobile, setOpen, setOpenMobile]);
484
+ const headerStartContent = typeof headerStart === "function" ? headerStart({ expandSidebar }) : headerStart;
452
485
  const source = breadcrumbs?.length ? breadcrumbs : pageTitle ? [pageTitle] : [];
453
486
  const trail = source.map(
454
487
  (crumb) => typeof crumb === "string" ? { label: crumb, href: void 0 } : crumb
455
488
  );
456
489
  return /* @__PURE__ */ jsx("header", { className: "flex h-12 shrink-0 items-center gap-2 border-b transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12", children: /* @__PURE__ */ jsxs("div", { className: "flex w-full items-center gap-1 px-4 lg:gap-2 lg:px-6", children: [
457
490
  /* @__PURE__ */ jsx(SidebarTrigger, { className: "-ml-1" }),
458
- headerStart && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", children: headerStart }),
491
+ headerStartContent && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", children: headerStartContent }),
459
492
  trail.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
460
493
  /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-2 data-[orientation=vertical]:h-4" }),
461
494
  /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", className: "flex min-w-0 items-center gap-1.5 text-sm", children: trail.map((crumb, index) => {
@@ -513,6 +546,9 @@ function AppShell({
513
546
  renderLink = defaultRenderLink,
514
547
  collapsible = "icon",
515
548
  sidebarPosition = "viewport",
549
+ sidebarContentKey,
550
+ sidebarContentClassName,
551
+ sidebarFooterStart,
516
552
  side = "left",
517
553
  contentClassName = "p-6",
518
554
  children
@@ -534,7 +570,10 @@ function AppShell({
534
570
  renderLink,
535
571
  collapsible,
536
572
  side,
537
- sidebarPosition
573
+ sidebarPosition,
574
+ sidebarContentKey,
575
+ sidebarContentClassName,
576
+ sidebarFooterStart
538
577
  }
539
578
  ),
540
579
  /* @__PURE__ */ jsxs(SidebarInset, { className: "overflow-y-auto", children: [
@@ -667,7 +706,7 @@ function AppFooter({ start, end, children, className, ...props }) {
667
706
  {
668
707
  ...props,
669
708
  className: cn(
670
- "border-t px-4 py-3 text-xs text-muted-foreground sm:px-6",
709
+ "border-t bg-background px-4 py-3 text-xs text-muted-foreground sm:px-6",
671
710
  className
672
711
  ),
673
712
  children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center justify-between gap-3", children: [
@@ -1314,19 +1353,55 @@ function OnboardingWizard({
1314
1353
  ] })
1315
1354
  ] });
1316
1355
  }
1317
- function EmptyState({ icon: Icon, title, description, action, className, ...props }) {
1356
+ function EmptyState({
1357
+ icon: Icon,
1358
+ title,
1359
+ description,
1360
+ eyebrow,
1361
+ action,
1362
+ secondaryAction,
1363
+ variant = "plain",
1364
+ compact = false,
1365
+ fill = false,
1366
+ className,
1367
+ ...props
1368
+ }) {
1369
+ const card = variant === "card";
1318
1370
  return /* @__PURE__ */ jsxs(
1319
1371
  "div",
1320
1372
  {
1321
- className: cn$1("flex flex-col items-center justify-center gap-3 py-12 text-center", className),
1373
+ className: cn$1(
1374
+ "relative flex flex-col items-center justify-center overflow-hidden text-center",
1375
+ !card && "gap-3 py-12",
1376
+ card && "min-h-72 rounded-xl border border-dashed bg-card/80 p-8 shadow-sm sm:p-10",
1377
+ card && compact && "min-h-0 p-5 sm:p-6",
1378
+ fill && "min-h-0 w-full flex-1",
1379
+ className
1380
+ ),
1322
1381
  ...props,
1323
1382
  children: [
1324
- Icon && /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-2xl border bg-muted", children: /* @__PURE__ */ jsx(Icon, { className: "size-6 text-muted-foreground" }) }),
1325
- /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
1326
- /* @__PURE__ */ jsx("h3", { className: "font-semibold", children: title }),
1327
- description && /* @__PURE__ */ jsx("p", { className: "max-w-xs text-sm text-muted-foreground", children: description })
1328
- ] }),
1329
- action
1383
+ card && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-10 top-0 h-24 rounded-full bg-primary/10 blur-3xl" }),
1384
+ /* @__PURE__ */ jsxs("div", { className: cn$1("relative flex flex-col items-center", card ? "gap-4" : "gap-3"), children: [
1385
+ Icon && /* @__PURE__ */ jsx(
1386
+ "div",
1387
+ {
1388
+ className: cn$1(
1389
+ "flex size-12 items-center justify-center rounded-2xl border",
1390
+ card ? "bg-background text-primary shadow-sm" : "bg-muted text-muted-foreground"
1391
+ ),
1392
+ children: /* @__PURE__ */ jsx(Icon, { className: card ? "size-5" : "size-6" })
1393
+ }
1394
+ ),
1395
+ /* @__PURE__ */ jsxs("div", { className: cn$1(card ? "max-w-md space-y-2" : "max-w-xs space-y-1"), children: [
1396
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-xs font-medium uppercase tracking-[0.2em] text-muted-foreground", children: eyebrow }),
1397
+ /* @__PURE__ */ jsx("h3", { className: cn$1("font-semibold", card && "text-xl tracking-tight"), children: title }),
1398
+ description && /* @__PURE__ */ jsx("div", { className: cn$1("text-sm text-muted-foreground", card && "leading-6"), children: description })
1399
+ ] }),
1400
+ (action || secondaryAction) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 sm:flex-row", children: [
1401
+ action,
1402
+ secondaryAction
1403
+ ] })
1404
+ ] })
1330
1405
  ]
1331
1406
  }
1332
1407
  );
@@ -4126,6 +4201,51 @@ function CommandMenu({
4126
4201
  ] })
4127
4202
  ] });
4128
4203
  }
4204
+ function LoadMore({
4205
+ hasNextPage,
4206
+ isFetchingNextPage,
4207
+ fetchNextPage,
4208
+ auto = true,
4209
+ label = "more",
4210
+ rootMargin = "400px",
4211
+ className,
4212
+ ...props
4213
+ }) {
4214
+ const sentinelRef = React21.useRef(null);
4215
+ const stateRef = React21.useRef({ hasNextPage, isFetchingNextPage, fetchNextPage });
4216
+ stateRef.current = { hasNextPage, isFetchingNextPage, fetchNextPage };
4217
+ React21.useEffect(() => {
4218
+ if (!auto) return;
4219
+ const node = sentinelRef.current;
4220
+ if (!node) return;
4221
+ const observer = new IntersectionObserver(
4222
+ ([entry]) => {
4223
+ if (!entry?.isIntersecting) return;
4224
+ const state = stateRef.current;
4225
+ if (state.hasNextPage && !state.isFetchingNextPage) void state.fetchNextPage();
4226
+ },
4227
+ { rootMargin }
4228
+ );
4229
+ observer.observe(node);
4230
+ return () => observer.disconnect();
4231
+ }, [auto, rootMargin]);
4232
+ if (!hasNextPage) return null;
4233
+ return /* @__PURE__ */ jsx("div", { ref: sentinelRef, className: cn$1("flex justify-center py-4", className), ...props, children: auto ? /* @__PURE__ */ jsx("span", { className: "flex h-9 items-center text-sm text-muted-foreground", "aria-live": "polite", children: isFetchingNextPage && /* @__PURE__ */ jsxs(Fragment, { children: [
4234
+ /* @__PURE__ */ jsx(Spinner, { className: "mr-2 size-4" }),
4235
+ " Loading more\u2026"
4236
+ ] }) }) : /* @__PURE__ */ jsx(
4237
+ Button$1,
4238
+ {
4239
+ variant: "outline",
4240
+ onClick: () => void fetchNextPage(),
4241
+ disabled: isFetchingNextPage,
4242
+ children: isFetchingNextPage ? /* @__PURE__ */ jsxs(Fragment, { children: [
4243
+ /* @__PURE__ */ jsx(Spinner, { className: "mr-2 size-4" }),
4244
+ " Loading\u2026"
4245
+ ] }) : `Load more ${label}`
4246
+ }
4247
+ ) });
4248
+ }
4129
4249
  function DataView({
4130
4250
  items,
4131
4251
  getRowId,
@@ -5455,18 +5575,21 @@ function PostList({
5455
5575
  posts,
5456
5576
  renderLink,
5457
5577
  emptyMessage = "No posts published yet.",
5458
- columns = 3,
5578
+ columns,
5459
5579
  className
5460
5580
  }) {
5461
5581
  if (posts.length === 0) {
5462
5582
  return /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground italic", children: emptyMessage });
5463
5583
  }
5584
+ const resolvedColumns = columns ?? (posts.length < 3 ? 2 : 3);
5585
+ const balancedShortListClassName = columns === void 0 ? posts.length === 1 ? "mx-auto w-full max-w-md sm:grid-cols-1" : posts.length === 2 ? "mx-auto w-full max-w-3xl" : void 0 : void 0;
5464
5586
  return /* @__PURE__ */ jsx(
5465
5587
  "div",
5466
5588
  {
5467
5589
  className: cn$1(
5468
5590
  "grid grid-cols-1 gap-x-8 gap-y-14 sm:grid-cols-2",
5469
- columns === 3 && "lg:grid-cols-3",
5591
+ resolvedColumns === 3 && "lg:grid-cols-3",
5592
+ balancedShortListClassName,
5470
5593
  className
5471
5594
  ),
5472
5595
  children: posts.map((post) => /* @__PURE__ */ jsx(PostCard, { ...post, renderLink }, post.slug))
@@ -5684,6 +5807,6 @@ function usePagination(total, pageSize) {
5684
5807
  return { page, pageSize, totalPages, offset, hasPrev: page > 1, hasNext: page < totalPages, goTo, next, prev };
5685
5808
  }
5686
5809
 
5687
- export { ActivityFeed, AnimatedPill, AnimatedSwap, AppContent, AppFooter, AppGrid, AppGridCell, AppPageHero, AppScreen, AppShell, AuthSection, Badge, BillingPanel, BrandColorSwitchMinimal, Button, Card, Carousel, ChangelogCard, ChangelogList, Chart, Checkbox, CommandMenu, ComparisonSection, ConfirmDialog, ContactSection, ContextMenu, CountUp, CountdownTimer, CtaSection, DataTable, DataView, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeatureMarqueeSection, FeaturesSection, FileUpload, FlowBracket, FlowConnector, Footer, FullPageSpinner, GlassCard, Grid, GridItem, GroupedFeaturesSection, HeroSection, ImageCard, Input, LogoStrip, MarketingSurfaceProvider, MediaCard, ModeSwitchMinimal, Navbar, NewsletterSection, NotificationToast, NotificationsPopover, OlwibaUIProvider, OnboardingWizard, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, PublicPageFrame, QualificationSection, RegisterHotkeys, RootErrorFallback, Section, SectionTitle, SettingsSection, Sortable, Spotlight, Stack, StaggerChildren, StatCard, StatsSection, StepsSection, Suspensed, Switch, TeamMembersPanel, TeamSection, TechStackSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpdateBanner, UpgradePrompt, VersionBanner, ViewToggle, marketingSectionSpacing, notify, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMarketingSurface, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useSectionSurface, useUIMode, useViewMode };
5810
+ export { ActivityFeed, AnimatedPill, AnimatedSwap, AppContent, AppFooter, AppGrid, AppGridCell, AppPageHero, AppScreen, AppShell, AuthSection, Badge, BillingPanel, BrandColorSwitchMinimal, Button, Card, Carousel, ChangelogCard, ChangelogList, Chart, Checkbox, CommandMenu, ComparisonSection, ConfirmDialog, ContactSection, ContextMenu, CountUp, CountdownTimer, CtaSection, DataTable, DataView, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeatureMarqueeSection, FeaturesSection, FileUpload, FlowBracket, FlowConnector, Footer, FullPageSpinner, GlassCard, Grid, GridItem, GroupedFeaturesSection, HeroSection, ImageCard, Input, LoadMore, LogoStrip, MarketingSurfaceProvider, MediaCard, ModeSwitchMinimal, Navbar, NewsletterSection, NotificationToast, NotificationsPopover, OlwibaUIProvider, OnboardingWizard, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, PublicPageFrame, QualificationSection, RegisterHotkeys, RootErrorFallback, Section, SectionTitle, SettingsSection, Sortable, Spotlight, Stack, StaggerChildren, StatCard, StatsSection, StepsSection, Suspensed, Switch, TeamMembersPanel, TeamSection, TechStackSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpdateBanner, UpgradePrompt, VersionBanner, ViewToggle, marketingSectionSpacing, notify, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMarketingSurface, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useSectionSurface, useUIMode, useViewMode };
5688
5811
  //# sourceMappingURL=index.js.map
5689
5812
  //# sourceMappingURL=index.js.map