/* Polideportivo Municipal — sistema de diseño propio.
   Paleta pastel/teal profesional + tipografía Inter/Plus Jakarta Sans. */

:root {
  --font-heading: 'Plus Jakarta Sans', 'Segoe UI', system-ui, sans-serif;
  --font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;

  /* Identidad: verde azulado profundo (deportes + agua), sobre grises cálidos claros. */
  --primary: #2F6D67;
  --primary-dark: #204C48;
  --primary-light: #4C8B84;
  --primary-bg: #E8F2F0;
  --primary-bg-strong: #D9EAE7;

  --accent: #C98A3E;
  --accent-bg: #FBF1E1;

  --text: #1C2430;
  --text-secondary: #5C6675;
  --text-muted: #99A2B3;

  --border: #E6EAEF;
  --border-soft: #EEF1F5;
  --bg: #F6F8F9;
  --surface: #FFFFFF;

  --success: #3E8B60;
  --success-bg: #E9F5EE;
  --warning: #C1892E;
  --warning-bg: #FBF1E0;
  --danger: #C1524F;
  --danger-bg: #FBEAEA;

  --shadow-sm: 0 1px 2px rgba(23, 34, 43, .05);
  --shadow: 0 2px 10px rgba(23, 34, 43, .05), 0 1px 2px rgba(23, 34, 43, .04);
  --shadow-md: 0 8px 24px rgba(23, 34, 43, .08), 0 2px 6px rgba(23, 34, 43, .04);
  --shadow-lg: 0 20px 48px rgba(18, 32, 33, .16), 0 4px 12px rgba(18, 32, 33, .08);

  --radius-sm: 8px;
  --radius-md: 12px;
  --radius-lg: 20px;
}

* { box-sizing: border-box; }

/* El atributo hidden debe ganarle SIEMPRE a cualquier display:flex/grid que ponga
   una clase (.alert, .form-grid, .modal-overlay, etc) — si no, el elemento "oculto"
   sigue apareciendo porque la clase pisa el display:none por defecto del navegador. */
[hidden] { display: none !important; }

html, body {
  margin: 0;
  height: 100%;
}

body {
  /* Red de seguridad: tooltips y otros elementos position:absolute (como
     .help-tip) cuentan para el ancho "scrolleable" de la página aunque estén
     invisibles (opacity:0) — sin esto, el celu deja un swipe horizontal
     fantasma hacia la derecha que no muestra nada. Va en <body>, no en <html>:
     en <html> el overflow se propaga al viewport de un modo que en Chrome
     rompe el scroll vertical de toda la página (confirmado — no es teórico).
  */
  overflow-x: hidden;
  font-family: var(--font-body);
  background: var(--bg);
  color: var(--text);
  font-size: 14px;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

a { color: inherit; text-decoration: none; }

h1, h2, h3, h4 { font-family: var(--font-heading); }

::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #D3D9E0; border-radius: 8px; }
::-webkit-scrollbar-thumb:hover { background: #B9C1CC; }

input, select, textarea {
  font-family: inherit;
  font-size: 13.5px;
  padding: 10px 12px;
  border: 1.5px solid var(--border);
  border-radius: var(--radius-sm);
  background: #fff;
  color: var(--text);
  width: 100%;
  transition: border-color .15s, box-shadow .15s;
}
input:focus, select:focus, textarea:focus {
  border-color: var(--primary-light);
  box-shadow: 0 0 0 3px var(--primary-bg);
  outline: none;
}
.required-mark { color: var(--danger); font-weight: 700; }
.field-invalid { border-color: var(--danger) !important; box-shadow: 0 0 0 3px var(--danger-bg) !important; }
label {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 12.5px;
  color: var(--text-secondary);
  font-weight: 500;
}

button { font-family: inherit; }

/* ===== Iconos SVG (reemplazan emojis) ===== */
.icon { display: inline-block; vertical-align: middle; flex-shrink: 0; }
.icon svg { display: block; width: 100%; height: 100%; }

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  padding: 10px 18px;
  border-radius: var(--radius-sm);
  border: 1.5px solid transparent;
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .1px;
  cursor: pointer;
  transition: filter .15s, box-shadow .15s, transform .1s;
  white-space: nowrap;
}
.btn:hover { filter: brightness(1.05); }
.btn:active { transform: translateY(1px); }
.btn-primary { background: var(--primary); color: #fff; box-shadow: 0 2px 8px color-mix(in srgb, var(--primary) 28%, transparent); }
.btn-primary:hover { background: var(--primary-dark); }
.btn-secondary { background: var(--primary-bg); color: var(--primary-dark); border-color: transparent; }
.btn-secondary:hover { background: var(--primary-bg-strong); }
.btn-ghost { background: #fff; color: var(--text-secondary); border-color: var(--border); }
.btn-ghost:hover { border-color: var(--text-muted); color: var(--text); }
.btn-danger { background: var(--danger); color: #fff; }
.btn-sm { padding: 7px 12px; font-size: 12px; }
.btn-block { width: 100%; }
.btn:disabled { opacity: .5; cursor: not-allowed; }

.icon-btn {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--text-secondary);
  padding: 7px;
  line-height: 1;
  border-radius: var(--radius-sm);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background .15s, color .15s;
}
.icon-btn:hover { background: var(--border-soft); color: var(--text); }

/* ===== Shell / Sidebar / Topbar ===== */

.app-shell {
  display: flex;
  min-height: 100vh;
}

.sidebar {
  width: 240px;
  background: #fff;
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  transition: width .18s ease;
}

.logout-icon-only { display: none; }

@media (min-width: 901px) {
  .sidebar.collapsed { width: 76px; }
  .sidebar.collapsed .sidebar-brand-text,
  .sidebar.collapsed .sidebar-org,
  .sidebar.collapsed .sidebar-link-label,
  .sidebar.collapsed .sidebar-user-name,
  .sidebar.collapsed .sidebar-user-role,
  .sidebar.collapsed .sidebar-user-info,
  .sidebar.collapsed .logout-full { display: none; }
  .sidebar.collapsed .sidebar-brand { justify-content: center; padding: 0; gap: 0; }
  .sidebar.collapsed .sidebar-link { justify-content: center; padding: 10px; }
  .sidebar.collapsed .sidebar-user-row { justify-content: center; margin-bottom: 8px; }
  .sidebar.collapsed .logout-icon-only { display: inline-flex; }
}

.sidebar-brand {
  height: 68px;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 18px;
  border-bottom: 1px solid var(--border-soft);
  flex-shrink: 0;
}
.sidebar-brand-mark {
  width: 34px; height: 34px;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
.sidebar-brand-mark img { width: 100%; height: 100%; object-fit: contain; }
.sidebar-brand-text { font-family: var(--font-heading); font-weight: 700; color: var(--text); font-size: 14.5px; letter-spacing: -.1px; }

.sidebar-org {
  padding: 16px 18px;
  border-bottom: 1px solid var(--border-soft);
}
.sidebar-org-name { font-family: var(--font-heading); font-size: 13px; font-weight: 700; color: var(--text); }
.sidebar-org-sub { font-size: 10.5px; color: var(--text-muted); margin-top: 2px; letter-spacing: .5px; text-transform: uppercase; }
.sidebar-sigem-link {
  display: inline-flex; align-items: center; gap: 4px; margin-top: 10px;
  font-size: 11px; font-weight: 600; color: var(--primary);
}
.sidebar-sigem-link:hover { color: var(--primary-dark); }
.sidebar.collapsed .sidebar-sigem-link { display: none; }

.sidebar-nav {
  flex: 1;
  padding: 12px;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.sidebar-link {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  color: var(--text-secondary);
  font-size: 13.5px;
  font-weight: 500;
  transition: background .15s, color .15s;
}
.sidebar-link:hover { background: var(--border-soft); color: var(--text); }
.sidebar-link.active {
  background: var(--primary-bg);
  color: var(--primary-dark);
  font-weight: 700;
}
.sidebar-link-icon { width: 18px; height: 18px; flex-shrink: 0; opacity: .85; }
.sidebar-link.active .sidebar-link-icon { opacity: 1; }

.sidebar-user {
  border-top: 1px solid var(--border-soft);
  padding: 14px 16px;
  flex-shrink: 0;
}
.sidebar-user-row { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.sidebar-user-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--primary-bg); color: var(--primary-dark);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-heading);
  font-size: 13px; font-weight: 700; flex-shrink: 0;
}
.sidebar-user-name { font-size: 12.5px; font-weight: 600; color: var(--text); }
.sidebar-user-role { font-size: 10.5px; color: var(--text-muted); margin-top: 1px; text-transform: capitalize; }

.main-area {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.topbar {
  min-height: 64px;
  background: rgba(255, 255, 255, .85);
  backdrop-filter: blur(6px);
  border-bottom: 1px solid var(--border);
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 28px;
  flex-shrink: 0;
  position: sticky;
  top: 0;
  z-index: 10;
}
.topbar-title { font-family: var(--font-heading); font-size: 17px; font-weight: 700; color: var(--text); letter-spacing: -.2px; }

.page-content { padding: 28px; flex: 1; min-width: 0; }

.app-footer {
  padding: 14px 28px; text-align: center;
  font-size: 11px; color: var(--text-muted);
  border-top: 1px solid var(--border-soft);
}
/* Entrada suave de cada pantalla — que cargar una página no sea un salto seco,
   sobre todo llegando desde la transición de SIGEM. El sidebar/topbar quedan
   fijos, solo el contenido aparece con un fundido corto. */
.page-content { animation: page-content-in .6s ease-out; }
@keyframes page-content-in {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) { .page-content { animation: none; } }

.mobile-only { display: none; }
.sidebar-overlay { display: none; }

@media (max-width: 900px) {
  .sidebar {
    position: fixed;
    top: 0; left: 0; height: 100vh; z-index: 1000;
    transform: translateX(-100%);
    transition: transform .2s ease;
  }
  .sidebar.open { transform: translateX(0); box-shadow: var(--shadow-lg); }
  .mobile-only { display: inline-flex; }
  .sidebar-overlay {
    display: block;
    position: fixed; inset: 0; background: rgba(15, 23, 27, .4); z-index: 999;
  }
  .sidebar-overlay[hidden] { display: none; }
  .page-content { padding: 16px; }
  .topbar { padding: 0 16px; }
  .card { padding: 16px; }

  /* Asistencia: prioridad — que se pueda tomar cómodo desde el celu. */
  .asist-resumen { flex-direction: column; align-items: stretch; padding: 16px; gap: 14px; }
  .asist-resumen-controles { flex-wrap: wrap; }
  .asist-resumen-total { text-align: left; }
  .asist-row { flex-direction: column; align-items: stretch; gap: 10px; position: relative; }
  .asist-controles { width: 100%; }
  .asist-btn { flex: 1; justify-content: center; padding: 12px 10px; font-size: 13px; }
  .asist-guardado { position: absolute; top: 10px; right: 12px; }
}

/* ===== Auth (login / setup) — panel partido ===== */

.auth-shell {
  min-height: 100vh;
  display: flex;
}
.auth-panel-left {
  flex: 0 0 34%;
  background:
    radial-gradient(560px 420px at 30% 20%, rgba(76, 139, 132, .35), transparent 60%),
    radial-gradient(480px 480px at 80% 85%, rgba(201, 138, 62, .18), transparent 55%),
    linear-gradient(160deg, #16302E 0%, #0E211F 60%, #0A1918 100%);
  color: #fff;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 56px 48px;
  position: relative;
  overflow: hidden;
}
.auth-panel-right {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 32px;
  background: var(--bg);
}
@media (max-width: 860px) {
  .auth-shell { flex-direction: column; }
  .auth-panel-left { flex: none; padding: 36px 28px; }
  .auth-panel-right { padding: 28px 20px 48px; }
}

.auth-brand-block { display: flex; flex-direction: column; align-items: flex-start; gap: 26px; transform: translateY(-14vh); }
@media (max-width: 860px) {
  .auth-brand-block { transform: none; }
}
.auth-logo-badge {
  width: 184px; height: 184px;
  display: flex; align-items: center; justify-content: center;
  position: relative;
}
.auth-logo-badge img {
  width: 82%; height: 82%; object-fit: contain;
  filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .2));
  position: relative; z-index: 1;
}
/* Fondo blanco chico y bien definido detrás del logo (tipo placa), con un
   borde apenas suavizado — y palpita (respira un poco de tamaño). */
.auth-logo-badge::before {
  content: '';
  position: absolute; top: 50%; left: 50%;
  width: 106%; height: 106%;
  transform: translate(-50%, -50%) scale(1);
  border-radius: 50%;
  background: radial-gradient(circle, #fff 0%, #fff 74%, rgba(255, 255, 255, .6) 88%, rgba(255, 255, 255, 0) 100%);
  box-shadow: 0 6px 18px rgba(0, 0, 0, .28);
  animation: auth-pulse 2.6s ease-in-out infinite;
  z-index: 0;
  pointer-events: none;
}
@keyframes auth-pulse {
  0%, 100% { transform: translate(-50%, -50%) scale(1); }
  50%      { transform: translate(-50%, -50%) scale(1.06); }
}
@media (prefers-reduced-motion: reduce) {
  .auth-logo-badge::before { animation: none; }
}

/* Ondas bien sutiles que se expanden desde el logo, al ritmo del palpitar. */
.auth-logo-wave {
  position: absolute; top: 50%; left: 50%;
  width: 106%; height: 106%;
  transform: translate(-50%, -50%) scale(1);
  border-radius: 50%;
  border: 1.5px solid rgba(255, 255, 255, .6);
  opacity: 0;
  animation: auth-wave 2.6s ease-out infinite;
  z-index: 0;
  pointer-events: none;
}
.auth-logo-wave-2 { animation-delay: 1.3s; }
@keyframes auth-wave {
  0%   { transform: translate(-50%, -50%) scale(1); opacity: .65; }
  70%  { transform: translate(-50%, -50%) scale(1.32); opacity: 0; }
  100% { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .auth-logo-wave { animation: none; opacity: 0; }
}
@media (max-width: 860px) {
  .auth-logo-badge { width: 128px; height: 128px; }
}

.auth-org-name { font-family: var(--font-heading); font-size: 26px; font-weight: 700; line-height: 1.25; letter-spacing: -.3px; }
.auth-org-sub { font-size: 13px; color: rgba(255, 255, 255, .55); margin-top: 6px; }
.auth-divider { width: 40px; height: 3px; border-radius: 2px; background: var(--accent); margin: 16px 0 14px; }
.auth-pill {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 14px; border-radius: 999px;
  background: rgba(255, 255, 255, .08);
  border: 1px solid rgba(255, 255, 255, .14);
  font-size: 11px; font-weight: 600; letter-spacing: .6px; text-transform: uppercase;
  color: rgba(255, 255, 255, .85);
}
.auth-footer-left {
  font-size: 11.5px; color: rgba(255, 255, 255, .4);
  position: absolute; left: 48px; bottom: 28px; z-index: 1;
}
@media (max-width: 860px) {
  .auth-footer-left { position: static; margin-top: 28px; }
}

.auth-form-wrap { width: 100%; max-width: 380px; }
.auth-eyebrow { font-family: var(--font-heading); font-size: 11.5px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--primary); margin-bottom: 10px; }
.auth-heading { font-family: var(--font-heading); font-size: 27px; font-weight: 700; letter-spacing: -.4px; color: var(--text); margin: 0 0 8px; }
.auth-sub { font-size: 13.5px; color: var(--text-secondary); line-height: 1.55; margin: 0 0 28px; }

.auth-form-card {
  background: #fff;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: 28px;
}
.auth-form { display: flex; flex-direction: column; gap: 16px; }
.auth-note {
  margin-top: 20px; padding: 13px 15px; background: var(--primary-bg); border-radius: var(--radius-sm);
  font-size: 11.5px; color: var(--primary-dark); line-height: 1.6;
}
.auth-note strong { display: block; color: var(--primary-dark); margin-bottom: 3px; font-family: var(--font-heading); }
.auth-footer { text-align: center; margin-top: 20px; color: var(--text-muted); font-size: 11px; }

/* ===== Cards / KPIs ===== */

.card {
  background: #fff;
  border: 1px solid var(--border);
  border-top: 3px solid var(--primary-light);
  border-radius: var(--radius-md);
  padding: 20px 22px;
  box-shadow: var(--shadow-sm);
}
.card + .card { margin-top: 16px; }
/* .card + .card es para cards apiladas una debajo de otra en flujo normal — pero la
   misma regla también "veía" como hermanos adyacentes a las cards puestas lado a lado
   dentro de un grid (.grid-2/.grid-3, que ya tienen su propio gap), empujando la
   segunda 16px hacia abajo y desalineando los dos paneles de una fila. */
.grid-2 > .card, .grid-3 > .card { margin-top: 0; }
.card-title {
  font-family: var(--font-heading); font-size: 14px; font-weight: 700; color: var(--text);
  margin: 0 0 16px; display: flex; align-items: center; justify-content: space-between; gap: 8px;
  letter-spacing: -.1px;
}

.kpi-seccion-titulo {
  display: flex; align-items: center; gap: 7px;
  font-family: var(--font-heading); font-size: 12.5px; font-weight: 800;
  text-transform: uppercase; letter-spacing: .5px; color: var(--primary-dark);
  margin: 0 0 10px;
}
.kpi-plan-lista { display: flex; flex-direction: column; gap: 9px; }
.kpi-plan-fila { display: flex; align-items: center; gap: 10px; }
.kpi-plan-num { font-family: var(--font-heading); font-size: 18px; font-weight: 800; color: var(--text); min-width: 26px; text-align: right; flex-shrink: 0; }
.kpi-plan-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.kpi-plan-nombre { font-size: 11px; color: var(--text-secondary); font-weight: 600; }

.kpi-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: 14px;
  margin-bottom: 20px;
}
.kpi-card {
  background: #fff; border: 1px solid var(--border); border-radius: var(--radius-md);
  padding: 18px 20px; box-shadow: var(--shadow-sm);
  display: flex; flex-direction: column; gap: 10px;
  transition: box-shadow .15s, transform .15s;
}
.kpi-card:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); }

.kpi-card.tint-teal   { background: linear-gradient(160deg, #E9F5F2, #fff 65%); border-color: #CFE8E1; }
.kpi-card.tint-amber  { background: linear-gradient(160deg, #FCF2E1, #fff 65%); border-color: #F2DDB3; }
.kpi-card.tint-rose   { background: linear-gradient(160deg, #FBEAEA, #fff 65%); border-color: #F0CECE; }
.kpi-card.tint-violet { background: linear-gradient(160deg, #F1EBFA, #fff 65%); border-color: #DDCBF0; }
.kpi-card.tint-sky    { background: linear-gradient(160deg, #E9F1FA, #fff 65%); border-color: #C9DFF3; }

.kpi-card.tint-teal .kpi-icon   { background: #CFE8E1; color: #1F4D48; }
.kpi-card.tint-amber .kpi-icon  { background: #F2DDB3; color: #7A5312; }
.kpi-card.tint-rose .kpi-icon   { background: #F0CECE; color: #8C3A3A; }
.kpi-card.tint-violet .kpi-icon { background: #DDCBF0; color: #5B3A82; }
.kpi-card.tint-sky .kpi-icon    { background: #C9DFF3; color: #205081; }

/* Cualquier .kpi-card sin tint- explícito se colorea igual, rotando la misma
   paleta por posición — así toda grilla de KPIs del sistema queda con color
   aunque la vista no haya elegido un tinte a mano. */
.kpi-grid .kpi-card:nth-child(5n+1) { background: linear-gradient(160deg, #E9F5F2, #fff 65%); border-color: #CFE8E1; }
.kpi-grid .kpi-card:nth-child(5n+1) .kpi-icon { background: #CFE8E1; color: #1F4D48; }
.kpi-grid .kpi-card:nth-child(5n+2) { background: linear-gradient(160deg, #FCF2E1, #fff 65%); border-color: #F2DDB3; }
.kpi-grid .kpi-card:nth-child(5n+2) .kpi-icon { background: #F2DDB3; color: #7A5312; }
.kpi-grid .kpi-card:nth-child(5n+3) { background: linear-gradient(160deg, #FBEAEA, #fff 65%); border-color: #F0CECE; }
.kpi-grid .kpi-card:nth-child(5n+3) .kpi-icon { background: #F0CECE; color: #8C3A3A; }
.kpi-grid .kpi-card:nth-child(5n+4) { background: linear-gradient(160deg, #F1EBFA, #fff 65%); border-color: #DDCBF0; }
.kpi-grid .kpi-card:nth-child(5n+4) .kpi-icon { background: #DDCBF0; color: #5B3A82; }
.kpi-grid .kpi-card:nth-child(5n+5) { background: linear-gradient(160deg, #E9F1FA, #fff 65%); border-color: #C9DFF3; }
.kpi-grid .kpi-card:nth-child(5n+5) .kpi-icon { background: #C9DFF3; color: #205081; }

.kpi-top { display: flex; align-items: center; justify-content: space-between; }
.kpi-icon {
  width: 36px; height: 36px; border-radius: var(--radius-sm);
  background: var(--primary-bg); color: var(--primary-dark);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.kpi-icon svg { width: 18px; height: 18px; }
.kpi-label { font-size: 11.5px; color: var(--text-secondary); font-weight: 600; letter-spacing: .2px; }
.kpi-value { font-family: var(--font-heading); font-size: 28px; font-weight: 700; color: var(--text); letter-spacing: -.5px; }
.kpi-sub { font-size: 11.5px; color: var(--text-muted); }

/* ===== Turnos: contenedores grandes por actividad para elegir dónde anotar ===== */
.actividad-picker { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 16px; margin-bottom: 24px; }
.actividad-picker-card {
  display: flex; flex-direction: column; align-items: flex-start; gap: 14px;
  padding: 26px 22px;
  border-radius: var(--radius-md);
  border: 1px solid var(--border);
  border-top: 5px solid var(--color-actividad, var(--primary));
  background: color-mix(in srgb, var(--color-actividad, var(--primary)) 14%, white);
  box-shadow: var(--shadow-sm);
  transition: transform .12s ease, box-shadow .12s ease;
  /* .actividad-picker-card también se usa como <button> (Actividades) además de <a>
     (Turnos) — reseteamos los estilos nativos de botón para que se vea igual. */
  font: inherit; text-align: left; cursor: pointer; width: 100%;
}
.actividad-picker-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
.actividad-picker-card-nueva {
  border-style: dashed; border-top-style: dashed; border-width: 2px;
  background: var(--bg); justify-content: center; align-items: center; text-align: center;
}
.actividad-picker-card-nueva .actividad-picker-icon { background: var(--primary-bg); color: var(--primary-dark); }
.actividad-picker-card-nueva:hover { border-color: var(--primary-light); }
.actividad-picker-icon {
  display: flex; align-items: center; justify-content: center;
  width: 46px; height: 46px; border-radius: 50%;
  background: color-mix(in srgb, var(--color-actividad, var(--primary)) 35%, white);
  color: color-mix(in srgb, var(--color-actividad, var(--primary)) 65%, black);
}
.actividad-picker-icon .icon { width: 22px; height: 22px; }
.actividad-picker-nombre { font-family: var(--font-heading); font-size: 19px; font-weight: 800; color: var(--text); letter-spacing: -.3px; line-height: 1.2; }
.actividad-picker-ocupacion {
  display: flex; align-items: center; gap: 4px; margin-top: 16px;
  font-size: 11.5px; font-weight: 600; color: var(--text-secondary); text-decoration: none;
}
.actividad-picker-ocupacion:hover { color: var(--text); }
.actividad-picker-ocupacion .icon { width: 13px; height: 13px; }

/* ===== Confirmar inscripción: plan + horarios agrupados por día ===== */
.plan-contratado-box {
  background: var(--primary-bg);
  border: 1px solid var(--primary-bg-strong);
  border-radius: var(--radius-md);
  padding: 16px 18px;
}
.plan-contratado-label {
  font-size: 11px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .4px; color: var(--primary-dark);
}

.horarios-dias-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 14px;
  align-items: start;
}
.horario-dia-card {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 7px;
}
.horario-dia-titulo {
  margin: 0 0 2px;
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: .4px;
  color: var(--primary-dark);
}
.horario-check-card {
  display: flex;
  align-items: flex-start;
  gap: 9px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 9px 10px;
  cursor: pointer;
  transition: border-color .12s ease, background .12s ease;
}
.horario-check-card:hover { border-color: var(--primary-light); }
.horario-check-card:has(input:checked) { border-color: var(--primary); background: var(--primary-bg); }
.horario-check-card.is-lleno { opacity: .55; cursor: not-allowed; }
.horario-check-card input[type="checkbox"] { width: auto; flex-shrink: 0; margin-top: 2px; }
.horario-check-hora {
  font-weight: 700; font-size: 12.5px; color: var(--text); white-space: nowrap; flex-shrink: 0; min-width: 76px;
}
.horario-check-detalle {
  flex: 1; min-width: 0; font-size: 12px; color: var(--text-secondary);
  display: flex; flex-direction: column; gap: 2px;
}
.horario-check-prof { font-size: 10.5px; color: var(--text-muted); }
.horario-check-badges { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; flex-shrink: 0; }

.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
@media (max-width: 900px) {
  /* minmax(0, 1fr), no 1fr solo: un grid item (la .card con la tabla adentro)
     por defecto no encoge por debajo del ancho de su contenido (min-width:auto
     implícito de grid/flex) — eso empujaba toda la página a un scroll horizontal
     en el celu aunque la tabla de adentro ya tenía su propio overflow-x:auto. */
  .grid-2, .grid-3 { grid-template-columns: minmax(0, 1fr); }
}

.progress-bar {
  height: 8px; border-radius: 5px; background: var(--border-soft); overflow: hidden;
}
.progress-bar-fill { height: 100%; background: var(--primary); border-radius: 5px; transition: width .3s ease; }
.progress-bar-fill.warning { background: var(--warning); }
.progress-bar-fill.danger { background: var(--danger); }

/* ===== Primeros pasos (onboarding) ===== */

.quickstart {
  background: linear-gradient(155deg, var(--primary-dark), var(--primary));
  border-radius: var(--radius-lg);
  padding: 26px 28px;
  color: #fff;
  margin-bottom: 20px;
  box-shadow: var(--shadow-md);
}
.quickstart-title { font-family: var(--font-heading); font-size: 17px; font-weight: 700; margin: 0 0 4px; }
.quickstart-sub { font-size: 12.5px; color: rgba(255, 255, 255, .7); margin: 0 0 20px; }
.quickstart-steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }
.quickstart-step {
  background: rgba(255, 255, 255, .08);
  border: 1px solid rgba(255, 255, 255, .12);
  border-radius: var(--radius-md);
  padding: 16px;
  display: flex; flex-direction: column; gap: 10px;
}
.quickstart-step.done { background: rgba(255, 255, 255, .04); opacity: .6; }
.quickstart-num {
  width: 26px; height: 26px; border-radius: 50%;
  background: rgba(255, 255, 255, .16);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-heading); font-size: 12px; font-weight: 700;
}
.quickstart-step.done .quickstart-num { background: var(--accent); }
.quickstart-step-title { font-size: 13px; font-weight: 700; }
.quickstart-step-desc { font-size: 11.5px; color: rgba(255, 255, 255, .65); line-height: 1.5; }
.quickstart-step a { font-size: 12px; font-weight: 700; color: #fff; text-decoration: underline; text-underline-offset: 2px; }

/* ===== Tabla ===== */

.table-wrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th, td { text-align: left; padding: 11px 12px; border-bottom: 1px solid var(--border-soft); white-space: nowrap; }
th { color: var(--primary-dark); font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: .4px; background: var(--primary-bg); }
thead tr:first-child th:first-child { border-top-left-radius: var(--radius-sm); }
thead tr:first-child th:last-child { border-top-right-radius: var(--radius-sm); }
tbody tr:hover { background: var(--bg); }
tbody tr:nth-child(even) { background: #FBFCFC; }
tbody tr:nth-child(even):hover { background: var(--bg); }
td.wrap { white-space: normal; }

/* ===== Badges / Alerts ===== */

.badge {
  display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px; border-radius: 999px;
  font-size: 11px; font-weight: 600;
}
.badge-success { background: var(--success-bg); color: var(--success); }
.badge-warning { background: var(--warning-bg); color: var(--warning); }
.badge-danger { background: var(--danger-bg); color: var(--danger); }
.badge-info { background: var(--primary-bg); color: var(--primary-dark); }
.badge-violet { background: #F1EBFA; color: #5B3A82; }
.badge-neutral { background: var(--border-soft); color: var(--text-secondary); }

.alert {
  padding: 13px 15px; border-radius: var(--radius-sm); font-size: 12.5px; display: flex; align-items: center; gap: 10px;
  margin-bottom: 16px;
}
.alert .icon { flex-shrink: 0; }
.alert-error { background: var(--danger-bg); color: var(--danger); }
.alert-warning { background: var(--warning-bg); color: var(--warning); }
/* Para avisos que no queremos que se pierdan de vista con el resto (ej. notas de
   débito sin generar) — un pulso lento, no una alarma molesta. */
.alert-pulsante { animation: alerta-pulso 2.2s ease-in-out infinite; }
@keyframes alerta-pulso {
  0%, 100% { box-shadow: 0 0 0 0 rgba(193, 137, 46, .35); }
  50%      { box-shadow: 0 0 0 6px rgba(193, 137, 46, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .alert-pulsante { animation: none; }
}
.alert-info { background: var(--primary-bg); color: var(--primary-dark); }

/* ===== Forms ===== */

.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 700px) { .form-grid { grid-template-columns: 1fr; } }
@media (max-width: 700px) {
  /* Muchos formularios de filtro/carga (toolbar de Turnos, tramos de Valores,
     horarios de Actividades, etc.) usan style="display:flex;..." con labels
     de ancho fijo en px — cómodo en desktop, pero sin wrap se salen de la
     pantalla en el celu. El inline style no fija flex-wrap, así que esta
     regla puede pisarlo sin necesidad de !important. */
  form { flex-wrap: wrap; }
}
.form-actions { display: flex; gap: 10px; margin-top: 20px; }
.checkbox-row { display: flex; align-items: center; gap: 8px; flex-direction: row; }
.checkbox-row input { width: auto; }

/* Selector de hora 24hs (HH + MM), en vez de <input type="time"> — ese input nativo
   muestra AM/PM si así está configurada la región de Windows, sin importar el idioma
   de la página, y no hay forma confiable de forzarlo desde acá. */
.selector-hora { display: inline-flex; align-items: center; gap: 4px; }
.selector-hora select { width: 62px; padding: 10px 6px; text-align: center; }
.selector-hora-separador { font-weight: 700; color: var(--text-secondary); }

/* Chips seleccionables (días, profesores): el checkbox nativo queda invisible — el
   estado "elegido" se ve solo en el color del chip, sin tilde. */
.chip-toggle {
  position: relative;
  display: inline-flex; align-items: center; gap: 6px;
  border: 1.5px solid var(--border); border-radius: 999px;
  padding: 7px 14px; font-weight: 500; font-size: 13px;
  background: #fff; color: var(--text-secondary);
  cursor: pointer; user-select: none;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.chip-toggle input[type="checkbox"] {
  position: absolute; opacity: 0; width: 0; height: 0; margin: 0; pointer-events: none;
}
.chip-toggle:has(input:checked) { background: var(--success); border-color: var(--success); color: #fff; }
.chip-toggle:has(input:disabled) { opacity: .5; cursor: not-allowed; }
@keyframes chip-bounce { 0% { transform: scale(1); } 45% { transform: scale(1.1); } 100% { transform: scale(1); } }
.chip-toggle.chip-bounce { animation: chip-bounce .28s ease; }
@media (prefers-reduced-motion: reduce) {
  .chip-toggle.chip-bounce { animation: none; }
}
.field-hint { font-size: 11px; color: var(--text-muted); font-weight: 400; }

.toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
.toolbar-search { max-width: 320px; }

.tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border); margin-bottom: 18px; }
.tab-link { padding: 10px 16px; font-size: 13px; color: var(--text-secondary); border-bottom: 2px solid transparent; transition: color .15s, border-color .15s; }
.tab-link:hover { color: var(--primary-dark); border-bottom-color: var(--primary-bg-strong); }
.tab-link.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }

/* Franja de color a la izquierda de la página, detrás del título — un toque
   de identidad que evita que las cabeceras se vean todas iguales de blancas. */
.page-header h2 {
  position: relative;
  padding-left: 14px;
}
.page-header h2::before {
  content: '';
  position: absolute;
  left: 0; top: 2px; bottom: 2px;
  width: 4px;
  border-radius: 3px;
  background: linear-gradient(180deg, var(--primary-light), var(--accent));
}

.page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 22px; flex-wrap: wrap; gap: 10px; }
.page-header h2 { margin: 0; font-family: var(--font-heading); font-size: 20px; font-weight: 700; color: var(--text); letter-spacing: -.3px; }
.page-header p { margin: 3px 0 0; font-size: 12.5px; color: var(--text-secondary); }

.empty-state { text-align: center; padding: 44px 20px; color: var(--text-muted); font-size: 13px; }
.empty-state .icon { margin: 0 auto 12px; color: var(--text-muted); opacity: .5; }

/* Fila clickeable de un resultado de búsqueda en vivo (buscadores tipo autocompletar). */
.search-result-row {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 8px 12px; border: 1px solid var(--border); border-radius: var(--radius-sm);
  margin-bottom: 5px; cursor: pointer; font-size: 13px; font-weight: 500;
  transition: background .12s, border-color .12s;
}
.search-result-row:hover { background: var(--primary-bg); border-color: var(--primary-bg-strong); }
.search-result-row:last-child { margin-bottom: 0; }

.chart-wrap { position: relative; height: 260px; }

.color-dot { width: 11px; height: 11px; border-radius: 50%; display: inline-block; flex-shrink: 0; border: 1px solid rgba(0,0,0,.08); }

.now-card {
  border-radius: var(--radius-md);
  padding: 14px 16px;
  border: 1px solid var(--border);
  border-left-width: 4px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: #fff;
  transition: box-shadow .15s, transform .15s;
}
a.now-card:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-1px);
  border-color: var(--border);
}
.now-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px; }
.now-title { font-family: var(--font-heading); font-weight: 700; font-size: 13.5px; color: var(--text); }
.now-meta { font-size: 11.5px; color: var(--text-secondary); }

/* ===== Asistencia: lista interactiva con autoguardado ===== */

.asist-resumen {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  background: linear-gradient(155deg, var(--primary-dark), var(--primary));
  border-radius: var(--radius-lg);
  padding: 20px 24px;
  color: #fff;
  margin-bottom: 18px;
  box-shadow: var(--shadow-md);
  flex-wrap: wrap;
}
.asist-resumen-fecha { display: flex; flex-direction: column; gap: 8px; }
.asist-resumen-fecha input[type="date"] {
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.24); color: #fff;
  font-family: var(--font-heading); font-weight: 600; font-size: 14px; width: auto;
}
.asist-resumen-fecha input[type="date"]::-webkit-calendar-picker-indicator { filter: invert(1); }
.asist-resumen-nav { display: flex; gap: 6px; }
.asist-resumen-nav button {
  background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.22); color: #fff;
  width: 30px; height: 30px; border-radius: 8px; cursor: pointer; display: flex; align-items: center; justify-content: center;
}
.asist-resumen-nav button:hover { background: rgba(255,255,255,.24); }
.asist-resumen-total { text-align: right; }
.asist-resumen-total .valor { font-family: var(--font-heading); font-size: 32px; font-weight: 800; letter-spacing: -.5px; line-height: 1; }
.asist-resumen-total .etiqueta { font-size: 11.5px; color: rgba(255,255,255,.7); margin-top: 4px; }

.asist-lista { display: flex; flex-direction: column; gap: 8px; }
.asist-row {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 14px; border: 1px solid var(--border-soft); border-radius: var(--radius-md);
  transition: background .15s, border-color .15s;
}
.asist-row.is-presente { background: var(--success-bg); border-color: #CFE8D6; }
.asist-row.is-ausente { background: var(--danger-bg); border-color: #F2D3D2; }
.asist-persona { display: flex; align-items: center; gap: 12px; min-width: 0; }
.asist-avatar {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0;
  background: var(--primary-bg); color: var(--primary-dark);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-heading); font-size: 12.5px; font-weight: 700;
}
.asist-nombre { font-size: 13.5px; font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.asist-controles { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.asist-btn {
  border: 1.5px solid var(--border); background: #fff; color: var(--text-secondary);
  font-family: var(--font-heading); font-size: 12px; font-weight: 700;
  padding: 8px 14px; border-radius: 999px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
  transition: background .12s, border-color .12s, color .12s, transform .08s;
}
.asist-btn:active { transform: scale(.96); }
.asist-btn.asist-presente.active { background: var(--success); border-color: var(--success); color: #fff; }
.asist-btn.asist-ausente.active { background: var(--danger); border-color: var(--danger); color: #fff; }
.asist-guardado {
  color: var(--success); opacity: 0; transition: opacity .2s; display: inline-flex; width: 16px; height: 16px;
}
.asist-guardado.show { opacity: 1; }

.asist-historial { display: flex; gap: 8px; flex-wrap: wrap; }
.asist-historial a { text-decoration: none; }

/* ===== Modal de confirmación (reemplaza el confirm() feo del navegador) ===== */

.modal-overlay {
  position: fixed; inset: 0; z-index: 3000;
  background: rgba(15, 23, 27, .45);
  backdrop-filter: blur(2px);
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  animation: modal-fade .12s ease-out;
}
@keyframes modal-fade { from { opacity: 0; } to { opacity: 1; } }
.modal-box {
  background: #fff;
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: 26px;
  max-width: 400px;
  width: 100%;
  text-align: center;
  /* Sin esto, un modal con una lista larga (ej. elegir actividad al tomar
     asistencia de un día con muchas clases) se corta contra los bordes de la
     pantalla sin ninguna forma de ver el resto. */
  max-height: calc(100vh - 40px);
  overflow-y: auto;
}
.modal-icon {
  width: 46px; height: 46px; border-radius: 50%; margin: 0 auto 14px;
  background: var(--danger-bg); color: var(--danger);
  display: flex; align-items: center; justify-content: center;
}
.modal-title { font-family: var(--font-heading); font-size: 16px; font-weight: 700; color: var(--text); margin: 0 0 8px; }
.modal-msg { font-size: 13.5px; color: var(--text-secondary); line-height: 1.55; margin: 0 0 22px; }
.modal-actions { display: flex; justify-content: center; gap: 10px; }

/* Tooltip liviano para ayuda contextual (sin JS) */
.help-hint { position: relative; display: inline-flex; cursor: help; color: var(--text-muted); }
.help-hint:hover { color: var(--primary); }
.help-hint .help-tip {
  position: absolute; bottom: 130%; left: 50%; transform: translateX(-50%);
  background: var(--text); color: #fff; font-size: 11px; font-weight: 500;
  padding: 8px 10px; border-radius: 7px; white-space: normal; width: 220px;
  opacity: 0; pointer-events: none; transition: opacity .15s; z-index: 20;
  box-shadow: var(--shadow-md); line-height: 1.4;
}
.help-hint:hover .help-tip { opacity: 1; }

/* ===== SIGEM: placa con iniciales mientras no hay logo real cargado ===== */
.logo-placeholder {
  font-family: var(--font-heading); font-weight: 800; font-size: 30px;
  color: var(--primary-dark); letter-spacing: -.5px;
}

/* ===== SIGEM: selector de módulos — pantalla completa, mismo fondo verde que
   el panel de login, en vez de vivir adentro del sidebar de administración.
   Muestra SOLO lo que el usuario tiene habilitado (nada de tarjetas grises
   bloqueadas acá — si no lo tenés, directamente no aparece). El superadmin ve
   todos los módulos más una tarjeta aparte de "Configuración". ===== */
.launcher-shell {
  min-height: 100vh;
  display: flex; flex-direction: column; align-items: center;
  padding: 64px 24px 48px;
  position: relative; overflow: hidden;
  color: #fff;
  background:
    radial-gradient(560px 420px at 30% 20%, rgba(76, 139, 132, .35), transparent 60%),
    radial-gradient(480px 480px at 80% 85%, rgba(201, 138, 62, .18), transparent 55%),
    linear-gradient(160deg, #16302E 0%, #0E211F 60%, #0A1918 100%);
}
.launcher-topbar {
  position: absolute; top: 22px; right: 28px; z-index: 2;
  display: flex; align-items: center; gap: 14px;
}
.launcher-topbar a { color: rgba(255,255,255,.65); font-size: 12px; font-weight: 600; display: inline-flex; align-items: center; gap: 5px; }
.launcher-topbar a:hover { color: #fff; }
.launcher-header { position: relative; z-index: 2; text-align: center; margin-bottom: 44px; }
.launcher-logo { width: 64px; height: 64px; margin: 0 auto 18px; display: flex; align-items: center; justify-content: center; }
.launcher-logo img { width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 3px 8px rgba(0,0,0,.25)); }
/* "SIGEM" como marca protagonista — grande, arriba de todo, no un eyebrow chico. */
.launcher-brand {
  font-family: var(--font-heading); font-weight: 800; letter-spacing: 2px;
  font-size: 40px; color: #fff; margin: 0 0 4px; line-height: 1;
  text-shadow: 0 2px 18px rgba(0,0,0,.25);
}
.launcher-brand-sub { font-size: 12px; font-weight: 600; letter-spacing: .6px; color: rgba(255,255,255,.5); text-transform: uppercase; margin: 0 0 22px; }
.launcher-eyebrow { font-family: var(--font-heading); font-size: 11px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: rgba(255,255,255,.55); margin-bottom: 8px; }
.launcher-heading { font-family: var(--font-heading); font-size: 21px; font-weight: 700; letter-spacing: -.3px; margin: 0 0 6px; color: rgba(255,255,255,.92); }
.launcher-sub { font-size: 13.5px; color: rgba(255,255,255,.62); margin: 0; }
.launcher-footer {
  position: relative; z-index: 2; margin-top: auto; padding-top: 32px;
  font-size: 11px; color: rgba(255,255,255,.35); text-align: center;
}

.launcher-grid {
  position: relative; z-index: 2;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 20px; width: 100%; max-width: 860px;
}
.launcher-tile {
  display: flex; flex-direction: column; align-items: center; gap: 14px;
  padding: 30px 18px;
  border-radius: var(--radius-lg);
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.12);
  backdrop-filter: blur(6px);
  text-align: center;
  transition: transform .15s ease, background .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.launcher-tile:hover {
  transform: translateY(-4px) scale(1.02);
  background: rgba(255,255,255,.11);
  border-color: color-mix(in srgb, var(--color-modulo, var(--accent)) 70%, white);
  box-shadow: 0 16px 40px rgba(0,0,0,.35);
}
.launcher-tile-icon {
  width: 58px; height: 58px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--color-modulo, var(--accent)) 55%, black 15%);
  color: #fff;
  transition: transform .15s ease;
}
.launcher-tile:hover .launcher-tile-icon { transform: scale(1.08); }
.launcher-tile-icon .icon { width: 28px; height: 28px; }
.launcher-tile-nombre { font-family: var(--font-heading); font-size: 16px; font-weight: 700; letter-spacing: -.1px; }
.launcher-tile-desc { font-size: 11px; color: rgba(255,255,255,.55); line-height: 1.4; }
.launcher-tile.is-config {
  border-style: dashed; background: rgba(255,255,255,.03);
}
.launcher-tile.is-config .launcher-tile-icon { background: rgba(255,255,255,.14); }
.launcher-empty { position: relative; z-index: 2; text-align: center; color: rgba(255,255,255,.6); font-size: 13.5px; max-width: 360px; }
@media (prefers-reduced-motion: reduce) { .launcher-tile, .launcher-tile-icon { transition: none; } }

/* ===== Transición login → selector de módulos — SOLO existe en SIGEM.
   Antes era un clip-path que arrancaba mostrando solo el 34% izquierdo de la
   pantalla y se estiraba hacia la derecha -- pedido explícito, repetido varias
   veces en distintos módulos: "no que corra tipo ventana de lado a lado".
   Ahora es un desvanecido simple de toda la pantalla, sin dirección; el
   contenido de adentro sigue apareciendo un toque después, escalonado
   mediante --retraso por elemento (ver dashboard.php). */
.launcher-expandir {
  opacity: 0;
  animation: launcher-aparecer .6s ease-out forwards;
}
@keyframes launcher-aparecer {
  to { opacity: 1; }
}
.launcher-fade {
  opacity: 0;
  transform: translateY(10px);
  animation: launcher-fade-in .5s ease-out forwards;
  animation-delay: var(--retraso, 0s);
}
@keyframes launcher-fade-in {
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .launcher-expandir { animation: none; opacity: 1; }
  .launcher-fade { animation: none; opacity: 1; transform: none; }
}
