Skip to content

Commit 8c2fde7

Browse files
itziarZGizg
andauthored
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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "2026.es.pycon.org",
3-
"version": "1.17.3",
3+
"version": "1.17.4",
44
"description": "",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)