From 77361eaf03476aae23be5b55ee8ecdd1b2010a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olle=20M=C3=A5nsson?= <31876997+ollema@users.noreply.github.com> Date: Sat, 28 Oct 2023 20:15:07 +0200 Subject: [PATCH 1/2] track changes --- src/lib/mode-watcher.svelte | 28 +++++++++++++++++++++++++++- src/lib/mode.ts | 20 ++++++++++++++------ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/lib/mode-watcher.svelte b/src/lib/mode-watcher.svelte index f258102..68b6f71 100644 --- a/src/lib/mode-watcher.svelte +++ b/src/lib/mode-watcher.svelte @@ -1,11 +1,37 @@ diff --git a/src/lib/mode.ts b/src/lib/mode.ts index a34cb49..9a5b1f7 100644 --- a/src/lib/mode.ts +++ b/src/lib/mode.ts @@ -1,14 +1,14 @@ // Modified version of the light switch by: https://skeleton.dev import { persisted } from 'svelte-persisted-store'; -import { readonly } from 'svelte/store'; +import { get, readonly } from 'svelte/store'; /** * Stores */ const systemPrefersMode = persisted<'dark' | 'light'>('systemPrefersMode', 'dark'); -const userPrefersMode = persisted<'dark' | 'light' | undefined>('userPrefersMode', undefined); +const userPrefersMode = persisted<'dark' | 'light' | 'system'>('userPrefersMode', 'system'); const activeMode = persisted<'dark' | 'light'>('mode', 'dark'); /** Readonly store with either `"light"` or `"dark"` depending on the active mode */ @@ -27,12 +27,17 @@ export function getSystemPrefersMode(): 'dark' | 'light' { return prefersLightMode; } +/** Get the user preference */ +export function getUserPrefersMode(): 'dark' | 'light' | 'system' { + return get(userPrefersMode); +} + /** * Setters */ /** Set the user preference */ -function setUserPrefersMode(value: 'dark' | 'light' | undefined): void { +function setUserPrefersMode(value: 'dark' | 'light' | 'system'): void { userPrefersMode.set(value); } @@ -67,14 +72,17 @@ export function setInitialClassState() { let userPref: string | null = null; try { - userPref = JSON.parse(localStorage.getItem('userPrefersMode') || 'null'); + userPref = JSON.parse(localStorage.getItem('userPrefersMode') || 'system'); } catch { // ignore JSON parsing errors } const systemPref = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'; - if (userPref === 'light' || (userPref === null && systemPref === 'light')) { + if ( + userPref === 'light' || + ((userPref === 'system' || userPref === null) && systemPref === 'light') + ) { htmlEl.classList.remove('dark'); htmlEl.style.colorScheme = 'light'; } else { @@ -106,7 +114,7 @@ export function setMode(mode: 'dark' | 'light'): void { /** Reset the mode to operating system preference */ export function resetMode(): void { activeMode.update(() => { - setUserPrefersMode(undefined); + setUserPrefersMode('system'); const next = getSystemPrefersMode(); setActiveMode(next); return next; From 2bb9d316cde18c26d4db1afef0b523f7c8983ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olle=20M=C3=A5nsson?= <31876997+ollema@users.noreply.github.com> Date: Sat, 28 Oct 2023 20:18:58 +0200 Subject: [PATCH 2/2] add changeset --- .changeset/serious-teachers-cry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/serious-teachers-cry.md diff --git a/.changeset/serious-teachers-cry.md b/.changeset/serious-teachers-cry.md new file mode 100644 index 0000000..911436d --- /dev/null +++ b/.changeset/serious-teachers-cry.md @@ -0,0 +1,5 @@ +--- +'mode-watcher': patch +--- + +Add `track` prop which allows `` to track changes in system preference