@kinetixui/ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/index.d.ts +35 -1
  2. package/dist/index.js +202 -99
  3. package/package.json +4 -4
  4. package/src/components/app-bar.tsx +139 -0
  5. package/src/components/chart.tsx +15 -3
  6. package/src/index.ts +9 -0
  7. package/src/stories/Accordion.stories.tsx +2 -2
  8. package/src/stories/Alert.stories.tsx +2 -2
  9. package/src/stories/AlertDialog.stories.tsx +2 -2
  10. package/src/stories/AppBar.stories.tsx +46 -0
  11. package/src/stories/AspectRatio.stories.tsx +2 -2
  12. package/src/stories/AudioPlayer.stories.tsx +2 -2
  13. package/src/stories/Avatar.stories.tsx +2 -2
  14. package/src/stories/AvatarGroup.stories.tsx +2 -2
  15. package/src/stories/Badge.stories.tsx +2 -2
  16. package/src/stories/Breadcrumb.stories.tsx +2 -2
  17. package/src/stories/Button.stories.tsx +1 -1
  18. package/src/stories/Calendar.stories.tsx +2 -2
  19. package/src/stories/Card.stories.tsx +2 -2
  20. package/src/stories/Carousel.stories.tsx +2 -2
  21. package/src/stories/Chart.stories.tsx +2 -2
  22. package/src/stories/Checkbox.stories.tsx +2 -2
  23. package/src/stories/CircularProgress.stories.tsx +2 -2
  24. package/src/stories/CodeBlock.stories.tsx +2 -2
  25. package/src/stories/Collapsible.stories.tsx +2 -2
  26. package/src/stories/Combobox.stories.tsx +2 -2
  27. package/src/stories/Command.stories.tsx +2 -2
  28. package/src/stories/ContextMenu.stories.tsx +2 -2
  29. package/src/stories/DataTable.stories.tsx +2 -2
  30. package/src/stories/DatePicker.stories.tsx +2 -2
  31. package/src/stories/Dialog.stories.tsx +2 -2
  32. package/src/stories/Drawer.stories.tsx +2 -2
  33. package/src/stories/DropdownMenu.stories.tsx +2 -2
  34. package/src/stories/Fab.stories.tsx +2 -2
  35. package/src/stories/Field.stories.tsx +2 -2
  36. package/src/stories/FileUpload.stories.tsx +2 -2
  37. package/src/stories/Footer.stories.tsx +2 -2
  38. package/src/stories/Form.stories.tsx +2 -2
  39. package/src/stories/HoverCard.stories.tsx +2 -2
  40. package/src/stories/Image.stories.tsx +2 -2
  41. package/src/stories/Inform.stories.tsx +2 -2
  42. package/src/stories/Input.stories.tsx +1 -1
  43. package/src/stories/InputGroup.stories.tsx +2 -2
  44. package/src/stories/InputOTP.stories.tsx +2 -2
  45. package/src/stories/Label.stories.tsx +2 -2
  46. package/src/stories/List.stories.tsx +2 -2
  47. package/src/stories/Menubar.stories.tsx +2 -2
  48. package/src/stories/Metric.stories.tsx +2 -2
  49. package/src/stories/Modal.stories.tsx +2 -2
  50. package/src/stories/NavigationBar.stories.tsx +2 -2
  51. package/src/stories/NavigationMenu.stories.tsx +2 -2
  52. package/src/stories/NumberInput.stories.tsx +2 -2
  53. package/src/stories/Pagination.stories.tsx +2 -2
  54. package/src/stories/PasswordInput.stories.tsx +2 -2
  55. package/src/stories/Popover.stories.tsx +2 -2
  56. package/src/stories/Progress.stories.tsx +2 -2
  57. package/src/stories/Quote.stories.tsx +2 -2
  58. package/src/stories/RadioGroup.stories.tsx +2 -2
  59. package/src/stories/Rating.stories.tsx +2 -2
  60. package/src/stories/Resizable.stories.tsx +2 -2
  61. package/src/stories/ScrollArea.stories.tsx +2 -2
  62. package/src/stories/Select.stories.tsx +2 -2
  63. package/src/stories/Separator.stories.tsx +2 -2
  64. package/src/stories/Sheet.stories.tsx +2 -2
  65. package/src/stories/Sidebar.stories.tsx +2 -2
  66. package/src/stories/Skeleton.stories.tsx +2 -2
  67. package/src/stories/Slider.stories.tsx +2 -2
  68. package/src/stories/Sonner.stories.tsx +2 -2
  69. package/src/stories/Spinner.stories.tsx +2 -2
  70. package/src/stories/Stepper.stories.tsx +2 -2
  71. package/src/stories/Switch.stories.tsx +2 -2
  72. package/src/stories/TabBar.stories.tsx +2 -2
  73. package/src/stories/Table.stories.tsx +2 -2
  74. package/src/stories/TableOfContents.stories.tsx +2 -2
  75. package/src/stories/Tabs.stories.tsx +2 -2
  76. package/src/stories/Tag.stories.tsx +2 -2
  77. package/src/stories/Textarea.stories.tsx +1 -1
  78. package/src/stories/Toggle.stories.tsx +2 -2
  79. package/src/stories/ToggleGroup.stories.tsx +2 -2
  80. package/src/stories/Tooltip.stories.tsx +2 -2
package/dist/index.d.ts CHANGED
@@ -1050,6 +1050,40 @@ interface NavigationBarProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "
1050
1050
  }
1051
1051
  declare const NavigationBar: React$1.ForwardRefExoticComponent<NavigationBarProps & React$1.RefAttributes<HTMLElement>>;
1052
1052
 
1053
+ /**
1054
+ * AppBar — a web application top bar: a brand slot, a row of primary nav
1055
+ * links, and a trailing actions slot inside a sticky bordered header. Below
1056
+ * the `md` breakpoint the nav collapses behind a menu toggle into a panel
1057
+ * under the bar.
1058
+ *
1059
+ * <AppBar>
1060
+ * <AppBarBrand>Acme</AppBarBrand>
1061
+ * <AppBarNav>
1062
+ * <AppBarLink href="/" active>Overview</AppBarLink>
1063
+ * <AppBarLink href="/reports">Reports</AppBarLink>
1064
+ * </AppBarNav>
1065
+ * <AppBarActions><Button size="sm">New</Button></AppBarActions>
1066
+ * </AppBar>
1067
+ *
1068
+ * `NavigationBar` is the mobile back-button bar; this is the desktop app shell.
1069
+ */
1070
+ interface AppBarCtx {
1071
+ open: boolean;
1072
+ setOpen: React$1.Dispatch<React$1.SetStateAction<boolean>>;
1073
+ }
1074
+ declare const useAppBar: () => AppBarCtx;
1075
+ declare const AppBar: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLElement> & React$1.RefAttributes<HTMLElement>>;
1076
+ declare const AppBarBrand: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
1077
+ declare const AppBarNav: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLElement> & React$1.RefAttributes<HTMLElement>>;
1078
+ interface AppBarLinkProps extends React$1.AnchorHTMLAttributes<HTMLAnchorElement> {
1079
+ /** Marks the current destination — sets `aria-current="page"` and the active style. */
1080
+ active?: boolean;
1081
+ /** Render as the child element (e.g. a framework `<Link>`), forwarding props. */
1082
+ asChild?: boolean;
1083
+ }
1084
+ declare const AppBarLink: React$1.ForwardRefExoticComponent<AppBarLinkProps & React$1.RefAttributes<HTMLAnchorElement>>;
1085
+ declare const AppBarActions: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
1086
+
1053
1087
  /**
1054
1088
  * FileUpload — a drag-and-drop zone plus file list, single or multiple.
1055
1089
  * Upload logic (network, storage) is the consumer's — this component is
@@ -1198,4 +1232,4 @@ declare const TableOfContents: React$1.ForwardRefExoticComponent<TableOfContents
1198
1232
  /** Merges Tailwind class names, resolving conflicts (clsx + tailwind-merge). */
1199
1233
  declare function cn(...inputs: ClassValue[]): string;
1200
1234
 
1201
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, AudioPlayer, type AudioPlayerProps, Avatar, AvatarFallback, AvatarGroup, type AvatarGroupProps, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CircularProgress, type CircularProgressProps, CodeBlock, type CodeBlockFile, type CodeBlockProps, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataTable, DatePicker, type DatePickerProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Fab, type FabProps, Field, FieldControl, FieldDescription, FieldLabel, FieldMessage, FileUpload, FileUploadItem, type FileUploadItemProps, type FileUploadProps, Footer, FooterBottom, FooterColumn, type FooterColumnProps, FooterLink, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, Image, type ImageProps, Inform, type InformProps, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, List, ListItem, type ListItemProps, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Metric, type MetricProps, Modal, type ModalProps, type ModalType, NavigationBar, type NavigationBarProps, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, type NumberInputProps, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, Quote, type QuoteProps, RadioGroup, RadioGroupItem, Rating, type RatingProps, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarProvider, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, type SpinnerProps, Stepper, type StepperProps, type StepperStep, Switch, TabBar, TabBarItem, type TabBarItemProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, type TableOfContentsProps, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Tag, type TagProps, Textarea, type TextareaProps, Toaster, type TocItem, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type UploadFile, badgeVariants, buttonVariants, cn, fabVariants, formatBytes, informVariants, inputVariants, messageVariants, navigationMenuTriggerStyle, spinnerVariants, tagVariants, textareaVariants, toggleVariants, useFormField, useSidebar };
1235
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppBar, AppBarActions, AppBarBrand, AppBarLink, type AppBarLinkProps, AppBarNav, AspectRatio, AudioPlayer, type AudioPlayerProps, Avatar, AvatarFallback, AvatarGroup, type AvatarGroupProps, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CircularProgress, type CircularProgressProps, CodeBlock, type CodeBlockFile, type CodeBlockProps, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataTable, DatePicker, type DatePickerProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Fab, type FabProps, Field, FieldControl, FieldDescription, FieldLabel, FieldMessage, FileUpload, FileUploadItem, type FileUploadItemProps, type FileUploadProps, Footer, FooterBottom, FooterColumn, type FooterColumnProps, FooterLink, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, Image, type ImageProps, Inform, type InformProps, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, List, ListItem, type ListItemProps, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Metric, type MetricProps, Modal, type ModalProps, type ModalType, NavigationBar, type NavigationBarProps, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, type NumberInputProps, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, Quote, type QuoteProps, RadioGroup, RadioGroupItem, Rating, type RatingProps, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarProvider, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, type SpinnerProps, Stepper, type StepperProps, type StepperStep, Switch, TabBar, TabBarItem, type TabBarItemProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, type TableOfContentsProps, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Tag, type TagProps, Textarea, type TextareaProps, Toaster, type TocItem, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type UploadFile, badgeVariants, buttonVariants, cn, fabVariants, formatBytes, informVariants, inputVariants, messageVariants, navigationMenuTriggerStyle, spinnerVariants, tagVariants, textareaVariants, toggleVariants, useAppBar, useFormField, useSidebar };
package/dist/index.js CHANGED
@@ -1643,19 +1643,23 @@ function ChartSrTable({
1643
1643
  /* @__PURE__ */ jsx37("tbody", { children: rows.map((r, i) => /* @__PURE__ */ jsx37("tr", { children: r.map((cell, j) => /* @__PURE__ */ jsx37("td", { children: cell }, j)) }, i)) })
1644
1644
  ] });
1645
1645
  }
1646
+ var cssIdent = (s) => String(s).replace(/[^\w-]/g, "");
1647
+ var cssValue = (s) => /[<>{}\[\];@]|\/\*|\*\//.test(s) ? "" : s.trim();
1646
1648
  var ChartStyle = ({ id, config }) => {
1647
1649
  const colorConfig = Object.entries(config).filter(([, c]) => c.theme || c.color);
1648
1650
  if (!colorConfig.length) return null;
1651
+ const chartSelector = cssIdent(id);
1649
1652
  return /* @__PURE__ */ jsx37(
1650
1653
  "style",
1651
1654
  {
1652
1655
  dangerouslySetInnerHTML: {
1653
1656
  __html: Object.entries(THEMES).map(
1654
1657
  ([theme, prefix]) => `
1655
- ${prefix} [data-chart=${id}] {
1658
+ ${prefix} [data-chart=${chartSelector}] {
1656
1659
  ${colorConfig.map(([key, itemConfig]) => {
1657
- const color = itemConfig.theme?.[theme] || itemConfig.color;
1658
- return color ? ` --color-${key}: ${color};` : null;
1660
+ const raw = itemConfig.theme?.[theme] || itemConfig.color;
1661
+ const color = raw ? cssValue(raw) : "";
1662
+ return color ? ` --color-${cssIdent(key)}: ${color};` : null;
1659
1663
  }).join("\n")}
1660
1664
  }
1661
1665
  `
@@ -3300,10 +3304,103 @@ var NavigationBar = React55.forwardRef(
3300
3304
  );
3301
3305
  NavigationBar.displayName = "NavigationBar";
3302
3306
 
3303
- // src/components/file-upload.tsx
3307
+ // src/components/app-bar.tsx
3304
3308
  import * as React56 from "react";
3305
- import { File, Loader2, TriangleAlert as TriangleAlert3, Upload, X as X6 } from "lucide-react";
3309
+ import { Slot as Slot7 } from "@radix-ui/react-slot";
3310
+ import { Menu as Menu2, X as X6 } from "lucide-react";
3306
3311
  import { jsx as jsx62, jsxs as jsxs33 } from "react/jsx-runtime";
3312
+ var Ctx = React56.createContext(null);
3313
+ var useAppBar = () => {
3314
+ const ctx = React56.useContext(Ctx);
3315
+ if (!ctx) throw new Error("AppBar parts must be used within <AppBar>");
3316
+ return ctx;
3317
+ };
3318
+ var AppBar = React56.forwardRef(
3319
+ ({ className, children, ...props }, ref) => {
3320
+ const [open, setOpen] = React56.useState(false);
3321
+ const nav = React56.Children.toArray(children).find(
3322
+ (c) => React56.isValidElement(c) && c.type === AppBarNav
3323
+ );
3324
+ return /* @__PURE__ */ jsx62(Ctx.Provider, { value: { open, setOpen }, children: /* @__PURE__ */ jsxs33(
3325
+ "header",
3326
+ {
3327
+ ref,
3328
+ className: cn(
3329
+ "sticky top-0 z-40 w-full border-b border-border bg-background/95 font-sans",
3330
+ "backdrop-blur supports-[backdrop-filter]:bg-background/75",
3331
+ className
3332
+ ),
3333
+ ...props,
3334
+ children: [
3335
+ /* @__PURE__ */ jsxs33("div", { className: "mx-auto flex h-14 max-w-screen-2xl items-center gap-4 px-4", children: [
3336
+ children,
3337
+ nav && /* @__PURE__ */ jsx62(
3338
+ "button",
3339
+ {
3340
+ type: "button",
3341
+ "aria-label": open ? "Close menu" : "Open menu",
3342
+ "aria-expanded": open,
3343
+ onClick: () => setOpen((o) => !o),
3344
+ className: cn(
3345
+ "ml-auto inline-flex size-9 items-center justify-center rounded-md text-foreground outline-none transition-colors md:hidden",
3346
+ "hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring"
3347
+ ),
3348
+ children: open ? /* @__PURE__ */ jsx62(X6, { className: "size-5" }) : /* @__PURE__ */ jsx62(Menu2, { className: "size-5" })
3349
+ }
3350
+ )
3351
+ ] }),
3352
+ nav && open && /* @__PURE__ */ jsx62("nav", { className: "flex flex-col gap-1 border-t border-border p-2 md:hidden", children: nav.props.children })
3353
+ ]
3354
+ }
3355
+ ) });
3356
+ }
3357
+ );
3358
+ AppBar.displayName = "AppBar";
3359
+ var AppBarBrand = React56.forwardRef(
3360
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx62(
3361
+ "div",
3362
+ {
3363
+ ref,
3364
+ className: cn("flex shrink-0 items-center gap-2 text-[15px] font-semibold text-foreground", className),
3365
+ ...props
3366
+ }
3367
+ )
3368
+ );
3369
+ AppBarBrand.displayName = "AppBarBrand";
3370
+ var AppBarNav = React56.forwardRef(
3371
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx62("nav", { ref, className: cn("hidden items-center gap-1 md:flex", className), ...props })
3372
+ );
3373
+ AppBarNav.displayName = "AppBarNav";
3374
+ var AppBarLink = React56.forwardRef(
3375
+ ({ className, active, asChild, ...props }, ref) => {
3376
+ const Comp = asChild ? Slot7 : "a";
3377
+ return /* @__PURE__ */ jsx62(
3378
+ Comp,
3379
+ {
3380
+ ref,
3381
+ "data-active": active ? "" : void 0,
3382
+ "aria-current": active ? "page" : void 0,
3383
+ className: cn(
3384
+ "inline-flex items-center rounded-md px-3 py-1.5 text-sm font-medium outline-none transition-colors",
3385
+ "text-muted-foreground hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring",
3386
+ "data-[active]:bg-accent data-[active]:text-foreground",
3387
+ className
3388
+ ),
3389
+ ...props
3390
+ }
3391
+ );
3392
+ }
3393
+ );
3394
+ AppBarLink.displayName = "AppBarLink";
3395
+ var AppBarActions = React56.forwardRef(
3396
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx62("div", { ref, className: cn("ml-auto flex shrink-0 items-center gap-2", className), ...props })
3397
+ );
3398
+ AppBarActions.displayName = "AppBarActions";
3399
+
3400
+ // src/components/file-upload.tsx
3401
+ import * as React57 from "react";
3402
+ import { File, Loader2, TriangleAlert as TriangleAlert3, Upload, X as X7 } from "lucide-react";
3403
+ import { jsx as jsx63, jsxs as jsxs34 } from "react/jsx-runtime";
3307
3404
  function formatBytes(bytes) {
3308
3405
  if (!bytes) return "";
3309
3406
  const units = ["B", "KB", "MB", "GB"];
@@ -3315,16 +3412,16 @@ function formatBytes(bytes) {
3315
3412
  }
3316
3413
  return `${v.toFixed(v < 10 && i > 0 ? 1 : 0)} ${units[i]}`;
3317
3414
  }
3318
- var FileUpload = React56.forwardRef(
3415
+ var FileUpload = React57.forwardRef(
3319
3416
  ({ className, multiple, accept, disabled, helperText, buttonLabel = "Browse files", files = [], onFilesSelected, onRemove, onRetry, ...props }, ref) => {
3320
- const inputRef = React56.useRef(null);
3321
- const [dragging, setDragging] = React56.useState(false);
3417
+ const inputRef = React57.useRef(null);
3418
+ const [dragging, setDragging] = React57.useState(false);
3322
3419
  const pick = (list) => {
3323
3420
  if (!list || !list.length) return;
3324
3421
  onFilesSelected?.(Array.from(list));
3325
3422
  };
3326
- return /* @__PURE__ */ jsxs33("div", { ref, className: cn("flex w-full flex-col gap-3 font-sans", className), ...props, children: [
3327
- /* @__PURE__ */ jsxs33(
3423
+ return /* @__PURE__ */ jsxs34("div", { ref, className: cn("flex w-full flex-col gap-3 font-sans", className), ...props, children: [
3424
+ /* @__PURE__ */ jsxs34(
3328
3425
  "div",
3329
3426
  {
3330
3427
  role: "button",
@@ -3354,13 +3451,13 @@ var FileUpload = React56.forwardRef(
3354
3451
  disabled && "pointer-events-none opacity-50"
3355
3452
  ),
3356
3453
  children: [
3357
- /* @__PURE__ */ jsx62(Upload, { className: "size-6 text-muted-foreground", "aria-hidden": true }),
3358
- /* @__PURE__ */ jsxs33("p", { className: "text-body-sm text-muted-foreground", children: [
3454
+ /* @__PURE__ */ jsx63(Upload, { className: "size-6 text-muted-foreground", "aria-hidden": true }),
3455
+ /* @__PURE__ */ jsxs34("p", { className: "text-body-sm text-muted-foreground", children: [
3359
3456
  "Drag & drop ",
3360
3457
  multiple ? "files" : "a file",
3361
3458
  " here, or"
3362
3459
  ] }),
3363
- /* @__PURE__ */ jsx62(
3460
+ /* @__PURE__ */ jsx63(
3364
3461
  Button,
3365
3462
  {
3366
3463
  type: "button",
@@ -3374,8 +3471,8 @@ var FileUpload = React56.forwardRef(
3374
3471
  children: buttonLabel
3375
3472
  }
3376
3473
  ),
3377
- helperText && /* @__PURE__ */ jsx62("p", { className: "text-body-sm text-muted-foreground", children: helperText }),
3378
- /* @__PURE__ */ jsx62(
3474
+ helperText && /* @__PURE__ */ jsx63("p", { className: "text-body-sm text-muted-foreground", children: helperText }),
3475
+ /* @__PURE__ */ jsx63(
3379
3476
  "input",
3380
3477
  {
3381
3478
  ref: inputRef,
@@ -3393,7 +3490,7 @@ var FileUpload = React56.forwardRef(
3393
3490
  ]
3394
3491
  }
3395
3492
  ),
3396
- files.length > 0 && /* @__PURE__ */ jsx62("ul", { className: "flex flex-col gap-2", children: files.map((f) => /* @__PURE__ */ jsx62(FileUploadItem, { file: f, onRemove, onRetry }, f.id)) })
3493
+ files.length > 0 && /* @__PURE__ */ jsx63("ul", { className: "flex flex-col gap-2", children: files.map((f) => /* @__PURE__ */ jsx63(FileUploadItem, { file: f, onRemove, onRetry }, f.id)) })
3397
3494
  ] });
3398
3495
  }
3399
3496
  );
@@ -3401,14 +3498,14 @@ FileUpload.displayName = "FileUpload";
3401
3498
  function FileUploadItem({ file, onRemove, onRetry }) {
3402
3499
  const isError = file.status === "error";
3403
3500
  const isLoading = file.status === "loading";
3404
- return /* @__PURE__ */ jsxs33("li", { className: cn("flex items-center gap-2.5 rounded-md border p-2.5 text-body-sm", isError ? "border-destructive bg-destructive/5" : "border-input"), children: [
3405
- isLoading ? /* @__PURE__ */ jsx62(Loader2, { className: "size-4 shrink-0 animate-spin text-muted-foreground", "aria-hidden": true }) : isError ? /* @__PURE__ */ jsx62(TriangleAlert3, { className: "size-4 shrink-0 text-destructive", "aria-hidden": true }) : /* @__PURE__ */ jsx62(File, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
3406
- /* @__PURE__ */ jsxs33("div", { className: "min-w-0 flex-1", children: [
3407
- /* @__PURE__ */ jsx62("p", { className: "truncate text-foreground", children: file.name }),
3408
- isError && file.error ? /* @__PURE__ */ jsx62("p", { className: "text-destructive", children: file.error }) : /* @__PURE__ */ jsx62("p", { className: "text-muted-foreground", children: formatBytes(file.size) }),
3409
- isLoading && typeof file.progress === "number" && /* @__PURE__ */ jsx62("div", { className: "mt-1 h-1 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx62("div", { className: "h-full bg-primary transition-[width]", style: { width: `${Math.max(0, Math.min(100, file.progress))}%` } }) })
3501
+ return /* @__PURE__ */ jsxs34("li", { className: cn("flex items-center gap-2.5 rounded-md border p-2.5 text-body-sm", isError ? "border-destructive bg-destructive/5" : "border-input"), children: [
3502
+ isLoading ? /* @__PURE__ */ jsx63(Loader2, { className: "size-4 shrink-0 animate-spin text-muted-foreground", "aria-hidden": true }) : isError ? /* @__PURE__ */ jsx63(TriangleAlert3, { className: "size-4 shrink-0 text-destructive", "aria-hidden": true }) : /* @__PURE__ */ jsx63(File, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
3503
+ /* @__PURE__ */ jsxs34("div", { className: "min-w-0 flex-1", children: [
3504
+ /* @__PURE__ */ jsx63("p", { className: "truncate text-foreground", children: file.name }),
3505
+ isError && file.error ? /* @__PURE__ */ jsx63("p", { className: "text-destructive", children: file.error }) : /* @__PURE__ */ jsx63("p", { className: "text-muted-foreground", children: formatBytes(file.size) }),
3506
+ isLoading && typeof file.progress === "number" && /* @__PURE__ */ jsx63("div", { className: "mt-1 h-1 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx63("div", { className: "h-full bg-primary transition-[width]", style: { width: `${Math.max(0, Math.min(100, file.progress))}%` } }) })
3410
3507
  ] }),
3411
- isError && onRetry && /* @__PURE__ */ jsx62(
3508
+ isError && onRetry && /* @__PURE__ */ jsx63(
3412
3509
  "button",
3413
3510
  {
3414
3511
  type: "button",
@@ -3417,14 +3514,14 @@ function FileUploadItem({ file, onRemove, onRetry }) {
3417
3514
  children: "Retry"
3418
3515
  }
3419
3516
  ),
3420
- onRemove && /* @__PURE__ */ jsx62(
3517
+ onRemove && /* @__PURE__ */ jsx63(
3421
3518
  "button",
3422
3519
  {
3423
3520
  type: "button",
3424
3521
  onClick: () => onRemove(file.id),
3425
3522
  "aria-label": `Remove ${file.name}`,
3426
3523
  className: "shrink-0 rounded-[2px] p-0.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
3427
- children: /* @__PURE__ */ jsx62(X6, { className: "size-3.5" })
3524
+ children: /* @__PURE__ */ jsx63(X7, { className: "size-3.5" })
3428
3525
  }
3429
3526
  )
3430
3527
  ] });
@@ -3432,17 +3529,17 @@ function FileUploadItem({ file, onRemove, onRetry }) {
3432
3529
  FileUploadItem.displayName = "FileUploadItem";
3433
3530
 
3434
3531
  // src/components/date-picker.tsx
3435
- import * as React57 from "react";
3532
+ import * as React58 from "react";
3436
3533
  import { CalendarIcon } from "lucide-react";
3437
3534
  import { format } from "date-fns";
3438
- import { jsx as jsx63, jsxs as jsxs34 } from "react/jsx-runtime";
3439
- var DatePicker = React57.forwardRef(
3535
+ import { jsx as jsx64, jsxs as jsxs35 } from "react/jsx-runtime";
3536
+ var DatePicker = React58.forwardRef(
3440
3537
  ({ value, onChange, placeholder = "Select date", label, helperText, error, disabled, className, formatStr = "PP", calendarProps }, ref) => {
3441
- const [open, setOpen] = React57.useState(false);
3442
- return /* @__PURE__ */ jsxs34("div", { className: cn("flex flex-col gap-1.5 font-sans", className), children: [
3443
- label && /* @__PURE__ */ jsx63("label", { className: "text-label-md font-medium text-foreground", children: label }),
3444
- /* @__PURE__ */ jsxs34(Popover, { open, onOpenChange: setOpen, children: [
3445
- /* @__PURE__ */ jsx63(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs34(
3538
+ const [open, setOpen] = React58.useState(false);
3539
+ return /* @__PURE__ */ jsxs35("div", { className: cn("flex flex-col gap-1.5 font-sans", className), children: [
3540
+ label && /* @__PURE__ */ jsx64("label", { className: "text-label-md font-medium text-foreground", children: label }),
3541
+ /* @__PURE__ */ jsxs35(Popover, { open, onOpenChange: setOpen, children: [
3542
+ /* @__PURE__ */ jsx64(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs35(
3446
3543
  Button,
3447
3544
  {
3448
3545
  ref,
@@ -3451,12 +3548,12 @@ var DatePicker = React57.forwardRef(
3451
3548
  disabled,
3452
3549
  className: cn("w-full justify-start px-3 font-normal", !value && "text-muted-foreground", error && "border-destructive text-destructive"),
3453
3550
  children: [
3454
- /* @__PURE__ */ jsx63(CalendarIcon, { className: "size-4" }),
3551
+ /* @__PURE__ */ jsx64(CalendarIcon, { className: "size-4" }),
3455
3552
  value ? format(value, formatStr) : placeholder
3456
3553
  ]
3457
3554
  }
3458
3555
  ) }),
3459
- /* @__PURE__ */ jsx63(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx63(
3556
+ /* @__PURE__ */ jsx64(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx64(
3460
3557
  Calendar,
3461
3558
  {
3462
3559
  mode: "single",
@@ -3469,21 +3566,21 @@ var DatePicker = React57.forwardRef(
3469
3566
  }
3470
3567
  ) })
3471
3568
  ] }),
3472
- helperText && /* @__PURE__ */ jsx63("p", { className: cn("text-body-sm", error ? "text-destructive" : "text-muted-foreground"), children: helperText })
3569
+ helperText && /* @__PURE__ */ jsx64("p", { className: cn("text-body-sm", error ? "text-destructive" : "text-muted-foreground"), children: helperText })
3473
3570
  ] });
3474
3571
  }
3475
3572
  );
3476
3573
  DatePicker.displayName = "DatePicker";
3477
3574
 
3478
3575
  // src/components/code-block.tsx
3479
- import * as React58 from "react";
3576
+ import * as React59 from "react";
3480
3577
  import { Check as Check7, Copy } from "lucide-react";
3481
- import { jsx as jsx64, jsxs as jsxs35 } from "react/jsx-runtime";
3482
- var CodeBlock = React58.forwardRef(
3578
+ import { jsx as jsx65, jsxs as jsxs36 } from "react/jsx-runtime";
3579
+ var CodeBlock = React59.forwardRef(
3483
3580
  ({ className, code, language, filename, files, hideCopy, ...props }, ref) => {
3484
3581
  const tabs = files && files.length > 0 ? files : [{ name: filename ?? language ?? "", code: code ?? "" }];
3485
- const [active, setActive] = React58.useState(0);
3486
- const [copied, setCopied] = React58.useState(false);
3582
+ const [active, setActive] = React59.useState(0);
3583
+ const [copied, setCopied] = React59.useState(false);
3487
3584
  const current = tabs[active] ?? tabs[0];
3488
3585
  const hasHeader = tabs.length > 1 || !!current.name;
3489
3586
  const copy = async () => {
@@ -3494,9 +3591,9 @@ var CodeBlock = React58.forwardRef(
3494
3591
  } catch {
3495
3592
  }
3496
3593
  };
3497
- return /* @__PURE__ */ jsxs35("div", { ref, className: cn("overflow-hidden rounded-md border border-input bg-muted font-sans", className), ...props, children: [
3498
- hasHeader && /* @__PURE__ */ jsxs35("div", { className: "flex items-center justify-between border-b border-input bg-background px-2", children: [
3499
- /* @__PURE__ */ jsx64("div", { className: "flex", children: tabs.map((t, i) => /* @__PURE__ */ jsx64(
3594
+ return /* @__PURE__ */ jsxs36("div", { ref, className: cn("overflow-hidden rounded-md border border-input bg-muted font-sans", className), ...props, children: [
3595
+ hasHeader && /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between border-b border-input bg-background px-2", children: [
3596
+ /* @__PURE__ */ jsx65("div", { className: "flex", children: tabs.map((t, i) => /* @__PURE__ */ jsx65(
3500
3597
  "button",
3501
3598
  {
3502
3599
  type: "button",
@@ -3509,29 +3606,29 @@ var CodeBlock = React58.forwardRef(
3509
3606
  },
3510
3607
  t.name || i
3511
3608
  )) }),
3512
- !hideCopy && /* @__PURE__ */ jsx64(
3609
+ !hideCopy && /* @__PURE__ */ jsx65(
3513
3610
  "button",
3514
3611
  {
3515
3612
  type: "button",
3516
3613
  onClick: copy,
3517
3614
  "aria-label": "Copy code",
3518
3615
  className: "rounded-[2px] p-1.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
3519
- children: copied ? /* @__PURE__ */ jsx64(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx64(Copy, { className: "size-4" })
3616
+ children: copied ? /* @__PURE__ */ jsx65(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx65(Copy, { className: "size-4" })
3520
3617
  }
3521
3618
  )
3522
3619
  ] }),
3523
- /* @__PURE__ */ jsxs35("div", { className: "relative", children: [
3524
- !hasHeader && !hideCopy && /* @__PURE__ */ jsx64(
3620
+ /* @__PURE__ */ jsxs36("div", { className: "relative", children: [
3621
+ !hasHeader && !hideCopy && /* @__PURE__ */ jsx65(
3525
3622
  "button",
3526
3623
  {
3527
3624
  type: "button",
3528
3625
  onClick: copy,
3529
3626
  "aria-label": "Copy code",
3530
3627
  className: "absolute right-2 top-2 rounded-[2px] p-1.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
3531
- children: copied ? /* @__PURE__ */ jsx64(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx64(Copy, { className: "size-4" })
3628
+ children: copied ? /* @__PURE__ */ jsx65(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx65(Copy, { className: "size-4" })
3532
3629
  }
3533
3630
  ),
3534
- /* @__PURE__ */ jsx64("pre", { className: "overflow-x-auto p-4 text-body-sm text-foreground", children: /* @__PURE__ */ jsx64("code", { children: current.code }) })
3631
+ /* @__PURE__ */ jsx65("pre", { className: "overflow-x-auto p-4 text-body-sm text-foreground", children: /* @__PURE__ */ jsx65("code", { children: current.code }) })
3535
3632
  ] })
3536
3633
  ] });
3537
3634
  }
@@ -3539,18 +3636,18 @@ var CodeBlock = React58.forwardRef(
3539
3636
  CodeBlock.displayName = "CodeBlock";
3540
3637
 
3541
3638
  // src/components/metric.tsx
3542
- import * as React59 from "react";
3639
+ import * as React60 from "react";
3543
3640
  import { ArrowDown, ArrowUp } from "lucide-react";
3544
- import { jsx as jsx65, jsxs as jsxs36 } from "react/jsx-runtime";
3545
- var Metric = React59.forwardRef(
3546
- ({ className, label, value, trend, change, icon, chart, ...props }, ref) => /* @__PURE__ */ jsxs36("div", { ref, className: cn("flex flex-col gap-2 rounded-md border border-input p-4 font-sans", className), ...props, children: [
3547
- /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between", children: [
3548
- /* @__PURE__ */ jsx65("p", { className: "text-body-sm text-muted-foreground", children: label }),
3549
- icon && /* @__PURE__ */ jsx65("span", { className: "text-muted-foreground [&_svg]:size-5", children: icon })
3641
+ import { jsx as jsx66, jsxs as jsxs37 } from "react/jsx-runtime";
3642
+ var Metric = React60.forwardRef(
3643
+ ({ className, label, value, trend, change, icon, chart, ...props }, ref) => /* @__PURE__ */ jsxs37("div", { ref, className: cn("flex flex-col gap-2 rounded-md border border-input p-4 font-sans", className), ...props, children: [
3644
+ /* @__PURE__ */ jsxs37("div", { className: "flex items-center justify-between", children: [
3645
+ /* @__PURE__ */ jsx66("p", { className: "text-body-sm text-muted-foreground", children: label }),
3646
+ icon && /* @__PURE__ */ jsx66("span", { className: "text-muted-foreground [&_svg]:size-5", children: icon })
3550
3647
  ] }),
3551
- /* @__PURE__ */ jsxs36("div", { className: "flex items-end justify-between gap-2", children: [
3552
- /* @__PURE__ */ jsx65("p", { className: "text-headline-sm font-medium text-foreground", children: value }),
3553
- trend && /* @__PURE__ */ jsxs36(
3648
+ /* @__PURE__ */ jsxs37("div", { className: "flex items-end justify-between gap-2", children: [
3649
+ /* @__PURE__ */ jsx66("p", { className: "text-headline-sm font-medium text-foreground", children: value }),
3650
+ trend && /* @__PURE__ */ jsxs37(
3554
3651
  "span",
3555
3652
  {
3556
3653
  className: cn(
@@ -3560,25 +3657,25 @@ var Metric = React59.forwardRef(
3560
3657
  trend === "neutral" && "text-muted-foreground"
3561
3658
  ),
3562
3659
  children: [
3563
- trend === "up" && /* @__PURE__ */ jsx65(ArrowUp, { className: "size-3.5" }),
3564
- trend === "down" && /* @__PURE__ */ jsx65(ArrowDown, { className: "size-3.5" }),
3660
+ trend === "up" && /* @__PURE__ */ jsx66(ArrowUp, { className: "size-3.5" }),
3661
+ trend === "down" && /* @__PURE__ */ jsx66(ArrowDown, { className: "size-3.5" }),
3565
3662
  change
3566
3663
  ]
3567
3664
  }
3568
3665
  )
3569
3666
  ] }),
3570
- chart && /* @__PURE__ */ jsx65("div", { className: "mt-1", children: chart })
3667
+ chart && /* @__PURE__ */ jsx66("div", { className: "mt-1", children: chart })
3571
3668
  ] })
3572
3669
  );
3573
3670
  Metric.displayName = "Metric";
3574
3671
 
3575
3672
  // src/components/number-input.tsx
3576
- import * as React60 from "react";
3673
+ import * as React61 from "react";
3577
3674
  import { Minus as Minus3, Plus } from "lucide-react";
3578
- import { jsx as jsx66, jsxs as jsxs37 } from "react/jsx-runtime";
3579
- var NumberInput = React60.forwardRef(
3675
+ import { jsx as jsx67, jsxs as jsxs38 } from "react/jsx-runtime";
3676
+ var NumberInput = React61.forwardRef(
3580
3677
  ({ className, value, defaultValue = 0, min, max, step = 1, onChange, disabled, ...props }, ref) => {
3581
- const [internal, setInternal] = React60.useState(defaultValue);
3678
+ const [internal, setInternal] = React61.useState(defaultValue);
3582
3679
  const current = value ?? internal;
3583
3680
  const clamp = (n) => {
3584
3681
  let v = n;
@@ -3591,7 +3688,7 @@ var NumberInput = React60.forwardRef(
3591
3688
  setInternal(v);
3592
3689
  onChange?.(v);
3593
3690
  };
3594
- return /* @__PURE__ */ jsxs37(
3691
+ return /* @__PURE__ */ jsxs38(
3595
3692
  "div",
3596
3693
  {
3597
3694
  className: cn(
@@ -3600,7 +3697,7 @@ var NumberInput = React60.forwardRef(
3600
3697
  className
3601
3698
  ),
3602
3699
  children: [
3603
- /* @__PURE__ */ jsx66(
3700
+ /* @__PURE__ */ jsx67(
3604
3701
  "button",
3605
3702
  {
3606
3703
  type: "button",
@@ -3608,10 +3705,10 @@ var NumberInput = React60.forwardRef(
3608
3705
  disabled: disabled || min != null && current <= min,
3609
3706
  onClick: () => set(current - step),
3610
3707
  className: "flex w-9 shrink-0 items-center justify-center text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:bg-accent focus-visible:text-foreground focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
3611
- children: /* @__PURE__ */ jsx66(Minus3, { className: "size-4" })
3708
+ children: /* @__PURE__ */ jsx67(Minus3, { className: "size-4" })
3612
3709
  }
3613
3710
  ),
3614
- /* @__PURE__ */ jsx66(
3711
+ /* @__PURE__ */ jsx67(
3615
3712
  "input",
3616
3713
  {
3617
3714
  ref,
@@ -3630,7 +3727,7 @@ var NumberInput = React60.forwardRef(
3630
3727
  ...props
3631
3728
  }
3632
3729
  ),
3633
- /* @__PURE__ */ jsx66(
3730
+ /* @__PURE__ */ jsx67(
3634
3731
  "button",
3635
3732
  {
3636
3733
  type: "button",
@@ -3638,7 +3735,7 @@ var NumberInput = React60.forwardRef(
3638
3735
  disabled: disabled || max != null && current >= max,
3639
3736
  onClick: () => set(current + step),
3640
3737
  className: "flex w-9 shrink-0 items-center justify-center text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:bg-accent focus-visible:text-foreground focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
3641
- children: /* @__PURE__ */ jsx66(Plus, { className: "size-4" })
3738
+ children: /* @__PURE__ */ jsx67(Plus, { className: "size-4" })
3642
3739
  }
3643
3740
  )
3644
3741
  ]
@@ -3649,20 +3746,20 @@ var NumberInput = React60.forwardRef(
3649
3746
  NumberInput.displayName = "NumberInput";
3650
3747
 
3651
3748
  // src/components/quote.tsx
3652
- import * as React61 from "react";
3653
- import { jsx as jsx67, jsxs as jsxs38 } from "react/jsx-runtime";
3654
- var Quote = React61.forwardRef(
3655
- ({ className, author, authorTitle, avatar, children, ...props }, ref) => /* @__PURE__ */ jsxs38("figure", { ref, className: cn("flex flex-col gap-4 font-sans", className), ...props, children: [
3656
- /* @__PURE__ */ jsxs38("blockquote", { className: "text-title-md font-medium text-foreground", children: [
3749
+ import * as React62 from "react";
3750
+ import { jsx as jsx68, jsxs as jsxs39 } from "react/jsx-runtime";
3751
+ var Quote = React62.forwardRef(
3752
+ ({ className, author, authorTitle, avatar, children, ...props }, ref) => /* @__PURE__ */ jsxs39("figure", { ref, className: cn("flex flex-col gap-4 font-sans", className), ...props, children: [
3753
+ /* @__PURE__ */ jsxs39("blockquote", { className: "text-title-md font-medium text-foreground", children: [
3657
3754
  "\u201C",
3658
3755
  children,
3659
3756
  "\u201D"
3660
3757
  ] }),
3661
- (author || authorTitle) && /* @__PURE__ */ jsxs38("figcaption", { className: "flex items-center gap-3", children: [
3758
+ (author || authorTitle) && /* @__PURE__ */ jsxs39("figcaption", { className: "flex items-center gap-3", children: [
3662
3759
  avatar,
3663
- /* @__PURE__ */ jsxs38("div", { children: [
3664
- author && /* @__PURE__ */ jsx67("p", { className: "text-body-md font-medium text-foreground", children: author }),
3665
- authorTitle && /* @__PURE__ */ jsx67("p", { className: "text-body-sm text-muted-foreground", children: authorTitle })
3760
+ /* @__PURE__ */ jsxs39("div", { children: [
3761
+ author && /* @__PURE__ */ jsx68("p", { className: "text-body-md font-medium text-foreground", children: author }),
3762
+ authorTitle && /* @__PURE__ */ jsx68("p", { className: "text-body-sm text-muted-foreground", children: authorTitle })
3666
3763
  ] })
3667
3764
  ] })
3668
3765
  ] })
@@ -3670,21 +3767,21 @@ var Quote = React61.forwardRef(
3670
3767
  Quote.displayName = "Quote";
3671
3768
 
3672
3769
  // src/components/footer.tsx
3673
- import * as React62 from "react";
3674
- import { jsx as jsx68, jsxs as jsxs39 } from "react/jsx-runtime";
3675
- var Footer = React62.forwardRef(
3676
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx68("footer", { ref, className: cn("w-full border-t border-border bg-background px-6 py-10 font-sans", className), ...props, children })
3770
+ import * as React63 from "react";
3771
+ import { jsx as jsx69, jsxs as jsxs40 } from "react/jsx-runtime";
3772
+ var Footer = React63.forwardRef(
3773
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx69("footer", { ref, className: cn("w-full border-t border-border bg-background px-6 py-10 font-sans", className), ...props, children })
3677
3774
  );
3678
3775
  Footer.displayName = "Footer";
3679
- var FooterColumn = React62.forwardRef(
3680
- ({ className, title, children, ...props }, ref) => /* @__PURE__ */ jsxs39("div", { ref, className: cn("flex flex-col gap-3", className), ...props, children: [
3681
- /* @__PURE__ */ jsx68("p", { className: "text-label-md font-medium text-foreground", children: title }),
3682
- /* @__PURE__ */ jsx68("div", { className: "flex flex-col gap-2", children })
3776
+ var FooterColumn = React63.forwardRef(
3777
+ ({ className, title, children, ...props }, ref) => /* @__PURE__ */ jsxs40("div", { ref, className: cn("flex flex-col gap-3", className), ...props, children: [
3778
+ /* @__PURE__ */ jsx69("p", { className: "text-label-md font-medium text-foreground", children: title }),
3779
+ /* @__PURE__ */ jsx69("div", { className: "flex flex-col gap-2", children })
3683
3780
  ] })
3684
3781
  );
3685
3782
  FooterColumn.displayName = "FooterColumn";
3686
- var FooterLink = React62.forwardRef(
3687
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx68(
3783
+ var FooterLink = React63.forwardRef(
3784
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx69(
3688
3785
  "a",
3689
3786
  {
3690
3787
  ref,
@@ -3697,8 +3794,8 @@ var FooterLink = React62.forwardRef(
3697
3794
  )
3698
3795
  );
3699
3796
  FooterLink.displayName = "FooterLink";
3700
- var FooterBottom = React62.forwardRef(
3701
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx68(
3797
+ var FooterBottom = React63.forwardRef(
3798
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx69(
3702
3799
  "div",
3703
3800
  {
3704
3801
  ref,
@@ -3713,12 +3810,12 @@ var FooterBottom = React62.forwardRef(
3713
3810
  FooterBottom.displayName = "FooterBottom";
3714
3811
 
3715
3812
  // src/components/table-of-contents.tsx
3716
- import * as React63 from "react";
3717
- import { jsx as jsx69 } from "react/jsx-runtime";
3718
- var TableOfContents = React63.forwardRef(
3719
- ({ className, items, active, ...props }, ref) => /* @__PURE__ */ jsx69("nav", { ref, "aria-label": "Table of contents", className: cn("flex flex-col gap-0.5 font-sans", className), ...props, children: items.map((item) => {
3813
+ import * as React64 from "react";
3814
+ import { jsx as jsx70 } from "react/jsx-runtime";
3815
+ var TableOfContents = React64.forwardRef(
3816
+ ({ className, items, active, ...props }, ref) => /* @__PURE__ */ jsx70("nav", { ref, "aria-label": "Table of contents", className: cn("flex flex-col gap-0.5 font-sans", className), ...props, children: items.map((item) => {
3720
3817
  const isActive = item.id === active;
3721
- return /* @__PURE__ */ jsx69(
3818
+ return /* @__PURE__ */ jsx70(
3722
3819
  "a",
3723
3820
  {
3724
3821
  href: `#${item.id}`,
@@ -3754,6 +3851,11 @@ export {
3754
3851
  AlertDialogTitle,
3755
3852
  AlertDialogTrigger,
3756
3853
  AlertTitle,
3854
+ AppBar,
3855
+ AppBarActions,
3856
+ AppBarBrand,
3857
+ AppBarLink,
3858
+ AppBarNav,
3757
3859
  AspectRatio,
3758
3860
  AudioPlayer,
3759
3861
  Avatar,
@@ -4020,6 +4122,7 @@ export {
4020
4122
  textareaVariants,
4021
4123
  toast,
4022
4124
  toggleVariants,
4125
+ useAppBar,
4023
4126
  useFormField,
4024
4127
  useSidebar
4025
4128
  };