{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "sidebar",
  "type": "registry:block",
  "title": "Sidebar",
  "description": "Sidebar with Crafter styling. Explore the live example and use the source in your project.",
  "dependencies": [
    "@base-ui/react@^1.8.0",
    "class-variance-authority@^0.7.1",
    "cn@^0.2.6",
    "lucide-react@^1.42.0"
  ],
  "files": [
    {
      "path": "components/ui/button.tsx",
      "type": "registry:ui",
      "content": "import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst buttonVariants = cva(\n  \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n        outline:\n          \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n        secondary:\n          \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n        ghost:\n          \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n        destructive:\n          \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n      size: {\n        default:\n          \"h-[var(--control-height,2rem)] gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n        xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n        sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n        lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n        icon: \"size-8\",\n        \"icon-xs\":\n          \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n        \"icon-sm\":\n          \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n        \"icon-lg\": \"size-9\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nfunction Button({\n  className,\n  variant = \"default\",\n  size = \"default\",\n  ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n  return (\n    <ButtonPrimitive\n      data-slot=\"button\"\n      className={cn(buttonVariants({ variant, size, className }))}\n      {...props}\n    />\n  )\n}\n\nexport { Button, buttonVariants }\n"
    },
    {
      "path": "components/ui/input.tsx",
      "type": "registry:ui",
      "content": "import * as React from \"react\"\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport { cn } from \"cn\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n  return (\n    <InputPrimitive\n      type={type}\n      data-slot=\"input\"\n      className={cn(\n        \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/30 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm 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 { Input }\n"
    },
    {
      "path": "components/ui/separator.tsx",
      "type": "registry:ui",
      "content": "\"use client\"\n\nimport { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\nimport { cn } from \"cn\"\n\nfunction Separator({\n  className,\n  orientation = \"horizontal\",\n  ...props\n}: SeparatorPrimitive.Props) {\n  return (\n    <SeparatorPrimitive\n      data-slot=\"separator\"\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"
    },
    {
      "path": "components/ui/sheet.tsx",
      "type": "registry:ui",
      "content": "\"use client\";\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\";\nimport { cn } from \"cn\";\nimport { XIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nfunction Sheet({ ...props }: SheetPrimitive.Root.Props) {\n    return <SheetPrimitive.Root data-slot=\"sheet\" {...props}/>;\n}\nfunction SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {\n    return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props}/>;\n}\nfunction SheetClose({ ...props }: SheetPrimitive.Close.Props) {\n    return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props}/>;\n}\nfunction SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {\n    return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props}/>;\n}\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n    return (<SheetPrimitive.Backdrop data-slot=\"sheet-overlay\" className={cn(\"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\", className)} {...props}/>);\n}\nfunction SheetContent({ className, children, side = \"right\", showCloseButton = true, showOverlay = true, ...props }: SheetPrimitive.Popup.Props & {\n    side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n    showCloseButton?: boolean;\n    showOverlay?: boolean;\n}) {\n    return (<SheetPortal>\n      {showOverlay && <SheetOverlay />}\n      <SheetPrimitive.Popup data-slot=\"sheet-content\" data-side={side} className={cn(\"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] 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=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] 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=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\", className)} {...props}>\n        {children}\n        {showCloseButton && (<SheetPrimitive.Close data-slot=\"sheet-close\" render={<Button variant=\"ghost\" className=\"absolute top-3 right-3\" size=\"icon-sm\"/>}>\n            <XIcon />\n            <span className=\"sr-only\">Close</span>\n          </SheetPrimitive.Close>)}\n      </SheetPrimitive.Popup>\n    </SheetPortal>);\n}\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sheet-header\" className={cn(\"flex flex-col gap-0.5 p-4\", className)} {...props}/>);\n}\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sheet-footer\" className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)} {...props}/>);\n}\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n    return (<SheetPrimitive.Title data-slot=\"sheet-title\" className={cn(\"font-heading text-base font-medium text-foreground\", className)} {...props}/>);\n}\nfunction SheetDescription({ className, ...props }: SheetPrimitive.Description.Props) {\n    return (<SheetPrimitive.Description data-slot=\"sheet-description\" className={cn(\"text-sm text-muted-foreground\", className)} {...props}/>);\n}\nexport { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, };\n"
    },
    {
      "path": "components/ui/sidebar.tsx",
      "type": "registry:ui",
      "content": "\"use client\";\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"cn\";\nimport { PanelLeftIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from \"@/components/ui/sheet\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger, } from \"@/components/ui/tooltip\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\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\";\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};\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\nfunction useSidebar() {\n    const context = React.useContext(SidebarContext);\n    if (!context) {\n        throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n    }\n    return context;\n}\nfunction SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<\"div\"> & {\n    defaultOpen?: boolean;\n    open?: boolean;\n    onOpenChange?: (open: boolean) => void;\n}) {\n    const isMobile = useIsMobile();\n    const [openMobile, setOpenMobile] = React.useState(false);\n    const [_open, _setOpen] = React.useState(defaultOpen);\n    const open = openProp ?? _open;\n    const setOpen = React.useCallback((value: boolean | ((value: boolean) => boolean)) => {\n        const openState = typeof value === \"function\" ? value(open) : value;\n        if (setOpenProp) {\n            setOpenProp(openState);\n        }\n        else {\n            _setOpen(openState);\n        }\n        document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n    }, [setOpenProp, open]);\n    const toggleSidebar = React.useCallback(() => {\n        return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n    }, [isMobile, setOpen, setOpenMobile]);\n    React.useEffect(() => {\n        const handleKeyDown = (event: KeyboardEvent) => {\n            if (event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n                (event.metaKey || event.ctrlKey)) {\n                event.preventDefault();\n                toggleSidebar();\n            }\n        };\n        window.addEventListener(\"keydown\", handleKeyDown);\n        return () => window.removeEventListener(\"keydown\", handleKeyDown);\n    }, [toggleSidebar]);\n    const state = open ? \"expanded\" : \"collapsed\";\n    const contextValue = React.useMemo<SidebarContextProps>(() => ({\n        state,\n        open,\n        setOpen,\n        isMobile,\n        openMobile,\n        setOpenMobile,\n        toggleSidebar,\n    }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]);\n    return (<SidebarContext.Provider value={contextValue}>\n      <div data-slot=\"sidebar-wrapper\" style={{\n            \"--sidebar-width\": SIDEBAR_WIDTH,\n            \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n            ...style,\n        } as React.CSSProperties} className={cn(\"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\", className)} {...props}>\n        {children}\n      </div>\n    </SidebarContext.Provider>);\n}\nfunction Sidebar({ side = \"left\", variant = \"sidebar\", collapsible = \"offcanvas\", className, children, dir, ...props }: 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    if (collapsible === \"none\") {\n        return (<div data-slot=\"sidebar\" className={cn(\"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\", className)} {...props}>\n        {children}\n      </div>);\n    }\n    if (isMobile) {\n        return (<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n        <SheetContent dir={dir} data-sidebar=\"sidebar\" data-slot=\"sidebar\" data-mobile=\"true\" className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\" style={{\n                \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n            } as React.CSSProperties} side={side}>\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    return (<div className=\"group peer hidden text-sidebar-foreground md:block\" data-state={state} data-collapsible={state === \"collapsed\" ? collapsible : \"\"} data-variant={variant} data-side={side} data-slot=\"sidebar\">\n      \n      <div data-slot=\"sidebar-gap\" className={cn(\"relative 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\"\n            ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n            : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\")}/>\n      <div data-slot=\"sidebar-container\" data-side={side} className={cn(\"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\", 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\", className)} {...props}>\n        <div data-sidebar=\"sidebar\" data-slot=\"sidebar-inner\" className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\">\n          {children}\n        </div>\n      </div>\n    </div>);\n}\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n    const { toggleSidebar } = useSidebar();\n    return (<Button data-sidebar=\"trigger\" data-slot=\"sidebar-trigger\" variant=\"ghost\" size=\"icon-sm\" className={cn(className)} onClick={(event) => {\n            onClick?.(event);\n            toggleSidebar();\n        }} {...props}>\n      <PanelLeftIcon />\n      <span className=\"sr-only\">Toggle Sidebar</span>\n    </Button>);\n}\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n    const { toggleSidebar } = useSidebar();\n    return (<button data-sidebar=\"rail\" data-slot=\"sidebar-rail\" aria-label=\"Toggle Sidebar\" tabIndex={-1} onClick={toggleSidebar} title=\"Toggle Sidebar\" className={cn(\"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\", \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\", \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\", \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\", \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\", \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\", className)} {...props}/>);\n}\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n    return (<main data-slot=\"sidebar-inset\" className={cn(\"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-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\", className)} {...props}/>);\n}\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n    return (<Input data-slot=\"sidebar-input\" data-sidebar=\"input\" className={cn(\"h-8 w-full bg-background shadow-none\", className)} {...props}/>);\n}\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sidebar-header\" data-sidebar=\"header\" className={cn(\"flex flex-col gap-2 p-2\", className)} {...props}/>);\n}\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sidebar-footer\" data-sidebar=\"footer\" className={cn(\"flex flex-col gap-2 p-2\", className)} {...props}/>);\n}\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n    return (<Separator data-slot=\"sidebar-separator\" data-sidebar=\"separator\" className={cn(\"mx-2 w-auto bg-sidebar-border\", className)} {...props}/>);\n}\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sidebar-content\" data-sidebar=\"content\" className={cn(\"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\", className)} {...props}/>);\n}\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sidebar-group\" data-sidebar=\"group\" className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)} {...props}/>);\n}\nfunction SidebarGroupLabel({ className, render, ...props }: useRender.ComponentProps<\"div\"> & React.ComponentProps<\"div\">) {\n    return useRender({\n        defaultTagName: \"div\",\n        props: mergeProps<\"div\">({\n            className: cn(\"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium 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\", className),\n        }, props),\n        render,\n        state: {\n            slot: \"sidebar-group-label\",\n            sidebar: \"group-label\",\n        },\n    });\n}\nfunction SidebarGroupAction({ className, render, ...props }: useRender.ComponentProps<\"button\"> & React.ComponentProps<\"button\">) {\n    return useRender({\n        defaultTagName: \"button\",\n        props: mergeProps<\"button\">({\n            className: cn(\"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md 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\", className),\n        }, props),\n        render,\n        state: {\n            slot: \"sidebar-group-action\",\n            sidebar: \"group-action\",\n        },\n    });\n}\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sidebar-group-content\" data-sidebar=\"group-content\" className={cn(\"w-full text-sm\", className)} {...props}/>);\n}\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n    return (<ul data-slot=\"sidebar-menu\" data-sidebar=\"menu\" className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)} {...props}/>);\n}\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n    return (<li data-slot=\"sidebar-menu-item\" data-sidebar=\"menu-item\" className={cn(\"group/menu-item relative\", className)} {...props}/>);\n}\nconst sidebarMenuButtonVariants = cva(\"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm 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    variants: {\n        variant: {\n            default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n            outline: \"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-sm\",\n            sm: \"h-7 text-xs\",\n            lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n        },\n    },\n    defaultVariants: {\n        variant: \"default\",\n        size: \"default\",\n    },\n});\nfunction SidebarMenuButton({ render, isActive = false, variant = \"default\", size = \"default\", tooltip, className, ...props }: useRender.ComponentProps<\"button\"> & React.ComponentProps<\"button\"> & {\n    isActive?: boolean;\n    tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n    const { isMobile, state } = useSidebar();\n    const comp = useRender({\n        defaultTagName: \"button\",\n        props: mergeProps<\"button\">({\n            className: cn(sidebarMenuButtonVariants({ variant, size }), className),\n        }, props),\n        render: !tooltip ? render : <TooltipTrigger render={render}/>,\n        state: {\n            slot: \"sidebar-menu-button\",\n            sidebar: \"menu-button\",\n            size,\n            active: isActive,\n        },\n    });\n    if (!tooltip) {\n        return comp;\n    }\n    if (typeof tooltip === \"string\") {\n        tooltip = {\n            children: tooltip,\n        };\n    }\n    return (<Tooltip>\n      {comp}\n      <TooltipContent side=\"right\" align=\"center\" hidden={state !== \"collapsed\" || isMobile} {...tooltip}/>\n    </Tooltip>);\n}\nfunction SidebarMenuAction({ className, render, showOnHover = false, ...props }: useRender.ComponentProps<\"button\"> & React.ComponentProps<\"button\"> & {\n    showOnHover?: boolean;\n}) {\n    return useRender({\n        defaultTagName: \"button\",\n        props: mergeProps<\"button\">({\n            className: cn(\"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md 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\", 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\", className),\n        }, props),\n        render,\n        state: {\n            slot: \"sidebar-menu-action\",\n            sidebar: \"menu-action\",\n        },\n    });\n}\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"sidebar-menu-badge\" data-sidebar=\"menu-badge\" className={cn(\"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md 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\", className)} {...props}/>);\n}\nfunction SidebarMenuSkeleton({ className, showIcon = false, ...props }: React.ComponentProps<\"div\"> & {\n    showIcon?: boolean;\n}) {\n    const [width] = React.useState(() => {\n        return `${Math.floor(Math.random() * 40) + 50}%`;\n    });\n    return (<div data-slot=\"sidebar-menu-skeleton\" data-sidebar=\"menu-skeleton\" className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)} {...props}>\n      {showIcon && (<Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\"/>)}\n      <Skeleton className=\"h-4 max-w-(--skeleton-width) flex-1\" data-sidebar=\"menu-skeleton-text\" style={{\n            \"--skeleton-width\": width,\n        } as React.CSSProperties}/>\n    </div>);\n}\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n    return (<ul data-slot=\"sidebar-menu-sub\" data-sidebar=\"menu-sub\" className={cn(\"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\", className)} {...props}/>);\n}\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n    return (<li data-slot=\"sidebar-menu-sub-item\" data-sidebar=\"menu-sub-item\" className={cn(\"group/menu-sub-item relative\", className)} {...props}/>);\n}\nfunction SidebarMenuSubButton({ render, size = \"md\", isActive = false, className, ...props }: useRender.ComponentProps<\"a\"> & React.ComponentProps<\"a\"> & {\n    size?: \"sm\" | \"md\";\n    isActive?: boolean;\n}) {\n    return useRender({\n        defaultTagName: \"a\",\n        props: mergeProps<\"a\">({\n            className: cn(\"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md 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-sm 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\", className),\n        }, props),\n        render,\n        state: {\n            slot: \"sidebar-menu-sub-button\",\n            sidebar: \"menu-sub-button\",\n            size,\n            active: isActive,\n        },\n    });\n}\nexport { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, };\n"
    },
    {
      "path": "components/ui/skeleton.tsx",
      "type": "registry:ui",
      "content": "import { cn } from \"cn\";\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n    return (<div data-slot=\"skeleton\" className={cn(\"animate-pulse rounded-md bg-muted\", className)} {...props}/>);\n}\nexport { Skeleton };\n"
    },
    {
      "path": "components/ui/tooltip.tsx",
      "type": "registry:ui",
      "content": "\"use client\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { cn } from \"cn\";\nfunction TooltipProvider({ delay = 0, ...props }: TooltipPrimitive.Provider.Props) {\n    return (<TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delay={delay} {...props}/>);\n}\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n    return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}/>;\n}\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n    return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props}/>;\n}\nfunction TooltipContent({ className, side = \"top\", sideOffset = 4, align = \"center\", alignOffset = 0, children, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\">) {\n    return (<TooltipPrimitive.Portal>\n      <TooltipPrimitive.Positioner align={align} alignOffset={alignOffset} side={side} sideOffset={sideOffset} className=\"isolate z-50\">\n        <TooltipPrimitive.Popup data-slot=\"tooltip-content\" className={cn(\"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md 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=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-sm 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\", className)} {...props}>\n          {children}\n          <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\"/>\n        </TooltipPrimitive.Popup>\n      </TooltipPrimitive.Positioner>\n    </TooltipPrimitive.Portal>);\n}\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n"
    },
    {
      "path": "hooks/use-mobile.ts",
      "type": "registry:hook",
      "content": "import * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\nexport function useIsMobile() {\n  const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n    undefined,\n  );\n  React.useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n    const onChange = () => {\n      setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n    };\n    mql.addEventListener(\"change\", onChange);\n    setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n    return () => mql.removeEventListener(\"change\", onChange);\n  }, []);\n  return !!isMobile;\n}\n"
    }
  ],
  "cssVars": {
    "light": {
      "background": "#ffffff",
      "foreground": "#141414",
      "card": "#ffffff",
      "card-foreground": "#141414",
      "popover": "#ffffff",
      "popover-foreground": "#141414",
      "secondary": "#f5f5f5",
      "secondary-foreground": "#141414",
      "muted": "#f5f5f5",
      "muted-foreground": "#6b6b6b",
      "accent": "#f0f0f0",
      "accent-foreground": "#141414",
      "border": "#e6e6e6",
      "input": "#cccccc",
      "destructive": "#b91c1c",
      "syntax-text": "#242424",
      "syntax-keyword": "#754399",
      "syntax-string": "#326348",
      "syntax-function": "#315d89",
      "syntax-number": "#86551f",
      "syntax-comment": "#6b6b6b",
      "syntax-punctuation": "#616161",
      "syntax-type": "#7c464c",
      "syntax-background": "#f8f8f8",
      "sidebar": "#f5f5f5",
      "sidebar-foreground": "#141414",
      "sidebar-primary": "#141414",
      "sidebar-primary-foreground": "#ffffff",
      "sidebar-accent": "#f0f0f0",
      "sidebar-accent-foreground": "#141414",
      "sidebar-border": "#e6e6e6",
      "sidebar-ring": "#141414",
      "chart-1": "#141414",
      "chart-2": "#525252",
      "chart-3": "#737373",
      "chart-4": "#a3a3a3",
      "chart-5": "#d4d4d4",
      "primary": "#141414",
      "primary-foreground": "#ffffff",
      "ring": "#141414",
      "radius": "0rem",
      "font-sans": "ui-sans-serif, system-ui, sans-serif",
      "control-height": "2rem"
    },
    "dark": {
      "background": "#141414",
      "foreground": "#fafafa",
      "card": "#1c1c1c",
      "card-foreground": "#fafafa",
      "popover": "#1c1c1c",
      "popover-foreground": "#fafafa",
      "secondary": "#262626",
      "secondary-foreground": "#fafafa",
      "muted": "#262626",
      "muted-foreground": "#a3a3a3",
      "accent": "#303030",
      "accent-foreground": "#fafafa",
      "border": "#404040",
      "input": "#404040",
      "destructive": "#ff9d9d",
      "syntax-text": "#ededed",
      "syntax-keyword": "#c6a3df",
      "syntax-string": "#98c4a4",
      "syntax-function": "#9cbedf",
      "syntax-number": "#d7b27d",
      "syntax-comment": "#a3a3a3",
      "syntax-punctuation": "#b0b0b0",
      "syntax-type": "#dda2aa",
      "syntax-background": "#1b1b1b",
      "sidebar": "#262626",
      "sidebar-foreground": "#fafafa",
      "sidebar-primary": "#fafafa",
      "sidebar-primary-foreground": "#141414",
      "sidebar-accent": "#303030",
      "sidebar-accent-foreground": "#fafafa",
      "sidebar-border": "#404040",
      "sidebar-ring": "#fafafa",
      "chart-1": "#fafafa",
      "chart-2": "#d4d4d4",
      "chart-3": "#a3a3a3",
      "chart-4": "#737373",
      "chart-5": "#525252",
      "primary": "#fafafa",
      "primary-foreground": "#141414",
      "ring": "#fafafa",
      "radius": "0rem",
      "font-sans": "ui-sans-serif, system-ui, sans-serif",
      "control-height": "2rem"
    }
  }
}
