/* Tu-Ing — estilos de la aplicación */
:root{color-scheme:light;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}html{scroll-padding-top:env(safe-area-inset-top,0px)}body{margin:0;padding:0;font:14px -apple-system,BlinkMacSystemFont,sans-serif;background:#f4f4f4;color:#141413}img{max-width:100%}[hidden]:not([hidden=until-found i]){display:none!important}

  :root{
    --bg:#f4f4f4; --surface:#ffffff; --surface-2:#efefef; --border:#dcdcdc;
    --text:#1a1a1a; --text-muted:#666666;
    --accent:#8b1e24; --accent-strong:#6e171c; --on-accent:#ffffff;
    --lvl1:#1a1a1a; --lvl2:#8b1e24; --lvl3:#555555; --lvl4:#4d4d4d; --lvl5:#777777; --lvl6:#666666;
    --lvl1-bg:#ececec; --lvl2-bg:#f7ecec; --lvl3-bg:#f3f3f3; --lvl4-bg:#f2f2f2; --lvl5-bg:#f5f5f5; --lvl6-bg:#f5f5f5;
    --good:#3e6b48; --good-bg:#eaf1ea; --warn:#a8741a; --warn-bg:#f8f0de; --bad:#b3261e; --bad-bg:#fbe9e7;
    --mo:#2f6f9e; --mt:#6a4fa0; --eq:#3f8f7a; --sc:#a05a3f;
    --mo-bg:#e7f0f7; --mt-bg:#efe9f6; --eq-bg:#e6f3ef; --sc-bg:#f5ebe4;
    --radius:10px; --radius-sm:7px;
    --shadow:0 1px 2px rgba(20,20,15,.07), 0 6px 18px rgba(20,20,15,.06);
    --font-ui:'IBM Plex Sans',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
    --font-num:'IBM Plex Sans',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
    --logo-url:url('logo.png');
    color-scheme: light;
  }
  *{box-sizing:border-box;}
  body{ background:var(--bg); color:var(--text); font-family:var(--font-ui); padding-inline:0;
    font-variant-numeric:lining-nums tabular-nums; font-feature-settings:'tnum' 1, 'lnum' 1; -webkit-font-smoothing:antialiased; }
  h1,h2,h3,h4{ font-family:var(--font-ui); font-weight:600; letter-spacing:-.005em; text-wrap:balance; margin:0; }
  table{ border-collapse:collapse; width:100%; }
  .num{ font-family:var(--font-num); font-variant-numeric:tabular-nums; white-space:nowrap; }
  button{ font-family:var(--font-ui); cursor:pointer; }
  input,select,textarea{ font-family:var(--font-ui); }
  /* Sin flechas (spinners) en ningún campo numérico de la app */
  input[type="number"]{ -moz-appearance:textfield; appearance:textfield; }
  input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button{ -webkit-appearance:none; appearance:none; margin:0; }
  input[data-val-item][type="number"]{ -moz-appearance:textfield; }
  input[data-val-item][type="number"]::-webkit-outer-spin-button, input[data-val-item][type="number"]::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }
  input[data-metrado-item][type="number"]{ -moz-appearance:textfield; }
  input[data-metrado-item][type="number"]::-webkit-outer-spin-button,
  input[data-metrado-item][type="number"]::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }
  a{ color:var(--accent); }

  /* ---------- App shell ---------- */
  #app-shell{ min-height:100%; display:flex; flex-direction:column; }
  header.topbar{
    position:sticky; top:env(safe-area-inset-top,0px); z-index:40;
    background:var(--surface); border-bottom:1px solid var(--border);
    display:flex; align-items:center; gap:18px; padding:10px 20px; flex-wrap:wrap;
  }
  .brand{ display:flex; align-items:center; gap:9px; font-weight:800; font-size:17px; letter-spacing:.2px; white-space:nowrap; }
  /* Logo de marca (STEVEN): incrustado como fondo (data URI) para que el .html siga siendo un
     solo archivo autocontenido, sin depender de un <img src> ni de un archivo aparte. */
  .brand-logo{ display:inline-block; width:117px; height:29px; background-image:var(--logo-url);
    background-repeat:no-repeat; background-position:left center; background-size:contain; flex:none; }
  nav.maintabs{ display:flex; gap:4px; flex-wrap:wrap; }
  nav.maintabs button, nav.maintabs a{
    background:transparent; border:1px solid transparent; color:var(--text-muted); font-weight:600; font-size:13.5px;
    padding:7px 12px; border-radius:999px; text-decoration:none; display:inline-flex; align-items:center;
  }
  nav.maintabs button:hover, nav.maintabs a:hover{ color:var(--text); background:var(--surface-2); }
  /* Pestaña seleccionada (Presupuestos / Insumos / Catálogo de partidas): sombreada en rojo */
  nav.maintabs button[aria-current="true"]{ background:var(--accent); color:#fff; border-color:var(--accent); box-shadow:0 2px 6px rgba(139,30,36,.25); }
  nav.maintabs button[aria-current="true"]:hover{ background:var(--accent-strong); color:#fff; }
  .topbar-right{ margin-left:auto; display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
  .status-pill{ display:flex; align-items:center; gap:6px; font-size:12px; color:var(--text-muted); padding:5px 10px;
    border:1px solid var(--border); border-radius:999px; background:var(--surface-2); white-space:nowrap; }
  .status-dot{ width:7px; height:7px; border-radius:50%; background:var(--good); flex:none; }
  .status-pill.local .status-dot{ background:var(--warn); }
  #who{ width:118px; font-size:12.5px; padding:6px 9px; border-radius:999px; border:1px solid var(--border); background:var(--surface); color:var(--text); }

  main#view{ flex:1; padding:20px; padding-inline: max(16px, env(safe-area-inset-left,0px)) max(16px, env(safe-area-inset-right,0px)); }
  .wrap{ max-width:1180px; margin:0 auto; display:flex; flex-direction:column; gap:18px; }

  /* ---------- generic bits ---------- */
  .banner{ display:flex; gap:10px; align-items:flex-start; padding:11px 14px; border-radius:var(--radius-sm); font-size:13px; line-height:1.5; }
  .banner.info{ background:var(--surface-2); color:var(--text-muted); border:1px solid var(--border); }
  .banner.good{ background:var(--good-bg); color:var(--good); }
  .banner.warn{ background:var(--warn-bg); color:var(--warn); }
  .banner.bad{ background:var(--bad-bg); color:var(--bad); }
  .card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--radius); box-shadow:var(--shadow); }
  .btn{ display:inline-flex; align-items:center; gap:6px; border:1px solid var(--border); background:var(--surface);
    color:var(--text); padding:8px 13px; border-radius:8px; font-size:13.5px; font-weight:600; }
  .btn:hover{ background:var(--surface-2); }
  .btn.primary{ background:var(--accent); border-color:var(--accent); color:var(--on-accent); }
  .btn.primary:hover{ background:var(--accent-strong); border-color:var(--accent-strong); }
  .btn.ghost{ border-color:transparent; background:transparent; }
  .btn.ghost:hover{ background:var(--surface-2); }
  .btn.danger{ color:var(--bad); }
  .btn.sm{ padding:5px 9px; font-size:12.5px; border-radius:7px; }
  .btn[disabled]{ opacity:.5; cursor:default; }
  .icon-btn{ width:28px; height:28px; display:inline-flex; align-items:center; justify-content:center; border-radius:7px; border:1px solid transparent; background:transparent; color:var(--text-muted); }
  .icon-btn:hover{ background:var(--surface-2); color:var(--text); }
  .row{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
  .grow{ flex:1; }
  .field{ display:flex; flex-direction:column; gap:4px; }
  .field label{ font-size:11.5px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:var(--text-muted); }
  .field input, .field select, .field textarea{
    padding:8px 10px; border-radius:7px; border:1px solid var(--border); background:var(--surface); color:var(--text); font-size:13.5px; width:100%;
  }
  .field textarea{ resize:vertical; min-height:60px; }
  .tag{ font-size:11px; font-weight:700; padding:2px 7px; border-radius:5px; letter-spacing:.02em; }
  .tag.MO{ background:var(--mo-bg); color:var(--mo); } .tag.MT{ background:var(--mt-bg); color:var(--mt); }
  .tag.EQ{ background:var(--eq-bg); color:var(--eq); } .tag.SC{ background:var(--sc-bg); color:var(--sc); }
  .muted{ color:var(--text-muted); }
  .right{ text-align:right; }
  /* Encabezados alineados con los datos de su columna (el th por defecto va a la izquierda y
     ganaba a .right por especificidad; así "Cantidad", "Precio", "Parcial"… quedan sobre sus números). */
  table.data th.right, table.data td.right{ text-align:right; }
  table.data th.center, table.data td.center{ text-align:center; }
  /* APU para impresión: mismo ancho de columnas en todas las hojas para que queden alineadas */
  table.apu-print-table{ width:100%; table-layout:fixed; }
  table.apu-print-table td, table.apu-print-table th{ overflow-wrap:anywhere; }
  /* Los encabezados de columna (Cuadrilla, Cantidad, Precio, Parcial) nunca se parten en dos
     renglones: así cada rótulo queda en una sola línea, alineado sobre los números de su columna. */
  table.data.apu-print-table thead tr:not(.apu-print-titlerow) th{ white-space:nowrap; overflow-wrap:normal; }
  .apu-print-item .table-scroll > table.apu-print-table{ min-width:600px; }
  .table-scroll{ overflow-x:auto; }
  table.data{ font-size:13px; }
  table.data th{ text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:.05em; color:var(--text-muted);
    padding:9px 10px; border-bottom:1px solid var(--border); white-space:nowrap; }
  table.data td{ padding:8px 10px; border-bottom:1px solid var(--border); vertical-align:middle; }
  table.data tr:last-child td{ border-bottom:none; }
  table.data tbody tr:hover{ background:var(--surface-2); }
  .empty{ padding:34px 20px; text-align:center; color:var(--text-muted); font-size:13.5px; }
  .empty .big{ font-size:26px; margin-bottom:6px; }
  .pagehead{ display:flex; justify-content:space-between; align-items:flex-end; gap:14px; flex-wrap:wrap; }
  .pagehead h1{ font-size:21px; }
  .pagehead p{ margin:4px 0 0; color:var(--text-muted); font-size:13px; }
  .search{ display:flex; align-items:center; gap:7px; border:1px solid var(--border); border-radius:8px; padding:6px 10px; background:var(--surface); }
  .search input{ border:none; outline:none; background:transparent; font-size:13.5px; width:180px; color:var(--text); }
  .chipset{ display:flex; gap:6px; flex-wrap:wrap; }
  .cv-table tfoot td{ border-top:1px solid var(--border); background:var(--surface-2); }
  /* Cronograma valorizado: cada columna separada con línea vertical para distinguirlas */
  table.cv-table{ border-collapse:collapse; border:1px solid var(--border); }
  table.cv-table th, table.cv-table td{ border-left:1px solid var(--border); border-right:1px solid var(--border); }
  table.cv-table th.cv-parcial, table.cv-table td.cv-parcial{ border-right:2px solid var(--text-muted); }
  @media print{
    table.cv-table th, table.cv-table td{ border:1px solid #777 !important; }
    table.cv-table th.cv-parcial, table.cv-table td.cv-parcial{ border-right:2px solid #000 !important; }
  }
  .cv-table tfoot tr.cv-strong td{ font-weight:700; }
  .chip{ border:1px solid var(--border); background:var(--surface); padding:5px 11px; border-radius:999px; font-size:12.5px; font-weight:600; color:var(--text-muted); }
  .np-seccion{ display:flex; align-items:center; gap:10px; padding:9px 12px; border-radius:var(--radius-sm); background:var(--accent); color:var(--on-accent); font-weight:800; font-size:14.5px; letter-spacing:.2px; }
  .np-num{ display:inline-flex; align-items:center; justify-content:center; width:24px; height:24px; border-radius:50%; background:var(--on-accent); color:var(--accent-strong); font-size:13px; font-weight:800; flex:none; }
  .icon-btn:disabled{ opacity:.25; cursor:default; }
  mark{ background:#e53935; color:#fff; padding:0 1px; border-radius:2px; }
  .chip[aria-current="true"]{ background:var(--text); color:var(--bg); border-color:var(--text); }

  /* budget cards grid */
  .grid-cards{ display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:14px; }
  .budget-card{ padding:16px; display:flex; flex-direction:column; gap:10px; cursor:pointer; }
  .budget-card:hover{ border-color:var(--accent); }
  .budget-card h3{ font-size:15px; }
  .budget-card .meta{ font-size:12px; color:var(--text-muted); }
  .budget-card .total{ font-size:19px; font-weight:800; font-family:var(--font-num); margin-top:auto; }
  .budget-card .stat-row{ display:flex; justify-content:space-between; font-size:12px; color:var(--text-muted); }

  /* ---------- Presupuesto abierto: panel con nombre, acciones y pestañas ----------
     Pantalla ancha: panel fijo a la izquierda (queda a la vista al bajar) con las pestañas en lista.
     Pantalla angosta: el mismo panel va arriba, con las pestañas en una sola fila deslizable. */
  .pres-main{ min-width:0; display:flex; flex-direction:column; gap:18px; }
  .pres-side{ display:flex; flex-direction:column; gap:8px; }
  .pres-side-top{ display:flex; align-items:center; gap:6px; }
  .pres-side-toggle{ display:none; }
  .pres-side-back{ background:none; border:none; color:var(--accent); font-weight:700; font-size:13px; padding:0; }
  .pres-side-info h1{ font-size:19px; line-height:1.25; }
  .pres-side-info p{ margin:3px 0 0; color:var(--text-muted); font-size:12.5px; }
  .pres-side-acciones{ display:flex; flex-wrap:wrap; gap:6px; }
  .pres-side-acciones .btn{ padding:6px 10px; font-size:12.5px; }
  .pres-tabs{ display:flex; gap:2px; overflow-x:auto; border-bottom:1px solid var(--border); scrollbar-width:thin; }
  .pres-tabs button{ flex:none; background:none; border:none; border-bottom:2px solid transparent; padding:8px 9px; font-size:13px; font-weight:700; color:var(--text-muted); white-space:nowrap; }
  .pres-tabs button[aria-current="true"]{ color:var(--text); border-bottom-color:var(--accent); }
  .pres-tabs hr{ display:none; }
  @media screen and (min-width:1024px){
    .wrap.pres-layout{ max-width:1520px; display:grid; grid-template-columns:220px minmax(0,1fr); gap:16px; align-items:start; }
    .pres-main{ grid-column:2; grid-row:1; }
    .pres-side{ grid-column:1; grid-row:1; position:sticky; top:calc(var(--topbar-h, 56px) + 10px);
      max-height:calc(100vh - var(--topbar-h, 56px) - 20px); overflow-y:auto; scrollbar-width:thin;
      background:var(--surface); border:1px solid var(--border); border-radius:var(--radius); box-shadow:var(--shadow);
      padding:10px; gap:9px; }
    .pres-side-top{ min-height:26px; }
    .pres-side-toggle{ order:2; margin-left:auto; display:inline-flex; align-items:center; justify-content:center; flex:none; width:26px; height:26px; padding:0;
      border:1px solid var(--border); border-radius:7px; background:var(--surface); color:var(--text-muted); font-size:14px; font-weight:800; line-height:1; }
    .pres-side-toggle:hover{ background:var(--surface-2); color:var(--text); }
    .pres-side-back{ font-size:12.5px; }
    .pres-side-info h1{ font-size:14.5px; display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden; text-wrap:wrap; overflow-wrap:anywhere; }
    .pres-side-info p{ font-size:11.5px; line-height:1.35; }
    .pres-side-acciones{ flex-direction:column; flex-wrap:nowrap; gap:1px; padding:8px 0; border-top:1px solid var(--border); border-bottom:1px solid var(--border); }
    .pres-side-acciones .btn{ width:100%; justify-content:flex-start; text-align:left; padding:5px 8px; font-size:12.5px; border-color:transparent; background:transparent; border-radius:6px; }
    .pres-side-acciones .btn:hover{ background:var(--surface-2); }
    .pres-side-acciones .btn.primary{ justify-content:center; text-align:center; padding:7px 8px; margin-bottom:5px; background:var(--accent); border-color:var(--accent); border-radius:8px; }
    .pres-side-acciones .btn.primary:hover{ background:var(--accent-strong); border-color:var(--accent-strong); }
    .pres-tabs{ flex-direction:column; gap:1px; overflow:visible; border-bottom:none; }
    .pres-tabs button{ text-align:left; white-space:normal; border-bottom:none; border-left:3px solid transparent; border-radius:0 6px 6px 0; padding:5px 8px; font-size:12.5px; font-weight:600; line-height:1.3; }
    .pres-tabs button:hover{ background:var(--surface-2); color:var(--text); }
    .pres-tabs button[aria-current="true"]{ font-weight:800; background:var(--surface-2); border-left-color:var(--accent); }
    .pres-tabs hr{ display:block; border:0; border-top:1px solid var(--border); margin:4px 0; width:100%; }
    /* Panel oculto: la tabla usa todo el ancho y queda una pestaña » en el borde izquierdo para volver a mostrarlo */
    .wrap.pres-layout.side-off{ grid-template-columns:minmax(0,1fr); }
    .side-off .pres-main{ grid-column:1; padding-left:14px; }
    .side-off .pres-side{ position:fixed; left:0; top:calc(var(--topbar-h, 56px) + 20px); z-index:30; max-height:none; overflow:visible;
      padding:0; border-left:none; border-radius:0 8px 8px 0; }
    .side-off .pres-side > :not(.pres-side-top), .side-off .pres-side-back{ display:none; }
    .side-off .pres-side-top{ padding:0; min-height:0; }
    .side-off .pres-side-toggle{ margin:0; width:24px; height:46px; border:none; border-radius:0 8px 8px 0; font-size:15px; color:var(--text); }
  }
  @media print{ .wrap.pres-layout{ display:block; max-width:none; } }
  /* Botones de cada fila del presupuesto en una sola línea (filas más bajas) */
  .tree-row td.no-print:last-child{ white-space:nowrap; }
  .tree-row td.no-print:last-child .icon-btn{ width:24px; height:26px; }

  /* breadcrumb + subtabs */
  .crumb{ display:flex; align-items:center; gap:8px; font-size:13px; color:var(--text-muted); }
  .crumb button{ background:none; border:none; color:var(--accent); font-weight:700; font-size:13px; padding:0; }
  .subtabs{ display:flex; gap:4px; border-bottom:1px solid var(--border); flex-wrap:wrap; }
  .subtabs button{ background:none; border:none; padding:9px 4px; margin-right:16px; font-size:13.5px; font-weight:700; color:var(--text-muted); border-bottom:2px solid transparent; }
  .subtabs button[aria-current="true"]{ color:var(--text); border-color:var(--accent); }

  /* tree */
  /* Sangría de la descripción según el nivel (--ind lo pone cada fila) */
  .tree-row td.desc{ padding-left:calc(10px + var(--ind, 0px)); }
  .indent{ display:inline-block; }
  .lvl-badge{ font-family:var(--font-num); font-size:11.5px; color:var(--text-muted); min-width:44px; display:inline-block; }
  tr.titulo td{ font-weight:700; background:var(--surface-2); }
  tr.titulo td.desc{ font-weight:800; }
  /* Títulos y sub-títulos: cada nivel de la numeración tiene su color y una franja de fondo suave
     del mismo tono, con una barra a la izquierda, para ubicar la jerarquía de un vistazo:
       1 = rojo (color de la marca) · 1.1 = azul · 1.1.1 = verde azulado · 1.1.1.1 = violeta ·
       nivel 5 = ámbar · nivel 6 o más = gris pizarra.
     Los tonos van de más fuerte a más neutro conforme se baja de nivel y todos tienen contraste
     suficiente sobre su fondo (pantalla clara, oscura e impresión). Las partidas quedan en el color
     normal del texto. Para cambiar un color edita --lvl1…--lvl6 (texto) y --lvl1-bg…--lvl6-bg (fondo). */
  tr.titulo.lvl-1 td, tr.titulo.lvl-1 td.muted, .et-titulo.lvl-1, .et-titulo.lvl-1 .muted{ color:var(--lvl1); }
  tr.titulo.lvl-2 td, tr.titulo.lvl-2 td.muted, .et-titulo.lvl-2, .et-titulo.lvl-2 .muted{ color:var(--lvl2); }
  tr.titulo.lvl-3 td, tr.titulo.lvl-3 td.muted, .et-titulo.lvl-3, .et-titulo.lvl-3 .muted{ color:var(--lvl3); }
  tr.titulo.lvl-4 td, tr.titulo.lvl-4 td.muted, .et-titulo.lvl-4, .et-titulo.lvl-4 .muted{ color:var(--lvl4); }
  tr.titulo.lvl-5 td, tr.titulo.lvl-5 td.muted, .et-titulo.lvl-5, .et-titulo.lvl-5 .muted{ color:var(--lvl5); }
  tr.titulo.lvl-6 td, tr.titulo.lvl-6 td.muted, .et-titulo.lvl-6, .et-titulo.lvl-6 .muted{ color:var(--lvl6); }
  tr.titulo.lvl-1 td{ background:var(--lvl1-bg); }
  tr.titulo.lvl-2 td{ background:var(--lvl2-bg); }
  tr.titulo.lvl-3 td{ background:var(--lvl3-bg); }
  tr.titulo.lvl-4 td{ background:var(--lvl4-bg); }
  tr.titulo.lvl-5 td{ background:var(--lvl5-bg); }
  tr.titulo.lvl-6 td{ background:var(--lvl6-bg); }
  tr.titulo.lvl-1 td:first-child{ box-shadow:inset 4px 0 0 var(--lvl1); }
  tr.titulo.lvl-2 td:first-child{ box-shadow:inset 3px 0 0 var(--lvl2); }
  tr.titulo.lvl-3 td:first-child{ box-shadow:inset 3px 0 0 var(--lvl3); }
  tr.titulo.lvl-4 td:first-child{ box-shadow:inset 3px 0 0 var(--lvl4); }
  tr.titulo.lvl-5 td:first-child{ box-shadow:inset 3px 0 0 var(--lvl5); }
  tr.titulo.lvl-6 td:first-child{ box-shadow:inset 3px 0 0 var(--lvl6); }
  /* Fila de un sub-presupuesto: es el primer nivel (1, 2, 3…), un poco más destacada */
  table.data tr.subpres-row td{ font-weight:800; font-size:13.5px; letter-spacing:.02em; text-transform:uppercase; }
  tr.subpres-empty-row td{ padding:12px 10px; font-size:12.5px; color:var(--text-muted); font-style:italic; }

  /* modal */
  #modal-root{ position:fixed; inset:0; z-index:100; display:flex; align-items:flex-start; justify-content:center;
    padding: max(24px, env(safe-area-inset-top,0px)) 16px 24px; background:rgba(10,10,8,.45); overflow-y:auto; }
  #modal-root[hidden]{ display:none; }
  /* Partida y APU como ventana flotante movible: el presupuesto sigue visible y usable detrás */
  #modal-root.floating{ background:transparent; pointer-events:none; overflow:visible; padding:0; display:block; }
  #modal-root.floating .modal-panel{ pointer-events:auto; position:fixed; margin:0; max-width:none;
    display:flex; flex-direction:column; overflow:hidden; resize:both; min-width:320px; min-height:220px;
    border:2px solid var(--accent); box-shadow:0 14px 44px rgba(0,0,0,.32); }
  #modal-root.floating .modal-head{ cursor:move; user-select:none; background:var(--surface-2); touch-action:none; }
  #modal-root.floating .modal-head::before{ content:"⠿"; color:var(--text-muted); margin-right:8px; }
  #modal-root.floating .modal-head h3{ flex:1; }
  #modal-root.floating .modal-body{ max-height:none; flex:1 1 auto; min-height:0; }
  #modal-root.floating .modal-body > *{ flex-shrink:0; }
  #modal-root.floating [data-float="apu-search"] .modal-body{ padding:12px; }
  /* Botón (+) de la Búsqueda de insumos: resaltado en rojo */
  .btn[data-apu-add-ins]{ background:#e53935; border-color:#e53935; color:#fff; font-weight:800; min-width:30px; }
  .btn[data-apu-add-ins]:hover{ background:#c62828; border-color:#c62828; color:#fff; }
  #modal-root.floating [data-float="apu-search"] table.data td, #modal-root.floating [data-float="apu-search"] table.data th{ padding:6px 6px; }
  .modal-panel{ background:var(--surface); border-radius:var(--radius); box-shadow:var(--shadow); width:100%; max-width:560px;
    border:1px solid var(--border); }
  .modal-panel.wide{ max-width:760px; }
  .modal-head{ display:flex; justify-content:space-between; align-items:center; padding:14px 18px; border-bottom:1px solid var(--border); }
  .modal-head h3{ font-size:15.5px; }
  .modal-body{ padding:18px; display:flex; flex-direction:column; gap:12px; max-height:70vh; overflow-y:auto; }
  .modal-foot{ display:flex; justify-content:flex-end; gap:8px; padding:14px 18px; border-top:1px solid var(--border); }
  .field-grid{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }
  @media (max-width:480px){ .field-grid{ grid-template-columns:1fr; } }

  /* Copiar y pegar partidas */
  table.data tr.tree-row.copiada td{ background:var(--warn-bg); }
  .icon-btn.activo{ background:var(--warn); color:var(--surface); }
  .btn.sm.pegar{ border-color:var(--warn); color:var(--warn); background:var(--warn-bg); }
  .btn.sm.pegar:hover{ background:var(--warn); color:var(--surface); }
  .porta-barra{ align-items:center; position:sticky; top:calc(var(--topbar-h, 56px) + 6px); z-index:5; box-shadow:var(--shadow); border:1px solid var(--warn); }
  .porta-barra span{ flex:1; }
  .porta-barra .btn{ flex:none; }

  /* Partidas vinculadas (comparten nombre, unidad y APU) */
  .vinc-badge{ display:inline-block; margin-left:6px; padding:1px 6px; border-radius:999px; font-size:10.5px; font-weight:700;
    background:var(--lvl2-bg); color:var(--lvl2); border:1px solid currentColor; white-space:nowrap; vertical-align:1px; cursor:pointer; font-family:var(--font-ui); line-height:1.35; }
  .vinc-badge:hover{ background:var(--lvl2); color:var(--surface); }
  .vinc-aviso{ align-items:center; padding:8px 12px; font-size:12.5px; }
  .vinc-aviso span{ flex:1; }
  .vinc-aviso .btn{ flex:none; }
  .vinc-lista{ max-height:190px; overflow:auto; border:1px solid var(--border); border-radius:8px; }
  .vinc-lista thead th{ position:sticky; top:0; background:var(--surface); z-index:1; }

  /* apu drawer */
  /* Cabecera del APU: nombre de la partida (editable), unidad (selector), rendimiento y jornada */
  .apu-partida{ display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:10px 12px; }
  .apu-partida .apu-partida-nombre{ grid-column:1 / -1; }
  .apu-partida .apu-partida-nombre input{ font-weight:700; font-size:14.5px; }
  .apu-partida label .num{ color:var(--text); margin-left:4px; }
  @media (max-width:520px){ .apu-partida{ grid-template-columns:1fr 1fr; } }
  /* Selector de unidades (con "Otra unidad…" para escribir una que no esté en la lista) */
  .unidad-pick{ display:flex; gap:6px; }
  .unidad-pick select{ flex:1 1 0; min-width:0; }
  .unidad-pick input{ flex:1 1 0; min-width:0; }
  .apu-sub{ display:flex; gap:16px; flex-wrap:wrap; }
  .apu-sub .stat{ background:var(--surface-2); border-radius:8px; padding:8px 14px; min-width:120px; }
  .apu-sub .stat .k{ font-size:10.5px; text-transform:uppercase; color:var(--text-muted); letter-spacing:.05em; }
  .apu-sub .stat .v{ font-family:var(--font-num); font-weight:700; font-size:15px; }

  /* Fórmula polinómica: Coeficiente de Reajuste (K), expresado matemáticamente */
  .k-formula-card{ overflow-x:auto; }
  table.k-cuadro td, table.k-cuadro th{ border:1px solid var(--border); padding:6px 8px; }
  table.k-cuadro tfoot td{ background:var(--surface-2, rgba(0,0,0,.03)); }
  table.k-cuadro .k-frac-cell .k-term, table.k-cuadro .k-frac-cell > *{ display:inline-flex; }
  .k-formula-block{ display:flex; align-items:center; flex-wrap:wrap; gap:9px; font-size:15px; padding:4px 2px; }
  .k-formula-block.k-numeric{ font-family:var(--font-num); font-size:13.5px; }
  .k-K{ font-weight:800; font-size:17px; }
  .k-eq{ font-weight:700; color:var(--text-muted); }
  .k-plus{ font-weight:700; color:var(--text-muted); }
  .k-term{ display:inline-flex; align-items:center; gap:1px; white-space:nowrap; }
  .k-coef{ font-weight:700; margin-right:1px; }
  .k-frac{ display:inline-flex; flex-direction:column; align-items:center; vertical-align:middle; padding:0 3px; }
  .k-frac .k-frac-num, .k-frac .k-frac-den{ padding:0 4px; line-height:1.3; }
  .k-frac .k-frac-num{ border-bottom:1.5px solid currentColor; }
  .k-formula-block sub{ font-size:.66em; }

  footer.appfoot{ text-align:center; padding:26px 16px 34px; font-size:12px; color:var(--text-muted); }


  /* Resumen de Monto de Inversión */
  .res-inv-card{ padding:0; overflow-x:auto; max-width:980px; }
  table.res-inv{ width:100%; border-collapse:collapse; font-size:14px; }
  table.res-inv td, table.res-inv th{ padding:6px 12px; vertical-align:middle; }
  table.res-inv .ri-banda th, table.res-inv .ri-banda td{ background:#1a1a1a; color:#fff; font-weight:800; }
  table.res-inv .ri-banda th{ text-align:center; font-size:17px; letter-spacing:.4px; text-decoration:underline; padding:9px 12px; }
  table.res-inv .ri-cols th{ font-weight:800; text-align:center; border-bottom:1px solid var(--text); background:var(--surface-2); color:var(--text); font-size:13.5px; }
  table.res-inv .ri-cols th.right{ text-align:right; padding-right:22px; }
  table.res-inv tbody tr:first-child td{ padding-top:14px; }
  table.res-inv .ri-pct{ text-align:right; white-space:nowrap; font-family:var(--font-num); width:1%; }
  table.res-inv .ri-mon{ text-align:center; width:40px; }
  table.res-inv .ri-val{ text-align:right; white-space:nowrap; width:150px; }
  table.res-inv .ri-acc{ width:30px; }
  table.res-inv .ri-l3 .ri-desc{ padding-left:96px; }
  table.res-inv .ri-l2 .ri-desc{ padding-left:42px; }
  table.res-inv .ri-l1 .ri-desc, table.res-inv .ri-l1b .ri-desc{ padding-left:56px; }
  table.res-inv .ri-l0 .ri-desc, table.res-inv .ri-l0b .ri-desc{ padding-left:14px; }
  table.res-inv tr.ri-tot td{ font-weight:800; border-top:1px solid var(--text); }
  table.res-inv .ri-modo{ display:inline-flex; gap:4px; align-items:center; }
  table.res-inv tfoot .ri-final td{ font-size:16px; padding:10px 12px; }
  table.res-inv tfoot .ri-final .ri-desc{ text-align:center; }
  .summary-row{ display:flex; justify-content:space-between; gap:10px; padding:10px 18px; border-bottom:1px solid var(--border); }
  .summary-row:last-child{ border-bottom:none; }
  .summary-row.strong{ font-weight:800; }

  /* Pie de presupuesto (Costo Directo → GG → Utilidad → Sub Total → IGV → Total), al final de la Estructura */
  tr.pie-presupuesto-row td{ font-weight:700; border-bottom:none; border-top:1px solid var(--border); padding-top:10px; padding-bottom:10px; }
  tr.pie-presupuesto-row.strong td{ border-top:2px solid var(--text); }
  tr.pie-presupuesto-row.total-final td{ background:var(--good-bg); color:var(--good); font-size:14.5px; }

  /* Metrados: sustento por partida (veces × largo × ancho × alto) */
  tr.metrado-breakdown-row td{ border-bottom:1px solid var(--border); padding:6px 10px 12px; background:var(--surface-2); }
  .metrado-breakdown{ display:flex; flex-direction:column; gap:8px; }
  table.metrado-mini{ font-size:12.5px; }
  table.metrado-mini th{ font-size:11px; }
  table.metrado-mini td, table.metrado-mini th{ padding:5px 8px; }

  /* Especificaciones Técnicas */
  .et-titulo{ font-size:13px; font-weight:700; padding:8px 4px 2px; }
  .et-head{ padding-bottom:6px; border-bottom:1px solid var(--border); }
  .et-print-text{ white-space:pre-wrap; font-size:13px; line-height:1.5; }

  /* APU para impresión */
  .apu-print-item{ padding:16px; display:flex; flex-direction:column; gap:10px; break-inside:avoid; page-break-inside:avoid; }
  .apu-print-subpres{ font-size:11.5px; font-weight:800; text-transform:uppercase; letter-spacing:.04em; color:var(--lvl1); }
  .apu-print-head{ display:flex; flex-direction:column; gap:2px; padding-bottom:8px; border-bottom:1px solid var(--border); }
  tr.apu-print-titlerow{ display:none; }
  tr.apu-print-group-row td{ font-weight:700; background:var(--surface-2); text-transform:uppercase; font-size:11px; letter-spacing:.04em; color:var(--text-muted); }
  tr.apu-print-subtotal-row td{ font-weight:700; border-bottom:1px solid var(--border); }
  .apu-print-total{ display:flex; justify-content:flex-end; align-items:center; gap:10px; font-weight:800; font-size:15px; padding:10px 14px; background:var(--good-bg); color:var(--good); border-radius:8px; }

  /* Plantilla de impresión: carátula y firmas, estilo reporte moderno tipo
     presupuestos.pe (acento de color de marca, grupos MO/MT/EQ/SC con su
     propio color, totales resaltados) — solo visibles al imprimir. */
  .print-only{ display:none; }
  /* Logo por encima de la barra roja: bloque aparte, sin borde, que va antes de .print-letterhead
     (que es la que trae el border-top:4px rojo). Tamaño al 70% del que tenía antes (150×34 → 105×24).
     Separación mínima (margin-bottom) para que quede pegado a la barra roja. */
  .print-letterhead-logo-wrap{ margin-bottom:2px; }
  /* Logo como <img> (no como fondo): los navegadores no imprimen las imágenes de fondo por defecto */
  .print-letterhead-logo{ display:block; height:21px; width:auto; max-width:120px; object-fit:contain; } /* 75 % del tamaño anterior (28 px) */
  .print-letterhead{ margin-bottom:18px; padding:10px 0 12px; border-top:4px solid var(--accent); border-bottom:1px solid var(--border); }
  /* Título centrado, de extremo a extremo (ya no hay fecha a la derecha). */
  .print-letterhead-row{ text-align:center; }
  .print-letterhead-title{ font-weight:800; font-size:19px; margin-top:3px; color:var(--text); text-align:center; }
  .print-letterhead-grid{ display:grid; grid-template-columns:1fr 1fr; gap:4px 28px; margin-top:10px; font-size:11.5px; }
  .print-letterhead-grid .k{ color:var(--text-muted); }
  .print-letterhead-grid .v{ font-weight:700; }
  table.print-datos{ width:100%; border-collapse:collapse; margin-top:8px; font-size:11.5px; }
  table.print-datos td{ padding:1px 6px 1px 0; vertical-align:top; border:none; }
  table.print-datos td.k{ color:var(--text); white-space:nowrap; }
  table.print-datos td.v{ color:var(--text); font-weight:400; }
  table.print-datos tr td{ padding-top:2px; padding-bottom:2px; }
  .print-subpres{ text-align:center; font-size:13px; margin-top:8px; }
  .print-firmas{ display:flex; justify-content:space-between; gap:48px; margin-top:56px; break-inside:avoid; page-break-inside:avoid; }
  .print-firma{ flex:1; text-align:center; }
  .print-firma-line{ border-top:1px solid var(--text); margin-bottom:6px; }
  .print-firma-label{ font-size:11.5px; color:var(--text-muted); }
  .print-total-highlight{ background:var(--good-bg) !important; color:var(--good) !important; font-weight:800; border-radius:6px; }


  /* Valorizaciones (avance mensual de obra) */
  .val-bar{ padding:12px 14px; display:flex; flex-direction:column; gap:8px; }
  .val-stats{ display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:10px; }
  .val-stats .stat{ background:var(--surface-2); border-radius:8px; padding:9px 13px; }
  .val-stats .stat .k{ font-size:10.5px; text-transform:uppercase; color:var(--text-muted); letter-spacing:.05em; }
  .val-stats .stat .v{ font-family:var(--font-num); font-weight:700; font-size:15px; }
  table.val-table{ font-size:12.5px; }
  table.val-table th, table.val-table td{ padding:7px 8px; }
  table.val-table td.val-over, table.val-table .val-over{ color:var(--bad); font-weight:700; }
  table.val-table td.val-col-mes{ background:var(--warn-bg); }
  table.val-pie td:first-child{ text-align:left; }
  table.val-table td.desc{ min-width:210px; }
  @media print{
    .val-pie-card{ break-inside:avoid; page-break-inside:avoid; }
    .card.val-wide{ overflow:visible; }
    /* Impresión de la valorización: letra de 8 pt y diseño compacto para aprovechar la hoja A4 horizontal */
    body .val-print :is(div,span,p,h1,h2,h3,h4,label,td,th,button,input,select,textarea,li,a,b,strong,em,small):not(.gantt-daylabel):not(.gantt-daylabel *):not(.gantt-bar){ font-size:8pt !important; }
    .val-print .print-letterhead{ margin-bottom:5px; padding:3px 0 5px; }
    .val-print .print-letterhead-logo-wrap{ margin-bottom:0; }
    .val-print .print-letterhead-title{ margin-top:0; }
    .val-print .print-letterhead-grid{ grid-template-columns:repeat(4,1fr); gap:1px 14px; margin-top:4px; }
    .val-print .val-stack{ gap:5px !important; }
    .val-print .val-info-line{ margin:0; }
    .val-print .card{ box-shadow:none; border-radius:0; }
    table.val-table th{ letter-spacing:0; white-space:normal; padding:3px 4px; }
    table.val-table td{ padding:2px 4px; }
    table.val-table td.desc{ min-width:0; width:34%; display:table-cell; }
    table.val-pie td:first-child{ width:34%; }
    .val-print tr.pie-presupuesto-row td{ padding-top:3px; padding-bottom:3px; }
  }

  /* Cronograma (Gantt estilo MS Project) */
  .msp-gantt{ border:1px solid var(--border); }
  .msp-hd{ display:none; }
  .msp-grid{ flex:none; border-right:2px solid #9e9e9e; background:#fff; }
  .msp-time{ flex:1; overflow-x:auto; background:#fff; }
  .msp-gantt text{ user-select:none; }
  .msp-time svg{ user-select:none; touch-action:pan-y; }
  .msp-grid g.crono-sel > rect:first-of-type{ fill:#fff3c4; }
  /* Ventana "Programar" movible (arrastrando su título) */
  .modal-panel.crono-movable .modal-head{ cursor:move; user-select:none; touch-action:none; background:var(--surface-2); }
  .modal-panel.crono-movable .modal-head h3{ flex:1; }
  .modal-panel.crono-movable .modal-head::before{ content:"⠿"; color:var(--text-muted); margin-right:8px; }
  .modal-panel.crono-movable.movido{ position:fixed; margin:0; }
  /* La ventana "Programar" no tapa la página: el Gantt queda a la vista y se puede seguir usando */
  #modal-root.con-gantt{ background:transparent; pointer-events:none; }
  #modal-root.con-gantt .modal-panel{ pointer-events:auto; border:2px solid var(--accent); box-shadow:0 14px 44px rgba(0,0,0,.32); }
  /* Cronograma a pantalla completa (botón "Pantalla completa"): ocupa toda la ventana del navegador.
     El Gantt se desplaza en ambos sentidos dentro de su marco y la tabla de tareas (Id, EDT, nombre,
     duración…) queda fija a la izquierda mientras se recorre la escala de tiempo. */
  @media screen{
    body.crono-full{ overflow:hidden; }
    body.crono-full .crono-root{ position:fixed; inset:0; z-index:60; margin:0 !important; padding:10px 12px; background:var(--bg);
      display:flex !important; flex-direction:column; gap:8px !important; overflow:hidden; }
    body.crono-full .crono-root > *{ flex:none; }
    body.crono-full .crono-root > .msp-gantt, body.crono-full .crono-root > .card.table-scroll{ flex:1 1 auto; min-height:0; overflow:auto !important; }
    body.crono-full .crono-root > .msp-gantt{ align-items:flex-start; background:#fff; }
    body.crono-full .crono-root .msp-grid{ position:sticky; left:0; z-index:2; }
    body.crono-full .crono-root .msp-time{ overflow:visible; flex:none; }
    /* cabecera (columnas y fechas) siempre a la vista al bajar por las tareas */
    body.crono-full .crono-root .msp-hd{ display:block; position:sticky; top:0; height:0; z-index:1; pointer-events:none; }
    body.crono-full .crono-root .msp-hd svg{ display:block; position:absolute; left:0; top:0; box-shadow:0 2px 4px rgba(0,0,0,.12); }
    /* el botón flotante del reproductor del sitio no debe tapar el cronograma */
    body.crono-full #trigger.trigger, body.crono-full #style_switcher_panel.panel{ display:none !important; }
  }
  @media (min-width:940px){ #modal-root.con-gantt{ justify-content:flex-start; padding-left:16px; } }
  .msp-time g.crono-sel rect{ stroke:#f57c00; stroke-width:2.5; }
  .msp-print svg{ max-width:100%; }
  .gantt-scroll{ overflow-x:auto; }
  .gantt-table{ border-collapse:separate; border-spacing:0; font-size:12.5px; }
  .gantt-table th, .gantt-table td{ white-space:nowrap; }
  .gantt-sticky{ position:sticky; z-index:2; background:var(--surface); }
  .gantt-table thead .gantt-sticky{ z-index:3; }
  .gs-1{ left:0; } .gs-2{ left:56px; } .gs-3{ left:276px; } .gs-4{ left:372px; } .gs-5{ left:432px; }
  .gs-6{ left:528px; } .gs-7{ left:648px; }
  .gs-8{ left:708px; box-shadow:4px 0 6px -4px rgba(0,0,0,.18); }
  .gantt-daylabel{ text-align:center; font-size:10px; padding:4px 2px; border-bottom:1px solid var(--border); border-left:1px solid var(--border); color:var(--text-muted); font-weight:600; }
  .gantt-daylabel.month-start{ border-left:2px solid var(--accent); }
  .gantt-month{ font-weight:800; color:var(--text); font-size:10px; white-space:nowrap; }
  .gantt-dow{ font-size:9px; opacity:.8; }
  .gantt-dom{ font-weight:700; }
  .gantt-bar-cell{ padding:3px 2px !important; }
  .gantt-bar{ height:18px; border-radius:5px; background:var(--accent); color:var(--on-accent); font-size:10px; font-weight:700; display:flex; align-items:center; justify-content:center; overflow:hidden; }
  .gantt-bar.titulo{ background:var(--text-muted); opacity:.55; height:9px; border-radius:4px; }
  /* Ruta crítica (holgura total = 0): la barra y la fila de la partida se resaltan en rojo, igual
     que en un cronograma CPM de MS Project, para que el expediente técnico la identifique a simple vista. */
  .gantt-bar.partida{ background:#4fc3f7; color:#06324a; }
  .gantt-bar.critical, .gantt-bar.partida.critical{ background:#e53935; color:#fff; }
  .gantt-bar.ciclo{ background:var(--warn); }
  .gantt-table tr.critical td{ background:var(--bad-bg); }
  .gantt-table tr.ciclo-warn td{ background:var(--warn-bg); }
  .crono-pred-row{ display:flex; gap:6px; align-items:center; }
  .crono-pred-row select{ padding:6px 8px;border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text); }

  @media (max-width:640px){
    .pagehead{ flex-direction:column; align-items:stretch; }
    .search input{ width:120px; }
    header.topbar{ padding:9px 14px; }
  }
  @media print{
    /* Fuerza colores claros y estables al imprimir, sin importar el modo oscuro
       del sistema/navegador (evita texto invisible sobre el fondo blanco forzado
       de abajo) y hace que los acentos de color se impriman siempre. */
    :root{
      --bg:#ffffff; --surface:#ffffff; --surface-2:#f0eeeb; --border:#ddd9d4;
      --text:#262626; --text-muted:#6b6560;
      --accent:#8b1e24; --accent-strong:#6e171c; --on-accent:#ffffff;
    --lvl1:#1f2e45; --lvl2:#8b1e24; --lvl3:#4a5d73; --lvl4:#5e5a55; --lvl5:#7a5a1e; --lvl6:#6b6560;
    --lvl1-bg:#e9edf3; --lvl2-bg:#f7ecec; --lvl3-bg:#eef1f5; --lvl4-bg:#f2f0ee; --lvl5-bg:#f6f0e3; --lvl6-bg:#f3f2f0;
      --good:#3e6b48; --good-bg:#eaf1ea; --warn:#a8741a; --warn-bg:#f8f0de; --bad:#b3261e; --bad-bg:#fbe9e7;
      --mo:#2f6f9e; --mt:#6a4fa0; --eq:#3f8f7a; --sc:#a05a3f;
      --mo-bg:#e7f0f7; --mt-bg:#efe9f6; --eq-bg:#e6f3ef; --sc-bg:#f5ebe4;
    }
    *{ -webkit-print-color-adjust:exact !important; print-color-adjust:exact !important; color-adjust:exact !important; }
    header.topbar, .no-print, #modal-root{ display:none !important; }
    body{ background:#fff; }
    /* Tamaño de letra al imprimir: 8 pt en todo el reporte (tablas, carátula, encabezados de
       sub-presupuesto, fórmula, etc.). Lleva !important porque muchos textos tienen su tamaño en
       px por estilo propio o en línea. Se excluyen los rótulos de días y las barras del Gantt
       (necesitan ser diminutos para que quepan las columnas) y <sub>/<sup>, que siguen siendo
       proporcionales al 8 pt de su texto. Para cambiar el tamaño, ajusta solo este "8pt". */
    body :is(div,span,p,h1,h2,h3,h4,label,td,th,button,input,select,textarea,li,a,b,strong,em,small):not(.gantt-daylabel):not(.gantt-daylabel *):not(.gantt-bar){ font-size:8pt !important; }
    /* Fila de encabezado de las tablas (ITEM, DESCRIPCIÓN, UND., METRADO…): fondo negro con letras
       blancas al imprimir. Los colores se fuerzan con print-color-adjust:exact (arriba) para que
       el navegador sí imprima el fondo. */
    table.data thead th{ background:#111 !important; color:#fff !important; border-bottom:1px solid #111; }
    table.data thead th *{ color:#fff !important; }
    table.data.metrado-mini thead th{ background:transparent !important; color:#8b1e24 !important; border-bottom:1px solid #8b1e24; text-transform:none !important; letter-spacing:0 !important; }
    table.data.metrado-mini thead th *{ color:#8b1e24 !important; }
    main#view{ padding:0; }
    @page{ margin:10mm 9mm; }
    .print-only{ display:block; }
    table.data tr{ break-inside:avoid; page-break-inside:avoid; }
    tr.titulo{ break-after:avoid; page-break-after:avoid; }
    tr.subpres-row{ break-after:avoid; page-break-after:avoid; }
    tr.apu-print-group-row{ break-after:avoid; page-break-after:avoid; }
    .summary-row{ break-inside:avoid; page-break-inside:avoid; }
    .summary-row.total-final{ background:var(--good-bg); color:var(--good); border-radius:6px; padding-top:12px; padding-bottom:12px; }
    /* Por defecto, un <tfoot> se repite al final de CADA página impresa cuando la tabla ocupa
       más de una hoja (así lo implementan los navegadores para tablas que se cortan entre
       páginas). El pie de presupuesto (Costo Directo, GG, Utilidad, Sub Total, IGV, Total) vive
       en un <tfoot>, así que sin este ajuste aparecía repetido en cada página en vez de solo una
       vez, al final de todo. Forzando su "display" a table-row-group se comporta como un grupo de
       filas más: fluye con el resto de la tabla y solo se ve una vez, en la última página. */
    table.data tfoot{ display:table-row-group; break-inside:avoid; page-break-inside:avoid; }
    /* Metrados: el sustento de una partida se parte entre hojas por sus filas; la partida no
       queda sola al pie de la hoja, separada de su sustento. */
    table.data tr.metrado-breakdown-row{ break-inside:auto; page-break-inside:auto; }
    table.data tr:has(+ tr.metrado-breakdown-row){ break-after:avoid; page-break-after:avoid; }
    table.metrado-mini td{ padding:4px 8px; }
    /* --- Aprovechar la hoja: el contenido llena cada página, se corta donde termina la hoja y
       sigue en la siguiente. Ningún bloque largo "salta" entero a la página siguiente dejando un
       hueco en blanco; solo se evita partir una fila de tabla, un gráfico o un rótulo de su texto. --- */
    /* Los contenedores apilados (flex en columna) pasan a flujo normal: es lo que el navegador
       parte mejor entre hojas. */
    .pres-main, .pres-main div[style*="flex-direction:column"]:not(.no-print){ display:block !important; }
    .pres-main > * + *, .pres-main div[style*="flex-direction:column"]:not(.no-print) > * + *{ margin-top:8px; }
    .card{ box-shadow:none; }
    /* Especificaciones técnicas: una partida larga se parte entre hojas; su encabezado y el rótulo
       de cada campo se quedan con el texto que les sigue. */
    .et-card{ break-inside:auto; page-break-inside:auto; }
    .et-card .field{ display:block; }
    .et-card .field > label{ display:block; margin-bottom:2px; break-after:avoid; page-break-after:avoid; }
    .et-head, .et-titulo{ break-after:avoid; page-break-after:avoid; }
    .et-print-text{ orphans:2; widows:2; }
    /* Presupuesto General: los sub-presupuestos van seguidos (ya no empieza cada uno en hoja nueva) */
    .subpresupuesto-print-block{ break-before:auto; page-break-before:auto; }
    /* Curva S: es un gráfico, pasa entero a la hoja siguiente si no entra */
    .curva-s-card{ break-inside:avoid; page-break-inside:avoid; }
    .curva-s-card .curva-s-svg{ max-height:80mm; }
    /* Gastos generales: el nombre de cada sección no queda solo al pie de la hoja */
    .card > .row:first-child{ break-after:avoid; page-break-after:avoid; }

    /* --- Diseño compacto al imprimir: reduce los espacios en blanco (paddings, márgenes y
       gaps) de la carátula, tablas y bloques de firma para aprovechar mejor la hoja. --- */
    table.data th{ padding:4px 6px; white-space:normal; }
    table.data td{ padding:3px 6px; }
    /* Colores por nivel de título: fijos al imprimir (aunque la pantalla esté en modo oscuro) */
    tr.titulo.lvl-1 td, tr.titulo.lvl-1 td.muted, .et-titulo.lvl-1, .et-titulo.lvl-1 .muted{ color:#1f2e45 !important; }
    tr.titulo.lvl-1 td{ background:#e9edf3 !important; }
    tr.titulo.lvl-1 td:first-child{ box-shadow:inset 3px 0 0 #1f2e45 !important; }
    tr.titulo.lvl-2 td, tr.titulo.lvl-2 td.muted, .et-titulo.lvl-2, .et-titulo.lvl-2 .muted{ color:#8b1e24 !important; }
    tr.titulo.lvl-2 td{ background:#f7ecec !important; }
    tr.titulo.lvl-2 td:first-child{ box-shadow:inset 3px 0 0 #8b1e24 !important; }
    tr.titulo.lvl-3 td, tr.titulo.lvl-3 td.muted, .et-titulo.lvl-3, .et-titulo.lvl-3 .muted{ color:#4a5d73 !important; }
    tr.titulo.lvl-3 td{ background:#eef1f5 !important; }
    tr.titulo.lvl-3 td:first-child{ box-shadow:inset 3px 0 0 #4a5d73 !important; }
    tr.titulo.lvl-4 td, tr.titulo.lvl-4 td.muted, .et-titulo.lvl-4, .et-titulo.lvl-4 .muted{ color:#5e5a55 !important; }
    tr.titulo.lvl-4 td{ background:#f2f0ee !important; }
    tr.titulo.lvl-4 td:first-child{ box-shadow:inset 3px 0 0 #5e5a55 !important; }
    tr.titulo.lvl-5 td, tr.titulo.lvl-5 td.muted, .et-titulo.lvl-5, .et-titulo.lvl-5 .muted{ color:#7a5a1e !important; }
    tr.titulo.lvl-5 td{ background:#f6f0e3 !important; }
    tr.titulo.lvl-5 td:first-child{ box-shadow:inset 3px 0 0 #7a5a1e !important; }
    tr.titulo.lvl-6 td, tr.titulo.lvl-6 td.muted, .et-titulo.lvl-6, .et-titulo.lvl-6 .muted{ color:#6b6560 !important; }
    tr.titulo.lvl-6 td{ background:#f3f2f0 !important; }
    tr.titulo.lvl-6 td:first-child{ box-shadow:inset 3px 0 0 #6b6560 !important; }
    .tree-row td.desc{ padding-left:calc(6px + var(--ind, 0px)); }
    tr.subpres-empty-row td{ padding:5px 6px; }
    tr.pie-presupuesto-row td{ padding-top:3px; padding-bottom:3px; }
    tr.pie-presupuesto-row.strong td{ padding-top:4px; }
    .summary-row{ padding:4px 10px; gap:6px; }
    .summary-row.total-final{ padding-top:6px; padding-bottom:6px; }
    .card{ padding:10px !important; }
    .print-letterhead-logo-wrap{ margin-bottom:0; }
    .print-letterhead{ margin-bottom:8px; padding:5px 0 6px; }
    .print-letterhead-title{ margin-top:2px; }
    .print-letterhead-grid{ gap:2px 16px; margin-top:5px; }
    .apu-print-item{ padding:8px; gap:5px; }
    /* APU al imprimir (igual que el Gantt): se llena cada hoja y lo que no entra pasa a la
       siguiente. Un APU largo se parte entre hojas por filas completas y, en cada hoja, se
       repiten su título (ítem, descripción, unidad, rendimiento) y los encabezados de columna. */
    .apu-print-item{ display:block; break-inside:auto; page-break-inside:auto; margin-bottom:8px; }
    div:has(> .apu-print-item){ display:block !important; }
    .apu-print-item > .apu-print-head{ display:none; }
    .apu-print-item .table-scroll{ overflow:visible !important; }
    table.apu-print-table thead{ display:table-header-group; }
    .apu-print-item .table-scroll > table.apu-print-table{ min-width:0; }
    table.data.apu-print-table thead tr:not(.apu-print-titlerow) th{ white-space:nowrap !important; overflow-wrap:normal !important; letter-spacing:.02em; }
    table.apu-print-table tr.apu-print-titlerow{ display:table-row; }
    table.data.apu-print-table thead tr.apu-print-titlerow th{ background:#fff !important; color:var(--text) !important; text-align:left; font-weight:400; text-transform:none; letter-spacing:0; border-bottom:1px solid var(--border); padding:2px 2px 5px; }
    table.data.apu-print-table thead tr.apu-print-titlerow th *{ color:var(--text) !important; }
    table.data.apu-print-table thead tr.apu-print-titlerow .apu-print-titlerow-sub, table.data.apu-print-table thead tr.apu-print-titlerow .apu-print-titlerow-sub *{ color:var(--text-muted) !important; }
    table.data.apu-print-table thead tr.apu-print-titlerow th .apu-print-subpres{ color:#1f2e45 !important; font-weight:800; -webkit-print-color-adjust:exact; print-color-adjust:exact; }
    tr.apu-print-subtotal-row{ break-inside:avoid; page-break-inside:avoid; }
    .apu-print-total{ break-before:avoid; page-break-before:avoid; }
    .apu-print-head{ padding-bottom:4px; gap:0; }
    .apu-print-total{ padding:5px 8px; gap:6px; }
    .et-titulo{ padding:4px 4px 1px; }
    .et-head{ padding-bottom:3px; }
    .et-print-text{ line-height:1.3; }
    .metrado-breakdown{ gap:4px; }
    tr.metrado-breakdown-row td{ padding:3px 6px 6px; }
    .print-firmas{ margin-top:32px; gap:24px; }
    .print-firma-line{ margin-bottom:3px; }
    .k-formula-block{ gap:5px; padding:2px 2px; }
    .k-formula-card, .k-formula-card .table-scroll{ overflow:visible !important; }
    table.k-cuadro{ border-collapse:collapse; }
    table.k-cuadro td, table.k-cuadro th{ border:1px solid #777 !important; }
    .formula-agrup-print{ break-inside:avoid; page-break-inside:avoid; }
    .apu-sub{ gap:8px; }
    .apu-sub .stat{ padding:5px 9px; }
    .msp-page{ break-inside:avoid; page-break-inside:avoid; }
    .msp-page + .msp-page{ break-before:page; page-break-before:always; }
    .msp-page-num{ text-align:right; color:#555; margin:0 0 2px; }
    .crono-leyenda{ display:flex !important; border:1px solid #777; padding:4px 8px; margin-top:4px; break-inside:avoid; page-break-inside:avoid; }
    .crono-leyenda svg{ -webkit-print-color-adjust:exact; print-color-adjust:exact; }
  }


/* ---- usuarios (esquina superior derecha) ---- */
#user-box{ display:flex; gap:6px; align-items:center; }
#user-box .btn{ padding:6px 11px; font-size:12.5px; border-radius:999px; }
.user-menu{ position:relative; }
.user-rol{ font-size:10px; background:var(--accent); color:var(--on-accent); border-radius:6px; padding:1px 5px; margin-left:3px; }
.user-drop{ position:absolute; right:0; top:calc(100% + 6px); z-index:50; min-width:230px; background:var(--surface); border:1px solid var(--border);
  border-radius:10px; box-shadow:0 10px 30px rgba(0,0,0,.18); padding:6px; display:flex; flex-direction:column; }
.user-drop[hidden]{ display:none; }
.user-drop-head{ padding:6px 8px 8px; border-bottom:1px solid var(--border); margin-bottom:4px; font-size:12.5px; }
.user-drop button{ text-align:left; background:none; border:0; padding:8px; border-radius:7px; cursor:pointer; color:var(--text); font:inherit; font-size:13px; }
.user-drop button:hover{ background:var(--surface-2); }
.auth-form{ display:flex; flex-direction:column; gap:10px; }
.auth-form label{ display:flex; flex-direction:column; gap:4px; font-size:12.5px; color:var(--text-muted); }
.auth-form input{ padding:8px 10px; border-radius:7px; border:1px solid var(--border); background:var(--surface); color:var(--text); font-size:14px; }
#tuing-toast{ position:fixed; left:50%; bottom:24px; transform:translate(-50%,40px); opacity:0; z-index:2147483600; max-width:min(560px,calc(100vw - 32px));
  background:#1a1a1a; color:#fff; padding:10px 16px; border-radius:10px; font-size:13px; box-shadow:0 8px 24px rgba(0,0,0,.3); transition:all .25s; pointer-events:none; }
#tuing-toast.show{ transform:translate(-50%,0); opacity:1; }
@media print{ #user-box, #tuing-toast{ display:none !important; } }
@media (max-width:640px){ .topbar-right .status-pill{ display:none; } }
/* ---- administración de usuarios ---- */
.tag.estado-ok{ background:var(--good-bg); color:var(--good); }
.tag.estado-off{ background:var(--bad-bg); color:var(--bad); }
.tag.estado-warn{ background:var(--warn-bg); color:var(--warn); }
.usr-susc-f{ font-size:11.5px; color:var(--text-muted); }
.susc-mal{ color:var(--bad); font-weight:700; }
/* la lista de usuarios tiene una columna más (Suscripción): ventana un poco más ancha */
.modal-panel.wide:has(#usr-buscar){ max-width:1020px; }
tr.usr-off td:first-child{ opacity:.65; }
tr[data-usr-fila][hidden]{ display:none; }
.usr-acciones{ display:flex; gap:6px; justify-content:flex-end; flex-wrap:nowrap; }
.usr-datos{ display:grid; grid-template-columns:max-content 1fr; gap:6px 18px; margin:0; font-size:13.5px; }
.usr-datos dt{ color:var(--text-muted); }
.usr-datos dd{ margin:0; font-weight:600; overflow-wrap:anywhere; }
.usr-clave{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:12px 14px; border:1px dashed var(--border);
  border-radius:var(--radius-sm); background:var(--surface-2); }
.usr-clave code{ font-family:var(--font-num); font-size:22px; font-weight:700; letter-spacing:.08em; user-select:all; overflow-wrap:anywhere; }
/* vista de administrador: presupuestos de otro usuario en solo lectura */
#ver-banner{ display:flex; gap:12px; align-items:center; justify-content:flex-start; flex-wrap:wrap; padding:9px 64px 9px 16px;
  background:var(--warn-bg); color:var(--warn); border-bottom:1px solid var(--border); font-size:13px; line-height:1.45; }
@media print{ #ver-banner{ display:none !important; } }

/* =========================================================================
   Gastos Generales: desagregado con doble iteración (pestaña del presupuesto)
   Colores: los mismos del presupuesto (ver "Colores por nivel en Gastos Generales y
   Fórmula polinómica" al final): secciones I/II = nivel 1, grupos = nivel 2,
   subgrupos = nivel 3. --gg-sello es el tono de acento (nivel 1).
   ========================================================================= */
.gg-hoja{ --gg-sello:var(--lvl1); --gg-sello-suave:var(--lvl1-bg); --gg-sello-tinta:var(--surface);
  --gg-ok:#5fd39f; --gg-mal:#ff8a80;
  padding:0; font-size:14px; line-height:1.45; color:var(--text); overflow:clip; }
.gg-hoja h2, .gg-hoja p, .gg-hoja dl, .gg-hoja dd, .gg-hoja ol{ margin:0; }
.gg-hoja output, .gg-hoja input.gg-num, .gg-pv{ font-family:var(--font-num); font-variant-numeric:tabular-nums; }
.gg-hoja [hidden], .gg-toast[hidden]{ display:none !important; }
.gg-bloque{ padding:16px 14px; }
@media (min-width:720px){ .gg-bloque{ padding:20px 24px; } }
.gg-bloque + .gg-bloque{ border-top:1px solid var(--border); }
.gg-h2{ font-size:17px; font-weight:700; line-height:1.2; }
.gg-ayuda{ color:var(--text-muted); font-size:12.5px; }

/* Casilla "usar este desagregado" */
.gg-usar label{ display:flex; gap:10px; align-items:flex-start; cursor:pointer; }
.gg-usar input{ flex:none; width:17px; height:17px; margin:2px 0 0; accent-color:var(--gg-sello); }
.gg-usar b{ display:block; font-size:14px; }
.gg-usar small{ display:block; color:var(--text-muted); font-size:12.5px; line-height:1.4; margin-top:2px; }

/* Campos */
.gg-hoja [contenteditable]{ outline:0; border-radius:3px; min-width:2ch; }
.gg-hoja [contenteditable]:hover{ background:var(--surface-2); }
.gg-hoja [contenteditable]:focus-visible{ background:var(--surface-2); box-shadow:0 0 0 2px var(--gg-sello); }
.gg-hoja [contenteditable]:empty::before{ content:attr(data-ph); color:var(--text-muted); font-weight:400; }
.gg-hoja input.gg-num, .gg-hoja select{ width:100%; min-width:0; background:var(--surface-2); color:var(--text); border:1px solid var(--border);
  border-radius:5px; padding:5px 7px; font-size:13.5px; }
.gg-hoja select{ font-family:var(--font-ui); }
.gg-hoja input.gg-num{ text-align:right; line-height:1.3; }
.gg-hoja input.gg-num::placeholder{ color:var(--text-muted); opacity:1; }
.gg-hoja input.gg-num:focus-visible, .gg-hoja select:focus-visible, .gg-hoja button:focus-visible, .gg-hoja summary:focus-visible{ outline:2px solid var(--gg-sello); outline-offset:1px; }
.gg-campos{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px 12px; margin-top:14px; }
@media (min-width:720px){ .gg-campos{ grid-template-columns:repeat(3,minmax(0,1fr)); } }
.gg-campo{ display:flex; flex-direction:column; gap:3px; font-size:12.5px; font-weight:600; }
.gg-campo.gg-ancho{ grid-column:1 / -1; }
@media (min-width:720px){ .gg-campo.gg-ancho{ grid-column:auto; } }
.gg-campo small{ font-weight:400; color:var(--text-muted); font-size:11.5px; line-height:1.3; }
.gg-campo > output{ display:block; padding:5px 0; font-size:13.5px; font-weight:600; border-bottom:1px dashed var(--border); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* Resumen tipo libro mayor */
.gg-mayor{ margin-top:18px !important; border-top:1px solid var(--text); }
.gg-mayor > div{ display:flex; justify-content:space-between; align-items:baseline; gap:16px; padding:6px 0; border-bottom:1px solid var(--border); }
.gg-mayor dt{ font-size:13.5px; }
.gg-mayor dt small{ display:block; color:var(--text-muted); font-size:11.5px; }
.gg-mayor dt small output{ font-family:var(--font-ui); }
.gg-mayor dd{ font-size:14px; font-weight:600; white-space:nowrap; }
.gg-mayor .gg-gg{ background:var(--gg-sello-suave); margin:0 -8px; padding:8px; }
.gg-mayor .gg-gg dt{ font-weight:700; }
.gg-mayor .gg-gg dd{ font-weight:700; font-size:16px; color:var(--gg-sello); }
.gg-mayor .gg-fin{ border-bottom:2px solid var(--text); }
.gg-mayor .gg-fin dd{ font-weight:700; }

/* Doble iteración */
.gg-estado{ display:flex; align-items:center; gap:14px; margin-top:12px !important; padding:11px 13px; border-radius:7px; background:var(--good-bg); color:var(--good); }
.gg-estado.gg-pend{ background:var(--bad-bg); color:var(--bad); }
.gg-estado.gg-casi{ background:var(--warn-bg); color:var(--warn); }
.gg-estado p{ font-weight:700; line-height:1.3; }
.gg-estado p span{ display:block; font-weight:400; font-size:12.5px; color:var(--text); }
.gg-nivel{ flex:none; position:relative; width:88px; height:24px; border-radius:16px; border:1.5px solid currentColor; background:var(--surface); overflow:hidden; }
.gg-nivel::before, .gg-nivel::after{ content:""; position:absolute; top:0; bottom:0; width:1.5px; background:currentColor; opacity:.55; }
.gg-nivel::before{ left:calc(50% - 11.5px); }
.gg-nivel::after{ left:calc(50% + 10px); }
.gg-nivel i{ position:absolute; top:50%; left:50%; width:18px; height:18px; margin:-9px 0 0 -9px; border-radius:50%; background:currentColor; opacity:.85; transition:transform .7s cubic-bezier(.3,1.5,.5,1); }
.gg-nivel i.gg-anim{ animation:gg-burbuja .7s cubic-bezier(.3,1.5,.5,1) both; }
@keyframes gg-burbuja{ from{ transform:translateX(var(--gg-de,0)); } to{ transform:translateX(var(--gg-a,0)); } }
@media (prefers-reduced-motion:reduce){ .gg-nivel i{ transition:none; } .gg-nivel i.gg-anim{ animation:none; } }
.gg-pasos{ margin-top:14px !important; padding-left:19px; font-size:12.5px; color:var(--text-muted); }
.gg-pasos li + li{ margin-top:4px; }
.gg-pasos b{ color:var(--text); font-weight:700; }
.gg-aviso{ margin-top:12px !important; padding:9px 12px; border-left:3px solid var(--bad); background:var(--bad-bg); font-size:13px; }
.gg-ciclos{ margin-top:12px; }
.gg-ciclos summary{ cursor:pointer; font-weight:600; font-size:13px; color:var(--gg-sello); padding:4px 0; width:fit-content; }
.gg-desliza{ overflow-x:auto; margin-top:6px; }
.gg-desliza table{ border-collapse:collapse; width:100%; min-width:540px; font-size:12.5px; }
.gg-desliza th, .gg-desliza td{ padding:5px 8px; text-align:right; border-bottom:1px solid var(--border); white-space:nowrap; }
.gg-desliza th{ font-weight:700; color:var(--text-muted); border-bottom-color:var(--text); }
.gg-desliza td{ font-family:var(--font-num); font-variant-numeric:tabular-nums; }
.gg-desliza th:first-child, .gg-desliza td:first-child{ text-align:left; }

/* Secciones I y II */
.gg-banda{ background:var(--gg-sello); color:var(--gg-sello-tinta); padding:8px 14px; font-size:15.5px; font-weight:700; line-height:1.2; }
@media (min-width:720px){ .gg-banda{ padding:9px 24px; } }
.gg-seccion{ padding:0 14px 12px; }
@media (min-width:720px){ .gg-seccion{ padding:0 24px 14px; } }
.gg-grupo{ padding-top:14px; }
.gg-g-head{ display:flex; align-items:baseline; gap:9px; padding:7px 9px; background:var(--gg-sello-suave); border-top:1.5px solid var(--gg-sello); }
.gg-g-head .gg-g-tit{ flex:1; min-width:0; font-weight:700; overflow-wrap:anywhere; }
.gg-g-head output{ font-weight:700; font-size:14px; white-space:nowrap; }
.gg-cod{ flex:none; font-family:var(--font-num); font-variant-numeric:tabular-nums; font-size:12px; font-weight:500; color:var(--text-muted); min-width:32px; }
.gg-g-head .gg-cod{ color:var(--gg-sello); font-weight:700; font-size:13px; }
.gg-g-sub{ display:flex; align-items:baseline; gap:9px; padding:7px 9px 0; font-weight:600; font-size:13.5px; }
.gg-g-sub > [contenteditable]{ flex:1; min-width:0; }
.gg-g-par{ display:flex; gap:11px; padding:9px 9px 0; }
.gg-g-par .gg-campo{ flex:1; max-width:176px; }
.gg-cols{ display:none; }
.gg-sin{ padding:9px; color:var(--text-muted); font-size:12.5px; }
/* En pantallas angostas cada ítem es una ficha: código y descripción arriba (con su ×), campos debajo.
   La × va después de los campos en el documento para que Tab pase de la descripción a la cantidad. */
.gg-fila{ padding:9px; border-bottom:1px solid var(--border); display:grid; grid-template-columns:minmax(0,1fr) auto; column-gap:6px; }
.gg-f-top{ display:flex; align-items:baseline; gap:9px; grid-column:1; grid-row:1; }
.gg-fila > .gg-del{ grid-column:2; grid-row:1; }
.gg-fila > .gg-f-campos, .gg-fila > .gg-nota{ grid-column:1 / -1; }
.gg-desc{ flex:1; min-width:0; overflow-wrap:anywhere; }
.gg-del{ flex:none; appearance:none; border:0; background:none; color:var(--text-muted); font-size:19px; line-height:1; width:27px; height:27px; padding:0; border-radius:5px; cursor:pointer; align-self:center; }
.gg-del:hover{ color:var(--bad); background:var(--bad-bg); }
.gg-f-campos{ display:grid; grid-template-columns:.85fr .85fr 1.45fr 1.5fr; gap:8px; margin-top:6px; align-items:end; }
.gg-c{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.gg-lab{ font-size:11px; color:var(--text-muted); white-space:nowrap; }
.gg-c output{ display:block; text-align:right; padding:5px 0; font-size:13.5px; line-height:1.3; border:1px solid transparent; white-space:nowrap; }
.gg-c.gg-sub output{ font-weight:700; }
.gg-c.gg-calc output{ color:var(--text-muted); }
.gg-pv{ text-align:right; }
.gg-nota{ margin-top:7px; font-size:12.5px; color:var(--text-muted); display:flex; flex-wrap:wrap; align-items:center; gap:6px; }
.gg-nota select{ width:auto; max-width:100%; font-size:12.5px; padding:4px 6px; }
.gg-fila.gg-ajuste{ background:var(--warn-bg); box-shadow:inset 3px 0 0 var(--warn); }
.gg-fila.gg-ajuste .gg-nota{ color:var(--warn); font-weight:600; }
.gg-add{ appearance:none; margin:9px 0 0 9px; padding:6px 12px; border:1px dashed var(--border); border-radius:5px; background:none; color:var(--gg-sello); font-weight:600; font-size:12.5px; cursor:pointer; }
.gg-add:hover{ background:var(--gg-sello-suave); border-style:solid; }
.gg-hoja select.gg-add-grupo{ width:auto; max-width:100%; margin-top:16px; background:none; border-style:dashed; color:var(--text-muted); font-size:12.5px; font-weight:600; cursor:pointer; }
.gg-hoja select.gg-add-grupo option{ color:var(--text); background:var(--surface); font-weight:400; }

@media (min-width:720px){
  .gg-cols, .gg-fila{ display:grid; grid-template-columns:66px minmax(0,1fr) 82px 82px 122px 128px 27px; column-gap:8px; }
  .gg-cols{ padding:8px 9px 4px; font-size:11.5px; color:var(--text-muted); text-align:right; border-bottom:1px solid var(--border); }
  .gg-fila{ align-items:center; padding:5px 9px; }
  .gg-f-top, .gg-f-campos{ display:contents; }
  .gg-fila .gg-cod{ grid-column:1; grid-row:1; }
  .gg-fila .gg-desc{ grid-column:2; grid-row:1; }
  .gg-fila .gg-c1{ grid-column:3; grid-row:1; }
  .gg-fila .gg-c2{ grid-column:4; grid-row:1; }
  .gg-fila .gg-c3{ grid-column:5; grid-row:1; }
  .gg-fila .gg-sub{ grid-column:6; grid-row:1; }
  .gg-fila .gg-del{ grid-column:7; grid-row:1; }
  .gg-fila .gg-nota{ grid-column:2 / 7; grid-row:2; margin:2px 0 4px; }
  .gg-fila .gg-lab{ position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }
}

/* Totales */
.gg-totales > div{ display:grid; grid-template-columns:minmax(0,1fr) auto; gap:2px 16px; align-items:baseline; padding:9px 0; border-bottom:1px solid var(--border); }
.gg-totales dt{ font-weight:600; }
.gg-totales dd{ font-size:14px; font-weight:700; text-align:right; white-space:nowrap; }
.gg-totales dd.gg-pct{ grid-column:1 / -1; font-weight:500; font-size:12.5px; color:var(--text-muted); text-align:left; }
.gg-totales dd.gg-pct output{ font-family:var(--font-ui); }
.gg-totales .gg-gran{ border-bottom:2px solid var(--text); border-top:1px solid var(--text); }
.gg-totales .gg-gran dt{ font-weight:700; }
.gg-totales .gg-gran dd{ font-size:17px; color:var(--gg-sello); }
.gg-totales .gg-gran dd.gg-pct{ font-size:13px; color:var(--text-muted); }
.gg-pie{ display:flex; flex-wrap:wrap; gap:12px; align-items:center; justify-content:space-between; }

/* Barra que sigue a la vista: % GG, total y diferencia */
.gg-barra{ position:sticky; bottom:0; z-index:5; background:var(--text); color:var(--surface); padding:8px 14px; display:flex; align-items:center; justify-content:center; gap:18px; border-radius:0 0 calc(var(--radius) - 1px) calc(var(--radius) - 1px); }
.gg-barra div{ display:flex; flex-direction:column; line-height:1.2; }
.gg-barra span{ font-size:11px; opacity:.75; }
.gg-barra b{ font-family:var(--font-num); font-variant-numeric:tabular-nums; font-size:15px; font-weight:600; white-space:nowrap; }
.gg-barra .gg-dif{ margin-left:auto; text-align:right; }
@media (min-width:720px){ .gg-barra{ gap:40px; } .gg-barra .gg-dif{ margin-left:0; } }
.gg-barra .gg-dif b::before{ content:""; display:inline-block; width:9px; height:9px; border-radius:50%; margin-right:6px; background:var(--gg-ok); vertical-align:1px; }
.gg-barra .gg-dif.gg-pend b::before{ background:var(--gg-mal); }

.gg-toast{ position:fixed; left:50%; bottom:74px; transform:translateX(-50%); z-index:2147483000; background:var(--surface); color:var(--text); border:1px solid var(--text); border-radius:7px;
  padding:7px 8px 7px 14px; display:flex; align-items:center; gap:12px; font-size:13.5px; box-shadow:0 6px 18px rgba(10,15,30,.25); white-space:nowrap; }
.gg-toast button{ appearance:none; border:0; background:var(--gg-sello, var(--lvl2)); color:var(--surface); border-radius:5px; padding:5px 11px; font-weight:700; font-size:13px; }

@media print{
  .gg-hoja{ border:0 !important; padding:0 !important; overflow:visible; }
  .gg-hoja output, .gg-hoja dt, .gg-hoja dd, .gg-hoja small, .gg-hoja h2{ font-size:8pt !important; }
  .gg-bloque{ padding:6px 0; }
  .gg-campos{ grid-template-columns:repeat(3,minmax(0,1fr)); gap:4px 14px; margin-top:6px; }
  .gg-campo.gg-ancho{ grid-column:auto; }
  .gg-campo > output{ border:0; padding:0; }
  .gg-campo .gg-pv, .gg-campo .print-only{ text-align:left; font-weight:400; }
  .gg-mayor{ margin-top:8px !important; }
  .gg-mayor > div{ padding:3px 0; }
  .gg-mayor .gg-gg{ margin:0; padding:4px 6px; }
  .gg-estado{ padding:6px 9px; margin-top:6px !important; }
  .gg-nivel{ display:none; }
  .gg-banda{ padding:4px 8px; margin-top:6px !important; break-after:avoid; page-break-after:avoid; }
  .gg-seccion{ padding:0 0 4px; }
  .gg-grupo{ padding-top:6px; }
  .gg-g-head{ padding:3px 6px; }
  .gg-g-sub, .gg-g-par{ padding:3px 6px 0; }
  .gg-g-head, .gg-g-sub, .gg-g-par, .gg-cols{ break-after:avoid; page-break-after:avoid; }
  .gg-fila, .gg-g-head, .gg-totales > div, .gg-mayor > div, .gg-estado{ break-inside:avoid; page-break-inside:avoid; }
  .gg-cols, .gg-fila{ display:grid; grid-template-columns:50px minmax(0,1fr) 66px 58px 88px 92px; column-gap:8px; }
  .gg-cols{ padding:3px 6px 2px; text-align:right; color:var(--text-muted); border-bottom:1px solid var(--border); }
  .gg-cols span:last-child{ display:none; }
  .gg-fila{ align-items:baseline; padding:2px 6px; }
  .gg-f-top, .gg-f-campos{ display:contents; }
  .gg-fila .gg-cod{ grid-column:1; grid-row:1; }
  .gg-fila .gg-desc{ grid-column:2; grid-row:1; }
  .gg-fila .gg-c1{ grid-column:3; grid-row:1; }
  .gg-fila .gg-c2{ grid-column:4; grid-row:1; }
  .gg-fila .gg-c3{ grid-column:5; grid-row:1; }
  .gg-fila .gg-sub{ grid-column:6; grid-row:1; }
  .gg-fila .gg-nota{ grid-column:2 / 7; grid-row:2; margin:0 0 2px; }
  .gg-fila .gg-lab{ display:none; }
  .gg-c output{ padding:0; border:0; }
  .gg-c.gg-calc output{ color:var(--text); }
  .gg-totales > div{ padding:4px 0; }
  .gg-hoja [contenteditable]{ background:none !important; box-shadow:none !important; }
  .gg-hoja [contenteditable]:empty::before{ content:""; }
}

/* Fórmula polinómica: agrupamiento preliminar (barra de incidencia con la raya del 5 %) */
.fpp-inc{ display:flex; align-items:center; gap:8px; }
.fpp-barra{ position:relative; flex:none; width:120px; height:10px; border-radius:3px; background:var(--surface-2); overflow:hidden; }
.fpp-barra i{ position:absolute; top:0; bottom:0; left:0; background:var(--lvl2); border-radius:3px; }
.fpp-barra i.otro{ background:var(--accent); }
.fpp-barra::after{ content:""; position:absolute; top:-2px; bottom:-2px; left:20%; width:2px; background:var(--text); opacity:.55; }
select.fpp-dest{ max-width:200px; padding:4px 6px; border-radius:6px; border:1px solid var(--border); background:var(--surface); color:var(--text); }
select.fpp-dest.puesto{ border-color:var(--lvl2); background:var(--lvl2-bg); color:var(--lvl2); font-weight:600; }
tr.fpp-agrupado td{ background:var(--surface-2); color:var(--text-muted); }
.fpp-pill{ display:inline-block; padding:2px 8px; border-radius:999px; font-size:11.5px; font-weight:700; white-space:nowrap; }
.fpp-pill.ok{ background:var(--good-bg); color:var(--good); }
.fpp-pill.warn{ background:var(--warn-bg); color:var(--warn); }
.fpp-pill.bad{ background:var(--bad-bg); color:var(--bad); }
.fpp-pill.off{ background:var(--surface-2); color:var(--text-muted); }
@media print{ .fpp tr{ break-inside:avoid; page-break-inside:avoid; } .fpp-barra{ width:80px; } }


/* =====================================================================
   Colores por nivel en Gastos Generales y Fórmula polinómica: iguales a los
   títulos del presupuesto (franja suave + barra a la izquierda + texto del nivel).
   Nivel 1 rojo (--lvl1), nivel 2 azul (--lvl2), nivel 3 verde azulado (--lvl3).
   ===================================================================== */
.gg-banda{ background:var(--lvl1-bg); color:var(--lvl1); box-shadow:inset 4px 0 0 var(--lvl1); text-transform:uppercase; letter-spacing:.02em; font-size:14.5px; }
.gg-g-head{ background:var(--lvl2-bg); border-top:0; box-shadow:inset 3px 0 0 var(--lvl2); color:var(--lvl2); }
.gg-g-head .gg-g-tit, .gg-g-head output, .gg-g-head .gg-cod{ color:var(--lvl2); }
.gg-g-sub{ background:var(--lvl3-bg); box-shadow:inset 3px 0 0 var(--lvl3); color:var(--lvl3); padding:6px 9px; margin-top:2px; }
.gg-g-sub .gg-cod{ color:var(--lvl3); font-weight:700; }
.gg-mayor .gg-gg{ background:var(--lvl2-bg); box-shadow:inset 3px 0 0 var(--lvl2); }
.gg-mayor .gg-gg dd{ color:var(--lvl2); }
.gg-mayor .gg-fin{ background:var(--good-bg); color:var(--good); margin:0 -8px; padding:8px; }
.gg-mayor .gg-fin dt small{ color:var(--good); opacity:.8; }
.gg-totales .gg-gran{ background:var(--good-bg); color:var(--good); padding-left:8px; padding-right:8px; }
.gg-totales .gg-gran dd{ color:var(--good); }
.gg-totales .gg-gran dd.gg-pct{ color:var(--good); opacity:.8; }

/* Fórmula polinómica: encabezados de sección = nivel 1, monomios (K1, K2…) = nivel 2 */
.fp-banda{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:0; padding:9px 12px; border-radius:6px; font-size:14.5px; font-weight:700; line-height:1.25; }
.fp-banda.n1{ background:var(--lvl1-bg); color:var(--lvl1); box-shadow:inset 4px 0 0 var(--lvl1); text-transform:uppercase; letter-spacing:.02em; }
.fp-banda.n2{ background:var(--lvl2-bg); color:var(--lvl2); box-shadow:inset 3px 0 0 var(--lvl2); text-transform:none; font-size:14px; }
.fp-banda.n2 .muted{ color:var(--lvl2); opacity:.8; }
.fp-mon-head{ margin:-14px -14px 0 !important; border-radius:var(--radius) var(--radius) 0 0; padding:9px 14px; }
.fp-mon-head.bajo{ background:var(--bad-bg); color:var(--bad); box-shadow:inset 3px 0 0 var(--bad); }
.fp-mon-head.bajo .muted{ color:var(--bad); }
table.k-cuadro td.fp-k{ color:var(--lvl2); background:var(--lvl2-bg); }
@media print{
  .gg-banda{ background:#e9edf3 !important; color:#1f2e45 !important; box-shadow:inset 3px 0 0 #1f2e45 !important; }
  .gg-g-head, .gg-g-head *{ color:#8b1e24 !important; } .gg-g-head{ background:#f7ecec !important; box-shadow:inset 3px 0 0 #8b1e24 !important; }
  .gg-g-sub, .gg-g-sub *{ color:#4a5d73 !important; } .gg-g-sub{ background:#eef1f5 !important; box-shadow:inset 3px 0 0 #4a5d73 !important; }
  .fp-banda.n1{ background:#e9edf3 !important; color:#1f2e45 !important; box-shadow:inset 3px 0 0 #1f2e45 !important; padding:4px 8px; }
  .fp-banda.n2{ background:#f7ecec !important; color:#8b1e24 !important; box-shadow:inset 3px 0 0 #8b1e24 !important; }
  table.k-cuadro td.fp-k{ color:#8b1e24 !important; background:#f7ecec !important; }
  .gg-hoja, .fp-banda, .gg-banda, .gg-g-head, .gg-g-sub{ -webkit-print-color-adjust:exact; print-color-adjust:exact; }
}

/* =====================================================================
   Presupuesto: plegar / desplegar títulos y subtítulos
   ===================================================================== */
.pleg-barra{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin:0 0 10px; }
.pleg-lab{ font-size:12.5px; font-weight:600; color:var(--text-muted); margin-right:2px; }
.pleg-info{ font-size:12px; color:var(--text-muted); margin-left:6px; }
.pleg-barra .chip.lvl-chip-1[aria-current="true"]{ background:var(--lvl1); border-color:var(--lvl1); color:#fff; }
.pleg-barra .chip.lvl-chip-2[aria-current="true"]{ background:var(--lvl2); border-color:var(--lvl2); color:#fff; }
.pleg-barra .chip.lvl-chip-3[aria-current="true"]{ background:var(--lvl3); border-color:var(--lvl3); color:#fff; }
.pleg-barra .chip.lvl-chip-4[aria-current="true"]{ background:var(--lvl4); border-color:var(--lvl4); color:#fff; }
.pleg-barra .chip.lvl-chip-5[aria-current="true"]{ background:var(--lvl5); border-color:var(--lvl5); color:#fff; }
.pleg-barra .chip.lvl-chip-6[aria-current="true"]{ background:var(--lvl6); border-color:var(--lvl6); color:#fff; }
.pleg-btn, .pleg-hueco{ display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px; margin:0 4px 0 -4px; vertical-align:-3px; flex:none; }
.pleg-btn{ appearance:none; border:0; border-radius:5px; background:transparent; color:inherit; font-size:12px; line-height:1; cursor:pointer; padding:0; }
.pleg-btn:hover{ background:rgba(0,0,0,.07); }
.pleg-btn:focus-visible, .pleg-resumen:focus-visible{ outline:2px solid currentColor; outline-offset:1px; }
.pleg-resumen{ appearance:none; border:1px dashed currentColor; background:transparent; color:inherit; opacity:.75; border-radius:999px; padding:1px 8px; margin-left:8px; font-size:11px; font-weight:600; text-transform:none; letter-spacing:0; cursor:pointer; vertical-align:1px; }
.pleg-resumen:hover{ opacity:1; }
@media screen{ tr.fila-plegada{ display:none; } }
@media print{ .pleg-btn, .pleg-hueco, .pleg-resumen, .pleg-barra{ display:none !important; } }

/* Insumos: índice unificado visible y propuesta automática (⚡) */
.iu-cell{ display:inline-flex; align-items:baseline; gap:6px; max-width:280px; min-width:0; }
.iu-cod{ font-family:var(--font-num); font-weight:700; white-space:nowrap; }
.iu-desc{ font-size:12px; color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0; }
.iu-falta .iu-cod, .iu-falta .iu-desc{ color:var(--warn); }
button.iu-sug{ appearance:none; font:inherit; text-align:left; border:1px dashed var(--warn); background:var(--warn-bg); color:var(--warn); border-radius:6px; padding:2px 8px; cursor:pointer; }
button.iu-sug .iu-desc{ color:var(--warn); }
button.iu-sug:hover{ border-style:solid; }
.iu-mini{ appearance:none; border:1px dashed var(--warn); background:var(--warn-bg); color:var(--warn); border-radius:5px; padding:2px 6px; font-family:var(--font-num); font-size:11.5px; font-weight:700; cursor:pointer; margin-left:4px; }
.chip.chip-iu[aria-current="true"]{ background:var(--warn); border-color:var(--warn); color:#fff; }
.iu-tabla{ max-height:58vh; overflow:auto; }
.iu-tabla tr.iu-grupo td{ background:var(--surface-2); font-size:12.5px; position:sticky; top:0; }
.iu-tabla select.iu-select{ width:100%; max-width:320px; padding:4px 6px; border-radius:6px; border:1px solid var(--border); background:var(--surface); color:var(--text); font-size:12.5px; }
.iu-tabla tr.iu-nuevo select.iu-select{ border-color:var(--good); }
.iu-tabla tr.iu-nada select.iu-select{ border-color:var(--warn); }

/* Nuevo presupuesto: plantillas de tipo de proyecto */
.plt-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(210px,1fr)); gap:8px; }
.field label.plt-card, .plt-card{ position:relative; display:flex; gap:10px; align-items:flex-start; padding:10px 12px; border:1px solid var(--border); border-radius:var(--radius-sm); background:var(--surface); cursor:pointer; text-transform:none; letter-spacing:0; font-weight:400; color:var(--text); }
.field label.plt-card:hover, .plt-card:hover{ border-color:var(--text-muted); }
.field label.plt-card.sel, .plt-card.sel{ border-color:var(--lvl1); background:var(--lvl1-bg); box-shadow:inset 3px 0 0 var(--lvl1); }
.plt-card input{ position:absolute; opacity:0; pointer-events:none; }
.plt-card:has(input:focus-visible){ outline:2px solid var(--lvl1); outline-offset:1px; }
.plt-ico{ font-size:20px; line-height:1.1; flex:none; }
.plt-txt{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.plt-txt b{ font-size:13.5px; }
.plt-txt small{ font-size:11.5px; color:var(--text-muted); line-height:1.35; }
.plt-card.sel .plt-txt b{ color:var(--lvl1); }
.plt-cnt{ font-family:var(--font-num); font-size:10.5px !important; margin-top:2px; }
.plt-det{ margin:-4px 0 14px; padding:10px 12px; border-radius:var(--radius-sm); background:var(--surface-2); font-size:12.5px; }
.field label.plt-op, .plt-op{ display:flex; gap:7px; align-items:flex-start; margin:3px 0; text-transform:none; letter-spacing:0; font-weight:400; font-size:12.5px; color:var(--text); }
.plt-op input{ margin-top:2px; }
.plt-vista{ margin-top:6px; }
.plt-vista summary{ cursor:pointer; font-weight:600; color:var(--lvl1); }
.plt-vista ul{ margin:4px 0 4px; padding-left:18px; }
.plt-vista > ul{ max-height:240px; overflow:auto; }
.plt-vista li{ margin:1px 0; }
.plt-sub{ margin-top:6px; font-weight:700; color:var(--lvl1); text-transform:uppercase; font-size:11.5px; letter-spacing:.03em; }
.plt-aviso{ margin-top:6px; font-size:11.5px; color:var(--warn); background:var(--warn-bg); border-radius:6px; padding:6px 9px; }
.banner.apu-tipico{ display:flex; align-items:center; gap:10px; margin-bottom:10px; }
.banner.apu-tipico > span{ flex:1; }
/* Importar insumos (CSV) */
.imp-formato{ flex:none; margin:2px 0; padding:8px 10px; border-radius:6px; background:var(--surface-2); font-family:var(--font-num); font-size:11.5px; line-height:1.5; overflow-x:auto; white-space:pre; }
.imp-resumen{ display:flex; flex-wrap:wrap; gap:6px; font-size:12.5px; }
.imp-resumen span{ padding:3px 10px; border-radius:999px; background:var(--surface-2); }
.imp-resumen .ok{ background:var(--good-bg); color:var(--good); }
.imp-resumen .warn{ background:var(--warn-bg); color:var(--warn); }
.imp-resumen .iu{ background:var(--lvl2-bg); color:var(--lvl2); }
.imp-resumen .dat{ background:var(--lvl4-bg); color:var(--lvl4); }
.imp-resumen .off{ color:var(--text-muted); }
.imp-opciones{ display:flex; flex-direction:column; gap:4px; }
/* Planilla de metrados: columnas de área y volumen */

table.metrado-mini tr.metrado-tot td{ font-weight:700; border-top:1.5px solid var(--text); background:var(--surface-2); }
@media print{ table.metrado-mini tr.metrado-tot td{ background:transparent !important; } }
/* Nueva partida: resultados del catálogo (5 visibles, el resto con barra) */
.cat-pick-lista{ overflow:auto; border:1px solid var(--border); border-radius:8px; flex:none; }
.cat-pick-lista thead th{ position:sticky; top:0; background:var(--surface); z-index:1; }
@media print{
  .res-inv-card{ border:none !important; box-shadow:none !important; max-width:none; overflow:visible; }
  table.res-inv{ font-size:11.5px; }
  table.res-inv td, table.res-inv th{ padding:3px 8px; }
  table.res-inv .ri-banda th, table.res-inv .ri-banda td{ background:#111 !important; color:#fff !important; -webkit-print-color-adjust:exact; print-color-adjust:exact; }
  table.res-inv .ri-banda th{ font-size:14px; }
  table.res-inv .ri-cols th{ background:#f2f2f2 !important; color:#000 !important; -webkit-print-color-adjust:exact; print-color-adjust:exact; }
  table.res-inv tfoot{ display:table-row-group; }
  table.res-inv tr{ break-inside:avoid; }
  table.res-inv .ri-l3 .ri-desc{ padding-left:70px; }
  table.res-inv tr.ri-tot td{ border-top:1px solid #000; }
}
/* Resumen de Monto de Inversión: mismas filas y colores que el Presupuesto (tree-row titulo lvl-N,
   pie-presupuesto-row, total-final en verde). Solo se ajusta el ancho y la fila del monto final. */
.card table.res-pres{ max-width:980px; }
table.res-pres .ri-linea{ display:inline-flex; gap:6px; align-items:center; flex-wrap:wrap; justify-content:flex-end; }
table.res-pres tr.ri-monto td{ font-size:15.5px; letter-spacing:.2px; }
@media print{ table.res-pres tr.ri-monto td{ font-size:inherit; } }
/* Menú: herramientas de diseño (Muro de gaviones, Muro de contención, Canales) con fondo rojo */
nav.maintabs a.tool-link{ background:#8b1e24; color:#fff !important; border-color:#8b1e24; font-weight:700; border-radius:8px; }
nav.maintabs a.tool-link:hover{ background:#6e171c; color:#fff !important; border-color:#6e171c; }
/* Suscripción vencida: costo y botón de WhatsApp */
a.wa-btn, a.btn.wa-btn, a.btn.primary.wa-btn{ background:#1f9d55 !important; border-color:#1f9d55 !important; box-shadow:none; color:#fff !important; text-decoration:none; font-weight:700; white-space:nowrap; }
a.wa-btn:hover, a.btn.primary.wa-btn:hover{ background:#17803f !important; border-color:#17803f !important; color:#fff !important; }
#ver-banner a.wa-btn{ margin-left:auto; }
.susc-precio{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; padding:14px 16px; border-radius:10px;
  background:#ececec; border:1px solid #f1c3bf; color:#1a1a1a; }
.susc-precio span{ font-weight:700; font-size:13.5px; }
.susc-precio b{ font-size:26px; font-weight:800; }
/* Resumen: tono formal azul marino para los títulos y la cabecera (en lugar del rojo del nivel 1).
   Títulos de primer nivel: azul marino · títulos dentro de un sub-presupuesto: gris pizarra. */
table.res-pres{ --rp-t1:#1a1a1a; --rp-t1-bg:#ececec; --rp-t2:#555555; --rp-t2-bg:#f5f5f5; --rp-cab:#1a1a1a; }
table.res-pres thead th{ background:var(--rp-cab); color:#fff; }
table.res-pres tr.titulo td, table.res-pres tr.titulo td.muted{ color:var(--rp-t1); background:var(--rp-t1-bg); }
table.res-pres tr.titulo td:first-child{ box-shadow:inset 4px 0 0 var(--rp-t1); }
table.res-pres tr.titulo:not(.subpres-row) + tr.titulo td{ border-top:1px solid rgba(0,0,0,.10); }
table.res-pres tr.titulo.lvl-2 td, table.res-pres tr.titulo.lvl-2 td.muted{ color:var(--rp-t2); background:var(--rp-t2-bg); font-weight:700; }
table.res-pres tr.titulo.lvl-2 td:first-child{ box-shadow:inset 3px 0 0 var(--rp-t2); }
@media print{
  table.res-pres thead th{ background:#111 !important; color:#fff !important; border-bottom:1px solid #111 !important; }
  table.res-pres tr.titulo td, table.res-pres tr.titulo td.muted{ color:#1f2e45 !important; background:#e9edf3 !important; }
  table.res-pres tr.titulo td:first-child{ box-shadow:inset 3px 0 0 #1f2e45 !important; }
  table.res-pres tr.titulo.lvl-2 td, table.res-pres tr.titulo.lvl-2 td.muted{ color:#4a5d73 !important; background:#f5f6f8 !important; }
  table.res-pres tr.titulo.lvl-2 td:first-child{ box-shadow:inset 3px 0 0 #4a5d73 !important; }
}
/* ===== Paleta «Vino y azul marino» =====
   Fondo gris cálido, texto carbón, vino (#8b1e24) para acciones y marca, azul marino (#1a1a1a) para
   cabeceras de tabla y títulos de nivel 1, verde oliva para totales. Para cambiarla, edita las
   variables de :root al inicio de este archivo. */
 table.data thead th{ color:#1a1a1a; border-bottom:2px solid #1a1a1a; }
table.res-pres thead th{ border-bottom:none; }

/* Partida recién creada: parpadea unos segundos para ubicarla (luego queda normal) */
@keyframes fila-nueva-parpadeo{
  0%, 100%{ background:transparent; }
  12%, 37%, 62%, 87%{ background:#f6dfa4; }
  25%, 50%, 75%{ background:#fff6dc; }
}
tr.fila-nueva td{ animation:fila-nueva-parpadeo var(--fila-nueva-dur, 6s) ease-in-out 1 both; }
tr.fila-nueva td:first-child{ box-shadow:inset 4px 0 0 #8b1e24; }
@media (prefers-reduced-motion: reduce){ tr.fila-nueva td{ animation:none; background:#fff1c9; } }
@media print{ tr.fila-nueva td{ animation:none !important; background:transparent !important; box-shadow:none !important; } }

/* ===== Saludo en la barra superior (Bienvenido invitado / Bienvenido «nombre» · PRO) ===== */
.status-pill{ gap:8px; padding:5px 12px 5px 10px; font-size:11.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-muted); background:var(--surface); }
.status-pill b{ color:var(--text); font-weight:600; display:inline-block; max-width:220px; overflow:hidden; text-overflow:ellipsis; vertical-align:bottom; }
.status-badge{ display:inline-flex; align-items:center; height:18px; padding:0 7px; border-radius:4px; font-size:10px; font-weight:700; letter-spacing:.1em;
  background:#1a1a1a; color:#fff; }
.status-badge.pro{ background:linear-gradient(135deg,#8b1e24,#6e171c); }
.status-badge.lectura{ background:var(--warn-bg); color:var(--warn); }

/* ===== Ventana de ingreso / registro ===== */
#modal-root:has(.auth-panel){ align-items:center; background:rgba(0,0,0,.55); -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); }
.modal-panel.auth-panel{ position:relative; max-width:410px; border-radius:14px; overflow:hidden; border:0;
  box-shadow:0 24px 60px rgba(0,0,0,.28), 0 2px 6px rgba(0,0,0,.08); animation:auth-in .22s ease-out both; }
@keyframes auth-in{ from{ opacity:0; transform:translateY(10px) scale(.985); } to{ opacity:1; transform:none; } }
.auth-panel::before{ content:""; display:block; height:4px; background:linear-gradient(90deg,#8b1e24 0 62%,#1a1a1a 62% 100%); }
.auth-panel .auth-x{ position:absolute; top:14px; right:12px; }
.auth-head{ padding:26px 34px 6px; text-align:center; }
.auth-head .brand-logo{ display:block; margin:0 auto 18px; width:132px; height:33px; background-position:center; }
.auth-head h3{ font-size:20px; font-weight:600; color:var(--text); letter-spacing:-.01em; }
.auth-head p{ margin:6px 0 0; font-size:13px; color:var(--text-muted); line-height:1.45; }
.auth-panel .modal-body{ padding:18px 34px 6px; max-height:none; gap:10px; }
.auth-panel .auth-form{ gap:14px; }
.auth-panel .auth-form label{ font-size:11px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:var(--text-muted); gap:6px; }
.auth-panel .auth-form input{ height:44px; padding:0 14px; border-radius:9px; border:1px solid var(--border); background:#fafafa; font-size:14.5px;
  text-transform:none; letter-spacing:0; transition:border-color .15s, box-shadow .15s, background .15s; }
.auth-panel .auth-form input:hover{ border-color:#bdbdbd; }
.auth-panel .auth-form input:focus{ outline:none; background:#fff; border-color:#8b1e24; box-shadow:0 0 0 3px rgba(139,30,36,.13); }
.auth-clave{ position:relative; display:block; }
.auth-clave input{ width:100%; padding-right:78px !important; }
.auth-ver{ position:absolute; right:6px; top:50%; transform:translateY(-50%); height:32px; padding:0 10px; border:0; border-radius:7px; background:transparent;
  color:var(--text-muted); font-size:11px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; }
.auth-ver:hover{ background:var(--surface-2); color:var(--text); }
.auth-panel .banner{ margin:0; }
.auth-panel .modal-foot{ flex-direction:column; align-items:stretch; gap:12px; padding:14px 34px 26px; border-top:0; }
.auth-panel .modal-foot .btn.primary{ justify-content:center; height:46px; border-radius:9px; font-size:14.5px; font-weight:600; letter-spacing:.02em;
  box-shadow:0 6px 16px rgba(139,30,36,.25); }
.auth-panel .modal-foot .btn.primary:hover{ box-shadow:0 8px 20px rgba(139,30,36,.32); }
.auth-alt{ margin:0; text-align:center; font-size:13px; color:var(--text-muted); line-height:1.5; }
.auth-alt a{ font-weight:600; color:var(--accent); text-decoration:none; }
.auth-alt a:hover{ text-decoration:underline; }
.auth-prueba{ display:inline-block; margin-top:4px; padding:2px 9px; border-radius:999px; background:var(--good-bg); color:var(--good); font-size:11.5px; font-weight:600; }
@media (max-width:480px){ .auth-head{ padding:24px 22px 4px; } .auth-panel .modal-body{ padding:16px 22px 4px; } .auth-panel .modal-foot{ padding:12px 22px 22px; } }

/* ===== Menús desplegables de la barra (Herramientas / Manual de uso) ===== */
.nav-drop{ position:relative; display:inline-flex; }
nav.maintabs .nav-drop-btn{ gap:6px; }
.nav-caret{ font-size:10px; opacity:.75; transition:transform .15s; }
.nav-drop.open .nav-caret{ transform:rotate(180deg); }
nav.maintabs .nav-drop-btn.tool-btn{ background:#8b1e24; color:#fff; border-color:#8b1e24; border-radius:8px; font-weight:600; }
nav.maintabs .nav-drop-btn.tool-btn:hover, .nav-drop-tools.open .nav-drop-btn.tool-btn{ background:#6e171c; border-color:#6e171c; color:#fff; }
.nav-drop:not(.nav-drop-tools).open .nav-drop-btn{ color:var(--text); background:var(--surface-2); }
.nav-drop-menu{ position:absolute; left:0; top:calc(100% + 6px); z-index:60; min-width:270px; padding:6px; display:none; flex-direction:column; gap:2px;
  background:var(--surface); border:1px solid var(--border); border-radius:10px; box-shadow:0 14px 34px rgba(0,0,0,.16), 0 2px 6px rgba(0,0,0,.06); }
.nav-drop-tools .nav-drop-menu{ border-top:3px solid #8b1e24; }
.nav-drop.open .nav-drop-menu{ display:flex; animation:nav-drop-in .14s ease-out both; }
@keyframes nav-drop-in{ from{ opacity:0; transform:translateY(-4px); } to{ opacity:1; transform:none; } }
nav.maintabs .nav-drop-menu a{ display:flex; align-items:flex-start; gap:10px; padding:9px 10px; border-radius:7px; border:0; background:none;
  color:var(--text); text-decoration:none; font-weight:400; white-space:nowrap; }
nav.maintabs .nav-drop-menu a:hover{ background:var(--surface-2); color:var(--text); }
.nav-drop-menu .nd-ico{ flex:none; width:22px; text-align:center; font-size:15px; line-height:1.3; }
.nav-drop-menu b{ display:block; font-size:13.5px; font-weight:600; color:var(--text); }
.nav-drop-menu small{ display:block; font-size:11.5px; color:var(--text-muted); margin-top:1px; }
@media print{ .nav-drop-menu{ display:none !important; } }

/* Saludo sin borde · ícono del usuario */
.status-pill{ border:0 !important; background:transparent !important; padding:5px 4px; }
.status-sep{ margin:0 7px; opacity:.5; }
.user-btn{ gap:7px; }
.user-ico{ display:inline-block; width:13px; height:19px; flex:none; background:url('usuario.png') center/contain no-repeat; }
/* Saludo en minúsculas y mayúsculas, con el tipo de usuario resaltado en rojo */
.status-pill{ text-transform:none; letter-spacing:0; font-size:13px; }
.status-pill b{ color:#8b1e24; font-weight:600; }
/* Tipo de usuario como etiqueta: fondo rojo, letras blancas */
.status-pill b{ background:#8b1e24; color:#fff; padding:2px 8px; border-radius:5px; font-weight:600; line-height:1.35; }
/* Saludo completo en negrita */
.status-pill, .status-pill b{ font-weight:700; color:var(--text); }
.status-pill b{ color:#fff; }

/* ===== Nueva partida: buscador amplio y lista compacta ===== */
.cp-filtros{ display:flex; gap:8px; align-items:stretch; flex-wrap:wrap; }
.cp-buscar{ flex:3 1 320px; min-width:240px; padding:0 12px; height:40px; border-radius:9px; }
.cp-buscar input{ width:100% !important; font-size:14px; height:100%; }
.cp-buscar:focus-within{ border-color:#8b1e24; box-shadow:0 0 0 3px rgba(139,30,36,.12); }
.cp-grupo-sel{ flex:1 1 170px; max-width:260px; min-width:150px; height:40px; padding:0 10px; border-radius:9px; border:1px solid var(--border);
  background:var(--surface); color:var(--text); font-size:13px; text-overflow:ellipsis; }
table.cp-tabla{ table-layout:fixed; font-size:12.5px; }
table.cp-tabla col.c-cb{ width:30px; } table.cp-tabla col.c-cod{ width:88px; } table.cp-tabla col.c-apu{ width:106px; }
table.cp-tabla col.c-und{ width:50px; } table.cp-tabla col.c-pu{ width:86px; } table.cp-tabla col.c-met{ width:86px; }
table.cp-tabla th, table.cp-tabla td{ padding:5px 6px; vertical-align:middle; }
table.cp-tabla thead th{ font-size:10.5px; }
table.cp-tabla tbody tr{ cursor:pointer; }
table.cp-tabla tbody tr:hover td{ background:var(--surface-2); }
table.cp-tabla tr.cp-sel td{ background:#f7ecec; }
table.cp-tabla tr.cp-abierto td{ background:var(--warn-bg); }
table.cp-tabla tr.cp-abierto td:first-child{ box-shadow:inset 3px 0 0 #8b1e24; }
.cp-cod{ color:var(--text-muted); font-size:11.5px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cp-nom{ line-height:1.3; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.cp-grupo{ font-size:10.5px; color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-top:1px; }
.cp-und{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cp-pu{ white-space:nowrap; }
.cp-apu-btn{ display:inline-flex; align-items:center; gap:4px; height:22px; padding:0 7px; border-radius:5px; border:1px solid var(--border);
  background:var(--surface); color:var(--text-muted); font-size:10.5px; font-weight:600; letter-spacing:.03em; white-space:nowrap; }
.cp-apu-btn span{ color:var(--text); }
.cp-apu-btn:hover, .cp-apu-btn.on{ border-color:#8b1e24; color:#8b1e24; }
.cp-met input{ width:100%; height:28px; text-align:right; padding:0 6px; border-radius:6px; border:1px solid var(--border); background:var(--surface); color:var(--text); font-size:12.5px; }
.cp-met input:focus{ outline:none; border-color:#8b1e24; box-shadow:0 0 0 2px rgba(139,30,36,.12); }

/* ===== Nueva partida: las tres opciones en una sola fila (pestañas) ===== */
.np-tabs{ display:flex; gap:4px; padding:4px; border-radius:11px; background:var(--surface-2); border:1px solid var(--border); flex-wrap:wrap; }
.np-tab{ flex:1 1 0; min-width:150px; display:flex; align-items:center; justify-content:center; gap:8px; height:40px; padding:0 12px; border:0; border-radius:8px;
  background:transparent; color:var(--text-muted); font-size:13px; font-weight:600; white-space:nowrap; transition:background .12s, color .12s; }
.np-tab:hover{ background:rgba(139,30,36,.07); color:var(--text); }
.np-tab .np-num{ width:22px; height:22px; font-size:12px; background:var(--border); color:var(--text-muted); }
.np-tab.on{ background:#8b1e24; color:#fff; box-shadow:0 2px 8px rgba(139,30,36,.28); }
.np-tab.on .np-num{ background:#fff; color:#8b1e24; }
.np-tab-t{ overflow:hidden; text-overflow:ellipsis; }
.np-cuenta{ min-width:20px; height:20px; padding:0 6px; border-radius:999px; background:#1a1a1a; color:#fff; font-size:11px; font-weight:700; display:inline-flex; align-items:center; justify-content:center; }
.np-tab.on .np-cuenta{ background:#fff; color:#8b1e24; }
/* Partida vinculada: la lista ocupa todo el alto disponible de la ventana */
#modal-root.floating [data-float="catpick"] .modal-body > .vinc-lista{ flex:1 1 0; min-height:220px; max-height:none; }
.vinc-lista{ max-height:min(60vh, 520px); }
.vinc-lista table.data td, .vinc-lista table.data th{ padding:6px 8px; }

/* ===== Menú lateral del presupuesto resaltado (rojo Tu-Ing / negro / gris) ===== */
.pres-tabs button{ color:#3a3a3a; }
.pres-tabs button[aria-current="true"]{ color:#8b1e24; border-bottom-color:#8b1e24; }
@media screen and (min-width:1024px){
  .pres-tabs{ gap:3px; }
  .pres-tabs button{ border-left:0; border-radius:7px; padding:7px 10px; font-size:13px; font-weight:600; color:#3a3a3a; }
  .pres-tabs button:hover{ background:#f7ecec; color:#8b1e24; }
  .pres-tabs button[aria-current="true"]{ background:#8b1e24; color:#fff; font-weight:700; box-shadow:0 3px 10px rgba(139,30,36,.28); }
  .pres-tabs button[aria-current="true"]:hover{ background:#6e171c; color:#fff; }
  .pres-side-acciones .btn{ color:#1a1a1a; font-weight:600; padding:7px 10px; border-radius:7px; }
  .pres-side-acciones .btn:not(.primary):hover{ background:#1a1a1a; color:#fff; }
  .pres-side-acciones .btn.primary{ background:#1a1a1a; border-color:#1a1a1a; color:#fff; }
  .pres-side-acciones .btn.primary:hover{ background:#8b1e24; border-color:#8b1e24; }
  .pres-tabs hr{ border-top-color:#d0d0d0; margin:6px 0; }
}

/* =====================================================================
   Tema «barra negra»: barra superior y pie en degradado negro, enlaces
   blancos en mayúsculas, sección activa en rojo Tu-Ing, contenido blanco.
   ===================================================================== */
@media screen{
  header.topbar{ background:linear-gradient(180deg,#3a3a3a 0%,#1c1c1c 55%,#0d0d0d 100%); border-bottom:3px solid #8b1e24;
    box-shadow:0 2px 10px rgba(0,0,0,.25); color:#fff; }
  header.topbar .brand-logo{ background-image:url('logo-oscuro.png'); }
  nav.maintabs{ gap:2px; }
  nav.maintabs button, nav.maintabs a, nav.maintabs .nav-drop-btn, nav.maintabs .nav-drop-btn.tool-btn{
    background:transparent; border:1px solid transparent; color:#e8e8e8; border-radius:5px; box-shadow:none;
    text-transform:uppercase; letter-spacing:.06em; font-size:12px; font-weight:600; padding:7px 12px; }
  nav.maintabs button:hover, nav.maintabs a:hover, nav.maintabs .nav-drop-btn:hover,
  nav.maintabs .nav-drop-btn.tool-btn:hover, .nav-drop.open .nav-drop-btn, .nav-drop-tools.open .nav-drop-btn.tool-btn{
    background:rgba(255,255,255,.10); color:#fff; border-color:transparent; }
  nav.maintabs button[aria-current="true"], nav.maintabs button[aria-current="true"]:hover{
    background:linear-gradient(180deg,#a8262e,#8b1e24); color:#fff; border-color:#6e171c; box-shadow:0 2px 8px rgba(139,30,36,.45); }
  /* los menús desplegables siguen siendo paneles blancos */
  nav.maintabs .nav-drop-menu a{ text-transform:none; letter-spacing:0; color:#1a1a1a; font-size:13px; padding:9px 10px; border-radius:7px; }
  nav.maintabs .nav-drop-menu a:hover{ background:#f2f2f2; color:#1a1a1a; }
  .nav-drop-menu{ border-top:3px solid #8b1e24; }
  /* saludo y usuario sobre fondo oscuro */
  header.topbar .status-pill, header.topbar .status-pill b{ color:#f2f2f2; }
  header.topbar .status-pill b{ color:#fff; background:#8b1e24; }
  header.topbar .status-dot{ background:#3ddc6b; }
  #user-box .btn{ background:transparent; border-color:rgba(255,255,255,.45); color:#fff; }
  #user-box .btn:hover{ background:rgba(255,255,255,.12); }
  #user-box .btn.primary{ background:linear-gradient(180deg,#a8262e,#8b1e24); border-color:#6e171c; }
  #user-box .btn.primary:hover{ background:#6e171c; }
  header.topbar .user-ico{ filter:invert(1); }
  /* pie en degradado negro */
  footer.appfoot{ background:linear-gradient(180deg,#3a3a3a 0%,#1c1c1c 60%,#0d0d0d 100%); color:#cfcfcf; border-top:3px solid #8b1e24;
    padding:22px 16px; margin-top:24px; letter-spacing:.03em; }
  /* cabeceras de tabla en negro con letras blancas */
  table.data thead th, .cat-pick-lista thead th, .vinc-lista thead th{ background:linear-gradient(180deg,#3a3a3a,#1a1a1a); color:#fff; border-bottom:0; }
  table.data thead th:first-child{ border-top-left-radius:6px; }
  table.data thead th:last-child{ border-top-right-radius:6px; }
  /* separadores punteados como en la plantilla */
  .pres-tabs hr{ border-top:1px dotted #9a9a9a; }
}
/* Pie de página simple: sin banda negra ni línea roja */
@media screen{ footer.appfoot{ background:transparent; border-top:0; color:var(--text-muted); margin-top:0; padding:26px 16px 34px; } }

/* Impresión: se conservan los colores anteriores (azul marino, vino, gris pizarra…) aunque la pantalla use otro tema */
@media print{
  :root{
    --accent:#8b1e24; --accent-strong:#6e171c;
    --lvl1:#1f2e45; --lvl2:#8b1e24; --lvl3:#4a5d73; --lvl4:#5e5a55; --lvl5:#7a5a1e; --lvl6:#6b6560;
    --lvl1-bg:#e9edf3; --lvl2-bg:#f7ecec; --lvl3-bg:#eef1f5; --lvl4-bg:#f2f0ee; --lvl5-bg:#f6f0e3; --lvl6-bg:#f3f2f0;
  }
  table.data thead th{ color:#1f2e45; border-bottom:2px solid #1f2e45; }
  table.res-pres thead th{ border-bottom:none; }
}

/* Metrados al imprimir: cabecera del sustento (Ubicación / detalle, N° veces … Parcial) en negro y sin fondo */
@media print{
  tr.metrado-breakdown-row td, .metrado-breakdown{ background:transparent !important; box-shadow:none !important; }
  table.data.metrado-mini, table.data.metrado-mini tbody td, table.data.metrado-mini tfoot td{ background:transparent !important; }
  table.data.metrado-mini thead th, table.data.metrado-mini thead th *{ background:transparent !important; color:#000 !important; }
  table.data.metrado-mini thead th{ border-bottom:1px solid #000 !important; }
}

/* ===== APU: botón y panel «Partidas vinculadas» (como en S10) ===== */
.apu-vinc-bar{ display:flex; justify-content:flex-end; margin:-4px 0 -2px; }
.apu-vinc-btn{ gap:6px; font-weight:600; }
.apu-vinc-btn.on{ border-color:#8b1e24; color:#8b1e24; background:#f7ecec; }
.apu-vinc-panel{ border:1px solid var(--border); border-top:3px solid #8b1e24; border-radius:10px; background:var(--surface); box-shadow:0 10px 28px rgba(0,0,0,.14);
  padding:12px 14px; display:flex; flex-direction:column; gap:8px; flex-shrink:0; }
.av-head{ display:flex; align-items:center; gap:6px; font-size:13.5px; }
.av-head .muted{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.av-ayuda{ font-size:12px; margin:0; }
.av-filtros{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
.av-todas{ display:flex; align-items:center; gap:6px; font-size:12.5px; color:var(--text-muted); white-space:nowrap; }
.av-lista{ max-height:240px; overflow:auto; border:1px solid var(--border); border-radius:8px; }
.av-lista table.data{ font-size:12.5px; }
.av-lista table.data td, .av-lista table.data th{ padding:6px 8px; }
.av-lista thead th{ position:sticky; top:0; z-index:1; }
.av-lista tr.av-propia td{ background:#f7ecec; font-weight:600; }
.av-lista tr.av-sel td{ background:#fbf3f3; }
.av-hoja{ max-width:220px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.av-esta{ color:#8b1e24; font-size:12px; }
.av-otro{ display:inline-block; margin-left:4px; padding:0 6px; border-radius:4px; background:var(--warn-bg); color:var(--warn); font-size:10.5px; font-weight:600; }
.av-pie{ display:flex; align-items:center; gap:8px; font-size:12.5px; }
.av-pie label{ display:flex; align-items:center; gap:6px; }

/* ===== APU compacto: acciones en una sola fila y datos de la partida en una sola fila ===== */
.apu-toolbar{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin:-2px 0 0; }
.apu-tb-btn{ height:30px; gap:6px; font-weight:600; white-space:nowrap; }
.apu-tb-pu{ font-weight:500; opacity:.8; font-size:11.5px; }
.apu-tb-chip{ display:inline-flex; align-items:center; gap:6px; height:30px; padding:0 4px 0 10px; border-radius:8px; font-size:12px; white-space:nowrap; }
.apu-tb-chip.info{ background:#eef1f5; color:#1f2e45; }
.apu-tb-chip.warn{ background:var(--warn-bg); color:var(--warn); }
.apu-tb-link{ height:24px; padding:0 8px; border-radius:6px; border:1px solid currentColor; background:#fff; color:inherit; font-size:11.5px; font-weight:600; cursor:pointer; }
.apu-tb-link:hover{ background:currentColor; }
.apu-tb-link:hover{ color:#fff; background:#8b1e24; border-color:#8b1e24; }
.apu-partida{ grid-template-columns:minmax(0,1fr) 180px 130px 96px; align-items:end; }
.apu-partida .apu-partida-nombre{ grid-column:auto; }
.apu-partida .field label{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
@media (max-width:820px){ .apu-partida{ grid-template-columns:1fr 1fr; } .apu-partida .apu-partida-nombre{ grid-column:1 / -1; } }

/* APU: precio editable por insumo (precio propio del presupuesto) */
.apu-pre-wrap{ display:inline-flex; align-items:center; gap:3px; justify-content:flex-end; }
.apu-pre-s{ color:var(--text-muted); font-size:12px; }
input.apu-precio{ width:82px; text-align:right; padding:4px 6px; border:1px solid var(--border); border-radius:6px; background:var(--surface); color:var(--text); font-size:13px; }
input.apu-precio:focus{ outline:none; border-color:#8b1e24; box-shadow:0 0 0 2px rgba(139,30,36,.12); }
.apu-pre-wrap.propio input.apu-precio{ background:#fff8e6; border-color:#e0b34a; font-weight:600; }
.apu-pre-reset{ border:0; background:none; color:#a8741a; cursor:pointer; font-size:14px; padding:0 2px; line-height:1; }
.apu-pre-reset:hover{ color:#8b1e24; }
@media print{ input.apu-precio{ border:0; background:transparent; } .apu-pre-reset{ display:none; } }
/* APU: «Partidas vinculadas» al costado de Jornada */
.apu-partida{ grid-template-columns:minmax(0,1fr) 170px 120px 90px auto; }
.apu-vinc-field .apu-vinc-btn{ height:38px; white-space:nowrap; }
@media (max-width:820px){ .apu-partida{ grid-template-columns:1fr 1fr; } }
input.apu-input{ font-variant-numeric:tabular-nums; }

/* ---------- Especificaciones técnicas del catálogo (base de datos) ---------- */
.et-badge{ display:inline-flex; align-items:center; height:18px; padding:0 6px; border-radius:4px; font-size:10.5px; font-weight:700;
  letter-spacing:.03em; color:var(--good); background:var(--good-bg); border:1px solid rgba(62,107,72,.25); white-space:nowrap; vertical-align:middle; }
.cp-et{ margin-left:4px; }
.et-head{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.et-head .et-traer-uno{ margin-left:auto; }
.et-cat-resumen{ display:grid; grid-template-columns:repeat(3,1fr); gap:8px; }
.et-cat-resumen > div{ background:var(--surface-2); border-radius:var(--radius-sm); padding:8px 10px; display:flex; flex-direction:column; gap:2px; }
.et-cat-resumen b{ font-size:18px; font-family:var(--font-num); }
.et-cat-resumen span{ font-size:11.5px; color:var(--text-muted); }
.et-cat-edit{ border-top:1px solid var(--border); padding-top:10px; display:flex; flex-direction:column; gap:8px; }
.et-cat-edit-h{ display:flex; flex-direction:column; gap:2px; }
.et-cat-edit-h .muted{ font-size:11.5px; }
.et-cat-edit textarea{ width:100%; resize:vertical; }
.et-cat-preview{ border-top:1px solid var(--border); padding-top:8px; display:flex; flex-direction:column; gap:6px; font-size:12.5px; }
.et-cat-prev-campo .k{ font-size:11px; font-weight:700; color:var(--text-muted); text-transform:uppercase; letter-spacing:.03em; }
.et-cat-prev-campo .v{ white-space:pre-wrap; line-height:1.45; max-height:9em; overflow:auto; }
@media (max-width:560px){ .et-cat-resumen{ grid-template-columns:1fr; } }
/* Nueva partida: cuatro pestañas en una fila */
.np-tab{ min-width:110px; padding:0 8px; gap:6px; font-size:12.5px; white-space:nowrap; }
/* ---------- Importar formato Tu-Ing (Insumos + Partidas/ET + APU) ---------- */
.ti-pasos{ display:flex; flex-direction:column; gap:6px; }
.ti-paso{ display:flex; align-items:center; gap:10px; padding:8px 10px; border:1px solid var(--border); border-radius:var(--radius-sm); background:var(--surface); }
.ti-paso > div{ flex:1; display:flex; flex-direction:column; gap:1px; }
.ti-paso small{ color:var(--text-muted); font-size:11.5px; line-height:1.35; }
.ti-n{ flex:none; width:24px; height:24px; border-radius:50%; background:var(--accent); color:#fff; font-size:12px; font-weight:700; display:flex; align-items:center; justify-content:center; }
.ti-cajas{ display:grid; grid-template-columns:repeat(4,1fr); gap:8px; }
.ti-caja{ background:var(--surface-2); border-radius:var(--radius-sm); padding:8px 10px; display:flex; flex-direction:column; gap:1px; }
.ti-caja b{ font-size:19px; font-family:var(--font-num); }
.ti-caja span{ font-size:12px; font-weight:600; }
.ti-caja small{ font-size:11px; color:var(--text-muted); }
.ti-aviso{ font-size:12px; padding:7px 10px; border-radius:var(--radius-sm); background:var(--warn-bg); color:var(--warn); }
.ti-opciones{ display:flex; flex-direction:column; gap:6px; font-size:12.5px; }
.ti-opciones label{ display:flex; align-items:flex-start; gap:8px; }
.ti-opciones input{ flex:none; margin-top:2px; }
@media (max-width:620px){ .ti-cajas{ grid-template-columns:repeat(2,1fr); } }
/* ---------- Cabecera de impresión: logo propio a la derecha ---------- */
@media print{ .print-only.print-letterhead-logo-wrap{ display:flex; align-items:flex-end; justify-content:space-between; gap:12px; } }
.print-letterhead-logo-cli{ display:block; height:auto; max-height:44px; max-width:170px; width:auto; object-fit:contain; }
.print-proyecto{ text-align:center; font-size:13px; font-weight:700; text-transform:uppercase; margin-top:6px; }
/* ---------- Monto en letras ---------- */
tr.pie-letras td{ font-size:12px; font-weight:700; letter-spacing:.02em; text-align:left; padding:8px 10px; border-top:1px solid var(--border); background:var(--surface-2); }
.pie-letras-caja{ font-size:12px; font-weight:700; letter-spacing:.02em; padding:8px 10px; border:1px solid var(--border); border-radius:var(--radius-sm); background:var(--surface-2); }
/* ---------- Recursos requeridos: resumen por tipo ---------- */
.rec-resumen{ display:flex; flex-direction:column; gap:8px; max-width:560px; margin-left:auto; break-inside:avoid; page-break-inside:avoid; }
.rec-resumen-tabla td, .rec-resumen-tabla th{ padding:6px 10px; }
.rec-resumen-tabla tr.rec-resumen-total td{ font-weight:800; border-top:2px solid var(--text); }
/* ---------- Datos generales: elegir logo ---------- */
.logo-pick{ display:flex; gap:12px; align-items:center; }
.logo-prev{ flex:none; width:150px; height:64px; border:1px dashed var(--border); border-radius:var(--radius-sm); display:flex; align-items:center; justify-content:center; background:var(--surface); overflow:hidden; font-size:12px; }
.logo-prev img{ max-width:100%; max-height:100%; object-fit:contain; }
.logo-pick-acc{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.logo-pick-acc small{ flex-basis:100%; font-size:11.5px; line-height:1.35; }
@media print{
  tr.pie-letras td, .pie-letras-caja{ background:#f2f3ee !important; -webkit-print-color-adjust:exact; print-color-adjust:exact; color:#000 !important; }
  .rec-resumen{ margin-top:6px; }
}
/* ---------- Curva S de avance programado (sin fondo) ---------- */
.curva-s-card{ padding:16px 14px; }
.curva-s{ display:flex; flex-direction:column; align-items:center; gap:6px; color:#1a1a1a; }
.curva-s-tit{ font-family:Arial, Helvetica, sans-serif; font-size:15px; font-weight:700; letter-spacing:.02em; text-align:center; color:#8b1e24; }
.curva-s-tit2{ margin-top:14px; }
.curva-s-svg{ display:block; width:100%; max-width:620px; height:auto; }
table.curva-s-tabla{ width:auto; min-width:460px; border-collapse:collapse; font-family:Arial, Helvetica, sans-serif; font-size:13px; font-variant-numeric:tabular-nums; }
table.curva-s-tabla th{ background:#1a1a1a; color:#fff; font-weight:600; padding:5px 10px; border:1px solid #1a1a1a; }
table.curva-s-tabla tbody tr:nth-child(even) td{ background:#f4f4f4; }
table.curva-s-tabla tbody td:last-child{ font-weight:700; color:#8b1e24; }
table.curva-s-tabla td{ padding:4px 10px; border:1px solid #dcdcdc; }
table.curva-s-tabla th.right, table.curva-s-tabla td.right{ text-align:right; }
@media print{ table.curva-s-tabla th{ background:#1a1a1a !important; color:#fff !important; } table.curva-s-tabla th, table.curva-s-tabla td, .curva-s-tit{ -webkit-print-color-adjust:exact; print-color-adjust:exact; } }
@media (max-width:560px){ table.curva-s-tabla{ min-width:0; width:100%; font-size:12px; } }
/* ---------- Valorización de obra ---------- */
.ob-menu .ob-menu-g{ font-size:10.5px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--text-muted); padding:6px 10px 2px; }
.ob-doc{ display:flex; flex-direction:column; gap:12px; }
.ob-titulo{ font-size:17px; font-weight:800; text-align:center; letter-spacing:.02em; color:var(--accent); }
.ob-periodo{ text-align:center; font-weight:700; font-size:13px; letter-spacing:.02em; }
.ob-cab{ border:1px solid var(--border); border-radius:var(--radius-sm); background:var(--surface); padding:10px 14px; display:flex; flex-direction:column; gap:6px; font-size:12.5px; }
.ob-cab-grid{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:3px 24px; }
.ob-dato{ display:flex; gap:8px; min-width:0; }
.ob-dato .k{ flex:none; width:170px; color:var(--text-muted); font-weight:600; text-transform:uppercase; font-size:11px; letter-spacing:.03em; padding-top:1px; }
.ob-dato .v{ font-weight:600; min-width:0; overflow-wrap:anywhere; }
table.ob-tabla{ font-size:11.5px; }
table.ob-tabla th{ text-align:center; vertical-align:middle; white-space:normal; font-size:10.5px; line-height:1.25; padding:5px 6px; }
table.ob-tabla td{ padding:4px 6px; }
table.ob-tabla td.right.num{ white-space:nowrap; }
.ob-th-sub{ font-weight:400; font-size:9.5px; opacity:.85; text-transform:none; letter-spacing:0; }
.ob-fuerte{ font-weight:700; }
.ob-ejec{ color:var(--accent); }
td.ob-ejec, b.ob-ejec{ font-weight:700; }
table.ob-tabla tr.ob-pie td, table.ob-tabla tr.ob-strong td{ background:var(--surface-2); }
table.ob-tabla tr.ob-pie.strong td, table.ob-tabla tr.ob-strong td{ font-weight:800; }
table.ob-tabla tr.ob-sep-row td{ font-size:10.5px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--accent); background:var(--lvl2-bg); }
table.ob-tabla tr.ob-subrow td:first-child{ padding-left:18px; }
table.ob-tabla tr.ob-actual td{ background:var(--warn-bg); }
table.ob-conceptos td:first-child{ min-width:220px; }
.ob-ok{ color:var(--good); font-weight:700; } .ob-falta{ color:var(--warn); font-weight:700; } .ob-excede{ color:var(--bad); font-weight:700; }
.ob-estado{ display:inline-block; font-size:10.5px; font-weight:700; letter-spacing:.03em; padding:2px 7px; border-radius:4px; background:var(--good-bg); color:var(--good); white-space:nowrap; }
.ob-estado.atrasada{ background:var(--bad-bg); color:var(--bad); }
.ob-montos{ display:grid; grid-template-columns:repeat(auto-fit, minmax(190px, 1fr)); gap:8px; }
.ob-montos > div{ background:var(--surface); border:1px solid var(--border); border-radius:var(--radius-sm); padding:8px 12px; display:flex; flex-direction:column; gap:2px; }
.ob-montos span{ font-size:11px; color:var(--text-muted); text-transform:uppercase; letter-spacing:.03em; font-weight:600; }
.ob-montos b{ font-size:16px; font-family:var(--font-num); }
table.ob-ficha{ width:100%; max-width:980px; border-collapse:collapse; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius-sm); font-size:13px; }
table.ob-ficha td{ padding:6px 10px; border-bottom:1px solid var(--border); vertical-align:middle; }
table.ob-ficha td.ob-n{ width:32px; color:var(--text-muted); text-align:right; }
table.ob-ficha td.ob-k{ width:290px; font-weight:600; }
table.ob-ficha td.ob-sep{ width:10px; color:var(--text-muted); }
table.ob-ficha .ob-inp{ padding:5px 8px; border-radius:6px; border:1px solid var(--border); background:var(--surface); color:var(--text); font:inherit; max-width:100%; }
table.ob-ficha input.ob-inp:not([type]), table.ob-ficha input.ob-inp[type="text"]{ width:100%; }
table.ob-ficha .ob-sub{ display:grid; grid-template-columns:120px minmax(0,320px); align-items:center; gap:4px 8px; margin:2px 0; }
table.ob-ficha .ob-sub > span:first-child{ color:var(--text-muted); font-size:12px; }
.ob-abrir{ font-size:12px; font-weight:700; color:var(--accent); }
.ob-val-det{ border:1px solid var(--border); border-radius:var(--radius-sm); padding:8px 12px; background:var(--surface-2); }
.ob-val-det summary{ cursor:pointer; font-weight:700; font-size:12.5px; }
.ob-val-det[open] summary{ margin-bottom:8px; }
@media (max-width:760px){ .ob-cab-grid{ grid-template-columns:1fr; } table.ob-ficha td.ob-k{ width:auto; } }
@media print{
  /* cabecera compacta: 3 columnas, sin repetir el proyecto ni el periodo (ya están en el encabezado) */
  .ob-cab{ border:none; padding:0 0 4px; font-size:8.5pt; gap:0; }
  .ob-cab .ob-dup{ display:none !important; }
  .ob-cab-grid{ grid-template-columns:repeat(3, minmax(0,1fr)) !important; gap:1px 14px; border-top:1px solid #bbb; border-bottom:1px solid #bbb; padding:3px 0; }
  .ob-dato{ gap:5px; line-height:1.25; }
  .ob-dato .k{ width:auto; min-width:0; font-size:7pt; white-space:nowrap; }
  .ob-dato .k::after{ content:':'; }
  .ob-dato .v{ font-size:8pt; }
  table.ob-tabla{ font-size:8pt; }
  table.ob-tabla th{ font-size:7.5pt; padding:2px 3px; }
  table.ob-tabla td{ padding:1px 3px; }
  table.ob-tabla tr.ob-actual td, table.ob-tabla tr.ob-sep-row td, table.ob-tabla tr.ob-pie td, table.ob-tabla tr.ob-strong td{ -webkit-print-color-adjust:exact; print-color-adjust:exact; }
  table.ob-ficha{ border:none; font-size:10pt; }
  table.ob-ficha td{ padding:3px 6px; }
  .ob-montos > div{ border-color:#999; padding:4px 8px; }
  .ob-montos b{ font-size:11pt; }
}
/* ---------- Liquidación de obra ---------- */
.liq-datos{ display:flex; flex-direction:column; gap:12px; }
.liq-datos .ob-inp{ padding:5px 8px; border-radius:6px; border:1px solid var(--border); background:var(--surface); color:var(--text); font:inherit; font-size:12.5px; }
table.liq-resumen td:first-child{ min-width:420px; }
table.liq-resumen tr.liq-final td{ background:var(--lvl2-bg); color:var(--accent); font-size:13px; }
tr.liq-aporte td{ font-size:10.5px; color:var(--text-muted); background:var(--surface-2); }
.liq-k{ font-family:var(--font-num); font-weight:700; font-size:13px; padding:8px 12px; border:1px solid var(--border); border-radius:var(--radius-sm); background:var(--surface); overflow-wrap:anywhere; }
.liq-norma{ font-size:11.5px; color:var(--text-muted); line-height:1.45; max-width:980px; }
@media print{ table.liq-resumen tr.liq-final td, tr.liq-aporte td{ -webkit-print-color-adjust:exact; print-color-adjust:exact; } table.liq-resumen td:first-child{ min-width:0; } }
/* Barra superior: más menús (Expediente técnico, Valorización, Liquidación) en una sola fila */
header.topbar nav.maintabs{ gap:2px; }
header.topbar nav.maintabs > button, header.topbar nav.maintabs > a, header.topbar nav.maintabs .nav-drop-btn{ padding-left:9px; padding-right:9px; }
@media (max-width:1680px){ header.topbar nav.maintabs > button, header.topbar nav.maintabs > a, header.topbar nav.maintabs .nav-drop-btn{ font-size:12.5px; letter-spacing:.02em; padding-left:7px; padding-right:7px; } }
.ob-doc input.ob-inp, .ob-doc select.ob-inp{ padding:5px 8px; border-radius:6px; border:1px solid var(--border); background:var(--surface); color:var(--text); font:inherit; font-size:12.5px; }
.liq-datos table.ob-tabla td:first-child input.ob-inp{ min-width:260px; }
/* ---------- IA (Gemini) ---------- */
.ia-btn{ border-color:#8b1e24 !important; color:#8b1e24 !important; }
.et-badge-ia{ color:#6a4fa0; background:#efe9f6; border-color:rgba(106,79,160,.3); }
.ia-progreso{ display:flex; flex-direction:column; gap:4px; }
.ia-barra{ height:8px; border-radius:99px; background:var(--surface-2); overflow:hidden; }
.ia-barra span{ display:block; height:100%; background:var(--accent); transition:width .3s; }


/* =====================================================================
   Tema «Minimal» — moderno y sobrio: fondo blanco hueso, líneas finas,
   tinta casi negra como único acento del marco y letra Inter.
   Solo cambia el MARCO (barra, portadas, tarjetas, panel lateral, pie).
   El contenido del presupuesto conserva sus colores y la IMPRESIÓN no
   cambia (todo está dentro de @media screen).
   ===================================================================== */
@media screen{
  :root{ --mn-bg:#f7f7f5; --mn-surface:#ffffff; --mn-soft:#f1f1ee; --mn-line:#e7e7e3; --mn-line-2:#d6d6d1;
    --mn-ink:#18181b; --mn-text:#27272a; --mn-muted:#71717a; --mn-faint:#a1a1aa; --mn-dot:#16a34a;
    --font-mn:'Inter', system-ui, -apple-system, 'Segoe UI', Arial, sans-serif; }
  html, body{ background:var(--mn-bg); }

  /* ---- barra superior: blanca, una línea fina, sin sombras ---- */
  header.topbar{ background:rgba(255,255,255,.92); border-bottom:1px solid var(--mn-line); box-shadow:none; backdrop-filter:saturate(1.4) blur(8px); }
  nav.maintabs button, nav.maintabs a, nav.maintabs .nav-drop-btn, nav.maintabs .nav-drop-btn.tool-btn{
    font-family:var(--font-mn); font-weight:500; letter-spacing:-.005em; text-transform:none !important; font-size:13.5px; color:var(--mn-muted); background:transparent !important;
    box-shadow:none !important; border:0 !important; border-radius:8px !important; transition:background .15s, color .15s; }
  nav.maintabs button:hover, nav.maintabs a:hover, nav.maintabs .nav-drop-btn:hover, nav.maintabs .nav-drop-btn.tool-btn:hover,
  .nav-drop.open .nav-drop-btn, .nav-drop-tools.open .nav-drop-btn.tool-btn{ color:var(--mn-ink) !important; background:var(--mn-soft) !important; }
  nav.maintabs button[aria-current="true"], nav.maintabs button[aria-current="true"]:hover{
    color:var(--mn-ink) !important; background:var(--mn-soft) !important; font-weight:600; }
  .nav-drop-menu, .nav-drop-tools .nav-drop-menu{ border:1px solid var(--mn-line) !important; border-radius:12px; box-shadow:0 12px 32px -12px rgba(0,0,0,.18); }
  header.topbar{ color:var(--mn-text); }
  header.topbar .brand-logo{ background-image:var(--logo-url); }
  @media (min-width:1101px){ header.topbar{ flex-wrap:nowrap; gap:14px; } header.topbar nav.maintabs{ flex-wrap:nowrap; min-width:0; gap:2px; }
    header.topbar nav.maintabs > *, header.topbar nav.maintabs button, header.topbar nav.maintabs a{ white-space:nowrap; flex:none; } }
  header.topbar .topbar-right{ flex-wrap:nowrap; flex:none; }
  header.topbar .status-pill{ font-family:var(--font-mn); background:transparent; border:1px solid var(--mn-line); color:var(--mn-muted); border-radius:99px; }
  header.topbar .status-pill b{ background:var(--mn-ink); color:#fff; border-radius:99px; font-weight:600; }
  header.topbar .status-dot{ background:var(--mn-dot); box-shadow:none; }
  #user-box .btn{ font-family:var(--font-mn); font-weight:500; border-radius:8px; border-color:var(--mn-line-2); background:var(--mn-surface); color:var(--mn-text); }
  #user-box .btn:hover{ background:var(--mn-soft); color:var(--mn-ink); }
  #user-box .btn.primary{ background:var(--mn-ink); border-color:var(--mn-ink); color:#fff; }
  #user-box .btn.primary:hover{ background:#000; }

  /* ---- pie ---- */
  footer.appfoot{ background:transparent; border-top:1px solid var(--mn-line); color:var(--mn-faint); font-family:var(--font-mn); font-size:12px; }

  /* ---- portadas (Expediente técnico, Valorización, Liquidación, Insumos, Catálogo) ---- */
  .wrap > .pagehead{ border:0; padding-bottom:6px; }
  .wrap > .pagehead h1{ font-family:var(--font-mn); font-weight:650; letter-spacing:-.025em; color:var(--mn-ink); font-size:26px; }
  .wrap > .pagehead p{ color:var(--mn-muted); }
  .wrap > .pagehead .btn{ font-family:var(--font-mn); font-weight:500; background:var(--mn-surface); border:1px solid var(--mn-line-2); color:var(--mn-text); border-radius:8px; box-shadow:none; }
  .wrap > .pagehead .btn:hover{ border-color:var(--mn-ink); color:var(--mn-ink); background:var(--mn-surface); }
  .wrap > .pagehead .btn.primary{ background:var(--mn-ink); border-color:var(--mn-ink); color:#fff; }
  .wrap > .pagehead .btn.primary:hover{ background:#000; color:#fff; }
  .wrap:not(.pres-layout) > .card.empty{ background:var(--mn-surface); border:1px dashed var(--mn-line-2); box-shadow:none; border-radius:12px; }

  /* ---- tarjetas de presupuesto: blancas, borde fino, se elevan al pasar ---- */
  .grid-cards{ gap:16px; }
  .grid-cards > .budget-card{ background:var(--mn-surface); border:1px solid var(--mn-line); border-radius:14px; box-shadow:none;
    transition:border-color .15s, box-shadow .15s, transform .15s; }
  .grid-cards > .budget-card:hover{ border-color:var(--mn-line-2); box-shadow:0 14px 30px -18px rgba(24,24,27,.35); transform:translateY(-2px); }
  .grid-cards > .budget-card h3{ font-family:var(--font-mn); font-weight:600; letter-spacing:-.01em; color:var(--mn-ink); font-size:15px; line-height:1.35; }
  .grid-cards > .budget-card .meta, .grid-cards > .budget-card .stat-row, .grid-cards > .budget-card .muted{ color:var(--mn-muted) !important; }
  .grid-cards > .budget-card .total{ color:var(--mn-ink); font-family:var(--font-mn); font-weight:650; letter-spacing:-.02em; }
  .grid-cards > .budget-card .ob-abrir{ color:var(--mn-ink); font-family:var(--font-mn); font-weight:600; }
  .grid-cards > .budget-card .icon-btn{ color:var(--mn-faint); }
  .grid-cards > .budget-card .icon-btn:hover{ color:var(--mn-ink); background:var(--mn-soft); }

  /* ---- panel lateral del presupuesto / obra / liquidación ---- */
  .pres-layout .pres-side{ background:var(--mn-surface); border:1px solid var(--mn-line); border-radius:14px; box-shadow:none; }
  .pres-side-back{ color:var(--mn-muted) !important; font-family:var(--font-mn); font-weight:500; }
  .pres-side-back:hover{ color:var(--mn-ink) !important; }
  .pres-side-info h1{ font-family:var(--font-mn); font-weight:650; letter-spacing:-.015em; color:var(--mn-ink); }
  .pres-side-info p{ color:var(--mn-muted); }
  .pres-side-acciones{ border-color:var(--mn-line) !important; }
  .pres-side-acciones .btn{ font-family:var(--font-mn); font-weight:500; border-radius:8px; }
  .pres-side-acciones .btn:hover{ background:var(--mn-soft) !important; }
  .pres-side-acciones .btn.primary{ background:var(--mn-ink) !important; border-color:var(--mn-ink) !important; color:#fff !important; }
  .pres-side-acciones .btn.primary:hover{ background:#000 !important; }
  .pres-tabs button{ font-family:var(--font-mn); font-weight:500; color:var(--mn-muted); border-radius:8px; }
  .pres-tabs button:hover{ background:var(--mn-soft) !important; color:var(--mn-ink) !important; }
  .pres-tabs button[aria-current="true"], .pres-tabs button[aria-current="true"]:hover{ background:var(--mn-soft) !important; color:var(--mn-ink) !important;
    font-weight:600; border-left-color:var(--mn-ink) !important; box-shadow:none !important; }
  .pres-tabs hr{ border-top:1px solid var(--mn-line) !important; }
  .ob-menu .ob-menu-g{ color:var(--mn-faint); font-family:var(--font-mn); font-weight:600; font-size:11px; letter-spacing:.08em; text-transform:uppercase; }
}
@media screen and (max-width:1680px){ header.topbar nav.maintabs > button, header.topbar nav.maintabs > a, header.topbar nav.maintabs .nav-drop-btn{ font-size:13px !important; padding-left:7px !important; padding-right:7px !important; }
  header.topbar .saludo-txt{ display:none; } }
@media screen and (max-width:1520px){ header.topbar nav.maintabs > button, header.topbar nav.maintabs > a, header.topbar nav.maintabs .nav-drop-btn{ font-size:12.5px !important; padding-left:6px !important; padding-right:6px !important; } }
@media screen and (max-width:1366px){ header.topbar nav.maintabs > button, header.topbar nav.maintabs > a, header.topbar nav.maintabs .nav-drop-btn{ font-size:11.5px !important; padding-left:6px !important; padding-right:6px !important; } }
/* ---- barra superior negra con resaltado rojo ---- */
@media screen{
  header.topbar{ background:#111113; border-bottom:1px solid #000; color:#e4e4e7; backdrop-filter:none; }
  header.topbar .brand-logo{ background-image:url('logo-oscuro.png'); }
  header.topbar nav.maintabs button, header.topbar nav.maintabs a, header.topbar nav.maintabs .nav-drop-btn, header.topbar nav.maintabs .nav-drop-btn.tool-btn{ color:#c4c4c8; }
  header.topbar nav.maintabs button:hover, header.topbar nav.maintabs a:hover, header.topbar nav.maintabs .nav-drop-btn:hover, header.topbar nav.maintabs .nav-drop-btn.tool-btn:hover,
  header.topbar .nav-drop.open .nav-drop-btn, header.topbar .nav-drop-tools.open .nav-drop-btn.tool-btn{ color:#fff !important; background:#c62828 !important; }
  header.topbar nav.maintabs button[aria-current="true"]{ color:#fff !important; background:rgba(255,255,255,.12) !important; box-shadow:inset 0 -2px 0 #e53935 !important; }
  header.topbar nav.maintabs button[aria-current="true"]:hover{ background:#c62828 !important; box-shadow:none !important; }
  header.topbar .status-pill{ border-color:#2e2e33; color:#a1a1aa; }
  header.topbar .status-pill b{ background:#c62828; }
  header.topbar #user-box .btn{ background:transparent; border-color:#3a3a40; color:#e4e4e7; }
  header.topbar #user-box .btn:hover{ background:#c62828; border-color:#c62828; color:#fff; }
  header.topbar #user-box .btn.primary{ background:#c62828; border-color:#c62828; color:#fff; }
  header.topbar #user-box .btn.primary:hover{ background:#a51d1d; border-color:#a51d1d; }
}
/* ---- menú lateral: opción activa en rojo; acciones (Datos generales, Sub-presupuestos, Exportar .ing, Importar APU) en negro al seleccionar ---- */
@media screen{
  .pres-tabs button[aria-current="true"], .pres-tabs button[aria-current="true"]:hover{
    background:#c62828 !important; color:#fff !important; font-weight:700; border-left-color:#c62828 !important; box-shadow:0 4px 12px -4px rgba(198,40,40,.55) !important; }
  .pres-tabs button:active{ background:#c62828 !important; color:#fff !important; }
  .pres-side-acciones .btn:not(.primary):hover, .pres-side-acciones .btn:not(.primary):focus-visible, .pres-side-acciones .btn:not(.primary):active{
    background:#111113 !important; border-color:#111113 !important; color:#fff !important; }
}
/* lista de resultados de «Nueva partida»: su diseño y dibujo no afectan al resto de la página (más rápida) */
.cat-pick-lista{ contain:content; }
.ia-clave{ border:1px solid var(--border); border-radius:8px; padding:8px 10px; background:var(--surface-2); font-size:12.5px; }
.ia-clave summary{ cursor:pointer; font-weight:700; }
.ia-clave code{ font-size:11.5px; }
/* Valorización de avance: filas y columnas separadas (como el cronograma valorizado) y cada grupo
   (Presupuesto · Anterior · Actual · Acumulado · Saldo) cerrado con una línea más gruesa */
table.ob-val-tabla{ border-collapse:collapse; border:1px solid var(--border); }
table.ob-val-tabla th, table.ob-val-tabla td{ border:1px solid var(--border); }
table.ob-val-tabla thead th{ border-color:rgba(255,255,255,.22); }
table.ob-val-tabla th.ob-g, table.ob-val-tabla td.ob-g{ border-right:2px solid var(--text-muted); }
table.ob-val-tabla thead th.ob-g{ border-right:2px solid rgba(255,255,255,.6); }
table.ob-val-tabla tfoot tr.ob-pie:first-child td{ border-top:2px solid var(--text-muted); }
table.ob-val-tabla tfoot tr.ob-pie-pct td{ font-weight:700; }
@media print{
  table.ob-val-tabla th, table.ob-val-tabla td{ border:1px solid #777 !important; }
  table.ob-val-tabla th.ob-g, table.ob-val-tabla td.ob-g{ border-right:2px solid #000 !important; }
  table.ob-val-tabla tfoot tr.ob-pie:first-child td{ border-top:2px solid #000 !important; }
}

/* calendarios por mes (valorizado / actualizado) */
table.ob-cal th.ob-th-fecha{ font-size:9.5px; font-weight:600; white-space:nowrap; }
table.ob-cal td.cv-mes{ min-width:86px; }
@media print{ table.ob-cal th.ob-th-fecha{ font-size:6.5pt; } }

/* insignia del rol en la barra superior: ADMINISTRADOR (rojo) · USUARIO PRO · INVITADO */
header.topbar .status-pill b.rol-badge, .status-pill b.rol-badge{ display:inline-block; max-width:none; padding:3px 10px; border-radius:6px;
  font-size:11px; font-weight:800; letter-spacing:.08em; line-height:1.3; color:#fff !important; text-transform:uppercase; }
header.topbar .status-pill b.rol-admin, .status-pill b.rol-admin{ background:#c62828 !important; box-shadow:0 0 0 1px rgba(255,255,255,.15) inset; }
header.topbar .status-pill b.rol-pro, .status-pill b.rol-pro{ background:#1f7a46 !important; }
header.topbar .status-pill b.rol-usuario, .status-pill b.rol-usuario{ background:#5b5b63 !important; }
header.topbar .status-pill b.rol-invitado, .status-pill b.rol-invitado{ background:#3a3a40 !important; color:#e4e4e7 !important; }
header.topbar .status-pill .status-badge.lectura{ margin-left:4px; }
/* recordatorio de vencimiento de la suscripción */
.susc-aviso{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin:10px auto 0; max-width:1240px; padding:10px 14px;
  border:1px solid #f0c36d; border-left:4px solid #e0a020; border-radius:10px; background:#fff8e6; color:#5a4100; font-size:13px; }
.susc-aviso > span{ flex:1; min-width:240px; }
.susc-aviso .susc-wa{ background:#1f9d55; border-color:#1f9d55; color:#fff; font-weight:700; text-decoration:none; }
.susc-aviso .susc-wa:hover{ background:#17803f; border-color:#17803f; }
@media (max-width:1300px){ .susc-aviso{ margin-left:16px; margin-right:16px; } }
#user-box .user-btn b.rol-badge{ display:inline-block; padding:2px 8px; border-radius:5px; font-size:10.5px; font-weight:800; letter-spacing:.07em; line-height:1.35; color:#fff; margin-left:4px; }
#user-box .user-btn b.rol-admin{ background:#c62828; }
#user-box .user-btn b.rol-pro{ background:#1f7a46; }
#user-box .user-btn b.rol-usuario{ background:#5b5b63; }
header.topbar .status-pill:has(#status-text:empty){ padding:6px; border-color:transparent; }
/* pantallas medianas: el botón del usuario muestra solo el ícono y la insignia (el nombre sale al pasar el ratón) */
@media screen and (max-width:1560px){ header.topbar #user-box .user-nom{ display:none; } }
@media screen and (max-width:1366px){ header.topbar nav.maintabs > button, header.topbar nav.maintabs > a, header.topbar nav.maintabs .nav-drop-btn{ font-size:11px !important; padding-left:4px !important; padding-right:4px !important; } header.topbar{ gap:8px !important; } }
.plt-card.plt-card-ia{ border-color:#d9c2f0; background:linear-gradient(135deg,#fbf8ff,#fff); }
.plt-card.plt-card-ia.sel{ border-color:#6a4fa0; box-shadow:0 0 0 1px #6a4fa0 inset; }
/* Presupuesto nuevo desde un modelo BIM (IFC) */
.plt-card.plt-card-bim{ border-color:#e0c9cb; background:linear-gradient(135deg,#fbf5f5,#fff); }
.plt-card.plt-card-bim.sel{ border-color:#8b1e24; box-shadow:0 0 0 1px #8b1e24 inset; }
#m-ia-desc{ width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:8px; font:inherit; font-size:13px; resize:vertical; }
/* nombre del insumo editable en el APU */
input.apu-ins-nom{ width:100%; min-width:180px; border:1px solid transparent; background:transparent; padding:4px 6px; border-radius:6px; font:inherit; color:inherit; }
input.apu-ins-nom:hover{ border-color:var(--border); background:var(--surface); }
input.apu-ins-nom:focus{ border-color:#18181b; background:var(--surface); outline:none; }
/* Cálculo de K: índices por área, a mano o hallados con IA */
td.liq-ind input{ width:76px; text-align:right; padding:2px 5px; border:1px solid transparent; border-radius:5px; background:transparent; font:inherit; font-variant-numeric:tabular-nums; }
td.liq-ind input:hover{ border-color:var(--border); background:var(--surface); }
td.liq-ind input:focus{ border-color:#18181b; background:#fff; outline:none; }
td.liq-ind input::placeholder{ color:var(--text); opacity:1; }
td.liq-ind-falta input::placeholder{ color:#c62828; font-weight:700; }
td.liq-ind-manual input{ font-weight:800; color:#18181b; background:#fff8e6; }
td.liq-ind-ia input{ font-weight:700; color:#6a4fa0; background:#f3eefb; }
.liq-ley{ display:inline-flex; gap:8px; margin-left:8px; } .liq-ley i{ font-style:normal; padding:1px 7px; border-radius:5px; font-size:11px; font-weight:700; }
.liq-ley .liq-ind-manual{ background:#fff8e6; color:#18181b; } .liq-ley .liq-ind-ia{ background:#f3eefb; color:#6a4fa0; } .liq-ley .liq-ind-falta{ background:var(--bad-bg); color:#c62828; }
.liq-fuentes{ margin-top:6px; font-size:12px; } .liq-fuentes ul{ margin:4px 0 0 18px; padding:0; }
@media print{ td.liq-ind input{ display:none; } }
.card.liq-area{ padding:10px 14px; }
/* casillas de índices: se ven como casillas para escribir */
td.liq-ind input{ border:1px solid var(--border) !important; background:#fff; }
td.liq-ind input:focus{ border-color:#18181b !important; box-shadow:0 0 0 2px rgba(24,24,27,.12); }
td.liq-ind-manual input{ background:#fff8e6 !important; } td.liq-ind-ia input{ background:#f3eefb !important; }
/* página Índices unificados */
.idx-filtros{ display:flex; gap:12px; flex-wrap:wrap; align-items:flex-end; padding:12px 14px; }
.idx-filtros label{ display:flex; flex-direction:column; gap:4px; font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--text-muted); }
.idx-filtros select, .idx-filtros input{ padding:7px 9px; border:1px solid var(--border); border-radius:7px; font:inherit; font-size:13px; text-transform:none; letter-spacing:0; color:var(--text); }
table.idx-tabla td{ padding:2px 3px; }
table.idx-tabla td:nth-child(2){ min-width:220px; font-size:11.5px; }
input.idx-in{ width:70px; text-align:right; padding:4px 5px; border:1px solid var(--border); border-radius:5px; font:inherit; font-size:11.5px; font-variant-numeric:tabular-nums; background:#fff; }
input.idx-in:focus{ border-color:#18181b; outline:none; box-shadow:0 0 0 2px rgba(24,24,27,.12); }
input.idx-in::placeholder{ color:#a1a1aa; }
/* IA: revisión del presupuesto */
.pres-side-acciones .btn.ia-side{ color:#6a4fa0; }
.rev-resumen{ background:var(--surface-2); border-radius:8px; padding:10px 12px; font-size:13px; display:flex; flex-direction:column; gap:4px; }
.rev-lista{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:6px; max-height:52vh; overflow:auto; }
.rev-lista li{ display:flex; gap:10px; padding:8px 10px; border:1px solid var(--border); border-left-width:4px; border-radius:8px; font-size:13px; background:var(--surface); }
.rev-lista li.rev-error{ border-left-color:#c62828; } .rev-lista li.rev-advertencia{ border-left-color:#e0a020; } .rev-lista li.rev-sugerencia{ border-left-color:#6a4fa0; }
.rev-ico{ flex:none; } .rev-par{ font-weight:600; }
.chip.rev-c-error{ color:#c62828; } .chip.rev-c-advertencia{ color:#a8741a; } .chip.rev-c-sugerencia{ color:#6a4fa0; }
/* IA: informe mensual de la valorización */
.inf-ctrl{ display:flex; flex-direction:column; gap:8px; padding:12px 14px; }
.inf-notas{ display:flex; flex-direction:column; gap:4px; font-size:12.5px; font-weight:700; }
.inf-notas textarea, textarea.inf-txt{ width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:8px; font:inherit; font-size:13px; font-weight:400; line-height:1.5; resize:vertical; }
.inf-doc{ padding:18px 22px; display:flex; flex-direction:column; gap:12px; }
.inf-sec h3{ font-size:13px; text-transform:uppercase; letter-spacing:.03em; margin:0 0 6px; color:var(--text); }
.inf-print{ font-size:12.5px; line-height:1.6; text-align:justify; }
.inf-firma{ margin:40px auto 6px; text-align:center; font-size:12px; min-width:260px; } .inf-linea{ border-top:1px solid #333; margin-bottom:6px; }
@media print{ .inf-doc{ border:none !important; padding:0 !important; } .inf-print{ font-size:10.5pt; } .inf-sec{ break-inside:avoid-page; } }

/* =====================================================================
   Fondo de la web: textura gris (assets/fondo.png). Solo en pantalla:
   la impresión sigue con fondo blanco. Los textos que van directo sobre
   el fondo (títulos de página, pie, avisos) pasan a claros.
   ===================================================================== */
@media screen{
  html, body{ background:#5c5c5c url('fondo.png') repeat !important; }
  .wrap > .pagehead h1{ color:#fff; }
  .wrap > .pagehead p{ color:#d4d4d4; }
  footer, .site-footer{ color:#d4d4d4 !important; border-top-color:rgba(255,255,255,.12) !important; }
  footer a{ color:#fff !important; }
  /* rótulos que quedan sobre el fondo, fuera de las tarjetas */
  .pres-main > .row, .pres-main > .row .muted, .pres-main > .row > span, .pres-main > div > .row > .muted, .pres-main > div > .row > span,
  .pleg-lab, .ob-periodo{ color:#ececec !important; }
  .ob-titulo{ color:#fff !important; }
  .et-titulo, .et-titulo b, .et-titulo .muted{ color:#fff !important; }
  .pres-main > p.muted.no-print, .pres-main > div > p.muted.no-print, .pres-main > div > div.muted.no-print,
  .crono-root > .row.no-print label, .crono-root > .row.no-print label .muted,
  .ob-doc > p.muted.no-print, .ob-doc > .liq-norma, .ob-doc > .liq-norma b{ color:#ececec !important; }
  .crono-leyenda, .crono-leyenda span, .crono-leyenda .muted{ color:#ececec !important; }
  .pres-main > .row.no-print > .btn.ghost, .pres-main > div > .row.no-print > .btn.ghost{ color:#fff !important; border-color:rgba(255,255,255,.4) !important; }
}

/* Paralizaciones y suspensiones de obra (Gantt de Valorización de obra) */
.par-card{ border-left:4px solid #c62828; padding:12px 16px; }
.par-tabla td, .par-tabla th{ font-size:12.5px; }
.par-tag{ display:inline-block; padding:2px 8px; border-radius:99px; font-size:11.5px; font-weight:700; background:#fbe1e3; color:#b71c1c; white-space:nowrap; }
.par-tag.sus{ background:#fff1d6; color:#8a5a00; }
.par-resumen{ margin-top:8px; font-size:12.5px; color:var(--text-muted); }
.par-resumen b{ color:var(--text); }

/* =====================================================================
   Encabezados de tabla en pantalla: gris pizarra (antes negro), más
   armonioso con el fondo gris y el rojo vino. Solo pantalla: la impresión
   conserva sus colores. Para cambiarlo, edita --th-bg / --th-bg-2.
   ===================================================================== */
@media screen{
  :root{ --th-bg:#4f5965; --th-bg-2:#434c57; --th-line:rgba(255,255,255,.2); }
  table.data thead th, .cat-pick-lista thead th, .vinc-lista thead th, table.res-pres thead th,
  table.curva-s-tabla th, table.res-inv .ri-banda th, table.res-inv .ri-banda td{
    background:linear-gradient(180deg, var(--th-bg), var(--th-bg-2)) !important; color:#fff !important; }
  table.data thead th{ border-color:var(--th-line); }
  table.data thead tr:last-child th{ border-bottom:2px solid #8b1e24; }
}

/* =====================================================================
   Informe mensual de obra (Valorización de obra → Informe mensual)
   Pantalla: hoja blanca con la misma letra del impreso.
   Impresión (body.imp-informe): A4 vertical con márgenes de documento
   (25 mm arriba, 20 mm derecha, 22 mm abajo, 30 mm izquierda — se fijan
   en app.js), Calibri 12, cuadros en 10, numeración de páginas.
   ===================================================================== */
.inf-doc{ --inf-font:Calibri, Carlito, 'Segoe UI', Arial, sans-serif; font-family:var(--inf-font); color:#111; }
.inf-doc .inf-cab{ text-align:center; margin-bottom:6px; position:relative; }
.inf-doc .inf-logo{ position:absolute; right:0; top:0; max-height:52px; max-width:120px; object-fit:contain; }
.inf-doc .inf-t1{ font-weight:700; font-size:17px; text-decoration:underline; letter-spacing:.01em; }
.inf-doc .inf-t2{ font-weight:700; font-size:15px; margin-top:4px; }
.inf-doc .inf-t3{ font-size:14px; margin-top:2px; }
.inf-doc .inf-sec{ display:block; }
.inf-doc .inf-sec h3{ font-family:var(--inf-font); font-size:15px; font-weight:700; text-transform:uppercase; letter-spacing:0; color:#1f2e45; margin:14px 0 6px; }
.inf-doc .inf-sec h3 .rn{ display:inline-block; min-width:34px; }
.inf-doc .inf-print{ font-size:15px; line-height:1.5; text-align:justify; }
.inf-doc .inf-print p, .inf-doc .inf-sec > p{ margin:0 0 8px 34px; font-size:15px; line-height:1.5; text-align:justify; }
.inf-doc p.inf-sub{ font-weight:700; font-style:italic; margin:10px 0 4px 34px; text-align:left; }
.inf-doc p.inf-sub span{ display:inline-block; min-width:26px; }
.inf-doc p.inf-li{ display:flex; gap:8px; margin:0 0 6px 50px; }
.inf-doc p.inf-li .n{ flex:none; min-width:18px; }
.inf-doc p.inf-proy{ font-weight:700; text-align:justify; }
.inf-doc .inf-son{ font-weight:700; text-align:center !important; margin:6px 0 10px !important; }
.inf-doc .inf-cuadro{ margin:8px 0 12px 34px; break-inside:avoid; }
.inf-doc .inf-cuadro-tit{ font-weight:700; font-size:13px; margin:0 0 4px; }
.inf-doc table.inf-tabla{ width:100%; border-collapse:collapse; font-family:var(--inf-font); font-size:13px; }
.inf-doc table.inf-tabla th, .inf-doc table.inf-tabla td{ border:1px solid #9aa3ad; padding:3px 7px; vertical-align:middle; text-align:left; }
.inf-doc table.inf-tabla th{ background:#e8ecf1 !important; color:#111 !important; font-weight:700; text-align:center; }
.inf-doc table.inf-tabla td.r{ text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
.inf-doc table.inf-tabla td.c{ text-align:center; }
.inf-doc table.inf-tabla.kv td.k{ width:48%; font-weight:600; background:#f6f7f9; }
.inf-doc table.inf-tabla tr.tot td{ font-weight:700; background:#eef1f5; }
.inf-doc .inf-cuadros-pant{ margin-top:6px; }
.inf-doc .inf-cuadros-pant:empty{ display:none; }
.inf-doc .inf-lugar{ text-align:right; margin:22px 0 0; font-size:15px; }
.inf-doc .inf-firma{ font-size:14px; }
@media screen{
  .inf-doc{ max-width:900px; margin:0 auto; padding:34px 46px 28px !important; background:#fff; box-shadow:0 2px 14px rgba(0,0,0,.18); }
  .inf-doc textarea.inf-txt{ width:100%; font:14px/1.45 var(--inf-font); margin:2px 0 6px; }
}
@media print{
  /* solo el informe: sin barra, panel lateral, controles ni carátula de los demás reportes */
  html body.imp-informe .pres-side, html body.imp-informe .ob-titulo, html body.imp-informe .inf-ctrl,
  html body.imp-informe .print-letterhead-logo-wrap, html body.imp-informe .print-letterhead{ display:none !important; }
  html body.imp-informe .inf-cuadros-pant{ display:none !important; }
  html body.imp-informe .pres-layout, html body.imp-informe .pres-main, html body.imp-informe #obra-doc{ display:block !important; margin:0 !important; padding:0 !important; max-width:none !important; width:auto !important; }
  html body.imp-informe #obra-doc .inf-doc{ box-shadow:none !important; border:0 !important; padding:0 !important; max-width:none !important; background:#fff !important; }
  html body.imp-informe #obra-doc .inf-doc, html body.imp-informe #obra-doc .inf-doc :is(div,span,p,b,h3,li,strong,em){ font-family:Calibri, Carlito, Arial, sans-serif !important; font-size:12pt !important; line-height:1.45 !important; color:#000 !important; }
  html body.imp-informe #obra-doc .inf-doc .inf-t1{ font-size:14pt !important; }
  html body.imp-informe #obra-doc .inf-doc .inf-t2{ font-size:12pt !important; }
  html body.imp-informe #obra-doc .inf-doc .inf-sec h3{ font-size:12pt !important; color:#000 !important; margin:12pt 0 4pt !important; break-after:avoid; }
  html body.imp-informe #obra-doc .inf-doc p.inf-sub{ break-after:avoid; }
  html body.imp-informe #obra-doc .inf-doc p{ orphans:3; widows:3; }
  html body.imp-informe #obra-doc .inf-doc .inf-sec{ break-inside:auto !important; }
  html body.imp-informe #obra-doc .inf-doc :is(table.inf-tabla, table.inf-tabla th, table.inf-tabla td, .inf-cuadro-tit){ font-family:Calibri, Carlito, Arial, sans-serif !important; font-size:10pt !important; line-height:1.25 !important; color:#000 !important; }
  html body.imp-informe #obra-doc .inf-doc table.inf-tabla th, html body.imp-informe #obra-doc .inf-doc table.inf-tabla td{ border:0.5pt solid #555 !important; padding:2pt 5pt !important; }
  html body.imp-informe #obra-doc .inf-doc table.inf-tabla thead{ display:table-header-group; }
  html body.imp-informe #obra-doc .inf-doc table.inf-tabla tr{ break-inside:avoid; }
  html body.imp-informe #obra-doc .inf-doc .inf-firma{ break-inside:avoid; margin-top:36pt !important; }
}

/* =====================================================================
   Impresión de TODOS los reportes
   1) Sin espacios en blanco: los cuadros se parten entre hojas. Firefox no
      parte un contenedor con desplazamiento (overflow:auto/hidden) ni las
      rejillas/flex: los mandaba enteros a la hoja siguiente y dejaba la
      primera en blanco. Al imprimir pasan a flujo normal y sin recorte.
   2) Encabezado de los cuadros (ITEM, DESCRIPCIÓN, UND., …) con un fondo
      sobrio: gris azulado claro, letras azul marino y filetes finos, en
      lugar del negro. Se cambia con --pr-th-bg / --pr-th-tx / --pr-th-line.
   ===================================================================== */
@media print{
  :root{ --pr-th-bg:#dde4ec; --pr-th-tx:#1f2e45; --pr-th-line:#1f2e45; --pr-th-sep:#aab6c3; }
  html, body, main#view, .wrap, .pres-layout, .pres-main, #obra-doc, .ob-doc, .crono-root,
  .card, .table-scroll, .table-wrap, .val-wrap, .liq-doc{ overflow:visible !important; max-height:none !important; }
  .pres-layout, .pres-main, .ob-doc, .crono-root{ display:block !important; }
  .card{ border:0 !important; border-radius:0 !important; box-shadow:none !important; background:transparent !important; padding-left:0 !important; padding-right:0 !important; }
  .card.table-scroll, .card:has(> table.data){ padding:0 !important; }
  table.data, table.res-pres, table.res-inv, table.curva-s-tabla{ break-inside:auto !important; page-break-inside:auto !important; }
  table.data thead, table.res-pres thead, table.res-inv thead{ display:table-header-group; }

  html body table.data thead th, html body table.res-pres thead th, html body table.curva-s-tabla th,
  html body table.res-inv .ri-banda th, html body table.res-inv .ri-banda td{
    background:var(--pr-th-bg) !important; color:var(--pr-th-tx) !important; font-weight:700 !important;
    border-top:1pt solid var(--pr-th-line) !important; border-bottom:1pt solid var(--pr-th-line) !important;
    border-left:0.5pt solid var(--pr-th-sep) !important; border-right:0.5pt solid var(--pr-th-sep) !important;
    border-radius:0 !important; box-shadow:none !important; }
  html body table.data thead th *, html body table.res-pres thead th *{ color:var(--pr-th-tx) !important; }
  html body table.data thead tr + tr th{ border-top:0.5pt solid var(--pr-th-sep) !important; }
  /* el sustento de metrados mantiene su cabecera sin fondo */
  html body table.data.metrado-mini thead th, html body table.data.metrado-mini thead th *{ background:transparent !important; color:#1f2e45 !important; border-left:0 !important; border-right:0 !important; border-top:0 !important; }
}
