/*
 * dante-ui.css: sistema visual común de los paneles (studenti, insegnanti, familias, docentes,
 * admincp, syspedia). Se carga DESPUÉS de app.css, app-dark.css y dark-fixes.css.
 *
 * Contenido:
 *   1. Tokens --dante-* (claro y oscuro)
 *   2. Correcciones de contraste WCAG AA sobre Bootstrap/Mazer
 *   3. Foco visible
 *   4. Marca de agua del panel (logo de fondo)
 *   5. Shell: skip link, sidebar, topbar, preferencias, spinner
 *   6. Componentes: encabezado, KPI, estados vacío/carga/error, tabs, filtros, badges, card-link
 *   7. Móvil: objetivos táctiles
 *   8. Movimiento reducido
 *
 * Regla: todo color nuevo sale de un token y se define para AMBOS temas.
 * Contrastes verificados (texto >= 4.5:1, UI y foco >= 3:1). Ver REVIEW_DISENO_PANELES.md.
 */

/* ============================================================
 * 1. TOKENS
 * ============================================================ */
:root,
[data-bs-theme="light"] {
	color-scheme: light;

	--dante-bg: #f2f7ff;
	--dante-surface: #ffffff;
	--dante-surface-2: #f5f8fd;
	--dante-border: #dfe5ef;
	--dante-text: #4a5a6b;          /* 6.58:1 sobre bg */
	--dante-text-strong: #25396f;
	--dante-text-muted: #56667a;    /* >= 4.9:1 sobre bg, surface y gris secundario */
	--dante-primary: #435ebe;       /* 5.86:1 con blanco */
	--dante-primary-text: #3a54b4;
	--dante-focus: #3550b0;         /* 6.67:1 sobre bg */

	--dante-success-text: #146c43;
	--dante-warning-text: #7a5c00;
	--dante-info-text: #0a6c80;
	--dante-danger-text: #b02a37;

	--dante-btn-ok: #157347;        /* botones de confirmación (Swal) */
	--dante-btn-neutral: #2f6fb5;
	--dante-btn-danger: #b02a37;

	--dante-radius: .7rem;
	--dante-radius-sm: .5rem;
	--dante-shadow: 0 2px 12px rgba(25, 42, 70, .08);
	--dante-watermark-opacity: .07;

	--dante-space-1: .25rem;
	--dante-space-2: .5rem;
	--dante-space-3: 1rem;
	--dante-space-4: 1.5rem;
	--dante-space-5: 2.5rem;

	--dante-touch: 44px;
}

html[data-bs-theme="dark"] {
	color-scheme: dark;

	--dante-bg: #151521;
	--dante-surface: #1e1e2d;
	--dante-surface-2: #252538;
	--dante-border: #2d2d43;
	--dante-text: #c2c2d9;          /* 9.39:1 sobre surface */
	--dante-text-strong: #e4e4f2;
	--dante-text-muted: #a1a1bd;    /* 6.53:1 sobre surface */
	--dante-primary: #435ebe;
	--dante-primary-text: #8ea2ff;  /* 6.85:1 sobre surface */
	--dante-focus: #8ea2ff;

	--dante-success-text: #4ec98a;
	--dante-warning-text: #ffc107;
	--dante-info-text: #0dcaf0;
	--dante-danger-text: #f0727e;

	--dante-shadow: 0 2px 12px rgba(0, 0, 0, .35);
	--dante-watermark-opacity: .06;
}

/* ============================================================
 * 2. CONTRASTE (pisa valores de Bootstrap/Mazer que no llegaban a AA)
 * ============================================================ */
:root,
[data-bs-theme="light"] {
	--bs-body-color: var(--dante-text);
	--bs-body-color-rgb: 74, 90, 107;
	/* text-muted: antes rgba(96,112,128,.75) = ~3.1:1 */
	--bs-secondary-color: var(--dante-text-muted);
}
html[data-bs-theme="dark"] {
	--bs-secondary-color: var(--dante-text-muted);
	--bs-link-color: var(--dante-primary-text);
	--bs-link-hover-color: #b4c1ff;
}

/* Texto de estado legible en ambos temas (text-warning/info eran 1.6-2:1 sobre blanco). */
.text-success { color: var(--dante-success-text) !important; }
.text-warning { color: var(--dante-warning-text) !important; }
.text-info { color: var(--dante-info-text) !important; }
.text-danger { color: var(--dante-danger-text) !important; }
html[data-bs-theme="dark"] .text-primary { color: var(--dante-primary-text) !important; }

/* Fondos claros de estado: siempre texto oscuro (blanco sobre amarillo/celeste = 1.6-2:1). */
.badge.bg-warning, .badge.bg-info,
.modal-header.bg-warning, .modal-header.bg-info,
.modal-header.bg-warning .modal-title, .modal-header.bg-info .modal-title,
.notification-icon.bg-warning, .notification-icon.bg-info,
.notification-icon.bg-warning i, .notification-icon.bg-info i {
	color: #212529 !important;
}

/* Botón outline-secondary: en oscuro el gris #6c757d (~3.5:1) parecía deshabilitado. */
html[data-bs-theme="dark"] .btn-outline-secondary {
	--bs-btn-color: var(--dante-text);
	--bs-btn-border-color: #4a4a66;
	--bs-btn-hover-color: var(--dante-text-strong);
	--bs-btn-hover-bg: var(--dante-surface-2);
	--bs-btn-hover-border-color: #5c5c7a;
	--bs-btn-active-color: var(--dante-text-strong);
	--bs-btn-active-bg: var(--dante-surface-2);
	--bs-btn-disabled-color: var(--dante-text-muted);
	--bs-btn-disabled-border-color: var(--dante-border);
}

/* Alertas alert-light-* de Mazer: en oscuro conservaban el fondo pastel claro y en claro el texto
   quedaba en 3.6-4.1:1. Ambos temas usan la variante sutil de Bootstrap 5.3. */
html[data-bs-theme] body .alert-light-primary { background: var(--bs-primary-bg-subtle); color: var(--bs-primary-text-emphasis); }
html[data-bs-theme] body .alert-light-secondary { background: var(--bs-secondary-bg-subtle); color: var(--bs-secondary-text-emphasis); }
html[data-bs-theme] body .alert-light-success { background: var(--bs-success-bg-subtle); color: var(--bs-success-text-emphasis); }
html[data-bs-theme] body .alert-light-info { background: var(--bs-info-bg-subtle); color: var(--bs-info-text-emphasis); }
html[data-bs-theme] body .alert-light-warning { background: var(--bs-warning-bg-subtle); color: var(--bs-warning-text-emphasis); }
html[data-bs-theme] body .alert-light-danger { background: var(--bs-danger-bg-subtle); color: var(--bs-danger-text-emphasis); }

/* Iconos Bootstrap: Mazer fija .bi {width:1rem;height:1rem}, que aplasta los iconos grandes
   (fs-*, estados vacíos, KPI, avatares con icono) y los superpone al texto. */
/* "html body" para ganarle a app-dark.css (html[data-bs-theme=dark] .bi) */
html body .bi[class*="fs-"],
html body .bi.display-1, html body .bi.display-2, html body .bi.display-3, html body .bi.display-4,
html body .dante-empty > .bi,
html body .dante-kpi-icon .bi,
html body .avatar > .bi {
	width: auto;
	height: auto;
	line-height: 1;
}
/* Avatar con icono (sin imagen): Mazer solo dimensiona img/.avatar-content */
.avatar:has(> .bi) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
}
.avatar.avatar-lg:has(> .bi) { width: 48px; height: 48px; }
.avatar.avatar-xl:has(> .bi) { width: 60px; height: 60px; }

/* Iconos del sidebar: 3.3:1 -> se oscurecen un poco en claro. */
[data-bs-theme="light"] .sidebar-wrapper .menu .sidebar-link i,
[data-bs-theme="light"] .sidebar-wrapper .menu .sidebar-link svg {
	color: #5f6f99;
}

/* ============================================================
 * 3. FOCO VISIBLE
 * ============================================================ */
:focus-visible {
	outline: 3px solid var(--dante-focus);
	outline-offset: 2px;
}
.btn:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible,
.form-check-input:focus-visible,
.nav-link:focus-visible,
.dropdown-item:focus-visible,
.page-link:focus-visible,
.sidebar-wrapper .menu .sidebar-link:focus-visible,
.sidebar-wrapper .menu .submenu .submenu-link:focus-visible,
.list-group-item-action:focus-visible {
	outline: 3px solid var(--dante-focus) !important;
	outline-offset: 2px;
	box-shadow: none;
}
.dropdown-item:focus-visible,
.sidebar-wrapper .menu .submenu .submenu-link:focus-visible {
	outline-offset: -3px;
}

/* ============================================================
 * 4. MARCA DE AGUA (logo de fondo del panel)
 *
 * Antes el logo era background del <body> con opacidad completa: se transparentaba a
 * través de tabs, botones outline y contenedores sin fondo (Aula, Presenze...).
 * Ahora es una capa fija detrás de todo el contenido con opacidad muy baja, así que
 * queda decorativa y nunca compite con el texto. La URL llega por --dante-watermark
 * desde el shell (textos_{panel}.php -> $logo_background_index).
 * ============================================================ */
body.dante-watermark::before {
	content: "";
	position: fixed;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	/* background-image lo define el shell en un <style> propio: una url() pasada por variable CSS
	   se resolvería relativa a ESTE archivo (common/css/) y no al panel. */
	background-position: center 55%;
	background-repeat: no-repeat;
	background-size: auto 40%;
	opacity: var(--dante-watermark-opacity);
}
/* el logo es oscuro: en tema oscuro se aclara para que siga siendo visible como marca de agua */
html[data-bs-theme="dark"] body.dante-watermark::before {
	filter: grayscale(1) invert(1);
}
@media (min-width: 1200px) {
	/* centrar en el área de contenido, no detrás del sidebar */
	body.dante-watermark::before { left: 300px; }
}
@media print {
	body.dante-watermark::before { display: none; }
}

/* ============================================================
 * 5. SHELL
 * ============================================================ */
.dante-skip-link {
	position: fixed;
	top: .5rem;
	left: .5rem;
	z-index: 2000;
	padding: .6rem 1rem;
	border-radius: var(--dante-radius-sm);
	background: var(--dante-primary);
	color: #fff !important;
	font-weight: 700;
}

#main-content:focus { outline: none; }
#main-content h1[tabindex="-1"]:focus,
#main-content h2[tabindex="-1"]:focus,
#main-content h3[tabindex="-1"]:focus { outline: none; }

/* Topbar: botones de icono con área táctil completa */
.dante-icon-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: var(--dante-touch);
	min-height: var(--dante-touch);
	padding: 0 .5rem;
	border: 0;
	border-radius: var(--dante-radius-sm);
	background: transparent;
	color: var(--dante-text-muted);
	position: relative;
}
.dante-icon-btn:hover { background: var(--dante-surface-2); color: var(--dante-text-strong); }
html body .dante-icon-btn .badge-notification {
	position: absolute;
	top: 2px;
	right: -4px;
	min-width: 1.25rem;
	padding: .2em .4em;
	font-size: .65rem;
	line-height: 1;
	border-radius: 999px;
}
html body .dante-icon-btn .badge-notification:empty { display: none; }

button.burger-btn {
	border: 0;
	background: transparent;
	color: inherit;
	min-width: var(--dante-touch);
	min-height: var(--dante-touch);
	padding: 0;
}

/* Selector de tema (Claro / Oscuro / Automático) */
.dante-theme-menu .dropdown-item.active,
.dante-theme-menu .dropdown-item[aria-checked="true"] {
	background: var(--dante-surface-2);
	color: var(--dante-text-strong);
	font-weight: 700;
}
.dante-theme-menu .dropdown-item[aria-checked="true"]::after {
	content: "\2713";
	float: right;
	margin-left: 1rem;
}
.dante-lang-code { font-size: .8rem; font-weight: 700; letter-spacing: .03em; line-height: 1; vertical-align: middle; }
.min-w-0 { min-width: 0; }

/* Notificaciones: truncado por CSS (antes substr cortaba caracteres multibyte) */
.notification-dropdown .notification-title {
	max-width: 16rem;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Spinner global (var spin en app.js) */
.dante-loading { color: var(--dante-text-muted); }
.dante-loading-text::after { content: var(--dante-loading-text, "Cargando…"); }

/* Ayudas/errores del formulario de contraseña */
.alert-mini:empty { display: none; }

/* ============================================================
 * 6. COMPONENTES
 * ============================================================ */

/* 6.1 Encabezado de página (helper PHP dante_page_header) */
.dante-page-header {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: var(--dante-space-3);
	margin-bottom: var(--dante-space-4);
}
.dante-page-header h1 {
	margin: 0;
	font-size: clamp(1.4rem, 1.1rem + 1vw, 1.9rem);
	font-weight: 700;
	color: var(--dante-text-strong);
}
.dante-page-header .dante-page-subtitle {
	margin: .25rem 0 0;
	color: var(--dante-text-muted);
}
.dante-page-header .dante-page-actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--dante-space-2);
}

/* 6.2 Tarjeta KPI */
.dante-kpi {
	display: flex;
	align-items: center;
	gap: var(--dante-space-3);
	height: 100%;
	padding: var(--dante-space-3) var(--dante-space-4);
	border-radius: var(--dante-radius);
	background: var(--dante-surface);
	box-shadow: var(--dante-shadow);
}
.dante-kpi-icon {
	flex: 0 0 auto;
	display: grid;
	place-items: center;
	width: 3rem;
	height: 3rem;
	border-radius: var(--dante-radius-sm);
	background: var(--dante-surface-2);
	color: var(--dante-primary-text);
	font-size: 1.4rem;
}
.dante-kpi-value {
	font-size: 1.75rem;
	font-weight: 800;
	line-height: 1.1;
	color: var(--dante-text-strong);
}
.dante-kpi-label {
	font-size: .875rem;
	color: var(--dante-text-muted);
}
.dante-kpi-state { font-size: .8rem; font-weight: 700; }

/* 6.3 Estados: vacío / error / carga (JS: danteState) */
.dante-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--dante-space-2);
	padding: var(--dante-space-5) var(--dante-space-3);
	border: 1px dashed var(--dante-border);
	border-radius: var(--dante-radius);
	background: var(--dante-surface);
	color: var(--dante-text-muted);
	text-align: center;
}
.dante-empty > i { font-size: 2.25rem; color: var(--dante-primary-text); opacity: .8; }
.dante-empty-title { margin: 0; font-size: 1.05rem; font-weight: 700; color: var(--dante-text-strong); }
.dante-empty p { margin: 0; max-width: 40ch; }
.dante-empty.is-error > i { color: var(--dante-danger-text); }

.dante-skeleton {
	display: grid;
	gap: var(--dante-space-3);
}
.dante-skeleton-item {
	height: 4.5rem;
	border-radius: var(--dante-radius);
	background: linear-gradient(90deg, var(--dante-surface) 25%, var(--dante-surface-2) 50%, var(--dante-surface) 75%);
	background-size: 200% 100%;
	animation: dante-shimmer 1.4s ease-in-out infinite;
}
@keyframes dante-shimmer {
	from { background-position: 200% 0; }
	to { background-position: -200% 0; }
}

/* 6.4 Tabs: fondo opaco y scroll horizontal en móvil en lugar de apilarse */
html body .nav-tabs {
	background: var(--dante-surface);
	border-radius: var(--dante-radius-sm) var(--dante-radius-sm) 0 0;
}
.tab-content { background: transparent; }
@media (max-width: 767.98px) {
	.nav-tabs {
		flex-wrap: nowrap;
		overflow-x: auto;
		overflow-y: hidden;
		scrollbar-width: none;
		-webkit-overflow-scrolling: touch;
		/* sin barra (en Windows se veía con flechas): un degradado en el borde indica que hay más */
		-webkit-mask-image: linear-gradient(to right, #000 85%, transparent);
		mask-image: linear-gradient(to right, #000 85%, transparent);
	}
	.nav-tabs::-webkit-scrollbar { display: none; }
	.nav-tabs .nav-link { white-space: nowrap; }
}

/* Botones outline: fondo opaco (antes transparent) para no dejar ver lo de atrás */
html body .btn[class*="btn-outline-"] {
	--bs-btn-bg: var(--dante-surface);
}
/* Deshabilitado: legible (antes .65 de opacidad dejaba el texto ~2:1) */
html body .btn:disabled,
html body .btn.disabled,
html body fieldset:disabled .btn {
	--bs-btn-disabled-opacity: .55;
}

/* 6.5 Barra de filtros colapsable */
.dante-filters {
	padding: var(--dante-space-3);
	border-radius: var(--dante-radius);
	background: var(--dante-surface);
	box-shadow: var(--dante-shadow);
}
.dante-filters-toggle .badge { margin-left: .35rem; }
.dante-filter-chips {
	display: flex;
	flex-wrap: wrap;
	gap: var(--dante-space-2);
	margin-top: var(--dante-space-2);
}
.dante-filter-chip {
	display: inline-flex;
	align-items: center;
	gap: .35rem;
	padding: .2rem .4rem .2rem .7rem;
	border: 1px solid var(--dante-border);
	border-radius: 999px;
	background: var(--dante-surface-2);
	color: var(--dante-text);
	font-size: .85rem;
}
.dante-filter-chip button {
	border: 0;
	background: transparent;
	color: inherit;
	line-height: 1;
	min-width: 1.75rem;
	min-height: 1.75rem;
	border-radius: 999px;
}

/* 6.6 Badges semánticos de estado (texto + color, nunca solo color) */
.dante-badge {
	display: inline-flex;
	align-items: center;
	gap: .3rem;
	padding: .25em .6em;
	border-radius: 999px;
	font-size: .78rem;
	font-weight: 700;
	border: 1px solid transparent;
}
.dante-badge--draft { background: var(--bs-secondary-bg-subtle); color: var(--bs-secondary-text-emphasis); border-color: var(--bs-secondary-border-subtle); }
.dante-badge--published { background: var(--bs-success-bg-subtle); color: var(--bs-success-text-emphasis); border-color: var(--bs-success-border-subtle); }
.dante-badge--scheduled { background: var(--bs-info-bg-subtle); color: var(--bs-info-text-emphasis); border-color: var(--bs-info-border-subtle); }
.dante-badge--warning { background: var(--bs-warning-bg-subtle); color: var(--bs-warning-text-emphasis); border-color: var(--bs-warning-border-subtle); }
.dante-badge--danger { background: var(--bs-danger-bg-subtle); color: var(--bs-danger-text-emphasis); border-color: var(--bs-danger-border-subtle); }
.dante-badge--new { background: var(--dante-primary); color: #fff; }

/* 6.7 Card-link: toda la tarjeta clicable sin anidar controles (patrón ::after) */
.dante-card-link { position: relative; }
.dante-card-link .dante-card-link-target::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	border-radius: inherit;
}
.dante-card-link .dante-card-link-target {
	color: inherit;
	text-decoration: none;
	background: none;
	border: 0;
	padding: 0;
	text-align: start;
	font: inherit;
}
.dante-card-link .dante-card-link-target:focus-visible { outline: none; }
.dante-card-link:has(.dante-card-link-target:focus-visible) {
	outline: 3px solid var(--dante-focus);
	outline-offset: 2px;
}
/* Los controles secundarios dentro de la tarjeta quedan por encima del área clicable */
.dante-card-link .btn,
.dante-card-link a:not(.dante-card-link-target),
.dante-card-link button:not(.dante-card-link-target) {
	position: relative;
	z-index: 2;
}

/* ============================================================
 * 7. MÓVIL: objetivos táctiles >= 44px en pantallas táctiles
 * ============================================================ */
@media (pointer: coarse) {
	.btn:not(.btn-close),
	.form-control,
	.form-select,
	.nav-tabs .nav-link,
	.dropdown-item,
	.page-link,
	.sidebar-wrapper .menu .submenu .submenu-link {
		min-height: var(--dante-touch);
	}
	.btn:not(.btn-close) { display: inline-flex; align-items: center; justify-content: center; }
	.btn.w-100, .btn.d-block { display: flex; }
	.btn-close {
		width: var(--dante-touch);
		height: var(--dante-touch);
		padding: 0;
		background-size: 1rem;
	}
	.form-check-input { width: 1.4em; height: 1.4em; }
	.form-switch .form-check-input { width: 2.6em; }
}
#main { min-height: 100dvh; }

/* ============================================================
 * 8. MOVIMIENTO REDUCIDO
 * ============================================================ */
@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after {
		animation-duration: .01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .01ms !important;
		scroll-behavior: auto !important;
	}
}

/* ============================================================
 * 9. LISTA DE COMUNICADOS (familias): versión compacta del componente .comment de Mazer
 *    (40px de padding y 30px de margen por tarjeta: con 90 comunicados era un scroll enorme)
 * ============================================================ */
.comment.dante-com-card {
	padding: .75rem 1rem;
	margin-bottom: .75rem;
	border-width: 1px 1px 1px 4px;
	border-radius: var(--dante-radius-sm);
	background-color: var(--dante-surface);
	box-shadow: none;
}
.comment.dante-com-card.bg-body-tertiary { background-color: var(--dante-surface-2) !important; }
.dante-com-card .comment-header {
	flex-direction: row;
	align-items: center;
	gap: 1rem;
	margin: 0;
}
.dante-com-card .comment-header > .pr-50 .h1 {
	display: grid;
	place-items: center;
	width: 2.5rem;
	height: 2.5rem;
	margin: 0;
	font-size: 1.15rem;
	color: #fff;
}
.dante-com-card .comment-header > .pr-50 .h1.bg-warning,
.dante-com-card .comment-header > .pr-50 .h1.bg-info { color: #212529; }
.dante-com-card .comment-body {
	flex: 1;
	min-width: 0;
	margin: 0;
	display: grid;
	grid-template-columns: 1fr auto;
	grid-template-areas: "t a" "m a" "b a";
	column-gap: 1rem;
	align-items: center;
}
.dante-com-card .comment-profileName { grid-area: t; font-weight: 700; color: var(--dante-text-strong); }
.dante-com-card .comment-time { grid-area: m; margin: 0; font-size: .85rem; color: var(--dante-primary-text); }
.dante-com-card .comment-body > .d-flex { grid-area: b; margin: .25rem 0 0 !important; }
.dante-com-card .comment-actions { grid-area: a; margin: 0; }
/* el tilde absoluto se superponía al botón; el estado ya lo dice el badge "Leído" */
.dante-com-card > [id^="comunicacion_check_"] { display: none; }
@media (max-width: 575.98px) {
	.dante-com-card .comment-header { align-items: flex-start; }
	.dante-com-card .comment-body { grid-template-columns: 1fr; grid-template-areas: "t" "m" "b" "a"; }
	.dante-com-card .comment-actions { margin-top: .5rem; }
}
/* el color de importancia queda solo como acento a la izquierda */
.comment.dante-com-card[class*="border-"] {
	border-top-color: var(--dante-border) !important;
	border-right-color: var(--dante-border) !important;
	border-bottom-color: var(--dante-border) !important;
}

/* Tab activa en oscuro: #435ebe sobre la superficie daba ~2.5:1 */
html[data-bs-theme="dark"] body .nav-tabs .nav-link.active,
html[data-bs-theme="dark"] body .nav-pills .nav-link.active:not([class*="bg-"]) {
	color: var(--dante-text-strong);
}
html[data-bs-theme="dark"] body .nav-tabs .nav-link.active {
	border-bottom-color: var(--dante-primary-text);
}

/* Botón nativo de <input type="file"> en oscuro (quedaba gris claro) */
html[data-bs-theme="dark"] body .form-control::file-selector-button {
	background-color: var(--dante-surface-2);
	color: var(--dante-text);
	border-color: var(--dante-border);
}

/* Fondos pastel de Mazer (.bg-light-*): en oscuro seguían claros (texto claro sobre fondo claro).
   !important para ganarle a utilidades text-* que algunos módulos combinan con estas clases. */
html[data-bs-theme="dark"] body .bg-light-primary { background-color: var(--bs-primary-bg-subtle) !important; color: var(--bs-primary-text-emphasis) !important; }
html[data-bs-theme="dark"] body .bg-light-secondary { background-color: var(--bs-secondary-bg-subtle) !important; color: var(--bs-secondary-text-emphasis) !important; }
html[data-bs-theme="dark"] body .bg-light-success { background-color: var(--bs-success-bg-subtle) !important; color: var(--bs-success-text-emphasis) !important; }
html[data-bs-theme="dark"] body .bg-light-info { background-color: var(--bs-info-bg-subtle) !important; color: var(--bs-info-text-emphasis) !important; }
html[data-bs-theme="dark"] body .bg-light-warning { background-color: var(--bs-warning-bg-subtle) !important; color: var(--bs-warning-text-emphasis) !important; }
html[data-bs-theme="dark"] body .bg-light-danger { background-color: var(--bs-danger-bg-subtle) !important; color: var(--bs-danger-text-emphasis) !important; }

/* Botones outline en oscuro: el color base (#435ebe, #198754, #dc3545) daba 2.8-4:1 sobre la superficie */
html[data-bs-theme="dark"] body .btn-outline-primary { --bs-btn-color: var(--dante-primary-text); --bs-btn-border-color: #6f84d8; }
html[data-bs-theme="dark"] body .btn-outline-success { --bs-btn-color: var(--dante-success-text); --bs-btn-border-color: #2f9e6a; }
html[data-bs-theme="dark"] body .btn-outline-danger { --bs-btn-color: var(--dante-danger-text); --bs-btn-border-color: #d9534f; }
html[data-bs-theme="dark"] body .btn-outline-dark { --bs-btn-color: var(--dante-text); --bs-btn-border-color: #5c5c7a; }

/* SweetAlert en oscuro: app-dark.css fuerza #3699ff con texto blanco (2.9:1) en todos los confirm */
html[data-bs-theme="dark"] body .swal2-styled.swal2-confirm { background-color: #2f6fb5 !important; }
html[data-bs-theme="dark"] body .swal2-styled.swal2-confirm:hover { background-color: #275d99 !important; }

/* FullCalendar: números de día con poco contraste (claro #a8b5db 2:1, oscuro #59607d 2.6:1) */
html[data-bs-theme] body .fc .fc-daygrid-day-number,
html[data-bs-theme] body .fc .fc-col-header-cell-cushion {
	color: var(--dante-text);
}
html[data-bs-theme] body .fc .fc-day-other .fc-daygrid-day-number { color: var(--dante-text-muted); }
html[data-bs-theme] body .fc .fc-day-today .fc-daygrid-day-number { color: var(--dante-text-strong); font-weight: 700; }

/* Submenú activo en oscuro: #435ebe sobre el sidebar daba 2.8:1 */
html[data-bs-theme="dark"] body .sidebar-wrapper .menu .submenu .submenu-item.active > .submenu-link,
html[data-bs-theme="dark"] body .sidebar-wrapper .menu .submenu .submenu-link:hover {
	color: var(--dante-primary-text);
}

/* Listas flush dentro de tarjetas: en oscuro tomaban el fondo del body (bloque más oscuro que la
   tarjeta, con el texto pegado al borde por px-0). Fondo transparente = alineadas con la tarjeta. */
html body .card .list-group-flush {
	--bs-list-group-bg: transparent;
}
/* Ítems clicables con px-0: el hover/foco necesita aire a los costados sin desalinear el texto */
html body .card .list-group-flush > .list-group-item-action.px-0 {
	padding-left: .75rem !important;
	padding-right: .75rem !important;
	margin-left: -.75rem;
	margin-right: -.75rem;
	border-radius: var(--dante-radius-sm);
	width: auto;
}

/* Tarjetas h-100 en columnas: el margin-bottom de Mazer (2.2rem) se sumaba al 100% y la tarjeta
   invadía la fila siguiente (quedaba "cortada" debajo de la próxima tarjeta). */
.row > [class*="col"] > .card.h-100 {
	height: calc(100% - 2.2rem) !important;
}
.row > [class*="col"] > .card.h-100.mb-0 {
	height: 100% !important;
}

/* KPI en celular: más compactos (apilados ocupaban media pantalla) */
@media (max-width: 575.98px) {
	.dante-kpi { padding: .65rem .9rem; gap: .75rem; }
	.dante-kpi-icon { width: 2.4rem; height: 2.4rem; font-size: 1.15rem; }
	.dante-kpi-value { font-size: 1.35rem; }
	.dante-page-header { margin-bottom: var(--dante-space-3); }
}

/* Texto de ayuda de formularios: Mazer usa #7c8db5 (3.3:1) */
html body .form-text { color: var(--dante-text-muted); }

/* btn-link en oscuro: hereda #435ebe (2.8:1) */
html[data-bs-theme="dark"] body .btn-link {
	--bs-btn-color: var(--dante-primary-text);
	--bs-btn-hover-color: #b4c1ff;
	--bs-btn-active-color: #b4c1ff;
}

/* Alertas sólidas de Mazer (alert-info/success/warning/danger): texto blanco sobre pastel (~2.2:1).
   Se unifican con la variante sutil de Bootstrap 5.3, que ya sigue ambos temas. */
html[data-bs-theme] body .alert-primary { background-color: var(--bs-primary-bg-subtle); color: var(--bs-primary-text-emphasis); border-color: var(--bs-primary-border-subtle); }
html[data-bs-theme] body .alert-secondary { background-color: var(--bs-secondary-bg-subtle); color: var(--bs-secondary-text-emphasis); border-color: var(--bs-secondary-border-subtle); }
html[data-bs-theme] body .alert-success { background-color: var(--bs-success-bg-subtle); color: var(--bs-success-text-emphasis); border-color: var(--bs-success-border-subtle); }
html[data-bs-theme] body .alert-info { background-color: var(--bs-info-bg-subtle); color: var(--bs-info-text-emphasis); border-color: var(--bs-info-border-subtle); }
html[data-bs-theme] body .alert-warning { background-color: var(--bs-warning-bg-subtle); color: var(--bs-warning-text-emphasis); border-color: var(--bs-warning-border-subtle); }
html[data-bs-theme] body .alert-danger { background-color: var(--bs-danger-bg-subtle); color: var(--bs-danger-text-emphasis); border-color: var(--bs-danger-border-subtle); }
html body .alert-primary .alert-link, html body .alert-info .alert-link, html body .alert-success .alert-link,
html body .alert-warning .alert-link, html body .alert-danger .alert-link { color: inherit; }

/* Breadcrumb activo: #6c757d fijo (3.9-4.4:1) */
html[data-bs-theme] body .breadcrumb { --bs-breadcrumb-item-active-color: var(--dante-text-muted); --bs-breadcrumb-divider-color: var(--dante-text-muted); }

/* table-secondary en oscuro: Bootstrap la deja con fondo gris claro fijo (#e2e3e5) */
html[data-bs-theme="dark"] body .table-secondary {
	--bs-table-color: var(--dante-text);
	--bs-table-bg: var(--dante-surface-2);
	--bs-table-border-color: var(--dante-border);
	--bs-table-striped-bg: #2a2a3f;
	--bs-table-striped-color: var(--dante-text);
	--bs-table-active-bg: #30304a;
	--bs-table-active-color: var(--dante-text);
	--bs-table-hover-bg: #2d2d45;
	--bs-table-hover-color: var(--dante-text);
	color: var(--dante-text);
}

/* Scroll horizontal de tablas: barra fina en vez de la clásica con flechas de Windows */
.table-responsive { scrollbar-width: thin; scrollbar-color: var(--dante-border) transparent; }

/* input-group-text en oscuro: #526e8a (2.8:1) */
html[data-bs-theme="dark"] body .input-group-text { color: var(--dante-text-muted); }

/* <code> dentro de cajas de color (alertas, badges, fondos de estado): el rosa de Bootstrap no contrasta */
.alert code, [class*="bg-warning"] code, [class*="bg-info"] code, [class*="bg-success"] code,
[class*="bg-danger"] code, [class*="bg-light-"] code { color: inherit; font-weight: 600; }

/* Paginación: en celular se desbordaba (audit_log) */
.pagination { flex-wrap: wrap; row-gap: .25rem; }

/* btn-outline-warning/info en claro: amarillo/celeste sobre blanco (1.6-2:1) */
[data-bs-theme="light"] body .btn-outline-warning { --bs-btn-color: var(--dante-warning-text); --bs-btn-border-color: #c99a06; }
[data-bs-theme="light"] body .btn-outline-info { --bs-btn-color: var(--dante-info-text); --bs-btn-border-color: #0aa2c0; }

/* Topbar en celulares chicos (~360px): no entraban año + íconos + avatar */
@media (max-width: 420px) {
	.navbar-top .dante-icon-btn { min-width: 38px; padding: 0 .25rem; }
	.navbar-top .dante-lang-code { display: none; }
	.navbar-top .nav-item.me-1, .navbar-top .dropdown.me-1 { margin-right: 0 !important; }
	header .navbar .container-fluid { padding-left: .5rem; padding-right: .5rem; }
}

/* Cabeceras de tarjeta con título + botones: en celular los botones bajan a su propia fila */
@media (max-width: 575.98px) {
	#main-content .card-header.d-flex { flex-wrap: wrap; gap: .5rem; }
	#main-content .card-header.d-flex > .d-flex { flex-wrap: wrap; }
}

/* =====================================================================
   Fase 5: móvil
   ===================================================================== */

/* Márgenes seguros (notch y barra de gestos) en la PWA instalada: el viewport usa viewport-fit=cover,
   así que el contenido puede quedar debajo del notch si no se respeta env(safe-area-inset-*).
   En navegadores sin notch env() vale 0 y estas reglas no cambian nada. */
.navbar-fixed > header { height: calc(var(--navbar-height) + env(safe-area-inset-top, 0px)); }
.navbar-fixed .navbar-top {
	height: calc(var(--navbar-height) + env(safe-area-inset-top, 0px));
	padding-top: calc(1.5rem + env(safe-area-inset-top, 0px));
}
.navbar-fixed .navbar-top .container-fluid {
	padding-left: max(.75rem, env(safe-area-inset-left, 0px));
	padding-right: max(.75rem, env(safe-area-inset-right, 0px));
}
#main-content, #main > footer {
	padding-left: env(safe-area-inset-left, 0px);
	padding-right: env(safe-area-inset-right, 0px);
}
#main > footer { padding-bottom: env(safe-area-inset-bottom, 0px); }
@media (max-width: 1199.98px) {
	.sidebar-wrapper {
		padding-top: env(safe-area-inset-top, 0px);
		padding-bottom: env(safe-area-inset-bottom, 0px);
		padding-left: env(safe-area-inset-left, 0px);
	}
}
.dante-pase-franja { padding-top: max(.45rem, env(safe-area-inset-top, 0px)); }
.swal2-container { padding-bottom: max(.625em, env(safe-area-inset-bottom, 0px)); }

/* Backdrop del sidebar en celular: sin z-index propio quedaba debajo de elementos posicionados
   (barra inferior, botones flotantes). */
.sidebar-backdrop { z-index: 990; }

/* Barra de navegación inferior (paneles de usuario final, columna menu_{panel}.bottom_nav) */
.dante-bottomnav { display: none; }
@media (max-width: 767.98px) {
	body.dante-has-bottomnav { --dante-bottomnav-h: 3.75rem; }
	.dante-bottomnav {
		position: fixed; left: 0; right: 0; bottom: 0; z-index: 980;
		display: flex; align-items: stretch;
		height: calc(var(--dante-bottomnav-h) + env(safe-area-inset-bottom, 0px));
		padding: 0 env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
		margin: 0; list-style: none;
		background: var(--dante-surface);
		border-top: 1px solid var(--dante-border);
		box-shadow: 0 -4px 16px rgba(16, 40, 73, .08);
	}
	.dante-bottomnav > li { flex: 1 1 0; min-width: 0; display: flex; }
	.dante-bottomnav-link {
		flex: 1; min-width: 0; min-height: 44px;
		display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .15rem;
		padding: .35rem .15rem; border: 0; background: none;
		color: var(--dante-text-muted); font-size: .7rem; font-weight: 600; line-height: 1.1;
		text-decoration: none; -webkit-tap-highlight-color: transparent;
	}
	html body .dante-bottomnav-link > .bi {
		width: auto; height: auto; font-size: 1.3rem; line-height: 1;
		display: inline-flex; align-items: center; justify-content: center;
		padding: .1rem .9rem; border-radius: 999px; transition: background-color .2s;
	}
	html body button.dante-bottomnav-link { font-family: inherit; font-size: .7rem; }
	.dante-bottomnav-link > span {
		max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
	}
	.dante-bottomnav-link:hover, .dante-bottomnav-link:focus-visible { color: var(--dante-text); }
	.dante-bottomnav-link:focus-visible { outline: 3px solid var(--dante-focus); outline-offset: -3px; }
	.dante-bottomnav-link[aria-current="page"] { color: var(--dante-primary-text); }
	html body .dante-bottomnav-link[aria-current="page"] > .bi { background: rgba(67, 94, 190, .14); }
	html[data-bs-theme="dark"] body .dante-bottomnav-link[aria-current="page"] > .bi { background: rgba(142, 162, 255, .18); }

	/* espacio para que la barra no tape el final del contenido ni los botones flotantes */
	body.dante-has-bottomnav #main { padding-bottom: calc(var(--dante-bottomnav-h) + env(safe-area-inset-bottom, 0px)); }
	body.dante-has-bottomnav #main > footer { padding-bottom: 0; }
	body.dante-has-bottomnav .whatsapp-icon {
		bottom: calc(20px + var(--dante-bottomnav-h) + env(safe-area-inset-bottom, 0px));
	}
	body.dante-has-bottomnav .dante-chat-root {
		bottom: calc(14px + var(--dante-bottomnav-h) + env(safe-area-inset-bottom, 0px));
	}
	body.dante-has-bottomnav .dante-chat-root.dante-chat-with-wame {
		bottom: calc(76px + var(--dante-bottomnav-h) + env(safe-area-inset-bottom, 0px));
	}
	body.dante-has-bottomnav .dante-chat-root .dante-chat-panel {
		height: calc(100dvh - 110px - var(--dante-bottomnav-h));
		max-height: calc(100dvh - 110px - var(--dante-bottomnav-h));
	}
}
@media print { .dante-bottomnav { display: none !important; } }

/* Selector de tema de 3 estados en login y cuenta_usuario (sin topbar) */
.dante-theme-seg {
	display: inline-flex; gap: .15rem; padding: .2rem;
	border: 1px solid var(--dante-border); border-radius: 999px; background: var(--dante-surface);
}
.dante-theme-seg button {
	min-width: 44px; min-height: 36px; border: 0; border-radius: 999px; background: none;
	color: var(--dante-text-muted); font-size: 1.05rem; line-height: 1;
}
html body .dante-theme-seg button > .bi { width: auto; height: auto; }
/* app-dark.css repite el reset `button { border-radius: 0 }` con más especificidad: en oscuro quedaban cuadrados */
html[data-bs-theme] body .dante-theme-seg button { border-radius: 999px; }
.dante-theme-seg button:hover { color: var(--dante-text); }
.dante-theme-seg button:focus-visible { outline: 3px solid var(--dante-focus); outline-offset: 1px; }
.dante-theme-seg button[aria-checked="true"] { background: var(--dante-primary); color: #fff; }

/* Login: idioma activo (studenti/insegnanti) */
.btn-outline-secondary[aria-current="true"] {
	background: var(--dante-surface-2); color: var(--dante-text-strong); border-color: var(--dante-text-muted); font-weight: 700;
}

/* text-gray-600 de Mazer (#6c757d fijo): 3.9:1 en oscuro (nombre y rol del usuario en el topbar) */
html[data-bs-theme] body .text-gray-600 { color: var(--dante-text-muted) !important; }
html[data-bs-theme] body .navbar-top .user-name h6 { color: var(--dante-text-strong) !important; }
