/* Muktiflow v2 — identidad de marca personal.
   Los colores tienen oficio asignado, no son decoración:
   el cian solo funciona sobre oscuro (8:1); sobre claro da 1.4:1 e es ilegible.
   Por eso los demos y el catálogo van oscuros y "sobre mí" va claro. */

:root{
  --ink-deep:#09133d; --ink:#0d326d; --cyan:#6edff9;
  --paper:#f2f2f2; --blush:#ffe9ee; --rose:#e89cb3; --rose-deep:#a13d5c;
  --text:var(--blush); --text-soft:rgba(255,233,238,.66); --text-faint:rgba(255,233,238,.40);
  --hairline:rgba(255,233,238,.16);
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{background:var(--ink-deep);color:var(--text);
  font-family:'Raleway',system-ui,sans-serif;line-height:1.6;
  -webkit-font-smoothing:antialiased;min-height:100vh;
  display:flex;flex-direction:column}
main{flex:1}
a{color:inherit}
.hidden{display:none}
/* `hidden` tiene que ganar siempre. El atributo lo apaga la hoja del navegador,
   que pierde contra CUALQUIER regla de autor: sin esto, un .chat-form{display:flex}
   deja visible un formulario marcado como oculto y el bug no se ve venir. */
[hidden]{display:none !important}
.wrap{max-width:1120px;margin:0 auto;padding:0 clamp(1.25rem,4vw,2.5rem);width:100%}

/* ---- cabeza de sección: el único recurso estructural del sitio ----
   Dos columnas: a la izquierda qué es esto, a la derecha la aclaración.
   Se repite en el home, en el índice de demos y en "a la medida", y por eso
   la página deja de leerse como una tira pegada al margen izquierdo. */
.band-head{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,32ch);
  gap:.6rem clamp(1.5rem,5vw,4rem);align-items:end;
  padding-bottom:clamp(1.2rem,2.6vw,1.8rem);border-bottom:1px solid var(--hairline)}
.band-head .eyebrow{grid-column:1;align-self:start}
.band-head h1,.band-head h2{grid-column:1;margin-top:.7rem}
.band-head .lede{grid-column:2;grid-row:1/span 2;margin-top:0;max-width:none;
  align-self:end;padding-bottom:.4rem}
@media (max-width:760px){
  .band-head{grid-template-columns:1fr}
  .band-head .lede{grid-column:1;grid-row:auto;margin-top:1rem;padding-bottom:0}
}

/* barra */
.bar{border-bottom:1px solid var(--hairline)}
.bar-in{display:flex;align-items:center;justify-content:space-between;gap:1rem;height:60px}
.mark{font-family:'Lora',Georgia,serif;font-size:1.2rem;text-decoration:none;letter-spacing:-.015em}
.bar-right{display:flex;align-items:center;gap:1rem}
.chip{font-size:.62rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--cyan);border:1px solid rgba(110,223,249,.35);padding:.28rem .6rem;white-space:nowrap}
.lang{font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--text-faint);text-decoration:none}
.lang:hover{color:var(--cyan)}

/* tipos */
.eyebrow{font-size:.68rem;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:var(--cyan)}
.claim{font-family:'Lora',Georgia,serif;font-weight:500;
  font-size:clamp(1.9rem,4.2vw,3rem);line-height:1.08;letter-spacing:-.02em;margin-top:.9rem}
.lede{margin-top:1rem;color:var(--text-soft);max-width:46ch}

.stage{padding:clamp(1.6rem,4vw,3rem) 0 4rem;position:relative}

/* permiso — el producto se ve por detrás */
.veil{position:fixed;inset:0;z-index:60;background:rgba(9,19,61,.72);
  display:flex;align-items:flex-end;justify-content:center;padding:1.2rem}
.consent{background:var(--ink);border:1px solid var(--hairline);max-width:560px;width:100%;
  padding:clamp(1.4rem,3vw,2rem)}
.consent h2{font-family:'Lora',Georgia,serif;font-weight:500;font-size:1.22rem;letter-spacing:-.01em}
.consent p{margin-top:.6rem;font-size:.9rem;color:var(--text-soft)}
.consent label{display:flex;gap:.6rem;align-items:flex-start;margin-top:1.1rem;font-size:.86rem;cursor:pointer}
.consent input[type=checkbox]{margin-top:.28rem;accent-color:var(--cyan);width:16px;height:16px;flex:none}

/* botones */
.btn{display:inline-block;margin-top:1.2rem;background:var(--cyan);color:var(--ink-deep);border:0;
  font-family:'Raleway',sans-serif;font-weight:700;font-size:.92rem;padding:.85rem 1.6rem;
  cursor:pointer;text-decoration:none;transition:opacity .18s ease}
.consent .btn{width:100%}
.btn:disabled{opacity:.34;cursor:not-allowed}
.btn:not(:disabled):hover{opacity:.88}
.btn-ghost{background:transparent;color:var(--text);border:1px solid var(--hairline)}
.btn-ghost:hover{border-color:var(--cyan);opacity:1}

/* preguntas y formularios */
.ask h2,.close-card h2{font-family:'Lora',Georgia,serif;font-weight:500;font-size:1.5rem;letter-spacing:-.015em}
.field{margin-top:1rem}
.field label{display:block;font-size:.78rem;color:var(--text-soft);margin-bottom:.3rem}
.field input,.field select,.field textarea{width:100%;background:transparent;border:0;border-bottom:1px solid var(--hairline);
  color:var(--text);font-family:'Raleway',sans-serif;font-size:.95rem;padding:.5rem 0}
.field input:focus,.field select:focus,.field textarea:focus{outline:0;border-bottom-color:var(--cyan)}
.field select option{background:var(--ink);color:var(--text)}
.field textarea{resize:vertical;min-height:3.4em;line-height:1.5}
.field-help{margin:.4rem 0 0;font-size:.76rem;color:var(--text-faint)}
.check{display:flex;gap:.6rem;align-items:flex-start;margin-top:1.2rem;font-size:.86rem;cursor:pointer}
.check input{margin-top:.28rem;accent-color:var(--cyan);width:16px;height:16px;flex:none}
.row2{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.9rem}
.legal{margin-top:1rem;font-size:.76rem;color:var(--text-faint)}
.legal a{color:var(--cyan)}
.actions{display:flex;flex-wrap:wrap;gap:.8rem;margin-top:1.5rem;align-items:center}
.actions .btn{margin-top:0}

/* pantalla del producto */
.head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.8rem}
.head h1{font-family:'Lora',Georgia,serif;font-weight:500;font-size:clamp(1.5rem,3vw,2.1rem);letter-spacing:-.02em}
.head .lvl{font-size:.68rem;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--rose)}
.hud{display:flex;flex-wrap:wrap;gap:.9rem;margin-top:1.5rem}
.stat{flex:1 1 140px;border:1px solid var(--hairline);padding:.75rem .95rem}
.stat dt{font-size:.62rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint)}
.stat dd{font-family:'Lora',Georgia,serif;font-size:1.55rem;line-height:1.15;margin-top:.15rem}
.stat.target dd{color:var(--cyan)}
.stat.time dd.low{color:var(--rose)}

.grid{display:grid;gap:.5rem;margin-top:1.6rem;max-width:460px}

/* El tablero es un objeto, no un texto: se centra con su marcador y su pista
   en vez de quedarse pegado al margen mientras sobra media pantalla. */
.prod[data-slug="sum-matrix"] .hud,
.prod[data-slug="sum-matrix"] .grid,
.prod[data-slug="sum-matrix"] .hint{max-width:460px;margin-inline:auto}
.prod[data-slug="sum-matrix"] .hint{text-align:center}
.cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;
  background:var(--ink);border:1px solid var(--hairline);color:var(--text);
  font-family:'Lora',Georgia,serif;font-size:clamp(.95rem,2.6vw,1.25rem);cursor:pointer;
  font-variant-numeric:tabular-nums;
  transition:background .14s ease,border-color .14s ease,transform .14s ease}
.cell:hover{border-color:rgba(110,223,249,.5)}
.cell.sel{background:var(--cyan);color:var(--ink-deep);border-color:var(--cyan)}
.cell.hit{background:var(--rose-deep);border-color:var(--rose);color:var(--blush)}
.cell.miss{animation:shake .32s ease}
@keyframes shake{25%{transform:translateX(-4px)}75%{transform:translateX(4px)}}
.hint{margin-top:1.1rem;font-size:.88rem;color:var(--text-soft);min-height:1.5em}
.hint b{color:var(--cyan);font-weight:600}

/* cierre */
.close-card{border:1px solid var(--hairline);padding:clamp(1.4rem,3.5vw,2.2rem)}
.result{display:flex;flex-wrap:wrap;gap:1.6rem;margin-top:1rem}
.result dt{font-size:.62rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint)}
.result dd{font-family:'Lora',Georgia,serif;font-size:2rem;color:var(--cyan);line-height:1.1}
.scope{margin-top:1.4rem;padding-left:1rem;border-left:2px solid var(--rose);
  color:var(--text-soft);font-size:.94rem}
.scope b{color:var(--text);font-weight:600}

/* informe del ensayo: dos cajas, lo que sostuvo y lo que se le fue */
.informe{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:1rem;margin-top:1.4rem}
.informe-caja{border:1px solid var(--hairline);border-top-width:2px;
  background:var(--ink);padding:1rem 1.1rem}
.informe-caja.bien{border-top-color:var(--cyan)}
.informe-caja.mal{border-top-color:var(--rose)}
.informe-caja ul{list-style:none;margin-top:.6rem;display:grid;gap:.5rem}
.informe-caja li{font-size:.9rem;color:var(--text-soft);padding-left:.9rem;position:relative}
.informe-caja li::before{content:"·";position:absolute;left:0;color:var(--text-faint)}
.informe-vacio{margin-top:.6rem;font-size:.9rem;color:var(--text-faint)}
.informe-nota{margin-top:.7rem;font-size:.78rem;color:var(--text-faint)}

/* checklist de la revisión documental */
.checklist{list-style:none;margin-top:.7rem;display:grid;gap:.55rem}
.checklist .check{margin-top:0;font-size:.86rem;color:var(--text-soft)}

/* los dos objetivos, enfrentados */
.metas{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:.9rem;margin-top:.9rem}
.meta{padding:.7rem .9rem;font-size:.88rem;color:var(--text-soft)}
.meta.mia{border-left:2px solid var(--cyan)}
.meta.suya{border-left:2px solid var(--rose)}
.meta-t{font-size:.62rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--text-faint);margin-bottom:.3rem}

/* el trasfondo de la escena, arriba del chat */
.briefing-ctx{margin-top:.9rem;padding-top:.8rem;border-top:1px solid var(--hairline);
  font-size:.88rem;color:var(--text-soft);white-space:pre-line}

/* Aviso de IA en la pantalla de preguntas. Misma barra rosa que el alcance del
   cierre: son la misma clase de texto (esto es simulado, esto es lo real). */
.ai-note{margin-top:1rem;padding-left:1rem;border-left:2px solid var(--rose);
  color:var(--text-soft);font-size:.86rem;max-width:62ch}
.ai-note b{color:var(--text);font-weight:600}

/* La petición del correo es su propia tarjeta, no el pie de la anterior.
   Fondo --ink (el azul claro de las burbujas del chat) + 2.5rem de aire: dos
   señales, porque una sola línea divisoria al 16% no separa nada a simple
   vista y el resultado terminaba leyéndose como encabezado del formulario. */
.lead-card{margin-top:2.5rem;background:var(--ink);
  border:1px solid var(--hairline);padding:clamp(1.4rem,3.5vw,2.2rem)}
.lead-card h2{font-family:'Lora',Georgia,serif;font-weight:500;font-size:1.5rem;
  letter-spacing:-.015em}
.thanks{margin-top:1.2rem;padding:1rem;border:1px solid rgba(110,223,249,.35);font-size:.9rem}
.thanks.error{border-color:var(--rose)}
.thanks a{color:var(--cyan);margin-left:.4rem}

/* ---- "cuéntame qué te quita tiempo" (home · a la medida) ----
   El botón ES el <summary>: display inline-block le quita el triangulito en
   los tres motores, así que se ve botón y se comporta como botón. */
/* Sin margen propio: el que separa es el del <summary>, que ya lo pone
   `.medida .btn` — el mismo que tenía el enlace que había antes, así que el
   botón queda exactamente donde estaba. */
.cuentame>summary{list-style:none;cursor:pointer}
.cuentame>summary::-webkit-details-marker{display:none}
.cuentame>summary::marker{content:''}
.cuentame[open]>summary{opacity:.55}
.cuentame-in{margin-top:1.6rem;background:var(--ink);border:1px solid var(--hairline);
  padding:clamp(1.4rem,3.5vw,2.2rem);max-width:760px}
.cuentame-intro{font-size:.92rem;color:var(--text-soft);max-width:60ch}

/* índice de demos */
.demo-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.1rem;margin-top:2.2rem}
.demo{border:1px solid var(--hairline);padding:1.3rem;text-decoration:none;
  transition:border-color .2s ease,background .2s ease}
.demo:hover,.demo:focus-visible{border-color:var(--cyan);background:rgba(110,223,249,.05)}
.demo strong{display:block;font-family:'Lora',Georgia,serif;font-weight:500;font-size:1.02rem}
.demo span{display:block;margin-top:.3rem;font-size:.83rem;color:var(--text-soft)}
/* El precio. Un producto lo tiene a la vista; una consultoría manda a
   preguntar. Va pegado al pie de la tarjeta para que todas las cifras queden
   alineadas aunque las descripciones midan distinto. */
.demo{display:flex;flex-direction:column}
.demo span.precio{margin-top:auto;padding-top:.9rem;font-family:'Lora',Georgia,serif;
  font-size:.95rem;color:var(--text);font-variant-numeric:tabular-nums}
/* El asterisco en cian: se ve que remite a algo, no parece una errata.
   Pequeño de verdad — a .7em competía con la cifra y el precio se leía
   "US$100 estrella" en vez de "US$100". */
.demo span.precio sup{color:var(--cyan);font-size:.46em;margin-left:.12em;
  vertical-align:super;line-height:0;opacity:.85}
.demo em{display:block;margin-top:.75rem;font-style:normal;font-size:.7rem;
  letter-spacing:.14em;text-transform:uppercase;color:var(--cyan)}

/* La nota del precio. Ancho de lectura y no de rejilla: es un párrafo que se
   lee, no una fila más de la tabla de productos. */
.precio-nota{margin-top:1.6rem;padding-left:1rem;border-left:2px solid var(--cyan);
  max-width:72ch;font-size:.86rem;color:var(--text-soft)}
.precio-nota b{color:var(--text);font-weight:600}

/* pie */
.foot{border-top:1px solid var(--hairline);padding:1.6rem 0 2.4rem;font-size:.78rem;color:var(--text-faint)}
.foot .wrap{display:flex;flex-wrap:wrap;gap:.8rem 2rem;justify-content:space-between}
.foot a{color:var(--text-soft);text-decoration:none}
.foot a:hover{color:var(--cyan)}

@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}

/* ---- cotizador ---- */
.quoter{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
  gap:clamp(1.2rem,3vw,2.2rem);margin-top:1.6rem}
.col-title{font-size:.62rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--text-faint);margin-bottom:.7rem}
.quoter-right .col-title,.quote .col-title{margin-top:1.4rem}
.cat-list{display:flex;flex-direction:column;gap:.55rem}
.cat-item{display:flex;justify-content:space-between;align-items:baseline;gap:.8rem;
  background:transparent;border:1px solid var(--hairline);color:var(--text);
  font-family:'Raleway',sans-serif;font-size:.88rem;padding:.75rem .9rem;cursor:pointer;
  text-align:left;transition:border-color .16s ease,background .16s ease}
.cat-item:hover{border-color:var(--cyan);background:rgba(110,223,249,.06)}
.cat-item em{font-style:normal;color:var(--text-faint);font-size:.8rem;white-space:nowrap}
.q-items{margin-top:1rem;border-top:1px solid var(--hairline)}
.q-row{display:grid;grid-template-columns:1fr auto auto;gap:.5rem 1rem;align-items:baseline;
  padding:.7rem 0;border-bottom:1px solid var(--hairline);font-size:.88rem}
.q-row span:first-child{grid-column:1/-1}
.q-qty{color:var(--text-faint);font-size:.8rem}
.q-row b{font-variant-numeric:tabular-nums}
.q-del{background:transparent;border:0;color:var(--text-faint);cursor:pointer;
  font-size:1.1rem;line-height:1;padding:0 .2rem}
.q-del:hover{color:var(--rose)}
.empty{color:var(--text-faint);font-size:.86rem;padding:.9rem 0}
.q-desc{max-width:160px}
.q-sub,.q-total{display:flex;justify-content:space-between;align-items:baseline;
  margin-top:.8rem;font-variant-numeric:tabular-nums}
.q-sub{font-size:.82rem;color:var(--text-faint)}
.q-total b{font-family:'Lora',Georgia,serif;font-size:1.6rem;color:var(--cyan)}
.quote{border:1px solid var(--hairline);padding:clamp(1.3rem,3vw,2rem);margin-bottom:1.6rem}
.quote h2{font-family:'Lora',Georgia,serif;font-weight:500;font-size:1.4rem;letter-spacing:-.015em}
.quote-to{color:var(--text-soft);font-size:.9rem;margin-top:.2rem}
.quote-cal{list-style:none;counter-reset:c;margin-top:.3rem}
.quote-cal li{counter-increment:c;position:relative;padding:.5rem 0 .5rem 2rem;
  font-size:.88rem;border-bottom:1px solid var(--hairline)}
.quote-cal li::before{content:counter(c);position:absolute;left:0;top:.5rem;
  font-family:'Lora',Georgia,serif;font-size:.8rem;color:var(--cyan)}
.quote-note{margin-top:1rem;font-size:.82rem;color:var(--text-faint);font-style:italic}

/* ---- conversación (Storm Room + Chat) ---- */
.briefing{border:1px solid var(--hairline);padding:1rem 1.1rem;margin-top:1.3rem}
.briefing dl{display:grid;gap:.5rem 1.4rem;margin-top:.5rem}
.briefing dt{font-size:.62rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint)}
.briefing dd{font-size:.92rem;margin-top:.1rem}
.chat{margin-top:1.4rem;display:flex;flex-direction:column;gap:.7rem;
  min-height:180px;max-height:44vh;overflow-y:auto;padding-right:.3rem}
.bubble{max-width:82%;padding:.7rem .95rem;font-size:.92rem;line-height:1.5}
.bubble.mine{align-self:flex-end;background:var(--cyan);color:var(--ink-deep)}
.bubble.theirs{align-self:flex-start;background:var(--ink);border:1px solid var(--hairline)}
/* El botón de empezar. Ocupa el lugar del composer hasta que se le da, así que
   la pantalla no cambia de alto al arrancar: se cambia una cosa por la otra. */
.start-wrap{margin-top:1.2rem}
.start-wrap .btn{margin-top:0}
.start-note{margin-top:.6rem;font-size:.8rem;color:var(--text-faint)}

.chips{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:1rem}
.chip-q{background:transparent;border:1px solid var(--hairline);color:var(--text-soft);
  font-family:'Raleway',sans-serif;font-size:.8rem;padding:.4rem .8rem;cursor:pointer;
  transition:border-color .16s ease,color .16s ease}
.chip-q:hover{border-color:var(--cyan);color:var(--cyan)}
/* "está escribiendo…" — sin esto la pantalla se queda igual mientras el modelo
   piensa y el demo se lee como roto. Oculto por defecto, no transparente: si
   ocupara sitio siempre, la conversación bailaría al aparecer y desaparecer. */
.typing-wrap{display:none;margin-top:.7rem}
.typing-wrap.on{display:block}
.bubble.typing{display:inline-flex;align-items:center;gap:.32rem;padding:.6rem .9rem}
.bubble.typing em{font-style:normal;font-size:.78rem;color:var(--text-faint);
  margin-left:.25rem}
.bubble.typing .dot{width:5px;height:5px;border-radius:50%;background:var(--text-soft);
  animation:pulso 1.1s infinite ease-in-out}
.bubble.typing .dot:nth-child(2){animation-delay:.16s}
.bubble.typing .dot:nth-child(3){animation-delay:.32s}
@keyframes pulso{0%,70%,100%{opacity:.25;transform:translateY(0)}
                 35%{opacity:1;transform:translateY(-2px)}}
@media (prefers-reduced-motion:reduce){.bubble.typing .dot{animation:none;opacity:.6}}

.chat-form{display:flex;gap:.7rem;margin-top:1.1rem;align-items:flex-end}
.chat-form input[name=mensaje]{flex:1;background:transparent;border:0;
  border-bottom:1px solid var(--hairline);color:var(--text);
  font-family:'Raleway',sans-serif;font-size:.95rem;padding:.55rem 0}
.chat-form input[name=mensaje]:focus{outline:0;border-bottom-color:var(--cyan)}
.chat-form .btn{margin-top:0;padding:.7rem 1.3rem}
.chat-form input:disabled,.chat-form button:disabled{opacity:.4}
.htmx-request .chat-form .btn{opacity:.5}

/* ---- la espera ----
   Compartida por los tres sitios donde el servidor se demora: armar el demo
   (llama a la IA), revisar el documento y analizar el titular. Una pantalla
   quieta sin señal no se lee como "está pensando", se lee como averiada. */
.wait{display:none;margin-top:1.2rem;font-size:.88rem;color:var(--cyan)}
.wait.htmx-request,.htmx-request.wait{display:block}
.wait span{display:inline-block;width:8px;height:8px;background:var(--cyan);
  border-radius:50%;margin-right:.5rem;animation:pulse 1s ease-in-out infinite}
@keyframes pulse{50%{opacity:.25}}

/* ---- LinkedIn Analyzer ---- */
.li-form{margin-top:1.5rem;max-width:640px}
.li-nota{margin-top:.9rem;font-size:.78rem;color:var(--text-faint)}
.li-report{border:1px solid var(--hairline);padding:clamp(1.3rem,3vw,2rem);margin-top:1.6rem}
.li-score{display:flex;align-items:baseline;gap:.2rem}
.li-num{font-family:'Lora',Georgia,serif;font-size:3rem;line-height:1;color:var(--cyan)}
.li-pct{font-size:.9rem;color:var(--text-faint)}
.li-titular{margin-top:1rem;font-family:'Lora',Georgia,serif;font-style:italic;
  font-size:1.05rem;color:var(--text-soft)}
.li-diag{margin-top:.7rem;font-size:.92rem}
.li-check{list-style:none;margin-top:1.3rem}
.li-check li{padding:.5rem 0;border-bottom:1px solid var(--hairline);font-size:.9rem}
.li-check li span{display:inline-block;width:1.4rem;font-weight:700}
.li-check li.ok span{color:var(--cyan)}
.li-check li.no span{color:var(--rose)}
.li-check li.no{color:var(--text-soft)}
/* Las keywords: las que ya usa en cian, las que le faltan en rosa. El color no
   es el único indicador — las que faltan llevan además un signo delante. */
.li-keys{list-style:none;margin-top:.6rem;display:flex;flex-wrap:wrap;gap:.45rem}
.li-keys li{font-family:'Raleway',sans-serif;font-size:.8rem;padding:.32rem .7rem;
  border:1px solid var(--hairline)}
.li-keys li.tiene{border-color:rgba(110,223,249,.5);color:var(--cyan)}
.li-keys li.falta{border-color:var(--rose);color:var(--rose)}
.li-keys li.falta::before{content:"+ ";font-weight:700}

.li-props{list-style:none;margin-top:.6rem}
.li-props li{padding:.7rem .9rem;border-left:2px solid var(--rose);margin-top:.5rem;
  font-size:.92rem;background:rgba(255,233,238,.04)}

/* ---- revisión de documentos: pantalla partida ---- */
.split-doc{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
  gap:clamp(1.2rem,3vw,2.2rem);margin-top:1.5rem;align-items:start}
.doc-pane,.an-pane{border:1px solid var(--hairline);padding:1.1rem 1.2rem}
.doc{font-family:ui-monospace,'Cascadia Mono',Menlo,monospace;font-size:.74rem;
  line-height:1.65;color:var(--text-soft);white-space:pre-wrap;word-break:break-word;
  max-height:52vh;overflow-y:auto;margin-top:.6rem}
.doc-resumen{margin-top:1.1rem;font-size:.92rem;color:var(--text-soft)}
.doc-tabla{width:100%;border-collapse:collapse;margin-top:1.1rem;font-size:.86rem}
.doc-tabla th{text-align:left;font-weight:600;color:var(--text-faint);
  padding:.45rem .8rem .45rem 0;white-space:nowrap;vertical-align:top;
  border-bottom:1px solid var(--hairline);font-size:.78rem}
.doc-tabla td{padding:.45rem 0;border-bottom:1px solid var(--hairline);
  font-variant-numeric:tabular-nums}
.doc-flags{list-style:none;margin-top:.6rem}
.doc-flags li{position:relative;padding:.5rem 0 .5rem 1.5rem;font-size:.88rem;
  border-bottom:1px solid var(--hairline);color:var(--text-soft)}
.doc-flags li::before{content:'!';position:absolute;left:0;top:.5rem;
  color:var(--rose);font-weight:700}
.doc-nota{display:block;margin-left:1.4rem;margin-top:.2rem;
  font-style:normal;font-size:.78rem;color:var(--text-faint)}

/* ---- dashboard ---- */
.db-filtro{display:flex;align-items:center;gap:.7rem;margin-top:1.4rem;
  padding-bottom:1rem;border-bottom:1px solid var(--hairline)}
.db-filtro label{font-size:.68rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--text-faint)}
.db-filtro select{background:transparent;border:0;border-bottom:1px solid var(--hairline);
  color:var(--text);font-family:'Raleway',sans-serif;font-size:.92rem;padding:.35rem 0}
.db-filtro select:focus{outline:0;border-bottom-color:var(--cyan)}
.db-filtro select option{background:var(--ink);color:var(--text)}
.db-marca{font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--cyan);
  border:1px solid rgba(110,223,249,.35);padding:.2rem .5rem}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:.9rem;margin-top:1.4rem}
.kpi{border:1px solid var(--hairline);padding:.85rem 1rem}
.kpi dt{font-size:.62rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--text-faint)}
.kpi dd{font-family:'Lora',Georgia,serif;font-size:1.7rem;line-height:1.15;margin-top:.2rem;
  font-variant-numeric:tabular-nums}
.kpi dd.bien{color:var(--cyan)}
.kpi dd.mal{color:var(--rose)}
.kpi-bench{font-size:.68rem;color:var(--text-faint);margin-top:.15rem}
.charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  gap:1.1rem;margin-top:1.5rem}
.chart-box{border:1px solid var(--hairline);padding:.9rem 1rem}
.chart-box figcaption{font-size:.68rem;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--text-faint);margin-bottom:.6rem}
.chart{width:100%;height:auto;display:block}
.chart .cx{font-family:'Raleway',sans-serif;font-size:9px;fill:rgba(255,233,238,.55)}
/* El valor al final de la barra: más claro que la etiqueta y con cifras de
   ancho fijo, porque es el número que la gente viene a leer. */
.chart .cv{font-family:'Raleway',sans-serif;font-size:9px;font-weight:600;
  fill:var(--text);font-variant-numeric:tabular-nums}

/* diagnóstico: la parte del tablero que dice qué hacer */
.diag{margin-top:1.5rem;border:1px solid var(--hairline);background:var(--ink);
  padding:1.1rem 1.2rem}
.diag ul{list-style:none;margin-top:.6rem;display:grid;gap:.5rem}
.diag li{position:relative;padding-left:1.4rem;font-size:.92rem;color:var(--text-soft)}
.diag li::before{position:absolute;left:0;top:0;font-size:.8rem}
.diag li.mal::before{content:"▲";color:var(--rose)}
.diag li.bien::before{content:"▼";color:var(--cyan)}
.diag li.neutro::before{content:"●";color:var(--text-faint)}
.htmx-request #db-panel{opacity:.55;transition:opacity .12s ease}
