/* B PLANT — estilos por pantalla, tema claro estilo plataforma SaaS.
   Mismos selectors que el HTML/JS ya esperan — solo cambia el tratamiento
   visual (superficies claras, tarjetas con sombra, badges con tinte). */

/* ---------- 1 · bienvenida ---------- */
.hero{display:grid;grid-template-columns:1.15fr .85fr;gap:48px;align-items:center;min-height:52vh}
@media(max-width:900px){.hero{grid-template-columns:1fr;gap:32px}}
.hero h1 em{font-style:normal;color:var(--agua)}
.ficha{font-family:var(--mono);font-size:12.5px}
.ficha .row{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-bottom:1px solid var(--line)}
.ficha .row:last-child{border:none}
.ficha .k{color:var(--ink-dim);letter-spacing:.02em}
.ficha .v{color:var(--ink);font-weight:600;text-align:right}
/* ficha desplegable (details/summary nativos, sin JS — "Datos del proyecto" arriba de proyecto-minero.php) */
details.ficha summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;margin-bottom:10px;font-family:var(--disp);font-size:15px;color:var(--ink);font-weight:700}
details.ficha summary::-webkit-details-marker{display:none}
details.ficha summary .chev{color:var(--ink-dim);font-size:11px;font-family:var(--mono);transition:transform .15s ease}
details.ficha[open] summary .chev{transform:rotate(90deg)}

/* ---------- 2 · conversación ---------- */
.chat{max-width:720px}
.msg{display:flex;gap:12px;margin-bottom:16px;align-items:flex-start}
.who{
  flex:0 0 30px;height:30px;border-radius:50%;display:grid;place-items:center;
  font-family:var(--mono);font-size:10px;font-weight:700;
}
.who.ai{background:var(--agua);color:#fff}
.who.me{background:var(--panel-2);color:var(--ink-dim);border:1px solid var(--line)}
.bubble{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 16px;max-width:min(560px,86%);box-shadow:var(--shadow-sm)}
.msg.mine{flex-direction:row-reverse}
.msg.mine .bubble{background:#FFF1EC;border-color:#FFD4C4}
.opts{display:flex;gap:8px;flex-wrap:wrap;margin:6px 0 0 42px}
.opt{
  font-family:var(--sans);font-size:13px;background:#fff;color:var(--ink);
  border:1px solid var(--line);border-radius:20px;padding:7px 15px;cursor:pointer;transition:.15s;
}
.opt:hover{border-color:var(--agua);color:var(--agua-ink);box-shadow:var(--shadow-sm)}
.typing span{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--ink-dim);margin-right:3px;animation:blink 1.2s infinite}
.typing span:nth-child(2){animation-delay:.2s}.typing span:nth-child(3){animation-delay:.4s}
@keyframes blink{0%,60%,100%{opacity:.25}30%{opacity:1}}
/* Etiqueta junto a los puntos (2026-09-23): los 3 puntos solos son sutiles —
   con un tool-loop de leer_documentos de varias rondas (hasta 120s, ver
   modules/chat/config.php), sin texto parecía que no estaba pasando nada. */
.typing-label{margin-left:6px;font-size:var(--text-sm);color:var(--ink-dim)}
.chat-input{display:flex;gap:8px;margin:22px 0 0;max-width:720px}
.chat-input input{
  flex:1;font-family:var(--sans);font-size:14px;background:var(--panel);color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r);padding:11px 14px;
}
.chat-input input:focus{outline:none;border-color:var(--agua)}
.chat-input.is-disabled input,.chat-input.is-disabled button{opacity:.5;pointer-events:none}

/* Adjuntos efímeros de chat (Fase 1, 2026-09-23): chips sobre el composer,
   uno por archivo arrastrado/seleccionado para ESE turno — se vacían al
   enviar el mensaje, mismo criterio "efímero" del backend. */
.chat-attachments{display:flex;flex-wrap:wrap;gap:6px;max-width:720px;margin:10px 0 0}
.chat-attach-chip{
  display:inline-flex;align-items:center;gap:6px;font-family:var(--sans);font-size:12px;
  background:var(--panel-2);border:1px solid var(--line);border-radius:20px;padding:5px 6px 5px 12px;
}
.chat-attach-chip.uploading{opacity:.6}
.chat-attach-chip button{
  border:none;background:transparent;color:var(--ink-dim);cursor:pointer;font-size:13px;
  width:18px;height:18px;line-height:1;border-radius:50%;
}
.chat-attach-chip button:hover{background:var(--line);color:var(--ink)}
.chat-attach-btn{padding:0 12px;font-size:16px;line-height:1}
.chat-input.drag-over{outline:2px dashed var(--agua);outline-offset:2px;border-radius:var(--r)}

/* "Generar documento" + subida de vuelta (Fase 2/3, "documentos generados
   desde el chat", 2026-09-23) — un bloque chico bajo el composer de cada
   chat real, ver public/js/chat-docgen.js. */
.chat-docgen{margin:14px 0 0;padding-top:12px;border-top:1px solid var(--line);max-width:720px}
.chat-docgen-panel{margin-top:8px}
.chat-docgen-instruction{
  width:100%;box-sizing:border-box;font-family:var(--sans);font-size:12.5px;background:var(--panel);
  color:var(--ink);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;resize:vertical;
}
.chat-docgen-row{display:flex;gap:8px;align-items:center;margin-top:6px}
.chat-docgen-row select{font-family:var(--sans);font-size:12.5px;border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 8px;background:var(--panel);color:var(--ink)}
.chat-docgen-result{margin-top:8px;font-size:12px}
.chat-docgen-download{display:inline-block;margin-top:6px;padding:6px 12px;font-size:12px}
.chat-docgen-return{margin-top:10px}
.chat-docgen-return summary{font-size:12px;cursor:pointer;color:var(--ink-dim)}
.chat-docgen-return-form{margin-top:8px;display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.chat-docgen-return-form textarea{
  width:100%;box-sizing:border-box;font-family:var(--sans);font-size:12.5px;background:var(--panel);
  color:var(--ink);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;resize:vertical;
}
.chat-docgen-return-result{margin-top:6px;font-size:12px}

/* Documento generado por pedido dentro del chat normal (sin botón aparte,
   2026-09-24) — el link de descarga vive DENTRO de la burbuja de respuesta
   (agent-chat.js / documental.js / project-manager.js), así que se achica
   para no verse como un botón de formulario suelto. */
.bubble .chat-doc-download{display:inline-block;margin-top:2px;padding:6px 12px;font-size:12px}

/* ---------- 3 · diagnóstico ---------- */
.q{border-left:3px solid var(--line);padding-left:18px;margin-bottom:30px}
.q-label{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;color:var(--ink-dim);text-transform:uppercase;margin-bottom:7px;font-weight:600}
.q-text{font-family:var(--disp);font-weight:700;font-size:18px;margin-bottom:14px;color:var(--ink)}
.q.active{border-left-color:var(--agua)}
.pill{display:flex;gap:8px;flex-wrap:wrap}
.pill button{
  font-family:var(--sans);font-size:13.5px;font-weight:500;background:#fff;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:9px 18px;cursor:pointer;transition:.15s;
}
.pill button:hover{border-color:var(--agua);box-shadow:var(--shadow-sm)}
.pill button[aria-pressed="true"]{background:var(--agua);color:#fff;border-color:var(--agua);font-weight:600;box-shadow:0 1px 2px rgba(255,122,89,.25)}
.follow{margin-top:14px;padding:16px;background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r);display:none}
.follow.on{display:block;animation:in .25s ease}
.fld{margin-bottom:12px}
.fld:last-child{margin:0}
.fld label{display:block;font-family:var(--sans);font-size:11.5px;font-weight:600;color:var(--ink-soft);margin-bottom:5px}
.fld input[type=text],.fld input[type=number],.fld input[type=tel],.fld input[type=email],.fld select,.fld textarea{
  width:100%;background:#fff;border:1px solid var(--line);border-radius:var(--r-sm);
  color:var(--ink);font-family:var(--sans);font-size:13.5px;padding:9px 11px;
}
.fld textarea{resize:vertical;min-height:38px;font-family:var(--sans)}
.fld input:focus,.fld select:focus,.fld textarea:focus{outline:none;border-color:var(--agua);box-shadow:0 0 0 3px rgba(255,122,89,.15)}
.q-note{margin-top:10px}
.q-note label{display:block;font-family:var(--sans);font-size:11px;font-weight:600;color:var(--ink-dim);margin-bottom:4px}
input[type=range]{width:100%;accent-color:var(--agua)}
.flag{
  display:flex;gap:9px;align-items:flex-start;margin-top:14px;padding:12px 14px;border-radius:var(--r-sm);
  font-size:13px;border-left:3px solid;
}
.flag.crit{background:#FDECEC;border-color:var(--falla)}
.flag.warn{background:#FFF6E0;border-color:var(--veta)}
.flag.good{background:#E9F7EF;border-color:var(--ok)}
.flag b{font-family:var(--sans);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;display:block;margin-bottom:2px;font-weight:700}
.flag.crit b{color:var(--falla)}.flag.warn b{color:#92610A}.flag.good b{color:var(--ok)}
/* .flag-icon (mockups/cuestionario-v2/): ícono real en vez de solo borde+color. */
.flag-icon{width:18px;height:18px;flex:0 0 auto;margin-top:1px}
.flag.crit .flag-icon{color:var(--falla)}.flag.warn .flag-icon{color:#92610A}.flag.good .flag-icon{color:var(--ok)}
.gauge{font-family:var(--disp);font-weight:800;font-size:38px;line-height:1;margin:10px 0 4px;color:var(--ink)}
.upload-req{font-family:var(--sans);font-size:11.5px;color:var(--agua-ink);margin-top:10px;font-weight:500}

/* ---------- 1b · perfil del proyecto (screens/perfil.php) ----------
   [N0-01]..[N0-05]: tres campos de una sola vez, mostrados como "radio
   cards" en vez de <select> porque cada opción trae una frase larga — el
   mismo criterio de "level cards" que usa el cuestionario (§3, más abajo)
   para Q1 cuando el descriptor no entra en un pill. */
.radio-cards{display:flex;flex-direction:column;gap:8px}
.perfil-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:12px}
.perfil-grid label{display:grid;gap:4px;font-size:13px}
.perfil-grid select{width:100%}
.radio-card{
  display:flex;gap:12px;align-items:flex-start;padding:12px 14px;
  border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer;
  transition:.15s;background:#fff;
}
.radio-card:hover{border-color:var(--agua)}
.radio-card input{margin-top:3px;accent-color:var(--agua);flex:0 0 auto}
.radio-card input:disabled{cursor:default}
.radio-card span{font-size:13.5px;color:var(--ink);line-height:1.4}
.radio-card:has(input:checked){border-color:var(--agua);background:#FFF6F3}
.radio-card:has(input:disabled){cursor:default}
.radio-card:has(input:disabled):hover{border-color:var(--line)}

/* ---------- 3 · cuestionario — level cards (Q1, escala 0-4) [N3-01] ----------
   Reemplazan los pills cuando single_select tiene más de 3 opciones o una
   etiqueta larga: número grande a la izquierda, descriptor a la derecha,
   seleccionable con clic/teclado (aria-pressed) igual que un pill normal. */
.level-cards{display:flex;flex-direction:column;gap:6px}
.level-card{
  display:flex;gap:14px;align-items:center;width:100%;text-align:left;
  background:#fff;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:10px 14px;cursor:pointer;transition:.15s;font-family:var(--sans);
}
.level-card:hover{border-color:var(--agua);box-shadow:var(--shadow-sm)}
.level-card .lvl-n{
  font-family:var(--disp);font-weight:800;font-size:20px;color:var(--ink-dim);
  flex:0 0 22px;text-align:center;
}
.level-card .lvl-d{font-size:13px;color:var(--ink);line-height:1.4}
.level-card[aria-pressed="true"]{border-color:var(--agua);background:#FFF6F3}
.level-card[aria-pressed="true"] .lvl-n{color:var(--agua-ink)}
.tier-tag{
  font-family:var(--sans);font-size:10px;letter-spacing:.04em;text-transform:uppercase;
  font-weight:700;padding:2px 8px;border-radius:20px;margin-left:8px;vertical-align:middle;
}
.tier-tag.tier-a{background:#FDECEC;color:var(--falla)}
.tier-tag.tier-b{background:#FFF6E0;color:#92610A}
.tier-tag.tier-c{background:var(--panel-2);color:var(--ink-dim)}
.q-progress{font-family:var(--mono);font-size:11.5px;color:var(--ink-dim);margin-bottom:18px}
.q-na-note{margin-top:24px;font-family:var(--mono);font-size:11px;color:var(--ink-dim)}

/* ---------- 4 · evidencias ---------- */
.drop{
  border:1.5px dashed var(--line);border-radius:var(--r);padding:44px;text-align:center;
  background:var(--panel-2);cursor:pointer;transition:.15s;
}
.drop:hover{border-color:var(--agua);background:#FFF6F3}
.drop .big{font-family:var(--disp);font-weight:700;font-size:17px;margin-bottom:4px;color:var(--ink)}
.drop .small{font-family:var(--mono);font-size:11.5px;color:var(--ink-dim)}

/* Resalta CUALQUIER contenedor mientras se arrastra un archivo encima —
   BPlantDropzone (public/js/dropzone.js) la agrega a botones de "Subir"
   que ya existían, sin necesitar una zona grande y dedicada como .drop acá
   arriba. .drop.drag-over recolorea su propio borde en vez de sumar un
   segundo contorno, para no mostrar dos punteados a la vez. */
.drag-over{outline:2px dashed var(--agua);outline-offset:2px;background:#FFF6F3;border-radius:var(--r-sm)}
.drop.drag-over{outline:none;border-color:var(--agua)}
.files{margin-top:18px;display:flex;flex-direction:column;gap:8px}
.file{display:grid;grid-template-columns:26px 1fr auto auto auto;gap:14px;align-items:center;background:var(--panel);padding:13px 16px;border:1px solid var(--line);border-radius:var(--r-sm);box-shadow:var(--shadow-sm)}
.file .ext{font-family:var(--mono);font-size:9px;font-weight:700;color:#fff;background:var(--ink-dim);border-radius:4px;padding:3px 0;text-align:center}
.file .ext.pdf{background:var(--falla)}
.file .ext.jpg{background:var(--veta)}
.file .ext.dwg{background:var(--azul)}
.file .nm{font-size:13.5px;color:var(--ink)}
.file .nm small{display:block;color:var(--ink-dim);font-family:var(--mono);font-size:10.5px;margin-top:2px}
.file .st{font-family:var(--sans);font-size:11px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;padding:3px 9px;border-radius:20px;white-space:nowrap}
.st.ok{color:var(--ok);background:#E9F7EF}
.st.pend{color:#92610A;background:#FFF6E0}
.st.miss{color:var(--falla);background:#FDECEC}
.file .x{background:none;border:none;color:var(--ink-dim);cursor:pointer;font-size:18px;line-height:1;padding:2px 6px;border-radius:4px}
.file .x:hover{color:var(--falla);background:#FDECEC}

.pending{margin-top:18px;display:flex;flex-direction:column;gap:8px}
.pending-item{display:grid;grid-template-columns:1fr auto;gap:14px;align-items:center;background:var(--panel);padding:13px 16px;border:1px solid var(--line);border-radius:var(--r-sm)}
.pending-item .nm{font-size:13.5px;color:var(--ink)}
.pending-item .nm small{display:block;color:var(--ink-dim);font-family:var(--mono);font-size:10.5px;margin-top:2px}
.pending-item button{
  font-family:var(--sans);font-size:12px;font-weight:600;
  background:#fff;color:var(--agua-ink);border:1px solid var(--agua);border-radius:var(--r-sm);
  padding:7px 14px;cursor:pointer;transition:.15s;
}
.pending-item button:hover{background:var(--agua);color:#fff}
.pending-item .row-actions{display:flex;gap:8px;align-items:center}
.pending-item .doc-year{
  width:150px;font-family:var(--sans);font-size:12px;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 8px;
}
.pending-item .doc-year:focus{outline:none;border-color:var(--agua)}

/* revisión de evidencia [EVI-02]: Aceptar / Insuficiente (con nota obligatoria) */
.review-actions{display:flex;gap:8px;margin:8px 0 0}
.review-actions button{
  font-family:var(--sans);font-size:12px;font-weight:600;border-radius:var(--r-sm);
  padding:6px 12px;cursor:pointer;transition:.15s;
}
.review-actions .accept{background:#fff;color:var(--ok);border:1px solid var(--ok)}
.review-actions .accept:hover{background:var(--ok);color:#fff}
.review-actions .insufficient{background:#fff;color:var(--falla);border:1px solid var(--falla)}
.review-actions .insufficient:hover{background:var(--falla);color:#fff}
.review-note{display:none;gap:8px;margin-top:8px}
.review-note.on{display:flex}
.review-note textarea{
  flex:1;font-family:var(--sans);font-size:12.5px;border:1px solid var(--line);
  border-radius:var(--r-sm);padding:8px;resize:vertical;min-height:36px;color:var(--ink);
}
.review-note textarea:focus{outline:none;border-color:var(--falla)}

/* ---------- 5 · análisis ---------- */
.scan{max-width:640px;margin:0 auto;text-align:left}
.scanline{display:flex;gap:12px;align-items:center;font-family:var(--sans);font-size:13.5px;padding:12px 0;border-bottom:1px solid var(--line);color:var(--ink-dim);opacity:.4;transition:.4s}
.scanline.on{opacity:1;color:var(--ink)}
.scanline .dot{width:8px;height:8px;border-radius:50%;background:var(--line);flex:0 0 auto}
.scanline.on .dot{background:var(--agua);box-shadow:0 0 0 4px rgba(255,122,89,.15)}
.scanline.done .dot{background:var(--ok);box-shadow:none}
.scanline .t{margin-left:auto;font-size:11px;opacity:.6;font-family:var(--mono)}
.progress{height:4px;background:var(--line);margin:26px 0;overflow:hidden;border-radius:4px}
.progress i{display:block;height:100%;width:0;background:var(--agua);transition:width .5s linear}

/* ---------- 6 · dashboard ----------
   .dash/.core/.strata/.stratum/.r-crit../.r-sinevaluar (barras planas de
   madurez + KPIs) se retiraron: screens/dashboard.php ahora usa la cabecera
   de anillos (.rings-head/.ring-strip, ver "KPIs por componente" más abajo)
   y .finding-row en vez de la tabla de hallazgos — sin consumidores. */
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:22px}
@media(max-width:760px){.kpis{grid-template-columns:1fr 1fr}}
.kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:16px;box-shadow:var(--shadow-sm)}
.kpi .n{font-family:var(--disp);font-weight:800;font-size:26px;line-height:1.1;color:var(--ink)}
.kpi .l{font-family:var(--sans);font-size:10.5px;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-dim);margin-top:5px;font-weight:600}
.kpi .d{font-family:var(--sans);font-size:11px;margin-top:6px;font-weight:600}
.d.up{color:var(--ok)} .d.dn{color:var(--falla)}

/* =========================================================================
   KPIs por componente — Propuesta C (anillos de progreso), aprobada por el
   usuario a partir de mockups/project-manager-kpis/ (Propuesta C, ver
   docs/contexto/decisiones.md). Portado valor por valor del boceto, no
   reinterpretado — mismo criterio que ya costó dos correcciones en el
   Cronograma Maestro (ver convenciones.md). Reemplaza .kpis + la tabla
   "KPIs por componente" de screens/project-manager.php.

   Color del anillo = identidad del componente (--c-geo..soc); el barrido
   del arco = madurez (magnitud 0-100). El riesgo NUNCA toca el anillo: vive
   en una insignia ícono+palabra aparte (.ring-badge), reforzada con
   tamaño/pulso en "crítico" — mismo criterio que dashboard.php separa
   madurez y riesgo en indicadores distintos ([RSK-07], nunca se reconcilian).
   ========================================================================= */
.sb-flag{
  display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;
  background:#FFF6E0;color:#92610A;font-family:var(--mono);font-size:10px;font-weight:700;cursor:help;
}

.chip-detail{
  margin-top:var(--space-3);background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r);
  padding:var(--space-4) var(--space-5);
}
.chip-detail .cd-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.chip-detail .cd-name{font-family:var(--disp);font-weight:700;font-size:var(--text-lg);color:var(--ink)}
.chip-detail .cd-link{margin-left:auto;font-family:var(--sans);font-size:var(--text-sm);font-weight:600;color:var(--agua-ink);text-decoration:none}
.chip-detail .cd-link:hover{text-decoration:underline}
.cd-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--space-4)}
@media(max-width:640px){.cd-stats{grid-template-columns:1fr 1fr}}
.cd-stats .s-n{font-family:var(--disp);font-weight:800;font-size:20px;color:var(--ink)}
.cd-stats .s-l{font-family:var(--sans);font-size:var(--text-2xs);letter-spacing:.03em;text-transform:uppercase;color:var(--ink-dim);font-weight:600;margin-top:2px}
.cd-gate{margin-top:10px;font-size:var(--text-sm);color:var(--falla)}

.rings-head{
  display:flex;align-items:flex-start;gap:var(--space-6);flex-wrap:wrap;
  margin-bottom:var(--space-4);
}
.gauge-block{display:flex;align-items:center;gap:var(--space-4);flex-wrap:wrap}
.gauge-wrap{position:relative;width:220px;height:128px;flex:0 0 auto}
.gauge-svg{width:100%;height:100%;display:block}
.gauge-center{
  position:absolute;left:0;right:0;bottom:6px;text-align:center;
}
.gauge-n{font-family:var(--sans);font-weight:700;font-size:40px;line-height:1;color:var(--ink)}
.gauge-l{font-family:var(--sans);font-size:var(--text-xs);color:var(--ink-dim);font-weight:600;margin-top:4px}
.gauge-risk{display:flex;align-items:center;gap:10px}
.gauge-cause{font-size:var(--text-sm);color:var(--ink-dim);margin-top:3px}
/* Corrección respecto al boceto: .ring-badge es position:absolute (pensado
   para flotar sobre la esquina de un anillo de 64x64) — reusado tal cual
   acá (sin .ring-wrap de por medio) se hubiera posicionado contra el
   ancestro posicionado más cercano en vez de al lado del texto. Se lo deja
   estático y un poco más grande, mismos colores/ícono. */
.gauge-risk .ring-badge{position:static;width:32px;height:32px;flex:0 0 auto}
.gauge-risk .ring-badge svg{width:18px;height:18px}
.gauge-risk .ring-badge.is-critical{width:34px;height:34px}
.gauge-risk .ring-badge.is-critical svg{width:19px;height:19px}

.stat-mini-row{display:flex;gap:var(--space-4);flex-wrap:wrap;align-items:center;margin-left:auto}
.stat-mini{
  display:flex;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r-sm);padding:8px 12px;position:relative;
}
.stat-mini svg{width:20px;height:20px;color:var(--ink-dim);flex:0 0 auto}
.stat-mini div{display:flex;flex-direction:column;line-height:1.2}
.stat-mini b{font-family:var(--disp);font-weight:800;font-size:17px;color:var(--ink)}
.stat-mini span{font-size:10.5px;color:var(--ink-dim);white-space:nowrap}
@media(max-width:760px){.stat-mini-row{margin-left:0}}

/* ---------- fila de anillos por componente ---------- */
.ring-strip{display:flex;flex-wrap:wrap;gap:var(--space-3)}
.ring-card{
  display:flex;flex-direction:column;align-items:center;gap:6px;width:104px;
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r);
  padding:var(--space-3) var(--space-2) var(--space-2);cursor:pointer;
  box-shadow:var(--shadow-sm);transition:border-color .12s,box-shadow .12s;font-family:var(--sans);
  text-decoration:none;
}
.ring-card:hover{border-color:var(--agua);box-shadow:var(--shadow-md)}
.ring-card[aria-pressed="true"]{border-color:var(--agua);background:#FFF9F6;box-shadow:var(--shadow-md)}
.ring-wrap{position:relative;display:inline-block;width:64px;height:64px}
.ring-wrap svg{width:100%;height:100%}
.ring-center{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:var(--sans);font-weight:700;font-size:18px;color:var(--ink);
}
.ring-name{display:flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--ink)}
.ring-name .dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto}

/* insignia de riesgo: ícono + color reservado, NUNCA el mismo canal que el
   anillo (que codifica identidad, no riesgo) — ver notas dataviz en
   mockups/project-manager-kpis/index.html. */
.ring-badge{
  position:absolute;right:-2px;bottom:-2px;width:18px;height:18px;border-radius:50%;
  background:var(--panel);border:2px solid var(--panel);display:flex;align-items:center;justify-content:center;
  box-shadow:0 0 0 1px var(--line);
}
.ring-badge svg{width:11px;height:11px}
.ring-badge.sev-bajo{color:var(--ok);box-shadow:0 0 0 1px #9EDDB6}
.ring-badge.sev-medio{color:#92610A;box-shadow:0 0 0 1px #F5D68C}
.ring-badge.sev-alto{color:var(--serio);box-shadow:0 0 0 1px #F3C3AC}
.ring-badge.sev-crit{color:var(--falla);box-shadow:0 0 0 1px #F5A8A8}
.ring-badge.sev-na{color:var(--ink-dim);box-shadow:0 0 0 1px var(--line);font-family:var(--sans);font-weight:700;font-size:11px}
/* "crítico" se refuerza con TAMAÑO además de color/ícono — nunca color a
   solas, y acá además con intensidad visual, a pedido explícito del usuario. */
.ring-badge.is-critical{width:22px;height:22px;animation:ring-pulse 1.8s ease-in-out infinite}
.ring-badge.is-critical svg{width:13px;height:13px}
@keyframes ring-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.16)}}

/* =========================================================================
   Hub de "Proyecto minero" (screens/proyecto-minero.php) — Propuesta B del
   boceto mockups/proyecto-minero/ (franja + detalle), aprobada por el
   usuario. Reusa .ring-strip/.ring-card/.chip-detail/.cd-* de arriba tal
   cual (mismo lenguaje visual que project-manager.php); acá solo lo nuevo:
   el detalle rico (asesor + acciones de navegación) y el modal de Drive que
   reemplaza el panel que antes crecía adentro de cada una de las 8 tarjetas.
   ========================================================================= */
.hub-detail .cd-advisor{font-size:var(--text-sm);color:var(--ink-soft);font-style:italic;margin-top:2px}
.hub-detail .cd-actions{display:flex;align-items:center;gap:8px;margin-top:var(--space-3);flex-wrap:wrap}
.hub-detail .cd-warn{font-size:12px;color:var(--veta);margin-top:6px}
.drive-icon-btn{
  display:inline-flex;align-items:center;gap:6px;background:none;border:1px solid var(--line);
  border-radius:var(--r-sm);padding:7px 10px;font-family:var(--sans);font-size:12px;font-weight:600;
  color:var(--ink-soft);cursor:pointer;flex:0 0 auto;
}
.drive-icon-btn:hover{border-color:var(--agua);color:var(--agua-ink)}
.drive-icon-btn svg{width:14px;height:14px}
.no-access-note{font-size:12px;color:var(--ink-dim);margin:0}

.drive-modal-backdrop{
  position:fixed;inset:0;background:rgba(33,51,67,.45);display:flex;align-items:center;justify-content:center;
  z-index:80;padding:var(--space-4);
}
.drive-modal-backdrop[hidden]{display:none}
.drive-modal{
  background:var(--panel);border-radius:var(--r);box-shadow:var(--shadow-lg);
  width:100%;max-width:420px;padding:var(--space-5);
}
.drive-modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:var(--space-3)}
.drive-modal-head h3{margin:0;font-size:var(--text-lg)}
.drive-modal-close{background:none;border:none;font-size:16px;color:var(--ink-dim);cursor:pointer;padding:2px 6px}
.drive-modal-close:hover{color:var(--ink)}

.tbl{width:100%;border-collapse:collapse;font-size:13.5px}
.tbl th{
  font-family:var(--sans);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-dim);
  text-align:left;padding:11px 14px;border-bottom:1px solid var(--line);font-weight:700;background:var(--panel-2);
}
.tbl td{padding:14px;border-bottom:1px solid var(--line);vertical-align:top;color:var(--ink)}
.tbl tr:last-child td{border:none}
.tbl .norma{font-family:var(--mono);font-size:10.5px;color:var(--ink-dim);display:block;margin-top:4px}
.tag{font-family:var(--sans);font-size:10.5px;letter-spacing:.02em;text-transform:uppercase;padding:4px 10px;border-radius:20px;font-weight:700;white-space:nowrap}
.tag.crit{background:#FDECEC;color:var(--falla)}
.tag.alto{background:#FDEEE7;color:var(--serio)}
.tag.medio{background:#FFF6E0;color:#92610A}
.tag.bajo{background:#E9F7EF;color:var(--ok)}

/* ---------- Drive por componente (proyecto-minero) / asignaciones ---------- */
.drive-panel{margin-top:10px;border-top:1px solid var(--line);padding-top:10px}
.drive-panel-toggle{background:none;border:0;padding:0;font-family:var(--sans);font-size:12.5px;font-weight:600;color:var(--agua-ink);cursor:pointer}
.drive-panel-toggle:hover{text-decoration:underline}
.drive-panel-body{margin-top:10px}
.drive-file-row{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid var(--line);font-size:12.5px}
.drive-file-row a{color:var(--ink);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.drive-file-row a:hover{color:var(--agua-ink);text-decoration:underline}
.drive-file-row .drive-share-btn{background:none;border:1px solid var(--line);border-radius:var(--r-sm);padding:4px 10px;font-size:11.5px;color:var(--ink-dim);cursor:pointer;flex:0 0 auto}
.drive-file-row .drive-share-btn:hover{border-color:var(--agua);color:var(--agua-ink)}
.drive-share-form{display:flex;gap:8px;padding:8px 0;border-bottom:1px solid var(--line)}
.drive-share-form input{flex:1;font-family:var(--sans);font-size:12.5px;border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 10px}
.drive-upload-form{display:flex;gap:8px;align-items:center;margin-top:10px}
.drive-upload-form input[type=file]{font-size:11.5px;flex:1;min-width:0}

.table{width:100%;border-collapse:collapse;font-family:var(--sans);font-size:12.5px}
.table th{text-align:left;font-size:10.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-dim);font-weight:700;padding:0 10px 8px;border-bottom:1px solid var(--line)}
.table td{padding:10px;border-bottom:1px solid var(--line);color:var(--ink)}
.table td.actions-cell{white-space:nowrap;text-align:right}
.table tr:last-child td{border-bottom:none}

/* consola de componente (screens/componente.php) */
.tag.na{background:var(--panel-2);color:var(--ink-dim);border:1px solid var(--line)}
.detail-grid{display:grid;grid-template-columns:1.35fr 1fr;gap:18px;margin-bottom:18px}
@media(max-width:980px){.detail-grid{grid-template-columns:1fr}}
.detail-stack{display:flex;flex-direction:column;gap:18px}
.estado-list{display:flex;flex-direction:column}
.estado-row{display:flex;gap:11px;align-items:flex-start;padding:11px 0;border-bottom:1px solid var(--line)}
.estado-row:last-child{border:none;padding-bottom:0}
.estado-dot{width:9px;height:9px;border-radius:50%;flex:0 0 auto;margin-top:5px}
.estado-code{font-family:var(--mono);font-size:10px;color:var(--ink-dim);display:block}
.estado-lbl{font-size:13px;font-weight:600;color:var(--ink);margin:1px 0 2px}
.estado-note{font-size:11.5px;color:var(--ink-soft)}

/* Cronograma Maestro (screens/project-manager.php + screens/componente.php,
   public/js/schedule.js). Los colores por componente y por estado salen de
   los tokens ya existentes — no se introduce una paleta nueva. */
#schedule-totals{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:16px}
#schedule-totals .kpi{padding:12px 14px}
#schedule-totals .kpi-k{display:block;font-family:var(--sans);font-size:10px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-dim);font-weight:700}
#schedule-totals .kpi-v{display:block;font-family:var(--mono);font-size:17px;color:var(--ink);margin-top:3px}

/* Tres vistas del Cronograma Maestro (boceto en mockups/cronograma-maestro/,
   2026-09-22): Tabla, Tablero (Kanban) y Línea de tiempo — esta última
   reemplaza al Gantt vendorizado (Frappe Gantt) por decisión del usuario
   ("que quede como el boceto"), ver [[decisiones]].
   Port fiel VALOR A VALOR del CSS del boceto (2026-09-22, segunda pasada):
   la primera pasada reinterpretó tamaños/paddings/sombras en vez de
   copiarlos (paddings más chicos, badges en mayúsculas apretadas en vez del
   pill relajado, sin sombra en las tarjetas de componente, sin tipografía
   propia para el nombre del componente) — el resultado se sentía "más
   regular" que el boceto aunque la estructura y el comportamiento fueran
   los mismos. Ver [[errores-conocidos]]: la lección de "portar estructura
   sin valores exactos" es la misma que la de "portar comportamiento sin
   estructura" un nivel más abajo. */
.view-tabs{display:flex;gap:var(--space-2);margin:0 0 var(--space-5);border-bottom:1px solid var(--line)}
.view-tabs button{display:flex;align-items:center;gap:8px;font-family:var(--sans);font-weight:600;font-size:var(--text-base);color:var(--ink-dim);background:none;border:none;border-bottom:2px solid transparent;padding:var(--space-3) var(--space-2);cursor:pointer;transition:.15s;margin-bottom:-1px}
.view-tabs button svg{width:17px;height:17px;opacity:.8}
.view-tabs button:hover{color:var(--ink)}
.view-tabs button[aria-selected="true"]{color:var(--agua-ink);border-bottom-color:var(--agua)}
.view-tabs button[aria-selected="true"] svg{color:var(--agua-ink);opacity:1}
.view-panel[hidden]{display:none}

/* ---------- Vista 1 — Tabla: buscador con ícono + contador (boceto:
   .fb-search/.fb-count) — antes eran inputs sueltos, sin ícono ni "X de Y
   tareas" (schedule.js: renderFilters()/renderTable() los arman). ---------- */
.sched-filters{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;margin-bottom:var(--space-5)}
.sched-filters .fb-search{position:relative;flex:1 1 240px;min-width:200px}
.sched-filters .fb-search svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--ink-dim);pointer-events:none}
.sched-filters .fb-search input{width:100%;font-family:var(--sans);font-size:var(--text-base);padding:9px 12px 9px 34px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel);color:var(--ink)}
.sched-filters .fb-search input:focus{outline:2px solid var(--agua);outline-offset:1px}
.sched-filters select{font-family:var(--sans);font-size:var(--text-base);color:var(--ink);padding:9px 30px 9px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel);cursor:pointer}
.sched-filters .fb-count{margin-left:auto;font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-dim)}
/* Toggle "Mostrar posiblemente obsoletas" [M3] — apagado por defecto, mismo
   patrón de tamaño/color que el resto de la barra de filtros. */
.fb-toggle{display:flex;align-items:center;gap:6px;font-family:var(--sans);font-size:var(--text-sm);color:var(--ink-dim);white-space:nowrap;cursor:pointer}
.fb-toggle input{cursor:pointer}

/* Grupos por componente colapsables — details/summary nativos, mismo patrón
   que details.ficha (proyecto-minero.php). Chevron con carácter de texto
   (›) igual que el boceto, no un triángulo CSS inventado. */
.comp-block{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);margin-bottom:var(--space-3);overflow:hidden;box-shadow:var(--shadow-sm)}
.comp-head{cursor:pointer;list-style:none;display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-5);user-select:none}
.comp-head::-webkit-details-marker{display:none}
.comp-head .chev{color:var(--ink-dim);font-family:var(--mono);font-size:12px;transition:transform .15s ease;flex:0 0 auto}
.comp-block[open] .comp-head .chev{transform:rotate(90deg)}
.comp-head .comp-name{font-family:var(--disp);font-weight:700;font-size:var(--text-md);color:var(--ink)}
.comp-head .comp-meta{margin-left:auto;display:flex;align-items:center;gap:var(--space-3);font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-dim)}
.comp-late{display:flex;align-items:center;gap:4px;color:var(--falla);font-weight:600;background:#FDECEC;padding:3px 9px;border-radius:var(--r-pill);font-family:var(--sans);font-size:var(--text-sm)}
.comp-late .t-icon{width:12px;height:12px}
.comp-hab,.hab-tag{display:inline-flex;align-items:center;color:#7A4B00;background:#FFF3D6;border:1px solid #F0D28A;border-radius:var(--r-pill);font-weight:600;font-family:var(--sans)}
.comp-hab{padding:3px 9px;font-size:var(--text-sm)}
.hab-tag{padding:1px 8px;font-size:var(--text-2xs);margin-right:6px;white-space:nowrap}
/* Antes .comp-dot siempre salía gris (--ink-dim): schedule.js ya generaba
   la clase dot-<código> pero nunca existió la regla que le diera color —
   bug detectado al construir el boceto del Cronograma Maestro (2026-09-22,
   mockups/cronograma-maestro/). Corregido acá con los tokens --c-*. */
.comp-dot{width:11px;height:11px;border-radius:50%;background:var(--ink-dim);flex:0 0 auto}
.dot-geo{background:var(--c-geo)}
.dot-min{background:var(--c-min)}
.dot-met{background:var(--c-met)}
.dot-sst{background:var(--c-sst)}
.dot-amb{background:var(--c-amb)}
.dot-emp{background:var(--c-emp)}
.dot-jur{background:var(--c-jur)}
.dot-soc{background:var(--c-soc)}

/* Filas del Cronograma como grilla CSS, no <table> — puerto real del boceto
   (mockups/cronograma-maestro/style.css: .task-table/.row-view), no solo su
   comportamiento. El hito ya no es una fila divisoria propia: va como
   etiqueta inline en cada tarea (.hito-tag), con la madurez del aspecto en
   el `title` (tooltip) para no perder ese dato — el boceto lo omitía del
   todo porque su hito era decorativo, acá sigue siendo un valor real.
   El boceto también saca el Presupuesto de esta vista; se mantiene visible
   a pedido explícito del usuario (2026-09-22), como columna propia. */
.task-table{border-top:1px solid var(--line)}
.thead-row,.row-view{display:grid;grid-template-columns:minmax(0,3fr) 92px 54px 98px minmax(78px,1fr) minmax(0,1fr) minmax(84px,.8fr) auto;gap:var(--space-3);align-items:center}
.thead-row{padding:var(--space-2) var(--space-5);font-family:var(--sans);font-size:var(--text-2xs);letter-spacing:.05em;text-transform:uppercase;color:var(--ink-dim);font-weight:700;background:var(--panel-2)}
.task-row{border-top:1px solid var(--line)}
/* Fantasma (possibly_obsolete) [M3]: opacidad reducida, para que se lea como
   "residuo a revisar" sin confundirse con una tarea vigente del mismo hito —
   el badge .tag.na ya lo nombra explícitamente, esto solo refuerza. */
.task-row.is-ghost .row-view{opacity:.6}
.task-row.is-ghost .row-view:hover{opacity:.85}
.row-view{padding:var(--space-2) var(--space-5);cursor:pointer;transition:background .1s}
.row-view:hover{background:var(--panel-2)}
.rv-title{display:flex;flex-direction:column;gap:3px;min-width:0}
/* Título en negrilla, hasta 2 líneas visibles sin clic (una sola línea con
   ellipsis no alcanzaba a leerse: 2026-09-22). Clic en el título alterna
   .is-expanded (schedule.js: expandedTitles, un Set por activity_key para
   que sobreviva a los re-render) y muestra el texto completo, sin límite
   de líneas — la alternativa a esto era abrir "Editar" para leerlo entero,
   un paso de más solo para leer. */
.rv-title .t{font-size:var(--text-base);color:var(--ink);font-weight:600;line-height:1.35;cursor:pointer;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rv-title.is-expanded .t{-webkit-line-clamp:unset;display:block;overflow:visible;white-space:normal}
.hito-tag{font-family:var(--mono);font-size:var(--text-2xs);color:var(--ink-dim);background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 6px;display:inline-block;width:fit-content}
.rv-date{font-family:var(--mono);font-size:var(--text-sm);color:var(--ink-soft)}
.rv-resp{display:flex;align-items:center;gap:8px;font-size:var(--text-sm);color:var(--ink-soft);min-width:0}
.rv-resp span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rv-progress{display:flex;flex-direction:column;gap:3px}
.rv-progress .t-bar{height:5px;background:var(--line);border-radius:4px;overflow:hidden;display:block;width:auto}
.rv-progress .t-bar-fill{display:block;height:100%;border-radius:4px}
.rv-progress .t-pct{font-family:var(--mono);font-size:9.5px;color:var(--ink-dim)}
.rv-budget{font-family:var(--mono);font-size:var(--text-sm);color:var(--ink-soft)}
.rv-actions{text-align:right}
.avatar{width:24px;height:24px;border-radius:50%;flex:0 0 24px;display:flex;align-items:center;justify-content:center;font-family:var(--sans);font-weight:700;font-size:10px;color:#fff}

/* Fila abierta en edición: reemplaza la fila de lectura entera por un panel
   de campos etiquetados (no una tabla de inputs sin nombre) — una sola
   tarea editándose a la vez (editingKey en schedule.js). Mismo tinte cálido
   y borde punteado de acento que el boceto usa para marcar "modo edición"
   (.row-edit del boceto), aunque acá es flex-wrap en vez de grid fijo:
   son 9 campos reales (título/notas/fechas/avance/responsable/presupuesto/
   estado/dependencias/acciones), el boceto solo simulaba 4. */
.row-edit{display:flex;flex-wrap:wrap;gap:var(--space-3) var(--space-4);padding:var(--space-4) var(--space-5);background:#FFF9F6;border-top:1px dashed var(--agua)}
.row-edit .f{display:flex;flex-direction:column;gap:4px;min-width:110px}
.row-edit .f.grow{flex:1 1 200px}
.row-edit .f.f-hito{min-width:0;justify-content:center}
.row-edit .f.f-actions{flex-direction:row;align-items:flex-end;gap:6px;margin-left:auto}
.row-edit label{font-family:var(--sans);font-size:var(--text-2xs);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-dim);font-weight:700}
.row-edit input,.row-edit select,.row-edit textarea{font-family:var(--sans);font-size:var(--text-base);color:var(--ink);padding:7px 9px;border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;width:100%}
.row-edit input:hover,.row-edit select:hover,.row-edit textarea:hover{border-color:var(--agua)}
.row-edit input:focus,.row-edit select:focus,.row-edit textarea:focus{outline:none;border-color:var(--agua)}
.row-edit input[type=number]{width:80px}
.row-edit textarea{resize:vertical;min-height:38px}
.row-edit input[disabled],.row-edit select[disabled]{color:var(--ink-soft);cursor:default;background:var(--panel-2)}

.t-prog{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.t-prog input[type=number]{width:64px}
.t-prog .auto{font-family:var(--mono);font-size:11px;color:var(--azul);background:#E7F0FB;padding:2px 7px;border-radius:999px;white-space:nowrap}
.t-prog .t-reset{font-size:10px;padding:2px 6px}

.t-deps{display:flex;flex-wrap:wrap;gap:5px}
.dep{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:2px 8px;color:var(--ink-soft)}
.dep-cross{background:#FFF6E0;border-color:var(--veta);color:#92610A;font-weight:600}
.dep-x{background:none;border:none;color:inherit;cursor:pointer;font-size:12px;line-height:1;padding:0 2px;opacity:.6}
.dep-x:hover{opacity:1;color:var(--falla)}
.linkbtn{background:none;border:1px solid var(--line);border-radius:var(--r-sm);font-family:var(--sans);font-size:10.5px;color:var(--ink-dim);cursor:pointer;padding:3px 8px;white-space:nowrap}
.linkbtn:hover{border-color:var(--agua);color:var(--agua-ink)}

/* Badges de estado — mismo tratamiento que el boceto (.badge): pill
   relajado en minúsculas, no un chip apretado en mayúsculas (lo que había
   antes se leía más "de sistema viejo" que "de producto nuevo"). */
.st{display:inline-flex;align-items:center;gap:5px;font-family:var(--sans);font-weight:600;font-size:var(--text-sm);padding:4px 10px;border-radius:var(--r-pill);white-space:nowrap;width:fit-content}
.st-done{color:var(--ok);background:#E9F7EF}
.st-pending{color:var(--ink-dim);background:var(--panel-2)}
.st-in_progress{color:var(--azul);background:#E7F0FB}
.st-late{color:var(--falla);background:#FDECEC}
/* Iconografía de estado — mismo lenguaje SVG que includes/header.php
   (viewBox 24, stroke=currentColor), extendido acá en vez de un set nuevo.
   Hallazgo del boceto: "cero íconos fuera del sidebar". */
.t-icon{width:13px;height:13px;flex:0 0 auto}

/* Cuarto nivel del cronograma — subtareas (2026-09-22). Mismo lenguaje
   visual que .row-view/.row-edit/.hito-tag, con sangría (.sub-rows) para
   leerse como "adentro de" su tarea padre. */
.task-row.has-subs{position:relative}
.sub-toggle{display:inline-flex;align-items:center;gap:4px;background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-pill);font-family:var(--mono);font-size:10.5px;color:var(--ink-soft);cursor:pointer;padding:2px 8px;width:fit-content}
.sub-toggle:hover{border-color:var(--agua);color:var(--agua-ink)}
.sub-toggle .chev{font-size:12px}
.sub-toggle .late-dot{width:6px;height:6px;border-radius:50%;background:var(--falla);display:inline-block}
.sub-rows{background:var(--panel-2);border-top:1px dashed var(--line)}
.row-view.is-sub,.row-edit.is-sub{display:grid;grid-template-columns:minmax(0,3fr) 92px 54px 98px minmax(78px,1fr) minmax(0,1fr) minmax(84px,.8fr) auto;gap:var(--space-3);align-items:center;padding:8px var(--space-5);border-top:1px solid var(--line)}
.row-edit.is-sub{display:flex;flex-wrap:wrap;padding-left:calc(var(--space-5) + 22px);background:#FFFCF9}
.sub-glyph{font-family:var(--mono);font-size:10px;color:var(--ink-dim);white-space:nowrap}
.f-hint{flex:1 1 100%;font-size:var(--text-2xs);color:var(--ink-dim)}
.derived{font-family:var(--mono);font-size:10px;color:var(--ink-dim);background:var(--panel);padding:1px 6px;border-radius:999px;white-space:nowrap;margin-left:4px}
.rv-date.is-derived{font-style:italic}
.rv-budget.is-sum{text-decoration:underline dotted var(--ink-dim)}
.orphan-hint{font-size:10px;color:var(--ink-dim);font-style:italic}
.ro-hint{font-size:10px;color:var(--ink-dim)}

/* Fase D — sugerencia de subtareas por IA (2026-09-22). Puerto de
   mockups/cronograma-subtareas/style.css. .linkbtn[disabled] no existía
   (gap real: sin esto "Sugerir con IA" se veía con el estilo nativo del
   navegador al simular sin conexión, no con el lenguaje del resto de la
   app — mismo criterio que .btn.is-disabled de tokens.css). */
.linkbtn[disabled]{opacity:.4;cursor:not-allowed;pointer-events:none}
.linkbtn.ai-suggest{border-color:var(--agua);color:var(--agua-ink)}
.linkbtn.ai-suggest:hover{background:#FFF6F3}
.linkbtn.ai-regenerate{border:none;background:none;color:var(--ink-dim);text-decoration:underline;padding:3px 4px}
.linkbtn.ai-regenerate:hover{color:var(--agua-ink)}

.ai-review{background:#F5F3FF;border-top:1px dashed #8A7BD8;padding:var(--space-4) var(--space-5)}
.ai-review-head{display:flex;align-items:flex-start;gap:8px;margin-bottom:var(--space-3);font-size:var(--text-sm);color:var(--ink-soft)}
.ai-review-head svg{width:16px;height:16px;flex:0 0 auto;color:#8A7BD8;margin-top:1px}
.ai-review-head .ai-meta{font-family:var(--mono);font-size:10px;color:var(--ink-dim);margin-top:2px}
.ai-warn{display:flex;align-items:center;gap:6px;font-size:var(--text-sm);color:#92610A;background:#FFF6E0;border:1px solid #F5D68C;border-radius:var(--r-sm);padding:7px 10px;margin-bottom:var(--space-3)}
.ai-candidate{display:flex;flex-wrap:wrap;gap:var(--space-3) var(--space-4);align-items:flex-start;padding:var(--space-3) 0;border-bottom:1px solid rgba(138,123,216,.25)}
.ai-candidate:last-of-type{border-bottom:none}
.ai-candidate .ai-check{flex:0 0 auto;margin-top:9px}
.ai-candidate .ai-check input{width:16px;height:16px;cursor:pointer}
.ai-candidate .f{display:flex;flex-direction:column;gap:4px;min-width:110px}
.ai-candidate .f.grow{flex:1 1 220px}
.ai-candidate label{font-family:var(--sans);font-size:var(--text-2xs);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-dim);font-weight:700}
.ai-candidate input,.ai-candidate textarea{font-family:var(--sans);font-size:var(--text-base);color:var(--ink);padding:7px 9px;border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;width:100%}
.ai-candidate textarea{resize:vertical;min-height:36px}
/* rationale de la IA: texto de apoyo bajo Notas, nunca el valor inicial del
   campo — el asesor tiene que poder distinguir "esto lo dijo la IA" de
   "esto lo escribí yo", incluso después de aceptar. */
.ai-rationale{font-size:11px;color:var(--ink-dim);font-style:italic;margin-top:2px;line-height:1.4}
.ai-rationale b{font-style:normal;color:#8A7BD8;font-weight:600}
.ai-source{font-family:var(--mono);font-size:10px;color:var(--ink-dim)}
.ai-empty{text-align:center;padding:var(--space-5) var(--space-3);color:var(--ink-dim)}
.ai-empty p{font-size:var(--text-base);margin-bottom:var(--space-3)}
.ai-review-foot{display:flex;align-items:center;gap:10px;margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px dashed rgba(138,123,216,.35)}
/* marca propia — NUNCA .tag.na (eso es "posiblemente obsoleta": dato real
   que dejó de tener sentido); esto es lo opuesto, dato que todavía no es
   real. Violeta para no pisar ningún semáforo de riesgo/estado existente. */
.tag.ai-draft{background:#F5F3FF;color:#5A4A9E;border:1px solid #D9D2F0}

#schedule-blockers{background:#FFF6E0;border:1px solid var(--veta);border-radius:var(--r);padding:14px 16px;margin-bottom:16px}
.blocker{font-size:12.5px;padding:6px 0;border-bottom:1px solid rgba(0,0,0,.06)}
.blocker:last-child{border:none;padding-bottom:0}
.blocker-task{font-weight:600;color:var(--ink)}
.blocker-by{color:var(--ink-soft);font-size:11.5px;margin-top:2px}

#schedule-picker{display:none;position:fixed;inset:0;background:rgba(20,22,26,.45);z-index:60;align-items:center;justify-content:center;padding:20px}
.picker-box{background:var(--panel);border-radius:var(--r);padding:20px;max-width:520px;width:100%;box-shadow:var(--shadow-lg)}
.picker-head{font-size:13.5px;font-weight:600;margin-bottom:12px;color:var(--ink)}
.picker-box select{width:100%;font-family:var(--sans);font-size:12.5px;padding:8px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel);color:var(--ink)}
.picker-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:14px}

#schedule-add{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end;background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px;margin-top:6px}
#schedule-add label{display:flex;flex-direction:column;gap:3px;font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-dim);font-weight:700}
#schedule-add input,#schedule-add select{font-family:var(--sans);font-size:12.5px;padding:6px 8px;border:1px solid var(--line);border-radius:4px;background:var(--panel);color:var(--ink)}

.task-x{margin-left:5px;padding:3px 7px;line-height:1}

/* ---------- Vista Tablero (Kanban), 2026-09-22 --------------------------
   Arrastrar y soltar nativo (mismo criterio que dropzone.js: sin librería).
   Semántica de negocio ya decidida: soltar en "Cumplido" fuerza
   progress_pct=100 (guardado real); soltar en cualquier otra columna es
   un no-op con aviso — el estado se calcula desde las fechas
   (Schedule::status()), no es un interruptor que se pueda mentir. */
.kanban{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--space-4);align-items:start}
@media(max-width:980px){.kanban{grid-template-columns:1fr 1fr}}
.kanban-col{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r);min-height:120px;display:flex;flex-direction:column}
.kanban-col.drag-over{outline:2px dashed var(--agua);outline-offset:-2px;background:#FFF6F3}
.kc-head{display:flex;align-items:center;gap:8px;padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--line);border-top:3px solid var(--kc-color,var(--line));border-top-left-radius:var(--r);border-top-right-radius:var(--r);font-family:var(--sans);font-weight:700;font-size:var(--text-sm);color:var(--ink)}
.kc-head svg{width:16px;height:16px;flex:0 0 auto;color:var(--kc-color,var(--ink-dim))}
.kc-head .kc-n{margin-left:auto;font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-dim);background:var(--panel);border:1px solid var(--line);border-radius:var(--r-pill);padding:1px 8px}
.kc-body{padding:var(--space-3);display:flex;flex-direction:column;gap:var(--space-3);flex:1}
.k-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--space-3) var(--space-4);box-shadow:var(--shadow-sm);cursor:grab;border-left:4px solid var(--comp-color,var(--line));transition:box-shadow .15s}
.k-card:active{cursor:grabbing}
.k-card:hover{box-shadow:var(--shadow-md)}
.k-card.dragging{opacity:.4}
.k-card .kc-comp{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-dim);margin-bottom:6px}
.k-card .kc-subs{margin-left:auto;background:var(--panel-2);border-radius:999px;padding:1px 6px;font-weight:700}
.k-card .kc-comp .dot{width:7px;height:7px;border-radius:50%;background:var(--comp-color)}
.k-card .kc-parent{font-size:var(--text-2xs);color:var(--ink-dim);margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.k-card .kc-title{font-size:var(--text-base);font-weight:600;color:var(--ink);line-height:1.35;margin-bottom:8px}
.k-card .kc-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}
.k-card .kc-date{font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-soft)}
.k-card .kc-budget{font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-soft);margin-bottom:8px}
.k-card .kc-bar{height:4px;background:var(--line);border-radius:4px;overflow:hidden}
.k-card .kc-bar i{display:block;height:100%}

/* ---------- Vista Línea de tiempo, 2026-09-22 ---------------------------
   Reemplaza al Gantt vendorizado (Frappe Gantt, público/vendor/frappe-gantt/
   — decisión del usuario, ver [[decisiones]]): barras con los tokens del
   sistema en vez de Helvetica. Se pierde arrastrar-para-reprogramar (las
   fechas se siguen editando desde la vista Tabla) y las flechas de
   dependencia se reemplazan por una marca ⚠ en la etiqueta de la tarea
   (.tl-cross) — menos preciso que una flecha, pero no desaparece la señal
   de "esto depende de otro componente". */
#schedule-timeline{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:var(--space-5);box-shadow:var(--shadow-sm);overflow-x:auto;margin-bottom:18px}
.tl-months{display:grid;grid-template-columns:220px 1fr;gap:var(--space-3);margin-bottom:var(--space-2);min-width:820px}
.tl-comp-block{margin-bottom:var(--space-4);min-width:820px}
.tl-comp-label{display:flex;align-items:center;gap:8px;font-family:var(--disp);font-weight:700;font-size:var(--text-base);color:var(--ink);margin-bottom:6px}
.tl-comp-label .dot{width:10px;height:10px;border-radius:50%}
.tl-row{display:grid;grid-template-columns:220px 1fr;gap:var(--space-3);align-items:center;padding:5px 0}
.tl-row .tl-label{display:flex;flex-direction:column;gap:2px;min-width:0;padding-right:8px}
.tl-row .tl-label .hito-tag{font-family:var(--mono);font-size:9.5px;color:var(--ink-dim);width:fit-content}
.tl-row .tl-label .t{font-size:var(--text-sm);color:var(--ink);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tl-row .tl-budget{font-family:var(--mono);font-size:9.5px;color:var(--ink-dim)}
.tl-cross{color:var(--veta);font-size:11px}
.tl-track{position:relative;height:22px;background:var(--panel-2);border-radius:4px}
.tl-bar{position:absolute;top:2px;height:18px;border-radius:var(--r-sm);display:flex;align-items:center;padding:0 8px;overflow:hidden;font-family:var(--sans);font-size:11px;font-weight:600;color:#fff;white-space:nowrap;box-shadow:var(--shadow-sm)}
.tl-bar.is-late{outline:2px solid var(--falla);outline-offset:1px}
.tl-bar .tl-bar-progress{position:absolute;top:0;left:0;bottom:0;background:rgba(255,255,255,.4);border-top-left-radius:inherit;border-bottom-left-radius:inherit}
.tl-bar .tl-bar-label{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis}
.tl-axis-inner{position:relative;height:22px;margin-bottom:4px}
.tl-axis-inner .tick{position:absolute;top:0;bottom:0;border-left:1px solid var(--line);padding-left:6px;font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-dim)}
.tl-axis-inner .tick-today{border-left:2px dashed var(--agua);color:var(--agua-ink);font-weight:700;z-index:2}
.task-x:hover{border-color:var(--falla);color:var(--falla)}

/* Documental — Nivel 1 habilitantes (screens/documental.php,
   public/js/documental.js). No existía CSS para .hab-* hasta el
   2026-09-20: la pantalla renderizaba funcional pero sin estilo propio. */
.hab-gate{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--panel);
  border:1px solid var(--line);border-radius:var(--r);padding:14px 18px;margin-bottom:22px;
  box-shadow:var(--shadow-sm);
}
.hab-meta{font-family:var(--sans);font-size:12.5px;color:var(--ink-dim)}
.hab-meta.exp-late{color:var(--falla);font-weight:600}
.hab-group{margin-bottom:26px}
.hab-group-label{
  font-family:var(--disp);font-weight:700;font-size:13px;letter-spacing:.04em;text-transform:uppercase;
  color:var(--ink-soft);margin-bottom:10px;
}
.hab-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px}
.hab-card h4{margin:0 0 6px;font-family:var(--disp);font-size:15px;color:var(--ink)}
.hab-state{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0}
.hab-updated{display:block;font-family:var(--mono);font-size:10.5px;color:var(--ink-dim);margin-top:8px}
.hab-norma{font-family:var(--mono);font-size:10.5px;color:var(--ink-dim);margin-top:6px}
.hab-history{display:none;margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.hab-history.on{display:block}
.hab-history-row{padding:6px 0;font-size:12.5px;color:var(--ink)}
.hab-history-row:not(:last-child){border-bottom:1px solid var(--line)}
.hab-form{margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}
.hab-docs{margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}
.hab-docs-label{font-family:var(--sans);font-size:11.5px;font-weight:600;color:var(--ink-soft);margin-bottom:8px}
.hab-docs .file{grid-template-columns:26px 1fr auto auto auto;padding:9px 12px;margin-bottom:8px}
.fld input[type=date]{
  width:100%;background:#fff;border:1px solid var(--line);border-radius:var(--r-sm);
  color:var(--ink);font-family:var(--sans);font-size:13.5px;padding:9px 11px;
}
.fld input[type=date]:focus{outline:none;border-color:var(--agua);box-shadow:0 0 0 3px rgba(255,122,89,.15)}

/* Visita técnica — Nivel 2 (screens/visita.php, public/js/visita.js).
   Modal de confirmación simple (sin correo, sin código) — decisión D3:
   "vas a registrar una nueva visita, esto puede actualizar hallazgos
   existentes y generar tareas nuevas". Un diálogo propio, no confirm()
   nativo, porque acá sí conviene frenar y mostrar el texto completo. */
.modal-backdrop{
  position:fixed;inset:0;background:rgba(15,23,42,.45);display:flex;
  align-items:center;justify-content:center;z-index:100;padding:20px;
}
.modal-box{
  background:var(--panel);border-radius:var(--r);box-shadow:0 12px 32px rgba(15,23,42,.25);
  padding:24px;max-width:460px;width:100%;
}
.modal-box h3{margin:0 0 10px;font-family:var(--disp)}
.modal-box p{margin:0 0 18px;font-size:13.5px;color:var(--ink)}
.modal-box .actions{margin:0;justify-content:flex-end}

.visita-draft{margin-bottom:26px}
.visita-draft-row{
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:14px 16px;margin-bottom:10px;box-shadow:var(--shadow-sm);
}
.visita-draft-row.excluded{opacity:.5}
.visita-draft-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}
.visita-draft-head input[type=checkbox]{margin-top:3px;width:auto}
.visita-draft-desc{font-size:13px;color:var(--ink);margin:0 0 4px}
.visita-draft-desc b{color:var(--ink-soft)}
.visita-draft-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-top:8px}
.visita-draft-fields .fld{margin:0}
.visita-ai-note{font-family:var(--mono);font-size:10.5px;color:var(--ink-dim);margin-top:6px}
.visita-table{width:100%;border-collapse:collapse;font-size:12.5px}
.visita-table th{
  text-align:left;font-family:var(--sans);font-size:10.5px;letter-spacing:.04em;text-transform:uppercase;
  color:var(--ink-dim);padding:8px 10px;border-bottom:1px solid var(--line);
}
.visita-table td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
.visita-table .desc{max-width:280px}
.visita-history-item{display:flex;justify-content:space-between;align-items:center;padding:8px 0;font-size:12.5px;border-bottom:1px solid var(--line)}

/* =========================================================================
   Portado de mockups/dashboard-v2/ ("Propuesta — Panorama gráfico",
   aprobada) a screens/dashboard.php — ver docs/contexto/decisiones.md,
   punto 32 ("portar comportamiento + estructura + valores exactos"). La
   cabecera de anillos (.rings-head/.gauge-*/.ring-strip/.ring-card/
   .stat-mini) ya existía arriba (screens/project-manager.php) y no se
   repite acá. Todo lo de este bloque es NUEVO, propio de esta pantalla:
   habilitantes como franja de chips, hallazgos como tarjetas con escala
   0-4, el checklist de "listo para generar el plan" con barras, y los
   tiles de Memoria/Novedades del plan.
   ========================================================================= */

/* ---------- habilitantes: franja de 5 chips en vez de tabla ---------- */
.gate-strip{display:flex;gap:var(--space-2);flex-wrap:wrap}
.gate-chip{
  flex:1 1 160px;display:flex;align-items:flex-start;gap:9px;
  background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:10px 12px;
}
.gate-chip .gc-dot{width:9px;height:9px;border-radius:50%;flex:0 0 auto;margin-top:5px}
.gate-chip b{display:block;font-size:12.5px;color:var(--ink);font-weight:600}
.gate-chip span{display:block;font-size:11px;color:var(--ink-dim);margin-top:2px}
.gate-chip.sev-bajo .gc-dot{background:var(--ok)}
.gate-chip.sev-medio .gc-dot{background:var(--veta)}
.gate-chip.sev-alto .gc-dot{background:var(--serio)}
.gate-chip.sev-crit .gc-dot{background:var(--falla)}
.gate-chip.sev-crit{border-color:#F5A8A8;background:#FDECEC}

/* ---------- hallazgos: tarjetas con escala 0-4 (.level-dots) ---------- */
.findings-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;margin-bottom:var(--space-4)}
.findings-count{color:var(--ink-dim);font-weight:400;font-size:var(--text-base)}
.filter-chips{display:flex;gap:6px;flex-wrap:wrap}
.filter-chip{
  font-family:var(--sans);font-size:12px;font-weight:600;color:var(--ink-soft);
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r-pill);
  padding:5px 12px;cursor:pointer;transition:.15s;
}
.filter-chip span{font-family:var(--mono);font-weight:400;color:var(--ink-dim);margin-left:3px}
.filter-chip:hover{border-color:var(--agua);color:var(--agua-ink)}
.filter-chip[aria-selected="true"]{background:var(--ink);color:#fff;border-color:var(--ink)}
.filter-chip[aria-selected="true"] span{color:rgba(255,255,255,.7)}

.finding-row{
  display:grid;grid-template-columns:8px 1fr auto auto;gap:var(--space-4);align-items:center;
  padding:var(--space-3) 0;border-top:1px solid var(--line);
}
.finding-row:first-of-type{border-top:none}
.fr-dot{width:8px;height:8px;border-radius:50%;align-self:flex-start;margin-top:6px}
.fr-body{min-width:0}
.fr-text{font-size:var(--text-base);color:var(--ink);margin:0;line-height:1.45}
.fr-meta{display:flex;gap:8px;margin-top:4px;font-family:var(--mono);font-size:10.5px;color:var(--ink-dim)}
.fr-comp{font-weight:600}
.level-dots{display:flex;gap:4px;flex:0 0 auto}
.level-dots .ld{width:9px;height:9px;border-radius:50%;background:var(--line)}
.level-dots .ld.on{background:var(--ink-soft)}
.level-dots .ld.target{background:none;border:1.5px dashed var(--ink-dim)}
.level-dots .ld.dash{background:none;border:1.5px dotted var(--line)}
@media(max-width:760px){
  .finding-row{grid-template-columns:8px 1fr;grid-template-areas:"dot body" ". levels" ". tag"}
  .fr-dot{grid-area:dot}.fr-body{grid-area:body}.level-dots{grid-area:levels;margin-top:6px}
}

/* ---------- plan de trabajo: checklist con barras en vez de bullets ---------- */
.check-meter-list{display:flex;flex-direction:column;gap:var(--space-3)}
.check-meter{display:grid;grid-template-columns:1fr auto;gap:4px 12px;align-items:center}
.cm-head{display:flex;justify-content:space-between;gap:10px;font-size:var(--text-sm);color:var(--ink-soft)}
.cm-head b{color:var(--ink);font-weight:700}
.cm-bar{grid-column:1/2;height:6px;background:var(--line);border-radius:4px;overflow:hidden}
.cm-bar i{display:block;height:100%;background:var(--agua);border-radius:4px}
.cm-bar.warn{background:#FFF6E0}
.cm-bar.warn i{background:var(--veta)}
.cm-link{grid-row:1/3;grid-column:2;font-size:12px;font-weight:600;color:var(--agua-ink);text-decoration:none;white-space:nowrap;align-self:center}
.cm-link:hover{text-decoration:underline}

/* ---------- memoria del plan: tiles clicables en vez de <details> de prosa ---------- */
.memory-title{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-dim);margin:0 0 var(--space-3);display:flex;align-items:center;gap:8px}
.badge-auto{
  font-family:var(--mono);font-size:9px;letter-spacing:.03em;text-transform:none;font-weight:600;
  color:var(--azul);background:#E7F0FB;padding:2px 8px;border-radius:var(--r-pill);
}
.memory-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-3);align-items:start}
@media(max-width:820px){.memory-grid{grid-template-columns:1fr 1fr}}
@media(max-width:560px){.memory-grid{grid-template-columns:1fr}}
.memory-tile{
  background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:10px 12px;
}
.memory-tile summary{
  cursor:pointer;list-style:none;font-size:12.5px;font-weight:600;color:var(--ink);
  display:flex;flex-direction:column;gap:3px;
}
.memory-tile summary::-webkit-details-marker{display:none}
.memory-tile .mt-n{font-family:var(--disp);font-weight:800;font-size:15px;color:var(--agua-ink)}
.memory-tile p{margin:8px 0 0;font-size:12px;color:var(--ink-soft);line-height:1.5}

.novelty-row{display:flex;gap:8px;flex-wrap:wrap}
/* .novelty-chip es un resumen, no un control: el detalle completo ya se
   muestra siempre debajo (mismas listas de siempre) sin depender de un
   clic — por eso no lleva cursor:pointer ni handler de JS (corregido tras
   revisión, el boceto tenía un toggle sin efecto visual definido). */
.novelty-chip{
  font-family:var(--sans);font-size:12.5px;font-weight:600;border-radius:var(--r-pill);
  padding:6px 14px;border:1px solid var(--line);background:var(--panel);color:var(--ink);
}
.novelty-chip.nv-new{color:var(--ok);border-color:#9EDDB6;background:#E9F7EF}
.novelty-chip.nv-removed{color:var(--ink-dim)}
.novelty-chip.nv-changed{color:#92610A;border-color:#F5D68C;background:#FFF6E0}
.novelty-chip.nv-fused{color:var(--azul);border-color:#BFD8F5;background:#E7F0FB}

.ai-suggestion{margin-top:var(--space-2);padding:14px 16px}
.ai-suggestion-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:2px}
.ai-badge{
  font-family:var(--mono);font-size:9.5px;letter-spacing:.03em;font-weight:700;
  color:#fff;background:var(--ink-soft);padding:3px 8px;border-radius:var(--r-pill);
}

/* =========================================================================
   Portado de mockups/cuestionario-v2/ ("Propuesta — Más gráfico", aprobada)
   a public/js/questionnaire.js — mismo criterio que arriba. .q/.q-label/
   .q-text/.pill/.level-cards/.lvl-n/.lvl-d/.tier-tag/.flag/.upload-req/
   .q-progress ya existen y no cambian de comportamiento; esto es solo lo
   NUEVO: franja de progreso por componente, mini-dial de nivel y chip de
   evidencia (el ícono de .flag ya se agregó arriba, junto a .flag).
   ========================================================================= */
.comp-progress-strip{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:var(--space-2)}
.cps-item{
  flex:1 1 90px;display:flex;flex-direction:column;gap:5px;
  padding:8px 10px;border-radius:var(--r-sm);background:var(--panel-2);border:1px solid var(--line);
  font-size:11px;color:var(--ink-dim);
}
.cps-item b{font-family:var(--mono);font-size:11px;color:var(--ink-soft);font-weight:600}
.cps-item .cps-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-bottom:2px;opacity:.35}
.cps-item.is-done{background:#F4FBF6;border-color:#CFEEDA}
.cps-item.is-done .cps-dot{opacity:1}
.cps-item.is-done b{color:var(--ok)}
.cps-item.is-current{background:#FFF6F3;border-color:#FFD4C4;box-shadow:0 0 0 1px var(--agua) inset}
.cps-item.is-current .cps-dot{opacity:1}
.cps-item.is-current b{color:var(--agua-ink)}

.q-card{border-left-width:3px}
.q-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}

/* Mini-dial por nivel: la MISMA información que .lvl-n (el número), leída
   además como posición en la escala — puramente visual, calculado del
   propio índice del nivel (0,1,2,3,4 → 0%,25%,50%,75%,100%). */
.level-card{position:relative;padding-bottom:10px}
.level-dial{
  position:absolute;left:50px;right:14px;bottom:5px;height:3px;background:var(--line);border-radius:3px;overflow:hidden;
}
.level-dial i{display:block;height:100%;background:var(--line)}
.level-card[aria-pressed="true"] .level-dial i{background:var(--agua)}
.level-card:hover .level-dial i{background:var(--ink-dim)}
@media(max-width:560px){.level-dial{display:none}}

.evidence-chip{
  display:flex;align-items:center;gap:8px;margin-top:12px;padding:9px 12px;
  background:#FFF6F3;border:1px solid #FFD4C4;border-radius:var(--r-sm);
  font-size:12px;color:var(--agua-ink);
}
.evidence-chip svg{width:16px;height:16px;flex:0 0 auto}
.visita-history-item:last-child{border-bottom:none}

/* =========================================================================
   Cuestionario por TAREAS (mockups/cuestionario-tareas/, aprobado 2026-10-01).
   Una tarea = una línea: título | 5 casillas 0-4 | evidencia + subtareas.
   Mismos valores del boceto, con prefijo tk- para no chocar con .chip-detail,
   .tier-tag, etc. ya existentes.
   ========================================================================= */
.tk-grid{display:grid;grid-template-columns:minmax(260px,1fr) repeat(5,64px) 230px;align-items:center;gap:var(--space-2)}
.tk-head{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.05em;color:var(--ink-dim);padding:0 var(--space-3) var(--space-2)}
.tk-lv{text-align:center;display:flex;flex-direction:column}
.tk-lv span{font:700 var(--text-md) var(--mono);color:var(--ink)}
.tk-lv small{font-size:var(--text-2xs);text-transform:none;letter-spacing:0}
.tk-row{background:var(--panel);border:1px solid var(--line);border-left:4px solid var(--c-jur);border-radius:var(--r);margin-bottom:6px;box-shadow:var(--shadow-sm)}
.tk-row .tk-grid{padding:var(--space-2) var(--space-3);cursor:pointer}
.tk-row:hover{border-color:var(--ink-dim)}
.tk-title{display:flex;align-items:center;gap:var(--space-2);min-width:0}
.tk-code{font:600 var(--text-xs) var(--mono);flex:0 0 auto}
.tk-name{font-size:var(--text-base);color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tk-cell{height:34px;border:1.5px solid var(--line);border-radius:var(--r-sm);background:var(--panel);cursor:pointer;display:flex;align-items:center;justify-content:center;font:600 var(--text-sm) var(--mono);color:transparent}
.tk-cell:hover{border-color:var(--ink-dim)}
.tk-cell[aria-pressed="true"]{background:#FFF6F3;border-color:var(--agua);color:var(--agua-ink)}
.tk-cell[aria-pressed="true"].capped{border-style:dashed;background:#FFFBEB;border-color:var(--veta);color:#8A5A00}
.tk-meta{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}
.tk-chip{font-size:var(--text-xs);padding:2px 8px;border-radius:var(--r-pill);border:1px solid var(--line);background:var(--panel-2);color:var(--ink-soft);white-space:nowrap}
.tk-chip.ok{background:#EAF7EA;border-color:#B7E0B7;color:#0B6B0B}
.tk-chip.warn{background:#FFF6E0;border-color:#F3D48B;color:#8A5A00}
.tk-chip.sub{background:#EEF4FD;border-color:#BBD3F2;color:var(--azul)}
.tk-detail{border-top:1px dashed var(--line);padding:var(--space-3) var(--space-4);display:grid;gap:var(--space-4);grid-template-columns:1fr 1fr}
.tk-detail h4{margin:0 0 6px;font-size:var(--text-sm);text-transform:uppercase;letter-spacing:.05em;color:var(--ink-dim)}
.tk-detail p{margin:0 0 6px;font-size:var(--text-base)}
.tk-follow{grid-column:1/-1}
.tk-subs,.tk-norms{margin:0 0 6px;padding-left:18px;font-size:var(--text-sm)}
.tk-norms em{color:var(--ink-dim)}
.tk-hint{font-size:var(--text-sm);color:var(--ink-dim)}
@media(max-width:820px){
  .tk-head{display:none}
  .tk-grid{grid-template-columns:repeat(5,1fr)}
  .tk-title,.tk-meta{grid-column:1/-1}
  .tk-name{white-space:normal}
  .tk-meta{justify-content:flex-start}
  .tk-cell{color:var(--ink-dim)}
  .tk-detail{grid-template-columns:1fr}
}

/* Entregable de la tarea, debajo de su fila en el cronograma (modelo por tareas). */
.t-deliv{font-size:var(--text-xs);color:var(--ink-dim);padding:0 var(--space-3) 6px 56px}
.t-deliv b{color:var(--ink-soft)}
.t-rating{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:0 var(--space-3) 8px 56px}
.rt-lbl{font-size:var(--text-xs);color:var(--ink-dim);margin-right:2px}
.rt-cell{display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;border:1.5px solid var(--line);border-radius:var(--r-sm);background:var(--panel);cursor:pointer;font-size:var(--text-xs);color:var(--ink-dim)}
.rt-cell b{font-family:var(--mono);color:var(--ink-soft)}
.rt-cell:hover:not(:disabled){border-color:var(--ink-dim)}
.rt-cell[aria-pressed="true"]{background:#FFF6F3;border-color:var(--agua);color:var(--agua-ink)}
.rt-cell[aria-pressed="true"] b{color:var(--agua-ink)}
.rt-cell:disabled{cursor:default;opacity:.7}

.tk-review{background:#FFFBEB;border:1px dashed #F3D48B;border-radius:var(--r-sm);padding:var(--space-3)}
.tk-review .fld{margin-bottom:var(--space-2)}

/* Pestaña Autos: PDF del auto, respuesta del proyecto y de la ANM en una sola línea */
.autos-resp-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}
.autos-resp-box{border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;display:grid;gap:6px;align-content:start}
.autos-resp-box textarea{width:100%;font:inherit;font-size:13px;resize:vertical}
.autos-resp-title{font-size:var(--text-xs);font-weight:600;color:var(--ink-soft)}
.autos-work-row{display:flex;gap:12px;flex-wrap:wrap;align-items:center}

/* Respuestas de los agentes (BPlantMarkdown): párrafos cortos, listas con aire, negrita sobria */
.bubble .md-p{margin:0 0 8px}
.bubble .md-p:last-child,.bubble .md-list:last-child{margin-bottom:0}
.bubble .md-h{margin:10px 0 4px;font-weight:700}
.bubble .md-list{margin:0 0 8px;padding-left:20px}
.bubble .md-list li{margin:0 0 4px;line-height:1.45}
.bubble .md-p strong,.bubble .md-list strong{font-weight:700}
.bubble code{font-family:var(--mono);font-size:.92em;background:var(--panel-2);padding:1px 5px;border-radius:4px}

/* Tarjeta de cambios propuestos al cronograma desde el chat de un agente */
.sched-card{margin-top:10px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel-2);padding:10px 12px;display:grid;gap:8px}
.sched-title{font-weight:700;font-size:13px}
.sched-list{margin:0;padding:0;list-style:none;display:grid;gap:4px;font-size:13px}
.sched-list li.is-ok{color:#0B6B0B}
.sched-list li.is-fail{color:var(--falla)}
.sched-list li.is-undone{color:var(--ink-dim)}
.sched-mark{display:inline-block;width:1.2em}
.sched-err{font-size:12px}
.sched-rejected{font-size:12.5px;color:var(--ink-dim)}
.sched-rejected ul{margin:2px 0 0;padding-left:18px}
.sched-actions{display:flex;gap:8px;flex-wrap:wrap}
.sched-status,.sched-note{font-size:12.5px;color:var(--ink-dim)}

/* Descripción visible de una subtarea (antes solo salía al pasar el mouse) y detalle en la tarjeta del agente */
.rv-title .t-desc{font-size:12px;color:var(--ink-dim);line-height:1.35;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.sched-detail{display:block;margin-left:1.2em;font-size:12px;color:var(--ink-dim)}

/* Plan de trabajo con ficha desplegable (2026-10-05): una tarea = una línea; el detalle vive en la ficha. */
.rv-title.is-line{flex-direction:row;align-items:center;gap:8px;flex-wrap:nowrap}
.rv-title.is-line .t{display:block;white-space:normal;flex:1 1 auto;min-width:0;overflow:visible;-webkit-line-clamp:unset;line-height:1.2;font-size:var(--text-sm)}
.rv-title.is-line .sub-toggle{margin-left:2px}
.rv-title.is-line .hito-tag,.rv-title.is-line .hab-tag,.rv-title.is-line .lvl-chip,.rv-title.is-line .sub-toggle,.rv-title.is-line .sub-glyph{flex:none}
.tw{display:inline-block;flex:none;color:var(--ink-dim);transition:transform .15s;width:12px;text-align:center}
.task-row.is-open>.row-view .tw,.task-row.subs-open>.row-view .tw,.row-view.is-sub.is-open .tw{transform:rotate(90deg)}
.task-row.is-open>.row-view{background:#FFF6F3}
.task-row.is-ghost .tw{display:none}
.lvl-chip{display:inline-flex;align-items:center;border-radius:var(--r-pill);padding:1px 9px;font-size:11.5px;border:1px solid var(--line);background:var(--panel);color:var(--ink-soft);white-space:nowrap}
.lvl-chip.is-ok{color:#1d6b43;background:#e9f6ef;border-color:#bfe3cf}
.lvl-chip.is-warn{color:#8A5A00;background:#FFFBEB;border-color:#F0DDA8}
.t-ficha{padding:4px var(--space-5) var(--space-4) calc(var(--space-5) + 22px);background:#FFF6F3;border-top:1px dashed #efd9d0}
.ficha-grid{display:grid;grid-template-columns:1.2fr 1fr;gap:var(--space-5)}
@media (max-width:820px){.ficha-grid{grid-template-columns:1fr}}
.t-ficha h4,.sub-ficha h4{margin:10px 0 3px;font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-dim);font-weight:600}
.ficha-text{margin:0;font-size:var(--text-sm);line-height:1.5;color:var(--ink);white-space:pre-wrap}
.ficha-empty{margin:0;font-size:var(--text-xs);color:var(--ink-dim)}
.ficha-actions{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-top:var(--space-3)}
.t-ficha .t-rating{padding:0;margin:0}
.sub-ficha{padding:2px var(--space-5) var(--space-3) calc(var(--space-5) + 44px);background:var(--panel-2);border-top:1px solid var(--line)}
.row-view.is-sub{cursor:pointer}
.row-view.is-sub.is-open{background:#F5F1E8}
.row-view.is-sub .rv-title.is-line{padding-left:22px}
.sub-toggle{white-space:nowrap}
.rv-date{white-space:nowrap;display:flex;align-items:center;gap:5px}
.rv-date .st-ico{display:inline-flex;flex:none;width:14px;height:14px}
.rv-date .st-ico svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8}
.rv-date.st-pending .st-ico{color:var(--ink-dim)}
.rv-date.st-in_progress .st-ico{color:var(--azul)}
.rv-date.st-done .st-ico{color:var(--ok)}
.rv-date.st-late{color:var(--falla);font-weight:600}
.rv-date.st-late .st-ico{color:var(--falla)}
.row-view.is-sub .rv-title.is-line .t{font-weight:400;font-size:var(--text-sm);white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;text-overflow:clip;line-height:1.35}

/* Marca "por visita" [MAD-10]: nivel observado en la visita cuando no hay nivel declarado. */
.lvl-chip.is-visit{color:#1f5a8c;background:#e8f1fa;border-color:#b9d4ec}
.rt-cell.by-visit{border-style:dashed;border-color:#4a86b8;color:#1f5a8c;background:#f3f8fd}
.rt-cell.by-visit b{color:#1f5a8c}
.rt-visit-note{flex-basis:100%;font-size:var(--text-xs);color:#1f5a8c;margin-top:2px}
.tk-cell.by-visit{border-style:dashed;border-color:#4a86b8;background:#f3f8fd;color:#1f5a8c}
.tk-chip.visit{color:#1f5a8c;background:#e8f1fa;border-color:#b9d4ec}

/* ---------- Plan "Ahora / En espera" (2026-10-06, modules/schedule/Horizon.php) ---------- */
.rv-actions{display:flex;flex-direction:column;align-items:flex-end;gap:3px}
.rv-actions .hab-tag,.rv-actions .lvl-chip,.rv-actions .tag{margin:0;white-space:normal;text-align:right;line-height:1.15;max-width:132px;font-size:10px;padding:1px 7px}
.hz-btn{color:var(--ink-soft)}
.hz-btn:hover{border-color:var(--agua);color:var(--agua-ink)}
.rv-date.has-hz{flex-wrap:wrap;row-gap:1px}
.hz-btn.hz-inline{padding:1px 7px;font-size:10.5px;font-weight:700;white-space:nowrap;color:var(--agua-ink);border:1px solid var(--agua);border-radius:var(--r-pill);background:var(--panel)}
.hz-btn.hz-inline:hover{background:var(--agua);color:#fff}
.later-head{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;padding:10px var(--space-5);border-top:1px dashed var(--line);background:var(--panel-2)}
.later-head .linkbtn{font-size:var(--text-sm);font-weight:600;color:var(--ink-soft);padding:4px 10px}
.later-rows{background:var(--panel-2)}
.later-rows .row-view{opacity:.82}
.hz-why{font-size:var(--text-xs);color:var(--ink-dim)}
.comp-next{display:inline-flex;align-items:center;padding:3px 9px;font-size:var(--text-sm);font-weight:600;font-family:var(--sans);color:#1d6b43;background:#e9f6ef;border:1px solid #bfe3cf;border-radius:var(--r-pill)}
.hz-next{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;margin:var(--space-3) var(--space-5) 0;padding:10px 14px;border:1px solid #bfe3cf;background:#f3fbf6;border-radius:var(--r-sm);font-size:var(--text-sm);color:var(--ink)}
.hz-next.hz-crit{border-color:#F4C5B0;background:#FDF3EE}
.comp-next.comp-crit{color:#B4491F;background:#FDEEE7;border-color:#F4C5B0}
.hz-next-actions{display:flex;align-items:center;gap:var(--space-2)}
.btn.hz-small{padding:6px 12px;font-size:12.5px}
.hz-stagger{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;margin:var(--space-3) var(--space-5) 0;padding:10px 14px;border:1px dashed #CBD6E2;background:var(--panel);border-radius:var(--r-sm);font-size:var(--text-sm);color:var(--ink-soft)}
.hz-stagger-list{margin:6px var(--space-5) 0;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel);overflow:hidden}
.hz-stagger-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;gap:var(--space-3);align-items:center;padding:7px 12px;border-top:1px solid var(--line);font-size:var(--text-sm)}
.hz-stagger-row:first-child{border-top:none}
.hz-stagger-row .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hz-dates{font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-dim);white-space:nowrap}
.hz-dates.is-new{color:var(--ink);font-weight:600}
.hz-arrow{color:var(--ink-dim)}
.hz-stagger-actions{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;padding:10px 12px;border-top:1px solid var(--line);background:var(--panel-2)}
@media (max-width:720px){.hz-stagger-row{grid-template-columns:1fr}.hz-arrow{display:none}}
/* Grupo de hallazgos de visita de un aspecto sin tarea propia (Schedule::groupVisitFindings) */
.grp-tag{display:inline-flex;align-items:center;flex:0 0 auto;padding:1px 7px;margin-right:6px;font-size:10.5px;font-weight:600;color:#1C5DAA;background:#E8F1FC;border:1px solid #C9DDF5;border-radius:var(--r-pill);white-space:nowrap}

/* ---------- Pipeline de proyectos, fase 1: tablero de Operación (public/js/pipeline.js) ---------- */
.pl-tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:var(--space-4);flex-wrap:wrap}
.pl-tab{background:none;border:none;padding:10px 16px;font:600 14px var(--sans);color:var(--ink-soft);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}
.pl-tab[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--agua)}
.pl-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-4);flex-wrap:wrap;margin-bottom:var(--space-4)}
.pl-kpis{display:grid;grid-template-columns:repeat(4,minmax(150px,1fr));gap:12px;flex:1;min-width:0}
@media(max-width:860px){.pl-kpis{grid-template-columns:1fr 1fr}}
.pl-kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 16px;box-shadow:var(--shadow-sm)}
.pl-k-lab{font-family:var(--mono);font-size:var(--text-2xs);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-dim)}
.pl-k-val{font-family:var(--disp);font-weight:800;font-size:22px;margin-top:2px}
.pl-k-hint{font-size:var(--text-xs);color:var(--ink-soft)}
.pl-warn{color:var(--falla);font-weight:600}
.pl-notice{margin:0 0 var(--space-3);padding:10px 14px;border:1px solid #F5DE9E;background:#FFF9E8;border-radius:var(--r-sm);font-size:var(--text-sm);color:#8A6106}
/* Resumen por empresa (paso 5, solo operadores de Riokrisol) */
.pl-companies{margin-bottom:var(--space-5)}
.pl-co-title{margin:0 0 var(--space-3)}
.pl-co-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;margin-top:12px}
.pl-co-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 16px;box-shadow:var(--shadow-sm)}
.pl-co-head{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;margin-bottom:8px}
.pl-co-enter{padding:4px 12px;font-size:var(--text-xs)}
.pl-co-proj{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;font-size:var(--text-xs);padding:6px 0;border-top:1px solid var(--line)}
.pl-co-stage{color:var(--ink-dim)}
.pl-board-scroll{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r);background:var(--panel);box-shadow:var(--shadow-sm)}
.pl-board{display:grid;min-width:max-content}
.pl-col-head{position:sticky;top:0;z-index:2;background:var(--panel-2);border-bottom:1px solid var(--line);padding:10px 12px;font-family:var(--mono);font-size:var(--text-2xs);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft);display:flex;justify-content:space-between;gap:8px}
.pl-col-head.is-won{color:var(--ok)} .pl-col-head.is-lost{color:var(--ink-dim)}
.pl-n{color:var(--ink-dim)}
.pl-corner{position:sticky;left:0;z-index:3}
.pl-lane-head{position:sticky;left:0;z-index:1;display:block;width:100%;text-align:left;font:inherit;color:inherit;background:var(--panel);border:none;border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:12px;cursor:pointer}
.pl-lane-head:hover{background:var(--panel-2)}
.pl-lane-head.is-none{cursor:default;background:#FFFBF0}
.pl-lane-code{font-family:var(--mono);font-weight:600;font-size:13px}
.pl-lane-holder{font-size:var(--text-sm);font-weight:600;margin-top:2px}
.pl-lane-meta{font-size:var(--text-xs);color:var(--ink-dim);margin-top:2px}
.pl-lane-stats{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.pl-cell{border-bottom:1px solid var(--line);border-right:1px solid var(--line);padding:8px;min-height:96px;display:flex;flex-direction:column;gap:8px;transition:background .12s}
.pl-cell.is-won{background:#F3FBF3} .pl-cell.is-lost{background:#FAFBFC}
.pl-cell.is-over{background:#FFF1EC;outline:2px dashed var(--agua);outline-offset:-4px}
.pl-cell.is-blocked{background:repeating-linear-gradient(45deg,transparent 0 6px,rgba(124,152,182,.08) 6px 12px)}
.pl-card{background:#fff;border:1px solid var(--line);border-left:3px solid var(--c-emp);border-radius:var(--r-sm);padding:10px;box-shadow:var(--shadow-sm);font-size:var(--text-sm);cursor:pointer}
.pl-card[draggable="true"]{cursor:grab}
.pl-card:hover,.pl-card:focus-visible{box-shadow:var(--shadow-md);border-color:#CBD6E2;outline:none}
.pl-card.is-dragging{opacity:.4}
.pl-card-top{display:flex;justify-content:space-between;align-items:center;gap:6px}
.pl-tag{font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;padding:2px 6px;border-radius:var(--r-pill);font-weight:600;background:#F7EDF6;color:#8B4C82}
.pl-tag.is-direct{background:#EEF2F6;color:var(--ink-soft)}
.pl-card-name{font-weight:600;margin-top:6px;line-height:1.3}
.pl-card-sub{color:var(--ink-soft);font-size:var(--text-xs);margin-top:3px}
.pl-card-link{display:inline-block;margin-top:8px;font-size:var(--text-xs);font-weight:600;color:var(--azul);text-decoration:none}
.pl-bar{height:6px;border-radius:3px;background:var(--panel-2);border:1px solid var(--line);overflow:hidden;margin-top:4px}
.pl-bar i{display:block;height:100%;background:var(--azul)}
.pl-chip{font-size:var(--text-2xs);font-weight:600;padding:2px 7px;border-radius:var(--r-pill);border:1px solid var(--line);background:var(--panel-2);color:var(--ink-dim);white-space:nowrap}
.pl-r-crit{background:#FBE9E9;color:#A12727;border-color:#F2C4C4}
.pl-r-high{background:#FDEEE6;color:#A4502B;border-color:#F6CDB8}
.pl-r-med{background:#FFF6E0;color:#8A6106;border-color:#F5DE9E}
.pl-r-low{background:#E7F6E7;color:#0A7A0A;border-color:#BFE5BF}
.pl-legend{font-size:var(--text-xs);color:var(--ink-soft);margin-top:var(--space-3)}
.pl-scrim{position:fixed;inset:0;background:rgba(33,51,67,.35);z-index:40;opacity:0;pointer-events:none;transition:.2s}
.pl-panel{position:fixed;top:0;right:0;bottom:0;width:min(460px,100vw);background:var(--panel);z-index:41;box-shadow:var(--shadow-lg);transform:translateX(100%);transition:.25s;display:flex;flex-direction:column}
.is-on > .pl-scrim{opacity:1;pointer-events:auto}
.is-on > .pl-panel{transform:none}
.pl-p-head{padding:18px 20px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.pl-p-title{font-size:var(--text-lg);margin:0}
.pl-p-sub{font-size:var(--text-xs);color:var(--ink-dim);margin-top:2px}
.pl-p-close{background:none;border:none;font-size:22px;line-height:1;color:var(--ink-dim);cursor:pointer}
.pl-p-body{padding:18px 20px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:12px}
.pl-p-foot{padding:14px 20px;border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap}
.pl-f{display:flex;flex-direction:column;gap:4px;margin:0}
.pl-f > span{font-size:var(--text-xs);font-weight:600;color:var(--ink-soft)}
.pl-f em{font-style:normal;font-weight:400;color:var(--ink-dim)}
.pl-f input,.pl-f select,.pl-f textarea{font:14px var(--sans);padding:8px 10px;border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink);background:#fff;width:100%}
.pl-f textarea{min-height:64px;resize:vertical}
.pl-f input:disabled,.pl-f select:disabled,.pl-f textarea:disabled{background:var(--panel-2);color:var(--ink-soft)}
.pl-row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
@media(max-width:520px){.pl-row2{grid-template-columns:1fr}}
.pl-check{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink)}
.pl-note{margin:0;font-size:var(--text-xs);color:var(--ink-soft);background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;line-height:1.5}
.pl-list{margin:0;padding-left:18px;font-size:13px;color:var(--ink-soft)}
.pl-actions{display:flex;gap:8px;flex-wrap:wrap}
.pl-confirm{display:none;border:1px solid #F2C4C4;background:#FDF5F5;border-radius:var(--r-sm);padding:10px;font-size:13px}
.pl-confirm.is-on{display:block}
.pl-confirm .pl-actions{margin-top:8px}
.btn.pl-danger{background:#fff;color:var(--falla);border:1px solid #F2C4C4;box-shadow:none}
.btn.pl-danger:hover{background:#FDF5F5;filter:none}
.pl-tbc{font-style:normal;color:#8A6106;background:#FFF6E0;border-radius:var(--r-pill);padding:0 6px}
/* Pipeline, fase 2: tablero Comercial */
.pl-col-sum{display:block;font-family:var(--sans);text-transform:none;letter-spacing:0;font-size:var(--text-xs);color:var(--ink-dim);margin-top:2px}
.pl-lane-add{margin-top:8px;font-size:var(--text-xs);color:var(--azul);background:none;border:none;cursor:pointer;padding:0;font-weight:600}
.pl-lane-add:hover{text-decoration:underline}
.pl-card.is-title{border-left-color:var(--azul)}
.pl-card.is-sub{border-left-color:var(--c-emp)}
.pl-tag.is-title{background:#E8F1FC;color:#1C5DAA}
.pl-prob{font-family:var(--mono);font-size:var(--text-xs);color:var(--ink-soft)}
.pl-card-val{font-family:var(--mono);font-weight:600;margin-top:6px}
.pl-card-val small{font-family:var(--sans);font-weight:400;color:var(--ink-dim);margin-left:6px}
.pl-card-foot{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;font-size:var(--text-xs);color:var(--ink-dim)}
.pl-avatar{width:22px;height:22px;border-radius:50%;background:var(--sidebar-bg-2);color:#fff;font:600 9.5px var(--mono);display:inline-flex;align-items:center;justify-content:center;flex:0 0 22px}
.pl-seg{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.pl-seg label{text-align:center;padding:9px;font-size:13px;font-weight:600;cursor:pointer;color:var(--ink-soft)}
.pl-seg input{position:absolute;opacity:0;pointer-events:none}
.pl-seg label:has(input:checked){background:var(--ink);color:#fff}
.pl-checks{display:flex;flex-wrap:wrap;gap:6px}
.pl-checks label{display:flex;align-items:center;gap:6px;font-size:13px;border:1px solid var(--line);border-radius:var(--r-pill);padding:5px 10px;cursor:pointer;color:var(--ink)}
.pl-dot{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:5px;vertical-align:-1px}
.pl-dot.is-title{background:var(--azul)} .pl-dot.is-sub{background:var(--c-emp)}
/* Pipeline, fase 3: Agenda (public/js/agenda.js). Valores del boceto aprobado (pestaña Agenda). */
/* .pl-f/.pl-check/.ag-box son flex: sin esto, [hidden] no oculta los campos que dependen del tipo de reunión. */
.ag-panel [hidden]{display:none!important}
#ag-anchor-com{display:flex;flex-direction:column;gap:12px}
.ag-grid{display:grid;grid-template-columns:minmax(0,1fr) 330px;gap:16px;align-items:start}
@media(max-width:1040px){.ag-grid{grid-template-columns:1fr}}
.ag-tools{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.ag-week-nav{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ag-week-nav b{font-family:var(--disp);font-size:15px;min-width:150px;text-align:center}
.ag-icon-btn{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-sm);width:32px;height:32px;cursor:pointer;color:var(--ink);font-size:15px}
.btn.ag-sm{padding:6px 12px;font-size:12.5px}
.ag-chips{display:flex;gap:6px;flex-wrap:wrap}
.ag-chip{border:1px solid var(--line);background:var(--panel);border-radius:var(--r-pill);padding:5px 12px;font:600 12.5px var(--sans);color:var(--ink-soft);cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.ag-chip[aria-pressed="true"]{background:var(--ink);color:#fff;border-color:var(--ink)}
.ag-dot{width:8px;height:8px;border-radius:50%;display:inline-block;background:var(--azul)}
.ag-dot.is-ops{background:var(--c-emp)}
.ag-week{display:grid;grid-template-columns:repeat(var(--cols,5),minmax(0,1fr));border:1px solid var(--line);border-radius:var(--r);background:var(--panel);overflow:hidden;box-shadow:var(--shadow-sm)}
@media(max-width:760px){.ag-week{grid-template-columns:1fr}}
.ag-day{border-right:1px solid var(--line);min-height:300px;display:flex;flex-direction:column;min-width:0}
.ag-day:last-child{border-right:none}
@media(max-width:760px){.ag-day{border-right:none;border-bottom:1px solid var(--line);min-height:0}}
.ag-day-h{padding:8px 10px;border-bottom:1px solid var(--line);background:var(--panel-2);font-family:var(--mono);font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);display:flex;justify-content:space-between}
.ag-day.is-today .ag-day-h{color:var(--agua-ink);font-weight:600;box-shadow:inset 0 -2px 0 var(--agua)}
.ag-day-b{padding:8px;display:flex;flex-direction:column;gap:6px}
.ag-day-empty{font-size:var(--text-xs);color:var(--ink-dim);text-align:center;padding:12px 0;opacity:.7}
.ag-ev{border:1px solid var(--line);border-left:3px solid var(--azul);border-radius:var(--r-sm);padding:7px 8px;font-size:var(--text-xs);cursor:pointer;background:var(--panel);text-align:left;width:100%;font-family:var(--sans);color:var(--ink)}
.ag-ev:hover,.ag-ev:focus-visible{box-shadow:var(--shadow-md);outline:none}
.ag-ev.is-ops{border-left-color:var(--c-emp)}
.ag-note{display:block;width:100%;text-align:left;background:none;border:0;padding:2px;font-family:var(--sans);font-size:var(--text-xs);color:var(--azul);text-decoration:underline;text-underline-offset:2px;cursor:pointer;line-height:1.35}
.ag-note:hover,.ag-note:focus-visible{color:var(--ink);outline:none}
.ag-note.is-late{color:var(--falla)}
.ag-ev-na{margin-top:4px;color:var(--azul);text-decoration:underline;text-underline-offset:2px}
.ag-ev-t{font-family:var(--mono);color:var(--ink-dim);display:flex;justify-content:space-between;gap:4px}
.ag-ev-n{font-weight:600;line-height:1.3;margin-top:2px}
.ag-ev-m{color:var(--ink-soft);margin-top:2px}
.ag-flag{font-family:var(--mono);font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}
.ag-flag.is-ok{color:var(--ok)} .ag-flag.is-pend{color:#B07A06} .ag-flag.is-late{color:var(--falla)}
.ag-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px;margin-bottom:12px;box-shadow:var(--shadow-sm)}
.ag-card h4{font-family:var(--mono);font-size:var(--text-2xs);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-dim);margin:0 0 6px;font-weight:600}
.ag-todo{display:flex;justify-content:space-between;gap:8px;align-items:flex-start;padding:8px 0;border-top:1px solid var(--line);font-size:var(--text-sm)}
.ag-todo:first-of-type{border-top:none}
.ag-todo small{display:block;color:var(--ink-dim);font-size:var(--text-xs)}
.ag-sub{font-family:var(--mono);font-size:var(--text-2xs);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-dim);margin:14px 0 2px;padding-top:10px;border-top:1px solid var(--line);font-weight:600}
.ag-sub + .ag-todo{border-top:none}
.ag-link{color:var(--azul);font-weight:600;cursor:pointer;background:none;border:none;padding:0;font-size:var(--text-xs);white-space:nowrap;text-decoration:none;align-self:flex-start}
.ag-link:hover{text-decoration:underline}
.ag-empty{font-size:var(--text-xs);color:var(--ink-dim)}
.ag-where{margin:0;padding:0}
.ag-where li{font-size:var(--text-sm);color:var(--ink-soft);margin:0 0 6px 16px;line-height:1.45}
.ag-where b{color:var(--ink)}
.ag-atts{margin:0;padding-left:18px;font-size:13px}
.ag-atts small{color:var(--ink-dim)}
.ag-mono{font-family:var(--mono);font-size:var(--text-xs);color:var(--azul);word-break:break-all}
.ag-box{border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 12px;background:var(--panel-2);font-size:13px;display:flex;flex-direction:column;gap:8px}
.ag-box h5{font:600 12px var(--sans);color:var(--ink);margin:4px 0 0}
.ag-box ul{margin:0 0 0 16px;color:var(--ink-soft)}
.ag-box small{color:var(--ink-dim)}
.ag-p{margin:0;color:var(--ink-soft)}
.ag-hint{margin:0;font-size:var(--text-xs);color:var(--ink-dim)}
.ag-drop{border:1.5px dashed #CBD6E2;border-radius:var(--r-sm);padding:14px;text-align:center;background:var(--panel);font-size:13px;color:var(--ink-soft)}
.ag-drop small{display:block;margin-top:4px}
.ag-inline{display:flex;gap:6px}
.ag-inline input{flex:1;min-width:0}
.ag-paste summary{cursor:pointer;font-size:var(--text-xs);font-weight:600;color:var(--ink-soft)}
.ag-paste textarea{width:100%;margin:6px 0;font:13px var(--sans);padding:8px 10px;border:1px solid var(--line);border-radius:var(--r-sm)}
.ag-acta{width:100%;min-height:340px;margin:6px 0;font:13px/1.5 var(--mono);padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel);color:var(--ink);resize:vertical}
.ag-acta:focus{outline:2px solid var(--azul);outline-offset:-1px}
.ag-paste{margin-top:10px}
.ag-inline{align-items:center;flex-wrap:wrap}
.ag-ask{display:flex;gap:8px;margin:0 0 14px}
.ag-ask input{flex:1;min-width:0;font:13px var(--sans);padding:8px 12px;border:1px solid var(--line);border-radius:var(--r-sm)}
.ag-commits li{margin-bottom:6px}
.ag-plan-form{margin:8px 0 4px;padding:10px;border:1px solid var(--line);border-radius:var(--r-sm);display:flex;flex-direction:column;gap:8px}
@media (max-width:640px){.ag-ask{flex-direction:column}}
.ag-prop{display:flex;justify-content:space-between;gap:8px;align-items:center;border:1px solid var(--line);border-left:3px solid var(--agua);border-radius:var(--r-sm);padding:8px 10px;background:var(--panel)}
.ag-prop small{display:block;color:var(--ink-dim);font-size:var(--text-xs);margin-top:2px}
.ag-prop.is-done{opacity:.55;border-left-color:var(--ok)}

/* Etiqueta del hito coloreada por prioridad (2026-10-09): crítica / alta / media / normal, las mismas del motor.
   Las barritas repiten el nivel para quien no distingue colores. La identidad del componente va en el
   encabezado de su grupo (.comp-dot), no en cada fila. */
.hito-tag.pr-critical{background:#FDECEC;color:var(--falla);border-color:#F5B5B5;font-weight:700}
.hito-tag.pr-high{background:#FDEEE7;color:#B4491F;border-color:#F4C5B0;font-weight:700}
.hito-tag.pr-medium{background:#FFF6E0;color:#92610A;border-color:#F0DDA8}
.hito-tag.pr-low{background:var(--panel-2);color:var(--ink-dim);border-color:var(--line)}
.hito-tag .pr-bars{display:inline-flex;align-items:flex-end;gap:1px;height:9px;margin-right:5px;vertical-align:baseline}
.hito-tag .pr-bars i{display:block;width:2px;background:currentColor;opacity:.25;border-radius:1px}
.hito-tag .pr-bars i:nth-child(1){height:3px}.hito-tag .pr-bars i:nth-child(2){height:5px}
.hito-tag .pr-bars i:nth-child(3){height:7px}.hito-tag .pr-bars i:nth-child(4){height:9px}
.hito-tag .pr-bars i.on{opacity:1}
.pr-legend{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;margin:0 0 var(--space-3);font-size:var(--text-xs);color:var(--ink-dim)}
.pr-legend-t{margin-right:2px}

/* Inicio y días hábiles de cada tarea (2026-10-09). El inicio automático (por dependencia) lleva la marca "auto". */
.rv-start,.rv-dur{font-family:var(--mono);font-size:var(--text-sm);color:var(--ink-soft);white-space:nowrap}
.rv-dur{text-align:right}
.rv-start.is-auto{color:var(--azul)}
.auto-tag{margin-left:4px;font-family:var(--sans);font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--azul);background:#E7F0FB;border-radius:var(--r-pill);padding:0 5px}

/* Tiquetes de soporte (2026-10-28, boceto mockups/tiquetes/; public/js/tickets.js) */
.tkt-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:12px 0}
.tkt-kpi{border:1px solid var(--line);border-radius:var(--r);padding:12px;background:var(--panel);display:grid;gap:4px}
.tkt-kpi span{font-size:var(--text-sm);color:var(--ink-soft)}
.tkt-kpi b{font:700 24px/1 var(--disp);color:var(--ink)}
.tkt-kpi.bad b{color:var(--falla)}
.tkt-kpi.info b{color:var(--azul)}
.tkt-filters{display:flex;flex-wrap:wrap;gap:12px;margin:0 0 12px}
.tkt-filters label{font-size:var(--text-sm);font-weight:600;color:var(--ink-soft);display:inline-flex;gap:6px;align-items:center}
.tkt-filters select{font-size:var(--text-sm);border:1px solid var(--line);border-radius:var(--r-sm);padding:4px 8px;background:var(--panel);color:var(--ink)}
.tkt-item{border:1px solid var(--line);border-radius:var(--r);background:var(--panel);margin-bottom:8px}
.tkt-item.is-new{border-left:4px solid var(--falla)}
.tkt-item>summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:44px minmax(0,1fr) auto;gap:4px 12px;align-items:center;padding:12px}
.tkt-item>summary::-webkit-details-marker{display:none}
.tkt-item>summary:focus-visible{outline:2px solid var(--azul);outline-offset:-2px}
@media (max-width:640px){.tkt-item>summary{grid-template-columns:44px minmax(0,1fr)}.tkt-item>summary .tkt-badge{grid-column:2;justify-self:start}}
.tkt-kind{width:44px;height:36px;border-radius:8px;display:grid;place-items:center;font:700 11px/1 var(--disp)}
.tkt-kind.err{background:#FDECEC;color:var(--falla)}
.tkt-kind.imp{background:#E8F0FB;color:var(--azul)}
.tkt-main{display:grid;gap:2px;min-width:0}
.tkt-sum{font-size:var(--text-sm);color:var(--ink);overflow-wrap:anywhere}
.tkt-small{font-size:var(--text-xs)}
.tkt-badge{font:600 var(--text-xs)/1 var(--sans);padding:5px 10px;border-radius:var(--r-pill);white-space:nowrap}
.tkt-badge.bad{background:#FDECEC;color:#A12A2A}
.tkt-badge.warn{background:#FEF5E1;color:#8A5D00}
.tkt-badge.info{background:#E8F0FB;color:#1F5A96}
.tkt-badge.ok{background:#E7F5EA;color:#17773A}
.tkt-badge.none{background:#EEF1F4;color:var(--ink-soft)}
.tkt-body{border-top:1px solid var(--line);padding:12px;display:grid;gap:12px}
.tkt-ai{border:1px solid var(--line);border-left:4px solid var(--azul);border-radius:var(--r-sm);padding:12px;display:grid;gap:8px;background:var(--bed)}
.tkt-ai.pending{border-left-color:var(--line)}
.tkt-ai h4{margin:0;font:700 14px/1.3 var(--disp)}
.tkt-ai dl{margin:0;display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;font-size:var(--text-base)}
.tkt-ai dt{font-weight:600;color:var(--ink-soft)}
.tkt-ai dd{margin:0;overflow-wrap:anywhere}
@media (max-width:640px){.tkt-ai dl{grid-template-columns:minmax(0,1fr)}}
.tkt-thread{display:grid;gap:8px}
.tkt-said{font-size:var(--text-base);border-left:2px solid var(--line);padding-left:8px;display:grid;gap:2px;overflow-wrap:anywhere}
.tkt-said .who{font-size:var(--text-xs);font-weight:600;color:var(--ink-soft)}
.tkt-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.tkt-row textarea{flex:1 1 280px;min-height:56px;resize:vertical;font:400 var(--text-base) var(--sans);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px;color:var(--ink);background:var(--panel)}
.tkt-btn{padding:6px 12px;font-size:var(--text-sm)}
.tkt-accept{display:inline-flex;gap:8px;align-items:center;font-size:var(--text-sm);font-weight:600;cursor:pointer;padding:6px 12px;border:1px solid var(--ok);border-radius:var(--r-sm);color:#17773A;background:#E7F5EA}
.tkt-accept input{accent-color:var(--ok);width:18px;height:18px;margin:0}
.tkt-tech summary{cursor:pointer;font-size:var(--text-sm);color:var(--ink-soft);font-weight:600}
.tkt-tech pre{margin:6px 0;font:400 12px/1.5 var(--mono);background:var(--bed);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px;white-space:pre-wrap;overflow-wrap:anywhere}

/* Sugerir una mejora (public/js/suggest.js), en el menú de todas las consolas */
.sg-box{max-width:560px;max-height:calc(100vh - 40px);overflow:auto}
.sg-form{display:grid;gap:var(--space-2)}
.sg-form label{font-size:var(--text-xs);font-weight:600;color:var(--ink-soft);display:grid;gap:4px}
.sg-form input,.sg-form textarea{font:inherit;font-size:var(--text-sm);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px;color:var(--ink);background:var(--panel);width:100%;box-sizing:border-box}
.sg-form textarea{min-height:96px;resize:vertical}
.sg-small{font-size:var(--text-xs)}
.sg-error{color:#A12A2A;font-size:var(--text-sm);margin:0}
.sg-mine-h{margin:var(--space-4) 0 var(--space-2);font-size:var(--text-md)}
.sg-mine-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-2);align-items:center;padding:var(--space-2) 0;border-bottom:1px solid var(--line)}
.sg-mine-row:last-child{border-bottom:0}
.sg-mine-row b{display:block;font-size:var(--text-sm);overflow-wrap:anywhere}
.sg-mine-row .sub{display:block;font-size:var(--text-xs);overflow-wrap:anywhere}

/* Componentes sin movimiento en 15 días (decisión 78): pestaña Tiquetes y consola del project manager */
.tkt-kpi.warn b{color:var(--serio)}
.tkt-idle-h{margin:var(--space-5, 24px) 0 4px;font-size:var(--text-md)}
.tkt-idle{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-1) var(--space-3);align-items:center;padding:var(--space-2) 0;border-bottom:1px solid var(--line)}
.tkt-idle:last-child{border-bottom:0}
.tkt-idle b{overflow-wrap:anywhere}
.tkt-idle .sub{display:block}
.tkt-idle-n{text-align:right}
.tkt-idle-n b{font:700 22px/1 var(--disp);color:var(--serio);display:block}
