:root{
  --bg:var(--evx-fondo);
  --panel:var(--evx-superficie);
  --panel2:var(--evx-superficie-2);
  --text:var(--evx-texto);
  --muted:var(--evx-apagado);
  --line:var(--evx-borde);
  --accent:var(--evx-acento);
  --warning:var(--evx-alerta);
}
*{box-sizing:border-box}
body{
  margin:0;
  font-family:var(--evx-fuente,Inter,Segoe UI,Arial,sans-serif);
  background:var(--bg);
  color:var(--text);
}
.sidebar{
  position:fixed;
  top:0;left:0;bottom:0;
  width:240px;
  background:var(--evx-fondo);
  border-right:1px solid var(--line);
  padding:22px 16px;
}
.brand{display:flex;gap:12px;align-items:center;margin-bottom:28px}
.brand-mark{
  width:38px;height:38px;border-radius:10px;
  display:grid;place-items:center;
  background:var(--accent);color:var(--evx-fondo);font-weight:800
}
.brand small{display:block;color:var(--muted);margin-top:3px}
nav{display:flex;flex-direction:column;gap:6px}
nav a{
  color:var(--evx-texto-suave);text-decoration:none;
  padding:11px 12px;border-radius:8px
}
nav a:hover, nav a.active{background:var(--panel2);color:white}
.main{margin-left:240px;padding:28px 34px;min-height:100vh}
.topbar h1{margin:0;font-size:28px}
.topbar p{margin:6px 0 24px;color:var(--muted)}
.cards{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:14px;
  margin-bottom:20px
}
.card{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:12px;
  padding:18px
}
.card span{display:block;color:var(--muted);font-size:14px;margin-bottom:8px}
.card strong{font-size:26px}
.card.warning strong{color:var(--warning)}
.panel{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:12px;
  padding:20px;
  margin-bottom:18px
}
.panel-head{display:flex;justify-content:space-between;align-items:center;gap:16px}
.panel h2{margin-top:0}
.muted{color:var(--muted)}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chips span{
  border:1px solid var(--line);
  background:var(--panel2);
  padding:6px 9px;border-radius:999px;
  font-size:12px;color:var(--evx-texto-suave)
}
.table-wrap{overflow:auto}
table{width:100%;border-collapse:collapse}
th,td{padding:12px 10px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
th{color:var(--muted);font-weight:600;font-size:13px}
.empty{text-align:center;color:var(--muted);padding:28px}
.btn{
  border:1px solid var(--line);
  background:var(--panel2);
  color:var(--muted);
  padding:9px 12px;
  border-radius:8px
}
@media (max-width:800px){
  .sidebar{position:static;width:auto}
  .main{margin-left:0}
}

/* === PATCH CATALOGO V2 === */
/* Catálogo */
.form-grid{
  display:grid;
  grid-template-columns:repeat(3,minmax(180px,1fr));
  gap:14px;
}
.form-grid label{
  display:flex;
  flex-direction:column;
  gap:7px;
  color:var(--muted);
  font-size:13px;
}
.form-grid .wide{grid-column:span 2}
/*  `textarea` faltaba en este selector: quedaba con el blanco por
    omisión del navegador y en un tema oscuro se leía como un error.
    Afectaba a Observaciones en obras, presupuestos y todo formulario
    con texto largo. */
input,select,textarea{
  width:100%;
  background:var(--evx-fondo);
  color:var(--text);
  border:1px solid var(--line);
  border-radius:8px;
  padding:10px 11px;
}
textarea{font:inherit;resize:vertical;min-height:64px}
/*  Los enlaces dentro de una tabla tomaban el azul subrayado por omisión
    del navegador —y el morado de visitado—, ilegibles sobre fondo oscuro.
    Estaba parchado suelto en obras.html; aquí aplica a todas las pantallas. */
.table-wrap a{color:var(--evx-acento-claro);text-decoration:none}
.table-wrap a:visited{color:var(--evx-acento-claro)}
.table-wrap a:hover{color:var(--evx-acento-claro);text-decoration:underline;text-underline-offset:2px}


/* === PIEZAS COMPARTIDAS EVEXIA V1 ===
   Estaban sueltas dentro de plantillas individuales; viven aquí para que todas
   las pantallas se vean igual. */

/*  Cifras en tabla: a la derecha y sin partir, para compararlas de un vistazo. */
.table-wrap td.num,.table-wrap th.num{text-align:right;white-space:nowrap}

/*  Semáforo de control (presupuestado vs consumido, existencias, vencimientos). */
.evx-estado{font-weight:700;font-size:.74rem;letter-spacing:.02em;white-space:nowrap}
.evx-estado.es-mal{color:var(--evx-mal)}
.evx-estado.es-alerta{color:var(--evx-alerta)}
.evx-estado.es-bien{color:var(--evx-bien)}

/*  Ficha de datos de sólo lectura. Sustituye a los `input disabled`, que se ven
    editables, se atenúan y no se pueden seleccionar con el cursor. */
.evx-ficha{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));
  gap:14px 22px}
.evx-ficha .wide{grid-column:1/-1}
.evx-ficha dt{color:var(--evx-apagado);font-size:10px;font-weight:800;
  text-transform:uppercase;letter-spacing:.07em;margin-bottom:5px}
.evx-ficha dd{margin:0;color:var(--text);font-size:14px;line-height:1.45}
.evx-ficha dd.vacio{color:var(--muted);font-style:italic}

/*  Tira de indicadores: número grande, etiqueta chica. */
.evx-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
  gap:12px;margin:0}
.evx-kpi{padding:12px 14px;border:1px solid var(--line);border-radius:10px;
  background:var(--evx-superficie);min-width:0}
.evx-kpi-cifra{font-size:1.45rem;font-weight:800;line-height:1.15;
  color:var(--text);white-space:nowrap}
.evx-kpi-etq{margin-top:3px;color:var(--evx-apagado);font-size:10px;font-weight:800;
  text-transform:uppercase;letter-spacing:.06em;line-height:1.3}
.evx-kpi.es-mal .evx-kpi-cifra{color:var(--evx-mal)}
.evx-kpi.es-alerta .evx-kpi-cifra{color:var(--evx-alerta)}
.evx-kpi.es-bien .evx-kpi-cifra{color:var(--evx-bien)}
/*  Panel que abre un botón de la barra de comandos (ver `data-evx-toggle`
    en evexia-ui.js). Empieza cerrado. */
.evx-plegable{display:none}
.evx-plegable.is-open{display:block}
.evx-toggle{cursor:pointer}
/* === FIN PIEZAS COMPARTIDAS EVEXIA V1 === */
.form-actions{
  display:flex;
  align-items:end;
}
.btn-primary{
  border:0;
  background:var(--accent);
  color:var(--evx-fondo);
  font-weight:700;
  padding:10px 14px;
  border-radius:8px;
  cursor:pointer;
}
.search{
  display:flex;
  gap:8px;
  min-width:360px;
}
@media (max-width:900px){
  .form-grid{grid-template-columns:1fr}
  .form-grid .wide{grid-column:auto}
  .search{min-width:0;width:100%}
  .panel-head{align-items:stretch;flex-direction:column}
}

/* === PATCH CANDIDATOS XML V4 === */
.compact-cards .card strong{font-size:22px}
.candidate-list{display:flex;flex-direction:column;gap:12px}
.candidate{
  border:1px solid var(--line);
  background:var(--evx-superficie);
  border-radius:12px;
  padding:16px;
  display:grid;
  grid-template-columns:minmax(0,1fr) 420px;
  gap:18px;
}
.candidate-title{font-weight:700;font-size:16px;margin-bottom:7px}
.candidate-meta{display:flex;gap:12px;flex-wrap:wrap;color:var(--muted);font-size:13px;margin-bottom:9px}
.candidate-actions{display:flex;flex-direction:column;gap:8px}
.candidate-actions form{display:flex;gap:8px}
.candidate-actions select,.candidate-actions input{min-width:0}
.create-resource{display:grid!important;grid-template-columns:1fr 1fr auto;gap:8px}
.suggestion{
  margin-top:10px;padding:9px 10px;border:1px solid var(--evx-acento-hondo);border-radius:8px;background:var(--evx-acento-hondo);
  display:flex;gap:10px;flex-wrap:wrap;align-items:center
}
.suggestion span{color:var(--muted);font-size:12px}
.danger{border-color:var(--evx-mal-borde)!important}
.status-pill{align-self:start;justify-self:end;border:1px solid var(--line);padding:6px 9px;border-radius:999px;color:var(--muted)}
.candidate-search{min-width:620px}
@media(max-width:1100px){
  .candidate{grid-template-columns:1fr}
  .candidate-search{min-width:0}
}

/* === PATCH CLASIFICADOR CANDIDATOS V5 === */
.category-pill{white-space:nowrap;
  display:inline-block;
  margin-left:8px;
  padding:4px 8px;
  border-radius:999px;
  border:1px solid var(--line);
  color:var(--muted);
  font-size:11px;
  vertical-align:middle;
}
.category-pill.material{border-color:var(--evx-acento-hondo);color:var(--evx-acento-claro)}
.category-pill.servicio{border-color:var(--evx-bien-borde);color:var(--evx-bien)}
.category-pill.financiero_otro{border-color:var(--evx-mal-borde);color:var(--evx-alerta)}
.category-pill.revisar{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}
.blocked-note{
  border:1px dashed var(--evx-mal-borde);
  color:var(--evx-alerta);
  border-radius:8px;
  padding:10px;
  font-size:13px;
}
.candidate-search{
  display:grid!important;
  grid-template-columns:180px 190px minmax(240px,1fr) auto;
}
.create-resource{
  grid-template-columns:minmax(130px,1fr) minmax(150px,1fr) minmax(140px,1fr) auto!important;
}
@media(max-width:1200px){
  .candidate-search{grid-template-columns:1fr 1fr}
  .create-resource{grid-template-columns:1fr 1fr!important}
}

/* === PATCH CANDIDATOS V5.1 === */
.candidate-search-v51{
  display:grid!important;
  grid-template-columns:160px 190px 150px 140px minmax(260px,1fr) auto;
  min-width:980px;
}
.pagination{
  display:flex;
  justify-content:center;
  align-items:center;
  gap:14px;
  margin-top:18px;
  color:var(--muted);
}
@media(max-width:1300px){
  .candidate-search-v51{
    min-width:0;
    grid-template-columns:1fr 1fr 1fr;
  }
}

/* === PATCH DEDUPLICACION V6 === */
.group-list{display:flex;flex-direction:column;gap:16px}
.group-card{
  border:1px solid var(--line);
  background:var(--evx-superficie);
  border-radius:12px;
  padding:16px;
}
.group-head{
  display:flex;
  justify-content:space-between;
  gap:16px;
  margin-bottom:12px;
}
.group-head>div:first-child{
  display:flex;
  flex-wrap:wrap;
  gap:10px;
  align-items:center;
}
.group-head span{color:var(--muted);font-size:13px}
.group-confidence{
  border:1px solid var(--evx-acento-hondo);
  color:var(--evx-acento-claro);
  border-radius:999px;
  padding:6px 10px;
  height:max-content;
}
.group-items{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  gap:10px;
  margin-bottom:14px;
}
.group-item{
  border:1px solid var(--line);
  border-radius:8px;
  padding:10px;
  background:var(--evx-fondo);
}
.group-item small{display:block;color:var(--muted);margin-top:4px}
.group-create{
  display:grid;
  grid-template-columns:170px minmax(300px,1fr) 180px 160px auto;
  gap:8px;
  align-items:center;
}
@media(max-width:1200px){
  .group-create{grid-template-columns:1fr 1fr}
}

/* === PATCH DEDUPLICACION V6.2 === */
.tech-attrs{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  margin:8px 0;
}
.tech-attrs span{
  font-size:11px;
  color:var(--evx-acento-claro);
  border:1px solid var(--evx-acento-hondo);
  padding:4px 7px;
  border-radius:999px;
}
.unit-master{
  color:var(--evx-bien)!important;
  border:1px solid var(--evx-bien-borde);
  padding:3px 7px;
  border-radius:999px;
}
.unit-warning{
  color:var(--evx-alerta)!important;
  border:1px solid var(--evx-alerta-borde);
  padding:3px 7px;
  border-radius:999px;
}

/* === PATCH DEDUPLICACION V6.3 === */

/* === PATCH DEDUPLICACION V6.4 === */
.v64-filter{display:grid!important;grid-template-columns:170px 170px auto auto;min-width:650px}
.validation-badge{padding:6px 10px;border-radius:999px;border:1px solid var(--line);font-size:12px;font-weight:700;white-space:nowrap}
.validation-badge.seguro{border-color:var(--evx-bien-borde);color:var(--evx-bien)}
.validation-badge.revisar{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}
.validation-badge.no_unir{border-color:var(--evx-mal-borde);color:var(--evx-mal)}
.validation-reasons{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px 0}
.validation-reasons span{font-size:12px;padding:5px 8px;border-radius:999px;border:1px solid var(--line);color:var(--muted)}
.validation-no_unir{border-color:var(--evx-mal-borde)!important}
.blocked-group{border:1px dashed var(--evx-mal-borde);color:var(--evx-mal);border-radius:8px;padding:12px;text-align:center}
@media(max-width:1000px){.v64-filter{min-width:0;grid-template-columns:1fr 1fr}}

/* === PATCH DEDUPLICACION V6.4.1 === */
.v64-filter{display:grid!important;grid-template-columns:170px 170px auto auto;min-width:650px}
.validation-badge{padding:6px 10px;border-radius:999px;border:1px solid var(--line);font-size:12px;font-weight:700;white-space:nowrap}
.validation-badge.seguro{border-color:var(--evx-bien-borde);color:var(--evx-bien)}
.validation-badge.revisar{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}
.validation-badge.no_unir{border-color:var(--evx-mal-borde);color:var(--evx-mal)}
.validation-reasons{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px 0}
.validation-reasons span{font-size:12px;padding:5px 8px;border-radius:999px;border:1px solid var(--line);color:var(--muted)}
.validation-no_unir{border-color:var(--evx-mal-borde)!important}
.blocked-group{border:1px dashed var(--evx-mal-borde);color:var(--evx-mal);border-radius:8px;padding:12px;text-align:center}
@media(max-width:1000px){.v64-filter{min-width:0;grid-template-columns:1fr 1fr}}

/* === PATCH DEDUPLICACION V6.4.2 === */
.v64-filter{display:grid!important;grid-template-columns:170px 170px auto auto;min-width:650px}
.validation-badge{padding:6px 10px;border-radius:999px;border:1px solid var(--line);font-size:12px;font-weight:700;white-space:nowrap}
.validation-badge.seguro{border-color:var(--evx-bien-borde);color:var(--evx-bien)}
.validation-badge.revisar{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}
.validation-badge.no_unir{border-color:var(--evx-mal-borde);color:var(--evx-mal)}
.validation-reasons{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px 0}
.validation-reasons span{font-size:12px;padding:5px 8px;border-radius:999px;border:1px solid var(--line);color:var(--muted)}
.validation-no_unir{border-color:var(--evx-mal-borde)!important}
.blocked-group{border:1px dashed var(--evx-mal-borde);color:var(--evx-mal);border-radius:8px;padding:12px;text-align:center}
@media(max-width:1000px){.v64-filter{min-width:0;grid-template-columns:1fr 1fr}}

/* === V7 CATALOGO ASISTIDO === */
.v7-search{display:grid!important;grid-template-columns:150px minmax(260px,1fr) 150px auto auto;gap:8px}
.v7-candidate{display:grid;grid-template-columns:minmax(0,1fr) 520px;gap:18px}
.v7-actions{display:flex;flex-direction:column;gap:8px}
.v7-actions form{display:grid;grid-template-columns:1fr auto;gap:8px}
.v7-actions .v7-create{grid-template-columns:160px minmax(220px,1fr) 180px 160px auto}
.v7-suggestion{margin-top:10px;padding:10px 12px;border:1px solid var(--evx-acento-hondo);border-radius:8px;background:var(--evx-superficie);color:var(--evx-acento-claro)}
@media(max-width:1350px){.v7-candidate{grid-template-columns:1fr}.v7-actions .v7-create{grid-template-columns:1fr 1fr}}
@media(max-width:900px){.v7-search{grid-template-columns:1fr 1fr}}

/* === V7.1 PRECARGA CONSERVADORA === */
.v71-head-actions{display:flex;gap:8px;flex-wrap:wrap}
.v71-list{display:flex;flex-direction:column;gap:14px}
.v71-proposal{padding:18px}
.v71-desc{margin:12px 0 4px}
.v71-sources{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:12px 0}
.v71-source{border:1px solid var(--line);border-radius:8px;padding:10px}
.v71-source small{display:block;color:var(--muted);margin-top:3px}
.v71-approve{display:grid;grid-template-columns:180px minmax(280px,1fr) auto;gap:8px;margin-top:12px}
@media(max-width:1050px){
  .v71-sources{grid-template-columns:1fr}
  .v71-approve{grid-template-columns:1fr}
}
.v7-candidate{grid-template-columns:minmax(0,1fr)!important}
.v7-actions{width:100%}
.v7-actions form{width:100%;min-width:0}
.v7-actions select,.v7-actions input{min-width:0;width:100%}
.v7-actions .v7-create{
  grid-template-columns:minmax(140px,180px) minmax(240px,1fr) minmax(160px,220px) minmax(140px,180px) auto!important
}
@media(max-width:1200px){
  .v7-actions .v7-create{grid-template-columns:1fr 1fr!important}
}

/* === V7.2 PRECARGA VALIDADA === */
.v72-filter{display:grid!important;grid-template-columns:160px auto auto auto;gap:8px}
.v72-summary-line{margin:10px 0 14px;color:var(--muted)}
.v72-proposal{padding:18px}
.v72-review-box{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  border:1px dashed var(--evx-alerta-borde);color:var(--evx-alerta);border-radius:8px;padding:12px
}
.validation-badge.aprobar{border-color:var(--evx-bien-borde);color:var(--evx-bien)}
.validation-badge.revisar{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}
.validation-badge.no_unir{border-color:var(--evx-mal-borde);color:var(--evx-mal)}
@media(max-width:900px){
  .v72-filter{grid-template-columns:1fr 1fr}
  .v72-review-box{align-items:flex-start;flex-direction:column}
}

/* === V7.3 VALIDACION SEMANTICA === */
.v73-filter{display:grid!important;grid-template-columns:190px auto auto auto;gap:8px}
.v73-financial-box{
  border:1px dashed var(--evx-alerta-borde);
  color:var(--evx-alerta);
  border-radius:8px;
  padding:12px;
  background:rgba(var(--evx-alerta-rgb),.08)
}
.validation-badge.financiero_otro{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}
@media(max-width:900px){
  .v73-filter{grid-template-columns:1fr 1fr}
}

/* === V7.4 CLASIFICACION COMPLETA === */
.v74-cards{grid-template-columns:repeat(4,minmax(0,1fr))}
.v74-filter{display:grid!important;grid-template-columns:220px auto auto auto;gap:8px}
.v74-expense-box{
  border:1px dashed var(--evx-alerta-borde);color:var(--evx-alerta);border-radius:8px;
  padding:12px;background:rgba(var(--evx-alerta-rgb),.08)
}
@media(max-width:1200px){
  .v74-cards{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media(max-width:900px){
  .v74-cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .v74-filter{grid-template-columns:1fr 1fr}
}

/* === V7.5 VALIDACION COMERCIAL ECONOMICA === */
.v75-cards{grid-template-columns:repeat(3,minmax(0,1fr))}
.v75-filter{display:grid!important;grid-template-columns:190px auto auto auto;gap:8px}
.v75-metrics{
  display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 12px
}
.v75-metrics span{
  border:1px solid var(--line);border-radius:999px;padding:5px 9px;color:var(--muted);font-size:12px
}
@media(max-width:1000px){
  .v75-cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .v75-filter{grid-template-columns:1fr 1fr}
}

/* === V7.7 AUDITORIA FINAL === */

.v77-cards {
    grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* El encabezado nunca puede empujar el panel fuera de pantalla */
.panel-head {
    min-width: 0;
}

.panel-head > * {
    min-width: 0;
}

/* Filtros V7.7 */
.v77-filter {
    display: grid !important;
    grid-template-columns:
        minmax(150px, 0.8fr)
        minmax(220px, 1.5fr)
        minmax(130px, 0.7fr);
    gap: 8px;
    width: 100%;
    max-width: 100%;
    min-width: 0;
}

/* Todos los controles permanecen dentro de su celda */
.v77-filter select,
.v77-filter input,
.v77-filter button,
.v77-filter .btn,
.v77-filter a {
    width: 100%;
    max-width: 100%;
    min-width: 0;
    box-sizing: border-box;
}

/* Botones en segunda fila */
.v77-filter button,
.v77-filter a {
    white-space: nowrap;
}

/* Tarjetas */
.v77-item {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 14px;
    min-width: 0;
}

.v77-item > * {
    min-width: 0;
}

.v77-actions {
    display: flex;
    align-items: center;
}

/* Evita que textos largos provoquen overflow */
.candidate-title,
.candidate-meta,
.validation-reasons,
.v7-suggestion {
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* Pantallas medianas */
@media (max-width: 1200px) {
    .v77-cards {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    .panel-head {
        display: block;
    }

    .v77-filter {
        margin-top: 16px;
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

/* Pantallas pequeñas */
@media (max-width: 800px) {
    .v77-cards {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .v77-filter {
        grid-template-columns: 1fr;
    }

    .v77-item {
        grid-template-columns: 1fr;
    }

    .v77-actions .btn-primary {
        width: 100%;
        text-align: center;
    }
}

/* Móvil */
@media (max-width: 520px) {
    .v77-cards {
        grid-template-columns: 1fr;
    }
}

/* === CATALOGO FINAL LIMPIO === */

.catalog-toolbar{
    display:flex;
    gap:12px;
    align-items:center;
    flex-wrap:wrap;
}
/*  Sin uso desde CATALOGO UX V1: el buscador vive en el encabezado del panel
    y los paneles usan `evx-plegable`. Se conservan por si alguna pantalla
    vieja los pide. */
.catalog-search{
    display:flex;
    gap:8px;
    flex:1 1 600px;
    min-width:280px;
}
.catalog-search input{
    flex:1;
    min-width:0;
}
.catalog-actions{
    display:flex;
    gap:8px;
}

.catalog-collapsible{
    display:none;
}
.catalog-collapsible.open{
    display:block;
}

/* Tabla diaria: SOLO Código | Descripción | Acciones */
.catalog-table-wrap{
    width:100%;
    max-width:100%;
    overflow:visible;
}

table.catalog-table{
    width:100%;
    min-width:0;
    table-layout:fixed;
    border-collapse:collapse;
}

table.catalog-table thead{
    display:table-header-group;
}
table.catalog-table tbody{
    display:table-row-group;
}
table.catalog-table tr.catalog-row{
    display:table-row;
}

table.catalog-table th,
table.catalog-table td{
    display:table-cell !important;
    visibility:visible !important;
    opacity:1 !important;
    vertical-align:middle;
}

/*  === CATALOGO UX V1 (2026-09-06) === Siete columnas, no tres: tipo, unidad,
    familia e inventario ya venían en la consulta y estaban escondidas. Los
    anchos van por posición porque la tabla es `table-layout:fixed`; si se
    agrega una columna, hay que mover estos números.
    2026-09-23: entró «Uso» en la 7ª y «Acciones» se corrió a la 8ª. Familia
    cedió 30 px para que la descripción no se estrechara de más. */
table.catalog-table th:nth-child(1),
table.catalog-table td:nth-child(1){
    width:132px;
    white-space:nowrap;
}

table.catalog-table th:nth-child(2),
table.catalog-table td:nth-child(2){
    width:auto;
}

table.catalog-table th:nth-child(3),
table.catalog-table td:nth-child(3){ width:104px; }

table.catalog-table th:nth-child(4),
table.catalog-table td:nth-child(4){ width:74px; }

table.catalog-table th:nth-child(5),
table.catalog-table td:nth-child(5){ width:120px; }

table.catalog-table th:nth-child(6),
table.catalog-table td:nth-child(6){ width:96px; }

table.catalog-table th:nth-child(7),
table.catalog-table td:nth-child(7){ width:160px; }

table.catalog-table th:nth-child(8),
table.catalog-table td:nth-child(8){
    display:table-cell !important;
    visibility:visible !important;
    opacity:1 !important;
    width:148px;
    min-width:148px;
    white-space:nowrap;
    text-align:right;
}

/*  `th,td{white-space:nowrap}` es global: sólo estas dos envuelven. */
.catalog-table td.cat-desc-v1{white-space:normal;line-height:1.35}
.catalog-table td.cat-tipo-v1{white-space:nowrap}

/*  Buscador dentro del encabezado del panel, como en las demás listas. */
/*  `nowrap` y un ancho flexible: con `wrap` y 240 px fijos, el botón
    «Buscar» se caía a un segundo renglón y el encabezado crecía. */
.cat-buscar-v1{display:flex;gap:8px;align-items:center;flex-wrap:nowrap;margin:0;flex:0 1 auto}
.cat-buscar-v1 input{width:230px;min-width:120px}
.cat-buscar-v1 .btn{text-decoration:none;display:inline-flex;align-items:center}

.cat-aviso-v1{margin:0 0 14px;padding:10px 12px;border-radius:8px;
    border:1px solid var(--evx-alerta-borde);background:rgba(var(--evx-alerta-rgb),.07);
    color:var(--evx-alerta);font-size:.84rem;line-height:1.45}

/*  La cuenta de nombres de proveedor sin vincular: es una señal, no adorno. */
/*  === CATALOGO MAESTRO V1 === la casilla de simular, junto al archivo. */
.cat-simular-v1{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;
    color:var(--muted);font-size:13px}
.cat-simular-v1 input{width:auto;margin:0}
.cat-aviso-maestro-v1{white-space:normal;line-height:1.5}

.cat-candidatos-btn-v1{display:inline-flex;align-items:center;gap:8px;
    text-decoration:none;white-space:nowrap}
.cat-cuenta-v1{display:inline-flex;align-items:center;justify-content:center;
    min-width:22px;height:20px;padding:0 6px;border-radius:999px;
    background:rgba(var(--evx-alerta-rgb),.16);border:1px solid rgba(var(--evx-alerta-rgb),.42);
    color:var(--evx-alerta);font-size:.72rem;font-weight:800}

/*  === REPETIDOS Y USO 2026-09-23 ===
    La liga al gemelo va debajo de la descripción, en chico: es una nota sobre
    el renglón, no una columna más. La columna «Uso» se lee de corrido, así que
    no lleva color: lo que salta es el «—», que es la ficha que se puede
    quitar. */
.cat-repetido-v1{margin-top:3px;font-size:.74rem;color:var(--evx-alerta)}
.cat-repetido-v1 a{color:inherit}
.cat-uso-v1{white-space:nowrap;font-size:.78rem;color:var(--muted)}
.cat-uso-v1 .evx-estado{font-size:.72rem}
.cat-aviso-repetidos-v1{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/*  El paginador, al pie de la tabla y centrado: se usa con la vista puesta en
    el último renglón, no en el encabezado. */
.cat-paginas-v1{display:flex;align-items:center;justify-content:center;gap:12px;
    flex-wrap:wrap;padding:14px 4px 4px;font-size:.84rem;color:var(--muted)}
.cat-paginas-v1 .btn{text-decoration:none}
.cat-paginas-cuenta-v1{font-variant-numeric:tabular-nums}
.cat-paginas-ir-v1{display:inline-flex;align-items:center;gap:6px;margin:0}
.cat-paginas-ir-v1 select{width:auto;min-width:64px}

/*  Catálogos del SAT: cuatro números que dicen para qué sirve cargarlos. Los
    dos de la derecha son fichas TUYAS que no se pueden facturar todavía, así
    que llevan el color de alerta mientras no sean cero. */
.sat-cuentas-v1{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
    gap:12px;padding:4px 4px 14px}
.sat-cuenta-v1{border:1px solid var(--evx-divisor);border-radius:9px;padding:13px 15px}
.sat-cuenta-v1.es-pendiente{border-color:var(--evx-alerta-borde);
    background:rgba(var(--evx-alerta-rgb),.05)}
.sat-cuenta-num-v1{font-size:1.6rem;font-weight:800;font-variant-numeric:tabular-nums;
    line-height:1.1}
.sat-cuenta-v1.es-pendiente .sat-cuenta-num-v1{color:var(--evx-alerta)}
.sat-cuenta-tit-v1{margin-top:2px;font-size:.84rem}
.sat-nota-v1{padding:0 4px 10px;font-size:.8rem;line-height:1.5}

/*  La lista de claves cuelga del campo, así que su `label` tiene que ser el
    origen de coordenadas. */
.cat-bloque-v1 label{position:relative}
.sat-sugerencias-v1{position:absolute;left:0;right:0;top:100%;z-index:120;
    max-height:260px;overflow-y:auto;margin-top:4px;border:1px solid var(--border);
    border-radius:9px;background:var(--evx-superficie);
    box-shadow:0 10px 30px rgba(0,0,0,.28)}
.sat-sug-v1{width:100%;display:flex;gap:10px;align-items:baseline;padding:8px 11px;
    border:0;border-bottom:1px solid var(--border);background:transparent;color:inherit;
    text-align:left;cursor:pointer;font-size:.82rem}
.sat-sug-v1:hover{background:rgba(var(--evx-tinta-rgb),.06)}
.sat-sug-v1 strong{font-variant-numeric:tabular-nums;white-space:nowrap}
.sat-sug-v1 span{color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sat-sug-vacio-v1{padding:9px 11px;font-size:.8rem;color:var(--muted)}

/*  Asignar en lote: la casilla no compite con el código, y «falta» es lo que
    se busca de un vistazo. El bloque de «qué ponerles» va arriba porque se
    decide antes de marcar. */
.lote-que-v1{padding-top:0}
.lote-check-v1{width:38px;text-align:center}
.lote-check-v1 input{width:auto;margin:0}
.lote-falta-v1{color:var(--evx-alerta);font-size:.76rem}

/*  === VIGENCIA DE COTIZACIONES 2026-09-24 === Los dias que faltan, no una
    etiqueta: «vence en 2 dias» informa mas que «por vencer» y no inventa un
    umbral. Lo unico que se pinta de alerta es lo que ya vencio. */
.pres-vigencia-v1{white-space:nowrap;font-size:.8rem}
.pres-vencida-v1{color:var(--evx-alerta);font-weight:600}
.pres-aviso-vencidas-v1{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.pres-vencidas-check-v1{display:inline-flex;align-items:center;gap:7px;margin:0;
    white-space:nowrap;font-size:.84rem}
.pres-vencidas-check-v1 input{width:auto;margin:0}

/*  === ATRIBUTOS Y PRESENTACIONES 2026-09-24 === Dos listas lado a lado
    dentro del renglón que se edita. Son listas, no campos: cada renglón se
    agrega y se quita solo, así que se ven como etiquetas y no como formulario. */
.cat-listas-v1{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));
    gap:18px;padding:14px 4px 4px;border-top:1px solid var(--evx-divisor);margin-top:14px}
.cat-lista-v1{min-width:0}
.cat-lista-tit-v1{font-weight:700;font-size:.82rem;margin-bottom:7px}
.cat-lista-tit-v1 .muted{font-weight:400}
.cat-lista-vacio-v1{margin:0 0 8px;font-size:.8rem}
.cat-chips-v1{list-style:none;margin:0 0 9px;padding:0;display:flex;flex-wrap:wrap;gap:6px}
.cat-chip-v1{display:inline-flex;align-items:center;gap:6px;padding:4px 6px 4px 10px;
    border:1px solid var(--evx-divisor);border-radius:999px;font-size:.78rem}
.cat-chip-v1 form{display:inline}
.cat-chip-x-v1{border:0;background:transparent;color:var(--muted);cursor:pointer;
    font-size:1rem;line-height:1;padding:0 3px}
.cat-chip-x-v1:hover{color:var(--evx-alerta)}
.cat-proponer-v1{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
    margin-bottom:9px;font-size:.79rem;line-height:1.45}
.cat-agregar-v1{display:flex;gap:6px;flex-wrap:wrap}
.cat-agregar-v1 input{width:auto;flex:1 1 90px;min-width:0}
.cat-agregar-v1 .btn{white-space:nowrap}

/*  === FICHA COMPLETA 2026-09-23 === Tres bloques —identidad, ingeniería,
    fiscal— porque son tres oficios. El `fieldset` va sin borde grueso: lo que
    separa es el título y el aire, no una caja dentro de otra caja. */
.cat-ficha-v1{display:flex;flex-direction:column;gap:4px}
.cat-bloque-v1{border:0;border-top:1px solid var(--evx-divisor);margin:0;
    padding:12px 0 2px}
.cat-bloque-v1:first-of-type{border-top:0;padding-top:0}
.cat-bloque-v1 > legend{padding:0 8px 0 0;font-weight:700;font-size:.82rem;
    text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.cat-opcional-v1{margin-left:8px;text-transform:none;letter-spacing:0;
    font-weight:400;font-size:.76rem}
.cat-ficha-v1 small.muted{display:block;margin-top:3px;font-size:.73rem;line-height:1.35}
.cat-falta-fiscal-v1{margin:0 0 12px;padding:9px 12px;border-radius:8px;
    border:1px solid var(--evx-alerta-borde);background:rgba(var(--evx-alerta-rgb),.06);
    color:var(--evx-alerta);font-size:.8rem}

/*  === ASISTENTE DE ALTA 2026-10-02 === Debajo de la descripción, a todo lo
    ancho de la rejilla: las claves de sus facturas y la ficha que propone
    Claude. La tabla lleva `white-space:normal` porque `th,td{nowrap}` es
    global y un concepto largo empujaría la ficha fuera de los 1440 px. */
.cat-asistente-v1{grid-column:1/-1;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.cat-asistente-v1 > .muted{font-size:.76rem}
.cat-asistente-resultado-v1{flex:1 1 100%;min-width:0;padding:10px 12px;border-radius:8px;
    border:1px solid var(--evx-divisor);font-size:.8rem;color:var(--evx-texto)}
.cat-asistente-resultado-v1[hidden]{display:none}
.cat-asistente-resultado-v1 p{margin:0 0 6px}
.cat-asistente-resultado-v1 ul{margin:0;padding-left:18px}
.cat-asistente-titulo-v1{font-weight:700}
.cat-asistente-tabla-v1{width:100%;border-collapse:collapse}
.cat-asistente-tabla-v1 th,.cat-asistente-tabla-v1 td{white-space:normal;padding:4px 6px;text-align:left;
    vertical-align:top;border-top:1px solid var(--evx-divisor)}
.cat-asistente-tabla-v1 .num{text-align:right;font-variant-numeric:tabular-nums}
.cat-asistente-error-v1{color:var(--evx-mal);font-weight:700}
.cat-asistente-origen-v1{display:inline-block;padding:0 6px;border-radius:999px;font-size:.72rem;
    border:1px solid var(--evx-bien-borde);color:var(--evx-bien)}
.cat-asistente-origen-v1.es-dudoso{border-color:var(--evx-alerta-borde);color:var(--evx-alerta)}

/*  Fusionar: las dos fichas lado a lado y la flecha en medio, para que se vea
    de un golpe cuál se queda con qué. La que se va lleva el borde de alerta. */
.fus-par-v1{display:grid;grid-template-columns:1fr auto 1fr;gap:14px;align-items:center;
    padding:4px 4px 16px}
.fus-ficha-v1{border:1px solid var(--evx-divisor);border-radius:9px;padding:13px 15px;
    display:flex;flex-direction:column;gap:4px;min-width:0}
.fus-ficha-v1.es-gana{border-color:var(--evx-acento);
    background:rgba(var(--evx-tinta-rgb),.025)}
.fus-ficha-v1.es-pierde{border-color:var(--evx-alerta-borde);
    background:rgba(var(--evx-alerta-rgb),.05)}
.fus-papel-v1{font-size:.72rem;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.fus-codigo-v1{font-weight:800}
.fus-desc-v1{line-height:1.4}
.fus-flecha-v1{font-size:1.5rem;color:var(--muted)}
/*  Los avisos NO impiden fusionar: dicen en que se esta metiendo. Por eso van
    pegados al boton y con la casilla en medio, no arriba como un letrero mas. */
.fus-avisos-v1{margin:0 4px 12px;padding:10px 13px;border-radius:8px;
    border:1px solid var(--evx-alerta-borde);background:rgba(var(--evx-alerta-rgb),.07);
    color:var(--evx-alerta);font-size:.82rem;line-height:1.5}
.fus-avisos-v1 p{margin:0 0 6px}
.fus-avisos-v1 p:last-child{margin:0}
.fus-confirmar-v1{display:inline-flex;align-items:center;gap:8px;margin:0 4px 10px;
    font-size:.84rem}
.fus-confirmar-v1 input{width:auto;margin:0}
@media(max-width:900px){.fus-par-v1{grid-template-columns:1fr}
    .fus-flecha-v1{transform:rotate(90deg);text-align:center}}

/*  Historial del catálogo: la fecha no se parte y el detalle sí, porque un
    cambio trae «descripción: “…” → “…”» y puede ser largo. */
.hist-fecha-v1{white-space:nowrap;font-variant-numeric:tabular-nums}
.hist-detalle-v1{white-space:normal;line-height:1.45}

/* Fila de edición */
table.catalog-table tr.edit-row{
    display:none !important;
}
table.catalog-table tr.edit-row.open{
    display:table-row !important;
}
.edit-box{
    padding:14px 4px 18px;
}
.edit-title{
    font-weight:700;
    margin-bottom:12px;
}

/* Menú Acciones */
.actions-cell{
    position:relative;
    overflow:visible;
}

.actions-menu{
    display:inline-block;
    position:relative;
}

.actions-menu > summary{
    display:inline-block;
    cursor:pointer;
    list-style:none;
    padding:7px 10px;
    border:1px solid var(--line);
    border-radius:8px;
    white-space:nowrap;
    user-select:none;
}

.actions-menu > summary::-webkit-details-marker{
    display:none;
}

.actions-popover{
    position:absolute;
    right:0;
    top:calc(100% + 6px);
    z-index:9999;
    min-width:140px;
    padding:5px;
    background:var(--panel);
    border:1px solid var(--line);
    border-radius:8px;
    box-shadow:0 10px 26px rgba(0,0,0,.30);
}

.actions-popover button{
    display:block;
    width:100%;
    padding:8px 10px;
    border:0;
    border-radius:6px;
    background:transparent;
    color:inherit;
    text-align:left;
    cursor:pointer;
}

.actions-popover button:hover{
    background:rgba(var(--evx-tinta-rgb),.06);
}

.actions-popover form{
    margin:0;
}

.actions-popover .danger-link{
    color:var(--evx-mal);
}

@media(max-width:800px){
    .catalog-search,
    .catalog-actions{
        width:100%;
    }
    .catalog-actions > *{
        flex:1;
    }
    table.catalog-table th:nth-child(1),
    table.catalog-table td:nth-child(1){
        width:135px;
    }
    table.catalog-table th:nth-child(3),
    table.catalog-table td:nth-child(3){
        width:135px;
        min-width:135px;
    }
}


/* === COMPRAS V1 === */
.oc-add-line{display:grid;grid-template-columns:minmax(300px,2fr) 120px 150px 100px auto;gap:8px;margin-bottom:14px}
.oc-status{font-weight:700;padding:6px 10px;border:1px solid var(--line);border-radius:999px}
.oc-totals{display:grid;gap:8px}
.oc-totals>div:not(.form-actions):not(.oc-comment){display:flex;justify-content:space-between;gap:20px;max-width:480px;margin-left:auto;width:100%}
.oc-totals .grand{font-size:1.12em;padding-top:8px;border-top:1px solid var(--line)}
.oc-comment{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.oc-comment p{white-space:pre-wrap}
@media(max-width:950px){.oc-add-line{grid-template-columns:1fr 1fr}.oc-add-line select{grid-column:1/-1}}


/* === COMPRAS V1.1 ACCIONES === */
.compras-table th:last-child,.compras-table td:last-child{width:145px;text-align:right}
.actions-cell{position:relative;overflow:visible}
.actions-menu{display:inline-block;position:relative}
.actions-menu>summary{list-style:none;cursor:pointer;padding:7px 10px;border:1px solid var(--line);border-radius:8px;white-space:nowrap}
.actions-menu>summary::-webkit-details-marker{display:none}
.actions-popover{position:absolute;right:0;top:calc(100% + 5px);z-index:1000;min-width:150px;padding:5px;background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:0 10px 25px rgba(0,0,0,.28)}
.actions-popover a,.actions-popover button{display:block;width:100%;box-sizing:border-box;border:0;background:transparent;color:inherit;text-align:left;text-decoration:none;padding:8px 10px;border-radius:6px;cursor:pointer;font:inherit}
.actions-popover form{margin:0}
.actions-popover .danger-link{color:var(--evx-mal)}


/* === COMPRAS V1.2 PROYECTO + BUSCADOR RECURSOS === */
.resource-picker{
  position:relative;
  min-width:0;
}
.resource-picker>input[type="text"]{
  width:100%;
  box-sizing:border-box;
}
.resource-results{
  display:none;
  position:absolute;
  left:0;
  right:0;
  top:calc(100% + 5px);
  z-index:2000;
  max-height:340px;
  overflow:auto;
  padding:5px;
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 12px 28px rgba(0,0,0,.30);
}
.resource-results.open{display:block}
.resource-option{
  width:100%;
  grid-template-columns:125px minmax(220px,1fr) 65px;
  gap:10px;
  align-items:center;
  padding:9px 10px;
  border:0;
  border-radius:6px;
  background:transparent;
  color:inherit;
  text-align:left;
  cursor:pointer;
}
.resource-option:hover{
  background:rgba(var(--evx-tinta-rgb),.07);
}
.resource-option span{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.resource-option small{
  text-align:right;
  color:var(--muted);
}
.oc-add-line{
  overflow:visible;
}
@media(max-width:950px){
  .resource-option{
    grid-template-columns:110px 1fr;
  }
  .resource-option small{display:none}
}


/* === COMPRAS V1.3 PRECIO COTIZACION === */
.price-field{
  min-width:0;
}
.price-field>input{
  width:100%;
  box-sizing:border-box;
}
.quote-info{
  margin-top:5px;
  font-size:12px;
  line-height:1.35;
  min-height:16px;
}
.quote-info.loading,
.quote-info.no-quote{
  color:var(--muted);
}
.quote-info.fresh{
  color:var(--evx-bien);
}
.quote-info.stale{
  color:var(--evx-alerta);
}


/* === COMPRAS V1.4 FILTRO ESTADO === */
.compras-filtros{
  display:flex;
  gap:8px;
  flex:1 1 700px;
  min-width:280px;
}
.compras-filtros input{
  flex:1;
  min-width:0;
}
.compras-filtros select{
  min-width:150px;
}
@media(max-width:850px){
  .compras-filtros{
    width:100%;
    flex-wrap:wrap;
  }
  .compras-filtros input{
    flex:1 1 100%;
  }
}


/* === EVEXIA ENV BANNER === */
.evexia-env-banner{
  position:sticky;
  top:0;
  z-index:99999;
  width:100%;
  box-sizing:border-box;
  padding:9px 14px;
  text-align:center;
  font-weight:800;
  letter-spacing:.02em;
  background:var(--evx-alerta);
  color:var(--evx-alerta-fondo);
  border-bottom:1px solid rgba(0,0,0,.25);
}


/* === CATALOGO INVENTARIO V1 === */
.catalog-inventory-badge{
  display:inline-block;
  margin-left:8px;
  padding:2px 7px;
  border:1px solid var(--line);
  border-radius:999px;
  font-size:12px;
  white-space:nowrap;
}


/* === CATALOGO ALTA SIMPLE V1 === */
.catalogo-ac-wrap{position:relative}
.catalogo-autocomplete{
  display:none;position:absolute;left:0;right:0;top:calc(100% + 4px);
  z-index:2000;max-height:320px;overflow:auto;background:var(--evx-superficie);
  border:1px solid var(--evx-borde);border-radius:10px;box-shadow:0 12px 30px rgba(0,0,0,.35)
}
.catalogo-autocomplete.open{display:block}
.catalogo-ac-item{
  width:100%;display:grid;grid-template-columns:120px minmax(0,1fr) 120px;
  gap:10px;align-items:center;text-align:left;padding:10px 12px;
  background:transparent;color:inherit;border:0;border-bottom:1px solid var(--evx-borde);cursor:pointer
}
.catalogo-ac-item:hover{background:var(--evx-superficie-2)}
.catalogo-ac-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.catalogo-ac-item small,.catalogo-ac-empty{color:var(--evx-apagado)}
.catalogo-ac-empty{padding:10px 12px}
#nuevo-recurso-codigo[readonly]{opacity:.8;cursor:not-allowed}
@media(max-width:800px){
  .catalogo-ac-item{grid-template-columns:100px minmax(0,1fr)}
  .catalogo-ac-item small{grid-column:2}
}

/* === OC CABECERA FIJA V2 === */
.oc-command-bar{
  position:sticky;
  top:0;
  z-index:2500;
  width:100%;
  box-sizing:border-box;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:20px;
  padding:14px 18px;
  margin:0 0 16px 0;
  background:rgba(var(--evx-acento-rgb),.97);
  border:1px solid var(--line, var(--evx-borde));
  border-radius:10px;
  box-shadow:0 8px 24px rgba(0,0,0,.22);
  backdrop-filter:blur(10px);
}
.oc-command-title{
  min-width:0;
  display:flex;
  align-items:baseline;
  gap:22px;
}
.oc-command-folio{
  margin:0;
  font-size:2rem;
  line-height:1.1;
  font-weight:800;
  color:var(--text, var(--evx-texto));
  white-space:nowrap;
}
.oc-command-subtitle{
  font-size:1.05rem;
  color:var(--muted, var(--evx-apagado));
  white-space:nowrap;
}
.oc-command-actions{
  margin-left:auto;
  display:flex;
  align-items:center;
  justify-content:flex-end;
  gap:8px;
  flex-wrap:wrap;
}
.oc-inline-form{
  margin:0;
  display:inline-flex;
}
.oc-bottom-save{
  display:flex;
  justify-content:flex-end;
  margin-top:18px;
  padding-top:14px;
}
.oc-save-main{
  min-width:180px;
}
.page-title:empty,
.page-subtitle:empty{
  display:none;
}
@media(max-width:760px){
  .oc-command-bar{
    align-items:flex-start;
    flex-direction:column;
  }
  .oc-command-title{
    flex-direction:column;
    gap:2px;
  }
  .oc-command-actions{
    width:100%;
    justify-content:flex-end;
  }
}


/* === INVENTARIO SALIDAS V1 === */
.salida-add-row{
  display:grid;
  grid-template-columns:minmax(320px,1fr) 170px auto;
  gap:10px;
  align-items:start;
  margin-bottom:8px;
}
.salida-search-wrap{
  position:relative;
}
.salida-sugerencias{
  position:absolute;
  top:calc(100% + 4px);
  left:0;
  right:0;
  z-index:1800;
  border-radius:10px;
  overflow:hidden;
  background:var(--evx-superficie);
  border:1px solid var(--line,var(--evx-borde));
  box-shadow:0 14px 32px rgba(0,0,0,.35);
}
.salida-sugerencia,
.salida-sugerencia-vacia{
  width:100%;
  padding:10px 12px;
  border:0;
  border-bottom:1px solid var(--line,var(--evx-borde));
  background:transparent;
  color:inherit;
  text-align:left;
}
button.salida-sugerencia{
  cursor:pointer;
  display:grid;
  grid-template-columns:140px minmax(220px,1fr) auto;
  gap:12px;
  align-items:center;
}
button.salida-sugerencia:hover{
  background:rgba(var(--evx-tinta-rgb),.05);
}
.salida-sugerencia small{
  color:var(--muted,var(--evx-apagado));
}
.salida-seleccion-info{
  margin:8px 0 14px;
}
@media(max-width:900px){
  .salida-add-row{
    grid-template-columns:1fr;
  }
  button.salida-sugerencia{
    grid-template-columns:1fr;
    gap:3px;
  }
}


/* === INVENTARIO CABECERA + DISPONIBLES V2 === */
.inventario-command-bar{position:sticky;top:0;z-index:2400;width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:20px;padding:14px 18px;margin:0 0 16px 0;background:rgba(var(--evx-acento-rgb),.97);border:1px solid var(--line,var(--evx-borde));border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.22);backdrop-filter:blur(10px)}
.inventario-command-title{display:flex;align-items:baseline;gap:16px;min-width:0}
.inventario-command-heading{font-size:1.8rem;line-height:1.1;font-weight:800;color:var(--text,var(--evx-texto));white-space:nowrap}
.inventario-command-subtitle{color:var(--muted,var(--evx-apagado));font-size:1rem;white-space:nowrap}
.inventario-command-actions{margin-left:auto;display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.disponibles-panel{margin-top:12px}
.disponibles-grid{display:grid;grid-template-columns:140px minmax(220px,1fr) 90px 120px auto;gap:10px;align-items:center}
.disponibles-item{padding:10px 12px;border-top:1px solid var(--line,var(--evx-borde))}
.disponibles-item:first-child{border-top:0}
.disponibles-head{color:var(--muted,var(--evx-apagado));font-size:.92rem;font-weight:600}
@media(max-width:900px){.inventario-command-bar{flex-direction:column;align-items:flex-start}.inventario-command-title{flex-direction:column;gap:2px}.inventario-command-actions{width:100%;justify-content:flex-end}.disponibles-grid{grid-template-columns:1fr}}

/* === PUE SIN COMPROBAR V1 (2026-09-24) === PAGADO no siempre significa que
   salió el dinero: una factura PUE se da por pagada al emitirse. La marca va
   al lado del estado, en ámbar, sin tocar el saldo. */
.cxp-pue-v1{display:inline-flex;margin-left:6px;padding:4px 8px;border-radius:999px;font-size:.7rem;font-weight:800;color:var(--evx-alerta);background:rgba(var(--evx-alerta-rgb),.12);border:1px solid rgba(var(--evx-alerta-rgb),.35)}
/* === FUERA DE COLA V1 (2026-09-24) === Lo saldado y lo cancelado no tienen
   urgencia: el distintivo se apaga en vez de gritar CRITICA. */
.cxp-priority-fuera_de_cola{color:var(--muted,var(--evx-apagado));background:rgba(var(--evx-tinta-rgb),.05)}
/* === CUENTAS POR PAGAR V1 === */
.cxp-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:14px}.cxp-kpis article{padding:16px;border:1px solid var(--line,var(--border,var(--evx-borde)));border-radius:10px;background:var(--panel,var(--evx-superficie))}.cxp-kpis small{display:block;color:var(--muted,var(--evx-apagado));margin-bottom:6px}.cxp-kpis strong{font-size:1.2rem;font-variant-numeric:tabular-nums}.cxp-filters{display:grid;grid-template-columns:minmax(240px,2fr) repeat(3,minmax(140px,1fr)) auto;gap:10px;align-items:end}.cxp-filters label{display:grid;gap:5px;color:var(--muted,var(--evx-apagado));font-size:.8rem}.cxp-filter-actions{display:flex;gap:7px}.cxp-table td:first-child strong,.cxp-table td:first-child small{display:block}.cxp-table td:first-child small{color:var(--muted,var(--evx-apagado));margin-top:3px}.cxp-table td:nth-child(6),.cxp-table td:nth-child(7),.cxp-table td:nth-child(8){text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}.cxp-status{display:inline-flex;padding:4px 8px;border-radius:999px;font-size:.72rem;font-weight:800;border:1px solid var(--border,var(--evx-borde))}.cxp-pendiente{color:var(--evx-alerta);background:rgba(var(--evx-alerta-rgb),.1)}.cxp-parcial{color:var(--evx-acento-claro);background:rgba(var(--evx-acento-rgb),.12)}.cxp-pagado{color:var(--evx-bien);background:rgba(var(--evx-bien-rgb),.12)}.cxp-muted-state{color:var(--muted,var(--evx-apagado))}.cxp-pagination{display:flex;justify-content:center;align-items:center;gap:12px;margin-top:14px}.cxp-detail-toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.cxp-data-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin:0}.cxp-data-grid div{min-width:0}.cxp-data-grid dt{color:var(--muted,var(--evx-apagado));font-size:.76rem;margin-bottom:4px}.cxp-data-grid dd{margin:0;font-weight:650;overflow-wrap:anywhere}.cxp-uuid{font-family:monospace;font-size:.82rem}.cxp-detail-columns{display:grid;grid-template-columns:1fr 1fr;gap:14px}.cxp-evidence{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--border,var(--evx-borde))}.cxp-evidence:last-child{border-bottom:0}.cxp-evidence div strong,.cxp-evidence div small{display:block}.cxp-evidence small{color:var(--muted,var(--evx-apagado));margin-top:3px}.cxp-readonly-note{display:flex;gap:12px;align-items:center}.cxp-readonly-note span{color:var(--muted,var(--evx-apagado))}
@media(max-width:1100px){.cxp-kpis{grid-template-columns:1fr 1fr}.cxp-filters{grid-template-columns:1fr 1fr}.cxp-filter-actions{grid-column:1/-1}.cxp-data-grid{grid-template-columns:1fr 1fr}}
@media(max-width:700px){.cxp-kpis,.cxp-filters,.cxp-data-grid,.cxp-detail-columns{grid-template-columns:1fr}.cxp-filter-actions{grid-column:auto}}
/* === FIN CUENTAS POR PAGAR V1 === */

/* === TRAZABILIDAD CXP V2 === */
.cxp-reconciliation-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.cxp-reconciliation-grid>div{display:flex;flex-direction:column;gap:6px;padding:13px;border:1px solid var(--border,var(--evx-borde));border-radius:9px;background:rgba(var(--evx-tinta-rgb),.018)}
.cxp-reconciliation-grid small,.cxp-reconciliation-grid span{color:var(--muted,var(--evx-apagado))}
.cxp-check{display:inline-flex;align-self:flex-start;padding:4px 8px;border-radius:999px;font-size:.72rem;font-weight:800}
.cxp-check-ok{color:var(--evx-bien);background:rgba(var(--evx-bien-rgb),.12);border:1px solid rgba(var(--evx-bien-rgb),.28)}
.cxp-check-warning{color:var(--evx-alerta);background:rgba(var(--evx-alerta-rgb),.1);border:1px solid rgba(var(--evx-alerta-rgb),.28)}
@media(max-width:900px){.cxp-reconciliation-grid{grid-template-columns:1fr}}
/* === FIN TRAZABILIDAD CXP V2 === */

/* === VENCIMIENTOS CXP V1 === */
.cxp-due-controls{display:grid;grid-template-columns:1.25fr 1fr 1.6fr auto;gap:10px;align-items:end}.cxp-due-controls label,.cxp-due-detail-form label{display:grid;gap:5px;color:var(--muted,var(--evx-apagado));font-size:.8rem}.cxp-due-preview{margin-top:14px;padding:14px;border:1px solid rgba(var(--evx-acento-rgb),.35);border-radius:10px;background:rgba(var(--evx-acento-rgb),.07)}.cxp-due-preview p{color:var(--muted,var(--evx-apagado))}.cxp-due-preview ul{max-height:190px;overflow:auto;padding-left:20px}.cxp-select-cell{width:34px;text-align:center}.cxp-due-detail-form{display:grid;grid-template-columns:minmax(180px,.7fr) minmax(260px,2fr) auto;gap:10px;align-items:end}.cxp-due-filter{min-width:150px}.cxp-due-overdue{color:var(--evx-mal)}.cxp-due-today{color:var(--evx-alerta)}.cxp-due-upcoming{color:var(--evx-bien)}
@media(max-width:900px){.cxp-due-controls,.cxp-due-detail-form{grid-template-columns:1fr}}
/* === FIN VENCIMIENTOS CXP V1 === */

/* === ANTIGUEDAD Y PRIORIDAD CXP V1 === */
.cxp-aging-wrap{margin:14px 0}.cxp-aging-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.cxp-aging-head h2{margin:0}.cxp-aging-head p{margin:4px 0 0}.cxp-aging-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}.cxp-aging-grid article{padding:13px;border:1px solid var(--border,var(--evx-borde));border-radius:10px;background:var(--panel,var(--evx-superficie))}.cxp-aging-grid small,.cxp-aging-grid strong{display:block}.cxp-aging-grid small{color:var(--muted,var(--evx-apagado));margin-bottom:5px}.cxp-aging-grid strong{font-variant-numeric:tabular-nums}.cxp-aging-grid .overdue{border-color:rgba(var(--evx-mal-rgb),.35)}.cxp-aging-grid .undefined{border-color:rgba(var(--evx-alerta-rgb),.28)}.cxp-priority{display:inline-flex;padding:4px 8px;border-radius:999px;font-size:.7rem;font-weight:850;border:1px solid var(--border,var(--evx-borde));white-space:nowrap}.cxp-priority-critica{color:var(--evx-mal);background:rgba(var(--evx-mal-rgb),.14)}.cxp-priority-alta{color:var(--evx-alerta);background:rgba(var(--evx-alerta-rgb),.11)}.cxp-priority-media{color:var(--evx-acento-claro);background:rgba(var(--evx-acento-rgb),.12)}.cxp-priority-normal{color:var(--evx-bien);background:rgba(var(--evx-bien-rgb),.12)}.cxp-priority-por_definir{color:var(--muted,var(--evx-apagado))}.cxp-priority-form{display:grid;grid-template-columns:minmax(170px,.7fr) minmax(280px,2fr) auto auto;gap:10px;align-items:end}.cxp-priority-form label{display:grid;gap:5px;color:var(--muted,var(--evx-apagado));font-size:.8rem}.cxp-days-label{white-space:nowrap;color:var(--muted,var(--evx-apagado));font-size:.78rem}
@media(max-width:1150px){.cxp-aging-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.cxp-priority-form{grid-template-columns:1fr 1fr}}
@media(max-width:700px){.cxp-aging-grid,.cxp-priority-form{grid-template-columns:1fr}}
/* === FIN ANTIGUEDAD Y PRIORIDAD CXP V1 === */

/* === BANDEJA CXP COMPACTA V1 === */
.cxp-compact-wrap{width:100%;max-width:100%;overflow-x:visible!important}
.cxp-compact-table{width:100%;min-width:0!important;table-layout:fixed}
.cxp-compact-table th,.cxp-compact-table td{box-sizing:border-box;min-width:0;vertical-align:middle}
.cxp-compact-table th:nth-child(1){width:4%}.cxp-compact-table th:nth-child(2){width:27%}.cxp-compact-table th:nth-child(3){width:13%}.cxp-compact-table th:nth-child(4){width:7%}.cxp-compact-table th:nth-child(5){width:14%}.cxp-compact-table th:nth-child(6){width:10%}.cxp-compact-table th:nth-child(7){width:16%}.cxp-compact-table th:nth-child(8){width:9%}
.cxp-compact-provider strong,.cxp-compact-provider small{display:block;max-width:100%;overflow-wrap:anywhere;word-break:normal}
.cxp-compact-stack>span,.cxp-compact-amounts>span,.cxp-compact-amounts>strong,.cxp-compact-actions>*{display:block;margin-bottom:4px}
.cxp-compact-stack>small,.cxp-compact-amounts small{display:inline;margin-right:5px;color:var(--muted,var(--evx-apagado));font-size:.68rem}
.cxp-compact-amounts span,.cxp-compact-amounts strong{display:block;max-width:100%;font-variant-numeric:tabular-nums;white-space:nowrap}
.cxp-compact-actions .btn{padding:6px 9px}.cxp-compact-actions small{color:var(--muted,var(--evx-apagado))}
@media(max-width:1100px){.cxp-compact-table th:nth-child(2){width:24%}.cxp-compact-table th:nth-child(3){width:14%}.cxp-compact-table th:nth-child(5){width:15%}.cxp-compact-table th:nth-child(7){width:17%}.cxp-compact-table th:nth-child(8){width:9%}.cxp-compact-table{font-size:.86rem}}
@media(max-width:760px){.cxp-compact-table,.cxp-compact-table tbody{display:block}.cxp-compact-table thead{display:none}.cxp-compact-table tr{display:grid;grid-template-columns:40px 1fr 1fr;gap:10px;padding:12px;margin-bottom:10px;border:1px solid var(--border,var(--evx-borde));border-radius:10px}.cxp-compact-table td{display:block;border:0!important;padding:3px!important;overflow-wrap:anywhere}.cxp-compact-table td:before{content:attr(data-label);display:block;margin-bottom:4px;color:var(--muted,var(--evx-apagado));font-size:.68rem}.cxp-compact-table td:nth-child(2){grid-column:2/4}.cxp-compact-table td:nth-child(7){grid-column:2/3}.cxp-compact-table td:nth-child(8){grid-column:3/4}.cxp-compact-table .empty{grid-column:1/-1}.cxp-select-cell:before{display:none!important}}
/* === FIN BANDEJA CXP COMPACTA V1 === */

/* === AJUSTE ANTI-SOLAPAMIENTO CXP V1.1 === */
.cxp-compact-table th:first-child,.cxp-compact-table td:first-child{overflow:hidden;text-align:center}
.cxp-compact-provider{overflow:hidden;white-space:normal!important}
.cxp-compact-provider strong,.cxp-compact-provider small{width:100%;max-width:100%;white-space:normal!important;overflow-wrap:anywhere!important;word-break:break-word;line-height:1.3}
.cxp-compact-table th:nth-child(1){width:3%}.cxp-compact-table th:nth-child(2){width:28%}
@media(max-width:1100px){.cxp-compact-table th:nth-child(1){width:4%}.cxp-compact-table th:nth-child(2){width:24%}}
/* === FIN AJUSTE ANTI-SOLAPAMIENTO CXP V1.1 === */

/* === PROGRAMACION DE PAGOS V1 === */
.pp-page{display:grid;gap:14px;min-width:0}.pp-panel{padding:16px;min-width:0;overflow:hidden}.pp-panel h2{margin:0 0 12px}.pp-alert{padding:11px 14px;border:1px solid var(--evx-mal);background:rgba(var(--evx-mal-rgb),.14);border-radius:8px;color:var(--evx-mal)}.pp-form-grid,.pp-filter-grid,.pp-add-grid{display:grid;grid-template-columns:repeat(2,minmax(150px,1fr)) minmax(240px,2fr) auto;gap:10px;align-items:end}.pp-filter-grid{grid-template-columns:minmax(190px,2fr) repeat(4,minmax(125px,1fr)) auto auto}.pp-form-grid label,.pp-filter-grid label,.pp-add-grid label{display:grid;gap:5px;min-width:0}.pp-toolbar,.pp-actions{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.pp-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}.pp-kpis article{padding:14px;border:1px solid var(--line,var(--evx-borde));border-radius:9px;background:var(--panel,var(--evx-superficie));min-width:0}.pp-kpis small,.pp-table small{display:block;color:var(--muted,var(--evx-apagado));margin-top:4px}.pp-kpis strong{display:block;overflow-wrap:anywhere}.pp-table{width:100%;table-layout:fixed;border-collapse:collapse}.pp-table th,.pp-table td{padding:10px 8px;border-bottom:1px solid var(--line,var(--evx-borde));vertical-align:middle;overflow-wrap:anywhere}.pp-table th:first-child{width:28%}.pp-table th:last-child{width:82px}.pp-detail-table th:first-child{width:38%}.pp-money{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}.pp-status{display:inline-flex;width:max-content;padding:3px 8px;border:1px solid var(--line,var(--evx-borde));border-radius:999px;font-size:.72rem;font-weight:800}.pp-borrador{color:var(--evx-texto-suave)}.pp-propuesto{color:var(--evx-alerta)}.pp-autorizado{color:var(--evx-bien)}.pp-cancelado{color:var(--evx-mal)}.pp-inline{display:flex;gap:6px;min-width:0}.pp-inline input{min-width:0;width:100%}.pp-add-grid{margin-top:14px;grid-template-columns:minmax(300px,3fr) minmax(130px,1fr) minmax(180px,2fr) auto}.pp-cancel{display:flex;gap:8px}.pp-history article{display:grid;grid-template-columns:160px 180px 1fr;gap:10px;padding:8px 0;border-bottom:1px solid var(--line,var(--evx-borde))}
@media(max-width:1100px){.pp-filter-grid,.pp-form-grid,.pp-add-grid{grid-template-columns:1fr 1fr}.pp-kpis{grid-template-columns:1fr 1fr}.pp-history article{grid-template-columns:1fr}.pp-table{font-size:.9rem}}
@media(max-width:700px){.pp-filter-grid,.pp-form-grid,.pp-add-grid,.pp-kpis{grid-template-columns:1fr}.pp-table thead{display:none}.pp-table,.pp-table tbody,.pp-table tr,.pp-table td{display:block;width:100%}.pp-table tr{padding:10px 0;border-bottom:1px solid var(--line,var(--evx-borde))}.pp-table td{border:0;padding:4px 0;text-align:left}.pp-money{text-align:left}}
/* === FIN PROGRAMACION DE PAGOS V1 === */

/* === PROGRAMACION PAGOS V2 EJECUCION === */
.pp-execution-warning{border:1px solid var(--evx-alerta-borde);padding:12px;border-radius:8px;color:var(--evx-alerta)}.pp-table-wrap{overflow-x:auto;max-width:100%}


/* === CONCILIACION PROGRAMACION PAGOS V3 === */
.ppc-warning{padding:12px 14px;border:1px solid var(--evx-alerta-borde);border-radius:8px;color:var(--evx-alerta);background:rgba(var(--evx-alerta-rgb),.07)}
.ppc-candidates{display:grid;gap:8px;margin:14px 0}.ppc-candidate{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;padding:12px;border:1px solid var(--line,var(--evx-borde));border-radius:8px;cursor:pointer}.ppc-candidate:has(input:checked){border-color:var(--evx-acento-claro);background:rgba(var(--evx-acento-rgb),.1)}.ppc-candidate span strong,.ppc-candidate span small{display:block}.ppc-candidate small{color:var(--muted,var(--evx-apagado));margin-top:3px}.ppc-conciliado{color:var(--evx-bien)}.ppc-pendiente{color:var(--evx-alerta)}
/* === FIN CONCILIACION PROGRAMACION PAGOS V3 === */

/* .notice: modificador de .panel (2026-09-07). `almacenes.html` lo usaba
   —«Almacén creado»— y no existía, así que los tres avisos de esa pantalla
   salían del mismo gris que cualquier panel. */
.panel.notice{border-color:var(--evx-bien-borde);background:var(--evx-bien-fondo)}
.panel.notice strong{font-size:1rem;color:var(--evx-bien)}

/* === CLASES SIN DEFINIR, 2026-09-13 === */
/* Formulario de una línea (caja + botón). Estaba sin definir y los dos que lo
   usan salían en bloque: el botón debajo de la caja. presupuesto_detalle le
   pone flex:1 a su caja contando con esto. */
.inline-form{display:flex;align-items:center;gap:8px}
/* input{width:100%} global: dentro de un flex de ancho automatico la caja se comia
   el renglon y el boton bajaba igual. Ancho propio y que crezca. */
.inline-form input{width:280px;min-width:0;flex:1 1 auto}
/* La celda ancha de la tarjeta de candidato: sin min-width:0 una descripción
   larga estira la rejilla en vez de partirse. */
.candidate-main{min-width:0}
/* Importar catálogo: archivo, casilla y botón en un renglón. */
.upload-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.imp-oc-anio{width:6em}  /* === IMPORTAR OC BIND V1 (2026-09-21) === el año del archivo de Bind */
.upload-row input[type=file]{flex:1 1 320px;min-width:0}


/* === DISEÑO 2026-09-16: LOS SEIS COMPONENTES ===
   Del rediseño de Mauricio en Claude Design (design_handoff_evexia_erp).
   Decisión suya: se portan proporciones, jerarquía y estructura; los colores
   siguen siendo los del tema oscuro. Van al final del archivo a propósito:
   a igual especificidad gana lo que va después, y así redefinen lo que las
   pantallas viejas ya usan (.panel, .card, .btn, table, .evx-kpi) sin tocar
   cada plantilla. Los seis: tarjeta enmarcada, tabla, etiqueta de estado,
   banda de indicadores, botones, campos y segmentado. */
:root{
  --evx-acento-tinte:rgba(var(--evx-acento-rgb),.12);
  --evx-acento-borde:rgba(var(--evx-acento-rgb),.45);
  --evx-divisor:var(--evx-borde);
  --evx-marca-esquina:rgba(var(--evx-tinta-rgb),.55);
}
body{font-size:14px;line-height:1.5}
h1,h2,h3,h4{font-weight:600;letter-spacing:-.005em;line-height:1.15}
.panel h2,.card h2{margin:0 0 4px;font-size:17px}
.panel h3,.card h3{font-size:14px;margin:0 0 4px}
.panel-head p.muted,.panel-head .muted{font-size:12.5px;margin:2px 0 0}

/*  Tarjeta enmarcada («blueprint»): sin relleno, esquina recta, borde de
    1 px y cuatro marcas de registro «+» en las esquinas. Las marcas se
    dibujan con fondos —dos trazos por esquina— para no meter cuatro <i>
    en cada panel de 45 pantallas. Es el contenedor de todo panel. */
.panel,.card,.blueprint{
  position:relative;background:transparent;border:1px solid var(--evx-divisor);border-radius:0;
  background-image:
    linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),
    linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),
    linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),
    linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina)),linear-gradient(var(--evx-marca-esquina),var(--evx-marca-esquina));
  background-repeat:no-repeat;
  background-size:11px 1px,1px 11px, 11px 1px,1px 11px, 11px 1px,1px 11px, 11px 1px,1px 11px;
  background-position:-6px -1px,-1px -6px, calc(100% + 6px) -1px,calc(100% + 1px) -6px, -6px calc(100% + 1px),-1px calc(100% + 6px), calc(100% + 6px) calc(100% + 1px),calc(100% + 1px) calc(100% + 6px);
}
.panel{padding:18px;margin-bottom:18px}
.card{padding:18px;margin-bottom:18px}
.cards .card{margin-bottom:0}
.panel-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:12px}
.card span{font-size:12.5px;margin-bottom:6px}
.card strong{font-size:22px;font-variant-numeric:tabular-nums}

/*  Enlaces: el navegador los pintaba azul eléctrico y subrayados en el
    tema claro (nadie había puesto un `a{}` global: en el oscuro casi no
    se notaba). Acento oscuro, sin subrayar; subrayado al pasar. */
a{color:var(--evx-acento-claro);text-decoration:none}
a:hover{text-decoration:underline}
.btn:hover,.btn-primary:hover,.seg-opt:hover,.evx-nav a:hover,.tag:hover{text-decoration:none}

/*  Tabla: encabezado en mayúsculas chicas con regla inferior, una regla
    de 1 px por renglón, celdas 10 px 14 px; el dato principal 13.5 px. */
table{border-collapse:collapse}
th,td{padding:10px 14px;border-bottom:1px solid rgba(var(--evx-tinta-rgb),.08);font-size:13.5px;vertical-align:top}
th{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--evx-apagado);font-weight:600;
  background:rgba(var(--evx-tinta-rgb),.03);border-bottom:1px solid var(--evx-divisor)}
tbody tr:hover>td{background:rgba(var(--evx-tinta-rgb),.03)}
tfoot td{font-weight:600;border-top:1px solid var(--evx-divisor)}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
.table-wrap{overflow:auto}
.panel>.table-wrap:first-child,.panel>.panel-head+.table-wrap{margin:0}
/*  Tarjeta que es una tabla: sin relleno, con una cabecera de 14 px 16 px
    (título de 17 px y los botones a la derecha) y, si hace falta, la nota
    al pie dentro del mismo marco. Es el patrón de los listados del prototipo. */
.blueprint-tabla{padding:0;margin-bottom:18px}
.blueprint-tabla>.table-wrap{margin:0}
.blueprint-tabla .table{width:100%}
.blueprint-cab{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:14px 16px;border-bottom:1px solid var(--evx-divisor)}
.blueprint-cab h2{margin:0;font-size:17px;flex:1 1 auto;font-weight:600}
.blueprint-cab .blueprint-sub{font-size:12px;color:var(--evx-apagado);flex:1 1 auto}
.blueprint-cab h2+.blueprint-sub{flex:1 1 auto}
.blueprint-cab h2:has(+.blueprint-sub){flex:0 1 auto}
.blueprint-tabla>.nota-pie,.blueprint-tabla>.reqs-vacio,.blueprint-tabla>.empty{padding:14px 16px;margin:0}
.empty{font-size:12.5px;padding:20px}

/*  Etiqueta de estado. Tres variantes con significado fijo:
    neutral = terminado o sin novedad; accent = en curso; outline =
    pendiente, vencido, requiere acción. */
.tag{display:inline-flex;align-items:center;font-size:11px;letter-spacing:.02em;padding:3px 10px;border-radius:0;white-space:nowrap;line-height:1.3}
.tag-neutral{background:rgba(var(--evx-tinta-rgb),.08);color:var(--evx-texto-suave)}
.tag-accent{background:var(--evx-acento-tinte);color:var(--evx-acento-claro)}
.tag-outline{border:1px solid var(--evx-acento);color:var(--evx-acento-claro)}
.tag-mal{border:1px solid rgba(var(--evx-mal-rgb),.6);color:var(--evx-mal)}
.tag-bien{background:rgba(var(--evx-bien-rgb),.14);color:var(--evx-bien)}

/*  Banda de indicadores: rótulo en 10 px mayúsculas con letter-spacing
    .12em, cifra en 22 px con tabular-nums, dentro de un marco. */
.evx-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin:0}
.evx-kpi{padding:0;border:0;background:transparent;min-width:0;display:flex;flex-direction:column}
/*  El rótulo va ARRIBA de la cifra (tira del prototipo) aunque la plantilla
    los escriba al revés: media aplicación los tiene en un orden y media en
    el otro, y reescribir 40 plantillas para eso no vale la pena. */
.evx-kpi-etq{order:0}.evx-kpi-cifra{order:1}.evx-kpi>*:not(.evx-kpi-etq):not(.evx-kpi-cifra){order:2}
.evx-kpi-cifra{font-size:22px;font-weight:600;line-height:1.15;color:var(--text);white-space:nowrap;font-variant-numeric:tabular-nums}
.evx-kpi-etq{margin:0 0 3px;color:var(--evx-acento-claro);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.12em;line-height:1.3}
.evx-kpi-etq a{color:inherit}
.panel.obra-kpis-panel,.evx-kpis-panel{padding:16px 18px}
.kpi-banda{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;padding:16px 18px;margin-bottom:18px}
.kpi-banda>div{min-width:0}
.kpi-banda small{display:block;color:var(--evx-acento-claro);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.12em;white-space:normal}
.kpi-banda strong{display:block;font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;margin-top:4px;line-height:1.15}
.kpi-banda .kpi-nota{color:var(--muted);font-size:11.5px;margin-top:2px;white-space:normal}

/*  Botones. Uno primario por pantalla, al final de lo que se captura. */
.btn,.btn-primary,.btn-secondary,.btn-ghost{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;text-decoration:none;
  font:inherit;font-size:13px;font-weight:600;line-height:1.2;padding:7px 12px;border-radius:0;white-space:nowrap;min-height:34px;
}
.btn,.btn-secondary{border:1px solid var(--evx-divisor);background:transparent;color:var(--text)}
.btn:hover,.btn-secondary:hover{background:rgba(var(--evx-tinta-rgb),.07);border-color:var(--evx-borde-fuerte)}
.btn:active,.btn-secondary:active{background:rgba(var(--evx-tinta-rgb),.14)}
.btn-primary{border:1px solid var(--evx-acento);background:var(--evx-acento);color:var(--evx-fondo)}
.btn-primary:hover{background:var(--evx-acento-claro);border-color:var(--evx-acento-claro)}
.btn-primary:active{background:var(--evx-acento)}
.btn-ghost{border:1px solid transparent;background:transparent;color:var(--evx-acento-claro);padding-inline:4px}
.btn-ghost:hover{background:var(--evx-acento-tinte)}
.btn:disabled,.btn-primary:disabled,.btn-secondary:disabled{opacity:.45;cursor:not-allowed}
.btn.danger,.btn-danger{border-color:rgba(var(--evx-mal-rgb),.5);color:var(--evx-mal)}

/*  Campos y segmentado. La opción por omisión SIEMPRE viene marcada. */
input,select,textarea{border-radius:0;min-height:36px;padding:6px 10px;font:inherit;font-size:14px;background:var(--evx-superficie);border:1px solid var(--evx-divisor);color:var(--text)}
input:hover,select:hover,textarea:hover{border-color:var(--evx-borde-fuerte)}
input:focus-visible,select:focus-visible,textarea:focus-visible{border-color:var(--evx-acento);outline-offset:0}
input[type=checkbox],input[type=radio]{min-height:0;width:auto}
.field{display:flex;flex-direction:column;gap:5px;min-width:0}
.field>label,.field>span{font-size:12px;color:var(--evx-apagado)}
.input{width:100%}
.seg{display:inline-flex;overflow:hidden;border:1px solid var(--evx-divisor);border-radius:0}
.seg-opt{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;font-size:13px;cursor:pointer;color:var(--evx-texto-suave);text-decoration:none;white-space:nowrap}
.seg-opt+.seg-opt{border-left:1px solid var(--evx-divisor)}
.seg-opt input{position:absolute;opacity:0;width:0;height:0;pointer-events:none;min-height:0}
.seg-opt:has(input:checked),.seg-opt.activo{background:var(--evx-acento);color:var(--evx-fondo)}
.seg-opt:not(.activo):not(:has(input:checked)):hover{background:rgba(var(--evx-tinta-rgb),.07)}

/*  Barra de filtros: segmentado y buscador a la izquierda, la acción
    primaria empujada a la derecha. */
.filtros{display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-bottom:18px}
.filtros input[type=search],.filtros .buscador{flex:0 1 240px;min-width:160px}
/*  `input,select{width:100%}` es global: dentro de la barra cada control
    ocupa lo suyo, o cada `select` se lleva un renglón entero. */
.filtros>select,.filtros>input,.filtros>form>select,.filtros>form>input{width:auto;flex:0 1 auto;max-width:260px}
.filtros .filtros-accion{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.filtros form{display:contents}

/*  Nota al pie de un panel: la regla del negocio, en 11.5 px. */
.nota,.nota-pie{margin:8px 0 0;font-size:11.5px;color:var(--evx-apagado);max-width:72ch;text-wrap:pretty;line-height:1.45;white-space:normal}

/*  Barra de avance: 6 px, borde de 1 px, relleno al porcentaje. Ni anillo ni dona. */
.avance{display:inline-flex;align-items:center;gap:8px;min-width:0}
.avance-barra{flex:1 1 90px;height:6px;border:1px solid var(--evx-acento-borde);min-width:60px}
.avance-relleno{height:100%;background:var(--evx-acento)}
.avance-num{font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}

/*  Tarjetas de contexto (patrón de detalle): rejilla de tarjetas de línea
    con grupo, título, cifra, importe y nota; hover con tinte del acento. */
.ctx{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px}
.ctx-grupo{grid-column:1/-1;color:var(--evx-acento-claro);font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.16em;margin-top:6px}
.ctx-tarjeta{display:flex;flex-direction:column;gap:2px;padding:12px 13px;border:1px solid var(--evx-divisor);text-decoration:none;color:inherit;min-width:0}
.ctx-tarjeta:hover{border-color:var(--evx-acento);background:var(--evx-acento-tinte)}
.ctx-tarjeta.es-vacia{opacity:.55}
.ctx-titulo{font-size:13.5px;font-weight:600;white-space:normal}
.ctx-cifra{font-size:19px;font-weight:600;font-variant-numeric:tabular-nums;align-self:flex-end}
.ctx-importe{font-size:12px;font-variant-numeric:tabular-nums;color:var(--evx-texto-suave)}
.ctx-nota{color:var(--evx-apagado);font-size:11px;white-space:normal;line-height:1.3}

/*  La barra de comandos de cada pantalla pasa a ser la cabecera del
    prototipo: título de 22 px, subtítulo de 12.5 px, acciones a la derecha,
    sin sombra ni redondeo. */
.inventario-command-bar{position:sticky;top:var(--evx-topbar,56px);z-index:60;padding:12px 16px;margin:0 0 18px;background:var(--evx-superficie);border:1px solid var(--evx-divisor);border-radius:0;box-shadow:none;backdrop-filter:none}
.inventario-command-heading{font-size:22px;font-weight:600;letter-spacing:.01em}
.inventario-command-subtitle{font-size:12.5px;color:var(--muted)}
.inventario-command-actions .btn,.inventario-command-actions .btn-primary{min-height:34px}
.oc-command-bar{border-radius:0}
.chips span,.category-pill,.status-pill{border-radius:0}
.evx-estado{font-size:11px;letter-spacing:.04em}
/*  Lo que era redondeado deja de serlo: el diseño es de esquina recta. */
.form-grid label,.edit-box,.candidate,.group-card,.disponibles-panel,.cxp-compact-wrap,.evx-dashboard-panel,.evx-kpi-card,.evx-dashboard-hero,.evx-roadmap-item{border-radius:0}
/* === FIN DISEÑO 2026-09-16 === */

/* === BOTONES VISIBLES V1 (2026-09-16) ===
   Mauricio, en el detalle de la orden de compra: «se superpone el título y
   los botones no son muy visibles». Dos causas:
   1) `.oc-command-bar` era la única cabecera que no pasó por el rediseño:
      seguía en azul de acento con el folio en tinta oscura, pegada a
      `top:0` y con `z-index:2500`, por encima del panel flotante del menú
      (120) y de la barra superior (80). Pasa a ser la misma cabecera que
      `.inventario-command-bar`: superficie, bajo la barra superior, z 60.
   2) `.btn` era transparente con un borde del color del divisor: sobre la
      superficie el letrero se perdía. Lleva relleno, borde fuerte, tinta
      plena y peso 700. La primaria gana un borde más oscuro para recortarse
      de la cabecera. Nada de esto cambia el tamaño de los botones. */
.oc-command-bar{position:sticky;top:var(--evx-topbar,56px);z-index:60;padding:12px 16px;margin:0 0 18px;
  background:var(--evx-superficie);border:1px solid var(--evx-divisor);box-shadow:none;backdrop-filter:none}
.oc-command-folio{font-size:24px;font-weight:600;letter-spacing:.01em;color:var(--evx-texto)}
.oc-command-subtitle{font-size:12.5px;color:var(--evx-apagado)}
.oc-command-actions .btn,.oc-command-actions .btn-primary{min-height:34px}
.oc-command-actions .evx-toggle{opacity:1}

.btn,.btn-secondary{background:rgba(var(--evx-tinta-rgb),.05);border-color:var(--evx-borde-fuerte);color:var(--evx-texto);font-weight:700}
.btn:hover,.btn-secondary:hover{background:rgba(var(--evx-tinta-rgb),.11);border-color:var(--evx-texto-suave)}
/*  Va DESPUÉS de `.btn`: hay botones con `class="btn btn-primary"` y a igual peso gana el último. */
.btn-primary{background:var(--evx-acento);color:var(--evx-fondo);font-weight:700;border-color:var(--evx-acento-claro)}
.btn-primary:hover{background:var(--evx-acento-claro);border-color:var(--evx-acento-claro)}
.btn-ghost{font-weight:700}
/*  El segmentador (Activas · Todas · Canceladas) es un botón más: mismo borde fuerte y peso. */
.seg{border-color:var(--evx-borde-fuerte)}
.seg-opt{font-weight:600;color:var(--evx-texto)}
.seg-opt+.seg-opt{border-left-color:var(--evx-borde-fuerte)}
.btn.danger,.btn-danger{background:rgba(var(--evx-mal-rgb),.06)}
/* === FIN BOTONES VISIBLES V1 === */

/* === FOTOS CATALOGO V1 (2026-09-16) ===
   Fotos de los materiales, sólo en pantalla. La miniatura en la lista del
   catálogo, la tira dentro del renglón de edición, y el aviso flotante que
   dibuja evexia-ui.js al pasar el cursor por un elemento con data-evx-foto
   (catálogo, requisición, orden de compra). */
.cat-foto-mini-v1{width:28px;height:28px;object-fit:cover;border:1px solid var(--evx-divisor);vertical-align:middle;margin-right:8px;background:var(--evx-superficie)}
.cat-aviso-error-v1{background:var(--evx-mal-fondo);border:1px solid var(--evx-mal-borde);color:var(--evx-mal)}
.cat-fotos-v1{margin-top:14px;padding-top:12px;border-top:1px solid var(--evx-divisor)}
.cat-fotos-titulo-v1{font-size:12.5px;font-weight:700;margin-bottom:8px}
.cat-fotos-tira-v1{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:10px}
.cat-foto-v1{margin:0;width:120px;display:flex;flex-direction:column;gap:4px}
.cat-foto-v1 img{width:120px;height:120px;object-fit:cover;border:1px solid var(--evx-divisor);display:block;background:var(--evx-superficie)}
.cat-foto-v1.es-principal img{border:2px solid var(--evx-acento)}
.cat-foto-v1 figcaption{display:flex;gap:4px;align-items:center;justify-content:space-between;font-size:11px}
.cat-foto-v1 figcaption form{margin:0;display:inline-flex}
.cat-foto-v1 .btn-ghost{min-height:24px;padding:2px 4px;font-size:11px}
.cat-foto-v1 .btn-ghost.danger{color:var(--evx-mal)}
.cat-fotos-vacio-v1{margin:0;font-size:12px}
.cat-fotos-subir-v1{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.cat-fotos-subir-v1 input[type=file]{width:auto;max-width:360px;font-size:12px}
[data-evx-foto]{cursor:help}
.evx-foto-flotante{position:fixed;z-index:20000;padding:4px;background:var(--evx-superficie);border:1px solid var(--evx-borde-fuerte);
  box-shadow:0 8px 24px rgba(var(--evx-tinta-rgb),.18);pointer-events:none;display:none}
.evx-foto-flotante img{display:block;width:120px;height:120px;object-fit:cover}
/* === FIN FOTOS CATALOGO V1 === */

/* === BOTONES VISIBLES V1 · barra superior (2026-09-17) ===
   Los tres controles de la barra superior («← Volver», «› › Menú», ◐) se
   quedaron con el estilo tenue anterior a BOTONES VISIBLES V1. Misma regla:
   relleno tenue, borde fuerte, tinta plena, peso 700. */
.evx-volver,.evx-rail-mostrar{background:rgba(var(--evx-tinta-rgb),.05);border-color:var(--evx-borde-fuerte);color:var(--evx-texto);font-weight:700;font-size:12.5px;min-height:34px;padding:5px 12px}
.evx-volver:hover,.evx-rail-mostrar:hover{background:rgba(var(--evx-tinta-rgb),.11);border-color:var(--evx-texto-suave);color:var(--evx-texto)}
.evx-tema{background:rgba(var(--evx-tinta-rgb),.05);border-color:var(--evx-borde-fuerte);color:var(--evx-texto)}

/* === NOTAS DE REVISION DEL APU (2026-09-26) === */
.apu-notas-v1{border-left:4px solid var(--border,var(--evx-borde))}
.apu-notas-revisar-v1{border-left-color:var(--evx-alerta);background:rgba(var(--evx-alerta-rgb),.06)}
.apu-notas-texto-v1{white-space:pre-wrap;font-size:.82rem;line-height:1.45;max-height:340px;overflow:auto}
/*  La descripción del concepto del cliente mide 600 caracteres: sin esto la
    barra superior empujaba la página a 3,000 px. */
.apu-subtitulo-v1{white-space:normal;overflow-wrap:anywhere}
.apu-desc-v1{white-space:normal;min-width:260px;max-width:520px}
.apu-fuente-v1{margin-top:4px;font-size:.72rem;color:var(--muted,var(--evx-apagado));white-space:pre-wrap;overflow-wrap:anywhere;max-width:520px}
/* === GESTION DEL APU (2026-09-26) === datos, inhabilitar y eliminar en la ficha. */
.apu-uso-v1{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--evx-texto-suave);white-space:nowrap}
.apu-aviso-v1{margin:0 0 14px;padding:10px 14px;border-radius:10px;border:1px solid rgba(var(--evx-bien-rgb),.35);background:rgba(var(--evx-bien-rgb),.10);color:var(--evx-bien);font-size:13.5px}
.apu-aviso-error-v1{border-color:rgba(var(--evx-mal-rgb),.38);background:rgba(var(--evx-mal-rgb),.10);color:var(--evx-mal)}
.apu-gestion-v1{padding:12px 16px}
.apu-gestion-v1>summary{cursor:pointer}
.apu-gestion-nota-v1{margin:10px 0}
.apu-gestion-form-v1{display:grid;grid-template-columns:minmax(140px,.8fr) minmax(260px,2.4fr) minmax(140px,.8fr) minmax(120px,.7fr) auto;gap:12px;align-items:end;margin-top:12px}
.apu-campo-v1{display:flex;flex-direction:column;gap:6px;min-width:0}
.apu-campo-v1>span{color:var(--evx-apagado);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.08em}
.apu-campo-v1 input,.apu-campo-v1 select{width:100%}
.apu-gestion-acciones-v1{display:flex;flex-direction:column;gap:8px;margin-top:14px}
.apu-gestion-acciones-v1 form{display:flex;gap:10px;align-items:center}
.apu-eliminar-v1{color:var(--evx-mal);border-color:rgba(var(--evx-mal-rgb),.5)}
@media(max-width:1100px){.apu-gestion-form-v1{grid-template-columns:1fr 1fr}}
.apu-gestion-ancho-v1{min-width:260px}
/* === LA MATRIZ COMO LA PIDE EL REGLAMENTO (2026-10-13) === la ficha del APU en secciones con su
   fórmula (Reglamento de la LOPSRM), el rendimiento de la mano de obra y la maquinaria, los básicos
   y el historial de cada cambio. */
.apu-duplicar-v1{display:flex;gap:12px;align-items:end;flex-wrap:wrap;margin-top:14px}
.apu-agregar-v1{display:grid;grid-template-columns:1fr 1fr;gap:22px}
.apu-agregar-v1 h3{margin:0;font-size:14px}
@media(max-width:1200px){.apu-agregar-v1{grid-template-columns:1fr}}
.apu-tabla-v1 td{vertical-align:top}
.apu-tabla-v1 input[type=number]{width:92px;min-width:72px}
.apu-num-v1{text-align:right;font-variant-numeric:tabular-nums}
.apu-seccion-v1 td{background:rgba(var(--evx-tinta-rgb),.045);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;padding-top:9px;padding-bottom:9px}
.apu-formula-v1{margin-left:12px;font-size:12px;font-weight:600;text-transform:none;letter-spacing:0;color:var(--evx-apagado)}
.apu-subtotal-v1 td{border-top:1px solid var(--line);font-weight:700;color:var(--evx-texto-suave)}
.apu-rinde-v1{display:block;margin-top:3px;font-size:11px;color:var(--evx-apagado);white-space:nowrap}
.apu-hoy-v1{margin-top:6px;font-size:12px;color:var(--evx-alerta);white-space:normal}
.apu-hoy-v1 form{display:inline;margin-left:6px}
.apu-proveedor-v1{display:block;margin-top:6px;max-width:300px}
.apu-acciones-v1{display:flex;gap:6px;align-items:center;white-space:nowrap}
.apu-acciones-v1 form{margin:0}
.apu-quitar-v1{color:var(--evx-mal);border-color:rgba(var(--evx-mal-rgb),.45)}
.apu-cuenta-v1{max-width:560px;margin-left:auto}
.apu-cuenta-v1>div{display:flex;justify-content:space-between;gap:16px;padding:6px 0}
.apu-cuenta-v1>.apu-cuenta-total-v1{padding:10px 0;border-top:1px solid var(--border)}
.apu-historial-v1{padding:12px 16px}
.apu-historial-v1>summary{cursor:pointer}
.apu-historial-v1 table{margin-top:10px}
.apu-hist-texto-v1{white-space:normal;min-width:180px;max-width:380px}
.apu-hist-fecha-v1{white-space:normal;min-width:88px;font-variant-numeric:tabular-nums}
/* === INSUMOS DE LOS APU (2026-10-13, fase 2) === su costo, a qué precio los traen los APU, llevarlo y
   el impacto de cada cambio. */
.apu-kpis-v1{margin-bottom:16px}
.apu-kpi-texto-v1{font-size:1rem}
.apu-filtros-v1{display:flex;gap:12px;align-items:end;flex-wrap:wrap;margin-bottom:14px}
.apu-grupos-v1{border:1px solid var(--line);border-radius:10px;padding:10px 14px;margin:0}
.apu-grupos-v1>legend{padding:0 6px;font-weight:700}
.apu-grupo-v1{display:block;padding:6px 0;white-space:normal;line-height:1.45}
.apu-grupo-v1 input{margin-right:6px}
.apu-nivel-v1{white-space:nowrap}
.apu-ultimo-v1{white-space:normal;min-width:180px;max-width:300px}
/* === SALARIO REAL (2026-10-13, fase 3) === el desglose de Ps por ramo, debajo de su cifra. */
.apu-desglose-v1{margin-top:4px;font-size:12px;text-align:left}
.apu-desglose-v1>summary{cursor:pointer;color:var(--evx-apagado)}
.apu-desglose-v1 td{padding:2px 6px;white-space:normal}
/* === SOBRECOSTO DE LA OBRA (2026-10-13, fase 6) === los gastos del art. 213 con su importe de oficina
   central y de campo: los importes en su columna y la nota en lo que queda de ancho. */
.sob-tabla-v1 td{vertical-align:middle;padding-top:4px;padding-bottom:4px}
.sob-tabla-v1 input[type=number],.sob-tabla-v1 input[type=text]{min-height:30px;padding:4px 8px}
.sob-tabla-v1 input[type=number]{width:132px;text-align:right}
.sob-tabla-v1 input[type=text]{width:100%;min-width:200px}
.sob-agregar-v1{margin-top:14px}
.sob-agregar-v1>summary{cursor:pointer;font-weight:600}
/* Fase 7: cada factor en su sección plegable, con su resultado en el título; las casillas de «Aplicar» en un renglón. */
.sob-seccion-v1{padding:14px 18px}
.sob-seccion-v1>summary{cursor:pointer;font-size:14px;line-height:1.5}
.sob-seccion-v1>summary~*{margin-top:12px}
.sob-aplicar-v1{display:flex;gap:4px 22px;align-items:center;flex-wrap:wrap;margin-top:12px}
.sob-aplicar-v1 .form-actions{margin:0}
/* === CAPÍTULOS EN NIVELES (2026-10-13, fase 5) === el subcapítulo, con sangría bajo su capítulo. */
.pres-cap-n2{display:inline-block;padding-left:18px}
.pres-cap-n3{display:inline-block;padding-left:36px}
/* === MATRICES PARAMÉTRICAS (2026-10-13, fase 9) === la fórmula de cada renglón, ancha para leerse entera. */
.apu-formula-campo-v1{width:100%;min-width:220px;font-family:monospace}
/* === DOCUMENTOS DE LA PROPUESTA (2026-10-13, fase 8) === el subtítulo de la barra va en un renglón (nowrap): uno
   largo se metía debajo de los botones; éste se corta con «…». */
.apu-sub-corto-v1{min-width:0;overflow:hidden;text-overflow:ellipsis}
.apu-acciones-fijas-v1{flex-shrink:0}

/* === USO Y NOMBRES DEL CATALOGO 2026-09-26 === /catalogo/{id}/uso y
   /catalogo/nombres: qué documentos usan una ficha y los nombres de Bind que
   no son los de sus órdenes. */
.uso-error-v1{border-color:var(--evx-mal-borde);background:var(--evx-mal-fondo);color:var(--evx-mal)}
.uso-textos-v1{display:flex;flex-direction:column;gap:8px;padding:0 16px 16px}
.uso-textos-v1 .inline-form input{max-width:620px}
.uso-fecha-v1{white-space:nowrap;font-variant-numeric:tabular-nums}
.nom-tabla-v1 td{vertical-align:top}
.nom-tabla-v1 .inline-form input{width:340px}
.cat-uso-v1 a.evx-estado{text-decoration:none}
.cat-uso-v1 a.evx-estado:hover{text-decoration:underline}

/* === REVISION DE CANDIDATOS 2026-09-27 === Volver a la lista con sus
   filtros y saltar al siguiente, juntos. */
.cd-navegar-v1{display:flex;gap:8px;flex-wrap:wrap}

/* === CONTINUIDAD 2026-09-27 === La barra de arriba es fija: sin esto, el
   renglón al que regresa una acción (#partida-12, #gto-5) quedaba tapado. */
html{scroll-padding-top:84px}
.cc-buscar-v1{grid-column:1/-1}

/* === PROSPECTOS 2026-10-14 === El prospecto nuevo dentro del alta de una obra o
   de una cotización a cliente (`_prospecto_nuevo.html`), y el aviso de esas altas. */
.prospecto-nuevo{grid-column:1/-1;border:1px dashed var(--evx-borde-fuerte);border-radius:8px;padding:10px 14px;
  background:var(--evx-superficie)}
.prospecto-nuevo summary{cursor:pointer;font-weight:600;font-size:13px}
.prospecto-campos{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-top:10px}
.prospecto-campos label{display:flex;flex-direction:column;gap:7px;font-size:13px;color:var(--muted)}
.prospecto-nota{margin:10px 0 0;font-size:12.5px}
.prospecto-aviso{margin:0 0 14px;padding:10px 14px;border-radius:8px;font-size:13.5px;white-space:normal}
.prospecto-aviso.es-ok{background:var(--evx-bien-fondo);border:1px solid var(--evx-bien-borde)}
.prospecto-aviso.es-error{background:var(--evx-mal-fondo);border:1px solid var(--evx-mal-borde)}
