{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "sidebar",
  "registryDependencies": [
    "@fulldev/layout",
    "@fulldev/button",
    "@fulldev/input",
    "@fulldev/separator",
    "@fulldev/sheet",
    "@fulldev/skeleton",
    "@fulldev/icon",
    "@fulldev/tooltip"
  ],
  "files": [
    {
      "path": "src/components/ui/sidebar/sidebar-provider.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n  defaultOpen?: boolean\n  open?: boolean\n}\n\nconst {\n  class: className,\n  style,\n  defaultOpen = true,\n  open,\n  ...props\n} = Astro.props\n\nconst resolvedStyle = [\n  `--sidebar-width: ${SIDEBAR_WIDTH}`,\n  `--sidebar-width-mobile: ${SIDEBAR_WIDTH_MOBILE}`,\n  `--sidebar-width-icon: ${SIDEBAR_WIDTH_ICON}`,\n  typeof style === \"string\" ? style : undefined,\n]\n  .filter(Boolean)\n  .join(\"; \")\n---\n\n<div\n  data-slot=\"sidebar-wrapper\"\n  data-default-open={defaultOpen ? \"true\" : \"false\"}\n  data-open={open === undefined ? undefined : open ? \"true\" : \"false\"}\n  data-sidebar-initializing=\"true\"\n  style={resolvedStyle}\n  class={cn(\n    \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n  <style is:inline>\n    [data-slot=\"sidebar-wrapper\"][data-sidebar-initializing=\"true\"]\n      [data-slot=\"sidebar-gap\"],\n    [data-slot=\"sidebar-wrapper\"][data-sidebar-initializing=\"true\"]\n      [data-slot=\"sidebar-container\"] {\n      transition: none !important;\n    }\n  </style>\n  <script is:inline>\n    ;(() => {\n      window.__fulldevSyncSidebarProvider ??= (provider, open) => {\n        const state = open ? \"expanded\" : \"collapsed\"\n        const sidebar = provider.querySelector(\n          \"[data-slot='sidebar']:not([data-mobile='true'])\"\n        )\n        const collapsible = sidebar?.dataset.sidebarCollapsible ?? \"offcanvas\"\n\n        provider.dataset.open = open ? \"true\" : \"false\"\n        provider.dataset.state = state\n\n        if (sidebar) {\n          sidebar.dataset.state = collapsible === \"none\" ? \"expanded\" : state\n          sidebar.dataset.collapsible =\n            collapsible === \"none\" ? \"none\" : open ? \"\" : collapsible\n        }\n\n        provider\n          .querySelectorAll(\"[data-sidebar='trigger'], [data-sidebar='rail']\")\n          .forEach((control) => {\n            control.setAttribute(\"aria-expanded\", String(open))\n          })\n\n        provider\n          .querySelectorAll(\"[data-sidebar='menu-tooltip']\")\n          .forEach((tooltip) => {\n            tooltip.hidden = state !== \"collapsed\"\n          })\n      }\n\n      const provider = document.currentScript?.closest(\n        \"[data-slot='sidebar-wrapper']\"\n      )\n      if (!(provider instanceof HTMLElement)) return\n\n      const controlledOpen = provider.dataset.open\n      const cookieValue = document.cookie\n        .split(\"; \")\n        .find((entry) => entry.startsWith(\"sidebar_state=\"))\n        ?.slice(\"sidebar_state=\".length)\n\n      const isOpen =\n        controlledOpen === \"true\" || controlledOpen === \"false\"\n          ? controlledOpen === \"true\"\n          : cookieValue === \"true\" || cookieValue === \"false\"\n            ? cookieValue === \"true\"\n            : provider.dataset.defaultOpen !== \"false\"\n\n      provider.dataset.openMobile = \"false\"\n      window.__fulldevSyncSidebarProvider(provider, isOpen)\n      requestAnimationFrame(() => {\n        provider.removeAttribute(\"data-sidebar-initializing\")\n      })\n    })()\n  </script>\n</div>\n\n<script is:inline>\n  ;(() => {\n    const scrollTop = Number(sessionStorage.getItem(\"sidebar_scroll\") || 0)\n\n    document.querySelectorAll(\"[data-sidebar='content']\").forEach((content) => {\n      content.scrollTop = scrollTop\n    })\n  })()\n</script>\n\n<script is:inline>\n  ;(() => {\n    if (window.__fulldevSidebarInitialized) return\n    window.__fulldevSidebarInitialized = true\n\n    const SIDEBAR_COOKIE_NAME = \"sidebar_state\"\n    const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\n\n    const toggleSidebar = (provider) => {\n      if (!window.matchMedia(\"(min-width: 768px)\").matches) {\n        const openMobile = provider.dataset.openMobile !== \"true\"\n        provider.dataset.openMobile = openMobile ? \"true\" : \"false\"\n        provider\n          .querySelector(\"[data-sidebar='sheet']\")\n          ?.dispatchEvent(\n            new CustomEvent(\"dialog:set\", { detail: { open: openMobile } })\n          )\n        return\n      }\n\n      const open = provider.dataset.open === \"false\"\n      document.cookie = `${SIDEBAR_COOKIE_NAME}=${open}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n      window.__fulldevSyncSidebarProvider?.(provider, open)\n    }\n\n    document.addEventListener(\"click\", (event) => {\n      const control = event.target?.closest?.(\n        \"[data-sidebar='trigger'], [data-sidebar='rail']\"\n      )\n      if (!control || control.matches(\":disabled, [aria-disabled='true']\")) {\n        return\n      }\n\n      const provider = control.closest(\"[data-slot='sidebar-wrapper']\")\n      if (!provider) return\n\n      toggleSidebar(provider)\n    })\n\n    document.addEventListener(\"keydown\", (event) => {\n      if (event.key.toLowerCase() !== \"b\") return\n      if (!event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n        return\n      }\n      if (event.defaultPrevented) return\n\n      const target = event.target\n      const isTyping =\n        target instanceof HTMLElement &&\n        (target.isContentEditable ||\n          target.matches(\"input, textarea, select, [role='textbox']\"))\n      if (isTyping) return\n\n      const provider = document.querySelector(\"[data-slot='sidebar-wrapper']\")\n      if (!(provider instanceof HTMLElement)) return\n\n      event.preventDefault()\n      toggleSidebar(provider)\n    })\n\n    document.addEventListener(\n      \"scroll\",\n      (event) => {\n        if (event.target?.dataset?.sidebar === \"content\") {\n          sessionStorage.setItem(\"sidebar_scroll\", event.target.scrollTop)\n        }\n      },\n      true\n    )\n  })()\n</script>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetHeader,\n  SheetTitle,\n} from \"@/components/ui/sheet\"\n\ntype Props = Omit<HTMLAttributes<\"div\">, \"dir\"> & {\n  side?: \"left\" | \"right\"\n  variant?: \"sidebar\" | \"floating\" | \"inset\"\n  collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n  state?: \"expanded\" | \"collapsed\"\n}\n\nconst {\n  class: className,\n  side = \"left\",\n  variant = \"sidebar\",\n  collapsible = \"offcanvas\",\n  state = \"expanded\",\n  ...props\n} = Astro.props\n\nconst desktopState = collapsible === \"none\" ? \"expanded\" : state\nconst desktopCollapsible = desktopState === \"collapsed\" ? collapsible : \"\"\n---\n\n{\n  collapsible === \"none\" ? (\n    <div\n      data-slot=\"sidebar\"\n      data-state=\"expanded\"\n      data-collapsible=\"none\"\n      data-variant={variant}\n      data-side={side}\n      data-sidebar-collapsible=\"none\"\n      class={cn(\n        \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n        className\n      )}\n      {...props}\n    >\n      <slot />\n    </div>\n  ) : (\n    <>\n      <Sheet data-sidebar=\"sheet\" defaultOpen={false}>\n        <SheetContent\n          side={side}\n          showCloseButton={false}\n          data-sidebar=\"sidebar\"\n          data-slot=\"sidebar\"\n          data-mobile=\"true\"\n          style=\"--sidebar-width: var(--sidebar-width-mobile);\"\n          class={cn(\n            \"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 md:hidden\",\n            className\n          )}\n        >\n          <SheetHeader class=\"sr-only\">\n            <SheetTitle>Sidebar</SheetTitle>\n            <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n          </SheetHeader>\n          <div class=\"flex h-full w-full flex-col\">\n            <slot />\n          </div>\n        </SheetContent>\n      </Sheet>\n\n      <div\n        data-slot=\"sidebar\"\n        data-state={desktopState}\n        data-collapsible={desktopCollapsible}\n        data-variant={variant}\n        data-side={side}\n        data-sidebar-collapsible={collapsible}\n        class=\"group peer text-sidebar-foreground hidden md:block\"\n      >\n        <div\n          data-slot=\"sidebar-gap\"\n          class={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          class={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-(--sidebar-width) data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:-right-(--sidebar-width) md:flex\",\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            class=\"bg-sidebar group-data-[variant=floating]:ring-sidebar-border flex size-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1\"\n          >\n            <slot />\n          </div>\n        </div>\n      </div>\n    </>\n  )\n}\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-trigger.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"button\"> & {\n  variant?: \"ghost\" | \"secondary\"\n}\n\nconst { class: className, ...props } = Astro.props\n---\n\n<Button\n  data-sidebar=\"trigger\"\n  data-slot=\"sidebar-trigger\"\n  variant=\"ghost\"\n  size=\"icon-sm\"\n  class={className}\n  aria-keyshortcuts=\"Meta+B\"\n  {...props}\n>\n  <Icon name=\"panel-left\" />\n  <span class=\"sr-only\">Toggle Sidebar</span>\n  <slot />\n</Button>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-rail.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\">\n\nconst { class: className, type = \"button\", ...props } = Astro.props\n---\n\n<button\n  data-sidebar=\"rail\"\n  data-slot=\"sidebar-rail\"\n  aria-label=\"Toggle Sidebar\"\n  tabindex={-1}\n  title=\"Toggle Sidebar\"\n  type={type}\n  class={cn(\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\",\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    \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n    \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n    \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n    className\n  )}\n  {...props}></button>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-inset.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"main\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<main\n  data-slot=\"sidebar-inset\"\n  class={cn(\n    \"bg-background relative flex w-full flex-1 flex-col 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\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n</main>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-input.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"input\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<input\n  data-slot=\"sidebar-input\"\n  data-sidebar=\"input\"\n  class={cn(\n    \"dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 file:text-foreground placeholder:text-muted-foreground bg-background h-8 w-full min-w-0 rounded-md border px-2.5 py-1 text-base shadow-none transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-3 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-3 md:text-sm\",\n    className\n  )}\n  {...props}\n/>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-header.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n  data-slot=\"sidebar-header\"\n  data-sidebar=\"header\"\n  class={cn(\"flex flex-col gap-2 p-2\", className)}\n  {...props}\n>\n  <slot />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-footer.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n  data-slot=\"sidebar-footer\"\n  data-sidebar=\"footer\"\n  class={cn(\"flex flex-col gap-2 p-2\", className)}\n  {...props}\n>\n  <slot />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-separator.astro",
      "content": "---\nimport type { ComponentProps } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props = ComponentProps<typeof Separator>\n\nconst { class: className, ...props } = Astro.props\n---\n\n<Separator\n  data-slot=\"sidebar-separator\"\n  data-sidebar=\"separator\"\n  class={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n  {...props}\n/>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-content.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n  data-slot=\"sidebar-content\"\n  data-sidebar=\"content\"\n  class={cn(\n    \"no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-group.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n  data-slot=\"sidebar-group\"\n  data-sidebar=\"group\"\n  class={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n  {...props}\n>\n  <slot />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-group-label.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> &\n  HTMLAttributes<\"button\"> &\n  HTMLAttributes<\"span\"> & {\n    as?: \"div\" | \"button\" | \"span\"\n  }\n\nconst { as: Tag = \"div\", class: className, type, ...props } = Astro.props\n---\n\n<Tag\n  data-slot=\"sidebar-group-label\"\n  data-sidebar=\"group-label\"\n  type={Tag === \"button\" ? type || \"button\" : undefined}\n  class={cn(\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 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  <slot />\n</Tag>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-group-action.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\"> &\n  HTMLAttributes<\"a\"> &\n  HTMLAttributes<\"div\"> &\n  HTMLAttributes<\"span\"> & {\n    as?: \"button\" | \"a\" | \"div\" | \"span\"\n    href?: string\n  }\n\nconst { as: explicitTag, class: className, type, ...props } = Astro.props\n\nconst Tag = explicitTag || (\"href\" in Astro.props ? \"a\" : \"button\")\nconst resolvedType = Tag === \"button\" ? type || \"button\" : undefined\n---\n\n<Tag\n  data-slot=\"sidebar-group-action\"\n  data-sidebar=\"group-action\"\n  type={resolvedType}\n  class={cn(\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 group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n</Tag>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-group-content.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n  data-slot=\"sidebar-group-content\"\n  data-sidebar=\"group-content\"\n  class={cn(\"w-full text-sm\", className)}\n  {...props}\n>\n  <slot />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"ul\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<ul\n  data-slot=\"sidebar-menu\"\n  data-sidebar=\"menu\"\n  class={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n  {...props}\n>\n  <slot />\n</ul>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-button.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { TooltipAlign, TooltipSide } from \"@data-slot/tooltip\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nconst variants = cva(\n  \"peer/menu-button group/menu-button ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm 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! focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-active:font-medium [&_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 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(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  }\n)\n\ntype TooltipValue =\n  | string\n  | (HTMLAttributes<\"div\"> & {\n      content?: string\n      children?: string\n      side?: TooltipSide\n      align?: TooltipAlign\n      sideOffset?: number\n      alignOffset?: number\n      avoidCollisions?: boolean\n      collisionPadding?: number\n    })\n\ninterface Props\n  extends VariantProps<typeof variants>, HTMLAttributes<\"button\"> {\n  as?: \"a\" | \"button\" | \"div\" | \"span\"\n  href?: string\n  isActive?: boolean\n  active?: boolean\n  tooltip?: TooltipValue\n}\n\nconst {\n  as: explicitTag,\n  class: className,\n  variant = \"default\",\n  size = \"default\",\n  isActive,\n  active = false,\n  tooltip,\n  type,\n  ...props\n} = Astro.props satisfies Props\n\nconst Tag = explicitTag || (\"href\" in Astro.props ? \"a\" : \"button\")\nconst resolvedActive = isActive ?? active\nconst baseClassName = cn(variants({ variant, size }), className)\nconst resolvedTooltip =\n  typeof tooltip === \"string\" ? { children: tooltip } : tooltip\nconst tooltipText =\n  resolvedTooltip?.content ??\n  (typeof resolvedTooltip?.children === \"string\"\n    ? resolvedTooltip.children\n    : undefined)\nconst {\n  content: _tooltipContent,\n  children: _tooltipChildren,\n  ...tooltipProps\n} = resolvedTooltip ?? {}\n---\n\n{\n  tooltipText ? (\n    <Tooltip>\n      <TooltipTrigger\n        as={Tag}\n        data-slot=\"sidebar-menu-button\"\n        data-sidebar=\"menu-button\"\n        data-size={size}\n        data-active={resolvedActive ? \"true\" : undefined}\n        aria-current={resolvedActive ? \"page\" : undefined}\n        type={Tag === \"button\" ? type || \"button\" : undefined}\n        class={baseClassName}\n        {...props}\n      >\n        <slot />\n      </TooltipTrigger>\n      <TooltipContent\n        data-sidebar=\"menu-tooltip\"\n        side=\"right\"\n        align=\"center\"\n        hidden\n        {...tooltipProps}\n      >\n        {tooltipText}\n      </TooltipContent>\n    </Tooltip>\n  ) : (\n    <Tag\n      data-slot=\"sidebar-menu-button\"\n      data-sidebar=\"menu-button\"\n      data-size={size}\n      data-active={resolvedActive ? \"true\" : undefined}\n      aria-current={resolvedActive ? \"page\" : undefined}\n      type={Tag === \"button\" ? type || \"button\" : undefined}\n      class={baseClassName}\n      {...props}\n    >\n      <slot />\n    </Tag>\n  )\n}\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-item.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"li\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<li\n  data-slot=\"sidebar-menu-item\"\n  data-sidebar=\"menu-item\"\n  class={cn(\"group/menu-item relative\", className)}\n  {...props}\n>\n  <slot />\n</li>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-action.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\"> &\n  HTMLAttributes<\"a\"> &\n  HTMLAttributes<\"div\"> &\n  HTMLAttributes<\"span\"> & {\n    as?: \"button\" | \"a\" | \"div\" | \"span\"\n    href?: string\n    showOnHover?: boolean\n  }\n\nconst {\n  as: explicitTag,\n  class: className,\n  showOnHover = false,\n  type,\n  ...props\n} = Astro.props\n\nconst Tag = explicitTag || (\"href\" in Astro.props ? \"a\" : \"button\")\nconst resolvedType = Tag === \"button\" ? type || \"button\" : undefined\n---\n\n<Tag\n  data-slot=\"sidebar-menu-action\"\n  data-sidebar=\"menu-action\"\n  type={resolvedType}\n  class={cn(\n    \"text-sidebar-foreground ring-sidebar-ring peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover: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 group-data-[collapsible=icon]:hidden 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 focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n    showOnHover &&\n      \"peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n</Tag>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-badge.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n  data-slot=\"sidebar-menu-badge\"\n  data-sidebar=\"menu-badge\"\n  class={cn(\n    \"text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-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 group-data-[collapsible=icon]:hidden 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\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-skeleton.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n  showIcon?: boolean\n}\n\nconst { class: className, showIcon = false, ...props } = Astro.props\nconst width = `${Math.floor(Math.random() * 40) + 50}%`\n---\n\n<div\n  data-slot=\"sidebar-menu-skeleton\"\n  data-sidebar=\"menu-skeleton\"\n  class={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n  {...props}\n>\n  {\n    showIcon && (\n      <Skeleton class=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />\n    )\n  }\n  <Skeleton\n    class=\"h-4 max-w-(--skeleton-width) flex-1\"\n    data-sidebar=\"menu-skeleton-text\"\n    style={`--skeleton-width: ${width};`}\n  />\n</div>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-sub.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"ul\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<ul\n  data-slot=\"sidebar-menu-sub\"\n  data-sidebar=\"menu-sub\"\n  class={cn(\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 group-data-[collapsible=icon]:hidden\",\n    className\n  )}\n  {...props}\n>\n  <slot />\n</ul>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-sub-button.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst variants = cva(\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 data-active:bg-sidebar-accent data-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 group-data-[collapsible=icon]:hidden focus-visible:ring-2 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 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n  {\n    variants: {\n      size: {\n        sm: \"text-xs\",\n        md: \"text-sm\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n    },\n  }\n)\n\ninterface Props\n  extends VariantProps<typeof variants>, HTMLAttributes<\"button\"> {\n  as?: \"a\" | \"button\" | \"span\"\n  href?: string\n  isActive?: boolean\n  active?: boolean\n}\n\nconst {\n  as: explicitTag,\n  class: className,\n  size = \"md\",\n  isActive,\n  active = false,\n  type,\n  ...props\n} = Astro.props satisfies Props\n\nconst Tag = explicitTag || \"a\"\nconst resolvedActive = isActive ?? active\n---\n\n<Tag\n  data-slot=\"sidebar-menu-sub-button\"\n  data-sidebar=\"menu-sub-button\"\n  data-size={size}\n  data-active={resolvedActive ? \"true\" : undefined}\n  aria-current={resolvedActive ? \"page\" : undefined}\n  type={Tag === \"button\" ? type || \"button\" : undefined}\n  class={cn(variants({ size }), className)}\n  {...props}\n>\n  <slot />\n</Tag>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/sidebar-menu-sub-item.astro",
      "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"li\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<li\n  data-slot=\"sidebar-menu-sub-item\"\n  data-sidebar=\"menu-sub-item\"\n  class={cn(\"group/menu-sub-item relative\", className)}\n  {...props}\n>\n  <slot />\n</li>\n",
      "type": "registry:ui"
    },
    {
      "path": "src/components/ui/sidebar/index.ts",
      "content": "export { default as SidebarProvider } from \"./sidebar-provider.astro\"\nexport { default as Sidebar } from \"./sidebar.astro\"\nexport { default as SidebarTrigger } from \"./sidebar-trigger.astro\"\nexport { default as SidebarRail } from \"./sidebar-rail.astro\"\nexport { default as SidebarInset } from \"./sidebar-inset.astro\"\nexport { default as SidebarInput } from \"./sidebar-input.astro\"\nexport { default as SidebarHeader } from \"./sidebar-header.astro\"\nexport { default as SidebarFooter } from \"./sidebar-footer.astro\"\nexport { default as SidebarSeparator } from \"./sidebar-separator.astro\"\nexport { default as SidebarContent } from \"./sidebar-content.astro\"\nexport { default as SidebarGroup } from \"./sidebar-group.astro\"\nexport { default as SidebarGroupLabel } from \"./sidebar-group-label.astro\"\nexport { default as SidebarGroupAction } from \"./sidebar-group-action.astro\"\nexport { default as SidebarGroupContent } from \"./sidebar-group-content.astro\"\nexport { default as SidebarMenu } from \"./sidebar-menu.astro\"\nexport { default as SidebarMenuItem } from \"./sidebar-menu-item.astro\"\nexport { default as SidebarMenuButton } from \"./sidebar-menu-button.astro\"\nexport { default as SidebarMenuAction } from \"./sidebar-menu-action.astro\"\nexport { default as SidebarMenuBadge } from \"./sidebar-menu-badge.astro\"\nexport { default as SidebarMenuSkeleton } from \"./sidebar-menu-skeleton.astro\"\nexport { default as SidebarMenuSub } from \"./sidebar-menu-sub.astro\"\nexport { default as SidebarMenuSubButton } from \"./sidebar-menu-sub-button.astro\"\nexport { default as SidebarMenuSubItem } from \"./sidebar-menu-sub-item.astro\"\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}