Feat: Reorganizar controles de sesión y mejorar UX
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m5s

- Mover botón Finalizar Sesión del flotante al header
- Cambiar botón flotante para colapsar/expandir todos los acordiones
- Agregar opción Finalizar Sesión al menú desplegable móvil
- Implementar función toggleCollapseAll para control de acordiones
- Agregar computed todosColapsados para estado de acordiones
- Usar iconos maximize-2/minimize-2 según estado
- Hacer botón flotante circular para mejor identificación

- Arreglar hover de acordiones para usar color personalizado
- Agregar estilos :deep() para .accordion-trigger:hover
- Usar color-mix con var(--cata-primary) en hover
- Aplicar 5% opacidad en modo claro, 10% en modo oscuro
This commit is contained in:
2025-10-18 03:33:09 -06:00
parent 8ad0b0b131
commit 9daafc2a3e

View File

@@ -51,6 +51,13 @@
> >
<UIcon name="i-lucide-download" class="w-5 h-5" /> <UIcon name="i-lucide-download" class="w-5 h-5" />
</button> </button>
<button
class="cata-button p-2 flex items-center justify-center hidden sm:flex"
title="Finalizar sesión"
@click="finalizarSesion"
>
<UIcon name="i-lucide-check-circle" class="w-5 h-5" />
</button>
<button <button
class="cata-button p-2 flex items-center justify-center" class="cata-button p-2 flex items-center justify-center"
@click="toggleTheme" @click="toggleTheme"
@@ -97,6 +104,13 @@
<UIcon name="i-lucide-download" class="w-4 h-4 inline mr-2" /> <UIcon name="i-lucide-download" class="w-4 h-4 inline mr-2" />
Exportar Sesión Exportar Sesión
</button> </button>
<button
class="menu-item cata-text w-full text-left px-3 py-2 hover:bg-primary/10 rounded"
@click="finalizarSesion"
>
<UIcon name="i-lucide-check-circle" class="w-4 h-4 inline mr-2" />
Finalizar Sesión
</button>
<button <button
class="menu-item cata-text w-full text-left px-3 py-2 hover:bg-primary/10 rounded text-error" class="menu-item cata-text w-full text-left px-3 py-2 hover:bg-primary/10 rounded text-error"
@click="confirmarEliminar" @click="confirmarEliminar"
@@ -136,7 +150,7 @@
:items="accordionItems" :items="accordionItems"
:ui="{ :ui="{
item: 'mb-4 last:mb-0 cata-outline-box rounded-lg overflow-hidden', item: 'mb-4 last:mb-0 cata-outline-box rounded-lg overflow-hidden',
trigger: 'w-full px-4 py-3 hover:bg-primary/5 transition-colors', trigger: 'accordion-trigger w-full px-4 py-3 transition-colors',
content: 'border-t border-default', content: 'border-t border-default',
}" }"
> >
@@ -164,14 +178,17 @@
</UAccordion> </UAccordion>
</div> </div>
<!-- Botón flotante de finalizar --> <!-- Botón flotante para colapsar/expandir -->
<div class="floating-action"> <div class="floating-action">
<button <button
class="cata-button px-6 py-3 shadow-lg" class="cata-button p-3 rounded-full shadow-lg"
@click="finalizarSesion" @click="toggleCollapseAll"
:title="todosColapsados ? 'Expandir todas las muestras' : 'Colapsar todas las muestras'"
> >
<UIcon name="i-lucide-check-circle" class="w-5 h-5 inline mr-2" /> <UIcon
Finalizar Sesión :name="todosColapsados ? 'i-lucide-maximize-2' : 'i-lucide-minimize-2'"
class="w-6 h-6"
/>
</button> </button>
</div> </div>
</div> </div>
@@ -252,6 +269,22 @@ const obtenerMuestraPorValue = (value: string): Muestra | null => {
return sesionActiva.value.muestras.find(m => m.muestraId === muestraId) || null return sesionActiva.value.muestras.find(m => m.muestraId === muestraId) || null
} }
// Verificar si todos los acordiones están colapsados
const todosColapsados = computed(() => {
return accordionAbierto.value.length === 0
})
// Colapsar o expandir todos los acordiones
const toggleCollapseAll = () => {
if (todosColapsados.value) {
// Expandir todos: agregar todos los values
accordionAbierto.value = accordionItems.value.map(item => item.value)
} else {
// Colapsar todos: vaciar el array
accordionAbierto.value = []
}
}
// Inicializar al montar // Inicializar al montar
onMounted(async () => { onMounted(async () => {
await inicializar() await inicializar()
@@ -385,6 +418,15 @@ onMounted(() => {
gap: 0.25rem; gap: 0.25rem;
} }
/* Accordion hover usando color personalizado */
:deep(.accordion-trigger:hover) {
background-color: color-mix(in srgb, var(--cata-primary) 5%, transparent);
}
:deep(.dark .accordion-trigger:hover) {
background-color: color-mix(in srgb, var(--cata-primary) 10%, transparent);
}
/* Floating action button */ /* Floating action button */
.floating-action { .floating-action {
position: fixed; position: fixed;