Преглед изворни кода

implement system wide light/dark mode option 🔦

Danny Liu пре 1 година
родитељ
комит
b94dc767ff
1 измењених фајлова са 37 додато и 17 уклоњено
  1. 37 17
      src/lib/components/chat/Settings/General.svelte

+ 37 - 17
src/lib/components/chat/Settings/General.svelte

@@ -18,6 +18,41 @@
 
 	let showAdvanced = false;
 
+	window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
+		if (theme === 'system') {
+			updateSystemTheme();
+		}
+	});
+
+	function updateSystemTheme() {
+		const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
+		const systemTheme = isDarkMode ? 'dark' : 'light';
+		applyTheme(systemTheme);
+	}
+
+	function applyTheme(theme: string) {
+		localStorage.theme = theme;
+		const themeClassList = document.documentElement.classList;
+		if (theme === 'system') {
+			updateSystemTheme();
+			return;
+		}
+
+		themes
+			.filter((e) => e !== theme)
+			.forEach((e) => {
+				e.split(' ').forEach((e) => {
+					document.documentElement.classList.remove(e);
+				});
+			});
+
+		theme.split(' ').forEach((e) => {
+			document.documentElement.classList.add(e);
+		});
+
+		console.log(theme)
+	}
+
 	const toggleNotification = async () => {
 		const permission = await Notification.requestPermission();
 
@@ -123,24 +158,9 @@
 						class="w-fit pr-8 rounded py-2 px-2 text-xs bg-transparent outline-none text-right"
 						bind:value={theme}
 						placeholder="Select a theme"
-						on:change={(e) => {
-							localStorage.theme = theme;
-
-							themes
-								.filter((e) => e !== theme)
-								.forEach((e) => {
-									e.split(' ').forEach((e) => {
-										document.documentElement.classList.remove(e);
-									});
-								});
-
-							theme.split(' ').forEach((e) => {
-								document.documentElement.classList.add(e);
-							});
-
-							console.log(theme);
-						}}
+						on:change="{() => applyTheme(theme)}"
 					>
+						<option value="system">System</option>
 						<option value="dark">Dark</option>
 						<option value="light">Light</option>
 						<option value="rose-pine dark">Rosé Pine</option>