feat: add reactive theme watcher in root layout

This commit is contained in:
Frederic Cabassut
2026-03-21 08:47:20 +01:00
committed by Fred Cabassut
parent d6638260a3
commit cdf242a692
+30 -1
View File
@@ -1,9 +1,16 @@
<script lang="ts">
import '../app.css';
import { onMount } from 'svelte';
import { onMount, onDestroy } from 'svelte';
import { pwaInfo } from 'virtual:pwa-info';
import { browser } from '$app/environment';
import { getPreferences } from '$lib/stores/preferences.svelte.js';
import { applyTheme } from '$lib/utils/theme.svelte.js';
let { children } = $props();
let mediaQuery: MediaQueryList | undefined;
let systemListener: ((e: MediaQueryListEvent) => void) | undefined;
const prefs = $derived(getPreferences());
onMount(async () => {
if (pwaInfo) {
@@ -20,6 +27,28 @@
}
});
$effect(() => {
if (!browser) return;
const theme = prefs.theme ?? 'system';
applyTheme(theme);
// Listen for system preference changes when in system mode
if (systemListener && mediaQuery) {
mediaQuery.removeEventListener('change', systemListener);
}
if (theme === 'system') {
mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
systemListener = () => applyTheme('system');
mediaQuery.addEventListener('change', systemListener);
}
});
onDestroy(() => {
if (systemListener && mediaQuery) {
mediaQuery.removeEventListener('change', systemListener);
}
});
const webManifest = $derived(pwaInfo ? pwaInfo.webManifest.linkTag : '');
</script>