You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/docs/process/CONTINUE-background.md

10 KiB

CONTINUE — eje Background (handoff, act. 2026-08-18)

Estado: F0 → F5 CERRADAS Y COMMITEADAS. El componente existe, tiene demo, está documentado y el tier lo usa. Cuatro commits en alpha-0.1-background:

Commit Qué cerró
70f45033f F1 — la pila y la adopción del anfitrión (+ F1.5, con el bug de Box flex)
33031c2ad F2 — Image · Video · Pause, y el hero se queda sin CSS
740274a84 F3 + F3.5 + F4 — parallax, puntero, attach, la demo v2 y el registro documental
331912cf2 F5 — rollout a los seis blocks

La verificación con Chrome visible está HECHA (2026-08-18, §1 abajo): travel real, 60 fps y 0 reflows, con dos defectos encontrados y arreglados — el overflow: hidden del stage que congelaba la timeline, y el rect cacheado del puntero que se desviaba con el scroll. Sin commitear todavía.

Por dónde entrar mañana: §Qué queda. Nada bloquea el uso del componente. Lo que queda son DOS firmas tuyas (borrar backdrop/ · qué hacer con el techo de contraste del scrim) y dos tareas de otros ejes. La verificación en navegador está cerrada, incluida la rama @supports not.

⚠️ LO PRIMERO: la fuente viva es el PLAN, no este fichero

docs/process/PLAN-background.md — decisiones firmadas D-BG.1…D-BG.18 en §6, y el registro de ejecución fase por fase en §7.bis…§7.decies, cada uno con sus mediciones. Este handoff indexa; el plan manda.

Qué queda

1. ✅ HECHA con Chrome visible (2026-08-18) — y destapó dos defectos, ya arreglados

Registro completo en PLAN-background.md §7.nonies. Resumen:

  • travel real ✓ progreso 43,5%→95,5%, translate −8,34px→+58,19px, hasta 0px 64px = 4rem en el extremo (los keyframes van −travel→+travel, así que la amplitud pico a pico es el doble del token);
  • 60 fps ✓ mediana 16,7ms · p95 17,0 · max 17,1 · 0 de 200 frames >20ms;
  • detector de reflow ✓ 0ms forzados en 200 frames moviendo LOS DOS ejes, con el instrumento validado por mutación (un thrash de 65ms sí se reporta);
  • @supports not ✅ ejercitada (§7.decies) en el Firefox de Playwright, que NO soporta view() — la rama está viva ahí sin emulación: progress 0→−64px, 0,5→0, 1→+64px, los mismos extremos que el camino CSS, y en Chromium la rama no aplica ni la var mueve nada (exclusión mutua, medida). Queda sin ejercitar UN eslabón: que ScrollProgress escriba la var extremo a extremo, porque desde este entorno Firefox no alcanza el dev server.

Los dos defectos que salieron, ambos arreglados y verificados:

  1. Un ancestro overflow: hidden mata el travel en silencio — view() se ancla al scroll container más cercano y hidden lo es aunque no scrollee. La demo lo sufría ([data-uix-stage]), progreso clavado en 52,63%. Arreglado con overflow: clip en el stage + quinto límite en el README del componente, porque el caso real es el overflow-x: hidden de cualquier landing. Las 174 demos que comparten el stage: affix y sticky idénticos, anchor-nav cambia a mejor (su rail sticky ya no se escapa por arriba).
  2. El eje del puntero se desviaba exactamente lo scrolleado — rect cacheado en coordenadas de viewport, invalidado sólo por pointerenter/resize. Arreglado cacheando en coordenadas de DOCUMENTO contra pageX/pageY; error 0 con ratón real, halo del spotlight a 1px del cursor. ⚠️ Un PointerEvent sintético NO puede verificarlo (pageY === clientY en eventos construidos).

Lo que ya estaba medido antes: la composición de los dos ejes en un translate (parallax solo 0px 30px; con puntero y depth: 20px → 20px 10px — ratificado por la aritmética de ahora), el puntero entero, attach='fixed', y RTL.

1.bis ✅ Cierre ejecutado (2026-08-18) — §7.decies

  • Escala del scrim ORDENADA: strength pasa de scrim|overlay|muted|subtle|ghost a xs|sm|md|lg|xl con tokens propios; α 0,084…0,420 estrictamente creciente, md conserva el 0,45 del hero. Cambio de API hecho con la demo como único consumidor.
  • La tabla de contraste del README estaba MAL (asumía tinta α 0,66; es 0,42): el default da 1,48:1 sobre foto blanca, no 2,10, y el techo es 2,66:1. Re-medida por píxel.
  • feature-split: banda por SECCIÓN, enmendado en el plan (×3) y en PLAN-blocks-quality §3 col. B.
  • Paseo A–H registrado: añadidas al README la excepción A2.3 y la sección ## Subset; corregida una deriva de TRES sitios que llamaba Toggle al control de pausa (compone IconButton, evento contact-activate).
  • D-BG.19 · un fondo NUNCA suena (§7.undecies, firmada por el autor): muted deja de ser prop y se escribe true siempre, así que la API no puede expresar un fondo audible. No estaba resuelto, estaba evitado: con muted={false} el clip sonaba FUERA de arts/sound — ni bus content, ni audio focus, ni duck del bus ui, ni MediaSession, ni el slot sound de $prefs. Un clip que debe oírse es contenido: MediaPlayer, que ya es ciudadano de sound.media().

2. Lo que queda de tus firmas: DOS

De las cuatro, dos quedaron ejecutadas en §7.decies (la escala del scrim, ordenada con tokens propios; la banda de feature-split, por sección y enmendada en los tres sitios del plan más el de calidad). Quedan:

  • ⛔ Borrar src/uix/eidos/components/backdrop/ — D-BG.1 lo firmó y no lo usa nadie (sólo se cita como baseline en el README de Background y en tres docs de proceso, citas históricas que se conservan). No lo he tocado: la regla del repo exige orden de borrado explícita, y «ejecuta el plan» no la sustituye. Una palabra tuya y va.
  • ⛔ El techo de contraste del scrim, con las cifras corregidas. Lo que había escrito era falso por la mitad: el README asumía una tinta de α 0,66 y --color-overlay trae 0,42, así que el default no da 2,10:1 sobre foto blanca sino 1,48:1, y el paso más fuerte no da 4,42 sino 2,14. Peor aún, hay un techo: xl gasta la tinta entera y llega a 2,66:1, de modo que ningún paso nuevo puede alcanzar AA — el límite es el alpha del token, no la escala. Las tres salidas, medidas por píxel:
    1. que el velo deje de heredar ese alpha (con tinta opaca los mismos pesos dan 5,45:1 a 0,65 y 9,22:1 a 0,80) — cambia qué ES un scrim y su relación con el velo del modal;
    2. doctrinar que la respuesta es el scrim graduado, y que sobre foto clara la copia se pone en el extremo calmado;
    3. dejarlo dicho y que cada consumidor oscurezca su propia foto. Es decisión sobre la naturaleza del componente, no sobre un número.

3. Tareas de otros ejes que este abrió

  • Ambient honrando la pausa (D-BG.8): el canon publica el contexto (paused, reduced, seen); el pack lo lee y llama handle.pause(). Es tarea DEL PACK — la dependencia corre pack → framework y nunca al revés.
  • Un puerto de estado para <video> compartido: el framework tiene contrato de carga para <img> (ImageProvider en soma/layers) y ninguno para vídeo. Hoy ScrollFrames escucha a mano y Background.Video también. Dos consumidores es el umbral que este repo usa para extraer una capa. (Anotado en next-features.md §11.)
  • Los huecos Display / Link bajo data-on siguen siendo candidatos de canon aparte, como los dejó el hero.

Lo que este eje enseñó, y conviene no volver a aprender

  1. A30 no es estilo, es supervivencia. Registrarse con el padre desde un $effect escribe su estado en fase de efectos, el hermano que lo lee re-entra y el flush no cierra: effect_update_depth_exceeded. No hace ruido — mata el efecto raíz, así que la superficie se pinta una vez y luego ignora todos los clics en silencio. La ley vive en declare.svelte.ts con sus dos mitades (registrar desde el init, y seguir el prop sin escribir en la primera pasada).
  2. revert-layer sin @layer es revert. Costó dos defectos distintos: la regla de anfitrión que no posicionaba (D-BG.16) y el flex de Box que no crecía. Cuando una declaración «no hace nada», mira si un shorthand vecino la borró.
  3. La demo destapa lo que una sonda no. El registro de «esta capa se mueve» era un hecho de montaje: encender animate en caliente no hacía aparecer el control de pausa. Invisible en una sonda, obvio con un interruptor.
  4. Mide antes de afirmar rendimiento. Escribí tres veces que el travel «va en el compositor»; animar una custom property registrada no se puede compositar. Lo cierto era «sin listener ni rAF», que es otra cosa.
  5. La decoración que parece mejor puede ser la ilegible. Dentro del panel sólido del cta, el glow hunde el titular blanco de 5,18:1 a 3,06:1.

Mapa de ficheros

Qué Dónde
Plan + decisiones firmadas docs/process/PLAN-background.md
El componente src/uix/eidos/components/background/ (README con todas las mediciones)
El morfo src/uix/morfo/components/background.ts
Los dos puertos que abrió src/arts/adom/scroll-progress.svelte.ts · reduced-data.svelte.ts
La regla de anfitrión src/uix/eidos/lib/render-css.ts → renderBackgroundHostBlock
La demo web/routes/uix/components/background/+page.svelte
Ledger del tier docs/process/AUDIT-blocks-ledger.md — filas A-100…A-105

Powered by TurnKey Linux.