Sidebar Layout
- Full height sidebar navigation
- Works well when having a lot of navigation items


SidebarLayout component
Properties
| Property | Description | Type | Default |
|---|---|---|---|
links | Sidebar navigation items | SidebarItem[] | [] |
linksBottom | Sidebar bottom navigation items | SidebarItem[] | [] |
theme | Sidebar variant | SidebarTheme | default |
size | Max content width | 'default' | 'large' | 'wide' | 'full' | 'default' |
defaultSidebar | Defaut item that will be selected | string | '' |
openOnMounted | Whether the sidebar should be open on mounted | boolean | false |
closeOnChange | Whether the sidebar should be closed on page change | boolean | false |
Slots
defaultlogotoolbartoolbar-mobilesidebar-linkssidebar-links-bottomsidebar-links-mobilesidebar-links-bottom-mobilesubsidebar-titlesubsidebar-title-mobilepage-headingextra
Context
The SidebarLayout component expose a context object that can be used to control the sidebar programmatically. It use provide/inject under the hood.
In order to access this, you either need to use useSidebarLayoutContext composable, or via slot properties.
You can access layout context via slot properties:
vue
<template>
<SidebarLayout>
<slot />
<template #page-heading="{ toggleSubsidebar }">
<VButton @click="toggleSubsidebar('my-subsidebar-id')">
Open sidebar
</VButton>
</template>
</SidebarLayout>
</template>Or via useSidebarLayoutContext composable (the component should be a child of SidebarLayout):
vue
<script setup lang="ts">
import { useSidebarLayoutContext } from '/@src/components/layouts/sidebar/sidebar.context'
const { toggleSubsidebar } = useSidebarLayoutContext()
</script>
<template>
<VButton @click="toggleSubsidebar('my-subsidebar-id')">
Open sidebar
</VButton>
</template>vue
<template>
<SidebarLayout>
<slot />
<template #page-heading>
<MyPageHeading />
</template>
</SidebarLayout>Types
SidebarTheme
ts
type SidebarTheme =
| 'default'
| 'color'
| 'color-curved'
| 'curved'
| 'float'
| 'labels'
| 'labels-hover'SidebarItem
ts
type SidebarItem =
| SidebarItemSubsidebar
| SidebarItemLink
| SidebarItemAction
| SidebarItemComponent
interface SidebarItemSubsidebar {
type: 'subsidebar'
id: string
icon: string
hideMobile?: boolean
label?: string
subsidebar: {
label: string
items: SubsidebarItem[]
}
}
interface SidebarItemLink {
type: 'link'
id: string
icon: string
hideMobile?: boolean
label?: string
to: string
}
interface SidebarItemAction {
type: 'action'
id: string
icon: string
hideMobile?: boolean
label?: string
onClick: (event: Event) => void
}
interface SidebarItemComponent {
type: 'component'
id: string
hideMobile?: boolean
label?: string
component: string | Component | (() => VNode)
}SubsidebarItem
ts
type SubsidebarItem =
| SubsidebarItemCollapse
| SubsidebarItemLink
| SubsidebarItemDivider
interface SubsidebarItemCollapse {
type: 'collapse'
id: string
label: string
children: {
label: string
to: string
icon?: string
tag?: string | number
}[]
}
interface SubsidebarItemLink {
type: 'link'
label: string
to: string
tag?: string | number
}
interface SubsidebarItemDivider {
type: 'divider'
label?: string
}SidebarContext
ts
interface SidebarLayoutContext {
links: ComputedRef<SidebarItem[]>
linksBottom: ComputedRef<SidebarItem[]>
theme: ComputedRef<SidebarTheme>
defaultSidebar: ComputedRef<string>
closeOnChange: ComputedRef<boolean>
openOnMounted: ComputedRef<boolean>
isMobileSidebarOpen: Ref<boolean>
isDesktopSidebarOpen: Ref<boolean>
activeSubsidebarId: Ref<string>
isOpen: ComputedRef<boolean>
subsidebars: ComputedRef<SidebarItemSubsidebar[]>
activeSubsidebar: ComputedRef<SidebarItemSubsidebar | undefined>
toggleSubsidebar: (id: string) => void
}