// === Escena 04 — «El enlace» ===  [49.8 s · CLÍMAX de la pieza]
//
// LOCUCIÓN (audio/escena-04.mp3): mira arriba, fuera de la aplicación → casi todo lo que filtras
// se escribe en la dirección → la ruta del proyecto; detrás, lo que buscas, quién la lleva y de
// qué tipo es → caben seis cosas, aquí hay tres → cambias al tablero y la dirección cambia con
// él <break 0.6s/> → ahora cópiala y pégala → tu compañero la abre y le sale tu tablero, el
// mismo → no le mandas una captura: le mandas la vista → con una condición: tiene que ser del
// proyecto → LA ÚNICA COSA (prueba) → vamos con él.
//
// LA BARRA DE DIRECCIONES ES UN COMPONENTE PROPIO, no la de `BrowserChrome`: aquella es un
// <span> de 11 px con ellipsis en una línea (primitives.jsx:66-70) y una dirección real de esta
// app —ruta con identificador de proyecto más `users` y `types` con identificadores completos de
// 36 caracteres (ToSTR.vb:351-353)— se corta y no se lee ni parada. Aquí va a 30-32 px de
// monoespaciada, con cada parámetro en su propia pastilla para poder señalarlos de uno en uno.
// Los identificadores se pintan ENTEROS pero atenuados: se ve que son identificadores, que es la
// verdad, sin obligar a nadie a leerlos. El plan pedía dos renglones y salen TRES: con los dos
// identificadores completos a 30 px la query no cabe en uno, y antes que recortar un
// identificador —que sería dibujar una dirección falsa— se gasta un renglón más.
//
// FIDELIDAD:
//   · «CASI todo lo que filtras»: `BuildFilterQuery` escribe seis cosas y los cinco atajos no
//     están entre ellas. La escena 06 nombra las excepciones; esta no promete de más.
//   · La persona ha puesto TRES filtros -> la dirección lleva exactamente `q`, `users` y `types`.
//     `statuses`, `nat` y `open` se dibujan en la LEYENDA, apagados; nunca dentro de la barra.
//   · La ruta de la tabla se llama `Workitems`; aquí se cambia a `Kanban`, que es lo que abre el
//     compañero.
//   · Quien no es miembro ve «No eres miembro de este proyecto.» y nada más.
function EscenaTV04({ t }){
  const T = {
    arriba:0.1,       // "Mira arriba, fuera de la aplicación" -> velo sobre la app; la barra se amplia
    escribe:4.5,      // "se escribe en la dirección" -> el primer parametro se escribe solo
    ruta:6.7,         // "La ruta del proyecto" -> se resalta el tramo de la ruta
    detras:8.9,       // "Detrás, lo que buscas" -> se resalta q
    quien:10.6,       // "quién la lleva" -> se escribe y se resalta users
    tipo:11.2,        // "de qué tipo es" -> se escribe y se resalta types
    seis:13.1,        // "Caben seis cosas" -> la leyenda: tres encendidas, tres apagadas
    tres:14.4,        // "aquí hay tres" -> las tres encendidas rematan
    tablero:16.2,     // "Cambias al tablero" -> la palabra de la vista cambia
    cambia:17.2,      // "y la dirección cambia con él"
    filtroentero:18.8,// "arrastrando el filtro entero" -> la query se queda quieta
    pausa:20.9,       // (pausa 0.6 s) -> quietud total: anticipacion
    copia:21.8,       // "Ahora cópiala" -> la direccion se selecciona entera y se copia
    pega:22.8,        // "pégala en un mensaje" -> el mensaje con el enlace dentro
    compa:25.0,       // "Tu compañero la abre" -> EL MOMENTO: segunda ventana, misma direccion
    suyo:26.5,        // "y le sale tu tablero"
    mismo:28.5,       // "El mismo." -> los dos tableros, lado a lado, identicos
    captura:30.1,     // "No le mandas una captura" -> la captura fantasma se tacha en gris
    vista:32.8,       // "le mandas la vista"
    condicion:34.8,   // "Con una condición"
    delproyecto:36.1, // "tiene que ser del proyecto" -> tercera ventana, la de quien no es miembro
    sino:38.3,        // "Si no, en vez de tus tareas"
    aviso:40.0,       // "ve un aviso" -> el aviso literal, y nada mas
    unica1:41.7,      // "La dirección es el filtro" -> UNICA COSA mitad 1 (prueba)
    unica2:43.4,      // "se comparte pegándola" -> mitad 2
    vamos:48.0,       // "Vamos con él" -> se cierra la ventana propia; queda la del compañero
    colStep:0.10,      // cascada entre columnas del tablero
    cardStep:0.07,     // cascada entre tarjetas de una columna
    claveStep:0.09,    // cascada entre las seis claves de la leyenda
  };

  const PID='8f3c1d92-4b77-4e0a-9a51-2c6de07b1f44';
  const UID='1d4b8e77-90c3-42a5-8e11-77bd9a4f0c62';
  const TID='6a02f5c1-38de-4b9f-a7c4-051e83d6b28a';
  // La barra ocupa tres renglones: host+ruta arriba y la query debajo, partida donde cabe. Con
  // los identificadores completos —36 caracteres cada uno— a 30 px de monoespaciada no entra en
  // dos: se prefiere un renglón más antes que recortar un identificador, que sería mentir.
  const ADX=210, ADY=150, ADW=1500;

  const enKanban = t >= T.tablero;
  const dos = t >= T.compa && t < T.vamos;                       // las dos ventanas, lado a lado
  const solo = t >= T.vamos;                                     // solo la del compañero
  const velo = clamp((t-T.unica1)/0.7,0,1)*0.93 * (1-clamp((t-T.vamos)/0.6,0,1));
  const u1E = Easing.easeOutCubic(clamp((t-T.unica1)/0.6,0,1))*(1-clamp((t-T.vamos)/0.45,0,1));
  const u2E = Easing.easeOutCubic(clamp((t-T.unica2)/0.6,0,1))*(1-clamp((t-T.vamos)/0.45,0,1));

  const Ico = ({ n, s=24, c='#64748B', sw=2 })=>{
    const Q = {
      lupa:  <><circle cx="11" cy="11" r="6"/><path d="M15.6 15.6 L20 20"/></>,
      escudo:<path d="M12 2.5 4.5 6v6c0 5 3.3 8.4 7.5 9.6 4.2-1.2 7.5-4.6 7.5-9.6V6Z"/>,
      copiar:<><rect x="9.5" y="9.5" width="10.5" height="10.5" rx="2.2"/><path d="M5.5 15V5.6c0-.6.5-1.1 1.1-1.1H15"/></>,
      check: <path d="M5 12.5 L10 17 L19 7"/>,
      cerrar:<path d="M6 6 L18 18M18 6 L6 18"/>,
      alerta:<><path d="M12 3.5 21.5 20.5H2.5Z"/><path d="M12 10v4.4"/><circle cx="12" cy="17.6" r="1" fill={c} stroke="none"/></>,
      imagen:<><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="8.5" cy="10" r="1.6"/><path d="M4 17l5-5 4 4 3-2.5 4 3.5"/></>,
      flecha:<path d="M4 12h15M13 6l6 6-6 6"/>,
    };
    return <svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke={c} strokeWidth={sw} strokeLinecap="round" strokeLinejoin="round">{Q[n]}</svg>;
  };

  // Identificador completo, pero legible: los primeros ocho caracteres a plena tinta y el resto
  // atenuado. Se ve que es un identificador —que es la verdad— sin pedirle a nadie que lo lea.
  const Ident = ({ v, col='#0F172A' })=>(
    <span><span style={{color:col}}>{v.slice(0,8)}</span><span style={{color:col, opacity:0.38}}>{v.slice(8)}</span></span>
  );

  // Pastilla de un parámetro de la query: se escribe sola y se puede resaltar por separado.
  const Par = ({ k, hijo, from, foco })=>{
    const p = clamp((t-from)/0.45,0,1);
    if (p <= 0) return null;
    const on = foco !== null && t >= foco && t < foco+1.7;
    const e = Easing.easeOutCubic(p);
    return (
      <span style={{display:'inline-flex', alignItems:'center', padding:'6px 12px', borderRadius:9,
                    background:on ? 'rgba(0,133,255,0.14)' : 'transparent',
                    boxShadow:on ? '0 0 0 2px rgba(0,133,255,0.45)' : 'none',
                    opacity:p, transform:`translateY(${(1-e)*6}px)`, whiteSpace:'nowrap'}}>
        <span className="f-mono" style={{fontSize:30, color:'#0085FF', fontWeight:600}}>{k}</span>
        <span className="f-mono" style={{fontSize:30}}>{hijo}</span>
      </span>
    );
  };

  const CLAVES = [
    { k:'q',        d:'lo que buscas',   on:true },
    { k:'users',    d:'quién la lleva',  on:true },
    { k:'types',    d:'de qué tipo es',  on:true },
    { k:'statuses', d:'en qué estado',   on:false },
    { k:'nat',      d:'naturaleza',      on:false },
    { k:'open',     d:'solo abiertas',   on:false },
  ];

  // Las seis columnas del flujo, las mismas que enseña la escena 05. En una ventana estrecha
  // se ven cuatro y media, recortadas por el marco: es lo que hace un tablero de verdad.
  const COLS = [
    { n:'Backlog',    col:'#94A3B8', c:1, cards:['Etiquetas del blog'] },
    { n:'Pendiente',  col:'#0EA5E9', c:3, cards:['Revisar etiquetas de producto','Etiquetas con acentos rotos','Etiquetas del buscador'] },
    { n:'En proceso', col:'#0085FF', c:2, cards:['Etiquetas duplicadas','Acentos en el catálogo'] },
    { n:'Pausado',    col:'#F59E0B', c:1, cards:['Etiquetas del pie'] },
    { n:'25%',        col:'#10B981', c:1, cards:['Etiquetas de envío'] },
    { n:'Completado', col:'#059669', c:0, cards:[] },
  ];

  // Tablero mini: el mismo dibujo en las dos ventanas. Que sea el MISMO es la prueba.
  const Tablero = ({ desde, escala=1, colw=168 })=>(
    <div style={{padding:14, display:'flex', gap:12, background:'#F6F8FB', height:'100%', overflow:'hidden'}}>
      {COLS.map((C,i)=>{
        const e = Easing.easeOutCubic(clamp((t-desde-i*T.colStep)/0.4,0,1));
        return (
          <div key={C.n} style={{width:colw, flexShrink:0, background:'#fff', borderRadius:10, border:'1px solid #E8EDF3', padding:10,
                       opacity:e, transform:`translateY(${(1-e)*10}px)`}}>
            <div style={{display:'flex', alignItems:'center', gap:7, marginBottom:9}}>
              <span style={{width:9, height:9, borderRadius:99, background:C.col}}/>
              <span className="f-plex" style={{flex:1, fontSize:15*escala, fontWeight:700, color:'#0F172A', whiteSpace:'nowrap', overflow:'hidden'}}>{C.n}</span>
              <span className="f-mono" style={{fontSize:14*escala, color:'#94A3B8'}}>{C.c}</span>
            </div>
            {C.cards.map((cd,j)=>(
              <div key={cd} style={{background:'#fff', border:'1px solid #E8EDF3', borderRadius:8, padding:'8px 9px', marginBottom:7,
                           boxShadow:'0 1px 3px rgba(15,23,42,0.06)', opacity:clamp((t-desde-i*T.colStep-j*T.cardStep-0.1)/0.3,0,1)}}>
                <div className="f-plex" style={{fontSize:14*escala, color:'#334155', lineHeight:1.25}}>{cd}</div>
                <div style={{display:'flex', alignItems:'center', gap:6, marginTop:6}}>
                  <span className="f-mono" style={{fontSize:11*escala, color:'#94A3B8'}}>NTO</span>
                  <div style={{flex:1}}/>
                  <img src="../_engine/assets/avatares/marta.jpg" alt="" style={{width:18*escala, height:18*escala, borderRadius:99, objectFit:'cover'}}/>
                </div>
              </div>
            ))}
          </div>
        );
      })}
    </div>
  );

  // Una ventana simulada con sus chips y su tablero: la propia y la del compañero son idénticas.
  const Ventana = ({ x, y, w, h, ruta, desde, rotulo, rotuloCol, op=1, anillo }) => (
    <div style={{position:'absolute', left:x, top:y, width:w, height:h, borderRadius:14, overflow:'hidden',
                 background:'#fff', border:anillo ? `3px solid ${anillo}` : '1px solid #E2E8F0',
                 boxShadow:'0 26px 62px rgba(15,23,42,0.16)', opacity:op, zIndex:22}}>
      <BrowserChrome url={`play.dinaup.com/App/ToDo/${PID.slice(0,8)}…/${ruta}?q=etiquetas&users=…&types=…`} title="Tareas — Nueva tienda online"/>
      <div style={{display:'flex', alignItems:'center', gap:8, height:54, padding:'0 14px', borderBottom:'1px solid #F1F5F9', background:'#fff'}}>
        {[['Abiertas','#DCFCE7','#15803D'],['Marta Ruiz','#E4F1FF','#0B4F86'],['Error','#E4F1FF','#0B4F86']].map(c=>(
          <span key={c[0]} style={{display:'inline-flex', alignItems:'center', gap:6, height:32, padding:'0 12px', borderRadius:16, background:c[1]}}>
            <span className="f-plex" style={{fontSize:15, fontWeight:600, color:c[2]}}>{c[0]}</span>
          </span>
        ))}
        <div style={{flex:1}}/>
        {rotulo && <span className="f-plex" style={{fontSize:15, fontWeight:700, letterSpacing:'1.6px', color:rotuloCol}}>{rotulo}</span>}
      </div>
      <div style={{height:h-76-54}}><Tablero desde={desde} escala={w > 1000 ? 1.35 : 1} colw={w > 1000 ? 205 : 168}/></div>
    </div>
  );

  // Geometría de las ventanas: una sola centrada -> dos lado a lado -> solo la del compañero.
  const gemP = Easing.easeInOutCubic(clamp((t-T.compa+0.35)/0.7,0,1));
  const propiaX = lerp(300, 170, gemP), propiaW = lerp(1320, 760, gemP);
  const dimTerc = clamp((t-T.delproyecto+0.2)/0.5,0,1)*0.72;

  return (
    <SlideCanvas variant="light">
      <DinaupLogo size={34} style={{position:'absolute', left:56, top:46, opacity:0.45, zIndex:6}}/>
      <div style={{opacity:lerp(1,0.25,clamp((t-T.unica1)/0.8,0,1))*(solo ? 0.3 : 1)}}>
        <DemoHeader t={t} eyebrow="EL ENLACE" title={<span>La dirección lleva el filtro puesto</span>}/>
      </div>

      {/* ═════════ LA BARRA DE DIRECCIONES · el protagonista de la escena ═════════ */}
      {(()=>{
        const p = clamp((t-T.arriba)/0.8,0,1), e = Easing.easeOutBack(p);
        const salida = clamp((t-T.unica1)/0.6,0,1);
        if (salida >= 1) return null;
        const sel = t >= T.copia && t < T.copia+2.2;
        const rutaOn = t >= T.ruta && t < T.ruta+1.9;
        const cambiando = t >= T.tablero && t < T.tablero+1.6;
        return (
          <div style={{position:'absolute', left:ADX, top:ADY, width:ADW, zIndex:44,
                       opacity:p*(1-salida), transform:`translateY(${(1-e)*-16}px) scale(${lerp(0.9,1,e)})`}}>
            <div style={{position:'relative', padding:'22px 28px', borderRadius:24, background:'#fff',
                         border:`2px solid ${sel ? '#0085FF' : '#DADCE0'}`,
                         boxShadow:sel ? '0 0 0 6px rgba(0,133,255,0.18), 0 26px 60px rgba(15,23,42,0.18)'
                                       : '0 26px 60px rgba(15,23,42,0.16)'}}>
              {/* línea 1 · el host y la ruta */}
              <div style={{display:'flex', alignItems:'center', gap:12, whiteSpace:'nowrap'}}>
                <Ico n="escudo" s={26} c="#94A3B8"/>
                <span className="f-mono" style={{fontSize:32, color:'#64748B'}}>play.dinaup.com</span>
                <span style={{display:'inline-flex', alignItems:'center', padding:'6px 10px', borderRadius:9,
                              background:rutaOn ? 'rgba(0,133,255,0.14)' : 'transparent',
                              boxShadow:rutaOn ? '0 0 0 2px rgba(0,133,255,0.45)' : 'none'}}>
                  <span className="f-mono" style={{fontSize:32, color:'#0F172A'}}>/App/ToDo/</span>
                  <span className="f-mono" style={{fontSize:32}}><Ident v={PID}/></span>
                  <span className="f-mono" style={{fontSize:32, color:'#0F172A'}}>/</span>
                  <span className="f-mono" style={{fontSize:32, fontWeight:700,
                            color:cambiando ? '#0085FF' : '#0F172A',
                            textShadow:cambiando ? `0 0 ${Math.sin((t-T.tablero)/1.6*Math.PI)*22}px rgba(0,133,255,0.9)` : 'none'}}>
                    {enKanban ? 'Kanban' : 'To-Do'}
                  </span>
                </span>
              </div>
              {/* línea 2 · la query, parámetro a parámetro */}
              <div style={{display:'flex', alignItems:'center', flexWrap:'wrap', gap:'6px 2px', marginTop:12}}>
                <Par k="?q="      hijo={<span style={{color:'#0F172A'}}><Typewriter text="etiquetas" start={T.escribe} cps={16} t={t}/></span>} from={T.escribe} foco={T.detras}/>
                <Par k="&users="  hijo={<Ident v={UID}/>} from={T.quien-0.35} foco={T.quien}/>
                <Par k="&types="  hijo={<Ident v={TID}/>} from={T.tipo-0.35}  foco={T.tipo}/>
              </div>
              {/* la selección entera + «copiado» */}
              {sel && (
                <div style={{position:'absolute', left:16, right:16, top:14, bottom:14, borderRadius:16,
                             background:'rgba(0,133,255,0.16)', pointerEvents:'none',
                             opacity:clamp((t-T.copia)/0.25,0,1)}}/>
              )}
            </div>
            {t >= T.copia && t < T.compa && (
              <div style={{position:'absolute', right:0, top:-54, display:'inline-flex', alignItems:'center', gap:10,
                           padding:'10px 20px', borderRadius:12, background:'#0F172A',
                           opacity:clamp((t-T.copia)/0.3,0,1)*clamp((T.compa-t)/0.4,0,1),
                           transform:`translateY(${(1-Easing.easeOutBack(clamp((t-T.copia)/0.4,0,1)))*10}px)`}}>
                <Ico n="copiar" s={20} c="#56E16A" sw={2.2}/>
                <span className="f-plex" style={{fontSize:20, fontWeight:700, color:'#fff'}}>Copiado</span>
              </div>
            )}
            {/* «arrastrando el filtro entero»: la query no se ha movido */}
            {t >= T.filtroentero && t < T.copia-0.3 && (
              <div className="f-plex" style={{position:'absolute', right:8, top:202, fontSize:22, fontWeight:700, color:'#059669',
                           opacity:clamp((t-T.filtroentero)/0.4,0,1)*clamp((T.copia-0.3-t)/0.4,0,1)}}>
                la vista cambia · el filtro no se mueve
              </div>
            )}
          </div>
        );
      })()}

      {/* ═════════ La leyenda: caben seis cosas, aquí hay tres ═════════ */}
      {(()=>{
        const p = clamp((t-T.seis)/0.4,0,1), out = clamp((t-T.pega+0.6)/0.5,0,1);
        if (p <= 0 || out >= 1) return null;
        return (
          <div style={{position:'absolute', left:ADX, top:358, width:ADW, zIndex:42, opacity:p*(1-out)}}>
            <div style={{display:'flex', gap:12}}>
              {CLAVES.map((c,i)=>{
                const e = Easing.easeOutBack(clamp((t-T.seis-i*T.claveStep)/0.4,0,1));
                const remate = c.on && t >= T.tres && t < T.tres+1.2 ? Math.sin((t-T.tres)/1.2*Math.PI) : 0;
                return (
                  <div key={c.k} style={{flex:1, padding:'12px 14px', borderRadius:12, textAlign:'center',
                               background:c.on ? 'rgba(0,133,255,0.10)' : '#F4F6F9',
                               border:`1px solid ${c.on ? 'rgba(0,133,255,0.40)' : '#E6EAF0'}`,
                               boxShadow:remate > 0 ? `0 0 ${remate*26}px rgba(0,133,255,0.55)` : 'none',
                               opacity:(c.on ? 1 : 0.55)*clamp((t-T.seis-i*T.claveStep)/0.3,0,1),
                               transform:`translateY(${(1-e)*10}px)`}}>
                    <div className="f-mono" style={{fontSize:24, fontWeight:700, color:c.on ? '#0085FF' : '#94A3B8'}}>{c.k}</div>
                    <div className="f-plex" style={{fontSize:17, color:c.on ? '#334155' : '#94A3B8', marginTop:4}}>{c.d}</div>
                  </div>
                );
              })}
            </div>
            <div className="f-plex" style={{textAlign:'center', fontSize:22, color:'#64748B', marginTop:14}}>
              Caben seis. Aquí hay <b style={{color:'#0085FF'}}>tres</b>: solo se escribe lo que has puesto.
            </div>
          </div>
        );
      })()}

      {/* «pégala en un mensaje» */}
      {(()=>{
        const p = clamp((t-T.pega)/0.4,0,1), out = clamp((t-T.captura+0.5)/0.4,0,1);
        if (p <= 0 || out >= 1) return null;
        const e = Easing.easeOutBack(p);
        return (
          <div style={{position:'absolute', left:600, top:360, width:720, zIndex:42, opacity:p*(1-out),
                       transform:`translateY(${(1-e)*14}px) scale(${lerp(0.94,1,e)})`}}>
            <div style={{padding:'18px 22px', borderRadius:'16px 16px 16px 4px', background:'#0085FF',
                         boxShadow:'0 18px 44px rgba(0,133,255,0.34)'}}>
              <div className="f-plex" style={{fontSize:19, fontWeight:700, color:'rgba(255,255,255,0.75)', marginBottom:8}}>Para Javier</div>
              <div className="f-mono" style={{fontSize:21, color:'#fff', wordBreak:'break-all', lineHeight:1.35}}>
                play.dinaup.com/App/ToDo/{PID.slice(0,8)}…/Kanban?q=etiquetas&amp;users=…&amp;types=…
              </div>
            </div>
          </div>
        );
      })()}

      {/* «No le mandas una captura»: la captura fantasma, tachada */}
      {(()=>{
        const p = clamp((t-T.captura)/0.4,0,1), out = clamp((t-T.condicion+0.4)/0.4,0,1);
        if (p <= 0 || out >= 1) return null;
        const tacha = Easing.easeInOutCubic(clamp((t-T.captura-0.5)/0.6,0,1));
        const vistaP = clamp((t-T.vista)/0.4,0,1);
        return (
          <div style={{position:'absolute', left:700, top:360, width:520, zIndex:42, opacity:p*(1-out)}}>
            <div style={{position:'relative', display:'flex', alignItems:'center', gap:16, padding:'18px 24px',
                         borderRadius:14, background:'#F1F5F9', border:'1px dashed #CBD5E1'}}>
              <Ico n="imagen" s={30} c="#94A3B8"/>
              <span className="f-plex" style={{flex:1, fontSize:24, fontWeight:600, color:'#94A3B8'}}>una captura de pantalla</span>
              <span style={{position:'absolute', left:16, right:16, top:'50%', height:4, borderRadius:2, background:'#EF4444',
                            transformOrigin:'left', transform:`scaleX(${tacha})`}}/>
            </div>
            {vistaP > 0 && (
              <div className="f-plex" style={{fontSize:26, fontWeight:700, color:'#047857', marginTop:16, textAlign:'center',
                           opacity:vistaP, transform:`translateY(${(1-Easing.easeOutCubic(vistaP))*10}px)`}}>
                le mandas la vista
              </div>
            )}
          </div>
        );
      })()}

      {/* ═════════ LAS VENTANAS ═════════ */}
      {!solo && (
        <div style={{opacity:1-dimTerc, filter:dimTerc > 0.1 ? 'saturate(0.55)' : 'none'}}>
          <Ventana x={propiaX} y={480} w={propiaW} h={520} ruta={enKanban ? 'Kanban' : 'To-Do'} desde={0.5}
                   rotulo={dos ? 'TU VENTANA' : null} rotuloCol="#94A3B8"
                   op={lerp(1, 0.30, clamp((t-T.arriba)/0.8,0,1)*(1-clamp((t-T.compa+0.35)/0.7,0,1)))}/>
          {dos && (
            <Ventana x={990} y={480} w={760} h={520} ruta="Kanban" desde={T.compa+0.25}
                     rotulo="LA DE JAVIER" rotuloCol="#0085FF"
                     anillo={t >= T.mismo && t < T.mismo+2.4 ? '#0085FF' : null}/>
          )}
          {/* «El mismo.» — el sello que cierra la prueba */}
          {t >= T.mismo && t < T.condicion && (
            <div style={{position:'absolute', left:0, right:0, top:1014, textAlign:'center', zIndex:40,
                         opacity:clamp((t-T.mismo)/0.4,0,1)*clamp((T.condicion-t)/0.4,0,1)}}>
              <span style={{display:'inline-flex', alignItems:'center', gap:12, padding:'10px 26px', borderRadius:99,
                            background:'rgba(16,185,129,0.14)'}}>
                <Ico n="check" s={24} c="#059669" sw={2.8}/>
                <span className="f-plex" style={{fontSize:26, fontWeight:800, color:'#047857'}}>El mismo tablero</span>
              </span>
            </div>
          )}
        </div>
      )}

      {/* ═════════ El borde: quien no es del proyecto ═════════ */}
      {(()=>{
        const p = clamp((t-T.delproyecto)/0.5,0,1), out = clamp((t-T.unica1+0.3)/0.5,0,1);
        if (p <= 0 || out >= 1) return null;
        const e = Easing.easeOutBack(p);
        const avP = clamp((t-T.aviso)/0.45,0,1);
        return (
          <div style={{position:'absolute', left:520, top:436, width:880, zIndex:46, opacity:p*(1-out),
                       transform:`translateY(${(1-e)*26}px) scale(${lerp(0.93,1,e)})`}}>
            <div className="f-plex" style={{fontSize:21, fontWeight:700, letterSpacing:'2.4px', color:'#B42318', marginBottom:12}}>
              QUIEN NO ES DEL PROYECTO
            </div>
            <div style={{borderRadius:14, overflow:'hidden', background:'#fff', border:'1px solid #E2E8F0',
                         boxShadow:'0 34px 80px rgba(15,23,42,0.30)'}}>
              <BrowserChrome url={`play.dinaup.com/App/ToDo/${PID.slice(0,8)}…/Kanban?q=etiquetas&users=…&types=…`} title="Tareas"/>
              <div style={{height:330, display:'flex', flexDirection:'column', alignItems:'center', justifyContent:'center', gap:22}}>
                <span style={{opacity:avP, transform:`scale(${lerp(0.6,1,Easing.easeOutBack(avP))})`}}>
                  <Ico n="alerta" s={64} c="#EF4444" sw={1.8}/>
                </span>
                <span className="f-plex" style={{fontSize:38, fontWeight:700, color:'#B42318', opacity:avP,
                             transform:`translateY(${(1-Easing.easeOutCubic(avP))*10}px)`}}>
                  No eres miembro de este proyecto.
                </span>
                <span className="f-plex" style={{fontSize:22, color:'#94A3B8', opacity:avP*0.9}}>y nada más</span>
              </div>
            </div>
          </div>
        );
      })()}

      {/* ═════════ LA ÚNICA COSA · prueba ═════════ */}
      {velo > 0.01 && <div style={{position:'absolute', inset:0, background:'#fff', opacity:velo, zIndex:50}}/>}
      {u1E > 0 && (
        <div className="f-plex" style={{position:'absolute', left:0, right:0, top:392, textAlign:'center', zIndex:52,
                     fontSize:76, fontWeight:800, letterSpacing:'-0.03em', color:'#0F172A',
                     opacity:u1E, transform:`translateY(${(1-u1E)*18}px)`}}>
          La dirección es el filtro,
        </div>
      )}
      {u2E > 0 && (
        <div className="f-plex" style={{position:'absolute', left:0, right:0, top:504, textAlign:'center', zIndex:52,
                     fontSize:76, fontWeight:800, letterSpacing:'-0.03em',
                     opacity:u2E, transform:`translateY(${(1-u2E)*18}px)`}}>
          <span className="grad-text">y se comparte pegándola.</span>
        </div>
      )}

      {/* ═════════ «Vamos con él»: se cierra la propia; queda la del compañero ═════════ */}
      {solo && (()=>{
        const e = Easing.easeOutCubic(clamp((t-T.vamos)/0.75,0,1));
        return (
          <div style={{position:'absolute', left:0, top:0, right:0, bottom:0, zIndex:54,
                       opacity:clamp((t-T.vamos)/0.5,0,1)}}>
            <div style={{position:'absolute', inset:0, background:'#fff'}}/>
            <div style={{position:'absolute', left:lerp(990,300,e), top:lerp(480,290,e),
                         width:lerp(760,1320,e), height:lerp(520,700,e), borderRadius:16, overflow:'hidden',
                         background:'#fff', border:'1px solid #E2E8F0', boxShadow:'0 34px 82px rgba(15,23,42,0.18)'}}>
              <BrowserChrome url={`play.dinaup.com/App/ToDo/${PID.slice(0,8)}…/Kanban?q=etiquetas&users=…&types=…`} title="Tareas — Nueva tienda online"/>
              <div style={{display:'flex', alignItems:'center', gap:8, height:54, padding:'0 16px', borderBottom:'1px solid #F1F5F9'}}>
                {[['Abiertas','#DCFCE7','#15803D'],['Marta Ruiz','#E4F1FF','#0B4F86'],['Error','#E4F1FF','#0B4F86']].map(c=>(
                  <span key={c[0]} style={{display:'inline-flex', alignItems:'center', height:34, padding:'0 14px', borderRadius:17, background:c[1]}}>
                    <span className="f-plex" style={{fontSize:16, fontWeight:600, color:c[2]}}>{c[0]}</span>
                  </span>
                ))}
              </div>
              <div style={{height:lerp(520,700,e)-76-54}}><Tablero desde={T.vamos+0.2} escala={1.3} colw={205}/></div>
            </div>
            <div className="f-plex" style={{position:'absolute', left:0, right:0, top:150, textAlign:'center',
                         fontSize:34, fontWeight:600, color:'#334155', opacity:e}}>
              Él lo ha abierto en el tablero. Vamos con él.
            </div>
          </div>
        );
      })()}

      <ScriptedCursor t={t} clickTimes={[T.copia]} frames={[
        { t:0,            x:1830, y:1050 },
        { t:T.pausa,      x:1830, y:1050 },
        { t:T.copia,      x:1450, y:270 },
        { t:T.pega,       x:1450, y:270 },
        { t:T.pega+0.9,   x:1830, y:1050 },
      ]}/>
    </SlideCanvas>
  );
}
Object.assign(window, { EscenaTV04 });
