ダッシュボードサイドバー
使用法
DashboardSidebarコンポーネントは、ダッシュボードのレイアウトにサイドバーを表示するために使用されます。このコンポーネントは、ドラッグ·ツー·サイズ変更、ステート永続性をサポートし、DashboardGroup、DashboardPanel、DashboardNavbarと統合されます。
DashboardGroup統合を備えたダッシュボードレイアウト用に設計されています。シンプルなスタンドアロンサイドバー(チャットパネル、設定、ナビゲーション)の場合は、代わりにSidebarを使用してください。その状態サイズ、折りたたまれたなどは、DashboardGroupコンポーネントに提供したstorageおよびstorage-keyプロパティに基づいて保存されます。
DashboardGroupコンポーネントのデフォルトスロット内で使用します。
<template>
<UDashboardGroup>
<UDashboardSidebar />
<slot />
</UDashboardGroup>
</template>
resizableプロパティを使用する場合、このコンポーネントは単一のルート要素を持ちません。ページ遷移を使用する場合や、レイアウトに単一のルートを必要とする場合は、コンテナ(例えば<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プロパティを使用してサイドバーのサイズを変更できます。
<template>
<UDashboardSidebar resizable>
<Placeholder class="h-96" />
</UDashboardSidebar>
</template>Collapsible
collapsibleプロパティを使用して、画面の端付近をドラッグするとサイドバーを折りたたみ可能にします。
DashboardSidebarCollapseコンポーネントは、サイドバーがcollapsibleでない場合には効果がありません。<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プロパティはデフォルトで0に設定されていますが、サイドバーにはmin-w-16があります。Side
サイドバーの側面を変更するには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
toggleプロパティを使用して、モバイルで表示される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側
トグルボタンの側面を変更するには、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>
サンプル
Controlオープンステート
オープン状態はopenプロパティまたは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プロパティまたは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
| 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'
}
}
}
}
}
})
]
})