Commit 8c2fde7
Programa: vista accesible + mejoras de a11y del widget de Pretalx (#215)
## Resumen
Closes #216 con un approach de dos puntas:
1. **Tanda 1 (`bb27cbc`)**: parches de a11y sobre el widget embebido
(skip link, ARIA en dialog, focus restoration, modality script, etc.)
2. **Tanda 2 (`39584b0`)**: vista de **lista semántica** renderizada
server-side desde la API de Pretalx. Es la solución de fondo — un grid
CSS complejo no se puede hacer accesible desde afuera con parches ARIA.
El widget sigue existiendo como vista opt-in para usuarios visuales,
pero **la lista accesible es el default**.
## Cambios principales
### Vista accesible (default)
- `<ol>` por día con `<article>` por sesión
- `<time datetime>`, `<h3>`, `<dl>` para metadata
- `<details>` para abstracts colapsables
- Atributo `lang` en abstracts según idioma del talk
- `<fieldset>` + radios para el toggle, persiste en `localStorage`
### Widget de Pretalx (vista opt-in)
- Skip link global en el Layout
- Live region anunciando el conteo de sesiones al filtrar
- ARIA reforzado en el dialog de filtros vía Shadow DOM script
- Labels accesibles para search input y timezone select
- Focus restoration al cerrar el dialog
- Modality script: `body[modality=keyboard]` (atributo directo)
- Override de `--pretalx-clr-success` a `#2e7d32` (distinguible para
deuteranopia)
### Data layer
- `src/lib/schedule.ts` — fetch del schedule en build time, con fallback
amigable
- `src/types/schedule.ts` — tipos del export de Pretalx
- Usa el endpoint legacy `schedule/export/schedule.json` (todo viene
resuelto: room names, tracks, types en string, ya agrupado por día)
### i18n
- `src/i18n/menu/{es,en,ca}.ts` — `skipToContent`
- `src/i18n/programa/{es,en,ca}.ts` — `a11y` (status, labels) + `list`
(toggle, day, speakers, room, abstract, empty state)
## Archivos
| Archivo | Cambio |
|---|---|
| `src/types/schedule.ts` | **nuevo** — tipos TS del export |
| `src/lib/schedule.ts` | **nuevo** — fetch + normalización |
| `src/components/ScheduleList.astro` | **nuevo** — render semántico |
| `src/components/ProgramaPage.astro` | reescrito — toggle + ambas
vistas |
| `src/pages/[lang]/programa.astro` | simplificado — wrapper fino |
| `src/layouts/Layout.astro` | skip link + `.skip-link` + `.sr-only` |
| `src/i18n/menu/{es,en,ca}.ts` | +1 string c/u |
| `src/i18n/programa/{es,en,ca}.ts` | +22 strings c/u |
## Bugs encontrados durante implementación
El widget de Pretalx es Vue 3 compilado con
`attachShadow({mode:'open'})`, **no** renderiza en light DOM como se
asumió inicialmente. Implicó 3 correcciones:
1. **Queries en shadow root** —
`pretalx-schedule.querySelector('#filter-bottom-sheet-dialog')` no
encuentra el dialog porque está dentro del shadow root. Helper
`$inWidget()` prueba light DOM y luego `shadowRoot.querySelector`.
2. **`body[modality=keyboard]`** es atributo directo, no
`data-modality`.
3. **CSS custom properties sí cruzan el shadow boundary** pero los
selectores de clase no. El override de `--pretalx-clr-success` va en el
atributo `style` del host.
## Testing
- [x] `pnpm format` → OK
- [x] `pnpm exec astro check` → 0 errors, 0 warnings
- [ ] **Pendiente (manual):**
- [ ] NVDA en `/es/programa` → ¿la lista suena natural al navegar con
flechas?
- [ ] VoiceOver en `/ca/programa` → ¿pronunciación correcta del catalán?
- [ ] Toggle a "Grilla visual" → ¿el widget carga con sus parches?
- [ ] Refrescar → ¿se mantiene la elección del usuario?
- [ ] axe-core en las 3 locales → 0 violaciones serias
- [ ] Simular API caída (cambiar URL en `schedule.ts`) → ¿se ve el
fallback?
## Lo que dejé fuera (a propósito)
- **Breaks** (coffee/lunch) — el legacy export no los trae, el REST sí.
Para v1 alcanza con talks/workshops/keynotes. Si los piden, mergeamos
REST+legacy por `start + room`.
- **Filtros propios** en la lista — actualmente se muestra todo por día.
Filtros por track/sala se pueden agregar.
- **Traducción de abstracts** — Pretalx no expone traducciones de los
abstracts. Quedan en el idioma original del talk (en/es/ca según el
campo `language`).
---------
Co-authored-by: izg <izg@example.com>1 parent 6277be9 commit 8c2fde7
13 files changed
Lines changed: 1142 additions & 25 deletions
File tree
- src
- components
- i18n
- programa
- layouts
- lib
- pages/[lang]
- types
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
0 commit comments