/* ── VARIABLES DE TEMA ─────────────────────────────────── */
:root {
    --bg:           #eef0f3;  /* antes #f4f5f7 — muy cerca de --card-bg (#fafbfc), las tarjetas se veían "sin fondo" */
    --bg-rgb:       238,240,243;  /* mismo color que --bg, en componentes r,g,b — para poder usarlo con alpha (rgba) */
    --sidebar-bg:   #1a1f36;
    --sidebar-text: #aab6c6;  /* antes #a0aec0 (7.20:1) — +10% de contraste real (7.92:1), mismo matiz */
    --sidebar-active:#2d3561;
    --accent:       #00aeff;
    --accent-text:  #075985;  /* accent usado como texto — AAA en modo claro (var(--accent) solo pasa 2.47:1) */
    --card-bg:      #fafbfc;
    --card-shadow:  0 2px 8px rgba(0,0,0,0.07);
    --text:         #1a1f36;
    --text-soft:    #475569;  /* antes #718096 (3.58:1/4.02:1, reprobaba AA) */
    --text-label:   #4a5568;
    --border:       #9aa5b7;  /* antes #d5dbe3 (1.28:1) — tarjetas/inputs no se distinguían del fondo (ej. Gastos Operativos, Router) */
    --table-head:   #1a1f36;
    --table-even:   rgba(181,204,236,0.35);  /* B5CCEB — más notorio que CBD5E1 */
    --table-hover:  #edf2f7;
    --input-bg:     white;
    --modal-bg:     white;
    --code-bg:      #edf2f7;
}

[data-theme="dark"] {
    --bg:           #0f1117;
    --bg-rgb:       15,17,23;  /* mismo color que --bg, en componentes r,g,b — para poder usarlo con alpha (rgba) */
    --sidebar-bg:   #0a0d1a;
    --sidebar-text: #79879c;  /* antes #718096 (4.82:1, raspando el mínimo AA) — +10% de contraste real (5.30:1), mismo matiz */
    --sidebar-active:#1a1f36;
    --accent:       #00aeff;
    --accent-text:  var(--accent);  /* en oscuro el acento ya pasa AAA (7.64:1/6.57:1), no necesita variante */
    --card-bg:      #1a1f36;
    --card-shadow:  0 2px 16px rgba(0,0,0,0.4);
    --text:         #e2e8f0;
    --text-soft:    #9aa8bd;  /* antes #718096 (4.04:1 vs tarjeta, reprobaba AA) */
    --text-label:   #a0aec0;
    --border:       rgba(255,255,255,0.08);
    --table-head:   #0a0d1a;
    --table-even:   #151929;
    --table-hover:  #1e2338;
    --input-bg:     rgba(255,255,255,0.05);
    --modal-bg:     #1a1f36;
    --code-bg:      rgba(0,0,0,0.3);
}

/* ── RESET ─────────────────────────────────────────────── */
* { margin: 0; padding: 0; box-sizing: border-box; }

/* Red de seguridad: cualquier <img> sin tamaño explícito (foto subida,
   miniatura, contenido embebido a futuro) nunca debe poder ser más
   ancha que su contenedor — sin esto, una sola imagen sin restricción
   puede forzar scroll horizontal en toda la página. Los <img> que ya
   fijan su propio ancho/alto (logo, QR, íconos del editor de topología)
   no se ven afectados: max-width no reduce nada que ya sea más chico. */
img { max-width: 100%; height: auto; }

/* Cambio de tema instantáneo: mientras <html> lleva esta clase (ver
   toggleTheme() en base.html), se anulan TODAS las transiciones para
   que el fondo/tarjetas/tabla/botones cambien al mismo tiempo, sin el
   desfase de 0.2-0.3s que arrastraban por sus propias reglas de hover. */
.theme-switching,
.theme-switching * {
    transition: none !important;
}

body {
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
    background: var(--bg);
    color: var(--text);
    font-weight: 400;
    letter-spacing: 0.1px;
    line-height: 1.6;
    transition: background 0.3s, color 0.3s;
}

/* ── LAYOUT ────────────────────────────────────────────── */
.layout { display: flex; min-height: 100vh; }

/* ── SIDEBAR ───────────────────────────────────────────── */
.sidebar {
    width: 230px;
    background: var(--sidebar-bg);
    padding: 18px 0;
    position: fixed;
    height: 100vh;
    display: flex;
    flex-direction: column;
    z-index: 100;
    transition: transform 0.3s ease;
    border-right: 1px solid rgba(0,174,255,0.1);
    box-shadow: 4px 0 24px rgba(0,0,0,0.18);
}


.sidebar-logo {
    padding: 0 24px 22px;
    display: flex;
    align-items: center;
    gap: 10px;
}

.logo-circle-sm {
    width: 36px;
    height: 36px;
    background: linear-gradient(135deg, #00aeff, #0082cc);
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.1rem;
    box-shadow: 0 4px 12px rgba(0,174,255,0.3);
}

.logo-text {
    font-size: 1.1rem;
    font-weight: 700;
    color: white;
    letter-spacing: 0.5px;
}

.sidebar-logo-img {
    max-height: 40px;
    max-width: 190px;
    object-fit: contain;
}

nav {
    flex: 1; min-height: 0; overflow-y: auto;
    padding: 0 12px;
    scrollbar-width: thin;
    scrollbar-color: rgba(255,255,255,0.15) transparent;
}
nav::-webkit-scrollbar { width: 6px; }
nav::-webkit-scrollbar-track { background: transparent; }
nav::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 10px; }
nav::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.25); }

/* Padding vertical comprimido a propósito (antes 11px) — ver nota en
   .nav-subitem: este es el ítem "siempre visible" (Dashboard, Soporte, la
   cabecera de cada módulo), el que más pesa en el alto total del menú
   incluso con todo colapsado. En un 13" real (13"≈620-780px de viewport
   útil) el menú de antes ya necesitaba scroll interno con todo cerrado
   (~855px); comprimiendo justo estos renglones fijos entra sin scroll en
   la mayoría de pantallas chicas sin tocar la comodidad de los sub-ítems,
   que son los que de verdad se clickean seguido. */
.nav-item {
    position: relative;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 7px 14px;
    color: var(--sidebar-text);
    text-decoration: none;
    border-radius: 10px;
    margin-bottom: 2px;
    font-size: 0.88rem;
    font-weight: 400;
    letter-spacing: 0.3px;
    transition: all 0.2s;
}

.nav-item:hover {
    background: rgba(0,174,255,0.12);
    color: #e2e8f0;
}

/* Riel de acento en el ítem activo (también aplica a .nav-subitem) —
   inset más chico (antes 8px) para que el riel siga viéndose proporcional
   ahora que el ítem mide menos de alto. */
.nav-item.active::before,
.nav-subitem.active::before {
    content: "";
    position: absolute;
    left: -12px; top: 6px; bottom: 6px; width: 3px;
    border-radius: 0 3px 3px 0;
    background: var(--accent);
    box-shadow: 0 0 8px rgba(0,174,255,0.7);
}

.nav-item.active {
    background: linear-gradient(135deg, rgba(0,174,255,0.2), rgba(0,130,204,0.15));
    color: white;
    border: 1px solid rgba(0,174,255,0.25);
}

/* ── TOGGLE MODO OSCURO ────────────────────────────────── */
.theme-toggle {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 8px 24px;
    margin-bottom: 6px;
    color: var(--sidebar-text);
    font-size: 0.82rem;
    font-weight: 300;
}

.switch { position: relative; width: 40px; height: 22px; }
.switch input { opacity: 0; width: 0; height: 0; }
.slider {
    position: absolute;
    inset: 0;
    background: #2d3748;
    border-radius: 22px;
    cursor: pointer;
    transition: 0.3s;
}
.slider:before {
    content: "";
    position: absolute;
    width: 16px; height: 16px;
    left: 3px; bottom: 3px;
    background: white;
    border-radius: 50%;
    transition: 0.3s;
}
input:checked + .slider { background: var(--accent); }
input:checked + .slider:before { transform: translateX(18px); }

/* ── SIDEBAR FOOTER ────────────────────────────────────── */
.sidebar-footer {
    padding: 10px 24px;
    border-top: 1px solid rgba(255,255,255,0.06);
}

/* Usuario clickeable — abre un menú con "Cambiar contraseña" y "Cerrar
   sesión" en vez de tener el logout como botón siempre visible. */
.user-menu { position: relative; margin-bottom: 10px; }

.usuario-activo {
    display: flex;
    align-items: center;
    gap: 6px;
    width: 100%;
    font-size: 0.8rem;
    font-weight: 300;
    color: var(--sidebar-text);
    letter-spacing: 0.3px;
    background: none;
    border: none;
    padding: 4px 2px;
    border-radius: 8px;
    cursor: pointer;
    font-family: inherit;
    transition: background 0.15s, color 0.15s;
}
.usuario-activo:hover,
.usuario-activo[aria-expanded="true"] {
    background: rgba(255,255,255,0.06);
    color: #e2e8f0;
}
.usuario-activo-nombre {
    flex: 1;
    min-width: 0;
    text-align: left;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.user-menu-caret {
    width: 13px;
    height: 13px;
    flex-shrink: 0;
    opacity: 0.6;
    transition: transform 0.15s;
}
.usuario-activo[aria-expanded="true"] .user-menu-caret { transform: rotate(180deg); }

.user-menu-pop {
    display: none;
    position: absolute;
    left: 0;
    right: 0;
    bottom: calc(100% + 6px);
    background: #1a1f36;
    border: 1px solid rgba(255,255,255,0.1);
    border-radius: 10px;
    padding: 6px;
    box-shadow: 0 8px 24px rgba(0,0,0,0.35);
    z-index: 30;
}
.user-menu-pop.open { display: block; }

.user-menu-item {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    padding: 8px 9px;
    background: none;
    border: none;
    border-radius: 7px;
    color: var(--sidebar-text);
    font-size: 0.78rem;
    font-weight: 400;
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
}
.user-menu-item svg { width: 15px; height: 15px; flex-shrink: 0; opacity: 0.85; }
.user-menu-item:hover { background: rgba(0,174,255,0.12); color: #e2e8f0; }
.user-menu-item-danger { color: #fc8181; }
.user-menu-item-danger:hover { background: rgba(229,62,62,0.15); color: #feb2b2; }

.sidebar-clock {
    margin-top: 6px;
    text-align: center;
    border-top: 1px solid rgba(255,255,255,0.05);
    padding-top: 6px;
}
#clock-time {
    font-size: 1rem;
    font-weight: 500;
    color: #e2e8f0;
    letter-spacing: 1px;
    font-variant-numeric: tabular-nums;
}
#clock-date {
    font-size: 0.68rem;
    color: rgba(255,255,255,0.4);
    font-weight: 300;
    margin-top: 2px;
    letter-spacing: 0.3px;
}

/* Celular en horizontal (alto de pantalla ~360-430px): el logo + pie de
   página (toggle, usuario, cerrar sesión, reloj) son alto fijo y le
   dejaban a <nav> (Dashboard + 5 grupos, con scroll) apenas ~70px
   visibles de los ~440px que necesita — casi inutilizable. Se achica
   el pie de página y se oculta el reloj (decorativo, no hace falta
   para navegar) para devolverle esa altura a la navegación real.
   Esta regla achicaba el pie pero nunca tocaba los renglones del menú
   en sí (.nav-item/.nav-subitem/.nav-divider) — con eso todavía en su
   tamaño normal, la altura que devolvía el pie se la volvía a comer el
   propio <nav>. Acá sí, en este caso extremo, también se exprimen los
   sub-ítems (a diferencia de la compresión general de arriba, que los
   deja casi intactos): a 360-430px de alto no alcanza para mantener esa
   comodidad. */
@media (max-height: 500px) {
    .sidebar-logo { padding: 0 24px 12px; }
    .theme-toggle { padding: 6px 24px; margin-bottom: 2px; }
    .sidebar-footer { padding: 8px 24px; }
    .user-menu { margin-bottom: 6px; }
    .sidebar-clock { display: none; }

    .nav-item { padding: 5px 14px; margin-bottom: 1px; }
    .nav-subitem { padding: 5px 14px 5px 34px; margin-bottom: 1px; }
    .nav-divider { margin: 3px 16px; }
    .nav-group { margin-bottom: 1px; }
    .nav-icon { width: 16px; height: 16px; }
    .nav-parent .nav-icon { width: 19px; height: 19px; }
}

/* ── HAMBURGER ─────────────────────────────────────────── */
.hamburger {
    display: none;
    position: fixed;
    top: 14px; left: 14px;
    z-index: 200;
    background: var(--sidebar-bg);
    border: 1px solid rgba(255,255,255,0.1);
    border-radius: 8px;
    padding: 8px 10px;
    cursor: pointer;
    color: white;
    font-size: 1.1rem;
}

.sidebar-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.6);
    z-index: 99;
    backdrop-filter: blur(2px);
}

/* ── CONTENIDO PRINCIPAL ───────────────────────────────── */
.main-content {
    margin-left: 230px;
    padding: 36px 32px;
    width: 100%;
}

/* ── PAGE HEADER ───────────────────────────────────────── */
.page-header {
    margin-bottom: 16px;
    display: flex;
    align-items: center;
    gap: 12px;
}

.page-header h1 {
    font-size: 1.5rem;
    font-weight: 600;
    line-height: 1.3;
    color: var(--text);
    letter-spacing: 0.5px;
}

.page-header h1 strong {
    font-weight: 700;
}

/* ── TARJETAS ──────────────────────────────────────────── */
.cards {
    display: flex;
    gap: 16px;
    margin-bottom: 28px;
    flex-wrap: wrap;
}

.card {
    background: var(--card-bg);
    border-radius: 14px;
    padding: 14px 18px;
    flex: 1;
    min-width: 130px;
    box-shadow: var(--card-shadow);
    border: 1px solid var(--border);
    transition: background 0.3s, transform 0.2s;
    position: relative;
    overflow: hidden;
}

.card::before {
    content: "";
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background: linear-gradient(90deg, #00aeff, #0082cc);
    opacity: 0;
    transition: opacity 0.2s;
}

.card:hover::before { opacity: 1; }
.card:hover { transform: translateY(-2px); }

/* ── CARDS SÓLIDAS (estilo dashboard) ──────────────── */
.card-blue,
.card-green,
.card-dark,
.card-orange,
.card-purple,
.card-red {
    border: none;
    box-shadow: 0 4px 18px rgba(0,0,0,0.28);
}

/* Tarjeta neutra: mismo layout que las sólidas, pero sin gritar — para que
   1-2 métricas de verdad urgentes destaquen sobre el resto (jerarquía). */
.card-muted {
    background: var(--card-bg);
    border: 1px solid var(--border);
    box-shadow: var(--card-shadow);
}
.card-muted .card-value { color: var(--text); }
.card-muted .card-label { color: var(--text-soft); }
.card-muted .kpi-ico    { filter: none; }

.card-blue   { background: linear-gradient(135deg, #1a5bb8 0%, #1565C0 100%); }
.card-green  { background: linear-gradient(135deg, #27ae60 0%, #1a8a49 100%); }
.card-dark   { background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%); }
.card-orange { background: linear-gradient(135deg, #e8821a 0%, #c96e14 100%); }
.card-purple { background: linear-gradient(135deg, #7B2FBE 0%, #6B46C1 100%); }
.card-red    { background: linear-gradient(135deg, #e53e3e 0%, #c53030 100%); }

.card-blue .card-value,
.card-green .card-value,
.card-dark .card-value,
.card-orange .card-value,
.card-purple .card-value,
.card-red .card-value      { color: #fff; }

.card-blue .card-label,
.card-green .card-label,
.card-dark .card-label,
.card-orange .card-label,
.card-purple .card-label,
.card-red .card-label      { color: rgba(255,255,255,0.72); }

.card-blue::before,
.card-green::before,
.card-dark::before,
.card-orange::before,
.card-purple::before,
.card-red::before          { display: none; }

/* sysbar sobre fondo de color */
.card-blue .sysbar-wrap,
.card-green .sysbar-wrap,
.card-dark .sysbar-wrap,
.card-orange .sysbar-wrap,
.card-purple .sysbar-wrap,
.card-red .sysbar-wrap     { background: rgba(255,255,255,0.18); }

.card-blue span,
.card-green span,
.card-dark span,
.card-orange span,
.card-purple span,
.card-red span             { color: rgba(255,255,255,0.65); }

.card-value {
    font-size: 2rem;
    font-weight: 300;
    color: var(--text);
    line-height: 1;
    letter-spacing: -1px;
}

.card-label {
    font-size: 0.72rem;
    font-weight: 400;
    color: var(--text-soft);
    margin-top: 4px;
    text-transform: uppercase;
    letter-spacing: 0.8px;
}

/* ── KPI CARD ICON ROW ─────────────────────────────────── */
.kpi-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 6px;
}
.kpi-ico {
    width: 34px;
    height: 34px;
    color: rgba(255,255,255,0.9);
    flex-shrink: 0;
    filter: drop-shadow(0 1px 2px rgba(0,0,0,0.2));
}
.kpi-row .card-value { margin-bottom: 0; }


.search-wrapper {
    position: relative;
    display: inline-flex;
    align-items: center;
}
.search-wrapper .search-input { padding-right: 30px; }
.search-clear {
    position: absolute;
    right: 9px;
    background: none;
    border: none;
    color: var(--text-soft);
    cursor: pointer;
    font-size: 1rem;
    line-height: 1;
    padding: 2px;
    display: none;
    transition: color 0.15s;
}
.search-clear:hover { color: var(--text); }

.search-input {
    padding: 8px 14px;
    border: 1px solid var(--border);
    border-radius: 10px;
    width: 280px;
    font-size: 14px;
    font-weight: 300;
    background: var(--input-bg);
    /* color-mix (no `opacity` en el elemento) para que el 75% quede solo
       en el texto — opacity en .search-input también desvanecería el
       borde gris/celeste que distingue el estado "en uso". Fallback
       color: var(--text) sólido si el navegador no soporta color-mix. */
    color: var(--text);
    color: color-mix(in srgb, var(--text) 75%, transparent);
    outline: none;
    transition: all 0.2s;
    letter-spacing: 0.3px;
}
/* iOS Safari/Chrome hacen zoom automático al enfocar un input con letra
   menor a 16px (ver commit 0bc9d47) — se mantiene 16px en pantallas
   táctiles (pointer:coarse cubre tablets también, no solo celulares) y
   se achica a 14px solo en desktop con mouse/trackpad. */
@media (pointer: coarse) {
    .search-input { font-size: 16px; }
}

.search-input::placeholder { color: var(--text-soft); font-weight: 150; opacity: 0.70; font-size: 13px; }

/* Estado "en uso": borde celeste tanto con el foco puesto como con texto
   ya escrito (aunque se haya perdido el foco) — así se ve de un vistazo
   que ese buscador tiene un filtro activo, no solo mientras se lo toca.
   :not(:placeholder-shown) requiere que el input tenga `placeholder`
   (todos los buscadores del sistema ya lo llevan). Vacío y sin foco =
   borde gris fino (ver .search-input más arriba), el estado "de reposo". */
.search-input:focus,
.search-input:not(:placeholder-shown) {
    border-color: var(--accent-text);
    box-shadow: 0 0 0 3px rgba(0,174,255,0.12);
}

/* ── BOTONES ───────────────────────────────────────────── */
.btn {
    padding: 9px 18px;
    border-radius: 10px;
    border: none;
    cursor: pointer;
    text-decoration: none;
    font-size: 0.85rem;
    font-weight: 400;
    letter-spacing: 0.3px;
    display: inline-block;
    transition: all 0.2s;
    -webkit-appearance: none;
    appearance: none;
}

.btn:hover { opacity: 0.88; transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
.btn:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
.btn:disabled:hover { opacity: 0.4; transform: none; }

.btn-primary   { background: var(--accent-text); color: white; box-shadow: 0 4px 12px rgba(0,174,255,0.3); }
.btn-secondary { background: var(--input-bg); color: var(--text-soft); border: 1px solid var(--border); }
.btn-green     { background: #15803d; color: white; box-shadow: 0 4px 12px rgba(72,187,120,0.25); }
.btn-red       { background: #dc2626; color: white; box-shadow: 0 4px 12px rgba(245,101,101,0.25); }
.btn-orange    { background: linear-gradient(135deg, #ed8936, #dd6b20); color: white; box-shadow: 0 4px 12px rgba(237,137,54,0.25); }
.btn-sm        { padding: 5px 10px; font-size: 0.74rem; border-radius: 8px; display: inline-flex; align-items: center; gap: 4px; line-height: 1; }

/* ── TABLA ─────────────────────────────────────────────── */
.table-wrapper {
    background: var(--card-bg);
    border-radius: 16px;
    box-shadow: var(--card-shadow);
    border: 1px solid var(--border);
    overflow-x: auto;
    transition: background 0.3s;
}

.tabla {
    width: 100%;
    border-collapse: collapse;
    min-width: 500px;
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
}

.tabla thead {
    background: var(--table-head);
}

.tabla thead th {
    padding: 7px 10px;
    font-size: 0.68rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.6px;
    color: #a0aec0;
    white-space: nowrap;
}

.tabla tbody td {
    padding: 4px 10px;
    font-size: 0.875rem;
    font-weight: 400;
    color: var(--text);
    border-bottom: 1px solid var(--border);
    line-height: 1.5;   /* con padding 4px + borde 1px, da ~30px de alto por fila
                           (antes ~33px con padding 5px + line-height 1.6) */
}

/* Cliente/Dirección — un poco más chico y compacto (menos peso visual,
   letras más juntas) que el resto de la tabla, para ocupar menos ancho
   sin perder legibilidad. La columna IP ya se sentía bien así de
   compacta gracias a la fuente monoespaciada; acá se busca ese mismo
   aire con letter-spacing negativo en vez de cambiar de fuente. */
.tabla tbody td.td-cliente,
.tabla tbody td.td-dir {
    font-size: 0.82rem;
    letter-spacing: -0.01em;
}

/* Dirección truncada con tooltip nativo */
.td-dir {
    max-width: 160px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.tabla tbody tr:last-child td { border-bottom: none; }
.tabla tbody tr:hover { background: var(--table-hover); }
.tabla tbody tr:nth-child(even) { background: var(--table-even); }
.tabla tbody tr:nth-child(even):hover { background: var(--table-hover); }

code {
    background: var(--code-bg);
    color: var(--accent-text);
    padding: 3px 8px;
    border-radius: 6px;
    font-size: 0.82rem;
    font-family: 'SF Mono', 'Fira Code', monospace;
    font-weight: 400;
}

/* ── BADGES ────────────────────────────────────────────── */
.badge {
    padding: 3px 10px;
    border-radius: 8px;
    font-size: 0.72rem;
    font-weight: 500;
    letter-spacing: 0.3px;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

/* Outline: sin relleno, borde 0.2px, texto y borde del MISMO color (pedido explícito, todo el sistema) */
.badge-green  { background: transparent; color: #166534; border: 0.2px solid #166534; }
.badge-red    { background: transparent; color: #b91c1c; border: 0.2px solid #b91c1c; }
.badge-orange { background: transparent; color: #92400e; border: 0.2px solid #92400e; }
[data-theme="dark"] .badge-green  { color: #68d391; border-color: #68d391; }
[data-theme="dark"] .badge-red    { color: #fc8181; border-color: #fc8181; }
[data-theme="dark"] .badge-orange { color: #f6ad55; border-color: #f6ad55; }

/* ── ALERTAS ───────────────────────────────────────────── */
.alert {
    padding: 12px 16px;
    border-radius: 12px;
    margin-bottom: 20px;
    font-size: 0.88rem;
    font-weight: 300;
}

/* Alertas modo día */
.alert-error   { background: rgba(220,38,38,0.08);  color: #b91c1c; border: 1px solid rgba(220,38,38,0.25); }
.alert-success { background: rgba(22,163,74,0.08);  color: #166534; border: 1px solid rgba(22,163,74,0.25); }
/* Alertas modo noche */
[data-theme="dark"] .alert-error   { background: rgba(245,101,101,0.1); color: #fc8181; border-color: rgba(245,101,101,0.2); }
[data-theme="dark"] .alert-success { background: rgba(72,187,120,0.1);  color: #68d391; border-color: rgba(72,187,120,0.2); }

/* Un <a> suelto dentro de un alert heredaba el azul/violeta de link por
   defecto del navegador — ilegible contra el fondo rojo oscuro (visto en
   captura real, "consumible activo" en Inventario > Ingreso). --accent-text
   ya está pensado para esto (mismo azul de marca, AA en claro y oscuro). */
.alert a { color: var(--accent-text); font-weight: 700; text-decoration: underline; }

/* ── MODAL ─────────────────────────────────────────────── */
.modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.6);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 999;
    backdrop-filter: blur(4px);
}

.modal-box {
    background: var(--modal-bg);
    border-radius: 20px;
    padding: 36px;
    max-width: 400px;
    width: 90%;
    text-align: center;
    box-shadow: 0 20px 60px rgba(0,0,0,0.4);
    border: 1px solid var(--border);
    animation: modalIn 0.25s ease;
}

@keyframes modalIn {
    from { opacity: 0; transform: scale(0.95) translateY(10px); }
    to   { opacity: 1; transform: scale(1) translateY(0); }
}

.modal-box h2 {
    font-size: 1.2rem;
    font-weight: 400;
    color: var(--text);
    margin-bottom: 10px;
    letter-spacing: 0.3px;
}

.modal-box p {
    color: var(--text-soft);
    font-size: 0.88rem;
    font-weight: 300;
    margin-bottom: 24px;
    line-height: 1.6;
}

.modal-btns { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }

.form-group { margin-bottom: 18px; text-align: left; }

.form-group label {
    display: block;
    font-size: 0.78rem;
    font-weight: 500;
    color: var(--text-label);
    margin-bottom: 8px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.form-group input {
    width: 100%;
    padding: 10px 14px;
    border: 1px solid var(--border);
    border-radius: 10px;
    font-size: 16px;
    font-weight: 300;
    background: var(--input-bg);
    color: var(--text);
    outline: none;
    transition: all 0.2s;
}

.form-group input:focus {
    border-color: var(--accent-text);
    box-shadow: 0 0 0 3px rgba(0,174,255,0.12);
}

/* .form-group select — nunca había existido esta regla (solo input),
   así que cualquier <select> dentro de un formulario (ej. Días de
   prórroga, Día de Corte, Tipo de ID) usaba el estilo nativo del
   navegador/SO en vez del tema día/noche de la app. */
.form-group select {
    width: 100%;
    padding: 10px 14px;
    border: 1px solid var(--border);
    border-radius: 10px;
    font-size: 16px;
    font-weight: 300;
    background: var(--input-bg);
    color: var(--text);
    outline: none;
    cursor: pointer;
    transition: all 0.2s;
}
.form-group select:focus {
    border-color: var(--accent-text);
    box-shadow: 0 0 0 3px rgba(0,174,255,0.12);
}
/* El menú desplegable nativo (<option>) respeta esto en Chrome/Firefox/Edge
   — sin esto, las opciones se ven con fondo blanco del SO aunque el
   <select> ya esté en modo oscuro. */
.form-group select option {
    background: var(--card-bg);
    color: var(--text);
}

/* ── LOGIN ─────────────────────────────────────────────── */
.login-body {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    background: var(--bg);
    position: relative;
    overflow: hidden;
}

/* ── RESPONSIVE ────────────────────────────────────────── */

/* Tablet y móvil grande, incluye celulares en horizontal (≤926px —
   antes 768px: un celular grande en horizontal mide 700-926px y con
   768 se quedaba con el menú de escritorio ocupando espacio fijo justo
   cuando la pantalla ya es angosta, empujando/cortando contenido en
   varias páginas). */
@media (max-width: 926px) {
    .hamburger { display: block; }

    .sidebar { transform: translateX(-100%); width: 240px; }
    .sidebar.open {
        transform: translateX(0);
        border-radius: 0 20px 20px 0;
        box-shadow: 8px 0 40px rgba(0,0,0,0.45);
    }
    .sidebar-overlay.open { display: block; }

    .main-content { margin-left: 0; padding: 20px 14px; padding-top: 62px; }

    .page-header { flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
    .page-header h1 { font-size: 1.15rem; }

    .cards { gap: 10px; }
    .card  { padding: 12px 14px; min-width: 120px; }
    .card-value { font-size: 2rem; }

    .search-input { width: 100%; }

    .tabla thead th { padding: 6px 7px; font-size: 0.64rem; }
    .tabla tbody td { padding: 5px 7px; font-size: 0.78rem; }

    /* Modal como sheet desde abajo en móvil */
    .modal-overlay { align-items: flex-end; }
    .modal-box {
        width: 100%;
        max-width: 100%;
        border-radius: 20px 20px 0 0;
        padding: 24px 20px 32px;
        max-height: 88vh;
        overflow-y: auto;
        animation: sheetIn 0.28s ease;
    }
    @keyframes sheetIn {
        from { transform: translateY(60px); opacity: 0; }
        to   { transform: translateY(0);    opacity: 1; }
    }

    .modal-btns { flex-direction: column; }
    .modal-btns .btn { width: 100%; }

    /* Botones de acción en tabla */
    .td-ac { vertical-align: middle; }
    .acciones-td { flex-wrap: wrap; gap: 4px; }

    /* Filtros y selects */
    .filtro-form { flex-direction: column; align-items: stretch; }
    .select-input { width: 100%; }

    /* Barra de filtros legacy (dashboard) */
    .toolbar-label { display: none; }
}

/* Celular en horizontal / tablet angosta (481-900px): sin este breakpoint,
   las 5 tarjetas (Clientes/Activos/Suspendidos/Recaudado x2) seguían en
   fila con la fuente grande de escritorio — el ícono + el monto ("Bs
   X.XXX.XX") ya no entraban juntos en el ancho de la tarjeta y el monto
   se desbordaba, recortado por overflow:hidden. Mismo tratamiento
   (grid 2 columnas + fuente más chica) que ya usa el móvil angosto. */
@media (max-width: 900px) {
    .cards {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 8px;
    }
    .card { min-width: unset; padding: 10px 12px; }
    .card-value { font-size: 1.7rem; letter-spacing: -0.5px; }
    .card-label { font-size: 0.7rem; }
}

/* Móvil pequeño (≤480px) */
@media (max-width: 480px) {
    .main-content { padding: 14px 10px; padding-top: 58px; }

    .page-header h1 { font-size: 1rem; }

    /* Tabla más compacta */
    .tabla thead th { padding: 5px 5px; font-size: 0.6rem; letter-spacing: 0.3px; }
    .tabla tbody td { padding: 5px 5px; font-size: 0.76rem; }

    code { font-size: 0.75rem; padding: 2px 5px; }

    .btn-sm { padding: 5px 9px; font-size: 0.74rem; }
}

/* Clase utilitaria para ocultar columnas en móvil */
@media (max-width: 600px) {
    .hide-mobile { display: none !important; }
}

/* ── MENÚ DESPLEGABLE CLIENTES ──────────────────────────── */
.nav-group { margin-bottom: 2px; }

.nav-parent {
    justify-content: space-between;
    cursor: pointer;
}

.nav-arrow {
    font-size: 0.7rem;
    transition: transform 0.2s;
    margin-left: auto;
}

.nav-group.open .nav-arrow {
    transform: rotate(-180deg);
}

.nav-submenu {
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.25s ease;
}

.nav-group.open .nav-submenu {
    /* 400px alcanzaba para los grupos de hasta ~6 ítems (Clientes,
       Finanzas...) pero Inventario tiene 8 sub-ítems — con 400px el
       último (Técnicos) quedaba cortado a la mitad. */
    max-height: 560px;
}

@media (prefers-reduced-motion: reduce) {
    .nav-submenu,
    .nav-arrow {
        transition: none;
    }
}

/* Padding vertical casi intacto (antes 10px, ahora 9px) — a propósito,
   a diferencia de .nav-item de arriba: el sub-ítem solo ocupa espacio
   cuando SU grupo está abierto, no compite por altura todo el tiempo
   como Dashboard/Soporte/las cabeceras, y es el objetivo real del click
   (Lista de Clientes, Facturas...) — ahí sí vale la pena mantener el
   área cómoda en vez de exprimirla como al resto. */
.nav-subitem {
    position: relative;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 14px 9px 34px;
    color: var(--sidebar-text);
    text-decoration: none;
    border-radius: 10px;
    margin-bottom: 2px;
    font-size: 0.84rem;
    font-weight: 400;
    letter-spacing: 0.3px;
    transition: all 0.2s;
}

.nav-subitem:hover {
    background: rgba(0,174,255,0.12);
    color: #e2e8f0;
}

.nav-subitem.active {
    background: linear-gradient(135deg, rgba(0,174,255,0.2), rgba(0,130,204,0.15));
    color: white;
    border: 1px solid rgba(0,174,255,0.25);
}

.nav-badge {
    background: #ef4444;
    color: #fff;
    font-size: 0.62rem;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 999px;
    margin-left: auto;
    min-width: 18px;
    text-align: center;
    line-height: 1.5;
    letter-spacing: 0;
}

.nav-divider {
    height: 1px;
    margin: 6px 16px;
    background: rgba(255,255,255,0.06);
}


/* ── NAV ICONS SVG ─────────────────────────────────────── */
.nav-icon {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
    opacity: 0.92;
    transition: opacity 0.2s;
}

/* Íconos de los grupos padre (Clientes, Finanzas, Sistema, Mi Empresa,
   Herramientas) — más grandes y notorios que los de sus hijos, para que
   pesen visualmente como las categorías principales que son. */
.nav-parent .nav-icon {
    width: 22px;
    height: 22px;
    opacity: 1;
    stroke-width: 1.6;
    color: #94a3b8;
}
[data-theme="dark"] .nav-parent .nav-icon { color: #a0aec0; }
.nav-item:hover .nav-icon,
.nav-item.active .nav-icon,
.nav-subitem:hover .nav-icon,
.nav-subitem.active .nav-icon { opacity: 1; }

.theme-toggle-label {
    display: flex;
    align-items: center;
    gap: 6px;
}

/* ── PANEL STATS (columna CPU/RAM) ─────────────────────── */
/* Anclado arriba (igual que el header de MRTG). "CPU & RAM · En vivo"
   solo, Board/RouterOS en su propia fila debajo, y las cajas
   Uptime/Voltaje/HDD debajo de eso. Este bloque de info fija creció al
   agregar la fila de Board/RouterOS de nuevo — pero como
   .gauge-arc-wrap es flex:1 y se ajusta para que ambas tarjetas midan
   lo mismo, el hueco vacío que había arriba de los arcos (antes de
   este cambio) se achica exactamente lo mismo que creció este bloque:
   los arcos, Max/Avg, la línea fina y el link NO se mueven ni un
   píxel — solo se usa el espacio que ya estaba vacío. */
.stats-panel {
    display: flex;
    flex-direction: column;
    align-items: center;
}
.stats-panel .wan-header    { width: 100%; }
.stats-panel .identity-row  { width: 100%; }
.stats-panel .gauge-row     { width: 100%; }
.stats-panel .gauge-stats-row,
.stats-panel .wan-ver-mas,
.stats-panel .sysinfo-grid,
.stats-panel .gauge-arc-wrap,
.stats-panel .cpu-footer-divider { width: 100%; }

/* ── IDENTIDAD DEL EQUIPO (Board / RouterOS) — sub-línea propia,
   entre el header y las cajas de Uptime/Voltaje/HDD ── */
.identity-row {
    display: flex;
    gap: 22px;
    flex-wrap: wrap;
    font-size: 0.72rem;
    margin-bottom: 14px;
}
.identity-item {
    display: flex;
    align-items: center;
    gap: 6px;
    color: var(--text-soft);
}
.identity-item svg { width: 24px; height: 24px; flex-shrink: 0; opacity: 0.85; }
/* Etiqueta chica/tenue + valor grueso/con más contraste — mismo patrón
   de lectura que .sysinfo-label/.sysinfo-val de las cajas de abajo,
   para escanear igual en ambas filas. */
.identity-lbl {
    font-weight: 600;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    font-size: 0.9em;
}
.identity-val {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-weight: 700;
    color: var(--text);
}
@media (max-width: 900px) {
    .identity-row { font-size: 0.66rem; gap: 14px; margin-bottom: 10px; }
}
@media (max-width: 480px) {
    /* Board + RouterOS no entraban juntos en una fila a este ancho y
       pasaban a 2 líneas — achicado para que quepan los dos siempre
       en una sola fila, sin cortarse. */
    .identity-row { font-size: 0.54rem; gap: 6px; flex-wrap: nowrap; }
    .identity-item { gap: 4px; min-width: 0; }
    .identity-item svg { width: 14px; height: 14px; }
    .identity-val { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}

/* ── VELOCÍMETROS CPU / RAM / TEMP ──────────────────────── */
/* .gauge-arc-wrap crece/se detiene EXACTAMENTE igual que .canvas-chart-wrap
   del MRTG (mismo flex:1 + min-height:110px + max-height:220px). Anclado
   abajo (flex-end) para que "Max CPU/RAM/Temp" quede pegado a la base del
   arco — a la misma altura que las horas del eje X de MRTG quedan pegadas
   al final de su gráfico — y la línea fina/el link seguido, igual que en
   MRTG. El sobrante (si el arco, de proporción fija, es más chico que la
   zona) queda arriba del arco en vez de repartirse, priorizando que todo
   lo de ABAJO (Max/Avg, línea fina, link) quede siempre pegado. */
.gauge-arc-wrap {
    flex: 1;
    min-height: 110px;
    max-height: 220px;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
}
.gauge-row {
    display: flex;
    gap: 24px;
    justify-content: center;
    align-items: center;
    margin-bottom: 6px;
}
.gauge-col {
    flex: 1;
    min-width: 0;
    max-width: 260px;
    text-align: center;
}
/* Contenedor solo del canvas — el % de .gauge-overlay se calcula contra
   ESTE alto (el del canvas), no el de .gauge-col completo (que ahora
   también incluye el ícono+nombre en flujo normal, ver más abajo). */
.gauge-canvas-wrap { position: relative; }
.gauge-canvas {
    width: 100%;
    height: auto;
    display: block;
}
/* El valor (%, °C) va absoluto DENTRO del arco, pegado a su base real:
   el 92% del alto del canvas (cy = H*0.92 en _dibujarGauge), no el
   borde inferior — así el número queda visualmente DENTRO del arco,
   no colgando debajo de él. */
.gauge-overlay {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 8%;
    text-align: center;
    pointer-events: none;
}
.gauge-value {
    font-size: 1.05rem;
    font-weight: 700;
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
    transition: color 0.3s;
}
/* El ícono+nombre vive en flujo normal (ver comentario en .gauge-canvas-wrap)
   así que por defecto empieza al 100% del canvas — 8% más abajo que el
   valor. Un margin-top negativo lo sube ese mismo 8% para quedar pegado
   al valor sin hueco. Ese 8% es del ALTO del canvas, pero los márgenes
   verticales en % se calculan sobre el ANCHO del contenedor — como
   alto = ancho×0.66 (misma cuenta que en _dibujarGauge), 8% del alto
   equivale siempre a 8%×0.66 = 5.28% del ancho, así que esto funciona
   igual sin importar el tamaño del arco. */
.gauge-icon-name {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 5px;
    color: var(--text-soft);
    font-size: 0.76rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    margin-top: -5.28%;
}
.gauge-icon-name svg { width: 20px; height: 20px; }
@media (max-width: 900px) {
    .gauge-row  { gap: 6px; }
    .gauge-value { font-size: 0.92rem; }
    .gauge-icon-name { font-size: 0.66rem; }
    .gauge-icon-name svg { width: 17px; height: 17px; }
}

/* ── INFO DE SISTEMA (Board / RouterOS / Uptime / Voltaje / Disco) ── */
.stats-panel .wan-ver-mas { text-align: right; }
/* Línea fina antes de "Ver Salud del Equipo" — alineada estrictamente
   con el divisor de MRTG. MRTG tiene MÁS contenido después de SU
   divisor (2 líneas de stats + link) que esta tarjeta (solo el link) —
   como .gauge-arc-wrap es flex:1 y absorbe lo que haga falta para
   igualar el alto total de ambas tarjetas, cualquier margen ANTES de
   esta línea se cancela solo (el arco compensa creciendo/achicándose,
   sin mover esta línea ni un píxel). Lo que sí mueve la línea es el
   espacio DESPUÉS de su borde (padding-top): eso obliga al arco a
   achicarse para conservar el total, y la línea sube esa misma
   cantidad. padding-top calculado (no a ojo) para que quede a la
   misma altura exacta que el divisor de MRTG. */
.cpu-footer-divider {
    margin-top: 6px;
    padding-top: 28px;
    border-top: 1px solid var(--border);
}

/* Max/Avg por velocímetro — mismas 3 columnas que .gauge-row, para que
   cada dato quede alineado debajo de su arco correspondiente. */
.gauge-stats-row {
    display: flex;
    gap: 24px;
    margin-bottom: 0;
}
.gauge-stat-col {
    flex: 1;
    max-width: 260px;
    min-width: 0;
    text-align: center;
    font-size: 0.62rem;
    font-weight: 300;
    color: var(--text-soft);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.gauge-stat-col strong { color: var(--text); font-weight: 600; }
.gauge-stats-row.gauge-stats-empty {
    font-style: italic; opacity: 0.8; text-align: center; max-width: none;
}
@media (max-width: 900px) {
    .gauge-stats-row { gap: 6px; }
    .gauge-stat-col { font-size: 0.6rem; }
}
@media (max-width: 480px) {
    .gauge-stats-row { flex-wrap: wrap; }
    .gauge-stat-col { flex: 1 1 45%; }
}
/* Uptime/Voltaje/HDD ahora viven debajo de Board/RouterOS (antes de
   los arcos) — junto con la identidad forman el "bloque de info fija"
   que debe ocupar, en conjunto, el mismo alto que el header+RX/TX de
   MRTG, para que los arcos arranquen a la altura del gráfico de MRTG. */
.sysinfo-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 8px;
    margin-bottom: 6px;
}
.sysinfo-cell {
    min-width: 0;
    background: rgba(var(--bg-rgb), 0.4);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 8px 11px;
}
.sysinfo-label {
    display: flex; align-items: center; gap: 5px;
    color: var(--text-soft);
    font-size: 0.58rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.5px;
}
.sysinfo-label svg { width: 24px; height: 24px; flex-shrink: 0; }
.sysinfo-val {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    color: var(--text);
    font-size: 0.8rem; font-weight: 600;
    margin-top: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
@media (max-width: 900px) {
    .sysinfo-label { font-size: 0.54rem; }
    .sysinfo-label svg { width: 17px; height: 17px; }
    .sysinfo-val { font-size: 0.74rem; }
}
@media (max-width: 480px) {
    .sysinfo-cell { padding: 7px 6px; }
    .sysinfo-label { font-size: 0.5rem; gap: 3px; }
    .sysinfo-label svg { width: 15px; height: 15px; }
    .sysinfo-val { font-size: 0.66rem; }
}

/* ── CANVAS WAN WRAPPER ─────────────────────────────────── */
/* flex:1 en vez de altura fija — se estira para llenar el alto real
   de la tarjeta (que el grid ya iguala con la columna de CPU/RAM),
   en vez de dejar espacio vacío abajo con una altura fija adivinada. */
.canvas-chart-wrap { flex: 1; min-height: 110px; max-height: 220px; position: relative; }
/* Antes de que Chart.js cargue (o si falla), el <canvas> nativo usa su
   tamaño intrínseco 300x150 y deja un hueco — lo forzamos a llenar
   el contenedor desde CSS como respaldo. */
.canvas-chart-wrap canvas { width: 100%; height: 100%; display: block; }

/* En mobile (panel-grid apilado, sin tarjeta vecina que igualar en altura)
   flex:1 ya no tiene sentido — se usa una altura fija más chica. */
@media (max-width: 900px) {
    .canvas-chart-wrap { flex: none; height: 160px; max-height: none; }
}

/* ── PANEL GRID: quitar margin-bottom interno ───────────── */
.panel-grid .wan-wrapper { margin-bottom: 0; }
.panel-grid .wan-wrapper { display: flex; flex-direction: column; }

/* ── COLORES DE VALOR EN PANEL ──────────────────────────── */
.val-soft { color: var(--text-soft); }

/* ── BUSCADOR + ACCIONES INLINE ─────────────────────────── */
.search-actions {
    display: flex;
    gap: 10px;
    align-items: center;
}
.search-actions .search-input { width: 200px; margin: 0; }

/* ── HIDE DESKTOP (sólo visible en móvil) ───────────────── */
@media (min-width: 601px) {
    .hide-desktop { display: none !important; }
}

/* ── BARRA DE FILTROS AVANZADOS ─────────────────────────── */
.toolbar-filtros {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 7px;
    margin-top: 6px;
    margin-bottom: 6px;
}
.toolbar-label {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--text-soft);
    text-transform: uppercase;
    letter-spacing: 0.8px;
    white-space: nowrap;
    margin-right: 2px;
}
.filtro-select {
    padding: 6px 10px;
    border: 1px solid var(--border);
    border-radius: 8px;
    font-size: 0.8rem;
    background: var(--card-bg);
    color: var(--text);
    outline: none;
    cursor: pointer;
    transition: border-color .15s;
    min-width: 110px;
}
.filtro-select:focus { border-color: var(--accent-text); }
.chip-filtro {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    background: rgba(0,174,255,0.12);
    color: #0369a1;
    border: 1px solid rgba(0,174,255,0.25);
    padding: 3px 9px;
    border-radius: 20px;
    font-size: 0.72rem;
    font-weight: 500;
    cursor: pointer;
    transition: background .15s;
}
.chip-filtro:hover { background: rgba(0,174,255,0.22); }
[data-theme="dark"] .chip-filtro { color: #7dd3fc; border-color: rgba(0,174,255,0.2); }
.th-sort { cursor: pointer; user-select: none; white-space: nowrap; }
.th-sort:hover { color: var(--accent, #00aeff); }
.srt-ico { font-size: 0.7rem; opacity: 0.7; margin-left: 1px; }

/* ── LISTA CLIENTES — BARRA DE CONTROLES ─────────────────── */
/* 2 filas con jerarquía clara: (1) buscar + Nuevo — las 2 acciones
   principales, el buscador con más peso visual porque es la más usada;
   (2) filtros de refinamiento (Estado/Plan/Tipo/Router/paginación) en
   un bloque propio y más discreto debajo, agrupados bajo "Filtrar por"
   — antes todo compartía una sola fila con el mismo peso y el buscador
   se perdía entre los selects. */
.lc-filtros { margin-bottom: 6px; }

.lc-top-row {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 10px;
}

/* Buscador — protagonista de la fila 1: ancho flexible, ícono de lupa.
   Borde gris fino en reposo; pasa a celeste con acento SOLO cuando está
   en uso (foco puesto o ya tiene texto escrito, vía :has() sobre el
   input interno) — así se distingue de un vistazo si ese buscador
   tiene un filtro activo o no, en vez de verse "siempre encendido". */
.lc-search-wrap {
    display: flex;
    align-items: center;
    gap: 9px;
    flex: 1;
    min-width: 0;
    position: relative;
    background: var(--input-bg);
    border: 1.5px solid var(--border);
    border-radius: 11px;
    padding: 0 14px;
    box-shadow: none;
    transition: border-color 0.15s, box-shadow 0.15s;
}
.lc-search-wrap:has(.search-input:focus),
.lc-search-wrap:has(.search-input:not(:placeholder-shown)) {
    border-color: rgba(0,174,255,0.55);
    box-shadow: 0 0 0 3px rgba(0,174,255,0.08);
}
.lc-search-icon { width: 18px; height: 18px; color: var(--accent-text); flex-shrink: 0; }
.lc-search-wrap .search-input {
    flex: 1;
    width: auto;
    min-width: 0;
    border: none;
    background: none;
    padding: 5px 0;
    box-shadow: none;
}
.lc-search-wrap .search-input:focus,
.lc-search-wrap .search-input:not(:placeholder-shown) { box-shadow: none; }
.lc-search-wrap .search-clear { position: static; margin-left: 4px; }

/* Bloque de filtros — fila 2, más discreta (fondo tenue, textos chicos) */
.lc-filtros-row {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}
.lc-filtros-panel {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    background: rgba(255,255,255,0.02);
    border: 1px solid var(--border);
    border-radius: 11px;
    padding: 7px 12px;
    flex: 1;
}
/* "25/pág" separado al final, con espacio propio respecto a Estado */
.lc-filtros-panel .lc-por-pagina { margin-left: auto; }
[data-theme="dark"] .lc-filtros-panel { background: rgba(255,255,255,0.03); }
.lc-filtros-label {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: 0.68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-soft);
    flex-shrink: 0;
}
.lc-filtros-label svg { width: 13px; height: 13px; }

/* Botón toggle: solo visible en móvil */
.lc-toggle-btn { display: none; gap: 5px; }

/* Badge de filtros activos */
.lc-filtros-badge {
    background: var(--accent);
    color: #fff;
    border-radius: 20px;
    font-size: 0.62rem;
    font-weight: 600;
    padding: 1px 5px;
    margin-left: 3px;
    line-height: 1.4;
    vertical-align: middle;
}

/* + Nuevo — fila 1, junto al buscador (no es un filtro) */
.lc-btn-nuevo { flex-shrink: 0; white-space: nowrap; }

/* Subbar: chips de filtros activos — oculta por defecto (sin filtros no
   hay nada que mostrar); la JS la vuelve a mostrar solo si hay chips,
   para no dejar una franja vacía entre los filtros y la tabla. */
.lc-chips {
    display: none;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 8px;
}
/* ── RESPONSIVE MÓVIL — lista clientes (mismo límite que el menú
   lateral, ver arriba) ───────────────────── */
@media (max-width: 926px) {
    /* Fila 1: [buscar flex:1] [+Nuevo] */
    .lc-search { width: 100%; }

    /* Mostrar botón toggle */
    .lc-toggle-btn { display: inline-flex; }

    /* Panel oculto por defecto en móvil */
    .lc-filtros-panel {
        display: none;
        width: 100%;
        grid-template-columns: 1fr 1fr;
        gap: 6px;
    }
    .lc-filtros-panel.lc-panel-open { display: grid; }
    .lc-filtros-panel .lc-filtros-label { grid-column: 1 / -1; }
    .lc-filtros-panel .filtro-select { min-width: unset; width: 100%; }
    .lc-filtros-panel #btn-limpiar  { grid-column: 1 / -1; width: 100%; }
    .lc-filtros-panel .lc-por-pagina { margin-left: 0; }
}

@media (max-width: 480px) {
    .lc-filtros-panel { grid-template-columns: 1fr; }
}