DashboardSidebar

GitLab
Uma sidebar redimensionável e recolhível para exibir em um dashboard.

Uso

O componente DashboardSidebar é usado para exibir uma sidebar em um layout de dashboard. Ele suporta redimensionamento por arraste, persistência de estado e se integra com DashboardGroup, DashboardPanel e DashboardNavbar.

DashboardSidebar vs Sidebar: This component is designed for dashboard layouts with drag-to-resize, state persistence and DashboardGroup integration. For a simple, standalone sidebar (chat panel, settings, navigation), use Sidebar instead.

O estado dele (tamanho, recolhido, etc.) é salvo com base nas props storage e storage-key que você fornece ao componente DashboardGroup.

Use-o dentro do slot padrão do componente DashboardGroup:

layouts/dashboard.vue
<template>
  <NDashboardGroup>
    <NDashboardSidebar />

    <slot />
  </NDashboardGroup>
</template>
Este componente não tem um único elemento raiz ao usar a prop resizable, então envolva-o em um container (ex.: <div class="flex flex-1">) se você usar transições de página ou precisar de uma raiz única para o layout.

Use os slots header, default e footer para personalizar a sidebar e os slots body ou content para personalizar o menu da sidebar.

Arraste a sidebar para perto da borda esquerda da tela para recolhê-la.

Redimensionável

Use a prop resizable para tornar a sidebar redimensionável.

<template>
  <NDashboardSidebar resizable>
    <Placeholder class="h-96" />
  </NDashboardSidebar>
</template>

Recolhível

Use a prop collapsible para tornar a sidebar recolhível ao arrastar para perto da borda da tela.

O componente DashboardSidebarCollapse não terá efeito se a sidebar não for collapsible.
<template>
  <NDashboardSidebar resizable collapsible>
    <Placeholder class="h-96" />
  </NDashboardSidebar>
</template>
Você pode acessar o estado collapsed nas props de slot para personalizar o conteúdo da sidebar quando ela está recolhida.

Tamanho

Use as props min-size, max-size, default-size e collapsed-size para personalizar o tamanho da sidebar.

<template>
  <NDashboardSidebar
    resizable
    collapsible
    :min-size="22"
    :default-size="35"
    :max-size="40"
    :collapsed-size="0"
  >
    <Placeholder class="h-96" />
  </NDashboardSidebar>
</template>
Os tamanhos são calculados como porcentagens por padrão. Você pode alterar isso usando a prop unit no componente DashboardGroup.
A prop collapsed-size é definida como 0 por padrão, mas a sidebar tem um min-w-16 para garantir que ela fique visível.

Lado

Use a prop side para alterar o lado da sidebar. O padrão é left.

<template>
  <NDashboardSidebar side="right" resizable collapsible>
    <Placeholder class="h-96" />
  </NDashboardSidebar>
</template>

Modo

Use a prop mode para alterar o modo do menu da sidebar. O padrão é slideover.

Use o slot body para preencher o corpo do menu (abaixo do cabeçalho) ou o slot content para preencher o menu inteiro.

Você pode usar a prop menu para personalizar o menu da sidebar; ele se adapta dependendo do modo que você escolher.
Estes exemplos contêm os componentes DashboardGroup, DashboardPanel e DashboardNavbar, pois eles são necessários para demonstrar a sidebar no mobile.

Alternar

Use a prop toggle para personalizar o componente DashboardSidebarToggle exibido no mobile.

Você pode passar qualquer propriedade do componente Button para personalizá-lo.

Lado do toggle

Use a prop toggle-side para alterar o lado do botão de alternância. O padrão é left.

Exemplos

Controlar o estado de abertura

Você pode controlar o estado de abertura usando a prop open ou a diretiva v-model:open.

Neste exemplo, aproveitando o defineShortcuts, você pode alternar o estado de abertura do DashboardSidebar pressionando O.

Controlar o estado recolhido

Você pode controlar o estado recolhido usando a prop collapsed ou a diretiva v-model:collapsed.

Neste exemplo, aproveitando o defineShortcuts, você pode alternar o estado recolhido do DashboardSidebar pressionando C.

API

Props

Prop Default Type
mode'slideover' T

The mode of the sidebar menu.

menu DashboardSidebarMenu<T>

The props for the sidebar menu component.

toggletrueboolean | Omit<ButtonProps, LinkPropsKeys>

Customize the toggle button to open the sidebar. { color: 'neutral', variant: 'ghost' }

toggleSide'left' "left" | "right"

The side to render the toggle button on.

autoClosetrueboolean

Automatically close when route changes.

iduseId() string

The id of the panel.

side'left' "left" | "right"

The side to render the panel on.

minSize10 number

The minimum size of the panel.

maxSize20 number

The maximum size of the panel.

defaultSize15 number

The default size of the panel.

resizablefalseboolean

Whether to allow the user to resize the panel.

collapsiblefalseboolean

Whether to allow the user to collapse the panel.

collapsedSize0 number

The size of the panel when collapsed.

openfalseboolean
collapsedfalseboolean
ui { root?: SlotClass; header?: SlotClass; body?: SlotClass; footer?: SlotClass; toggle?: SlotClass; handle?: SlotClass; content?: SlotClass; overlay?: SlotClass; }

Slots

Slot Type
header{ collapsed: boolean; collapse: (value: boolean) => void; }
default{ collapsed: boolean; collapse: (value: boolean) => void; }
footer{ collapsed: boolean; collapse: (value: boolean) => void; }
toggle{ open: boolean; toggle: () => void; ui: object; }
content{ close?: (() => void) | undefined; }
resize-handle{ onMouseDown: (e: MouseEvent) => void; onTouchStart: (e: TouchEvent) => void; onDoubleClick: (e: MouseEvent) => void; ui: object; }

Tema

app.config.ts
export default defineAppConfig({
  ui: {
    dashboardSidebar: {
      slots: {
        root: 'relative hidden lg:flex flex-col min-h-svh min-w-16 w-(--width) shrink-0',
        header: 'h-(--ui-header-height) shrink-0 flex items-center gap-1.5 px-4',
        body: 'flex flex-col gap-4 flex-1 overflow-y-auto px-4 py-2',
        footer: 'shrink-0 flex items-center gap-1.5 px-4 py-2',
        toggle: '',
        handle: '',
        content: 'lg:hidden',
        overlay: 'lg:hidden'
      },
      variants: {
        menu: {
          true: {
            header: 'sm:px-6',
            body: 'sm:px-6',
            footer: 'sm:px-6'
          }
        },
        side: {
          left: {
            root: 'border-e border-default'
          },
          right: {
            root: ''
          }
        },
        toggleSide: {
          left: {
            toggle: ''
          },
          right: {
            toggle: 'ms-auto'
          }
        }
      }
    }
  }
})
vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nitro/ui/vite'

export default defineConfig({
  plugins: [
    vue(),
    ui({
      ui: {
        dashboardSidebar: {
          slots: {
            root: 'relative hidden lg:flex flex-col min-h-svh min-w-16 w-(--width) shrink-0',
            header: 'h-(--ui-header-height) shrink-0 flex items-center gap-1.5 px-4',
            body: 'flex flex-col gap-4 flex-1 overflow-y-auto px-4 py-2',
            footer: 'shrink-0 flex items-center gap-1.5 px-4 py-2',
            toggle: '',
            handle: '',
            content: 'lg:hidden',
            overlay: 'lg:hidden'
          },
          variants: {
            menu: {
              true: {
                header: 'sm:px-6',
                body: 'sm:px-6',
                footer: 'sm:px-6'
              }
            },
            side: {
              left: {
                root: 'border-e border-default'
              },
              right: {
                root: ''
              }
            },
            toggleSide: {
              left: {
                toggle: ''
              },
              right: {
                toggle: 'ms-auto'
              }
            }
          }
        }
      }
    })
  ]
})

Changelog

No recent changes