/* Formato estándar de pantallas (docs/PLAN_ESTANDAR_PANTALLAS.md, 2026-10-16). Solo aplica a lo que lleva una clase ui-*:
   el resto del sistema se ve igual hasta que la adopte. Todo color sale de la marca del tenant (--navy, --accent). */
:root {
    --ui-head-bg: color-mix(in srgb, var(--navy) 12%, var(--surface));
    --ui-head-fg: var(--navy);
    --ui-zebra: color-mix(in srgb, var(--navy) 7%, var(--surface));     /* suave pero se distingue (pedido del usuario) */
    --ui-row-line: color-mix(in srgb, var(--navy) 12%, var(--surface));
    --ui-hover: color-mix(in srgb, var(--accent) 14%, var(--surface));
    --ui-selected: color-mix(in srgb, var(--accent) 22%, var(--surface));
    --ui-focus: var(--accent);
    /* lo activo (pestaña, rango elegido, fila abierta, filtro activo) va en el acento del tenant; el color se cambia en
       Administración › Plataforma, nunca aquí (pedido del usuario 2026-10-16: «no me quemes nada») */
    --ui-mark: var(--accent);
    --ui-mark-soft: color-mix(in srgb, var(--accent) 12%, var(--surface));
    --ui-star: #d99a00;
    --ui-tip-bg: #1f2933;
    --ui-control-h: 2rem;   /* alto de toda caja, lista y botón de filtros, barras y formularios (2026-10-18) */
}

/* ---- Cajas, listas y botones de la misma altura (decisión del usuario 2026-10-18: «los botones son más grandes que las
   cajas… se ve horrible»; inventario B1). Con la misma altura, alinear abajo es lo mismo que centrar. La lista va sin
   relleno vertical: con relleno se cortan las letras que bajan (g, y, p) del valor por omisión. Vale en toda barra de
   filtros, barra de acciones y formulario de la plataforma (Pricing fue el primero). ---- */
:is(.filter-bar, .ui-filters, .ui-bar, .ui-form, .field-row, .panel-filters, .actions, form:has(.actions), .pr-actions, .pr-charge-form, .pr-pop-body, .pr-cargo-box)
    :is(input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=color]):not([type=range]), select) {
    height: var(--ui-control-h); box-sizing: border-box; padding-top: 0; padding-bottom: 0; line-height: normal; }
:is(.filter-bar, .ui-filters, .ui-bar, .ui-form, .field-row, .panel-filters, .actions, form:has(.actions), .pr-actions, .pr-charge-form, .pr-pop-body, .pr-cargo-box)
    :is(.btn-primary, .btn-secondary, .btn-small, .btn-small-quiet, .btn-danger, button:not(.chip-x):not(.help-i)) {
    height: var(--ui-control-h); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
    padding-top: 0; padding-bottom: 0; line-height: 1; white-space: nowrap; }

/* ---- Volver a la pantalla de donde se vino (p. ej. a Configuración de Pricing desde Monedas) ---- */
.back-link { display: inline-block; font-size: 0.82rem; margin: 0 0 0.35rem; color: var(--muted); text-decoration: none; }
.back-link:hover { color: var(--accent); }

/* ---- Pestañas: borde y línea de acento abajo en la activa (elegido por el usuario) ---- */
.ui-tabs { display: flex; gap: 0.25rem; border-bottom: 1px solid var(--border); margin: 0.3rem 0 0.6rem; overflow-x: auto;
    scrollbar-width: thin; }
.ui-tabs a { padding: 0.3rem 0.75rem; font-size: 0.84rem; border: 1px solid transparent; border-bottom: 0; border-radius: 6px 6px 0 0;
    color: var(--muted); text-decoration: none; margin-bottom: -1px; white-space: nowrap; }
.ui-tabs a:hover { background: var(--ui-hover); color: var(--ink); }
.ui-tabs a.active { background: var(--surface); border-color: var(--border); color: var(--ink); font-weight: 600;
    box-shadow: inset 0 -3px 0 var(--ui-mark); }
.ui-tabs .ui-tabs-note { margin-left: auto; align-self: center; font-size: 0.76rem; color: var(--muted); }   /* nota a la derecha de las pestañas */
.ui-tabs .ui-tab-count {margin-left: 0.3rem; font-size: 0.72rem; color: var(--muted); }

/* ---- Barra de filtros (la de Pricing, ascendida): cajas y botones de la misma altura, botones a la derecha ---- */
.filter-bar.ui-filters { padding: 0.55rem 0.75rem; column-gap: 0.6rem; row-gap: 0.45rem; align-items: flex-end; margin-bottom: 0.5rem; }
.ui-filters .field { gap: 0.15rem; margin: 0; }
.ui-filters label { font-size: 0.7rem; line-height: 1.15; }
.ui-filters input[type="text"], .ui-filters input[type="search"], .ui-filters input[type="date"], .ui-filters select {
    height: 2rem; box-sizing: border-box; padding: 0 0.5rem; font-size: 0.84rem; min-width: 9rem; margin: 0;
    border: 1px solid var(--border); border-radius: var(--radius-control, 6px); }
.ui-filters input:focus, .ui-filters select:focus { outline: 2px solid var(--ui-focus); outline-offset: -1px; }
.ui-filters .actions { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-left: auto; align-items: center; }
.ui-filters .actions .btn-primary, .ui-filters .actions .btn-secondary { height: 2rem; box-sizing: border-box; padding: 0 0.85rem;
    font-size: 0.82rem; display: inline-flex; align-items: center; margin: 0; white-space: nowrap; }
.ui-filters .ui-clear { font-size: 0.8rem; }
.ui-ranges { display: flex; flex-wrap: wrap; gap: 0.25rem; align-items: center; }
.ui-ranges button { height: 2rem; padding: 0 0.6rem; font-size: 0.78rem; border: 1px solid var(--border); border-radius: 999px;
    background: var(--surface); color: var(--ink); margin: 0; cursor: pointer; font-weight: 500; }
.ui-ranges button:hover { background: var(--ui-hover); }
/* fondo suave y borde en el color de marca, texto oscuro: el blanco sobre naranja no se lee bien en letra chica */
.ui-ranges button.active { background: var(--ui-mark-soft); border-color: var(--ui-mark); color: var(--ink); font-weight: 700; }
.ui-active { display: flex; flex-wrap: wrap; gap: 0.3rem; align-items: center; margin: -0.2rem 0 0.5rem; font-size: 0.78rem; }
.ui-active a { display: inline-flex; gap: 0.3rem; align-items: center; padding: 0.1rem 0.55rem; border-radius: 999px;
    background: var(--ui-mark-soft); border: 1px solid var(--ui-mark); color: var(--ink); text-decoration: none; }
.ui-active a::after { content: "✕"; font-size: 0.7rem; color: var(--muted); }
@media (max-width: 700px) {
    .ui-filters .field, .ui-filters input[type="text"], .ui-filters input[type="date"], .ui-filters select { width: 100%; min-width: 0; }
    .ui-filters .actions { margin-left: 0; }
}

/* ---- Árbol a la izquierda y detalle a la derecha (el de Pricing › Configuración, ascendido 2026-10-17 para Administración).
   Los títulos del árbol y los subtítulos de cada grupo van en el color de resalte de la marca («los títulos se pierden»). ---- */
.ui-layout { display: grid; grid-template-columns: minmax(13rem, 17rem) minmax(0, 1fr); gap: 1rem; align-items: start; }
.ui-tree { position: sticky; top: 0.5rem; max-height: calc(100vh - 6rem); overflow: auto; background: var(--surface);
    border: 1px solid var(--border); border-radius: var(--radius-control, 6px); padding: 0.5rem; font-size: 0.86rem; }
.ui-tree h3 { font-size: 0.78rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; color: var(--accent);
    margin: 0.75rem 0.1rem 0.2rem; padding: 0 0.3rem 0.15rem; border-bottom: 2px solid color-mix(in srgb, var(--accent) 35%, transparent); }
.ui-tree h3:first-child { margin-top: 0.15rem; }
.ui-tree a { display: flex; justify-content: space-between; gap: 0.4rem; padding: 0.22rem 0.4rem; border-radius: 4px; color: inherit;
    text-decoration: none; }
.ui-tree a:hover { background: var(--ui-hover); }
.ui-tree a.active { background: var(--ui-mark-soft); box-shadow: inset 3px 0 0 var(--ui-mark); font-weight: 600; }
.ui-detail { min-width: 0; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-control, 6px); padding: 0.75rem 1rem; }
.ui-crumb { font-size: 0.78rem; color: var(--muted); }
.ui-detail > h2 { margin: 0 0 0.4rem; font-size: 1.15rem; color: var(--navy); display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: center; }
.ui-sec { font-size: 0.8rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; color: var(--accent);
    margin: 1rem 0 0.4rem; padding: 0 0.1rem 0.15rem; border-bottom: 2px solid color-mix(in srgb, var(--accent) 35%, transparent);
    display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: center; }
.ui-detail > .ui-sec:first-of-type { margin-top: 0.5rem; }
/* 2026-10-28 (Angel: «los dos botones quedaron pegados a la tabla»): las acciones de una sección van en la raya de su título, a la
   derecha (<div class="ui-sec">Título <span class="ui-sec-actions">botones</span></div>), nunca sueltas encima de una tabla */
.ui-sec .ui-sec-actions { margin-left: auto; display: inline-flex; flex-wrap: wrap; gap: 0.4rem; padding-bottom: 0.3rem;
    text-transform: none; letter-spacing: 0; font-weight: 400; font-size: 0.85rem; color: var(--ink); }
.ui-sec .ui-sec-actions form { margin: 0; display: inline-flex; }
.ui-sec:has(.ui-sec-actions) { margin-bottom: 0.65rem; }
/* cifras de un detalle de solo lectura (AR, AP, Profit…): tarjetas chicas, el título arriba y la cifra con su unidad */
.ui-figures { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 8.5rem), 1fr)); gap: 0.5rem; margin: 0.5rem 0 0.75rem; }
.ui-figures > div { background: var(--surface-alt); border-radius: var(--radius-control, 6px); padding: 0.4rem 0.65rem; min-width: 0; }
.ui-figures small { display: block; color: var(--muted); font-size: 0.72rem; font-weight: 600; }
.ui-figures strong { font-size: 1rem; font-variant-numeric: tabular-nums; }
.ui-figures .ui-figure-unit { color: var(--muted); font-size: 0.74rem; margin-left: 0.25rem; }
/* dato general de la empresa dentro de la pantalla de un módulo: solo lectura, con enlace (docs/PLAN_CONFIG_TENANT.md) */
.ui-company { display: inline-flex; flex-wrap: wrap; gap: 0.5rem; align-items: baseline; font-size: 0.86rem; min-height: 2rem; }
.ui-company-link { font-size: 0.78rem; }
/* 2026-10-18 (PLAN_CONFIG_TENANT.md C2): horario laboral y feriados */
.ui-hours { max-width: 32rem; }
.ui-hours input[type=time] { width: 7rem; }
.ui-table tr.muted td { color: var(--muted); }
.ui-table td.ui-actions { white-space: nowrap; text-align: right; }
.ui-note { font-size: 0.8rem; color: var(--muted); margin: 0.2rem 0 0.5rem; }
.ui-facts { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 12rem), 1fr)); gap: 0.25rem 1rem; font-size: 0.85rem;
    margin: 0.3rem 0 0.6rem; }
.ui-facts dt { color: var(--muted); font-size: 0.74rem; margin: 0; }
.ui-facts dd { margin: 0 0 0.25rem; overflow-wrap: anywhere; }
/* formulario compacto: etiqueta chica arriba, campos alineados en rejilla */
.ui-form { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr)); gap: 0.5rem 0.9rem; margin: 0.3rem 0 0.6rem; }
.ui-form .field { margin: 0; display: flex; flex-direction: column; gap: 0.15rem; }
.ui-form label { font-size: 0.74rem; color: var(--muted); }
.ui-form input[type="text"], .ui-form input[type="email"], .ui-form input[type="password"], .ui-form input[type="number"], .ui-form select {
    height: 2rem; box-sizing: border-box; padding: 0 0.5rem; font-size: 0.85rem; margin: 0; width: 100%; }
.ui-form .ui-wide { grid-column: 1 / -1; }
.ui-bar { display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: center; margin: 0.5rem 0; }
.ui-bar form { display: inline-flex; flex-wrap: wrap; gap: 0.35rem; align-items: center; margin: 0; }
.ui-bar input[type="text"], .ui-bar input[type="email"], .ui-bar input[type="password"], .ui-bar select {
    height: 2rem; box-sizing: border-box; padding: 0 0.5rem; font-size: 0.84rem; margin: 0; }
.ui-bar .muted { font-size: 0.8rem; }
.ui-form .ui-wide input { max-width: none; }
.ui-check { display: flex; gap: 0.5rem; align-items: flex-start; padding: 0.35rem 0.1rem; border-bottom: 1px solid var(--ui-row-line);
    font-size: 0.86rem; cursor: pointer; }
.ui-check:last-child { border-bottom: 0; }
.ui-check small { display: block; color: var(--muted); font-size: 0.76rem; }
.ui-danger { border-left: 3px solid var(--bad-fg); padding-left: 0.6rem; }
@media (max-width: 900px) {
    .ui-layout { grid-template-columns: minmax(0, 1fr); }   /* minmax: una tabla ancha no empuja la página fuera de la pantalla */
    .ui-tree { position: static; max-height: 40vh; min-width: 0; }
}

/* ---- Resumen arriba de una tabla (chips con un dato cada uno) ---- */
.ui-summary { display: flex; flex-wrap: wrap; gap: 0.4rem; margin: 0 0 0.5rem; }
.ui-stat { display: flex; flex-direction: column; padding: 0.3rem 0.65rem; border: 1px solid var(--border); border-left: 3px solid var(--navy);
    border-radius: var(--radius-control, 6px); background: var(--surface); min-width: 6.5rem; }
.ui-stat b { font-size: 0.78rem; color: var(--ui-head-fg); }
.ui-stat span { font-size: 0.95rem; font-variant-numeric: tabular-nums; font-weight: 600; }
.ui-stat small { font-size: 0.7rem; color: var(--muted); }

/* ---- Tabla de datos estándar ---- */
.ui-scroll { max-height: calc(100vh - 13rem); overflow: auto; border: 1px solid var(--border); border-radius: var(--radius-control, 6px); background: var(--surface); }
.ui-scroll > table.ui-table { margin: 0; }
/* pocas columnas: la caja toma el ancho de la tabla en vez de estirar las columnas a toda la pantalla */
.ui-scroll.ui-fit { width: fit-content; max-width: 100%; }
.ui-fit > table.ui-table { width: auto; }
.ui-fit > table.ui-table th.num { min-width: 7rem; }
table.ui-table { border-collapse: separate; border-spacing: 0; width: 100%; font-size: 0.85rem; }
table.ui-table th, table.ui-table td { padding: 0.3rem 0.6rem; border-bottom: 1px solid var(--ui-row-line); }
table.ui-table thead th { position: sticky; top: 0; z-index: 2; background: var(--ui-head-bg); color: var(--ui-head-fg);
    font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; vertical-align: bottom;
    border-bottom: 2px solid color-mix(in srgb, var(--navy) 30%, var(--surface)); white-space: nowrap; }
table.ui-table tbody tr:nth-child(even) > * { background: var(--ui-zebra); }
table.ui-table tbody tr:nth-child(odd) > * { background: var(--surface); }
table.ui-table tbody tr:hover > * { background: var(--ui-hover); }
table.ui-table tbody tr.is-selected > * { background: var(--ui-selected); }
table.ui-table tbody tr.is-selected > :first-child { box-shadow: inset 3px 0 0 var(--ui-mark); }
table.ui-table .num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
table.ui-table .ui-gap { color: var(--muted); }
/* 2026-10-21 (Angel): toda caja de número o monto, alineada a la derecha y con cifras del mismo ancho (formato en ui.js) */
input[data-format="number"], input[type="number"], input.num { text-align: right; font-variant-numeric: tabular-nums; }
table.ui-form-table th.num { text-align: right; }
table.ui-table tfoot td { font-weight: 700; border-top: 2px solid var(--ui-row-line); background: var(--ui-head-bg); }
/* vista previa de la marca (Administración › Marca): pinta con los colores elegidos antes de guardar */
.brand-preview { border: 1px solid var(--border); border-radius: var(--radius-control, 6px); overflow: hidden; max-width: 34rem; margin: 0.3rem 0 0.6rem; }
.brand-preview .bp-nav { display: flex; gap: 1rem; align-items: center; padding: 0.55rem 0.8rem; color: var(--surface);
    background: linear-gradient(90deg, var(--bp-p), var(--bp-s)); font-size: 0.85rem; }
.brand-preview .bp-body { padding: 0.6rem 0.8rem; background: var(--surface); }
.brand-preview .bp-title { color: var(--bp-a); font-weight: 700; text-transform: uppercase; font-size: 0.78rem; letter-spacing: 0.03em;
    border-bottom: 2px solid color-mix(in srgb, var(--bp-a) 35%, transparent); padding-bottom: 0.15rem; }
.brand-preview .bp-tabs { display: flex; gap: 0.3rem; margin: 0.5rem 0; font-size: 0.82rem; }
.brand-preview .bp-tabs span { padding: 0.2rem 0.6rem; border: 1px solid var(--border); border-radius: 6px 6px 0 0; color: var(--muted); }
.brand-preview .bp-tabs .on { color: var(--ink); font-weight: 600; box-shadow: inset 0 -3px 0 var(--bp-a); }
.brand-preview .bp-row { display: flex; gap: 0.8rem; align-items: center; }
.brand-preview .bp-btn { background: var(--bp-a); color: var(--surface); border: 0; border-radius: var(--radius-control, 6px); padding: 0.35rem 0.8rem; }
.brand-preview .bp-link { color: var(--bp-a); }
.brand-preview .bp-warn { color: var(--bad-fg); font-size: 0.8rem; margin: 0.5rem 0 0; }
.perm-action { display: flex; gap: 0.3rem; align-items: center; font-size: 0.8rem; white-space: nowrap; margin: 0.1rem 0; }
/* renglón de grupo dentro de una tabla: subtítulo en el color de resalte, sin intercalado (2026-10-17) */
table.ui-table tbody tr.ui-group > td { background: var(--surface); color: var(--accent); font-size: 0.76rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.03em; padding-top: 0.7rem;
    border-bottom: 2px solid color-mix(in srgb, var(--accent) 35%, transparent); }
table.ui-table tbody tr.ui-group:hover > td { background: var(--surface); }
table.ui-table tr.ui-empty td { text-align: center; color: var(--muted); padding: 1rem; background: var(--surface); }
/* columna fija: la de .sticky-start de app.css, con el fondo de su fila */
table.ui-table .sticky-start { position: sticky; left: 0; z-index: 1; }
table.ui-table thead .sticky-start { z-index: 3; }
/* orden por columna (ui.js) */
table.ui-table th[data-sort] { cursor: pointer; user-select: none; }
table.ui-table th[data-sort]::after { content: "↕"; margin-left: 0.25rem; opacity: 0.35; font-size: 0.7rem; }
table.ui-table th[aria-sort="ascending"]::after { content: "▲"; opacity: 1; }
table.ui-table th[aria-sort="descending"]::after { content: "▼"; opacity: 1; }
table.ui-table th[data-sort]:hover { color: var(--accent); }
/* Las otras dos tablas permitidas (2026-10-19): ui-form-table para capturar renglones (cada módulo pone su diseño) y
   ui-mini-table para una lista corta dentro de una celda. Nada más: la guardia exige una de las tres. */
table.ui-form-table { border-collapse: collapse; }
table.ui-mini-table { border-collapse: collapse; font-size: 0.76rem; }
table.ui-mini-table td { padding: 0.05rem 0.3rem; white-space: nowrap; }
.ui-foot { display: flex; justify-content: space-between; gap: 0.5rem; flex-wrap: wrap; font-size: 0.74rem; color: var(--muted);
    margin: 0.3rem 0.1rem 0.6rem; }
@media (max-width: 700px) {
    .ui-scroll { max-height: 70vh; }
    table.ui-table th, table.ui-table td { padding: 0.28rem 0.45rem; }
}

/* ---- Ventana de la plataforma (2026-10-18, inventario B4/B5): <dialog class="ui-dialog"> en vez de confirm() y de
   modal-overlay. Chica para confirmar; con .ui-dialog-m / -l para contenido. Colores de la marca. ---- */
dialog.ui-dialog { border: 1px solid var(--border); border-radius: var(--radius-card, 10px); padding: 1rem 1.1rem; background: var(--surface); color: var(--ink);
    box-shadow: var(--shadow); max-width: min(28rem, calc(100vw - 2rem)); }
dialog.ui-dialog.ui-dialog-m { max-width: min(44rem, calc(100vw - 2rem)); width: 100%; }
dialog.ui-dialog.ui-dialog-l { max-width: min(64rem, calc(100vw - 2rem)); width: 100%; }
dialog.ui-dialog::backdrop { background: color-mix(in srgb, var(--navy) 35%, transparent); }
.ui-confirm-text { margin: 0 0 0.9rem; font-size: 0.92rem; line-height: 1.4; white-space: pre-line; }
.ui-confirm-actions, .ui-dialog-actions { display: flex; justify-content: flex-end; gap: 0.5rem; }
.ui-confirm-actions button, .ui-dialog-actions button { height: var(--ui-control-h); padding: 0 0.9rem; display: inline-flex; align-items: center; }

/* la ventana de detalle de un renglón (tableros de Demoras, Cost Control, Control de documentos, Comercial, Alta de clientes):
   la caja de adentro (.modal-box) es la tarjeta; el <dialog> solo la centra y oscurece el fondo con el color de la marca */
dialog.ui-dialog.ui-dialog-detail { padding: 0; border: 0; background: transparent; box-shadow: none; max-width: min(1100px, 96vw); width: 100%; margin-top: 3rem; overflow: visible; }
dialog.ui-dialog.ui-dialog-detail > .modal-box { max-width: none; }
/* detalle con una tabla ancha (líneas de cargo de Cost Control, 2026-10-19): casi todo el ancho de la pantalla */
dialog.ui-dialog.ui-dialog-detail.ui-dialog-xl { max-width: min(1500px, calc(100vw - 1.5rem)); margin-top: 1.5rem; }
dialog.ui-dialog.ui-dialog-detail.ui-dialog-xl > .modal-box { padding: 1rem 1.1rem; }

/* 2026-10-23 (Angel: «el popup de configuración de editar de plataforma de tarifas es horrendo»): popup de edición estándar.
   <dialog class="ui-dialog ui-dialog-form ui-dialog-m"> con encabezado (título + ✕), cuerpo con grupos (.ui-form-section con su
   subtítulo y .ui-form-grid de campos) que se desplaza solo, y pie fijo con Cancelar y Guardar. Se abre con un botón
   data-dialog-open="<id>" y se cierra con data-dialog-close (ui.js). Nunca un <details> que se despliega encima de la pantalla. */
dialog.ui-dialog.ui-dialog-form { padding: 0; width: 100%; max-height: calc(100vh - 2rem); overflow: hidden; }
/* 2026-10-23: el popup puede vivir dentro de una celda (el «Editar» de un renglón): no hereda su alineación ni su nowrap */
dialog.ui-dialog.ui-dialog-form { text-align: start; white-space: normal; }
dialog.ui-dialog.ui-dialog-form[open] { display: flex; flex-direction: column; }
/* `dialog.ui-dialog.ui-dialog-form > form`: gana a las reglas de los formularios en línea de cada módulo (.pr-actions form…),
   que lo partían en columnas; lo marcado `hidden` (data-solo) nunca se ve aunque su regla diga display */
dialog.ui-dialog.ui-dialog-form > form { display: flex; flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 0;
    min-height: 0; flex: 1 1 auto; margin: 0; }
dialog.ui-dialog-form [hidden] { display: none !important; }
dialog.ui-dialog.ui-dialog-form.ui-dialog-xl { max-width: min(78rem, calc(100vw - 2rem)); }   /* con una tabla de captura ancha */
.ui-dialog-head { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.85rem 1.1rem;
    border-bottom: 1px solid var(--border); }
.ui-dialog-head h2 { margin: 0; font-size: 1.05rem; color: var(--accent); line-height: 1.3; }
.ui-dialog-head .ui-dialog-sub { display: block; font-size: 0.8rem; font-weight: normal; color: var(--muted); }
.ui-icon-btn { flex: 0 0 auto; width: var(--ui-control-h, 2rem); height: var(--ui-control-h, 2rem); padding: 0.35rem; border: 0;
    background: transparent; color: var(--muted); cursor: pointer; border-radius: var(--radius-button, 6px); display: inline-flex;
    align-items: center; justify-content: center; }
.ui-icon-btn:hover { color: var(--ink); background: var(--border); }
.ui-icon-btn svg { width: 100%; height: 100%; }
.ui-dialog-body { overflow-y: auto; padding: 0.9rem 1.1rem 1rem; flex: 1 1 auto; min-height: 0; }
.ui-dialog-foot { display: flex; justify-content: flex-end; gap: 0.5rem; padding: 0.75rem 1.1rem; border-top: 1px solid var(--border); }
.ui-dialog-foot button { height: var(--ui-control-h); padding: 0 1rem; }
.ui-form-section + .ui-form-section { margin-top: 0.85rem; padding-top: 0.75rem; border-top: 1px dashed var(--border); }
.ui-form-section > h3 { margin: 0 0 0.5rem; font-size: 0.82rem; letter-spacing: 0.03em; text-transform: uppercase; color: var(--accent);
    display: flex; align-items: center; gap: 0.35rem; }
.ui-form-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.7rem 0.9rem; }
/* cada campo: el título y su ⓘ en el mismo renglón, la caja debajo a todo lo ancho. La caja va al fondo del renglón
   (align-content: end): si un título ocupa dos líneas, las cajas del mismo renglón siguen alineadas (Angel, 2026-10-23) */
.ui-form-grid.ui-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1000px) { .ui-form-grid.ui-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .ui-form-grid.ui-cols-4 > .ui-span-3 { grid-column: span 2; } }
.ui-form-grid > label { display: grid; grid-template-columns: auto 1fr; align-items: center; align-content: end; column-gap: 0.3rem;
    row-gap: 0.25rem; min-width: 0; margin: 0; font-size: 0.8rem; color: var(--ink); }
.ui-form-grid > label > .help-i { justify-self: start; }
/* cajas y listas del popup con el mismo alto y borde, aunque la hoja de la pantalla no las estilice (Contenedores, 23-oct) */
.ui-form-grid > label > input:not([type="checkbox"]):not([type="radio"]), .ui-form-grid > label > select {
    height: var(--ui-control-h, 2rem); padding: 0 0.6rem; border: 1px solid var(--border); border-radius: var(--radius-control, 6px);
    background: var(--surface); color: var(--ink); font: inherit; font-size: 0.88rem; }
.ui-form-grid > label > textarea { padding: 0.4rem 0.6rem; border: 1px solid var(--border); border-radius: var(--radius-control, 6px);
    background: var(--surface); color: var(--ink); font: inherit; font-size: 0.88rem; }
.ui-form-grid > label > input:focus, .ui-form-grid > label > select:focus, .ui-form-grid > label > textarea:focus {
    outline: none; box-shadow: var(--focus-ring, 0 0 0 2px var(--accent)); border-color: var(--accent); }
.ui-form-grid > label > input, .ui-form-grid > label > select, .ui-form-grid > label > textarea { grid-column: 1 / -1; width: 100%;
    box-sizing: border-box; margin: 0; }
/* un campo que no es una caja (Adjuntar archivos): su título arriba, igual que los demás, para que todo quede alineado */
.ui-form-grid > .ui-field { display: grid; row-gap: 0.25rem; align-content: start; min-width: 0; font-size: 0.8rem; color: var(--ink); }
.ui-form-grid > .ui-field [data-attach] { height: var(--ui-control-h, 2rem); }
.ui-form-grid > .ui-span-2 { grid-column: span 2; }
.ui-form-grid > .ui-span-3 { grid-column: span 3; }
.ui-form-grid > .ui-span-all { grid-column: 1 / -1; }
.ui-form-grid > .ui-check-grid { align-self: end; min-height: var(--ui-control-h, 2rem); align-content: center; }
/* dos grupos lado a lado (Servicios | Tráficos): el ancho que sobra se aprovecha en vez de apilar */
.ui-form-pair { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 1fr); gap: 1.5rem; }
.ui-dialog-body > * + .ui-form-pair { margin-top: 0.85rem; padding-top: 0.75rem; border-top: 1px dashed var(--border); }
.ui-form-pair > .ui-form-section + .ui-form-section { margin-top: 0; padding-top: 0; border-top: 0; }
.ui-check-grid.ui-check-col { grid-template-columns: minmax(0, 1fr); }
.ui-check-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(10.5rem, 1fr)); gap: 0.4rem 0.9rem; }
.ui-check-grid label { display: flex; align-items: center; gap: 0.45rem; margin: 0; font-size: 0.86rem; color: var(--ink); cursor: pointer; }
.ui-check-grid input[type="checkbox"], .ui-check-grid input[type="radio"] { flex: 0 0 auto; width: 1rem; height: 1rem; margin: 0; }
.ui-form-hint { margin: 0 0 0.6rem; font-size: 0.8rem; color: var(--muted); }
@media (max-width: 700px) {
    dialog.ui-dialog.ui-dialog-form { max-height: calc(100vh - 1rem); max-width: calc(100vw - 1rem); }
    .ui-form-grid, .ui-form-grid.ui-cols-4 { grid-template-columns: minmax(0, 1fr); }
    .ui-form-grid > .ui-span-2, .ui-form-grid > .ui-span-3 { grid-column: auto; }
    .ui-form-pair { grid-template-columns: minmax(0, 1fr); gap: 0.85rem; }
    .ui-check-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* 2026-10-23 (Angel): títulos y botones de elección de toda la plataforma (antes solo en Pricing: cot-title-ico, cot-sub,
   cot-chip). Skill /pantallas §1 «Títulos». */
/* subtítulo menor dentro de una tarjeta o bloque (debajo de .ui-sec): en el color de resalte, sin mayúsculas */
.ui-sub { font-size: 0.84rem; font-weight: 700; margin: 0.6rem 0 0.2rem; color: var(--accent); display: flex; flex-wrap: wrap;
    align-items: center; gap: 0.3rem; }
/* ícono del título en un círculo con el color sólido del menú y el dibujo blanco: <span class="ui-title-ico" data-icon="…"> */
.ui-title-ico { display: inline-grid; place-items: center; width: 1.6rem; height: 1.6rem; border-radius: 50%; margin: 0 0.35rem 0 0.15rem;
    vertical-align: middle; flex: 0 0 auto; background: var(--menu-solid); color: var(--surface); }
.ui-title-ico svg { width: 0.95rem; height: 0.95rem; }
:is(.ui-sub, .ui-sec) .ui-title-ico { width: 1.35rem; height: 1.35rem; margin-left: 0; }
:is(.ui-sub, .ui-sec) .ui-title-ico svg { width: 0.8rem; height: 0.8rem; }
/* botón de elección (servicio, tráfico, filtro): <label class="ui-choice"><input type="checkbox|radio">ícono y nombre</label>.
   Marcado: fondo del color sólido del menú, letra e ícono blancos; sin marcar: blanco con borde. El radio no se ve.
   La clase va doble a propósito: le gana a las reglas de «label» de cada formulario (.pr-form label, .ui-form label…). */
.ui-choice.ui-choice { display: inline-flex; flex-direction: row; align-items: center; gap: 0.35rem; border: 1px solid var(--border);
    border-radius: 999px; padding: 0.25rem 0.7rem; font-weight: 400; cursor: pointer; background: var(--surface);
    color: var(--ink); }
.ui-choice.ui-choice:has(input:checked) { background: var(--menu-solid); border-color: var(--nav-dark, var(--navy));
    color: var(--surface); font-weight: 600; }
.ui-choice:has(input:checked) input[type="checkbox"] { accent-color: var(--accent); }
.ui-choice:has(input[type="radio"]) input { position: absolute; opacity: 0; width: 0; height: 0; }
.ui-choice:has(input[type="radio"]:focus-visible) { outline: 2px solid var(--accent); outline-offset: 1px; }
.ui-choice-ico { display: inline-flex; }
.ui-choice-ico svg { width: 1.05rem; height: 1.05rem; }

/* 2026-10-23: íconos sueltos (macro ico de _ui.html) y «Adjuntar archivos» (macro attach) */
.ui-ico { width: 1em; height: 1em; vertical-align: -0.15em; flex: 0 0 auto; }
/* en un botón (inline-flex) el espacio entre el ícono y el texto se pierde: lo da el gap */
:is(.btn-primary, .btn-secondary, .btn-small, .btn-small-quiet, .btn-danger):has(> .ui-ico) { gap: 0.35em; }
.ui-attach-input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.ui-attach { position: relative; }
.ui-attach [data-attach] { display: inline-flex; align-items: center; gap: 0.35rem; }
.ui-attach-list { list-style: none; margin: 0.4rem 0 0; padding: 0; display: flex; flex-direction: column; gap: 0.25rem; }
.ui-attach-list li { display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem; min-width: 0; }
.ui-attach-list li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.ui-attach-list li small { color: var(--muted); flex: 0 0 auto; }
.ui-attach-list li .ui-icon-btn { width: 1.6rem; height: 1.6rem; padding: 0; font-size: 0.8rem; }
.ui-attach-list .ui-attach-empty { color: var(--muted); font-size: 0.8rem; }

.ui-callout { border-left: 3px solid var(--warn-fg); padding-left: 0.75rem; }   /* aviso con borde de atención (antes un color fijo en 7 pantallas) */

/* 2026-10-19: aviso de cierre por inactividad (static/session_idle.js) */
.ui-idle-warning { position: fixed; left: 50%; bottom: 1.25rem; transform: translateX(-50%); z-index: 1000; display: flex;
    gap: 0.75rem; align-items: center; max-width: calc(100% - 2rem); padding: 0.7rem 1rem; border-radius: var(--radius-card, 10px);
    background: var(--navy); color: var(--surface); box-shadow: 0 6px 24px rgba(0, 0, 0, 0.25); font-size: 0.9rem; }
@media (max-width: 600px) { .ui-idle-warning { flex-direction: column; align-items: stretch; text-align: center; } }

/* 2026-10-23 (Angel): barra de procesos del pie (base.html #ui-processes, ui.js «Procesos»). Una tarjeta por proceso, abajo a
   la derecha: en proceso (ícono girando y barra), listo (verde, se va sola) o no se pudo (roja, con la causa; se cierra a mano). */
.ui-processes { position: fixed; right: 1rem; bottom: 1rem; z-index: 950; display: flex; flex-direction: column; gap: 0.5rem;
    width: min(24rem, calc(100vw - 2rem)); pointer-events: none; }
.ui-process { pointer-events: auto; display: flex; gap: 0.65rem; align-items: flex-start; padding: 0.7rem 0.8rem;
    background: var(--surface); color: var(--ink); border: 1px solid var(--border); border-left: 4px solid var(--accent);
    border-radius: var(--radius-card, 10px); box-shadow: var(--shadow-pop, var(--shadow)); font-size: 0.88rem;
    animation: ui-process-in 0.18s ease-out; }
.ui-process-ok { border-left-color: var(--ok-fg); }
.ui-process-error { border-left-color: var(--bad-fg); }
.ui-process-ico { flex: 0 0 1.4rem; width: 1.4rem; height: 1.4rem; color: var(--accent); }
.ui-process-ok .ui-process-ico { color: var(--ok-fg); }
.ui-process-error .ui-process-ico { color: var(--bad-fg); }
.ui-process-ico svg { width: 100%; height: 100%; }
.ui-process-running .ui-process-ico svg { animation: ui-spin 0.9s linear infinite; }
.ui-process-text { flex: 1 1 auto; min-width: 0; }
.ui-process-text strong { display: block; color: var(--accent); line-height: 1.25; }
.ui-process-state { display: block; font-size: 0.78rem; color: var(--muted); margin-top: 0.1rem; }
.ui-process-ok .ui-process-state { color: var(--ok-fg); }
.ui-process-error .ui-process-state { color: var(--bad-fg); }
.ui-process-text p { margin: 0.3rem 0 0; line-height: 1.35; white-space: pre-line; overflow-wrap: anywhere; }
.ui-process-text p:empty { display: none; }
.ui-process-bar { height: 4px; margin-top: 0.5rem; border-radius: 2px; background: var(--border); overflow: hidden; }
.ui-process-bar span { display: block; height: 100%; background: var(--accent); border-radius: 2px; transition: width 0.4s; }
.ui-process-bar-loop span { animation: ui-process-loop 1.3s ease-in-out infinite; }
.ui-process-close { flex: 0 0 auto; width: 1.6rem; height: 1.6rem; padding: 0.2rem; border: 0; background: transparent; color: var(--muted);
    cursor: pointer; border-radius: var(--radius-button, 6px); }
.ui-process-close:hover { color: var(--ink); background: var(--border); }
.ui-process-close svg { width: 100%; height: 100%; }
button.ui-busy { opacity: 0.7; cursor: progress; }
@keyframes ui-spin { to { transform: rotate(360deg); } }
@keyframes ui-process-loop { 0% { transform: translateX(-100%); } 100% { transform: translateX(300%); } }
@keyframes ui-process-in { from { opacity: 0; transform: translateY(0.5rem); } to { opacity: 1; transform: none; } }
@media (max-width: 600px) { .ui-processes { right: 0.75rem; left: 0.75rem; bottom: 0.75rem; width: auto; } }
@media (prefers-reduced-motion: reduce) { .ui-process, .ui-process-running .ui-process-ico svg, .ui-process-bar-loop span { animation: none; } }

/* 2026-10-29 (Angel: «un estándar de barras o donas de procesando, ya lo hicimos con facturas de proveedor… cuando un proceso
   tarda, debemos decirle al usuario que lo estamos procesando»; skill /pantallas §1c, ui.js «Procesando»). Salen solo si tarda
   más que el umbral del tablero (`data-busy-ms`, parámetro del tenant), para que no parpadee. */
.ui-spinner { display: inline-block; width: 1.4rem; height: 1.4rem; border-radius: 50%; box-sizing: border-box; vertical-align: middle;
    border: 3px solid var(--info-bg, var(--border)); border-top-color: var(--accent); animation: ui-spin 0.9s linear infinite; }
.ui-spinner-lg { width: 2.4rem; height: 2.4rem; border-width: 4px; }
.ui-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.6rem; min-height: 8rem;
    color: var(--muted); font-size: 0.9rem; text-align: center; }
.ui-loading-error { color: var(--bad-fg); }
.ui-loading-error strong { display: block; color: var(--bad-fg); }
.ui-loading-bar { position: fixed; top: 0; left: 0; right: 0; z-index: 1100; height: 3px; overflow: hidden; pointer-events: none;
    background: color-mix(in srgb, var(--accent) 18%, transparent); }
.ui-loading-bar span { display: block; width: 35%; height: 100%; background: var(--accent); animation: ui-process-loop 1.1s ease-in-out infinite; }
body.ui-page-loading [data-loading-dim] { opacity: 0.45; transition: opacity 0.2s; pointer-events: none; }
button[data-busy].ui-busy .ui-spinner, a.ui-busy .ui-spinner { width: 1rem; height: 1rem; border-width: 2px; margin-right: 0.35rem; }
/* el popup de detalle común (macro detail_dialog de _ui.html, ui.js): cabe en la pantalla y su contenido se desplaza */
dialog[data-ui-detail] { margin-top: 1rem; }
dialog[data-ui-detail] > .modal-box { max-height: calc(100vh - 2rem); overflow-y: auto; padding: 0.75rem 1rem; }
/* el título y la ✕ quedan fijos arriba mientras el cuerpo se desplaza (skill /pantallas §1c) */
dialog[data-ui-detail] .modal-close { position: sticky; top: 0; float: right; z-index: 3; }
dialog[data-ui-detail] [data-ui-detail-body] > h2:first-of-type { position: sticky; top: -0.75rem; z-index: 2; margin-top: -0.75rem;
    padding: 0.75rem 2.5rem 0.4rem 0; background: var(--surface); }
/* la flecha de la comparación con el periodo anterior (macro `delta` de _graficas_macros.html). Sin verde ni rojo: que suba
   no siempre es bueno (más costo, más demora), así que la flecha solo dice hacia dónde fue. */
.ui-delta { margin-left: 0.3rem; font-size: 0.66rem; font-weight: 600; color: var(--muted); white-space: nowrap; cursor: help; }
@media (prefers-reduced-motion: reduce) { .ui-spinner, .ui-loading-bar span { animation: none; } }

/* ---- Utilidades (2026-10-19, F2 de PLAN_MEJORAS_ARQUITECTURA.md): lo que antes iba en style="…" dentro de las
   plantillas, una clase por declaración y en una escala corta (tamaños de letra 70–90, espacios 0–15 = 0–1.5rem,
   anchos en medios rem). Llevan !important porque reemplazan a un estilo en línea, que ganaba a todo; las de display
   no se aplican a un elemento con [hidden]. Una regla nueva va en la hoja del módulo, no aquí ni en style=. ---- */
.ui-b-0 { border: 0 !important; }
.ui-b-1 { border: 1px solid var(--border) !important; }
.ui-bg-surface { background: var(--surface) !important; }
.ui-bg-warn { background: var(--warn-fg) !important; }
.ui-border-box { box-sizing: border-box !important; }
.ui-break { overflow-wrap: anywhere !important; }
.ui-bt-dashed { border-top: 1px dashed var(--border) !important; }
.ui-c-ink { color: var(--ink) !important; }
.ui-c-surface { color: var(--surface) !important; }
.ui-c-warn { color: var(--warn-fg) !important; }
.ui-col-2-end { grid-column: 2 / -1 !important; }
.ui-col-full { grid-column: 1/-1 !important; }
.ui-col-span-2 { grid-column: span 2 !important; }
.ui-d-block:not([hidden]) { display: block !important; }
.ui-d-flex:not([hidden]) { display: flex !important; }
.ui-d-inline-block:not([hidden]) { display: inline-block !important; }
.ui-d-inline-flex:not([hidden]) { display: inline-flex !important; }
.ui-d-inline:not([hidden]) { display: inline !important; }
.ui-flex-1 { flex: 1 !important; }
.ui-flex-16 { flex: 1 1 16rem !important; }
.ui-flex-18 { flex: 1 1 18rem !important; }
.ui-flex-22 { flex: 1 1 22rem !important; }
.ui-font-inherit { font: inherit !important; }
.ui-fs-70 { font-size: 0.7rem !important; }
.ui-fs-74 { font-size: 0.74rem !important; }
.ui-fs-78 { font-size: 0.78rem !important; }
.ui-fs-80 { font-size: 0.8rem !important; }
.ui-fs-84 { font-size: 0.84rem !important; }
.ui-fs-90 { font-size: 0.9rem !important; }
.ui-fw-400 { font-weight: 400 !important; }
.ui-fw-500 { font-weight: 500 !important; }
.ui-gap-1 { gap: 0.1rem !important; }
.ui-gap-10 { gap: 1rem !important; }
.ui-gap-3 { gap: 0.3rem !important; }
.ui-gap-4 { gap: 0.4rem !important; }
.ui-gap-5 { gap: 0.5rem !important; }
.ui-gap-6 { gap: 0.6rem !important; }
.ui-grid-cards { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)) !important; }
.ui-h-60vh { height: 60vh !important; }
.ui-help { cursor: help !important; }
.ui-items-center { align-items: center !important; }
.ui-justify-end { justify-content: flex-end !important; }
.ui-left-0 { left: 0 !important; }
.ui-m-0 { margin: 0 !important; }
.ui-m-1 { margin: 0.1rem !important; }
.ui-maxh-22-5 { max-height: 22.5rem !important; }
.ui-maxh-28 { max-height: 28rem !important; }
.ui-maxw-5-5 { max-width: 5.5rem !important; }
.ui-maxw-6 { max-width: 6rem !important; }
.ui-maxw-60 { max-width: 60rem !important; }
.ui-maxw-7 { max-width: 7rem !important; }
.ui-maxw-8 { max-width: 8rem !important; }
.ui-maxw-none { max-width: none !important; }
.ui-mb-0 { margin-bottom: 0 !important; }
.ui-mb-10 { margin-bottom: 1rem !important; }
.ui-mb-15 { margin-bottom: 1.5rem !important; }
.ui-mb-2 { margin-bottom: 0.2rem !important; }
.ui-mb-3 { margin-bottom: 0.3rem !important; }
.ui-mb-4 { margin-bottom: 0.4rem !important; }
.ui-mb-5 { margin-bottom: 0.5rem !important; }
.ui-mb-6 { margin-bottom: 0.6rem !important; }
.ui-mb-8 { margin-bottom: 0.8rem !important; }
.ui-minw-0 { min-width: 0 !important; }
.ui-minw-14 { min-width: 14rem !important; }
.ui-minw-16 { min-width: 16rem !important; }
.ui-minw-18 { min-width: 18rem !important; }
.ui-minw-7-5 { min-width: 7.5rem !important; }
.ui-ml-0 { margin-left: 0 !important; }
.ui-ml-1 { margin-left: 0.1rem !important; }
.ui-ml-5 { margin-left: 0.5rem !important; }
.ui-ml-6 { margin-left: 0.6rem !important; }
.ui-ml-auto { margin-left: auto !important; }
.ui-mono { font-family: monospace !important; }
.ui-mr-0 { margin-right: 0 !important; }
.ui-mr-1 { margin-right: 0.1rem !important; }
.ui-mt-0 { margin-top: 0 !important; }
.ui-mt-10 { margin-top: 1rem !important; }
.ui-mt-15 { margin-top: 1.5rem !important; }
.ui-mt-2 { margin-top: 0.2rem !important; }
.ui-mt-3 { margin-top: 0.3rem !important; }
.ui-mt-4 { margin-top: 0.4rem !important; }
.ui-mt-5 { margin-top: 0.5rem !important; }
.ui-mt-6 { margin-top: 0.6rem !important; }
.ui-mt-8 { margin-top: 0.8rem !important; }
.ui-no-underline { text-decoration: none !important; }
.ui-nowrap { white-space: nowrap !important; }
.ui-normal { white-space: normal !important; }   /* celda de texto largo que se parte en renglones (las celdas van en uno) */
.ui-nowrap-flex { flex-wrap: nowrap !important; }
.ui-o-auto { overflow: auto !important; }
.ui-ox-auto { overflow-x: auto !important; }
.ui-oy-auto { overflow-y: auto !important; }
.ui-p-0 { padding: 0 !important; }
.ui-p-4 { padding: 0.4rem !important; }
.ui-p-5 { padding: 0.5rem !important; }
.ui-pb-0 { padding-bottom: 0 !important; }
.ui-pb-1 { padding-bottom: 0.1rem !important; }
.ui-pb-2 { padding-bottom: 0.2rem !important; }
.ui-pl-0 { padding-left: 0 !important; }
.ui-pl-3 { padding-left: 0.3rem !important; }
.ui-pl-4 { padding-left: 0.4rem !important; }
.ui-pointer { cursor: pointer !important; }
.ui-pr-0 { padding-right: 0 !important; }
.ui-pr-3 { padding-right: 0.3rem !important; }
.ui-pr-4 { padding-right: 0.4rem !important; }
.ui-pre-line { white-space: pre-line !important; }
.ui-pre-wrap { white-space: pre-wrap !important; }
.ui-pt-0 { padding-top: 0 !important; }
.ui-pt-1 { padding-top: 0.1rem !important; }
.ui-pt-2 { padding-top: 0.2rem !important; }
.ui-pt-4 { padding-top: 0.4rem !important; }
.ui-pt-5 { padding-top: 0.5rem !important; }
.ui-r-6 { border-radius: 6px !important; }
.ui-r-8 { border-radius: 8px !important; }
.ui-right { text-align: right !important; }
.ui-right-auto { right: auto !important; }
.ui-row { flex-direction: row !important; }
.ui-upper { text-transform: uppercase !important; }
.ui-w-4 { width: 4rem !important; }
.ui-w-4-5 { width: 4.5rem !important; }
.ui-w-5 { width: 5rem !important; }
.ui-w-5-5 { width: 5.5rem !important; }
.ui-w-6 { width: 6rem !important; }
.ui-w-6-5 { width: 6.5rem !important; }
.ui-w-7-5 { width: 7.5rem !important; }
.ui-w-8 { width: 8rem !important; }
.ui-w-9 { width: 9rem !important; }
.ui-w-9-5 { width: 9.5rem !important; }
.ui-w-auto { width: auto !important; }
.ui-w-full { width: 100% !important; }
.ui-wrap { flex-wrap: wrap !important; }

/* 2026-10-20 (docs/PLAN_MONITOREO.md §3.4): línea de tiempo de la noche en Plataforma › Procesos. Cada barra se coloca con
   su posición y ancho (dato) en % de la noche; los colores son los de estado (--ok-fg, --bad-fg, ...). */
.ui-timeline { margin: 0.75rem 0; }
.ui-timeline-hours { position: relative; height: 1.2rem; margin-left: 12rem; font-size: 0.72rem; color: var(--muted, inherit); }
.ui-timeline-hours span { position: absolute; transform: translateX(-50%); white-space: nowrap; }
.ui-timeline-row { display: flex; align-items: center; gap: 0.5rem; min-height: 1.6rem; border-bottom: 1px solid var(--ui-row-line); }
.ui-timeline-name { flex: 0 0 11.5rem; font-size: 0.82rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ui-timeline-track { position: relative; flex: 1 1 auto; height: 0.9rem; background: var(--ui-zebra); border-radius: 3px; }
.ui-timeline-bar { position: absolute; top: 0; bottom: 0; border-radius: 3px; background: var(--ok-fg); }
.ui-timeline-bar.is-fallo { background: var(--bad-fg); }
.ui-timeline-bar.is-corriendo { background: var(--accent); }
.ui-timeline-bar.is-perdida { background: var(--warn-fg); }
@media (max-width: 700px) {
    .ui-timeline-hours { margin-left: 6.5rem; }
    .ui-timeline-name { flex-basis: 6rem; font-size: 0.75rem; }
}
/* 2026-10-24 (pase visual de Cost Control; skill /pantallas §1d): tarjetas de cifras con su ícono Tabler en un círculo del
   color de lo que cuentan — <div class="stat-cards ui-stat-icons"> y en cada tarjeta <span class="ui-stat-ico ui-tone-ok">.
   El ícono va en su columna a la izquierda: el texto nunca se mete debajo (en celular la tarjeta es angosta). */
.ui-stat-icons .stat-card:has(> .ui-stat-ico) { position: relative; padding-left: 2.75rem; }
.stat-cards.ui-stat-icons { grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr)); }   /* con el ícono, una cifra de monto cabe entera */
.ui-stat-icons .ui-stat-ico { position: absolute; left: 0.45rem; top: 0.45rem; display: inline-flex; align-items: center;
    justify-content: center; width: 1.9rem; height: 1.9rem; border-radius: 50%; color: var(--chart-1);
    background: color-mix(in srgb, currentColor 13%, transparent); }
.ui-stat-icons .ui-stat-ico .ui-ico { width: 1.05rem; height: 1.05rem; }
.ui-stat-icons .ui-stat-ico.ui-tone-ok { color: var(--chart-ok); }
.ui-stat-icons .ui-stat-ico.ui-tone-warn { color: var(--chart-warn); }
.ui-stat-icons .ui-stat-ico.ui-tone-bad { color: var(--chart-bad); }
.ui-stat-icons .ui-stat-ico.ui-tone-neutral { color: var(--neutral-fg); }
/* la línea de detalle debajo de la cifra («en 7 días medidos»): chica, sin robarle peso a la cifra */
.ui-stat-icons .stat-card p.muted { font-size: 0.78rem; line-height: 1.3; margin: 0.15rem 0 0; }
.cc-reasons { color: var(--warn-fg); } .cc-reasons .ui-ico { width: 1rem; height: 1rem; vertical-align: -0.15em; }
/* estado de Cost Control: chip y triángulo en un solo bloque, en un renglón (2026-10-26) */
.cc-estado-in { display: inline-flex; align-items: center; gap: 0.25rem; white-space: nowrap; }
.cc-estado-in .chip { white-space: nowrap; max-width: none; }
/* «Más filtros» (ui.js): los secundarios ocultos hasta abrirlos */
.ui-filters:not(.ui-show-more) .ui-more { display: none; }
.ui-filters [data-more-filters] .ui-ico { transition: transform .15s ease; }
.ui-filters.ui-show-more [data-more-filters] .ui-ico { transform: rotate(180deg); }
/* 2026-10-26 (Angel: «en Liquidación servirían los días como los tienes en Comercial»): renglón de periodo común a los
   tableros (_periodo_menu.html, _cc_periodo.html): calendario, «Filtrar por», botones de periodo, el rango elegido y, a
   la derecha, ocultar gráficas y Paleta. Antes vivía en la plantilla de Comercial. */
.com-period { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 1rem; margin: 0 0 0.6rem; }
.com-period-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 0.3rem; }
.com-chip { display: inline-block; padding: 0.2rem 0.6rem; border: 1px solid var(--border); border-radius: 999px; font-size: 0.8rem;
    background: var(--surface); color: inherit; text-decoration: none; white-space: nowrap; }
main a.com-chip:hover { text-decoration: none; border-color: var(--accent); }
.com-chip.active { background: var(--ui-selected); border-color: var(--accent); color: var(--navy); font-weight: 600; }
.com-chip.com-chip-range { display: inline-flex; align-items: center; gap: 0.3rem; cursor: default; font-weight: 600;
    color: inherit; border-color: color-mix(in srgb, var(--accent) 45%, var(--border));   /* letra como los botones de días (Angel, 2026-10-24) */
    background: color-mix(in srgb, var(--accent) 9%, var(--surface)); font-variant-numeric: tabular-nums; }
.com-chip.com-chip-range .ui-ico { width: 0.95rem; height: 0.95rem; }
.com-period-form { display: flex; flex-wrap: wrap; align-items: center; gap: 0.3rem 0.8rem; margin: 0; font-size: 0.82rem; }
.com-period-form label { display: inline-flex; align-items: center; gap: 0.3rem; }
.com-period-form select { padding: 0.2rem 0.35rem; font: inherit; }
.com-period-form .com-pal-btn { display: inline-flex; align-items: center; gap: 0.45rem; }
.com-period-ico { display: inline-flex; color: var(--accent); }
.com-period-ico .ui-ico, .com-period-form label > .ui-ico { width: 1rem; height: 1rem; }
.com-period-form label > .ui-ico { color: var(--accent); }
.com-period-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; margin-left: auto; }
.com-pal-btn[hidden] { display: none !important; }
/* «Ocultar filtros» (2026-10-26): la barra de filtros es flex y le ganaba al atributo hidden */
[data-filters][hidden] { display: none !important; }