diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 9ae2dd6..c9dbfd9 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -17,7 +17,7 @@ "height": 600, "minWidth": 900, "minHeight": 600, - "decorations": true + "decorations": false } ], "security": { diff --git a/src/App.vue b/src/App.vue index 3e96822..9647810 100644 --- a/src/App.vue +++ b/src/App.vue @@ -11,7 +11,9 @@ const wordCount = ref(0); const charCount = ref(0); type DocumentMode = "preview" | "edit" | "mixed"; +type AppTheme = "system" | "warm" | "white" | "black" | "gruvbox" | "gray"; const DEFAULT_DOCUMENT_MODE_KEY = "yurou:default-document-mode"; +const APP_THEME_KEY = "yurou:app-theme"; function isDocumentMode(value: string | null): value is DocumentMode { return value === "preview" || value === "edit" || value === "mixed"; @@ -33,6 +35,30 @@ function saveDefaultDocumentMode(mode: DocumentMode) { } } +function isAppTheme(value: string | null): value is AppTheme { + return value === "system" || value === "warm" || value === "white" || value === "black" || value === "gruvbox" || value === "gray"; +} + +function loadAppTheme(): AppTheme { + try { + const stored = localStorage.getItem(APP_THEME_KEY); + if (isAppTheme(stored)) return stored; + } catch { /* localStorage unavailable */ + } + return "warm"; +} + +function saveAppTheme(theme: AppTheme) { + try { + localStorage.setItem(APP_THEME_KEY, theme); + } catch { /* noop */ + } +} + +function applyAppTheme(theme: AppTheme) { + document.documentElement.dataset.theme = theme; +} + // File state const currentFilePath = ref(null); const saveStatus = ref(""); @@ -104,6 +130,7 @@ function onEditorWheel(e: WheelEvent) { const showOutline = ref(false); const defaultDocumentMode = ref(loadDefaultDocumentMode()); const documentMode = ref(defaultDocumentMode.value); +const appTheme = ref(loadAppTheme()); const showMoreMenu = ref(false); const settingsRequest = ref(0); const settingsInitialPage = ref<"about" | "editor">("about"); @@ -127,6 +154,12 @@ function updateDefaultDocumentMode(mode: DocumentMode) { saveDefaultDocumentMode(mode); } +function updateAppTheme(theme: AppTheme) { + appTheme.value = theme; + applyAppTheme(theme); + saveAppTheme(theme); +} + function handleExportPdf() { showMoreMenu.value = false; // TODO: implement PDF export @@ -145,6 +178,7 @@ watch(showMoreMenu, (val) => { }); onMounted(() => { + applyAppTheme(appTheme.value); applyZoomCssVars(); window.addEventListener("wheel", onEditorWheel, {passive: false}); void restoreLastWorkspace(); @@ -423,9 +457,9 @@ registerTauriListener("menu-event", (event) => {