Visitar URL original
feat(Sidebar): add `transition` prop (#6484) · nuxt/ui@af80a67 · GitHub
Skip to content

Commit af80a67

Browse files
feat(Sidebar): add transition prop (#6484)
1 parent fa52538 commit af80a67

4 files changed

Lines changed: 112 additions & 98 deletions

File tree

‎src/runtime/components/Sidebar.vue‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ export interface SidebarProps<T extends SidebarMode = SidebarMode> {
6262
* @defaultValue false
6363
*/
6464
rail?: boolean
65+
/**
66+
* Animate the sidebar when collapsing or expanding.
67+
* @defaultValue true
68+
*/
69+
transition?: boolean
6570
/**
6671
* The mode of the sidebar menu on mobile.
6772
* @defaultValue 'slideover'
@@ -110,6 +115,7 @@ const _props = withDefaults(defineProps<SidebarProps<T>>(), {
110115
collapsible: 'offcanvas',
111116
side: 'left',
112117
close: false,
118+
transition: true,
113119
rail: false,
114120
mode: 'slideover' as never
115121
})
@@ -189,7 +195,8 @@ const hasHeader = computed(() => !!slots.header || props.title || !!slots.title
189195
const ui = computed(() => tv({ extend: tv(theme), ...(appConfig.ui?.sidebar || {}) })({
190196
side: props.side,
191197
variant: props.variant,
192-
collapsible: props.collapsible
198+
collapsible: props.collapsible,
199+
transition: props.transition
193200
}))
194201
195202
const Menu = computed(() => ({

‎src/theme/sidebar.ts‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import type { ModuleOptions } from '../module'
33
export default (options: Required<ModuleOptions>) => ({
44
slots: {
55
root: 'peer [--sidebar-width:16rem] [--sidebar-width-icon:4rem]',
6-
gap: 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',
7-
container: 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear lg:flex',
6+
gap: 'relative w-(--sidebar-width) bg-transparent',
7+
container: 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) lg:flex',
88
inner: 'flex size-full flex-col overflow-hidden divide-y divide-default',
99
header: 'flex items-center gap-1.5 overflow-hidden px-4 min-h-(--ui-header-height)',
1010
wrapper: 'min-w-0 flex-1',
@@ -14,9 +14,16 @@ export default (options: Required<ModuleOptions>) => ({
1414
close: '',
1515
body: 'flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4',
1616
footer: 'flex items-center gap-1.5 overflow-hidden p-4',
17-
rail: ['absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-px lg:flex hover:after:bg-(--ui-border-accented)', options.theme.transitions && 'after:transition-colors']
17+
rail: ['absolute inset-y-0 z-20 hidden w-4 after:absolute after:inset-y-0 after:left-1/2 after:w-px lg:flex hover:after:bg-(--ui-border-accented)', options.theme.transitions && 'after:transition-colors']
1818
},
1919
variants: {
20+
transition: {
21+
true: {
22+
gap: 'transition-[width] duration-200 ease-out',
23+
container: 'transition-[left,right,width] duration-200 ease-out',
24+
rail: 'transition-all ease-out'
25+
}
26+
},
2027
side: {
2128
left: {
2229
container: 'left-0 border-e border-default',

0 commit comments

Comments
 (0)