11<script setup lang="ts">
2- import { ChevronsUpDown , Menu as MenuIcon } from ' lucide-vue-next'
2+ import { useStorage } from ' @vueuse/core'
3+ import {
4+ ChevronsUpDown ,
5+ Menu as MenuIcon ,
6+ PanelLeftClose ,
7+ PanelLeftOpen
8+ } from ' lucide-vue-next'
39import { useAppLayout } from ' @/composables/useAppLayout'
410import Container from ' @/components/Container.vue'
511import PopupMenuButton from ' @/components/PopupMenuButton.vue'
@@ -21,6 +27,11 @@ const {
2127 expandedKeys,
2228 userMenuItems,
2329} = useAppLayout ()
30+
31+ const sidebarOpen = useStorage (' desktop-sidebar-open' , true )
32+ const toggleSidebar = () => {
33+ sidebarOpen .value = ! sidebarOpen .value
34+ }
2435 </script >
2536
2637<template >
@@ -84,7 +95,8 @@ const {
8495 <div class =" flex-1" >
8596 <!-- Desktop Sidebar -->
8697 <aside
87- class =" w-[18rem] inset-0 hidden lg:block fixed overflow-y-auto overflow-x-hidden dynamic-bg border-r dynamic-border"
98+ class =" w-[18rem] inset-0 hidden lg:block fixed overflow-y-auto overflow-x-hidden dynamic-bg border-r dynamic-border transition-transform duration-300 ease-in-out"
99+ :class =" sidebarOpen ? 'translate-x-0' : '-translate-x-full'"
88100 >
89101 <div class =" w-full h-full flex flex-col justify-between p-4" >
90102 <div class =" space-y-6" >
@@ -115,16 +127,32 @@ const {
115127 </aside >
116128
117129 <!-- Scrollable Content -->
118- <main class =" flex flex-col h-full lg:pl-[18rem]" >
130+ <main
131+ class =" flex flex-col h-full transition-[padding] duration-300 ease-in-out"
132+ :class =" sidebarOpen ? 'lg:pl-[18rem]' : 'lg:pl-0'"
133+ >
119134 <Container
120135 vertical
121136 fluid
122137 >
123- <!-- Breadcrumbs -->
124- <Breadcrumb
125- v-if =" props.breadcrumbs.length"
126- :model =" props.breadcrumbs"
127- />
138+ <div class =" flex gap-4 items-center" >
139+ <Button
140+ v-tooltip.right =" `${sidebarOpen ? 'Collapse' : 'Expand'} Sidebar`"
141+ class =" hidden lg:flex"
142+ severity =" secondary"
143+ outlined
144+ @click =" toggleSidebar()"
145+ >
146+ <template #icon >
147+ <PanelLeftClose v-if =" sidebarOpen" />
148+ <PanelLeftOpen v-else />
149+ </template >
150+ </Button >
151+ <Breadcrumb
152+ v-if =" props.breadcrumbs.length"
153+ :model =" props.breadcrumbs"
154+ />
155+ </div >
128156
129157 <!-- Page Content -->
130158 <slot />
0 commit comments