@ -305,8 +305,44 @@ De este hilo quedan **cuatro cosas, y ninguna es código a ciegas**:
4. **El rojo de `audio-player` en `lint.test.ts`** — guard compartido, decisión
pendiente entre categoría nueva o `KNOWN_MISSING_MORFO` .
## Sesión 2026-08-04 (tarde) — cuatro entregas, todas verificadas en navegador
Commits `ee51172d8` · `5cbb03904` · `dbd239bcc` (+ el waveform, `127c4c95b` ).
El detalle está en los mensajes y en el README de eidos del componente; aquí
sólo lo que cambia el mapa.
1. **El waveform ya se VE en la demo.** No se veía por dos causas encadenadas:
el scrubber compone el Waveform de _soma_ , así que su envoltorio de eidos
nunca montaba y **su receta no se importaba** (onda sin estilar, 255px de
alto); y la muestra local era `whoosh.wav` , de **0,18 s** . El player carga
ahora `waveform.css` igual que ya cargaba `slider.css` , y la demo usa
`/music/t2.wav` (2:44). ⚠️ **Lección reutilizable** : componer un primitivo
desde soma deja su receta fuera — la carga el componente que lo compone.
2. **La velocidad ya se puede BAJAR** (`RateFloat`). El `RateButton` sólo subía
y recortaba en `2× ` . Ahora `AudioLayout` compone un `DropdownMenu` +
`RadioGroup` ; el disparador sigue siendo el `RateButton` real, con su ciclado
anulado vía `preventDefault()` en la costura. ⚠️ Dos defectos del panel
portado, los mismos que el float de volumen: el suelo de `12rem` del menú, y
**la etiqueta redimensionaba el botón y desplazaba la botonera** (ancho fijo
`4.6em` , medido 64·74·88·121px).
3. **API de eventos para la app** — `onPlay` · `onPause` · `onEnded` ·
`onError` . Antes no había NINGUNA: la única vía era enchufar un
`MediaProvider` entero. Dos divergencias deliberadas respecto a la capa
perceptual, las dos en el test: el `pause` del final natural no se reporta, y
`onEnded` SÍ dispara para un final por salto (que `commit-complete` exime).
4. **Transporte de lista** — `RestartButton` + `SkipButton` (morfo **25** partes,
las dos opt-in, sin eventos sema nuevos por decisión del usuario). El player
**no tiene cola a propósito** : `onPrevious` /`onNext` piden y la app cambia el
`src` . Una dirección sin manejador se pinta deshabilitada, que es justo el
aspecto de los extremos de una cola.
⚠️ **Otra sesión commitea en esta misma rama** (hilo de dirección): verificar
`HEAD` antes de dar nada por perdido, y `git reset -q` + `add` sólo lo propio.
El siguiente ítem de CÓDIGO del componente no es de este hilo sino del handoff
hermano: ** `settings-button` **, lo único que separa al morfo de 23/23.
hermano: ** `settings-button` **, lo único que separa al morfo de 25/25 — y su
alcance ENCOGIÓ: la velocidad ya tiene su lista, así que al menú de ajustes sólo
le quedan calidad y pista.
Ver [`CONTINUE-player-rtl.md` ](./CONTINUE-player-rtl.md ) §0.
## Trampas de este repo (verificadas a base de perder tiempo)