diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte index c2de5ad3f8..550f3bb9d3 100644 --- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte @@ -31,7 +31,10 @@ RefreshCw, Save, Smartphone, - FileClock + FileClock, + Sun, + Moon, + SunMoon } from 'lucide-svelte' import { createEventDispatcher, getContext } from 'svelte' import { Pane, Splitpanes } from 'svelte-splitpanes' @@ -140,7 +143,8 @@ staticExporter, errorByComponent, openDebugRun, - mode + mode, + darkMode } = getContext('AppViewerContext') const { history, jobsDrawerOpen, refreshComponents } = @@ -199,7 +203,7 @@ async function computeTriggerables() { const items = allItems($app.grid, $app.subgrids) - console.log('items', items) + console.debug('items', items) const allTriggers: ([string, TriggerableV2] | undefined)[] = (await Promise.all( items @@ -428,12 +432,14 @@ savedApp && $app && orderedJsonStringify(deployedValue) === - orderedJsonStringify(replaceFalseWithUndefined({ - summary: $summary, - value: $app, - path: newPath || savedApp.draft?.path || savedApp.path, - policy - })) + orderedJsonStringify( + replaceFalseWithUndefined({ + summary: $summary, + value: $app, + path: newPath || savedApp.draft?.path || savedApp.path, + policy + }) + ) ) { await updateApp(npath) } else { @@ -867,6 +873,21 @@ } const dispatch = createEventDispatcher() + + function setTheme(newDarkMode: boolean | undefined) { + if ( + newDarkMode === true || + (newDarkMode === null && window.localStorage.getItem('dark-mode') === 'dark') + ) { + document.documentElement.classList.add('dark') + } else if (newDarkMode === false) { + document.documentElement.classList.remove('dark') + } + $darkMode = newDarkMode ?? false + } + + let priorDarkMode = document.documentElement.classList.contains('dark') + setTheme($app?.darkMode) @@ -881,6 +902,9 @@ path: newPath || savedApp?.draft?.path || savedApp?.path, policy }} + additionalExitAction={() => { + setTheme(priorDarkMode) + }} /> {/if} + {#if $app} + { + setTheme(e.detail) + }} + bind:selected={$app.darkMode} + > + + + + + {/if}
- import { getContext, setContext } from 'svelte' + import { getContext, onDestroy, setContext } from 'svelte' import { get, writable, type Writable } from 'svelte/store' import { buildWorld } from '../rx' import type { @@ -73,7 +73,26 @@ resizeWindow() const parentWidth = writable(0) - const darkMode: Writable = writable(document.documentElement.classList.contains('dark')) + + let previousDarkMode = document.documentElement.classList.contains('dark') + const darkMode: Writable = writable(app?.darkMode ?? previousDarkMode) + + onDestroy(() => { + setTheme(previousDarkMode) + }) + + function setTheme(darkMode: boolean | undefined) { + if ( + darkMode === true || + (darkMode === null && window.localStorage.getItem('dark-mode') === 'dark') + ) { + document.documentElement.classList.add('dark') + } else if (darkMode === false) { + document.documentElement.classList.remove('dark') + } + } + + setTheme($darkMode) const state = writable({}) @@ -156,9 +175,11 @@ ? 'max-w-[640px]' : 'w-full min-w-[768px]' $: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-none' : '' + function onThemeChange() { - $darkMode = document.documentElement.classList.contains('dark') + $darkMode = app?.darkMode ?? document.documentElement.classList.contains('dark') } + const cssId = 'wm-global-style' let css: string | undefined = undefined diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 68456e239b..2bfb798be1 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -148,6 +148,7 @@ export type AppTheme = export type App = { grid: GridItem[] + darkMode?: boolean fullscreen: boolean norefreshbar?: boolean unusedInlineScripts: Array<{ diff --git a/frontend/src/lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte b/frontend/src/lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte index e8a314e0d0..6a90d05e4a 100644 --- a/frontend/src/lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte +++ b/frontend/src/lib/components/common/confirmationModal/UnsavedConfirmationModal.svelte @@ -16,6 +16,7 @@ export let savedValue: Value | undefined = undefined export let modifiedValue: Value | undefined = undefined export let diffDrawer: DiffDrawer | undefined = undefined + export let additionalExitAction: () => void = () => {} let bypassBeforeNavigate = false let open = false @@ -46,6 +47,7 @@ orderedJsonStringify(replaceFalseWithUndefined(current)) ) { bypassBeforeNavigate = true + additionalExitAction?.() gotoUrl(goingTo) } else { open = true @@ -69,6 +71,7 @@ on:confirmed={() => { if (goingTo) { bypassBeforeNavigate = true + additionalExitAction?.() gotoUrl(goingTo) } }} @@ -98,6 +101,7 @@ onClick: () => { if (goingTo) { bypassBeforeNavigate = true + additionalExitAction?.() gotoUrl(goingTo) } } diff --git a/frontend/src/lib/components/schema/AddProperty.svelte b/frontend/src/lib/components/schema/AddProperty.svelte index ef4757d935..5920d209fe 100644 --- a/frontend/src/lib/components/schema/AddProperty.svelte +++ b/frontend/src/lib/components/schema/AddProperty.svelte @@ -117,8 +117,6 @@ sendUserToast(argError, true) } - console.log(schema); - dispatch('change', schema) }