diff --git a/web/src/lib/actions/__test__/force-dark-theme.spec.ts b/web/src/lib/actions/__test__/force-dark-theme.spec.ts new file mode 100644 index 0000000000000..56f07884a5c5f --- /dev/null +++ b/web/src/lib/actions/__test__/force-dark-theme.spec.ts @@ -0,0 +1,38 @@ +import { Theme } from '$lib/constants'; +import { themeManager } from '$lib/managers/theme-manager.svelte'; +import { beforeEach, describe, expect, it } from 'vitest'; +import { forceDarkTheme } from '../force-dark-theme'; + +describe('forceDarkTheme Action', () => { + beforeEach(() => { + document.body.className = ''; + }); + + it('adds dark class on render, and removes it on destroy when light theme in use', () => { + themeManager.setTheme(Theme.LIGHT); + + expect(document.body.classList.contains('dark')).toBe(false); + + const node = document.createElement('div'); + const action = forceDarkTheme(node); + + expect(document.body.classList.contains('dark')).toBe(true); + + action?.destroy?.(); + expect(document.body.classList.contains('dark')).toBe(false); + }); + + it('does not remove dark class on destroy when dark theme in use', () => { + themeManager.setTheme(Theme.DARK); + + expect(document.body.classList.contains('dark')).toBe(true); + + const node = document.createElement('div'); + const action = forceDarkTheme(node); + + expect(document.body.classList.contains('dark')).toBe(true); + + action?.destroy?.(); + expect(document.body.classList.contains('dark')).toBe(true); + }); +}); diff --git a/web/src/lib/actions/force-dark-theme.ts b/web/src/lib/actions/force-dark-theme.ts new file mode 100644 index 0000000000000..396d082ee0dd1 --- /dev/null +++ b/web/src/lib/actions/force-dark-theme.ts @@ -0,0 +1,18 @@ +import { themeManager } from '$lib/managers/theme-manager.svelte'; +import type { Action } from 'svelte/action'; + +/** + * Ensures the 'dark' theme is used while the element is mounted, which makes + * Safari 26 darken the browser UI. More "cinema" like UX for AssetViewer. + */ +export const forceDarkTheme: Action = (_) => { + document.body.classList.add('dark'); + + return { + destroy() { + if (!themeManager.isDark) { + document.body.classList.remove('dark'); + } + }, + }; +}; diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 848870b654e2b..0745fe3ff7823 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -1,6 +1,7 @@