forked from open-webui/open-webui
		
	implement system wide light/dark mode option 🔦
This commit is contained in:
		
							parent
							
								
									d40edc09e1
								
							
						
					
					
						commit
						b94dc767ff
					
				
					 1 changed files with 37 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue