# Sidebar

A collapsible sidebar layout with a header, body and footer.

```twig
<twig:Sidebar:Provider id="sidebar-demo" defaultOpen cookieName="" class="min-h-[640px] w-full">
    <twig:Sidebar collapsible="icon">
        <twig:Sidebar:Header>
            <twig:Sidebar:Menu>
                <twig:Sidebar:MenuItem>
                    <twig:DropdownMenu id="sidebar-team" class="w-full block">
                        <twig:DropdownMenu:Trigger>
                            <twig:Sidebar:MenuButton {{ ...dropdown_menu_trigger_attrs }} size="lg" tooltip="Acme Inc">
                                <div class="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground">
                                    <twig:ux:icon name="lucide:command" class="size-4" aria-hidden="true" />
                                </div>
                                <div class="grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden">
                                    <span class="truncate font-semibold">Acme Inc</span>
                                    <span class="truncate text-xs">Enterprise</span>
                                </div>
                                <twig:ux:icon name="lucide:chevrons-up-down" class="ms-auto size-4 group-data-[collapsible=icon]:hidden" aria-hidden="true" />
                            </twig:Sidebar:MenuButton>
                        </twig:DropdownMenu:Trigger>
                        <twig:DropdownMenu:Content class="w-56">
                            <twig:DropdownMenu:Label>Teams</twig:DropdownMenu:Label>
                            <twig:DropdownMenu:Item>Acme Inc</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Item>Acme Corp.</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Item>Evil Corp.</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Separator />
                            <twig:DropdownMenu:Item>Add team</twig:DropdownMenu:Item>
                        </twig:DropdownMenu:Content>
                    </twig:DropdownMenu>
                </twig:Sidebar:MenuItem>
            </twig:Sidebar:Menu>
        </twig:Sidebar:Header>
        <twig:Sidebar:Content>
            <twig:Sidebar:Group>
                <twig:Sidebar:GroupLabel>Platform</twig:Sidebar:GroupLabel>
                <twig:Sidebar:GroupContent>
                    <twig:Sidebar:Menu>
                        <twig:Sidebar:MenuItem>
                            <twig:Collapsible open class="group/collapsible">
                                <twig:Collapsible:Trigger>
                                    <twig:Sidebar:MenuButton {{ ...collapsible_trigger_attrs }} tooltip="Playground" active>
                                        <twig:ux:icon name="lucide:square-terminal" aria-hidden="true" />
                                        <span>Playground</span>
                                        <twig:ux:icon name="lucide:chevron-right" class="ms-auto transition-transform group-data-[state=open]/collapsible:rotate-90" aria-hidden="true" />
                                    </twig:Sidebar:MenuButton>
                                </twig:Collapsible:Trigger>
                                <twig:Collapsible:Content>
                                    <twig:Sidebar:MenuSub>
                                        <twig:Sidebar:MenuSubItem>
                                            <twig:Sidebar:MenuSubButton href="#"><span>History</span></twig:Sidebar:MenuSubButton>
                                        </twig:Sidebar:MenuSubItem>
                                        <twig:Sidebar:MenuSubItem>
                                            <twig:Sidebar:MenuSubButton href="#"><span>Starred</span></twig:Sidebar:MenuSubButton>
                                        </twig:Sidebar:MenuSubItem>
                                        <twig:Sidebar:MenuSubItem>
                                            <twig:Sidebar:MenuSubButton href="#"><span>Settings</span></twig:Sidebar:MenuSubButton>
                                        </twig:Sidebar:MenuSubItem>
                                    </twig:Sidebar:MenuSub>
                                </twig:Collapsible:Content>
                            </twig:Collapsible>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#" tooltip="Models">
                                <twig:ux:icon name="lucide:bot" aria-hidden="true" />
                                <span>Models</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#" tooltip="Documentation">
                                <twig:ux:icon name="lucide:book-open" aria-hidden="true" />
                                <span>Documentation</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#" tooltip="Settings">
                                <twig:ux:icon name="lucide:settings-2" aria-hidden="true" />
                                <span>Settings</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                    </twig:Sidebar:Menu>
                </twig:Sidebar:GroupContent>
            </twig:Sidebar:Group>
            <twig:Sidebar:Group class="group-data-[collapsible=icon]:hidden">
                <twig:Sidebar:GroupLabel>Projects</twig:Sidebar:GroupLabel>
                <twig:Sidebar:GroupContent>
                    <twig:Sidebar:Menu>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#">
                                <twig:ux:icon name="lucide:frame" aria-hidden="true" />
                                <span>Design Engineering</span>
                            </twig:Sidebar:MenuButton>
                            <twig:DropdownMenu id="sidebar-project-1" side="right" align="start" class="absolute! right-1 top-1.5">
                                <twig:DropdownMenu:Trigger>
                                    <twig:Sidebar:MenuAction class="static!" {{ ...dropdown_menu_trigger_attrs }}>
                                        <twig:ux:icon name="lucide:more-horizontal" class="size-4" aria-hidden="true" />
                                        <span class="sr-only">More</span>
                                    </twig:Sidebar:MenuAction>
                                </twig:DropdownMenu:Trigger>
                                <twig:DropdownMenu:Content class="w-40">
                                    <twig:DropdownMenu:Item>View project</twig:DropdownMenu:Item>
                                    <twig:DropdownMenu:Item>Share project</twig:DropdownMenu:Item>
                                    <twig:DropdownMenu:Separator />
                                    <twig:DropdownMenu:Item>Delete project</twig:DropdownMenu:Item>
                                </twig:DropdownMenu:Content>
                            </twig:DropdownMenu>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#">
                                <twig:ux:icon name="lucide:pie-chart" aria-hidden="true" />
                                <span>Sales &amp; Marketing</span>
                            </twig:Sidebar:MenuButton>
                            <twig:DropdownMenu id="sidebar-project-2" side="right" align="start" class="absolute! right-1 top-1.5">
                                <twig:DropdownMenu:Trigger>
                                    <twig:Sidebar:MenuAction class="static!" {{ ...dropdown_menu_trigger_attrs }}>
                                        <twig:ux:icon name="lucide:more-horizontal" class="size-4" aria-hidden="true" />
                                        <span class="sr-only">More</span>
                                    </twig:Sidebar:MenuAction>
                                </twig:DropdownMenu:Trigger>
                                <twig:DropdownMenu:Content class="w-40">
                                    <twig:DropdownMenu:Item>View project</twig:DropdownMenu:Item>
                                    <twig:DropdownMenu:Item>Share project</twig:DropdownMenu:Item>
                                    <twig:DropdownMenu:Separator />
                                    <twig:DropdownMenu:Item>Delete project</twig:DropdownMenu:Item>
                                </twig:DropdownMenu:Content>
                            </twig:DropdownMenu>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#">
                                <twig:ux:icon name="lucide:map" aria-hidden="true" />
                                <span>Travel</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                    </twig:Sidebar:Menu>
                </twig:Sidebar:GroupContent>
            </twig:Sidebar:Group>
        </twig:Sidebar:Content>
        <twig:Sidebar:Footer>
            <twig:Sidebar:Menu>
                <twig:Sidebar:MenuItem>
                    <twig:DropdownMenu id="sidebar-account" side="top" class="w-full block">
                        <twig:DropdownMenu:Trigger>
                            <twig:Sidebar:MenuButton {{ ...dropdown_menu_trigger_attrs }} size="lg" tooltip="shadcn">
                                <div class="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground">
                                    <twig:ux:icon name="lucide:user" class="size-4" aria-hidden="true" />
                                </div>
                                <div class="grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden">
                                    <span class="truncate font-semibold">shadcn</span>
                                    <span class="truncate text-xs">m@example.com</span>
                                </div>
                                <twig:ux:icon name="lucide:chevrons-up-down" class="ms-auto size-4 group-data-[collapsible=icon]:hidden" aria-hidden="true" />
                            </twig:Sidebar:MenuButton>
                        </twig:DropdownMenu:Trigger>
                        <twig:DropdownMenu:Content class="w-56">
                            <twig:DropdownMenu:Label>My Account</twig:DropdownMenu:Label>
                            <twig:DropdownMenu:Item>Upgrade to Pro</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Separator />
                            <twig:DropdownMenu:Item>Account</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Item>Billing</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Item>Notifications</twig:DropdownMenu:Item>
                            <twig:DropdownMenu:Separator />
                            <twig:DropdownMenu:Item>Log out</twig:DropdownMenu:Item>
                        </twig:DropdownMenu:Content>
                    </twig:DropdownMenu>
                </twig:Sidebar:MenuItem>
            </twig:Sidebar:Menu>
        </twig:Sidebar:Footer>
        <twig:Sidebar:Rail />
    </twig:Sidebar>
    <twig:Sidebar:Inset>
        <header class="flex h-14 shrink-0 items-center gap-2 border-b px-4">
            <twig:Sidebar:Trigger class="-ml-1">
                <twig:ux:icon name="lucide:panel-left" aria-hidden="true" />
            </twig:Sidebar:Trigger>
            <div class="mx-1 h-4 w-px bg-border"></div>
            <span class="text-sm text-muted-foreground">Building Your Application &nbsp;/&nbsp; Data Fetching</span>
        </header>
        <div class="flex flex-1 flex-col gap-4 p-4">
            <div class="grid auto-rows-min gap-4 md:grid-cols-3">
                <div class="aspect-video rounded-xl bg-muted/50"></div>
                <div class="aspect-video rounded-xl bg-muted/50"></div>
                <div class="aspect-video rounded-xl bg-muted/50"></div>
            </div>
            <div class="min-h-[200px] flex-1 rounded-xl bg-muted/50"></div>
        </div>
    </twig:Sidebar:Inset>
</twig:Sidebar:Provider>
```

## Installation

```shell
php bin/console ux:install sidebar --kit shadcn
```
## Usage

Wrap your layout in a `Sidebar:Provider`, place the `Sidebar` itself next to a `Sidebar:Inset` holding the page content, and add a `Sidebar:Trigger` wherever you want to toggle it.

```twig
<twig:Sidebar:Provider id="my-sidebar">
    <twig:Sidebar>
        <twig:Sidebar:Header>
            <span class="px-2 font-semibold">My App</span>
        </twig:Sidebar:Header>
        <twig:Sidebar:Content>
            <twig:Sidebar:Group>
                <twig:Sidebar:GroupLabel>Application</twig:Sidebar:GroupLabel>
                <twig:Sidebar:GroupContent>
                    <twig:Sidebar:Menu>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="/dashboard" active>
                                <twig:ux:icon name="lucide:layout-dashboard" aria-hidden="true" />
                                <span>Dashboard</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="/projects">
                                <twig:ux:icon name="lucide:folder" aria-hidden="true" />
                                <span>Projects</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                    </twig:Sidebar:Menu>
                </twig:Sidebar:GroupContent>
            </twig:Sidebar:Group>
        </twig:Sidebar:Content>
        <twig:Sidebar:Rail />
    </twig:Sidebar>
    <twig:Sidebar:Inset>
        <header class="flex h-14 items-center gap-2 border-b px-4">
            <twig:Sidebar:Trigger>
                <twig:ux:icon name="lucide:panel-left" aria-hidden="true" />
            </twig:Sidebar:Trigger>
        </header>
        <main class="flex-1 p-4">
            {# your page content #}
        </main>
    </twig:Sidebar:Inset>
</twig:Sidebar:Provider>
```

### Using the sidebar as a page layout

`Sidebar:Inset` wraps the page content, so you will typically want it in your base layout. Blocks defined inside a component tag belong to that component (and `content` is already the name of its default block), so a child template cannot override them through `{% extends %}`. Wrap the sidebar in a small layout component instead: capture its `content` block in a variable, render it inside `Sidebar:Inset`, and let your pages fill it:

```twig
{# templates/components/AppLayout.html.twig #}
{% set page_content %}{% block content %}{% endblock %}{% endset %}
<twig:Sidebar:Provider>
    <twig:Sidebar>
        {# ... #}
    </twig:Sidebar>
    <twig:Sidebar:Inset>
        <header class="flex h-14 items-center gap-2 border-b px-4">
            <twig:Sidebar:Trigger>
                <twig:ux:icon name="lucide:panel-left" aria-hidden="true" />
            </twig:Sidebar:Trigger>
        </header>
        {{ page_content|raw }}
    </twig:Sidebar:Inset>
</twig:Sidebar:Provider>
```

```twig
{# templates/dashboard.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
    <twig:AppLayout>
        <h1>Dashboard</h1>
    </twig:AppLayout>
{% endblock %}
```

## Examples

### Menu badges and actions

Use `Sidebar:MenuBadge` for counters and `Sidebar:MenuAction` for a secondary action on a menu item; render menu items as links with `as="a"` on `Sidebar:MenuButton`.

```twig
<twig:Sidebar:Provider id="sidebar-menu-example" cookieName="" class="min-h-[320px] w-full">
    <twig:Sidebar collapsible="none" class="rounded-lg border border-sidebar-border">
        <twig:Sidebar:Content>
            <twig:Sidebar:Group>
                <twig:Sidebar:GroupLabel>Mailbox</twig:Sidebar:GroupLabel>
                <twig:Sidebar:GroupContent>
                    <twig:Sidebar:Menu>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#" active>
                                <twig:ux:icon name="lucide:inbox" aria-hidden="true" />
                                <span>Inbox</span>
                            </twig:Sidebar:MenuButton>
                            <twig:Sidebar:MenuBadge>24</twig:Sidebar:MenuBadge>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#">
                                <twig:ux:icon name="lucide:star" aria-hidden="true" />
                                <span>Starred</span>
                            </twig:Sidebar:MenuButton>
                            <twig:Sidebar:MenuAction showOnHover>
                                <twig:ux:icon name="lucide:plus" aria-hidden="true" />
                                <span class="sr-only">Add</span>
                            </twig:Sidebar:MenuAction>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#">
                                <twig:ux:icon name="lucide:mail" aria-hidden="true" />
                                <span>Drafts</span>
                            </twig:Sidebar:MenuButton>
                            <twig:Sidebar:MenuBadge>3</twig:Sidebar:MenuBadge>
                        </twig:Sidebar:MenuItem>
                    </twig:Sidebar:Menu>
                </twig:Sidebar:GroupContent>
            </twig:Sidebar:Group>
        </twig:Sidebar:Content>
    </twig:Sidebar>
</twig:Sidebar:Provider>
```

### Off-canvas collapsing

Use `collapsible="offcanvas"` to fully hide the sidebar when collapsed. The `Sidebar:Trigger` automatically targets the surrounding `Sidebar:Provider`.

```twig
<twig:Sidebar:Provider id="sidebar-offcanvas-example" cookieName="" class="min-h-[320px] w-full">
    <twig:Sidebar collapsible="offcanvas">
        <twig:Sidebar:Header>
            <span class="px-2 font-semibold">My App</span>
        </twig:Sidebar:Header>
        <twig:Sidebar:Content>
            <twig:Sidebar:Group>
                <twig:Sidebar:GroupContent>
                    <twig:Sidebar:Menu>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#" active>
                                <twig:ux:icon name="lucide:inbox" aria-hidden="true" />
                                <span>Inbox</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                        <twig:Sidebar:MenuItem>
                            <twig:Sidebar:MenuButton as="a" href="#">
                                <twig:ux:icon name="lucide:search" aria-hidden="true" />
                                <span>Search</span>
                            </twig:Sidebar:MenuButton>
                        </twig:Sidebar:MenuItem>
                    </twig:Sidebar:Menu>
                </twig:Sidebar:GroupContent>
            </twig:Sidebar:Group>
        </twig:Sidebar:Content>
        <twig:Sidebar:Rail />
    </twig:Sidebar>
    <twig:Sidebar:Inset>
        <header class="flex h-14 items-center gap-2 border-b px-4">
            <twig:Sidebar:Trigger>
                <twig:ux:icon name="lucide:panel-left" aria-hidden="true" />
            </twig:Sidebar:Trigger>
        </header>
    </twig:Sidebar:Inset>
</twig:Sidebar:Provider>
```

## API Reference

### `<twig:Sidebar>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `side` | `'left'\|'right'` | `'left'` | On which side of the page the sidebar sits. |
| `variant` | `'sidebar'\|'floating'\|'inset'` | `'sidebar'` | The visual variant. |
| `collapsible` | `'icon'\|'offcanvas'\|'none'` | `'icon'` | How the desktop sidebar collapses. |
| `label` | `string` | `'Sidebar'` | Accessible name for the sidebar landmark. |

| Block | Description |
|:------|:------------|
| `content` | Typically a `Sidebar:Header`, `Sidebar:Content`, `Sidebar:Footer` and an optional `Sidebar:Rail`. |
### `<twig:Sidebar:Content>`

| Block | Description |
|:------|:------------|
| `content` | The scrollable sidebar body, typically one or more `Sidebar:Group`. |
### `<twig:Sidebar:Footer>`

| Block | Description |
|:------|:------------|
| `content` | The sidebar footer content. |
### `<twig:Sidebar:Group>`

| Block | Description |
|:------|:------------|
| `content` | The group content, typically a `Sidebar:GroupLabel` and a `Sidebar:GroupContent`. |
### `<twig:Sidebar:GroupAction>`

| Block | Description |
|:------|:------------|
| `content` | The action's icon or label. |
### `<twig:Sidebar:GroupContent>`

| Block | Description |
|:------|:------------|
| `content` | The group body, typically a `Sidebar:Menu`. |
### `<twig:Sidebar:GroupLabel>`

| Block | Description |
|:------|:------------|
| `content` | The group label text. |
### `<twig:Sidebar:Header>`

| Block | Description |
|:------|:------------|
| `content` | The sidebar header content. |
### `<twig:Sidebar:Inset>`

| Block | Description |
|:------|:------------|
| `content` | The page content placed next to the sidebar (typically a header with a `Sidebar:Trigger`, then the page body). |
### `<twig:Sidebar:Menu>`

| Block | Description |
|:------|:------------|
| `content` | One or more `Sidebar:MenuItem`. |
### `<twig:Sidebar:MenuAction>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `showOnHover` | `boolean` | `false` | Show only when the parent `Sidebar:MenuItem` is hovered or focused. |

| Block | Description |
|:------|:------------|
| `content` | The action's icon or label. |
### `<twig:Sidebar:MenuBadge>`

| Block | Description |
|:------|:------------|
| `content` | The badge content (typically a count or short label). |
### `<twig:Sidebar:MenuButton>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `as` | `'button'\|'a'` | `'button'` | The HTML tag to render; use `a` when the menu item is a link. |
| `active` | `boolean` | `false` | Whether this button represents the active route. |
| `size` | `'default'\|'sm'\|'lg'` | `'default'` | The visual size. |
| `variant` | `'default'\|'outline'` | `'default'` | The visual style variant. |
| `tooltip` | `string` | `null` | Optional title shown when the sidebar is collapsed to icons. |

| Block | Description |
|:------|:------------|
| `content` | The label and/or icon. |
### `<twig:Sidebar:MenuItem>`

| Block | Description |
|:------|:------------|
| `content` | A `Sidebar:MenuButton` and optionally a `Sidebar:MenuAction`, `Sidebar:MenuBadge` or `Sidebar:MenuSub`. |
### `<twig:Sidebar:MenuSkeleton>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `showIcon` | `boolean` | `false` | Whether to render a placeholder icon next to the label. |
### `<twig:Sidebar:MenuSub>`

| Block | Description |
|:------|:------------|
| `content` | One or more `Sidebar:MenuSubItem`. |
### `<twig:Sidebar:MenuSubButton>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `as` | `'a'\|'button'` | `'a'` | The HTML tag to render. |
| `active` | `boolean` | `false` | Whether this sub menu button represents the active route. |
| `size` | `'sm'\|'md'` | `'md'` | The visual size. |

| Block | Description |
|:------|:------------|
| `content` | The label and/or icon. |
### `<twig:Sidebar:MenuSubItem>`

| Block | Description |
|:------|:------------|
| `content` | A `Sidebar:MenuSubButton`. |
### `<twig:Sidebar:Provider>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | `null` | Unique id used to wire `Sidebar:Trigger` and `Sidebar:Rail` to the right provider. Auto-generated when omitted. |
| `defaultOpen` | `boolean` | `true` | Initial open state when no cookie is present. |
| `cookieName` | `string` | `'sidebar:state'` | Cookie used to persist the sidebar state across reloads (empty disables persistence). |
| `cookieMaxAge` | `int` | `604800` | Cookie max-age, in seconds. |
| `mobileBreakpoint` | `int` | `768` | Pixel width below which the sidebar behaves as an off-canvas sheet. |
| `keyboardShortcut` | `string` | `'b'` | Single key combined with Ctrl/Cmd that toggles the sidebar; empty disables the shortcut. |

| Block | Description |
|:------|:------------|
| `content` | Typically a `Sidebar` and a `Sidebar:Inset` (with one or more `Sidebar:Trigger` inside). |
### `<twig:Sidebar:Rail>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `label` | `string` | `'Toggle Sidebar'` | Accessible label announced for the rail toggle. |

| Block | Description |
|:------|:------------|
| `content` | Optional custom content for the rail; empty by default. |
### `<twig:Sidebar:Trigger>`

| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `for` | `string` | `null` | Id of the `Sidebar:Provider` to control. Defaults to the id of the surrounding provider. |
| `label` | `string` | `'Toggle Sidebar'` | Accessible label announced for the trigger. |

| Block | Description |
|:------|:------------|
| `content` | The trigger's icon (typically a `lucide:panel-left`). |
### `data-controller="sidebar"`

| Value | Type | Default | Description |
|:------|:-----|:--------|:------------|
| `data-sidebar-default-open-value` | `Boolean` | `true` | Initial open state when no cookie is present. |
| `data-sidebar-cookie-name-value` | `String` | `'sidebar:state'` | Cookie used to persist the sidebar state across reloads (empty disables persistence). |
| `data-sidebar-cookie-max-age-value` | `Number` | `60 * 60 * 24 * 7` | Cookie max-age, in seconds. |
| `data-sidebar-mobile-breakpoint-value` | `Number` | `768` | Pixel width below which the sidebar behaves as an off-canvas sheet. |
| `data-sidebar-keyboard-shortcut-value` | `String` | `'b'` | Single key combined with Ctrl/Cmd that toggles the sidebar (empty disables the shortcut). |

| Action | Description |
|:-------|:------------|
| `toggle` | Toggle the sidebar between expanded and collapsed (or open/close the mobile sheet). |
| `open` | Expand the sidebar (or open the mobile sheet). |
| `close` | Collapse the sidebar (or close the mobile sheet). |
| `handleKeydown` | Toggle the sidebar on the keyboard shortcut. |