All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 49s
Soluciona todos los problemas identificados en la arquitectura anterior: Cambios principales: - Nuevo composable useSidebarState() que centraliza todo el estado - Elimina múltiples fuentes de verdad que causaban desincronización - Remueve watchers en cascada y hooks indirectos - Elimina workarounds manuales de DOM y aria-hidden - Implementa persistencia consistente en cookies - Manejo responsive automático (mobile vs desktop) Archivos modificados: - app/composables/useSidebarState.ts (nuevo): Composable singleton - app/components/app/AppSidebar.vue: Usa el nuevo composable - app/layouts/dashboard.vue: Simplificado, sin refs locales ni workarounds - docs/SIDEBAR_ARCHITECTURE.md (nuevo): Documentación completa Beneficios: ✓ Estado consistente en toda la aplicación ✓ No más flickering o comportamientos anómalos ✓ Código más simple y mantenible ✓ Mejor performance (menos re-renders) ✓ Auto-close en mobile al navegar Referencias: - app/composables/useSidebarState.ts:1 - app/components/app/AppSidebar.vue:232 - app/layouts/dashboard.vue:40
45 lines
1.3 KiB
Vue
45 lines
1.3 KiB
Vue
<template>
|
|
<div class="brand-shell min-h-screen text-[#fef9f0]">
|
|
<UDashboardGroup storage-key="analytics-dashboard" class="h-full">
|
|
<AppSidebar />
|
|
|
|
<UDashboardPanel class="bg-transparent">
|
|
<template #header>
|
|
<div class="flex flex-col gap-4 px-4 py-4 lg:px-6">
|
|
<UDashboardNavbar :title="pageTitle" icon="i-lucide-pie-chart" toggle-side="left">
|
|
<template #leading>
|
|
<UDashboardSidebarCollapse variant="subtle" />
|
|
</template>
|
|
<template #toggle>
|
|
<UDashboardSidebarToggle variant="subtle" />
|
|
</template>
|
|
<template #trailing>
|
|
<AuthSessionStatusButton />
|
|
<UserMenu />
|
|
</template>
|
|
</UDashboardNavbar>
|
|
</div>
|
|
</template>
|
|
|
|
<template #body>
|
|
<div class="px-4 pb-10 lg:px-8">
|
|
<slot />
|
|
</div>
|
|
</template>
|
|
</UDashboardPanel>
|
|
</UDashboardGroup>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { computed } from 'vue'
|
|
import { useRoute } from 'vue-router'
|
|
|
|
const route = useRoute()
|
|
|
|
// Usar el composable unificado para el estado de la sidebar
|
|
const sidebarState = useSidebarState()
|
|
|
|
const pageTitle = computed(() => (route.meta.title as string) || 'Panel')
|
|
</script>
|