Commit 3dfc4b2
authored
Fix: fondo negro en modales del widget de pretalx (#217)
## Resumen
Reemplaza el hack de inyección de estilos en el shadow DOM del widget de
`pretalx-schedule` por una única declaración CSS (`color-scheme: light`)
en el host. Resuelve el fondo negro que aparecía en los modales internos
(filter bottom sheet y diálogo de detalle de sesión) cuando el navegador
está en dark mode.
## Problema
Al cargar la página `/programa`, los modales internos del widget de
Pretalx se veían con fondo negro y texto casi ilegible — incluso con el
hack previo, el modal de detalle de sesión ("Taller Django Girls", etc.)
seguía mostrándose en negro.
## Causa raíz
- `pretalx-schedule` renderiza sus modales (`SessionModal`,
`FilterBottomSheet`) con un `<dialog>` nativo **sin `background-color`
declarado**.
- Sin color explícito, el navegador le aplica el system color `Canvas`,
que es **negro en dark mode**.
- El hack anterior (`<script is:inline>` con `MutationObserver` que
inyectaba un `<style>` dentro del shadow root) solo atacaba
`#filter-bottom-sheet-dialog` con un selector hardcoded — frágil y
silenciosamente incompleto para el modal de detalle.
- Además, `pretalx-schedule` no expone `::part()`, ni slots, ni
variables CSS para el fondo de modales. La única palanca real de theming
"externa" es el set de custom properties `--pretalx-clr-*` que ya se
venían usando para el color de marca.
## Solución
`color-scheme` es una propiedad CSS **heredable** que cruza la frontera
del shadow DOM sin necesidad de JavaScript. Aplicada al host
`<pretalx-schedule>`, fuerza al navegador a usar los UA defaults del
esquema light (Canvas blanco, CanvasText negro, `::backdrop`
semi-transparente estándar) en todo el subárbol, incluidos los
`<dialog>` internos.
```diff
- style="--pretalx-clr-primary: #03004b"
+ style="--pretalx-clr-primary: #03004b; color-scheme: light"
```
Y se elimina el bloque `<script is:inline>` completo de
`src/pages/[lang]/programa.astro` (la función
`injectPretalxDialogStyles`, el `MutationObserver` observando
`document.body` con `subtree: true`, el listener de
`customElements.whenDefined` y el de `astro:page-load`).
## Por qué es mejor que el hack anterior
- **Menos código**: 1 atributo CSS vs 23 líneas de JS.
- **Sin tocar shadow DOM**: respetamos el encapsulamiento que el
componente promete.
- **Inmune a cambios upstream**: los IDs internos de Pretalx pueden
cambiar entre versiones sin afectarnos.
- **Cero overhead en runtime**: nos deshacemos del `MutationObserver`
con `subtree: true` que observaba todo el `document.body` (anti-patrón
de performance, se disparaba en cada mutación del DOM).
## Verificación
Probado en browser con dark mode activo:
- ✅ Modal de detalle de sesión ("Taller Django Girls"): fondo blanco,
texto negro, links legibles
- ✅ Filter bottom sheet: sigue funcionando con su overlay oscuro
- ✅ Tabla principal del schedule: sin cambios visuales
- ✅ `pnpm astro check` y `prettier --check` pasan sin errores
## Trabajo futuro (opcional)
Abrir issue en [pretalx/pretalx](https://github.com/pretalx/pretalx)
pidiendo que `SessionModal.vue` y `FilterBottomSheet.vue` expongan
`--pretalx-clr-modal-bg`, `--pretalx-clr-modal-text` y
`--pretalx-clr-backdrop` en `:host` para que los consumidores podamos
tematizar los modales sin depender de UA color-scheme. Sería un cambio
de ~5 líneas en el source del componente.1 parent edca606 commit 3dfc4b2
4 files changed
Lines changed: 36 additions & 90 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | 19 | | |
0 commit comments