Header: transición fluida al colapsar sidebar (CSS variable + group-has)

- h-(--header-height) en vez de h-12 hardcodeado
- transition-[width,height] ease-linear para animación
- data-[orientation=vertical]:h-4 en Separator
- h1 en vez de Breadcrumb (más limpio, estilo demo)
- Layout simplificado sin div anidado redundante
This commit is contained in:
2026-05-22 22:52:44 -05:00
parent 5761538cb9
commit c08f73400c
2 changed files with 14 additions and 19 deletions
+11 -16
View File
@@ -4,12 +4,6 @@ import { useAuthStore } from '@/stores/auth'
import { useProjectsStore } from '@/stores/projects' import { useProjectsStore } from '@/stores/projects'
import { SidebarProvider, SidebarInset, SidebarTrigger } from '@/components/ui/sidebar' import { SidebarProvider, SidebarInset, SidebarTrigger } from '@/components/ui/sidebar'
import { Separator } from '@/components/ui/separator' import { Separator } from '@/components/ui/separator'
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbList,
BreadcrumbPage,
} from '@/components/ui/breadcrumb'
import AppSidebar from '@/components/AppSidebar.vue' import AppSidebar from '@/components/AppSidebar.vue'
import LoginView from '@/views/LoginView.vue' import LoginView from '@/views/LoginView.vue'
import DashboardView from '@/views/DashboardView.vue' import DashboardView from '@/views/DashboardView.vue'
@@ -44,19 +38,20 @@ onMounted(() => {
<AppSidebar v-model:active-tab="activeTab" /> <AppSidebar v-model:active-tab="activeTab" />
<SidebarInset> <SidebarInset>
<header class="flex h-12 shrink-0 items-center gap-2 border-b px-4"> <header class="flex h-(--header-height) shrink-0 items-center gap-2 border-b transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)">
<div class="flex w-full items-center gap-1 px-4 lg:gap-2 lg:px-6">
<SidebarTrigger class="-ml-1" /> <SidebarTrigger class="-ml-1" />
<Separator orientation="vertical" class="mr-2 h-4" /> <Separator
<Breadcrumb> orientation="vertical"
<BreadcrumbList> class="mx-2 data-[orientation=vertical]:h-4"
<BreadcrumbItem> />
<BreadcrumbPage>{{ tabTitles[activeTab] }}</BreadcrumbPage> <h1 class="text-base font-medium">
</BreadcrumbItem> {{ tabTitles[activeTab] }}
</BreadcrumbList> </h1>
</Breadcrumb> </div>
</header> </header>
<main class="flex-1 p-6"> <main class="flex flex-1 flex-col p-4 pt-0 md:gap-6 md:py-6">
<DashboardView v-if="activeTab === 'dashboard'" /> <DashboardView v-if="activeTab === 'dashboard'" />
<CalendarView v-else-if="activeTab === 'calendar'" /> <CalendarView v-else-if="activeTab === 'calendar'" />
<SchedulerView v-else-if="activeTab === 'scheduler'" /> <SchedulerView v-else-if="activeTab === 'scheduler'" />
+2 -2
View File
@@ -18,8 +18,8 @@ const project = computed(() => projects.selected)
</script> </script>
<template> <template>
<div v-if="project" class="flex flex-1 flex-col gap-4"> <div v-if="project" class="@container/main flex flex-1 flex-col gap-2">
<div class="flex items-center justify-between"> <div class="flex flex-col gap-4 py-4 md:gap-6 md:py-6">
<div> <div>
<h1 class="text-2xl font-bold tracking-tight">{{ project.name }}</h1> <h1 class="text-2xl font-bold tracking-tight">{{ project.name }}</h1>
<div class="flex items-center gap-2 mt-1"> <div class="flex items-center gap-2 mt-1">