Mejorar estilo de filtros de grupos con glassmorphism
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 58s

- Reemplazar UButton por botones nativos con estilos personalizados
- Aplicar glassmorphism consistente con el resto de la app
- Estados normal y activo con efectos de sombra y color
- Hover con translateY para efecto de elevación
- Soporte completo para modo oscuro con opacidades ajustadas
- Botones activos con color primario y borde resaltado
This commit is contained in:
2025-10-16 23:29:10 -06:00
parent c0a9ebe8d0
commit bb47b0e25b

View File

@@ -13,16 +13,14 @@
<!-- Filtros por grupos -->
<div v-if="availableGroups.length > 0" class="filter-section">
<UButton
<button
v-for="group in availableGroups"
:key="group"
size="sm"
:color="selectedGroups.includes(group) ? 'primary' : 'neutral'"
:variant="selectedGroups.includes(group) ? 'soft' : 'ghost'"
:class="['filter-button', { 'filter-button-active': selectedGroups.includes(group) }]"
@click="toggleGroup(group)"
>
{{ group }}
</UButton>
</button>
</div>
</div>
@@ -283,6 +281,50 @@ onUnmounted(() => {
gap: 0.5rem;
}
.filter-button {
padding: 0.5rem 1rem;
font-size: 0.875rem;
font-weight: 500;
border-radius: 0.75rem;
background: rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px) saturate(150%);
border: 1px solid rgba(0, 0, 0, 0.08);
color: var(--color-gray-700);
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 2px 6px 0 rgba(31, 38, 135, 0.08),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.3);
}
.filter-button:hover {
transform: translateY(-2px);
background: rgba(255, 255, 255, 0.35);
box-shadow:
0 4px 12px 0 rgba(31, 38, 135, 0.12),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.4);
}
.filter-button-active {
background: rgba(var(--color-primary-500), 0.15);
border-color: rgba(var(--color-primary-500), 0.3);
color: rgb(var(--color-primary-500));
font-weight: 600;
box-shadow:
0 2px 8px 0 rgba(var(--color-primary-500), 0.2),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.3),
inset 0 -1px 2px 0 rgba(var(--color-primary-500), 0.1);
}
.filter-button-active:hover {
background: rgba(var(--color-primary-500), 0.2);
border-color: rgba(var(--color-primary-500), 0.4);
box-shadow:
0 4px 12px 0 rgba(var(--color-primary-500), 0.3),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.4),
inset 0 -1px 2px 0 rgba(var(--color-primary-500), 0.15);
}
.empty-state {
display: flex;
flex-direction: column;
@@ -476,4 +518,41 @@ onUnmounted(() => {
.dark .app-description {
color: var(--color-gray-400) !important;
}
.dark .filter-button {
background: rgba(255, 255, 255, 0.05) !important;
border-color: rgba(255, 255, 255, 0.1) !important;
color: var(--color-gray-300) !important;
box-shadow:
0 2px 6px 0 rgba(0, 0, 0, 0.3),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.05) !important;
}
.dark .filter-button:hover {
background: rgba(255, 255, 255, 0.1) !important;
box-shadow:
0 4px 12px 0 rgba(0, 0, 0, 0.4),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.08) !important;
}
.dark .filter-button-active {
background: rgba(var(--color-primary-500), 0.25) !important;
border-color: rgba(var(--color-primary-500), 0.5) !important;
color: rgb(var(--color-primary-400)) !important;
box-shadow:
0 2px 8px 0 rgba(var(--color-primary-500), 0.4),
0 0 0 1px rgba(var(--color-primary-500), 0.3),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.08),
inset 0 -1px 2px 0 rgba(var(--color-primary-500), 0.2) !important;
}
.dark .filter-button-active:hover {
background: rgba(var(--color-primary-500), 0.3) !important;
border-color: rgba(var(--color-primary-500), 0.6) !important;
box-shadow:
0 4px 12px 0 rgba(var(--color-primary-500), 0.5),
0 0 0 1px rgba(var(--color-primary-500), 0.4),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.1),
inset 0 -1px 2px 0 rgba(var(--color-primary-500), 0.25) !important;
}
</style>