/* Tema oscuro (por defecto). TODO color de la app sale de estas variables;
   nunca colores sueltos en las reglas. El tema claro solo redefine variables. */
:root {
  --bg: #0b121b;
  --card: #121b26;
  --fg: #e6edf3;
  --muted: #8b98a5;
  --accent: #2f81f7;
  --error: #f85149;
  --border: #24303c;
  --input-bg: #0a1019;
  --tip-bg: #080d14;
  --overlay-bg: rgba(4, 7, 11, 0.72);
  --row-border: rgba(36, 48, 60, 0.5);
  --row-hover: rgba(47, 129, 247, 0.06);
  --ok: #3fb950;
  --warn: #d29922;
  /* Paleta de series de gráficas (CrocoPulso), además de accent/ok/warn/error. */
  --chart-1: #2dd4bf;
  --chart-2: #a371f7;
  --chart-3: #db61a2;
  --chart-4: #f0883e;
  --chart-5: #7d8eff;
  /* Roles de usuario (badges de la gestión de usuarios). */
  --rol-admin: #a371f7;
  --rol-supervisor: #2f81f7;
}

:root[data-theme="light"] {
  --bg: #f2f5f8;
  --card: #ffffff;
  --fg: #1a2733;
  --muted: #5b6b7b;
  --accent: #0969da;
  --error: #d1242f;
  --border: #d5dce3;
  --input-bg: #f6f8fa;
  --tip-bg: #ffffff;
  --overlay-bg: rgba(30, 40, 50, 0.45);
  --row-border: rgba(190, 200, 210, 0.5);
  --row-hover: rgba(9, 105, 218, 0.06);
  --ok: #1a7f37;
  --warn: #9a6700;
  --chart-1: #0f766e;
  --chart-2: #6639ba;
  --chart-3: #bf3989;
  --chart-4: #bc4c00;
  --chart-5: #4547c9;
  --rol-admin: #6639ba;
  --rol-supervisor: #0969da;
}

/* Badge de rol (gestión de usuarios): pastilla tintada + texto de color. */
.rol-badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 0.8rem; font-weight: 600; }
.rol-badge.rol-admin { color: var(--rol-admin); background: color-mix(in srgb, var(--rol-admin) 15%, transparent); }
.rol-badge.rol-supervisor { color: var(--rol-supervisor); background: color-mix(in srgb, var(--rol-supervisor) 15%, transparent); }

/* Campo de texto con botones a la derecha (p. ej. contraseña: ver / generar). */
.campo-con-acciones { display: flex; align-items: center; gap: 6px; }
.campo-con-acciones input { flex: 1 1 auto; min-width: 0; }

/* Modal de alta/edición de usuario: 30% más estrecho que el ancho estándar. */
.ct-modal.ct-modal-wide.ct-modal-angosto { max-width: 602px; }

* { box-sizing: border-box; }

body {
  margin: 0;
  min-height: 100vh;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  background: var(--bg);
  color: var(--fg);
  display: flex;
  flex-direction: column;
  align-items: center;
}

.topbar {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0.9rem 1.5rem;
  border-bottom: 1px solid var(--border);
  color: var(--muted);
  font-size: 0.95rem;
}

.card {
  width: 100%;
  max-width: 520px;
  margin: 3rem 1rem;
  padding: 2rem;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
}

h1 { margin: 0 0 0.5rem; font-size: 1.4rem; }

.muted { color: var(--muted); }
.small { font-size: 0.85rem; }

a { color: var(--accent); }
a:hover { text-decoration: underline; }

form { display: flex; flex-direction: column; gap: 1rem; margin-top: 1.5rem; }

label { display: flex; flex-direction: column; gap: 0.4rem; font-size: 0.95rem; }

label.checkbox { flex-direction: row; align-items: center; gap: 0.5rem; }

input[type="text"],
input[type="password"],
input[type="file"] {
  padding: 0.6rem 0.7rem;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--fg);
  font-size: 0.95rem;
}

input:focus { outline: 2px solid var(--accent); border-color: var(--accent); }

button {
  padding: 0.7rem 1rem;
  background: var(--accent);
  color: #fff;
  border: none;
  border-radius: 8px;
  font-size: 1rem;
  cursor: pointer;
}

button:hover { filter: brightness(1.1); }

button.link {
  background: none;
  color: var(--muted);
  padding: 0;
  font-size: 0.95rem;
}

button.link:hover { color: var(--fg); filter: none; }

.error {
  margin: 1rem 0 0;
  padding: 0.7rem 0.9rem;
  background: rgba(248, 81, 73, 0.12);
  border: 1px solid var(--error);
  border-radius: 8px;
  color: var(--error);
}

code {
  background: var(--input-bg);
  padding: 0.1rem 0.35rem;
  border-radius: 4px;
  font-size: 0.9em;
}

.overlay {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1.2rem;
  padding: 1.5rem;
  background: var(--overlay-bg);
  backdrop-filter: blur(2px);
}

.overlay[hidden] { display: none; }

.overlay p { max-width: 340px; text-align: center; color: var(--fg); }

.spinner {
  width: 48px;
  height: 48px;
  border: 4px solid var(--border);
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

/* ---- Dashboard (home del portal) ---- */

.brand { display: flex; align-items: center; gap: 0.55rem; color: var(--fg); }
.brand img { width: 34px; height: 34px; border-radius: 8px; }

.topbar .menu { display: flex; gap: 1.2rem; }
.topbar .menu a { color: var(--fg); text-decoration: none; padding: 0.3rem 0; }
.topbar .menu a.active { color: var(--accent); border-bottom: 2px solid var(--accent); }
.topbar .menu .disabled { color: var(--muted); cursor: not-allowed; }
.topbar form { margin: 0; }

button.ghost {
  background: none;
  border: 1px solid var(--border);
  color: var(--muted);
  padding: 0.45rem 0.9rem;
  font-size: 0.9rem;
}
button.ghost:hover { color: var(--fg); border-color: var(--muted); filter: none; }

.topbar-actions { display: flex; align-items: center; gap: 0.6rem; }

.theme-toggle {
  display: inline-flex;
  align-items: center;
  padding: 0.45rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--muted);
}
.theme-toggle:hover { color: var(--fg); border-color: var(--muted); filter: none; }

/* Acceso a Gestión de usuarios (solo admin): botón-icono en la topbar, junto al tema. */
.topbar-icon-btn {
  display: inline-flex;
  align-items: center;
  padding: 0.45rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--muted);
  text-decoration: none;
}
.topbar-icon-btn:hover { color: var(--fg); border-color: var(--muted); filter: none; }
.topbar-icon-btn.active { color: var(--accent); border-color: var(--accent); }
.theme-toggle .icon-moon { display: none; }
:root[data-theme="light"] .theme-toggle .icon-sun { display: none; }
:root[data-theme="light"] .theme-toggle .icon-moon { display: inline; }

.page {
  width: 100%;
  max-width: 1280px;
  padding: 1.2rem 0 3rem;
  display: flex;
  flex-direction: column;
  gap: 1.2rem;
}

.toolbar { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 0.8rem; }
.toolbar h1 { margin: 0; }

.ranges { display: flex; gap: 0.4rem; }
.ranges a {
  padding: 0.35rem 0.75rem;
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--muted);
  text-decoration: none;
  font-size: 0.9rem;
}
.ranges a:hover { color: var(--fg); text-decoration: none; }
.ranges a.active { background: var(--accent); border-color: var(--accent); color: #fff; }

.ranges button {
  display: inline-flex;
  align-items: center;
  padding: 0.35rem 0.6rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--muted);
  font-size: 0.9rem;
}
.ranges button:hover:not(:disabled) { color: var(--fg); border-color: var(--muted); filter: none; }
.ranges button.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.ranges button:disabled { opacity: 0.35; cursor: default; }

.ranges-sep { width: 1px; height: 18px; background: var(--border); margin: 0 0.35rem; align-self: center; }

.dia-label {
  display: inline-flex;
  align-items: center;
  align-self: center;
  margin-right: 0.2rem;
  font-size: 0.85rem;
}

.rango-form { display: flex; align-items: flex-end; gap: 0.8rem; flex-wrap: wrap; margin: 0.5rem 0; }
.rango-form label { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.9rem; color: var(--muted); }
.rango-form input[type="date"] {
  padding: 0.45rem 0.6rem;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--fg);
  font-size: 0.9rem;
  color-scheme: dark;
}
:root[data-theme="light"] .rango-form input[type="date"] { color-scheme: light; }
.rango-form button { padding: 0.5rem 1rem; font-size: 0.9rem; }

.stat-cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(105px, 1fr));
  gap: 0.6rem;
}
.stat {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 0.7rem 0.8rem;
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}
.stat .num { font-size: 1.25rem; font-weight: 600; }
.stat .lbl { font-size: 0.78rem; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Coletilla pequeña junto al número grande de una card (misma línea, sin saltar) */
.stat .num { white-space: nowrap; }
.stat .num-coletilla { font-size: 0.78rem; font-weight: 400; color: var(--muted); white-space: nowrap; }
.stat.accepted .num, .stat.opened .num, .stat.clicked .num { color: var(--ok); }
.stat.failed .num, .stat.expired .num { color: var(--error); }
.stat.pospuesto .num, .stat.reintento .num { color: var(--warn); }

.panel {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 1rem 1.2rem;
}
.panel h2 { margin: 0 0 0.8rem; font-size: 1.05rem; }

.tabs { display: flex; gap: 0.3rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border); }
.tab {
  padding: 0.5rem 1rem;
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  border-radius: 0;
  color: var(--muted);
  font-size: 0.95rem;
}
.tab:hover { color: var(--fg); filter: none; }
.tab.active { color: var(--accent); border-bottom-color: var(--accent); }

/* Fila de acciones sobre una tabla (altas, acciones multi-fila...): botones a la derecha */
.tabla-acciones {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 0.5rem;
}

.tab-alta {
  display: inline-flex;
  align-items: center;
  padding: 0.2rem 0.8rem;
  background: var(--accent);
  border: 1px solid var(--accent);
  border-radius: 8px;
  color: #fff;
  font-size: 0.9rem;
}

/* Formulario en modal (alta de regla, futuros CRUD): campo + ayuda por línea */
.form-croco { display: flex; flex-direction: column; gap: 0.8rem; margin: 0.6rem 0; }
.form-croco label { display: flex; flex-direction: column; gap: 0.25rem; font-size: 0.92rem; }
.form-croco label .muted { font-size: 0.8rem; }
.form-croco input[type="number"], .form-croco input[type="text"], .form-croco input[type="password"], .form-croco input[type="date"], .form-croco select {
  padding: 0.45rem 0.6rem;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--fg);
  font-size: 0.9rem;
}
.form-croco label.checkbox { flex-direction: row; align-items: center; gap: 0.35rem; display: inline-flex; margin-right: 0.8rem; }

/* Interruptor (switch) tipo dynocheck, en azul: ON = accent, OFF = borde */
.ct-switch {
  position: relative;
  display: inline-block;
  width: 34px;
  height: 20px;
  flex: 0 0 auto;
  vertical-align: middle;
}
.ct-switch input { opacity: 0; width: 0; height: 0; }
.ct-switch .slider {
  position: absolute;
  inset: 0;
  background: var(--border);
  border-radius: 20px;
  transition: background 0.15s;
  cursor: pointer;
}
.ct-switch .slider::before {
  content: "";
  position: absolute;
  width: 16px;
  height: 16px;
  left: 2px;
  top: 2px;
  background: #fff;
  border-radius: 50%;
  transition: transform 0.15s;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.ct-switch input:checked + .slider { background: var(--accent); }
.ct-switch input:checked + .slider::before { transform: translateX(14px); }

/* Variante solo lectura: informa del estado pero no es clicable */
.ct-switch-ro .slider { cursor: default; opacity: 0.7; }

/* Campo de formulario con switch: etiqueta a la izquierda, switch a la derecha */
.campo-switch-fila {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 0.6rem;
}

/* Lista de tipos prioritarios en el modal: filtro arriba y cuerpo con scroll propio */
#prior-filtro { margin: 0.4rem 0 0.6rem; width: 260px; }
.prior-lista { max-height: 45vh; overflow-y: auto; }

/* Subrejilla 2 columnas dentro del formulario (campos cortos emparejados) */
.form-croco-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.8rem 1.2rem;
  align-items: start;
}
.form-croco-grid label { min-width: 0; }

.tab-refresh {
  display: inline-flex;
  align-items: center;
  margin-left: auto;
  align-self: center;
  padding: 0.35rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--muted);
}
.tab-refresh:hover { color: var(--accent); border-color: var(--accent); filter: none; }

.table-wrap { overflow-x: auto; } /* scroll horizontal permitido: hay ocultar/truncar columnas para gestionarlo */

/* Chips de columnas ocultas (clic derecho en cabecera → Ocultar) */
.ct-ocultas { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; margin-bottom: 0.5rem; }
.ct-chip {
  padding: 0.15rem 0.55rem;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 999px;
  color: var(--fg);
  font-size: 0.8rem;
}
.ct-chip:hover { border-color: var(--accent); color: var(--accent); filter: none; }

/* Menú contextual de columna */
.ct-menu {
  position: fixed;
  z-index: 2100;
  min-width: 180px;
  padding: 0.25rem;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
  display: flex;
  flex-direction: column;
}
.ct-menu button {
  padding: 0.45rem 0.7rem;
  background: none;
  border: none;
  border-radius: 6px;
  color: var(--fg);
  font-size: 0.88rem;
  text-align: left;
}
.ct-menu button:hover { background: var(--row-hover); color: var(--accent); filter: none; }

/* Dato truncado (menú de columna → Truncar dato) */
td.ct-trunc { max-width: 12ch; overflow: hidden; text-overflow: ellipsis; }

/* Botón "borrar todos los filtros" (naranja): anclado a la derecha de la última
   cabecera, a la altura de los campos de búsqueda. Solo aparece si hay filtro activo. */
.ct-clear-filtros {
  position: absolute;
  right: 6px;
  bottom: 8px;
  display: inline-flex;
  align-items: center;
  padding: 0;
  background: none;
  border: none;
  color: var(--chart-4);
  cursor: pointer;
}
.ct-clear-filtros:hover { filter: brightness(1.2); background: none; }
.ct-clear-filtros[hidden] { display: none; }

/* Columna de selección de filas (CrocoTable selectable): checkbox estrecho, centrado. */
th.ct-sel, td.ct-sel { width: 34px; text-align: center; padding-left: 0; padding-right: 0; }
th.ct-sel input, td.ct-sel input { cursor: pointer; margin: 0; }

table { width: 100%; border-collapse: collapse; font-size: 0.88rem; }
th, td { padding: 0.25rem 0.6rem; text-align: left; white-space: nowrap; }
/* La columna de nombre se ajusta a su contenido; solo recorta (ellipsis + tooltip)
   nombres excepcionalmente largos, para no romper el ancho de la tabla. */
td.ct-ellipsis { max-width: 340px; overflow: hidden; text-overflow: ellipsis; }
th { color: var(--muted); font-weight: 500; border-bottom: 1px solid var(--border); }
tbody tr { border-bottom: 1px solid var(--row-border); }
tbody tr:hover { background: var(--row-hover); }
th.r, td.r { text-align: right; }

/* ---- CrocoTable (control reutilizable) ---- */

/* Carga: la tabla se atenúa y aparece un spinner centrado sobre ella, para que
   un refresco (cambio de rango, orden, página) no parezca un parpadeo. */
.crocotable { position: relative; }
.crocotable.ct-loading { opacity: 0.6; transition: opacity 0.15s; }
.crocotable.ct-loading::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 28px;
  height: 28px;
  margin: -14px 0 0 -14px;
  border: 3px solid var(--border);
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: croco-spin 0.7s linear infinite;
  pointer-events: none;
}

@keyframes croco-spin { to { transform: rotate(360deg); } }

.ct-th { display: flex; flex-direction: column; gap: 0.3rem; }
th.r .ct-th { align-items: flex-end; }

.ct-sortable { cursor: pointer; user-select: none; }
.ct-sortable:hover { color: var(--fg); }
.ct-arrow { margin-left: 0.25rem; opacity: 0.5; }
.ct-arrow.active { opacity: 1; color: var(--accent); }

.ct-filter {
  width: 100%;
  min-width: 90px;
  padding: 0.25rem 0.45rem;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--fg);
  font-size: 0.8rem;
}
.ct-filter:focus { outline: 1px solid var(--accent); border-color: var(--accent); }

.ct-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-top: 0.8rem;
}
.ct-info { min-width: 160px; }
.ct-middle { display: flex; align-items: center; gap: 0.25rem; flex-wrap: wrap; justify-content: center; }
.ct-sep { width: 1px; height: 16px; background: var(--border); margin: 0 0.6rem; }
.ct-nav { display: flex; align-items: center; gap: 0.25rem; min-width: 160px; justify-content: flex-end; }
.ct-pagelbl { padding: 0 0.5rem; }

.ct-count-btn {
  padding: 0.25rem 0.55rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--muted);
  font-size: 0.8rem;
}
.ct-count-btn:hover { color: var(--fg); border-color: var(--muted); filter: none; }
.ct-count-btn.active { background: var(--accent); border-color: var(--accent); color: #fff; }

.ct-page-btn {
  display: flex;
  align-items: center;
  padding: 0.3rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--muted);
}
.ct-page-btn:hover:not(:disabled) { color: var(--fg); border-color: var(--muted); filter: none; }
.ct-page-btn:disabled { opacity: 0.35; cursor: default; }

/* Botón de ayuda (?) junto a títulos: alterna un panel explicativo */
.help-btn {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  margin-left: 0.4rem;
  padding: 0.15rem;
  background: none;
  border: none;
  border-radius: 50%;
  color: var(--muted);
}
.help-btn:hover { color: var(--accent); filter: none; }
.help-btn.active { color: var(--accent); }

.ct-has-tip { cursor: help; }
.ct-sortable.ct-has-tip, .ct-count-btn.ct-has-tip, .ct-page-btn.ct-has-tip { cursor: pointer; }
.ct-ellipsis { cursor: default; }

/* Tooltip flotante compartido (estilo ARPShield; sustituye al title nativo) */
.ct-tooltip {
  position: fixed;
  z-index: 2000;
  max-width: 340px;
  padding: 0.45rem 0.65rem;
  background: var(--tip-bg);
  border: 1px solid var(--accent);
  border-radius: 8px;
  color: var(--fg);
  font-size: 0.82rem;
  line-height: 1.35;
  white-space: pre-line; /* respeta \n (tooltips multilínea, p. ej. leyenda de estados) */
  word-break: break-word;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.45);
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: opacity 0.12s ease;
}
.ct-tooltip.visible { visibility: visible; opacity: 1; }

/* Celda con nodo extra tras el texto (p. ej. enlace al panel de core): el texto
   recorta con ellipsis y el extra queda separado 30px sin salirse de la celda. */
td.ct-flex { display: flex; align-items: center; gap: 15px; }
td.ct-flex .ct-ellipsis { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ct-ext-link { display: inline-flex; align-items: center; flex: 0 0 auto; line-height: 1; color: var(--muted); }
.ct-ext-link:hover { color: var(--accent); }
.ct-ext-links { display: inline-flex; align-items: center; gap: 8px; flex: 0 0 auto; }

/* Columna de acciones + botón de info por fila */
th.ct-actions, td.ct-actions { width: 44px; text-align: center; }
.ct-info-btn {
  display: inline-flex;
  align-items: center;
  padding: 0; /* sin padding: que no infle la altura de la fila */
  line-height: 1;
  background: none;
  border: none;
  border-radius: 6px;
  color: var(--muted);
}
.ct-info-btn:hover { color: var(--accent); background: rgba(47, 129, 247, 0.12); filter: none; }
/* Correo ya marcado prioritario (Recientes): icono fijo en ámbar, sin acción */
.ct-prio-on, .ct-prio-on:hover { color: var(--warn); background: none; cursor: default; }

/* Modal (CrocoModal) */
.ct-modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 1500;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
  background: var(--overlay-bg);
  backdrop-filter: blur(2px);
}
.ct-modal {
  width: 100%;
  max-width: 560px;
  max-height: 85vh;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
}
.ct-modal.ct-modal-wide { max-width: 860px; }
.ct-modal-head { padding: 1rem 1.2rem; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 0.6rem; }
.ct-modal-head h3 { margin: 0; font-size: 1.05rem; }
.ct-modal-x {
  display: inline-flex;
  align-items: center;
  padding: 0.2rem;
  background: none;
  border: none;
  border-radius: 6px;
  color: var(--muted);
}
.ct-modal-x:hover { color: var(--fg); background: var(--row-hover); filter: none; }

/* Modal de ayuda (CrocoModal.ayuda): término subrayado + explicación */
.ct-ayuda { margin: 0; }
.ct-ayuda dt { margin-top: 0.7rem; }
.ct-ayuda dt:first-child { margin-top: 0; }
/* Dos estilos, nunca mezclados en un mismo modal: puntos numerados en negrita;
   glosarios de términos subrayados sin negrita. */
.ct-ayuda dt.ct-ayuda-num { font-weight: 600; }
.ct-ayuda dt.ct-ayuda-termino { text-decoration: underline; }

/* Ítem destacado del modal de ayuda: nota importante con fondo suave */
.ct-ayuda-destacado {
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 0.6rem 0.8rem;
  margin-top: 0.8rem;
}
.ct-ayuda-destacado dt { margin-top: 0; }
.ct-ayuda dd { margin: 0.15rem 0 0; color: var(--muted); font-size: 0.9rem; }

/* Icono de ayuda dentro de una cabecera de columna (col.help) */
.ct-th-help {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  margin-left: 0.3rem;
  padding: 0.1rem;
  background: none;
  border: none;
  color: var(--muted);
}
.ct-th-help:hover { color: var(--accent); filter: none; }
.ct-modal-body { padding: 1rem 1.2rem; overflow-y: auto; }
.ct-modal-body p:first-child { margin-top: 0; }
.ct-modal-foot { padding: 0.8rem 1.2rem; border-top: 1px solid var(--border); display: flex; justify-content: flex-end; }
.ct-modal-close {
  padding: 0.5rem 1.2rem;
  background: var(--accent);
  color: #fff;
  border: none;
  border-radius: 8px;
  font-size: 0.95rem;
}
.ct-modal-close:hover { filter: brightness(1.1); }

/* Pie de modal de ACCIÓN: Cancelar a la izquierda, Aceptar a la derecha */
.ct-modal-foot-accion { justify-content: space-between; }

/* Resumen en vivo junto al botón principal (p. ej. "(2 nuevos, 1 quitado) total 7 activos") */
.ct-foot-resumen {
  margin-left: auto;
  margin-right: 0.8rem;
  align-self: center;
  color: var(--muted);
  font-size: 0.85rem;
}
.ct-modal-cancelar {
  padding: 0.5rem 1.2rem;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  color: var(--muted);
  font-size: 0.95rem;
}
.ct-modal-cancelar:hover { background: var(--border); color: var(--fg); filter: none; }
.ct-modal-aceptar {
  padding: 0.5rem 1.2rem;
  background: var(--accent);
  opacity: 0.75; /* azul claro; coge intensidad al pasar */
  border: none;
  border-radius: 8px;
  color: #fff;
  font-size: 0.95rem;
}
.ct-modal-aceptar:hover:not(:disabled) { opacity: 1; filter: none; }
.ct-modal-aceptar:disabled { opacity: 0.4; cursor: default; }
.desglose td.ct-ellipsis { max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---- Pulso de envíos (gráfica horizontal de líneas) ---- */
.pulso-wrap { position: relative; }
.pulso-canvas {
  display: block;
  width: 100%;
  height: 128px;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  cursor: crosshair;
}
/* Eje inferior en 3 zonas: leyenda (izda) · lectura del ratón (centro) · agrupación (dcha). */
.pulso-eje {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-top: 0.35rem;
  color: var(--muted);
  font-size: 0.78rem;
}
.pulso-grupos { display: flex; gap: 0.4rem; }
.pulso-grupo {
  padding: 0.25rem 0.6rem;
  background: none;
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--muted);
  font-size: 0.78rem;
}
.pulso-grupo:hover { color: var(--fg); border-color: var(--muted); filter: none; }
.pulso-grupo.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.pulso-grupo[hidden] { display: none; }
.pulso-leyenda { display: flex; flex-wrap: wrap; gap: 0.25rem 1.1rem; align-items: center; color: var(--muted); font-size: 0.8rem; }
.pulso-leyenda i { display: inline-block; width: 3px; height: 12px; margin-right: 0.35rem; vertical-align: -2px; }
.pulso-serie {
  padding: 0;
  background: none;
  border: none;
  color: var(--muted);
  font-size: 0.8rem;
  cursor: pointer;
}
.pulso-serie:hover { color: var(--fg); filter: none; }
.pulso-serie.apagada { opacity: 0.35; }

/* Acordeón (details/summary) para paneles plegables como las gráficas del home. */
.acordeon > summary {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  cursor: pointer;
  list-style: none;
  color: var(--fg);
  font-size: 1.05rem;
  font-weight: 600;
}
.acordeon > summary::-webkit-details-marker { display: none; }
.acordeon > summary::before {
  content: "▸";
  color: var(--muted);
  font-size: 0.9rem;
}
.acordeon[open] > summary::before { content: "▾"; }
.acordeon > summary:hover { color: var(--accent); }
.acordeon .pulso { margin-top: 0.8rem; }
.icono-grafica { flex: none; }

/* Tarjeta con desglose: una línea por elemento (clave a la izquierda, valor a la
   derecha) en lugar de un único número grande. */
.stat-lista .lineas { display: flex; flex-direction: column; gap: 0.15rem; }
.stat-lista .linea {
  display: flex;
  justify-content: space-between;
  gap: 0.8rem;
  font-size: 0.9rem;
  font-variant-numeric: tabular-nums;
}
.stat-lista .linea .k { color: var(--fg); }
.stat-lista .linea .v { color: var(--fg); font-weight: 600; }
.stat-lista .linea.muted .k, .stat-lista .linea.muted { color: var(--muted); }

/* Filtro de las gráficas por fila (tabla "Por partner"): gris = fuera del filtro,
   en color = incluido en las gráficas. */
.pulso-filtro { padding: 0; background: none; border: none; line-height: 0; cursor: pointer; }
.pulso-filtro .icono-grafica { filter: grayscale(1); opacity: 0.45; transition: filter 0.15s, opacity 0.15s; }
.pulso-filtro:hover { filter: none; }
.pulso-filtro:hover .icono-grafica { opacity: 0.75; }
.pulso-filtro.activo .icono-grafica { filter: none; opacity: 1; }
/* Indicador en la cabecera: solo aparece si hay partners filtrados. */
.pulso-filtro-quitar { padding: 0; margin-left: 0.35rem; background: none; border: none; line-height: 0; }
.pulso-filtro-quitar[hidden] { display: none; }

/* ---- Sección Bloqueos: editor de agrupaciones (partners × tipos) ---- */
/* Badge de acción de la regla: mismos matices que el resto del portal
   (borrar = --error, posponer = --warn), sin colores hardcodeados. */
.accion-badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 0.8rem; font-weight: 600; white-space: nowrap; }
.accion-badge.accion-delete { color: var(--error); background: color-mix(in srgb, var(--error) 15%, transparent); }
.accion-badge.accion-postpone { color: var(--warn); background: color-mix(in srgb, var(--warn) 15%, transparent); }

/* Badges de estado de JailMeNow (baneos, solicitudes y tipos de evento).
   Colores solo por variables del tema (norma del kit). */
.estado-badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 0.8rem; font-weight: 600; white-space: nowrap; }
.estado-badge.estado-activo,
.estado-badge.estado-ban { color: var(--error); background: color-mix(in srgb, var(--error) 15%, transparent); }
.estado-badge.estado-desbaneado,
.estado-badge.estado-hecha,
.estado-badge.estado-unban { color: var(--ok); background: color-mix(in srgb, var(--ok) 15%, transparent); }
.estado-badge.estado-pendiente { color: var(--warn); background: color-mix(in srgb, var(--warn) 15%, transparent); }
.estado-badge.estado-anulada,
.estado-badge.estado-log,
.estado-badge.estado-start,
.estado-badge.estado-stop { color: var(--muted); background: color-mix(in srgb, var(--muted) 15%, transparent); }

/* Cabecera del editor: título + campos + contadores + botones en una fila fluida. */
.bloqueos-editor-head {
  display: flex;
  flex-wrap: wrap;
  gap: 0.8rem 1.2rem;
  align-items: flex-end;
  margin-bottom: 0.9rem;
  padding-bottom: 0.9rem;
  border-bottom: 1px solid var(--border); /* separa el formulario de las tablas */
}
.bloqueos-editor-head h2 { margin: 0; align-self: center; }
.bloqueos-editor-head label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 0.8rem;
  color: var(--muted);
}
/* Radios de acción (Posponer/Borrar): en fila, con el color normal del texto. */
.bloqueos-radios { display: flex; gap: 0.9rem; align-items: center; min-height: 30px; }
.bloqueos-editor-head .bloqueos-radios label {
  flex-direction: row;
  align-items: center;
  gap: 5px;
  color: var(--fg);
  font-size: 0.9rem;
  cursor: pointer;
}
.bloqueos-editor-botones { display: flex; gap: 0.5rem; margin-left: auto; align-self: center; }

/* Las dos tablas de selección, lado a lado (en pantallas estrechas, apiladas). */
.bloqueos-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.2rem;
  align-items: start;
}
.bloqueos-grid h3 { margin: 0 0 0.5rem; font-size: 0.95rem; }
/* Divisoria vertical entre las dos tablas. */
.bloqueos-grid > div:first-child { border-right: 1px solid var(--border); padding-right: 1.2rem; }
@media (max-width: 1100px) {
  .bloqueos-grid { grid-template-columns: 1fr; }
  /* Apiladas: la divisoria pasa a horizontal. */
  .bloqueos-grid > div:first-child {
    border-right: none;
    padding-right: 0;
    border-bottom: 1px solid var(--border);
    padding-bottom: 1rem;
  }
}
