diff --git a/src/css/injected.scss b/src/css/injected.scss index 430c2c93..b3e22f73 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -12,6 +12,13 @@ font-family: Rubik, sans-serif !important; } +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; + pointer-events: none; +} + .hidden { display: none; } diff --git a/src/interface/components/themes/ThemeSelector.svelte b/src/interface/components/themes/ThemeSelector.svelte index dd1254ad..e8606c6f 100644 --- a/src/interface/components/themes/ThemeSelector.svelte +++ b/src/interface/components/themes/ThemeSelector.svelte @@ -14,12 +14,14 @@ let isDragging = $state(false); let tempTheme = $state(null); - const handleThemeClick = async (theme: CustomTheme) => { + const handleThemeClick = async (theme: CustomTheme, e: MouseEvent) => { if (isEditMode) return; if (theme.id === themes?.selectedTheme) { + themeManager.setTransitionPoint(e.clientX, e.clientY); await themeManager.disableTheme(); themes.selectedTheme = ''; } else { + themeManager.setTransitionPoint(e.clientX, e.clientY); await themeManager.setTheme(theme.id); if (!themes) return; themes.selectedTheme = theme.id; @@ -127,7 +129,7 @@ {#each themes.themes as theme (theme.id)} `); @@ -281,30 +282,42 @@ async function addDarkLightToggle() { updateAllColors(); - document - .getElementById("LightDarkModeButton")! - .addEventListener("click", async () => { - const darklightText = document.getElementById("darklighttooliptext"); + const lightDarkModeButtonElement = document.getElementById("LightDarkModeButton")!; - if ( - settingsState.originalDarkMode != undefined && - settingsState.selectedTheme - ) { - darklightText!.innerText = "Locked by current theme"; - - await delay(1000); - - darklightText!.innerText = GetLightDarkModeString(); - - return; - } - - settingsState.DarkMode = !settingsState.DarkMode; - - updateAllColors(); + lightDarkModeButtonElement.addEventListener("click", async () => { + const darklightText = document.getElementById("darklighttooliptext"); + if ( + settingsState.originalDarkMode != undefined && + settingsState.selectedTheme + ) { + darklightText!.innerText = "Locked by current theme"; + await delay(1000); darklightText!.innerText = GetLightDarkModeString(); - }); + return; + } + + if (!document.startViewTransition || !settingsState.animations || window.matchMedia("(prefers-reduced-motion: reduce)").matches) { + settingsState.DarkMode = !settingsState.DarkMode; + updateAllColors(); + + const newSvgContent = settingsState.DarkMode ? SUN_ICON_SVG : MOON_ICON_SVG; + const svgElement = lightDarkModeButtonElement.querySelector("svg"); + if (svgElement) svgElement.innerHTML = newSvgContent; + darklightText!.innerText = GetLightDarkModeString(); + return; + } + + settingsState.DarkMode = !settingsState.DarkMode; + + updateAllColors(); + + const newSvgContent = settingsState.DarkMode ? SUN_ICON_SVG : MOON_ICON_SVG; + const svgElement = lightDarkModeButtonElement.querySelector("svg"); + if (svgElement) svgElement.innerHTML = newSvgContent; + + darklightText!.innerText = GetLightDarkModeString(); + }); } function customizeMenuToggle() {