diff --git a/plugs/editor/editor.ts b/plugs/editor/editor.ts index 92ff83249..f98a1f0e4 100644 --- a/plugs/editor/editor.ts +++ b/plugs/editor/editor.ts @@ -35,7 +35,7 @@ export async function openAllNavigator() { } export async function toggleDarkMode() { - let darkMode = await clientStore.get("darkMode"); + let darkMode = await editor.getUiOption("darkMode"); darkMode = !darkMode; await clientStore.set("darkMode", darkMode); await editor.reloadUI(); diff --git a/web/components/basic_modals.tsx b/web/components/basic_modals.tsx index 0d2f466c4..eb20b5ba2 100644 --- a/web/components/basic_modals.tsx +++ b/web/components/basic_modals.tsx @@ -17,7 +17,7 @@ export function Prompt({ message: string; defaultValue?: string; vimMode: boolean; - darkMode: boolean; + darkMode: boolean | undefined; completer: (context: CompletionContext) => Promise; callback: (value?: string) => void; }) { diff --git a/web/components/command_palette.tsx b/web/components/command_palette.tsx index 9a91a5832..f0d84afec 100644 --- a/web/components/command_palette.tsx +++ b/web/components/command_palette.tsx @@ -21,7 +21,7 @@ export function CommandPalette({ commands: Map; recentCommands: Map; vimMode: boolean; - darkMode: boolean; + darkMode: boolean | undefined; completer: (context: CompletionContext) => Promise; onTrigger: (command: AppCommand | undefined) => void; config: Config; diff --git a/web/components/filter.tsx b/web/components/filter.tsx index c90553f43..2e3edf6e5 100644 --- a/web/components/filter.tsx +++ b/web/components/filter.tsx @@ -36,7 +36,7 @@ export function FilterList({ preFilter?: (options: FilterOption[], phrase: string) => FilterOption[]; phrasePreprocessor?: (phrase: string) => string; vimMode: boolean; - darkMode: boolean; + darkMode: boolean | undefined; completer: (context: CompletionContext) => Promise; allowNew?: boolean; completePrefix?: string; diff --git a/web/components/mini_editor.tsx b/web/components/mini_editor.tsx index 5d0a79910..7dec064ef 100644 --- a/web/components/mini_editor.tsx +++ b/web/components/mini_editor.tsx @@ -47,7 +47,7 @@ export function MiniEditor( text: string; placeholderText?: string; vimMode: boolean; - darkMode: boolean; + darkMode: boolean | undefined; vimStartInInsertMode?: boolean; focus?: boolean; completer?: ( diff --git a/web/components/page_navigator.tsx b/web/components/page_navigator.tsx index ac2a3997f..180eae94f 100644 --- a/web/components/page_navigator.tsx +++ b/web/components/page_navigator.tsx @@ -29,7 +29,7 @@ export function PageNavigator({ allPages: PageMeta[]; extensions: Set; vimMode: boolean; - darkMode: boolean; + darkMode: boolean | undefined; mode: "page" | "meta" | "document" | "all"; onNavigate: (page: string | undefined, type: "document" | "page") => void; onModeSwitch: (mode: "page" | "meta" | "document" | "all") => void; diff --git a/web/components/top_bar.tsx b/web/components/top_bar.tsx index d85a8c72c..b0bd77874 100644 --- a/web/components/top_bar.tsx +++ b/web/components/top_bar.tsx @@ -40,7 +40,7 @@ export function TopBar({ syncFailures: number; isLoading: boolean; notifications: Notification[]; - darkMode: boolean; + darkMode: boolean | undefined; vimMode: boolean; progressPerc?: number; onRename: (newName?: string) => Promise; diff --git a/web/editor_ui.tsx b/web/editor_ui.tsx index f59cbaea5..ec13b0cbf 100644 --- a/web/editor_ui.tsx +++ b/web/editor_ui.tsx @@ -15,6 +15,7 @@ import type { Client } from "./client.ts"; import { Panel } from "./components/panel.tsx"; import { safeRun, sleep } from "../lib/async.ts"; import { parseCommand } from "$common/command.ts"; +import { clientStoreSyscalls } from "./syscalls/clientStore.ts"; import { defaultActionButtons } from "@silverbulletmd/silverbullet/type/config"; import type { FilterOption } from "@silverbulletmd/silverbullet/type/client"; @@ -97,12 +98,23 @@ export class MainUI { }, [viewState.uiOptions.vimMode]); useEffect(() => { - document.documentElement.dataset.theme = viewState.uiOptions.darkMode - ? "dark" - : "light"; - if (this.client.isDocumentEditor()) { - this.client.documentEditor.updateTheme(); - } + clientStoreSyscalls(client.stateDataStore)["clientStore.get"]({}, "darkMode").then((storedDarkModePreference: boolean | undefined) => { + let theme: "dark" | "light"; + if (storedDarkModePreference === true) { + theme = "dark"; + } else if (storedDarkModePreference === false) { + theme = "light"; + } else { + theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + } + + viewState.uiOptions.darkMode = theme === "dark"; + document.documentElement.dataset.theme = theme + + if (this.client.isDocumentEditor()) { + this.client.documentEditor.updateTheme(); + } + }); }, [viewState.uiOptions.darkMode]); useEffect(() => { diff --git a/web/type.ts b/web/type.ts index 93ef4b168..a09ac32bd 100644 --- a/web/type.ts +++ b/web/type.ts @@ -45,7 +45,7 @@ export type AppViewState = { uiOptions: { vimMode: boolean; - darkMode: boolean; + darkMode: boolean | undefined; forcedROMode: boolean; customStyles?: string; }; @@ -82,7 +82,7 @@ export const initialViewState: AppViewState = { syncFailures: 0, uiOptions: { vimMode: false, - darkMode: false, + darkMode: undefined, forcedROMode: false, }, isMobile: false,