Sidebar

Docs sidebar component.


Installation

This component is part of the Doc block. Install the full block to use it:

CLI

npx shadcn@latest add "https://ui.xaclabs.dev/r/doc.json"

Usage

import { Sidebar } from "@/registry/blocks/doc/components/doc-sidebar"
View component source
doc-sidebar.tsx
tsx
"use client"

import type * as React from "react"
import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarInset,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarProvider,
  SidebarTrigger,
} from "@/components/ui/sidebar"
import type { DocsSidebarGroup } from "@/content"

interface DocSidebarProps extends React.ComponentProps<typeof Sidebar> {
  config: DocsSidebarGroup[]
  currentPath: string
}

export function DocSidebar({ config, currentPath, ...props }: DocSidebarProps) {
  return (
    <Sidebar
      collapsible="offcanvas"
      variant="sidebar"
      side="left"
      className="sticky top-0 h-screen overflow-y-auto border-r"
      {...props}
    >
      <SidebarContent className="p-4">
        {config.map((group) => (
          <SidebarGroup key={group.title}>
            <SidebarGroupLabel>{group.title}</SidebarGroupLabel>
            <SidebarGroupContent>
              <SidebarMenu>
                {group.items.map((item) => (
                  <SidebarMenuItem key={item.title}>
                    <SidebarMenuButton
                      asChild
                      isActive={item.href === currentPath}
                    >
                      <a href={item.href}>{item.title}</a>
                    </SidebarMenuButton>
                  </SidebarMenuItem>
                ))}
              </SidebarMenu>
            </SidebarGroupContent>
          </SidebarGroup>
        ))}
      </SidebarContent>
    </Sidebar>
  )
}

interface DocSidebarLayoutProps {
  children: React.ReactNode
  config: DocsSidebarGroup[]
  currentPath: string
}

export function DocSidebarLayout({
  children,
  config,
  currentPath,
}: DocSidebarLayoutProps) {
  return (
    <SidebarProvider>
      <DocSidebar config={config} currentPath={currentPath} />
      <SidebarInset>
        <header className="flex h-14 shrink-0 items-center gap-2 border-b px-4 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12 md:hidden">
          <SidebarTrigger />
        </header>
        <div className="flex flex-1 flex-col gap-4 p-4 pt-0">{children}</div>
      </SidebarInset>
    </SidebarProvider>
  )
}