/**
 * SISTEMA DE DISEÑO UNIFICADO - Mágico Hogar POS
 * Paleta de colores personalizable + Componentes reutilizables
 * Autor: Sistema POS
 * Fecha: 2026-04-10
 */

/* ==========================================
   1. VARIABLES CSS - PALETA DE COLORES
   ========================================== */
:root {
	/* PALETA AZUL — refinada a partir del azul de marca (#0a3e69), con más
	   profundidad y un acento teal para romper la monotonía "plana" */
	--color-primary-darkest: #082B4A;
	--color-primary: #0F3D68;
	--color-primary-medium: #1D6FB8;
	--color-primary-light: #E7F0FA;
	--color-primary-lighter: #F4F8FC;

	/* ACENTO — para resaltar sin depender solo del azul principal */
	--color-accent: #0D9488;
	--color-accent-light: #E1F5F2;

	/* ACENTOS EXTRA — para íconos de módulo (tarjetas de Dashboard/Inventario)
	   que necesitan diferenciarse entre sí más allá de la paleta semántica */
	--color-accent-purple: #9b59b6;
	--color-accent-purple-light: rgba(155, 89, 182, 0.1);
	--color-accent-blue: #3498db;
	--color-accent-blue-light: rgba(52, 152, 219, 0.1);
	--color-accent-orange: #ff9800;
	--color-accent-orange-light: rgba(255, 152, 0, 0.1);
	--color-accent-slate: #34495e;
	--color-accent-slate-light: rgba(52, 73, 94, 0.1);

	/* COLORES SEMÁNTICOS — versión más profesional/menos "clip-art" */
	--color-success: #16A34A;
	--color-success-light: #DCFCE7;
	--color-secondary: #64748B;
	--color-danger: #DC2626;
	--color-danger-light: #FEE2E2;
	--color-warning: #D97706;
	--color-warning-light: #FEF3C7;
	--color-info: #0891B2;
	--color-info-light: #CFFAFE;

	/* NEUTROS */
	--color-white: #ffffff;             /* Blanco literal: texto sobre color, nunca cambia con el tema */
	--color-surface: #ffffff;           /* Superficie de tarjetas/tablas/modales: SÍ cambia en modo oscuro */
	--color-surface-alt: #F8FAFC;       /* Superficie secundaria (encabezados de tabla sutiles, hover) */
	--color-light: #F1F5F9;
	--color-gray-light: #E2E8F0;
	--color-border: #E4E9F0;
	--color-border-strong: #D3DAE6;
	--color-gray: #64748B;
	--color-gray-dark: #334155;
	--color-dark: #1E293B;
	--color-background: #EEF1F6;

	/* TIPOGRAFÍA */
	--font-family-base: 'Poppins', sans-serif;
	--font-size-base: 14px;
	--font-size-sm: 12px;
	--font-size-lg: 16px;
	--font-size-xl: 18px;
	--font-size-2xl: 20px;
	--font-size-3xl: 26px;

	--line-height-base: 1.5;
	--letter-spacing: 0.5px;

	/* ESPACIADO COMPACTO */
	--spacing-xs: 4px;
	--spacing-sm: 8px;
	--spacing-md: 12px;
	--spacing-lg: 16px;
	--spacing-xl: 24px;

	/* BORDER RADIUS */
	--border-radius-sm: 6px;
	--border-radius-md: 10px;
	--border-radius-lg: 14px;

	/* SOMBRAS — profundidad en capas para que las superficies "floten" */
	--shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.08), 0 1px 2px rgba(15, 23, 42, 0.05);
	--shadow-md: 0 4px 14px rgba(15, 23, 42, 0.10), 0 2px 6px rgba(15, 23, 42, 0.06);
	--shadow-lg: 0 18px 44px rgba(15, 23, 42, 0.16), 0 6px 14px rgba(15, 23, 42, 0.08);
	--shadow-card: 0 2px 6px rgba(15, 23, 42, 0.06), 0 8px 24px rgba(15, 23, 42, 0.06);
	--shadow-btn: 0 1px 2px rgba(15, 23, 42, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.18);

	/* Degradado del navbar/encabezados de tabla: separado de --color-primary-*
	   porque en modo oscuro esos tonos se vuelven brillantes (para servir de
	   acento/enlace) y no quedan bien como panel grande de navbar. */
	--gradient-chrome-start: var(--color-primary-medium);
	--gradient-chrome-end: var(--color-primary-darkest);

	/* TRANSICIONES */
	--transition: all 0.2s ease;
}

/* ==========================================
   1.1 TEMA OSCURO
   Se activa con [data-theme="dark"] en <html> (alternado por el botón de
   tema en el navbar, persistido en localStorage — ver header.php).
   Redefine los MISMOS nombres de variable, así que ningún componente
   necesita reglas duplicadas para el modo oscuro.
   ========================================== */
:root[data-theme="dark"] {
	--color-primary-darkest: #061B2E;
	--color-primary: #3B82F6;
	--color-primary-medium: #60A5FA;
	--color-primary-light: rgba(59, 130, 246, 0.16);
	--color-primary-lighter: rgba(59, 130, 246, 0.08);

	--color-accent: #2DD4BF;
	--color-accent-light: rgba(45, 212, 191, 0.16);

	--color-accent-purple: #C084FC;
	--color-accent-purple-light: rgba(192, 132, 252, 0.16);
	--color-accent-blue: #60A5FA;
	--color-accent-blue-light: rgba(96, 165, 250, 0.16);
	--color-accent-orange: #FB923C;
	--color-accent-orange-light: rgba(251, 146, 60, 0.16);
	--color-accent-slate: #94A3B8;
	--color-accent-slate-light: rgba(148, 163, 184, 0.16);

	--color-success: #22C55E;
	--color-success-light: rgba(34, 197, 94, 0.16);
	--color-secondary: #94A3B8;
	--color-danger: #F87171;
	--color-danger-light: rgba(248, 113, 113, 0.16);
	--color-warning: #FBBF24;
	--color-warning-light: rgba(251, 191, 36, 0.16);
	--color-info: #22D3EE;
	--color-info-light: rgba(34, 211, 238, 0.16);

	--color-white: #ffffff;
	--color-surface: #1E293B;
	--color-surface-alt: #263449;
	--color-light: #263449;
	--color-gray-light: #334155;
	--color-border: #334155;
	--color-gray: #94A3B8;
	--color-gray-dark: #CBD5E1;
	--color-dark: #F1F5F9;
	--color-background: #0F172A;

	--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3), 0 1px 1px rgba(0, 0, 0, 0.2);
	--shadow-md: 0 6px 16px rgba(0, 0, 0, 0.4), 0 2px 4px rgba(0, 0, 0, 0.3);
	--shadow-lg: 0 16px 32px rgba(0, 0, 0, 0.5), 0 4px 8px rgba(0, 0, 0, 0.35);

	/* Panel de navbar/thead: azul apagado y profundo, no el azul brillante
	   que en oscuro se usa como acento/enlace */
	--gradient-chrome-start: #1E3A5F;
	--gradient-chrome-end: #0B1729;
}

/* ==========================================
   2. RESET Y ESTILOS BASE
   ========================================== */
* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

html {
	scroll-behavior: smooth;
}

/* ==========================================
   2.1 ACCESIBILIDAD GLOBAL
   ========================================== */

/* Salto de foco visible para navegación por teclado en toda la app */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible {
	outline: 3px solid var(--color-info);
	outline-offset: 2px;
}

/* Enlace "saltar al contenido" (oculto hasta recibir foco) */
.skip-link {
	position: absolute;
	left: -9999px;
	top: 0;
	z-index: 2000;
	background: var(--color-primary);
	color: var(--color-white);
	padding: var(--spacing-sm) var(--spacing-lg);
	border-radius: 0 0 var(--border-radius-sm) 0;
}

.skip-link:focus {
	left: 0;
}

/* Tamaño mínimo de toque accesible para elementos interactivos */
button,
.btn,
input[type="checkbox"],
input[type="radio"] {
	min-height: 38px;
}

input[type="checkbox"],
input[type="radio"] {
	min-width: 18px;
	min-height: 18px;
}

/* Texto visible solo para lectores de pantalla */
.sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}
}

body {
	background-color: var(--color-background);
	font-family: var(--font-family-base);
	font-size: var(--font-size-base);
	color: var(--color-dark);
	line-height: var(--line-height-base);
	letter-spacing: var(--letter-spacing);
}

/* ==========================================
   3. TIPOGRAFÍA
   ========================================== */
h1, h2, h3, h4, h5, h6 {
	font-family: var(--font-family-base);
	font-weight: 600;
	letter-spacing: var(--letter-spacing);
	margin-bottom: var(--spacing-md);
}

h1 {
	font-size: var(--font-size-3xl);
	color: var(--color-white);
}

h2 {
	font-size: var(--font-size-2xl);
	color: var(--color-dark);
}

h3 {
	font-size: var(--font-size-xl);
	color: var(--color-dark);
}

h4 {
	font-size: var(--font-size-lg);
	color: var(--color-dark);
}

h5 {
	font-size: var(--font-size-base);
	color: var(--color-dark);
}

h6 {
	font-size: var(--font-size-2xl);
	color: var(--color-danger);
}

/* Encabezados sobre bandas de color de marca: SIEMPRE legibles (texto claro).
   Los `h1..h6` de arriba fijan un color oscuro que gana por especificidad sobre
   la herencia, así que cualquier contenedor pintado con color de marca —lleve
   por su clase o por un `style="color:#fff"` inline— tiene que forzar el blanco
   en sus títulos. Cubre modales con cabecera de color, cintas de rol, hero, etc. */
.on-brand, .on-brand h1, .on-brand h2, .on-brand h3, .on-brand h4, .on-brand h5, .on-brand h6, .on-brand p,
.rol-header h1, .rol-header h2, .rol-header h3, .rol-header p,
[style*="color: white"] > h1, [style*="color: white"] > h2, [style*="color: white"] > h3,
[style*="color: white"] > h4, [style*="color: white"] > div > h2, [style*="color: white"] > div > h3,
[style*="color:#fff"] > h1, [style*="color:#fff"] > h2, [style*="color:#fff"] > h3,
[style*="color: #fff"] > h1, [style*="color: #fff"] > h2, [style*="color: #fff"] > h3,
[style*="color:white"] > h2, [style*="color:white"] > h3 {
	color: #fff;
}

p {
	margin-bottom: var(--spacing-md);
	line-height: var(--line-height-base);
}

a {
	color: var(--color-primary);
	text-decoration: none;
	transition: var(--transition);
}

a:hover {
	color: var(--color-primary-medium);
}

strong {
	font-weight: 600;
}

/* ==========================================
   4. BOTONES - SISTEMA UNIFICADO
   ========================================== */
.btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--spacing-sm);
	padding: var(--spacing-sm) var(--spacing-lg);
	min-height: 38px;
	border: none;
	border-radius: var(--border-radius-sm);
	font-family: var(--font-family-base);
	font-size: var(--font-size-base);
	font-weight: 500;
	cursor: pointer;
	transition: transform 0.15s ease, box-shadow 0.15s ease, filter 0.15s ease, background-color 0.15s ease;
	/* Neutro por defecto: superficie con relieve, no un gris muerto */
	background-color: var(--color-surface);
	color: var(--color-gray-dark);
	border: 1px solid var(--color-border-strong);
	box-shadow: var(--shadow-btn);
	text-decoration: none;
	white-space: nowrap;
	box-sizing: border-box;
}

.btn:hover {
	transform: translateY(-1px);
	box-shadow: 0 6px 16px rgba(15, 23, 42, 0.16), inset 0 1px 0 rgba(255, 255, 255, 0.18);
}

.btn:active {
	transform: translateY(0);
	box-shadow: inset 0 2px 5px rgba(15, 23, 42, 0.18);
}

.btn:disabled {
	opacity: 0.6;
	cursor: not-allowed;
	transform: none;
}

/* Variantes de Botón — degradado sutil en vez de color plano sólido,
   con hover vía filter (funciona igual en claro y oscuro, sin hex fijos) */
.btn-primary {
	background-image: linear-gradient(155deg, var(--color-primary-medium), var(--color-primary));
	color: var(--color-white);
	border-color: transparent;
	box-shadow: 0 2px 6px color-mix(in srgb, var(--color-primary) 35%, transparent), inset 0 1px 0 rgba(255, 255, 255, 0.22);
}

.btn-primary:hover:not(:disabled) {
	filter: brightness(1.08);
}

.btn-success {
	background-image: linear-gradient(155deg, color-mix(in srgb, var(--color-success) 85%, white), var(--color-success));
	color: var(--color-white);
}

.btn-success:hover:not(:disabled) {
	filter: brightness(1.08);
}

.btn-secondary {
	background-image: linear-gradient(155deg, color-mix(in srgb, var(--color-secondary) 82%, white), var(--color-secondary));
	color: var(--color-white);
	border-color: transparent;
}

.btn-secondary:hover:not(:disabled) {
	filter: brightness(1.12);
}

.btn-danger {
	background-image: linear-gradient(155deg, color-mix(in srgb, var(--color-danger) 85%, white), var(--color-danger));
	color: var(--color-white);
}

.btn-danger:hover:not(:disabled) {
	filter: brightness(1.08);
}

.btn-warning {
	background-color: var(--color-warning);
	color: var(--color-white);
}

.btn-warning:hover:not(:disabled) {
	filter: brightness(1.1);
}

.btn-info {
	background-color: var(--color-info);
	color: var(--color-white);
}

.btn-info:hover:not(:disabled) {
	filter: brightness(1.1);
}

.btn-outline {
	background-color: var(--color-surface);
	color: var(--color-primary);
	border: 2px solid var(--color-primary);
}

.btn-outline:hover:not(:disabled) {
	background-color: var(--color-primary);
	color: var(--color-white);
}

.btn-accent {
	background-image: linear-gradient(155deg, color-mix(in srgb, var(--color-accent) 85%, white), var(--color-accent));
	color: var(--color-white);
}

.btn-accent:hover:not(:disabled) {
	filter: brightness(1.08);
}

/* Todas las variantes de color pierden el borde neutro del .btn base. */
.btn-success, .btn-danger, .btn-warning, .btn-info, .btn-accent {
	border-color: transparent;
}
.btn-warning, .btn-info {
	box-shadow: 0 2px 6px rgba(15, 23, 42, 0.14), inset 0 1px 0 rgba(255, 255, 255, 0.22);
}

/* Tamaños de Botón */
.btn-sm {
	padding: var(--spacing-xs) var(--spacing-md);
	font-size: var(--font-size-sm);
}

.btn-lg {
	padding: var(--spacing-md) var(--spacing-xl);
	font-size: var(--font-size-lg);
}

.btn-block {
	width: 100%;
}

/* ==========================================
   5. TABLAS - SISTEMA UNIFICADO
   ========================================== */

table {
	width: 100%;
	border-collapse: collapse;
	background-color: var(--color-surface);
	border-radius: var(--border-radius-md);
	box-shadow: var(--shadow-card);
	margin: var(--spacing-lg) 0;
	overflow: hidden;
}

thead {
	background-image: linear-gradient(155deg, var(--gradient-chrome-start), var(--gradient-chrome-end)) !important;
	color: var(--color-white) !important;
}

thead th {
	background: transparent !important;
	color: var(--color-white) !important;
	padding: 13px 14px;
	text-align: center;
	font-weight: 700;
	border: none;
	border-right: 1px solid rgba(255, 255, 255, 0.14);
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.7px;
}
thead th:last-child { border-right: none; }

tbody tr {
	border-bottom: 1px solid var(--color-border);
	transition: background-color 0.12s ease;
}

/* Cebra sutil + hover marcado: la tabla deja de parecer una hoja de cálculo. */
tbody tr:nth-child(even) {
	background-color: color-mix(in srgb, var(--color-primary) 3%, var(--color-surface));
}

/* Solo para dispositivos con mouse real. En pantallas táctiles, algunos
   navegadores activan :hover con el simple toque/arrastre — en una tabla con
   scroll horizontal eso se ve como un destello de color que "viaja" fila por
   fila mientras arrastras el dedo. */
@media (hover: hover) {
	tbody tr:hover {
		background-color: var(--color-primary-lighter);
	}
}

tbody td {
	padding: 12px 14px;
	font-size: var(--font-size-base);
}

tbody tr:last-child {
	border-bottom: none;
}

tfoot {
	background-color: var(--color-light);
	border-top: 2px solid var(--color-gray-light);
}

tfoot td {
	padding: var(--spacing-md) var(--spacing-sm);
	font-weight: 600;
	color: var(--color-dark);
}

/* ==========================================
   6. MODALES Y CARDS
   ========================================== */
.modal {
	display: none;
	position: fixed;
	z-index: 1000;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	background-color: rgba(0, 0, 0, 0.5);
	animation: fadeIn 0.3s ease;
}

/* .show es la convención estándar; .active y .abierto son alias usados por
   algunos módulos (arqueo de inventario, pedidos de tienda, cuenta). */
.modal.show,
.modal.active,
.modal.abierto {
	display: flex;
	align-items: center;
	justify-content: center;
}

.modal-content {
	background-color: var(--color-surface);
	padding: var(--spacing-xl);
	border-radius: var(--border-radius-md);
	width: 90%;
	max-width: 600px;
	box-shadow: var(--shadow-lg);
	animation: slideUp 0.3s ease;
	max-height: 90vh;
	overflow-y: auto;
}

.modal-header {
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: var(--spacing-lg);
	padding-bottom: var(--spacing-md);
	border-bottom: 2px solid var(--color-primary-light);
}

.modal-header h2 {
	margin: 0;
	display: flex;
	align-items: center;
	gap: var(--spacing-md);
}

.modal-content.modal-medium {
	max-width: 700px;
}

.modal-content.modal-large {
	max-width: 1000px;
	width: 95%;
}

.modal-close {
	font-size: 28px;
	font-weight: bold;
	color: var(--color-gray);
	cursor: pointer;
	background: none;
	border: none;
	padding: 0;
	width: 32px;
	height: 32px;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: var(--border-radius-sm);
	transition: var(--transition);
}

.modal-close:hover {
	background-color: var(--color-gray-light);
	color: var(--color-dark);
}

.card {
	background-color: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-lg);
	padding: var(--spacing-xl);
	box-shadow: var(--shadow-card);
	margin-bottom: var(--spacing-lg);
	transition: box-shadow 0.2s ease, transform 0.2s ease;
}

.card:hover {
	box-shadow: var(--shadow-md);
}

.card-header {
	border-bottom: 1px solid var(--color-border);
	padding-bottom: var(--spacing-md);
	margin-bottom: var(--spacing-lg);
}

.card-body {
	padding: 0;
}

/* ==========================================
   7. FORMULARIOS
   ========================================== */
.form-group {
	margin-bottom: var(--spacing-lg);
}

label {
	display: block;
	margin-bottom: var(--spacing-sm);
	font-weight: 500;
	color: var(--color-dark);
	font-size: var(--font-size-base);
}

input[type="text"],
input[type="email"],
input[type="password"],
input[type="number"],
input[type="date"],
input[type="time"],
textarea,
select {
	width: 100%;
	padding: var(--spacing-sm) var(--spacing-md);
	border: 1px solid var(--color-gray-light);
	border-radius: var(--border-radius-sm);
	font-family: var(--font-family-base);
	font-size: var(--font-size-base);
	transition: var(--transition);
}

input:focus,
textarea:focus,
select:focus {
	outline: none;
	border-color: var(--color-primary);
	box-shadow: 0 0 0 3px rgba(10, 62, 105, 0.1);
}

textarea {
	resize: vertical;
	min-height: 100px;
}

/* ==========================================
   8. ALERTAS Y MENSAJES
   ========================================== */
.alert {
	padding: var(--spacing-md) var(--spacing-lg);
	border-radius: var(--border-radius-sm);
	margin-bottom: var(--spacing-lg);
	display: flex;
	gap: var(--spacing-md);
	align-items: flex-start;
	border-left: 4px solid transparent;
}

.alert-success {
	background-color: var(--color-success-light);
	color: var(--color-success);
	border-left-color: var(--color-success);
}

.alert-danger {
	background-color: var(--color-danger-light);
	color: var(--color-danger);
	border-left-color: var(--color-danger);
}

.alert-warning {
	background-color: var(--color-warning-light);
	color: var(--color-warning);
	border-left-color: var(--color-warning);
}

.alert-info {
	background-color: var(--color-info-light);
	color: var(--color-info);
	border-left-color: var(--color-info);
}

/* Pantalla de "Acceso Denegado" (403) — antes copiada con estilos inline
   en cada módulo. Ahora: <?php renderAccesoDenegado('mensaje'); ?>
   (función en config/config.php). */
.access-denied {
	max-width: 600px;
	margin: 60px auto;
	padding: 40px;
	text-align: center;
}

.access-denied-box {
	background: var(--color-warning-light);
	border-left: 4px solid var(--color-warning);
	border-radius: var(--border-radius-sm);
	padding: 30px;
}

.access-denied-box i.fa-lock {
	font-size: 48px;
	color: var(--color-warning);
	margin-bottom: 20px;
}

.access-denied-box h2 {
	color: var(--color-warning);
	margin: 20px 0;
}

.access-denied-box p {
	color: var(--color-gray);
	font-size: 15px;
	margin: 15px 0;
}

/* ==========================================
   9. FORMULARIOS ADICIONALES
   ========================================== */
.form-control,
input[type="text"],
input[type="number"],
input[type="date"],
input[type="datetime-local"],
input[type="time"],
input[type="email"],
input[type="tel"],
input[type="password"],
input[type="search"],
input[type="url"],
select,
textarea {
	width: 100%;
	min-height: 40px;
	padding: 9px 13px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--border-radius-md);
	font-size: var(--font-size-base);
	font-family: var(--font-family-base);
	color: var(--color-dark);
	background-color: var(--color-surface-alt);
	box-sizing: border-box;
	line-height: 1.5;
	transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}

textarea {
	min-height: 80px;
	resize: vertical;
}

.form-control:focus,
input:focus,
select:focus,
textarea:focus {
	outline: none;
	border-color: var(--color-primary);
	background-color: var(--color-surface);
	box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 14%, transparent);
}

.form-control:disabled,
input:disabled,
select:disabled,
textarea:disabled {
	background-color: var(--color-light);
	cursor: not-allowed;
	opacity: 0.7;
}

label {
	display: block;
	margin-bottom: var(--spacing-xs);
	font-weight: 500;
	font-size: var(--font-size-sm);
	color: var(--color-dark);
}

.form-row {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: var(--spacing-lg);
}

/* Utilidad genérica de grillas de 2/3 columnas para filtros y formularios
   (reemplaza los grid-template-columns inline repetidos por las páginas) */
.grid-2col {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: var(--spacing-md);
	align-items: end;
}

.grid-3col {
	display: grid;
	grid-template-columns: 1fr 1fr auto;
	gap: var(--spacing-md);
	align-items: end;
}

/* Los hijos de un grid/flex traen min-width:auto, o sea que se niegan a
   encogerse por debajo del ancho de su contenido. Cuando adentro hay una
   tabla ancha, el hijo estira la grilla y desborda la página aunque la
   tabla ya esté dentro de un .table-responsive con scroll propio. */
.grid-2col > *,
.grid-3col > *,
.stat-grid > *,
.dashboard-grid > * {
	min-width: 0;
}

@media (max-width: 768px) {
	.grid-3col {
		grid-template-columns: 1fr;
	}
}

.form-hint {
	font-size: var(--font-size-sm);
	color: var(--color-gray);
	font-weight: normal;
	display: inline;
}

.form-help {
	color: var(--color-gray);
	margin-top: var(--spacing-xs);
	display: block;
	font-size: var(--font-size-sm);
}

.form-actions {
	display: flex;
	gap: var(--spacing-md);
	margin-top: var(--spacing-xl);
	justify-content: flex-end;
}

/* ==========================================
   10. COMPONENTES DE PÁGINA
   ========================================== */
.page-header {
	display: flex;
	justify-content: space-between;
	align-items: center;
	/* Sin wrap, el título + los botones de acción no caben en móvil y
	   estiran el contenedor. */
	flex-wrap: wrap;
	margin-bottom: var(--spacing-lg);
	padding-bottom: var(--spacing-md);
	border-bottom: 1px solid var(--color-border);
	gap: var(--spacing-lg);
}

.page-title {
	display: flex;
	align-items: center;
	gap: var(--spacing-md);
}

/* Ícono del título dentro de un "chip" con color de marca — da presencia. */
.page-title > i {
	font-size: 20px;
	width: 46px;
	height: 46px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 13px;
	color: var(--color-primary);
	background: linear-gradient(150deg, var(--color-primary-light), color-mix(in srgb, var(--color-accent) 14%, var(--color-primary-lighter)));
	box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-primary) 12%, transparent);
	flex-shrink: 0;
}

.page-title h1 {
	margin: 0;
	font-size: 25px;
	font-weight: 700;
	letter-spacing: -0.2px;
	color: var(--color-dark);
	line-height: 1.15;
}

.card-filters {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--spacing-md);
	margin-bottom: var(--spacing-lg);
	padding-bottom: var(--spacing-lg);
	border-bottom: 1px solid var(--color-gray-light);
}

.input-search {
	flex: 1 1 200px;
	width: auto;
	min-width: 200px;
	padding: 9px 13px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--border-radius-md);
	font-size: var(--font-size-base);
	font-family: var(--font-family-base);
	background-color: var(--color-surface-alt);
	transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}

.input-search:focus {
	outline: none;
	border-color: var(--color-primary);
	background-color: var(--color-surface);
	box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 14%, transparent);
}

.input-filter {
	flex: 0 1 200px;
	width: auto;
	min-width: 160px;
	padding: 9px 13px;
	border: 1px solid var(--color-border-strong);
	border-radius: var(--border-radius-md);
	font-size: var(--font-size-base);
	background-color: var(--color-surface-alt);
}

/* Cualquier input/select que sea hijo directo de una fila flex de filtros
   nunca debe heredar el width:100% genérico: su tamaño lo da flex/gap. */
.card-filters > input,
.card-filters > select,
.filters-row > input,
.filters-row > select,
.filters-buttons > input,
.filters-buttons > select {
	width: auto;
}

.table-responsive {
	width: 100%;
	overflow-x: auto;
}

.table {
	width: 100%;
	border-collapse: collapse;
	background-color: var(--color-surface);
	margin: 0;
}

.table-users tbody td {
	padding: var(--spacing-md) var(--spacing-sm);
}

.spinner {
	border: 4px solid var(--color-gray-light);
	border-top: 4px solid var(--color-primary);
	border-radius: 50%;
	width: 40px;
	height: 40px;
	animation: spin 1s linear infinite;
	margin: 0 auto var(--spacing-md);
}

@keyframes spin {
	0% { transform: rotate(0deg); }
	100% { transform: rotate(360deg); }
}

.status-badge {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 4px 11px;
	border-radius: 999px;
	font-size: 11.5px;
	font-weight: 600;
	letter-spacing: 0.2px;
	box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.06);
}

.status-activo {
	background-color: var(--color-success-light);
	color: var(--color-success);
}

.status-inactivo {
	background-color: var(--color-danger-light);
	color: var(--color-danger);
}

.status-bloqueado {
	background-color: var(--color-warning-light);
	color: var(--color-warning);
}

/* Familia .badge-* — mismo estilo visual que .status-badge, usada en varios
   módulos (Inventario, Clientes, Proveedores, Caja) con esta otra convención
   de nombre. Se definen aparte para no romper el nombre que cada módulo ya
   usa en su HTML/JS. */
.badge {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 4px 11px;
	border-radius: 999px;
	font-size: 11.5px;
	font-weight: 600;
	letter-spacing: 0.2px;
	box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.06);
}

.badge-success {
	background-color: var(--color-success-light);
	color: var(--color-success);
}

.badge-danger {
	background-color: var(--color-danger-light);
	color: var(--color-danger);
}

.badge-warning {
	background-color: var(--color-warning-light);
	color: var(--color-warning);
}

.badge-info {
	background-color: var(--color-info-light);
	color: var(--color-info);
}

.badge-secondary {
	background-color: var(--color-gray-light);
	color: var(--color-gray);
}

/* ==========================================
   TARJETAS DE ACCESO RÁPIDO (Dashboard, Hub de Inventario, y cualquier otro
   "hub" de módulo) — antes duplicadas letra por letra en cada página con
   colores en hexadecimal sueltos; ahora centralizadas y tokenizadas para que
   el modo oscuro también las cubra.
   ========================================== */
.dashboard-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
	gap: var(--spacing-lg);
}

.dashboard-card {
	display: flex;
	padding: var(--spacing-lg);
	background: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-lg);
	text-decoration: none;
	color: inherit;
	box-shadow: var(--shadow-card);
	transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease;
	cursor: pointer;
	gap: var(--spacing-lg);
}

.dashboard-card:hover {
	border-color: color-mix(in srgb, var(--color-primary) 40%, var(--color-border));
	box-shadow: var(--shadow-lg);
	transform: translateY(-3px);
}

.card-icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 58px;
	height: 58px;
	border-radius: 15px;
	font-size: 24px;
	flex-shrink: 0;
	box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.05);
}

.card-icon.usuarios, .card-icon.almacen { background-color: var(--color-primary-light); color: var(--color-primary); }
.card-icon.productos { background-color: var(--color-success-light); color: var(--color-success); }
.card-icon.clientes { background-color: var(--color-danger-light); color: var(--color-danger); }
.card-icon.cartera { background-color: var(--color-warning-light); color: var(--color-warning); }
.card-icon.ventas, .card-icon.categorias, .card-icon.lista-precios { background-color: var(--color-accent-purple-light); color: var(--color-accent-purple); }
.card-icon.compras, .card-icon.traslados { background-color: var(--color-accent-blue-light); color: var(--color-accent-blue); }
.card-icon.reportes, .card-icon.separados { background-color: var(--color-accent-orange-light); color: var(--color-accent-orange); }
.card-icon.bodegas { background-color: var(--color-accent-slate-light); color: var(--color-accent-slate); }

.card-content {
	flex: 1;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
}

.card-content h3 {
	font-size: 18px;
	font-weight: 600;
	margin: 0 0 var(--spacing-sm) 0;
	color: var(--color-dark);
}

.card-content p {
	font-size: 13px;
	color: var(--color-gray);
	margin: 0;
}

.card-action {
	font-size: 12px;
	font-weight: 600;
	color: var(--color-primary);
	margin-top: var(--spacing-md);
	display: inline-block;
}

.dashboard-summary {
	background: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--border-radius-lg);
	padding: var(--spacing-xl);
	box-shadow: var(--shadow-card);
}

.dashboard-summary h2 {
	display: flex;
	align-items: center;
	gap: var(--spacing-sm);
	font-size: 18px;
	font-weight: 600;
	margin: 0 0 var(--spacing-lg) 0;
	color: var(--color-dark);
}

.btn-action {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 6px 12px;
	font-size: var(--font-size-sm);
	border: none;
	border-radius: var(--border-radius-sm);
	cursor: pointer;
	transition: var(--transition);
	white-space: nowrap;
}

.btn-edit {
	background-color: var(--color-info);
	color: var(--color-white);
}

.btn-edit:hover {
	background-color: #0da5c7;
}

.btn-delete {
	background-color: var(--color-danger);
	color: var(--color-white);
}

.btn-delete:hover {
	background-color: #c82333;
}

.modal-small {
	max-width: 400px;
}

.modal-mensaje {
	margin: var(--spacing-lg) 0;
}

.modal-usuario {
	font-weight: bold;
	color: var(--color-danger);
	margin: var(--spacing-md) 0;
}

.modal-usuario {
	font-weight: bold;
	color: var(--color-danger);
	margin: var(--spacing-md) 0;
}

/* ==========================================
   MENÚ DE ACCIONES (3 PUNTOS)
   ========================================== */
.action-menu {
	position: relative;
	display: inline-block;
}

.btn-action-menu {
	background: none;
	border: none;
	color: var(--color-gray);
	font-size: 16px;
	cursor: pointer;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: var(--transition);
}

.btn-action-menu:hover,
.btn-action-menu:focus-visible {
	color: var(--color-primary);
	background-color: var(--color-primary-light);
}

.action-dropdown {
	position: absolute;
	right: 0;
	top: 100%;
	background-color: var(--color-surface);
	border: 1px solid var(--color-gray-light);
	border-radius: var(--border-radius-sm);
	box-shadow: var(--shadow-md);
	min-width: 150px;
	max-height: 60vh;
	overflow-y: auto;
	z-index: 1000;
	margin-top: 4px;
}

.action-dropdown a {
	display: flex;
	align-items: center;
	gap: var(--spacing-md);
	padding: var(--spacing-md) var(--spacing-lg);
	color: var(--color-dark);
	text-decoration: none;
	transition: var(--transition);
	border-bottom: 1px solid var(--color-gray-light);
	font-size: var(--font-size-sm);
}

.action-dropdown a:last-child {
	border-bottom: none;
}

.action-dropdown a:hover {
	background-color: var(--color-primary-light);
	color: var(--color-primary);
}

.action-dropdown a i {
	width: 16px;
	text-align: center;
}

/* Alias para dropdown-acciones (usado en categorías, bodegas, etc) */
.dropdown-acciones {
	position: relative;
	display: inline-block;
}

.btn-acciones {
	background: none;
	border: none;
	color: var(--color-gray);
	font-size: 16px;
	cursor: pointer;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: var(--transition);
}

.btn-acciones:hover,
.btn-acciones:focus-visible {
	color: var(--color-primary);
	background-color: var(--color-primary-light);
}

.dropdown-menu-acciones {
	position: absolute;
	right: 0;
	top: 100%;
	background-color: var(--color-surface);
	border: 1px solid var(--color-gray-light);
	border-radius: var(--border-radius-sm);
	box-shadow: var(--shadow-md);
	min-width: 150px;
	max-height: 60vh;
	overflow-y: auto;
	z-index: 1000;
	margin-top: 4px;
}

.dropdown-menu-acciones a {
	display: flex;
	align-items: center;
	gap: var(--spacing-md);
	padding: var(--spacing-md) var(--spacing-lg);
	color: var(--color-dark);
	text-decoration: none;
	transition: var(--transition);
	border-bottom: 1px solid var(--color-gray-light);
	font-size: var(--font-size-sm);
}

.dropdown-menu-acciones a:last-child {
	border-bottom: none;
}

.dropdown-menu-acciones a:hover {
	background-color: var(--color-primary-light);
	color: var(--color-primary);
}

.dropdown-menu-acciones a i {
	width: 16px;
	text-align: center;
}

/* ==========================================
   11. UTILIDADES
   ========================================== */
.text-center {
	text-align: center;
}

.text-right {
	text-align: right;
}

.text-left {
	text-align: left;
}

.mt-sm { margin-top: var(--spacing-sm); }
.mt-md { margin-top: var(--spacing-md); }
.mt-lg { margin-top: var(--spacing-lg); }

.mb-sm { margin-bottom: var(--spacing-sm); }
.mb-md { margin-bottom: var(--spacing-md); }
.mb-lg { margin-bottom: var(--spacing-lg); }

.p-sm { padding: var(--spacing-sm); }
.p-md { padding: var(--spacing-md); }
.p-lg { padding: var(--spacing-lg); }

.flex {
	display: flex;
	gap: var(--spacing-md);
}

.flex-center {
	display: flex;
	justify-content: center;
	align-items: center;
}

.flex-between {
	display: flex;
	justify-content: space-between;
	align-items: center;
}

.flex-wrap {
	flex-wrap: wrap;
}

.w-full {
	width: 100%;
}

.hidden {
	display: none;
}

.visible {
	display: block;
}

/* ==========================================
   10. ANIMACIONES
   ========================================== */
@keyframes fadeIn {
	from {
		opacity: 0;
	}
	to {
		opacity: 1;
	}
}

@keyframes slideUp {
	from {
		transform: translateY(20px);
		opacity: 0;
	}
	to {
		transform: translateY(0);
		opacity: 1;
	}
}

@keyframes slideDown {
	from {
		transform: translateY(-20px);
		opacity: 0;
	}
	to {
		transform: translateY(0);
		opacity: 1;
	}
}

/* ==========================================
   11. RESPONSIVE DESIGN
   ========================================== */
@media (max-width: 768px) {
	:root {
		--font-size-base: 13px;
		--spacing-lg: 12px;
	}

	.modal-content {
		width: 95%;
		max-width: none;
		padding: var(--spacing-lg);
	}

	table {
		font-size: var(--font-size-sm);
	}

	thead th {
		padding: var(--spacing-sm) var(--spacing-xs);
	}

	tbody td {
		padding: var(--spacing-sm) var(--spacing-xs);
	}

	.btn {
		padding: var(--spacing-xs) var(--spacing-md);
		font-size: var(--font-size-sm);
	}

	.flex {
		flex-direction: column;
	}

	.flex-between {
		flex-direction: column;
		gap: var(--spacing-md);
	}

	.form-row,
	.grid-2col,
	.grid-3col {
		grid-template-columns: 1fr !important;
	}

	.dropdown-menu,
	.action-dropdown,
	.dropdown-menu-acciones {
		right: 0;
		left: auto;
		max-width: calc(100vw - 2 * var(--spacing-lg));
	}

	/* Los filtros dejan de competir por el ancho: cada campo ocupa la fila
	   completa. Sin esto, el min-width de 200px/160px los obliga a convivir
	   apretados en pantallas angostas. */
	.card-filters,
	.filters-row {
		flex-direction: column;
		align-items: stretch;
	}

	.input-search,
	.input-filter,
	.card-filters > input,
	.card-filters > select,
	.card-filters > .btn,
	.filters-row > input,
	.filters-row > select {
		width: 100%;
		min-width: 0;
		flex: none;
	}

	/* Los botones de acción del encabezado ocupan el ancho disponible en vez
	   de quedar apretados contra el borde. */
	.page-header > div {
		display: flex;
		flex-wrap: wrap;
		gap: var(--spacing-sm);
	}
}

@media (max-width: 480px) {
	:root {
		--font-size-base: 12px;
		--spacing-lg: 8px;
	}

	/* OJO: nunca poner display:block en el <table>. Eso saca a la tabla de su
	   contexto de formato y las columnas del thead dejan de alinearse con las
	   del tbody. El scroll horizontal ya lo da .table-responsive, que envuelve
	   todas las tablas del sistema. */
	table {
		font-size: 11px;
		white-space: nowrap;
	}

	thead th {
		padding: 4px 2px;
	}

	tbody td {
		padding: 4px 2px;
	}

	.modal-content {
		padding: var(--spacing-md);
	}
}

/* ==========================================
   20. LAYOUT DE PÁGINA COMPARTIDO
   (contenedor, cabecera, stats, filtros — reemplaza los <style> duplicados
   que cada página admin definía por su cuenta)
   ========================================== */
.page-container {
	max-width: 1200px;
	margin: 0 auto;
	padding: var(--spacing-lg);
}

.page-title-row {
	display: flex;
	justify-content: space-between;
	align-items: center;
	flex-wrap: wrap;
	gap: var(--spacing-md);
	margin-bottom: var(--spacing-lg);
}

.page-title-row h1 {
	margin: 0;
	color: var(--color-primary-darkest);
	font-size: var(--font-size-3xl);
	display: flex;
	align-items: center;
	gap: var(--spacing-sm);
}

.total-count {
	font-size: var(--font-size-lg);
	color: var(--color-primary);
	font-weight: 600;
}

.stat-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: var(--spacing-md);
	margin-bottom: var(--spacing-lg);
}

.stat-card {
	background: var(--color-surface);
	padding: var(--spacing-lg);
	border-radius: var(--border-radius-md);
	box-shadow: var(--shadow-sm);
	border-left: 4px solid var(--color-primary);
}

.stat-label {
	font-size: var(--font-size-sm);
	color: var(--color-secondary);
	text-transform: uppercase;
	font-weight: 600;
	margin-bottom: var(--spacing-sm);
}

.stat-value {
	font-size: 28px;
	font-weight: bold;
	color: var(--color-primary);
}

/* Panel de filtros en COLUMNA: grilla de campos + fila de botones debajo.
   Distinto de .card-filters (que es una fila simple de input+select+botón).
   No reusar .card-filters aquí: es display:flex en fila y estira sus hijos
   a la altura del más alto (por eso los botones salían gigantes). */
.filtros-panel {
	background: var(--color-surface);
	border-radius: var(--border-radius-md);
	box-shadow: var(--shadow-sm);
	padding: var(--spacing-lg);
	margin-bottom: var(--spacing-lg);
	display: flex;
	flex-direction: column;
	gap: var(--spacing-lg);
}

.filters-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: var(--spacing-md);
	margin-bottom: var(--spacing-md);
}

.filtro-grupo {
	display: flex;
	flex-direction: column;
	gap: var(--spacing-sm);
}

.filtro-grupo label {
	font-weight: 500;
	color: var(--color-dark);
	font-size: var(--font-size-sm);
}

.filters-buttons {
	display: flex;
	gap: var(--spacing-md);
	justify-content: flex-end;
	flex-wrap: wrap;
}

.card-table {
	background: var(--color-surface);
	border-radius: var(--border-radius-md);
	box-shadow: var(--shadow-sm);
	overflow: hidden;
}

.sin-datos {
	text-align: center;
	padding: 40px;
	color: var(--color-gray);
	font-size: var(--font-size-lg);
}

.loading {
	text-align: center;
	padding: 40px;
}

.paginacion {
	display: flex;
	justify-content: center;
	align-items: center;
	gap: var(--spacing-md);
	margin-top: var(--spacing-lg);
	flex-wrap: wrap;
}

.paginacion button {
	padding: var(--spacing-sm) var(--spacing-md);
	border: 1px solid var(--color-gray-light);
	background: var(--color-surface);
	border-radius: var(--border-radius-sm);
	cursor: pointer;
	font-size: var(--font-size-base);
	transition: var(--transition);
	min-height: 38px;
}

.paginacion button:hover,
.paginacion button.activa {
	background: var(--color-primary);
	color: var(--color-white);
	border-color: var(--color-primary);
}

@media (max-width: 768px) {
	.page-container {
		padding: var(--spacing-md);
	}

	.filters-buttons {
		justify-content: stretch;
	}

	.filters-buttons .btn,
	.filters-buttons button {
		flex: 1;
	}
}

/* ==========================================
   21. CRÉDITO DE DESARROLLO
   ========================================== */
.app-credit {
	text-align: center;
	padding: var(--spacing-md) 0;
	font-size: 12px;
	color: var(--color-gray);
}

.app-credit a {
	color: var(--color-gray);
	text-decoration: none;
	font-weight: 600;
}

.app-credit a:hover {
	color: var(--color-primary);
	text-decoration: underline;
}

/* ==========================================
   22. OPTIMIZACIÓN MÓVIL Y TÁCTIL
   Ajustes transversales para que el sistema se use cómodo en celular y
   tablet, no solo que "quepa". Van al final para poder sobrescribir sin
   pelearse con la especificidad de las reglas anteriores.
   ========================================== */

@media (max-width: 768px) {
	/* --- 1. Evitar el zoom automático de iOS ---
	   Safari en iPhone hace zoom sobre CUALQUIER campo cuya letra mida menos
	   de 16px al enfocarlo, y luego deja la página descuadrada. Es la causa
	   número uno de que un formulario "se sienta mal" en celular. Se fija el
	   tamaño solo en los campos: el resto de la interfaz conserva su escala
	   compacta. */
	input:not([type="checkbox"]):not([type="radio"]),
	select,
	textarea,
	.form-control,
	.input-search,
	.input-filter {
		font-size: 16px;
	}

	/* --- 2. Objetivos táctiles ---
	   Un dedo necesita ~44px para acertar sin frustración (guía de Apple y
	   Google). Muchos botones quedaban en 28-32px por el padding reducido. */
	.btn,
	button:not(.modal-close):not(.visor-btn):not(.visor-portal-btn),
	.action-menu-toggle,
	.nav-item {
		min-height: 44px;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		gap: 6px;
	}

	.btn-sm {
		min-height: 38px;
		padding: 8px 12px;
	}

	/* Los iconos de acción dentro de las tablas se separan para no tocar
	   el equivocado con el pulgar. */
	td .btn-sm + .btn-sm,
	td .btn + .btn {
		margin-left: 6px;
	}

	/* --- 3. Botones de formulario a lo ancho ---
	   Apilados y completos son mucho más fáciles de pulsar que dos botones
	   pequeños alineados a la derecha. */
	.form-actions {
		flex-direction: column-reverse;
		gap: var(--spacing-sm);
	}

	.form-actions .btn {
		width: 100%;
	}

	/* --- 4. Encabezado de página proporcionado --- */
	.page-title h1 {
		font-size: 20px;
	}

	.page-title i {
		font-size: 22px;
	}

	.page-header {
		gap: var(--spacing-md);
		margin-bottom: var(--spacing-lg);
	}

	/* --- 5. Aviso de que la tabla se desplaza ---
	   Un degradado en el borde derecho insinúa que hay más columnas; sin él,
	   el usuario cree que la tabla está cortada. */
	.table-responsive {
		position: relative;
		-webkit-overflow-scrolling: touch;
		/* Sin esto, Android puede confundir el arrastre horizontal sobre la
		   tabla con su gesto de sistema "deslizar desde el borde para volver
		   atrás" — se ve como una cápsula gris translúcida con puntas
		   redondeadas que se mueve con el dedo (lo reportado como "una línea
		   rara"). touch-action le dice al navegador que ESTE elemento ya
		   maneja el arrastre horizontal, así no dispara el gesto del sistema;
		   overscroll-behavior evita que el "rebote" al llegar al final del
		   scroll se propague a la página completa. */
		touch-action: pan-x pan-y;
		overscroll-behavior-x: contain;
	}

	/* Al deslizar el dedo para hacer scroll horizontal, el navegador puede
	   además interpretar el gesto como "seleccionar texto" en vez de
	   "desplazar". Desactivar la selección de texto en la tabla resuelve
	   eso; a cambio, ya no se puede seleccionar/copiar texto de una celda
	   directamente (se puede seguir copiando desde el modal de editar, que
	   sí es texto normal). */
	.table-responsive table {
		-webkit-user-select: none;
		user-select: none;
	}

	/* El "destello" que se ve viajar fila por fila al arrastrar el dedo es el
	   resaltado táctil por defecto de Android/Chrome — cualquier fila con
	   estilo :hover definido (tbody tr:hover) cuenta como "tocable" y el
	   navegador le pinta ese destello gris al pasar el dedo por encima,
	   incluso en pleno gesto de scroll. Quitarlo no afecta el resaltado real
	   al tocar (:hover / :active ya lo maneja nuestro propio CSS). */
	.table-responsive table,
	.table-responsive tr,
	.table-responsive td,
	.table-responsive th {
		-webkit-tap-highlight-color: transparent;
	}

	/* Quitado: un degradado fijo en el borde derecho para insinuar "hay más
	   columnas, desliza" — en la práctica se veía como un destello/línea
	   rara siempre pegada al borde derecho de la pantalla, más confuso que
	   útil. La flecha/scrollbar del propio navegador ya cumple ese aviso. */

	/* --- 6. Filtros a lo ancho ---
	   En una columna estrecha, media docena de filtros flotando en flex quedan
	   de tamaños dispares; a lo ancho se leen y se pulsan mejor. */
	.card-filters > input,
	.card-filters > select,
	.filters-row > input,
	.filters-row > select {
		width: 100%;
		min-width: 0;
		flex: 1 1 100%;
	}

	/* --- 7. Tarjetas de resumen en una sola columna --- */
	.grid-2col,
	.stat-grid {
		grid-template-columns: 1fr;
	}
}

@media (max-width: 480px) {
	/* El modal ocupa casi toda la pantalla: en pantallas pequeñas, los
	   márgenes laterales solo quitan espacio útil al contenido. */
	.modal-content {
		width: 100%;
		max-height: 100vh;
		border-radius: 0;
		padding: var(--spacing-md);
	}

	.modal {
		align-items: flex-start;
	}

	/* Las filas de formulario nunca en dos columnas: los campos quedan
	   demasiado angostos para escribir. */
	.form-row {
		flex-direction: column;
		gap: 0;
	}

	.page-title h1 {
		font-size: 18px;
	}
}

/* En pantallas táctiles no hay puntero que "pase por encima": los efectos de
   hover se quedan pegados tras tocar y confunden. */
@media (hover: none) {
	.dashboard-card:hover,
	.tienda-card:hover {
		transform: none;
	}
}

/* ==========================================================================
   REDISENO DEL PANEL (2026-09) - cascaron con sidebar, sistema "moderno suave"
   y microinteracciones. Todo con variables -> respeta gama + colores propios.
   ========================================================================== */

:root {
	--radius-sm: 9px;
	--radius-md: 13px;
	--radius-lg: 18px;
	--radius-xl: 24px;

	--sidebar-width: 258px;
	--sidebar-rail: 76px;
	--topbar-h: 62px;

	--ease-out: cubic-bezier(.22, 1, .36, 1);
	--ease-spring: cubic-bezier(.34, 1.56, .64, 1);

	--shadow-xs: 0 1px 2px rgba(19, 28, 51, .06);
	--shadow-sm: 0 2px 6px rgba(19, 28, 51, .06), 0 1px 2px rgba(19, 28, 51, .05);
	--shadow-md: 0 6px 22px -6px rgba(19, 28, 51, .14), 0 2px 8px -2px rgba(19, 28, 51, .07);
	--shadow-lg: 0 20px 48px -12px rgba(19, 28, 51, .22), 0 8px 20px -6px rgba(19, 28, 51, .10);
	--shadow-card: 0 1px 3px rgba(19, 28, 51, .05), 0 10px 30px -12px rgba(19, 28, 51, .12);
	--shadow-brand: 0 8px 22px -6px color-mix(in srgb, var(--color-primary) 45%, transparent);

	--tint-1: color-mix(in srgb, var(--color-primary) 5%, var(--color-surface));
	--tint-2: color-mix(in srgb, var(--color-primary) 9%, var(--color-surface));
	--tint-accent: color-mix(in srgb, var(--color-accent) 12%, var(--color-surface));
}

body {
	background-color: var(--color-background);
	background-image:
		radial-gradient(1200px 600px at 12% -8%, color-mix(in srgb, var(--color-primary) 8%, transparent), transparent 60%),
		radial-gradient(900px 500px at 100% 0%, color-mix(in srgb, var(--color-accent) 7%, transparent), transparent 55%);
	background-attachment: fixed;
	-webkit-font-smoothing: antialiased;
	text-rendering: optimizeLegibility;
}

.app-shell { display: flex; min-height: 100vh; align-items: stretch; }

.app-main {
	flex: 1;
	min-width: 0;
	max-width: 100%;
	display: flex;
	flex-direction: column;
}

.main-content {
	flex: 1;
	min-width: 0;
	max-width: 100%;
	padding: 26px clamp(16px, 3vw, 40px) 48px;
}
.table-responsive { max-width: 100%; overflow-x: auto; }
.card { max-width: 100%; }
.card-filters { max-width: 100%; }

.app-credit {
	margin-top: 40px;
	text-align: center;
	font-size: 12px;
	color: var(--color-gray);
}
.app-credit a { color: var(--color-gray-dark); font-weight: 600; }

/* ----------  SIDEBAR  ---------- */
.sidebar {
	width: var(--sidebar-width);
	flex-shrink: 0;
	background: var(--color-surface);
	border-right: 1px solid var(--color-border);
	position: sticky;
	top: 0;
	height: 100vh;
	display: flex;
	flex-direction: column;
	z-index: 60;
	transition: width .28s var(--ease-out);
}

.sidebar-brand {
	height: var(--topbar-h);
	flex-shrink: 0;
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 0 12px 0 18px;
	border-bottom: 1px solid var(--color-border);
}
.sidebar-brand-link {
	display: flex;
	align-items: center;
	gap: 11px;
	text-decoration: none;
	color: var(--color-dark);
	font-weight: 700;
	font-size: 15.5px;
	letter-spacing: .1px;
	min-width: 0;
	flex: 1;
}
.sidebar-brand-link img { height: 30px; max-width: 150px; object-fit: contain; }
.sidebar-brand-mark {
	width: 34px; height: 34px; flex-shrink: 0;
	display: inline-flex; align-items: center; justify-content: center;
	border-radius: 10px; font-size: 15px; color: #fff;
	background: linear-gradient(145deg, var(--color-primary-medium), var(--color-primary));
	box-shadow: var(--shadow-brand);
}
.sidebar-brand-nombre { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.sidebar-collapse {
	width: 30px; height: 30px; flex-shrink: 0;
	border: none; background: transparent; cursor: pointer;
	border-radius: 8px; color: var(--color-gray);
	display: inline-flex; align-items: center; justify-content: center;
	transition: background .15s, color .15s;
}
.sidebar-collapse:hover { background: var(--tint-2); color: var(--color-primary); }

.sidebar-nav {
	flex: 1;
	overflow-y: auto;
	overflow-x: hidden;
	padding: 12px 12px 24px;
	display: flex;
	flex-direction: column;
	gap: 2px;
	scrollbar-width: thin;
	scrollbar-color: var(--color-gray-light) transparent;
}
.sidebar-nav::-webkit-scrollbar { width: 7px; }
.sidebar-nav::-webkit-scrollbar-thumb { background: var(--color-gray-light); border-radius: 8px; }

.sidebar-group-label {
	font-size: 10.5px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 1px;
	color: var(--color-gray);
	padding: 16px 12px 6px;
	margin: 0;
}

.sidebar-link {
	display: flex;
	align-items: center;
	gap: 12px;
	width: 100%;
	padding: 10px 12px;
	border: none;
	background: transparent;
	color: var(--color-gray-dark);
	font-family: inherit;
	font-size: 13.5px;
	font-weight: 500;
	text-decoration: none;
	border-radius: 10px;
	cursor: pointer;
	position: relative;
	white-space: nowrap;
	transition: background .16s var(--ease-out), color .16s;
}
.sidebar-link > i:first-child {
	width: 20px;
	font-size: 15px;
	text-align: center;
	color: var(--color-gray);
	flex-shrink: 0;
	transition: color .16s, transform .16s var(--ease-spring);
}
.sidebar-link > span { flex: 1; overflow: hidden; text-overflow: ellipsis; }
.sidebar-link:hover { background: var(--tint-1); color: var(--color-primary); }
.sidebar-link:hover > i:first-child { color: var(--color-primary); }

.sidebar-link.is-active {
	background: linear-gradient(120deg, var(--color-primary), var(--color-primary-medium));
	color: #fff;
	box-shadow: var(--shadow-brand);
}
.sidebar-link.is-active > i:first-child { color: #fff; transform: scale(1.06); }

.sidebar-caret {
	font-size: 10px !important;
	width: auto !important;
	color: var(--color-gray);
	transition: transform .22s var(--ease-out);
}
.sidebar-accordion.is-open > .sidebar-accordion-toggle .sidebar-caret { transform: rotate(180deg); }
.sidebar-accordion > .sidebar-accordion-toggle.is-active {
	background: var(--tint-2);
	color: var(--color-primary);
}
.sidebar-accordion > .sidebar-accordion-toggle.is-active > i:first-child { color: var(--color-primary); }

.sidebar-sub {
	overflow: hidden;
	max-height: 0;
	opacity: 0;
	transition: max-height .28s var(--ease-out), opacity .2s ease;
	margin-left: 30px;
	position: relative;
}
.sidebar-sub::before {
	content: '';
	position: absolute;
	left: 2px; top: 4px; bottom: 8px;
	width: 2px;
	border-radius: 2px;
	background: var(--color-border);
}
.sidebar-accordion.is-open > .sidebar-sub { max-height: 420px; opacity: 1; }
.sidebar-sublink {
	display: block;
	padding: 8px 12px;
	font-size: 13px;
	font-weight: 500;
	color: var(--color-gray-dark);
	text-decoration: none;
	border-radius: 8px;
	transition: background .14s, color .14s;
}
.sidebar-sublink:first-child { margin-top: 3px; }
.sidebar-sublink:hover { background: var(--tint-1); color: var(--color-primary); }
.sidebar-sublink.is-active {
	color: var(--color-primary);
	font-weight: 700;
	background: var(--tint-2);
}

.app-shell.is-rail .sidebar { width: var(--sidebar-rail); }
.app-shell.is-rail .sidebar-brand { padding: 0 6px; justify-content: center; gap: 0; }
.app-shell.is-rail .sidebar-brand-link { display: none; }
.app-shell.is-rail .sidebar-collapse { margin: 0 auto; }
.app-shell.is-rail .sidebar-collapse i { transform: rotate(180deg); }
.app-shell.is-rail .sidebar-brand-nombre,
.app-shell.is-rail .sidebar-link > span,
.app-shell.is-rail .sidebar-caret,
.app-shell.is-rail .sidebar-group-label,
.app-shell.is-rail .sidebar-sub { display: none; }
.app-shell.is-rail .sidebar-brand-link { justify-content: center; gap: 0; }
.app-shell.is-rail .sidebar-nav { padding: 12px 10px; align-items: center; }
.app-shell.is-rail .sidebar-link { justify-content: center; padding: 11px 0; width: 52px; }
.app-shell.is-rail .sidebar-link > i:first-child { width: auto; }
.app-shell.is-rail .sidebar-link.is-active { box-shadow: none; }

.topbar {
	height: var(--topbar-h);
	flex-shrink: 0;
	position: sticky;
	top: 0;
	z-index: 55;
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 0 clamp(14px, 2.5vw, 28px);
	background: color-mix(in srgb, var(--color-surface) 82%, transparent);
	backdrop-filter: saturate(180%) blur(12px);
	-webkit-backdrop-filter: saturate(180%) blur(12px);
	border-bottom: 1px solid var(--color-border);
	transition: box-shadow .2s;
}
.topbar.is-scrolled { box-shadow: var(--shadow-sm); }

.topbar-menu {
	display: none;
	width: 40px; height: 40px;
	border: none; background: transparent; cursor: pointer;
	border-radius: 10px; color: var(--color-gray-dark); font-size: 17px;
	align-items: center; justify-content: center;
}
.topbar-menu:hover { background: var(--tint-2); color: var(--color-primary); }

.topbar-titulo {
	font-size: 16px;
	font-weight: 700;
	letter-spacing: -.2px;
	color: var(--color-dark);
	margin: 0;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	flex-shrink: 0;
	max-width: 34vw;
}

.topbar-buscador {
	position: relative;
	flex: 1;
	max-width: 460px;
	margin-left: auto;
}
.topbar-buscador > i {
	position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
	color: var(--color-gray); font-size: 13px; pointer-events: none;
}
.topbar-buscador input {
	width: 100%;
	height: 40px;
	border: 1px solid var(--color-border-strong);
	border-radius: 11px;
	background: var(--color-surface-alt);
	padding: 0 14px 0 38px;
	font-size: 13.5px;
	font-family: inherit;
	color: var(--color-dark);
	transition: border-color .15s, box-shadow .15s, background .15s;
}
.topbar-buscador input::placeholder { color: var(--color-gray); }
.topbar-buscador input:focus {
	outline: none;
	background: var(--color-surface);
	border-color: var(--color-primary);
	box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 14%, transparent);
}
#busquedaGlobalResultados {
	position: absolute;
	top: calc(100% + 8px);
	left: 0; right: 0;
	background: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	box-shadow: var(--shadow-lg);
	max-height: 420px;
	overflow-y: auto;
	display: none;
	z-index: 1002;
	padding: 6px;
}
#busquedaGlobalResultados.show { display: block; animation: uiPop .16s var(--ease-out); }
#busquedaGlobalResultados a {
	display: flex; align-items: center; gap: 11px;
	padding: 9px 11px; border-radius: 9px;
	color: var(--color-dark); text-decoration: none; font-size: 13px;
}
#busquedaGlobalResultados a:hover { background: var(--tint-2); color: var(--color-primary); }
#busquedaGlobalResultados a i { width: 16px; text-align: center; color: var(--color-gray); }
#busquedaGlobalResultados a:hover i { color: var(--color-primary); }
#busquedaGlobalResultados .tag-tipo {
	font-size: 9.5px; text-transform: uppercase; font-weight: 700;
	color: var(--color-gray); min-width: 54px; letter-spacing: .5px;
}
#busquedaGlobalResultados .sin-resultados { padding: 16px; text-align: center; color: var(--color-gray); font-size: 13px; }

.topbar-acciones { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
.topbar-buscar-movil {
	display: none;
	width: 40px; height: 40px; border: none; background: transparent; cursor: pointer;
	border-radius: 10px; color: var(--color-gray-dark); font-size: 15px;
	align-items: center; justify-content: center;
}

.topbar-usuario { position: relative; }
.topbar-usuario-btn {
	display: flex; align-items: center; gap: 9px;
	border: 1px solid transparent; background: transparent; cursor: pointer;
	padding: 5px 9px 5px 6px; border-radius: 999px;
	font-family: inherit; color: var(--color-gray-dark);
	transition: background .15s, border-color .15s;
}
.topbar-usuario-btn:hover { background: var(--color-surface-alt); border-color: var(--color-border); }
.topbar-avatar {
	width: 32px; height: 32px; flex-shrink: 0;
	display: inline-flex; align-items: center; justify-content: center;
	border-radius: 50%; font-size: 12px; font-weight: 700; color: #fff;
	background: linear-gradient(145deg, var(--color-primary-medium), var(--color-primary));
	overflow: hidden;
}
.topbar-avatar-foto { width: 100%; height: 100%; object-fit: cover; }
.topbar-usuario-nombre { font-size: 13px; font-weight: 600; }
.topbar-usuario-btn > .fa-chevron-down { font-size: 10px; color: var(--color-gray); }

.topbar-usuario-menu.dropdown-menu {
	position: absolute; right: 0; top: calc(100% + 10px);
	min-width: 224px;
	background: var(--color-surface);
	border: 1px solid var(--color-border);
	border-radius: var(--radius-md);
	box-shadow: var(--shadow-lg);
	padding: 6px;
	display: none;
	z-index: 1001;
}
.topbar-usuario-menu.dropdown-menu.show { display: block; animation: uiPop .16s var(--ease-out); }
.dropdown-encabezado {
	display: flex; flex-direction: column; gap: 1px;
	padding: 10px 12px 12px; margin-bottom: 4px;
	border-bottom: 1px solid var(--color-border);
}
.dropdown-encabezado strong { font-size: 13.5px; color: var(--color-dark); }
.dropdown-encabezado span { font-size: 11.5px; color: var(--color-gray); }
.topbar-usuario-menu a {
	display: flex; align-items: center; gap: 11px;
	padding: 9px 12px; border-radius: 9px;
	color: var(--color-gray-dark); text-decoration: none; font-size: 13px; font-weight: 500;
	transition: background .13s, color .13s;
}
.topbar-usuario-menu a i { width: 16px; text-align: center; color: var(--color-gray); }
.topbar-usuario-menu a:hover { background: var(--tint-2); color: var(--color-primary); }
.topbar-usuario-menu a:hover i { color: var(--color-primary); }
.topbar-usuario-menu a.logout { color: var(--color-danger); }
.topbar-usuario-menu a.logout i { color: var(--color-danger); }
.topbar-usuario-menu a.logout:hover { background: var(--color-danger-light); }

.toast-stack {
	position: fixed;
	top: 74px; right: 20px;
	z-index: 4000;
	display: flex; flex-direction: column; gap: 10px;
	max-width: min(360px, calc(100vw - 40px));
	pointer-events: none;
}
.toast {
	pointer-events: auto;
	display: flex; align-items: flex-start; gap: 11px;
	padding: 13px 14px;
	background: var(--color-surface);
	border: 1px solid var(--color-border);
	border-left: 4px solid var(--color-primary);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-lg);
	font-size: 13px;
	color: var(--color-dark);
	animation: toastIn .32s var(--ease-spring);
}
.toast.is-out { animation: toastOut .25s var(--ease-out) forwards; }
.toast i { font-size: 15px; margin-top: 1px; }
.toast.toast-success { border-left-color: var(--color-success); }
.toast.toast-success i { color: var(--color-success); }
.toast.toast-danger, .toast.toast-error { border-left-color: var(--color-danger); }
.toast.toast-danger i, .toast.toast-error i { color: var(--color-danger); }
.toast.toast-warning { border-left-color: var(--color-warning); }
.toast.toast-warning i { color: var(--color-warning); }
.toast.toast-info { border-left-color: var(--color-info); }
.toast.toast-info i { color: var(--color-info); }

@keyframes toastIn { from { opacity: 0; transform: translateX(40px) scale(.96); } to { opacity: 1; transform: none; } }
@keyframes toastOut { to { opacity: 0; transform: translateX(40px); } }
@keyframes uiPop { from { opacity: 0; transform: translateY(-6px) scale(.98); } to { opacity: 1; transform: none; } }

.page-header {
	display: flex;
	justify-content: space-between;
	align-items: center;
	flex-wrap: wrap;
	gap: 14px;
	margin-bottom: 22px;
	padding-bottom: 16px;
	border-bottom: 1px solid var(--color-border);
}
.page-title { display: flex; align-items: center; gap: 13px; }
.page-title > i {
	width: 44px; height: 44px; flex-shrink: 0;
	display: inline-flex; align-items: center; justify-content: center;
	font-size: 18px; border-radius: 13px;
	color: var(--color-primary);
	background: linear-gradient(150deg, var(--tint-2), var(--tint-accent));
	box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-primary) 14%, transparent);
}
.page-title h1, h1.page-title {
	margin: 0;
	font-size: clamp(19px, 2.4vw, 24px);
	font-weight: 700;
	letter-spacing: -.4px;
	color: var(--color-dark);
	line-height: 1.15;
}
h1.page-title { display: block; }

.btn {
	border-radius: var(--radius-sm);
	font-weight: 600;
	letter-spacing: .1px;
	transition: transform .14s var(--ease-out), box-shadow .16s, filter .16s, background-color .16s;
}
.btn:active { transform: translateY(1px) scale(.985); }
.btn-primary {
	background-image: linear-gradient(135deg, var(--color-primary-medium), var(--color-primary));
	box-shadow: var(--shadow-brand), inset 0 1px 0 rgba(255, 255, 255, .22);
	border-color: transparent;
}
.btn-primary:hover:not(:disabled) { filter: brightness(1.06); transform: translateY(-1px); }
.btn-outline { background: var(--color-surface); border-width: 1.5px; }
.btn-outline:hover:not(:disabled) { background: var(--color-primary); border-color: var(--color-primary); }
.btn.cargando { pointer-events: none; opacity: .8; position: relative; color: transparent !important; }
.btn.cargando::after {
	content: ''; position: absolute; width: 15px; height: 15px;
	border: 2px solid #fff; border-right-color: transparent; border-radius: 50%;
	animation: spin .6s linear infinite;
}

table {
	box-shadow: var(--shadow-card);
	border-radius: var(--radius-md);
	border: 1px solid var(--color-border);
}
.table-responsive {
	border-radius: var(--radius-md);
	box-shadow: var(--shadow-card);
}
.table-responsive > table { box-shadow: none; border-radius: 0; border: none; }
.card-filters { flex-wrap: wrap; }
thead {
	background-image: none !important;
	background: linear-gradient(var(--tint-2), var(--tint-1)) !important;
}
thead th {
	color: var(--color-gray-dark) !important;
	font-size: 10.5px !important;
	letter-spacing: .8px;
	border-right: 1px solid var(--color-border) !important;
	border-bottom: 1px solid var(--color-border) !important;
	padding: 13px 14px !important;
}
thead th:last-child { border-right: none !important; }
tbody tr { border-bottom: 1px solid var(--color-border); transition: background-color .13s; }
tbody tr:nth-child(even) { background: color-mix(in srgb, var(--color-primary) 2.5%, var(--color-surface)); }
@media (hover: hover) {
	tbody tr:hover { background: var(--tint-2); }
}
tbody td { padding: 12px 14px; }
.tabla-vacia, td.empty {
	text-align: center;
	padding: 46px 20px !important;
	color: var(--color-gray);
}

.form-control, input[type="text"], input[type="email"], input[type="password"],
input[type="number"], input[type="date"], input[type="datetime-local"], input[type="time"],
input[type="tel"], input[type="search"], input[type="url"], select, textarea {
	border-radius: var(--radius-sm);
	border-color: var(--color-border-strong);
	background-color: var(--color-surface-alt);
	transition: border-color .15s, box-shadow .15s, background-color .15s;
}
.form-control:focus, input:focus, select:focus, textarea:focus {
	background-color: var(--color-surface);
	box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 15%, transparent);
}

.card, .dashboard-card, .dashboard-summary {
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow-card);
}
.card { padding: clamp(16px, 2.4vw, 26px); }
.dashboard-card { transition: transform .22s var(--ease-out), box-shadow .22s; }
.dashboard-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
.dashboard-card:hover .card-icon { transform: scale(1.08) rotate(-3deg); }
.card-icon { transition: transform .25s var(--ease-spring); border-radius: 15px; box-shadow: inset 0 0 0 1px rgba(19,28,51,.05); }

.modal { background-color: rgba(15, 23, 42, .55); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }
.modal-content {
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow-lg);
	animation: modalIn .3s var(--ease-spring);
}
@keyframes modalIn { from { opacity: 0; transform: translateY(16px) scale(.97); } to { opacity: 1; transform: none; } }

.alert { border-radius: var(--radius-sm); border: 1px solid var(--color-border); box-shadow: var(--shadow-xs); }

.badge, .status-badge {
	border-radius: 999px;
	font-weight: 600;
	box-shadow: inset 0 0 0 1px rgba(19, 28, 51, .07);
}

.main-content.is-ready > * { animation: revealUp .5s var(--ease-out) both; }
.main-content.is-ready > *:nth-child(1) { animation-delay: .02s; }
.main-content.is-ready > *:nth-child(2) { animation-delay: .07s; }
.main-content.is-ready > *:nth-child(3) { animation-delay: .12s; }
.main-content.is-ready > *:nth-child(4) { animation-delay: .17s; }
.main-content.is-ready > *:nth-child(n+5) { animation-delay: .2s; }
@keyframes revealUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

tbody.is-staggered tr { animation: revealUp .4s var(--ease-out) both; }
tbody.is-staggered tr:nth-child(1) { animation-delay: .02s; }
tbody.is-staggered tr:nth-child(2) { animation-delay: .05s; }
tbody.is-staggered tr:nth-child(3) { animation-delay: .08s; }
tbody.is-staggered tr:nth-child(4) { animation-delay: .11s; }
tbody.is-staggered tr:nth-child(5) { animation-delay: .14s; }
tbody.is-staggered tr:nth-child(6) { animation-delay: .17s; }
tbody.is-staggered tr:nth-child(7) { animation-delay: .20s; }
tbody.is-staggered tr:nth-child(8) { animation-delay: .23s; }
tbody.is-staggered tr:nth-child(n+9) { animation-delay: .26s; }

.app-scrim {
	position: fixed; inset: 0;
	background: rgba(15, 23, 42, .5);
	backdrop-filter: blur(2px);
	z-index: 58;
	opacity: 0;
	transition: opacity .25s var(--ease-out);
}
.app-scrim:not([hidden]) { opacity: 1; }

@media (max-width: 992px) {
	.sidebar {
		position: fixed;
		left: 0; top: 0;
		transform: translateX(-100%);
		transition: transform .3s var(--ease-out);
		box-shadow: var(--shadow-lg);
	}
	.app-shell.sidebar-abierto .sidebar { transform: none; }
	/* En móvil el sidebar es un cajón: nunca en modo rail. */
	.app-shell.is-rail .sidebar { width: var(--sidebar-width); }
	.app-shell.is-rail .sidebar-brand-link { display: flex; }
	.app-shell.is-rail .sidebar-link > span,
	.app-shell.is-rail .sidebar-group-label,
	.app-shell.is-rail .sidebar-caret,
	.app-shell.is-rail .sidebar-brand-nombre { display: block; }
	.app-shell.is-rail .sidebar-sub { max-height: 0; }
	.app-shell.is-rail .sidebar-accordion.is-open .sidebar-sub { max-height: 420px; }
	.app-shell.is-rail .sidebar-nav { align-items: stretch; padding: 12px 12px 24px; }
	.app-shell.is-rail .sidebar-link { justify-content: flex-start; width: 100%; padding: 10px 12px; }
	.topbar-menu { display: inline-flex; }
	.sidebar-collapse { display: none; }
}

@media (max-width: 720px) {
	.topbar-titulo { display: none; }
	.topbar-buscador { display: none; }
	.topbar-buscador.is-open {
		display: block;
		position: absolute;
		left: 12px; right: 12px; top: calc(var(--topbar-h) + 8px);
		max-width: none;
		background: var(--color-surface);
		padding: 10px;
		border-radius: var(--radius-md);
		box-shadow: var(--shadow-lg);
		z-index: 60;
	}
	.topbar-buscar-movil { display: inline-flex; }
	.topbar-usuario-nombre { display: none; }
	.main-content { padding: 18px 14px 40px; }
}

@media (prefers-reduced-motion: reduce) {
	.main-content.is-ready > *,
	tbody.is-staggered tr,
	.modal-content,
	.toast,
	#busquedaGlobalResultados.show,
	.dropdown-menu.show { animation: none !important; }
	.sidebar, .sidebar-sub, .btn, .dashboard-card, .card-icon,
	.sidebar-link, .sidebar-caret { transition-duration: .01ms !important; }
}

/* ==========================================================================
   BARRA SUPERIOR EN MÓVIL — espacios optimizados
   El buscador (con `margin-left:auto`) es lo que separaba el botón de menú
   de las acciones; al ocultarse en ≤720px todo se amontonaba a la izquierda
   y el desplegable de perfil se abría fuera de pantalla. Además la barra
   conservaba paddings y alturas de escritorio, desperdiciando el ancho útil.
   ========================================================================== */
@media (max-width: 720px) {
	:root { --topbar-h: 56px; }

	.topbar {
		gap: 8px;
		padding: 0 10px;
	}

	/* Menú a la izquierda, acciones pegadas a la derecha, centro despejado. */
	.topbar-acciones {
		margin-left: auto;
		gap: 4px;
	}

	.topbar-menu,
	.topbar-buscar-movil {
		width: 38px;
		height: 38px;
		flex-shrink: 0;
	}

	.topbar-usuario-btn {
		gap: 6px;
		padding: 3px 4px 3px 5px;
	}

	/* El desplegable se abre bien pegado bajo la barra. */
	.topbar-usuario-menu.dropdown-menu { top: calc(100% + 6px); }

	.main-content { padding: 16px 12px 32px; }
}

@media (max-width: 480px) {
	.topbar { gap: 6px; padding: 0 8px; }

	/* En pantallas muy estrechas el chevron no aporta y roba ancho. */
	.topbar-usuario-btn > .fa-chevron-down { display: none; }

	.topbar-avatar { width: 30px; height: 30px; }

	/* El menú se ajusta a su contenido sin salirse de la pantalla. */
	.topbar-usuario-menu.dropdown-menu {
		min-width: 0;
		width: max-content;
		max-width: calc(100vw - 20px);
	}

	.main-content { padding: 14px 10px 28px; }
}
