/* =====================================================================
   TEMAS. Todo el CSS de la app usa estos tokens: cambiar el atributo
   data-theme del <html> (claro | oscuro | descubrir) re-pinta todo.
   El tema elegido persiste en localStorage (script en App.razor).
   ===================================================================== */
:root {
    /* ---- tema CLARO (default) ---- */
    --brand-900: #1B456D;
    --brand-700: #3A76A7;
    --brand-500: #497CA5;
    --brand-100: #CADBEB;
    --brand-50:  #e7f0f8;
    --cta:       #FF5757;
    --cta-2:     #FF0A07;
    --cta-soft:  #ffd9d9;

    --bg: var(--brand-900);
    --surface: #ffffff;
    --surface-2: #f4f8fc;
    --border: #d9e3ee;
    --text: #1B456D;
    --muted: #5a7a96;
    --success: #2f9e6e;
    --danger: var(--cta-2);
    --warning: #e58a1a;
    --warn-ink: #a07408;
    --ok-soft:  #e2f4ec;
    --warn-soft:#fdf3dc;
    --bad-soft: #ffe5e5;

    /* Menu lateral: tokens propios para que el tema descubrir pueda
       pintarlo distinto del resto de la pantalla. */
    --sidebar-bg: #ffffff;
    --sidebar-ink: #1B456D;
    --sidebar-muted: #97afc8;
    --nav-ink: #3A76A7;
    --nav-hover: #e7f0f8;
    --nav-active-a: #1B456D;
    --nav-active-b: #3A76A7;

    --shadow-sm: 0 1px 2px rgba(27, 69, 109, 0.07), 0 1px 3px rgba(27, 69, 109, 0.05);
    --shadow-md: 0 4px 14px rgba(27, 69, 109, 0.1), 0 2px 4px rgba(27, 69, 109, 0.06);
    --shadow-lg: 0 14px 36px rgba(27, 69, 109, 0.14);
    --radius: 14px;
    --radius-sm: 8px;
}

/* ---- tema OSCURO ---- */
html[data-theme="oscuro"] {
    --brand-900: #b9d3ec;   /* en oscuro los "azules de titulo" pasan a claros */
    --brand-700: #82b2dd;
    --brand-500: #6d9fc9;
    --brand-100: #2b455f;
    --brand-50:  #22364b;
    --cta:       #ff7b7b;
    --cta-2:     #ff8a88;
    --cta-soft:  #4a2626;

    --surface: #1a2430;
    --surface-2: #121a24;
    --border: #2c3e52;
    --text: #dce7f2;
    --muted: #8fa6bc;
    --success: #5bc98f;
    --warning: #e5a54a;
    --warn-ink: #e0b054;
    --ok-soft:  #17332a;
    --warn-soft:#382c10;
    --bad-soft: #3a2020;

    --sidebar-bg: #16202b;
    --sidebar-ink: #dce7f2;
    --sidebar-muted: #5f7990;
    --nav-ink: #9dbdda;
    --nav-hover: #22364b;
    --nav-active-a: #2f5f8d;
    --nav-active-b: #3A76A7;

    --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
    --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.45);
    --shadow-lg: 0 14px 36px rgba(0, 0, 0, 0.5);
}

/* ---- tema DESCUBRIR: los colores de la marca a fondo ---- */
html[data-theme="descubrir"] {
    --surface: #ffffff;
    --surface-2: #dfeaf6;   /* fondo de contenido celeste marca */
    --border: #b9cfe4;
    --brand-50: #dce9f5;

    --sidebar-bg: #1B456D;  /* menu azul Descubrir con texto blanco */
    --sidebar-ink: #ffffff;
    --sidebar-muted: #8fb0cd;
    --nav-ink: #cadbeb;
    --nav-hover: rgba(255, 255, 255, 0.12);
    --nav-active-a: #FF5757; /* el activo en rojo CTA de la marca */
    --nav-active-b: #e03e3e;
}

* { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    font-family: 'Montserrat', system-ui, sans-serif;
    color: var(--text);
    background: var(--surface-2);
    -webkit-font-smoothing: antialiased;
}

h1, h2, h3, .display {
    font-family: 'Quicksand', 'Montserrat', sans-serif;
    font-weight: 700;
    color: var(--brand-900);
    letter-spacing: -0.01em;
}
h1 { font-size: 1.85rem; margin: 0 0 0.5rem 0; }
h2 { font-size: 1.2rem; margin: 0 0 0.85rem 0; }
h3 { font-size: 1rem; margin: 0 0 0.75rem 0; color: var(--brand-700); }

h1:focus { outline: none; }
.valid.modified:not([type=checkbox]) { outline: 1px solid var(--success); }
.invalid { outline: 1px solid var(--danger); }
.validation-message { color: var(--danger); }

.blazor-error-boundary {
    background: var(--danger);
    padding: 1rem;
    color: white;
    border-radius: var(--radius-sm);
}
.blazor-error-boundary::after { content: "Ocurrió un error." }

.page-intro {
    color: var(--muted);
    font-size: 0.95rem;
    margin: 0 0 1.5rem 0;
}

/* Cards */
.card {
    background: var(--surface);
    border-radius: var(--radius);
    padding: 1.5rem;
    box-shadow: var(--shadow-sm);
    margin-bottom: 1rem;
    border: 1px solid var(--border);
    transition: box-shadow 0.2s, transform 0.2s;
}
.card:hover { box-shadow: var(--shadow-md); }

.card-accent {
    background: linear-gradient(135deg, var(--brand-100) 0%, var(--brand-50) 100%);
    border-color: #b6cee0;
}

.muted { color: var(--muted); font-size: 0.875rem; }
.error { color: var(--danger); }
.ok { color: var(--success); }

.badge {
    display: inline-block;
    padding: 0.15rem 0.6rem;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    background: var(--brand-100);
    color: var(--brand-900);
}

/* Buttons */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    background: linear-gradient(135deg, var(--brand-900) 0%, var(--brand-700) 100%);
    color: #fff;
    border: none;
    padding: 0.65rem 1.2rem;
    border-radius: var(--radius-sm);
    cursor: pointer;
    font-size: 0.9rem;
    font-weight: 600;
    font-family: inherit;
    letter-spacing: 0.01em;
    transition: transform 0.1s, box-shadow 0.2s, opacity 0.2s;
    box-shadow: 0 2px 8px rgba(27, 69, 109, 0.25);
}
.btn:hover:not(:disabled) {
    transform: translateY(-1px);
    box-shadow: 0 6px 18px rgba(27, 69, 109, 0.35);
}
.btn:active:not(:disabled) { transform: translateY(0); }
.btn:disabled { opacity: 0.55; cursor: not-allowed; box-shadow: none; }

.btn.cta {
    background: linear-gradient(135deg, var(--cta) 0%, var(--cta-2) 100%);
    box-shadow: 0 2px 8px rgba(255, 87, 87, 0.35);
}
.btn.cta:hover:not(:disabled) { box-shadow: 0 6px 18px rgba(255, 87, 87, 0.45); }

.btn.secondary {
    background: var(--surface);
    color: var(--brand-900);
    border: 1px solid var(--border);
    box-shadow: var(--shadow-sm);
}
.btn.secondary:hover:not(:disabled) {
    background: var(--brand-100);
    border-color: var(--brand-500);
}

.btn.ghost {
    background: transparent;
    color: var(--brand-700);
    box-shadow: none;
}
.btn.ghost:hover:not(:disabled) { background: var(--brand-100); }

/* Inputs */
.input, textarea.input, select.input {
    width: 100%;
    box-sizing: border-box;
    padding: 0.6rem 0.85rem;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    font-size: 0.92rem;
    font-family: inherit;
    background: var(--surface);
    color: var(--text);
    transition: border-color 0.15s, box-shadow 0.15s;
}
.input:focus, textarea.input:focus, select.input:focus {
    outline: none;
    border-color: var(--brand-500);
    box-shadow: 0 0 0 3px rgba(73, 124, 165, 0.18);
}
textarea.input { font-family: 'JetBrains Mono', 'Cascadia Code', 'Consolas', monospace; font-size: 0.85rem; }

.code-block {
    background: var(--brand-900);
    color: var(--brand-50);
    padding: 0.85rem 1rem;
    border-radius: var(--radius-sm);
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Consolas', monospace;
    font-size: 0.82rem;
    overflow-x: auto;
    white-space: pre-wrap;
    margin: 0.5rem 0;
    border: 1px solid #0f3252;
}

/* Tables */
.data-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.8rem;
}
.data-table th, .data-table td {
    text-align: left;
    padding: 0.28rem 0.55rem;   /* filas finas, densidad tipo Excel */
    border-bottom: 1px solid var(--border);
    line-height: 1.25;
}
.data-table th {
    background: linear-gradient(180deg, var(--surface-2) 0%, var(--brand-50) 100%);
    position: sticky;
    top: 0;
    font-weight: 700;
    color: var(--brand-900);
    font-size: 0.74rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}
.data-table tr:hover { background: var(--surface-2); }

.scroll {
    max-height: 65vh;
    overflow: auto;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    background: var(--surface);
}

/* Layout */
.row-flex { display: flex; gap: 1rem; flex-wrap: wrap; }
.col { flex: 1; min-width: 280px; }

/* KPI cards */
.kpi {
    position: relative;
    background: var(--surface);
    border-radius: var(--radius);
    padding: 1.25rem 1.5rem;
    flex: 1;
    min-width: 200px;
    box-shadow: var(--shadow-sm);
    border: 1px solid var(--border);
    overflow: hidden;
}
.kpi::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 4px;
    background: linear-gradient(90deg, var(--brand-900) 0%, var(--brand-500) 100%);
}
.kpi .label {
    color: var(--muted);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-weight: 600;
}
.kpi .value {
    font-family: 'Quicksand', 'Montserrat', sans-serif;
    font-size: 1.85rem;
    font-weight: 700;
    margin-top: 0.35rem;
    letter-spacing: -0.02em;
    color: var(--brand-900);
}
.kpi .icon {
    position: absolute;
    top: 1rem;
    right: 1rem;
    width: 38px;
    height: 38px;
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, var(--brand-900) 0%, var(--brand-700) 100%);
    color: white;
    font-size: 1.1rem;
}
.kpi.coral::before { background: linear-gradient(90deg, var(--cta) 0%, var(--cta-2) 100%); }
.kpi.coral .icon { background: linear-gradient(135deg, var(--cta) 0%, var(--cta-2) 100%); }
.kpi.sky::before { background: linear-gradient(90deg, var(--brand-500) 0%, var(--brand-100) 100%); }
.kpi.sky .icon { background: linear-gradient(135deg, var(--brand-500) 0%, var(--brand-700) 100%); }
.kpi.ocean::before { background: linear-gradient(90deg, var(--brand-700) 0%, var(--brand-500) 100%); }
.kpi.ocean .icon { background: linear-gradient(135deg, var(--brand-700) 0%, var(--brand-500) 100%); }

/* Chips */
.chip {
    display: inline-block;
    background: var(--brand-50);
    color: var(--brand-700);
    padding: 0.15rem 0.55rem;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 600;
}
.chip.view { background: var(--bad-soft); color: var(--cta-2); }
.chip.ok   { background: var(--ok-soft); color: var(--success); }
.chip.bad  { background: var(--bad-soft); color: var(--danger); }

/* Facturas */
.card.ok    { border-left: 3px solid var(--success); }
.card.error { border-left: 3px solid var(--danger); }

/* Vuelos agrupados por PNR: el costo del aereo se carga por reserva, no por tramo,
   asi que la cabecera del grupo es la que lo muestra.
   El fondo va en el <td> y no en el <tr>: .data-table tr:hover pinta el fondo de la
   fila y le taparia el suyo a la cabecera. Tampoco es sticky: dentro de .scroll el
   sticky ya lo usa el thead y dos capas pegadas se superponen. */
.data-table tr.grupo-pnr > td {
    background: linear-gradient(180deg, var(--surface-2) 0%, var(--brand-50) 100%);
    border-top: 2px solid var(--brand-100);
    color: var(--brand-900);
    padding-top: 0.5rem;
    padding-bottom: 0.5rem;
}
.data-table tr.grupo-pnr:hover > td {
    background: linear-gradient(180deg, var(--brand-50) 0%, var(--brand-100) 100%);
}
/* Los tramos cuelgan de la reserva de arriba: la sangria lo hace visible. */
.data-table tr.tramo-pnr > td:first-child { padding-left: 1.5rem; }

/* Un comprobante anulado sigue visible —el rastro importa— pero apagado. */
tr.anulado { opacity: 0.5; }
tr.anulado td { text-decoration: line-through; }
tr.anulado td:last-child { text-decoration: none; }

/* Los <label> de los formularios de carga: la etiqueta arriba del campo. */
.card label { display: flex; flex-direction: column; gap: 0.25rem; }
.card label > .muted { font-size: 0.76rem; }

/* Spinner */
.spinner {
    display: inline-block;
    width: 14px;
    height: 14px;
    border: 2px solid rgba(255,255,255,0.35);
    border-top-color: #fff;
    border-radius: 50%;
    animation: spin 0.75s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* Toolbar */
.toolbar {
    display: flex;
    gap: 0.7rem;
    align-items: center;
    flex-wrap: wrap;
}
.toolbar label { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.85rem; color: var(--muted); font-weight: 500; }
.toolbar select.input, .toolbar input.input { width: auto; padding: 0.45rem 0.7rem; font-size: 0.85rem; }

/* Status pills */
.status-pill {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.9rem;
    border-radius: 999px;
    font-size: 0.85rem;
    font-weight: 600;
}
.status-pill.ok { background: var(--ok-soft); color: var(--success); }
.status-pill.err { background: #ffe1e1; color: var(--cta-2); }
.status-pill .dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: currentColor;
}

/* Hero (Home) */
.hero {
    background: linear-gradient(135deg, var(--brand-900) 0%, var(--brand-700) 100%);
    color: #fff;
    border-radius: var(--radius);
    padding: 2rem 2.25rem;
    margin-bottom: 1.5rem;
    position: relative;
    overflow: hidden;
}
.hero h1 { color: #fff; font-size: 2rem; }
.hero p { color: #cadbeb; max-width: 560px; }
.hero::after {
    content: '✈';
    position: absolute;
    right: -10px;
    top: -20px;
    font-size: 9rem;
    opacity: 0.07;
    transform: rotate(-15deg);
}

/* Tile (Home navigation) */
.tile {
    display: block;
    text-decoration: none;
    color: var(--brand-900);
    background: var(--surface);
    border-radius: var(--radius);
    padding: 1.5rem;
    box-shadow: var(--shadow-sm);
    border: 1px solid var(--border);
    transition: transform 0.15s, box-shadow 0.2s, border-color 0.2s;
    cursor: pointer;
    flex: 1;
    min-width: 240px;
}
.tile:hover {
    transform: translateY(-3px);
    box-shadow: var(--shadow-lg);
    border-color: var(--brand-500);
}
.tile .tile-icon {
    width: 48px;
    height: 48px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.4rem;
    background: linear-gradient(135deg, var(--brand-900) 0%, var(--brand-700) 100%);
    color: #fff;
    margin-bottom: 0.85rem;
}
.tile.cta .tile-icon { background: linear-gradient(135deg, var(--cta) 0%, var(--cta-2) 100%); }
.tile h2 { margin-bottom: 0.4rem; }

/* Table list (Explorer) */
.table-list { padding: 0; margin: 0; list-style: none; }
.table-list li {
    padding: 0.55rem 0.75rem;
    border-radius: var(--radius-sm);
    cursor: pointer;
    transition: background 0.12s;
    margin-bottom: 0.2rem;
}
.table-list li:hover { background: var(--brand-100); }
.table-list li.active {
    background: linear-gradient(135deg, var(--brand-900) 0%, var(--brand-700) 100%);
    color: #fff;
}
.table-list li.active strong { color: #fff; }
.table-list li.active .meta { color: var(--brand-100); }
.table-list li strong { font-size: 0.88rem; }
.table-list li .meta { font-size: 0.72rem; color: var(--muted); margin-top: 0.1rem; }

/* ===================================================================
   Cierre fiscal / factura consolidada
   =================================================================== */

/* Columnas de plata. .data-table th y .data-table td fuerzan text-align:left,
   asi que hace falta un selector de la misma familia y mayor especificidad.
   tabular-nums alinea los digitos: sin eso las comas bailan de fila en fila. */
.data-table .num { text-align: right; font-variant-numeric: tabular-nums; }
.data-table th.num { text-align: right; }
.input.num { text-align: right; font-variant-numeric: tabular-nums; }

/* Fila de totales. Va en <tfoot> o con class="total"; el fondo se pinta en el
   <td> porque .data-table tr:hover pinta el de la fila y se lo taparia. */
.data-table tfoot td, .data-table tr.total > td {
    font-weight: 700;
    background: linear-gradient(180deg, var(--surface-2) 0%, var(--brand-50) 100%);
    border-top: 2px solid var(--brand-100);
    color: var(--brand-900);
}
.data-table tfoot tr:hover td, .data-table tr.total:hover > td {
    background: linear-gradient(180deg, var(--brand-50) 0%, var(--brand-100) 100%);
}

/* Categoria con facturas faltantes: es el punto de la pantalla de cobertura,
   tiene que saltar sin leer la columna. Ambar y no rojo: falta cargarlo, no
   esta roto. */
.data-table tr.faltante > td { background: var(--warn-soft); }
.data-table tr.faltante:hover > td { background: var(--warn-soft); }

/* Candidato sin costo cargado: se muestra igual (esconderlo seria peor) pero
   apagado, porque no se puede tildar ni prorratear. */
.data-table tr.sin-costo > td { opacity: 0.55; }
.data-table tr.sin-costo:hover > td { opacity: 0.8; }

/* Renglon del reparto fijado a mano: queda fuera del recalculo automatico. */
.data-table tr.fijado > td { background: var(--ok-soft); }
.data-table tr.fijado:hover > td { background: var(--ok-soft); }

/* ================= Paquetes (/paquetes) ================= */

/* En SSR estatico ya no es la fila entera la clickeable (no hay @onclick): abren
   el detalle dos <a> concretos, el del numero y el del titular. El cursor tiene
   que decir la verdad, asi que la fila vuelve a default y solo esas dos celdas
   muestran la manito. */
.data-table tr.pk-fila { cursor: default; }
.data-table tr.pk-fila > td.pk-id,
.data-table tr.pk-fila > td.pk-tit { cursor: pointer; }
.data-table tr.pk-abierta > td { background: var(--brand-50); }
.pk-id { font-weight: 700; color: var(--brand-700); white-space: nowrap; }

/* Detalle expandido: fondo hundido para separarlo del listado. */
tr.pk-det > td { padding: 0; background: var(--surface-2); }
.pk-detin { padding: 0.9rem 1.1rem 1.1rem; display: grid; gap: 0.9rem; }
/* Un item de grid no se achica por debajo de su min-content (min-width: auto es
   el default), y la celda que contiene al detalle tiene overflow:hidden por ser
   parte de .pk-tabla: sin esto la seccion se desborda y la ultima columna —la del
   boton de adjuntar— queda literalmente fuera de la pantalla en monitores
   angostos. Con min-width 0 la seccion entra en la celda y, si el contenido igual
   no alcanza, scrollea dentro de su propio .scroll. */
.pk-detin > * { min-width: 0; }
.pk-sec h4 {
    margin: 0 0 0.35rem;
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--brand-900);
    display: flex; align-items: center; gap: 0.5rem;
}
/* El detalle vive dentro del scroll del listado: sin doble max-height. */
.pk-sec .scroll { max-height: none; }
/* Las celdas del detalle ya heredan de ".pk-tabla tbody td" el nowrap + ellipsis
   (la tabla de adentro es descendiente de la de afuera), asi que la fila mide una
   linea. Lo que faltaba era el table-layout fixed: en auto, la descripcion larga
   estira la tabla mas alla de la celda y se lleva la ultima columna —la del boton
   de adjuntar— fuera de la vista. Con fixed + los <col> del componente la
   descripcion se corta con "..." y las acciones quedan siempre a la vista. */
.pk-sec table.data-table { table-layout: fixed; width: 100%; }

/* Chips de servicio (conteos y etiquetas IDA/REGRESO). */
.chip.pk-svc { font-size: 0.7rem; margin-right: 0.25rem; }
button.chip { cursor: pointer; border: 1px solid var(--border); font: inherit; font-size: 0.78rem; }
button.chip.chip-on { background: var(--brand-700); color: #fff; border-color: var(--brand-700); }

/* PNR: mismo tratamiento que en la carga de facturas. */
.pk-pnr {
    font-size: 0.72rem; font-weight: 700; letter-spacing: 0.04em;
    background: var(--brand-50); color: var(--brand-700);
    padding: 0.12rem 0.5rem; border-radius: 5px; white-space: nowrap;
}

/* Estado de facturacion del paquete. */
.badge.badge-ok   { background: var(--ok-soft); color: var(--success); }
.badge.badge-warn { background: var(--warn-soft); color: var(--warn-ink); }
.badge.badge-bad  { background: var(--bad-soft); color: var(--cta-2); }

/* Item anulado (No viaja / Rechazada): visible pero claramente muerto. */
.data-table tr.pk-anulado > td { opacity: 0.55; text-decoration: line-through; }
.data-table tr.pk-anulado > td:last-child { text-decoration: none; }

/* ================= Menu lateral (global a proposito) =================
   NavLink renderiza su propio <a>: el CSS scoped del layout no lo alcanza. */
.nav-item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    color: var(--nav-ink);
    padding: 0.75rem 0.95rem;
    text-decoration: none;
    font-size: 0.95rem;
    font-weight: 600;
    border-radius: 10px;
    transition: background 0.15s, color 0.15s;
}
.nav-item:hover { background: var(--nav-hover); color: var(--sidebar-ink); }
.nav-ico { width: 26px; text-align: center; font-size: 1.1rem; flex-shrink: 0; }
.nav-item.active {
    background: linear-gradient(135deg, var(--nav-active-a) 0%, var(--nav-active-b) 100%);
    color: #ffffff;
    box-shadow: 0 4px 12px rgba(27, 69, 109, 0.3);
    font-weight: 700;
}

/* ================= Filtros de /paquetes ================= */
.pk-filtros { display: flex; flex-direction: column; gap: 0.6rem; margin-bottom: 0.9rem; }
.pk-frow { display: flex; flex-wrap: wrap; gap: 0.5rem 1rem; align-items: center; }
.pk-fgroup { display: inline-flex; align-items: center; gap: 0.4rem; white-space: nowrap; }
.pk-fgroup > .lbl { font-size: 0.78rem; font-weight: 700; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; }

/* Chip-filtro: el estado apretado tiene que verse SIN duda. */
.pk-chip {
    font: inherit; font-size: 0.8rem; font-weight: 600; cursor: pointer;
    padding: 0.35rem 0.8rem; border-radius: 999px;
    background: var(--surface); color: var(--brand-700);
    border: 1.5px solid var(--brand-100);
    transition: background 0.12s, border-color 0.12s;
}
.pk-chip:hover { border-color: var(--brand-700); }
.pk-chip.on {
    background: var(--brand-700); color: #fff; border-color: var(--brand-700);
    box-shadow: 0 2px 8px rgba(27, 69, 109, 0.25);
}
.pk-limpiar {
    font: inherit; font-size: 0.78rem; font-weight: 600; cursor: pointer;
    background: none; border: none; color: var(--cta-2); text-decoration: underline;
    padding: 0.2rem 0.3rem;
}

/* ================= Menu plegable =================
   html.sb-col lo pone el script de App.razor (persistido en localStorage).
   Reglas globales a proposito: pisan al CSS scoped del layout. */
html.sb-col .sidebar { width: 72px; }
html.sb-col .sidebar .brand { padding: 0 0.6rem 1.25rem; justify-content: center; }
html.sb-col .sidebar .brand > div:not(.brand-logo) { display: none; }
html.sb-col .nav-item { justify-content: center; padding: 0.6rem 0.4rem; }
html.sb-col .nav-item > span:not(.nav-ico) { display: none; }
html.sb-col .user-card { justify-content: center; padding: 0.4rem; }
html.sb-col .user-info,
html.sb-col .sidebar-footer form,
html.sb-col .sidebar-footer .muted-light { display: none; }
html.sb-col .theme-row { flex-direction: column; }

.sb-toggle {
    position: absolute;
    top: 0.6rem;
    right: -0.05rem;
    width: 1.55rem;
    height: 1.55rem;
    border: 1px solid var(--border);
    border-radius: 50% 0 0 50%;
    background: var(--surface);
    color: var(--muted);
    cursor: pointer;
    font-size: 0.7rem;
    line-height: 1;
    z-index: 5;
}
.sb-toggle:hover { color: var(--brand-700); border-color: var(--brand-700); }
.sb-toggle .sb-i-col { display: none; }
html.sb-col .sb-toggle .sb-i-open { display: none; }
html.sb-col .sb-toggle .sb-i-col { display: inline; }

/* Selector de tema (pie del menu) */
.theme-row { display: flex; gap: 0.35rem; margin-top: 0.6rem; }
.theme-row button {
    flex: 1;
    border: 1px solid var(--border);
    background: var(--surface);
    border-radius: 8px;
    padding: 0.3rem 0;
    cursor: pointer;
    font-size: 0.85rem;
    line-height: 1;
}
.theme-row button:hover { border-color: var(--brand-700); }

/* ================= /paquetes: fila de filtros estilo Excel ================= */
.pk-card { padding: 0.9rem; }
.pk-scroll { max-height: 74vh; }
.pk-tabla th { white-space: nowrap; }
/* La fila de filtros queda pegada debajo del encabezado al scrollear. */
.pk-tabla thead tr.pk-fr th {
    position: sticky;
    top: 1.72rem;
    background: var(--surface-2);
    padding: 0.18rem 0.3rem;
    z-index: 2;
}
.pk-fr input, .pk-fr select {
    width: 100%;
    box-sizing: border-box;
    font: inherit;
    font-size: 0.72rem;
    padding: 0.18rem 0.3rem;
    border: 1px solid var(--border);
    border-radius: 5px;
    background: var(--surface);
    color: var(--text);
}
.pk-fr input[type=date] { padding: 0.12rem 0.2rem; margin-bottom: 0.12rem; }
.pk-fr input:focus, .pk-fr select:focus { outline: none; border-color: var(--brand-500); }
.pk-fserv { text-align: center; }
.pk-mini {
    font-size: 0.78rem;
    padding: 0.14rem 0.3rem;
    border: 1px solid var(--border);
    border-radius: 5px;
    background: var(--surface);
    cursor: pointer;
    opacity: 0.55;
}
.pk-mini:hover { opacity: 1; }
.pk-mini.on {
    opacity: 1;
    background: var(--brand-700);
    border-color: var(--brand-700);
    box-shadow: 0 0 0 1.5px var(--brand-100);
}
.pk-tit { max-width: 260px; overflow: hidden; text-overflow: ellipsis; }
.pk-svcs span { margin-right: 0.4rem; font-size: 0.74rem; white-space: nowrap; }
.pk-pie { display: flex; justify-content: space-between; align-items: center; margin-top: 0.5rem; }

/* Barra de filtros arriba de la tabla de paquetes. */
.pk-topbar { display: flex; flex-wrap: wrap; gap: 0.5rem 1.4rem; align-items: center; margin-bottom: 0.7rem; }
.pk-mini.lg { font-size: 0.95rem; padding: 0.32rem 0.6rem; }

/* ================= /paquetes: tabla compacta de una linea =================
   table-layout fixed + nowrap + ellipsis: la fila mide SIEMPRE una linea y la
   tabla ocupa el 100% del ancho sin scrollbar horizontal. Lo que no entra se
   corta con "..." y se lee completo en el tooltip (title). */
.pk-tabla { table-layout: fixed; width: 100%; }
.pk-tabla thead th, .pk-tabla tbody td {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.pk-tabla thead tr:first-child th { font-size: 0.66rem; padding: 0.3rem 0.45rem; }
.pk-tabla tbody td { font-size: 0.76rem; padding: 0.22rem 0.45rem; }
/* la fila del detalle expandido si puede envolver: es otra tabla adentro */
.pk-tabla tr.pk-det > td { white-space: normal; }
.pk-tabla .badge { font-size: 0.6rem; padding: 0.08rem 0.4rem; white-space: nowrap; letter-spacing: 0.02em; }
.pk-svcs span { margin-right: 0.3rem; font-size: 0.7rem; }

/* Topbar de /paquetes en una sola fila compacta. */
.pk-topbar { gap: 0.4rem 1rem; margin-bottom: 0.5rem; }
.pk-topbar .input { padding: 0.26rem 0.45rem; font-size: 0.76rem; width: auto; }
.pk-topbar input[type=date] { width: 8.1rem; }
.pk-topbar select { width: auto; }
.pk-vistas { display: inline-flex; gap: 0.3rem; }
.pk-topbar .pk-mini { font-size: 0.74rem; padding: 0.26rem 0.55rem; opacity: 1; }
.pk-topbar .pk-mini:not(.on) { color: var(--muted); }
.pk-limpiar { font-size: 0.74rem; }

/* Encabezado ordenable: se tiene que ver que es clickeable. */
th.pk-sort { cursor: pointer; user-select: none; }
th.pk-sort:hover { color: var(--brand-700); }

/* El USD es referencia, no el importe principal: mas chico y en gris, para que
   entre al lado del peso sin robarle lugar. Solo el 2% de las filas trae las dos. */
.pk-usd { font-size: 0.68rem; color: var(--muted); white-space: nowrap; }

/* ============ Detalle del paquete: columna de acciones ============
   Estado + links a los comprobantes que ya tiene + boton de carga rapida, todo
   en UNA linea: la fila del detalle no puede engordar. */
/* .data-table td ya fuerza text-align:left: hace falta la misma familia de
   selectores y mas especificidad para alinear a la derecha. */
.data-table td.pk-acc { white-space: nowrap; text-align: right; width: 12rem; }
/* Eran <button>; en SSR estatico son <a href>: sin display:inline-block el
   padding vertical no ocupa alto, y sin text-decoration:none salen subrayados. */
.pk-adj, .pk-ver {
    font: inherit;
    font-size: 0.68rem;
    font-weight: 700;
    line-height: 1.15;
    padding: 0.1rem 0.4rem;
    margin-left: 0.25rem;
    border: 1px solid var(--border);
    border-radius: 5px;
    background: var(--surface);
    color: var(--brand-700);
    cursor: pointer;
    text-decoration: none;
    display: inline-block;
}
.pk-adj:hover, .pk-ver:hover { border-color: var(--brand-500); background: var(--brand-50); }
.pk-ver { color: var(--muted); font-weight: 600; }
/* El item tiene comprobantes colgados pero ninguno es factura de compra vigente
   (anulados, borradores, o facturas de venta al cliente): el costo del proveedor
   sigue descubierto. Va en el color del link y no en un badge aparte porque la
   columna tiene que entrar en una linea. */
.pk-ver.bad { color: var(--cta-2); }
.pk-mas-comp { font-size: 0.66rem; color: var(--muted); margin-left: 0.2rem; }

/* Carteles del detalle (exito / error de la carga rapida). Discretos: una linea
   arriba de las secciones, no un bloque que empuje todo para abajo. */
.pk-aviso {
    display: flex; align-items: center; gap: 0.5rem;
    font-size: 0.76rem; font-weight: 600;
    padding: 0.22rem 0.55rem;
    border-radius: var(--radius-sm);
}
.pk-aviso.ok  { background: var(--ok-soft); color: var(--success); }
.pk-aviso.bad { background: var(--bad-soft); color: var(--cta-2); }
/* La ✕ que cierra el cartel es un <a href> a la misma URL sin el ?ok=; se deja
   tambien el selector de <button> por si algun cartel vuelve a usarlo. */
.pk-aviso button, .pk-aviso a {
    margin-left: auto;
    border: none; background: none; cursor: pointer;
    color: inherit; opacity: 0.65;
    text-decoration: none;
    font: inherit; font-size: 0.8rem; line-height: 1; padding: 0 0.2rem;
}
.pk-aviso button:hover, .pk-aviso a:hover { opacity: 1; }

/* ============ Carga rapida de factura ============
   Era un modal (position:fixed sobre un .fr-back semitransparente) abierto por
   @onclick desde el detalle del paquete. En SSR estatico no hay modal: es la
   pagina /facturas/rapida. Se conserva la caja .fr-modal -- todas las reglas
   .fr-modal .fr-f / .fr-arch cuelgan de ese ancestro -- y se le suma .fr-pag,
   que la centra en el flujo normal. El fondo .fr-back se elimino. */
.fr-modal {
    width: min(46rem, 100%);
    max-height: 90vh;
    overflow: auto;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: var(--shadow-lg);
}
.fr-head {
    position: sticky;
    top: 0;
    z-index: 1;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.45rem 0.7rem;
    background: var(--surface-2);
    border-bottom: 1px solid var(--border);
    border-radius: var(--radius) var(--radius) 0 0;
}
.fr-tit { font-size: 0.85rem; font-weight: 700; color: var(--brand-900); white-space: nowrap; }
/* El contexto (venta · titular · item) se corta con "..." y se lee entero en el
   title: es referencia, no puede empujar la ✕ fuera de la cabecera. */
.fr-ctx {
    flex: 1; min-width: 0;
    font-size: 0.74rem; color: var(--muted);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fr-head .chip { white-space: nowrap; font-size: 0.68rem; }
.fr-x {
    border: none; background: none; cursor: pointer;
    color: var(--muted); font-size: 0.9rem; line-height: 1; padding: 0.1rem 0.25rem;
}
.fr-x:hover { color: var(--cta-2); }

.fr-body { padding: 0.6rem 0.7rem; display: grid; gap: 0.5rem; }
.fr-row { display: flex; flex-wrap: wrap; gap: 0.5rem; }
/* .card label ya pone flex-direction column con mas gap y el modal cae adentro
   de una .card: hace falta la misma especificidad para ganarle. */
.fr-modal .fr-f { display: flex; flex-direction: column; gap: 0.12rem; min-width: 0; }
.fr-modal .fr-f > .lbl {
    font-size: 0.66rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.04em;
    color: var(--muted); white-space: nowrap;
}
.fr-body .input { padding: 0.26rem 0.45rem; font-size: 0.8rem; }
.fr-nota { margin: 0; font-size: 0.74rem; }
.fr-msg { font-size: 0.78rem; padding: 0.3rem 0.5rem; border-radius: var(--radius-sm); }
.fr-msg.error { background: var(--bad-soft); color: var(--cta-2); }
.fr-msg.aviso { background: var(--warn-soft); color: var(--warn-ink); }
.fr-arch { display: flex; align-items: center; gap: 0.35rem; min-width: 0; }
.fr-modal .fr-arch .muted {
    font-size: 0.76rem;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fr-mas {
    justify-self: start;
    border: none; background: none; cursor: pointer;
    font: inherit; font-size: 0.75rem; font-weight: 700;
    color: var(--brand-700); padding: 0.1rem 0;
}
.fr-mas:hover { text-decoration: underline; }
.fr-pie {
    position: sticky;
    bottom: 0;
    display: flex; align-items: center; gap: 0.5rem;
    padding: 0.5rem 0.7rem;
    background: var(--surface-2);
    border-top: 1px solid var(--border);
    border-radius: 0 0 var(--radius) var(--radius);
}
.fr-pie .btn { padding: 0.35rem 0.9rem; font-size: 0.8rem; }
.fr-hint { font-size: 0.72rem; margin-left: auto; }

/* ================= /gastos: gastos de estructura =================
   Misma densidad que /paquetes: la tabla reusa .pk-tabla y el alta es una fila
   de campos, no un formulario apilado. Todo con los tokens de tema: la pantalla
   se ve igual en claro, oscuro y descubrir. */

/* Cartel de error / exito: una linea, no una card que empuje la tabla. */
.gs-msg {
    font-size: 0.78rem;
    font-weight: 600;
    padding: 0.3rem 0.7rem;
    border-radius: var(--radius-sm);
    margin-bottom: 0.5rem;
}
.gs-msg.ok  { background: var(--ok-soft); color: var(--success); }
.gs-msg.bad { background: var(--bad-soft); color: var(--cta-2); }

/* Alta en linea. Fondo hundido para separarla del listado sin abrir un modal. */
.gs-alta {
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    background: var(--surface-2);
    padding: 0.5rem 0.6rem;
    margin-bottom: 0.55rem;
}
.gs-frow { display: flex; flex-wrap: wrap; gap: 0.4rem 0.7rem; align-items: flex-end; }
.gs-frow + .gs-frow { margin-top: 0.45rem; }
.gs-mas { border-top: 1px dashed var(--border); padding-top: 0.45rem; }

/* .card label ya apila etiqueta sobre campo: aca solo se achica la etiqueta. */
.gs-frow label {
    gap: 0.12rem;
    font-size: 0.66rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--muted);
}
.gs-frow .input {
    width: auto;
    padding: 0.24rem 0.42rem;
    font-size: 0.78rem;
}
.gs-frow .btn { padding: 0.34rem 0.8rem; font-size: 0.78rem; }
.gs-frow input[type=date] { width: 8.1rem; }
.gs-chico { width: 6rem; }
.gs-medio { width: 8rem; }
.gs-monto { width: 9rem; }
.gs-cat   { width: 13rem; }
/* El campo que se come el ancho sobrante de la fila. */
.gs-crece { flex: 1 1 14rem; min-width: 10rem; }
.gs-crece .input { width: 100%; }
.gs-arch { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.78rem; }

/* Pistas del alta: total con IVA y avisos. Chips, no parrafos. */
.gs-pistas {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: 0.3rem 0.6rem;
    margin-top: 0.45rem;
}
.gs-pistas .muted { font-size: 0.72rem; }

/* Desglose por categoria: la respuesta a "cuanto gaste en sueldos este mes"
   tiene que estar arriba de la tabla, no calculada de memoria. Cada chip
   filtra. */
.gs-desglose {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: 0.3rem 0.4rem;
    margin-bottom: 0.5rem;
}
/* El mes elegido es el dato que ordena toda la pantalla: no va en el gris que
   .pk-topbar .pk-mini:not(.on) le pone al resto de los botones chicos. */
.pk-topbar .pk-mini.gs-per { color: var(--brand-900); font-weight: 700; }

/* El .btn de fabrica mide 0.65rem de alto interno y le sumaria media linea a la
   barra de filtros. Solo el de /gastos: el resto de las pantallas no lo usa ahi. */
.pk-topbar .btn.gs-nuevo { padding: 0.3rem 0.75rem; font-size: 0.78rem; }

.gs-desglose .pk-chip { padding: 0.2rem 0.6rem; font-size: 0.72rem; }
.gs-desglose .pk-chip b { margin-left: 0.3rem; font-variant-numeric: tabular-nums; }
.gs-tot {
    margin-left: auto;
    font-size: 0.72rem; font-weight: 700;
    letter-spacing: 0.04em;
    color: var(--muted);
    white-space: nowrap;
}
.gs-tot b {
    font-size: 0.95rem;
    color: var(--brand-900);
    font-variant-numeric: tabular-nums;
    margin-left: 0.3rem;
}

/* Descarga del archivo adjunto: un icono dentro de la celda, sin engordar la fila. */
.gs-dl {
    font: inherit;
    font-size: 0.72rem;
    line-height: 1;
    padding: 0.08rem 0.3rem;
    margin-left: 0.25rem;
    border: 1px solid var(--border);
    border-radius: 5px;
    background: var(--surface);
    color: var(--brand-700);
    cursor: pointer;
}
.gs-dl:hover { border-color: var(--brand-500); background: var(--brand-50); }

/* Campo obligatorio todavia sin cargar: borde rojo hasta que tenga un valor
   valido, para que se vea de una que falta. La clase la pone el .razor, no un
   :invalid de HTML: los inputs no estan dentro de un <form> con validacion. */
.input.req-vacio,
select.input.req-vacio {
    border-color: var(--danger);
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--danger) 18%, transparent);
}
.input.req-vacio:focus {
    border-color: var(--danger);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 28%, transparent);
}

/* ===================================================================
   SSR estatico: lo que dejo de ser interactivo
   ===================================================================
   Al pasar a render estatico casi todos los <button @onclick> se convirtieron
   en <a href> con la accion en la query string, y varios paneles que se abrian
   por codigo pasaron a <details>/<summary> o a <form method="get">. Esas
   etiquetas traen estilo propio del navegador (subrayado, color de link,
   triangulito del marcador, margen del form) que hay que neutralizar para que
   la pantalla se vea igual que antes.
   Va todo en UN bloque: las mismas reglas las pidieron por separado los cuatro
   grupos de paginas, aca estan consolidadas una sola vez.
   Este bloque queda ANTES del @media de mobile a proposito, para que los
   overrides de pantalla chica le sigan ganando. */

/* --- <a> con pinta de boton ---
   app.css no tiene ninguna regla global de <a>. .btn ya fija color (#fff, y
   --brand-900 en .secondary), asi que lo unico que sobra es el subrayado. */
a.btn { text-decoration: none; }

/* Un <a> no tiene :disabled. En el borde de la paginacion (/paquetes y
   /facturas/nueva) el link se reemplaza por <span class="btn inactivo">, que
   copia la pinta de .btn:disabled (linea ~197). El pointer-events:none lo pidio
   el grupo facturas; en el <span> de paquetes no molesta y deja la regla lista
   por si alguna vez vuelve a ser un <a>. */
.btn.inactivo { opacity: 0.55; cursor: not-allowed; box-shadow: none; pointer-events: none; }

/* --- /paquetes --- */
/* Encabezado ordenable: el <th> ya trae cursor y hover, pero el <a> tiene que
   ocupar toda la celda y conservar el ellipsis de .pk-tabla thead th. */
th.pk-sort a {
    display: block;
    color: inherit;
    text-decoration: none;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
/* Abrir / cerrar el detalle de la fila: celda del numero (#10413) y del
   titular. El color lo sigue poniendo el <td> (.pk-id es brand-700). */
.pk-abrir {
    display: block;
    color: inherit;
    text-decoration: none;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
/* El .btn de fabrica mide 0.65rem de alto interno y le suma media linea a la
   barra compacta de filtros (mismo criterio que .btn.gs-nuevo, linea ~994). */
.pk-topbar .btn.pk-buscar { padding: 0.3rem 0.75rem; font-size: 0.78rem; }

/* --- /facturas y /facturas/nueva --- */
/* ✕ del cartel ?ok= y link al N° de venta del listado. */
a.pk-limpiar, a.pk-id { text-decoration: none; }

/* --- /facturas/rapida --- */
/* La caja ya no flota sobre un fondo fijo: se centra en el flujo de la pagina. */
.fr-pag { margin: 0 auto 1rem; }
/* La ✕ de cerrar es un <a href> al paquete, ya no un <button>. */
a.fr-x { text-decoration: none; display: inline-block; }
/* "+ mas datos" pasa a <details>/<summary> nativo: abrirlo no cuesta un round
   trip y no se pierde lo tipeado. .fr-body es grid y .fr-mas traia
   justify-self:start cuando era el hijo directo; ahora el hijo es el <details>,
   asi que el justify-self se muda aca y el <summary> queda inline-block para
   que el area de click siga siendo solo el texto. */
.fr-det { display: block; justify-self: start; }
summary.fr-mas { display: inline-block; list-style: none; cursor: pointer; }
summary.fr-mas::marker { content: ""; }
summary.fr-mas::-webkit-details-marker { display: none; }

/* --- /gastos --- */
a.pk-chip,
a.pk-mini,
a.pk-limpiar,
a.gs-dl {
    text-decoration: none;
    display: inline-block;   /* eran <button>: sin esto el padding vertical no ocupa alto */
}
/* .pk-chip y .gs-dl ya fijan color; .pk-mini no. Ojo: NO subir la especificidad
   por encima de .pk-topbar .pk-mini:not(.on) ni de .pk-topbar .pk-mini.gs-per,
   que son las que le dan el gris y el destacado del mes elegido. */
a.pk-mini { color: inherit; }
/* .pk-limpiar ya trae color var(--cta-2) y subrayado: se lo devolvemos porque
   la regla de arriba se lo saco. */
a.pk-limpiar { text-decoration: underline; }
/* "+ mas datos" del alta: mismo <details> que en /facturas/rapida. El <summary>
   lleva ademas .pk-limpiar, de ahi le viene el color. */
.gs-det { margin-top: 0.45rem; }
.gs-det > summary.gs-sum {
    display: inline-block;
    list-style: none;
    cursor: pointer;
}
.gs-det > summary.gs-sum::marker { content: ""; }
.gs-det > summary.gs-sum::-webkit-details-marker { display: none; }

/* --- Explorer --- */
/* Los <li> de la lista de tablas ya no son clickeables por @onclick: ahora
   llevan un <a> adentro. display:block hace que el ancla ocupe todo el ancho
   del li y el area de click quede como antes; color:inherit deja que sigan
   mandando .table-list li.active (blanco) y .table-list li .meta. */
.table-list li a { display: block; text-decoration: none; color: inherit; }

/* --- Los <div> que pasaron a ser <form> ---
   Las barras de filtros y los paneles de alta ahora son <form method="get">.
   El navegador le da al <form> un margen inferior propio que antes no existia
   y que corre toda la card para abajo.
   OJO: NO se usa el "form.pk-topbar, form.gs-alta { margin: 0 }" que se habia
   pedido. Ese selector (0,1,1) le gana al margin-bottom que YA declaran
   .pk-topbar (0.7rem) y .gs-alta (0.55rem), y sobre todo le gana al override
   de mobile .pk-topbar { margin-bottom: 0.5rem }: aplastaria separaciones que
   estan bien. Un reset por tipo (0,0,1) mata el margen del navegador, arregla
   de paso las otras barras convertidas (.toolbar de /facturas y
   /facturas/nueva, y el <form> sin clase de Explorer) y deja que cada clase
   siga mandando sobre su propio margen. */
form { margin: 0; }

/* ========================= Mobile =========================
   Abajo de 820px el menu queda como riel de iconos y la tabla scrollea en
   horizontal: con 10+ columnas no hay forma de que entre en un telefono sin
   volverla ilegible, y scrollear de costado es lo esperable en ese caso. */
@media (max-width: 820px) {
    .content { padding: 0.7rem 0.6rem; }

    /* riel de iconos, igual que el modo plegado pero mas angosto y sin depender
       del localStorage: en pantalla chica no hay lugar para elegir */
    .sidebar,
    html.sb-col .sidebar { width: 56px; padding-top: 0.75rem; }
    .sidebar .brand { padding: 0 0.4rem 0.75rem; justify-content: center; }
    .sidebar .brand > div:not(.brand-logo) { display: none; }
    .nav-item { justify-content: center; padding: 0.55rem 0.3rem; }
    .nav-item > span:not(.nav-ico) { display: none; }
    .user-card { justify-content: center; padding: 0.3rem; }
    .user-info,
    .sidebar-footer form,
    .sidebar-footer .muted-light,
    .sb-toggle { display: none; }
    .theme-row { flex-direction: column; }

    /* los filtros se apilan y ocupan el ancho completo */
    .pk-topbar { gap: 0.4rem 0.6rem; }
    .pk-fgroup { flex-wrap: wrap; }
    .pk-topbar input[type=date] { width: 7.4rem; }

    /* fixed + porcentajes aplasta las columnas: en mobile ancho minimo y scroll */
    .pk-tabla { table-layout: auto; min-width: 58rem; }
    .pk-scroll { max-height: 68vh; }
    .card { padding: 0.7rem; }
    h1 { font-size: 1.35rem; }

    /* la caja de carga rapida ocupa casi toda la pantalla */
    .fr-modal { width: 100%; max-height: 96vh; }
    /* En un telefono el contexto no entra al lado del titulo y, si se lo deja en
       la misma linea, se apila letra por letra en una columna de 6 caracteres.
       Se manda a un renglon propio abajo del titulo y ahi si puede envolver. */
    .fr-head { flex-wrap: wrap; }
    .fr-tit { order: 1; }
    .fr-head .chip { order: 2; }
    .fr-x { order: 3; margin-left: auto; }
    .fr-ctx { order: 4; flex: 1 0 100%; white-space: normal; overflow: visible; }
    /* la columna de acciones deja de tener ancho fijo: la tabla ya scrollea */
    .data-table td.pk-acc { width: auto; }

    /* /gastos: 6 columnas entran en bastante menos que las 10 de /paquetes.
       Va DESPUES de la regla .pk-tabla para pisarle el min-width. */
    .gs-tabla { min-width: 40rem; }
    /* en el alta cada campo ocupa la fila entera: apretados no se pueden tocar */
    .gs-frow { gap: 0.4rem 0.5rem; }
    .gs-frow label { flex: 1 1 9rem; }
    .gs-frow .input,
    .gs-frow input[type=date],
    .gs-chico, .gs-medio, .gs-monto, .gs-cat { width: 100%; }
    .gs-tot { margin-left: 0; }
}
