Skip to content

Commit 3dfc4b2

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

File tree

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "2026.es.pycon.org",
3-
"version": "1.17.1",
3+
"version": "1.17.2",
44
"description": "",
55
"main": "index.js",
66
"scripts": {
@@ -19,10 +19,10 @@
1919
"@astrojs/sitemap": "3.7.3",
2020
"@fontsource-variable/jetbrains-mono": "5.2.8",
2121
"@fontsource-variable/outfit": "5.2.8",
22-
"@lucide/astro": "1.23.0",
22+
"@lucide/astro": "1.24.0",
2323
"@tailwindcss/vite": "4.3.2",
2424
"animejs": "4.5.0",
25-
"astro": "7.0.6",
25+
"astro": "7.0.7",
2626
"tailwindcss": "4.3.2"
2727
},
2828
"devDependencies": {
@@ -31,7 +31,7 @@
3131
"@commitlint/config-conventional": "21.2.0",
3232
"husky": "9.1.7",
3333
"lint-staged": "17.0.8",
34-
"prettier": "3.9.4",
34+
"prettier": "3.9.5",
3535
"prettier-plugin-astro": "0.14.1",
3636
"typescript": "6.0.3"
3737
},

pnpm-lock.yaml

Lines changed: 31 additions & 62 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/ProgramaPage.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const menuT = menuTexts[lang as keyof typeof menuTexts]
1818
event-url="https://pretalx.com/pycones-2026/"
1919
locale={t.locale}
2020
format="grid"
21-
style="--pretalx-clr-primary: #03004b"></pretalx-schedule>
21+
style="--pretalx-clr-primary: #03004b; color-scheme: light"></pretalx-schedule>
2222

2323
<noscript>
2424
<div class="pretalx-widget">

src/pages/[lang]/programa.astro

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,4 @@ const t = programaTexts[(lang || 'es') as keyof typeof programaTexts]
1616
<ProgramaPage lang={lang || 'es'} />
1717
</div>
1818
<script is:inline src="https://pretalx.com/pycones-2026/widgets/schedule.js"></script>
19-
<script is:inline>
20-
function injectPretalxDialogStyles() {
21-
const schedule = document.querySelector('pretalx-schedule')
22-
if (!schedule?.shadowRoot) return
23-
if (schedule.shadowRoot.querySelector('#pycones-dialog-fix')) return
24-
const style = document.createElement('style')
25-
style.id = 'pycones-dialog-fix'
26-
style.textContent = `
27-
#filter-bottom-sheet-dialog,
28-
#filter-bottom-sheet-dialog .dialog-inner {
29-
background: #fff !important;
30-
color: #0d0f10 !important;
31-
}
32-
`
33-
schedule.shadowRoot.appendChild(style)
34-
}
35-
customElements.whenDefined('pretalx-schedule').then(injectPretalxDialogStyles)
36-
new MutationObserver(injectPretalxDialogStyles).observe(document.body, {
37-
childList: true,
38-
subtree: true,
39-
})
40-
document.addEventListener('astro:page-load', injectPretalxDialogStyles)
41-
</script>
4219
</Layout>

0 commit comments

Comments
 (0)