El usuario dio por bueno el waveform contrastandolo con el reproductor de
Suno AI, que valida dos decisiones del gate: barras (D-WF.5, la lectura
SoundCloud) y los dos colores reproducido/pendiente como lo esencial —
Suno ni siquiera pinta buffered, que en el nuestro es opcional y arranca
apagado.
Queda anotado lo que costo la mirada, porque ninguna sonda lo habia visto:
el anillo del commit enmarcando el control entero (df86a4e50) y el
buffered rechazado DOS veces, primero por color y luego por forma
(905012507). F1-F6 cerradas.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
F4 (eidos): wrapper raiz que carga slider.css + waveform.css y resuelve
data-size por ActiveEidos; Wave passthrough; recipe con bars = stroke en
UNIDADES DE VIEWBOX (el svg estira con preserveAspectRatio="none", asi el
ciclo barra/hueco sobrevive) y wave = fill sin stroke; espejo RTL en CSS;
el Slider embebido en scope con track/range transparentes y el thumb
convertido en playhead de 2px a alto completo. Tokens waveform:{height-*,
bar-width, color, color-buffered, color-played, playhead-width} —
playhead-width y color-buffered van ANADIDOS sobre la lista firmada en el
gate, ambos declarados en el README.
F5 (demo + dossier): /uix/components/waveform con picos REALES (fetch de
/sounds/*.wav -> uix.sound.decode -> uix.sound.peaks), cada prop como
control vivo, READMEs de soma y eidos. Fix arrastrado de F3: `dir` no se
reenviaba al Slider embebido.
BUFFERED — cambio de forma (decision del usuario tras ver el render).
El primer intento re-tintaba el SecondaryRange del Slider; el usuario lo
rechazo ("el secundario no puede ser del mismo color") y la auditoria
encontro por que ningun color lo arreglaba del todo: ese part es una BARRA
de 6px con la geometria del track, y sobre una pintura de barras al ~58%
de ciclo el 42% de su area cae sobre fondo desnudo, ademas de tenir el
tramo ya reproducido. Ahora el buffered es una TERCERA COPIA del mismo
path, recortada a su fraccion — es la onda un escalon mas alla, la lectura
de SoundCloud/wavesurfer. El waveform ya no monta Slider.SecondaryRange.
Escalera: color 28% -> color-buffered 55% -> color-played acento.
Guard nuevo (bufferedFraction: ausente sin valor, clampado, dominio
degenerado) VISTO EN ROJO desconectando el cableado antes de darlo por
bueno.
Verificado: check 75 = baseline, 0 propios; 5/5 soma + 4/4 morfo;
component:audit --only waveform PASS; eidos-lint 0 invalidos;
recipe-css-contract y motion.test verdes; docs:check 0; prettier limpio.
Queda F6 (mirada del usuario): el panel del navegador no composita, asi
que la verificacion fue por sonda del DOM, sin captura.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Waveform (gate D-WF.1-8 firmado, PLAN-waveform.md): la visualizacion de audio
cuyo contrato es el DATO y su pintura — la interaccion ES el Slider canonico.
- F1: uix.sound.peaks(buffer, buckets) en el art — max absoluto por bucket
sobre todos los canales, normalizado por el bucket mas alto (documentado);
puro, sin contexto. El flujo natural decode -> peaks en la misma puerta.
- F2: morfo con DOS partes (provider con data-shape/data-readonly; wave svg
presentacional aria-hidden), SIN campo events y expression 'delegated' —
re-declarar drag/commit seria la duplicacion que D-AP2.13 retiro del
player. El part Cursor del borrador, PODADO como especulativo (el thumb
del Slider embebido ES el playhead).
- F3: WaveformProvider con la geometria testeable (buildWavePath: bars =
trazos verticales con piso perceptivo 0.5 — el silencio pinta linea fina,
no hueco — y ancho de barra via stroke-width de la recipe; wave = area()
de $libs/plots espejada) + progressFraction clampada; wrapper que compone
el Slider COMPLETO (SecondaryRange G-2 + Range + Thumb, con valueText G-1
y readonly/disabled/step reenviados); Wave con el clip de progreso (dos
copias del mismo path, hooks eidos-only -played/-remaining).
Verificacion: art+port 42/42 - morfo 4/4 - soma 4/4 - check 0 propios en los
arboles del waveform - vocabulario limpio. Quedan F4 (recipe eidos + tokens,
disenada en el CONTINUE), F5 (demo+dossier+audit) y F6 (mirada del usuario).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>