/* editor.css — estilos del editor unificado de documentos (editor.html) y del editor de líneas
   EMBEBIDO en el panel de la OT (partes.html). #13 editor único de líneas, 05/09/2026: antes
   vivían inline en editor.html; una segunda página que pinte la misma tabla necesita la MISMA
   hoja, no una copia. */
    /* ── LAYOUT ──────────────────────────────────────────── */
    /* Sprint 1.5 fix-pass FIX 3 — altura combinada topbar + barra MO/Mat (para paneles laterales) */
    :root { --ed-stack-height: 100px; }
    .ed-wrap { display:flex; flex-direction:column; height:100vh; overflow:hidden; }
    .ed-topbar {
      display:flex; align-items:center; gap:12px; padding:10px 20px;
      background:var(--color-background-primary); border-bottom:1px solid var(--color-border-primary);
      border-left:4px solid var(--ed-accent, #1a2e4a);
      min-height:52px; flex-shrink:0;
      /* Sprint 1.5 T7 — position:relative para que z-index sea efectivo.
         Sube por encima de .ed-lib-panel (z:800) y fichaPanel/sintesisPanel (misma clase) */
      position:relative; z-index:850;
    }
    /* S1F2/F3 — visibilidad por tipo de documento
       Patrón body:not() — específicidad (0,4,1,0) gana sobre .ed-fg/.btn/.ed-pay-panel (0,0,1,0)
       sin usar !important, para no pisar los style="display:none" inline controlados por JS. */
    /* .ed-invoice-only visible en invoice/credit/delivery/proforma (todos los que viven en tabla invoices) */
    body:not(.ed-type-invoice):not(.ed-type-credit):not(.ed-type-delivery):not(.ed-type-proforma) .ed-invoice-only { display: none; }
    /* Cobros solo aplicable a facturas reales (no delivery/proforma) */
    body:not(.ed-type-invoice):not(.ed-type-credit) .ed-only-cashable { display: none; }
    /* Firma receptor: solo delivery */
    body:not(.ed-type-delivery) .ed-only-delivery { display: none; }
    /* Disclaimer legal: solo proforma */
    body:not(.ed-type-proforma) .ed-only-proforma { display: none; }
    /* Quote-only: ocultar en todos los documentos de venta */
    body:not(.ed-type-quote) .ed-quote-only { display: none; }
    /* SPEC_CERTIFICACIONES F1 — retención de garantía y «Su referencia»: presupuesto, factura y rectificativa (ronda 2) */
    body:not(.ed-type-quote):not(.ed-type-invoice):not(.ed-type-credit) .ed-retencion-only { display: none; }
    /* Sprint BASE-1.7 P1.7.1 — Firma receptor COMPACTA al pie editor */
    .receiver-panel-compact {
      padding: 12px;
      max-height: 200px;
      margin: 16px 0;
      border-top: 1px solid var(--color-border-secondary, #e5e7eb);
      border-bottom: 1px solid var(--color-border-secondary, #e5e7eb);
      background: transparent;
    }
    .receiver-panel-compact .rp-title { font-size: 11px; font-weight: 600; color: var(--color-text-tertiary, #6b7280); text-transform: uppercase; letter-spacing: 0.4px; margin-bottom: 8px; }
    .receiver-panel-compact canvas { width: 100%; max-width: 400px; height: 100px; border: 2px dashed #d1d5db; border-radius: 6px; background: #fff; display: block; touch-action: none; cursor: crosshair; }
    .receiver-panel-compact .rp-actions { display: flex; gap: 8px; align-items: center; margin-top: 8px; flex-wrap: wrap; }
    .receiver-panel-compact .rp-actions input[type=text] { flex: 1; min-width: 160px; padding: 5px 9px; border: 1px solid #d1d5db; border-radius: 5px; font-size: 13px; }
    .receiver-panel-signed {
      padding: 8px 12px;
      max-height: 120px;
      margin: 16px 0;
      display: flex;
      align-items: center;
      gap: 16px;
      background: #f0fdf4;
      border-radius: 6px;
      border: 1px solid #bbf7d0;
      flex-wrap: wrap;
    }
    .receiver-panel-signed .rp-signed-text { flex: 1; font-size: 13px; color: #166534; min-width: 220px; }
    .receiver-panel-signed .rp-signed-text b { color: #14532d; }
    .receiver-signature-mini { width: 120px; height: 60px; border-radius: 4px; border: 1px solid var(--color-border-secondary, #e5e7eb); object-fit: contain; background: #fff; }
    .receiver-panel-signed .rp-clear-btn { font-size: 11px; padding: 4px 8px; color: #dc2626; border: 1px solid #fecaca; background: #fff; border-radius: 5px; cursor: pointer; }
    .receiver-panel-signed .rp-clear-btn:hover { background: #fee2e2; }
    /* Estilos invoice */
    body.ed-type-credit .ed-topbar-num { background: #fee2e2; color: #991b1b; }
    body.ed-type-delivery .ed-topbar-num { background: #dbeafe; color: #1e40af; }
    body.ed-type-proforma .ed-topbar-num { background: #f3f4f6; color: #4b5563; }
    /* S3F2 — Referencias cruzadas clickables en el banner de origen */
    .ed-origin-ref { font-size: 12px; color: var(--color-text-secondary); margin-right: 8px; }
    .ed-origin-ref a { color: #e8750a; text-decoration: none; font-weight: 500; }
    .ed-origin-ref a:hover { text-decoration: underline; }
    /* El aviso de la rectificativa en borrador: se lee como un consejo, no como un error. */
    .ed-origin-aviso { background: #fff7ed; border: 1px solid #fed7aa; border-radius: 6px; padding: 3px 8px; color: #9a3412; }
    /* El cuadre en vivo: cuanto rectificas, cuanto queda y la DIFERENCIA. Vacio no ocupa (`:not(:empty)`). */
    .ed-rect-cuadre:not(:empty) { display: block; margin-top: 4px; font-weight: 600; }
    .ed-rect-cuadre[data-cuadre="exacto"] { color: #15803d; }
    .ed-rect-cuadre[data-cuadre="falta"]  { color: #9a3412; }
    .ed-rect-cuadre[data-cuadre="sobra"]  { color: #b91c1c; }
    .ed-pay-row { display:flex; align-items:center; gap:10px; padding:8px 10px; border-bottom:1px solid var(--color-border-secondary); font-size:13px; }
    .ed-pay-row:last-child { border-bottom: none; }
    .ed-pay-panel { position: fixed; top: 0; right: -480px; width: 460px; max-width: 100vw; height: 100vh; background:#fff; background: var(--color-background-primary, #fff); border-left: 1px solid var(--color-border-primary); box-shadow: -4px 0 16px rgba(0,0,0,.1); z-index: 850; transition: right .25s ease; display: flex; flex-direction: column; }
    .ed-pay-panel.open { right: 0; }
    .ed-topbar-back {
      display:flex; align-items:center; gap:4px; color:var(--color-text-secondary);
      text-decoration:none; font-size:13px; padding:6px 10px; border-radius:6px;
      transition:background .15s;
    }
    .ed-topbar-back:hover { background:var(--color-background-secondary); }
    .ed-topbar-num {
      font-size:14px; font-weight:600; color:var(--color-text-primary);
      background:var(--color-background-secondary); padding:4px 10px; border-radius:6px;
    }
    /* Sprint 1.5 — fecha emisión en topbar (discreto) */
    .ed-topbar-date {
      width:108px; flex-shrink:0; font-size:13px; color:var(--color-text-secondary);
      background:transparent; border:1px solid transparent; border-radius:6px;
      padding:4px 8px; outline:none; font-family:inherit;
      font-variant-numeric:tabular-nums; text-align:center;
    }
    .ed-topbar-date:hover { border-color:var(--color-border-primary); }
    .ed-topbar-date:focus { border-color:#185FA5; background:var(--color-background-primary); box-shadow:0 0 0 3px rgba(24,95,165,.12); }
    .ed-topbar-date::placeholder { color:var(--color-text-tertiary); font-style:italic; }
    .ed-topbar-title {
      flex:1; font-size:15px; font-weight:500; color:var(--color-text-primary);
      white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
      background:transparent; border:1px solid transparent; border-radius:6px;
      padding:4px 8px; outline:none; font-family:inherit; min-width:120px;
    }
    input.ed-topbar-title:hover { border-color:var(--color-border-primary); }
    input.ed-topbar-title:focus { border-color:#185FA5; background:var(--color-background-primary); box-shadow:0 0 0 3px rgba(24,95,165,.12); }
    input.ed-topbar-title::placeholder { color:var(--color-text-tertiary); font-weight:400; font-style:italic; }

    /* ── PANELES OVERLAY (Biblioteca, Ficha, Síntesis): empujan editor (no overlay) ── */
    /* Mantienen .ed-lib-panel position:fixed pero reducen ancho del body cuando alguno está abierto */
    .ed-body { transition: margin-right 0.25s ease; }
    body.has-panel-open .ed-body { margin-right: 380px; }
    body.has-panel-open .ed-sticky-totals { margin-right: 380px; transition: margin-right 0.25s ease; }
    /* (.ed-header-compact ya no necesita su propia regla: vive DENTRO de .ed-body y hereda su margin) */
    /* Sprint Modal Síntesis (06/05/2026) — panel Síntesis necesita 620px para 7 columnas con números formato europeo */
    body.has-sintesis-open .ed-body,
    body.has-sintesis-open .ed-sticky-totals { margin-right: 620px; }
    body.has-panel-open .ed-lib-panel { box-shadow: none; }
    .ed-save-ind {
      font-size:12px; padding:4px 10px; border-radius:999px; white-space:nowrap;
      transition:background .2s, color .2s;   /* NO 'all': animar el ancho movía la fila */
      /* Ancho reservado: el texto varía ("Guardando..." → "Guardado hace 30s" → "Error al
         guardar") y sin esto la fila de botones entera se desplazaba a cada cambio. */
      min-width:132px; text-align:center; box-sizing:border-box;
    }
    .ed-save-ind.saved  { color:#065F46; background:#D1FAE5; }
    .ed-save-ind.dirty  { color:#92400E; background:#FEF3C7; }
    .ed-save-ind.saving { color:#1E40AF; background:#DBEAFE; }
    .ed-save-ind.err    { color:#991B1B; background:#FEE2E2; }

    .ed-actions { display:flex; gap:6px; align-items:center; }
    .ed-actions .btn { font-size:13px; padding:6px 14px; }

    /* ── BODY ────────────────────────────────────────────── */
    .ed-body {
      flex:1; overflow-y:auto; padding:24px 28px 80px;
      background:var(--color-background-secondary);
    }
    .ed-card {
      background:var(--color-background-primary); border-radius:10px;
      border:1px solid var(--color-border-primary); padding:20px 24px; margin-bottom:16px;
    }
    .ed-card-title {
      font-size:13px; font-weight:600; color:var(--color-text-secondary);
      text-transform:uppercase; letter-spacing:.5px; margin-bottom:14px;
    }

    /* ── HEADER FORM ─────────────────────────────────────── */
    .ed-grid { display:grid; grid-template-columns:1fr 1fr; gap:12px 16px; }
    .ed-grid .full { grid-column:1/-1; }
    .ed-fg { display:flex; flex-direction:column; gap:4px; }
    .ed-fg label { font-size:12px; font-weight:500; color:var(--color-text-secondary); }
    .ed-fg input, .ed-fg textarea, .ed-fg select {
      font-size:14px; padding:8px 12px; border:1px solid var(--color-border-primary);
      border-radius:6px; background:var(--color-background-primary); color:var(--color-text-primary);
      transition:border-color .15s;
    }
    .ed-fg input:focus, .ed-fg textarea:focus, .ed-fg select:focus {
      outline:none; border-color:#185FA5; box-shadow:0 0 0 3px rgba(24,95,165,.12);
    }
    .ed-fg textarea { resize:vertical; min-height:60px; }

    /* ── CLIENT PICKER ───────────────────────────────────── */
    .ed-client-wrap { position:relative; }

    /* Sprint 1.5 fix-pass FIX 1 (A1) — type-to-search direcciones de trabajo */
    .ed-addr-wrap { position:relative; }
    .ed-addr-drop {
      display:none; position:absolute; top:calc(100% + 2px); left:0; right:0;
      background:#fff;
      background:var(--color-background-primary, #fff);
      border:1px solid var(--color-border-primary); border-radius:6px;
      box-shadow:0 6px 24px rgba(0,0,0,.13);
      max-height:280px; overflow-y:auto; z-index:200;
    }
    .ed-addr-drop.open { display:block; }
    .ed-addr-drop-item {
      padding:8px 12px; cursor:pointer; font-size:13px;
      border-bottom:1px solid var(--color-border-secondary);
    }
    .ed-addr-drop-item:last-child { border-bottom:none; }
    .ed-addr-drop-item:hover, .ed-addr-drop-item.ed-focused {
      background:var(--color-background-secondary);
    }
    .ed-addr-drop-item .ed-addr-sub { font-size:11px; color:var(--color-text-tertiary); margin-top:1px; }
    .ed-addr-drop-create {
      padding:9px 12px; cursor:pointer; font-size:13px; font-weight:600;
      color:#185FA5; background:rgba(24,95,165,.06);
      border-top:1px solid var(--color-border-primary);
    }
    .ed-addr-drop-create:hover, .ed-addr-drop-create.ed-focused { background:rgba(24,95,165,.12); }
    .ed-addr-drop-empty { padding:10px 12px; font-size:12.5px; color:var(--color-text-tertiary); }

    /* ── OPTIONS ROW ─────────────────────────────────────── */
    .ed-opts { display:flex; gap:16px; flex-wrap:wrap; align-items:flex-end; }
    .ed-opt { display:flex; flex-direction:column; gap:4px; min-width:140px; }
    .ed-opt label { font-size:12px; font-weight:500; color:var(--color-text-secondary); }
    .ed-opt input {
      font-size:14px; padding:6px 10px; border:1px solid var(--color-border-primary);
      border-radius:6px; width:100px; text-align:right;
    }
    .ed-opt input:focus { outline:none; border-color:#185FA5; }

    /* ── SECTIONS AREA ───────────────────────────────────── */
    .ed-sections { min-height:200px; overflow-x:auto; }
    .ed-empty {
      display:flex; flex-direction:column; align-items:center; justify-content:center;
      padding:60px 20px; color:var(--color-text-tertiary); text-align:center;
    }
    .ed-empty-icon { font-size:48px; opacity:.4; margin-bottom:12px; }
    .ed-empty-text { font-size:14px; margin-bottom:16px; }

    /* ── CHAPTER ──────────────────────────────────────────── */
    .ed-chapter {
      border:1px solid var(--color-border-primary); border-radius:8px;
      margin-bottom:12px; background:var(--color-background-primary);
    }
    .ed-chapter.sortable-ghost { opacity:.4; }
    .ed-ch-head {
      display:flex; align-items:center; gap:8px; padding:10px 14px;
      background:var(--color-background-secondary); border-radius:8px 8px 0 0;
      border-bottom:1px solid var(--color-border-primary); cursor:default;
    }
    .ed-ch-drag { cursor:grab; color:var(--color-text-tertiary); font-size:16px; user-select:none; }
    .ed-ch-drag:active { cursor:grabbing; }
    /* F3.4 — chevron expand/collapse */
    .ed-ch-chevron {
      cursor:pointer; user-select:none; color:var(--color-text-secondary,#475569);
      font-size:10px; padding:2px 6px; border-radius:3px; line-height:1;
    }
    .ed-ch-chevron:hover { background:var(--color-background-secondary,#f1f5f9); color:var(--color-text-primary,#1E293B); }
    /* F3.4 — colapso visual */
    .ed-chapter.collapsed [data-ch-sections],
    .ed-chapter.collapsed .ed-add-row { display:none; }
    /* F3.4 corrección — banda lateral naranja cuando hide_composition (reemplaza icono 👁 + tono fondo) */
    .ed-chapter.flag-hide-comp { border-left:4px solid #E8671A; }
    .ed-ch-num {
      font-size:12px; font-weight:700; color:#185FA5; background:#DBEAFE;
      padding:3px 8px; border-radius:4px; white-space:nowrap;
    }
    .ed-ch-title-input {
      flex:1; font-size:14px; font-weight:600; border:none; background:transparent;
      color:var(--color-text-primary); padding:4px 6px; border-radius:4px;
    }
    .ed-ch-title-input:focus { outline:none; background:var(--color-background-primary); box-shadow:0 0 0 2px rgba(24,95,165,.15); }
    .ed-ch-total {
      font-size:13px; font-weight:600; color:var(--color-text-secondary);
      font-variant-numeric:tabular-nums; white-space:nowrap;
    }
    .ed-ch-margin {
      font-size:12px; font-weight:500; font-variant-numeric:tabular-nums;
      white-space:nowrap; margin-left:6px;
    }
    .ed-ch-margin.pos { color:#065F46; }
    .ed-ch-margin.neg { color:#991B1B; }
    .ed-ch-actions { display:flex; align-items:center; gap:4px; }
    .ed-ch-btn {
      border:none; background:none; cursor:pointer; font-size:13px;
      color:var(--color-text-tertiary); padding:4px 6px; border-radius:4px;
    }
    .ed-ch-btn:hover { background:var(--color-background-primary); color:var(--color-text-primary); }
    /* Botones toggle de flags de capítulo (composición/precios/cantidades) — sustituyen al menú ⋮.
       Pastilla neutra = se muestra en el documento · ámbar = oculto. */
    .ed-ch-flag-btn {
      font-size:12px; font-weight:500; padding:4px 9px; white-space:nowrap;
      display:inline-flex; align-items:center; gap:4px; border-radius:999px; background:none;
      cursor:pointer; color:var(--color-text-secondary); border:1px solid var(--color-border-secondary);
    }
    .ed-ch-flag-btn:hover { background:var(--color-background-secondary); }
    /* estado "oculto en el documento" — clase propia: 'hidden' colisiona con la utilidad global de app.css */
    .ed-ch-flag-btn.ed-flag-off { color:#92400E; border-color:#FDE68A; background:#FEF3C7; }
    .ed-ch-flag-btn:disabled { cursor:not-allowed; opacity:.5; }
    .ed-ch-flag-btn:disabled:hover { background:none; }
    .ed-ch-flag-ic { font-size:13px; line-height:1; }

    /* ── SECTION (inside chapter) ─────────────────────────── */
    .ed-section { margin:0 12px 8px; }
    .ed-sec-head {
      display:flex; align-items:center; gap:6px; padding:6px 8px;
      border-bottom:1px solid var(--color-border-secondary);
    }
    .ed-sec-drag { cursor:grab; color:var(--color-text-tertiary); font-size:14px; user-select:none; }
    .ed-sec-title-input {
      flex:1; font-size:13px; font-weight:500; border:none; background:transparent;
      color:var(--color-text-primary); padding:3px 6px; border-radius:4px;
    }
    .ed-sec-title-input:focus { outline:none; background:var(--color-background-primary); }
    .ed-sec-total { font-size:12px; font-weight:600; color:var(--color-text-secondary); font-variant-numeric:tabular-nums; }

    /* ── LINE TABLE ───────────────────────────────────────── */
    .ed-lines { width:100%; border-collapse:collapse; font-size:13px; }
    .ed-lines th {
      text-align:left; font-size:11px; font-weight:500; color:var(--color-text-tertiary);
      padding:6px 8px; border-bottom:1px solid var(--color-border-secondary);
      text-transform:uppercase; letter-spacing:.3px; white-space:nowrap;
    }
    .ed-lines th.r, .ed-lines td.r { text-align:right; white-space:nowrap; }
    .ed-lines td { padding:4px 6px; border-bottom:1px solid var(--color-border-secondary); vertical-align:middle; }
    .ed-lines tr:last-child td { border-bottom:none; }
    .ed-lines tr:hover { background:var(--color-background-secondary); }
    .ed-lines .ed-l-drag { cursor:grab; color:var(--color-text-tertiary); width:20px; text-align:center; }
    .ed-lines input, .ed-lines select {
      border:1px solid transparent; background:transparent; font-size:13px;
      padding:4px 6px; border-radius:4px; color:var(--color-text-primary);
      font-variant-numeric:tabular-nums; width:100%;
    }
    /* El desplegable de unidad es el unico que pelea con la flecha nativa por un hueco muy
       estrecho: se le quita el padding lateral para devolverle esos pixeles al texto. Ensanchar
       la columna sola no bastaba para «forfait», que es la unidad mas larga del catalogo. */
    .ed-lines td[data-col="ud"] select { padding-left:2px; padding-right:0; }
    /* Lo mismo el del IVA (03/10/2026): con 55 px fijos y el padding de todos, la flecha tapaba el «%» y se leía
       «21!». Medido con su clon en `width:auto`: «21%» pide 64 px con padding, 54 sin él. La columna pasa de 55 a 68
       (56 de desplegable, que ya no lleva ancho en línea). Lo vigila smoke-ot-lineas-unico V. */
    .ed-lines td[data-col="iva"] select { padding-left:2px; padding-right:0; }
    .ed-lines input:focus, .ed-lines select:focus {
      border-color:var(--color-border-primary); background:var(--color-background-primary);
      outline:none;
    }
    .ed-lines input.r { text-align:right; }
    .ed-l-numcol {
      font-size:12px; font-weight:600; color:#185FA5; text-align:center;
      white-space:nowrap; min-width:40px; font-variant-numeric:tabular-nums;
    }
    .ed-l-desc { min-width:200px; }
    .ed-l-num { width:70px; }
    /* F319: el coste que se ENSEÑA no es el tecleado (lo dice quien monta el motor, ed.mount costeReal): solo lectura */
    .ed-lines input.ed-l-coste-real { background:var(--color-background-secondary,#f1f5f9); color:var(--color-text-secondary,#64748b); cursor:help; }
    .ed-l-unit { width:55px; }
    .ed-l-margin {
      font-size:12px; font-weight:600; font-variant-numeric:tabular-nums;
      white-space:nowrap; padding:4px 8px;
    }
    .ed-l-margin.pos { color:#065F46; }
    .ed-l-margin.neg { color:#991B1B; }
    .ed-l-del {
      border:none; background:none; cursor:pointer; color:var(--color-text-tertiary);
      font-size:15px; padding:2px 4px; border-radius:4px; opacity:.5;
    }
    .ed-l-del:hover { opacity:1; color:#991B1B; background:#FEE2E2; }

    /* ── ADD LINE BUTTONS ─────────────────────────────────── */
    .ed-add-row { display:flex; gap:6px; padding:8px 12px; }
    .ed-add-btn {
      font-size:12px; padding:4px 10px; border-radius:999px;
      border:1px dashed var(--color-border-primary); background:transparent;
      color:var(--color-text-secondary); cursor:pointer; transition:all .15s;
      display:inline-flex; align-items:center; gap:5px;   /* alinea icono Lucide + texto */
    }
    .ed-add-btn:hover { border-color:#185FA5; color:#185FA5; background:rgba(24,95,165,.04); }

    /* ── STATUS DROPDOWN — Sprint Base-1.8 F5-IMPL.D — mejora visual ──── */
    .ed-status-menu {
      position:absolute; top:100%; right:0; margin-top:4px; z-index:950;
      background:#fff; border:1px solid #cbd5e1;
      border-radius:8px; box-shadow:0 8px 28px rgba(0,0,0,.22); min-width:220px;
      display:none; overflow:hidden; padding:4px;
    }
    .ed-status-menu.open { display:block; }
    .ed-status-item {
      padding:10px 14px; font-size:13px; cursor:pointer; display:flex; align-items:center; gap:10px;
      background:#fff; border-radius:6px; transition:background .12s;
    }
    .ed-status-item:hover { background:#e2e8f0; }
    .ed-status-item.disabled { opacity:.55; cursor:not-allowed; background:#f8fafc; }
    .ed-status-item.is-current { background:#f1f5f9; font-weight:600; border-left:3px solid var(--primary,#1d4ed8); padding-left:11px; }

    /* ── ACTIONS DROPDOWN ─────────────────────────────────── */
    .ed-more-menu {
      position:absolute; top:100%; right:0; margin-top:4px; z-index:950;
      background:#fff; background:var(--color-background-primary,#fff);
      border:1px solid var(--color-border-primary,#e5e7eb);
      border-radius:8px; box-shadow:0 8px 24px rgba(0,0,0,.18); min-width:200px;
      display:none; overflow:hidden;
    }
    .ed-more-menu.open { display:block; }
    .ed-more-item {
      padding:10px 14px; font-size:13px; cursor:pointer; display:flex; align-items:center; gap:8px;
      color:var(--color-text-primary);
    }
    .ed-more-item:hover { background:var(--color-background-secondary); }
    .ed-more-item.danger { color:#991B1B; }

    /* ── LOOSE LINES AREA ────────────────────────────────── */
    .ed-loose-area {
      border:1px solid var(--color-border-primary); border-radius:8px;
      margin-bottom:12px; background:var(--color-background-primary);
      overflow:hidden;
    }

    /* ── SUMMARY BLOCK ───────────────────────────────────── */
    .ed-summary {
      margin:16px 20px 12px; padding:20px 24px; border-radius:10px;
      background:var(--color-background-primary);
      border:2px solid var(--color-border-primary);
    }
    .ed-sum-title {
      font-size:13px; font-weight:700; color:var(--color-text-secondary);
      text-transform:uppercase; letter-spacing:.5px; margin-bottom:14px;
      padding-bottom:10px; border-bottom:1px solid var(--color-border-primary);
    }
    .ed-sum-row {
      display:flex; justify-content:space-between; align-items:center;
      padding:5px 0; font-size:13px;
    }
    .ed-sum-label { color:var(--color-text-secondary); }
    .ed-sum-val { font-weight:600; font-variant-numeric:tabular-nums; color:var(--color-text-primary); }
    .ed-sum-sep { border-top:1px solid var(--color-border-secondary); margin:8px 0; }
    .ed-sum-disc .ed-sum-val { color:#991B1B; }
    .ed-sum-total { font-size:16px; }
    .ed-sum-total .ed-sum-label { font-weight:700; color:var(--color-text-primary); }
    .ed-sum-total .ed-sum-val { font-size:16px; color:var(--color-text-primary); }
    .ed-sum-margin.pos .ed-sum-val { color:#065F46; }
    .ed-sum-margin.neg .ed-sum-val { color:#991B1B; }
    .ed-sum-margin .ed-sum-label { font-style:italic; }

    /* ── LIBRARY PANEL ───────────────────────────────────── */
    .ed-lib-panel {
      position:fixed;
      /* Sprint 1.5 fix-pass FIX 3 — empieza bajo topbar + barra MO/Mat para que cabecera del panel + botón cerrar queden visibles */
      top:var(--ed-stack-height); right:0; height:calc(100vh - var(--ed-stack-height));
      width:380px; z-index:800;
      background:#fff;
      background:var(--color-background-primary,#fff);
      border-left:1px solid var(--color-border-primary);
      box-shadow:-8px 0 30px rgba(0,0,0,.1);
      display:flex; flex-direction:column;
      transform:translateX(100%); transition:transform .25s ease;
    }
    .ed-lib-panel.open { transform:translateX(0); }
    .ed-lib-panel:not(.open) { box-shadow:none; } /* 16/10/2026: cerrado, su sombra asomaba por el borde derecho */
    /* Sprint Modal Síntesis (06/05/2026) — override ancho para sintesisPanel (7 columnas con números formato europeo) */
    /* 03/09/2026 · Bloque 6: 620px fijos ganaban por especificidad (#id) al 100% del @media y el
       panel se salía del viewport en móvil y tablets estrechas. */
    #sintesisPanel { width: min(620px, 100vw); }
    .ed-lib-header {
      display:flex; align-items:center; justify-content:space-between;
      padding:14px 16px; border-bottom:1px solid var(--color-border-primary);
      flex-shrink:0;
    }
    .ed-lib-header h3 { margin:0; font-size:15px; font-weight:600; }
    .ed-lib-close {
      border:none; background:none; cursor:pointer; font-size:20px;
      color:var(--color-text-tertiary); padding:2px 6px; border-radius:4px;
    }
    .ed-lib-close:hover { background:var(--color-background-secondary); color:var(--color-text-primary); }
    .ed-lib-search {
      padding:10px 16px; border-bottom:1px solid var(--color-border-primary);
      flex-shrink:0;
    }
    .ed-lib-search input {
      width:100%; padding:8px 12px; border:1px solid var(--color-border-primary);
      border-radius:6px; font-size:13px;
    }
    .ed-lib-search input:focus { outline:none; border-color:#185FA5; }
    .ed-lib-tabs {
      display:flex; border-bottom:1px solid var(--color-border-primary);
      flex-shrink:0;
    }
    .ed-lib-tab {
      flex:1; padding:8px; text-align:center; font-size:13px; font-weight:500;
      border:none; background:none; cursor:pointer; color:var(--color-text-secondary);
      border-bottom:2px solid transparent; transition:all .15s;
    }
    .ed-lib-tab.active { color:#185FA5; border-bottom-color:#185FA5; }
    .ed-lib-tab:hover { background:var(--color-background-secondary); }
    .ed-lib-body { flex:1; overflow-y:auto; padding:8px 16px; }
    .ed-lib-list { display:flex; flex-direction:column; gap:6px; }
    .ed-lib-item {
      display:flex; gap:10px; padding:10px 12px; border-radius:8px;
      border:1px solid var(--color-border-secondary); cursor:pointer;
      transition:all .15s;
    }
    .ed-lib-item:hover { border-color:var(--color-border-primary); background:var(--color-background-secondary); }
    .ed-lib-item.selected { border-color:#185FA5; background:#EFF6FF; }
    .ed-lib-item-check { font-size:18px; flex-shrink:0; line-height:1; }
    .ed-lib-item-info { flex:1; min-width:0; }
    .ed-lib-item-cat { font-size:11px; color:var(--color-text-tertiary); margin-bottom:2px; }
    .ed-lib-item-name { font-size:13px; font-weight:500; color:var(--color-text-primary); margin-bottom:2px; }
    .ed-lib-item-ref { font-size:11px; color:var(--color-text-tertiary); }
    .ed-lib-item-prices { font-size:12px; color:var(--color-text-secondary); margin-top:4px; font-variant-numeric:tabular-nums; }
    .ed-lib-footer {
      padding:12px 16px; border-top:1px solid var(--color-border-primary);
      flex-shrink:0; text-align:center;
    }
    .ed-lib-footer .btn { width:100%; }

    .ed-add-btn-lib { border-style:solid !important; border-color:#185FA5 !important; color:#185FA5 !important; font-weight:500; }
    .ed-add-btn-lib:hover { background:rgba(24,95,165,.08) !important; }

    /* ── FICHA ARTICLE BUTTON ─────────────────────────────── */
    .ed-l-ficha {
      border:none; background:none; cursor:pointer; font-size:14px;
      color:var(--color-text-tertiary); padding:2px 4px; border-radius:4px;
      opacity:.5; flex-shrink:0; line-height:1;
    }
    .ed-l-ficha:hover { opacity:1; color:#185FA5; background:#EFF6FF; }

    /* ── FICHA PANEL (F3) ────────────────────────────────── */
    .ef-grid { display:flex; flex-wrap:wrap; gap:10px 14px; padding:0 16px; }
    .ef-fg { display:flex; flex-direction:column; gap:3px; min-width:120px; flex:1; }
    .ef-fg.full { flex-basis:100%; }
    .ef-fg label { font-size:11px; font-weight:500; color:var(--color-text-tertiary); text-transform:uppercase; letter-spacing:.3px; }
    .ef-fg input, .ef-fg select, .ef-fg textarea {
      font-size:13px; padding:7px 10px; border:1px solid var(--color-border-primary);
      border-radius:6px; background:var(--color-background-primary); color:var(--color-text-primary);
    }
    .ef-fg input:focus, .ef-fg select:focus, .ef-fg textarea:focus {
      outline:none; border-color:#185FA5; box-shadow:0 0 0 3px rgba(24,95,165,.12);
    }
    .ef-fg textarea { resize:vertical; min-height:50px; font-family:inherit; }
    .ef-sep { border-top:1px solid var(--color-border-secondary); margin:14px 16px; }
    .ef-section-title {
      font-size:11px; font-weight:700; color:var(--color-text-secondary);
      text-transform:uppercase; letter-spacing:.5px; padding:0 16px 8px;
    }
    .ef-margin {
      font-size:14px; font-weight:600; font-variant-numeric:tabular-nums;
      padding:7px 0;
    }
    .ef-margin.pos { color:#065F46; }
    .ef-margin.neg { color:#991B1B; }

    /* ── PREVIEW MODE (F7) ────────────────────────────────── */
    .ed-preview {
      flex:1; display:flex; overflow:hidden;
    }
    .ed-pv-left {
      width:35%; min-width:280px; max-width:400px; overflow-y:auto;
      border-right:1px solid var(--color-border-primary);
      padding:16px; background:var(--color-background-primary);
    }
    .ed-pv-right {
      flex:1; display:flex; flex-direction:column; background:#e5e7eb;
    }
    .ed-pv-toolbar {
      display:flex; gap:6px; align-items:center; padding:8px 12px;
      background:var(--color-background-primary);
      border-bottom:1px solid var(--color-border-primary); flex-shrink:0;
    }
    .ed-pv-tabs {
      display:flex; border-bottom:1px solid var(--color-border-primary); margin-bottom:12px;
    }
    .ed-pv-tab {
      flex:1; padding:8px 4px; text-align:center; font-size:12px; font-weight:500;
      border:none; background:none; cursor:pointer; color:var(--color-text-tertiary);
      border-bottom:2px solid transparent;
    }
    .ed-pv-tab.active { color:#185FA5; border-bottom-color:#185FA5; }
    .ed-pv-info { font-size:13px; }
    .ed-pv-row {
      display:flex; justify-content:space-between; padding:6px 0;
      border-bottom:1px solid var(--color-border-secondary);
    }
    .ed-pv-row-label { color:var(--color-text-secondary); }
    .ed-pv-row-val { font-weight:600; font-variant-numeric:tabular-nums; }

    /* ── SÍNTESIS (F6) ───────────────────────────────────── */
    .es-table { width:100%; border-collapse:collapse; font-size:12px; margin-bottom:16px; }
    .es-table th {
      text-align:left; font-size:10px; font-weight:600; text-transform:uppercase;
      letter-spacing:.3px; color:var(--color-text-tertiary); padding:6px 8px;
      border-bottom:2px solid var(--color-border-primary); white-space:nowrap;
    }
    .es-table th.r { text-align:right; }
    .es-table td { padding:5px 8px; border-bottom:1px solid var(--color-border-secondary); font-variant-numeric:tabular-nums; }
    .es-table td.r { text-align:right; }
    .es-table tr.es-total td { font-weight:700; border-top:2px solid var(--color-border-primary); border-bottom:none; }
    .es-bar-wrap { display:flex; height:20px; border-radius:6px; overflow:hidden; margin-bottom:6px; }
    .es-bar-seg { height:100%; transition:width .3s; }
    .es-legend { display:flex; flex-direction:column; gap:6px; margin-top:8px; }
    .es-legend-row { display:flex; align-items:center; gap:8px; font-size:12px; }
    .es-legend-dot { width:10px; height:10px; border-radius:3px; flex-shrink:0; }
    .es-legend-pct { font-weight:600; font-variant-numeric:tabular-nums; min-width:40px; text-align:right; }
    .es-section-title {
      font-size:11px; font-weight:700; color:var(--color-text-secondary);
      text-transform:uppercase; letter-spacing:.5px; margin:16px 0 8px; padding-bottom:6px;
      border-bottom:1px solid var(--color-border-secondary);
    }

    /* ── LINE BADGES (F1) — categoría + código por línea de artículo ── */
    .line-badges {
      display: flex;
      gap: 6px;
      flex-wrap: wrap;
      margin-top: 4px;
      align-items: center;
    }
    .badge-category {
      display: inline-block;
      padding: 2px 8px;
      border-radius: 4px;
      font-size: 11px;
      font-weight: 600;
      line-height: 1.4;
      white-space: nowrap;
    }
    .badge-code {
      display: inline-block;
      padding: 2px 8px;
      border-radius: 4px;
      font-size: 11px;
      font-weight: 500;
      background: #F1EFE8;
      color: #5F5E5A;
      font-family: 'Courier New', Consolas, monospace;
      letter-spacing: 0.3px;
      white-space: nowrap;
    }

    /* ── ¿ESTA LÍNEA SALE DEL ALMACÉN? (F201·A-bis, 20/09/2026) ──
       Sólo se pinta en el editor EMBEBIDO (la OT): en un presupuesto o una factura una línea
       escrita a mano es lo normal y marcarla sería ruido. Lo decide `_renderLineBadges`. */
    .badge-stock {
      display: inline-block;
      padding: 2px 8px;
      border-radius: 999px;
      font-size: 10px;
      font-weight: 700;
      letter-spacing: 0.3px;
      white-space: nowrap;
    }
    .badge-stock-cat   { background: #DCFCE7; color: #166534; }
    .badge-stock-libre { background: #F1EFE8; color: #7A7974; }
    /* Artículo del catálogo que NO pasa por el almacén: comprado para la obra (extensión, albarán). */
    .badge-stock-compra { background: #DBEAFE; color: #1E40AF; }
    /* TEXTO LIBRE que se PULSA para buscarlo en el catálogo (24/09/2026): la misma etiqueta, con lupa. */
    .badge-stock-buscar { border: 1px dashed #C9C6BC; cursor: pointer; font-family: inherit; display: inline-flex; align-items: center; gap: 3px; }
    .badge-stock-buscar:hover, .badge-stock-buscar:focus-visible { background: #E7E4DA; color: #4A4843; border-style: solid; }

    /* ── ORIGEN DEL PRECIO DE LA MANO DE OBRA (11/09/2026) ── */
    .ed-mo-origen-wrap { font-size:11px; margin-top:3px; line-height:1.45; }
    .ed-mo-origen-wrap:empty { display:none; }
    .ed-mo-origen { color:var(--color-text-secondary); }
    .ed-mo-aviso { color:#92400E; }
    .ed-mo-aviso a { color:#92400E; text-decoration:underline; }
    .ed-mo-usar {
      margin-left:4px; padding:1px 8px; border-radius:999px; cursor:pointer; font-size:11px;
      border:1px solid #FCD34D; background:#FEF3C7; color:#92400E; font-weight:600;
    }
    .ed-mo-usar:hover { background:#FDE68A; }
    .ed-mo-usar:disabled { opacity:.5; cursor:default; }

    /* ── «PRECIO CERRADO» DE LA MANO DE OBRA (11/09/2026) ── */
    .ed-mo-doc { display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; }
    .ed-mo-doc-btn {
      padding:1px 8px; border-radius:999px; cursor:pointer; font-size:11px; line-height:1.5;
      border:1px solid var(--color-border-secondary, #e2e8f0); background:#fff; color:var(--color-text-secondary);
    }
    .ed-mo-doc-btn:hover { background:var(--color-background-secondary, #f8fafc); }
    .ed-mo-doc-btn.on { border-color:#0F766E; background:#CCFBF1; color:#115E59; font-weight:600; }
    .ed-mo-doc-btn:disabled { opacity:.5; cursor:default; }
    .ed-mo-doc-ud {
      width:52px; font-size:11px; padding:1px 4px; border-radius:4px;
      border:1px solid var(--color-border-secondary, #e2e8f0);
    }
    .ed-mo-doc-ve { font-size:11px; color:var(--color-text-secondary); }

    /* ── LINE IMAGE (F5) ────────────────────────────────── */
    .ed-l-img-wrap { position:relative; display:inline-block; margin-top:4px; }
    .ed-l-img-wrap:empty { display:none; }
    .ed-l-thumb {
      max-width:80px; max-height:50px; border-radius:4px;
      border:1px solid var(--color-border-secondary); cursor:pointer;
      transition:opacity .15s;
    }
    .ed-l-thumb:hover { opacity:.8; }
    .ed-l-img-del {
      position:absolute; top:-4px; right:-4px; width:18px; height:18px;
      border-radius:50%; border:none; background:#991B1B; color:white;
      font-size:11px; line-height:18px; text-align:center; cursor:pointer;
      display:none; padding:0;
    }
    .ed-l-img-wrap:hover .ed-l-img-del { display:block; }
    .ed-img-overlay {
      position:fixed; inset:0; z-index:1000; background:rgba(0,0,0,.7);
      display:flex; align-items:center; justify-content:center;
      opacity:0; pointer-events:none; transition:opacity .2s; cursor:pointer;
    }
    .ed-img-overlay.open { opacity:1; pointer-events:all; }
    .ed-img-overlay img {
      max-width:90vw; max-height:90vh; border-radius:8px;
      box-shadow:0 8px 40px rgba(0,0,0,.4);
    }

    /* ── LINE ACTIVE (S1: rediseño acciones por línea) ────── */
    tr.ed-line-active { background:rgba(24,95,165,.06) !important; }
    /* WYSIWYG: la descripción de línea es un textarea que envuelve y crece al contenido (JS ajusta la
       altura). Sin resize manual ni scroll: se ve la línea completa como en la previsualización. */
    textarea.ed-line-desc-input {
      width:100%; box-sizing:border-box; resize:none; overflow:hidden;
      font:inherit; line-height:1.35; white-space:pre-wrap; word-break:break-word;
      min-height:22px; padding:3px 6px; border:1px solid var(--color-border, #e2e8f0);
      border-radius:6px; background:#fff; color:inherit;
    }
    textarea.ed-line-desc-input:focus { border-color:var(--color-primary, #2563eb); outline:none; }
    .ed-line-toolbar {
      display:none; gap:6px; align-items:center; margin-top:4px;
      font-size:12px; color:var(--color-text-secondary);
    }
    /* Foto de la línea (09/09/2026) — el estado que se VE es el que se IMPRIME.
   Verde: el artículo tiene foto en su ficha, un clic la trae. Sólido: ya se imprime.
   La barra de la línea nace oculta y sólo la enciende _refreshLineActive al seleccionar la
   fila; el indicador de foto NO puede heredar eso, o habría que recorrer las líneas una a
   una con el ratón para descubrir cuáles tienen foto — justo lo que el color viene a evitar.
   Hacen falta las DOS mitades: esta regla para el render inicial y el guard del JS para
   cuando _refreshLineActive escriba el display inline (que gana a la hoja). */
.ed-line-toolbar:has(.ed-img-hay), .ed-line-toolbar:has(.ed-img-on) { display:flex; }
.ed-line-tool-btn.ed-img-hay { color:#065F46; border-color:#6EE7B7; background:#ECFDF5; font-weight:600 }
.ed-line-tool-btn.ed-img-hay:hover { background:#D1FAE5 }
.ed-line-tool-btn.ed-img-on  { color:#065F46; border-color:#059669; background:#D1FAE5; font-weight:600 }
.ed-line-tool-btn.ed-img-on:hover { background:#A7F3D0 }
.ed-line-tool-btn {
      border:none; background:transparent; cursor:pointer;
      padding:2px 6px; border-radius:4px; color:var(--color-text-secondary);
      font-size:12px; transition:all .12s;
    }
    .ed-line-tool-btn:hover { background:var(--color-background-secondary); color:var(--color-text-primary); }
    .ed-line-tool-link {
      cursor:pointer; color:var(--color-text-info); text-decoration:none; font-size:12px;
    }
    .ed-line-tool-link:hover { text-decoration:underline; }

    .ed-l-menu { position:relative; width:24px; min-width:24px; max-width:24px; }
    .ed-line-menu-btn {
      border:none; background:transparent; cursor:pointer;
      font-size:14px; padding:2px 4px; border-radius:4px;
      color:var(--color-text-secondary); opacity:.6;
    }
    .ed-line-menu-btn:hover { opacity:1; background:var(--color-background-secondary); }
    .ed-line-menu-drop {
      position:absolute; top:100%; right:0; z-index:50;
      background:#fff;
      background:var(--color-background-primary,#fff);
      border:1px solid var(--color-border-primary);
      border-radius:6px; box-shadow:0 4px 16px rgba(0,0,0,.12);
      padding:4px; min-width:120px;
    }
    .ed-line-menu-drop button {
      display:block; width:100%; text-align:left; border:none;
      background:none; padding:6px 10px; cursor:pointer;
      font-size:13px; color:var(--color-text-secondary); border-radius:4px;
    }
    .ed-line-menu-drop button:hover { background:var(--color-background-secondary); color:var(--color-text-primary); }

    @media print {
      .ed-line-toolbar, .ed-line-menu-btn, .ed-line-menu-drop, .ed-l-del, .ed-mo-origen-wrap, .ed-mo-doc { display:none !important; }
    }

    /* ── RESPONSIVE ──────────────────────────────────────── */
    @media (max-width:900px) {
      .ed-grid { grid-template-columns:1fr; }
      .ed-body { padding:16px 12px 60px; }
      .ed-topbar { padding:8px 12px; gap:8px; flex-wrap:wrap; }
      .ed-lines { font-size:12px; }
      .ed-lib-panel { width:100%; }
      .ef-fg { min-width:100px; }
    }
    /* 03/09/2026 · Bloque 6: la previsualización en COLUMNA en teléfono. Con .ed-pv-left a
       min-width:280px, en 375px al PDF le quedaban ~95px. */
    @media (max-width:767px) {
      .ed-preview { flex-direction:column; }
      .ed-pv-left { width:100%; max-width:none; min-width:0; max-height:38vh; border-right:none; border-bottom:1px solid var(--color-border-primary); }
    }

    /* ── F0 Sprint 1 — DATOS ESENCIALES + COLAPSABLES ─────────────── */
    /* S2: .editor-essentials + .essentials-grid + .field-group eliminados (sustituidos por .ed-header-compact) */

    details.editor-collapsible {
      background: var(--color-background-secondary);
      border: 1px solid var(--color-border-primary);
      border-radius: 8px;
      margin: 12px 0;
      overflow: hidden;
    }
    details.editor-collapsible > summary {
      padding: 12px 16px;
      cursor: pointer;
      font-weight: 500;
      font-size: 14px;
      color: var(--color-text-secondary);
      user-select: none;
      list-style: none;
    }
    details.editor-collapsible > summary::-webkit-details-marker {
      display: none;
    }
    details.editor-collapsible > summary::before {
      content: "▸";
      display: inline-block;
      transition: transform 0.15s ease;
      margin-right: 8px;
      color: var(--color-text-tertiary);
    }
    details.editor-collapsible[open] > summary::before {
      transform: rotate(90deg);
    }
    details.editor-collapsible[open] > summary {
      border-bottom: 1px solid var(--color-border-primary);
    }
    .editor-collapsible-body {
      padding: 16px;
    }

    /* ── TARJETAS CLIENTE | DATOS ────────────────────────────
       Viven DENTRO de .ed-body (scrollan, igual que .ot-info-grid en el panel de OT).
       Nota: display/gap/background de la vieja regla base eran CÓDIGO MUERTO — siempre
       los sobreescribía el compuesto .ed-header-compact.ed-info-grid de abajo. */
    .ed-header-compact { font-size:13px; margin-bottom:16px; }
    .ehc-row { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
    .ehc-row-dates { gap:14px; }
    .ehc-label {
      color:var(--color-text-tertiary); font-weight:500; font-size:12px;
      white-space:nowrap;
    }
    .ehc-input {
      border:1px solid transparent; background:transparent;
      padding:4px 8px; border-radius:6px; font-size:13px;
      color:var(--color-text-primary); transition:all .12s;
    }
    .ehc-input:hover { border-color:var(--color-border-secondary); }
    .ehc-input:focus { border-color:#185FA5; background:var(--color-background-primary); box-shadow:0 0 0 3px rgba(24,95,165,.12); outline:none; }
    .ehc-input-date { width:110px; }
    .ehc-input-select { padding:4px 6px; }
    .ehc-meta { font-size:12px; color:var(--color-text-tertiary); font-style:italic; }
    .ehc-meta:empty { display:none; }
    .ehc-variants { margin-top:4px; }
    .ehc-cashable-fields { display:flex; gap:10px; align-items:center; flex-wrap:wrap; }

    /* ── Sprint Stepper — cabecera + tarjetas paritarias panel OT ─── */
    .ed-hdr { padding:10px 20px 8px; background:var(--white,#fff); border-bottom:1px solid var(--color-border-secondary); flex-shrink:0; }
    .ed-hdr-main { min-width:0; }
    .ed-hdr-numrow { display:flex; align-items:center; gap:10px; }
    .ed-hdr-numrow .vf-chip { margin-bottom:2px; font-weight:600; }
    .ed-hdr-num { font-size:11px; font-weight:700; color:#2563EB; letter-spacing:.5px; margin-bottom:2px; }
    .ed-hdr-title { font-size:16px; font-weight:700; border:1px solid transparent; outline:none; background:transparent; width:100%; padding:2px 4px; margin:-2px 0 0 -4px; color:var(--color-text-primary,#1E293B); border-radius:4px; transition:border-color .12s, box-shadow .12s; }
    .ed-hdr-title:hover { border-color:var(--color-border-secondary); }
    .ed-hdr-title:focus { border-color:#185FA5; background:var(--color-background-primary); box-shadow:0 0 0 3px rgba(24,95,165,.12); }
    /* Sin fondo propio: la rejilla vive sobre el body gris (el gap deja ver el gris). Las tarjetas
       son BLANCAS como .ed-card (lenguaje del editor: tarjetas blancas sobre body gris). */
    .ed-header-compact.ed-info-grid { display:grid; grid-template-columns:1fr 1fr; gap:12px; align-items:start; }
    .ed-info-card { background:var(--color-background-primary,#fff); border:1px solid var(--color-border-primary); border-radius:10px; padding:12px 16px; }
    .ed-info-eyebrow { font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.5px; color:var(--color-text-tertiary,#94a3b8); margin-bottom:6px; }
    @media (max-width:900px){ .ed-header-compact.ed-info-grid { grid-template-columns:1fr; } }

    /* ── STICKY FOOTER UNIFICADO (S2) ───────────────────────── */
    .ed-sticky-totals {
      display:flex; align-items:center; justify-content:space-between;
      padding:12px 24px; gap:24px; flex-shrink:0;
      background:var(--color-background-primary);
      border-top:2px solid #E8671A;
      box-shadow:0 -2px 8px rgba(0,0,0,.05);
      font-size:13px; font-variant-numeric:tabular-nums;
      /* z-index BAJO a propósito (14/09/2026). Era 849: fósil del 01/05, cuando esta barra vivía
         ARRIBA, bajo la topbar, y tenía que ganar a los paneles laterales (800). Al bajar al pie se
         quedó con el número y pasó por encima de la capa de modales (.overlay, 700, app.css) y del
         panel del asistente IA (750): tapaba «Crear orden de trabajo» del modal Nueva OT abierto
         desde «Planificar OT» y la caja de texto del asistente. Hoy no necesita ganar a nada fijo:
         .ed-body tiene overflow propio y los paneles laterales la EMPUJAN con margin-right. Basta
         con quedar sobre el contenido del editor, y por debajo del sidebar móvil (49/50).
         Gate: smoke-nueva-ot-web bloque 5. */
      position:relative; z-index:10;
      transition:margin-right 0.25s ease;
    }
    .est-left, .est-right { display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
    .est-right { gap:18px; }
    .est-item, .est-row { display:inline-flex; align-items:center; gap:6px; }
    .est-label { color:var(--color-text-tertiary); font-weight:500; font-size:12px; }
    .est-value { font-weight:600; color:var(--color-text-primary); }
    /* Las celdas con explicación: el subrayado de puntos avisa de que hay algo que leer.
       Sin señal, un tooltip es una función que nadie descubre. */
    .es-ayuda { cursor:help; text-decoration:underline dotted rgba(10,35,64,.28); text-underline-offset:3px; }
    th.es-ayuda { text-decoration:underline dotted rgba(255,255,255,.45); }
    .est-pct { color:var(--color-text-tertiary); font-size:11.5px; }
    .est-coef { color:var(--color-text-tertiary); }
    .est-sep { color:var(--color-border-primary); }
    .est-total .est-label { color:var(--color-text-primary); font-weight:600; font-size:13px; }
    .est-big { font-size:16px; }
    .est-margin-pos { color:#065F46; }
    .est-margin-neg { color:#991B1B; }

    @media print {
      .ed-header-compact, .ed-sticky-totals { display:none !important; }
    }
    @media (max-width:960px) {
      .ed-sticky-totals { flex-direction:column; align-items:stretch; gap:8px; padding:10px 16px; }
      .est-left, .est-right { flex-wrap:wrap; }
      .ehc-row-dates { gap:8px; }
    }
    /* F2 móvil (16/10/2026) — en el teléfono el pie va en UNA línea, sólo el total (y «A pagar» si lo hay); tocarlo
       despliega el resto. La pieza que lo pliega es la común (css/clf-barra-documento.css, .clf-bd-pie). */
    @media (max-width:767px) {
      .ed-sticky-totals.clf-bd-pie:not(.abierto) { padding:10px 16px; min-height:0; }
      .ed-sticky-totals.clf-bd-pie:not(.abierto) .est-left,
      .ed-sticky-totals.clf-bd-pie:not(.abierto) .est-right > .est-row:not(.est-total):not(#tPayLabel) { display:none !important; }
      .ed-sticky-totals.clf-bd-pie:not(.abierto) .est-right { flex-wrap:nowrap; justify-content:space-between; gap:12px; }
      /* Las líneas sueltas (sin capítulo; las de la OT, siempre) recortaban la tabla (750 px) por su borde redondeado:
         en el teléfono se leen desplazándola de lado, como las de los capítulos (.ed-sections). Lo vigila U6. */
      .ed-loose-area { overflow-x:auto; overflow-y:hidden; }
      /* La hamburguesa del menú es hija de .main (app.js), fuera de la cabecera, que es inert mientras carga: se coloca
         arriba a la izquierda, sobre la cabecera, y se va con el scroll como ella. */
      .main:has(> .ed-hdr) { position:relative; }
      .main:has(> .ed-hdr) > .hamburger { position:absolute; top:8px; left:10px; z-index:7; }
      .ed-hdr { padding:10px 14px 8px 60px; }
      .main:has(> .ed-hdr) > .ed-lock-banner { padding-left:60px; }
      /* Con el aviso de bloqueo a la vista, la hamburguesa va sobre él: la cabecera de debajo no guarda su hueco. */
      .main:has(> .ed-lock-banner:not([style*="none"])) > .ed-hdr { padding-left:14px; }
      /* La píldora de estado de la barra ya dice «Rechazado»/«Vencido»: el aviso rojo de al lado sobraría. */
      .clf-bd-on #edOfframpChip { display:none !important; }
    }
    /* Sprint Base-1.8 fix-forward 2 F1 — Banner P35v3 universal (amarillo + pixel 0 arriba).
       Idéntico a .ot-lock-banner panel OT (referencia visual única). */
    .ed-lock-banner { display:flex; align-items:center; gap:12px; background:#fef3c7; border-bottom:2px solid #f59e0b; padding:10px 16px; font-size:13px; color:#92400e; flex-shrink:0; }
    .ed-lock-banner .ed-banner-text { flex:1; }
    .ed-lock-banner a { color:#7c3a00; text-decoration:underline; font-weight:600; }
    .ed-lock-banner button { background:rgba(146,64,14,.12); color:#7c3a00; border:1px solid rgba(146,64,14,.35); border-radius:6px; padding:4px 10px; font-size:12px; font-weight:600; cursor:pointer; }
    .ed-lock-banner button:hover { background:rgba(146,64,14,.2); }
