@olwiba/ui 0.1.11 → 0.1.13

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
@@ -210,6 +210,7 @@ interface AppShellUser {
210
210
  plan?: string;
211
211
  onSignOut?: () => void;
212
212
  onBilling?: () => void;
213
+ onNotifications?: () => void;
213
214
  }
214
215
  interface AppShellBrand {
215
216
  name: ReactNode;
@@ -302,6 +303,12 @@ interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {
302
303
  }
303
304
  declare function EmptyState({ icon: Icon, title, description, action, className, ...props }: EmptyStateProps): react_jsx_runtime.JSX.Element;
304
305
 
306
+ interface ErrorPageLink {
307
+ label: string;
308
+ href: string;
309
+ description?: string;
310
+ icon?: ReactNode;
311
+ }
305
312
  interface ErrorPageProps {
306
313
  statusCode?: string;
307
314
  title?: string;
@@ -315,9 +322,11 @@ interface ErrorPageProps {
315
322
  href?: string;
316
323
  onClick?: () => void;
317
324
  };
325
+ /** Optional "maybe you were looking for" links rendered below the actions. */
326
+ links?: ErrorPageLink[];
318
327
  renderLink?: AppShellRenderLink;
319
328
  }
320
- declare function ErrorPage({ statusCode, title, description, action, backAction, renderLink, }: ErrorPageProps): react_jsx_runtime.JSX.Element;
329
+ declare function ErrorPage({ statusCode, title, description, action, backAction, links, renderLink, }: ErrorPageProps): react_jsx_runtime.JSX.Element;
321
330
 
322
331
  interface UpgradeComparisonRow {
323
332
  key?: React.Key;
@@ -366,6 +375,12 @@ interface SectionTitleProps {
366
375
  }
367
376
  declare function SectionTitle({ title, description, badge, className }: SectionTitleProps): react_jsx_runtime.JSX.Element;
368
377
 
378
+ declare const marketingSectionSpacing: {
379
+ readonly standard: "px-6 py-14 sm:px-10 sm:py-20";
380
+ readonly hero: "px-6 pb-14 pt-10 sm:px-10 sm:py-20";
381
+ };
382
+ type MarketingSectionSpacing = keyof typeof marketingSectionSpacing;
383
+
369
384
  interface HeroSectionProps {
370
385
  heading: string;
371
386
  badge?: string;
@@ -1064,6 +1079,10 @@ interface FlowBracketProps {
1064
1079
  * Defaults to 8 (near the top of the first child).
1065
1080
  */
1066
1081
  anchorTop?: number;
1082
+ /** Per-side override for the top anchor of the left bracket. Falls back to anchorTop. */
1083
+ anchorTopLeft?: number;
1084
+ /** Per-side override for the top anchor of the right bracket. Falls back to anchorTop. */
1085
+ anchorTopRight?: number;
1067
1086
  /**
1068
1087
  * Vertical anchor for the bottom connection as a percentage of the wrapper height (0–100).
1069
1088
  * Defaults to 92 (near the bottom of the last child).
@@ -1110,7 +1129,7 @@ interface FlowBracketProps {
1110
1129
  * they render at a consistent pixel size regardless of the bracket SVG's aspect
1111
1130
  * ratio (which spans the full section height with preserveAspectRatio="none").
1112
1131
  */
1113
- declare function FlowBracket({ anchorTop, anchorBottom, extent, arrow, color, colorLeft, colorRight, left, right, animate, animateDur, reverseRight, style, className, children, }: FlowBracketProps): react_jsx_runtime.JSX.Element;
1132
+ declare function FlowBracket({ anchorTop, anchorTopLeft, anchorTopRight, anchorBottom, extent, arrow, color, colorLeft, colorRight, left, right, animate, animateDur, reverseRight, style, className, children, }: FlowBracketProps): react_jsx_runtime.JSX.Element;
1114
1133
 
1115
1134
  interface FullPageSpinnerProps {
1116
1135
  message?: string;
@@ -1192,6 +1211,11 @@ interface RootErrorFallbackProps {
1192
1211
  }
1193
1212
  declare function RootErrorFallback({ error, reset }: RootErrorFallbackProps): react_jsx_runtime.JSX.Element;
1194
1213
 
1214
+ interface PostAuthor {
1215
+ name: string;
1216
+ role?: string;
1217
+ avatar?: string;
1218
+ }
1195
1219
  interface PostCardProps {
1196
1220
  title: string;
1197
1221
  description?: string;
@@ -1199,16 +1223,22 @@ interface PostCardProps {
1199
1223
  slug: string;
1200
1224
  image?: string;
1201
1225
  tags?: string[];
1226
+ author?: PostAuthor;
1227
+ hrefPrefix?: string;
1228
+ tagHrefPrefix?: string;
1202
1229
  renderLink?: AppShellRenderLink;
1203
1230
  }
1204
- declare function PostCard({ title, description, date, slug, image, tags, renderLink }: PostCardProps): react_jsx_runtime.JSX.Element;
1231
+ declare function PostCard({ title, description, date, slug, image, tags, author, hrefPrefix, tagHrefPrefix, renderLink, }: PostCardProps): react_jsx_runtime.JSX.Element;
1205
1232
 
1206
1233
  interface PostListProps {
1207
1234
  posts: PostCardProps[];
1208
1235
  renderLink?: AppShellRenderLink;
1209
1236
  emptyMessage?: string;
1237
+ /** Max columns at the widest breakpoint. */
1238
+ columns?: 2 | 3;
1239
+ className?: string;
1210
1240
  }
1211
- declare function PostList({ posts, renderLink, emptyMessage }: PostListProps): react_jsx_runtime.JSX.Element;
1241
+ declare function PostList({ posts, renderLink, emptyMessage, columns, className, }: PostListProps): react_jsx_runtime.JSX.Element;
1212
1242
 
1213
1243
  type ChangelogReleaseType = 'release' | 'fix' | 'enhancement';
1214
1244
  interface ChangelogHighlight {
@@ -1292,4 +1322,4 @@ interface UsePaginationReturn {
1292
1322
  }
1293
1323
  declare function usePagination(total: number, pageSize: number): UsePaginationReturn;
1294
1324
 
1295
- export { AnimatedPill, type AnimatedPillProps, AppContent, type AppContentProps, AppGrid, AppGridCell, type AppGridCellProps, type AppGridProps, type AppNavItem, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, BrandColorSwitchMinimal, Button, type ButtonProps, Card, type CardProps, CarouselSection, type CarouselSectionProps, ChangelogCard, type ChangelogCardProps, type ChangelogHighlight, ChangelogList, type ChangelogListProps, type ChangelogReleaseType, Checkbox, type CheckboxProps, 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, CtaCardSection, type CtaCardSectionProps, CtaSection, type CtaSectionProps, 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, 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, ModeSwitchMinimal, Navbar, type NavbarProps, NewsletterSection, type NewsletterSectionProps, OlwibaUIProvider, type OlwibaUIProviderProps, Overlay, type OverlayProps, type OverlayVariant, PageHeader, type PageHeaderBackButton, type PageHeaderBreadcrumb, type PageHeaderProps, PageTransition, type PageTransitionProps, PhoneFrame, type PhoneFrameProps, 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, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, Stack, type StackProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, type StepItem, StepsSection, type StepsSectionProps, Suspensed, Switch, type SwitchProps, type TeamMember, 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, type UpgradeComparisonRow, UpgradePrompt, type UpgradePromptProps, type UseConfirmReturn, type UseControlledOpenReturn, type UsePaginationReturn, VersionBanner, cn, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
1325
+ export { AnimatedPill, type AnimatedPillProps, AppContent, type AppContentProps, AppGrid, AppGridCell, type AppGridCellProps, type AppGridProps, type AppNavItem, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, BrandColorSwitchMinimal, Button, type ButtonProps, Card, type CardProps, CarouselSection, type CarouselSectionProps, ChangelogCard, type ChangelogCardProps, type ChangelogHighlight, ChangelogList, type ChangelogListProps, type ChangelogReleaseType, Checkbox, type CheckboxProps, 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, CtaCardSection, type CtaCardSectionProps, CtaSection, type CtaSectionProps, 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, 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, ModeSwitchMinimal, Navbar, type NavbarProps, NewsletterSection, type NewsletterSectionProps, OlwibaUIProvider, type OlwibaUIProviderProps, 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, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, Stack, type StackProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, type StepItem, StepsSection, type StepsSectionProps, Suspensed, Switch, type SwitchProps, type TeamMember, 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, type UpgradeComparisonRow, UpgradePrompt, type UpgradePromptProps, type UseConfirmReturn, type UseControlledOpenReturn, type UsePaginationReturn, VersionBanner, cn, marketingSectionSpacing, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { useRef, useEffect, useState } from 'react';
5
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, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, 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, Spinner, Popover, PopoverTrigger, PopoverContent, SidebarProvider, SidebarInset, CardHeader, CardTitle, CardDescription, CardContent, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarFooter, SidebarTrigger, useSidebar, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem } from '@olwiba/cn';
6
6
  export { CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@olwiba/cn';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { Compass, ArrowLeft, X, ArrowRight, ChevronLeft, ChevronRight, Sparkles, Rocket, Check, Minus, Quote, Star, Twitter, Github, Linkedin, Mail, MessageSquare, ChevronDown, Send, Menu, Search, TrendingUp, TrendingDown, Sun, Moon, Palette, AlertTriangle, Loader2, Layers, LayoutGrid, ShieldCheck, Building2, MoreVerticalIcon, CreditCardIcon, BellIcon, LogOutIcon } from 'lucide-react';
8
+ import { ArrowLeft, ArrowUpRight, X, ArrowRight, ChevronLeft, ChevronRight, Sparkles, Rocket, Check, Minus, Quote, Star, Twitter, Github, Linkedin, Mail, MessageSquare, ChevronDown, Send, Menu, Search, TrendingUp, TrendingDown, Sun, Moon, Palette, AlertTriangle, Loader2, Layers, LayoutGrid, ShieldCheck, Building2, MoreVerticalIcon, CreditCardIcon, BellIcon, LogOutIcon } from 'lucide-react';
9
9
 
10
10
  var OlwibaUIContext = React29.createContext({
11
11
  isMobile: false,
@@ -294,15 +294,17 @@ function NavUser({ user }) {
294
294
  /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-muted-foreground", children: user.email })
295
295
  ] })
296
296
  ] }) }),
297
- /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
298
- /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
299
- user.onBilling && /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: user.onBilling, children: [
300
- /* @__PURE__ */ jsx(CreditCardIcon, {}),
301
- "Billing"
302
- ] }),
303
- /* @__PURE__ */ jsxs(DropdownMenuItem, { children: [
304
- /* @__PURE__ */ jsx(BellIcon, {}),
305
- "Notifications"
297
+ (user.onBilling || user.onNotifications) && /* @__PURE__ */ jsxs(Fragment, { children: [
298
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
299
+ /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
300
+ user.onBilling && /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: user.onBilling, children: [
301
+ /* @__PURE__ */ jsx(CreditCardIcon, {}),
302
+ "Billing"
303
+ ] }),
304
+ user.onNotifications && /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: user.onNotifications, children: [
305
+ /* @__PURE__ */ jsx(BellIcon, {}),
306
+ "Notifications"
307
+ ] })
306
308
  ] })
307
309
  ] }),
308
310
  user.onSignOut && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -498,7 +500,8 @@ function DefaultForm({
498
500
  const hasPrefill = !!(defaultEmail || defaultPassword);
499
501
  const prefillStyle = (active) => active ? { animation: "auth-prefill 1.6s ease-out 0.35s 1 both" } : void 0;
500
502
  return /* @__PURE__ */ jsxs(Card, { className: "w-full", children: [
501
- hasPrefill && /* @__PURE__ */ jsx("style", { children: `@keyframes auth-prefill{0%{box-shadow:0 0 0 0 hsl(var(--primary)/0)}40%{box-shadow:0 0 0 3px hsl(var(--primary)/0.4)}100%{box-shadow:0 0 0 0 hsl(var(--primary)/0)}}` }),
503
+ hasPrefill && // Theme tokens hold full color values (oklch), so opacity must come from color-mix, not hsl(var()/a)
504
+ /* @__PURE__ */ jsx("style", { children: `@keyframes auth-prefill{0%{box-shadow:0 0 0 0 transparent}40%{box-shadow:0 0 0 3px color-mix(in oklab,var(--primary) 45%,transparent),0 0 16px 2px color-mix(in oklab,var(--primary) 35%,transparent)}100%{box-shadow:0 0 0 0 transparent}}` }),
502
505
  /* @__PURE__ */ jsxs(CardHeader, { children: [
503
506
  brand && /* @__PURE__ */ jsx("div", { className: "mb-2", children: brand }),
504
507
  /* @__PURE__ */ jsx(CardTitle, { children: isSignUp ? "Create an account" : "Sign in" }),
@@ -605,35 +608,90 @@ function ErrorPage({
605
608
  description = "The page you're looking for doesn't exist or has been moved. Check the URL or head back home.",
606
609
  action = { label: "Take me home", href: "/" },
607
610
  backAction = { label: "Go back" },
611
+ links,
608
612
  renderLink = defaultRenderLink3
609
613
  }) {
610
- return /* @__PURE__ */ jsx("section", { className: "overflow-hidden rounded-2xl border bg-card", children: /* @__PURE__ */ jsxs("div", { className: "relative flex min-h-[560px] flex-col items-center justify-center px-6 py-16 text-center", children: [
611
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_center,hsl(var(--muted)/0.8),transparent_70%)]" }),
612
- /* @__PURE__ */ jsxs("div", { className: "relative space-y-6", children: [
613
- /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl border bg-muted", children: /* @__PURE__ */ jsx(Compass, { className: "size-8 text-muted-foreground" }) }) }),
614
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
615
- /* @__PURE__ */ jsx("div", { className: "text-8xl font-bold tracking-tight text-muted-foreground/20", children: statusCode }),
616
- /* @__PURE__ */ jsx("h1", { className: "-mt-4 text-2xl font-semibold tracking-tight", children: title }),
617
- /* @__PURE__ */ jsx("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: description })
618
- ] }),
619
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-3", children: [
620
- backAction && (backAction.href ? renderLink({
621
- href: backAction.href,
622
- children: /* @__PURE__ */ jsxs(Button, { variant: "outline", children: [
623
- /* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4" }),
624
- backAction.label
614
+ const hasLinks = links && links.length > 0;
615
+ return /* @__PURE__ */ jsxs("section", { className: "relative overflow-hidden rounded-2xl border bg-card", children: [
616
+ /* @__PURE__ */ jsx(
617
+ "div",
618
+ {
619
+ "aria-hidden": true,
620
+ className: "absolute inset-0 bg-[radial-gradient(hsl(var(--border))_1px,transparent_1px)] [background-size:24px_24px] [mask-image:radial-gradient(ellipse_at_center,black_30%,transparent_75%)]"
621
+ }
622
+ ),
623
+ /* @__PURE__ */ jsx(
624
+ "div",
625
+ {
626
+ "aria-hidden": true,
627
+ className: "absolute left-1/2 top-24 h-64 w-[36rem] max-w-full -translate-x-1/2 rounded-full bg-primary/10 blur-3xl"
628
+ }
629
+ ),
630
+ /* @__PURE__ */ jsxs(
631
+ "div",
632
+ {
633
+ className: cn$1(
634
+ "relative mx-auto flex max-w-3xl flex-col items-center px-6 pt-20 text-center sm:pt-24",
635
+ hasLinks ? "pb-16" : "pb-24 sm:pb-28"
636
+ ),
637
+ children: [
638
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2 rounded-full border bg-background/80 px-3 py-1 font-mono text-xs text-muted-foreground backdrop-blur", children: [
639
+ /* @__PURE__ */ jsxs("span", { className: "relative flex size-1.5", children: [
640
+ /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-60" }),
641
+ /* @__PURE__ */ jsx("span", { className: "relative inline-flex size-1.5 rounded-full bg-primary" })
642
+ ] }),
643
+ "HTTP ",
644
+ statusCode
645
+ ] }),
646
+ /* @__PURE__ */ jsx(
647
+ "div",
648
+ {
649
+ "aria-hidden": true,
650
+ className: "pointer-events-none -mb-8 mt-2 select-none bg-gradient-to-b from-foreground/15 via-foreground/[0.06] to-transparent bg-clip-text text-[9rem] font-black leading-none tracking-tighter text-transparent sm:-mb-12 sm:text-[13rem]",
651
+ children: statusCode
652
+ }
653
+ ),
654
+ /* @__PURE__ */ jsx("h1", { className: "text-balance text-2xl font-semibold tracking-tight sm:text-3xl", children: title }),
655
+ /* @__PURE__ */ jsx("p", { className: "mx-auto mt-3 max-w-md text-pretty text-sm leading-6 text-muted-foreground", children: description }),
656
+ /* @__PURE__ */ jsxs("div", { className: "mt-8 flex flex-wrap items-center justify-center gap-3", children: [
657
+ backAction && (backAction.href ? renderLink({
658
+ href: backAction.href,
659
+ children: /* @__PURE__ */ jsxs(Button, { variant: "outline", children: [
660
+ /* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4" }),
661
+ backAction.label
662
+ ] })
663
+ }) : /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: backAction.onClick, children: [
664
+ /* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4" }),
665
+ backAction.label
666
+ ] })),
667
+ action && renderLink({
668
+ href: action.href,
669
+ children: /* @__PURE__ */ jsx(Button, { children: action.label })
670
+ })
671
+ ] }),
672
+ hasLinks && /* @__PURE__ */ jsxs("div", { className: "mt-14 w-full", children: [
673
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground", children: "Maybe you were looking for" }),
674
+ /* @__PURE__ */ jsx("div", { className: "mt-4 grid gap-3 text-left sm:grid-cols-2 lg:grid-cols-3", children: links.map(
675
+ (link) => renderLink({
676
+ href: link.href,
677
+ className: "group flex items-start gap-3 rounded-xl border bg-background/60 p-4 backdrop-blur transition-colors hover:border-primary/40 hover:bg-accent",
678
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
679
+ link.icon && /* @__PURE__ */ jsx("span", { className: "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg border bg-muted text-muted-foreground", children: link.icon }),
680
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 grow", children: [
681
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-sm font-medium", children: [
682
+ link.label,
683
+ /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-3.5 text-muted-foreground transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5 group-hover:text-foreground" })
684
+ ] }),
685
+ link.description && /* @__PURE__ */ jsx("span", { className: "mt-0.5 block text-xs leading-5 text-muted-foreground", children: link.description })
686
+ ] })
687
+ ] })
688
+ })
689
+ ) })
625
690
  ] })
626
- }) : /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: backAction.onClick, children: [
627
- /* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4" }),
628
- backAction.label
629
- ] })),
630
- action && renderLink({
631
- href: action.href,
632
- children: /* @__PURE__ */ jsx(Button, { children: action.label })
633
- })
634
- ] })
635
- ] })
636
- ] }) });
691
+ ]
692
+ }
693
+ )
694
+ ] });
637
695
  }
638
696
  function UpgradePrompt({
639
697
  variant,
@@ -816,6 +874,12 @@ function SectionTitle({ title, description, badge, className }) {
816
874
  description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-pretty text-muted-foreground", children: description })
817
875
  ] }) });
818
876
  }
877
+
878
+ // src/marketing/section-spacing.ts
879
+ var marketingSectionSpacing = {
880
+ standard: "px-6 py-14 sm:px-10 sm:py-20",
881
+ hero: "px-6 pb-14 pt-10 sm:px-10 sm:py-20"
882
+ };
819
883
  var sizes = {
820
884
  sm: { outer: "w-44", height: "h-80", notch: "w-16 h-4", border: "rounded-[2rem]", screen: "rounded-[1.75rem]" },
821
885
  md: { outer: "w-56", height: "h-[26rem]", notch: "w-20 h-5", border: "rounded-[2.5rem]", screen: "rounded-[2.25rem]" },
@@ -878,7 +942,7 @@ function HeroSection({
878
942
  socialProofText,
879
943
  renderLink = defaultRenderLink4
880
944
  }) {
881
- return /* @__PURE__ */ jsx("section", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: "px-6 py-14 sm:px-10 sm:py-20", children: [
945
+ return /* @__PURE__ */ jsx("section", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: marketingSectionSpacing.hero, children: [
882
946
  /* @__PURE__ */ jsxs("div", { className: "mx-auto grid max-w-6xl items-center gap-10 lg:grid-cols-2 lg:gap-16", children: [
883
947
  /* @__PURE__ */ jsx(FadeIn, { direction: "left", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
884
948
  badge && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge$1, { variant: "secondary", children: badge }) }),
@@ -2352,27 +2416,19 @@ function Navbar({
2352
2416
  })
2353
2417
  ] }),
2354
2418
  /* @__PURE__ */ jsxs(Sheet, { open, onOpenChange: setOpen, children: [
2355
- /* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button$1, { variant: "ghost", size: "icon", className: "justify-self-end md:hidden", children: [
2419
+ /* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button$1, { variant: "ghost", size: "icon", className: "col-start-3 justify-self-end md:hidden", children: [
2356
2420
  /* @__PURE__ */ jsx(Menu, { className: "size-5" }),
2357
2421
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Open menu" })
2358
2422
  ] }) }),
2359
- /* @__PURE__ */ jsxs(SheetContent, { side: "right", className: "w-72", children: [
2360
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pb-4", children: [
2361
- /* @__PURE__ */ jsx("span", { onClick: () => setOpen(false), className: "cursor-pointer", children: renderLink({
2362
- href: brandHref,
2363
- children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 font-semibold", children: [
2364
- brand.logo,
2365
- /* @__PURE__ */ jsx("span", { children: brand.name })
2366
- ] })
2367
- }) }),
2368
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
2369
- controls?.map((control, i) => /* @__PURE__ */ jsx(React29.Fragment, { children: control }, i)),
2370
- /* @__PURE__ */ jsxs(Button$1, { variant: "ghost", size: "icon", onClick: () => setOpen(false), children: [
2371
- /* @__PURE__ */ jsx(X, { className: "size-4" }),
2372
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close menu" })
2373
- ] })
2423
+ /* @__PURE__ */ jsxs(SheetContent, { side: "left", className: "w-72", children: [
2424
+ /* @__PURE__ */ jsx("div", { className: "flex items-center pb-4", children: /* @__PURE__ */ jsx("span", { onClick: () => setOpen(false), className: "cursor-pointer", children: renderLink({
2425
+ href: brandHref,
2426
+ children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 font-semibold", children: [
2427
+ brand.logo,
2428
+ /* @__PURE__ */ jsx("span", { children: brand.name })
2374
2429
  ] })
2375
- ] }),
2430
+ }) }) }),
2431
+ controls?.length ? /* @__PURE__ */ jsx("div", { className: "mb-4 flex w-full items-center justify-between gap-1", children: controls.map((control, i) => /* @__PURE__ */ jsx(React29.Fragment, { children: control }, i)) }) : null,
2376
2432
  /* @__PURE__ */ jsx(Separator, {}),
2377
2433
  /* @__PURE__ */ jsx("nav", { className: "mt-4 flex flex-col gap-1", children: navLinks.map((link) => /* @__PURE__ */ jsx("span", { onClick: () => setOpen(false), children: renderLink({
2378
2434
  href: link.href,
@@ -3100,6 +3156,8 @@ function FlowConnector({
3100
3156
  }
3101
3157
  function FlowBracket({
3102
3158
  anchorTop = 8,
3159
+ anchorTopLeft,
3160
+ anchorTopRight,
3103
3161
  anchorBottom = 92,
3104
3162
  extent = 22,
3105
3163
  arrow = true,
@@ -3119,30 +3177,32 @@ function FlowBracket({
3119
3177
  const R = 1e3 + extent;
3120
3178
  const cl = colorLeft ?? color;
3121
3179
  const cr = colorRight ?? color;
3122
- const leftD = `M 0,${anchorBottom} L ${L},${anchorBottom} L ${L},${anchorTop} L 0,${anchorTop}`;
3123
- const rightD = reverseRight ? `M 1000,${anchorTop} L ${R},${anchorTop} L ${R},${anchorBottom} L 1000,${anchorBottom}` : `M 1000,${anchorBottom} L ${R},${anchorBottom} L ${R},${anchorTop} L 1000,${anchorTop}`;
3180
+ const aTL = anchorTopLeft ?? anchorTop;
3181
+ const aTR = anchorTopRight ?? anchorTop;
3182
+ const leftD = `M 0,${anchorBottom} L ${L},${anchorBottom} L ${L},${aTL} L 0,${aTL}`;
3183
+ const rightD = reverseRight ? `M 1000,${aTR} L ${R},${aTR} L ${R},${anchorBottom} L 1000,${anchorBottom}` : `M 1000,${anchorBottom} L ${R},${anchorBottom} L ${R},${aTR} L 1000,${aTR}`;
3124
3184
  const ep = `${(extent / 10).toFixed(1)}%`;
3125
3185
  const dotKeyframes = animate ? `
3126
3186
  @keyframes fb-dl{
3127
3187
  0%{top:${anchorBottom}%;left:0;opacity:0}
3128
3188
  6%{opacity:1}
3129
3189
  20%{top:${anchorBottom}%;left:-${ep}}
3130
- 80%{top:${anchorTop}%;left:-${ep};opacity:1}
3131
- 94%{top:${anchorTop}%;left:0;opacity:0}
3132
- 100%{top:${anchorTop}%;left:0;opacity:0}
3190
+ 80%{top:${aTL}%;left:-${ep};opacity:1}
3191
+ 94%{top:${aTL}%;left:0;opacity:0}
3192
+ 100%{top:${aTL}%;left:0;opacity:0}
3133
3193
  }
3134
3194
  @keyframes fb-dr{
3135
3195
  0%{top:${anchorBottom}%;left:100%;opacity:0}
3136
3196
  6%{opacity:1}
3137
3197
  20%{top:${anchorBottom}%;left:calc(100% + ${ep})}
3138
- 80%{top:${anchorTop}%;left:calc(100% + ${ep});opacity:1}
3139
- 94%{top:${anchorTop}%;left:100%;opacity:0}
3140
- 100%{top:${anchorTop}%;left:100%;opacity:0}
3198
+ 80%{top:${aTR}%;left:calc(100% + ${ep});opacity:1}
3199
+ 94%{top:${aTR}%;left:100%;opacity:0}
3200
+ 100%{top:${aTR}%;left:100%;opacity:0}
3141
3201
  }
3142
3202
  @keyframes fb-drr{
3143
- 0%{top:${anchorTop}%;left:100%;opacity:0}
3203
+ 0%{top:${aTR}%;left:100%;opacity:0}
3144
3204
  6%{opacity:1}
3145
- 20%{top:${anchorTop}%;left:calc(100% + ${ep})}
3205
+ 20%{top:${aTR}%;left:calc(100% + ${ep})}
3146
3206
  80%{top:${anchorBottom}%;left:calc(100% + ${ep});opacity:1}
3147
3207
  94%{top:${anchorBottom}%;left:100%;opacity:0}
3148
3208
  100%{top:${anchorBottom}%;left:100%;opacity:0}
@@ -3211,7 +3271,7 @@ function FlowBracket({
3211
3271
  {
3212
3272
  "aria-hidden": true,
3213
3273
  viewBox: "0 0 10 8",
3214
- style: { ...arrowBase, top: `${anchorTop}%`, left: 0 },
3274
+ style: { ...arrowBase, top: `${aTL}%`, left: 0 },
3215
3275
  children: /* @__PURE__ */ jsx("polyline", { points: "1,1 8,4 1,7", style: { stroke: cl }, ...chevronProps })
3216
3276
  }
3217
3277
  ),
@@ -3222,7 +3282,7 @@ function FlowBracket({
3222
3282
  viewBox: "0 0 10 8",
3223
3283
  style: {
3224
3284
  ...arrowBase,
3225
- top: reverseRight ? `${anchorBottom}%` : `${anchorTop}%`,
3285
+ top: reverseRight ? `${anchorBottom}%` : `${aTR}%`,
3226
3286
  left: "100%"
3227
3287
  },
3228
3288
  children: /* @__PURE__ */ jsx("polyline", { points: "9,1 2,4 9,7", style: { stroke: cr }, ...chevronProps })
@@ -3460,7 +3520,7 @@ function BrandColorSwitchMinimal() {
3460
3520
  /* @__PURE__ */ jsx(
3461
3521
  "span",
3462
3522
  {
3463
- className: "absolute -bottom-0.5 -right-0.5 size-1.5 rounded-full ring-1 ring-background",
3523
+ className: `absolute -bottom-0.5 -right-0.5 size-1.5 rounded-full ring-1 ring-background${active === "zinc" ? " dark:ring-white/25" : ""}`,
3464
3524
  style: { background: activeHex }
3465
3525
  }
3466
3526
  )
@@ -3480,7 +3540,7 @@ function BrandColorSwitchMinimal() {
3480
3540
  /* @__PURE__ */ jsx(
3481
3541
  "span",
3482
3542
  {
3483
- className: "flex size-7 items-center justify-center rounded-full ring-offset-background transition-all group-hover:scale-110",
3543
+ className: `flex size-7 items-center justify-center rounded-full ring-offset-background transition-all group-hover:scale-110${color.name === "zinc" ? " border border-transparent dark:border-white/25" : ""}`,
3484
3544
  style: {
3485
3545
  background: PREVIEW_HEX[color.name],
3486
3546
  boxShadow: active === color.name ? `0 0 0 2px var(--background), 0 0 0 4px ${PREVIEW_HEX[color.name]}` : void 0
@@ -3576,35 +3636,111 @@ function RootErrorFallback({ error, reset }) {
3576
3636
  function formatDate(dateStr) {
3577
3637
  return new Date(dateStr).toLocaleDateString("en-US", {
3578
3638
  year: "numeric",
3579
- month: "long",
3639
+ month: "short",
3580
3640
  day: "numeric"
3581
3641
  });
3582
3642
  }
3583
- function PostCard({ title, description, date, slug, image, tags, renderLink }) {
3584
- const href = `/blog/${slug}`;
3585
- const LinkWrapper = ({ children, className }) => renderLink ? renderLink({ href, children, className }) : /* @__PURE__ */ jsx("a", { href, className, children });
3586
- return /* @__PURE__ */ jsxs("article", { className: "group flex flex-col gap-3", children: [
3587
- image && /* @__PURE__ */ jsx(LinkWrapper, { className: "block overflow-hidden rounded-xl", children: /* @__PURE__ */ jsx(
3588
- "img",
3589
- {
3590
- src: image,
3591
- alt: title,
3592
- className: "aspect-video w-full object-cover transition-transform duration-300 group-hover:scale-105"
3593
- }
3594
- ) }),
3595
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
3596
- tags && tags.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: tags.map((tag) => /* @__PURE__ */ jsx(Badge$1, { variant: "secondary", className: "text-xs", children: tag }, tag)) }),
3597
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold leading-snug tracking-tight", children: /* @__PURE__ */ jsx(LinkWrapper, { className: "hover:text-primary transition-colors", children: title }) }),
3598
- description && /* @__PURE__ */ jsx("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: description }),
3599
- /* @__PURE__ */ jsx("time", { dateTime: date, className: "text-xs text-muted-foreground", children: formatDate(date) })
3643
+ function PostCard({
3644
+ title,
3645
+ description,
3646
+ date,
3647
+ slug,
3648
+ image,
3649
+ tags,
3650
+ author,
3651
+ hrefPrefix = "/blog",
3652
+ tagHrefPrefix = "/blog/tag",
3653
+ renderLink
3654
+ }) {
3655
+ const href = `${hrefPrefix}/${slug}`;
3656
+ const LinkWrapper = ({
3657
+ href: linkHref,
3658
+ children,
3659
+ className
3660
+ }) => renderLink ? renderLink({ href: linkHref, children, className }) : /* @__PURE__ */ jsx("a", { href: linkHref, className, children });
3661
+ return /* @__PURE__ */ jsxs("article", { className: "group relative flex flex-col items-start", children: [
3662
+ /* @__PURE__ */ jsxs("div", { className: "relative w-full overflow-hidden rounded-2xl bg-muted", children: [
3663
+ image ? /* @__PURE__ */ jsx(
3664
+ "img",
3665
+ {
3666
+ src: image,
3667
+ alt: title,
3668
+ className: "aspect-video w-full object-cover transition-transform duration-500 group-hover:scale-[1.03]"
3669
+ }
3670
+ ) : /* @__PURE__ */ jsx(
3671
+ "div",
3672
+ {
3673
+ "aria-hidden": true,
3674
+ className: "aspect-video w-full bg-gradient-to-br from-primary/15 via-muted to-muted"
3675
+ }
3676
+ ),
3677
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 rounded-2xl ring-1 ring-inset ring-foreground/10" })
3678
+ ] }),
3679
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full grow flex-col", children: [
3680
+ /* @__PURE__ */ jsxs("div", { className: "mt-6 flex flex-wrap items-center gap-x-3 gap-y-2 text-xs", children: [
3681
+ /* @__PURE__ */ jsx("time", { dateTime: date, className: "text-muted-foreground", children: formatDate(date) }),
3682
+ tags?.map((tag) => /* @__PURE__ */ jsx(
3683
+ LinkWrapper,
3684
+ {
3685
+ href: `${tagHrefPrefix}/${encodeURIComponent(tag)}`,
3686
+ className: "relative z-10 rounded-full bg-muted px-3 py-1.5 font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
3687
+ children: tag
3688
+ },
3689
+ tag
3690
+ ))
3691
+ ] }),
3692
+ /* @__PURE__ */ jsxs("div", { className: "grow", children: [
3693
+ /* @__PURE__ */ jsx("h2", { className: "mt-3 text-lg font-semibold leading-snug tracking-tight transition-colors group-hover:text-primary", children: /* @__PURE__ */ jsxs(LinkWrapper, { href, children: [
3694
+ /* @__PURE__ */ jsx("span", { className: "absolute inset-0", "aria-hidden": true }),
3695
+ title
3696
+ ] }) }),
3697
+ description && /* @__PURE__ */ jsx("p", { className: "mt-3 line-clamp-3 text-sm leading-6 text-muted-foreground", children: description })
3698
+ ] }),
3699
+ author && /* @__PURE__ */ jsxs("div", { className: "mt-6 flex items-center gap-x-3", children: [
3700
+ author.avatar ? /* @__PURE__ */ jsx(
3701
+ "img",
3702
+ {
3703
+ src: author.avatar,
3704
+ alt: author.name,
3705
+ className: "size-9 rounded-full bg-muted object-cover"
3706
+ }
3707
+ ) : /* @__PURE__ */ jsx(
3708
+ "span",
3709
+ {
3710
+ "aria-hidden": true,
3711
+ className: "flex size-9 items-center justify-center rounded-full bg-muted text-sm font-semibold text-muted-foreground",
3712
+ children: author.name.charAt(0).toUpperCase()
3713
+ }
3714
+ ),
3715
+ /* @__PURE__ */ jsxs("div", { className: "text-sm leading-tight", children: [
3716
+ /* @__PURE__ */ jsx("p", { className: "font-semibold", children: author.name }),
3717
+ author.role && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: author.role })
3718
+ ] })
3719
+ ] })
3600
3720
  ] })
3601
3721
  ] });
3602
3722
  }
3603
- function PostList({ posts, renderLink, emptyMessage = "No posts published yet." }) {
3723
+ function PostList({
3724
+ posts,
3725
+ renderLink,
3726
+ emptyMessage = "No posts published yet.",
3727
+ columns = 3,
3728
+ className
3729
+ }) {
3604
3730
  if (posts.length === 0) {
3605
3731
  return /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground italic", children: emptyMessage });
3606
3732
  }
3607
- return /* @__PURE__ */ jsx("div", { className: "grid gap-8 sm:grid-cols-2", children: posts.map((post) => /* @__PURE__ */ jsx(PostCard, { ...post, renderLink }, post.slug)) });
3733
+ return /* @__PURE__ */ jsx(
3734
+ "div",
3735
+ {
3736
+ className: cn$1(
3737
+ "grid grid-cols-1 gap-x-8 gap-y-14 sm:grid-cols-2",
3738
+ columns === 3 && "lg:grid-cols-3",
3739
+ className
3740
+ ),
3741
+ children: posts.map((post) => /* @__PURE__ */ jsx(PostCard, { ...post, renderLink }, post.slug))
3742
+ }
3743
+ );
3608
3744
  }
3609
3745
  var releaseTypeLabel = {
3610
3746
  release: "Major Release",
@@ -3831,6 +3967,6 @@ function usePagination(total, pageSize) {
3831
3967
  return { page, pageSize, totalPages, offset, hasPrev: page > 1, hasNext: page < totalPages, goTo, next, prev };
3832
3968
  }
3833
3969
 
3834
- export { AnimatedPill, AppContent, AppGrid, AppGridCell, AppScreen, AppShell, AuthSection, Badge, BrandColorSwitchMinimal, Button, Card, CarouselSection, ChangelogCard, ChangelogList, Checkbox, ComparisonSection, ConfirmDialog, ContactSection, ContextMenu, CountUp, CountdownTimer, CtaCardSection, CtaSection, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeatureMarqueeSection, FeaturesSection, FlowBracket, FlowConnector, Footer, FullPageSpinner, GlassCard, Grid, GridItem, GroupedFeaturesSection, HeroSection, ImageCard, Input, LogoStrip, ModeSwitchMinimal, Navbar, NewsletterSection, OlwibaUIProvider, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, PublicPageFrame, QualificationSection, RegisterHotkeys, RootErrorFallback, Section, SectionTitle, Spotlight, Stack, StaggerChildren, StatCard, StatsSection, StepsSection, Suspensed, Switch, TeamSection, TechStackSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpgradePrompt, VersionBanner, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
3970
+ export { AnimatedPill, AppContent, AppGrid, AppGridCell, AppScreen, AppShell, AuthSection, Badge, BrandColorSwitchMinimal, Button, Card, CarouselSection, ChangelogCard, ChangelogList, Checkbox, ComparisonSection, ConfirmDialog, ContactSection, ContextMenu, CountUp, CountdownTimer, CtaCardSection, CtaSection, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeatureMarqueeSection, FeaturesSection, FlowBracket, FlowConnector, Footer, FullPageSpinner, GlassCard, Grid, GridItem, GroupedFeaturesSection, HeroSection, ImageCard, Input, LogoStrip, ModeSwitchMinimal, Navbar, NewsletterSection, OlwibaUIProvider, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, PublicPageFrame, QualificationSection, RegisterHotkeys, RootErrorFallback, Section, SectionTitle, Spotlight, Stack, StaggerChildren, StatCard, StatsSection, StepsSection, Suspensed, Switch, TeamSection, TechStackSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpgradePrompt, VersionBanner, marketingSectionSpacing, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
3835
3971
  //# sourceMappingURL=index.js.map
3836
3972
  //# sourceMappingURL=index.js.map