/* public/styles/bloomzy.css
 *
 * EL DISENO DE LOS DOS MOCKUPS APROBADOS, extraido de ellos y no reescrito.
 * `docs/mockups/mockup-asistente-bloomzy.html` (telefono) y
 * `-desktop.html` (computadora) son la especificacion; sus notas finales
 * tambien. Lo que se quito al traerlo es el ESCAPARATE —el marco de telefono,
 * las tiras, los pies de foto y las notas—, que existe para mirar el mockup y
 * no es producto.
 *
 * TODO VA DENTRO DE `#bz-raiz`, Y ESO NO ES COSMETICO. Las clases del mockup
 * son cortas —`.cell`, `.sec`, `.grp`, `.btn`— y la app tiene las suyas: sin
 * acotarlas, `.btn` de aqui repintaria botones de Studio. El acotado se hace
 * con un ancestro y no renombrando las 345 clases, para que el fichero siga
 * siendo comparable con el mockup linea a linea.
 *
 * LOS TOKENS SON LOS DEL SISTEMA DE DISENO, y el blanco de `--cell` entro a la
 * paleta por decision de Carolina del 2 oct 2026: celdas blancas sobre cream.
 */

/* LOS TOKENS VAN EN `#bz-raiz`, NUNCA EN `:root`, y esto se midio.
 * `public/js/footer-marketing.js` pinta un cuadro con `background:var(--teal)`
 * y HOY NADA DEFINE ESA VARIABLE en la app: ese cuadro sale sin fondo.
 * Declararlas en `:root` le pondria fondo teal de golpe, en el pie de las
 * paginas publicas, sin que nadie lo hubiera pedido. Es un cambio fuera de
 * este modulo y por eso no se hace: se nombra y se deja (regla 13).
 */
#bz-raiz{
  --teal:#094D5F; --amber:#FFBD59; --sage:#D5D6C9; --cream:#F2F2F1;
  --warm:#C58F74; --dark:#1C1C1B; --muted:#687067;
  --cell:#FFFFFF; --hair:rgba(9,77,95,.12);
}

/* ── LOS TRES ANFITRIONES ──────────────────────────────────────────────────
 *
 * Los mockups ensenan Bloomzy en tres sitios y los tres son el MISMO arbol de
 * pantallas: hoja encima de Studio en el telefono, panel a la derecha en la
 * computadora, y pagina propia desde el menu, en la misma columna centrada.
 * Lo que cambia es el marco, nunca el contenido, y por eso el marco vive aqui
 * y no en el render.
 */
#bz-raiz{position:fixed;inset:0;z-index:900;display:none;font-family:'Gilroy',-apple-system,BlinkMacSystemFont,'SF Pro Text','Segoe UI',sans-serif;color:var(--dark);-webkit-font-smoothing:antialiased}
#bz-raiz.bz-visible{display:block}
#bz-raiz .bz-scrim{position:absolute;inset:0;background:rgba(28,28,27,.35)}

/* Telefono: hoja al 90 %, con su agarradera. */
#bz-raiz.bz-hoja .bz-marco{position:absolute;left:0;right:0;bottom:0;height:90%;background:var(--cream);border-radius:14px 14px 0 0;display:flex;flex-direction:column;overflow:hidden}

/* Computadora: panel a la derecha. */
#bz-raiz.bz-panel .bz-marco{position:absolute;right:0;top:0;bottom:0;width:420px;max-width:100%;background:var(--cream);border-left:.5px solid var(--hair);box-shadow:-12px 0 32px rgba(28,28,27,.12);display:flex;flex-direction:column;overflow:hidden}

/* Pagina propia: la misma columna centrada, sin velo. */
#bz-raiz.bz-pagina{position:static;z-index:auto;display:none}
#bz-raiz.bz-pagina.bz-visible{display:flex;min-height:100vh;background:var(--sage)}
#bz-raiz.bz-pagina .bz-scrim{display:none}
#bz-raiz.bz-pagina .bz-marco{width:680px;max-width:100%;margin:0 auto;background:var(--cream);display:flex;flex-direction:column;min-height:100vh}
/* ── LA PAGINA PROPIA ES FIJA, A CUALQUIER ANCHO · 4 oct y 29 oct 2026 ───
 *
 * `bz-pagina` es `position:static`, o sea un bloque EN FLUJO, y `bzRaiz()`
 * cuelga `#bz-raiz` de `document.body` DESPUES de `#app`. Asi que en flujo
 * empieza justo donde acaba `#app`, y `#app` mide el alto de la ventana.
 *
 * EN EL TELEFONO se encontro primero, el 4 oct 2026. `index.html` pone
 * `@media (max-width:768px){html,body{height:100dvh;overflow:hidden}}` y le da
 * el scroll a `#app`, asi que el modulo se pintaba una pantalla por debajo del
 * borde, dentro de un `body` recortado y sin scroll: ninguna forma de llegar a
 * el. MEDIDO a 375x780: `top:780, bottom:1560` sobre un alto de 780.
 *
 * Y ESE ARREGLO SE QUEDO CORTO, porque se acoto al rango donde `body` lleva
 * `overflow:hidden` —se penso que el culpable era ese `overflow`— cuando el
 * culpable es que la pagina propia esta EN FLUJO detras de algo que mide una
 * ventana entera. En escritorio el documento si baja, pero nadie baja: se
 * pulsa, no pasa nada, y el modulo esta ahi abajo.
 *
 * MEDIDO otra vez el 29 oct 2026, en staging y con un navegador: a 1280x800 el
 * marco quedaba en `top:800` sobre una ventana de 800, o sea empezando
 * exactamente en el borde inferior. Lo reporto Rosiris al abrir el modulo a su
 * cuenta, y la otra puerta —el boton flotante de Studio, que usa `bz-panel`—
 * abria bien, que es lo que lo dejo aislado aqui.
 *
 * UNA PAGINA PROPIA QUE SE ABRE DESDE EL MENU TAPA LO QUE HABIA. Llevar el
 * scroll hasta ella en vez de esto se descarto: dejaria el asistente con Studio
 * entero por encima, que no es una pagina propia, es la misma pantalla con algo
 * pegado abajo.
 *
 * LO VIGILA `scripts/arnes-pagina-propia-visible.js`, Y NO LEYENDO ESTA HOJA:
 * mide el rectangulo con un navegador, a 1280 y a 375. Un aserto que buscara
 * `position:fixed` en el fichero habria dado verde sobre el fallo las tres
 * semanas que vivio, porque la declaracion ESTABA, dentro de un `@media` que en
 * escritorio no entra. */
#bz-raiz.bz-pagina.bz-visible{position:fixed;inset:0;z-index:900;
  overflow-y:auto;-webkit-overflow-scrolling:touch}

/* La agarradera solo la lleva la hoja: en el panel y en la pagina no se
 * arrastra nada, y dibujarla prometeria un gesto que no existe. */
#bz-raiz:not(.bz-hoja) .grab{display:none}

/* El marco se mueve como el teclado del telefono. */
#bz-raiz .bz-marco{padding-bottom:env(safe-area-inset-bottom)}

#bz-raiz button{font-family:inherit;border:none;background:none;color:inherit;cursor:pointer}
#bz-raiz svg.i{width:20px;height:20px;fill:none;stroke:var(--teal);stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
#bz-raiz svg.i.s{width:16px;height:16px}
/* 40 Y NO 24 ABAJO · 5 oct 2026. Carolina en el iPhone: «90 minutos de voz en
   vivo te quedan este mes» quedaba cortado detras del compositor. Esa frase es
   lo ULTIMO del scroll de la portada, y con 24 px el ultimo renglon llegaba al
   borde justo donde empieza el compositor —que es translucido y con
   `backdrop-filter`, asi que lo que hay debajo se adivina y no se lee.

   SE ARREGLA EN `.scroll` Y NO EN ESA FRASE, a proposito: el que quede pegado
   al compositor es el ULTIMO elemento de cualquier pantalla, no esa linea en
   particular. Arreglarlo en la frase dejaria a la siguiente pantalla con el
   mismo borde. */
/* ── EL REBOTE DE SAFARI SE ROBA EL GESTO · 5 oct 2026 ──────────────────
 *
 * Criterio de Carolina. Al llegar al final de la lista, Safari de iOS pasa el
 * gesto al ancestro y empieza a estirar la PAGINA: el dedo sigue bajando, la
 * hoja ya no se mueve y el tirador deja de responder a mitad del gesto.
 *
 * `overscroll-behavior:contain` lo corta donde nace, que es esta zona de
 * scroll. `overflow:hidden` en el fondo NO lo arregla: el rebote es del
 * elemento que llega a su tope, no del documento.
 *
 * Y `-webkit-overflow-scrolling:touch` para que el scroll de dentro siga
 * siendo el de iOS: sin el, la lista se mueve a tirones. */
#bz-raiz .scroll{flex:1;overflow-y:auto;padding-bottom:40px;
  overscroll-behavior:contain;-webkit-overflow-scrolling:touch}

/* EL VELO NO SE ARRASTRA. Sin esto, un dedo sobre la parte oscura estira la
 * pagina de debajo, que es el mismo rebote con otra superficie. */
#bz-raiz .bz-scrim{touch-action:none}

/* EL FONDO QUIETO MIENTRAS LA HOJA ESTA ABIERTA. La clase la pone `bzAbrir` y
 * la quita `bzCerrar`, y SOLO para la hoja y el panel: la pagina propia ES el
 * documento en la computadora. En el telefono `index.html` ya deja `html` y
 * `body` en `overflow:hidden`, asi que esto es el caso de la computadora. */
html.bz-sin-scroll, html.bz-sin-scroll body{overflow:hidden;overscroll-behavior:none}
#bz-raiz .scroll::-webkit-scrollbar{display:none}
#bz-raiz .nav{height:44px;display:flex;align-items:center;padding:0 8px;position:relative;flex-shrink:0}
#bz-raiz .nav .back{display:flex;align-items:center;gap:2px;color:var(--teal);font-size:17px;min-height:44px;padding:0 8px}
#bz-raiz .nav .mid{position:absolute;left:50%;transform:translateX(-50%);font-size:17px;font-weight:600;white-space:nowrap}
#bz-raiz .nav .right{margin-left:auto;min-width:44px;min-height:44px;display:flex;align-items:center;justify-content:center;color:var(--teal);font-size:17px}
#bz-raiz .large{font-size:32px;font-weight:700;letter-spacing:-.02em;padding:4px 20px 2px;line-height:1.15}
#bz-raiz .sub{font-size:15px;color:var(--muted);padding:2px 20px 0}
#bz-raiz .word{font-family:Georgia,serif;font-weight:700}
#bz-raiz .word em{color:var(--amber);font-style:italic}
#bz-raiz .sec{font-size:13px;letter-spacing:.02em;text-transform:uppercase;color:var(--muted);padding:22px 36px 7px;display:flex;justify-content:space-between}
#bz-raiz .sec a{text-transform:none;letter-spacing:0;color:var(--teal);text-decoration:none;font-size:15px}
#bz-raiz .grp{margin:0 16px;background:var(--cell);border-radius:12px;overflow:hidden}
#bz-raiz .cell{display:flex;align-items:center;gap:14px;min-height:56px;padding:10px 14px 10px 16px;position:relative;width:100%;text-align:left}
#bz-raiz .cell + .cell::before{content:"";position:absolute;top:0;left:50px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .cell.noic + .cell.noic::before{left:16px}
#bz-raiz .cell .tx{flex:1;min-width:0}
#bz-raiz .cell .t{font-size:16px;font-weight:600;line-height:1.3;display:block}
#bz-raiz .cell .d{font-size:13px;color:var(--muted);line-height:1.35;display:block;margin-top:1px}
#bz-raiz .chev{width:8px;height:13px;flex-shrink:0;stroke:#B9BCB1;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
#bz-raiz .foot{font-size:13px;color:var(--muted);padding:8px 36px 0;line-height:1.4}
#bz-raiz .composer{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:8px 12px 30px;background:rgba(242,242,241,.92);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-top:.5px solid var(--hair)}
#bz-raiz .field{flex:1;height:40px;border-radius:20px;background:var(--cell);border:.5px solid var(--hair);display:flex;align-items:center;padding:0 14px;font-size:16px;color:#9a9f96}
#bz-raiz .mic{width:44px;height:44px;border-radius:22px;background:var(--teal);display:flex;align-items:center;justify-content:center;flex-shrink:0}
#bz-raiz .mic svg{stroke:var(--cream)}

/* ── LA BARRA DE DICTADO · punto 4 del 5 oct 2026 ──────────────────────────
 *
 * La caja se convierte en barra al tocar el microfono: onda a la izquierda,
 * el texto en vivo en medio, ✕ y ■ a la derecha, y el ↑ ambar fuera, donde
 * estaba el boton de ondas.
 *
 * LA ALTURA SUBE DE 40 A 44 px. Son dos botones de 32 px dentro, y a 40 el
 * dedo cae sobre el borde de la caja: el suelo de un control es 44.
 *
 * Y EL ↑ ES EL UNICO AMBAR DE LA FILA, que es la regla del sistema de diseno
 * —«amber: CTAs only»— y la razon de que las dos salidas de dentro no lo
 * lleven: tres ambares compitiendo no dicen cual manda.
 */
#bz-raiz .field.dictando{height:44px;padding:0 6px 0 12px;gap:8px;color:var(--dark)}
#bz-raiz .dwave{display:flex;align-items:center;gap:3px;height:20px;flex-shrink:0}
#bz-raiz .dwave i{display:block;width:3px;height:18px;border-radius:2px;background:var(--teal);transform:scaleY(.25);transform-origin:center;transition:transform 60ms linear;animation:bz-dlatido 1s ease-in-out infinite}
#bz-raiz .dwave i:nth-child(2){animation-delay:.12s}
#bz-raiz .dwave i:nth-child(3){animation-delay:.24s}
#bz-raiz .dwave i:nth-child(4){animation-delay:.36s}
#bz-raiz .dwave i:nth-child(5){animation-delay:.48s}
/* CON MEDIDOR, LA ANIMACION SE APAGA. Dos cosas moviendo el mismo `transform`
 * se pisan, y la que tiene que ganar es la voz. Lo pone `bzDictarNivel`. */
#bz-raiz .dwave[data-bz-medido="1"] i{animation:none}
@keyframes bz-dlatido{0%,100%{transform:scaleY(.25)}50%{transform:scaleY(.8)}}
/* LA COLA DEL TEXTO ES LO QUE SE VE, y la trae `bzDictarTexto` con
 * `scrollLeft`. El truco de `direction:rtl` tambien ensena el final, y se
 * descarto: reordena los signos de puntuacion del final de la frase. */
#bz-raiz .dtexto{flex:1;min-width:0;font-size:16px;color:var(--dark);line-height:1.2;white-space:nowrap;overflow:hidden}
#bz-raiz .dbtn{width:32px;height:32px;border-radius:16px;background:var(--cell);display:flex;align-items:center;justify-content:center;flex-shrink:0}
#bz-raiz .dbtn svg{stroke:var(--teal);width:18px;height:18px}
#bz-raiz .mic.enviar{background:var(--amber)}
#bz-raiz .mic.enviar svg{stroke:var(--dark)}
#bz-raiz .btn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;min-height:50px;border-radius:14px;background:var(--amber);color:var(--dark);font-size:17px;font-weight:600}
#bz-raiz .btn small{font-size:13px;font-weight:500;opacity:.7}
#bz-raiz .btn2{display:flex;align-items:center;justify-content:center;min-height:44px;padding:0 14px;border-radius:12px;color:var(--teal);font-size:15px;font-weight:600}
#bz-raiz .dock{flex-shrink:0;padding:10px 16px 30px;background:rgba(242,242,241,.92);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-top:.5px solid var(--hair)}
#bz-raiz .tools{display:flex;justify-content:space-around;margin-top:6px}
#bz-raiz .tool{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:64px;min-height:44px;font-size:11px;color:var(--teal);font-weight:500;padding-top:4px}
#bz-raiz .lbl{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--warm);font-weight:600}
#bz-raiz .pill{display:inline-block;font-size:12px;font-weight:600;color:var(--teal);background:rgba(9,77,95,.08);border-radius:6px;padding:2px 7px}
/* ── LAS LISTAS SON VERTICALES · 4 oct 2026 ─────────────────────────────
   Decision de Carolina: se baja, nunca se va de lado. `.hs` era un carril
   horizontal con `scroll-snap` y tarjetas de 272 px fijos, asi que en un
   telefono la tercera idea no existia hasta que ella la buscaba de lado.
   Un carril esconde su contenido y no dice cuanto hay.
   SE CONSERVA EL NOMBRE `.hs` a proposito: lo usan tres pantallas y el
   renombre no cambia nada en pantalla, solo obliga a tocar tres sitios mas.
   Lo que cambia es la direccion. */
#bz-raiz .hs{display:flex;flex-direction:column;gap:12px;padding:0 16px}
#bz-raiz .icard{width:auto;background:var(--cell);border-radius:16px;padding:16px;display:flex;flex-direction:column;gap:8px}
#bz-raiz .icard h4{font-size:17px;font-weight:600;line-height:1.3}
#bz-raiz .icard p{font-size:15px;color:var(--muted);line-height:1.4}
#bz-raiz .icard .act{display:flex;align-items:center;justify-content:space-between;margin-top:4px}
#bz-raiz .mini{min-height:44px;padding:0 16px;border-radius:22px;background:var(--amber);font-size:15px;font-weight:600;color:var(--dark)}
#bz-raiz .u{font-size:13px;color:var(--muted)}
#bz-raiz .askbar{margin:16px 16px 0;display:flex;align-items:center;gap:10px;min-height:48px;padding:0 6px 0 14px;border-radius:14px;background:var(--cell);font-size:16px;color:var(--muted)}
#bz-raiz .askbar .mic{width:36px;height:36px;border-radius:18px}
#bz-raiz .dim{opacity:.4}
#bz-raiz .gapnote{display:flex;gap:10px;align-items:flex-start;margin:12px 16px 0;font-size:14px;color:var(--dark);line-height:1.4}
#bz-raiz .gapnote b{font-weight:600}
#bz-raiz .scrim{position:absolute;inset:0;background:rgba(28,28,27,.35);z-index:3}
#bz-raiz .sheet{position:absolute;left:0;right:0;bottom:0;z-index:4;background:var(--cream);border-radius:14px 14px 0 0;padding:6px 0 34px;display:flex;flex-direction:column}
#bz-raiz .grab{width:36px;height:5px;border-radius:3px;background:#C7C9BE;margin:0 auto 6px}
#bz-raiz .seg{display:flex;margin:0 16px;background:rgba(118,118,128,.12);border-radius:9px;padding:2px}
#bz-raiz .seg span{flex:1;text-align:center;font-size:14px;font-weight:600;padding:7px 0;border-radius:7px;color:var(--dark)}
#bz-raiz .seg span.on{background:var(--cell);box-shadow:0 1px 3px rgba(28,28,27,.12)}
#bz-raiz .check{width:20px;height:20px;stroke:var(--teal);stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
#bz-raiz .meta{display:flex;gap:6px;flex-wrap:wrap;padding:8px 20px 0}
#bz-raiz .beat{padding:14px 16px;position:relative}
#bz-raiz .beat + .beat::before{content:"";position:absolute;top:0;left:16px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .beat .tm{font-size:12px;font-weight:600;color:var(--warm);letter-spacing:.02em}
#bz-raiz .beat .say{font-size:17px;line-height:1.45;margin:4px 0 8px}
#bz-raiz .beat .see{display:flex;gap:8px;font-size:13px;color:var(--muted);line-height:1.4}
#bz-raiz .beat .see svg{width:16px;height:16px;stroke:var(--muted);margin-top:1px}
#bz-raiz .beat .ons{display:inline-block;margin-top:8px;font-size:12px;font-weight:600;color:var(--dark);background:var(--amber);border-radius:6px;padding:2px 8px}
/* ── `min-height:0` ES LO QUE MANTIENE EL CONTROL EN PANTALLA · 3 oct 2026 ──
 *
 * `.tp` y `.live` son hijos flex de `.bz-marco`, que tiene `overflow:hidden`
 * y NO hace scroll. Sin `min-height:0`, el minimo automatico de un hijo flex
 * sale de su CONTENIDO, asi que un guion largo estira `.tp` muy por debajo
 * del marco y se lleva con el a Grabar, Pausa, Terminar y Borrar. No hay
 * scroll que los alcance: dejan de existir para la clienta.
 *
 * MEDIDO a 375x780 con un guion de 30 lineas: el boton de grabar quedaba en
 * y=5085 sobre un marco que acaba en 780, y `elementFromPoint` no lo
 * encontraba. Con esta sola declaracion vuelve a y=596, igual que con dos
 * lineas. Las otras dos candidatas no cambian nada y por eso no estan aqui:
 * `.tptext` ya tiene minimo cero por su `overflow:hidden`, y `.tpctl` no se
 * encoge porque su minimo si sale de su contenido.
 *
 * La voz tenia el mismo defecto: con seis mensajes de largo real, «Terminar»
 * caia en y=1336. */
/* ── EL VIDEO LLENA LA PANTALLA Y EL GUION VA ENCIMA · 5 oct 2026 ────────
   MOCKUP APROBADO (`docs/mockups/mockup-teleprompter-editor.html`), punto 2 de
   la segunda ronda: «El video llena la pantalla. El guion va arriba, sobre una
   franja transparente con degradado, y el texto lleva sombra suave. La linea
   actual va en ambar.»

   ESTO REVIERTE LA MAQUETA DEL 4 OCT 2026, que ponia el guion en una franja
   OPACA arriba y el video en su propia caja debajo. Aquella decision nacio de
   «nunca texto blanco sobre la imagen», y lo que la sustituye no es un
   descuido: es el degradado mas la SOMBRA del texto, que son las dos cosas que
   hacen legible una letra sobre cualquier fondo. El video a media pantalla era
   lo que se leia como «graba cuadrado».

   LA CAPA LA DECIDE UNA REGLA DERIVADA, no una clase por hijo: el video es el
   FONDO y todo lo demas flota encima, asi que el hijo que alguien anada manana
   entra solo. La excepcion es al reves que antes —antes se excluia el video,
   ahora se le baja a proposito— y necesita MAS especificidad que la general:
   `.tp > .tpvid` lleva dos clases contra una. */
#bz-raiz .tp{background:var(--dark);color:var(--cream);min-height:0;position:relative;overflow:hidden}
#bz-raiz .tp > *{position:relative;z-index:2}
/* LA CAJA DEL VIDEO ES 9:16, NO LA PANTALLA · decision de Carolina, 5 oct 2026
   despues de grabar en el iPhone: «muestra el video en una caja 9:16 con
   object-fit: cover, el mismo encuadre que tendra el reel».

   POR QUE NO `inset:0`: una pantalla de telefono es mas alta que 9:16 —375x812
   es 9:19,5— asi que a pantalla completa ella encuadra contra una ventana que
   el reel no tiene. La union recorta a 9:16, y la previa tiene que recortar
   igual o lo que aprueba no es lo que sale.

   DIVERGE DEL MOCKUP APROBADO A PROPOSITO, y hay que saberlo antes de
   «arreglarlo» de vuelta: el mockup del 5 oct pone el video a pantalla
   completa, y esta instruccion es posterior y la sustituye. Lo que se conserva
   entero es que el video sigue siendo el FONDO —`z-index:0`— con el guion
   flotando encima.

   EL ANCHO MANDA Y LA ALTURA SALE DE EL. Con `width:100%` + `aspect-ratio` la
   caja mide 375x667 en un telefono y sobra altura; en el panel de escritorio,
   que es mas bajo, se sale y el `overflow:hidden` del padre la recorta por
   arriba y por abajo, dejando el centro — que es lo que el reel conserva.
   Fijar la altura en su lugar daria el caso contrario y en el telefono, que es
   donde se graba, dejaria franjas a los lados. */
#bz-raiz .tp > .tpvid{position:absolute;top:50%;left:0;right:0;margin:0 auto;
  transform:translateY(-50%);width:100%;aspect-ratio:9/16;
  z-index:0;background:#000;overflow:hidden}
/* LA BARRA DE VUELTA FLOTA SOBRE EL VIDEO, como en el mockup: en flujo le
   robaria al video la unica franja donde se ve la cara. */
#bz-raiz .tp > .nav{position:absolute;top:0;left:0;right:0;z-index:4}
#bz-raiz .tp .sicons i, #bz-raiz .live .sicons i{border-color:var(--cream)}
#bz-raiz .tp .home, #bz-raiz .live .home{background:var(--cream)}
/* ── LA FRANJA DEL GUION ──────────────────────────────────────────────────
   EL DEGRADADO SE DESVANECE HACIA ABAJO y no es decoracion: en su tramo opaco
   la letra se lee, y donde el guion se acaba la imagen se ve limpia. El 36 %
   es el del mockup; en `vh` se saldria del marco cuando el modulo vive en
   panel o en pagina, donde `.tp` no mide la pantalla.

   `pointer-events:none` EN LA FRANJA Y `auto` EN EL TEXTO: la franja cubre el
   tercio superior del video, y con eventos se comeria cualquier toque de ahi.
   El pellizco vive en `.tptext`, que es quien lo necesita. */
#bz-raiz .tpfranja{position:absolute;top:0;left:0;right:0;height:36%;z-index:3;
  padding:56px 22px 14px;overflow:hidden;pointer-events:none;
  background:linear-gradient(rgba(28,28,27,.55),rgba(28,28,27,.38) 80%,rgba(28,28,27,0))}
/* `position:relative` NO ES DECORACION: `p.offsetTop` —lo que decide cual es la
   frase activa— sale relativo al ANCESTRO POSICIONADO mas cercano. Sin esto,
   ese ancestro pasa a ser `.tpfranja` y el `offsetTop` arrastra sus 56 px de
   relleno: la frase activa quedaba 60 px por encima de la banda legible, y el
   aserto que lo caza es el del navegador. Antes lo ponia la regla de las capas,
   porque `.tptext` era hijo directo de `.tp`; ahora vive dentro de la franja y
   hay que decirlo aqui. */
/* `touch-action:pan-y` EN EL GUION: un dedo sigue arrastrando para leer y el
 * navegador deja de reclamar el pellizco. NO BASTA SOLO: en Safari de iOS el
 * zoom de la pagina lo para `preventDefault()` sobre `gesturestart`, que vive
 * en `bzTpGestoEmpieza`. Las dos mitades, o el encuadre de la camara se va. */
/* ── `touch-action:none` Y `overscroll-behavior:contain` · 7 oct 2026 ───
   Instruccion de Carolina, con el arrastre del guion: era `touch-action:pan-y`,
   que es lo que se escribe cuando el navegador hace el scroll. Aqui NO lo hace:
   el guion se mueve con `transform` desde `bzTpCuadro` y desde el dedo, y
   `pan-y` le deja al navegador reclamar el gesto vertical — en Safari de iOS eso
   es el rebote de la pagina robandose el arrastre a mitad, que es el mismo
   defecto que `overscroll-behavior:contain` corta en las hojas.

   LAS DOS, porque son dos cosas: `none` impide que el navegador se lleve el
   gesto, y `contain` impide que el rebote lo pase al ancestro cuando ya no hay
   mas que desplazar. Y el pellizco sigue funcionando: lo paran los eventos
   `gesture*` de WebKit en `bzTpGestoEmpieza`, que no dependen de esto. */
#bz-raiz .tptext{position:relative;height:100%;overflow:hidden;pointer-events:auto;font-weight:600;
  -webkit-mask-image:linear-gradient(transparent,#000 10%,#000 78%,transparent);
  touch-action:none;overscroll-behavior:contain}
/* ── EL RODILLO: LO QUE SE DESPLAZA · 6 oct 2026 ───────────────────────
   `.tptext` esta RECORTADO y lleva la mascara; un `transform` sobre el moveria
   la caja entera, mascara incluida. El que se desliza es este hijo, con
   `transform: translateY` en subpixeles desde `bzTpPonerY`.

   `position:relative` PORQUE EL DESPLAZAMIENTO SE ACUMULA EN SUS COORDENADAS:
   `p.offsetTop` sale relativo a el, y es contra ese numero contra el que
   `bzTpLineaDeY` decide cual es la frase activa.

   `will-change:transform` lo sube a su propia capa: sin el, Safari de iOS
   repinta el texto con su sombra en cada cuadro y el desplazamiento continuo
   —que son 60 cuadros por segundo, no uno cada tres segundos— se entrecorta. */
#bz-raiz .tptext .tproll{position:relative;will-change:transform}
/* LA SOMBRA ES LO QUE SUSTITUYE A LA FRANJA OPACA. Sin ella, una linea del
   guion sobre una ventana o una pared blanca desaparece. */
/* LAS DOS CIFRAS DE ESTA REGLA LAS LEE EL RITMO DEL TELEPROMPTER:
   `BZ_TP_LINEA_ALTO` es este `line-height` y `BZ_TP_LINEA_SEP` este
   `margin-bottom`. Quien las cambie aqui las cambia alli, o «una linea cada
   tres segundos» deja de ser cierto sin que nada falle. */
#bz-raiz .tptext p{margin-bottom:14px;line-height:1.3;color:rgba(242,242,241,.7);
  text-shadow:0 1px 6px rgba(0,0,0,.55)}
/* ── Y LA FRASE ACTUAL EN AMBAR, QUE NUNCA SE PINTO ────────────────────
   La regla era `.tptext p.now span span{color:var(--amber)}` y exigia DOS
   spans anidados que `bzTeleprompterHtml` no emite: pinta `<p class="now">`
   con el texto pelado. Asi que el ambar no se aplicaba nunca. */
#bz-raiz .tptext p.now{color:var(--amber)}
/* EL CHIP DE LA ESCENA, DENTRO DE LA FRANJA. Es el `.chipe` del mockup: dice
   por donde va el guion sin gastar una linea de texto. */
#bz-raiz .tpescena{display:inline-block;margin-bottom:8px;font-size:13px;
  color:var(--cream);background:rgba(242,242,241,.14);border-radius:999px;padding:4px 10px}
/* ── LOS MANDOS, ABAJO Y SOBRE EL VIDEO ──────────────────────────────────
   Punto 3: antes de grabar se ven el cambio de camara, el boton rojo, «Tomas
   (N)», el tamano de letra y la velocidad. Mientras graba, SOLO el reloj con
   punto rojo, el boton y «Terminar»: la franja de ajustes no se pinta. */
#bz-raiz .tpmandos{position:absolute;left:0;right:0;bottom:0;z-index:3;
  padding:16px 18px 22px;background:linear-gradient(transparent,rgba(28,28,27,.75) 30%)}
#bz-raiz .tpfila{display:flex;align-items:center;justify-content:space-between}
#bz-raiz .tprec{width:72px;height:72px;border-radius:50%;border:4px solid var(--cream);
  display:flex;align-items:center;justify-content:center;flex-shrink:0;background:none}
#bz-raiz .tprec i{width:52px;height:52px;border-radius:50%;background:#E2564A;display:block}
/* EL CUADRADO ES LA SENAL DE QUE ESTA GRABANDO, y es el mismo boton: dos
   botones distintos dejarian el de parar donde el dedo buscaba el de grabar. */
#bz-raiz .tprec.on i{width:28px;height:28px;border-radius:6px}
#bz-raiz .tpico{width:44px;height:44px;border-radius:50%;flex-shrink:0;display:flex;
  align-items:center;justify-content:center;background:rgba(242,242,241,.14)}
#bz-raiz .tpico svg{stroke:var(--cream);width:22px;height:22px}
#bz-raiz .tptxtb{font-size:15px;font-weight:600;color:var(--cream);min-height:44px;
  min-width:44px;display:flex;align-items:center;justify-content:flex-end}
/* EL PUNTO ROJO DEL RELOJ. Es lo que distingue «grabando» de «listo» sin
   leer ningun texto, y vive en el reloj porque el reloj ya esta mirando. */
#bz-raiz .tp .nav .right.rec::before{content:"";display:inline-block;width:8px;height:8px;
  border-radius:50%;background:#E2564A;margin-right:6px}
/* ── LA FRANJA DE AJUSTES DEL TELEPROMPTER ─────────────────────────────
   La letra en pildora y la velocidad en barra continua, en una sola fila de
   375 px. `min-width:0` en la barra es lo que le permite encogerse: sin el,
   un `input[type=range]` reclama su ancho por defecto y empuja la pildora
   fuera de la pantalla. */
#bz-raiz .tpajustes{display:flex;align-items:center;gap:10px;margin-top:14px}
#bz-raiz .tpvel{flex:1;min-width:0;display:flex;align-items:center;gap:6px}
#bz-raiz .tpvel input[type=range]{flex:1;min-width:0;accent-color:var(--amber)}
/* 11 px ES EL SUELO DEL SISTEMA y estas dos etiquetas son eyebrow en
   mayusculas, que es el unico sitio donde ese suelo se usa. */
#bz-raiz .tpvel .lbl{font-size:11px;font-weight:700;text-transform:uppercase;
  letter-spacing:.04em;color:rgba(242,242,241,.7);flex-shrink:0}

/* ── LA MINIATURA DE UN TRAMO · punto 18 ───────────────────────────────
   «Las miniaturas de Revisa y corta salen vacías», y era literal: no habia
   ninguna. La fila ensenaba el numero del tramo en un chip y nada mas.

   ES UN `<video>` Y NO UNA IMAGEN: no existe ninguna portada de un tramo —el
   servidor no la genera— asi que la unica forma de ver un fotograma sin
   trabajo de servidor es cargar los metadatos del propio video. */
#bz-raiz .tramomini{width:44px;height:58px;border-radius:8px;flex-shrink:0;
  background:#E6E7DF;overflow:hidden;position:relative;display:flex;
  align-items:center;justify-content:center}
#bz-raiz .tramomini video{width:100%;height:100%;object-fit:cover;display:block;
  background:#1C1C1B;pointer-events:none}
/* EL NUMERO VA ENCIMA, no al lado: al lado gastaba el ancho que la frase
   necesita, y en 375 px la frase es lo que identifica el tramo. */
#bz-raiz .tramomini .num{position:absolute;left:0;bottom:0;right:0;
  background:rgba(28,28,27,.72);color:var(--cream);font-size:11px;font-weight:700;
  text-align:center;line-height:16px}
/* ── EL ICONO DE DESCARGA, SIN TEXTO · punto 19 ────────────────────────
   44 px para el dedo aunque el icono mida 18. */
#bz-raiz .tramobaja{width:44px;height:44px;flex-shrink:0;display:flex;
  align-items:center;justify-content:center;border-radius:10px;color:var(--teal)}
#bz-raiz .tramobaja svg{width:18px;height:18px;stroke:var(--teal)}
/* `.tpctl` Y `.play` SE RETIRARON CON LA FILA DE CONTROLES QUE PEDIAN · 5 oct
   2026. La pantalla de grabar es la del mockup aprobado: `.tpmandos` con su
   boton rojo. Una regla sin quien la pida es la que alguien lee manana y cree
   viva, y su arnes lo exige derivado de lo que el pintor emite. */
/* ── «REVISA Y CORTA», COMO FOTOS DE IPHONE · 5 oct 2026 ─────────────────
   MOCKUP APROBADO, puntos 4 a 8 de la segunda ronda. Lo que sustituye es una
   LISTA VERTICAL de tarjetas con dos deslizadores «Entrada» y «Salida» por
   tramo: para saber que habia dentro de un tramo habia que leer su frase, y
   para recortarlo habia que traducir dos numeros a un video que no se veia.

   Ahora: el video grande arriba, una tira de fotogramas abajo, y el recorte se
   hace arrastrando las orillas del tramo elegido. Son los mismos datos
   —`recorte_inicio` y `recorte_fin`— con un control que se mira en vez de
   leerse.

   `touch-action:none` EN LA TIRA, y no es opcional: sin el, Safari de iOS se
   lleva el arrastre al scroll de la pantalla y ni las orillas ni el
   reordenamiento responden. Va solo en la tira, nunca en el cuerpo: puesto
   arriba se come el scroll que la clienta si necesita. */
#bz-raiz .ed{background:var(--dark);color:var(--cream);min-height:0;display:flex;flex-direction:column}
#bz-raiz .ed .nav .back{color:var(--amber)}
#bz-raiz .ed .nav .mid{color:var(--cream)}
/* EL VISOR SE COME LA ALTURA QUE SOBRA. `min-height:0` es lo que se lo
   permite: sin el, el minimo automatico de un hijo flex sale de su contenido y
   el video empuja la tira y los botones fuera del marco, que es el defecto que
   `.tp` ya tuvo. */
#bz-raiz .edvisor{flex:1;min-height:0;position:relative;background:#000;overflow:hidden;
  display:flex;align-items:center;justify-content:center}
/* `cover` EN UNA CAJA 9:16, Y LA RAZON SE INVIRTIO · 5 oct 2026.

   AQUI DECIA «`contain` Y NO `cover`», con este porque: «este video es el que
   ella va a publicar, asi que recortarlo aqui le ensenaria un encuadre que el
   fichero no tiene». Era cierto mientras la union RELLENABA con negro: el
   fichero salia 9:16 con franjas y `contain` lo ensenaba tal cual.

   DEJO DE SER CIERTO HOY, por dos mitades: este visor reproduce
   `t.original_url` —la toma CRUDA, no la salida de la union— y la union ya no
   rellena, RECORTA al centro. Asi que `contain` sobre una toma 16:9 ensena
   justo el encuadre que el reel NO va a tener, que es lo que Carolina vio en
   el iPhone: «el visor muestra 16:9».

   La regla que sobrevive es la de siempre, y es la que manda: la previa ensena
   lo que se publica. Lo que cambio es cual de las dos opciones la cumple. */
#bz-raiz .edvisor video{width:100%;aspect-ratio:9/16;object-fit:cover;
  display:block;background:#000}
#bz-raiz .edplay{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:56px;height:56px;border-radius:50%;background:rgba(28,28,27,.55);
  display:flex;align-items:center;justify-content:center;z-index:3}
/* EL TRIANGULO DE PLAY VA RELLENO, y hay que decirlo: `svg.i` pone
   `fill:none` para los iconos de trazo del modulo, y con el este sale como un
   contorno. Es el unico icono del modulo que es una forma y no un trazo. */
#bz-raiz .edplay svg{stroke:var(--cream);fill:var(--cream);width:24px;height:24px}
/* EL TIEMPO EXACTO, SOBRE EL VIDEO Y CENTRADO. Con centesimas, porque es lo
   que permite decidir donde cortar: en segundos enteros, dos cortes distintos
   se leen igual. */
#bz-raiz .tpill{position:absolute;bottom:14px;left:50%;transform:translateX(-50%);
  font-size:15px;font-variant-numeric:tabular-nums;color:var(--cream);
  background:rgba(104,112,103,.85);border-radius:8px;padding:5px 10px;z-index:3}
#bz-raiz .edbaja{position:absolute;top:8px;right:8px;width:44px;height:44px;
  border-radius:50%;background:rgba(28,28,27,.45);display:flex;align-items:center;
  justify-content:center;z-index:3}
#bz-raiz .edbaja svg{stroke:var(--cream);width:20px;height:20px}
/* ── LA BARRA FINA DE UNA TOMA QUE SIGUE SUBIENDO · punto del mockup ─────
   «Si una toma sigue subiendo, se reintenta sola y solo se ve la barra fina
   arriba del visor, sin mensajes.» Un aviso por cada reintento en una
   grabacion de seis tramos son seis avisos sobre algo que se arregla solo. */
#bz-raiz .subiendo{position:absolute;left:0;right:0;top:0;z-index:4;height:3px;
  background:rgba(242,242,241,.18);overflow:hidden}
#bz-raiz .subiendo::before{content:"";display:block;height:100%;width:45%;
  background:var(--teal);animation:bzsub 1.3s ease-in-out infinite}
@keyframes bzsub{0%{margin-left:-45%}100%{margin-left:100%}}
#bz-raiz .tira{display:flex;align-items:stretch;height:58px;margin:14px 12px 0;
  position:relative;flex-shrink:0;touch-action:none}
#bz-raiz .tira .bplay{width:52px;flex-shrink:0;background:rgba(242,242,241,.18);
  border-radius:8px 0 0 8px;display:flex;align-items:center;justify-content:center}
#bz-raiz .tira .bplay svg{stroke:var(--cream);fill:var(--cream);width:22px;height:22px}
#bz-raiz .tira .seg{display:flex;position:relative;margin-right:3px;min-width:20px;
  border-top:3px solid transparent;border-bottom:3px solid transparent;overflow:hidden}
#bz-raiz .tira .seg video{width:100%;height:100%;object-fit:cover;display:block;
  pointer-events:none;background:#1C1C1B}
/* EL TRAMO ELEGIDO: borde ambar y sus dos orillas. `overflow:visible` es lo
   que deja ver las orillas, que viven FUERA de la caja; y los dos margenes son
   el hueco que ocupan. Sin ellos la orilla izquierda tapa al tramo vecino. */
#bz-raiz .tira .seg.sel{border-color:var(--amber);overflow:visible;
  margin-left:16px;margin-right:19px}
/* ── LAS ORILLAS SON ELEMENTOS, NUNCA `::before` ─────────────────────────
   El mockup las dibuja con pseudoelementos y asi no se pueden agarrar: un
   pseudoelemento no recibe eventos ni se puede encontrar desde JS. Un tirador
   dibujado donde no agarra es peor que no dibujar ninguno — es la leccion del
   recuadro del editor de imagenes, y es lo que una prueba que llama a la
   funcion en vez de buscar el control no ve. */
#bz-raiz .tira .seg .asa{position:absolute;top:-3px;bottom:-3px;width:16px;
  background:var(--amber);z-index:3;display:flex;align-items:center;justify-content:center}
#bz-raiz .tira .seg .asa::after{content:"";width:2px;height:18px;border-radius:1px;
  background:rgba(28,28,27,.45)}
#bz-raiz .tira .seg .asa.izq{left:-16px;border-radius:6px 0 0 6px}
#bz-raiz .tira .seg .asa.der{right:-16px;border-radius:0 6px 6px 0}
#bz-raiz .tira .seg .num{position:absolute;left:4px;top:3px;font-size:11px;
  color:var(--cream);background:rgba(28,28,27,.6);border-radius:5px;padding:0 5px;z-index:2}
/* ── LA DURACION ES LA SUYA, NUNCA «de 0:04» · punto 6 ───────────────────
   La fila anterior decia «0:03 de 0:04»: el segundo numero es la duracion sin
   recortar, que no es ningun dato que ella necesite, y leido rapido parece que
   el tramo dura cuatro. */
#bz-raiz .tira .seg .dur{position:absolute;right:4px;bottom:3px;font-size:11px;
  color:var(--cream);font-weight:600;text-shadow:0 1px 3px rgba(0,0,0,.7);z-index:2}
/* MIENTRAS SE MUEVE, EL TRAMO SE LEVANTA. Es la unica senal de que el gesto
   de mantener presionado agarro: sin ella se arrastra a ciegas. */
#bz-raiz .tira .seg.mov{opacity:.72;z-index:5;box-shadow:0 6px 18px rgba(0,0,0,.45)}
#bz-raiz .tira .pc{position:absolute;top:-12px;bottom:-6px;width:2px;
  background:var(--cream);z-index:4;pointer-events:none}
#bz-raiz .ed .herr{display:flex;justify-content:center;gap:8px;margin:18px 12px 0;flex-shrink:0}
#bz-raiz .ed .herr button{font-size:15px;font-weight:600;min-height:44px;padding:0 13px;
  white-space:nowrap;border-radius:999px;background:rgba(242,242,241,.12);
  color:var(--cream);display:flex;align-items:center;gap:8px}
#bz-raiz .ed .herr button.borrar{color:var(--warm)}
#bz-raiz .ed .herr button[disabled]{opacity:.4}
#bz-raiz .ed .herr svg{stroke:currentColor;width:18px;height:18px}
#bz-raiz .ed .pista{font-size:13px;color:rgba(242,242,241,.6);text-align:center;
  margin:10px 16px 0;line-height:1.4}
#bz-raiz .ed .pie{margin-top:auto;padding:14px 16px 20px;flex-shrink:0}
/* EL AVISO DE QUE NO SE PUDO JUNTAR. Borde calido y no rojo: las tomas siguen
   ahi, asi que esto no es una perdida, es un reintento. */
#bz-raiz .ed .edaviso{margin:16px 16px 0;padding:12px 14px;border-radius:12px;
  background:rgba(242,242,241,.08);border:1px solid var(--warm);font-size:15px;
  line-height:1.45;color:var(--cream)}
#bz-raiz .ed .edaviso small{display:block;font-size:11px;font-weight:700;
  color:rgba(242,242,241,.6);letter-spacing:.04em;text-transform:uppercase;margin-bottom:4px}
#bz-raiz .ed .empty h3{color:var(--cream)}
#bz-raiz .ed .empty p{color:rgba(242,242,241,.65)}
#bz-raiz .ed .sello{width:64px;height:64px;border-radius:50%;background:rgba(242,242,241,.1);
  display:flex;align-items:center;justify-content:center;margin:0 auto}
#bz-raiz .ed .sello svg{stroke:var(--cream);width:26px;height:26px}
/* ── LA ESPERA DE «SIGUIENTE» LLEVA EL ARBOL, NO UNA BARRA · 6 oct 2026 ──
   `.barrac` —la barra indeterminada que habia aqui— se retira con su unico
   llamador: una regla sin quien la use es la otra mitad del «escritor sin
   lector» que este repositorio persigue. Y prometia un avance que nadie
   calculaba: ni la union ni la pieza saben cuanto falta.

   EL ARBOL ES EL DE LA PANTALLA DE VOZ, el mismo `.orb`, porque es la misma
   pregunta —«estoy trabajando y no se cuanto falta»— y dos dibujos para eso
   obligan a aprender dos. Aqui va mas pequeno: esta pantalla lleva barra de
   navegacion encima y los 150 px de la voz dejan el titulo fuera a 375 px. */
#bz-raiz .ed.bzesp .orb{width:118px;height:118px;margin:0 auto 10px}
#bz-raiz .ed.bzesp .orb svg{width:34px;height:34px;stroke:var(--cream)}
#bz-raiz .live{background:var(--teal);color:var(--cream);min-height:0}
#bz-raiz .orb{width:150px;height:150px;border-radius:50%;margin:40px auto 22px;display:flex;align-items:center;justify-content:center;background:rgba(242,242,241,.08);box-shadow:0 0 0 18px rgba(242,242,241,.05),0 0 0 40px rgba(242,242,241,.03);animation:br 3s ease-in-out infinite}
@keyframes br{50%{transform:scale(1.05)}}
#bz-raiz .orb svg{width:52px;height:60px}
/* 24 px A LOS LADOS. El estado de arriba es la frase LARGA de la pantalla —la
   que explica por que no hay voz— y era la unica sin margen lateral: a 375 px
   tocaba los dos bordes. `.trans` ya los tenia. */
#bz-raiz .state{text-align:center;font-size:15px;opacity:.75;padding:0 24px;line-height:1.4}
/* EL SUBTITULO: LA ULTIMA FRASE DE BLOOMZY, DOS LINEAS COMO MAXIMO.
   `-webkit-line-clamp` con `-webkit-box` es lo unico que corta por LINEAS en
   Safari; un `max-height` cortaria una letra por la mitad. Y 13px es el suelo
   de texto legible del sistema de diseno, no menos.
   `.orb` ES UN BOTON desde el 6 oct 2026 —se toca para cancelar— asi que
   hereda `background` y `border` del reset y hay que devolverle los suyos; y
   deshabilitado NO se atenua, porque el arbol que respira es la pantalla
   entera y atenuarlo diria que algo va mal. */
#bz-raiz .sublive{text-align:center;font-size:13px;opacity:.85;padding:0 24px 2px;
  line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden}
#bz-raiz button.orb{border:0;padding:0;appearance:none;-webkit-appearance:none;
  background:rgba(242,242,241,.08);cursor:pointer}
#bz-raiz button.orb:disabled{opacity:1;cursor:default}
#bz-raiz .trans{flex:1;padding:24px 24px 0;display:flex;flex-direction:column;gap:14px;overflow:hidden}
#bz-raiz .trans .who{font-size:12px;letter-spacing:.06em;text-transform:uppercase;opacity:.6;margin-bottom:2px}
#bz-raiz .trans p{font-size:17px;line-height:1.45}
#bz-raiz .trans .me p{opacity:.75}
#bz-raiz .livectl{display:flex;justify-content:center;gap:40px;padding:12px 0 44px}
#bz-raiz .livectl button{width:60px;height:60px;border-radius:30px;background:rgba(242,242,241,.14);display:flex;align-items:center;justify-content:center}
#bz-raiz .livectl button svg{stroke:var(--cream)}
#bz-raiz .livectl button.end{background:var(--cream)}
#bz-raiz .livectl button.end svg{stroke:var(--dark)}
#bz-raiz .livectl small{display:block;text-align:center;font-size:12px;margin-top:6px;opacity:.75}
#bz-raiz .chat{padding:8px 12px;display:flex;flex-direction:column;gap:6px}
#bz-raiz .b-me{align-self:flex-end;max-width:78%;background:var(--teal);color:var(--cream);font-size:16px;line-height:1.4;padding:8px 13px;border-radius:18px 18px 4px 18px;margin-top:8px}
#bz-raiz .b-bz{align-self:flex-start;max-width:86%;background:var(--cell);font-size:16px;line-height:1.4;padding:9px 13px;border-radius:18px 18px 18px 4px}
#bz-raiz .b-act{align-self:flex-start;width:86%;background:var(--cell);border-radius:12px;overflow:hidden}
#bz-raiz .b-act .cell{min-height:44px;color:var(--teal);font-size:16px;font-weight:500}
#bz-raiz .empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:0 36px;gap:10px}
#bz-raiz .empty h3{font-size:22px;font-weight:700;line-height:1.25}
#bz-raiz .empty p{font-size:15px;color:var(--muted);line-height:1.45}
#bz-raiz .empty .btn{margin-top:12px}
#bz-raiz .sk{height:12px;border-radius:6px;background:linear-gradient(90deg,#ECEDE6,#F7F7F3,#ECEDE6);background-size:200% 100%;animation:sh 1.4s infinite}
@keyframes sh{to{background-position:-200% 0}}
/* EL GIRO DE UNA FILA EN VUELO. Ocupa el hueco del chevron —18px, el mismo que
   `.chev`— para que la fila no cambie de alto al tocarla: un salto de maqueta
   se lee como que la lista se recargo. */
#bz-raiz .bz-giro{width:18px;height:18px;flex-shrink:0;border-radius:50%;border:2px solid rgba(9,77,95,.18);border-top-color:var(--teal);animation:bzg .7s linear infinite}
@keyframes bzg{to{transform:rotate(360deg)}}
#bz-raiz .cell.bz-pidiendo{background:var(--cell)}
#bz-raiz .cell[disabled]{cursor:default}
#bz-raiz .banner{margin:12px 16px 0;background:var(--cell);border-radius:12px;padding:12px 14px;font-size:14px;line-height:1.4;display:flex;gap:10px}
#bz-raiz .side{width:232px;background:var(--teal);color:var(--cream);padding:22px 12px;flex-shrink:0}
#bz-raiz .side .lg{display:flex;align-items:center;gap:10px;padding:0 8px;margin-bottom:26px;font-size:20px}
#bz-raiz .mark{width:32px;height:32px;border-radius:9px;background:var(--teal);border:1px solid rgba(242,242,241,.3);display:flex;align-items:center;justify-content:center}
#bz-raiz .side a{display:flex;align-items:center;gap:10px;min-height:42px;padding:0 10px;border-radius:9px;font-size:15px;color:var(--cream);text-decoration:none;opacity:.78}
#bz-raiz .side a.on{background:rgba(242,242,241,.12);opacity:1;font-weight:600}
#bz-raiz .side a svg{stroke:var(--cream)}
#bz-raiz .dmain{flex:1;display:flex;flex-direction:column;overflow:hidden}
#bz-raiz .dcol{width:680px;margin:0 auto;flex:1;overflow:hidden;padding-top:28px}
#bz-raiz .dcol .grp{margin:0}
#bz-raiz .dcol .sec{padding-left:20px;padding-right:20px}
#bz-raiz .dcomp{width:680px;margin:0 auto 22px;display:flex;gap:8px}
#bz-raiz /* v3: Studio con botón flotante */
.fab{position:absolute;right:16px;bottom:34px;z-index:6;display:flex;align-items:center;gap:8px;height:52px;padding:0 20px 0 16px;border-radius:26px;background:var(--teal);color:var(--cream);font-size:16px;font-weight:600;box-shadow:0 8px 20px rgba(9,77,95,.35)}
#bz-raiz .fab svg.i{stroke:var(--cream)}
#bz-raiz .vcards{display:flex;flex-direction:column;gap:12px;padding:0 16px}
#bz-raiz .vcard{background:var(--cell);border-radius:16px;padding:14px 16px;display:flex;flex-direction:column;gap:6px}
#bz-raiz .vcard h4{font-size:17px;font-weight:600;line-height:1.3}
#bz-raiz .vcard .hk{font-size:15px;color:var(--muted);line-height:1.4}
#bz-raiz .vcard .src2{font-size:13px;color:var(--teal)}
#bz-raiz .vcard .act{display:flex;align-items:center;gap:10px;margin-top:4px}
#bz-raiz .xbtn{width:44px;height:44px;margin-left:auto;display:flex;align-items:center;justify-content:center}
#bz-raiz .xbtn svg{stroke:#9a9f96}
#bz-raiz .sheet.tall{height:90%;padding-bottom:0}
#bz-raiz .dpanel{position:absolute;right:0;top:0;bottom:0;width:420px;z-index:4;background:var(--cream);border-left:.5px solid var(--hair);box-shadow:-12px 0 32px rgba(28,28,27,.12);display:flex;flex-direction:column}
#bz-raiz .dpanel .grp{margin:0 16px}
#bz-raiz .dfab{position:absolute;right:28px;bottom:28px}
#bz-raiz /* edición */
.beat.editing{background:rgba(255,189,89,.10)}
#bz-raiz .say[contenteditable]{outline:none;border-radius:8px;padding:6px 8px;margin:4px -8px 8px;background:var(--cell);box-shadow:0 0 0 1.5px var(--teal)}
#bz-raiz .caret{display:inline-block;width:2px;height:20px;background:var(--teal);vertical-align:-4px;animation:bl 1s steps(1) infinite}
@keyframes bl{50%{opacity:0}}
#bz-raiz .editbar{display:flex;gap:6px;margin-top:2px;flex-wrap:wrap}
#bz-raiz .editbar button{min-height:36px;padding:0 12px;border-radius:18px;font-size:14px;font-weight:600;background:rgba(9,77,95,.08);color:var(--teal);display:flex;align-items:center;gap:6px}
#bz-raiz .editbar button svg{width:15px;height:15px}
#bz-raiz .edited{font-size:11px;font-weight:600;color:var(--muted);margin-left:6px;text-transform:none;letter-spacing:0}
#bz-raiz .kb{flex-shrink:0;height:250px;background:#D1D3CB;padding:8px 4px 30px;display:flex;flex-direction:column;gap:10px}
#bz-raiz .kb .sug{display:flex;justify-content:space-around;font-size:15px;color:var(--dark);padding:4px 0 6px;border-bottom:.5px solid rgba(28,28,27,.12)}
#bz-raiz .kb .r{display:flex;justify-content:center;gap:6px}
#bz-raiz .kb .r i{display:block;width:31px;height:40px;border-radius:5px;background:var(--cell);box-shadow:0 1px 0 rgba(28,28,27,.25)}
#bz-raiz .kb .r i.w{width:180px}
#bz-raiz .kb .r i.m{width:44px;background:#B4B7AE}
#bz-raiz /* ===== v4 ===== */
.fab.small{width:56px;height:56px;padding:0;justify-content:center;border-radius:28px}
#bz-raiz .brandpill{display:inline-flex;align-items:center;gap:4px;font-size:15px;font-weight:600;color:var(--teal);background:rgba(9,77,95,.08);border-radius:999px;padding:6px 10px 6px 12px;min-height:44px}
#bz-raiz .brandpill svg{width:14px;height:14px;stroke:var(--teal)}
#bz-raiz .navrow{display:flex;align-items:center;justify-content:space-between;padding:4px 16px 0;min-height:44px}
#bz-raiz .morerow{display:flex;align-items:center;gap:10px;margin:10px 16px 0;padding:0 16px;min-height:48px;border-radius:12px;background:var(--cell);font-size:15px;font-weight:600;color:var(--teal)}
#bz-raiz .morerow .n2{margin-left:auto;font-weight:500;color:var(--muted);font-size:14px}
#bz-raiz .hide{font-size:15px;color:var(--teal);text-transform:none;letter-spacing:0}
#bz-raiz .prow{display:flex;align-items:center;gap:14px;min-height:68px;padding:10px 14px 10px 12px;position:relative;width:100%;text-align:left}
#bz-raiz .prow + .prow::before{content:"";position:absolute;top:0;left:76px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .thumb{width:48px;height:48px;border-radius:10px;flex-shrink:0;background:linear-gradient(135deg,#C58F74,#D5D6C9)}
#bz-raiz .thumb.t2{background:linear-gradient(135deg,#094D5F,#5F8C8A)}
#bz-raiz .thumb.novid{background:var(--cream);border:1.5px dashed var(--hair);display:flex;align-items:center;justify-content:center}
#bz-raiz .thumb.novid svg{stroke:var(--muted)}
#bz-raiz .prow .t{font-size:15px;font-weight:600;display:block;line-height:1.3}
#bz-raiz .prow .d{font-size:13px;color:var(--muted);display:block;margin-top:2px}
#bz-raiz .prow .warn{color:#8a5a3f;font-weight:600}
#bz-raiz .prow.hl{background:rgba(255,189,89,.16)}
#bz-raiz .upl{min-height:44px;padding:0 14px;border-radius:22px;background:var(--amber);font-size:14px;font-weight:600;color:var(--dark);flex-shrink:0}
#bz-raiz .toast{position:absolute;left:16px;right:16px;bottom:104px;z-index:7;background:var(--dark);color:var(--cream);border-radius:14px;padding:0 6px 0 16px;min-height:50px;display:flex;align-items:center;gap:10px;font-size:15px;box-shadow:0 10px 24px rgba(28,28,27,.25)}
#bz-raiz .toast button{margin-left:auto;min-height:44px;padding:0 12px;color:var(--amber);font-weight:600;font-size:15px}
#bz-raiz .hint{display:flex;gap:10px;align-items:center;margin:12px 16px 0;padding:10px 12px;border-radius:12px;background:rgba(255,189,89,.18);font-size:14px;line-height:1.35}
#bz-raiz .hint svg{stroke:var(--dark)}
#bz-raiz .pillb{display:inline-flex;align-items:center;gap:3px;font-size:14px;font-weight:600;color:var(--teal);background:rgba(9,77,95,.08);border-radius:8px;padding:5px 8px 5px 10px;min-height:44px}
#bz-raiz .pillb svg{width:13px;height:13px;stroke:var(--teal)}
#bz-raiz .composer2{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:8px 12px 30px;background:rgba(242,242,241,.92);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-top:.5px solid var(--hair)}
#bz-raiz .field2{flex:1;height:42px;border-radius:21px;background:var(--cell);border:.5px solid var(--hair);display:flex;align-items:center;padding:0 6px 0 14px;font-size:16px;color:#9a9f96}
#bz-raiz .field2 .dict{margin-left:auto;width:36px;height:36px;display:flex;align-items:center;justify-content:center}
#bz-raiz .field2 .dict svg{stroke:var(--muted)}
#bz-raiz .talk{width:44px;height:44px;border-radius:22px;background:var(--teal);display:flex;align-items:center;justify-content:center;flex-shrink:0}
#bz-raiz .talk svg{stroke:var(--cream)}
#bz-raiz .cost{font-size:13px;color:var(--muted);text-align:center;margin-top:6px}
#bz-raiz .linkbtn{display:block;width:100%;text-align:center;min-height:44px;font-size:16px;font-weight:600;color:var(--teal)}
#bz-raiz .badge1{font-size:11px;font-weight:600;color:var(--warm);letter-spacing:.06em;text-transform:uppercase;padding:0 20px}
#bz-raiz /* cámara */
.cam{flex:1;position:relative;background:radial-gradient(ellipse 70% 45% at 50% 58%,rgba(242,242,241,.16),transparent 70%),linear-gradient(180deg,#123c47 0%,#1C1C1B 85%);overflow:hidden}
#bz-raiz .cam .person{position:absolute;left:50%;bottom:0;transform:translateX(-50%);width:230px;height:330px;border-radius:115px 115px 0 0;background:rgba(242,242,241,.07)}
#bz-raiz .cam .head{position:absolute;left:50%;bottom:300px;transform:translateX(-50%);width:120px;height:140px;border-radius:50%;background:rgba(242,242,241,.08)}
#bz-raiz .prompt{position:absolute;top:8px;left:12px;right:12px;background:rgba(28,28,27,.55);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-radius:16px;padding:14px 16px;color:var(--cream);font-size:21px;line-height:1.4;font-weight:600}
#bz-raiz .prompt p{opacity:.4;margin:0}
#bz-raiz .prompt p.now{opacity:1}
#bz-raiz .prompt p.now b{color:var(--amber);font-weight:600}
#bz-raiz .camtop{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:0 14px;height:44px;color:var(--cream);font-size:15px}
#bz-raiz .rec-time{display:flex;align-items:center;gap:6px;font-weight:600;background:rgba(28,28,27,.5);border-radius:8px;padding:3px 8px;font-variant-numeric:tabular-nums}
#bz-raiz .rec-time i{display:block;width:8px;height:8px;border-radius:4px;background:var(--amber)}
#bz-raiz .camctl{flex-shrink:0;background:var(--dark);display:flex;align-items:center;justify-content:space-between;padding:18px 34px 40px}
#bz-raiz .camctl .side-b{width:52px;height:52px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;color:var(--cream);font-size:11px}
#bz-raiz .camctl .side-b svg{stroke:var(--cream);width:24px;height:24px}
#bz-raiz .recbtn{width:76px;height:76px;border-radius:38px;border:4px solid var(--cream);display:flex;align-items:center;justify-content:center}
#bz-raiz .recbtn i{display:block;width:30px;height:30px;border-radius:7px;background:var(--amber)}
#bz-raiz .recbtn.idle i{width:60px;height:60px;border-radius:30px}
#bz-raiz .dark{background:var(--dark);color:var(--cream)}
#bz-raiz .dark .sicons i{border-color:var(--cream)}
#bz-raiz .dark .home{background:var(--cream)}
#bz-raiz .review{flex:1;margin:4px 16px 0;border-radius:18px;overflow:hidden;position:relative;background:linear-gradient(180deg,#123c47,#1C1C1B)}
#bz-raiz .review .playc{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:64px;height:64px;border-radius:32px;background:rgba(242,242,241,.2);display:flex;align-items:center;justify-content:center}
#bz-raiz .review .playc svg{fill:var(--cream);stroke:none;width:26px;height:26px}
#bz-raiz .review .len{position:absolute;right:12px;bottom:12px;font-size:13px;font-weight:600;background:rgba(28,28,27,.55);border-radius:6px;padding:2px 7px}
#bz-raiz .revctl{padding:16px 16px 34px;display:flex;flex-direction:column;gap:8px}
#bz-raiz .btn-dark{display:flex;align-items:center;justify-content:center;width:100%;min-height:50px;border-radius:14px;background:rgba(242,242,241,.12);color:var(--cream);font-size:17px;font-weight:600}
#bz-raiz .edframe{margin:6px auto 0;width:200px;height:300px;border-radius:14px;position:relative;overflow:hidden;background:linear-gradient(180deg,#123c47,#1C1C1B)}
#bz-raiz .edframe .sub{position:absolute;left:10px;right:10px;bottom:28px;text-align:center;font-size:14px;font-weight:700;color:var(--cream);padding:0;line-height:1.3;text-shadow:0 1px 3px rgba(0,0,0,.6)}
#bz-raiz .edframe .sub b{color:var(--amber)}
#bz-raiz .existing-tag{display:block;text-align:center;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--warm);margin-top:4px}
#bz-raiz .switch{width:42px;height:26px;border-radius:13px;background:var(--teal);position:relative;flex-shrink:0}
#bz-raiz .switch::after{content:"";position:absolute;right:2px;top:2px;width:22px;height:22px;border-radius:11px;background:#fff}
#bz-raiz .hero{display:flex;gap:14px;align-items:center;margin:0 16px;padding:16px;border-radius:16px;background:var(--teal);color:var(--cream);min-height:84px;width:calc(100% - 32px);text-align:left}
#bz-raiz .hero.alt{background:var(--cell);color:var(--dark)}
#bz-raiz .hero svg.i{stroke:var(--cream);width:24px;height:24px}
#bz-raiz .hero.alt svg.i{stroke:var(--teal)}
#bz-raiz .hero .tt{font-size:17px;font-weight:600;display:block;line-height:1.3}
#bz-raiz .hero .dd{font-size:14px;opacity:.8;display:block;margin-top:2px;line-height:1.35}
#bz-raiz .hero .chev{stroke:rgba(242,242,241,.6)}
#bz-raiz .hero.alt .chev{stroke:#B9BCB1}
#bz-raiz .heros{display:flex;flex-direction:column;gap:10px;margin-top:14px}
#bz-raiz .mgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:3px;margin-top:8px}
#bz-raiz .mtile{aspect-ratio:1;position:relative}
#bz-raiz .mtile .ck{position:absolute;right:6px;top:6px;width:24px;height:24px;border-radius:12px;border:2px solid #fff;background:rgba(28,28,27,.15)}
#bz-raiz .mtile.sel .ck{background:var(--teal);display:flex;align-items:center;justify-content:center}
#bz-raiz .mtile.sel .ck::after{content:"";width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translate(1px,-1px)}
#bz-raiz .mtile.sel{box-shadow:inset 0 0 0 3px var(--teal)}
#bz-raiz .mtile .dur{position:absolute;left:6px;bottom:5px;font-size:11px;color:#fff;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}
#bz-raiz .g1{background:linear-gradient(135deg,#C58F74,#E8C9B5)}.g2{background:linear-gradient(135deg,#094D5F,#4F8A8B)}.g3{background:linear-gradient(135deg,#D5D6C9,#9FA88E)}.g4{background:linear-gradient(135deg,#E9B44C,#F6DDA4)}.g5{background:linear-gradient(135deg,#8B5E6E,#C9A2B0)}.g6{background:linear-gradient(135deg,#5F7A5A,#B8C7A6)}
#bz-raiz .dayh{font-size:13px;font-weight:600;color:var(--dark);padding:18px 36px 6px;display:flex;justify-content:space-between}
#bz-raiz .dayh span{color:var(--muted);font-weight:500}
#bz-raiz .pl{display:flex;align-items:center;gap:12px;min-height:72px;padding:10px 12px;position:relative}
#bz-raiz .pl + .pl::before{content:"";position:absolute;top:0;left:72px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .pl .thumb{width:48px;height:48px;border-radius:10px;flex-shrink:0}
#bz-raiz .pl .tx{flex:1;min-width:0}
/* EL RECUADRO DE DOS LINEAS SE RETIRA · 4 oct 2026. Decision de Carolina: el
   detalle de una idea ensena el guion COMPLETO. `-webkit-line-clamp:2` cortaba
   cada linea a dos renglones con puntos suspensivos, asi que un guion de cinco
   frases se leia como cinco frases a medias y habia que abrir cada una. */
#bz-raiz .pl .t{font-size:15px;line-height:1.35;display:block}
#bz-raiz .pl .d{font-size:12px;color:var(--muted);display:block;margin-top:2px}
#bz-raiz .tog{width:28px;height:28px;border-radius:14px;border:2px solid #C7C9BE;flex-shrink:0;margin:8px}
#bz-raiz .tog.on{background:var(--teal);border-color:var(--teal);position:relative}
#bz-raiz .tog.on::after{content:"";position:absolute;left:8px;top:7px;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg)}
#bz-raiz .togwrap{min-width:44px;min-height:44px;display:flex;align-items:center;justify-content:center}
#bz-raiz .gaprow{display:flex;align-items:center;gap:12px;margin:0 16px;padding:12px;border-radius:12px;border:1.5px dashed rgba(9,77,95,.25);font-size:14px;line-height:1.35}
#bz-raiz .gaprow .tx{flex:1}
#bz-raiz .gaprow .d{display:block;font-size:12px;color:var(--muted)}
#bz-raiz .ghost{min-height:44px;padding:0 14px;border-radius:22px;background:rgba(9,77,95,.08);color:var(--teal);font-size:14px;font-weight:600;flex-shrink:0}
#bz-raiz .scan{display:flex;flex-direction:column;gap:10px;margin:16px}
#bz-raiz .scan .ln{display:flex;align-items:center;gap:12px;font-size:14px}
#bz-raiz .scan .ln .thumb{width:40px;height:40px;border-radius:8px}
#bz-raiz .scan .ln span.ok{margin-left:auto;font-size:12px;color:var(--muted)}
#bz-raiz .scan .ln.dim{opacity:.4}
#bz-raiz .pbar{height:4px;border-radius:2px;background:var(--hair);margin:6px 20px 0;overflow:hidden}
#bz-raiz .pbar i{display:block;height:100%;width:62%;background:var(--teal);border-radius:2px}
#bz-raiz .why{margin:12px 16px 0;padding:12px 14px;border-radius:12px;background:rgba(9,77,95,.06);font-size:14px;line-height:1.4;display:flex;gap:10px}
#bz-raiz .netrow{display:flex;gap:6px;padding:12px 16px 0;flex-wrap:wrap}
#bz-raiz .net{min-height:36px;padding:0 12px;border-radius:18px;font-size:14px;font-weight:600;background:rgba(9,77,95,.08);color:var(--teal);display:flex;align-items:center}
#bz-raiz .net.on{background:var(--teal);color:var(--cream)}
#bz-raiz .bigimg{margin:8px 16px 0;height:240px;border-radius:14px}
#bz-raiz .slide{display:flex;gap:12px;align-items:flex-start;padding:12px;position:relative}
#bz-raiz .slide + .slide::before{content:"";position:absolute;top:0;left:12px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .slide .ph{width:56px;height:70px;border-radius:8px;flex-shrink:0;display:flex;align-items:flex-end;justify-content:center;font-size:11px;color:#fff;font-weight:600;padding-bottom:4px;text-shadow:0 1px 2px rgba(0,0,0,.4)}
#bz-raiz .slide .ph.none{background:var(--cream);border:1.5px dashed rgba(9,77,95,.25);color:var(--muted);text-shadow:none;align-items:center}
#bz-raiz .slide .role{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--warm)}
#bz-raiz .slide .txt{font-size:15px;line-height:1.4;margin-top:2px}
#bz-raiz .slide .sug{font-size:12px;color:var(--teal);margin-top:4px;display:block}
#bz-raiz .frame{width:56px;height:96px;border-radius:8px;flex-shrink:0}
#bz-raiz .vo{flex:1;display:flex;flex-direction:column;justify-content:center;padding:0 24px}
#bz-raiz .wavebars{display:flex;align-items:center;justify-content:center;gap:4px;height:80px;margin:20px 0}
#bz-raiz .wavebars i{display:block;width:4px;border-radius:2px;background:var(--amber)}
#bz-raiz .clipstrip{display:flex;gap:6px;justify-content:center;margin-top:8px}
#bz-raiz .clipstrip span{width:48px;height:64px;border-radius:6px}
#bz-raiz .clipstrip span.on{box-shadow:0 0 0 2px var(--amber)}
#bz-raiz .ostext{padding:12px;display:flex;gap:12px;position:relative;align-items:flex-start}
#bz-raiz .ostext + .ostext::before{content:"";position:absolute;top:0;left:12px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .ostext .clip{width:48px;height:72px;border-radius:8px;flex-shrink:0;position:relative}
#bz-raiz .ostext .clip b{position:absolute;left:4px;bottom:3px;font-size:11px;color:#fff;font-weight:600}
#bz-raiz .ostext .tx{flex:1}
#bz-raiz .ostext .d{font-size:12px;color:var(--muted)}
#bz-raiz .ostext .o{font-size:16px;font-weight:600;line-height:1.35;margin-top:2px}
#bz-raiz .stat{display:flex;gap:16px;padding:12px 16px 0}
#bz-raiz .stat div{flex:1;background:var(--cell);border-radius:12px;padding:10px 12px}
#bz-raiz .stat b{display:block;font-size:20px}
#bz-raiz .stat span{font-size:12px;color:var(--muted)}
#bz-raiz .icards{display:flex;flex-direction:column;gap:8px;align-self:stretch;margin:4px 0 0}
#bz-raiz .icards .ic2{background:var(--cell);border-radius:12px;padding:10px 12px;display:flex;align-items:center;gap:10px}
#bz-raiz .icards .ic2 .tx{flex:1;font-size:15px;line-height:1.35}
#bz-raiz .icards .ic2 .lbl{display:block}
#bz-raiz .make{min-height:36px;padding:0 12px;border-radius:18px;background:var(--amber);font-size:14px;font-weight:600;color:var(--dark);flex-shrink:0}
#bz-raiz .reason{align-self:flex-start;width:86%;background:var(--cell);border-radius:12px;overflow:hidden}
#bz-raiz .reason .cell{min-height:48px}
#bz-raiz .reason .k{font-size:12px;color:var(--muted);display:block}
#bz-raiz .reason .v{font-size:15px;display:block}
#bz-raiz .sent{align-self:center;font-size:12px;color:var(--muted);text-align:center;padding:6px 20px}
#bz-raiz .checkbox{width:24px;height:24px;border-radius:7px;border:2px solid #C7C9BE;flex-shrink:0}
#bz-raiz .checkbox.on{background:var(--teal);border-color:var(--teal);position:relative}
#bz-raiz .checkbox.on::after{content:"";position:absolute;left:6px;top:5px;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg)}
#bz-raiz .fmtrow{display:flex;align-items:center;gap:12px;min-height:60px;padding:10px 14px;position:relative}
#bz-raiz .fmtrow + .fmtrow::before{content:"";position:absolute;top:0;left:14px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .fmtrow .tx{flex:1}
#bz-raiz .fmtrow .t{font-size:15px;font-weight:600;display:block}
#bz-raiz .fmtrow .d{font-size:13px;color:var(--muted);display:block}
#bz-raiz .fmtrow .end{font-size:13px;font-weight:600;color:var(--teal);text-align:right}
#bz-raiz .fmtrow .end.warn2{color:#8a5a3f}
#bz-raiz .wk{display:flex;align-items:center;justify-content:space-between;padding:18px 36px 6px}
#bz-raiz .wk b{font-size:15px}
#bz-raiz .wk span{font-size:13px;color:var(--muted)}
#bz-raiz .wk a{font-size:14px;color:var(--teal) !important;text-decoration:none;font-weight:600}
#bz-raiz .trio{display:flex;gap:3px;flex-shrink:0}
#bz-raiz .trio span{width:15px;height:48px;border-radius:4px}
#bz-raiz .toggle-row{display:flex;align-items:center;gap:12px;min-height:56px;padding:10px 14px;position:relative}
#bz-raiz .toggle-row + .toggle-row::before{content:"";position:absolute;top:0;left:14px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .toggle-row .tx{flex:1}
#bz-raiz .toggle-row .t{font-size:15px;font-weight:600;display:block}
#bz-raiz .toggle-row .d{font-size:13px;color:var(--muted);display:block}
#bz-raiz .switch.off{background:#C7C9BE}
#bz-raiz .switch.off::after{right:auto;left:2px}
#bz-raiz .segs{position:absolute;top:50px;left:14px;right:14px;display:flex;gap:4px;z-index:2}
#bz-raiz .segs i{display:block;height:4px;border-radius:2px;background:var(--amber)}
#bz-raiz .segs i.rest{background:rgba(242,242,241,.25);flex:1}
#bz-raiz .paused{position:absolute;left:50%;top:46%;transform:translate(-50%,-50%);background:rgba(28,28,27,.6);color:var(--cream);font-size:15px;font-weight:600;border-radius:12px;padding:8px 14px;z-index:2;white-space:nowrap}
#bz-raiz .camctl .side-b.txt{width:auto;font-size:12px;text-align:center;line-height:1.2}
#bz-raiz .recbtn.resume i{width:58px;height:58px;border-radius:29px}
#bz-raiz .trim{margin:14px 16px 0;position:relative;height:56px;border-radius:10px;overflow:hidden;display:flex}
#bz-raiz .trim span{flex:1}
#bz-raiz .trim .h{position:absolute;top:0;bottom:0;width:14px;background:var(--amber);border-radius:6px;display:flex;align-items:center;justify-content:center}
#bz-raiz .trim .h::after{content:"";width:2px;height:20px;background:var(--dark);border-radius:1px}
#bz-raiz .trim .cut{position:absolute;top:0;bottom:0;background:rgba(28,28,27,.7)}
#bz-raiz .trim .frame2{position:absolute;top:0;bottom:0;border-top:3px solid var(--amber);border-bottom:3px solid var(--amber)}
#bz-raiz .trimtimes{display:flex;justify-content:space-between;margin:6px 16px 0;font-size:13px;color:rgba(242,242,241,.75);font-variant-numeric:tabular-nums}
#bz-raiz .tl{position:relative;margin:14px 0 0;padding:0 16px;height:64px;display:flex;gap:3px;align-items:stretch}
#bz-raiz .seg.sel{box-shadow:0 0 0 3px var(--amber)}
#bz-raiz .seg .dl{position:absolute;left:4px;bottom:3px;font-size:11px;font-weight:600;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6)}
#bz-raiz .seg .hl2{position:absolute;top:0;bottom:0;width:10px;background:var(--amber)}
#bz-raiz .ph2{position:absolute;top:-6px;bottom:-6px;width:2px;background:var(--cream);border-radius:1px;z-index:3}
#bz-raiz .ph2::before{content:"";position:absolute;top:-4px;left:-4px;width:10px;height:10px;border-radius:5px;background:var(--cream)}
#bz-raiz .cuttools{display:flex;justify-content:space-around;padding:14px 8px 0}
#bz-raiz .cuttools .tool{color:var(--cream)}
#bz-raiz .cuttools .tool svg{stroke:var(--cream)}
#bz-raiz .tlh{display:flex;justify-content:space-between;margin:8px 16px 0;font-size:12px;color:rgba(242,242,241,.7);font-variant-numeric:tabular-nums}
#bz-raiz .ordrow{display:flex;align-items:center;gap:12px;min-height:68px;padding:8px 14px 8px 12px;position:relative}
#bz-raiz .ordrow + .ordrow::before{content:"";position:absolute;top:0;left:84px;right:0;height:.5px;background:var(--hair)}
#bz-raiz .ordrow .th{width:56px;height:56px;border-radius:8px;flex-shrink:0}
#bz-raiz .ordrow .tx{flex:1}
#bz-raiz .ordrow .t{font-size:15px;font-weight:600;display:block}
#bz-raiz .ordrow .d{font-size:13px;color:var(--muted);display:block}
#bz-raiz .grip{width:44px;height:44px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}
#bz-raiz .grip i{display:block;width:18px;height:2px;border-radius:1px;background:#B9BCB1}
#bz-raiz .ordrow.lift{background:var(--cell);box-shadow:0 10px 24px rgba(28,28,27,.18);border-radius:12px;z-index:2;transform:scale(1.02)}
#bz-raiz .ic2.done{opacity:.75}
#bz-raiz .donechip{display:inline-flex;align-items:center;gap:4px;min-height:36px;padding:0 10px;border-radius:18px;background:rgba(9,77,95,.08);color:var(--teal);font-size:13px;font-weight:600;flex-shrink:0}
#bz-raiz .st{font-size:12px;font-weight:600;border-radius:6px;padding:2px 7px;flex-shrink:0}
#bz-raiz .st.new{background:rgba(255,189,89,.25);color:#7a5a1d}
#bz-raiz .st.prog{background:rgba(9,77,95,.08);color:var(--teal)}
#bz-raiz .st.ok{background:rgba(95,122,90,.18);color:#3f5a3b}
#bz-raiz .toast2{position:absolute;left:12px;right:12px;bottom:104px;z-index:7;background:var(--dark);color:var(--cream);border-radius:14px;padding:12px 14px;display:flex;flex-direction:column;gap:8px;box-shadow:0 10px 24px rgba(28,28,27,.25);font-size:15px}
#bz-raiz .toast2 .row2{display:flex;gap:8px}
#bz-raiz .toast2 button{min-height:44px;padding:0 14px;border-radius:12px;font-size:15px;font-weight:600}
#bz-raiz .toast2 .p{background:var(--amber);color:var(--dark);flex:1}
#bz-raiz .toast2 .s{color:var(--cream);background:rgba(242,242,241,.12)}
#bz-raiz .dwrap{max-width:1360px;margin:14px auto 0;padding:0 24px;overflow-x:auto}
#bz-raiz .desk2{width:1280px;height:800px;border-radius:14px;overflow:hidden;display:flex;background:var(--cream);box-shadow:0 0 0 1px var(--hair),0 24px 48px rgba(28,28,27,.18)}
#bz-raiz .dpage{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}
#bz-raiz .dcol2{width:760px;margin:0 auto;padding-top:32px;flex:1;overflow:hidden}
#bz-raiz .dcol2 .large, #bz-raiz .dcol2 .sub{padding-left:4px}
#bz-raiz .dcol2 .grp{margin:0}
#bz-raiz .dcol2 .sec{padding-left:4px;padding-right:4px}
#bz-raiz .dcol2 .vcards, #bz-raiz .dcol2 .gapnote, #bz-raiz .dcol2 .morerow{padding-left:0;padding-right:0;margin-left:0;margin-right:0}
#bz-raiz .dcol2 .morerow{padding:0 16px}
#bz-raiz .dpanel .composer2{padding-bottom:16px}
#bz-raiz .split{flex:1;display:flex;gap:28px;padding:0 32px;overflow:hidden}
#bz-raiz .webcam{flex:1;border-radius:18px;margin:24px 0;position:relative;overflow:hidden;background:radial-gradient(ellipse 40% 50% at 50% 60%,rgba(242,242,241,.14),transparent 70%),linear-gradient(180deg,#123c47,#1C1C1B)}
#bz-raiz .webcam .prompt{left:50%;transform:translateX(-50%);width:640px;top:20px;font-size:26px}
#bz-raiz .webcam .rbar{position:absolute;left:0;right:0;bottom:24px;display:flex;justify-content:center;gap:28px;align-items:center}

/* ── TRES DECLARACIONES SUBIDAS DE 10px A 11px, Y SE DICE POR QUE ─────────
 *
 * Los mockups traian diez pixeles en tres etiquetas quemadas sobre una
 * miniatura: `.slide .ph` (el numero de lamina del carrusel), `.ostext .clip b`
 * (el clip del reel de solo texto) y `.seg .dl` (la duracion de un tramo).
 *
 * `CLAUDE.md` dice «NEVER below 11px» y lo COMPRUEBA un arnes desde el 9 sep
 * 2026, el bloque 8 de `scripts/arnes-textos-vs-config.js`, sobre `public/`
 * entero. Con los 10px del mockup ese arnes se puso ROJO, con el recuento
 * exacto: «public/styles/bloomzy.css · 3».
 *
 * Asi que es una contradiccion entre un mockup aprobado y una regla no
 * negociable con guarda. El numero no se escribe con su unidad en este
 * comentario a proposito: el arnes busca el patron en el fichero entero, y una
 * guarda que se pone roja por el comentario que la explica es una guarda a la
 * que alguien le anade un `|| true`.
 *
 * Gana la regla, porque un pixel en tres etiquetas de
 * miniatura es la reconciliacion mas pequena posible y la alternativa seria
 * aflojar la guarda que protege 134 declaraciones de todo el producto.
 *
 * ES UNA DESVIACION DEL MOCKUP Y VA EN EL INFORME. Si Carolina prefiere el
 * tamano original, lo que hay que decidir es el suelo del sistema, no estas
 * tres lineas.
 */

/* ── EL FLOTANTE TAPABA LA ULTIMA FILA DE STUDIO · 3 oct 2026 ─────────────
 *
 * MEDIDO, no estimado. El boton es `position:fixed`, asi que no empuja nada:
 *
 *   escritorio  `bottom:34px` + 52px de alto  ->  su borde de arriba queda a
 *               86px del fondo de la ventana, y `#studio-grid` llega hasta el
 *               fondo. Con su `padding-bottom:96px` quedaban 10px de aire, y
 *               el boton va a 16px del borde derecho: cae encima de la ultima
 *               columna de la rejilla de cinco.
 *   movil       `bottom:92px` sobre una barra de abajo de 58-70px (10 de
 *               padding, 20 de icono, 3 de hueco, ~17 de etiqueta, y el
 *               `env(safe-area-inset-bottom)`)  ->  su borde de arriba queda
 *               74-86px por encima del fondo del scroll. Los mismos 10-22px, y
 *               en un iPhone el area segura se los come.
 *
 * 150px despeja los dos con margen. En una lista que se desplaza, aire de mas
 * al final no cuesta nada; aire de menos esconde trabajo de la clienta.
 *
 * ── POR QUE AQUI, FUERA DE `#bz-raiz`, Y NO EN `04-render-studio.js` ─────
 *
 * Esta hoja esta acotada a `#bz-raiz` por convencion y esta es su UNICA
 * excepcion, a proposito. El arreglo natural seria subir el `96px` del
 * `style=` de `#studio-grid` en `public/js/04-render-studio.js`, que es UNA
 * linea — pero ese fichero es uno de los seis puntos de contacto, y
 * `scripts/arnes-puntos-de-contacto.js` exige CERO lineas borradas en el:
 * cambiar esa linea es una borrada y una anadida, y pone el arnes en rojo.
 * Ese arnes existe para demostrar que el modulo no cambio nada de Studio, asi
 * que aflojarlo por un padding seria gastar la guarda en lo que menos importa.
 *
 * El `!important` no es pereza: el `96px` viaja en un atributo `style=`, y una
 * hoja no gana a un atributo sin el.
 *
 * SI CAROLINA PREFIERE LA OTRA FORMA, lo que hay que decidir es el tope de
 * `04-render-studio.js` en el arnes, no este bloque. Va en el informe. */
#studio-grid { padding-bottom: 150px !important; }

/* ─────────────────────────────────────────────────────────────────────────
   LOS RESULTADOS DE «CONVIERTE UNA PIEZA» · 4 oct 2026

   ESTAS CLASES NO TENIAN NI UNA LINEA DE CSS. El pintor emitia `.res`,
   `.tipo`, `.laminas`, `.lam`, `.acc` y `.aviso` y la hoja no las definia en
   ninguna parte, asi que la pantalla salia como texto suelto sobre el fondo.
   Carolina lo reporto en staging: «resultados de Convierte sin estilos».

   Un `grep` de la clase en el pintor da verde; lo que lo destapa es buscarla
   en la HOJA, que es lo que hace su arnes.

   TODO MIDE CONTRA 375 px, que es el iPhone de Carolina. Los 16 px de carril
   a cada lado son los del resto del modulo.
   ───────────────────────────────────────────────────────────────────────── */

#bz-raiz .res{margin:10px 16px;background:var(--cell);border-radius:12px;padding:12px 14px}
/* EL NUMERO VA SEPARADO DEL TEXTO, en su propia pildora: «Carrusel · 3
   láminas» en una sola linea hace que el recuento se lea como parte del
   nombre del formato. */
#bz-raiz .res .tipo{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;
  color:var(--warm);text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px}
#bz-raiz .res .tipo .n{text-transform:none;letter-spacing:0;font-size:13px;font-weight:400;
  color:var(--muted);background:var(--cream);border-radius:10px;padding:2px 8px}
#bz-raiz .res .txt{font-size:15px;line-height:1.45;color:var(--dark);white-space:pre-wrap;
  overflow-wrap:anywhere}
#bz-raiz .res .txt .d{font-size:13px;color:var(--muted)}
#bz-raiz .res .laminas{display:flex;flex-direction:column;gap:8px}
/* LAS LAMINAS SE BAJAN, NUNCA SE VAN DE LADO. Decision de Carolina del 4 oct
   2026 sobre `.hs`: en un telefono la tercera no existe hasta que la busca. */
#bz-raiz .res .lam{display:flex;gap:10px;font-size:15px;line-height:1.4;
  overflow-wrap:anywhere}
#bz-raiz .res .lam span{flex-shrink:0;width:20px;height:20px;border-radius:50%;
  background:var(--cream);color:var(--muted);font-size:12px;font-weight:700;
  display:flex;align-items:center;justify-content:center;margin-top:2px}
#bz-raiz .res .acc{display:flex;gap:18px;margin-top:12px;padding-top:10px;
  border-top:.5px solid var(--hair)}
/* 15 px ES EL SUELO DE UN BOTON en el sistema de diseno, y estos dos son
   botones aunque sean `<a>`. 44 px de alto para el dedo. */
#bz-raiz .res .acc a{font-size:15px;font-weight:700;color:var(--teal);cursor:pointer;
  min-height:44px;display:flex;align-items:center}
#bz-raiz .res .acc a.sec{color:var(--muted);font-weight:400}

/* EL AVISO: cabe en 375 px porque su ancho lo pone el carril y no su
   contenido, y el texto largo PARTE en vez de salirse. `overflow-wrap:anywhere`
   es lo que lo hace cierto con una URL o un nombre largo dentro. */
#bz-raiz .aviso{margin:12px 16px 0;background:var(--cell);border-radius:12px;
  padding:12px 14px;font-size:14px;line-height:1.45;color:var(--dark);
  overflow-wrap:anywhere}

/* ── LA LINEA DEL CARGADOR · punto 8 ─────────────────────────────────────
   Una linea corta encima de las barras grises, igual en todas las pantallas
   que generan. Sin ella, cuatro barras grises no dicen que se esta haciendo
   ni cuanto puede tardar. */
#bz-raiz .cargando-linea{margin:16px 16px 10px;font-size:15px;color:var(--muted);
  line-height:1.4}

/* ── EL TIRADOR DE LA HOJA, Y SU ARRASTRE · punto 6 ──────────────────────
   `.grab` ya existia y era decoracion: no habia forma de cerrar deslizando.
   La zona de agarre es de 44 px aunque la barra se vea de 4, porque es lo que
   un dedo necesita; el `touch-action:none` es lo que impide que el gesto se lo
   coma el scroll de la pantalla. */
/* ── Y EL CUADRO GRIS DE ENCIMA · punto 9, 5 oct 2026 ──────────────────
   «Encima del tirador de las hojas sale un cuadro gris: el tirador tiene que
   verse como una rayita fina.» Y era literal: la regla base le daba a `.grab`
   `width:36px;height:5px;background:#C7C9BE`, y esta de aqui solo le subia el
   alto a 44 para que el dedo lo agarre. O sea que el fondo gris de 36x5 se
   estiraba a 36x44 —un recuadro— con la rayita de 40 px dibujada DENTRO y
   sobresaliendo por los dos lados.

   Las dos declaraciones que faltaban son `width` y `background`: la zona de
   agarre ocupa el ancho entero y NO se pinta; lo unico que se ve es la rayita
   del `::before`. El alto de 44 px se queda, porque es lo que un dedo
   necesita y no tiene por que verse. */
#bz-raiz.bz-hoja .grab{width:100%;height:44px;margin:0;background:none;
  display:flex;align-items:center;justify-content:center;
  flex-shrink:0;touch-action:none;cursor:grab}
#bz-raiz.bz-hoja .grab::before{content:"";width:40px;height:5px;border-radius:3px;
  background:rgba(28,28,27,.18)}
/* MIENTRAS SE ARRASTRA NO HAY TRANSICION, o el dedo va por delante del marco.
   La clase la pone y la quita el gesto por DOM. */
#bz-raiz.bz-hoja .bz-marco{transition:transform .22s ease}
#bz-raiz.bz-hoja .bz-marco.bz-arrastrando{transition:none}

/* EL HUECO DEL DICTADO NO OCUPA NADA MIENTRAS NO SE DICTA. `bzComposer` lo
   pinta siempre —`bzDictarDecir` escribe por DOM y no puede escribir en algo
   que no existe— y `:empty` es lo que lo deja a cero sin que el JS tenga que
   acordarse de quitarle el relleno. Es la forma del aviso de conexiones del
   editor de reel: con todo en orden, cero pixeles. */
#bz-raiz #bz-dictado{padding-top:6px}
#bz-raiz #bz-dictado:empty{display:none}

/* LA LINEA DE DIAGNOSTICO DE LA VOZ, y solo existe en staging: la pinta el
   pintor cuando `/uso` dijo `diagnostico: true`, que el servidor solo manda
   desde staging. Pequena y atenuada: es para depurar, no para leer. */
#bz-raiz .live .diag{font-size:11px;opacity:.55;padding:4px 24px 0;
  text-align:center;font-variant-numeric:tabular-nums}

/* ── EL BLOQUE DEL DIAGNOSTICO NO SE ENCOGE · 6 oct 2026 ───────────────
   Carolina pidio el boton «fijo y visible, justo debajo de la linea de
   diagnostico, sin desplazar». La pantalla de voz es una columna flex y
   `.trans` lleva `flex:1`, asi que sin `flex-shrink:0` el boton es lo
   primero que el navegador encoge cuando la transcripcion crece. */
#bz-raiz .live .diagbox{flex-shrink:0;padding:0 24px 6px}
#bz-raiz .live .diagbox .diag{padding-left:0;padding-right:0}

/* EL BOTON DE COPIAR, Y POR QUE NO VALE `btn2` A SECAS.
   `.btn2` pone `color:var(--teal)` y ningun fondo, y esta pantalla ES
   `background:var(--teal)`: teal sobre teal. El boton estaba en su sitio,
   habilitado y funcionando, y era INVISIBLE — `cce9a0e` en la unica forma
   que un `grep` no ve, porque el control existe y el `onclick` compila.
   CREMA SOBRE TEAL, NUNCA AMBAR: el ambar es de los CTA y aqui competiria
   con Terminar, que es el CTA de esta pantalla. */
#bz-raiz .live .diagcopy{width:100%;margin-top:6px;min-height:36px;
  background:var(--cream);color:var(--teal);font-size:14px;font-weight:700}

/* ── «HAY UNA VERSION NUEVA» · 6 oct 2026 ───────────────────────────────
   Solo staging. Discreto a proposito: dice que hay una version nueva y no
   se pone delante de nada. Teal sobre crema, nunca ambar — el ambar es de
   los CTA y aqui competiria con el boton de la pantalla que haya debajo. */
#bz-raiz .bz-version-nueva{display:block;width:100%;border:0;cursor:pointer;
  background:rgba(9,77,95,.08);color:#094D5F;font-family:inherit;
  font-size:13px;font-weight:700;text-align:center;padding:8px 24px;}
