import { jsx, jsxs } from "react/jsx-runtime"; import * as React from "react"; import { useState, useEffect } from "react"; import { Slot } from "@radix-ui/react-slot"; import { cva } from "class-variance-authority"; import { PanelLeftIcon } from "lucide-react"; import { c as cn } from "./utils-DLCPGU0v.js"; import { B as Button } from "./button-CdJZJLGw.js"; import "./separator-CSqU-rrB.js"; import { S as Sheet, c as SheetHeader, d as SheetTitle, e as SheetDescription, b as SheetContent } from "./sheet-BOQ-e9_C.js"; import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from "./tooltip-BYKuzaoQ.js"; const MOBILE_BREAKPOINT = 768; function useIsMobile() { const [isMobile, setIsMobile] = useState(); useEffect(() => { const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); const onChange = () => { setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); }; mql.addEventListener("change", onChange); setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); return () => mql.removeEventListener("change", onChange); }, []); return !!isMobile; } const SIDEBAR_COOKIE_NAME = "sidebar_state"; const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; const SIDEBAR_WIDTH = "16rem"; const SIDEBAR_WIDTH_MOBILE = "18rem"; const SIDEBAR_WIDTH_ICON = "3rem"; const SIDEBAR_KEYBOARD_SHORTCUT = "b"; const SidebarContext = React.createContext(null); function useSidebar() { const context = React.useContext(SidebarContext); if (!context) { throw new Error("useSidebar must be used within a SidebarProvider."); } return context; } function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) { const isMobile = useIsMobile(); const [openMobile, setOpenMobile] = React.useState(false); const [_open, _setOpen] = React.useState(defaultOpen); const open = openProp ?? _open; const setOpen = React.useCallback( (value) => { const openState = typeof value === "function" ? value(open) : value; if (setOpenProp) { setOpenProp(openState); } else { _setOpen(openState); } document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; }, [setOpenProp, open] ); const toggleSidebar = React.useCallback(() => { return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2); }, [isMobile, setOpen, setOpenMobile]); React.useEffect(() => { const handleKeyDown = (event) => { if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) { event.preventDefault(); toggleSidebar(); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [toggleSidebar]); const state = open ? "expanded" : "collapsed"; const contextValue = React.useMemo( () => ({ state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] ); return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx( "div", { "data-slot": "sidebar-wrapper", style: { "--sidebar-width": SIDEBAR_WIDTH, "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, ...style }, className: cn( "group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full", className ), ...props, children } ) }) }); } function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }) { const { isMobile, state, openMobile, setOpenMobile } = useSidebar(); if (collapsible === "none") { return /* @__PURE__ */ jsx( "div", { "data-slot": "sidebar", className: cn( "bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className ), ...props, children } ); } if (isMobile) { return /* @__PURE__ */ jsxs(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: [ /* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [ /* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }), /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." }) ] }), /* @__PURE__ */ jsx( SheetContent, { "data-sidebar": "sidebar", "data-slot": "sidebar", "data-mobile": "true", className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden", style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE }, side, children: /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children }) } ) ] }); } return /* @__PURE__ */ jsxs( "div", { className: "group peer text-sidebar-foreground hidden md:block", "data-state": state, "data-collapsible": state === "collapsed" ? collapsible : "", "data-variant": variant, "data-side": side, "data-slot": "sidebar", children: [ /* @__PURE__ */ jsx( "div", { className: cn( "relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear", "group-data-[collapsible=offcanvas]:w-0", "group-data-[side=right]:rotate-180", variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)" ) } ), /* @__PURE__ */ jsx( "div", { className: cn( "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex", side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", // Adjust the padding for floating and inset variants. variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", className ), ...props, children: /* @__PURE__ */ jsx( "div", { "data-sidebar": "sidebar", 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-sm", children } ) } ) ] } ); } function SidebarTrigger({ className, onClick, ...props }) { const { toggleSidebar } = useSidebar(); return /* @__PURE__ */ jsxs( Button, { "data-sidebar": "trigger", "data-slot": "sidebar-trigger", variant: "ghost", size: "icon", className: cn("h-7 w-7", className), onClick: (event) => { onClick == null ? void 0 : onClick(event); toggleSidebar(); }, ...props, children: [ /* @__PURE__ */ jsx(PanelLeftIcon, {}), /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" }) ] } ); } function SidebarInset({ className, ...props }) { return /* @__PURE__ */ jsx( "main", { "data-slot": "sidebar-inset", className: cn( "bg-background relative flex min-h-svh flex-1 flex-col", "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-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-0", className ), ...props } ); } function SidebarHeader({ className, ...props }) { return /* @__PURE__ */ jsx( "div", { "data-slot": "sidebar-header", "data-sidebar": "header", className: cn("flex flex-col gap-2 p-2", className), ...props } ); } function SidebarFooter({ className, ...props }) { return /* @__PURE__ */ jsx( "div", { "data-slot": "sidebar-footer", "data-sidebar": "footer", className: cn("flex flex-col gap-2 p-2", className), ...props } ); } function SidebarContent({ className, ...props }) { return /* @__PURE__ */ jsx( "div", { "data-slot": "sidebar-content", "data-sidebar": "content", className: cn( "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className ), ...props } ); } function SidebarGroup({ className, ...props }) { return /* @__PURE__ */ jsx( "div", { "data-slot": "sidebar-group", "data-sidebar": "group", className: cn("relative flex w-full min-w-0 flex-col p-2", className), ...props } ); } function SidebarGroupLabel({ className, asChild = false, ...props }) { const Comp = asChild ? Slot : "div"; return /* @__PURE__ */ jsx( Comp, { "data-slot": "sidebar-group-label", "data-sidebar": "group-label", className: cn( "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", "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0", className ), ...props } ); } function SidebarMenu({ className, ...props }) { return /* @__PURE__ */ jsx( "ul", { "data-slot": "sidebar-menu", "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-1", className), ...props } ); } function SidebarMenuItem({ className, ...props }) { return /* @__PURE__ */ jsx( "li", { "data-slot": "sidebar-menu-item", "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props } ); } const sidebarMenuButtonVariants = cva( "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", { variants: { variant: { default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", outline: "bg-background 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))]" }, size: { default: "h-8 text-sm", sm: "h-7 text-xs", lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!" } }, defaultVariants: { variant: "default", size: "default" } } ); function SidebarMenuButton({ asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props }) { const Comp = asChild ? Slot : "button"; const { isMobile, state } = useSidebar(); const button = /* @__PURE__ */ jsx( Comp, { "data-slot": "sidebar-menu-button", "data-sidebar": "menu-button", "data-size": size, "data-active": isActive, className: cn(sidebarMenuButtonVariants({ variant, size }), className), ...props } ); if (!tooltip) { return button; } if (typeof tooltip === "string") { tooltip = { children: tooltip }; } return /* @__PURE__ */ jsxs(Tooltip, { children: [ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }), /* @__PURE__ */ jsx( TooltipContent, { side: "right", align: "center", hidden: state !== "collapsed" || isMobile, ...tooltip } ) ] }); } export { SidebarProvider as S, Sidebar as a, SidebarInset as b, SidebarTrigger as c, SidebarMenuButton as d, SidebarGroup as e, SidebarMenu as f, SidebarGroupLabel as g, SidebarMenuItem as h, useIsMobile as i, SidebarHeader as j, SidebarContent as k, SidebarFooter as l, useSidebar as u };