11<script setup lang="ts">
22import { usePage } from ' @inertiajs/vue3'
3- import { ChevronsUpDown , Menu as MenuIcon } from ' lucide-vue-next'
3+ import { useStorage } from ' @vueuse/core'
4+ import {
5+ ChevronsUpDown ,
6+ Menu as MenuIcon ,
7+ PanelLeftClose ,
8+ PanelLeftOpen
9+ } from ' lucide-vue-next'
410import { useAppLayout } from ' @/composables/useAppLayout'
511import ClientOnly from ' @/components/ClientOnly.vue'
612import Container from ' @/components/Container.vue'
@@ -24,13 +30,17 @@ const {
2430 expandedKeys,
2531 userMenuItems,
2632} = useAppLayout ()
33+
34+ const sidebarOpen = useStorage (' desktop-sidebar-open' , true )
35+ const toggleSidebar = () => {
36+ sidebarOpen .value = ! sidebarOpen .value
37+ }
2738 </script >
2839
2940<template >
3041 <div class =" h-screen flex flex-col" >
3142 <ClientOnly >
3243 <Teleport to =" body" >
33- <!-- Mobile drawer menu -->
3444 <Drawer
3545 v-model:visible =" mobileMenuOpen"
3646 position =" right"
@@ -87,9 +97,9 @@ const {
8797 </header >
8898
8999 <div class =" flex-1" >
90- <!-- Desktop Sidebar -->
91100 <aside
92- class =" w-[18rem] inset-0 hidden lg:block fixed overflow-y-auto overflow-x-hidden dynamic-bg border-r dynamic-border"
101+ 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"
102+ :class =" sidebarOpen ? 'translate-x-0' : '-translate-x-full'"
93103 >
94104 <div class =" w-full h-full flex flex-col justify-between p-4" >
95105 <div class =" space-y-6" >
@@ -119,20 +129,34 @@ const {
119129 </div >
120130 </aside >
121131
122- <!-- Scrollable Content -->
123- <main class =" flex flex-col h-full lg:pl-[18rem]" >
132+ <main
133+ class =" flex flex-col h-full transition-[padding] duration-300 ease-in-out"
134+ :class =" sidebarOpen ? 'lg:pl-[18rem]' : 'lg:pl-0'"
135+ >
124136 <Container
125137 vertical
126138 fluid
127139 >
128- <!-- Session-based Flash Messages -->
129140 <FlashMessages />
130141
131- <!-- Breadcrumbs -->
132- <Breadcrumb
133- v-if =" props.breadcrumbs.length"
134- :model =" props.breadcrumbs"
135- />
142+ <div class =" flex gap-4 items-center" >
143+ <Button
144+ v-tooltip.right =" `${sidebarOpen ? 'Collapse' : 'Expand'} Sidebar`"
145+ class =" hidden lg:flex"
146+ severity =" secondary"
147+ outlined
148+ @click =" toggleSidebar()"
149+ >
150+ <template #icon >
151+ <PanelLeftClose v-if =" sidebarOpen" />
152+ <PanelLeftOpen v-else />
153+ </template >
154+ </Button >
155+ <Breadcrumb
156+ v-if =" props.breadcrumbs.length"
157+ :model =" props.breadcrumbs"
158+ />
159+ </div >
136160
137161 <!-- Page Content -->
138162 <slot />
0 commit comments