diff --git a/src/component/settings.svelte b/src/component/settings.svelte index 5e5aed3..4960936 100644 --- a/src/component/settings.svelte +++ b/src/component/settings.svelte @@ -3,6 +3,8 @@ import { themes } from "../script/theme.ts"; import { setCookie, getCookie } from "../script/cookie.ts"; + let panelRef = $state() as HTMLElement; + let lightButtonIcon = $state() as HTMLElement; let darkButtonIcon = $state() as HTMLElement; let autoButtonIcon = $state() as HTMLElement; @@ -13,32 +15,28 @@ let { themeOption = $bindable() } = $props(); + let expanded = $state(false); + let currentIcon = $state("bi-circle-half"); + + let darkTheme: CallableFunction = getContext("darkTheme"); + function setThemeOption(newThemeOption: string) { + expanded = false; setCookie("theme", newThemeOption); + themeOption = newThemeOption; + switch (newThemeOption) { case themes.LIGHT: - themeOption = themes.LIGHT; - - lightButtonIcon.classList.replace("bi-sun", "bi-sun-fill"); - darkButtonIcon.classList.replace("bi-moon-fill", "bi-moon"); - autoButtonIcon.classList.replace("bi-display-fill", "bi-display"); + currentIcon = "bi-sun-fill"; break; case themes.DARK: - themeOption = themes.DARK; - - lightButtonIcon.classList.replace("bi-sun-fill", "bi-sun"); - darkButtonIcon.classList.replace("bi-moon", "bi-moon-fill"); - autoButtonIcon.classList.replace("bi-display-fill", "bi-display"); + currentIcon = "bi-moon-fill"; break; case themes.AUTO: - themeOption = themes.AUTO; - - lightButtonIcon.classList.replace("bi-sun-fill", "bi-sun"); - darkButtonIcon.classList.replace("bi-moon-fill", "bi-moon"); - autoButtonIcon.classList.replace("bi-display", "bi-display-fill"); + currentIcon = "bi-circle-half"; break; default: - console.error("setThemeOption was passed a value that is not a theme"); + console.error("Invalid theme option"); } } @@ -47,59 +45,113 @@ if (Object.values(themes).includes(themeCookie)) { setThemeOption(themeCookie); } + + function handleClickOutside(event: MouseEvent) { + if (panelRef && !panelRef.contains(event.target as HTMLElement)) { + expanded = false; + } + } + + document.addEventListener("mousedown", handleClickOutside); + + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; }); - let darkTheme: CallableFunction = getContext("darkTheme"); + function togglePanel() { + expanded = !expanded; + } -