@arolariu/components
Version:
A collection of reusable components for React applications, built as ESM & CJS modules with tree shake, minify and bundler optimizations enabled, for the lowest bundle size (import cost)!
1 lines • 33.7 kB
Source Map (JSON)
{"version":3,"file":"components\\ui\\sidebar.cjs","sources":["webpack://@arolariu/components/./src/components/ui/sidebar.tsx"],"sourcesContent":["\r\n\r\nimport * as React from \"react\";\r\nimport { PanelLeftIcon } from \"lucide-react\";\r\nimport { useIsMobile } from \"./../../hooks/use-mobile\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"./tooltip\";\r\nimport { cn } from \"./../../lib/utils\";\r\nimport {\r\n Sheet,\r\n SheetContent,\r\n SheetDescription,\r\n SheetHeader,\r\n SheetTitle,\r\n} from \"./sheet\";\r\nimport { Input } from \"./input\";\r\nimport { Skeleton } from \"./skeleton\";\r\nimport { Button } from \"./button\";\r\nimport { Separator } from \"./separator\";\r\nimport { Slot } from \"@radix-ui/react-slot\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\n\r\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\";\r\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\r\nconst SIDEBAR_WIDTH = \"16rem\";\r\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\r\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\r\n\r\ntype SidebarContext = {\r\n state: \"expanded\" | \"collapsed\";\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n openMobile: boolean;\r\n setOpenMobile: (open: boolean) => void;\r\n isMobile: boolean;\r\n toggleSidebar: () => void;\r\n};\r\n\r\nconst SidebarContext = React.createContext<SidebarContext | null>(null);\r\n\r\nfunction useSidebar() {\r\n const context = React.useContext(SidebarContext);\r\n if (!context) {\r\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\r\n }\r\n\r\n return context;\r\n}\r\n\r\nfunction SidebarProvider({\r\n defaultOpen = true,\r\n open: openProp,\r\n onOpenChange: setOpenProp,\r\n className,\r\n style,\r\n children,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & {\r\n defaultOpen?: boolean;\r\n open?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n}) {\r\n const isMobile = useIsMobile();\r\n const [openMobile, setOpenMobile] = React.useState(false);\r\n\r\n // This is the internal state of the sidebar.\r\n // We use openProp and setOpenProp for control from outside the component.\r\n const [_open, _setOpen] = React.useState(defaultOpen);\r\n const open = openProp ?? _open;\r\n const setOpen = React.useCallback(\r\n (value: boolean | ((value: boolean) => boolean)) => {\r\n const openState = typeof value === \"function\" ? value(open) : value;\r\n if (setOpenProp) {\r\n setOpenProp(openState);\r\n } else {\r\n _setOpen(openState);\r\n }\r\n\r\n // This sets the cookie to keep the sidebar state.\r\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\r\n },\r\n [setOpenProp, open]\r\n );\r\n\r\n // Helper to toggle the sidebar.\r\n const toggleSidebar = React.useCallback(() => {\r\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\r\n }, [isMobile, setOpen, setOpenMobile]);\r\n\r\n // Adds a keyboard shortcut to toggle the sidebar.\r\n React.useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (\r\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\r\n (event.metaKey || event.ctrlKey)\r\n ) {\r\n event.preventDefault();\r\n toggleSidebar();\r\n }\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [toggleSidebar]);\r\n\r\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n // This makes it easier to style the sidebar with Tailwind classes.\r\n const state = open ? \"expanded\" : \"collapsed\";\r\n\r\n const contextValue = React.useMemo<SidebarContext>(\r\n () => ({\r\n state,\r\n open,\r\n setOpen,\r\n isMobile,\r\n openMobile,\r\n setOpenMobile,\r\n toggleSidebar,\r\n }),\r\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\r\n );\r\n\r\n return (\r\n <SidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <div\r\n data-slot=\"sidebar-wrapper\"\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH,\r\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\r\n ...style,\r\n } as React.CSSProperties\r\n }\r\n className={cn(\r\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </TooltipProvider>\r\n </SidebarContext.Provider>\r\n );\r\n}\r\n\r\nfunction Sidebar({\r\n side = \"left\",\r\n variant = \"sidebar\",\r\n collapsible = \"offcanvas\",\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & {\r\n side?: \"left\" | \"right\";\r\n variant?: \"sidebar\" | \"floating\" | \"inset\";\r\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\r\n}) {\r\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\r\n\r\n if (collapsible === \"none\") {\r\n return (\r\n <div\r\n data-slot=\"sidebar\"\r\n className={cn(\r\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n }\r\n\r\n if (isMobile) {\r\n return (\r\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n <SheetContent\r\n data-sidebar=\"sidebar\"\r\n data-slot=\"sidebar\"\r\n data-mobile=\"true\"\r\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\r\n style={\r\n {\r\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\r\n } as React.CSSProperties\r\n }\r\n side={side}\r\n >\r\n <SheetHeader className=\"sr-only\">\r\n <SheetTitle>Sidebar</SheetTitle>\r\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\r\n </SheetHeader>\r\n <div className=\"flex h-full w-full flex-col\">{children}</div>\r\n </SheetContent>\r\n </Sheet>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"group peer text-sidebar-foreground hidden md:block\"\r\n data-state={state}\r\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\r\n data-variant={variant}\r\n data-side={side}\r\n data-slot=\"sidebar\"\r\n >\r\n {/* This is what handles the sidebar gap on desktop */}\r\n <div\r\n className={cn(\r\n \"relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\r\n \"group-data-[collapsible=offcanvas]:w-0\",\r\n \"group-data-[side=right]:rotate-180\",\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\r\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\r\n )}\r\n />\r\n <div\r\n className={cn(\r\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\r\n side === \"left\"\r\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\r\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\r\n // Adjust the padding for floating and inset variants.\r\n variant === \"floating\" || variant === \"inset\"\r\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\r\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n data-sidebar=\"sidebar\"\r\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-xs\"\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction SidebarTrigger({\r\n className,\r\n onClick,\r\n ...props\r\n}: React.ComponentProps<typeof Button>) {\r\n const { toggleSidebar } = useSidebar();\r\n\r\n return (\r\n <Button\r\n data-sidebar=\"trigger\"\r\n data-slot=\"sidebar-trigger\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-7 w-7\", className)}\r\n onClick={(event) => {\r\n onClick?.(event);\r\n toggleSidebar();\r\n }}\r\n {...props}\r\n >\r\n <PanelLeftIcon />\r\n <span className=\"sr-only\">Toggle Sidebar</span>\r\n </Button>\r\n );\r\n}\r\n\r\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\r\n const { toggleSidebar } = useSidebar();\r\n\r\n return (\r\n <button\r\n data-sidebar=\"rail\"\r\n data-slot=\"sidebar-rail\"\r\n aria-label=\"Toggle Sidebar\"\r\n tabIndex={-1}\r\n onClick={toggleSidebar}\r\n title=\"Toggle Sidebar\"\r\n className={cn(\r\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\r\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\r\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\r\n \"group-data-[collapsible=offcanvas]:hover:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\r\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\r\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\r\n return (\r\n <main\r\n data-slot=\"sidebar-inset\"\r\n className={cn(\r\n \"bg-white relative flex min-h-svh w-full flex-1 flex-col dark:bg-neutral-950\",\r\n \"peer-data-[variant=inset]:min-h-[calc(100svh-(--spacing(4)))] md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-xs md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarInput({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof Input>) {\r\n return (\r\n <Input\r\n data-slot=\"sidebar-input\"\r\n data-sidebar=\"input\"\r\n className={cn(\r\n \"bg-white h-8 w-full shadow-none dark:bg-neutral-950\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-header\"\r\n data-sidebar=\"header\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-footer\"\r\n data-sidebar=\"footer\"\r\n className={cn(\"flex flex-col gap-2 p-2\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof Separator>) {\r\n return (\r\n <Separator\r\n data-slot=\"sidebar-separator\"\r\n data-sidebar=\"separator\"\r\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-content\"\r\n data-sidebar=\"content\"\r\n className={cn(\r\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-group\"\r\n data-sidebar=\"group\"\r\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarGroupLabel({\r\n className,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\r\n const Comp = asChild ? Slot : \"div\";\r\n\r\n return (\r\n <Comp\r\n data-slot=\"sidebar-group-label\"\r\n data-sidebar=\"group-label\"\r\n className={cn(\r\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarGroupAction({\r\n className,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\r\n const Comp = asChild ? Slot : \"button\";\r\n\r\n return (\r\n <Comp\r\n data-slot=\"sidebar-group-action\"\r\n data-sidebar=\"group-action\"\r\n className={cn(\r\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 md:after:hidden\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarGroupContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-group-content\"\r\n data-sidebar=\"group-content\"\r\n className={cn(\"w-full text-sm\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\r\n return (\r\n <ul\r\n data-slot=\"sidebar-menu\"\r\n data-sidebar=\"menu\"\r\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\r\n return (\r\n <li\r\n data-slot=\"sidebar-menu-item\"\r\n data-sidebar=\"menu-item\"\r\n className={cn(\"group/menu-item relative\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] 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 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\r\n outline:\r\n \"bg-white shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))] dark:bg-neutral-950\",\r\n },\r\n size: {\r\n default: \"h-8 text-sm\",\r\n sm: \"h-7 text-xs\",\r\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n);\r\n\r\nfunction SidebarMenuButton({\r\n asChild = false,\r\n isActive = false,\r\n variant = \"default\",\r\n size = \"default\",\r\n tooltip,\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"button\"> & {\r\n asChild?: boolean;\r\n isActive?: boolean;\r\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\r\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\r\n const Comp = asChild ? Slot : \"button\";\r\n const { isMobile, state } = useSidebar();\r\n\r\n const button = (\r\n <Comp\r\n data-slot=\"sidebar-menu-button\"\r\n data-sidebar=\"menu-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n {...props}\r\n />\r\n );\r\n\r\n if (!tooltip) {\r\n return button;\r\n }\r\n\r\n if (typeof tooltip === \"string\") {\r\n tooltip = {\r\n children: tooltip,\r\n };\r\n }\r\n\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>{button}</TooltipTrigger>\r\n <TooltipContent\r\n side=\"right\"\r\n align=\"center\"\r\n hidden={state !== \"collapsed\" || isMobile}\r\n {...tooltip}\r\n />\r\n </Tooltip>\r\n );\r\n}\r\n\r\nfunction SidebarMenuAction({\r\n className,\r\n asChild = false,\r\n showOnHover = false,\r\n ...props\r\n}: React.ComponentProps<\"button\"> & {\r\n asChild?: boolean;\r\n showOnHover?: boolean;\r\n}) {\r\n const Comp = asChild ? Slot : \"button\";\r\n\r\n return (\r\n <Comp\r\n data-slot=\"sidebar-menu-action\"\r\n data-sidebar=\"menu-action\"\r\n className={cn(\r\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n // Increases the hit area of the button on mobile.\r\n \"after:absolute after:-inset-2 md:after:hidden\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n showOnHover &&\r\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarMenuBadge({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-menu-badge\"\r\n data-sidebar=\"menu-badge\"\r\n className={cn(\r\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\r\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\r\n \"peer-data-[size=sm]/menu-button:top-1\",\r\n \"peer-data-[size=default]/menu-button:top-1.5\",\r\n \"peer-data-[size=lg]/menu-button:top-2.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarMenuSkeleton({\r\n className,\r\n showIcon = false,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & {\r\n showIcon?: boolean;\r\n}) {\r\n // Random width between 50 to 90%.\r\n const width = React.useMemo(() => {\r\n return `${Math.floor(Math.random() * 40) + 50}%`;\r\n }, []);\r\n\r\n return (\r\n <div\r\n data-slot=\"sidebar-menu-skeleton\"\r\n data-sidebar=\"menu-skeleton\"\r\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\r\n {...props}\r\n >\r\n {showIcon && (\r\n <Skeleton\r\n className=\"size-4 rounded-md\"\r\n data-sidebar=\"menu-skeleton-icon\"\r\n />\r\n )}\r\n <Skeleton\r\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\r\n data-sidebar=\"menu-skeleton-text\"\r\n style={\r\n {\r\n \"--skeleton-width\": width,\r\n } as React.CSSProperties\r\n }\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\r\n return (\r\n <ul\r\n data-slot=\"sidebar-menu-sub\"\r\n data-sidebar=\"menu-sub\"\r\n className={cn(\r\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarMenuSubItem({\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"li\">) {\r\n return (\r\n <li\r\n data-slot=\"sidebar-menu-sub-item\"\r\n data-sidebar=\"menu-sub-item\"\r\n className={cn(\"group/menu-sub-item relative\", className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction SidebarMenuSubButton({\r\n asChild = false,\r\n size = \"md\",\r\n isActive = false,\r\n className,\r\n ...props\r\n}: React.ComponentProps<\"a\"> & {\r\n asChild?: boolean;\r\n size?: \"sm\" | \"md\";\r\n isActive?: boolean;\r\n}) {\r\n const Comp = asChild ? Slot : \"a\";\r\n\r\n return (\r\n <Comp\r\n data-slot=\"sidebar-menu-sub-button\"\r\n data-sidebar=\"menu-sub-button\"\r\n data-size={size}\r\n data-active={isActive}\r\n className={cn(\r\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\r\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\r\n size === \"sm\" && \"text-xs\",\r\n size === \"md\" && \"text-sm\",\r\n \"group-data-[collapsible=icon]:hidden\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarGroup,\r\n SidebarGroupAction,\r\n SidebarGroupContent,\r\n SidebarGroupLabel,\r\n SidebarHeader,\r\n SidebarInput,\r\n SidebarInset,\r\n SidebarMenu,\r\n SidebarMenuAction,\r\n SidebarMenuBadge,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSkeleton,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n SidebarProvider,\r\n SidebarRail,\r\n SidebarSeparator,\r\n SidebarTrigger,\r\n useSidebar,\r\n};\r\n"],"names":["SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","React","useSidebar","context","Error","SidebarProvider","defaultOpen","openProp","setOpenProp","className","style","children","props","isMobile","useIsMobile","openMobile","setOpenMobile","_open","_setOpen","open","setOpen","value","openState","document","toggleSidebar","handleKeyDown","event","window","state","contextValue","TooltipProvider","cn","Sidebar","side","variant","collapsible","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","SidebarTrigger","onClick","Button","PanelLeftIcon","SidebarRail","SidebarInset","SidebarInput","Input","SidebarHeader","SidebarFooter","SidebarSeparator","Separator","SidebarContent","SidebarGroup","SidebarGroupLabel","asChild","Comp","Slot","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","cva","SidebarMenuButton","isActive","size","tooltip","button","Tooltip","TooltipTrigger","TooltipContent","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","width","Math","Skeleton","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton"],"mappings":"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"}