/* ==========================================================================
   LIVIT · PRIMITIVAS v1.0
   Capa maestra. Se apoya SOLO en los roles de livit-tokens.css.
   Ninguna página vuelve a declarar un HEX, un radio o un tamaño de letra.

   Orden de inyección obligatorio:
       livit-fonts.css  ->  livit-tokens.css  ->  livit-primitives.css
   Lo hace stamp.py. No copiar este archivo dentro de una página a mano.
   ========================================================================== */

:root{
  /* ── radios en px ──────────────────────────────────────────────────────
     livit-tokens.css los guarda sin unidad porque también alimenta las
     variables de Figma. Aquí se convierten una vez, para todo el sistema. */
  --r-none:0;
  --r-xs:calc(var(--radius-xs)  * 1px);
  --r-sm:calc(var(--radius-sm)  * 1px);
  --r-md:calc(var(--radius-md)  * 1px);
  --r-lg:calc(var(--radius-lg)  * 1px);
  --r-xl:calc(var(--radius-xl)  * 1px);
  --r-2xl:calc(var(--radius2xl) * 1px);
  --r-3xl:calc(var(--radius3xl) * 1px);
  --r-4xl:calc(var(--radius3xl) * 1px + 8px);
  --r-full:999px;

  /* Mapa de radios - a mayor elemento, mayor radio (CLAUDE.md 4).
     Decidido 27 ago 2026: el sistema sube al radio de la home.
       chip, pill, boton ....... --r-full   999
       campo, control .......... --r-lg       8
       tarjeta, panel .......... --r-2xl     16
       tarjeta destacada,
       contenedor de pagina .... --r-3xl     24
     El boton es pildora en toda la casa - home, web, SOW y NDA ya lo eran.
     Ponerlo en 8 habria cambiado el caracter de todo, que es justo lo que
     esta decision evita. */

  /* ── espaciado en px ── */
  --sp-2:calc(var(--space2)  * 1px);  --sp-4:calc(var(--space4)  * 1px);
  --sp-6:calc(var(--space6)  * 1px);  --sp-8:calc(var(--space8)  * 1px);
  --sp-10:calc(var(--space10)* 1px);  --sp-12:calc(var(--space12)* 1px);
  --sp-16:calc(var(--space16)* 1px);  --sp-20:calc(var(--space20)* 1px);
  --sp-24:calc(var(--space24)* 1px);  --sp-32:calc(var(--space32)* 1px);
  --sp-40:calc(var(--space40)* 1px);  --sp-48:calc(var(--space48)* 1px);
  --sp-64:calc(var(--space64)* 1px);  --sp-80:calc(var(--space80)* 1px);
  --sp-96:calc(var(--space96)* 1px);

  /* ── escala de interfaz · Inter ──────────────────────────────────────── */
  --fs-displayL:40px; --lh-displayL:48px;
  --fs-displayS:30px; --lh-displayS:38px;
  --fs-headline:24px; --lh-headline:32px;
  --fs-titleL:18px;   --lh-titleL:26px;
  --fs-titleM:15px;   --lh-titleM:22px;
  --fs-titleS:13px;   --lh-titleS:18px;
  --fs-bodyL:15px;    --lh-bodyL:24px;
  --fs-bodyM:13px;    --lh-bodyM:20px;   /* por defecto */
  --fs-bodyS:12px;    --lh-bodyS:18px;
  --fs-labelL:13px;   --lh-labelL:16px;
  --fs-labelM:12px;   --lh-labelM:16px;
  --fs-labelS:11px;   --lh-labelS:14px;
  /* Micro. Sustituye a los seis valores sueltos que usaba la home
     (8 / 8.5 / 9 / 9.5 / 10 / 10.5). Solo en mayusculas y con tracking:
     nunca cuerpo de texto. */
  --fs-labelXS:10px;  --lh-labelXS:14px;

  /* ── escala de canvas · DM Sans (piezas que ve el cliente) ───────────── */
  --fs-cDisplayL:57px; --lh-cDisplayL:64px;
  /* 21 sep 2026: entre 57 y 96 no habia nada -un salto de 1,68x- y el filete de
     manifiesto del deck se queda en medio. XL pasa a ser ese escalon (57 x 1,33,
     justo la regla de contraste de la escala) y el hero del sitio, que no se
     mueve, pasa a llamarse 2XL. Solo lo usaban dos reglas. */
  --fs-cDisplayXL:76px; --lh-cDisplayXL:76px;   /* ceñido, como el resto de la familia display */
  --fs-cDisplay2XL:96px;--lh-cDisplay2XL:76px;  /* hero del sitio publico y portada del deck */
  --fs-cDisplayM:46px; --lh-cDisplayM:50px;   /* cabecera de seccion */
  --fs-cDisplayS:36px; --lh-cDisplayS:44px;
  --fs-cTitleXL:30px;  --lh-cTitleXL:34px;    /* titular de bloque y de card */
  --fs-cHeadline:28px; --lh-cHeadline:36px;
  --fs-cTitleL:22px;   --lh-cTitleL:28px;
  --fs-cTitleM:16px;   --lh-cTitleM:24px;
  --fs-cBodyL:16px;    --lh-cBodyL:26px;
  --fs-cBodyM:14px;    --lh-cBodyM:22px;
  --fs-cLabelL:14px;   --lh-cLabelL:20px;
  --fs-cLabelM:12px;   --lh-cLabelM:16px;
  --fs-cLabelS:11px;   --lh-cLabelS:16px;
  --fs-cLabelXS:9px;   --lh-cLabelXS:12px;   /* sub-puntos del Menu 360 */

  /* ── alturas · cinco, no nueve.
     28 chip y badge · 32 caja de icono, fila de cabecera, control pequeno
     38 control por defecto · 44 control grande y fila de tabla
     52 barra superior, la misma en la home y en cada herramienta ── */
  /* --ctl-bar 52 → 56 (Pedro, 29 sep 2026): a 52 los mandos de 38 quedaban a 7 px
     del borde y la cabecera se veía apretada; 56 da 9 px y cae en la retícula de 8. */
  --ctl-xs:28px; --ctl-sm:32px; --ctl-md:38px; --ctl-lg:44px; --ctl-bar:56px;

  /* ── movimiento ───────────────────────────────────────────────────────
     livit-tokens.css cubre controles pequeños. Una tarjeta de 300 px con
     motion-standard (0.2,0,0,1) arranca de golpe y se percibe tosca:
     las superficies grandes llevan su propia curva. */
  --motion-surface:360ms cubic-bezier(.22,.61,.36,1);

  /* Duracion y curva por separado. livit-tokens.css las da unidas
     (--motion-fast: 200ms cubic-bezier(...)), que sirve para
     `transition: opacity var(--motion-fast)` pero no para componer
     `transition: color var(--m-fast) var(--e1)`. Mismos valores, partidos. */
  --e1:cubic-bezier(0,0,.2,1);       /* estandar, entrada */
  --e2:cubic-bezier(.2,0,0,1);       /* enfatizado, salida */
  --e3:cubic-bezier(.34,1.56,.64,1); /* rebote, solo confirmaciones */
  --e-soft:cubic-bezier(.22,.61,.36,1); /* superficies grandes */
  --m-instant:100ms; --m-fast:200ms; --m-std:300ms; --m-slow:450ms;

  /* ── papel ────────────────────────────────────────────────────────────
     Los documentos comerciales no tienen modo oscuro: el papel es papel.
     Valores fijos de la misma paleta, nunca dependientes de tema. */
  --paper-bg:var(--neutral-0);
  --paper-text:var(--neutral-900);
  --paper-body:var(--neutral-700);
  --paper-meta:var(--neutral-600);
  --paper-rule:var(--neutral-150);
  --paper-label:var(--brand-600);
  --paper-accent:var(--brand-500);
}

/* ══ base ═══════════════════════════════════════════════════════════════ */
.lv{font-family:var(--font-ui);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);
 color:var(--text-primary);background:var(--bg-base);
 -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
.lv *,.lv *::before,.lv *::after{box-sizing:border-box}
/* El reset va en :where() para tener especificidad cero. Si no, `.lv button`
   (0,1,1) le gana a `.lv-btn--primary` (0,1,0) y los botones salen sin fondo. */
:where(.lv) button{font:inherit;color:inherit;border:0;background:none;cursor:pointer}
:where(.lv) a{color:inherit;text-decoration:none}
.lv-cv{font-family:var(--font-canvas)}
/* EL MAGENTA QUE ES TEXTO NO ES EL MAGENTA QUE ES RELLENO.
   #E6007E sobre cualquier superficie del sistema da 4,15 y no llega a AA en
   texto pequeño, que es justo donde más se usaba: pestañas, etiquetas de rol,
   «Abrir», encabezados de bloque. El relleno, la marca y el acento serif de
   >=24 px siguen en --brand-primary; el texto va a --text-accent (brand-300 en
   oscuro, brand-600 en claro), que da 7,2 y 5,8. (Pedro, 24 sep 2026) */
.lv-it{font-family:var(--font-accent);font-style:italic;color:var(--brand-primary)}
.lv-mono{font-family:var(--font-mono)}

/* El foco visible nunca se elimina. Es el único estado no opcional. */
.lv :focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}
.lv-btn,.lv-card{-webkit-appearance:none;appearance:none;text-align:left}

/* ══ tipografía ═════════════════════════════════════════════════════════ */
.t-displayL{font-size:var(--fs-displayL);line-height:var(--lh-displayL)}
.t-displayS{font-size:var(--fs-displayS);line-height:var(--lh-displayS)}
.t-headline{font-size:var(--fs-headline);line-height:var(--lh-headline);font-weight:500;letter-spacing:-.014em}
.t-titleL{font-size:var(--fs-titleL);line-height:var(--lh-titleL);font-weight:500}
.t-titleM{font-size:var(--fs-titleM);line-height:var(--lh-titleM);font-weight:500}
.t-titleS{font-size:var(--fs-titleS);line-height:var(--lh-titleS);font-weight:600}
.t-bodyL{font-size:var(--fs-bodyL);line-height:var(--lh-bodyL)}
.t-bodyM{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM)}
.t-bodyS{font-size:var(--fs-bodyS);line-height:var(--lh-bodyS)}
.t-labelL{font-size:var(--fs-labelL);line-height:var(--lh-labelL);font-weight:500}
.t-labelM{font-size:var(--fs-labelM);line-height:var(--lh-labelM);font-weight:500}
.t-labelS{font-size:var(--fs-labelS);line-height:var(--lh-labelS);font-weight:600;
 letter-spacing:.12em;text-transform:uppercase}
.t-labelXS{font-size:var(--fs-labelXS);line-height:var(--lh-labelXS);font-weight:600;
 letter-spacing:.14em;text-transform:uppercase}
.t-cDisplayL{font-family:var(--font-canvas);font-size:var(--fs-cDisplayL);
 line-height:var(--lh-cDisplayL);font-weight:400;letter-spacing:-.03em}
.t-cDisplayM{font-family:var(--font-canvas);font-size:var(--fs-cDisplayM);
 line-height:var(--lh-cDisplayM);font-weight:400;letter-spacing:-.03em}
.t-cDisplayS{font-family:var(--font-canvas);font-size:var(--fs-cDisplayS);
 line-height:var(--lh-cDisplayS);font-weight:400;letter-spacing:-.025em}
.t-cTitleXL{font-family:var(--font-canvas);font-size:var(--fs-cTitleXL);
 line-height:var(--lh-cTitleXL);font-weight:400;letter-spacing:-.024em}
.t-cHeadline{font-family:var(--font-canvas);font-size:var(--fs-cHeadline);
 line-height:var(--lh-cHeadline);font-weight:400;letter-spacing:-.02em}
.t-cTitleL{font-family:var(--font-canvas);font-size:var(--fs-cTitleL);
 line-height:var(--lh-cTitleL);font-weight:500}
.t-cTitleM{font-family:var(--font-canvas);font-size:var(--fs-cTitleM);
 line-height:var(--lh-cTitleM);font-weight:500}
.t-cBodyL{font-family:var(--font-canvas);font-size:var(--fs-cBodyL);line-height:var(--lh-cBodyL)}
.t-cBodyM{font-family:var(--font-canvas);font-size:var(--fs-cBodyM);line-height:var(--lh-cBodyM)}

/* ══ botón · uno, con variantes y tres tallas ═══════════════════════════ */
.lv-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-8);
 height:var(--ctl-md);padding:0 var(--sp-16);border-radius:var(--r-lg);   /* radio 8, no píldora (Pedro, 17 sep 2026): la píldora queda para estados y contadores */
 font-size:var(--fs-titleS);line-height:1;font-weight:500;white-space:nowrap;
 border:1px solid transparent;
 transition:background var(--motion-fast),color var(--motion-fast),
  border-color var(--motion-fast),box-shadow var(--motion-fast)}
.lv-btn--sm{height:var(--ctl-sm);padding:0 var(--sp-12);font-size:var(--fs-labelM)}
.lv-btn--lg{height:var(--ctl-lg);padding:0 var(--sp-20);font-size:var(--fs-titleM)}
.lv-btn svg{width:16px;height:16px;flex:0 0 auto;fill:none;stroke:currentColor;
 stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
/* Botón de peligro. En reposo va en CONTORNO, no relleno: en Administración
   había 54 «Dar de baja» en rojo sólido, uno por persona, y eran el elemento
   más saturado y más repetido de toda la plataforma —se entraba en la pantalla
   por ellos y no por los nombres—. Además el blanco sobre el rojo daba 3,65 y
   no llegaba a AA. Un destructivo se anuncia; se rellena en la confirmación,
   donde es la única acción de la pantalla. (Pedro, 24 sep 2026) */
.lv-btn--danger{background:transparent;color:var(--status-error-text);
 border:1px solid var(--status-error-border)}
.lv-btn--danger:hover{background:var(--status-error-bg);border-color:var(--status-error)}
/* dentro de un diálogo de confirmación sí va relleno: ahí ya es LA acción */
:is(.lv-modal,.lv-dialog,[role="alertdialog"],[role="dialog"]) .lv-btn--danger{
 background:var(--status-error);color:var(--text-on-accent);border-color:transparent}
:is(.lv-modal,.lv-dialog,[role="alertdialog"],[role="dialog"]) .lv-btn--danger:hover{
 background:var(--status-error-hover);border-color:transparent}
.lv-btn--primary{background:var(--brand-primary);color:var(--text-on-accent)}
.lv-btn--primary:hover{background:var(--brand-primary-hover)}
.lv-btn--primary:active{background:var(--brand-primary-active)}
/* Jerarquía de botón (2 sep 2026, Pedro): el relleno magenta es SOLO para el
   CTA que cierra el flujo -Generar documento, Generar presentación, Imprimir-.
   Avanzar de paso es --solid (relleno neutro inverso), retroceder es --ghost.
   Así el magenta señala una sola cosa en cada pantalla. */
.lv-btn--solid{background:var(--surface-inverse);color:var(--text-on-inverse)}
.lv-btn--solid:hover{background:color-mix(in srgb,var(--surface-inverse) 86%,var(--bg-base))}
.lv-btn--solid:active{background:color-mix(in srgb,var(--surface-inverse) 76%,var(--bg-base))}
.lv-btn--outline{border-color:var(--border-default);color:var(--text-secondary)}
.lv-btn--outline:hover{border-color:var(--border-strong);color:var(--text-primary)}
.lv-btn--ghost{color:var(--text-tertiary)}
.lv-btn--ghost:hover{color:var(--text-primary);
 background:color-mix(in srgb,var(--text-primary) calc(var(--state-hover)*100%),transparent)}
.lv-btn[disabled],.lv-btn[aria-disabled="true"]{
 background:color-mix(in srgb,var(--text-primary) calc(var(--state-disabled-surface)*100%),transparent);
 color:var(--text-disabled);border-color:transparent;cursor:not-allowed}
/* Botón BLOQUEADO por rol (19 sep 2026, Pedro). Son tres estados distintos y
   conviene no confundirlos nunca:
     · deshabilitado  → «ahora no»: falta rellenar algo, y en cuanto lo rellenes
                        se enciende. Fondo apagado, sin borde.
     · discontinuo    → «todavía no existe» (.lv-card--quiet, las tarjetas
                        «Próximamente»).
     · bloqueado      → «existe, funciona, y no es para tu rol».
   Por eso este conserva el borde entero del contorno y solo baja el texto: no
   tiene que parecer roto, tiene que parecer de otro. El candado lo pone el kit
   —no cada pantalla—, y el motivo va en su `title`, que el tooltip de la casa
   recoge solo. Sigue siendo pulsable a propósito: el clic es lo que dispara el
   aviso, así que lleva aria-disabled pero NO el atributo disabled. */
.lv-btn--locked,.lv-btn--locked[aria-disabled="true"]{
 background:transparent;border-color:var(--border-default);
 color:var(--text-tertiary);cursor:not-allowed}
.lv-btn--locked:hover,.lv-btn--locked[aria-disabled="true"]:hover{
 background:transparent;border-color:var(--border-strong);color:var(--text-secondary)}
.lv-btn--locked svg{opacity:.75}

/* ══ campo ══════════════════════════════════════════════════════════════ */
.lv-field{display:flex;flex-direction:column;gap:var(--sp-6);margin-bottom:var(--sp-12)}
/* En una fila (color + hex, fecha + duración) el campo no lleva el margen de la
   columna: catorce sitios lo anulaban con un `mb-0!` de Tailwind sobre el kit. */
.lv-field--tight{margin-bottom:0}
/* Prefijo pintado dentro del campo (#, €, %): el símbolo no se escribe ni se
   selecciona, y el texto arranca después de él. */
.lv-input--prefix{position:relative;display:flex;align-items:center;width:100%}
.lv-input--prefix>span{position:absolute;left:var(--sp-12);pointer-events:none;
 font-size:var(--fs-bodyS);color:var(--text-muted)}
.lv-input--prefix>input:not(#_){padding-left:calc(var(--sp-12) + 11px)}
.lv-field>label{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-8);
 font-size:var(--fs-labelM);line-height:var(--lh-labelM);font-weight:600;color:var(--text-secondary)}
.lv-field>label em,.lv-field>label span{font-style:normal;font-weight:400;
 color:var(--text-muted)}
/* Contador de caracteres «n/max» (Pedro, 6 sep 2026): a la derecha del rótulo, en mono 11
   apagado. Avisa en ámbar cuando quedan ≤ 10 % (o ≤ 10 caracteres) y en rojo al llegar al
   límite. Vale dentro del label de .lv-field o suelto junto a un eyebrow. */
.lv-field-count{margin-left:auto;flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:var(--fs-labelS);line-height:var(--lh-labelS);
 font-weight:400;letter-spacing:0;text-transform:none;color:var(--text-muted);font-variant-numeric:tabular-nums}
.lv-field-count.is-near{color:var(--status-warning-text)}
.lv-field-count.is-over{color:var(--status-error-text)}
/* ══ Subida de archivo (7 sep) ══════════════════════════════════════════
   Traer un archivo del ordenador. El icono file-up marca SIEMPRE eso, y solo
   eso: distingue subir de pegar una URL, que es la otra vía del mismo bloque.
   Dos estados. Vacío: el botón de contorno a todo el ancho de su columna (es un
   campo, no un pie de acciones) y la ayuda de formatos debajo. Con archivo: una
   fila de campo relleno —miniatura, nombre y meta— con su papelera dentro, y el
   botón pasa a «Cambiar». Antes solo cambiaba el verbo del botón y el panel no
   decía cuál era el archivo. */
.lv-upload{display:flex;flex-direction:column;gap:var(--sp-6)}
.lv-upload>.lv-btn{width:100%}
.lv-upload-file{display:flex;align-items:center;gap:var(--sp-8);height:var(--ctl-md);
 padding:0 var(--sp-6);border-radius:var(--r-lg);
 background:var(--bg-default);border:1px solid var(--border-default)}
.lv-upload-thumb{display:flex;align-items:center;justify-content:center;flex:0 0 auto;
 width:26px;height:26px;border-radius:var(--r-sm);overflow:hidden;
 background:var(--surface-raised);border:1px solid var(--border-subtle);color:var(--text-tertiary)}
.lv-upload-thumb>img{width:100%;height:100%;object-fit:cover;display:block}
.lv-upload-thumb>svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-upload-name{flex:1 1 auto;min-width:0;font-size:var(--fs-bodyS);color:var(--text-primary);
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-upload-meta{flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:var(--fs-labelXS);
 color:var(--text-muted);font-variant-numeric:tabular-nums}
.lv-upload.is-busy{opacity:.6;pointer-events:none}
.lv-field--narrow{max-width:620px}
/* El control llena el campo aunque venga envuelto (combobox): mismo ancho que un input suelto. */
.lv-field .lv-input,.lv-field>div>.lv-input,
.lv-field>:is(input,select,textarea):not([type=checkbox],[type=radio],[type=range],[type=color]){width:100%;min-width:0}
.lv-field{min-width:0}
/* El campo va HUNDIDO respecto al panel: fondo un paso mas oscuro que la
   superficie y filete de --border-default. Es el estilo del paso Legal del
   SOW, y desde el 31 ago 2026 es la norma para todo campo de texto. */
.lv-input,.lv-field :is(input,select,textarea){height:var(--ctl-md);
 padding:0 var(--sp-12);border-radius:var(--r-lg);
 background:var(--bg-default);border:1px solid var(--border-default);
 color:var(--text-primary);font-family:var(--font-ui);font-size:var(--fs-bodyM);
 transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
.lv-input::placeholder,.lv-field :is(input,textarea)::placeholder{
 color:var(--text-placeholder)}
.lv-input:focus,.lv-field :is(input,select,textarea):focus{outline:none;
 border-color:var(--border-accent);
 box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 20%,transparent)}
.lv-field textarea{height:auto;min-height:calc(var(--ctl-md) * 2);
 padding:var(--sp-10) var(--sp-12);line-height:var(--lh-bodyM);resize:none}
.lv-field :is(input,select,textarea):disabled{opacity:.38;cursor:not-allowed}
/* Ayuda y error bajo el control; el error también tiñe el filete. */
.lv-field-help,.lv-field-error{font-size:var(--fs-labelS);line-height:var(--lh-labelS);
 color:var(--text-muted)}
.lv-field-error{color:var(--status-error-text)}
.lv-field.is-error :is(input,select,textarea){border-color:var(--status-error)}
/* Un control suelto también puede estar en error: una celda de una tabla o de una
   lista no vive dentro de un .lv-field y hasta hoy no tenía cómo decirlo
   (20 sep 2026, las semanas que faltan en el alta a mano). */
.lv-input.is-error,.lv-input.is-error:focus{border-color:var(--status-error)}
/* Dos campos a la par: 12 px entre ellos, como entre filas. */
/* minmax(0,1fr): el ancho intrinseco de un input (~180) no puede ensanchar la columna;
   sin esto, dos campos dentro de un dialogo de 440 se salen del cuadro (revision Pedro, 6 sep). */
.lv-fields-2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 var(--sp-12)}
.lv-fields-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 var(--sp-12)}
/* Campo que crece con su contenido (textarea sin asa, contenteditable del panel de textos del SOW,
   caja del chat): misma receta que el campo, alto automático desde 38, texto en varias líneas.
   `field-sizing:content` (9 sep 2026) es lo que hace que un TEXTAREA crezca de verdad —hasta hoy
   la clase lo prometía y solo lo cumplían los contenteditable—. Sin soporte del navegador se queda
   en su `rows`, que es el comportamiento de antes: degrada, no rompe.
   El tope se pasa por `--grow-max` y por defecto NO hay: así los paneles de texto del SOW, que usan
   esta clase sobre contenteditable, siguen creciendo sin límite. El kit lo fija en 5 líneas. */
.lv-input--grow,.lv-field .lv-input--grow{height:auto;min-height:var(--ctl-md);padding:var(--sp-8) var(--sp-12);line-height:var(--lh-bodyM);
 white-space:pre-wrap;overflow-wrap:anywhere;resize:none;display:block;width:100%;
 field-sizing:content;max-height:var(--grow-max,none);overflow-y:auto}
.lv-input--grow:focus{outline:none;border-color:var(--border-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 20%,transparent)}
.lv-fields-2>.lv-field--full,.lv-fields-3>.lv-field--full{grid-column:1 / -1}
@media(max-width:760px){.lv-fields-2,.lv-fields-3{grid-template-columns:minmax(0,1fr)}}

/* Selector de fecha. El icono nativo se pegaba a la derecha y no se veia; se
   mueve a la izquierda. Con color-scheme (abajo) Chromium ya lo pinta claro en
   oscuro y oscuro en claro: nada de invertirlo -invertido desaparecia contra el
   fondo (5 sep 2026)-, solo opacidad: .78 en reposo, 1 al pasar. */
.lv-field input[type="date"]{position:relative;padding-left:34px}
.lv-field input[type="date"]::-webkit-calendar-picker-indicator{
 position:absolute;left:var(--sp-10);top:50%;transform:translateY(-50%);
 margin:0;padding:0;width:16px;height:16px;cursor:pointer;
 filter:opacity(.78);transition:filter var(--motion-fast)}
.lv-field input[type="date"]:hover::-webkit-calendar-picker-indicator,
.lv-field input[type="date"]:focus::-webkit-calendar-picker-indicator{filter:opacity(1)}

/* ══ controles nativos: siguen al tema ══════════════════════════════════
   Lo que el navegador dibuja por su cuenta -la lista de un <select>, el
   calendario de un input date, las barras de scroll, las flechitas de un
   número- salía en el estilo del sistema operativo: blanco sobre la interfaz
   oscura, otra tipografía. Decisión Pedro, 5 sep 2026: todo ello sigue al
   tema. `color-scheme` es lo que hace que Chromium pinte esos popups en oscuro
   o en claro; el resto son los mismos trazos y colores que el resto de la
   interfaz. Mismas reglas que Kore (theme.css), aquí para los generadores. */
:root{color-scheme:dark}
[data-theme="light"]{color-scheme:light}
/* El documento no cambia de modo (30 sep 2026): ver `.lv-canvas` en livit-tokens.css. */
.lv-canvas,.lv-slide{color-scheme:dark}
.lv-canvas{color:var(--text-primary)}   /* el texto heredado del <body> también, no sólo los roles */

/* select: sin la flecha del sistema; chevron propio (mismo trazo que los
   iconos, 1.75 redondo), en --text-muted de cada tema */
select:not(#_){-webkit-appearance:none;appearance:none;cursor:pointer;
 padding-right:34px !important;
 background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23928F96' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>");
 background-repeat:no-repeat;background-position:right var(--sp-10) center;background-size:16px 16px}
[data-theme="light"] select:not(#_){
 background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23625F66' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>")}
select::-ms-expand{display:none}
select option,select optgroup{background:var(--surface-raised);color:var(--text-primary);
 font-family:var(--font-ui);font-size:var(--fs-bodyM)}
select option:checked{background:color-mix(in srgb,var(--brand-primary) 14%,var(--surface-raised));
 color:var(--text-primary)}
select:not(#_):disabled{cursor:not-allowed;background-image:none}

/* número: sin flechitas. Se teclea; las flechas del sistema no siguen al tema
   y en una tabla de honorarios molestan mas de lo que ayudan */
input[type="number"]{-moz-appearance:textfield;appearance:textfield}
input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}

/* Deslizador (.lv-range, decisión Pedro 6 sep 2026): pista fina de 2 px en gris
   (--border-default) y punto magenta de 12; la fila entera mide 28 (--ctl-xs), que es el
   área de toque. El color del punto dice si está habilitado (magenta) o no (--text-disabled).
   --fill pinta en magenta el tramo recorrido (unipolar: ángulo, oscurecer, progreso);
   --bipolar pinta desde el centro hasta el punto (Personality: se ve el lado dominante) y
   marca el centro con un tick de 1 px. --fill lee --p (0–100 %); --bipolar lee --lo/--hi (el
   menor y el mayor entre 50 % y la posición). Los pone quien lo usa (el kit de Kore, solo).
   Hover: halo 20 % de 4 px · foco: anillo 30 % de 3 px. Un input[type=range] suelto
   dentro de .lv recibe la misma pista y el mismo punto. */
.lv-range,:where(.lv input[type="range"]){-webkit-appearance:none;appearance:none;width:100%;height:var(--ctl-xs);margin:0;padding:0;background:transparent;cursor:pointer;
 --lv-tk:2px;--lv-th:12px;--lv-line:var(--border-default);--lv-dot:var(--brand-primary);--p:50%}
.lv-range::-webkit-slider-runnable-track,:where(.lv input[type="range"])::-webkit-slider-runnable-track{height:var(--lv-tk);border-radius:var(--r-full);background:var(--lv-line)}
.lv-range::-moz-range-track,:where(.lv input[type="range"])::-moz-range-track{height:var(--lv-tk);border-radius:var(--r-full);background:var(--lv-line)}
.lv-range::-webkit-slider-thumb,:where(.lv input[type="range"])::-webkit-slider-thumb{-webkit-appearance:none;width:var(--lv-th);height:var(--lv-th);border-radius:50%;border:0;background:var(--lv-dot);
 margin-top:calc((var(--lv-tk) - var(--lv-th))/2);box-shadow:0 0 0 0 color-mix(in srgb,var(--brand-primary) 20%,transparent);transition:box-shadow var(--motion-fast)}
.lv-range::-moz-range-thumb,:where(.lv input[type="range"])::-moz-range-thumb{width:var(--lv-th);height:var(--lv-th);border-radius:50%;border:0;background:var(--lv-dot);
 box-shadow:0 0 0 0 color-mix(in srgb,var(--brand-primary) 20%,transparent);transition:box-shadow var(--motion-fast)}
.lv-range:hover::-webkit-slider-thumb,.lv-range.is-hover::-webkit-slider-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--brand-primary) 20%,transparent)}
.lv-range:hover::-moz-range-thumb{box-shadow:0 0 0 4px color-mix(in srgb,var(--brand-primary) 20%,transparent)}
.lv-range:focus-visible{outline:none}
.lv-range:focus-visible::-webkit-slider-thumb,.lv-range.is-focus::-webkit-slider-thumb{box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 30%,transparent)}
.lv-range:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 30%,transparent)}
.lv-range:disabled,:where(.lv input[type="range"]):disabled{cursor:not-allowed;--lv-dot:var(--text-disabled)}
.lv-range:disabled::-webkit-slider-thumb{box-shadow:none}
.lv-range.lv-range--fill::-webkit-slider-runnable-track{background:linear-gradient(90deg,var(--lv-dot) var(--p),var(--lv-line) var(--p))}
.lv-range.lv-range--fill::-moz-range-track{background:linear-gradient(90deg,var(--lv-dot) var(--p),var(--lv-line) var(--p))}
.lv-range.lv-range--bipolar::-webkit-slider-runnable-track{background:linear-gradient(90deg,var(--lv-line) var(--lo,50%),var(--lv-dot) var(--lo,50%),var(--lv-dot) var(--hi,50%),var(--lv-line) var(--hi,50%))}
.lv-range.lv-range--bipolar::-moz-range-track{background:linear-gradient(90deg,var(--lv-line) var(--lo,50%),var(--lv-dot) var(--lo,50%),var(--lv-dot) var(--hi,50%),var(--lv-line) var(--hi,50%))}
.lv-range-wrap{position:relative;display:block}   /* envoltorio del bipolar: pone el tick central */
.lv-range-wrap--bipolar::before{content:"";position:absolute;left:50%;top:calc(50% - 5px);width:1px;height:10px;background:var(--border-strong);pointer-events:none;z-index:0}
.lv-range-wrap>.lv-range{position:relative;z-index:1}
/* fila «rótulo + valor»: encima del deslizador; el valor en mono, alineado a la derecha */
.lv-range-row{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-8);margin-bottom:-2px}
.lv-range-row>b{font-size:var(--fs-labelM);line-height:var(--lh-labelM);font-weight:600;color:var(--text-secondary)}
.lv-range-row>i{font-variant-numeric:tabular-nums;font-style:normal;font-size:var(--fs-labelS);line-height:var(--lh-labelM);color:var(--text-muted);font-variant-numeric:tabular-nums}
/* input con datalist: fuera la flecha de lista del sistema (el date ya tiene la suya) */
input[list]::-webkit-calendar-picker-indicator{display:none !important}

/* barras de scroll finas y redondas, sin flechas, pulgar translucido del color
   del texto: 16 % en reposo, 28 % al pasar. Igual que en Kore */
*{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--text-primary) 16%,transparent) transparent}
*::-webkit-scrollbar{width:8px;height:8px}
*::-webkit-scrollbar-track,*::-webkit-scrollbar-corner{background:transparent}
*::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--text-primary) 16%,transparent);
 border-radius:var(--r-full);border:2px solid transparent;background-clip:padding-box}
*::-webkit-scrollbar-thumb:hover{background-color:color-mix(in srgb,var(--text-primary) 28%,transparent)}
*::-webkit-scrollbar-button{display:none;width:0;height:0}
/* asa de redimensionar de textarea: la del sistema es una esquina gris; fuera,
   el campo ya crece con el contenido cuando hace falta */
textarea{resize:vertical}
textarea::-webkit-resizer{background:transparent}

/* ══ buscador con resultados en línea ═══════════════════════════════════
   Para elegir una entre muchas (excluir una marca del muro: SOW y Deck).
   Sustituye al <input list> nativo, que desplegaba las 100 marcas de golpe en
   el estilo del sistema. Se escribe, aparecen hasta 8 coincidencias debajo con
   su logotipo; clic o Enter para elegir, Esc para limpiar. Decisión Pedro, 5 sep 2026. */
.lv-find{position:relative;max-width:320px;margin-top:var(--sp-6)}
.lv-find>input{width:100%}
.lv-find-res{display:flex;flex-direction:column;gap:2px;margin-top:var(--sp-6)}
.lv-find-res:empty{display:none}
.lv-find-res button{display:flex;align-items:center;gap:var(--sp-10);width:100%;height:var(--ctl-sm);
 padding:0 var(--sp-10);border-radius:var(--r-lg);border:1px solid transparent;
 background:var(--surface-raised);color:var(--text-primary);font-family:var(--font-ui);
 font-size:var(--fs-bodyS);cursor:pointer;text-align:left;
 transition:border-color var(--motion-fast),background var(--motion-fast)}
.lv-find-res button:hover,.lv-find-res button.is-on{border-color:var(--border-accent);
 background:color-mix(in srgb,var(--brand-primary) 10%,var(--surface-raised))}
/* El que crece es el RÓTULO, y se dice con su clase. Antes crecía cualquier
   `span` de la fila, y como la marca de la izquierda también es un span —un
   logotipo en el buscador de marcas, un avatar en el de personas— se repartía
   el ancho con el nombre: el avatar salía estirado en una pastilla de 103 px y
   todo parecía centrado (Pedro, 23 sep 2026). Misma familia que `.filtro-op>.t`. */
.lv-find-res button > *{flex:0 0 auto}
.lv-find-res button > .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* El logotipo de la fila, sólo si cuelga directamente del botón: una foto
   dentro de un avatar no es un logotipo y no se recorta en blanco. */
.lv-find-res button > img{width:34px;height:17px;object-fit:contain;
 background:#fff;border-radius:3px;padding:1px}
.lv-find-res button em{margin-left:auto;font-style:normal;color:var(--text-muted);
 font-size:var(--fs-labelS);white-space:nowrap}
.lv-find-more{font-size:var(--fs-labelS);color:var(--text-muted);padding:var(--sp-4) var(--sp-10)}

/* ══ diálogo · uno para toda la plataforma ═══════════════════════════════
   Viene de Kore al sistema (Kit v1, 5 sep 2026). 440 de ancho (--md: 640),
   radio 24, superficie elevada, sombra modal, velo con desenfoque. El foco
   entra al primer control y vuelve al cerrar; Esc cierra (eso lo hace el
   componente, aquí solo la forma). */
.lv-scrim{position:fixed;inset:0;z-index:100;display:flex;align-items:center;
 justify-content:center;padding:var(--sp-24);overflow-y:auto;
 background:color-mix(in srgb,var(--bg-base) 70%,transparent);backdrop-filter:blur(2px)}
.lv-dialog{width:100%;max-width:440px;border-radius:var(--r-3xl);padding:var(--sp-24);
 background:var(--surface-raised);color:var(--text-primary);box-shadow:var(--shadow-modal);
 outline:none}
.lv-dialog--md{max-width:640px}
.lv-dialog--lg{max-width:800px}
.lv-dialog-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--sp-16)}
.lv-dialog-t{margin:0;font-size:var(--fs-titleL);line-height:var(--lh-titleL);font-weight:500;
 color:var(--text-primary)}
.lv-dialog-d{margin:var(--sp-4) 0 0;font-size:var(--fs-bodyS);line-height:var(--lh-bodyS);
 color:var(--text-muted)}
.lv-dialog-x{display:flex;align-items:center;justify-content:center;width:32px;height:32px;
 margin:-4px -8px 0 0;color:var(--text-muted);border-radius:var(--r-full);
 transition:color var(--motion-fast)}
.lv-dialog-x:hover{color:var(--text-accent)}
.lv-dialog-x svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round}
.lv-dialog-body{margin-top:var(--sp-20)}
.lv-dialog-foot{display:flex;align-items:center;justify-content:flex-end;gap:var(--sp-8);
 margin-top:var(--sp-24)}
.lv-dialog-foot>.lv-nav-note{margin-right:auto}
/* Diálogo LARGO (revisión del alcance de un SOW, listas de documentos): el cuerpo
   se lleva el scroll y la cabecera y el pie se quedan quietos, en vez de crecer el
   diálogo entero por fuera de la pantalla y dejar los botones donde no se ven.
   No es el comportamiento por defecto a propósito: un cuerpo con scroll RECORTA
   los desplegables que nacen dentro (combobox, calendario, menú), así que se pide
   con <Dialog scroll> solo donde no los hay. El -12/+12 del cuerpo es para que el
   fondo de una fila al pasar y el foco no queden cortados contra el borde. */
.lv-dialog--scroll{display:flex;flex-direction:column;max-height:calc(100vh - 48px)}
.lv-dialog--scroll>.lv-dialog-head,.lv-dialog--scroll>.lv-dialog-foot{flex:0 0 auto}
.lv-dialog--scroll>.lv-dialog-body{flex:1 1 auto;min-height:0;overflow-y:auto;
 overscroll-behavior:contain;margin-inline:calc(var(--sp-12)*-1);padding-inline:var(--sp-12)}
/* Aviso dentro de un diálogo o panel: fondo tenue del estado, filete a la mezcla. */
.lv-note{padding:var(--sp-10) var(--sp-12);border-radius:var(--r-xl);
 font-size:var(--fs-bodyS);line-height:var(--lh-bodyS);
 background:var(--status-info-bg);border:1px solid var(--status-info-border);color:var(--status-info-text)}
.lv-note--warning{background:var(--status-warning-bg);border-color:var(--status-warning-border);color:var(--status-warning-text)}
.lv-note--error{background:var(--status-error-bg);border-color:var(--status-error-border);color:var(--status-error-text)}
.lv-note--success{background:var(--status-success-bg);border-color:var(--status-success-border);color:var(--status-success-text)}
/* Aviso con contenido (6 sep 2026): título, lista de detalle y acciones. El color del
   estado queda en el título y en lo destacado; el detalle va en texto normal. */
/* Nota de persistencia: una línea de pie que dice si lo que se escribe ahí se
   guarda, y dónde. Formato «Estado (detalle)» (Pedro, 7 sep): una sola línea, sin
   frases explicativas encima. El punto lleva el significado — verde se guarda ·
   gris solo lienzo, a propósito · ámbar debería guardarse y no puede — y si el
   texto no cabe se recorta con elipsis y queda entero en el tooltip. */
.lv-sync{display:flex;align-items:center;gap:var(--sp-6);min-width:0;
 font-size:var(--fs-labelS);line-height:var(--lh-labelS);color:var(--text-muted)}
.lv-sync>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Toast: es .lv-note flotando, no una forma nueva. Una sola posición en toda la
   casa (Pedro, 7 sep): abajo-centro DEL BLOQUE que falló y dentro de él — en un
   lienzo de ocho bloques la posición es lo que dice cuál falló, porque el mensaje
   no siempre lo dice. Antes: tres copias abajo-centro con caja neutra y una cuarta
   abajo-derecha, fuera del bloque y encima del siguiente. El padre marca
   `position:relative`; el tono y el color los pone .lv-note. */
.lv-toast{position:absolute;left:50%;bottom:var(--sp-12);transform:translateX(-50%);z-index:60;
 width:max-content;max-width:calc(100% - var(--sp-32));box-shadow:var(--shadow-lift);
 animation:lv-toast-in var(--motion-standard) ease-out}
@keyframes lv-toast-in{from{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%,0)}}
@media(prefers-reduced-motion:reduce){.lv-toast{animation:none}}
.lv-note--rich{padding:var(--sp-16) var(--sp-20);color:var(--text-secondary)}   /* márgenes: revisión Pedro, 6 sep */
.lv-note--rich>.lv-note-t{display:block;font-size:var(--fs-labelL);line-height:var(--lh-labelL);font-weight:600;margin-bottom:var(--sp-12)}
.lv-note--warning.lv-note--rich>.lv-note-t,.lv-note--warning.lv-note--rich b{color:var(--status-warning-text)}
.lv-note--error.lv-note--rich>.lv-note-t,.lv-note--error.lv-note--rich b{color:var(--status-error-text)}
.lv-note--success.lv-note--rich>.lv-note-t,.lv-note--success.lv-note--rich b{color:var(--status-success-text)}
.lv-note--rich>.lv-note-t{color:var(--status-info-text)}
.lv-note--rich ul{list-style:none;margin:0 0 var(--sp-12);padding:0}
.lv-note--rich li{margin-bottom:var(--sp-8)}
.lv-note--rich li:last-child{margin-bottom:0}
.lv-note--rich li>em{display:block;font-style:normal;font-size:var(--fs-labelXS);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-tertiary);margin-bottom:2px}
.lv-note--rich li>span{display:block;line-height:var(--lh-bodyM)}
.lv-note--rich li>span>i{font-style:normal;font-variant-numeric:tabular-nums;font-size:var(--fs-labelM);color:var(--text-muted);margin-right:var(--sp-4);font-variant-numeric:tabular-nums}
.lv-note--rich>.lv-note-actions{display:flex;gap:var(--sp-8);margin-top:var(--sp-12)}

/* ══ popover de lista · la lista de un combobox o de un menú de acciones (.lv-pop: .lv-menu es el Menú 360 del deck) ══
   Misma superficie que el diálogo, radio 12, sombra modal; la fila es de 32
   (control compacto) con el tinte magenta en la elegida. */
.lv-pop{position:absolute;z-index:40;left:0;right:0;margin-top:var(--sp-4);
 padding:var(--sp-4);border-radius:var(--r-xl);background:var(--surface-raised);
 border:1px solid var(--border-subtle);box-shadow:var(--shadow-modal)}
.lv-pop-list{max-height:240px;overflow:auto;margin:0;padding:0;list-style:none}
.lv-pop-item{display:flex;align-items:center;gap:var(--sp-10);width:100%;
 min-height:var(--ctl-sm);padding:0 var(--sp-10);border-radius:var(--r-lg);
 font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-primary);
 text-align:left;cursor:pointer;transition:background var(--motion-fast)}
.lv-pop-item:hover,.lv-pop-item.is-hi{background:color-mix(in srgb,var(--text-primary) 6%,transparent)}
.lv-pop-item.is-on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent)}
.lv-pop-item svg{width:16px;height:16px;flex:0 0 auto;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-pop-item>.chk{margin-left:auto;color:var(--text-accent)}
.lv-pop-item:disabled,.lv-pop-item[aria-disabled="true"]{color:var(--text-disabled);cursor:not-allowed;background:none}
.lv-pop-empty{padding:var(--sp-8) var(--sp-10);font-size:var(--fs-bodyS);color:var(--text-muted)}
.lv-pop-search{padding:var(--sp-4) var(--sp-4) var(--sp-8);border-bottom:1px solid var(--border-subtle);margin-bottom:var(--sp-4)}
.lv-pop-search input{height:var(--ctl-sm);font-size:var(--fs-bodyS)}
/* Casilla · diseño «contorno» (Pedro, 2 oct 2026, elegida entre cuatro en una
   maqueta). El magenta MARCA pero no ocupa: borde y check en acento sobre un
   velo al 14 %, nunca un bloque relleno. 18 px. El check se dibuja al entrar
   (220 ms); .is-still lo deja quieto cuando la casilla se repinta sin haber
   cambiado -los asistentes HTML repintan el panel entero en cada clic-. Vale
   para el menú múltiple (Combobox) y para las listas de .lv-listrow--check. */
.lv-check{position:relative;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;
 border-radius:var(--r-sm);border:1.5px solid var(--border-strong);flex:0 0 auto;color:var(--text-accent);
 transition:background var(--motion-fast),border-color var(--motion-fast)}
:hover>.lv-check:not(.is-on){border-color:var(--text-secondary)}
.lv-check.is-on{border-color:var(--text-accent);background:color-mix(in srgb,var(--brand-primary) 14%,transparent)}
.lv-check svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;
 stroke-dasharray:30;animation:lv-check-draw 220ms cubic-bezier(.2,0,0,1) both}
.lv-check.is-still svg{animation:none}
@keyframes lv-check-draw{from{stroke-dashoffset:30}to{stroke-dashoffset:0}}
@media (prefers-reduced-motion:reduce){.lv-check svg{animation:none}}
/* etiqueta elegida dentro de un campo múltiple */
.lv-tag{display:inline-flex;align-items:center;gap:var(--sp-4);height:22px;padding:0 var(--sp-8);
 border-radius:var(--r-full);background:color-mix(in srgb,var(--text-primary) 8%,transparent);
 font-size:var(--fs-labelM);color:var(--text-primary);white-space:nowrap}
.lv-tag button{display:flex;color:var(--text-muted)}
.lv-tag button:hover{color:var(--text-accent)}
.lv-tag svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round}
/* La misma etiqueta con un DATO LITERAL en vez de una elección: la fuente de una
   respuesta del asistente, un identificador, el correo de la sesión de desarrollo.
   Mono, que es lo que el kit reserva para códigos y metadatos, y más apagada porque
   no se puede quitar: no lleva aspa. (7 sep) */
.lv-tag--code{height:20px;font-family:var(--font-mono);font-size:var(--fs-labelXS);
 font-weight:500;letter-spacing:.02em;color:var(--text-tertiary);
 background:color-mix(in srgb,var(--text-primary) 6%,transparent)}
/* Insignia de sesión de desarrollo: la misma pieza en ámbar. La posición la pone
   quien la usa; no es producto, pero tampoco merece un dibujo aparte. */
.lv-tag--warn{background:var(--status-warning-bg);color:var(--status-warning-text);
 border:1px solid var(--status-warning-border)}
/* campo que contiene tags (multi-select): crece con el contenido */
.lv-input--tags{height:auto;min-height:var(--ctl-md);display:flex;flex-wrap:wrap;
 align-items:center;gap:var(--sp-6);padding:var(--sp-6) var(--sp-8)}
/* el control de un combobox lleva chevron como el select */
.lv-input--combo:not(#_){padding-right:34px;text-align:left;cursor:pointer;
 background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23928F96' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>");
 background-repeat:no-repeat;background-position:right var(--sp-10) center;background-size:16px 16px}
[data-theme="light"] .lv-input--combo:not(#_){
 background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23625F66' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>")}

/* ══ desplegable · calendario · selector de color PROPIOS ═══════════════════
   La lista que abre un <select>, el calendario de un input[type=date] y el
   selector de un input[type=color] son ventanas del navegador: no admiten
   estilo y rompían el kit (revisión Pedro, 6 sep 2026). livit-controls.js
   (generadores, biblia) y kit.tsx (Kore) los sustituyen por popovers .lv-pop
   con estas clases. El control nativo sigue en el DOM (.lv-native) para el
   valor, el id, la etiqueta y los eventos. Opt-out: data-lv-native. */
.lv-native:not(#_){position:absolute;width:1px;height:1px;margin:0;padding:0;border:0;opacity:0;
 pointer-events:none;overflow:hidden;clip:rect(0 0 0 0)}
.lv-ctl{position:relative;min-width:0}
.lv-field .lv-ctl{width:100%}
.lv-ctl>.lv-input{width:100%}
.lv-input--sm:not(#_){height:var(--ctl-sm);font-size:var(--fs-bodyS);padding:0 var(--sp-10)}
.lv-input--sm.lv-input--combo:not(#_){padding-right:30px;background-position:right var(--sp-8) center}
/* disparador del desplegable y de la fecha: texto en una línea, placeholder gris */
.lv-select-btn,.lv-date-btn,.lv-color-btn{display:flex;align-items:center;gap:var(--sp-10);
 font-family:var(--font-ui);color:var(--text-primary)}
.lv-select-btn>.t,.lv-date-btn>.t,.lv-color-btn>.t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-select-btn.is-placeholder>.t,.lv-date-btn.is-placeholder>.t{color:var(--text-placeholder)}
.lv-select-btn:disabled,.lv-date-btn:disabled,.lv-color-btn:disabled{opacity:.38;cursor:not-allowed}
.lv-pop.is-up{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--sp-4)}
/* la lista de un desplegable puede ser más ancha que su control (etiquetas largas) */
.lv-ctl>.lv-pop:not(.lv-pop--cal):not(.lv-pop--color){right:auto;min-width:100%;width:max-content;max-width:360px}
.lv-ctl>.lv-pop .lv-pop-item{white-space:nowrap}
.lv-pop-item.is-hi{outline:none}
/* fecha: icono de calendario a la izquierda, como tenía el nativo */
.lv-input--date:not(#_){padding-left:34px;text-align:left;cursor:pointer;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23928F96' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='18' rx='2'/><path d='M16 2v4M8 2v4M3 10h18'/></svg>");
 background-repeat:no-repeat;background-position:left var(--sp-10) center;background-size:16px 16px}
[data-theme="light"] .lv-input--date:not(#_){background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23625F66' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='18' rx='2'/><path d='M16 2v4M8 2v4M3 10h18'/></svg>")}
.lv-pop--cal{left:0;right:auto;width:280px;padding:var(--sp-12)}
.lv-cal-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-6);margin-bottom:var(--sp-8)}
.lv-cal-title{flex:1;text-align:center;font-size:var(--fs-bodyM);font-weight:500;color:var(--text-primary)}
.lv-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.lv-cal-dow{height:24px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-labelXS);
 font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-tertiary)}
.lv-cal-day{height:32px;border-radius:var(--r-lg);font-family:var(--font-ui);font-size:var(--fs-bodyM);color:var(--text-primary);
 background:none;border:0;cursor:pointer;transition:background var(--motion-fast),color var(--motion-fast)}
.lv-cal-day:hover,.lv-cal-day:focus-visible{background:color-mix(in srgb,var(--text-primary) 6%,transparent);outline:none}
.lv-cal-day.is-out{color:var(--text-disabled)}
.lv-cal-day.is-today{box-shadow:inset 0 0 0 1px var(--border-strong)}
.lv-cal-day.is-on,.lv-cal-day.is-on:hover{background:var(--brand-primary);color:var(--text-on-accent);font-weight:500}
.lv-cal-day:disabled{color:var(--text-disabled);cursor:not-allowed;background:none}
.lv-cal-foot{display:flex;justify-content:space-between;margin-top:var(--sp-8);padding-top:var(--sp-8);border-top:1px solid var(--border-subtle)}
/* color: muestra + hex en el disparador; popover con pad, tono, hex y paleta */
.lv-color-btn>.sw,.lv-color-sq>.sw{width:20px;height:20px;border-radius:6px;flex:0 0 auto;
 box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--text-primary) 18%,transparent)}
.lv-color-btn>.t{text-align:left;font-family:var(--font-mono);font-size:var(--fs-labelM);text-transform:uppercase;color:var(--text-secondary)}
.lv-color-sq:not(#_){width:var(--ctl-md);padding:0;justify-content:center;cursor:pointer}
/* SIN ASIGNAR (22 sep 2026). Un rol de color que nadie ha elegido no es negro:
   la muestra va punteada y vacia, y el hueco del hex dice que falta elegir. Se
   vio en el brand kit, donde los cuatro roles vacios se leian como #000000
   asignado — el panel mentia. Lo pone `ColorInput` cuando no hay valor. */
.lv-color-btn.is-empty>.sw,.lv-color-sq.is-empty>.sw{background:transparent;box-shadow:none;
 border:1px dashed color-mix(in srgb,var(--text-primary) 26%,transparent)}
.lv-color-btn.is-empty>.t{font-family:var(--font-ui);text-transform:none;color:var(--text-muted)}
.lv-pop--color{left:0;right:auto;width:244px;padding:var(--sp-12)}
.lv-color-pad{position:relative;height:140px;border-radius:var(--r-lg);cursor:crosshair;touch-action:none;
 background:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,hsl(var(--h,330) 100% 50%))}
.lv-color-hue{position:relative;margin-top:var(--sp-10);height:12px;border-radius:var(--r-full);cursor:pointer;touch-action:none;
 background:linear-gradient(to right,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)}
.lv-color-pad>.dot,.lv-color-hue>.dot{position:absolute;width:14px;height:14px;border-radius:var(--r-full);
 border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.45);transform:translate(-50%,-50%);pointer-events:none}
.lv-color-hue>.dot{top:50%}
.lv-color-row{display:flex;align-items:center;gap:var(--sp-8);margin-top:var(--sp-10)}
.lv-color-row>.sw{width:var(--ctl-sm);height:var(--ctl-sm);border-radius:var(--r-lg);flex:0 0 auto;
 box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--text-primary) 18%,transparent)}
.lv-color-row>.lv-input{flex:1;height:var(--ctl-sm);font-family:var(--font-mono);font-size:var(--fs-labelM);text-transform:uppercase}
.lv-color-swatches{display:grid;grid-template-columns:repeat(8,1fr);gap:var(--sp-6);margin-top:var(--sp-10)}
.lv-color-swatches>button{aspect-ratio:1;border-radius:6px;border:0;cursor:pointer;padding:0;
 box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--text-primary) 18%,transparent);transition:transform var(--motion-fast)}
.lv-color-swatches>button:hover{transform:scale(1.1)}
.lv-color-swatches>button.is-on{box-shadow:0 0 0 2px var(--surface-raised),0 0 0 4px var(--brand-primary)}

/* ══ stepper numérico · fila de tabla · fila de total ═══════════════════════
   Promovidos al kit el 6 sep 2026 desde la Tabla de honorarios del SOW (paso 3)
   y la barra de formato de Kore (NumberField), que dibujaban el mismo −/+ de
   dos maneras. */
/* Píldora compacta de 32 (--md 38): − · cifra · + · sufijo. La píldora ES el
   control: la cifra va sin filete y el foco enciende el borde de la píldora. */
.lv-stepper{display:inline-flex;align-items:center;gap:2px;height:var(--ctl-sm);padding:2px;flex:0 0 auto;
 border-radius:var(--r-full);background:var(--bg-default);border:1px solid var(--border-default);
 transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
.lv-stepper:focus-within{border-color:var(--border-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 20%,transparent)}
.lv-stepper>button{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex:0 0 auto;
 border:0;border-radius:var(--r-full);background:transparent;color:var(--text-muted);cursor:pointer;
 font-family:var(--font-ui);font-size:15px;line-height:1;transition:background var(--motion-fast),color var(--motion-fast)}
.lv-stepper>button:hover{background:color-mix(in srgb,var(--text-primary) 8%,transparent);color:var(--text-primary)}
.lv-stepper>button svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-stepper>input:not(#_){width:36px;min-width:0;height:26px;padding:0 2px;border:0;border-radius:var(--r-lg);background:transparent;
 text-align:center;font-family:var(--font-ui);font-size:var(--fs-labelM);font-weight:600;color:var(--text-primary);
 font-variant-numeric:tabular-nums;box-shadow:none}
.lv-stepper>input:focus{outline:none}
.lv-stepper>input::placeholder{color:var(--text-placeholder);font-weight:400}
.lv-stepper>em,.lv-stepper>.sfx{font-style:normal;font-size:var(--fs-labelXS);color:var(--text-muted);padding:0 var(--sp-8) 0 2px;white-space:nowrap}
.lv-stepper>svg:first-child{width:16px;height:16px;margin-left:var(--sp-6);flex:0 0 auto;fill:none;stroke:var(--text-muted);stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-stepper--md{height:var(--ctl-md);padding:3px}
.lv-stepper--md>button{width:30px;height:30px}
.lv-stepper--md>input:not(#_){width:44px;height:30px;font-size:var(--fs-bodyM)}
.lv-stepper--wide>input:not(#_){width:56px}
.lv-stepper:has(>input:disabled),.lv-stepper.is-off{opacity:.38;pointer-events:none}
/* Tabla de edición: la fila de columnas y la fila de datos. Las columnas
   (grid-template-columns) las pone la herramienta: son layout, no kit. */
/* Cabeceras en texto normal 12/500 apagado (Pedro, 13 oct 2026, auditoría): el estándar del
   panel de admin pasa a ser el de toda la casa; las mayúsculas quedan para los rótulos de navegación. */
.lv-thead{display:grid;gap:var(--sp-10);align-items:end;padding-bottom:var(--sp-6);border-bottom:1px solid var(--border-subtle);
 font-size:12px;line-height:16px;font-weight:500;color:var(--text-muted)}
.lv-trow{display:grid;gap:var(--sp-10);align-items:center;min-height:40px;padding:2px 0}
.lv-trow>.nm{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-primary);display:flex;align-items:center;gap:var(--sp-6);min-width:0}
.lv-trow>.nm>b{font-variant-numeric:tabular-nums;font-weight:500;font-size:var(--fs-labelM);color:var(--text-muted);font-variant-numeric:tabular-nums}
.lv-trow.is-off>.nm{color:var(--text-disabled)}
.lv-trow.is-off>.nm>b{color:var(--text-disabled)}
.lv-trow.is-off .lv-iconbtn{color:var(--text-disabled)}
/* Fila de total: etiqueta a la izquierda, cifra tabular a la derecha; --accent para el
   total que no suma al principal (Optional). */
.lv-sum{display:flex;align-items:baseline;gap:var(--sp-10);padding:var(--sp-4) 0;font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-muted)}
.lv-sum>b{font-weight:600;color:var(--text-secondary)}
.lv-sum>span{margin-left:auto;font-size:14px;font-weight:600;color:var(--text-primary);font-variant-numeric:tabular-nums}
.lv-sum--accent>span{color:var(--text-accent)}
.lv-sums{margin-top:var(--sp-16);padding-top:var(--sp-12);border-top:1px solid var(--border-subtle)}

/* ══ gantt · regla, fila, pista, barra, hoy ═══════════════════════════════
   Promovido el 6 sep 2026 desde el Project Planning del SOW (semanas) y el
   Project Tracking de Kore (días). La escala (--n unidades visibles) y las
   alturas de fila las pone cada herramienta; aquí el dibujo. */
.lv-gantt{position:relative;user-select:none;min-width:0}
/* regla superior: banda de meses (celdas) y fila de unidades (números) */
.lv-gantt-band{position:relative;height:18px;margin-bottom:2px}
.lv-gantt-band>i{position:absolute;top:0;height:16px;line-height:16px;font-style:normal;font-size:var(--fs-labelXS);
 font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);text-align:center;overflow:hidden;
 white-space:nowrap;border-left:1px solid var(--border-subtle);background:var(--surface-raised);border-radius:var(--r-xs)}
.lv-gantt-units{position:relative;height:18px}
.lv-gantt-units>i{position:absolute;top:0;height:18px;line-height:18px;font-style:normal;font-size:var(--fs-labelXS);
 color:var(--text-tertiary);text-align:left;padding-left:2px;font-variant-numeric:tabular-nums;white-space:nowrap}
.lv-gantt-units>i.is-center{text-align:center;padding:0}
/* fila: etiqueta + pista. La herramienta fija grid-template-columns y la altura. */
.lv-gantt-row{display:grid;grid-template-columns:172px 1fr;gap:var(--sp-10);align-items:center;height:26px}
.lv-gantt-row>.nm{display:flex;align-items:center;gap:var(--sp-6);min-width:0;font-size:var(--fs-labelM);line-height:var(--lh-labelM);
 color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-gantt-row>.nm>b{font-variant-numeric:tabular-nums;font-weight:500;color:var(--text-muted);font-variant-numeric:tabular-nums;flex:0 0 auto}
.lv-gantt-row>.nm>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-gantt-row.is-selected>.nm{color:var(--text-primary)}
.lv-gantt-ph{display:block;margin:var(--sp-12) 0 var(--sp-4);font-size:var(--fs-labelXS);line-height:var(--lh-labelXS);font-weight:600;
 letter-spacing:.08em;text-transform:uppercase;color:var(--text-tertiary)}   /* color de fase por estilo inline */
.lv-gantt-ph{transition:opacity var(--motion-fast)}
/* grupo de fase (.lv-gantt-ph + sus filas): al pasar por una barra, su fase se enciende y el resto se atenúa */
.lv-gantt-group{transition:opacity var(--motion-fast)}
.lv-gantt:has(.lv-gantt-bar:hover) .lv-gantt-group:not(:has(.lv-gantt-bar:hover)),
.lv-gantt:has(.lv-gantt-bar.is-active) .lv-gantt-group:not(:has(.lv-gantt-bar.is-active)){opacity:.45}
.lv-gantt-group:has(.lv-gantt-bar:hover)>.lv-gantt-ph,.lv-gantt-group:has(.lv-gantt-bar.is-active)>.lv-gantt-ph{
 text-shadow:0 0 12px currentColor}
.lv-gantt-row:has(.lv-gantt-bar:hover)>.nm,.lv-gantt-row:has(.lv-gantt-bar.is-active)>.nm{color:var(--text-primary)}
.lv-gantt-row:has(.lv-gantt-bar:hover)>.nm>b,.lv-gantt-row:has(.lv-gantt-bar.is-active)>.nm>b{color:var(--text-secondary)}
/* pista con rejilla: una línea por unidad (--n) */
.lv-gantt-track{position:relative;height:100%;border-radius:var(--r-xs);
 background-image:linear-gradient(to right,var(--border-subtle) 1px,transparent 1px);background-size:calc(100%/var(--n,36)) 100%}
.lv-gantt-track.is-plain{background:none}
.lv-gantt-selrow{position:absolute;left:0;right:0;background:color-mix(in srgb,var(--text-primary) 4%,transparent);pointer-events:none}
/* barra: color de fase inline; .85 en reposo, 1 al pasar, aro al arrastrar o elegida */
.lv-gantt-bar{position:absolute;top:50%;transform:translateY(-50%);height:16px;min-width:8px;border-radius:var(--r-md);
 cursor:grab;opacity:.85;touch-action:none;transition:opacity var(--motion-fast),box-shadow var(--motion-fast)}
.lv-gantt-bar:hover{opacity:1}
/* Mientras se arrastra manda el DOM: sin transiciones que persigan al puntero, y el
   cursor de agarre en toda la pieza (Pedro, 17 sep 2026). */
.lv-gantt.is-dragging,.lv-gantt.is-dragging *{cursor:grabbing !important;user-select:none}
.lv-gantt.is-dragging .lv-gantt-bar{transition:none}
.lv-gantt-bar.is-active,.lv-gantt-bar.is-selected{opacity:1;box-shadow:0 0 0 2px var(--bg-base),0 0 0 3px var(--border-focus)}
.lv-gantt-bar.is-active{cursor:grabbing}
.lv-gantt-bar--lg{height:24px}
.lv-gantt-bar--sm{height:12px}
/* relleno de progreso: color pleno sobre la pista al 75 % */
.lv-gantt-bar>.fill{position:absolute;inset:0 auto 0 0;border-radius:inherit;pointer-events:none}
/* etiqueta dentro (nombre) o fuera (rango de semanas) */
.lv-gantt-bar>.t{position:relative;z-index:1;display:flex;align-items:center;height:100%;padding:0 var(--sp-8);
 font-size:var(--fs-labelS);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}
.lv-gantt-bar>u{position:absolute;left:100%;top:50%;transform:translateY(-50%);margin-left:var(--sp-6);font-size:var(--fs-labelXS);
 font-weight:500;text-decoration:none;color:var(--text-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;pointer-events:none}
.lv-gantt-bar:hover>u,.lv-gantt-bar.is-active>u{color:var(--text-primary)}
.lv-gantt-bar>u.ll{left:auto;right:100%;margin-left:0;margin-right:var(--sp-6)}
/* Una barra que ocupa la pista entera no deja sitio fuera por ninguno de los dos
   lados: la etiqueta entra DENTRO, contra su extremo. Sin esto se salía de la
   pista y caía encima del nombre del servicio (24 sep 2026). */
.lv-gantt-bar>u.in{left:auto;right:0;margin:0 var(--sp-8) 0 0;color:#fff;mix-blend-mode:normal}
.lv-gantt-bar.is-opt>u.in{color:var(--text-primary)}
/* asas: 14 de golpe y nunca mas del 40 % de la barra —si no, una barra de un dia es toda
   asa y no se puede mover (Pedro, 17 sep 2026)—; una raya que aparece al pasar. */
.lv-gantt-bar>.h{position:absolute;top:-6px;bottom:-6px;width:min(14px,40%);cursor:ew-resize;z-index:2;touch-action:none}
.lv-gantt-bar>.h.l{left:-5px}
.lv-gantt-bar>.h.r{right:-5px}
.lv-gantt-bar>.h::after{content:"";position:absolute;top:8px;bottom:8px;width:2px;border-radius:1px;left:5px;
 background:rgba(255,255,255,.6);opacity:0;transition:opacity var(--motion-fast)}
.lv-gantt-bar:hover>.h::after,.lv-gantt-bar.is-active>.h::after{opacity:1}
/* marcador de hoy: línea magenta con punto arriba */
.lv-gantt-today{position:absolute;top:0;bottom:0;width:1px;background:color-mix(in srgb,var(--brand-primary) 70%,transparent);pointer-events:none;z-index:1}
.lv-gantt-today::before{content:"";position:absolute;top:0;left:-3px;width:7px;height:7px;border-radius:var(--r-full);background:var(--brand-primary)}
/* conectores de dependencia (svg) */
.lv-gantt-dep{stroke:color-mix(in srgb,var(--text-muted) 50%,transparent);fill:none;stroke-width:1.5}
.lv-gantt-dep-arrow{fill:color-mix(in srgb,var(--text-muted) 70%,transparent)}
/* resumen bajo la regla («Semanas 1–24 · 24 semanas · 5 ene → 21 jun») */
.lv-gantt-meta{font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);font-variant-numeric:tabular-nums}

/* ══ tooltip ═════════════════════════════════════════════════════════════
   Una sola burbuja para toda la casa (6 sep 2026). Sustituye al title nativo del
   navegador: livit-controls.js (generadores, biblia) y TitleTooltips.tsx (Kore)
   convierten cada [title] en esta burbuja; <Tooltip> de Kore la usa para
   contenido rico. Sin flecha (plana, como los popovers), superficie modal,
   Inter 12/16, esquinas 8, aparece a los 300 ms y sigue al lado libre. */
.lv-tip{position:fixed;z-index:9999;pointer-events:none;max-width:260px;padding:var(--sp-6) var(--sp-10);
 border-radius:var(--r-lg);background:var(--surface-modal);color:var(--text-primary);
 border:1px solid var(--border-subtle);box-shadow:var(--shadow-modal);
 font-family:var(--font-ui);font-size:var(--fs-labelM);line-height:var(--lh-labelM);font-weight:400;letter-spacing:.01em;
 text-wrap:balance;opacity:0;transform:translateY(2px) scale(.98);
 transition:opacity var(--motion-fast),transform var(--motion-fast)}
.lv-tip[data-side="bottom"]{transform:translateY(-2px) scale(.98)}
.lv-tip[data-side="left"]{transform:translateX(2px) scale(.98)}
.lv-tip[data-side="right"]{transform:translateX(-2px) scale(.98)}
.lv-tip.is-shown{opacity:1;transform:none}
.lv-tip>.lv-kbd{margin-left:var(--sp-8);height:18px;font-size:var(--fs-labelXS)}
.lv-tip b{font-weight:600}

/* ══ carta de herramienta · la base ═══════════════════════════════════════
   Sólo la estructura: cuadrado, columna, nombre y foco. El color lo pone
   siempre .lv-toolcard--tipo (más abajo). La carta pastel de cuatro familias
   (25 sep 2026) se retiró el 29 sep 2026 con los --pastel-* que la pintaban. */
.lv-toolcard{position:relative;aspect-ratio:1/1;border:0;display:flex;flex-direction:column;align-items:flex-start;
 font-family:var(--font-ui);text-align:left;cursor:pointer}
.lv-toolcard>svg{flex:0 0 auto;stroke:currentColor;fill:none}

/* ══ tipología · el color de una herramienta ═══════════════════════════════
   29 sep 2026 (Project Toolkit, aprobado por Pedro). Nueve tipologías (Culinaria
   entró el mismo día). [data-tipo="…"] pone en
   el elemento cinco tonos derivados de --tipo-*: --tipo (el puro), --tipo-bg
   (pastel en claro, hundido en oscuro), --tipo-ink (tinta sobre --tipo-bg),
   --tipo-line (filete) y --tipo-glyph (nombre e icono sobre la superficie).
   Los amarillos tienen receta propia: hundidos en el neutro salen oliva y como
   texto sobre blanco no se leen. */
[data-tipo]{--tipo-bg:color-mix(in srgb,var(--tipo) 36%,var(--neutral-900));--tipo-ink:color-mix(in srgb,var(--tipo) 28%,var(--neutral-50));
 --tipo-line:color-mix(in srgb,var(--tipo) 60%,var(--neutral-400));--tipo-glyph:color-mix(in srgb,var(--tipo) 45%,var(--neutral-50))}
[data-theme="light"] [data-tipo],[data-theme="light"][data-tipo]{--tipo-bg:color-mix(in srgb,var(--tipo) 24%,var(--neutral-0));--tipo-ink:var(--brand-950);
 --tipo-line:color-mix(in srgb,var(--tipo) 70%,var(--neutral-0));--tipo-glyph:color-mix(in srgb,var(--tipo) 80%,var(--neutral-950))}
[data-tipo="analisis"]{--tipo:var(--tipo-analisis)}
[data-tipo="estrategia"]{--tipo:var(--tipo-estrategia)}
[data-tipo="posicionamiento"]{--tipo:var(--tipo-posicionamiento)}
[data-tipo="diseno"]{--tipo:var(--tipo-diseno)}
[data-tipo="culinaria"]{--tipo:var(--tipo-culinaria)}
[data-tipo="flujos"]{--tipo:var(--tipo-flujos)}
[data-tipo="catalogo"]{--tipo:var(--tipo-catalogo)}
[data-tipo="comercial"]{--tipo:var(--tipo-comercial)}
[data-tipo="otros"]{--tipo:var(--tipo-otros)}
/* Los dos tonos amarillos del haz (desde el 7 oct 2026, Estrategia y Posicionamiento):
   fondo hacia el ciruela y tinta más clara, o el amarillo se ensucia. */
[data-tipo="estrategia"],[data-tipo="posicionamiento"]{--tipo-bg:color-mix(in srgb,var(--tipo) 34%,var(--brand-950));--tipo-ink:color-mix(in srgb,var(--tipo) 60%,var(--neutral-50))}
[data-theme="light"] :is([data-tipo="estrategia"],[data-tipo="posicionamiento"]){--tipo-bg:color-mix(in srgb,var(--tipo) 28%,var(--neutral-0));
 --tipo-ink:var(--brand-950);--tipo-glyph:color-mix(in srgb,var(--tipo) 45%,var(--neutral-950))}
/* El punto de tipología: en chips, filas y leyendas. */
.lv-tipo-dot{display:inline-block;width:8px;height:8px;border-radius:3px;flex:0 0 auto;background:var(--tipo)}

/* ══ carta de herramienta por tipología (.lv-toolcard--tipo) ══════════════
   29 sep 2026. La carta del Toolkit y, desde su tanda, del panel de la
   subfase. En reposo es superficie de Kore con filete interior; nombre ABAJO
   e icono ARRIBA a la derecha, los dos en el color de su tipología. Al pasar
   se pinta del pastel de la tipología (en lugar del filete) y le sale detrás
   un halo oscuro uniforme; no se mueve (30 sep). Talla: 120–125 de lado, huecos de 16.
   Estados: .is-new (asterisco arriba a la izquierda, 30 días), foco, .is-opening
   (pulsada, 97 %, el icono pasa a spinner) y --locked (anunciada sin
   desarrollar: discontinuo + candado, no responde). --used (6 oct 2026): ya está en la
   presentación; apagada como la bloqueada, con check y etiqueta «En uso». */
.lv-toolcards--tipo{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:var(--sp-16)}
.lv-toolcards--tipo.is-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.lv-toolcards--tipo.is-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.lv-toolcard--tipo{justify-content:flex-end;padding:var(--sp-12);border-radius:22px;
 background:var(--surface-default);color:var(--tipo-glyph);
 box-shadow:inset 0 0 0 1.5px var(--tipo-line),var(--shadow-card);
 transition:background var(--motion-standard),color var(--motion-standard),box-shadow var(--motion-standard),transform var(--motion-fast)}
.lv-toolcard--tipo>b{font-family:var(--font-canvas);font-size:var(--fs-titleS);line-height:1.25;font-weight:500;letter-spacing:-.005em}
.lv-toolcard--tipo>svg{position:absolute;top:var(--sp-12);right:var(--sp-12);width:28px;height:28px;stroke-width:1.6;color:var(--tipo-glyph);
 transition:color var(--motion-standard)}
/* Al pasar (Pedro, 30 sep 2026): la carta NO se mueve y el halo es OSCURO
   —una sombra uniforme alrededor que la despega del fondo— en vez del
   resplandor de su color, que se confundía con el pastel del relleno. */
.lv-toolcard--tipo{--tc-halo:color-mix(in srgb,var(--neutral-1000) 62%,transparent)}
[data-theme="light"] .lv-toolcard--tipo{--tc-halo:color-mix(in srgb,var(--neutral-1000) 26%,transparent)}
.lv-toolcard--tipo:hover{background:var(--tipo-bg);color:var(--tipo-ink);
 box-shadow:0 0 0 1px color-mix(in srgb,var(--tipo) 22%,transparent),0 0 26px 4px var(--tc-halo)}
.lv-toolcard--tipo:hover>svg{color:var(--tipo-ink)}
.lv-toolcard--tipo:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}
.lv-toolcard--tipo.is-opening{background:var(--tipo-bg);color:var(--tipo-ink);transform:scale(.97);box-shadow:none;pointer-events:none}
.lv-toolcard--tipo.is-opening>svg{color:var(--tipo-ink);animation:lv-spin 1s linear infinite}
.lv-toolcard--tipo>.lv-toolcard-new{position:absolute;top:var(--sp-12);left:var(--sp-12);right:auto;width:16px;height:16px;stroke-width:2.6}
.lv-toolcard--tipo.lv-toolcard--locked{background:none;box-shadow:none;border:1.5px dashed var(--border-default);color:var(--text-muted);cursor:default}
.lv-toolcard--tipo.lv-toolcard--locked>svg{color:var(--text-disabled)}
.lv-toolcard--tipo.lv-toolcard--locked>.lv-toolcard-lock{position:absolute;top:var(--sp-12);left:var(--sp-12);right:auto;width:14px;height:14px;color:var(--text-muted)}
.lv-toolcard--tipo.lv-toolcard--locked:hover{transform:none;background:none;box-shadow:none;color:var(--text-muted)}
/* EN USO (Pedro, 6 oct 2026): una herramienta entra una sola vez en cada
   presentación, así que la que ya está se apaga como la bloqueada —discontinua,
   no responde— pero con el filete y el check en el color de su tipología. */
.lv-toolcard--tipo.lv-toolcard--used{background:none;box-shadow:none;border:1.5px dashed var(--tipo-line);color:var(--text-muted);cursor:default}
.lv-toolcard--tipo.lv-toolcard--used>svg{color:var(--text-disabled)}
.lv-toolcard--tipo.lv-toolcard--used>.lv-toolcard-lock{position:absolute;top:var(--sp-12);left:var(--sp-12);right:auto;width:14px;height:14px;color:var(--tipo)}
.lv-toolcard--tipo.lv-toolcard--used:hover{transform:none;background:none;box-shadow:none;color:var(--text-muted)}
.lv-toolcard--tipo>.lv-toolcard-uso{font-family:var(--font-ui);font-size:var(--fs-labelXS);line-height:var(--lh-labelXS);font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--tipo);margin-bottom:var(--sp-4)}
@keyframes lv-spin{to{transform:rotate(360deg)}}

/* ══ miniatura de presentación · siglas y color ═══════════════════════════
   29 sep 2026. Cuadrado de 44 con dos siglas en DM Sans. El color es DATO de
   la presentación (lo elige quien la crea, como el de una marca), así que
   llega en línea como --c; la tinta --ci la calcula quien pinta por
   contraste (--brand-950 sobre claros, --neutral-0 sobre oscuros). --sm: 32,
   para listas de elección. */
.lv-sigla{position:relative;display:grid;place-items:center;flex:0 0 auto;width:44px;height:44px;border-radius:var(--r-lg);
 background:var(--c,var(--surface-raised));color:var(--ci,var(--text-primary));border:0;
 font-family:var(--font-canvas);font-size:17px;line-height:1;font-weight:500;letter-spacing:-.01em;text-transform:uppercase}
button.lv-sigla{cursor:pointer;transition:box-shadow var(--motion-fast)}
button.lv-sigla:hover{box-shadow:0 0 0 2px var(--border-accent)}
.lv-sigla--sm{width:32px;height:32px;border-radius:var(--r-md);font-size:13px}
/* --md: 36, la de una fila de tabla de 56 (lista del Toolkit, 13 oct 2026). */
.lv-sigla--md{width:36px;height:36px;border-radius:var(--r-lg);font-size:14px}

/* ══ avatar y pila de avatares ════════════════════════════════════════════
   6 sep 2026. Un solo dibujo: círculo neutro (superficie elevada, iniciales
   600 en secundario, filete sutil) o foto; --me tiñe al usuario actual. Tallas
   de la escala: 28 (xs) · 32 (sm) · 38 (md). Antes había 28/32/36/40 y dos
   esquemas de color (neutro en el equipo, tinte en el usuario y el boletín). */
.lv-avatar{--av-s:32px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;overflow:hidden;
 width:var(--av-s);height:var(--av-s);border-radius:var(--r-full);background:var(--surface-raised);
 border:1px solid var(--border-subtle);color:var(--text-secondary);
 font-family:var(--font-ui);font-size:var(--fs-labelS);line-height:1;font-weight:600;letter-spacing:.02em;text-transform:uppercase;
 user-select:none}
.lv-avatar>img{width:100%;height:100%;object-fit:cover;display:block}
.lv-avatar--xs{--av-s:var(--ctl-xs);font-size:var(--fs-labelXS)}
.lv-avatar--md{--av-s:var(--ctl-md);font-size:var(--fs-labelL)}
.lv-avatar--me{background:var(--brand-primary-subtle);color:var(--text-accent);border-color:color-mix(in srgb,var(--brand-primary) 35%,transparent)}
/* Sin foto: un tono de la casa elegido por el nombre (hash → 1..6), estable para la misma
   persona en todas partes, para distinguir a golpe de vista (Pedro, 6 sep 2026). Son los
   pares fondo tenue / texto de la paleta de estado y marca: engamados y con contraste en
   ambos temas. --me manda sobre el tono. */
.lv-avatar[data-hue="1"]{background:var(--brand-primary-subtle);color:var(--text-accent);border-color:color-mix(in srgb,var(--brand-primary) 30%,transparent)}
.lv-avatar[data-hue="2"]{background:var(--status-info-bg);color:var(--status-info-text);border-color:color-mix(in srgb,var(--status-info) 35%,transparent)}
.lv-avatar[data-hue="3"]{background:var(--status-success-bg);color:var(--status-success-text);border-color:color-mix(in srgb,var(--status-success) 35%,transparent)}
.lv-avatar[data-hue="4"]{background:var(--status-warning-bg);color:var(--status-warning-text);border-color:color-mix(in srgb,var(--status-warning) 35%,transparent)}
.lv-avatar[data-hue="5"]{background:var(--status-error-bg);color:var(--status-error-text);border-color:color-mix(in srgb,var(--status-error) 35%,transparent)}
.lv-avatar[data-hue="6"]{background:var(--role-account-leader-bg);color:var(--text-accent);border-color:color-mix(in srgb,var(--brand-primary) 45%,transparent)}
.lv-avatar--me[data-hue]{background:var(--brand-primary-subtle);color:var(--text-accent);border-color:color-mix(in srgb,var(--brand-primary) 35%,transparent)}
/* DENTRO AHORA (29 sep 2026): el borde en verde, por DENTRO del avatar, con un
   hueco del color de la superficie. Por dentro porque la pila muerde cada
   avatar con el anterior y un punto o un anillo exterior se cortaban; así se
   ve entero esté delante o detrás. Quien está dentro va primero en la pila. */
.lv-avatar.is-here,.lv-avatar.is-here[data-hue]{border:2px solid var(--status-success);box-shadow:inset 0 0 0 1.5px var(--av-gap,var(--surface-default))}
/* como botón (menú de usuario): hover sube la sombra, foco anillo */
button.lv-avatar{cursor:pointer;transition:box-shadow var(--motion-fast),border-color var(--motion-fast)}
button.lv-avatar:hover{box-shadow:var(--shadow-card);border-color:var(--border-strong)}
button.lv-avatar:focus-visible{outline:none;box-shadow:0 0 0 2px var(--bg-base),0 0 0 4px var(--border-focus)}
/* Pila: solape 8 y una separacion de 2 entre discos; «+N» en mono.
   La separacion no se pinta, se RECORTA (Pedro, 25 sep 2026). Antes era un
   anillo de --bg-base, el fondo de la pagina, que solo desaparecia si la pila
   estaba sobre la pagina: encima de una carta, de la barra o de un popover
   se veia como un filete oscuro rodeando a cada persona. Ahora cada disco se
   muerde por donde lo pisa el anterior -un circulo transparente del tamano
   del vecino mas 2- y por ese mordisco se ve el fondo que haya, sea el que
   sea, tambien una foto o un degradado. Nada que mantener al cambiar de
   superficie. La geometria sale de la talla (--av-s) y del solape (--av-o):
   el vecino tiene su centro a --av-o menos medio disco. Al enfocar se quita
   el recorte, que si no se comeria el anillo de foco. */
.lv-avatars{--av-o:8px;display:inline-flex;align-items:center;flex:0 0 auto}
.lv-avatars--tight{--av-o:10px}
.lv-avatars>.lv-avatar{margin-left:calc(-1 * var(--av-o))}
.lv-avatars>.lv-avatar:first-child{margin-left:0}
.lv-avatars>.lv-avatar:not(:first-child){
 -webkit-mask:radial-gradient(circle calc(var(--av-s) / 2 + 2px) at calc(var(--av-o) - var(--av-s) / 2) 50%,transparent 98%,#000 100%);
 mask:radial-gradient(circle calc(var(--av-s) / 2 + 2px) at calc(var(--av-o) - var(--av-s) / 2) 50%,transparent 98%,#000 100%)}
.lv-avatars>.lv-avatar:focus-visible{-webkit-mask:none;mask:none}
.lv-avatars>.lv-avatar.more{font-variant-numeric:tabular-nums;font-weight:500;text-transform:none;letter-spacing:0;color:var(--text-muted)}

/* ══ rejilla de emojis ═══════════════════════════════════════════════════
   6 sep 2026. Popover .lv-pop con buscador, pestañas de categoría (las nueve
   del teclado estándar Unicode + Recientes), y un cuerpo con scroll de altura
   fija: 8 columnas de celdas de 32, ~6 filas visibles, cabecera de grupo
   pegada arriba. Datos: 01-sistema/livit-emoji.json (1.898 emojis, sin
   variantes de tono de piel), copiado a public/styles/ por gen_kore_theme.py. */
.lv-pop--emoji{left:auto;right:0;top:100%;width:300px;padding:var(--sp-8)}   /* debajo del disparador; .is-up para abrir hacia arriba */
.lv-pop--emoji .lv-pop-search{padding:0 0 var(--sp-6);margin-bottom:var(--sp-6)}
.lv-emoji-tabs{display:flex;gap:2px;padding-bottom:var(--sp-6);margin-bottom:var(--sp-4);border-bottom:1px solid var(--border-subtle)}
.lv-emoji-tabs>button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:var(--ctl-xs);flex:1;
 border-radius:var(--r-md);font-size:15px;line-height:1;cursor:pointer;background:none;border:0;opacity:.7;
 transition:background var(--motion-fast),opacity var(--motion-fast)}
.lv-emoji-tabs>button:hover{background:color-mix(in srgb,var(--text-primary) 8%,transparent);opacity:1}
.lv-emoji-tabs>button.is-on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);opacity:1}
.lv-emoji-tabs>button svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round;color:var(--text-muted)}
.lv-emoji-body{height:232px;overflow-y:auto;overflow-x:hidden;scroll-behavior:smooth;padding-right:2px}
.lv-emoji-h{position:sticky;top:0;z-index:1;display:block;padding:var(--sp-6) var(--sp-4) var(--sp-4);
 background:var(--surface-raised);font-size:var(--fs-labelXS);line-height:var(--lh-labelXS);font-weight:600;letter-spacing:.08em;
 text-transform:uppercase;color:var(--text-tertiary)}
.lv-emoji-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px;padding-bottom:var(--sp-6)}
.lv-emoji{display:flex;align-items:center;justify-content:center;width:var(--ctl-sm);height:var(--ctl-sm);border-radius:var(--r-lg);
 font-size:18px;line-height:1;cursor:pointer;background:none;border:0;padding:0;
 font-family:"Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji",sans-serif;transition:background var(--motion-fast),transform var(--motion-fast)}
.lv-emoji:hover{background:color-mix(in srgb,var(--text-primary) 8%,transparent);transform:scale(1.15)}
.lv-emoji:focus-visible{outline:none;box-shadow:0 0 0 2px var(--border-focus)}
.lv-emoji-empty{padding:var(--sp-16) var(--sp-8);text-align:center;font-size:var(--fs-bodyS);color:var(--text-muted)}

/* ══ selector de plantilla con miniatura (tile) ═════════════════════════════
   6 sep 2026. Elegir una opción entre pocas viendo cómo queda: plantilla del
   Statement, disposición de imagen en Benefits, plantilla de Personality, portada
   y contraportada del SOW (.cvopt). No es una pieza aislada: es el CHIP con
   imagen — mismo estado activo que chips y segmentado (tinte magenta 14 %,
   filete 55 %), radio 8 (lleva imagen dentro, como un campo), miniatura con el
   marco de un campo (fondo hundido, filete sutil). */
.lv-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-8)}
.lv-tiles--flow{display:flex;flex-wrap:wrap;gap:var(--sp-12)}
.lv-tile{display:flex;flex-direction:column;align-items:stretch;gap:var(--sp-6);padding:var(--sp-6);min-width:0;
 border-radius:var(--r-lg);border:1px solid var(--border-default);background:transparent;color:var(--text-muted);
 cursor:pointer;text-align:center;font-family:var(--font-ui);font-size:var(--fs-labelS);line-height:var(--lh-labelS);font-weight:500;
 transition:border-color var(--motion-fast),background var(--motion-fast),color var(--motion-fast)}
.lv-tile:hover{border-color:var(--border-strong);color:var(--text-secondary)}
.lv-tile.is-on,.lv-tile.on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);
 border-color:color-mix(in srgb,var(--brand-primary) 55%,transparent);color:var(--text-primary)}
.lv-tile:focus-visible{outline:none;box-shadow:0 0 0 2px var(--bg-base),0 0 0 4px var(--border-focus)}
.lv-tile>em,.lv-tile>.t{display:block;font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* miniatura: marco de campo; dentro un esquema (bloques .m y líneas i) o una imagen */
.lv-tile-thumb{display:flex;width:100%;height:36px;border-radius:var(--r-sm);border:1px solid var(--border-subtle);
 background:var(--bg-default);overflow:hidden;position:relative}
/* ESQUEMA (--schema): solo entonces .m / i / .dot / .rail / svg se estilan como dibujo. Una miniatura
   de página (--auto) renderiza HTML real dentro y no se toca: estilar <i> o <svg> ahí rompía las
   portadas (una raya blanca donde iba una cursiva; Pedro, 6 sep 2026). */
.lv-tile-thumb--schema .m,.lv-tile-thumb--schema.m{background:var(--surface-raised)}
.lv-tile-thumb--schema i{display:block;height:4px;border-radius:2px;background:color-mix(in srgb,var(--text-primary) 80%,transparent)}
.lv-tile-thumb--auto{height:auto;display:block;background:none;border:0;border-radius:var(--r-xs);overflow:visible;
 text-align:left;font-size:16px;font-weight:400;line-height:normal;letter-spacing:0}   /* el HTML de la página no hereda la tipografía del tile */
.lv-tile.is-on .lv-tile-thumb,.lv-tile.on .lv-tile-thumb{border-color:color-mix(in srgb,var(--brand-primary) 35%,transparent)}
/* Miniaturas de página (portadas del SOW y del Deck): al pasar se amplían por encima de las
   vecinas (--zoom por herramienta: 1,6 en el SOW, 1,3 en el Deck) y vuelven al salir. */
/* Zoom de miniatura, suave (Pedro, 6 sep 2026): la miniatura vive en su propia capa (will-change +
   translateZ) para que el escalado no repinte la página que lleva dentro; solo anima transform (la
   sombra aparece sin transición: animarla era lo que atascaba); posición y overflow fijos en reposo,
   no al pasar (cambiarlos en hover disparaba layout); 40 ms de espera para no saltar al cruzar tiles. */
.lv-tile--zoom{position:relative;overflow:visible}
.lv-tile--zoom .lv-tile-thumb--auto{transition:transform .2s cubic-bezier(.2,0,0,1) 40ms;transform-origin:center center;
 will-change:transform;transform:translateZ(0);backface-visibility:hidden;position:relative}
.lv-tile--zoom:hover{z-index:40}
.lv-tile--zoom:hover .lv-tile-thumb--auto{transform:translateZ(0) scale(var(--zoom,1.5));box-shadow:var(--shadow-lift);z-index:40}
@media(prefers-reduced-motion:reduce){.lv-tile--zoom:hover .lv-tile-thumb--auto{transform:none;box-shadow:none}}
/* Dentro de una miniatura de esquema solo hay grises: el magenta es el estado del tile, no un color
   del dibujo (Pedro, 6 sep 2026). Puntos y trazos usan el texto secundario. */
.lv-tile-thumb--schema .dot{background:var(--text-secondary)}
.lv-tile-thumb--schema svg{stroke:var(--text-secondary);fill:color-mix(in srgb,var(--text-primary) 10%,transparent)}
.lv-tile-thumb--schema .rail{background:color-mix(in srgb,var(--text-primary) 30%,transparent)}

/* ══ fila seleccionable de lista (nivel 2) ═════════════════════════════════
   6 sep 2026. La escalera de tres niveles, misma receta (tinte magenta), distinto
   énfasis: nivel 1 navegación (.lv-navrow: barra + texto magenta) · nivel 2 fila de
   lista (.lv-listrow: solo tinte 12 %, texto primario) · nivel 3 dos-a-cuatro opciones
   fijas (.lv-seg / .lv-chip / .lv-tile, nunca una lista). Nivel 2 responde a «qué
   elemento tengo abierto o estoy editando» dentro de un panel: fases del Tracking,
   historial del asistente, lista de proyectos, versiones (.lv-verrow es su variante
   de dos líneas), archivos, resultados. */
.lv-listrow{position:relative;display:flex;align-items:center;gap:var(--sp-8);min-height:36px;padding:0 var(--sp-10) 0 var(--sp-8);
 border-radius:var(--r-lg);color:var(--text-secondary);cursor:pointer;text-align:left;width:100%;
 transition:background var(--motion-fast),color var(--motion-fast)}
.lv-listrow>.body{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;padding:var(--sp-6) 0}
.lv-listrow .t{display:block;font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;color:var(--text-primary);
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-listrow .m{display:block;font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-listrow:hover,.lv-listrow.is-hover{background:color-mix(in srgb,var(--text-primary) 6%,transparent)}
.lv-listrow.is-on{background:color-mix(in srgb,var(--brand-primary) 12%,transparent)}
.lv-listrow.is-on .m{color:var(--text-secondary)}
.lv-listrow:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--border-focus)}
/* Fila con casilla (2 oct 2026): para marcar varias de una lista corta. La
   CASILLA lleva el estado; la fila no se tiñe al estar marcada, solo al pasar
   el raton. La no marcada baja el nombre a secundario. */
.lv-listrow--check{gap:var(--sp-12)}
.lv-listrow--check.is-on{background:transparent}
.lv-listrow--check.is-on:hover{background:color-mix(in srgb,var(--text-primary) 6%,transparent)}
.lv-listrow--check:not(.is-on) .t{color:var(--text-secondary);font-weight:400}
/* subfila: 32, peso normal, texto secundario */
.lv-listrow--sub{min-height:var(--ctl-sm)}
.lv-listrow--sub .t{font-weight:400;color:var(--text-secondary)}
.lv-listrow--sub.is-on .t{color:var(--text-primary)}
/* fila grande con columnas (lista de proyectos): 52, esquinas 12, título 15 */
.lv-listrow--lg{min-height:52px;padding:0 var(--sp-12);border-radius:var(--r-xl);gap:var(--sp-16)}
.lv-listrow--lg .t{font-size:15px;line-height:20px}
/* recién creada / destacada un instante: tinte suave + filete, sin resplandor */
.lv-listrow.is-new{background:color-mix(in srgb,var(--brand-primary) 8%,transparent);
 box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand-primary) 45%,transparent)}
/* en un bento (home) la fila va envuelta en tarjeta; no tiene estado elegido, se navega */
.lv-listrow--card{background:var(--surface-default);box-shadow:var(--shadow-card);border-radius:var(--r-xl);min-height:40px;padding:0 var(--sp-10)}
.lv-listrow--card:hover,.lv-listrow--card.is-hover{background:color-mix(in srgb,var(--surface-default) 100%,var(--text-primary) 6%)}
/* huecos: asa (aparece al pasar), chevron, meta a la derecha, acciones al pasar */
.lv-listrow-h{display:inline-flex;align-items:center;justify-content:center;width:14px;height:100%;flex:0 0 auto;color:var(--text-tertiary);
 cursor:grab;opacity:0;transition:opacity var(--motion-fast)}
.lv-listrow-h svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.75}
.lv-listrow:hover .lv-listrow-h,.lv-listrow.is-hover .lv-listrow-h,.lv-listrow-h:focus-visible{opacity:1}
.lv-listrow-h:active{cursor:grabbing}
.lv-listrow-chev{width:var(--ctl-xs);flex:0 0 auto}
.lv-listrow-meta{margin-left:auto;flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:var(--fs-labelS);color:var(--text-muted);font-variant-numeric:tabular-nums}
.lv-listrow-meta--text{font-family:var(--font-ui);font-size:var(--fs-bodyM)}
.lv-listrow-acts{display:flex;gap:2px;flex:0 0 auto;opacity:0;transition:opacity var(--motion-fast)}
.lv-listrow:hover .lv-listrow-acts,.lv-listrow.is-hover .lv-listrow-acts,.lv-listrow.is-on .lv-listrow-acts,.lv-listrow:focus-within .lv-listrow-acts{opacity:1}
/* Lista con columnas (Livit Projects): la fila se hace rejilla (--grid; las columnas son
   layout de la herramienta), la cabecera es la misma .lv-thead de la tabla de honorarios
   (--list la alinea con el padding de la fila) y .lv-list--lines pone un filete
   --border-subtle entre filas, metido al padding para no tocar las esquinas. */
/* La tabla de la casa (13 oct 2026, desde el admin): filas de 56, 32 entre columnas, 16 de margen,
   nombre 13/500 y dato 12 (.m). La cabecera, alineada con el mismo margen. */
.lv-listrow--grid{display:grid;column-gap:var(--sp-32);row-gap:0;min-height:56px;padding:0 var(--sp-16)}
.lv-listrow--grid .t{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500}
.lv-listrow--grid .m,.lv-listrow--grid .d{font-size:12px;line-height:16px}
.lv-listrow--grid .d{color:var(--text-muted)}
/* --quietacts: los iconos de fila (Comentarios · Presentar · Exportar · ···) apagados y encendidos
   al pasar por la fila: se ven siempre (regla «Presentar y exportar») sin pesar (13 oct 2026). */
.lv-listrow--quietacts .lv-iconbtn{color:var(--text-tertiary)}
.lv-listrow--quietacts:hover .lv-iconbtn,.lv-listrow--quietacts:focus-within .lv-iconbtn{color:var(--text-muted)}
.lv-listrow--quietacts .lv-iconbtn:hover{color:var(--text-primary)}
.lv-thead--list{column-gap:var(--sp-32);padding:0 var(--sp-16) var(--sp-12);align-items:center}
.lv-list--lines>.lv-listrow{position:relative}
.lv-list--lines>.lv-listrow:not(:last-child)::after{content:"";position:absolute;left:var(--sp-16);right:var(--sp-16);bottom:0;height:1px;background:var(--border-subtle)}
.lv-list--lines>.lv-listrow:hover::after,.lv-list--lines>.lv-listrow.is-on::after,.lv-list--lines>.lv-listrow.is-new::after{opacity:0}
/* Tira de iconos informativa (módulos de un proyecto): glifos desnudos, sin caja ni hover,
   porque no se pulsan (misma regla que el + y la × desnudos). Activo = texto secundario;
   ausente = --text-disabled, el mismo apagado que .lv-trow.is-off. Nombre por tooltip. */
.lv-icons{display:inline-flex;align-items:center;gap:var(--sp-8);flex:0 0 auto}
.lv-icons>span{display:inline-flex;width:var(--sp-20);height:var(--sp-20);align-items:center;justify-content:center;color:var(--text-secondary)}
.lv-icons>span>svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.75}
.lv-icons>span.is-off{color:var(--text-disabled);opacity:.55}
.lv-icons--sm>span{width:var(--sp-16);height:var(--sp-16)} .lv-icons--sm>span>svg{width:14px;height:14px}
/* Tarjeta arrastrable de la librería de bloques. Cuadrado de 100 (--r-2xl 16: tarjeta dentro
   de un panel de 24), superficie un paso sobre la base, icono 24 y nombre 13 500 en caja fija
   de dos líneas; asa ⣿ arriba a la derecha que sube al pasar. Se arrastra o se pulsa.
   Estados (uno por tarjeta): is-used ya en el lienzo (check magenta, .5, no se arrastra) ·
   is-dev en desarrollo (filete discontinuo, apagado, marca, no se pulsa) · is-new recién
   publicada (la receta «recién creada»: tinte 8 % + filete 45 % + punto magenta de «no visto», el mismo de la campana;
   no un destello: eso ya significa IA). La marca .lv-blockcard-tag va arriba a la izquierda; el texto va por tooltip. */
.lv-blockcard{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-8);
 width:100%;height:100px;padding:0 var(--sp-12);border-radius:var(--r-2xl);border:1px solid var(--border-subtle);
 background:var(--surface-default);color:var(--text-primary);cursor:grab;text-align:center;font:inherit;
 transition:border-color var(--motion-fast),box-shadow var(--motion-fast),transform var(--motion-fast),background var(--motion-fast)}
.lv-blockcard:hover,.lv-blockcard.is-hover{border-color:color-mix(in srgb,var(--brand-primary) 40%,transparent);box-shadow:var(--shadow-lift)}   /* sin desplazamiento (7 sep) */
.lv-blockcard:active{cursor:grabbing;transform:none}
.lv-blockcard:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 20%,transparent);border-color:var(--border-focus)}
.lv-blockcard>.ic{display:inline-flex;color:var(--text-secondary);transition:color var(--motion-fast)}
.lv-blockcard>.ic>svg,.lv-blockcard>svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:1.75}
.lv-blockcard:hover>.ic,.lv-blockcard.is-hover>.ic{color:var(--text-primary)}
.lv-blockcard>.t{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--fs-bodyM);line-height:16px;font-weight:500;
 overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.lv-blockcard-h{position:absolute;right:var(--sp-8);top:var(--sp-8);color:var(--text-tertiary);opacity:.6;transition:opacity var(--motion-fast)}
.lv-blockcard-h svg{width:16px;height:16px}
.lv-blockcard:hover .lv-blockcard-h{opacity:1}
.lv-blockcard-tag{position:absolute;left:var(--sp-8);top:var(--sp-8);display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;
 color:var(--text-muted)}   /* marca de estado: un icono de 14, sin texto (el nombre va por tooltip) */
.lv-blockcard-tag svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.75}
.lv-blockcard.is-used{cursor:default;opacity:.5;background:transparent}
.lv-blockcard.is-used:hover{border-color:var(--border-subtle);box-shadow:none;transform:none}
.lv-blockcard.is-used>.ic,.lv-blockcard.is-used:hover>.ic{color:var(--text-muted)}
.lv-blockcard.is-used .lv-blockcard-h{color:var(--text-accent);opacity:1}
.lv-blockcard.is-dev,.lv-blockcard:disabled{cursor:not-allowed;border-style:dashed;background:transparent;color:var(--text-disabled)}
.lv-blockcard.is-dev:hover,.lv-blockcard:disabled:hover{border-color:var(--border-subtle);box-shadow:none;transform:none}
.lv-blockcard.is-dev>.ic,.lv-blockcard.is-dev:hover>.ic{color:var(--text-disabled)}
.lv-blockcard.is-dev .lv-blockcard-h{display:none}
.lv-blockcard.is-new{background:color-mix(in srgb,var(--brand-primary) 8%,transparent);border-color:color-mix(in srgb,var(--brand-primary) 45%,transparent)}
.lv-blockcard.is-new .lv-blockcard-tag{color:var(--text-accent)}
.lv-blockcard-dot{display:block;width:8px;height:8px;border-radius:50%;background:var(--brand-primary)}   /* «no visto»: alias de .lv-dot */
.lv-blockcard.is-dev .lv-blockcard-tag{color:var(--text-disabled)}
.lv-blockcard.is-dragging{opacity:.4}
/* Botón AI Chat (Pedro, 6 sep 2026): el único botón redondo con el brand beam en el chrome
   —segunda excepción sancionada al «beam solo en canvas», junto a la cita del día—. Disco de
   38 con el beam en su tramo cálido (brand-700 → magenta → --beam-6 → oro), icono blanco 20 (dos
   estrellas de cuatro puntas rellenas). Al pasar aparece la aurora: halo cónico difuso de 7 px detrás; el disco no se mueve. Pulsado:
   aura recogida y brillo .92. Sin texto: el nombre va por tooltip. Uno por vista, en la cabecera. */
.lv-btn--ai{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:var(--ctl-md);height:var(--ctl-md);
 padding:0;border:0;border-radius:var(--r-full);cursor:pointer;color:#fff;font:inherit;
 background:linear-gradient(120deg,var(--brand-700) 0%,var(--brand-primary) 40%,var(--beam-6) 78%,var(--gold) 100%);background-size:160% 160%;background-position:100% 50%;
 box-shadow:0 6px 18px -6px color-mix(in srgb,var(--beam-5) 50%,transparent);
 transition:box-shadow var(--motion-fast),filter var(--motion-fast)}
.lv-btn--ai>svg{position:relative;z-index:1;width:20px;height:20px;fill:currentColor;stroke:none}   /* dos estrellas rellenas, blancas */
.lv-btn--ai::before{content:"";position:absolute;inset:-5px;border-radius:inherit;z-index:0;filter:blur(8px);opacity:0;
 background:conic-gradient(from 200deg,var(--brand-700),var(--brand-primary),var(--beam-6),var(--gold),var(--brand-primary),var(--brand-700));
 transition:opacity var(--motion-fast),inset var(--motion-fast)}
.lv-btn--ai::after{content:"";position:absolute;inset:0;border-radius:inherit;z-index:0;background:inherit}
.lv-btn--ai:hover::before,.lv-btn--ai.is-hover::before{opacity:.9;inset:-7px}
.lv-btn--ai:active,.lv-btn--ai.is-active{filter:brightness(.92)}
.lv-btn--ai:active::before,.lv-btn--ai.is-active::before{opacity:.5;inset:-4px}
.lv-btn--ai:focus-visible{outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 30%,transparent)}
/* Apagado (30 sep 2026): la receta de .lv-btn[disabled], sin degradado ni halo. */
.lv-btn--ai:disabled{background:color-mix(in srgb,var(--text-primary) calc(var(--state-disabled-surface)*100%),transparent);color:var(--text-disabled);box-shadow:none;cursor:not-allowed}
.lv-btn--ai:disabled::before,.lv-btn--ai:disabled::after{display:none}
/* Pestañas con subrayado: la fila de navegación (nivel 1) puesta en horizontal. Misma receta
   que .lv-navrow —texto 13, apagado en reposo, primario al pasar, MAGENTA + barra de 2 px cuando
   es la activa— pero sin tinte de fondo (una pestaña es texto, no una caja) y con la barra
   debajo (.lv-navrow-bar girada). Para listas abiertas de secciones; ≤ 4 opciones fijas es un
   segmentado (nivel 3). La fila lleva un filete inferior --border-subtle; la barra lo pisa. */
.lv-tabs{display:flex;align-items:center;gap:var(--sp-24);min-width:0;border-bottom:1px solid var(--border-subtle)}
.lv-tabs--bare{border-bottom:0}
.lv-tab{position:relative;display:inline-flex;align-items:center;gap:var(--sp-6);flex:0 0 auto;min-height:var(--ctl-lg);padding:0;border:0;background:none;
 font:inherit;font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;color:var(--text-muted);white-space:nowrap;cursor:pointer;text-decoration:none;
 transition:color var(--motion-fast)}
.lv-tab:hover{color:var(--text-primary)}
.lv-tab.is-on,.lv-tab[aria-selected="true"]{color:var(--text-accent)}
.lv-tab.is-on::after,.lv-tab[aria-selected="true"]::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;border-radius:var(--r-full);background:var(--brand-primary)}
.lv-tab:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--border-focus);border-radius:var(--r-sm)}
.lv-tab:disabled,.lv-tab.is-off{color:var(--text-disabled);cursor:not-allowed}
.lv-tab>.n{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--sp-6);border-radius:var(--r-md);
 background:color-mix(in srgb,var(--text-primary) 8%,transparent);font-size:var(--fs-labelS);line-height:1;font-weight:500;color:var(--text-secondary);font-variant-numeric:tabular-nums}
.lv-tab.is-on>.n{color:var(--text-accent);background:color-mix(in srgb,var(--brand-primary) 14%,transparent)}
.lv-tab svg{width:16px;height:16px;flex:0 0 auto}
.lv-tabs--sm{gap:var(--sp-16)} .lv-tabs--sm .lv-tab{min-height:var(--ctl-md);font-size:var(--fs-labelM);line-height:var(--lh-labelM)}
/* Tarjeta de panel (grupo arrastrable de un panel de propiedades: un beneficio, un rasgo).
   Radio 8, fondo hundido --bg-default, filete --border-subtle, padding 8. Se arrastra por el
   asa (.lv-iconbtn[draggable]); al arrastrar .is-dragging .4. El destino NO se marca con el
   borde de la tarjeta entera: se marca con la LÍNEA DE INSERCIÓN (Pedro, 6 sep 2026). */
.lv-group{position:relative;border-radius:var(--r-lg);border:1px solid var(--border-subtle);background:var(--bg-default);padding:var(--sp-8)}
.lv-group.is-dragging{opacity:.4}
.lv-group .lv-iconbtn[draggable]{cursor:grab} .lv-group .lv-iconbtn[draggable]:active{cursor:grabbing}
.lv-group-n{font-variant-numeric:tabular-nums;font-size:var(--fs-labelXS);color:var(--text-muted);font-variant-numeric:tabular-nums}
/* Línea de inserción: 2 px magenta, pill, que cae EN EL HUECO entre dos elementos (a mitad del
   gap, --lv-gap, 8 por defecto). Como clases sobre el destino (.is-drop-before / .is-drop-after,
   valen en .lv-group, .lv-listrow y cualquier .lv-droppable) o como elemento suelto .lv-drop-line
   (para listas con sangría: TaskListColumn). Rótulo opcional .n: mono 10 600 versalitas sobre
   magenta (nunca menos de 10 px). */
.lv-group,.lv-listrow{--lv-gap:8px} .lv-droppable{--lv-gap:2px}
.is-drop-before::before,.is-drop-after::after{content:"";position:absolute;left:0;right:0;height:2px;border-radius:var(--r-full);background:var(--brand-primary);pointer-events:none;z-index:2}
.is-drop-before::before{top:calc(var(--lv-gap) / -2 - 1px)}
.is-drop-after::after{bottom:calc(var(--lv-gap) / -2 - 1px)}
/* La misma línea, de pie: en una REJILLA de cartas lo que se mueve va de izquierda a
   derecha, así que el hueco está a un lado y no arriba (.is-drop-left / .is-drop-right). */
.is-drop-left::before,.is-drop-right::after{content:"";position:absolute;top:0;bottom:0;width:2px;height:auto;border-radius:var(--r-full);background:var(--brand-primary);pointer-events:none;z-index:2}
.is-drop-left::before{left:calc(var(--lv-gap) / -2 - 1px)}
.is-drop-right::after{right:calc(var(--lv-gap) / -2 - 1px)}
.lv-drop-line{position:absolute;left:0;right:0;height:0;display:flex;align-items:center;gap:var(--sp-6);pointer-events:none;z-index:2}
.lv-drop-line::before{content:"";flex:1;height:2px;border-radius:var(--r-full);background:var(--brand-primary)}
.lv-drop-line>.n{flex:0 0 auto;height:16px;padding:0 var(--sp-6);border-radius:var(--r-full);background:var(--brand-primary);color:var(--text-on-accent);
 font-variant-numeric:tabular-nums;font-size:var(--fs-labelXS);line-height:16px;font-weight:600;letter-spacing:0;text-transform:none}
/* Glifo desnudo (+ para añadir, × para quitar): sin círculo, sin caja ni relleno (AGENTS 13,
   Pedro 3 sep). 18 de caja, 14 de letra, apagado; magenta al pasar o cuando su fila está elegida.
   Antes vivía como parche #kore-skin dentro del iframe; ahora es del root (6 sep). */
.lv-glyph{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:0;border-radius:0;
 background:none;font:inherit;font-size:14px;line-height:1;color:var(--text-muted);cursor:pointer;transition:color var(--motion-fast)}
.lv-glyph:hover,.is-on>.lv-glyph,.is-on .lv-glyph{color:var(--text-accent)}
/* Chips con rótulo (filtros del paso 4 del Deck: Categoría · Región): el rótulo en columna fija
   de 72, los chips envolviendo a su derecha; filete arriba, y abajo del último grupo. */
.lv-chips--labeled{display:grid;grid-template-columns:72px minmax(0,1fr);gap:var(--sp-8);align-items:start;margin:0;padding:var(--sp-8) 0;border-top:1px solid var(--border-subtle)}
.lv-chips--labeled+.lv-chips--labeled{border-bottom:1px solid var(--border-subtle);margin-bottom:var(--sp-12)}
.lv-chips--labeled::before{content:attr(data-label);padding-top:6px;font-size:var(--fs-labelXS);line-height:var(--lh-labelXS);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}
.lv-chips--labeled>.lv-chips-wrap{display:flex;flex-wrap:wrap;gap:6px;min-width:0}
/* Barra del documento: la miga estira y lleva elipsis; lo demás no encoge ni se parte. */
.lv-bar>*{flex:0 0 auto} .lv-bar>.lv-crumb{flex:1 1 auto}
.lv-bar .lv-btn,.lv-bar .lv-seg button{white-space:nowrap}
/* Estado vacío. La versión completa (.lv-empty: disco 44, título 15, texto 13, acción) es la de
   las vistas de Kore; --quiet es la caja discontinua para «no hay nada con estos filtros» dentro
   de una lista (Deck paso 4, Starred del menú lateral). Una pieza, dos intensidades. */
.lv-empty{display:flex;flex-direction:column;align-items:center;gap:var(--sp-8);padding:var(--sp-32) var(--sp-16);text-align:center;color:var(--text-muted);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM)}
.lv-empty>.ic{display:inline-flex;align-items:center;justify-content:center;width:var(--ctl-lg);height:var(--ctl-lg);border-radius:var(--r-full);
 background:color-mix(in srgb,var(--text-primary) 6%,transparent);color:var(--text-muted);margin-bottom:var(--sp-4)}
.lv-empty>.ic svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.75}
.lv-empty>.t{font-size:15px;line-height:20px;font-weight:500;color:var(--text-primary)}
.lv-empty--quiet{display:block;padding:var(--sp-16);border:1px dashed var(--border-default);border-radius:var(--r-lg);font-size:var(--fs-bodyS);line-height:var(--lh-bodyS)}
.lv-empty--quiet>svg{display:block;width:18px;height:18px;margin:0 auto var(--sp-6);stroke:currentColor;fill:none;stroke-width:1.75;color:var(--text-muted)}
.lv-empty--quiet>.t{display:block;font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;color:var(--text-primary);margin-bottom:var(--sp-2)}
/* --drop: la zona de soltar de un lienzo vacío (BrandCanvas): discontinua grande, esquinas 24, y el
   disco del + en magenta: es la única vez que el + va en círculo (AGENTS 13). is-over al arrastrar encima. */
.lv-empty--drop{width:100%;max-width:640px;padding:var(--sp-48) var(--sp-32);border:1px dashed var(--border-default);border-radius:var(--r-3xl);
 background:color-mix(in srgb,var(--surface-default) 60%,transparent);transition:border-color var(--motion-fast),background var(--motion-fast)}
.lv-empty--drop>.ic{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);color:var(--text-accent);width:var(--ctl-bar);height:var(--ctl-bar)}
.lv-empty--drop>.ic svg{width:24px;height:24px}
.lv-empty--drop.is-over{border-color:color-mix(in srgb,var(--brand-primary) 55%,transparent);background:color-mix(in srgb,var(--brand-primary) 8%,transparent)}
.lv-empty>.lv-btn,.lv-empty>.acts{margin-top:var(--sp-4)} .lv-empty>.acts{display:flex;align-items:center;gap:var(--sp-12)}
/* Medidor: barra de 4 px para una cuota o un progreso (textos del SOW, progreso de fase en Kore).
   --p es el porcentaje; ok verde · is-warn ámbar · is-over rojo; el rótulo va en .lv-meter-row. */
.lv-meter{position:relative;height:4px;border-radius:var(--r-full);background:color-mix(in srgb,var(--text-primary) 16%,transparent);overflow:hidden}   /* carril gris visible al 0 % (Pedro, 15 sep 2026) */
.lv-meter::before{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--p,0%);border-radius:inherit;background:var(--status-success);transition:width var(--motion-fast)}
.lv-meter.is-warn::before{background:var(--status-warning)} .lv-meter.is-over::before{background:var(--status-error)}
.lv-meter--accent::before{background:var(--brand-primary)}
.lv-meter-row{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-8);margin-bottom:var(--sp-6);font-size:var(--fs-labelS);line-height:var(--lh-labelS);color:var(--text-muted)}
/* Medidor apilado (Gestión, 15 sep 2026): varios tramos sobre el mismo carril —cobrado · facturado ·
   listo para facturar—; cada <i> es un tramo con su ancho en %, el carril que queda es lo no ganado.
   Colores de estado, no de marca: verde cobrado, magenta facturado, ámbar esperando. */
.lv-meter--stack{display:flex;height:6px}
.lv-meter--stack::before{display:none}
.lv-meter--stack>i{display:block;height:100%;flex:0 0 auto;transition:width var(--motion-fast)}
.lv-meter--stack>i+i{margin-left:1px}
.lv-meter--stack>.is-ok{background:var(--status-success)}
.lv-meter--stack>.is-accent{background:var(--brand-primary)}
.lv-meter--stack>.is-warn{background:var(--status-warning)}
.lv-meter--stack>.is-issued{background:color-mix(in srgb,var(--brand-primary) 30%,transparent);box-shadow:inset 0 0 0 1px var(--brand-primary)}
.lv-meter-row>i{font-style:normal;font-variant-numeric:tabular-nums;font-variant-numeric:tabular-nums}
.lv-meter-row.is-warn>i{color:var(--status-warning-text)} .lv-meter-row.is-over>i{color:var(--status-error-text)}
/* Cajón lateral (drawer): panel fijo a la derecha, 420 de ancho, para una tarea aparte de la
   vista (repasar textos del SOW; en Kore, los asides del chat y de propiedades siguen el mismo
   patrón). Cabecera de 52 con título 15 500 y cierre a la derecha; cuerpo con scroll; pie con
   filete. Se abre con .is-open. */
.lv-drawer{position:fixed;top:0;right:0;bottom:0;width:420px;max-width:92vw;display:none;flex-direction:column;z-index:600;
 background:var(--surface-default);border-left:1px solid var(--border-subtle);box-shadow:var(--shadow-modal);color:var(--text-primary);font-family:var(--font-ui)}
.lv-drawer.is-open,.lv-drawer.on{display:flex}
.lv-drawer-head{display:flex;align-items:center;gap:var(--sp-8);height:var(--ctl-bar);padding:0 var(--sp-16);border-bottom:1px solid var(--border-subtle);flex:0 0 auto}
.lv-drawer-head>h3,.lv-drawer-head>.t{flex:1;min-width:0;margin:0;font-size:15px;line-height:20px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-drawer-body{flex:1;min-height:0;overflow:auto;padding:var(--sp-10) var(--sp-16) var(--sp-24)}
.lv-drawer-foot{flex:0 0 auto;padding:var(--sp-12) var(--sp-16);border-top:1px solid var(--border-subtle)}
/* Ventana flotante (8 sep 2026): un panel que la persona coloca donde quiera, redimensiona y
   minimiza. Es el hogar del asistente de Kore: personal, transversal (no pertenece a un proyecto)
   y disponible en cualquier pantalla. Misma piel que el cajón —surface-raised, filete sutil,
   shadow-modal— con esquinas 24 (panel). Cabecera de 52 que es el asa de arrastre; cuerpo en
   columna; asa de redimensionado abajo a la derecha (22, glifo en L). Mínimo 360 × 360, nunca
   fuera de la ventana del navegador (lo garantiza quien la mueve). Minimizada es una píldora de
   44 abajo a la derecha con el título: restaurar devuelve tamaño y sitio. z-index bajo el cajón
   (600) y sobre el contenido; el tooltip (9999) sigue por encima. */
/* ── GUÍA DE PRIMEROS PASOS · .lv-coach (7 oct 2026, Pedro) ───────────────────
   Un recorrido corto la primera vez que alguien abre una herramienta. Dos piezas:
   el VELO (.lv-coach-veil), un hueco con filete magenta sobre lo que se explica y el
   resto apagado —es un velo, negro por naturaleza—; y la BURBUJA (.lv-coach), una
   tarjeta flotante con «Paso n de m», título, texto, puntos de avance y el pie del
   kit (Saltar guía en ghost · Siguiente sólido). Encima de todo, debajo de un diálogo
   no (es la única capa que tapa la pantalla mientras dura). */
.lv-coach-veil{position:fixed;z-index:700;border-radius:var(--r-xl);pointer-events:none;
 box-shadow:0 0 0 9999px color-mix(in srgb,var(--neutral-1000) 62%,transparent);outline:2px solid var(--brand-primary);outline-offset:2px;
 transition:top var(--motion-standard),left var(--motion-standard),width var(--motion-standard),height var(--motion-standard)}
.lv-coach{position:fixed;z-index:701;width:340px;max-width:calc(100vw - 32px);padding:var(--sp-20);border-radius:var(--r-2xl);
 background:var(--surface-raised);color:var(--text-primary);border:1px solid var(--border-subtle);box-shadow:var(--shadow-modal)}
.lv-coach-k{display:block;font-size:var(--fs-labelXS);line-height:16px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--text-accent)}
.lv-coach-t{display:block;margin-top:var(--sp-6);font-size:var(--fs-bodyM);line-height:22px;font-weight:500}
.lv-coach-p{margin:var(--sp-4) 0 0;font-size:var(--fs-bodyS);line-height:20px;color:var(--text-secondary)}
.lv-coach-foot{display:flex;align-items:center;gap:var(--sp-8);margin-top:var(--sp-16)}
.lv-coach-dots{display:flex;gap:var(--sp-4);margin-right:auto}
.lv-coach-dots i{width:6px;height:6px;border-radius:var(--r-full);background:var(--border-default);transition:width var(--motion-standard)}
.lv-coach-dots i.is-on{width:16px;background:var(--brand-primary)}
@media (prefers-reduced-motion:reduce){.lv-coach-veil{transition:none}}

.lv-window{position:fixed;z-index:500;display:flex;flex-direction:column;min-width:360px;min-height:360px;
 max-width:calc(100vw - 16px);max-height:calc(100vh - 16px);box-sizing:border-box;
 background:var(--surface-raised);border:1px solid var(--border-subtle);border-radius:var(--r-3xl);
 box-shadow:var(--shadow-modal);overflow:hidden;font-family:var(--font-ui);color:var(--text-primary)}
.lv-window.is-moving,.lv-window.is-sizing{user-select:none}
.lv-window-head{height:var(--ctl-bar);flex:0 0 auto;display:flex;align-items:center;gap:var(--sp-4);
 padding:0 var(--sp-8) 0 var(--sp-16);border-bottom:1px solid var(--border-subtle);cursor:grab;touch-action:none}
.lv-window.is-moving .lv-window-head{cursor:grabbing}
.lv-window-t{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--sp-8);
 font-size:var(--fs-labelL);line-height:16px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lv-window-t>svg{width:16px;height:16px;flex:0 0 auto;color:var(--text-accent);fill:currentColor;stroke:none}
.lv-window-body{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden}
.lv-window-grip{position:absolute;right:0;bottom:0;width:22px;height:22px;cursor:nwse-resize;touch-action:none;
 color:var(--text-tertiary);border:0;background:none;padding:0}
.lv-window-grip::before{content:"";position:absolute;right:7px;bottom:7px;width:9px;height:9px;
 border-right:2px solid currentColor;border-bottom:2px solid currentColor;border-radius:0 0 3px 0;opacity:.6}
.lv-window-grip:hover::before,.lv-window.is-sizing .lv-window-grip::before{opacity:1;color:var(--text-primary)}
.lv-window--min{min-width:0;min-height:0;height:var(--ctl-lg);border-radius:var(--r-full);box-shadow:var(--shadow-lift)}
.lv-window--min .lv-window-head{height:var(--ctl-lg);border-bottom:0;cursor:pointer;padding:0 var(--sp-6) 0 var(--sp-16)}
.lv-window--min .lv-window-body,.lv-window--min .lv-window-grip{display:none}
/* ── Bocadillo de la persona en un chat (8 sep 2026, Pedro): la receta de estado del kit
   (tinte 14 % + filete 55 %) sobre un rectángulo redondeado salvo la esquina inferior derecha,
   que va a 4. La respuesta del asistente no lleva caja: es texto. ── */
.lv-bubble{align-self:flex-end;max-width:80%;margin-left:var(--sp-40,40px);padding:var(--sp-8) var(--sp-14,14px);white-space:pre-wrap;
 border-radius:var(--r-2xl) var(--r-2xl) var(--r-sm) var(--r-2xl);
 background:color-mix(in srgb,var(--brand-primary) 14%,var(--surface-raised));
 border:1px solid color-mix(in srgb,var(--brand-primary) 55%,transparent);
 font-family:var(--font-ui);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-primary)}
.lv-listrow.is-dragging{opacity:.4}
.lv-listrow.is-drop{background:color-mix(in srgb,var(--brand-primary) 10%,transparent)}

/* ══ interruptor ═════════════════════════════════════════════════════════ */
.lv-switch{position:relative;display:inline-block;width:36px;height:20px;border-radius:var(--r-full);
 background:var(--border-default);flex:0 0 auto;transition:background var(--motion-fast)}
.lv-switch::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;
 border-radius:var(--r-full);background:var(--text-on-accent);transition:transform var(--motion-fast)}
.lv-switch.is-on{background:var(--brand-primary)}
.lv-switch.is-on::after{transform:translateX(16px)}
/* fila con interruptor (módulo a activar): 8 de radio, tinte magenta al activar */
.lv-switchrow{display:flex;align-items:center;gap:var(--sp-10);width:100%;min-height:var(--ctl-lg);
 padding:0 var(--sp-12);border-radius:var(--r-lg);border:1px solid var(--border-subtle);
 color:var(--text-muted);font-size:var(--fs-bodyM);font-weight:500;text-align:left;
 transition:border-color var(--motion-fast),background var(--motion-fast),color var(--motion-fast)}
/* --plain: sin marco ni padding, 32 de alto, en línea con el formulario. El texto va en primario
   (en gris parecía una descripción) y el interruptor delante del texto, como una casilla (Pedro, 6 sep). */
.lv-switchrow--plain{border:0;padding:0;min-height:var(--ctl-sm);border-radius:0;color:var(--text-primary);font-weight:500}
.lv-switchrow--plain>.lv-switch{order:-1;flex:0 0 auto;margin-left:0} .lv-switchrow--plain>span{flex:1;min-width:0}
.lv-switchrow.lv-switchrow--plain.is-on{background:none;border:0;color:var(--text-primary)}
.lv-switchrow:hover{border-color:var(--border-default)}
.lv-switchrow.is-on{border-color:color-mix(in srgb,var(--brand-primary) 50%,transparent);
 background:var(--brand-primary-subtle);color:var(--text-primary)}
.lv-switchrow svg{width:16px;height:16px;flex:0 0 auto;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-switchrow.is-on>svg:first-child{color:var(--text-accent)}
.lv-switchrow>.lv-switch,.lv-switchrow>.tail{margin-left:auto}
.lv-switchrow>.tail{display:flex;align-items:center;gap:var(--sp-6);font-size:var(--fs-labelXS);
 letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted)}

/* ══ fila de navegación · UNA para todo menú lateral ═══════════════════════
   Viene de Kore al sistema (Kit v1, 5 sep 2026; criterio de Pedro del 3 sep):
   cuatro estados y solo cuatro.
     reposo    texto --text-muted, sin fondo
     hover     fondo magenta 6 %, texto e icono --text-primary (sutil: Pedro, 5 sep)
     activa    fondo magenta 12 %, texto e icono magenta, peso 500 y barra 2×16
     apagada   texto --text-disabled, sin hover, cursor not-allowed
   Fila 38 (--ctl-md), radio 8, icono 18. Subfila (--sub) 32. Rail plegado
   (--rail) 38×38 sin etiqueta. Igual en claro y en oscuro. */
.lv-navrow{position:relative;display:flex;align-items:center;gap:var(--sp-8);width:100%;
 min-height:var(--ctl-md);padding:0 var(--sp-10);border-radius:var(--r-lg);
 font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-muted);
 text-align:left;cursor:pointer;text-decoration:none;
 transition:background var(--motion-fast),color var(--motion-fast)}
.lv-navrow svg{width:18px;height:18px;flex:0 0 auto}
.lv-navrow:hover{background:color-mix(in srgb,var(--brand-primary) 6%,transparent);color:var(--text-primary)}
.lv-navrow.is-on,.lv-navrow.is-on:hover{background:color-mix(in srgb,var(--brand-primary) 12%,transparent);
 color:var(--text-accent);font-weight:500}
.lv-navrow.is-off,.lv-navrow:disabled{color:var(--text-disabled);cursor:not-allowed;background:none}
.lv-navrow.is-off:hover,.lv-navrow:disabled:hover{background:none;color:var(--text-disabled)}
.lv-navrow-bar{position:absolute;left:0;top:50%;width:2px;height:16px;margin-top:-8px;
 border-radius:var(--r-full);background:var(--brand-primary)}
.lv-navrow--sub{min-height:var(--ctl-sm);padding:0 var(--sp-8);font-weight:400}
.lv-navrow--sub.is-on{font-weight:400}
.lv-navrow--rail{width:var(--ctl-md);min-height:var(--ctl-md);padding:0;justify-content:center;gap:0}
/* recuento o etiqueta a la derecha de la fila */
/* Recuento a la derecha. En la fila activa NO va en magenta: a 11 px mono el magenta
   sobre ciruela no se lee (revisión Pedro, 6 sep 2026). Va en el rosa claro de la paleta
   (--text-accent: brand-300 en oscuro, brand-600 en claro). */
.lv-navrow>.n{margin-left:auto;font-variant-numeric:tabular-nums;font-size:var(--fs-labelS);color:var(--text-tertiary);font-variant-numeric:tabular-nums}
.lv-navrow.is-on>.n{color:var(--text-accent)}
/* Conmutador «recuento + chevron»: despliega las versiones de una Marca/Proyecto sin
   abrirla. Gris en reposo, gris + fondo al pasar, rosa claro en la fila activa;
   el chevron gira 90° cuando está abierto (aria-expanded). */
.lv-navrow-tog{display:inline-flex;align-items:center;gap:2px;height:24px;margin-left:auto;padding:0 var(--sp-4) 0 var(--sp-6);
 border-radius:var(--r-md);flex:0 0 auto;font-size:var(--fs-labelS);line-height:1;
 font-variant-numeric:tabular-nums;color:var(--text-muted);background:none;border:0;cursor:pointer;
 transition:background var(--motion-fast),color var(--motion-fast)}
.lv-navrow-tog svg{width:12px;height:12px;flex:0 0 auto;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
 transition:transform var(--motion-fast)}
.lv-navrow-tog[aria-expanded="true"] svg{transform:rotate(90deg)}
.lv-navrow-tog:hover{background:color-mix(in srgb,var(--text-primary) 8%,transparent);color:var(--text-primary)}
.lv-navrow.is-on .lv-navrow-tog{color:var(--text-accent)}
.lv-navrow.is-on .lv-navrow-tog:hover{background:color-mix(in srgb,var(--text-primary) 10%,transparent);color:var(--text-primary)}
.lv-navrow-tog:focus-visible{outline:none;box-shadow:0 0 0 2px var(--border-focus)}
/* Árbol desplegado bajo una subfila (las versiones de una Marca/Proyecto): sangría con
   filete, y filas de dos líneas legibles (revisión Pedro, 6 sep 2026: la versión anterior
   iba en mono 11 al 70 % y no se leía). */
.lv-tree{list-style:none;margin:2px 0 var(--sp-6) var(--sp-12);padding:0 0 0 var(--sp-10);border-left:1px solid var(--border-subtle)}
.lv-tree>li{display:flex;align-items:flex-start;gap:2px}
.lv-verrow{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0;padding:var(--sp-6) var(--sp-8);border-radius:var(--r-lg);
 text-align:left;color:var(--text-secondary);text-decoration:none;transition:background var(--motion-fast),color var(--motion-fast)}
.lv-verrow>.t{display:flex;align-items:baseline;gap:var(--sp-6);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;color:var(--text-secondary);white-space:nowrap}
.lv-verrow>.t>b{font-weight:500;color:var(--text-primary)}
.lv-verrow>.t>i{font-style:normal;font-variant-numeric:tabular-nums;font-size:var(--fs-labelM);color:var(--text-muted);font-variant-numeric:tabular-nums}
.lv-verrow>.m{font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-verrow>.m>em{font-style:italic;color:var(--text-muted)}
.lv-verrow:hover{background:color-mix(in srgb,var(--brand-primary) 6%,transparent);color:var(--text-primary)}
.lv-verrow:hover>.t,.lv-verrow:hover>.t>b{color:var(--text-primary)}
.lv-verrow.is-on{background:color-mix(in srgb,var(--brand-primary) 12%,transparent)}
.lv-verrow.is-on>.t,.lv-verrow.is-on>.t>b{color:var(--text-primary)}
.lv-verrow.is-on>.t>i{color:var(--text-accent)}
.lv-verrow.is-on>.m{color:var(--text-secondary)}
/* acción de la fila (borrar): aparece al pasar por la fila o al enfocar */
.lv-tree>li>.lv-iconbtn{margin-top:var(--sp-4);opacity:0;transition:opacity var(--motion-fast)}
.lv-tree>li:hover>.lv-iconbtn,.lv-tree>li>.lv-iconbtn:focus-visible,.lv-tree>li:focus-within>.lv-iconbtn{opacity:1}

/* ══ botón de icono · menú de una tarjeta, cerrar, plegar, vista ════════════
   Cuadrado 38 (--sm 32, --xs 28), radio 8, sin fondo; icono 16 en --text-muted
   que pasa a --text-primary al pasar sobre 6 % del texto. `is-on` = tinte
   magenta e icono magenta (la vista elegida, el filtro abierto). */
.lv-iconbtn{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
 width:var(--ctl-md);height:var(--ctl-md);border-radius:var(--r-lg);color:var(--text-muted);
 cursor:pointer;transition:background var(--motion-fast),color var(--motion-fast)}
.lv-iconbtn:hover{background:color-mix(in srgb,var(--text-primary) 6%,transparent);color:var(--text-primary)}
.lv-iconbtn.is-on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);color:var(--text-accent)}
.lv-iconbtn:disabled{color:var(--text-disabled);cursor:not-allowed;background:none}
.lv-iconbtn--sm{width:var(--ctl-sm);height:var(--ctl-sm)}
.lv-iconbtn--xs{width:var(--ctl-xs);height:var(--ctl-xs);border-radius:var(--r-md)}
.lv-iconbtn--pill{border-radius:var(--r-full)}
/* «editado»: el lápiz de un texto que ya no es el original (SOW paso 3). Ámbar, no magenta:
   no es una elección activa, es un aviso de que hay cambios. */
.lv-iconbtn.is-edited{color:var(--status-warning-text)}
.lv-iconbtn.is-edited:hover{background:var(--status-warning-bg);color:var(--status-warning-text)}
.lv-iconbtn svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
/* un icono relleno (estrella marcada, «⋯», logotipo) conserva su relleno */
.lv-iconbtn svg[fill="currentColor"],.lv-btn svg[fill="currentColor"],.lv-pop-item svg[fill="currentColor"]{fill:currentColor;stroke:none}
/* grupo de botones de icono pegados (vista cuadrícula | lista): contenedor píldora de 38 */
.lv-iconseg{display:inline-flex;align-items:center;gap:2px;padding:3px;border-radius:var(--r-full);
 border:1px solid var(--border-subtle);background:color-mix(in srgb,var(--text-primary) 5%,transparent)}
.lv-iconseg .lv-iconbtn{width:var(--ctl-sm);height:30px;border-radius:var(--r-full)}

/* ══ buscador · campo píldora con lupa y atajo ═══════════════════════════════
   38, píldora, mismo fondo hundido y filete que un campo; lupa 18 a la
   izquierda en --text-muted; a la derecha, el atajo (.lv-kbd) o el aspa para
   limpiar (.lv-iconbtn--xs). */
.lv-search{position:relative;display:flex;align-items:center}
.lv-search>svg{position:absolute;left:var(--sp-12);width:18px;height:18px;color:var(--text-muted);
 fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}
.lv-search>input{width:100%;height:var(--ctl-md);padding:0 var(--sp-12) 0 40px;border-radius:var(--r-full);
 background:var(--bg-default);border:1px solid var(--border-default);color:var(--text-primary);
 font-family:var(--font-ui);font-size:var(--fs-bodyM);
 transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
.lv-search>input::placeholder{color:var(--text-placeholder)}
/* El aspa nativa de type=search sobraba: la casa pone la suya en .tail (18 sep 2026). */
.lv-search>input::-webkit-search-cancel-button,.lv-search>input::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}
.lv-search>input:focus{outline:none;border-color:var(--border-accent);
 box-shadow:0 0 0 3px color-mix(in srgb,var(--brand-primary) 20%,transparent)}
.lv-search.has-tail>input{padding-right:56px}
.lv-search>.tail{position:absolute;right:var(--sp-8);display:flex;align-items:center}
.lv-kbd{display:inline-flex;align-items:center;height:22px;padding:0 var(--sp-6);border-radius:var(--r-sm);
 border:1px solid var(--border-subtle);background:var(--surface-raised);
 font-family:var(--font-mono);font-size:var(--fs-labelXS);color:var(--text-muted);pointer-events:none}

/* ══ menú de acciones · sobre .lv-pop ═══════════════════════════════════════
   Mismo popover que el combobox, anclado a un botón de icono o a un botón
   contorno (ordenar, ajustes, avatar, «⋯» de la tarjeta). Ítems .lv-pop-item con
   icono 16 a la izquierda; separador; ítem de peligro; cabecera de grupo. */
.lv-pop--menu{left:auto;right:0;min-width:200px;width:max-content;max-width:320px}
.lv-pop--menu.is-left{left:0;right:auto}
.lv-pop-sep{height:1px;margin:var(--sp-4) 0;background:var(--border-subtle)}
/* Quién eres, arriba del menú de usuario: avatar, nombre y correo en mono. */
.lv-pop-user{display:flex;align-items:center;gap:var(--sp-12);padding:var(--sp-10) var(--sp-12)}
.lv-pop-user>span{min-width:0}
.lv-pop-user b{display:block;font-size:var(--fs-bodyS);font-weight:500;color:var(--text-primary);
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-pop-user em{display:block;font-style:normal;font-family:var(--font-mono);
 font-size:var(--fs-labelS);letter-spacing:0;text-transform:none;font-weight:400;color:var(--text-muted);
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-pop-head{padding:var(--sp-6) var(--sp-10) var(--sp-4);font-size:var(--fs-labelXS);letter-spacing:.12em;
 text-transform:uppercase;font-weight:600;color:var(--text-tertiary)}
.lv-pop-item.is-danger{color:var(--status-error-text)}
.lv-pop-item.is-danger:hover{background:var(--status-error-bg)}
.lv-pop-item>.k{margin-left:auto;font-variant-numeric:tabular-nums;font-size:var(--fs-labelXS);color:var(--text-muted)}
.lv-pop-item>.meta{margin-left:auto;font-size:var(--fs-labelS);color:var(--text-muted)}
/* ── Submenú lateral (7 sep) ────────────────────────────────────────────────
   Una fila del menú puede abrir otro menú pegado a su lado: el valor activo a la
   derecha (.meta) y un chevron de 12 que apunta a donde va a abrir. El lado lo
   decide el sitio que hay, no el sitio donde se escribió: por defecto a la
   izquierda —los menús de la barra viven pegados al borde derecho— y `.is-right`
   cuando cabe al otro lado. El submenú es un `.lv-pop--menu` normal, así que
   dentro puede haber otra fila con submenú: el anidamiento sale gratis.
   El menú que contiene submenús es `.lv-pop--nested`: su lista deja de recortar
   (`overflow`) y de limitar el alto, que era lo que obligaba a escribirlo a mano. */
.lv-pop--nested>.lv-pop-list{overflow:visible;max-height:none}
.lv-pop-li{position:relative}
.lv-pop-sub{top:calc(var(--sp-4)*-1);left:auto;right:100%;margin:0 var(--sp-4) 0 0}
.lv-pop-sub.is-right{left:100%;right:auto;margin:0 0 0 var(--sp-4)}
.lv-pop-item>.meta{display:flex;align-items:center;gap:var(--sp-6);min-width:0}
.lv-pop-item>.meta>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-pop-item>.meta>svg{width:12px;height:12px;flex:0 0 auto;opacity:.7}
.lv-pop-item--sub>.meta>svg{transform:scaleX(-1)}
.lv-pop-item--sub.is-right>.meta>svg{transform:none}

/* ══ pastilla de estado · activo · pausado · terminado ═══════════════════════ */
/* Sentence case, 12/500, sin tracking (Pedro, 17 sep 2026): la pastilla se lee como una palabra, no como
   un rótulo. El único registro en mayúsculas de una pantalla es la cabecera de tabla (.lv-thead--caps). */
/* El galón de «esto abre», una vez: lo usan la pastilla-mando y cualquier otro
   control que quiera decir lo mismo. */
:root{--lv-chevron:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}
.lv-status{display:inline-flex;align-items:center;gap:var(--sp-6);height:22px;padding:0 var(--sp-8);white-space:nowrap;flex:0 0 auto;
 border-radius:var(--r-full);font-size:var(--fs-labelM);line-height:1;letter-spacing:0;text-transform:none;font-weight:500}
.lv-status::before{content:"";width:6px;height:6px;border-radius:var(--r-full);background:currentColor}
/* UNA PASTILLA QUE SE PUEDE CAMBIAR NO SE PARECE A UNA QUE SOLO INFORMA.
   El mismo dibujo significaba cuatro cosas distintas a la vez: «Active» es
   etiqueta en la miga y en la carta de marca, y MANDO en la cabecera del
   expediente; «Not started» es etiqueta en Project Content y MANDO en el
   calendario de pagos —la misma palabra, el mismo dibujo, en dos pestañas del
   mismo proyecto—. Se aprendía pulsando.
   La regla se ata a lo que el elemento ES y no a lo que el que lo pinta se
   acuerde de poner: si la pastilla es un <button>, lleva galón; si es un
   <span>, no. Así no puede desviarse. Y como quien no tiene permiso no recibe
   un <button>, el galón dice además quién puede cambiarlo.
   El galón ya significa «esto abre» en Kore —los desplegables de rol, el orden,
   la cabecera de columna—, así que esto no es una convención nueva: es aplicar
   la que ya hay. (Pedro, 25 sep 2026) */
/* Tres formas de ser mando, porque las tres existen en el producto: la pastilla
   ES el botón, la pastilla LLEVA el rol, o la pastilla es lo único que hay
   dentro de un botón (el calendario de pagos lo hace así). */
button.lv-status,.lv-status[role="button"]{border:0;font:inherit;cursor:pointer}
/* El punto suelto queda fuera: no es una pastilla, es una senal de 4 px con
   overflow:hidden, y el galon entraba dentro convertido en una mancha de 6x4
   -el punto ambar de «listo para facturar» de la pestana Management-. Un punto
   nunca es un mando: lo que se pulsa es la fila o la pestana que lo lleva.
   (25 sep 2026) */
:is(button.lv-status,.lv-status[role="button"],button>.lv-status:only-child):not(.lv-status--dot){padding-right:var(--sp-6)}
:is(button.lv-status,.lv-status[role="button"],button>.lv-status:only-child):not(.lv-status--dot)::after{
 content:"";width:9px;height:9px;flex:0 0 auto;margin-left:var(--sp-2);background:currentColor;opacity:.75;
 -webkit-mask:var(--lv-chevron) center/9px 9px no-repeat;mask:var(--lv-chevron) center/9px 9px no-repeat}
:is(button.lv-status,.lv-status[role="button"]):not(.lv-status--dot):hover::after,
button:hover>.lv-status:only-child:not(.lv-status--dot)::after{opacity:1}
/* la pastilla hueca ya usa ::after para su filete: ahí el galón no cabe */
.lv-status--issued::after{margin-left:0}
.lv-status--active{color:var(--status-success-text);background:var(--status-success-bg)}
.lv-status--paused{color:var(--status-warning-text);background:var(--status-warning-bg)}
.lv-status--finished{color:var(--text-muted);background:color-mix(in srgb,var(--text-primary) 6%,transparent)}
/* Pastilla azul (info): «en marcha, en nuestras manos». Criterio de color de los estados de Gestión
   (Pedro, 15 sep 2026): gris = nada aún · azul = en proceso · ámbar = esperando a alguien · magenta =
   facturado (el dinero está en manos del cliente) · verde = cerrado. */
.lv-status--info{color:var(--status-info-text);background:var(--status-info-bg)}
.lv-status--dot.lv-status--info{color:var(--status-info)}
/* Pastilla en tinta de marca (Gestión: «Invoiced»): el paso intermedio entre esperar y cobrar. */
.lv-status--accent{color:var(--text-accent);background:color-mix(in srgb,var(--brand-primary) 12%,transparent)}
.lv-status--dot.lv-status--accent{color:var(--text-accent)}
/* Pastilla HUECA en tinta de marca (Gestión: «Invoiced»). Criterio de color v2 (Pedro, 15 sep 2026):
   gris = nada aún · magenta = Livit trabajando · ámbar = esperando a alguien · magenta hueca = factura
   emitida, a la espera del dinero · verde = cerrado. Fuera el azul: no es un color de la paleta Livit.
   Misma tinta que «en marcha», sin relleno: emitido, aún por llenar. */
.lv-status--issued{color:var(--text-accent);background:transparent;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand-primary) 55%,transparent)}
.lv-status--issued::before{background:transparent;box-shadow:inset 0 0 0 1.5px currentColor}
.lv-status--dot.lv-status--issued{box-shadow:none}
.lv-status--dot.lv-status--issued::before{box-shadow:inset 0 0 0 2px currentColor}
/* aviso puntual en una barra («No cabe en la hoja · página 3»): ámbar, sin punto; sustituye a .lv-badge--warn */
.lv-status--warn{color:var(--status-warning-text);background:var(--status-warning-bg)}
.lv-status--warn::before{display:none}
/* Punto de estado (Pedro, 6 sep 2026): la misma pastilla sin texto ni fondo, solo el punto de 8
   (--sm 6) con el color del estado. Para filtros del menú lateral, filas, menús y notas de
   sincronización («guardado en Supabase» = active, «solo local» = paused, «no persiste» = finished).
   Sin resplandor: el punto informa, no brilla.
   En NAVEGACIÓN siempre --sm (Pedro, 20 sep 2026): un lateral con cien proyectos y el punto
   de 8 se convierte en una fiesta de color que compite con el nombre. El 8 se queda para
   contenido, donde el punto va solo o acompañado de mucho menos texto.
   El --sm baja de 6 a 4 (Pedro, 22 sep 2026, viéndolo a tamaño real): seguía pesando más que
   el nombre al que acompaña. A 4 el color se distingue —verde, ámbar, gris— y deja de ser
   una mancha; por debajo ya es una mota. */
.lv-status.lv-status--dot{width:8px;height:8px;padding:0;gap:0;background:none;border-radius:var(--r-full);flex:0 0 auto;overflow:hidden}
.lv-status.lv-status--dot::before{width:8px;height:8px}
.lv-status.lv-status--dot.lv-status--sm{width:4px;height:4px} .lv-status.lv-status--dot.lv-status--sm::before{width:4px;height:4px}
.lv-status--dot.lv-status--error{color:var(--status-error)}
/* Punto «no visto» / actividad: magenta, 8 (--sm 6); --pulse late (asistente pensando). El mismo
   punto que la campana de avisos y la tarjeta de bloque nueva (.lv-blockcard-dot). */
.lv-dot{display:inline-block;width:8px;height:8px;border-radius:var(--r-full);background:var(--brand-primary);flex:0 0 auto}
.lv-dot--sm{width:6px;height:6px}
.lv-dot--pulse{animation:lv-pulse 1.4s ease-in-out infinite}
@keyframes lv-pulse{0%,100%{opacity:1}50%{opacity:.35}}
/* ══ Esqueleto de carga (7 sep) ═════════════════════════════════════════════
   Un bloque del lienzo esperando sus datos NO se anuncia con una frase: dibuja
   la silueta de lo que va a aparecer y ocupa el sitio real, para que al llegar
   los datos nada se mueva (antes: `min-h-[200px]` y un salto). La silueta la
   compone cada bloque —es layout, como las columnas de una tabla—; del kit sale
   solo la forma que late, con la misma curva que .lv-dot--pulse para que la casa
   tenga una única manera de decir «espera». Las esperas pequeñas (una lista de
   un popover, el asistente pensando) NO llevan esqueleto: les basta ese punto.
   El desfase entre hermanos lo pone .lv-skeletons; no hay que numerar nada. */
@keyframes lv-skeleton{0%,100%{opacity:.55}50%{opacity:1}}
.lv-skeleton{display:block;border-radius:var(--r-md);
 background:color-mix(in srgb,var(--text-primary) 7%,transparent);
 animation:lv-skeleton 1.4s ease-in-out infinite}
.lv-skeleton--line{height:10px;border-radius:var(--r-sm)}
.lv-skeleton--media{border-radius:var(--r-lg);background:color-mix(in srgb,var(--text-primary) 5%,transparent)}
.lv-skeletons{display:flex;flex-direction:column;gap:var(--sp-10);min-width:0}
.lv-skeletons>*:nth-child(2){animation-delay:.12s}
.lv-skeletons>*:nth-child(3){animation-delay:.24s}
.lv-skeletons>*:nth-child(4){animation-delay:.36s}
.lv-skeletons>*:nth-child(5){animation-delay:.48s}
.lv-skeletons>*:nth-child(n+6){animation-delay:.6s}
@media(prefers-reduced-motion:reduce){.lv-skeleton{animation:none;opacity:.8}}
.lv-dot--badge{position:absolute;right:var(--sp-8);top:var(--sp-8)}   /* sobre un botón de icono (campana) */

/* ══ etiqueta de rol · account leader · editor · viewer ═══════════════════════
   Quién es la persona en la marca (catálogo `role`), al lado de la pastilla de estado.
   Rectángulo compacto de 18 (no píldora: es un dato, no un estado), mono 10 versalitas,
   fondo del rol (--role-*-bg de los tokens) y texto del mismo tono. Pedro, 6 sep 2026. */
.lv-role{display:inline-flex;align-items:center;height:18px;padding:0 var(--sp-6);border-radius:var(--r-sm);
 font-size:var(--fs-labelS);line-height:18px;font-weight:500;   /* sentence case, sin mono (Pedro, 17 sep 2026) */
 letter-spacing:0;text-transform:none;white-space:nowrap}
.lv-role--account-leader{background:var(--role-account-leader-bg);color:var(--text-accent)}
.lv-role--editor{background:var(--role-editor-bg);color:var(--status-warning-text)}
.lv-role--viewer{background:color-mix(in srgb,var(--text-primary) 6%,transparent);color:var(--text-muted)}

/* ══ tarjeta ════════════════════════════════════════════════════════════ */
.lv-card{position:relative;isolation:isolate;overflow:hidden;text-align:left;
 border-radius:var(--r-2xl);border:1px solid transparent;
 background:var(--surface-default);padding:var(--sp-24);
 box-shadow:var(--shadow-card);
 transition:transform var(--motion-surface),border-color var(--motion-standard),
  box-shadow var(--motion-surface)}
.lv-card::after{content:'';position:absolute;inset:0;z-index:-1;opacity:0;
 pointer-events:none;transition:opacity var(--motion-standard);
 background:color-mix(in srgb,var(--text-primary) calc(var(--state-hover)*100%),transparent)}
.lv-card--action{cursor:pointer;padding:var(--sp-16)}
.lv-card--action:hover{box-shadow:var(--shadow-lift)}   /* sin desplazamiento (Pedro, 6 sep) */
/* Regla 8 del estandar de proporcion: en oscuro la tarjeta no lleva filete -el
   relleno y la sombra la separan-; en claro, donde la sombra pesa menos, si. */
[data-theme="light"] .lv-card:not(.lv-card--accent){border-color:var(--border-subtle)}
[data-theme="light"] .lv-panel{border-color:var(--border-subtle)}
.lv-card--action:hover::after{opacity:1}
/* «Elegida» = la receta de estado de la casa (Pedro, 6 sep 2026): tinte magenta 14 %, filete 55 %
   y título en magenta. Sin disco con check (era un relleno magenta más) y sin halo al pasar. */
.lv-card--accent{background:color-mix(in srgb,var(--brand-primary) 14%,var(--surface-default));
 border-color:color-mix(in srgb,var(--brand-primary) 55%,transparent)}
.lv-card--accent .lv-card-t{color:var(--text-accent)}
.lv-card--accent:hover{border-color:color-mix(in srgb,var(--brand-primary) 70%,transparent)}
.lv-card--feature{border-radius:var(--r-3xl);padding:var(--sp-32)}
.lv-card--quiet{border-style:dashed}

/* rejilla de tarjetas de eleccion, y su contenido. Es el patron de
   «elige una de dos»: idioma, firmante, moneda. Igual en toda herramienta. */
.lv-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));
 gap:var(--sp-12)}
.lv-card-t{display:block;font-size:var(--fs-titleM);line-height:var(--lh-titleM);
 font-weight:500;font-style:normal;color:var(--text-primary);text-wrap:balance}
.lv-card-d{display:block;margin-top:var(--sp-2);font-size:var(--fs-bodyS);
 line-height:var(--lh-bodyS);font-style:normal;color:var(--text-muted)}
.lv-card--accent .lv-card-d{color:var(--text-secondary)}
@media(max-width:900px){.lv-cards{grid-template-columns:1fr}}

/* ══ tarjeta de espacio · tres tarjetas, una receta (Pedro, 7 sep 2026) ═══════════════
   .lv-card es la base (superficie, sombra card, 16). Tres modificadores y nada más:
     --space    home: Livit Projects, Comercial… 24 de radio, 20 de relleno, icono 40 en cuadrado 10,
                título 18 DM Sans, descripción 12, pie «Abrir ›» + nota mono. 246×297 a 1440 (5 columnas).
     --app      herramientas de un espacio: cuadrado 132 tipo App Store, icono suelto de 32 en
                --text-secondary (un paso por debajo del texto), SOLO el nombre (13/16); la explicación
                larga va por tooltip (title). Sin código de color por herramienta: la casa tiene un acento.
     --project  malla de proyectos: 132 de alto, 16 de radio, sin filete en oscuro (regla 8);
                estado arriba, acciones al pasar, nombre 18 + segmento versalitas + rol abajo.
   Dos hovers, según lo que la tarjeta es:
     navegación (--space, --app) → el fondo pasa a --gradient-hover (diagonal 135°, oscuro
                arriba-izquierda → magenta abajo-derecha, donde está «Abrir»), el filete se va, el
                cuadrado del icono pasa a --bg-base con el glifo en magenta, texto en primario.
                Gradiente sobre una SUPERFICIE, no sobre un control: segunda excepción sancionada
                junto al suelo del umbral. Sin desplazamiento.
     dato (--project) → filete magenta 55 % (el del estado de la casa) + halo --shadow-accent.
                Sin desplazamiento, el nombre no cambia de color. «Encontrada» desde el buscador =
                .lv-card--accent (tinte + filete + título magenta).
   --quiet («próximamente») vale para las tres: filete discontinuo, 60 %, sin pie, sin hover. */
.lv{--gradient-hover:linear-gradient(135deg,var(--brand-990) 0%,var(--brand-600) 100%)}
[data-theme="light"] .lv,[data-theme="light"].lv{--gradient-hover:linear-gradient(135deg,var(--brand-100) 0%,var(--brand-300) 100%)}

.lv-card--space,.lv-card--app,.lv-card--project{display:flex;flex-direction:column;min-width:0;
 color:var(--text-primary);text-decoration:none;font:inherit;cursor:pointer;
 transition:background var(--motion-surface),border-color var(--motion-surface),box-shadow var(--motion-surface)}
.lv-card--space:focus-visible,.lv-card--app:focus-visible,.lv-card--project:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}
.lv-card--space,.lv-card--app{border-color:color-mix(in srgb,var(--brand-primary) 35%,transparent)}
.lv-card--space::before,.lv-card--app::before{content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;
 background:radial-gradient(120% 120% at 0% 0%,color-mix(in srgb,var(--brand-primary) 14%,transparent),transparent 60%);
 transition:opacity var(--motion-surface)}
/* Al pasar, el brillo radial se apaga y el gradiente nace en la caja del BORDE (background-origin):
   si nace en la de relleno, el mosaico se repite bajo el borde transparente y pinta un filete de 1 px
   del extremo magenta arriba y a la izquierda (Pedro, 7 sep). */
.lv-card--space:is(:hover,.is-hover),.lv-card--app:is(:hover,.is-hover){background:var(--gradient-hover) border-box;border-color:transparent}
.lv-card--space:is(:hover,.is-hover)::before,.lv-card--app:is(:hover,.is-hover)::before{opacity:0}
.lv-card--space{border-radius:var(--r-3xl);padding:var(--sp-20);min-height:clamp(190px,33vh,300px)}
.lv-card--app{width:132px;height:132px;padding:var(--sp-16) var(--sp-12);align-items:center;justify-content:center;text-align:center;gap:var(--sp-12)}
/* 132 -> 120 y el relleno de 16 -> 12 (25 sep 2026). La altura estaba clavada
   en 132 y el contenido pedia 146: flexbox lo resolvia aplastando la linea mas
   corta -el nombre de la fase, 1 px, invisible-. Quitada esa linea (repetia la
   banda de la fase) la carta cabe holgada en 120, con 12 px entre la etiqueta
   y el titulo, y desaparece el vacio de la mitad inferior. */
.lv-card--project{height:120px;padding:var(--sp-12)}
.lv-card--project:is(:hover,.is-hover){border-color:color-mix(in srgb,var(--brand-primary) 55%,transparent);box-shadow:var(--shadow-accent)}
.lv-card--project.lv-card--action:is(:hover,.is-hover)::after{opacity:0}

/* icono en cuadrado (--space): tinte 12 %, filete 25 %, radio 10 (un paso por debajo de la tarjeta).
   Al pasar, el cuadrado se vuelve --bg-base (975 en oscuro, blanco en claro) y el glifo sigue magenta. */
.lv-card-ic{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
 width:40px;height:40px;border-radius:10px;color:var(--text-accent);
 border:1px solid color-mix(in srgb,var(--brand-primary) 25%,transparent);
 background:color-mix(in srgb,var(--brand-primary) 12%,transparent);
 transition:background var(--motion-surface),color var(--motion-surface),border-color var(--motion-surface)}
.lv-card-ic>svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-card--space:is(:hover,.is-hover) .lv-card-ic{background:var(--bg-base);border-color:transparent}
.lv-card--app .lv-card-ic{width:auto;height:auto;border:0;background:none;border-radius:0;color:var(--text-secondary)}
.lv-card--app .lv-card-ic>svg{width:32px;height:32px;stroke-width:1.5}
.lv-card--app:is(:hover,.is-hover) .lv-card-ic{color:var(--text-primary)}

/* textos */
.lv-card--space .lv-card-t{margin-top:var(--sp-20);font-family:var(--font-canvas);font-size:var(--fs-titleL);line-height:var(--lh-titleL);font-weight:400;letter-spacing:-.01em}
.lv-card--space .lv-card-d{margin-top:var(--sp-6);transition:color var(--motion-surface)}
.lv-card--app .lv-card-t{margin:0;font-size:var(--fs-titleS);line-height:16px;font-weight:500;text-wrap:balance}
.lv-card--project .lv-card-t{font-size:var(--fs-titleL);line-height:var(--lh-titleL);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lv-card--project .lv-card-d{margin-top:var(--sp-2);font-size:var(--fs-labelXS);line-height:var(--lh-labelXS);font-weight:500;letter-spacing:.08em;text-transform:uppercase}
.lv-card--space:is(:hover,.is-hover) .lv-card-d{color:color-mix(in srgb,var(--text-primary) 85%,transparent)}

/* pie (--space): «Abrir ›» a la izquierda; nota mono con punto ámbar a la derecha */
.lv-card-foot{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-8);padding-top:var(--sp-16)}
.lv-card-open{display:inline-flex;align-items:center;gap:var(--sp-4);font-size:var(--fs-labelL);font-weight:500;color:var(--text-accent);transition:color var(--motion-surface)}
.lv-card-open>svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round;transition:translate 500ms cubic-bezier(.16,1,.3,1)}
.lv-card--space:is(:hover,.is-hover) .lv-card-open{color:inherit}
.lv-card--space:is(:hover,.is-hover) .lv-card-open>svg{translate:4px 0}
.lv-card-note{display:inline-flex;align-items:center;gap:var(--sp-6);font-variant-numeric:tabular-nums;font-size:var(--fs-labelS);letter-spacing:.02em;color:var(--text-muted);white-space:nowrap}
.lv-card-note::before{content:'';width:6px;height:6px;border-radius:var(--r-full);background:var(--status-warning)}
.lv-card--space:is(:hover,.is-hover) .lv-card-note{color:inherit;opacity:.8}

/* cabecera y cuerpo (--project): estado a la izquierda, acciones (aparecen al pasar) a la derecha */
.lv-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--sp-8)}
.lv-card-acts{display:flex;align-items:center;margin:-4px -4px 0 0;opacity:0;transition:opacity var(--motion-fast)}
.lv-card--project:is(:hover,.is-hover) .lv-card-acts,.lv-card-acts:focus-within,.lv-card-acts:has([aria-expanded="true"]),.lv-card-acts.is-on{opacity:1}
.lv-card-body{margin-top:auto;display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}

/* próximamente: una receta para las tres */
:is(.lv-card--space,.lv-card--app,.lv-card--project).lv-card--quiet{border-style:dashed;border-color:color-mix(in srgb,var(--border-default) 70%,transparent);
 background:color-mix(in srgb,var(--surface-default) 30%,transparent);box-shadow:none;cursor:default;pointer-events:none}
/* Sin opacidad. La llevaba (.6) y dejaba los tres espacios por venir de la home
   en 2,89 de contraste ocupando el 60 % de la fila: ilegibles. Lo que se atenúa
   es el ESTADO —borde discontinuo, icono hueco, título en muted, la nota
   «Próximamente»—, no el bloque entero. Es la misma conclusión a la que llegó
   la variante .lv-card--action el 15 sep; ahora vale para las tres. */
.lv-card--quiet::before,.lv-card--quiet .lv-card-open,.lv-card--quiet .lv-card-note::before{display:none}   /* el pie solo conserva la nota («Próximamente»), sin punto */
.lv-card--quiet .lv-card-ic{border-style:dashed;border-color:var(--border-default);background:transparent;color:var(--text-muted)}
.lv-card--quiet .lv-card-t{color:var(--text-muted)}
/* Una opción que aún no existe (Pedro, 15 sep 2026): la misma receta que las cartas «próximamente» de la
   home —borde discontinuo y textos apagados—, sin bajar la opacidad: se lee mejor. Para tarjetas de elección
   (.lv-card--action) que se pintan pero no se pulsan: líneas de servicio pendientes, formatos por venir. */
.lv-card--action.lv-card--quiet,.lv-card--action[disabled]{border-style:dashed;border-color:color-mix(in srgb,var(--border-default) 70%,transparent);
 background:color-mix(in srgb,var(--surface-default) 30%,transparent);box-shadow:none;cursor:default;pointer-events:none}
.lv-card--action.lv-card--quiet :is(.lv-card-t,.lv-card-d),.lv-card--action[disabled] :is(.lv-card-t,.lv-card-d){color:var(--text-muted)}
.lv-card--action.lv-card--quiet::after,.lv-card--action[disabled]::after{display:none}

/* rejillas */
/* Tantas columnas iguales como espacios ve cada persona (29 sep 2026): con el
   Project Toolkit son cinco o seis según el rol, y la fila no puede depender
   de contar a mano. */
.lv-cards--spaces{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:var(--sp-16)}
.lv-cards--apps{display:flex;flex-wrap:wrap;gap:var(--sp-12)}
.lv-cards--projects{display:grid;grid-template-columns:repeat(auto-fill,minmax(236px,1fr));gap:var(--sp-12)}

/* ══ carta de marca (Livit Projects) ════════════════════════════════════
   Pedro, 18 sep 2026: «no quiero que sea mucha información, sino más bien
   personalización». La carta deja de ser una ficha de datos y pasa a ser la
   marca: una franja diagonal arriba con SU paleta (color_identity) o con la
   imagen que se elija en el lápiz, y abajo lo único que hace falta para
   reconocerla — nombre, categoría y quién está dentro. El expediente se fue:
   una marca puede tener varios.
   La franja es el único lienzo de color de la carta; por eso el estado, que sí
   es señal, se apoya en ella con su propio fondo translúcido para que se lea
   igual sobre una foto que sobre un amarillo. */
.lv-card--brand{display:flex;flex-direction:column;min-width:0;height:240px;padding:0;overflow:hidden;
 color:var(--text-primary);text-decoration:none;font:inherit;cursor:pointer;
 transition:border-color var(--motion-surface),box-shadow var(--motion-surface)}
.lv-card--brand:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}
.lv-card--brand:is(:hover,.is-hover){border-color:color-mix(in srgb,var(--brand-primary) 55%,transparent);box-shadow:var(--shadow-accent)}

/* La franja: bandas en diagonal a partes iguales. Los colores los pone el
   componente en --c1…--c6 con `background-image` en línea; aquí solo vive la
   caja y el degradado de sombra que sostiene la píldora. Sin paleta ni imagen,
   la franja es neutra a propósito: dice «esta marca aún no tiene paleta». */
.lv-card--brand>.cover{position:relative;flex:0 0 50%;min-height:0;overflow:hidden;
 background:repeating-linear-gradient(115deg,var(--surface-raised) 0 30px,color-mix(in srgb,var(--text-primary) 7%,var(--surface-raised)) 30px 60px)}
.lv-card--brand>.cover>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.lv-card--brand>.cover::after{content:'';position:absolute;inset:0;pointer-events:none;
 background:linear-gradient(180deg,color-mix(in srgb,#000 18%,transparent) 0%,transparent 52%)}

/* Mandos sobre la franja: el lápiz a la izquierda (aparece al pasar), el estado
   a la derecha (siempre). Los dos por encima del velo. */
.lv-card--brand>.cover>.acts{position:absolute;top:8px;left:8px;z-index:2;display:flex;align-items:center;gap:2px;
 opacity:0;transition:opacity var(--motion-fast)}
.lv-card--brand:is(:hover,.is-hover)>.cover>.acts,.lv-card--brand>.cover>.acts:focus-within,
.lv-card--brand>.cover>.acts:has([aria-expanded="true"]){opacity:1}
.lv-card--brand>.cover>.acts .lv-iconbtn{color:#fff;background:color-mix(in srgb,#000 30%,transparent);backdrop-filter:blur(6px)}
.lv-card--brand>.cover>.acts .lv-iconbtn:hover{background:color-mix(in srgb,#000 48%,transparent);color:#fff}
/* El estado va EXACTAMENTE igual que en toda la casa (18 sep 2026). Lo que
   cambia no es la píldora sino lo que tiene debajo: un platito del color del
   cuerpo de la carta. Antes le cambiaba el fondo a la píldora para que se leyera
   sobre la franja, y eso era inventar una variante de estado que no existe. */
.lv-card--brand>.cover>.st{position:absolute;top:8px;right:8px;z-index:2;
 display:inline-flex;border-radius:var(--r-full);background:var(--surface-default);backdrop-filter:blur(8px)}

/* El cuerpo: nombre, categoría y quién está dentro. */
.lv-card--brand>.bd{display:flex;flex-direction:column;gap:var(--sp-2);min-width:0;flex:1 1 50%;min-height:0;padding:var(--sp-10) var(--sp-16)}
.lv-card--brand>.bd>.nm{font-family:var(--font-canvas);font-size:var(--fs-titleL);line-height:var(--lh-titleL);font-weight:400;letter-spacing:-.01em;
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lv-card--brand>.bd>.sg{font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lv-card--brand>.bd>.who{margin-top:auto;display:flex;align-items:center;gap:var(--sp-8);min-width:0;flex:0 0 auto;padding-top:var(--sp-6)}
.lv-card--brand>.bd>.who .lv-avatar{width:22px;height:22px;font-size:8.5px;letter-spacing:.01em}
.lv-card--brand>.bd>.who .lv-avatars>.lv-avatar{margin-left:-6px;box-shadow:0 0 0 1.5px var(--surface-default)}
.lv-card--brand>.bd>.who .lv-avatars>.lv-avatar:first-child{margin-left:0}

/* Muestrario de la portada en el lápiz: la MISMA franja que va a salir en la
   carta, para que lo que se elige sea lo que se ve — incluida la neutra de
   cuando la marca aún no tiene paleta. */
/* La fila de marca lleva la misma personalización que la carta, reducida a una
   barra: la paleta en vertical a la izquierda del nombre. Sin paleta, un filete
   apagado — nunca un hueco vacío, que es lo que pasaría con una miniatura. */
.lv-brandbar{display:block;width:4px;height:28px;flex:0 0 auto;border-radius:var(--r-full);
 background:color-mix(in srgb,var(--text-primary) 14%,transparent)}

.lv-cover-preview{display:block;height:40px;border-radius:10px;overflow:hidden;
 border:1px solid var(--border-subtle);
 background:repeating-linear-gradient(115deg,var(--surface-raised) 0 30px,color-mix(in srgb,var(--text-primary) 7%,var(--surface-raised)) 30px 60px)}
@media(max-width:1100px){.lv-cards--spaces{grid-auto-flow:row;grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:700px){.lv-cards--spaces{grid-auto-flow:row;grid-template-columns:1fr}}

/* ══ pill · badge ═══════════════════════════════════════════════════════ */
.lv-pill{display:inline-flex;align-items:center;gap:var(--sp-8);height:var(--ctl-sm);
 padding:0 var(--sp-12);border-radius:var(--r-full);font-size:var(--fs-labelM);
 font-weight:600;border:1px solid var(--border-subtle);color:var(--text-secondary)}
.lv-pill--accent{color:var(--brand-primary-tint);border-color:var(--border-accent);
 background:color-mix(in srgb,var(--brand-primary) 12%,transparent)}
.lv-pill--accent i{width:6px;height:6px;border-radius:var(--r-full);
 background:var(--brand-primary);display:block;flex:0 0 auto}
/* LEGADO (6 sep 2026): .lv-badge queda para documentos/deck; en chrome la pastilla es .lv-status (--warn para avisos). */
.lv-badge{display:inline-flex;align-items:center;padding:var(--sp-4) var(--sp-8);
 border-radius:var(--r-full);border:1px solid var(--border-accent);
 background:color-mix(in srgb,var(--brand-primary) 12%,transparent);
 color:var(--brand-primary-tint);font-size:var(--fs-labelS);line-height:var(--lh-labelS);
 font-weight:600;letter-spacing:.12em;text-transform:uppercase}
.lv-badge--warn{border-color:var(--status-warning);color:var(--status-warning-text);
 background:var(--status-warning-bg)}

/* ══ chip de filtro ═════════════════════════════════════════════════════
   Promovido el 2 sep 2026: lo tenian el deck (.chip) y el SOW (.cvtab) con
   dos maquetas distintas. Activo = relleno neutro inverso, como el segmentado. */
.lv-chips{display:flex;flex-wrap:wrap;gap:var(--sp-6);margin-bottom:var(--sp-12)}
.lv-chip{display:inline-flex;align-items:center;gap:var(--sp-6);height:var(--ctl-xs);
 padding:0 var(--sp-12);border-radius:var(--r-full);border:1px solid var(--border-default);
 background:transparent;color:var(--text-secondary);font-family:inherit;
 font-size:var(--fs-labelM);line-height:1;font-weight:500;cursor:pointer;white-space:nowrap;
 transition:border-color var(--motion-fast),color var(--motion-fast),background var(--motion-fast)}
.lv-chip:hover{border-color:var(--border-strong);color:var(--text-primary)}
.lv-chip i{font-style:normal;font-size:var(--fs-labelXS);color:var(--text-muted);
 font-variant-numeric:tabular-nums}
/* Activo = tinte magenta (Kit v1, 5 sep 2026): el magenta señala estado en toda
   la casa -chips, segmentado, fila activa del menú de Kore- y el relleno neutro
   inverso queda solo para el botón --solid, que es acción. */
.lv-chip.is-on,.lv-chip.on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);
 border-color:color-mix(in srgb,var(--brand-primary) 55%,transparent);color:var(--text-accent)}
.lv-chip.is-on i,.lv-chip.on i{color:var(--text-accent);opacity:.7}

/* ══ eyebrow · rotulo de seccion dentro de un panel ═════════════════════
   Promovido el 2 sep 2026: NDA (.fs-h), deck (.two-h), SOW (.ph .cvsec .sgb h3).
   Neutro a proposito: el magenta se reserva a estado y a CTA. */
.lv-eyebrow{display:block;margin:0 0 var(--sp-10);font-size:var(--fs-labelS);
 line-height:var(--lh-labelS);font-weight:600;letter-spacing:.12em;
 text-transform:uppercase;color:var(--text-tertiary)}
/* Rótulo sin el margen de la columna: va en una fila con otra cosa al lado. */
.lv-eyebrow--tight{margin-bottom:0}

/* ══ Título de página (7 sep) ═══════════════════════════════════════════════
   El título vive en el SUELO, no dentro de una tarjeta (regla 1 de proporción):
   rótulo opcional encima, titular en DM Sans —los espacios de Studio hablan con
   la voz de la marca, excepción del 3 sep— y una entradilla debajo. Comercial,
   Proyectos y el 404 lo escribían cada uno por su cuenta, con 40, 30 y 40.
   La ÚNICA excepción es el saludo de la home: ver .lv-page-title--home. */
.lv-page-title{margin:0;font-family:var(--font-canvas);font-size:40px;line-height:1.1;
 font-weight:400;letter-spacing:-.02em;color:var(--text-primary)}
.lv-page-title>em{font-style:normal;color:var(--text-accent)}
.lv-page-lead{margin:var(--sp-16) 0 0;max-width:62ch;
 font-size:var(--fs-bodyL);line-height:var(--lh-bodyL);color:var(--text-muted)}
/* La cabecera de un espacio (13 oct 2026, auditoría): el título a la izquierda y la acción
   principal del espacio a la derecha, en la línea de abajo. Igual en Projects, Toolkit y Comercial. */
.lv-page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--sp-24)}
.lv-page-head>.act{flex:0 0 auto;display:flex;gap:var(--sp-8)}
/* El recuento va en el título, entre paréntesis y apagado (regla 4 de proporción): «Marcas (2)».
   La etiqueta con caja queda para estados. */
.lv-paren{color:var(--text-muted);font-weight:400;font-variant-numeric:tabular-nums}
/* El saludo de la home: la única tipografía de la casa fuera de la escala, y a
   propósito (Pedro, 7 sep) — es la singularidad de la portada. Fluido con el ALTO
   de la ventana, no con el ancho: por encima de 10,5vh el titular empujaría la
   fila de espacios fuera del pliegue en una pantalla baja. La fecha va ENCIMA,
   haciendo de rótulo, en la misma familia: dice cuándo y luego quién. */
.lv-page-title--home{font-size:clamp(44px,10.5vh,96px);line-height:1.02;letter-spacing:-.025em}
.lv-page-title--home>span{display:block}
.lv-page-date{margin:0 0 14px;font-family:var(--font-canvas);font-size:20px;line-height:1.3;
 font-weight:400;letter-spacing:-.01em;color:var(--text-muted)}
/* Pie de página (8 sep 2026): la última línea de una pantalla de Kore. Texto pequeño en
   terciario y, a la derecha, enlaces discretos (el kit para desarrolladores, ayuda). Sin fondo:
   un filete arriba y aire. margin-top:auto lo pega al fondo de una columna flex. Solo texto e
   iconos de 14; nunca botones. Enlace: apagado, primario al pasar, subrayado solo al pasar. */
.lv-page-foot{margin-top:auto;padding:var(--sp-16) 0 0;border-top:1px solid var(--border-subtle);
 display:flex;align-items:center;gap:var(--sp-16);flex-wrap:wrap;
 font-family:var(--font-ui);font-size:var(--fs-labelM);line-height:var(--lh-labelM);font-weight:500;color:var(--text-tertiary)}
.lv-page-foot>span{flex:1 1 auto;min-width:0}
.lv-page-foot a{display:inline-flex;align-items:center;gap:var(--sp-6);color:var(--text-muted);text-decoration:none;
 border-radius:var(--r-sm);transition:color var(--motion-fast)}
.lv-page-foot a:hover{color:var(--text-primary);text-decoration:underline;text-underline-offset:3px}
.lv-page-foot a:focus-visible{outline:2px solid color-mix(in srgb,var(--brand-primary) 40%,transparent);outline-offset:3px}
.lv-page-foot a svg{width:14px;height:14px;flex:0 0 auto}
.lv-eyebrow--rule{padding-bottom:var(--sp-8);border-bottom:1px solid var(--border-subtle);
 margin-bottom:var(--sp-12)}
/* Cabecera plegable de sección: el eyebrow hecho botón, con el chevron y el recuento del
   conmutador de la fila de navegación (.lv-navrow-tog): chevron 12 que gira 90° al abrir,
   recuento mono en --text-accent. Funciona como <button aria-expanded> o como <summary>
   dentro de <details class="lv-fold"> (sin JS: los generadores). Hover: texto primario. */
.lv-eyebrow--toggle{display:inline-flex;align-items:center;gap:var(--sp-6);margin:0;min-height:24px;padding:0 var(--sp-6) 0 0;
 border:0;border-radius:var(--r-sm);background:none;cursor:pointer;color:var(--text-tertiary);font:inherit;
 font-size:var(--fs-labelS);line-height:var(--lh-labelS);font-weight:600;letter-spacing:.12em;text-transform:uppercase;
 transition:color var(--motion-fast);list-style:none;user-select:none}
.lv-eyebrow--toggle::-webkit-details-marker{display:none}
.lv-eyebrow--toggle>svg{width:12px;height:12px;flex:0 0 auto;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
 transition:transform var(--motion-fast)}
.lv-eyebrow--toggle[aria-expanded="true"]>svg,.lv-fold[open]>.lv-eyebrow--toggle>svg{transform:rotate(90deg)}
.lv-eyebrow--toggle:hover{color:var(--text-primary)}
.lv-eyebrow--toggle:focus-visible{outline:none;box-shadow:0 0 0 2px var(--border-focus)}
.lv-eyebrow--toggle>.n{font-variant-numeric:tabular-nums;font-size:var(--fs-labelS);letter-spacing:0;text-transform:none;font-weight:500;
 color:var(--text-accent);font-variant-numeric:tabular-nums}
.lv-eyebrow--toggle:disabled,.lv-eyebrow--toggle.is-off{color:var(--text-disabled);cursor:default}
.lv-fold>.lv-eyebrow--toggle+*{margin-top:var(--sp-8)}

/* ══ barra superior · una para la home y para cada herramienta ══════════ */
.lv-bar{display:flex;align-items:center;gap:var(--sp-12);height:var(--ctl-bar);
 padding:0 var(--sp-20);background:color-mix(in srgb,var(--surface-modal) 88%,transparent);
 backdrop-filter:blur(20px) saturate(140%);
 border-bottom:1px solid var(--border-subtle)}
.lv-crumb{display:flex;align-items:center;gap:var(--sp-8);min-width:0;
 font-size:var(--fs-titleS);color:var(--text-muted);white-space:nowrap;overflow:hidden}
.lv-crumb i{width:8px;height:8px;border-radius:var(--r-full);
 background:var(--brand-primary);display:block;flex:0 0 auto}
.lv-crumb em{font-style:normal;opacity:.5}
.lv-crumb b{color:var(--text-primary);font-weight:600;overflow:hidden;text-overflow:ellipsis}
.lv-crumb b{min-width:44px}
.lv-crumb>svg{width:16px;height:16px;flex:0 0 auto;opacity:.5;fill:none;stroke:currentColor;
 stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.lv-crumb .t-labelXS{color:var(--text-tertiary);letter-spacing:.08em}
/* barra de aplicacion (Kore): el chrome comparte el suelo de la pagina y se separa
   con un filete, no con otro relleno; el vidrio es de la barra de herramienta. */
.lv-bar--app{background:var(--surface-chrome);backdrop-filter:none;padding:0;gap:0}
.lv-bar--app>*{height:100%;display:flex;align-items:center}
.lv-bar--app>.lv-crumb{padding:0 var(--sp-20);flex:1 1 auto}
/* Hueco que estira cuando la barra no lleva migas (home, proyectos, espacios): del kit y no
   de Tailwind, porque `.lv-bar>*{flex:0 0 auto}` gana a una utilidad de la misma especificidad. */
.lv-bar--app>.lv-bar-fill{flex:1 1 auto;min-width:0}
/* alto util bajo la barra: sustituye a los calc(100dvh - 4rem) escritos a mano */
.lv-below-bar{height:calc(100dvh - var(--ctl-bar))}
.lv-below-bar--min{min-height:calc(100dvh - var(--ctl-bar))}

/* ══ stepper vertical ═══════════════════════════════════════════════════ */
.lv-step{display:flex;gap:var(--sp-12);align-items:flex-start;text-align:left;
 padding:var(--sp-12) var(--sp-16);border-radius:var(--r-xl);
 transition:background var(--motion-standard)}
.lv-step:hover{background:color-mix(in srgb,var(--text-primary) calc(var(--state-hover)*100%),transparent)}
.lv-step.is-on{background:color-mix(in srgb,var(--text-primary) 6%,transparent)}
.lv-step-n{flex:0 0 auto;width:22px;height:22px;border-radius:var(--r-full);
 display:flex;align-items:center;justify-content:center;
 font-size:var(--fs-labelS);font-weight:600;border:1px solid var(--border-subtle);
 color:var(--text-muted);transition:all var(--motion-standard)}
.lv-step.is-on .lv-step-n{background:var(--brand-primary);border-color:var(--text-accent);
 color:var(--text-on-accent)}
.lv-step.is-done .lv-step-n,.lv-step.dn .lv-step-n{background:var(--brand-primary-subtle);
 border-color:color-mix(in srgb,var(--brand-primary) 45%,transparent);color:var(--text-accent)}
/* Robusta frente al tag: el SOW compone el paso con <i> y <em>, que son
   cursiva por defecto. La primitiva lo normaliza en vez de exigir markup. */
.lv-step-b,.lv-step-t,.lv-step-v{font-style:normal}
.lv-step-b{display:block;min-width:0;flex:1}
.lv-step-t{display:block;font-size:var(--fs-titleS);line-height:var(--lh-titleS);
 font-weight:600;color:var(--text-secondary)}
.lv-step.is-on .lv-step-t{color:var(--text-primary)}
.lv-step-v{display:block;font-size:var(--fs-bodyS);line-height:var(--lh-bodyS);
 color:var(--text-muted);margin-top:2px;overflow:hidden;text-overflow:ellipsis;
 white-space:nowrap}
.lv-step.is-on .lv-step-v{color:var(--text-accent)}
.lv-step.is-done .lv-step-v{color:var(--text-secondary)}
/* Visitado e incompleto: triángulo de aviso en ámbar en vez del tick (antes lo
   pintaba solo Kore como .kore-warn; desde el 5 sep es del sistema). */
.lv-step.is-warn .lv-step-n,.lv-step.kore-warn .lv-step-n{background:color-mix(in srgb,var(--status-warning) 16%,transparent);
 border-color:color-mix(in srgb,var(--status-warning) 55%,transparent);color:var(--status-warning)}
.lv-step.is-warn .lv-step-n svg,.lv-step.kore-warn .lv-step-n svg{width:12px;height:12px;display:block}
.lv-step.is-warn .lv-step-v,.lv-step.kore-warn .lv-step-v{color:var(--status-warning)}
.lv-step-n svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* ══ CHROME DE HERRAMIENTA ═════════════════════════════════════════════
   Lo comparten TODAS las herramientas de Livit OS. Un asistente nuevo no
   maqueta su cabecera, su columna de pasos ni su panel: usa esto.
   Las reglas estilan tambien por estructura (.lv-panel h2, .lv-field input)
   para que una herramienta ya existente no tenga que reetiquetar todo. ══ */
.lv-toolhead{display:flex;align-items:center;gap:var(--sp-16);
 padding:var(--sp-20) var(--sp-32);margin-bottom:var(--sp-24);
 border-bottom:1px solid var(--border-subtle)}
.lv-toolhead-m,.lv-toolhead-m svg{width:34px;height:15.3px;display:block;flex:0 0 auto}
.lv-toolhead-t{display:block;margin:0;
 font-size:var(--fs-titleL);line-height:var(--lh-titleL);font-weight:500;
 letter-spacing:-.01em}
.lv-toolhead-s{display:block;margin-top:2px;font-size:var(--fs-labelS);
 line-height:var(--lh-labelS);font-weight:600;letter-spacing:.1em;
 text-transform:uppercase;color:var(--text-muted)}

/* segmentado de dos o tres opciones — el selector de idioma de cada herramienta */
.lv-seg{margin-left:auto;display:flex;gap:var(--sp-4);padding:var(--sp-4);
 border-radius:var(--r-lg);border:1px solid var(--border-subtle);
 background:color-mix(in srgb,var(--text-primary) 5%,transparent)}
.lv-seg button{height:var(--ctl-sm);padding:0 var(--sp-10);border-radius:var(--r-md);
 font-size:var(--fs-labelM);font-weight:600;letter-spacing:.04em;color:var(--text-muted);
 white-space:nowrap;min-width:0;overflow:hidden;text-overflow:ellipsis;
 transition:background var(--motion-fast),color var(--motion-fast)}
.lv-seg button:hover:not(:disabled){color:var(--text-secondary)}
/* Una opcion que hoy no se puede elegir: se ve, se lee y no responde. Quitarla
   haria pensar que no existe, y lo que hace falta saber es que existe. */
.lv-seg button:disabled{opacity:.42;cursor:not-allowed}
.lv-seg button.is-on,.lv-seg button.on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);
 box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand-primary) 55%,transparent);color:var(--text-accent)}
.lv-seg--inline{margin-left:0;display:inline-flex}   /* en un bloque, ancho de su contenido: no se estira (15 sep 2026) */
/* a todo el ancho de su columna (panel de propiedades): cada opción crece según su texto, ninguna se recorta */
.lv-seg--fill{margin-left:0;width:100%} .lv-seg--fill button{flex:1 1 auto}
/* Talla compacta: opciones de 28 (chip) en un contenedor de 32. Para un conmutador
   que va en línea con un rótulo (la divisa del SOW). Antes era un ajuste solo de Kore. */
.lv-seg--sm{padding:2px;gap:2px}
.lv-seg--sm button{height:var(--ctl-xs);padding:0 var(--sp-10);font-size:var(--fs-labelS);font-weight:500;letter-spacing:.02em}

.lv-toolwrap{display:grid;grid-template-columns:250px minmax(0,1fr);grid-template-rows:auto 1fr;
 gap:var(--sp-24);align-items:start;padding:0 var(--sp-32) var(--sp-40);width:100%}
/* El canvas central se adapta al ancho de la pagina: la columna de pasos es
   fija y el panel se queda con todo lo demas. Sin tope de 1180 px. */
.lv-side{position:sticky;top:var(--sp-24);display:flex;flex-direction:column;
 gap:var(--sp-2);min-width:0}
.lv-panel{min-width:0;border:1px solid transparent;
 border-radius:var(--r-2xl);background:var(--surface-default);padding:var(--sp-24);
 box-shadow:var(--shadow-card)}
/* El título del paso va EN EL SUELO (Pedro, 6 sep 2026: regla 1 de proporción de Kore —el
   título de una vista se escribe sobre el fondo y las tarjetas empiezan debajo con solo
   contenido—). livit-controls.js saca .lv-panel-t / .lv-panel-d a un .lv-panel-head que
   precede al panel; en la rejilla del wizard el stepper ocupa las dos filas. */
.lv-panel-head{grid-column:2;min-width:0;margin:0 0 calc(-1 * var(--sp-8));padding:0}
.lv-toolwrap>.lv-side{grid-row:1 / span 2}
.lv-toolwrap>.lv-panel{grid-column:2}
.lv-panel-t,.lv-panel h2,.lv-panel-head .lv-panel-t,.lv-panel-head h2{display:block;margin:0 0 var(--sp-6);
 font-size:var(--fs-headline);line-height:var(--lh-headline);font-weight:500;
 letter-spacing:-.014em;max-width:78ch;color:var(--text-primary)}
.lv-panel-d,.lv-panel>p,.lv-panel-head .lv-panel-d,.lv-panel-head p{margin:0 0 var(--sp-20);font-size:var(--fs-bodyM);
 line-height:var(--lh-bodyM);color:var(--text-muted);max-width:70ch}
.lv-panel-head .lv-panel-d,.lv-panel-head p{margin-bottom:var(--sp-16)}
.lv-panel-d b,.lv-panel>p b{color:var(--text-secondary);font-weight:600}
/* Rotulo de grupo DENTRO de un paso: separa dos decisiones en el mismo panel
   -idioma y tipologia en el SOW, idioma y linea de venta en el Sales Deck-.
   Sube al sistema el 21 sep 2026, cuando dejo de usarlo un solo generador. */
.lv-panel-h{margin:var(--sp-20) 0 var(--sp-8);font-size:var(--fs-labelS);line-height:var(--lh-labelS);
 letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);font-weight:600}
.lv-cards+.lv-panel-h{margin-top:var(--sp-24)}
.lv-fields-3+.lv-panel-h{margin-top:var(--sp-8)}
/* Columna medida (regla 12): los grupos de campos del panel no pasan de 760; tiles, gantt y tablas sí. */
.lv-panel .lv-fields-2,.lv-panel .lv-fields-3,.lv-panel>.lv-field,.lv-panel .fs,.lv-panel .grid,.lv-panel>.lv-cards{max-width:760px}   /* también la elección de idioma (Pedro, 6 sep) */

/* Pie de acciones (criterio UX, Pedro 6 sep 2026): la acción que AVANZA o cierra va abajo a la
   DERECHA, donde termina la lectura; Atrás / Cancelar inmediatamente a su izquierda, en ghost;
   la nota de estado a la izquierda del pie; una acción destructiva (Borrar) también a la
   izquierda, separada del par que avanza. Siempre igual, haya nota o no: antes, sin nota, los
   botones se iban a la izquierda. */
.lv-nav{display:flex;align-items:center;justify-content:flex-end;gap:var(--sp-10);margin-top:var(--sp-24);
 padding-top:var(--sp-20);border-top:1px solid var(--border-subtle)}
.lv-nav-note{margin-right:auto;font-size:var(--fs-bodyS);line-height:var(--lh-bodyS);
 color:var(--text-muted)}
.lv-nav>span:empty{margin-right:auto}
.lv-nav>.lv-btn--danger{margin-right:auto}
/* Pie de panel (Kore · panel de propiedades, 7 sep): el MISMO .lv-nav pegado al fondo del
   panel —sin margen, relleno 12/16, no crece—. No lleva «Guardar»: los campos persisten
   solos al rellenarse, así que queda la destructiva (peligro + papelera) a la izquierda y,
   si la hay, la acción que añade a la derecha. */
.lv-nav--panel{margin-top:0;padding:var(--sp-12) var(--sp-16);flex:0 0 auto}

/* ══ REGISTRO «SLIDE» ══════════════════════════════════════════════════
   Filete 16:9 para decks. Tercer registro, junto a producto y papel.
   Unidad: 1280 x 720 px, que a 96 ppp son exactamente 13,333 x 7,5 in — la
   medida 16:9 estandar de presentacion. Asi la pantalla y el PDF usan el
   MISMO numero y no hay dos maquetas.
   Dentro de un slide se compone con la escala de canvas (DM Sans), porque es
   pieza que ve el cliente. Los tamanos de Figma van a 1920: aqui se dividen
   entre 1,5. ══ */
:root{--slide-w:1280px; --slide-h:720px; --slide-sc:1}

.lv-deck{background:var(--surface-raised);min-height:100vh}
.lv-stage{position:relative;display:flex;align-items:center;justify-content:center;
 min-height:calc(100vh - var(--ctl-bar));overflow:hidden}
/* EN EL DOCUMENTO, EL ACENTO ES EL MAGENTA DE MARCA. La auditoría del 24 sep
   pasó el texto magenta a --text-accent (brand-300 en oscuro) para la INTERFAZ,
   y de rebote las diapositivas —titulares en serif, cifras, «Phase 0», el
   contacto— salieron rosas. Una diapositiva es lienzo de marca, no interfaz:
   dentro de ella --text-accent vuelve a ser #E6007E. Los tonos que el Figma
   pide a propósito (brand-300 del filete oscuro, brand-400/700 de las teselas)
   van con su paso explícito y no cambian. (Pedro, 29 sep 2026) */
.lv-slide{--text-accent:var(--brand-primary)}
.lv-slide{position:relative;flex:0 0 auto;width:var(--slide-w);height:var(--slide-h);
 overflow:hidden;background:var(--bg-base);color:var(--text-primary);
 font-family:var(--font-canvas);
 transform:scale(var(--slide-sc));transform-origin:center center;
 box-shadow:var(--shadow-page)}
.lv-slide--paper{background:var(--paper-bg);color:var(--paper-text)}
.lv-slide *{box-sizing:border-box}
/* margen de seguridad: 80 px a 1280, el equivalente a 120 en Figma */
.lv-slide-in{position:absolute;inset:80px;display:flex;flex-direction:column}
.lv-slide-bleed{position:absolute;inset:0}
.lv-slide-bleed img{width:100%;height:100%;object-fit:cover;display:block}
/* marca y folio, iguales en toda diapositiva */
.lv-slide-mark{position:absolute;left:80px;bottom:44px;width:52px;height:23.4px}
.lv-slide-mark svg{width:100%;height:100%;display:block}
.lv-slide-no{position:absolute;right:80px;bottom:44px;font-family:var(--font-ui);
 font-size:var(--fs-labelS);line-height:var(--lh-labelS);font-weight:600;
 letter-spacing:.14em;color:var(--text-muted)}
.lv-slide--paper .lv-slide-no{color:var(--paper-meta)}

/* barra de presentacion */
.lv-deck-nav{margin-left:auto;display:flex;align-items:center;gap:var(--sp-8)}
.lv-dots{display:flex;gap:var(--sp-6);align-items:center}
.lv-dots button{width:7px;height:7px;padding:0;border-radius:var(--r-full);
 background:var(--border-strong);transition:background var(--motion-fast),
 transform var(--motion-fast)}
.lv-dots button.is-on{background:var(--brand-primary);transform:scale(1.5)}
.lv-deck-ct{font-family:var(--font-ui);font-size:var(--fs-labelM);font-weight:600;
 color:var(--text-muted);font-variant-numeric:tabular-nums;min-width:52px;
 text-align:center}

/* ── composicion de diapositiva ─────────────────────────────────────────────
   En pantalla se ve una; al imprimir se ven todas (el bloque @media print de
   mas abajo devuelve el display con !important). Todo lo que compone un
   filete vive aqui: ninguna herramienta vuelve a declararlo. ══ */
.lv-stage>.lv-slide{display:none}
.lv-stage>.lv-slide.is-on{display:block}

/* linea de firma y marca, arriba, en cualquier filete */
.lv-slide-tag{position:absolute;left:80px;top:21px;font-size:var(--fs-cLabelS);
 line-height:var(--lh-cLabelS);letter-spacing:.02em;color:var(--text-muted)}
.lv-slide--paper .lv-slide-tag{color:var(--paper-meta)}
.lv-slide-brand{position:absolute;right:80px;top:18px;width:52px;height:23.4px}
.lv-slide-brand svg{width:100%;height:100%;display:block}

/* titular de filete: la primera linea en acento, como en la plantilla */
.lv-slide-h{margin:0;font-size:var(--fs-cDisplayM);line-height:var(--lh-cDisplayM);
 font-weight:400;letter-spacing:-.03em;max-width:900px}
.lv-slide-h--s{font-size:var(--fs-cDisplayS);line-height:var(--lh-cDisplayS);
 letter-spacing:-.025em}
.lv-slide-h--c{max-width:none;text-align:center}
.lv-slide-h--m{font-size:var(--fs-cDisplayM);line-height:var(--lh-cDisplayM);max-width:none}
/* ══ REGLA DE CASA ══════════════════════════════════════════════════════════
   El acento es SIEMPRE Instrument Serif en cursiva y en magenta. Sin
   excepciones y en todos los registros: titular, filete fotografico, rotulo de
   rejilla, cifra. Es la firma de enfasis de Livit y asi la usa el propio SOW en
   la pagina 7. ══ */
.lv-em,.lv-slide-h em,.lv-slide-cover h1 em,.lv-serif{
 font-family:var(--font-accent);font-style:italic;font-weight:400;
 letter-spacing:0;color:var(--text-accent)}
.lv-slide--paper .lv-slide-h{color:var(--paper-text)}
.lv-slide--paper .lv-slide-h em{color:var(--text-accent)}
.lv-slide-lead{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-32);
 max-width:680px;margin-top:var(--sp-24)}
.lv-slide-lead p{margin:0;font-size:var(--fs-cBodyM);line-height:var(--lh-cBodyM);
 color:var(--text-secondary)}
.lv-slide-lead--one{grid-template-columns:1fr}

/* portada: foto a sangre, velo y bloque de titulo */
.lv-slide-glow{position:absolute;inset:0;background:
 radial-gradient(118% 88% at 78% 10%,
  color-mix(in srgb,var(--brand-primary) 26%,transparent) 0%,transparent 62%),
 radial-gradient(92% 72% at 6% 98%,
  color-mix(in srgb,var(--brand-primary) 15%,transparent) 0%,transparent 58%)}
.lv-slide-scrim{position:absolute;inset:0;background:
 linear-gradient(to top,
  color-mix(in srgb,var(--neutral-1000) 88%,transparent) 0%,
  color-mix(in srgb,var(--neutral-1000) 40%,transparent) 42%,
  transparent 74%),
 linear-gradient(to right,
  color-mix(in srgb,var(--neutral-1000) 62%,transparent) 0%,
  color-mix(in srgb,var(--neutral-1000) 12%,transparent) 46%,
  transparent 70%),
 linear-gradient(to bottom,
  color-mix(in srgb,var(--neutral-1000) 46%,transparent) 0%,
  transparent 17%)}
.lv-slide--photo .lv-slide-tag{color:var(--text-secondary)}
.lv-slide-cover{position:absolute;left:80px;bottom:150px;max-width:860px}
.lv-slide-cover h1{margin:0;font-size:var(--fs-cDisplay2XL);line-height:var(--lh-cDisplay2XL);
 font-weight:500;letter-spacing:-.04em;color:var(--text-primary)}
.lv-slide-cover--s h1{font-size:var(--fs-cDisplayS);line-height:var(--lh-cDisplayS)}
/* Antetitulo de portada: lo pinta la linea de venta que lo necesita -el deck de
   hoteles dice «Hospitality · F&B Strategy»-; el de F&B no lo lleva. Mismo
   registro que el rotulo de las oficinas: acento, versalita y tracking largo. */
.lv-slide-kicker{display:block;margin:0 0 var(--sp-20);font-size:var(--fs-cLabelXS);
 line-height:var(--lh-cLabelXS);font-weight:500;letter-spacing:.16em;
 text-transform:uppercase;color:var(--text-accent)}
.lv-slide-cover h1 em{padding-right:.06em}
.lv-slide-cover p{margin:var(--sp-20) 0 0;font-size:var(--fs-cHeadline);
 line-height:var(--lh-cHeadline);font-weight:300;color:var(--text-primary)}
/* bloque de oficinas: el de la portada del SOW, tres columnas repartidas.
   Rotulo en acento, versalita y tracking largo; direccion en dos lineas. */
/* Como en la portada del SOW: tres columnas de margen a margen, la primera
   alineada a la izquierda y la ultima acabando en el margen derecho. Con
   1fr 1fr 1fr el bloque se quedaba escorado a la izquierda. */
.lv-slide-addr{position:absolute;left:80px;right:80px;bottom:64px;
 display:grid;grid-template-columns:repeat(3,auto);justify-content:space-between;
 gap:var(--sp-32)}
/* Pedro: los tres bloques alineados a la izquierda; el reparto de margen a
   margen lo sigue haciendo justify-content:space-between. */
.lv-slide-addr b{display:block;font-size:var(--fs-cLabelXS);line-height:var(--lh-cLabelXS);
 font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--text-accent)}
.lv-slide-addr span{display:block;margin-top:var(--sp-2);font-size:var(--fs-cLabelS);
 line-height:var(--lh-cLabelS);color:var(--text-secondary)}

/* ══ registro claro de marca ═════════════════════════════════════════════════
   El sitio publico de Livit no es ciruela oscuro: es un rosa degradado con
   texto casi negro. Esas composiciones vivian solo en livit-web-standalone;
   suben aqui para que el deck y el sitio compartan fondo, linea y acento. ══ */
:root{
  /* OJO con el final del degradado: 'transparent' es negro con alfa 0, asi que
     un degradado de color a transparent interpola por gris. El sitio lo evitaba
     usando el mismo rosa con alfa 0; aqui se consigue con un color-mix al 2%,
     que conserva el tono. Se vio imprimiendo: en pantalla apenas se nota, en el
     PDF salia una banda gris en la esquina. */
  --grad-pink:radial-gradient(1000px 760px at 92% 4%,
    var(--grad-blush-1) 0%,
    color-mix(in srgb, var(--grad-blush-1) 2%, transparent) 55%),
   linear-gradient(155deg, var(--grad-blush-2) 0%,
    var(--grad-blush-3) 58%, var(--grad-blush-4) 100%);
  --grad-goldmag:linear-gradient(102deg,var(--grad-warm-1) 0%,
    var(--grad-warm-2) 38%,var(--grad-warm-3) 76%,var(--grad-warm-4) 100%);
  --line-light:color-mix(in srgb,var(--neutral-1000) 16%,transparent);
  --line-dark:color-mix(in srgb,var(--neutral-0) 14%,transparent);
}
.lv-slide--rose{background:var(--grad-pink);color:var(--neutral-925)}
.lv-slide--rose .lv-slide-h{color:var(--neutral-925)}
.lv-slide--rose .lv-slide-tag{color:var(--grad-plum-9)}
.lv-slide--rose .lv-slide-lead p{color:var(--grad-plum-9)}
.is-anim .lv-slide--rose .lv-rv .w{color:var(--grad-plum-13)}

/* la cursiva de Instrument Serif en acento: la firma tipografica del sitio */


/* ══ cifras ═════════════════════════════════════════════════════════════════
   El bloque #about del sitio, tal cual: titular ancho, filete y una fila de
   numeros grandes en acento con su pie. ══ */
/* Los cortes de linea vienen dados por x/stats.json, asi que la medida maxima
   sobra: lo unico que hacia era partir «en algun lugar del mundo.» en dos. */
.lv-slide-h--xl{font-size:var(--fs-cDisplayL);line-height:var(--lh-cDisplayL)}
/* El filete de manifiesto -«We create concepts and brands that perform.»- va al
   cuerpo del hero, el mismo de la portada: es la frase que sostiene el filete y
   los cortes de linea vienen dados, asi que no necesita medida maxima.
   La entradilla sube al cuerpo del subtitulo de portada: mismo papel, mismo
   tamano (Pedro, 21 sep 2026). */
.lv-slide-h--hero{font-size:var(--fs-cDisplayXL);line-height:var(--lh-cDisplayXL);
 max-width:none}
/* La entradilla guarda con el titular la misma proporcion que tenia a 96/28:
   76/22 es 3,45 contra 3,43. Baja con el, no se queda suelta. */
/* OJO: el filete 2 esta APROBADO (Pedro, 21 sep) con la entradilla a 22 y con su
   corte de linea. No se toca al ajustar los subtitulos de los filetes nuevos. */
.lv-slide-lead--big p{font-size:var(--fs-cTitleL);line-height:var(--lh-cTitleL);
 font-weight:300;color:var(--text-primary)}
/* Columna de cifras: cada linea es cifra a la derecha de su medianil y
   descripcion al lado. Se lee como una tabla, y la descripcion pesa lo
   suficiente para no quedar de pie de foto. */
/* Dos columnas equilibradas: titular a la izquierda, cifras a la derecha en
   rejilla de dos por dos. La descripcion va DEBAJO de su cifra y mas fina. */
.lv-statcol{display:grid;grid-template-columns:1fr 1fr;align-content:center;
 gap:var(--sp-40) var(--sp-32);width:520px;flex:0 0 auto;margin-left:auto}
/* Los logotipos del muro van en MULTIPLICAR (Pedro, 21 sep 2026). Unos cuantos
   -Melia, Iberostar, Pullman, Oxagon...- traen un recuadro blanco opaco dentro
   del propio arte, y sobre el papel del filete se veian como cajas. Multiplicar
   hace que ese blanco desaparezca contra el papel y deja la tinta intacta; el
   blanco que vive DENTRO de una mancha oscura sigue leyendose, porque cada
   pixel se mezcla con el papel, no con el resto del logotipo. */
.lv-wallgrid img{mix-blend-mode:multiply}

/* Tres cifras, dos composiciones (21 sep 2026):
   --stack  las tres en columna a la derecha, repartidas para que el bloque
            mida aproximadamente lo que mide el titular de al lado.
   .lv-statrow  las tres en fila a lo ancho, debajo del titular y la entradilla. */
.lv-statcol--stack{grid-template-columns:1fr;width:320px;gap:var(--sp-32)}
.lv-statrow{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-32)}
/* Sin filete divisorio en ninguna de las dos (Pedro, 21 sep 2026): el aire
   separa. F&B alinea a la derecha, contra el margen; hospitality centra cada
   cifra en su tercio. */
.lv-statcol--stack .lv-stat,.lv-statrow .lv-stat{border-top:0;padding-top:0}
.lv-statcol--stack .lv-stat{text-align:right}
/* Se probaron tres cuerpos de cifra contra el titular de 57 -46, 57 y 76- y
   Pedro eligio el de 57: cifra y frase al mismo cuerpo, la columna en 356 px
   contra los 285 del titular (21 sep 2026). Por eso aqui no hay override: la
   cifra se queda con el --fs-cDisplayL de .lv-stat-n. */
.lv-statcol--stack .lv-stat-n{justify-content:flex-end}
.lv-statrow .lv-stat{text-align:center}
.lv-statrow .lv-stat-n{justify-content:center}
/* La etiqueta, un escalon por debajo de la entradilla: 16 en las dos lineas. */
.lv-statcol--stack .lv-stat-l,.lv-statrow .lv-stat-l{
 font-size:var(--fs-cTitleM);line-height:var(--lh-cTitleM)}
.lv-stat{padding-top:var(--sp-12);border-top:1px solid var(--line-dark)}
.lv-slide--rose .lv-stat,.lv-slide--paper .lv-stat{border-top-color:var(--line-light)}
.lv-stat-n{display:flex;align-items:flex-start;
 font-size:var(--fs-cDisplayL);line-height:1;font-weight:400;
 letter-spacing:-.03em;color:var(--text-accent);font-variant-numeric:tabular-nums}
/* «45+» = mas de 45. Pedro (21 sep): DETRAS de la cifra y al MISMO cuerpo;
   delante y pequeno se leia como un signo suelto. */
.lv-stat-plus{font-style:normal;margin-left:.02em}
.lv-stat-l{margin-top:var(--sp-10);font-size:var(--fs-cLabelL);
 line-height:var(--lh-cLabelL);font-weight:300;color:var(--text-secondary)}
.lv-slide--rose .lv-stat-l{color:var(--grad-plum-9)}
.lv-slide--paper .lv-stat-l{color:var(--paper-meta)}
/* La entradilla sobre papel: --text-secondary es el gris del registro OSCURO y
   sobre blanco se queda casi invisible (se vio en el muro de hospitality). */
.lv-slide--paper .lv-slide-lead p{color:var(--paper-meta)}

/* ══ mapamundi · COPIA LITERAL del nodo 9374:8735 ═══════════════════════════
   Nada se genera ni se aproxima: los 2374 puntos, los 36 circulos, las once
   etiquetas y los ocho filetes salen de x/map_figma.json, volcado del nodo
   con use_figma. Todo en pixeles del deck (Figma / 1,5), colocado absoluto.
   El circulo es el componente «Pink circle» de Figma: solido d y tres discos
   concentricos a 1,395 / 1,914 / 2,531 x d con opacidad 25 / 10 / 10 %; el
   punto suelto es un disco de 15 px de Figma al 35 %, sin discos. ══ */
.lv-map2{position:absolute;inset:0}
.lv-map2-dots{position:absolute;display:block;opacity:.57}
.lv-fig{position:absolute;display:block;border-radius:var(--r-full);
 background:var(--brand-primary)}
.lv-fig--s{opacity:.35}
.lv-fig i{position:absolute;left:50%;top:50%;display:block;
 border-radius:var(--r-full);background:var(--brand-primary);
 pointer-events:none}
.lv-map2-l{position:absolute;font-family:var(--font-canvas);font-size:12px;
 line-height:14.7px;font-weight:500;letter-spacing:-.03em;
 color:var(--neutral-925);white-space:nowrap}
.lv-map2-l--c{transform:translateX(-50%)}
.lv-map2-ln{position:absolute;height:1px;
 background:color-mix(in srgb,var(--neutral-925) 55%,var(--paper-bg))}
/* titular del mapa: DM Sans 60,47 + Instrument Serif Italic 65, del nodo */
/* OJO: .lv-ln recorta (overflow:hidden para la entrada), asi que con
   line-height = cuerpo el descendente de la «g» salia cortado. Se da un par
   de puntos de aire por linea. */
.lv-map2-h{position:absolute;left:64.7px;top:78px;margin:0;
 font-family:var(--font-canvas);font-weight:400;font-size:40.3px;
 line-height:44px;letter-spacing:-.01em;
 color:color-mix(in srgb,var(--neutral-925) 88%,var(--paper-bg))}
.lv-map2-h em{font-family:var(--font-accent);font-style:italic;font-weight:400;
 font-size:43.3px;line-height:47px;letter-spacing:0;
 color:var(--text-accent)}

/* ══ one stop shop: cinta de imagenes + cuatro columnas ═════════════
   Pedro: una cinta horizontal que entra y sale de la pagina, y debajo cuatro
   columnas de tres servicios de margen a margen. La cinta sangra a los dos
   lados -de ahi el margen negativo de 80- y se mueve con un tween infinito;
   las tarjetas se amplian al pasar por encima.

   IMPRESION: la cinta deja de ser cinta. overflow:visible, la pista se vuelve
   rejilla y los duplicados de la vuelta se ocultan, asi que en el PDF salen
   todas las imagenes y ninguna cortada por el borde de la ventana. ══ */
.lv-carou{position:relative;flex:1;min-height:0;overflow:hidden;
 margin:var(--sp-16) -80px 0}
.lv-carou-t{display:flex;align-items:center;gap:var(--sp-12);height:100%;
 padding:0 var(--sp-12);will-change:transform}
/* Pedro, 16 sep 2026: las doce fotos de la cinta son verticales 2:3
   (x/shop/01..12.jpg). La tarjeta toma la altura de la cinta y saca su ancho
   de la proporcion de la foto, asi que la imagen entra ENTERA: ni recorte ni
   deformacion. El object-fit:cover se queda solo como red por si algun dia
   entra una foto de otra proporcion. */
.lv-carou-c{position:relative;flex:0 0 auto;height:92%;aspect-ratio:2/3;
 overflow:hidden;border-radius:var(--r-2xl);background:var(--brand-950);
 transition:transform var(--motion-standard),box-shadow var(--motion-standard)}
.lv-carou-c img{position:absolute;inset:0;width:100%;height:100%;
 object-fit:cover;display:block;
 transition:transform var(--motion-standard)}
.lv-carou-c:hover{transform:scale(1.06);z-index:3;
 box-shadow:var(--shadow-lift)}
.lv-carou-c:hover img{transform:scale(1.1)}
/* la cinta se difumina en los dos bordes de la hoja */
.lv-carou::before,.lv-carou::after{content:"";position:absolute;top:0;bottom:0;
 width:96px;z-index:4;pointer-events:none}
.lv-carou::before{left:0;background:linear-gradient(90deg,
 var(--paper-bg) 0%,color-mix(in srgb,var(--paper-bg) 2%,transparent) 100%)}
.lv-carou::after{right:0;background:linear-gradient(270deg,
 var(--paper-bg) 0%,color-mix(in srgb,var(--paper-bg) 2%,transparent) 100%)}

/* grid-auto-flow:column con TRES filas declaradas: cada columna lleva sus
   tres servicios -como pide Pedro- y ademas los renglones de las cuatro
   columnas quedan alineados entre si, cosa que con cuatro divs no pasaba
   porque una etiqueta de dos lineas descuadraba su columna. */
.lv-srvcols{display:grid;grid-template-columns:repeat(4,1fr);
 grid-template-rows:repeat(3,auto);grid-auto-flow:column;font-size:16px;
 gap:0 var(--sp-32);flex:0 0 auto;margin-top:var(--sp-20)}
.lv-srvi{display:flex;align-items:baseline;gap:var(--sp-8);
 padding:var(--sp-8) 0;border-top:1px solid var(--paper-rule)}
.lv-srvi:nth-child(3n){border-bottom:1px solid var(--paper-rule)}
/* Pedro: con el titular en una sola linea, los servicios pueden crecer. */
.lv-srvi b{flex:0 0 auto;font-size:var(--fs-cLabelS);
 line-height:var(--lh-cLabelM);font-weight:600;letter-spacing:.08em;
 color:var(--text-accent);font-variant-numeric:tabular-nums}
/* Pedro: cada servicio, en UNA linea. El cuerpo va en em y el bloque entero
   (.lv-fitg) lo baja fitLines() hasta que ningun renglon se parte: en espanol
   los nombres son mas largos que en ingles. */
.lv-srvi span{font-family:var(--font-canvas);font-size:1em;
 line-height:1.2;font-weight:400;letter-spacing:-.016em;color:var(--paper-text);
 white-space:nowrap;overflow:hidden;flex:1 1 auto;min-width:0}

/* ══ metodo 360: el esquema del SOW, nodo a nodo ════════════════════════════
   Reconstruido del volcado de la pagina 7 de la maqueta del SOW, no a ojo:

     tres circulos concentricos  d 245,47 / 182,62 / 98,17 pt
       en #FBD9E6 / #F38BB7 / #E6007E, que son --brand-100 / -300 / -primary
     circunferencia discontinua  r 162,7 pt, trazo 0,85, guion 1,7/1,7,
       en #EF5A9A = --brand-400, partida en tres arcos
     tres puntos  d 7,02 pt en #625f66 = --text-muted, en los tres huecos,
       a -90, 28 y 152 grados
     un radio del punto de arriba al nucleo, y dos plomadas de los de abajo
     los tres DOMINIOS en DM Sans Regular 10,5 junto a cada punto
     los tres RESULTADOS en Instrument Serif CURSIVA magenta, 13,59
     el concepto del cliente en DM Sans Black 20, interlinea 90%, en el nucleo

   Todo escalado por 1,2222 para que el circulo exterior mida 300 px. ══ */
/* IMPORTANTE, y esta vez con el nodo delante: el esquema del deck ES la diana
   concentrica -grupo 9074:8309 de Figma-, no un Venn. El Venn de la ronda 4 fue
   un error mio: lo saque de un grupo distinto. Geometria del nodo, con el aro
   exterior llevado a 150 (factor 1,2221):
     aros   r 122,737 / 91,310 / 49,083  ->  150 / 111,6 / 60
     orbita r 162,8                      ->  198,8
     puntos r 3,511                      ->  4,29   en -90, 28 y 152 grados
   Los huecos de la orbita miden 6,34 grados -medidos: los extremos del arco
   superior caen en +-9 px sobre un radio de 162,8- y van centrados en cada
   punto. Los conectores son RADIALES, del borde del nucleo al punto; antes
   eran plomadas verticales, que es otra cosa. */
.lv-target{position:relative;flex:0 0 auto;width:620px;height:510px;
 margin-left:auto;align-self:center}
.lv-target svg{position:absolute;inset:0;width:100%;height:100%;display:block;
 overflow:visible}
/* El nucleo magenta (r 60): icono «user-star» de Lucide encima de «Guest
   Centric» en DM Sans Regular, centrados; nada sale del disco. Medidas = las
   de la hoja 7 del SOW x 1,2223 (24 pt -> 29 px; 11/13 pt -> 13,5/16 px).
   Trazo 1,5: el 2 de Lucide pesa demasiado junto a un texto de 13. */
.lv-target-c{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
 width:100px;display:flex;flex-direction:column;align-items:center;gap:3px;
 text-align:center;font-family:var(--font-canvas);
 font-size:13.5px;line-height:16px;font-weight:400;letter-spacing:0;
 color:var(--brand-50)}
.lv-target-c svg{position:static;inset:auto;width:29px;height:29px;display:block;fill:none;
 stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.lv-target-c b{font-weight:400;display:block}
/* dominio: junto a su punto, por fuera de la orbita. Anchos y alineacion, los
   de las cajas de texto del nodo. */
/* OJO: el rotulo NO va centrado en su punto. En el nodo su caja EMPIEZA a la
   altura del punto y cuelga hacia abajo -por eso en la maqueta se lee debajo
   del punto y no encima de el-. Se ancla por arriba. */
/* Rotulo y resultado se colocan por su CAJA -borde izquierdo y superior-,
   con el ancho de la caja de texto del nodo y sin ningun transform: es la
   unica manera de que caigan donde caen en Figma. El cuerpo tambien sale del
   nodo: 14 px de texto sobre un interlineado de 17, porque en la caja del
   viewBox una unidad es un pixel. */
.lv-node-l{position:absolute;font-family:var(--font-canvas);
 font-size:var(--fs-cLabelL);line-height:17px;font-weight:500;
 letter-spacing:-.006em;color:var(--neutral-925)}
.lv-node-l--c{text-align:center}
.lv-node-l--l,.lv-node-l--r{text-align:left}
/* resultado: la firma de la casa, cursiva de Instrument Serif en magenta */
.lv-lever{position:absolute;font-family:var(--font-accent);font-style:italic;
 font-weight:400;font-size:var(--fs-cTitleM);line-height:21px;letter-spacing:0;
 color:var(--text-accent);white-space:nowrap}
.lv-lever--l{text-align:left}
.lv-lever--r{text-align:left}
.lv-lever--c{text-align:center}
.lv-slide-panel{max-width:370px;flex:0 0 auto}
.lv-slide-panel p{margin:var(--sp-16) 0 0;font-size:var(--fs-cBodyM);
 line-height:var(--lh-cBodyM);color:var(--grad-plum-9)}
.lv-slide-panel ul{margin:var(--sp-12) 0 0;padding-left:var(--sp-16);
 font-size:var(--fs-cBodyM);line-height:var(--lh-cBodyM);color:var(--grad-plum-9)}

/* ══ menu 360 de servicios ══════════════════════════════════════════════════
   Maqueta del nodo 9369:6507 de Figma, filete a filete: TRES columnas, una por
   grupo de fases. Cada grupo lleva su cabecera -«PHASE n» en magenta y
   versalita, y el nombre del grupo en negrita- y debajo sus fichas. Una ficha
   es codigo magenta + nombre + sus sub-puntos con topo. Dos fichas pueden ir
   en fila (2.3|2.5, 4.3|4.4) o una columna puede partirse en dos (fase 3).
   Colores: fases 1-3 en rosa, alternando --brand-100 y --brand-50; la fase 4
   en gris, como en la maqueta. ══ */
/* ══ 8 · el Menu 360 del deck, del nodo 9409:24645 (EN) / 9409:25392 (ES):
   titular a la izquierda -DM Regular 48 + serif 52 en acento- y TRES columnas
   de fichas de 300 px a x319,3 / x635,3 / x951,3. Un tono por fase: F0 sin
   fondo, F1 --brand-50, F2 --brand-100, F3 --neutral-100 (esta con 8 px de
   respiro vertical, como el nodo). Sin bordes y SIN vinetas: lineas limpias.
   Todas las medidas, las de Figma / 1,5. ══ */
.lv-menu2-h{position:absolute;left:51.3px;top:50px;width:240px;margin:0;
 max-width:none;font-weight:400;font-size:48px;line-height:51.7px;
 letter-spacing:-.02em}
.lv-menu2-h em{font-size:52px;line-height:51.7px}
.lv-menu{position:absolute;left:319.3px;top:52.7px;display:grid;
 grid-template-columns:repeat(3,300px);gap:var(--sp-16);align-content:start}
.lv-mcol{display:flex;flex-direction:column;gap:5.3px;min-width:0}
.lv-ph{margin:0}
.lv-ph:not(:first-child){margin-top:var(--sp-8)}
.lv-ph b{display:block;font-family:var(--font-canvas);font-size:8px;
 line-height:8.7px;font-weight:700;color:var(--text-accent)}
.lv-ph span{display:block;font-family:var(--font-canvas);font-size:13.3px;
 line-height:17.3px;font-weight:700;letter-spacing:-.01em;
 color:var(--neutral-900)}
.lv-mcard{display:flex;align-items:flex-start;border-radius:var(--r-lg);
 padding:5.3px 8px 2.7px;break-inside:avoid}
/* Fase 0 es la unica que no llevaba ficha: sus cuatro servicios flotaban sobre
   el papel mientras todo lo de debajo vivia en un rectangulo. Pedro (21 sep
   2026): rectangulo SIN relleno y con contorno rosa, con la misma caja que las
   fichas de la fase de abajo -por eso hereda el padding y el radio de
   .lv-mcard en vez de tener los suyos-. En --brand-300 y no en el magenta
   pleno: sobre papel, el contorno acompana sin pesar (Pedro eligio). */
.lv-mcard--p0{border:1px solid var(--brand-300);background:none}
.lv-mcard--p1{background:var(--brand-50)}
.lv-mcard--p2{background:var(--brand-100)}
.lv-mcard--p3{background:var(--neutral-100);padding-top:8px;padding-bottom:5.3px}
.lv-mcard>b{flex:0 0 16.7px;margin-right:5.3px;font-family:var(--font-canvas);
 font-size:9.3px;line-height:14px;font-weight:700;color:var(--brand-600)}
.lv-mc{flex:1;min-width:0}
.lv-mn{display:block;font-family:var(--font-canvas);font-size:11.3px;
 line-height:14px;font-weight:500;color:var(--neutral-900)}
.lv-mli{display:block;font-family:var(--font-canvas);font-size:9.3px;
 line-height:12px;font-weight:400;color:var(--neutral-700)}
.lv-mi2{display:flex;margin-top:2.7px}
.lv-mi2>div{flex:0 0 144.7px;min-width:0}
.lv-mi2>div+div{flex:1 1 auto}
.lv-mcard.is-big .lv-mli{line-height:13.3px}
.lv-mcard.is-big .lv-mi{margin-top:2.7px}

/* ══ rejilla de equipo · COPIA LITERAL del nodo 9374:13915 ═══════════════════
   Celdas de 192 x 182 en Figma -128 x 121,3 aqui-, DIEZ columnas, rejilla de
   y 230 a 959 (153,3 a 639,7 aqui): NO llega al pie. Titular DM Sans 60,47
   centrado en y 131, y OJO: su acento va en DM SANS magenta -es la unica
   excepcion a la regla de la cursiva, y viene del propio nodo-. Los tonos y
   los colores de texto de cada rotulo, celda a celda del nodo:
     a  --brand-400 + blanco, alineado a la DERECHA   (Design thinking Experts)
     b  --brand-200 + --brand-700                     (Architects...)
     f  --brand-100 + --brand-700                     (Strategic & CX)
     g  --brand-700 + --brand-200                     (Chefs Kitchen Planners)
     c  ciruela: rotulo en MAGENTA; proclama en blanco con acento magenta
     d  --brand-50 + tinta                            (Help your business...)
     e  dorado + --brand-700                          (Brand Creators...)
   Rotulo: DM Sans Bold 14 -9,3- en versalitas, pegado ABAJO. Proclama: DM Sans
   38 -25,3- + cursiva 42 -28- EN LINEA, centrada en su celda. Fotos sobre
   blanco de papel. ══ */
/* Pedro: la frase, en UNA sola linea y centrada. El nowrap solo no bastaba:
   en ingles la frase es mas larga y se salia de la hoja por la derecha. El
   span se hace inline-block para poder MEDIRLO, y fitLines() baja el cuerpo
   hasta que entra en los 1.200 px utiles. */
/* OJO: .lv-slide-h trae max-width:900px, asi que la caja del titular media
   900 y no 1.280: centrado dentro de 900 se leia pegado al margen izquierdo
   -y fitLines media 820 en vez de 1.200-. Se anula aqui. */
.lv-team-h{position:absolute;left:0;right:0;top:84px;margin:0;padding:0 40px;
 max-width:none;text-align:center;font-size:40.3px;line-height:44px}
.lv-team-h .lv-ln>span{display:inline-block;white-space:nowrap}
.lv-team{position:absolute;left:0;top:153.3px;width:100%;height:486.4px;
 display:grid;grid-template-columns:repeat(10,1fr);grid-auto-rows:1fr;gap:0}
.lv-team i,.lv-team span{position:relative;overflow:hidden;min-width:0}
.lv-team i{background:var(--paper-bg)}
.lv-team img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
 display:block}
.lv-team--w2{grid-column:span 2}
.lv-team span{display:flex;flex-direction:column;padding:var(--sp-8) 9px}
.lv-team-role{justify-content:flex-end}
.lv-team-claim{justify-content:center;padding:0 var(--sp-16)}
.lv-team-role b{display:block;font-family:var(--font-canvas);font-size:9.3px;
 line-height:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase}
.lv-team-claim b,.lv-team-claim em{display:inline;font-family:var(--font-canvas);
 font-size:25.3px;line-height:29px;font-weight:400;letter-spacing:-.02em}
.lv-team-claim em{font-family:var(--font-accent);font-style:italic;
 font-size:28px;color:var(--text-accent)}
.lv-team-a{background:var(--brand-400);color:var(--neutral-0);text-align:right}
.lv-team-b{background:var(--brand-200);color:var(--brand-700)}
.lv-team-f{background:var(--brand-100);color:var(--brand-700)}
.lv-team-g{background:var(--brand-700);color:var(--brand-200)}
.lv-team-c{background:var(--brand-950);color:var(--neutral-0)}
/* especificidad: se iguala el peso con span para pisar las reglas de arriba */
.lv-team span.lv-team-role.lv-team-c{color:var(--text-accent)}
.lv-team span.lv-team-c em{color:var(--text-accent)}
.lv-team-d{background:var(--brand-50);color:var(--neutral-925)}
.lv-team-e{background:var(--accent-gold);color:var(--brand-700)}
/* la excepcion del nodo: el acento del titular del equipo, en DM Sans */
.lv-slide-h--sans em{font-family:var(--font-canvas);font-style:normal;
 font-weight:inherit;letter-spacing:inherit;color:var(--text-accent)}


/* ══ case studies · plantilla 9339:8202 ═════════════════════════════════════
   Cuatro fotos de 450x700 a x45/505/965/1425 sobre 1920 -aqui todo /1,5-, el
   nombre de la marca en DM Sans 64 y dos etiquetas abajo: localizacion y
   categoria. La cabecera y el pie son los del deck.
   El hover ensancha la foto y las hermanas ceden: se reparte flex-grow, asi
   que el bloque no cambia de sitio ni desborda. NO se usa transform, que es
   lo que rompe el :hover cuando la entrada deja un transform en linea. ══ */
.lv-case-h{position:absolute;left:47.3px;top:113.3px;right:30px;margin:0;
 max-width:none;font-family:var(--font-canvas);font-weight:400;font-size:42.7px;
 line-height:34.7px;letter-spacing:0;color:var(--neutral-800);text-align:left}
.lv-case-row{position:absolute;left:30px;top:176.7px;width:1220px;height:466.7px;
 display:flex;gap:6.7px}
.lv-case-row>i{position:relative;flex:1 1 0;min-width:0;overflow:hidden;
 border-radius:var(--r-lg);background:var(--neutral-100);
 transition:flex-grow var(--motion-standard)}
.lv-case-row>i img{width:100%;height:100%;object-fit:cover;display:block}
/* al posarse en una, esa crece y las demas ceden a la vez */
.lv-case-row:hover>i{flex-grow:.74}
.lv-case-row>i:hover{flex-grow:2.05}
.lv-case-tags{position:absolute;left:30px;top:652.7px;display:flex;gap:4px}
.lv-case-tags b{display:inline-flex;align-items:center;height:12.7px;
 padding:0 5.3px;border-radius:var(--r-full);background:var(--neutral-100);
 border:1px solid var(--neutral-600);font-family:var(--font-canvas);
 font-size:7px;line-height:10px;font-weight:600;letter-spacing:0;
 color:var(--neutral-600);white-space:nowrap}

/* ══ lista de ciudades y tarjeta de contacto ════════════════════════════════ */
.lv-contact{position:absolute;left:80px;right:80px;bottom:64px;
 display:flex;align-items:flex-end;gap:var(--sp-24);
 padding-top:var(--sp-16);border-top:1px solid var(--line-dark)}
/* una o DOS firmas: presentan dos personas a veces. La segunda ficha se
   separa de la primera y la web sigue anclada a la derecha. */
.lv-contact-b{min-width:0;flex:0 1 auto}
.lv-contact-b+.lv-contact-b{margin-left:var(--sp-32)}
.lv-contact-b b{display:block;font-size:var(--fs-cTitleM);
 line-height:var(--lh-cTitleM);font-weight:600;color:var(--text-primary)}
.lv-contact-b span{display:block;font-size:var(--fs-cLabelM);
 line-height:var(--lh-cLabelM);color:var(--text-secondary)}
.lv-contact-b em{display:block;font-style:normal;font-size:var(--fs-cLabelM);
 line-height:var(--lh-cLabelM);color:var(--text-accent)}
/* la web, en acento y pinchable */
.lv-contact-w{margin-left:auto;font-size:var(--fs-cLabelM);
 line-height:var(--lh-cLabelM);color:var(--text-accent);white-space:nowrap;
 text-decoration:none;transition:opacity var(--motion-standard)}
.lv-contact-w:hover{opacity:.72;text-decoration:underline}

/* ══ lista arrastrable ══════════════════════════════════════════════════════
   El paso «Marcas del muro» del SOW: se arrastra para ordenar las categorias
   por relevancia y se colocan en ese orden hasta llenar la hoja. Mismo markup
   y mismo criterio, con los roles del sistema. ══ */
.lv-drag{list-style:none;margin:0;padding:0}
.lv-drag li{position:relative;display:flex;align-items:center;gap:var(--sp-10);
 background:var(--surface-raised);border:1px solid var(--border-default);
 border-radius:var(--r-lg);padding:var(--sp-10) var(--sp-12);
 margin-bottom:var(--sp-8);cursor:grab;user-select:none;--lv-gap:8px}
.lv-drag li.is-out{opacity:.45}
.lv-drag li.is-drag,.lv-drag li.is-dragging{opacity:.4}
/* Destino: la LÍNEA DE INSERCIÓN del kit (is-drop-before / is-drop-after, ver «Tarjeta de panel»),
   a mitad del hueco de 8. Antes era una sombra de 2 px pegada al borde de la fila (Pedro, 6 sep). */
.lv-drag .h{color:var(--text-muted);font-size:var(--fs-bodyM);line-height:1;
 cursor:grab}
.lv-drag .h svg{width:16px;height:16px;display:block;fill:currentColor;stroke:none}
/* icono de la fila (Kore: el icono del bloque), 16 en --text-secondary, entre el número y el nombre */
.lv-drag li>svg{flex:0 0 auto;width:16px;height:16px;color:var(--text-secondary);stroke:currentColor;fill:none;stroke-width:1.75}
.lv-drag b{flex:0 0 auto;width:18px;height:18px;border-radius:var(--r-full);
 background:color-mix(in srgb,var(--text-primary) 10%,transparent);color:var(--text-secondary);
 font-size:var(--fs-labelXS);font-weight:600;display:flex;
 font-variant-numeric:tabular-nums;
 align-items:center;justify-content:center}
.lv-drag i{flex:1;font-style:normal;font-size:var(--fs-bodyM);
 line-height:var(--lh-bodyM);font-weight:600;color:var(--text-primary)}
.lv-drag em{font-style:normal;font-size:var(--fs-labelXS);
 line-height:var(--lh-labelXS);color:var(--text-muted);white-space:nowrap}
.lv-drag .ar{display:flex;flex-direction:column;gap:2px}
/* Subir y bajar: OCULTOS (Pedro, 5 sep 2026). Junto a la cifra de la fila
   parecian subir o bajar el numero, y el asa de arrastre de la izquierda ya
   dice como se ordena. Los botones siguen en el HTML y el JS por si vuelven;
   los estilos de chevron quedan debajo para ese caso. */
.lv-drag .ar{display:none !important}
.lv-drag .ar button{background:currentColor;border:0;color:var(--text-muted);
 font-size:0;line-height:0;width:16px;height:11px;padding:0;cursor:pointer;
 -webkit-mask:var(--chev-up) center/14px 14px no-repeat;mask:var(--chev-up) center/14px 14px no-repeat;
 transition:color var(--motion-fast)}
.lv-drag .ar button:last-child{-webkit-mask-image:var(--chev-dn);mask-image:var(--chev-dn)}
.lv-drag .ar button:hover{color:var(--text-accent)}
.lv-drag{--chev-up:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'><path d='m18 15-6-6-6 6'/></svg>");
 --chev-dn:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>")}

/* ══ movimiento de diapositiva ═══════════════════════════════════════════════
   En livit-web-standalone.html el reloj es el scroll. Aqui el reloj es el
   cambio de filete: cada ScrollTrigger del sitio se traduce en una linea de
   tiempo que arranca al entrar la diapositiva. Los recursos narrativos son
   los mismos -relleno de palabra, contador, revelado escalonado, marquesina
   de logotipos, cortinilla- para que el deck y el sitio se cuenten igual.

   Regla de oro: nada se oculta con CSS. Todo nace en su estado final y el
   motor lo anima con gsap.from(). Asi el PDF, el modo sin movimiento y un
   navegador sin gsap ven la diapositiva terminada, sin una linea extra. La
   unica excepcion es el relleno de palabra, que necesita un color de
   partida y por eso va detras de .is-anim, la clase que solo pone el JS
   cuando el motor esta vivo. ══ */

/* relleno de palabra - el [data-rv] del sitio */
/* La mascara que revela linea a linea recortaba las letras bajas -p, q, y-
   cuando debajo habia otra linea: la caja de linea (64 px a cuerpo 57) es mas
   corta que el trazo completo de la fuente. Se le da aire por abajo a la CAJA
   DE RECORTE y se devuelve con un margen negativo, asi la composicion no se
   mueve ni un pixel y el descendente cabe (Pedro, 21 sep 2026). */
.lv-ln{display:block;overflow:hidden;padding-bottom:.24em;margin-bottom:-.24em}
.lv-ln>span{display:block}
.lv-rv .w{display:inline-block}
.is-anim .lv-rv .w{color:var(--text-disabled);
 transition:color var(--m-std) var(--e-soft)}
.is-anim .lv-slide--paper .lv-rv .w{color:var(--paper-rule)}
.is-anim .lv-rv .w.is-lit{color:inherit}

/* ══ cabecera y pie de filete ═══════════════════════════════════════════════
   De la maqueta: los dos filetes de referencia que paso Pedro traen los
   componentes «SOW v2/Running head» y «SOW v2/Folio». Cabecera: rotulo de
   seccion en magenta a la izquierda, «SALES DECK» en gris a la derecha y un
   filete fino debajo. Pie: el logotipo de Livit a la izquierda y el folio a la
   derecha. Margen lateral 18 px, que son los 27 del 1920 de Figma. ══ */
.lv-slide-head{position:absolute;left:18px;right:18px;top:13px;z-index:6;
 display:flex;align-items:baseline;justify-content:space-between;
 padding-bottom:var(--sp-8);border-bottom:1px solid var(--line-light)}
.lv-slide-head b,.lv-slide-head span{font-family:var(--font-canvas);
 font-size:var(--fs-cLabelXS);line-height:var(--lh-cLabelXS);font-weight:600;
 letter-spacing:.19em;text-transform:uppercase;white-space:nowrap}
.lv-slide-head b{color:var(--text-accent)}
.lv-slide-head span{color:var(--text-muted)}
.lv-slide-foot{position:absolute;left:18px;right:18px;bottom:13px;z-index:6;
 display:flex;align-items:center;justify-content:space-between}
.lv-slide-foot svg{display:block}
.lv-slide-foot span{font-family:var(--font-canvas);font-size:var(--fs-cLabelXS);
 line-height:var(--lh-cLabelXS);font-weight:400;letter-spacing:.06em;
 color:var(--text-muted);font-variant-numeric:tabular-nums}
/* Sobre fondo oscuro -fotografia y el filete de cifras- el mismo bloque en
   claro. Se cuelga de la AUSENCIA de --paper/--rose y no de --photo, para que
   el filete de cifras, que es oscuro sin ser fotografico, entre tambien. */
.lv-slide:not(.lv-slide--paper):not(.lv-slide--rose) .lv-slide-head{
 border-bottom-color:var(--line-dark)}
.lv-slide:not(.lv-slide--paper):not(.lv-slide--rose) .lv-slide-head b{
 color:var(--brand-300)}
.lv-slide:not(.lv-slide--paper):not(.lv-slide--rose) .lv-slide-head span,
.lv-slide:not(.lv-slide--paper):not(.lv-slide--rose) .lv-slide-foot span{
 color:var(--brand-100)}

/* filete que se traza - separa titular de contenido */
.lv-slide-rule{height:1px;border:0;margin:auto 0 var(--sp-24);transform-origin:left;
 background:linear-gradient(90deg,var(--brand-primary),
  color-mix(in srgb,var(--brand-primary) 2%,transparent))}
.lv-slide--paper .lv-slide-rule{
 background:linear-gradient(90deg,var(--paper-accent),
  color-mix(in srgb,var(--paper-accent) 2%,transparent))}

/* muro de logotipos de cliente: rejilla, con la densidad del dosier ------- */
/* Pedro: malla de 10 columnas por 9 filas, manteniendo el alto. */
.lv-wallgrid{display:grid;grid-template-columns:repeat(10,1fr);grid-auto-rows:1fr;
 gap:var(--sp-6);flex:1;min-height:0;margin-top:var(--sp-20)}
/* Muro a 11 x 10 (110 logos; Pedro, 5 sep 2026). La celda conserva el tamaño de la
   malla de 10 x 9 (106,5 x 50 px a 1280 x 720): se ganan columna y fila estrechando
   el marco de 80 a 60/34 px y el hueco de 6 a 4. Solo en el filete del muro. */
.lv-slide--wall .lv-slide-in{inset:60px 34px}
.lv-slide--wall .lv-wallgrid{grid-template-columns:repeat(11,1fr);gap:var(--sp-4)}
/* El muro del deck de hoteles se cuenta en DOS filetes, con menos marcas y mas
   grandes. Reparto del filete (Pedro, 21 sep 2026): titular y entradilla en el
   TERCIO de arriba, logotipos en los DOS de abajo. El de F&B denso -11 x 10-
   sigue siendo .lv-slide--wall. */
.lv-slide--wall2 .lv-slide-in{inset:60px}
/* La cabecera mide LO QUE MIDE su texto y la rejilla se queda con el resto: con
   flex:1 la cabecera se comprimia y el titular de tres lineas se metia debajo de
   los logotipos. Con el titular a 46 y la entradilla a 22, la rejilla se queda
   entre el 64 y el 67 % — los dos tercios de abajo que pidio Pedro. */
.lv-wall-head{flex:0 0 auto}
/* La entradilla, debajo del titular y en el gris de CUERPO del papel -no en el
   de meta, que se quedaba lavado-, y con el interlineado ceñido del titulo: a
   1,57 las frases se abrian demasiado. */
.lv-slide-lead--wall{margin-top:var(--sp-16);max-width:860px}
.lv-slide-lead--wall p{font-size:var(--fs-cTitleM);line-height:var(--lh-cTitleM);
 color:var(--paper-body);text-wrap:balance}
/* El parrafo del filete de declaracion: debajo del titular grande, con el
   mismo reparto equilibrado de palabras por linea. */
/* La caja se estrecha a 720 para que el parrafo caiga en TRES lineas en los dos
   idiomas: a 1.000 el ingles entraba en dos y el espanol en tres, y las dos
   versiones se veian desiguales (Pedro, 21 sep 2026). */
/* 880 y no 720 (Pedro, 2 oct 2026): a 720 el parrafo iba a cuatro lineas en los
   dos idiomas; a 800 el ingles ya bajaba a tres pero el espanol no. 880 es el
   primer ancho que deja los dos en tres, medido en el navegador. */
.lv-slide-lead--say{margin-top:var(--sp-32);max-width:880px}
.lv-slide-lead--say p{font-size:var(--fs-cTitleL);line-height:var(--lh-cTitleL);
 font-weight:300;color:var(--text-primary);text-wrap:balance}
/* Rejilla en flex, no en grid, por una razon concreta: en grid la ultima fila
   incompleta se pega a la izquierda y Pedro la quiere CENTRADA. Las columnas y
   las filas las pone el generador en --wall-cols / --wall-rows. */
.lv-slide--wall2 .lv-wallgrid{display:flex;flex-wrap:wrap;
 align-content:center;justify-content:center;gap:var(--sp-12);
 flex:1 1 0;min-height:0;margin-top:var(--sp-24)}
.lv-slide--wall2 .lv-wallgrid i{
 flex:0 0 calc((100% - (var(--wall-cols,10) - 1)*var(--sp-12))/var(--wall-cols,10));
 height:calc((100% - (var(--wall-rows,6) - 1)*var(--sp-12))/var(--wall-rows,6))}
.lv-wallgrid i{position:relative;display:flex;align-items:center;
 justify-content:center;min-width:0;min-height:0}
.lv-wallgrid img{position:absolute;max-width:100%;max-height:100%;width:auto;
 height:auto;object-fit:contain;display:block;mix-blend-mode:multiply}

/* ══ hospitality · las cuatro prioridades ════════════════════════════════════
   El titular dice «UN solo F&B, CUATRO prioridades» y la maqueta dice lo mismo:
   UNA banda partida en cuatro por filetes verticales, no cuatro tarjetas
   sueltas de colores (Pedro, 21 sep 2026: el color pertenece a los servicios).
   Lo unico en acento es el rotulo del rol. ══ */
/* La banda mide LO QUE MIDE su texto y se centra en el aire que deja el
   titular: a altura completa, con dos parrafos cortos por columna, la banda se
   quedaba medio vacia y parecia una tabla sin terminar. */
/* Solo las VERTICALES (Pedro, 21 sep 2026): el filete superior era lo que
   cerraba la banda por arriba y la convertia en tabla. Las verticales, sin el,
   separan las cuatro voces sin encerrarlas. La primera columna no lleva, para
   que su texto siga a plomo con el titular. */
/* Subgrid, como el menu 360 (Pedro, 2 oct 2026): sin el rotulo NEED, las
   frases de arriba miden dos o tres lineas segun la columna y el rotulo
   «How Livit helps» quedaba a cuatro alturas distintas. Con filas comunes cae
   a la misma en las cuatro. Seis filas y no cinco: si el json vuelve a traer
   rotulo NEED, cabe sin tocar el CSS (sin el, la sexta mide cero). */
.lv-prio{display:grid;grid-template-columns:repeat(4,1fr);
 grid-template-rows:repeat(6,auto);flex:0 0 auto;
 margin:auto 0}
.lv-prio>div{min-width:0;padding:0 var(--sp-32);
 display:grid;grid-row:1/-1;grid-template-rows:subgrid;align-content:start;
 border-left:1px solid var(--paper-rule)}
/* en rejilla el icono se estiraria al ancho de la columna */
.lv-prio>div>.lv-prio-ic{justify-self:start}
.lv-prio>div:first-child{padding-left:0;border-left:0}
.lv-prio>div:last-child{padding-right:0}
/* Un icono por agente: es lo que da cara a cada uno sin recurrir al color. */
.lv-prio-ic{display:flex;align-items:center;justify-content:center;
 width:32px;height:32px;margin-bottom:var(--sp-12);border-radius:var(--r-sm);
 background:color-mix(in srgb,var(--brand-primary) 10%,transparent)}
.lv-prio-ic svg{width:17px;height:17px;stroke:var(--brand-600);fill:none;
 stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.lv-prio-t{display:block;font-size:var(--fs-cTitleXL);line-height:var(--lh-cTitleXL);
 font-weight:500;letter-spacing:-.02em;color:var(--paper-text)}
/* «Necesita» y «Cómo ayuda Livit» respiran: 32 px entre bloque y bloque, y un
   filete fino antes del segundo para que se lean como dos cosas (Pedro). */
.lv-prio-l{display:block;margin:var(--sp-32) 0 var(--sp-6);font-size:var(--fs-cLabelXS);
 line-height:var(--lh-cLabelXS);letter-spacing:.16em;text-transform:uppercase;
 font-weight:600;color:var(--paper-label)}
.lv-prio-p{margin:0;font-size:var(--fs-cTitleM);line-height:var(--lh-cBodyM);
 color:var(--paper-body);text-wrap:balance}
/* La frase que abre cada columna, ya sin rotulo encima: va pegada al nombre del
   agente y en el tono de titular, porque ahora ES la promesa de la columna. */
.lv-prio-p--lead{margin-top:var(--sp-12);color:var(--paper-text)}

/* ══ hospitality · el Menu 360 de cinco fases ════════════════════════════════
   Aqui el color SI distingue, que es lo que separa esta hoja de la anterior:
   el tono avanza de la marca al gris segun la fase pasa de estrategia a
   entrega, igual que el menu del deck de F&B. ══ */
/* Las CINCO fichas comparten pauta horizontal (Pedro, 21 sep 2026): los
   servicios arrancaban a alturas distintas porque el titulo ocupa una o dos
   lineas y la descripcion de una a tres. Con subgrid, las filas -rotulo,
   titulo, descripcion, lista, etiquetas- son las MISMAS cinco del contenedor,
   asi que la lista de la fase 1 empieza exactamente donde la de la fase 5.
   La calle solo va entre columnas: un row-gap rompería la pauta interna. */
/* OJO con el alto de esta rejilla, que me costo una vuelta entender:
   con `flex:1` la CAJA se estiraba al hueco disponible, pero las filas siguen
   midiendo su contenido (la de servicios es 1fr, y un 1fr no baja de
   min-content). Resultado: al ponerle margen inferior, la caja encogia y las
   fichas se salian 73 px por debajo de ella. El margen no daba aire: solo movia
   una caja que ya no contenia a sus fichas.
   Ahora la rejilla mide LO QUE MIDEN sus fichas (`flex:0 0 auto`). El aire de
   abajo es el que sobra de verdad, y si algun dia el contenido crece, se ve
   como desborde en la comprobacion en vez de colarse encima del folio. */
/* Sin entradilla (Pedro, 2 oct 2026) el titular queda solo: la rejilla se
   separa de el con mas aire, el que antes ocupaba la frase. */
.lv-wall-head:not(:has(.lv-slide-lead))+.lv-hmenu{margin-top:var(--sp-40)}
.lv-hmenu{display:grid;grid-template-columns:repeat(5,1fr);
 grid-template-rows:auto auto auto 1fr auto;
 column-gap:var(--sp-10);row-gap:0;
 flex:0 0 auto;min-height:0;margin-top:var(--sp-12);
 align-items:stretch}
.lv-hcard{display:grid;grid-row:1/-1;grid-template-rows:subgrid;
 /* Menos costado: cada punto de ancho es un servicio menos partido en dos. */
 border-radius:var(--r-lg);padding:var(--sp-12);min-width:0}
/* TODAS las fichas al aire, solo contorno (Pedro, 21 sep 2026): los rellenos
   pesaban en una hoja que ya carga 35 servicios. La rampa cromatica se mantiene,
   pero AHORA VIVE EN EL FILETE, y sube un escalon completo: un borde en
   --brand-50 sobre papel es invisible -1,06:1 medido-, asi que la escala
   arranca donde arrancaba el contorno aprobado de la fase 0 y avanza de ahi.
   El tono se densifica segun el trabajo pasa de estrategia a entrega. */
.lv-hcard--0{border:1px solid var(--brand-300)}
.lv-hcard--1{border:1px solid var(--brand-400)}
.lv-hcard--2{border:1px solid var(--brand-500)}
.lv-hcard--3{border:1px solid var(--brand-600)}
.lv-hcard--4{border:1px solid var(--brand-700)}
/* Sin fondos densos, el texto vuelve a los roles de papel de todo el deck: el
   rotulo de fase al --paper-label y el cuerpo al --paper-body. Las excepciones
   de contraste que pedian los rellenos (ciruela en el rotulo, titular en la
   ficha 5) ya no hacen falta y se han retirado. */
.lv-hn{display:block;font-size:var(--fs-cLabelXS);line-height:var(--lh-cLabelXS);
 letter-spacing:.16em;text-transform:uppercase;font-weight:600;color:var(--paper-label)}
/* Interlineado a 20 -no a los 22 de cuerpo-: a dos lineas fijas, 22 sobre 16 px
   abria demasiado el nombre y lo separaba de su descripcion (Pedro, 21 sep). */
.lv-ht{display:block;margin-top:var(--sp-2);font-size:var(--fs-cTitleM);
 line-height:var(--lh-titleS);font-weight:600;letter-spacing:-.02em;
 color:var(--paper-text)}
/* La descripcion baja de rango: es el pie del titulo, no el contenido. Antes
   median lo mismo que los servicios -11 px los dos- y solo los separaba el gris.
   Ahora cae a 9/12 y la lista sube al tono de titular: jerarquia por tamano Y
   por color. Se probo el camino contrario -servicios a 14/22- y se descarto
   MIDIENDO: desbordaba 28 px en ingles y 68 en espanol. Bajar la descripcion,
   ademas, liberaba 12 px en las fichas de tres lineas en vez de costarlos.
   SEGUNDA vuelta (Pedro, 21 sep): 9 px se quedaba corto de leer. Vuelve a 11/16
   y la jerarquia se apoya donde no cuesta altura: la descripcion en regular y
   gris de meta, los servicios en medium y tono de titular. */
/* Interlineado CENIDO en la descripcion (Pedro, 21 sep 2026): a 16 sobre 11 px
   la frase abria mucho y la ficha crecia por el bloque que menos pesa. A 14 se
   compacta y sigue leyendose. OJO, es el unico sitio del deck donde se toma un
   interlineado de la escala de interfaz: la de canvas solo ofrece 12 -1,09
   sobre 11 px, ahi ya se tocan los trazos- y 16, que es de donde venimos. */
.lv-hd{display:block;margin-top:var(--sp-4);font-size:var(--fs-cLabelS);
 line-height:var(--lh-labelS);color:var(--paper-meta)}
/* El hilo con el filete 7: a que prioridad responde esta fase. Va en el gris de
   meta y con el rotulo en versalita, para que se lea como una nota al pie de la
   ficha y no compita con los servicios. */
/* Al PIE de la ficha -margin-top:auto la empuja abajo- y despegada de la lista.
   Las etiquetas llevan fondo de papel y un filete finisimo para que se lean
   igual sobre las cinco densidades de rosa. */
.lv-hr{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-4);
 margin-top:auto;padding-top:var(--sp-8)}
.lv-hr i{flex:0 0 100%;font-style:normal;font-size:var(--fs-cLabelXS);
 line-height:var(--lh-cLabelXS);letter-spacing:.16em;text-transform:uppercase;
 font-weight:600;color:var(--brand-400);margin-bottom:var(--sp-2)}
/* Las etiquetas adoptan la versalita tracked que es el caption de todo el deck
   -la misma de los rotulos de fase y de los running heads-, y se distinguen de
   ellos por la capsula, no por la tipografia (Pedro, 21 sep 2026). */
.lv-hr b{padding:var(--sp-2) var(--sp-8);border-radius:var(--r-full);
 font-size:var(--fs-cLabelXS);line-height:var(--lh-cLabelS);font-weight:600;
 letter-spacing:.12em;text-transform:uppercase;
 color:var(--paper-body);background:var(--paper-bg);
 border:1px solid color-mix(in srgb,var(--paper-text) 12%,transparent)}
/* Los agentes PRINCIPALES de cada fase (Pedro, 2 oct 2026): van primero y con
   el MISMO contorno que el resto, pero en rosa --brand-400. No van rellenos: la
   primera version los pinto solidos y no era eso. Los secundarios siguen como
   estaban, con el filete gris. */
.lv-hr b.is-pri{border-color:var(--brand-400)}
.lv-hl{list-style:none;margin:var(--sp-8) 0 0;padding:0}
/* Sin filete por servicio: eran 35 lineas en una sola hoja. Separa el aire. */
.lv-hl li{padding:var(--sp-4) 0;font-size:var(--fs-cLabelS);line-height:var(--lh-cLabelS);
 color:var(--paper-text)}

/* ══ hospitality · case study de hotel, UNA hoja por caso (Pedro, 2 oct 2026)
   Plantilla «The Ritz-Carlton»: tres columnas en la proporcion de la
   plantilla (405 · 319 · 674) y dos filas. Arriba a la izquierda el texto;
   la foto grande ocupa las dos filas a la derecha. Con bullets, el texto baja
   hasta el pie y la foto suelta de abajo a la izquierda desaparece.
   Misma caja que la hoja de case study de F&B -30 px a los lados y las fotos
   acaban a 643-, y arranca a 72, a la distancia del filete de cabecera que
   marca la plantilla. Sale casi la proporcion exacta de la plantilla (2,14
   frente a 2,12). Cabecera y pie, los del deck. ══ */
.lv-hc1{position:absolute;left:30px;right:30px;top:72px;bottom:77px;
 display:grid;grid-template-columns:1.27fr 1fr 2.11fr;grid-template-rows:1fr 1fr;
 gap:var(--sp-8);grid-template-areas:"t b c" "a d c";
 transition:grid-template-columns var(--motion-slow)}
/* Hover ORDENADO (Pedro, 2 oct 2026): la foto bajo el raton se ensancha y las
   de su fila ceden, como en la hoja de F&B; nada flota ni hace sombra y el
   bloque no se sale de su caja. Solo se reparten COLUMNAS -las filas no se
   tocan, que es donde vive el texto- y la columna del texto no encoge nunca:
   si encogiera, el nombre se partiria distinto a mitad del gesto. Las fotos
   estan guardadas con el encuadre del ancho maximo (HCAJA), asi que al
   ensancharse ensenan MAS foto, no la misma ampliada. */
.lv-hc1:has(.is-c:hover){grid-template-columns:1.27fr .55fr 2.56fr}
.lv-hc1:has(.is-b:hover),.lv-hc1:has(.is-d:hover){grid-template-columns:1.27fr 1.6fr 1.51fr}
.lv-hc1:has(.is-a:hover){grid-template-columns:1.85fr .85fr 1.68fr}
.lv-hc1--bul{grid-template-areas:"t b c" "t d c"}
.lv-hc1-txt{grid-area:t;min-width:0;padding-right:var(--sp-12)}
/* ancho FIJO = el de reposo de su columna: cuando la foto suelta ensancha la
   columna, el texto no se recoloca */
.lv-hc1-txt>*{max-width:337px}
/* Logotipo: lienzo 4:1 con la tinta igualada en build_deck.logo_mask(), asi
   que los cuatro pesan lo mismo con `contain`; pegado a la izquierda. */
.lv-hc1-logo{display:block;width:144px;height:36px;margin-bottom:var(--sp-16);
 object-fit:contain;object-position:left center}
/* Rotulo del tipo de encargo, en el magenta de etiqueta de la plantilla. Va
   bajo el nombre y sustituye al filete que los separaba. */
.lv-hc1-l{display:block;margin-top:var(--sp-12);font-size:var(--fs-cLabelXS);
 line-height:var(--lh-cLabelXS);letter-spacing:.16em;text-transform:uppercase;
 font-weight:600;color:var(--paper-label)}
/* la serif redonda de los nombres de caso, la misma de la hoja anterior.
   .lv-slide delante: en la miniatura del asistente `.lv-panel h2` le ganaba y
   el nombre salia en el gris claro de la interfaz, casi invisible. */
.lv-slide .lv-hc1-t{margin:0;
 font-family:var(--font-accent);font-style:normal;font-weight:400;
 font-size:var(--fs-cDisplayM);line-height:var(--lh-cDisplayM);letter-spacing:0;
 color:var(--paper-text);text-wrap:balance}
.lv-hc1-d{margin:0;padding:var(--sp-16) 0;border-bottom:1px solid var(--paper-rule);
 font-size:var(--fs-cBodyM);line-height:var(--lh-cBodyM);color:var(--paper-text);
 text-wrap:pretty}
/* Los seis puntos, con el punto en gris de filete (no en magenta, Pedro 21 sep) */
.lv-hc1-b{list-style:none;margin:var(--sp-8) 0 0;padding:0}
.lv-hc1-b li{position:relative;padding:var(--sp-8) 0 var(--sp-8) var(--sp-12);
 font-size:var(--fs-cLabelL);line-height:var(--lh-cLabelL);color:var(--paper-text)}
.lv-hc1-b li::before{content:"";position:absolute;left:0;
 top:calc(var(--sp-8) + var(--lh-cLabelL)/2 - 2px);
 width:4px;height:4px;border-radius:var(--r-full);background:var(--paper-rule)}
.lv-hc1-b.is-wait li{color:var(--paper-meta)}
.lv-hc1-ph{position:relative;display:flex;align-items:center;justify-content:center;
 min-width:0;min-height:0;overflow:hidden;font-style:normal;
 border-radius:var(--r-lg);background:var(--neutral-100)}
.lv-hc1-ph.is-a{grid-area:a}.lv-hc1-ph.is-b{grid-area:b}
.lv-hc1-ph.is-c{grid-area:c}.lv-hc1-ph.is-d{grid-area:d}
.lv-hc1-ph img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.lv-hc1-ph>span{font-size:var(--fs-cLabelXS);line-height:var(--lh-cLabelXS);
 letter-spacing:.16em;text-transform:uppercase;font-weight:600;color:var(--paper-meta)}
/* 5 y 6 fotos (8 oct 2026): una columna central mas, misma osamenta. La
   columna del texto mide lo mismo que con 4 (1,27 de 4,35 = 349 px) para que
   el titular no se recoloque de una hoja a otra; ceden la grande y las
   centrales. Hover: igual que con 4, se ensancha la columna de la foto. */
.lv-hc1--n5,.lv-hc1--n6{grid-template-columns:1.27fr .74fr .74fr 1.6fr}
.lv-hc1--n6{grid-template-areas:"t b e c" "a d f c"}
.lv-hc1--n5{grid-template-areas:"t b e c" "a d d c"}
.lv-hc1--n6.lv-hc1--bul{grid-template-areas:"t b e c" "t d f c"}
.lv-hc1--n5.lv-hc1--bul{grid-template-areas:"t b e c" "t d d c"}
.lv-hc1-ph.is-e{grid-area:e}.lv-hc1-ph.is-f{grid-area:f}
.lv-hc1--n5:has(.is-c:hover),.lv-hc1--n6:has(.is-c:hover){grid-template-columns:1.27fr .5fr .5fr 2.08fr}
.lv-hc1--n5:has(.is-b:hover),.lv-hc1--n6:has(.is-b:hover),
.lv-hc1--n6:has(.is-d:hover){grid-template-columns:1.27fr 1.2fr .5fr 1.38fr}
.lv-hc1--n5:has(.is-e:hover),.lv-hc1--n6:has(.is-e:hover),
.lv-hc1--n6:has(.is-f:hover){grid-template-columns:1.27fr .5fr 1.2fr 1.38fr}
.lv-hc1--n5:has(.is-d:hover){grid-template-columns:1.27fr 1fr 1fr 1.08fr}
.lv-hc1--n5:has(.is-a:hover),.lv-hc1--n6:has(.is-a:hover){grid-template-columns:1.8fr .6fr .6fr 1.35fr}
@media print{.lv-hc1{grid-template-columns:1.27fr 1fr 2.11fr !important}
 .lv-hc1--n5,.lv-hc1--n6{grid-template-columns:1.27fr .74fr .74fr 1.6fr !important}}

/* ══ hospitality · «Sales team» (nodo 10138:8870, 8 oct 2026) ══════════════
   Medidas del nodo entre 1,5 (el titular, 355 de ancho y no 347: con el DM Sans
   del navegador «Meet some» no cabia en una linea como en Figma). Titular DM Sans 68 a interlinea 1 con la
   cursiva de Instrument en magenta, centrado en vertical a y 314; rejilla 4 x 2
   de 808 px desde x 421, calles 13,3 / 56,7; foto 192 x 183 radio 6 sobre
   gris; nombre 16 seminegrita, cargo 10,7 y correo 9,6 en magenta. ══ */
/* .lv-slide delante: en la miniatura del asistente `.lv-panel h2` le ganaba */
.lv-slide .lv-st-h{position:absolute;left:50.7px;top:314px;transform:translateY(-50%);width:355px;margin:0;
 font-family:var(--font-canvas);font-weight:400;font-size:68.2px;line-height:1;
 letter-spacing:0;color:var(--paper-text)}
/* la cursiva va en su propia linea, como en el nodo (tres parrafos) */
.lv-slide .lv-st-h em{display:block;font-family:var(--font-accent);font-style:italic;color:var(--paper-accent)}
.lv-st{position:absolute;left:421.3px;top:97.3px;width:808px;display:grid;
 grid-template-columns:repeat(4,1fr);column-gap:13.3px;row-gap:56.7px}
.lv-st-c{min-width:0}
.lv-st-c img,.lv-st-c>i{display:block;width:100%;height:183px;object-fit:cover;
 border-radius:var(--r-md);background:var(--neutral-150)}
.lv-st-c b{display:block;margin-top:10.2px;font-family:var(--font-canvas);font-size:16px;line-height:1;
 font-weight:600;letter-spacing:-.02em;color:var(--paper-text);white-space:nowrap}
.lv-st-c span{display:block;margin-top:3.8px;font-family:var(--font-canvas);font-size:10.7px;line-height:1;
 letter-spacing:-.02em;color:var(--paper-text)}
.lv-st-c em{display:block;margin-top:2.3px;font-family:var(--font-canvas);font-style:normal;font-size:9.6px;
 line-height:1;letter-spacing:-.02em;color:var(--paper-accent)}

/* ══ filete 9 · V Modern Italian (nodo 9374:14149) ═══════════════════════════
   Titular y parrafo a la izquierda sobre la fotografia, y tres contadores
   abajo a la derecha con el MISMO efecto de cifras del filete 2. Los numeros
   se anclan por su borde derecho, como en el nodo. ══ */
/* La columna va en FLUJO: en ingles el titular ocupa tres lineas y, con
   posiciones absolutas, se montaba encima del parrafo. */
.lv-vm-col{position:absolute;left:69.3px;top:170px;width:448px;z-index:2}
.lv-vm-h{margin:0;font-family:var(--font-canvas);font-weight:400;
 font-size:64px;line-height:68px;letter-spacing:-.02em;color:var(--neutral-0)}
.lv-vm-h em{font-family:var(--font-accent);font-style:italic;font-weight:400;
 letter-spacing:0;color:var(--text-accent)}
/* Entre parrafo y parrafo, 16; del titular al primero, 32. */
.lv-vm-p+.lv-vm-p{margin-top:var(--sp-16)}
.lv-vm-p{margin:var(--sp-32) 0 0;font-family:var(--font-canvas);font-size:16px;
 line-height:23.4px;font-weight:400;color:var(--neutral-0);text-align:justify}
/* Pedro: oscurecer el fondo para que el texto se lea. Mas peso a la
   izquierda, donde vive la columna, y un velo general suave. */
.lv-vm-scrim{position:absolute;inset:0;z-index:1;background:
 linear-gradient(90deg,
  color-mix(in srgb,var(--neutral-1000) 82%,transparent) 0%,
  color-mix(in srgb,var(--neutral-1000) 62%,transparent) 34%,
  color-mix(in srgb,var(--neutral-1000) 30%,transparent) 62%,
  color-mix(in srgb,var(--neutral-1000) 34%,transparent) 100%),
 linear-gradient(0deg,
  color-mix(in srgb,var(--neutral-1000) 34%,transparent) 0%,
  color-mix(in srgb,var(--neutral-1000) 16%,transparent) 100%)}
/* los contadores van APILADOS a la derecha y alineados por su borde
   derecho (a 104,7 del margen), como el frame 9374:14058 */
.lv-vm-n{position:absolute;z-index:2;right:104.7px;margin:0;font-family:var(--font-canvas);
 font-weight:300;font-size:85.3px;line-height:111px;letter-spacing:-.02em;
 color:var(--neutral-0);text-align:right;
 font-variant-numeric:tabular-nums}
.lv-vm-l{position:absolute;z-index:2;right:104.7px;margin:0;font-family:var(--font-canvas);
 font-size:14.7px;line-height:14.7px;font-weight:400;color:var(--neutral-0);
 text-align:right}
.lv-vm-logo{position:absolute;z-index:2;left:879.3px;top:108px;width:296px;height:92.1px;
 display:block}

/* ══ filete 10 · Livit Lab (nodo 9374:14433) ═════════════════════════════════
   La lista de ciudades a la izquierda -DM Sans Light 72, o sea 48- y el fondo
   van de la mano: se muestra la foto de una ciudad, su nombre se enciende en
   --brand-400 y el resto queda en blanco; cada pocos segundos el fondo se
   funde a la siguiente. Las fotos: x/labs/<ciudad>.webp|jpg|png. ══ */
/* Las diez fotos van APILADAS: si no se sacan del flujo, el filete mide diez
   veces su alto -7.200 px- y la impresion se va al garete. */
/* z-index:0 = contexto propio: el z-index que labCycle da a las fotos se queda DENTRO del fondo y el velo (.lv-lab-scrim, z1) nunca queda tapado ni parpadea */
.lv-lab-bg{overflow:hidden;z-index:0}
.lv-lab-bg img{position:absolute;inset:0;width:100%;height:100%;
 object-fit:cover;display:block}
.lv-lab-cities{position:absolute;left:53.3px;top:73px;z-index:2;margin:0}
.lv-lab-cities b{display:block;font-family:var(--font-canvas);font-size:48px;
 line-height:53.3px;font-weight:300;letter-spacing:-.01em;
 color:var(--neutral-0);transition:color .95s cubic-bezier(0.37,0,0.63,1)}
.lv-lab-cities b.is-on{color:var(--brand-400)}
/* Baja a 600 (Pedro, 21 sep 2026) y lleva sombra difusa: la frase cae sobre
   fotografia de restaurante, que cambia cada pocos segundos y no se puede
   prever si debajo habra un mantel blanco o una pared oscura. Dos sombras muy
   abiertas y con poca opacidad -no un contorno- despegan el texto sin que se
   note que hay sombra: es el mismo recurso del rotulo de ciudades. */
/* Anclada por ABAJO y no por arriba: en ingles la frase cabe en una linea y en
   espanol ocupa dos, y con top fijo la segunda se salia de la hoja -medido: 729
   de 720-. Con bottom, la de una linea cae donde pedia Pedro y la de dos crece
   hacia arriba sin tocar el borde. */
.lv-lab-h{position:absolute;right:70px;bottom:56px;margin:0;z-index:2;
 width:700px;text-align:right;font-family:var(--font-canvas);font-weight:400;
 font-size:64px;line-height:64.5px;letter-spacing:-.02em;
 color:var(--neutral-0);
 text-shadow:0 2px 18px color-mix(in srgb,var(--neutral-900) 55%,transparent),
             0 1px 3px color-mix(in srgb,var(--neutral-900) 30%,transparent)}
.lv-lab-h em{font-family:var(--font-accent);font-style:italic;font-weight:400;
 letter-spacing:0;color:var(--text-accent)}
/* los dos velos del nodo: uno por la izquierda y otro por abajo */
.lv-lab-scrim{position:absolute;inset:0;z-index:1;background:
 linear-gradient(90deg,
  color-mix(in srgb,var(--neutral-1000) 72%,transparent) 0%,
  color-mix(in srgb,var(--neutral-1000) 34%,transparent) 38%,
  color-mix(in srgb,var(--neutral-1000) 2%,transparent) 60%),
 linear-gradient(0deg,
  color-mix(in srgb,var(--neutral-1000) 66%,transparent) 0%,
  color-mix(in srgb,var(--neutral-1000) 2%,transparent) 44%)}

/* ══ pantalla completa ══════════════════════════════════════════════════════
   La banda superior deja de ocupar sitio -pasa a fija sobre la hoja- y se
   retira arriba; vuelve sola cuando el raton sube a la franja de 64 px.
   Sin esto la presentacion no llena la pantalla del todo. ══ */
#deck.is-fs .lv-bar{position:fixed;top:0;left:0;right:0;z-index:60;
 background:var(--bg-base);transform:translateY(-101%);
 transition:transform var(--motion-standard)}
#deck.is-fs.bar-on .lv-bar{transform:translateY(0)}
/* Con la banda fija, la escena tiene que ocupar la pantalla ENTERA: si se
   queda con el alto de antes -100vh menos la banda- la hoja se centra en una
   caja mas corta que la pantalla y aparece cortada por arriba. Y fuera la
   sombra, que por abajo se leia como si asomase el filete siguiente. */
#deck.is-fs .lv-stage{min-height:100vh;height:100vh}
#deck.is-fs .lv-slide{box-shadow:none}

/* la hoja avisa de que se pasa con un clic */
#deck .lv-stage{cursor:pointer}

/* cortinilla entre filetes - el wipe de los anclajes del sitio */
.lv-wipe{position:absolute;inset:0;z-index:40;pointer-events:none;
 transform:scaleY(0);transform-origin:bottom;
 background:linear-gradient(180deg,
  color-mix(in srgb,var(--brand-primary) 62%,var(--bg-base)) 0%,
  color-mix(in srgb,var(--brand-primary) 22%,var(--bg-base)) 46%,
  var(--bg-base) 100%)}

@media print{
 @page{size:13.333in 7.5in;margin:0}
 .lv-bar,.lv-deck-nav,#wiz,.lv-wipe{display:none !important}
 .lv-wallgrid i,.lv-slide-in>*,.lv-ln>span,.lv-slide-bleed img,
 .lv-slide-tag,.lv-slide-addr>div,.lv-slide-rule,.lv-mcard,.lv-ph,
 .lv-team i,.lv-team span,.lv-lab-cities b,.lv-contact,.lv-map2-dots,
 .lv-fig,.lv-vm-h,.lv-vm-p,.lv-vm-n,.lv-case-h,.lv-case-row>i,.lv-case-tags b,
 .lv-stat,.lv-stat-n,.lv-stat-l,.lv-stat-plus,.lv-carou-t,.lv-slide-head,.lv-slide-foot,
 .lv-carou-c{transform:none !important}
 .lv-slide-in>*,.lv-ln>span,.lv-slide-tag,.lv-slide-addr>div,.lv-mcard,
 .lv-ph,.lv-team i,.lv-team span,.lv-team img,.lv-wallgrid img,
 .lv-wallgrid i,.lv-lab-cities b,.lv-contact,.lv-map2-dots,.lv-map2-l,
 .lv-map2-ln,.lv-fig,.lv-team-h,.lv-vm-h,.lv-vm-p,.lv-vm-n,.lv-vm-l,
 .lv-lab-h,.lv-vm-logo,.lv-case-h,.lv-case-row>i,.lv-case-tags b,.lv-stat,
 .lv-stat-n,.lv-stat-l,.lv-stat-plus,.lv-node-l,.lv-lever,.lv-target-c,.lv-carou-t,
 .lv-carou-c,.lv-carou-c img,.lv-srvi,
 .lv-slide-head,.lv-slide-foot{opacity:1 !important}
 /* Las etiquetas centradas (.lv-map2-l--c, .lv-vm-l) conservan su transform
    de centrado: NO entran en las listas de arriba. */
 /* En el PDF la cinta es un mosaico: las DOCE fotos en dos filas de seis
    que llenan el hueco de la cinta a lo ancho de la columna de texto (1120)
    y a lo alto (lo que deja el titular y las cuatro columnas). Las tarjetas
    quedan casi cuadradas, asi que la foto vertical se recorta por el centro
    -object-fit:cover, nunca se deforma- y conserva las esquinas redondeadas.
    Pedro, 16 sep 2026: «todas las fotos, 2 filas de 6, que llenen el
    espacio». Los duplicados de la vuelta no se imprimen. */
 .lv-carou{overflow:visible !important;margin-left:0 !important;margin-right:0 !important}
 .lv-carou::before,.lv-carou::after{display:none !important}
 .lv-carou-t{display:grid !important;grid-template-columns:repeat(6,1fr);
  grid-template-rows:1fr 1fr;gap:var(--sp-8) !important;padding:0 !important;
  height:100% !important;align-items:stretch !important}
 .lv-carou-c{width:auto !important;height:auto !important;aspect-ratio:auto !important;
  min-height:0;border-radius:var(--r-2xl) !important}
 .lv-carou-c.is-dup{display:none !important}
 .lv-map2-dots{clip-path:none !important}
 .lv-rv .w{color:inherit !important}
 .lv-deck,.lv-stage{background:none;min-height:0;display:block;overflow:visible}
 .lv-slide{transform:none !important;box-shadow:none;
  break-after:page;page-break-after:always;display:block !important}
 .lv-slide:last-child{break-after:auto;page-break-after:auto}
}

/* ══ cabecera de sección ════════════════════════════════════════════════ */
.lv-shead-k{font-size:var(--fs-labelS);line-height:var(--lh-labelS);font-weight:600;
 letter-spacing:.16em;text-transform:uppercase;color:var(--brand-primary-tint)}
.lv-shead-h{font-family:var(--font-canvas);font-weight:400;letter-spacing:-.03em;
 color:var(--text-primary)}
.lv-shead-p{font-size:var(--fs-bodyL);line-height:var(--lh-bodyL);color:var(--text-secondary)}
.lv-shead-p b{color:var(--text-primary);font-weight:600}

@media(max-width:900px){
 .lv-toolwrap{grid-template-columns:1fr;padding:0 var(--sp-20) var(--sp-32)}
 .lv-toolwrap{grid-template-rows:auto} .lv-toolwrap>.lv-side{grid-row:auto} .lv-panel-head,.lv-toolwrap>.lv-panel{grid-column:1}
 .lv-side{position:static;flex-direction:row;overflow-x:auto;gap:var(--sp-4);
  padding-bottom:var(--sp-4)}
 .lv-side .lv-step{flex:0 0 auto}
 .lv-toolhead{flex-wrap:wrap;padding:var(--sp-20) var(--sp-20) var(--sp-16)}
}

@media(prefers-reduced-motion:reduce){
 .lv-btn--ai,.lv-btn--ai::before{transition:none}
 .lv *,.lv *::before,.lv *::after{transition-duration:.01ms !important;
  animation-duration:.01ms !important}
}

/* ══ Composición fina (Pedro, 17 sep 2026) ══════════════════════════════════
   Decisiones de la revisión de Management con la referencia «Orders»:
   · dos anclas por fila (nombre en 400 primario, importe en 500), el resto apagado;
   · sentence case en todo, salvo la cabecera de tabla (.lv-thead--caps), único registro en mayúsculas;
   · sin mono en la interfaz de Kore (Inter tabular); mono queda para documentos y código;
   · tabla sin carta: filas de 44 con filete al 5 % que se apaga bajo el hover, gutter de 32;
   · color sólo en punto, pastilla y barra; nunca en cifras grandes ni en bloques;
   · magenta como señal (primario, activo, enlace, «in progress / delivered»), no como estructura.
   Estados de trabajo y facturación: --stage-* en livit-tokens.css (dos valores en claro). */

/* Estados de Management. Punto + texto (Status) o pastilla (Billing), mismo color por lectura. */
/* El fondo tintado sube de 12 a 18 %: con las superficies de la escalera nueva
   un 12 % ya no se despega de la tarjeta y once subfases se leían como una
   mancha. El texto va en --stage-*-text, no en el color de la barra. (24 sep 2026) */
.lv-status--idle{color:var(--stage-idle-text);background:color-mix(in srgb,var(--stage-idle) 18%,transparent)}
.lv-status--progress{color:var(--stage-progress-text);background:color-mix(in srgb,var(--stage-progress) 18%,transparent)}
.lv-status--delivered{color:var(--stage-delivered-text);background:color-mix(in srgb,var(--stage-delivered) 18%,transparent)}
.lv-status--done{color:var(--stage-done-text);background:color-mix(in srgb,var(--stage-done) 18%,transparent)}
.lv-status--billable{color:var(--stage-billable-text);background:color-mix(in srgb,var(--stage-billable) 14%,transparent)}
.lv-status--billable::before{background:var(--stage-billable)}
/* Forma «texto»: sin fondo, 13/400, punto delante. Para la columna Status y las leyendas. */
.lv-status--text{height:auto;padding:0;background:none !important;gap:var(--sp-8);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:400}
.lv-status--text.lv-status--idle{color:var(--text-muted)}
.lv-status--dot.lv-status--idle{color:var(--stage-idle)} .lv-status--dot.lv-status--progress{color:var(--stage-progress)}
.lv-status--dot.lv-status--delivered{color:var(--stage-delivered)} .lv-status--dot.lv-status--done{color:var(--stage-done)}
.lv-status--dot.lv-status--billable{color:var(--stage-billable)}

/* Contador: badge de 18, radio 6, Inter tabular. Índice lateral, pestañas, encabezados de sección. */
.lv-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--sp-6);border-radius:var(--r-md);
 background:color-mix(in srgb,var(--text-primary) 8%,transparent);font-size:var(--fs-labelS);line-height:1;font-weight:500;color:var(--text-secondary);font-variant-numeric:tabular-nums}
.lv-count--warn{background:color-mix(in srgb,var(--stage-billable) 14%,transparent);color:var(--stage-billable-text)}
.lv-count--on{background:color-mix(in srgb,var(--brand-primary) 14%,transparent);color:var(--text-accent)}

/* Encabezado de sección en sentence case: rótulo 13/500 secundario + contador; a la derecha, texto apagado y/o un botón.
   Sustituye al eyebrow tracked en las secciones de Kore; el eyebrow sigue en documentos y en el canvas. */
.lv-sechead{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-16);margin-bottom:var(--sp-16)}
/* Rótulo 15/500 primario (Pedro, 17 sep 2026: a 13 secundario las secciones no se distinguían). Entre secciones, 48. */
.lv-sechead>.t{display:inline-flex;align-items:center;gap:var(--sp-8);font-size:15px;line-height:20px;font-weight:500;color:var(--text-primary)}
.lv-sechead>.x{display:inline-flex;align-items:center;gap:var(--sp-16);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-muted);font-variant-numeric:tabular-nums}

/* Cabecera de tabla con banda al 4 %, radio 8. Desde el 13 oct 2026 en texto normal 12/500, como
   todas (el nombre --caps se queda por compatibilidad). */
.lv-thead--caps{align-items:center;padding:var(--sp-8) var(--sp-16);margin:0;border:0;border-radius:var(--r-lg);
 background:color-mix(in srgb,var(--text-primary) 4%,transparent);
 font-size:12px;line-height:16px;font-weight:500;color:var(--text-muted)}
.lv-thead--caps>*{white-space:nowrap}
/* La misma cabecera para una <table> de verdad (el informe A4, 17 sep 2026), en texto normal (13 oct 2026). */
.lv-table thead th{font-size:12px;line-height:16px;font-weight:500;color:var(--text-muted);text-align:left}
/* Orden por columna: el chevron sale al pasar el ratón; la columna ordenada lo enseña siempre. */
.lv-sort{display:inline-flex;align-items:center;gap:var(--sp-4);background:none;border:0;padding:0;font:inherit;color:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer}
.lv-sort>svg{width:12px;height:12px;flex:0 0 auto;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:0;transition:opacity var(--motion-fast)}
.lv-sort:hover>svg{opacity:.6}
.lv-sort.is-sorted{color:var(--text-secondary)} .lv-sort.is-sorted>svg{opacity:1}
.lv-sort:focus-visible{outline:none;box-shadow:0 0 0 2px var(--border-focus);border-radius:var(--r-sm)}

/* Fila de tabla sin carta: 44 de alto, filete al 5 % que desaparece bajo el hover (también el de la fila de encima),
   gutter de 32 entre columnas, esquinas sólo en hover. Dos anclas: .t en 400 primario, .amt en 500. */
.lv-listrow--table{min-height:44px;padding:0 var(--sp-16);border-radius:0;gap:var(--sp-32);color:var(--text-muted);
 border-bottom:1px solid color-mix(in srgb,var(--text-primary) 5%,transparent)}
.lv-listrow--table:last-child{border-bottom-color:transparent}
.lv-listrow--table:hover,.lv-listrow--table.is-hover{background:color-mix(in srgb,var(--text-primary) 4%,transparent);border-radius:var(--r-lg);border-bottom-color:transparent}
.lv-listrow--table:has(+ .lv-listrow--table:hover),.lv-listrow--table:has(+ .lv-listrow--table.is-hover){border-bottom-color:transparent}
.lv-listrow--table .t{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:400;color:var(--text-primary)}
.lv-listrow--table .amt{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;color:var(--text-primary);font-variant-numeric:tabular-nums}
.lv-listrow--table .n{font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);font-variant-numeric:tabular-nums}
.lv-listrow--table .c{justify-self:center;text-align:center}
.lv-thead--list.lv-thead--caps{gap:var(--sp-32)}

/* Carta de indicador: etiqueta 12/500 apagada con punto, cifra 24/500, una línea de contexto, barra de 3 al pie.
   Sin borde, con la sombra de la carta. (.lv-kpi y no .lv-stat: ese nombre ya es el dato grande del Sales Deck.) */
.lv-kpi{padding:var(--sp-20);display:flex;flex-direction:column}
.lv-kpi>.l{display:flex;align-items:center;gap:var(--sp-8);margin-bottom:var(--sp-8);font-size:var(--fs-labelM);line-height:var(--lh-labelM);font-weight:500;color:var(--text-muted)}
.lv-kpi>.v{font-size:24px;line-height:32px;font-weight:500;letter-spacing:-.01em;color:var(--text-primary);font-variant-numeric:tabular-nums}
.lv-kpi>.s{display:block;margin-top:var(--sp-4);font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lv-kpi>.s>a{color:var(--stage-billable-text);font-weight:500;text-decoration:none;display:inline-flex;align-items:center;gap:var(--sp-4)}
.lv-kpi>.s>a>svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.lv-kpi>.lv-meter{margin-top:var(--sp-12);height:3px}
/* La carta prevista (Rentabilidad, Horas) va IGUAL que las demás (Pedro, 17 sep 2026): sin discontinuo. Lo que
   dice que aún no existe es su texto («Planned · …») y la cifra en 400 apagado. Excepción a la regla 0.5. */
.lv-kpi.is-planned>.v{color:var(--text-muted);font-weight:400}

/* Cabecera del expediente: título 32/40 en DM Sans regular, subtítulo 13 en Inter con la pastilla de estado delante. */
.lv-page-title--doc{font-size:32px;line-height:40px;font-weight:400;letter-spacing:-.01em}
.lv-page-sub{display:flex;align-items:center;gap:var(--sp-10);margin:var(--sp-8) 0 0;font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-muted)}

/* Gantt «calmo» para Kore (Pedro, 17 sep 2026): el mismo gantt del SOW con los criterios de composición
   —fase en sentence case 13/500 con contador, meses y unidades en 12 sin tracking, nombres en 13, pista
   neutra y sólo el relleno (el avance) en tinta de marca. El documento SOW conserva su gantt tal cual. */
.lv-gantt--calm .lv-gantt-ph{display:flex;align-items:center;gap:var(--sp-8);margin:var(--sp-16) 0 var(--sp-6);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;letter-spacing:0;text-transform:none;color:var(--text-secondary)}
.lv-gantt--calm .lv-gantt-band>i{font-size:var(--fs-labelM);font-weight:500;letter-spacing:0;text-transform:none;background:color-mix(in srgb,var(--text-primary) 4%,transparent);border-left:0}
.lv-gantt--calm .lv-gantt-units>i{font-size:var(--fs-labelM);color:var(--text-muted)}
.lv-gantt--calm .lv-gantt-row{height:32px}
/* Rango de fechas de la fase bajo su nombre: 12 apagado, que no compita con los nombres. */
.lv-gantt--calm .lv-gantt-row>.nm.rng{font-size:var(--fs-labelM);color:var(--text-muted)}
/* La rejilla vertical va UNA vez, detrás de todas las filas y sólo en los meses (.lv-gantt-grid); las pistas no la repiten. */
.lv-gantt--calm .lv-gantt-track{background-image:none}
.lv-gantt--calm{isolation:isolate}
.lv-gantt-grid{position:absolute;inset:0 0 0 auto;pointer-events:none;z-index:-1}
.lv-gantt-grid>i{position:absolute;top:0;bottom:0;width:1px;background:color-mix(in srgb,var(--text-primary) 5%,transparent)}
.lv-gantt--calm .lv-gantt-row>.nm{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-secondary)}
.lv-gantt--calm .lv-gantt-row>.nm>b{font-weight:400;font-size:var(--fs-labelM)}
.lv-gantt--calm .lv-gantt-bar>u{font-size:var(--fs-labelM);color:var(--text-muted)}
.lv-gantt--calm .lv-gantt-bar>.t{font-size:var(--fs-labelM)}

/* Ficha de persona / contacto de Kore (Pedro, 17 sep 2026) — .lv-person, porque .lv-contact es el pie de firmas del Sales Deck: cabecera avatar 40 + nombre 13/500 + rol; mandos (asa y «···») arriba a la
   derecha alineados con el nombre; filete y filas de contacto icono 16 + texto 13. El rol en el proyecto va en chip de
   marca (.lv-role--brand); el cargo de un contacto del cliente, en texto apagado. */
.lv-person{padding:var(--sp-16) var(--sp-16) var(--sp-16);display:flex;flex-direction:column;height:100%}
.lv-person>.hd{display:flex;align-items:flex-start;gap:var(--sp-12)}
.lv-person>.hd>.who{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0;flex:1;padding-top:1px}
.lv-person>.hd>.who>.nm{font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-person>.hd>.who>.sub{font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-person>.hd>.acts{display:flex;align-items:center;gap:2px;flex:0 0 auto;margin:-2px -6px 0 0}
.lv-person>.rows{list-style:none;margin:var(--sp-12) 0 0;padding:var(--sp-12) 0 0;border-top:1px solid var(--border-subtle);display:flex;flex-direction:column;gap:var(--sp-6)}
.lv-person>.rows>li{display:flex;align-items:center;gap:var(--sp-8);font-size:var(--fs-bodyM);line-height:var(--lh-bodyM);color:var(--text-secondary);min-width:0}
.lv-person>.rows>li>svg{width:16px;height:16px;flex:0 0 auto;color:var(--text-muted)}
.lv-person>.rows>li a{color:inherit;text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lv-person>.rows>li a:hover{color:var(--text-primary);text-decoration:underline}
.lv-person>.foot{margin-top:auto;padding-top:var(--sp-10);font-size:var(--fs-labelM);line-height:var(--lh-labelM);color:var(--text-muted)}
.lv-role--brand{color:var(--text-accent);background:color-mix(in srgb,var(--brand-primary) 14%,transparent)}

/* Contenedor de sección (Pedro, 17 sep 2026: «probemos un contenedor pero muy muy sutil»): un escalón de
   fondo al 3 % del texto, radio 16, padding 20/24, sin borde ni sombra. Las cartas de dentro siguen en
   --surface-default. En Management van los cinco: calendario, timeline, cliente, equipo y firmados. */
/* La seccion es una REGION, no un objeto: el gantt, el calendario de pagos, los
   contactos. Llevaba un 3 % de blanco —L* 6 sobre un lienzo de 3,1— y la caja no
   se veia, mientras el carril de Activity que tiene al lado si era una tarjeta:
   parecia un descuido, no una decision. Sube a --bg-default, el peldano que no
   usaba nadie, y queda la escalera entera: lienzo 3,1 · seccion 9,5 · tarjeta
   14,9 · menus 20,4. No sube al nivel de tarjeta a proposito: si lo hiciera, las
   cuatro fichas del cuadro de mando dejarian de destacar y la pagina volveria a
   tener un solo plano. (Pedro, 25 sep 2026) */
.lv-section{background:var(--bg-default);border-radius:var(--r-2xl);padding:var(--sp-20) var(--sp-24) var(--sp-24)}
.lv-section>.lv-sechead{margin-bottom:var(--sp-16)}

/* Carta de indicador, segunda forma (Pedro, 17 sep 2026): rótulo con punto · cifra 24 con su contexto en
   pequeño (.v>small) · una línea de apoyo · barra de 4 al pie, entera (.lv-meter) o por tramos (.mini).
   Cuatro cartas en Management: dinero · trabajo · tiempo · rentabilidad. */
.lv-kpi>.v>small{font-size:var(--fs-bodyM);line-height:var(--lh-labelM);font-weight:400;letter-spacing:0;color:var(--text-muted);margin-left:var(--sp-6)}
.lv-kpi>.v.is-text{font-size:18px;line-height:24px;padding-top:var(--sp-4)}
.lv-kpi>.s>b{font-weight:500;color:var(--text-secondary)}
.lv-kpi>.mini{display:flex;gap:2px;height:4px;margin-top:auto;padding-top:var(--sp-12);box-sizing:content-box}
.lv-kpi>.mini>i{display:block;height:4px;border-radius:var(--r-full)}
.lv-kpi>.mini>i.rest{flex:1;background:color-mix(in srgb,var(--text-primary) 8%,transparent)}
.lv-kpi>.lv-meter{margin-top:auto}
.lv-kpi>.lv-meter.is-ok::before{background:var(--stage-done)} .lv-kpi>.lv-meter.is-warn::before{background:var(--stage-billable)} .lv-kpi>.lv-meter.is-bad::before{background:var(--status-error)}
/* Tono de una proporción (horas, margen): verde lejos del límite, ámbar al acercarse, rojo al pasarlo. */
.lv-tone--ok{color:var(--stage-done)} .lv-tone--warn{color:var(--stage-billable-text)} .lv-tone--bad{color:var(--status-error-text)}
/* Tabla densa: nueve columnas caben con gutter de 24 en vez de 32. */
.lv-listrow--table.lv-listrow--dense{gap:var(--sp-24)} .lv-thead--list.lv-thead--dense{gap:var(--sp-24)}

/* ══ el lanzador de herramientas de una subfase ═══════════════════════════
   28 sep 2026. Deja de ser una carta dentro del contenido y pasa a ser una
   COLUMNA: hermana del lienzo, del alto de la ventana y con su propio scroll,
   igual que el lateral izquierdo. Un lanzador que se va con el scroll deja de
   estar justo cuando hace falta. */
/* ══ panel derecho estándar · 440 (29 sep 2026) ═════════════════════════════
   Un solo panel lateral para Kore: 440 = 16 + 408 + 16, y 408 son tres cartas
   de herramienta de 125 con huecos de 16 — la carta sale igual que en el
   centro. Fijo de arriba abajo, pestañas en una cabecera del alto de la barra
   (su filete casa con el de la cabecera). Dentro: actividad, herramientas o
   propiedades. Lo usan expediente, subfase, borrador del Toolkit y los paneles
   de propiedades de Brand Guidelines (el .lv-toolrail de 360 se retiró el mismo día). */
.lv-sidepanel{display:flex;flex-direction:column;width:440px;flex:0 0 auto;min-height:0;overflow-y:auto;
 background:var(--bg-default);border-left:1px solid var(--border-subtle)}
.lv-sidepanel-tabs{position:sticky;top:0;z-index:2;flex:0 0 auto;height:var(--ctl-bar);display:flex;align-items:flex-end;
 padding:0 var(--sp-16);background:var(--bg-default);border-bottom:1px solid var(--border-subtle)}
.lv-sidepanel-tabs>.lv-tabs{border:0;flex:1 1 auto;gap:0}
/* Las pestañas del panel se reparten su ancho a partes iguales (Pedro, 6 oct
   2026): con dos o tres vistas, el panel entero es el selector y se lee mejor. */
.lv-sidepanel-tabs .lv-tab{flex:1 1 0;justify-content:center}
.lv-sidepanel-hd{padding:var(--sp-16) var(--sp-16) var(--sp-12);border-bottom:1px solid var(--border-subtle)}
.lv-sidepanel-b{padding:var(--sp-16)}
.lv-tab-n{margin-left:var(--sp-4);padding:0 var(--sp-4);border-radius:var(--r-sm);
 background:var(--status-warning-bg);color:var(--status-warning-text);
 font-size:var(--fs-labelXS);font-style:normal;font-weight:600;font-variant-numeric:tabular-nums}
