대시보드 사이드바
Usage
DashboardSidebar 구성 요소는 대시보드 레이아웃에 사이드바를 표시하는 데 사용됩니다. 끌어서 크기 조정, 상태 지속성을 지원하며 [DashboardGroup](/docs/components/dashboard-groupxph04x, [boardPanelxph06x/docs/components/dashboard-panelxph08x 및 [dashboardNavbarx와 통합됩니다.
DashboardGroup 통합이 포함된 대시보드 레이아웃용으로 설계되었습니다. 단순한 독립형 사이드바(채팅 패널, 설정, 탐색)의 경우 Sidebar를 대신 사용합니다.해당 상태(크기, 축소 등)는 DashboardGroup 구성 요소에 제공된 storage 및 storage-key 소품을 기반으로 저장됩니다.
DashboardGroup 구성 요소의 기본 슬롯 내에서 이 옵션을 사용합니다.
<template>
<UDashboardGroup>
<UDashboardSidebar />
<slot />
</UDashboardGroup>
</template>
resizable Prop을 사용할 때 이 구성 요소는 단일 루트 요소를 가지지 않으므로 페이지 전환을 사용하거나 레이아웃에 단일 루트가 필요한 경우 컨테이너(예: <div class="flex flex-1">)로 래핑합니다.header, default 및 footer 슬롯을 사용하여 사이드바와 body 또는 content 슬롯을 사용자 정의하여 사이드바 메뉴를 사용자 정의합니다.
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[][] = [[{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox',
badge: '4'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}, {
label: 'Settings',
icon: 'i-lucide-settings',
defaultOpen: true,
children: [{
label: 'General'
}, {
label: 'Members'
}, {
label: 'Notifications'
}]
}], [{
label: 'Feedback',
icon: 'i-lucide-message-circle',
to: 'https://github.com/nuxt-ui-templates/dashboard',
target: '_blank'
}, {
label: 'Help & Support',
icon: 'i-lucide-info',
to: 'https://github.com/nuxt/ui',
target: '_blank'
}]]
</script>
<template>
<UDashboardSidebar collapsible resizable :ui="{ footer: 'border-t border-default' }">
<template #header="{ collapsed }">
<Logo v-if="!collapsed" class="h-5 w-auto shrink-0" />
<UIcon v-else name="i-simple-icons-nuxtdotjs" class="size-5 text-primary mx-auto" />
</template>
<template #default="{ collapsed }">
<UButton
:label="collapsed ? undefined : 'Search...'"
icon="i-lucide-search"
color="neutral"
variant="outline"
block
:square="collapsed"
>
<template v-if="!collapsed" #trailing>
<div class="flex items-center gap-0.5 ms-auto">
<UKbd value="meta" variant="subtle" />
<UKbd value="K" variant="subtle" />
</div>
</template>
</UButton>
<UNavigationMenu
:collapsed="collapsed"
:items="items[0]"
orientation="vertical"
/>
<UNavigationMenu
:collapsed="collapsed"
:items="items[1]"
orientation="vertical"
class="mt-auto"
/>
</template>
<template #footer="{ collapsed }">
<UButton
:avatar="{
src: 'https://github.com/benjamincanac.png',
loading: 'lazy' as const
}"
:label="collapsed ? undefined : 'Benjamin'"
color="neutral"
variant="ghost"
class="w-full"
:block="collapsed"
/>
</template>
</UDashboardSidebar>
</template>
크기 조정 가능
resizable Prop을 사용하여 사이드바의 크기를 조절할 수 있도록 합니다.
<template>
<UDashboardSidebar resizable>
<Placeholder class="h-96" />
</UDashboardSidebar>
</template>축소가능
화면 가장자리 근처로 드래그할 때 collapsible 소품을 사용하여 사이드바를 축소 가능하게 만듭니다.
DashboardSidebarCollapse 구성 요소는 아무런 효과가 없습니다.<template>
<UDashboardSidebar resizable collapsible>
<Placeholder class="h-96" />
</UDashboardSidebar>
</template>Size 크기
min-size, max-size, default-size 및 collapsed-size 소품을 사용하여 사이드바 크기를 사용자 정의합니다.
<template>
<UDashboardSidebar
resizable
collapsible
:min-size="22"
:default-size="35"
:max-size="40"
:collapsed-size="0"
>
<Placeholder class="h-96" />
</UDashboardSidebar>
</template>collapsed-size prop은 기본적으로 0로 설정되어 있지만 사이드바에는 min-w-16가 있어 보이는지 확인합니다.사이드
사이드바 측면을 변경하려면 side 소품을 사용합니다. 기본값은 left입니다.
<template>
<UDashboardSidebar side="right" resizable collapsible>
<Placeholder class="h-96" />
</UDashboardSidebar>
</template>Mode 모드
mode 소품을 사용하여 사이드바 메뉴의 모드를 변경합니다. 기본값은 slideover입니다.
body 슬롯을 사용하여 메뉴 본문(헤더 아래)을 채우거나 content 슬롯을 사용하여 전체 메뉴를 채웁니다.
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
defineProps<{
mode: 'drawer' | 'slideover' | 'modal'
}>()
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
</script>
<template>
<UDashboardGroup>
<UDashboardSidebar :mode="mode">
<template #header="{ collapsed }">
<Logo v-if="!collapsed" class="h-5 w-auto" />
<UIcon v-else name="i-simple-icons-nuxtdotjs" class="size-5 text-primary mx-auto" />
</template>
<UNavigationMenu
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
<UDashboardPanel>
<template #header>
<UDashboardNavbar title="Dashboard" />
</template>
</UDashboardPanel>
</UDashboardGroup>
</template>
토글
toggle Prop을 사용하여 모바일에 표시되는 DashboardSidebarToggle 구성 요소를 사용자 정의합니다.
Button 구성 요소의 모든 속성을 전달하여 사용자 정의할 수 있습니다.
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
</script>
<template>
<UDashboardGroup>
<UDashboardSidebar
open
:toggle="{
color: 'primary',
variant: 'subtle',
class: 'rounded-full'
}"
>
<template #header>
<Logo class="h-5 w-auto" />
</template>
<UNavigationMenu
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
<UDashboardPanel>
<template #header>
<UDashboardNavbar title="Dashboard" />
</template>
</UDashboardPanel>
</UDashboardGroup>
</template>
측면 전환
toggle-side 소품을 사용하여 토글 버튼의 측면을 변경합니다. 기본값은 left입니다.
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
</script>
<template>
<UDashboardGroup>
<UDashboardSidebar
open
toggle-side="right"
>
<template #header>
<Logo class="h-5 w-auto" />
</template>
<UNavigationMenu
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
<UDashboardPanel>
<template #header>
<UDashboardNavbar title="Dashboard" />
</template>
</UDashboardPanel>
</UDashboardGroup>
</template>
examples 예제
Control 열기 상태
open prop 또는 v-model:open 지시문을 사용하여 열린 상태를 제어할 수 있습니다.
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
const open = ref(true)
defineShortcuts({
o: () => open.value = !open.value
})
</script>
<template>
<UDashboardSidebar v-model:open="open">
<template #header="{ collapsed }">
<Logo v-if="!collapsed" class="h-5 w-auto" />
<UIcon v-else name="i-simple-icons-nuxtdotjs" class="size-5 text-primary mx-auto" />
</template>
<UNavigationMenu
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
const open = ref(true)
defineShortcuts({
o: () => open.value = !open.value
})
</script>
<template>
<UDashboardSidebar v-model:open="open">
<template #header="{ collapsed }">
<Logo v-if="!collapsed" class="h-5 w-auto" />
<UIcon v-else name="i-simple-icons-nuxtdotjs" class="size-5 text-primary mx-auto" />
</template>
<UNavigationMenu
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
</template>
defineShortcuts를 사용하여 kbd{value="O"}를 눌러 DashboardSidebar의 열기 상태를 토글할 수 있습니다.Control 축소된 상태
collapsed prop 또는 v-model:collapsed 지시어를 사용하여 축소 상태를 제어할 수 있습니다.
<script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
const collapsed = ref(false)
defineShortcuts({
c: () => collapsed.value = !collapsed.value
})
</script>
<template>
<UDashboardSidebar v-model:collapsed="collapsed" collapsible>
<template #header>
<Logo v-if="!collapsed" class="h-5 w-auto" />
<UIcon v-else name="i-simple-icons-nuxtdotjs" class="size-5 text-primary mx-auto" />
</template>
<UNavigationMenu
:collapsed="collapsed"
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { NavigationMenuItem } from '@nuxt/ui'
const items: NavigationMenuItem[] = [{
label: 'Home',
icon: 'i-lucide-house',
active: true
}, {
label: 'Inbox',
icon: 'i-lucide-inbox'
}, {
label: 'Contacts',
icon: 'i-lucide-users'
}]
const collapsed = ref(false)
defineShortcuts({
c: () => collapsed.value = !collapsed.value
})
</script>
<template>
<UDashboardSidebar v-model:collapsed="collapsed" collapsible>
<template #header>
<Logo v-if="!collapsed" class="h-5 w-auto" />
<UIcon v-else name="i-simple-icons-nuxtdotjs" class="size-5 text-primary mx-auto" />
</template>
<UNavigationMenu
:collapsed="collapsed"
:items="items"
orientation="vertical"
/>
</UDashboardSidebar>
</template>
defineShortcuts를 사용하여 kbd{value="C"}를 눌러 DashboardSidebar의 축소된 상태를 토글할 수 있습니다.API
Props (### Props)
| Prop | Default | Type |
|---|---|---|
mode | 'slideover' | TThe mode of the sidebar menu. |
menu | DashboardSidebarMenu<T>The props for the sidebar menu component. | |
toggle | true | boolean | Omit<ButtonProps, LinkPropsKeys> Customize the toggle button to open the sidebar.
|
toggleSide | 'left' | "left" | "right"The side to render the toggle button on. |
autoClose | true | boolean Automatically close when route changes. |
id | useId() | stringThe id of the panel. |
side | 'left' | "left" | "right"The side to render the panel on. |
minSize | 10 | numberThe minimum size of the panel. |
maxSize | 20 | numberThe maximum size of the panel. |
defaultSize | 15 | numberThe default size of the panel. |
resizable | false | boolean Whether to allow the user to resize the panel. |
collapsible | false | boolean Whether to allow the user to collapse the panel. |
collapsedSize | 0 | numberThe size of the panel when collapsed. |
open | false | boolean |
collapsed | false | boolean |
ui | { root?: SlotClass; header?: SlotClass; body?: SlotClass; footer?: SlotClass; toggle?: SlotClass; handle?: SlotClass; content?: SlotClass; overlay?: SlotClass; } |
슬롯
| 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; } |
Theme 테마
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'
}
}
}
}
}
})import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/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'
}
}
}
}
}
})
]
})