@tradalab/lyra 1.7.3 → 1.8.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.
@@ -1380,9 +1380,9 @@ function AccountMenu({
1380
1380
  /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: user.name ?? "\u2014" }),
1381
1381
  user.email ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs", children: user.email }) : null
1382
1382
  ] }),
1383
- /* @__PURE__ */ jsxs(Avatar, { className: "rounded-lg after:rounded-lg", children: [
1384
- user.image ? /* @__PURE__ */ jsx(AvatarImage, { className: "rounded-lg", src: user.image, alt: displayName }) : null,
1385
- /* @__PURE__ */ jsx(AvatarFallback, { className: "rounded-lg", children: initialsOf(user.name ?? user.email) })
1383
+ /* @__PURE__ */ jsxs(Avatar, { className: "rounded-none after:rounded-none", children: [
1384
+ user.image ? /* @__PURE__ */ jsx(AvatarImage, { className: "rounded-none", src: user.image, alt: displayName }) : null,
1385
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "rounded-none", children: initialsOf(user.name ?? user.email) })
1386
1386
  ] })
1387
1387
  ]
1388
1388
  }
@@ -1435,5 +1435,5 @@ function initialsOf(value) {
1435
1435
  }
1436
1436
 
1437
1437
  export { AccountMenu, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, ScrollArea, ScrollBar, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, defaultAccountMenuLabels, initialsOf, useSidebar };
1438
- //# sourceMappingURL=chunk-ENKLOTSE.js.map
1439
- //# sourceMappingURL=chunk-ENKLOTSE.js.map
1438
+ //# sourceMappingURL=chunk-V6TVUMAU.js.map
1439
+ //# sourceMappingURL=chunk-V6TVUMAU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/primitives/avatar.tsx","../src/ui/primitives/breadcrumb.tsx","../src/ui/primitives/separator.tsx","../src/ui/primitives/textarea.tsx","../src/ui/primitives/input-group.tsx","../src/ui/primitives/context-menu.tsx","../src/ui/primitives/scroll-area.tsx","../src/ui/primitives/sheet.tsx","../src/ui/primitives/skeleton.tsx","../src/ui/primitives/tooltip.tsx","../src/ui/primitives/sidebar.tsx","../src/ui/account-menu.tsx"],"names":["AvatarPrimitive","jsx","SeparatorPrimitive","ContextMenuPrimitive","jsxs","ChevronRightIcon","ScrollAreaPrimitive","SheetPrimitive","TooltipPrimitive","open","Slot","cva"],"mappings":"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","file":"chunk-ENKLOTSE.js","sourcesContent":["import * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-xs wrap-break-word text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRightIcon />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","import * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-none border border-input bg-transparent px-2.5 py-2 text-xs transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 md:text-xs dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\nimport { Input } from \"./input.js\"\nimport { Textarea } from \"./textarea.js\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-none border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-1 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-xs font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-none [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-xs shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-none px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"gap-1\",\n \"icon-xs\": \"size-6 rounded-none p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-7 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-xs text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction ContextMenu({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" className={cn(\"select-none\", className)} {...props} />\n}\n\nfunction ContextMenuGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n}\n\nfunction ContextMenuPortal({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n}\n\nfunction ContextMenuSub({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return <ContextMenuPrimitive.RadioGroup data-slot=\"context-menu-radio-group\" {...props} />\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-none bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-2 rounded-none px-2 py-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-none px-2 py-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-none border bg-popover text-popover-foreground shadow-lg duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-none py-2 pr-8 pl-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-none py-2 pr-8 pl-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\"px-2 py-2 text-xs text-muted-foreground data-inset:pl-7\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return <ContextMenuPrimitive.Separator data-slot=\"context-menu-separator\" className={cn(\"-mx-1 h-px bg-border\", className)} {...props} />\n}\n\nfunction ContextMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","import * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-none bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","import * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 text-xs/relaxed duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col bg-popover bg-clip-padding text-xs/relaxed text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"font-heading text-sm font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-xs/relaxed text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { cn } from \"~/utils/cn.js\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-none bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-none bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-none data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-none bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useMobile } from \"~/hooks/use-mobile.js\"\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\nimport { Input } from \"./input.js\"\nimport { Separator } from \"./separator.js\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet.js\"\nimport { Skeleton } from \"./skeleton.js\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip.js\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-none group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-none md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-none px-2 text-xs text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-none p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-none p-2 text-left text-xs ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-xs\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-xs group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-none p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-none px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-none px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-none\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-none px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-xs data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\nimport { CircleUser, LogIn, LogOut, Users } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./primitives/avatar.js\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./primitives/dropdown-menu.js\"\n\nexport type AccountMenuUser = {\n name?: string | null\n email?: string | null\n image?: string | null\n}\n\nexport type AccountMenuLabels = {\n account: string\n guest: string\n signIn: string\n switchAccount: string\n signOut: string\n}\n\n/** Default English labels — spread + override, or reference directly. */\nexport const defaultAccountMenuLabels: AccountMenuLabels = {\n account: \"Account\",\n guest: \"Guest\",\n signIn: \"Sign in\",\n switchAccount: \"Switch account\",\n signOut: \"Sign out\",\n}\n\nexport interface AccountMenuProps {\n /** Current user, or `null`/`undefined` for a guest. */\n user?: AccountMenuUser | null\n /** Override labels — pass translated strings if your app is localized. */\n labels?: Partial<AccountMenuLabels>\n /** Sign-out handler (signed-in only). Item hidden if omitted. */\n onSignOut?: () => void\n /** Switch-account handler (signed-in only). Item hidden if omitted. */\n onSwitchAccount?: () => void\n /** Sign-in handler (guest only). Item hidden if omitted. */\n onSignIn?: () => void\n /** Dropdown alignment. Default `\"end\"`. */\n align?: \"start\" | \"center\" | \"end\"\n /** Extra menu content (e.g. theme/language submenus) above the account actions. */\n children?: React.ReactNode\n}\n\n/**\n * Account dropdown built on lyra's standardized session shape. Signed-in users\n * get an avatar trigger + switch-account / sign-out; guests get a neutral icon +\n * sign-in. All actions are callbacks and all labels are props, so the component\n * stays framework- and i18n-agnostic. Use `children` to inject app preferences\n * (theme, language, …) above the account actions.\n */\nexport function AccountMenu({\n user,\n labels,\n onSignOut,\n onSwitchAccount,\n onSignIn,\n align = \"end\",\n children,\n}: AccountMenuProps) {\n const l = { ...defaultAccountMenuLabels, ...labels }\n const displayName = user?.name ?? user?.email ?? l.account\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n {user ? (\n <button\n type=\"button\"\n aria-label={l.account}\n className={cn(\n \"focus-visible:ring-ring flex items-center gap-3 rounded-none outline-none focus-visible:ring-2\",\n )}\n >\n <span className=\"hidden text-right leading-tight sm:flex sm:flex-col\">\n <span className=\"text-sm font-medium\">{user.name ?? \"—\"}</span>\n {user.email ? (\n <span className=\"text-muted-foreground text-xs\">{user.email}</span>\n ) : null}\n </span>\n <Avatar className=\"rounded-lg after:rounded-lg\">\n {user.image ? (\n <AvatarImage className=\"rounded-lg\" src={user.image} alt={displayName} />\n ) : null}\n <AvatarFallback className=\"rounded-lg\">\n {initialsOf(user.name ?? user.email)}\n </AvatarFallback>\n </Avatar>\n </button>\n ) : (\n <button\n type=\"button\"\n aria-label={l.account}\n className={cn(\n \"focus-visible:ring-ring text-muted-foreground flex items-center gap-2 rounded-none outline-none focus-visible:ring-2\",\n )}\n >\n <span className=\"hidden text-sm sm:inline\">{l.guest}</span>\n <CircleUser className=\"size-7\" />\n </button>\n )}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align={align} className=\"w-56\">\n {user ? (\n <DropdownMenuLabel className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm font-medium leading-tight\">{user.name ?? \"—\"}</span>\n {user.email ? (\n <span className=\"text-muted-foreground text-xs font-normal leading-tight\">\n {user.email}\n </span>\n ) : null}\n </DropdownMenuLabel>\n ) : (\n <DropdownMenuLabel className=\"text-muted-foreground font-normal\">\n {l.guest}\n </DropdownMenuLabel>\n )}\n\n {children ? (\n <>\n <DropdownMenuSeparator />\n {children}\n </>\n ) : null}\n\n <DropdownMenuSeparator />\n\n {user ? (\n <>\n {onSwitchAccount ? (\n <DropdownMenuItem onSelect={onSwitchAccount}>\n <Users className=\"mr-2\" />\n {l.switchAccount}\n </DropdownMenuItem>\n ) : null}\n {onSignOut ? (\n <DropdownMenuItem variant=\"destructive\" onSelect={onSignOut}>\n <LogOut className=\"mr-2\" />\n {l.signOut}\n </DropdownMenuItem>\n ) : null}\n </>\n ) : onSignIn ? (\n <DropdownMenuItem onSelect={onSignIn}>\n <LogIn className=\"mr-2\" />\n {l.signIn}\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Two-letter avatar fallback from a name or email. Shared with shell NavUser. */\nexport function initialsOf(value?: string | null): string {\n if (!value) return \"?\"\n const base = value.includes(\"@\") ? (value.split(\"@\")[0] ?? value) : value\n const parts = base.split(/[\\s._-]+/).filter(Boolean)\n const letters = (parts[0]?.[0] ?? \"\") + (parts[1]?.[0] ?? \"\")\n return (letters || base.slice(0, 2)).toUpperCase()\n}\n"]}
1
+ {"version":3,"sources":["../src/ui/primitives/avatar.tsx","../src/ui/primitives/breadcrumb.tsx","../src/ui/primitives/separator.tsx","../src/ui/primitives/textarea.tsx","../src/ui/primitives/input-group.tsx","../src/ui/primitives/context-menu.tsx","../src/ui/primitives/scroll-area.tsx","../src/ui/primitives/sheet.tsx","../src/ui/primitives/skeleton.tsx","../src/ui/primitives/tooltip.tsx","../src/ui/primitives/sidebar.tsx","../src/ui/account-menu.tsx"],"names":["AvatarPrimitive","jsx","SeparatorPrimitive","ContextMenuPrimitive","jsxs","ChevronRightIcon","ScrollAreaPrimitive","SheetPrimitive","TooltipPrimitive","open","Slot","cva"],"mappings":"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","file":"chunk-V6TVUMAU.js","sourcesContent":["import * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-xs wrap-break-word text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRightIcon />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","import * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-none border border-input bg-transparent px-2.5 py-2 text-xs transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 md:text-xs dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\nimport { Input } from \"./input.js\"\nimport { Textarea } from \"./textarea.js\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-none border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-1 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-xs font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-none [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-xs shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-none px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"gap-1\",\n \"icon-xs\": \"size-6 rounded-none p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-7 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-xs text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction ContextMenu({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" className={cn(\"select-none\", className)} {...props} />\n}\n\nfunction ContextMenuGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n}\n\nfunction ContextMenuPortal({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n}\n\nfunction ContextMenuSub({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return <ContextMenuPrimitive.RadioGroup data-slot=\"context-menu-radio-group\" {...props} />\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-none bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-2 rounded-none px-2 py-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-none px-2 py-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-none border bg-popover text-popover-foreground shadow-lg duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-none py-2 pr-8 pl-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-none py-2 pr-8 pl-2 text-xs outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\"px-2 py-2 text-xs text-muted-foreground data-inset:pl-7\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return <ContextMenuPrimitive.Separator data-slot=\"context-menu-separator\" className={cn(\"-mx-1 h-px bg-border\", className)} {...props} />\n}\n\nfunction ContextMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","import * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-none bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","import * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 text-xs/relaxed duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col bg-popover bg-clip-padding text-xs/relaxed text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"font-heading text-sm font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-xs/relaxed text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { cn } from \"~/utils/cn.js\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-none bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-none bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-none data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-none bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useMobile } from \"~/hooks/use-mobile.js\"\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\nimport { Input } from \"./input.js\"\nimport { Separator } from \"./separator.js\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet.js\"\nimport { Skeleton } from \"./skeleton.js\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip.js\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-none group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-none md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-none px-2 text-xs text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-none p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-none p-2 text-left text-xs ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-xs\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-xs group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-none p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-none px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-none px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-none\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-none px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-xs data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\nimport { CircleUser, LogIn, LogOut, Users } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./primitives/avatar.js\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./primitives/dropdown-menu.js\"\n\nexport type AccountMenuUser = {\n name?: string | null\n email?: string | null\n image?: string | null\n}\n\nexport type AccountMenuLabels = {\n account: string\n guest: string\n signIn: string\n switchAccount: string\n signOut: string\n}\n\n/** Default English labels — spread + override, or reference directly. */\nexport const defaultAccountMenuLabels: AccountMenuLabels = {\n account: \"Account\",\n guest: \"Guest\",\n signIn: \"Sign in\",\n switchAccount: \"Switch account\",\n signOut: \"Sign out\",\n}\n\nexport interface AccountMenuProps {\n /** Current user, or `null`/`undefined` for a guest. */\n user?: AccountMenuUser | null\n /** Override labels — pass translated strings if your app is localized. */\n labels?: Partial<AccountMenuLabels>\n /** Sign-out handler (signed-in only). Item hidden if omitted. */\n onSignOut?: () => void\n /** Switch-account handler (signed-in only). Item hidden if omitted. */\n onSwitchAccount?: () => void\n /** Sign-in handler (guest only). Item hidden if omitted. */\n onSignIn?: () => void\n /** Dropdown alignment. Default `\"end\"`. */\n align?: \"start\" | \"center\" | \"end\"\n /** Extra menu content (e.g. theme/language submenus) above the account actions. */\n children?: React.ReactNode\n}\n\n/**\n * Account dropdown built on lyra's standardized session shape. Signed-in users\n * get an avatar trigger + switch-account / sign-out; guests get a neutral icon +\n * sign-in. All actions are callbacks and all labels are props, so the component\n * stays framework- and i18n-agnostic. Use `children` to inject app preferences\n * (theme, language, …) above the account actions.\n */\nexport function AccountMenu({\n user,\n labels,\n onSignOut,\n onSwitchAccount,\n onSignIn,\n align = \"end\",\n children,\n}: AccountMenuProps) {\n const l = { ...defaultAccountMenuLabels, ...labels }\n const displayName = user?.name ?? user?.email ?? l.account\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n {user ? (\n <button\n type=\"button\"\n aria-label={l.account}\n className={cn(\n \"focus-visible:ring-ring flex items-center gap-3 rounded-none outline-none focus-visible:ring-2\",\n )}\n >\n <span className=\"hidden text-right leading-tight sm:flex sm:flex-col\">\n <span className=\"text-sm font-medium\">{user.name ?? \"—\"}</span>\n {user.email ? (\n <span className=\"text-muted-foreground text-xs\">{user.email}</span>\n ) : null}\n </span>\n <Avatar className=\"rounded-none after:rounded-none\">\n {user.image ? (\n <AvatarImage className=\"rounded-none\" src={user.image} alt={displayName} />\n ) : null}\n <AvatarFallback className=\"rounded-none\">\n {initialsOf(user.name ?? user.email)}\n </AvatarFallback>\n </Avatar>\n </button>\n ) : (\n <button\n type=\"button\"\n aria-label={l.account}\n className={cn(\n \"focus-visible:ring-ring text-muted-foreground flex items-center gap-2 rounded-none outline-none focus-visible:ring-2\",\n )}\n >\n <span className=\"hidden text-sm sm:inline\">{l.guest}</span>\n <CircleUser className=\"size-7\" />\n </button>\n )}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align={align} className=\"w-56\">\n {user ? (\n <DropdownMenuLabel className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm font-medium leading-tight\">{user.name ?? \"—\"}</span>\n {user.email ? (\n <span className=\"text-muted-foreground text-xs font-normal leading-tight\">\n {user.email}\n </span>\n ) : null}\n </DropdownMenuLabel>\n ) : (\n <DropdownMenuLabel className=\"text-muted-foreground font-normal\">\n {l.guest}\n </DropdownMenuLabel>\n )}\n\n {children ? (\n <>\n <DropdownMenuSeparator />\n {children}\n </>\n ) : null}\n\n <DropdownMenuSeparator />\n\n {user ? (\n <>\n {onSwitchAccount ? (\n <DropdownMenuItem onSelect={onSwitchAccount}>\n <Users className=\"mr-2\" />\n {l.switchAccount}\n </DropdownMenuItem>\n ) : null}\n {onSignOut ? (\n <DropdownMenuItem variant=\"destructive\" onSelect={onSignOut}>\n <LogOut className=\"mr-2\" />\n {l.signOut}\n </DropdownMenuItem>\n ) : null}\n </>\n ) : onSignIn ? (\n <DropdownMenuItem onSelect={onSignIn}>\n <LogIn className=\"mr-2\" />\n {l.signIn}\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Two-letter avatar fallback from a name or email. Shared with shell NavUser. */\nexport function initialsOf(value?: string | null): string {\n if (!value) return \"?\"\n const base = value.includes(\"@\") ? (value.split(\"@\")[0] ?? value) : value\n const parts = base.split(/[\\s._-]+/).filter(Boolean)\n const letters = (parts[0]?.[0] ?? \"\") + (parts[1]?.[0] ?? \"\")\n return (letters || base.slice(0, 2)).toUpperCase()\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ComponentProps, ReactNode } from 'react';
3
3
  import { S as SidebarProvider, a as SidebarInset, b as Sidebar, A as AccountMenuUser, c as AccountMenuLabels, B as Breadcrumb } from '../breadcrumb-CgEcSonR.js';
4
+ import { IconName } from 'lucide-react/dynamic';
4
5
  import 'class-variance-authority/types';
5
6
  import 'class-variance-authority';
6
7
  import 'radix-ui';
@@ -406,4 +407,25 @@ declare function AppTile({ app }: {
406
407
  app: AppGridItem;
407
408
  }): React.JSX.Element;
408
409
 
409
- export { AppGrid, type AppGridGroup, type AppGridItem, type AppGridProps, AppShell, AppShellBody, AppShellHeader, AppShellMain, type AppShellProps, AppTile, Breadcrumbs, type BreadcrumbsProps, type MatchMode, NavBrand, type NavBrandApp, type NavBrandProps, NavGroup, type NavGroupProps, type NavIcon, NavItem, type NavItemProps, NavSection, type NavSectionProps, NavUser, type NavUserProps, type NavUserThemeLabels, SidebarDock, SidebarPanel, StackedSidebar, TabBar, type TabBarLabels, type TabBarProps, type TabItem, type UseActiveRoute, defaultAppGridLabels, defaultNavBrandAppsLabel, defaultNavUserThemeLabels, defaultTabBarLabels, useActiveRoute };
410
+ /** Every lucide icon name (kebab-case) — the icon picker's source of truth. */
411
+ declare const APP_ICON_NAMES: readonly IconName[];
412
+ /** Normalize a stored name to lucide's kebab-case ("HardDrive" → "hard-drive"). */
413
+ declare function toIconName(name: string): string;
414
+ /** True when `name` resolves to a known lucide icon. */
415
+ declare function isLucideIcon(name: string): boolean;
416
+ /** Accent palette (tailwind-500 hues) — read well on light + dark surfaces. */
417
+ declare const APP_COLORS: string[];
418
+ declare function isIconUrl(s: string): boolean;
419
+ interface AppGlyphProps {
420
+ /** Lucide icon name, image URL, or empty (→ monogram). */
421
+ icon?: string;
422
+ /** Hex accent color; "" → theme default. */
423
+ color?: string;
424
+ /** App name — the monogram fallback + a11y. */
425
+ name?: string;
426
+ className?: string;
427
+ }
428
+ /** The colored glyph for an app: image (URL), lucide icon (name), or monogram. */
429
+ declare function AppGlyph({ icon, color, name, className }: AppGlyphProps): React.JSX.Element;
430
+
431
+ export { APP_COLORS, APP_ICON_NAMES, AppGlyph, type AppGlyphProps, AppGrid, type AppGridGroup, type AppGridItem, type AppGridProps, AppShell, AppShellBody, AppShellHeader, AppShellMain, type AppShellProps, AppTile, Breadcrumbs, type BreadcrumbsProps, type MatchMode, NavBrand, type NavBrandApp, type NavBrandProps, NavGroup, type NavGroupProps, type NavIcon, NavItem, type NavItemProps, NavSection, type NavSectionProps, NavUser, type NavUserProps, type NavUserThemeLabels, SidebarDock, SidebarPanel, StackedSidebar, TabBar, type TabBarLabels, type TabBarProps, type TabItem, type UseActiveRoute, defaultAppGridLabels, defaultNavBrandAppsLabel, defaultNavUserThemeLabels, defaultTabBarLabels, isIconUrl, isLucideIcon, toIconName, useActiveRoute };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { SidebarInset, SidebarProvider, Sidebar, SidebarGroup, SidebarGroupLabel, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, useSidebar, defaultAccountMenuLabels, Avatar, AvatarImage, AvatarFallback, initialsOf, ScrollArea, ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ScrollBar, Breadcrumb, BreadcrumbList, BreadcrumbSeparator, BreadcrumbItem, BreadcrumbPage, BreadcrumbLink, InputGroup, InputGroupAddon, InputGroupInput } from '../chunk-ENKLOTSE.js';
2
+ import { SidebarInset, SidebarProvider, Sidebar, SidebarGroup, SidebarGroupLabel, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, useSidebar, defaultAccountMenuLabels, Avatar, AvatarImage, AvatarFallback, initialsOf, ScrollArea, ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ScrollBar, Breadcrumb, BreadcrumbList, BreadcrumbSeparator, BreadcrumbItem, BreadcrumbPage, BreadcrumbLink, InputGroup, InputGroupAddon, InputGroupInput } from '../chunk-V6TVUMAU.js';
3
3
  import '../chunk-QYA2HGKW.js';
4
4
  import { Card, CardTitle, CardDescription } from '../chunk-ZG5ZPKFL.js';
5
5
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, DropdownMenuRadioGroup, DropdownMenuRadioItem } from '../chunk-SQA4ILAK.js';
@@ -11,6 +11,7 @@ import { usePathname } from 'next/navigation';
11
11
  import { ChevronsUpDown, CircleUser, Palette, Sun, Moon, Monitor, UserRoundCog, LogOut, LogIn, Pin, X, PinOff, ListX, Trash2, ChevronDown, Search } from 'lucide-react';
12
12
  import { useTheme } from 'next-themes';
13
13
  import { useRef, useEffect, Fragment as Fragment$1 } from 'react';
14
+ import { iconNames, DynamicIcon } from 'lucide-react/dynamic';
14
15
 
15
16
  function AppShell({ children, ...rest }) {
16
17
  return /* @__PURE__ */ jsx(SidebarProvider, { ...rest, children });
@@ -207,9 +208,9 @@ function NavUser({
207
208
  if (!user && !onSignIn) return null;
208
209
  const name = user ? user.name ?? user.email ?? l.account : l.guest;
209
210
  const email = user?.email ?? "";
210
- const avatar = /* @__PURE__ */ jsxs(Avatar, { className: "size-8 rounded-lg after:rounded-lg", children: [
211
- user?.image ? /* @__PURE__ */ jsx(AvatarImage, { className: "rounded-lg", src: user.image, alt: name }) : null,
212
- /* @__PURE__ */ jsx(AvatarFallback, { className: "rounded-lg", children: user ? initialsOf(name) : /* @__PURE__ */ jsx(CircleUser, { className: "size-4" }) })
211
+ const avatar = /* @__PURE__ */ jsxs(Avatar, { className: "size-8 rounded-none after:rounded-none", children: [
212
+ user?.image ? /* @__PURE__ */ jsx(AvatarImage, { className: "rounded-none", src: user.image, alt: name }) : null,
213
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "rounded-none", children: user ? initialsOf(name) : /* @__PURE__ */ jsx(CircleUser, { className: "size-4" }) })
213
214
  ] });
214
215
  const themeSubmenu = showTheme ? /* @__PURE__ */ jsxs(Fragment, { children: [
215
216
  /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
@@ -573,7 +574,75 @@ function AppTile({ app }) {
573
574
  }
574
575
  );
575
576
  }
577
+ var APP_ICON_NAMES = iconNames;
578
+ var ICON_NAME_SET = new Set(iconNames);
579
+ function toIconName(name) {
580
+ return name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
581
+ }
582
+ function isLucideIcon(name) {
583
+ return ICON_NAME_SET.has(toIconName(name));
584
+ }
585
+ var APP_COLORS = [
586
+ "#64748b",
587
+ "#ef4444",
588
+ "#f97316",
589
+ "#f59e0b",
590
+ "#eab308",
591
+ "#22c55e",
592
+ "#10b981",
593
+ "#14b8a6",
594
+ "#06b6d4",
595
+ "#3b82f6",
596
+ "#6366f1",
597
+ "#8b5cf6",
598
+ "#a855f7",
599
+ "#ec4899",
600
+ "#f43f5e"
601
+ ];
602
+ function isIconUrl(s) {
603
+ return /^(https?:)?\/\//.test(s) || s.startsWith("/") || s.startsWith("data:");
604
+ }
605
+ function hexA(hex, alpha) {
606
+ const a = Math.round(alpha * 255).toString(16).padStart(2, "0");
607
+ return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}${a}` : hex;
608
+ }
609
+ function AppGlyph({ icon, color, name, className }) {
610
+ const box = cn("flex size-9 shrink-0 items-center justify-center rounded-none", className);
611
+ if (icon && isIconUrl(icon)) {
612
+ return /* @__PURE__ */ jsx(
613
+ "span",
614
+ {
615
+ "aria-hidden": true,
616
+ className: cn(box, "bg-muted bg-cover bg-center"),
617
+ style: { backgroundImage: `url("${encodeURI(icon)}")` }
618
+ }
619
+ );
620
+ }
621
+ const tint = color ? { backgroundColor: hexA(color, 0.14) } : void 0;
622
+ const fg = color ? { color } : void 0;
623
+ const iconName = icon ? toIconName(icon) : "";
624
+ if (iconName && ICON_NAME_SET.has(iconName)) {
625
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn(box, !color && "bg-primary/10"), style: tint, children: /* @__PURE__ */ jsx(
626
+ DynamicIcon,
627
+ {
628
+ name: iconName,
629
+ className: cn("size-5", !color && "text-primary"),
630
+ style: fg
631
+ }
632
+ ) });
633
+ }
634
+ const ch = (name || icon || "?").charAt(0).toUpperCase();
635
+ return /* @__PURE__ */ jsx(
636
+ "span",
637
+ {
638
+ "aria-hidden": true,
639
+ className: cn(box, "text-sm font-semibold", !color && "bg-primary/10 text-primary"),
640
+ style: color ? { ...tint, ...fg } : void 0,
641
+ children: ch
642
+ }
643
+ );
644
+ }
576
645
 
577
- export { AppGrid, AppShell, AppShellBody, AppShellHeader, AppShellMain, AppTile, Breadcrumbs, NavBrand, NavGroup, NavItem, NavSection, NavUser, SidebarDock, SidebarPanel, StackedSidebar, TabBar, defaultAppGridLabels, defaultNavBrandAppsLabel, defaultNavUserThemeLabels, defaultTabBarLabels, useActiveRoute };
646
+ export { APP_COLORS, APP_ICON_NAMES, AppGlyph, AppGrid, AppShell, AppShellBody, AppShellHeader, AppShellMain, AppTile, Breadcrumbs, NavBrand, NavGroup, NavItem, NavSection, NavUser, SidebarDock, SidebarPanel, StackedSidebar, TabBar, defaultAppGridLabels, defaultNavBrandAppsLabel, defaultNavUserThemeLabels, defaultTabBarLabels, isIconUrl, isLucideIcon, toIconName, useActiveRoute };
578
647
  //# sourceMappingURL=index.js.map
579
648
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shell/app-shell.tsx","../../src/shell/stacked-sidebar.tsx","../../src/shell/nav-group.tsx","../../src/shell/use-active-route.ts","../../src/shell/nav-item.tsx","../../src/shell/nav-section.tsx","../../src/shell/nav-brand.tsx","../../src/shell/nav-user.tsx","../../src/shell/tab-bar.tsx","../../src/shell/breadcrumbs.tsx","../../src/shell/app-grid.tsx"],"names":["jsx","jsxs","Fragment","ChevronsUpDown","Link"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\"\n\nimport type { ComponentProps, ReactNode } from \"react\"\nimport {\n SidebarInset,\n SidebarProvider,\n} from \"~/ui/primitives/sidebar.js\"\nimport { cn } from \"~/utils/cn.js\"\n\nexport interface AppShellProps\n extends Omit<ComponentProps<typeof SidebarProvider>, \"children\"> {\n children: ReactNode\n}\n\n/**\n * App shell composition root. Wires `SidebarProvider`. Pair with\n * `<Sidebar>` from `@tradalab/lyra/ui` and `<AppShellMain>` for the\n * right-hand pane.\n *\n * @example\n * import { AppShell, AppShellMain, AppShellHeader, AppShellBody, NavGroup, NavItem, Breadcrumbs } from \"@tradalab/lyra/shell\"\n * import { Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarTrigger } from \"@tradalab/lyra/ui\"\n *\n * <AppShell>\n * <Sidebar collapsible=\"icon\">\n * <SidebarHeader>{logo}</SidebarHeader>\n * <SidebarContent>\n * <NavGroup label=\"Primitives\">{...}</NavGroup>\n * </SidebarContent>\n * <SidebarFooter>{user}</SidebarFooter>\n * </Sidebar>\n * <AppShellMain>\n * <AppShellHeader><SidebarTrigger /><Breadcrumbs /></AppShellHeader>\n * <AppShellBody>{children}</AppShellBody>\n * </AppShellMain>\n * </AppShell>\n */\nexport function AppShell({ children, ...rest }: AppShellProps) {\n return <SidebarProvider {...rest}>{children}</SidebarProvider>\n}\n\n/** Right-hand pane container. Alias for `SidebarInset`. */\nexport const AppShellMain = SidebarInset\n\n/** Top bar inside `<AppShellMain>`. Standardizes h-12 + border-b + flex row. */\nexport function AppShellHeader({\n className,\n children,\n ...rest\n}: ComponentProps<\"header\">) {\n return (\n <header\n className={cn(\n \"flex h-12 shrink-0 items-center gap-2 border-b px-3\",\n className,\n )}\n {...rest}\n >\n {children}\n </header>\n )\n}\n\n/** Scroll body inside `<AppShellMain>`. Sibling of `<AppShellHeader>`. */\nexport function AppShellBody({\n className,\n children,\n ...rest\n}: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex-1 overflow-auto\", className)} {...rest}>\n {children}\n </div>\n )\n}\n","\"use client\"\n\nimport type { ComponentProps } from \"react\"\nimport { Sidebar } from \"~/ui/primitives/sidebar.js\"\nimport { cn } from \"~/utils/cn.js\"\n\n/**\n * Dual / stacked sidebar wrapper — an icon rail plus one or more content\n * panels rendered side-by-side inside a single `<Sidebar>`. This is the\n * shadcn \"sidebar-07\" pattern.\n *\n * The `*:data-[sidebar=sidebar]:flex-row` trick lays the inner\n * `[data-sidebar=sidebar]` wrappers of the nested {@link SidebarDock} /\n * {@link SidebarPanel} columns out horizontally. `variant`/`collapsible`\n * default to `\"sidebar\"`/`\"icon\"` but can be overridden.\n *\n * @example\n * import { AppShell, AppShellMain, StackedSidebar, SidebarDock, SidebarPanel } from \"@tradalab/lyra/shell\"\n * import { SidebarHeader, SidebarContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton } from \"@tradalab/lyra/ui\"\n *\n * <AppShell>\n * <StackedSidebar>\n * <SidebarDock>\n * <SidebarHeader>{logo}</SidebarHeader>\n * <SidebarContent>{iconButtons}</SidebarContent>\n * </SidebarDock>\n * {tab === \"files\" ? <SidebarPanel>{tree}</SidebarPanel> : null}\n * </StackedSidebar>\n * <AppShellMain>{children}</AppShellMain>\n * </AppShell>\n */\nexport function StackedSidebar({\n className,\n ...rest\n}: ComponentProps<typeof Sidebar>) {\n return (\n <Sidebar\n variant=\"sidebar\"\n collapsible=\"icon\"\n {...rest}\n className={cn(\n \"overflow-hidden *:data-[sidebar=sidebar]:flex-row\",\n className,\n )}\n />\n )\n}\n\n/**\n * Narrow icon-rail column inside a {@link StackedSidebar}. Fixed to the icon\n * width, never collapses on its own (the parent `StackedSidebar` owns the\n * icon-mode toggle).\n *\n * Named `SidebarDock` — not `SidebarRail` — because `SidebarRail` already\n * exists in `@tradalab/lyra/ui` as shadcn's drag-to-resize edge handle.\n */\nexport function SidebarDock({\n className,\n ...rest\n}: ComponentProps<typeof Sidebar>) {\n return (\n <Sidebar\n {...rest}\n collapsible=\"none\"\n className={cn(\n \"w-[calc(var(--sidebar-width-icon)+1px)]! overflow-hidden border-r\",\n className,\n )}\n />\n )\n}\n\n/**\n * Wider content column inside a {@link StackedSidebar} (tree, list, …).\n * Fills remaining width; render conditionally to show/hide per app state.\n */\nexport function SidebarPanel({\n className,\n ...rest\n}: ComponentProps<typeof Sidebar>) {\n return (\n <Sidebar\n {...rest}\n collapsible=\"none\"\n className={cn(\"flex-1 overflow-hidden\", className)}\n />\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarMenu,\n} from \"~/ui/primitives/sidebar.js\"\n\nexport interface NavGroupProps {\n label?: ReactNode\n children: ReactNode\n}\n\nexport function NavGroup({ label, children }: NavGroupProps) {\n return (\n <SidebarGroup>\n {label != null ? <SidebarGroupLabel>{label}</SidebarGroupLabel> : null}\n <SidebarGroupContent>\n <SidebarMenu>{children}</SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n )\n}\n","\"use client\"\n\nimport { usePathname } from \"next/navigation\"\n\nexport type MatchMode = \"exact\" | \"prefix\"\n\nexport interface UseActiveRoute {\n pathname: string\n isActive: (href: string, mode?: MatchMode) => boolean\n}\n\n/**\n * App-Router pathname helper. Default `mode` is `\"prefix\"`.\n *\n * Root (`/`) is always exact-matched regardless of `mode` — otherwise the\n * root nav item would light up on every nested page.\n */\nexport function useActiveRoute(): UseActiveRoute {\n const pathname = usePathname() ?? \"/\"\n return {\n pathname,\n isActive: (href, mode = \"prefix\") => {\n if (mode === \"exact\" || href === \"/\") return pathname === href\n return pathname === href || pathname.startsWith(`${href}/`)\n },\n }\n}\n","\"use client\"\n\nimport Link from \"next/link\"\nimport type { ReactNode } from \"react\"\nimport {\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"~/ui/primitives/sidebar.js\"\nimport { useActiveRoute, type MatchMode } from \"./use-active-route.js\"\n\nexport type NavIcon = ReactNode\n\nexport interface NavItemProps {\n href: string\n label: string\n /** Pre-rendered icon element, e.g. `<Globe />`. Element form so the prop is serializable across the RSC boundary. */\n icon?: NavIcon\n /** Sidebar tooltip; visible in collapsed icon mode. */\n tooltip?: string\n /** Default `\"prefix\"` — matches `href` and any nested path. */\n matchMode?: MatchMode\n}\n\n/** Sidebar nav row. Must be rendered inside a {@link NavGroup}. */\nexport function NavItem({\n href,\n label,\n icon,\n tooltip,\n matchMode = \"prefix\",\n}: NavItemProps) {\n const { isActive } = useActiveRoute()\n return (\n <SidebarMenuItem>\n <SidebarMenuButton\n asChild\n isActive={isActive(href, matchMode)}\n tooltip={tooltip}\n >\n <Link href={href}>\n {icon}\n <span>{label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { NavGroup } from \"./nav-group.js\"\nimport { NavItem, type NavItemProps } from \"./nav-item.js\"\n\nexport interface NavSectionProps {\n /** Optional group heading. */\n label?: ReactNode\n /** Nav rows — each rendered as a {@link NavItem}. */\n items: NavItemProps[]\n}\n\n/**\n * Config-driven convenience over {@link NavGroup} + {@link NavItem}: pass a\n * data array instead of hand-mapping JSX. For dynamic or conditional rows,\n * compose `NavGroup`/`NavItem` directly.\n *\n * @example\n * const NAV = [\n * { href: \"/files\", label: \"Files\", icon: <Folder /> },\n * { href: \"/trash\", label: \"Trash\", icon: <Trash2 /> },\n * ]\n * <NavSection label=\"Workspace\" items={NAV} />\n */\nexport function NavSection({ label, items }: NavSectionProps) {\n return (\n <NavGroup label={label}>\n {items.map((item) => (\n <NavItem key={item.href} {...item} />\n ))}\n </NavGroup>\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { ChevronsUpDown } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"~/ui/primitives/dropdown-menu.js\"\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"~/ui/primitives/sidebar.js\"\n\n/** An application shown in the {@link NavBrand} header / switcher. */\nexport interface NavBrandApp {\n /** Display name. */\n name: string\n /**\n * Pre-rendered icon/logo element, e.g. `<Boxes />`. Element form (not a\n * component reference) so the prop stays serializable across the RSC\n * boundary — same convention as {@link NavItem}'s `icon`.\n */\n icon: ReactNode\n /** Navigation target. Usually an absolute cross-app URL (full navigation). */\n href: string\n /** Optional secondary line under the name (tagline / domain). */\n description?: string\n}\n\nexport interface NavBrandProps {\n /** The current app, rendered in the sidebar header. */\n app: NavBrandApp\n /**\n * Other apps to switch to. When omitted or empty the header renders as a\n * plain link to `app.href` (no dropdown, no chevron).\n */\n apps?: NavBrandApp[]\n /** Heading above the app list in the dropdown. Default `\"Applications\"`. */\n appsLabel?: string\n /** Extra menu content appended below the app list (e.g. an \"Add app\" row). */\n children?: ReactNode\n}\n\n/** Default English heading for the switcher's app list — override for i18n. */\nexport const defaultNavBrandAppsLabel = \"Applications\"\n\n/** Icon tile + name/description shown inside the header button. */\nfunction BrandContent({ app }: { app: NavBrandApp }) {\n return (\n <>\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-none [&_svg]:size-4\">\n {app.icon}\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{app.name}</span>\n {app.description ? (\n <span className=\"text-muted-foreground truncate text-xs\">\n {app.description}\n </span>\n ) : null}\n </div>\n </>\n )\n}\n\n/**\n * Sidebar-header brand block with an optional app switcher — the standardized\n * `SidebarHeader` content for app shells (pairs with {@link NavUser} in the\n * footer). Presentational: the app owns the config, icons, and labels (same\n * split as {@link TabBar}).\n *\n * With `apps`, the header is a dropdown trigger (chevron) listing the other\n * apps as links; without it, the header is a plain link to `app.href`. Cross-app\n * links use a plain `<a>` so switching does a full navigation.\n *\n * Must render inside an `AppShell`/`SidebarProvider`, and below a\n * `TooltipProvider` (the collapsed-mode tooltip needs one — app root providers\n * normally mount it).\n *\n * @example\n * import { NavBrand } from \"@tradalab/lyra/shell\"\n * import { SidebarHeader } from \"@tradalab/lyra/ui\"\n * import { Boxes, HardDrive, ShieldCheck } from \"lucide-react\"\n *\n * <SidebarHeader>\n * <NavBrand\n * app={{ name: \"Admin\", description: \"Platform console\", icon: <ShieldCheck />, href: \"/\" }}\n * apps={[\n * { name: \"Drive\", icon: <HardDrive />, href: \"https://drive.tradalab.com\" },\n * { name: \"Toolbox\", icon: <Boxes />, href: \"https://toolbox.tradalab.com\" },\n * ]}\n * />\n * </SidebarHeader>\n */\nexport function NavBrand({\n app,\n apps,\n appsLabel = defaultNavBrandAppsLabel,\n children,\n}: NavBrandProps) {\n const { isMobile } = useSidebar()\n const hasSwitcher = (apps?.length ?? 0) > 0 || children != null\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n {hasSwitcher ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n tooltip={app.name}\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n >\n <BrandContent app={app} />\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-none\"\n align=\"start\"\n side={isMobile ? \"bottom\" : \"right\"}\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"text-muted-foreground text-xs\">\n {appsLabel}\n </DropdownMenuLabel>\n {apps?.map((item) => (\n <DropdownMenuItem key={item.href} asChild className=\"gap-2 p-2\">\n <a href={item.href}>\n <div className=\"flex size-6 items-center justify-center rounded-none border [&_svg]:size-3.5\">\n {item.icon}\n </div>\n <span className=\"truncate\">{item.name}</span>\n </a>\n </DropdownMenuItem>\n ))}\n {children ? (\n <>\n <DropdownMenuSeparator />\n {children}\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <SidebarMenuButton size=\"lg\" asChild tooltip={app.name}>\n <a href={app.href}>\n <BrandContent app={app} />\n </a>\n </SidebarMenuButton>\n )}\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport {\n ChevronsUpDown,\n CircleUser,\n LogIn,\n LogOut,\n Monitor,\n Moon,\n Palette,\n Sun,\n UserRoundCog,\n} from \"lucide-react\"\nimport { useTheme } from \"next-themes\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"~/ui/primitives/avatar.js\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"~/ui/primitives/dropdown-menu.js\"\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"~/ui/primitives/sidebar.js\"\nimport {\n defaultAccountMenuLabels,\n initialsOf,\n type AccountMenuLabels,\n type AccountMenuUser,\n} from \"~/ui/account-menu.js\"\n\nexport interface NavUserThemeLabels {\n theme: string\n light: string\n dark: string\n system: string\n}\n\n/** Default English theme-submenu labels — spread + override for i18n. */\nexport const defaultNavUserThemeLabels: NavUserThemeLabels = {\n theme: \"Theme\",\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n}\n\nexport interface NavUserProps {\n /**\n * Signed-in user. When `null`/`undefined`, renders a guest menu (icon +\n * theme + Sign in) if `onSignIn` is set, otherwise renders nothing.\n */\n user?: AccountMenuUser | null\n /** Account-action labels — reuses lyra's {@link AccountMenuLabels}. */\n labels?: Partial<AccountMenuLabels>\n /** Switch-account handler (signed-in only). Item hidden if omitted. */\n onSwitchAccount?: () => void\n /** Sign-out handler (signed-in only). Item hidden if omitted. */\n onSignOut?: () => void\n /**\n * Sign-in handler (guest only). When set, a null `user` renders the guest\n * menu with a Sign in action instead of rendering nothing.\n */\n onSignIn?: () => void\n /** Render the light/dark/system theme submenu. Default `true`. */\n showTheme?: boolean\n /** Theme-submenu labels. */\n themeLabels?: Partial<NavUserThemeLabels>\n /** Extra menu content inserted below the theme submenu. */\n children?: ReactNode\n}\n\nconst THEMES = [\n { value: \"light\", key: \"light\", icon: Sun },\n { value: \"dark\", key: \"dark\", icon: Moon },\n { value: \"system\", key: \"system\", icon: Monitor },\n] as const\n\n/**\n * Sidebar-footer account menu — the standardized NavUser for app shells.\n * Avatar trigger (size `lg`) + name/email opening a dropdown with an optional\n * theme switcher and switch-account / sign-out actions. Auth flows stay in the\n * app (callbacks); labels are props for i18n.\n *\n * Differs from {@link AccountMenu} in `@tradalab/lyra/ui`: that one is a\n * generic header dropdown; this is styled for the collapsible sidebar footer\n * and follows `useSidebar()` for mobile placement.\n *\n * Must render inside an `AppShell`/SidebarProvider, and below a\n * `TooltipProvider` (the avatar button's collapsed-mode tooltip requires one —\n * app root providers normally mount it). The theme submenu needs a\n * `next-themes` provider mounted (it no-ops without one); pass\n * `showTheme={false}` for apps with a fixed theme.\n *\n * @example\n * import { NavUser } from \"@tradalab/lyra/shell\"\n * import { SidebarFooter } from \"@tradalab/lyra/ui\"\n *\n * <SidebarFooter>\n * <NavUser\n * user={session.user}\n * onSwitchAccount={() => signIn(\"zitadel\", { redirectTo: \"/\" }, { prompt: \"select_account\" })}\n * onSignOut={() => signOut({ redirectTo: \"/\" })}\n * />\n * </SidebarFooter>\n */\nexport function NavUser({\n user,\n labels,\n onSwitchAccount,\n onSignOut,\n onSignIn,\n showTheme = true,\n themeLabels,\n children,\n}: NavUserProps) {\n const { isMobile } = useSidebar()\n const { theme, setTheme } = useTheme()\n const l = { ...defaultAccountMenuLabels, ...labels }\n const t = { ...defaultNavUserThemeLabels, ...themeLabels }\n\n // Guests render nothing unless a sign-in handler opts them into a guest menu.\n if (!user && !onSignIn) return null\n\n const name = user ? (user.name ?? user.email ?? l.account) : l.guest\n const email = user?.email ?? \"\"\n\n const avatar = (\n <Avatar className=\"size-8 rounded-lg after:rounded-lg\">\n {user?.image ? (\n <AvatarImage className=\"rounded-lg\" src={user.image} alt={name} />\n ) : null}\n <AvatarFallback className=\"rounded-lg\">\n {user ? initialsOf(name) : <CircleUser className=\"size-4\" />}\n </AvatarFallback>\n </Avatar>\n )\n\n const themeSubmenu = showTheme ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Palette className=\"mr-2 size-4\" />\n {t.theme}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuRadioGroup value={theme ?? \"system\"} onValueChange={setTheme}>\n {THEMES.map(({ value, key, icon: Icon }) => (\n <DropdownMenuRadioItem key={value} value={value}>\n <Icon className=\"mr-2 size-4\" />\n {t[key]}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n ) : null\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n tooltip={name}\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n >\n {avatar}\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{name}</span>\n {email ? (\n <span className=\"text-muted-foreground truncate text-xs\">\n {email}\n </span>\n ) : null}\n </div>\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56\"\n side={isMobile ? \"bottom\" : \"right\"}\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"flex items-center gap-2\">\n {avatar}\n <div className=\"grid flex-1 text-left leading-tight\">\n <span className=\"truncate text-sm font-medium\">{name}</span>\n {email ? (\n <span className=\"text-muted-foreground truncate text-xs font-normal\">\n {email}\n </span>\n ) : null}\n </div>\n </DropdownMenuLabel>\n\n {themeSubmenu}\n\n {children ? (\n <>\n <DropdownMenuSeparator />\n {children}\n </>\n ) : null}\n\n {user ? (\n <>\n {onSwitchAccount || onSignOut ? <DropdownMenuSeparator /> : null}\n {onSwitchAccount ? (\n <DropdownMenuItem onSelect={onSwitchAccount}>\n <UserRoundCog className=\"mr-2 size-4\" />\n {l.switchAccount}\n </DropdownMenuItem>\n ) : null}\n {onSignOut ? (\n <DropdownMenuItem variant=\"destructive\" onSelect={onSignOut}>\n <LogOut className=\"mr-2 size-4\" />\n {l.signOut}\n </DropdownMenuItem>\n ) : null}\n </>\n ) : (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={onSignIn}>\n <LogIn className=\"mr-2 size-4\" />\n {l.signIn}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n","\"use client\"\n\nimport { useEffect, useRef, type ReactNode, type WheelEvent } from \"react\"\nimport { ChevronDown, ListX, Pin, PinOff, Trash2, X } from \"lucide-react\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"~/ui/primitives/dropdown-menu.js\"\nimport { ScrollArea, ScrollBar } from \"~/ui/primitives/scroll-area.js\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n} from \"~/ui/primitives/context-menu.js\"\nimport { cn } from \"~/utils/cn.js\"\n\nexport interface TabItem {\n id: string\n title: string\n /** Secondary line under the title (e.g. connection/db, file path). */\n subtitle?: ReactNode\n /** Leading icon element — the app maps its own tab type → icon. */\n icon?: ReactNode\n pinned?: boolean\n}\n\nexport interface TabBarLabels {\n close: string\n pinTab: string\n unpinTab: string\n closeOthers: string\n closeAll: string\n}\n\n/** Default English labels — spread + override for i18n. */\nexport const defaultTabBarLabels: TabBarLabels = {\n close: \"Close\",\n pinTab: \"Pin tab\",\n unpinTab: \"Unpin tab\",\n closeOthers: \"Close others\",\n closeAll: \"Close all\",\n}\n\nexport interface TabBarProps {\n tabs: TabItem[]\n activeId: string | null\n onSelect: (id: string) => void\n onClose: (id: string) => void\n /** Pin row in the context menu is hidden when omitted. */\n onTogglePin?: (id: string) => void\n /** \"Close others\" row is hidden when omitted. */\n onCloseOthers?: (id: string) => void\n /** \"Close all\" row is hidden when omitted. */\n onCloseAll?: () => void\n labels?: Partial<TabBarLabels>\n}\n\n/**\n * Horizontal tab strip for the content area of stacked-sidebar apps\n * (redishub, loom). Presentational + store-agnostic: the app owns tab state\n * and passes `tabs` + callbacks; `icon`/`subtitle` are per-tab so apps map\n * their own tab types, and labels are props for i18n. Renders nothing when\n * `tabs` is empty.\n *\n * Sizes rows from the `--tab-height` CSS var — set it in your globals.\n *\n * @example\n * const s = useTabStore()\n * <TabBar\n * tabs={s.tabs.map(t => ({ id: t.id, title: t.title, pinned: t.pinned, icon: <Icon t={t.type}/>, subtitle: fmt(t) }))}\n * activeId={s.activeTabId}\n * onSelect={s.setActiveTabId}\n * onClose={s.removeTab}\n * onTogglePin={s.togglePin}\n * onCloseOthers={s.closeOthers}\n * onCloseAll={s.closeAll}\n * />\n */\nexport function TabBar({\n tabs,\n activeId,\n onSelect,\n onClose,\n onTogglePin,\n onCloseOthers,\n onCloseAll,\n labels,\n}: TabBarProps) {\n const l = { ...defaultTabBarLabels, ...labels }\n const activeTabRef = useRef<HTMLDivElement>(null)\n\n // Scroll the active tab into view when it changes.\n useEffect(() => {\n if (activeId && activeTabRef.current) {\n activeTabRef.current.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n inline: \"nearest\",\n })\n }\n }, [activeId])\n\n // Map vertical wheel scroll to horizontal scroll over the tab strip.\n const handleWheel = (e: WheelEvent<HTMLDivElement>) => {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) {\n const viewport = e.currentTarget.querySelector(\n '[data-slot=\"scroll-area-viewport\"]',\n )\n if (viewport) viewport.scrollLeft += e.deltaY * 0.5\n }\n }\n\n if (tabs.length === 0) return null\n\n const hasContextActions = Boolean(onTogglePin || onCloseOthers || onCloseAll)\n\n return (\n <div\n className=\"group/tabbar flex w-full shrink-0 items-center overflow-hidden border-b bg-muted/30\"\n style={{ height: \"var(--tab-height)\" }}\n >\n <ScrollArea\n type=\"hover\"\n className=\"min-w-0 flex-1 overflow-hidden [&_[data-orientation=vertical]]:hidden\"\n onWheel={handleWheel}\n >\n <div\n className=\"flex w-max items-center gap-0\"\n style={{ height: \"var(--tab-height)\" }}\n >\n {tabs.map((tab) => {\n const isActive = activeId === tab.id\n return (\n <ContextMenu key={tab.id}>\n <ContextMenuTrigger asChild>\n <div\n ref={isActive ? activeTabRef : null}\n onClick={() => onSelect(tab.id)}\n title={tab.title}\n className={cn(\n \"group relative flex min-w-[140px] max-w-[240px] shrink-0 cursor-pointer select-none items-center gap-2 border-r px-3 transition-colors\",\n isActive\n ? \"border-t-2 border-t-primary bg-background\"\n : \"border-t-2 border-t-transparent bg-transparent text-muted-foreground hover:bg-muted/50\",\n tab.pinned && \"min-w-[100px] bg-primary/5\",\n )}\n style={{ height: \"var(--tab-height)\" }}\n >\n {tab.icon ? (\n <div className=\"relative shrink-0\">\n <span\n className={cn(\n \"flex [&_svg]:size-3.5\",\n isActive && \"text-primary\",\n )}\n >\n {tab.icon}\n </span>\n {tab.pinned ? (\n <div className=\"absolute -right-1.5 -top-1.5 rounded-full bg-background p-0.5 shadow-sm\">\n <Pin className=\"size-2 fill-primary text-primary\" />\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col items-start justify-center overflow-hidden py-1\">\n <span\n className={cn(\n \"w-full truncate text-xs leading-tight\",\n isActive && \"font-medium text-foreground\",\n )}\n >\n {tab.title}\n </span>\n {tab.subtitle ? (\n <span className=\"mt-0.5 w-full truncate text-[10px] leading-none text-muted-foreground/70\">\n {tab.subtitle}\n </span>\n ) : null}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={l.close}\n className={cn(\n \"size-5 shrink-0 rounded-md opacity-0 transition-opacity hover:bg-muted-foreground/20 group-hover:opacity-100\",\n isActive && \"opacity-100\",\n )}\n onClick={(e) => {\n e.stopPropagation()\n onClose(tab.id)\n }}\n >\n <X className=\"size-3\" />\n </Button>\n {isActive ? (\n <div className=\"absolute bottom-0 left-0 right-0 z-10 h-[2px] bg-background\" />\n ) : null}\n </div>\n </ContextMenuTrigger>\n {hasContextActions ? (\n <ContextMenuContent className=\"w-48\">\n {onTogglePin ? (\n <>\n <ContextMenuItem onClick={() => onTogglePin(tab.id)}>\n {tab.pinned ? (\n <>\n <PinOff className=\"mr-2 size-4\" />\n <span>{l.unpinTab}</span>\n </>\n ) : (\n <>\n <Pin className=\"mr-2 size-4\" />\n <span>{l.pinTab}</span>\n </>\n )}\n </ContextMenuItem>\n <ContextMenuSeparator />\n </>\n ) : null}\n <ContextMenuItem onClick={() => onClose(tab.id)}>\n <X className=\"mr-2 size-4\" />\n <span>{l.close}</span>\n </ContextMenuItem>\n {onCloseOthers ? (\n <ContextMenuItem onClick={() => onCloseOthers(tab.id)}>\n <ListX className=\"mr-2 size-4\" />\n <span>{l.closeOthers}</span>\n </ContextMenuItem>\n ) : null}\n {onCloseAll ? (\n <ContextMenuItem onClick={() => onCloseAll()}>\n <Trash2 className=\"mr-2 size-4\" />\n <span>{l.closeAll}</span>\n </ContextMenuItem>\n ) : null}\n </ContextMenuContent>\n ) : null}\n </ContextMenu>\n )\n })}\n </div>\n <ScrollBar orientation=\"horizontal\" className=\"z-20 h-1.5 hover:h-2\" />\n </ScrollArea>\n\n <div\n className=\"flex shrink-0 items-center border-l bg-muted/30 px-1\"\n style={{ height: \"var(--tab-height)\" }}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-8 shrink-0 rounded-sm\">\n <ChevronDown className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"max-h-[400px] w-[260px] overflow-y-auto\"\n >\n {tabs.map((tab) => (\n <DropdownMenuItem\n key={tab.id}\n onClick={() => onSelect(tab.id)}\n title={tab.title}\n className={cn(\n \"cursor-pointer gap-2 py-2\",\n activeId === tab.id && \"bg-accent\",\n )}\n >\n {tab.icon ? (\n <div className=\"relative shrink-0\">\n <span className=\"flex text-muted-foreground [&_svg]:size-4\">\n {tab.icon}\n </span>\n {tab.pinned ? (\n <Pin className=\"absolute -right-1 -top-1 size-2 fill-primary text-primary\" />\n ) : null}\n </div>\n ) : null}\n <div className=\"flex flex-1 flex-col items-start overflow-hidden leading-tight\">\n <span className=\"w-full flex-1 truncate text-sm\">{tab.title}</span>\n {tab.subtitle ? (\n <span className=\"w-full truncate text-[10px] text-muted-foreground\">\n {tab.subtitle}\n </span>\n ) : null}\n </div>\n <X\n className=\"size-4 shrink-0 rounded-sm p-0.5 hover:bg-red-50 hover:text-red-500\"\n onClick={(e) => {\n e.stopPropagation()\n onClose(tab.id)\n }}\n />\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { Fragment, type ComponentProps, type ReactNode } from \"react\"\nimport Link from \"next/link\"\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"~/ui/primitives/breadcrumb.js\"\nimport { useActiveRoute } from \"./use-active-route.js\"\n\nexport interface BreadcrumbsProps extends ComponentProps<typeof Breadcrumb> {\n /** Separator content. Falls back to shadcn's chevron when omitted. */\n separator?: ReactNode\n /** Segment-id → display-label map. Unmapped segments render raw. */\n labels?: Record<string, string>\n}\n\n/** Pathname-derived breadcrumbs. Renders nothing on the root route. */\nexport function Breadcrumbs({ separator, labels, ...rest }: BreadcrumbsProps) {\n const { pathname } = useActiveRoute()\n const segments = pathname.split(\"/\").filter(Boolean)\n if (segments.length === 0) return null\n const last = segments.length - 1\n return (\n <Breadcrumb {...rest}>\n <BreadcrumbList>\n {segments.map((seg, i) => {\n const href = \"/\" + segments.slice(0, i + 1).join(\"/\")\n const label = labels?.[seg] ?? seg\n return (\n <Fragment key={href}>\n {i > 0 ? (\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n ) : null}\n <BreadcrumbItem>\n {i === last ? (\n <BreadcrumbPage>{label}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink asChild>\n <Link href={href}>{label}</Link>\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n </Fragment>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n )\n}\n","import type { ReactNode } from \"react\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport {\n Card,\n CardDescription,\n CardTitle,\n} from \"~/ui/primitives/card.js\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"~/ui/primitives/input-group.js\"\n\n/** One application in the {@link AppGrid} — rendered as an {@link AppTile}. */\nexport interface AppGridItem {\n /** Stable React list key. */\n key: string\n /** Display name. */\n name: string\n /** Optional tagline shown under the name. */\n description?: string\n /** Navigation target (usually an absolute cross-app URL). */\n href: string\n /**\n * Pre-rendered icon element (RSC-serializable), e.g. `<ToolCase />`. Sized by\n * the tile (`[&_svg]:size-7`) — same convention as {@link NavBrandApp}'s icon.\n */\n icon: ReactNode\n /**\n * Tailwind class string tinting the icon tile — `text-…` (colors the icon via\n * currentColor) + `bg-…` (tile background). Pass full class strings, not\n * interpolated fragments, so the JIT keeps them.\n */\n accent?: string\n /** Opens on a different origin (adds `target=\"_blank\"` + `rel`). */\n external?: boolean\n}\n\n/** A titled section of apps for {@link AppGrid}'s grouped mode. */\nexport interface AppGridGroup {\n /** Stable React list key. */\n key: string\n /** Section heading. */\n label: string\n /** Optional sub-heading under the label. */\n description?: string\n /** Apps in this group — already filtered by the caller. */\n apps: AppGridItem[]\n}\n\nexport interface AppGridProps {\n /** Flat mode: apps to render (already filtered). Ignored when `groups` is set. */\n apps?: AppGridItem[]\n /**\n * Grouped mode: titled sections (already filtered). When provided, renders a\n * heading + tile grid per group; empty groups are dropped.\n */\n groups?: AppGridGroup[]\n /** Controlled search value. Pass together with `onQueryChange` to show the search box. */\n query?: string\n onQueryChange?: (query: string) => void\n /** Search input placeholder. */\n searchPlaceholder?: string\n /** Autofocus the search box on mount. Default `false`. */\n autoFocusSearch?: boolean\n /** Message shown when there are no apps. */\n emptyLabel?: string\n className?: string\n}\n\n/** Default English labels — override for i18n. */\nexport const defaultAppGridLabels = {\n searchPlaceholder: \"Search apps…\",\n empty: \"No apps found.\",\n}\n\n/**\n * A responsive grid of application tiles with an optional search box — the \"app\n * grid\" / launcher surface (a portal home / \"all apps\" page). Presentational:\n * the app owns the registry, i18n, icons, and the filter — pass the already-\n * filtered `apps` plus a controlled `query`. Same app/lyra split as\n * {@link NavBrand} and {@link TabBar}.\n *\n * @example\n * const [q, setQ] = useState(\"\")\n * const filtered = APPS.filter(a => match(a, q))\n * <AppGrid\n * apps={filtered.map(a => ({\n * key: a.slug, name: t(a.slug), description: t(`${a.slug}.desc`),\n * href: a.href, icon: <a.Icon />, accent: a.accent, external: true,\n * }))}\n * query={q} onQueryChange={setQ}\n * searchPlaceholder={t(\"search\")} emptyLabel={t(\"empty\")}\n * />\n */\nexport function AppGrid({\n apps,\n groups,\n query,\n onQueryChange,\n searchPlaceholder = defaultAppGridLabels.searchPlaceholder,\n autoFocusSearch = false,\n emptyLabel = defaultAppGridLabels.empty,\n className,\n}: AppGridProps) {\n const grouped = groups != null\n const sections = grouped ? groups.filter((g) => g.apps.length > 0) : []\n const flat = apps ?? []\n const isEmpty = grouped ? sections.length === 0 : flat.length === 0\n\n return (\n <div className={cn(\"space-y-8\", className)}>\n {onQueryChange ? (\n <InputGroup className=\"mx-auto h-10 max-w-md\">\n <InputGroupAddon>\n <Search />\n </InputGroupAddon>\n <InputGroupInput\n type=\"search\"\n value={query ?? \"\"}\n onChange={(e) => onQueryChange(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n autoFocus={autoFocusSearch}\n />\n </InputGroup>\n ) : null}\n\n {isEmpty ? (\n <p className=\"text-muted-foreground py-16 text-center text-sm\">\n {emptyLabel}\n </p>\n ) : grouped ? (\n <div className=\"space-y-10\">\n {sections.map((g) => (\n <section key={g.key} className=\"space-y-4\">\n <div className=\"space-y-1\">\n <h2 className=\"text-sm font-semibold tracking-tight\">{g.label}</h2>\n {g.description ? (\n <p className=\"text-muted-foreground text-xs\">{g.description}</p>\n ) : null}\n </div>\n <AppTileGrid apps={g.apps} />\n </section>\n ))}\n </div>\n ) : (\n <AppTileGrid apps={flat} />\n )}\n </div>\n )\n}\n\n/** The responsive tile grid shared by {@link AppGrid}'s flat and grouped modes. */\nfunction AppTileGrid({ apps }: { apps: AppGridItem[] }) {\n return (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">\n {apps.map((app) => (\n <AppTile key={app.key} app={app} />\n ))}\n </div>\n )\n}\n\n/**\n * A single application tile: the icon in a tinted rounded chip above the name +\n * description. Exported for callers that render their own grid.\n */\nexport function AppTile({ app }: { app: AppGridItem }) {\n return (\n <a\n href={app.href}\n target={app.external ? \"_blank\" : undefined}\n rel={app.external ? \"noreferrer\" : undefined}\n className=\"focus-visible:ring-ring group rounded-none outline-none focus-visible:ring-2\"\n >\n <Card className=\"h-full items-center gap-4 px-6 py-8 text-center transition-all duration-200 group-hover:-translate-y-0.5 group-hover:shadow-md group-hover:ring-foreground/30\">\n {/* Tinted icon tile (sharp — matches lyra's rounded-none aesthetic);\n `accent` carries the text-… (icon, via currentColor) + bg-… tint. */}\n <div\n className={cn(\n \"flex size-14 items-center justify-center rounded-none ring-1 ring-foreground/5 ring-inset transition-transform duration-200 group-hover:scale-105 [&_svg]:size-7\",\n app.accent,\n )}\n >\n {app.icon}\n </div>\n <div className=\"space-y-1\">\n <CardTitle>{app.name}</CardTitle>\n {app.description ? (\n <CardDescription className=\"line-clamp-2\">\n {app.description}\n </CardDescription>\n ) : null}\n </div>\n </Card>\n </a>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/shell/app-shell.tsx","../../src/shell/stacked-sidebar.tsx","../../src/shell/nav-group.tsx","../../src/shell/use-active-route.ts","../../src/shell/nav-item.tsx","../../src/shell/nav-section.tsx","../../src/shell/nav-brand.tsx","../../src/shell/nav-user.tsx","../../src/shell/tab-bar.tsx","../../src/shell/breadcrumbs.tsx","../../src/shell/app-grid.tsx","../../src/shell/app-glyph.tsx"],"names":["jsx","jsxs","Fragment","ChevronsUpDown","Link"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\"\n\nimport type { ComponentProps, ReactNode } from \"react\"\nimport {\n SidebarInset,\n SidebarProvider,\n} from \"~/ui/primitives/sidebar.js\"\nimport { cn } from \"~/utils/cn.js\"\n\nexport interface AppShellProps\n extends Omit<ComponentProps<typeof SidebarProvider>, \"children\"> {\n children: ReactNode\n}\n\n/**\n * App shell composition root. Wires `SidebarProvider`. Pair with\n * `<Sidebar>` from `@tradalab/lyra/ui` and `<AppShellMain>` for the\n * right-hand pane.\n *\n * @example\n * import { AppShell, AppShellMain, AppShellHeader, AppShellBody, NavGroup, NavItem, Breadcrumbs } from \"@tradalab/lyra/shell\"\n * import { Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarTrigger } from \"@tradalab/lyra/ui\"\n *\n * <AppShell>\n * <Sidebar collapsible=\"icon\">\n * <SidebarHeader>{logo}</SidebarHeader>\n * <SidebarContent>\n * <NavGroup label=\"Primitives\">{...}</NavGroup>\n * </SidebarContent>\n * <SidebarFooter>{user}</SidebarFooter>\n * </Sidebar>\n * <AppShellMain>\n * <AppShellHeader><SidebarTrigger /><Breadcrumbs /></AppShellHeader>\n * <AppShellBody>{children}</AppShellBody>\n * </AppShellMain>\n * </AppShell>\n */\nexport function AppShell({ children, ...rest }: AppShellProps) {\n return <SidebarProvider {...rest}>{children}</SidebarProvider>\n}\n\n/** Right-hand pane container. Alias for `SidebarInset`. */\nexport const AppShellMain = SidebarInset\n\n/** Top bar inside `<AppShellMain>`. Standardizes h-12 + border-b + flex row. */\nexport function AppShellHeader({\n className,\n children,\n ...rest\n}: ComponentProps<\"header\">) {\n return (\n <header\n className={cn(\n \"flex h-12 shrink-0 items-center gap-2 border-b px-3\",\n className,\n )}\n {...rest}\n >\n {children}\n </header>\n )\n}\n\n/** Scroll body inside `<AppShellMain>`. Sibling of `<AppShellHeader>`. */\nexport function AppShellBody({\n className,\n children,\n ...rest\n}: ComponentProps<\"div\">) {\n return (\n <div className={cn(\"flex-1 overflow-auto\", className)} {...rest}>\n {children}\n </div>\n )\n}\n","\"use client\"\n\nimport type { ComponentProps } from \"react\"\nimport { Sidebar } from \"~/ui/primitives/sidebar.js\"\nimport { cn } from \"~/utils/cn.js\"\n\n/**\n * Dual / stacked sidebar wrapper — an icon rail plus one or more content\n * panels rendered side-by-side inside a single `<Sidebar>`. This is the\n * shadcn \"sidebar-07\" pattern.\n *\n * The `*:data-[sidebar=sidebar]:flex-row` trick lays the inner\n * `[data-sidebar=sidebar]` wrappers of the nested {@link SidebarDock} /\n * {@link SidebarPanel} columns out horizontally. `variant`/`collapsible`\n * default to `\"sidebar\"`/`\"icon\"` but can be overridden.\n *\n * @example\n * import { AppShell, AppShellMain, StackedSidebar, SidebarDock, SidebarPanel } from \"@tradalab/lyra/shell\"\n * import { SidebarHeader, SidebarContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton } from \"@tradalab/lyra/ui\"\n *\n * <AppShell>\n * <StackedSidebar>\n * <SidebarDock>\n * <SidebarHeader>{logo}</SidebarHeader>\n * <SidebarContent>{iconButtons}</SidebarContent>\n * </SidebarDock>\n * {tab === \"files\" ? <SidebarPanel>{tree}</SidebarPanel> : null}\n * </StackedSidebar>\n * <AppShellMain>{children}</AppShellMain>\n * </AppShell>\n */\nexport function StackedSidebar({\n className,\n ...rest\n}: ComponentProps<typeof Sidebar>) {\n return (\n <Sidebar\n variant=\"sidebar\"\n collapsible=\"icon\"\n {...rest}\n className={cn(\n \"overflow-hidden *:data-[sidebar=sidebar]:flex-row\",\n className,\n )}\n />\n )\n}\n\n/**\n * Narrow icon-rail column inside a {@link StackedSidebar}. Fixed to the icon\n * width, never collapses on its own (the parent `StackedSidebar` owns the\n * icon-mode toggle).\n *\n * Named `SidebarDock` — not `SidebarRail` — because `SidebarRail` already\n * exists in `@tradalab/lyra/ui` as shadcn's drag-to-resize edge handle.\n */\nexport function SidebarDock({\n className,\n ...rest\n}: ComponentProps<typeof Sidebar>) {\n return (\n <Sidebar\n {...rest}\n collapsible=\"none\"\n className={cn(\n \"w-[calc(var(--sidebar-width-icon)+1px)]! overflow-hidden border-r\",\n className,\n )}\n />\n )\n}\n\n/**\n * Wider content column inside a {@link StackedSidebar} (tree, list, …).\n * Fills remaining width; render conditionally to show/hide per app state.\n */\nexport function SidebarPanel({\n className,\n ...rest\n}: ComponentProps<typeof Sidebar>) {\n return (\n <Sidebar\n {...rest}\n collapsible=\"none\"\n className={cn(\"flex-1 overflow-hidden\", className)}\n />\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport {\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarMenu,\n} from \"~/ui/primitives/sidebar.js\"\n\nexport interface NavGroupProps {\n label?: ReactNode\n children: ReactNode\n}\n\nexport function NavGroup({ label, children }: NavGroupProps) {\n return (\n <SidebarGroup>\n {label != null ? <SidebarGroupLabel>{label}</SidebarGroupLabel> : null}\n <SidebarGroupContent>\n <SidebarMenu>{children}</SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n )\n}\n","\"use client\"\n\nimport { usePathname } from \"next/navigation\"\n\nexport type MatchMode = \"exact\" | \"prefix\"\n\nexport interface UseActiveRoute {\n pathname: string\n isActive: (href: string, mode?: MatchMode) => boolean\n}\n\n/**\n * App-Router pathname helper. Default `mode` is `\"prefix\"`.\n *\n * Root (`/`) is always exact-matched regardless of `mode` — otherwise the\n * root nav item would light up on every nested page.\n */\nexport function useActiveRoute(): UseActiveRoute {\n const pathname = usePathname() ?? \"/\"\n return {\n pathname,\n isActive: (href, mode = \"prefix\") => {\n if (mode === \"exact\" || href === \"/\") return pathname === href\n return pathname === href || pathname.startsWith(`${href}/`)\n },\n }\n}\n","\"use client\"\n\nimport Link from \"next/link\"\nimport type { ReactNode } from \"react\"\nimport {\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"~/ui/primitives/sidebar.js\"\nimport { useActiveRoute, type MatchMode } from \"./use-active-route.js\"\n\nexport type NavIcon = ReactNode\n\nexport interface NavItemProps {\n href: string\n label: string\n /** Pre-rendered icon element, e.g. `<Globe />`. Element form so the prop is serializable across the RSC boundary. */\n icon?: NavIcon\n /** Sidebar tooltip; visible in collapsed icon mode. */\n tooltip?: string\n /** Default `\"prefix\"` — matches `href` and any nested path. */\n matchMode?: MatchMode\n}\n\n/** Sidebar nav row. Must be rendered inside a {@link NavGroup}. */\nexport function NavItem({\n href,\n label,\n icon,\n tooltip,\n matchMode = \"prefix\",\n}: NavItemProps) {\n const { isActive } = useActiveRoute()\n return (\n <SidebarMenuItem>\n <SidebarMenuButton\n asChild\n isActive={isActive(href, matchMode)}\n tooltip={tooltip}\n >\n <Link href={href}>\n {icon}\n <span>{label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { NavGroup } from \"./nav-group.js\"\nimport { NavItem, type NavItemProps } from \"./nav-item.js\"\n\nexport interface NavSectionProps {\n /** Optional group heading. */\n label?: ReactNode\n /** Nav rows — each rendered as a {@link NavItem}. */\n items: NavItemProps[]\n}\n\n/**\n * Config-driven convenience over {@link NavGroup} + {@link NavItem}: pass a\n * data array instead of hand-mapping JSX. For dynamic or conditional rows,\n * compose `NavGroup`/`NavItem` directly.\n *\n * @example\n * const NAV = [\n * { href: \"/files\", label: \"Files\", icon: <Folder /> },\n * { href: \"/trash\", label: \"Trash\", icon: <Trash2 /> },\n * ]\n * <NavSection label=\"Workspace\" items={NAV} />\n */\nexport function NavSection({ label, items }: NavSectionProps) {\n return (\n <NavGroup label={label}>\n {items.map((item) => (\n <NavItem key={item.href} {...item} />\n ))}\n </NavGroup>\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { ChevronsUpDown } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"~/ui/primitives/dropdown-menu.js\"\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"~/ui/primitives/sidebar.js\"\n\n/** An application shown in the {@link NavBrand} header / switcher. */\nexport interface NavBrandApp {\n /** Display name. */\n name: string\n /**\n * Pre-rendered icon/logo element, e.g. `<Boxes />`. Element form (not a\n * component reference) so the prop stays serializable across the RSC\n * boundary — same convention as {@link NavItem}'s `icon`.\n */\n icon: ReactNode\n /** Navigation target. Usually an absolute cross-app URL (full navigation). */\n href: string\n /** Optional secondary line under the name (tagline / domain). */\n description?: string\n}\n\nexport interface NavBrandProps {\n /** The current app, rendered in the sidebar header. */\n app: NavBrandApp\n /**\n * Other apps to switch to. When omitted or empty the header renders as a\n * plain link to `app.href` (no dropdown, no chevron).\n */\n apps?: NavBrandApp[]\n /** Heading above the app list in the dropdown. Default `\"Applications\"`. */\n appsLabel?: string\n /** Extra menu content appended below the app list (e.g. an \"Add app\" row). */\n children?: ReactNode\n}\n\n/** Default English heading for the switcher's app list — override for i18n. */\nexport const defaultNavBrandAppsLabel = \"Applications\"\n\n/** Icon tile + name/description shown inside the header button. */\nfunction BrandContent({ app }: { app: NavBrandApp }) {\n return (\n <>\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-none [&_svg]:size-4\">\n {app.icon}\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{app.name}</span>\n {app.description ? (\n <span className=\"text-muted-foreground truncate text-xs\">\n {app.description}\n </span>\n ) : null}\n </div>\n </>\n )\n}\n\n/**\n * Sidebar-header brand block with an optional app switcher — the standardized\n * `SidebarHeader` content for app shells (pairs with {@link NavUser} in the\n * footer). Presentational: the app owns the config, icons, and labels (same\n * split as {@link TabBar}).\n *\n * With `apps`, the header is a dropdown trigger (chevron) listing the other\n * apps as links; without it, the header is a plain link to `app.href`. Cross-app\n * links use a plain `<a>` so switching does a full navigation.\n *\n * Must render inside an `AppShell`/`SidebarProvider`, and below a\n * `TooltipProvider` (the collapsed-mode tooltip needs one — app root providers\n * normally mount it).\n *\n * @example\n * import { NavBrand } from \"@tradalab/lyra/shell\"\n * import { SidebarHeader } from \"@tradalab/lyra/ui\"\n * import { Boxes, HardDrive, ShieldCheck } from \"lucide-react\"\n *\n * <SidebarHeader>\n * <NavBrand\n * app={{ name: \"Admin\", description: \"Platform console\", icon: <ShieldCheck />, href: \"/\" }}\n * apps={[\n * { name: \"Drive\", icon: <HardDrive />, href: \"https://drive.tradalab.com\" },\n * { name: \"Toolbox\", icon: <Boxes />, href: \"https://toolbox.tradalab.com\" },\n * ]}\n * />\n * </SidebarHeader>\n */\nexport function NavBrand({\n app,\n apps,\n appsLabel = defaultNavBrandAppsLabel,\n children,\n}: NavBrandProps) {\n const { isMobile } = useSidebar()\n const hasSwitcher = (apps?.length ?? 0) > 0 || children != null\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n {hasSwitcher ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n tooltip={app.name}\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n >\n <BrandContent app={app} />\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-none\"\n align=\"start\"\n side={isMobile ? \"bottom\" : \"right\"}\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"text-muted-foreground text-xs\">\n {appsLabel}\n </DropdownMenuLabel>\n {apps?.map((item) => (\n <DropdownMenuItem key={item.href} asChild className=\"gap-2 p-2\">\n <a href={item.href}>\n <div className=\"flex size-6 items-center justify-center rounded-none border [&_svg]:size-3.5\">\n {item.icon}\n </div>\n <span className=\"truncate\">{item.name}</span>\n </a>\n </DropdownMenuItem>\n ))}\n {children ? (\n <>\n <DropdownMenuSeparator />\n {children}\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <SidebarMenuButton size=\"lg\" asChild tooltip={app.name}>\n <a href={app.href}>\n <BrandContent app={app} />\n </a>\n </SidebarMenuButton>\n )}\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n","\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport {\n ChevronsUpDown,\n CircleUser,\n LogIn,\n LogOut,\n Monitor,\n Moon,\n Palette,\n Sun,\n UserRoundCog,\n} from \"lucide-react\"\nimport { useTheme } from \"next-themes\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"~/ui/primitives/avatar.js\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"~/ui/primitives/dropdown-menu.js\"\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from \"~/ui/primitives/sidebar.js\"\nimport {\n defaultAccountMenuLabels,\n initialsOf,\n type AccountMenuLabels,\n type AccountMenuUser,\n} from \"~/ui/account-menu.js\"\n\nexport interface NavUserThemeLabels {\n theme: string\n light: string\n dark: string\n system: string\n}\n\n/** Default English theme-submenu labels — spread + override for i18n. */\nexport const defaultNavUserThemeLabels: NavUserThemeLabels = {\n theme: \"Theme\",\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n}\n\nexport interface NavUserProps {\n /**\n * Signed-in user. When `null`/`undefined`, renders a guest menu (icon +\n * theme + Sign in) if `onSignIn` is set, otherwise renders nothing.\n */\n user?: AccountMenuUser | null\n /** Account-action labels — reuses lyra's {@link AccountMenuLabels}. */\n labels?: Partial<AccountMenuLabels>\n /** Switch-account handler (signed-in only). Item hidden if omitted. */\n onSwitchAccount?: () => void\n /** Sign-out handler (signed-in only). Item hidden if omitted. */\n onSignOut?: () => void\n /**\n * Sign-in handler (guest only). When set, a null `user` renders the guest\n * menu with a Sign in action instead of rendering nothing.\n */\n onSignIn?: () => void\n /** Render the light/dark/system theme submenu. Default `true`. */\n showTheme?: boolean\n /** Theme-submenu labels. */\n themeLabels?: Partial<NavUserThemeLabels>\n /** Extra menu content inserted below the theme submenu. */\n children?: ReactNode\n}\n\nconst THEMES = [\n { value: \"light\", key: \"light\", icon: Sun },\n { value: \"dark\", key: \"dark\", icon: Moon },\n { value: \"system\", key: \"system\", icon: Monitor },\n] as const\n\n/**\n * Sidebar-footer account menu — the standardized NavUser for app shells.\n * Avatar trigger (size `lg`) + name/email opening a dropdown with an optional\n * theme switcher and switch-account / sign-out actions. Auth flows stay in the\n * app (callbacks); labels are props for i18n.\n *\n * Differs from {@link AccountMenu} in `@tradalab/lyra/ui`: that one is a\n * generic header dropdown; this is styled for the collapsible sidebar footer\n * and follows `useSidebar()` for mobile placement.\n *\n * Must render inside an `AppShell`/SidebarProvider, and below a\n * `TooltipProvider` (the avatar button's collapsed-mode tooltip requires one —\n * app root providers normally mount it). The theme submenu needs a\n * `next-themes` provider mounted (it no-ops without one); pass\n * `showTheme={false}` for apps with a fixed theme.\n *\n * @example\n * import { NavUser } from \"@tradalab/lyra/shell\"\n * import { SidebarFooter } from \"@tradalab/lyra/ui\"\n *\n * <SidebarFooter>\n * <NavUser\n * user={session.user}\n * onSwitchAccount={() => signIn(\"zitadel\", { redirectTo: \"/\" }, { prompt: \"select_account\" })}\n * onSignOut={() => signOut({ redirectTo: \"/\" })}\n * />\n * </SidebarFooter>\n */\nexport function NavUser({\n user,\n labels,\n onSwitchAccount,\n onSignOut,\n onSignIn,\n showTheme = true,\n themeLabels,\n children,\n}: NavUserProps) {\n const { isMobile } = useSidebar()\n const { theme, setTheme } = useTheme()\n const l = { ...defaultAccountMenuLabels, ...labels }\n const t = { ...defaultNavUserThemeLabels, ...themeLabels }\n\n // Guests render nothing unless a sign-in handler opts them into a guest menu.\n if (!user && !onSignIn) return null\n\n const name = user ? (user.name ?? user.email ?? l.account) : l.guest\n const email = user?.email ?? \"\"\n\n const avatar = (\n <Avatar className=\"size-8 rounded-none after:rounded-none\">\n {user?.image ? (\n <AvatarImage className=\"rounded-none\" src={user.image} alt={name} />\n ) : null}\n <AvatarFallback className=\"rounded-none\">\n {user ? initialsOf(name) : <CircleUser className=\"size-4\" />}\n </AvatarFallback>\n </Avatar>\n )\n\n const themeSubmenu = showTheme ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Palette className=\"mr-2 size-4\" />\n {t.theme}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuRadioGroup value={theme ?? \"system\"} onValueChange={setTheme}>\n {THEMES.map(({ value, key, icon: Icon }) => (\n <DropdownMenuRadioItem key={value} value={value}>\n <Icon className=\"mr-2 size-4\" />\n {t[key]}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n </>\n ) : null\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n tooltip={name}\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n >\n {avatar}\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{name}</span>\n {email ? (\n <span className=\"text-muted-foreground truncate text-xs\">\n {email}\n </span>\n ) : null}\n </div>\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56\"\n side={isMobile ? \"bottom\" : \"right\"}\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"flex items-center gap-2\">\n {avatar}\n <div className=\"grid flex-1 text-left leading-tight\">\n <span className=\"truncate text-sm font-medium\">{name}</span>\n {email ? (\n <span className=\"text-muted-foreground truncate text-xs font-normal\">\n {email}\n </span>\n ) : null}\n </div>\n </DropdownMenuLabel>\n\n {themeSubmenu}\n\n {children ? (\n <>\n <DropdownMenuSeparator />\n {children}\n </>\n ) : null}\n\n {user ? (\n <>\n {onSwitchAccount || onSignOut ? <DropdownMenuSeparator /> : null}\n {onSwitchAccount ? (\n <DropdownMenuItem onSelect={onSwitchAccount}>\n <UserRoundCog className=\"mr-2 size-4\" />\n {l.switchAccount}\n </DropdownMenuItem>\n ) : null}\n {onSignOut ? (\n <DropdownMenuItem variant=\"destructive\" onSelect={onSignOut}>\n <LogOut className=\"mr-2 size-4\" />\n {l.signOut}\n </DropdownMenuItem>\n ) : null}\n </>\n ) : (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={onSignIn}>\n <LogIn className=\"mr-2 size-4\" />\n {l.signIn}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n )\n}\n","\"use client\"\n\nimport { useEffect, useRef, type ReactNode, type WheelEvent } from \"react\"\nimport { ChevronDown, ListX, Pin, PinOff, Trash2, X } from \"lucide-react\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"~/ui/primitives/dropdown-menu.js\"\nimport { ScrollArea, ScrollBar } from \"~/ui/primitives/scroll-area.js\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n} from \"~/ui/primitives/context-menu.js\"\nimport { cn } from \"~/utils/cn.js\"\n\nexport interface TabItem {\n id: string\n title: string\n /** Secondary line under the title (e.g. connection/db, file path). */\n subtitle?: ReactNode\n /** Leading icon element — the app maps its own tab type → icon. */\n icon?: ReactNode\n pinned?: boolean\n}\n\nexport interface TabBarLabels {\n close: string\n pinTab: string\n unpinTab: string\n closeOthers: string\n closeAll: string\n}\n\n/** Default English labels — spread + override for i18n. */\nexport const defaultTabBarLabels: TabBarLabels = {\n close: \"Close\",\n pinTab: \"Pin tab\",\n unpinTab: \"Unpin tab\",\n closeOthers: \"Close others\",\n closeAll: \"Close all\",\n}\n\nexport interface TabBarProps {\n tabs: TabItem[]\n activeId: string | null\n onSelect: (id: string) => void\n onClose: (id: string) => void\n /** Pin row in the context menu is hidden when omitted. */\n onTogglePin?: (id: string) => void\n /** \"Close others\" row is hidden when omitted. */\n onCloseOthers?: (id: string) => void\n /** \"Close all\" row is hidden when omitted. */\n onCloseAll?: () => void\n labels?: Partial<TabBarLabels>\n}\n\n/**\n * Horizontal tab strip for the content area of stacked-sidebar apps\n * (redishub, loom). Presentational + store-agnostic: the app owns tab state\n * and passes `tabs` + callbacks; `icon`/`subtitle` are per-tab so apps map\n * their own tab types, and labels are props for i18n. Renders nothing when\n * `tabs` is empty.\n *\n * Sizes rows from the `--tab-height` CSS var — set it in your globals.\n *\n * @example\n * const s = useTabStore()\n * <TabBar\n * tabs={s.tabs.map(t => ({ id: t.id, title: t.title, pinned: t.pinned, icon: <Icon t={t.type}/>, subtitle: fmt(t) }))}\n * activeId={s.activeTabId}\n * onSelect={s.setActiveTabId}\n * onClose={s.removeTab}\n * onTogglePin={s.togglePin}\n * onCloseOthers={s.closeOthers}\n * onCloseAll={s.closeAll}\n * />\n */\nexport function TabBar({\n tabs,\n activeId,\n onSelect,\n onClose,\n onTogglePin,\n onCloseOthers,\n onCloseAll,\n labels,\n}: TabBarProps) {\n const l = { ...defaultTabBarLabels, ...labels }\n const activeTabRef = useRef<HTMLDivElement>(null)\n\n // Scroll the active tab into view when it changes.\n useEffect(() => {\n if (activeId && activeTabRef.current) {\n activeTabRef.current.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n inline: \"nearest\",\n })\n }\n }, [activeId])\n\n // Map vertical wheel scroll to horizontal scroll over the tab strip.\n const handleWheel = (e: WheelEvent<HTMLDivElement>) => {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) {\n const viewport = e.currentTarget.querySelector(\n '[data-slot=\"scroll-area-viewport\"]',\n )\n if (viewport) viewport.scrollLeft += e.deltaY * 0.5\n }\n }\n\n if (tabs.length === 0) return null\n\n const hasContextActions = Boolean(onTogglePin || onCloseOthers || onCloseAll)\n\n return (\n <div\n className=\"group/tabbar flex w-full shrink-0 items-center overflow-hidden border-b bg-muted/30\"\n style={{ height: \"var(--tab-height)\" }}\n >\n <ScrollArea\n type=\"hover\"\n className=\"min-w-0 flex-1 overflow-hidden [&_[data-orientation=vertical]]:hidden\"\n onWheel={handleWheel}\n >\n <div\n className=\"flex w-max items-center gap-0\"\n style={{ height: \"var(--tab-height)\" }}\n >\n {tabs.map((tab) => {\n const isActive = activeId === tab.id\n return (\n <ContextMenu key={tab.id}>\n <ContextMenuTrigger asChild>\n <div\n ref={isActive ? activeTabRef : null}\n onClick={() => onSelect(tab.id)}\n title={tab.title}\n className={cn(\n \"group relative flex min-w-[140px] max-w-[240px] shrink-0 cursor-pointer select-none items-center gap-2 border-r px-3 transition-colors\",\n isActive\n ? \"border-t-2 border-t-primary bg-background\"\n : \"border-t-2 border-t-transparent bg-transparent text-muted-foreground hover:bg-muted/50\",\n tab.pinned && \"min-w-[100px] bg-primary/5\",\n )}\n style={{ height: \"var(--tab-height)\" }}\n >\n {tab.icon ? (\n <div className=\"relative shrink-0\">\n <span\n className={cn(\n \"flex [&_svg]:size-3.5\",\n isActive && \"text-primary\",\n )}\n >\n {tab.icon}\n </span>\n {tab.pinned ? (\n <div className=\"absolute -right-1.5 -top-1.5 rounded-full bg-background p-0.5 shadow-sm\">\n <Pin className=\"size-2 fill-primary text-primary\" />\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col items-start justify-center overflow-hidden py-1\">\n <span\n className={cn(\n \"w-full truncate text-xs leading-tight\",\n isActive && \"font-medium text-foreground\",\n )}\n >\n {tab.title}\n </span>\n {tab.subtitle ? (\n <span className=\"mt-0.5 w-full truncate text-[10px] leading-none text-muted-foreground/70\">\n {tab.subtitle}\n </span>\n ) : null}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={l.close}\n className={cn(\n \"size-5 shrink-0 rounded-md opacity-0 transition-opacity hover:bg-muted-foreground/20 group-hover:opacity-100\",\n isActive && \"opacity-100\",\n )}\n onClick={(e) => {\n e.stopPropagation()\n onClose(tab.id)\n }}\n >\n <X className=\"size-3\" />\n </Button>\n {isActive ? (\n <div className=\"absolute bottom-0 left-0 right-0 z-10 h-[2px] bg-background\" />\n ) : null}\n </div>\n </ContextMenuTrigger>\n {hasContextActions ? (\n <ContextMenuContent className=\"w-48\">\n {onTogglePin ? (\n <>\n <ContextMenuItem onClick={() => onTogglePin(tab.id)}>\n {tab.pinned ? (\n <>\n <PinOff className=\"mr-2 size-4\" />\n <span>{l.unpinTab}</span>\n </>\n ) : (\n <>\n <Pin className=\"mr-2 size-4\" />\n <span>{l.pinTab}</span>\n </>\n )}\n </ContextMenuItem>\n <ContextMenuSeparator />\n </>\n ) : null}\n <ContextMenuItem onClick={() => onClose(tab.id)}>\n <X className=\"mr-2 size-4\" />\n <span>{l.close}</span>\n </ContextMenuItem>\n {onCloseOthers ? (\n <ContextMenuItem onClick={() => onCloseOthers(tab.id)}>\n <ListX className=\"mr-2 size-4\" />\n <span>{l.closeOthers}</span>\n </ContextMenuItem>\n ) : null}\n {onCloseAll ? (\n <ContextMenuItem onClick={() => onCloseAll()}>\n <Trash2 className=\"mr-2 size-4\" />\n <span>{l.closeAll}</span>\n </ContextMenuItem>\n ) : null}\n </ContextMenuContent>\n ) : null}\n </ContextMenu>\n )\n })}\n </div>\n <ScrollBar orientation=\"horizontal\" className=\"z-20 h-1.5 hover:h-2\" />\n </ScrollArea>\n\n <div\n className=\"flex shrink-0 items-center border-l bg-muted/30 px-1\"\n style={{ height: \"var(--tab-height)\" }}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-8 shrink-0 rounded-sm\">\n <ChevronDown className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"max-h-[400px] w-[260px] overflow-y-auto\"\n >\n {tabs.map((tab) => (\n <DropdownMenuItem\n key={tab.id}\n onClick={() => onSelect(tab.id)}\n title={tab.title}\n className={cn(\n \"cursor-pointer gap-2 py-2\",\n activeId === tab.id && \"bg-accent\",\n )}\n >\n {tab.icon ? (\n <div className=\"relative shrink-0\">\n <span className=\"flex text-muted-foreground [&_svg]:size-4\">\n {tab.icon}\n </span>\n {tab.pinned ? (\n <Pin className=\"absolute -right-1 -top-1 size-2 fill-primary text-primary\" />\n ) : null}\n </div>\n ) : null}\n <div className=\"flex flex-1 flex-col items-start overflow-hidden leading-tight\">\n <span className=\"w-full flex-1 truncate text-sm\">{tab.title}</span>\n {tab.subtitle ? (\n <span className=\"w-full truncate text-[10px] text-muted-foreground\">\n {tab.subtitle}\n </span>\n ) : null}\n </div>\n <X\n className=\"size-4 shrink-0 rounded-sm p-0.5 hover:bg-red-50 hover:text-red-500\"\n onClick={(e) => {\n e.stopPropagation()\n onClose(tab.id)\n }}\n />\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { Fragment, type ComponentProps, type ReactNode } from \"react\"\nimport Link from \"next/link\"\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"~/ui/primitives/breadcrumb.js\"\nimport { useActiveRoute } from \"./use-active-route.js\"\n\nexport interface BreadcrumbsProps extends ComponentProps<typeof Breadcrumb> {\n /** Separator content. Falls back to shadcn's chevron when omitted. */\n separator?: ReactNode\n /** Segment-id → display-label map. Unmapped segments render raw. */\n labels?: Record<string, string>\n}\n\n/** Pathname-derived breadcrumbs. Renders nothing on the root route. */\nexport function Breadcrumbs({ separator, labels, ...rest }: BreadcrumbsProps) {\n const { pathname } = useActiveRoute()\n const segments = pathname.split(\"/\").filter(Boolean)\n if (segments.length === 0) return null\n const last = segments.length - 1\n return (\n <Breadcrumb {...rest}>\n <BreadcrumbList>\n {segments.map((seg, i) => {\n const href = \"/\" + segments.slice(0, i + 1).join(\"/\")\n const label = labels?.[seg] ?? seg\n return (\n <Fragment key={href}>\n {i > 0 ? (\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n ) : null}\n <BreadcrumbItem>\n {i === last ? (\n <BreadcrumbPage>{label}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink asChild>\n <Link href={href}>{label}</Link>\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n </Fragment>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n )\n}\n","import type { ReactNode } from \"react\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport {\n Card,\n CardDescription,\n CardTitle,\n} from \"~/ui/primitives/card.js\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"~/ui/primitives/input-group.js\"\n\n/** One application in the {@link AppGrid} — rendered as an {@link AppTile}. */\nexport interface AppGridItem {\n /** Stable React list key. */\n key: string\n /** Display name. */\n name: string\n /** Optional tagline shown under the name. */\n description?: string\n /** Navigation target (usually an absolute cross-app URL). */\n href: string\n /**\n * Pre-rendered icon element (RSC-serializable), e.g. `<ToolCase />`. Sized by\n * the tile (`[&_svg]:size-7`) — same convention as {@link NavBrandApp}'s icon.\n */\n icon: ReactNode\n /**\n * Tailwind class string tinting the icon tile — `text-…` (colors the icon via\n * currentColor) + `bg-…` (tile background). Pass full class strings, not\n * interpolated fragments, so the JIT keeps them.\n */\n accent?: string\n /** Opens on a different origin (adds `target=\"_blank\"` + `rel`). */\n external?: boolean\n}\n\n/** A titled section of apps for {@link AppGrid}'s grouped mode. */\nexport interface AppGridGroup {\n /** Stable React list key. */\n key: string\n /** Section heading. */\n label: string\n /** Optional sub-heading under the label. */\n description?: string\n /** Apps in this group — already filtered by the caller. */\n apps: AppGridItem[]\n}\n\nexport interface AppGridProps {\n /** Flat mode: apps to render (already filtered). Ignored when `groups` is set. */\n apps?: AppGridItem[]\n /**\n * Grouped mode: titled sections (already filtered). When provided, renders a\n * heading + tile grid per group; empty groups are dropped.\n */\n groups?: AppGridGroup[]\n /** Controlled search value. Pass together with `onQueryChange` to show the search box. */\n query?: string\n onQueryChange?: (query: string) => void\n /** Search input placeholder. */\n searchPlaceholder?: string\n /** Autofocus the search box on mount. Default `false`. */\n autoFocusSearch?: boolean\n /** Message shown when there are no apps. */\n emptyLabel?: string\n className?: string\n}\n\n/** Default English labels — override for i18n. */\nexport const defaultAppGridLabels = {\n searchPlaceholder: \"Search apps…\",\n empty: \"No apps found.\",\n}\n\n/**\n * A responsive grid of application tiles with an optional search box — the \"app\n * grid\" / launcher surface (a portal home / \"all apps\" page). Presentational:\n * the app owns the registry, i18n, icons, and the filter — pass the already-\n * filtered `apps` plus a controlled `query`. Same app/lyra split as\n * {@link NavBrand} and {@link TabBar}.\n *\n * @example\n * const [q, setQ] = useState(\"\")\n * const filtered = APPS.filter(a => match(a, q))\n * <AppGrid\n * apps={filtered.map(a => ({\n * key: a.slug, name: t(a.slug), description: t(`${a.slug}.desc`),\n * href: a.href, icon: <a.Icon />, accent: a.accent, external: true,\n * }))}\n * query={q} onQueryChange={setQ}\n * searchPlaceholder={t(\"search\")} emptyLabel={t(\"empty\")}\n * />\n */\nexport function AppGrid({\n apps,\n groups,\n query,\n onQueryChange,\n searchPlaceholder = defaultAppGridLabels.searchPlaceholder,\n autoFocusSearch = false,\n emptyLabel = defaultAppGridLabels.empty,\n className,\n}: AppGridProps) {\n const grouped = groups != null\n const sections = grouped ? groups.filter((g) => g.apps.length > 0) : []\n const flat = apps ?? []\n const isEmpty = grouped ? sections.length === 0 : flat.length === 0\n\n return (\n <div className={cn(\"space-y-8\", className)}>\n {onQueryChange ? (\n <InputGroup className=\"mx-auto h-10 max-w-md\">\n <InputGroupAddon>\n <Search />\n </InputGroupAddon>\n <InputGroupInput\n type=\"search\"\n value={query ?? \"\"}\n onChange={(e) => onQueryChange(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n autoFocus={autoFocusSearch}\n />\n </InputGroup>\n ) : null}\n\n {isEmpty ? (\n <p className=\"text-muted-foreground py-16 text-center text-sm\">\n {emptyLabel}\n </p>\n ) : grouped ? (\n <div className=\"space-y-10\">\n {sections.map((g) => (\n <section key={g.key} className=\"space-y-4\">\n <div className=\"space-y-1\">\n <h2 className=\"text-sm font-semibold tracking-tight\">{g.label}</h2>\n {g.description ? (\n <p className=\"text-muted-foreground text-xs\">{g.description}</p>\n ) : null}\n </div>\n <AppTileGrid apps={g.apps} />\n </section>\n ))}\n </div>\n ) : (\n <AppTileGrid apps={flat} />\n )}\n </div>\n )\n}\n\n/** The responsive tile grid shared by {@link AppGrid}'s flat and grouped modes. */\nfunction AppTileGrid({ apps }: { apps: AppGridItem[] }) {\n return (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">\n {apps.map((app) => (\n <AppTile key={app.key} app={app} />\n ))}\n </div>\n )\n}\n\n/**\n * A single application tile: the icon in a tinted rounded chip above the name +\n * description. Exported for callers that render their own grid.\n */\nexport function AppTile({ app }: { app: AppGridItem }) {\n return (\n <a\n href={app.href}\n target={app.external ? \"_blank\" : undefined}\n rel={app.external ? \"noreferrer\" : undefined}\n className=\"focus-visible:ring-ring group rounded-none outline-none focus-visible:ring-2\"\n >\n <Card className=\"h-full items-center gap-4 px-6 py-8 text-center transition-all duration-200 group-hover:-translate-y-0.5 group-hover:shadow-md group-hover:ring-foreground/30\">\n {/* Tinted icon tile (sharp — matches lyra's rounded-none aesthetic);\n `accent` carries the text-… (icon, via currentColor) + bg-… tint. */}\n <div\n className={cn(\n \"flex size-14 items-center justify-center rounded-none ring-1 ring-foreground/5 ring-inset transition-transform duration-200 group-hover:scale-105 [&_svg]:size-7\",\n app.accent,\n )}\n >\n {app.icon}\n </div>\n <div className=\"space-y-1\">\n <CardTitle>{app.name}</CardTitle>\n {app.description ? (\n <CardDescription className=\"line-clamp-2\">\n {app.description}\n </CardDescription>\n ) : null}\n </div>\n </Card>\n </a>\n )\n}\n","\"use client\"\n\n// Shared visual vocabulary for launcher/registry apps: the FULL lucide icon set\n// (via lucide-react/dynamic — no hand-maintained registry), an accent-color\n// palette, and <AppGlyph> — the single renderer used by the app switcher\n// (NavBrand), the launcher (AppGrid), and each app's Apps admin so a registered\n// app looks identical everywhere.\n//\n// An app's `icon` is a lucide icon name (any of lucide's ~1600 — kebab\n// \"hard-drive\" or Pascal \"HardDrive\"), an image URL, or empty (→ name monogram).\n// `color` is a hex accent (\"\" → theme default).\n\nimport { DynamicIcon, iconNames, type IconName } from \"lucide-react/dynamic\"\n\nimport { cn } from \"~/utils/cn.js\"\n\n/** Every lucide icon name (kebab-case) — the icon picker's source of truth. */\nexport const APP_ICON_NAMES: readonly IconName[] = iconNames\n\nconst ICON_NAME_SET = new Set<string>(iconNames)\n\n/** Normalize a stored name to lucide's kebab-case (\"HardDrive\" → \"hard-drive\"). */\nexport function toIconName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase()\n}\n\n/** True when `name` resolves to a known lucide icon. */\nexport function isLucideIcon(name: string): boolean {\n return ICON_NAME_SET.has(toIconName(name))\n}\n\n/** Accent palette (tailwind-500 hues) — read well on light + dark surfaces. */\nexport const APP_COLORS: string[] = [\n \"#64748b\", \"#ef4444\", \"#f97316\", \"#f59e0b\", \"#eab308\", \"#22c55e\",\n \"#10b981\", \"#14b8a6\", \"#06b6d4\", \"#3b82f6\", \"#6366f1\", \"#8b5cf6\",\n \"#a855f7\", \"#ec4899\", \"#f43f5e\",\n]\n\nexport function isIconUrl(s: string): boolean {\n return /^(https?:)?\\/\\//.test(s) || s.startsWith(\"/\") || s.startsWith(\"data:\")\n}\n\n/** Append an alpha to a #rrggbb hex → #rrggbbaa (for tinted backgrounds). */\nfunction hexA(hex: string, alpha: number): string {\n const a = Math.round(alpha * 255).toString(16).padStart(2, \"0\")\n return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}${a}` : hex\n}\n\nexport interface AppGlyphProps {\n /** Lucide icon name, image URL, or empty (→ monogram). */\n icon?: string\n /** Hex accent color; \"\" → theme default. */\n color?: string\n /** App name — the monogram fallback + a11y. */\n name?: string\n className?: string\n}\n\n/** The colored glyph for an app: image (URL), lucide icon (name), or monogram. */\nexport function AppGlyph({ icon, color, name, className }: AppGlyphProps) {\n const box = cn(\"flex size-9 shrink-0 items-center justify-center rounded-none\", className)\n\n if (icon && isIconUrl(icon)) {\n return (\n <span\n aria-hidden\n className={cn(box, \"bg-muted bg-cover bg-center\")}\n style={{ backgroundImage: `url(\"${encodeURI(icon)}\")` }}\n />\n )\n }\n\n const tint = color ? { backgroundColor: hexA(color, 0.14) } : undefined\n const fg = color ? { color } : undefined\n const iconName = icon ? toIconName(icon) : \"\"\n\n if (iconName && ICON_NAME_SET.has(iconName)) {\n return (\n <span aria-hidden className={cn(box, !color && \"bg-primary/10\")} style={tint}>\n <DynamicIcon\n name={iconName as IconName}\n className={cn(\"size-5\", !color && \"text-primary\")}\n style={fg}\n />\n </span>\n )\n }\n\n const ch = (name || icon || \"?\").charAt(0).toUpperCase()\n return (\n <span\n aria-hidden\n className={cn(box, \"text-sm font-semibold\", !color && \"bg-primary/10 text-primary\")}\n style={color ? { ...tint, ...fg } : undefined}\n >\n {ch}\n </span>\n )\n}\n"]}
package/dist/ui/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent, Label } from '../chunk-44WIOUJJ.js';
3
3
  export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Label } from '../chunk-44WIOUJJ.js';
4
4
  export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from '../chunk-CV3UXQBT.js';
5
- import { Separator, InputGroup, InputGroupAddon } from '../chunk-ENKLOTSE.js';
6
- export { AccountMenu, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, ScrollArea, ScrollBar, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, defaultAccountMenuLabels, initialsOf, useSidebar } from '../chunk-ENKLOTSE.js';
5
+ import { Separator, InputGroup, InputGroupAddon } from '../chunk-V6TVUMAU.js';
6
+ export { AccountMenu, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, ScrollArea, ScrollBar, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, defaultAccountMenuLabels, initialsOf, useSidebar } from '../chunk-V6TVUMAU.js';
7
7
  import '../chunk-QYA2HGKW.js';
8
8
  export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '../chunk-ZG5ZPKFL.js';
9
9
  export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Input } from '../chunk-SQA4ILAK.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradalab/lyra",
3
- "version": "1.7.3",
3
+ "version": "1.8.0",
4
4
  "description": "Tradalab UI kit — shadcn (radix-lyra) primitives, composed components, and app shell for React 19 / Next 16 / Tailwind v4.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,