From cb02b383adbe36862e7899e613238607961c17aa Mon Sep 17 00:00:00 2001 From: Alec Ames Date: Wed, 11 Feb 2026 14:39:51 -0500 Subject: [PATCH] (feat) added zen mode and individual toggles for affected settings --- src/lib/components/Editor.svelte | 28 ++++++++++++ src/lib/components/TitleBar.svelte | 3 +- src/lib/stores/settings.svelte.ts | 70 ++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) diff --git a/src/lib/components/Editor.svelte b/src/lib/components/Editor.svelte index a42170d..b8cbf49 100644 --- a/src/lib/components/Editor.svelte +++ b/src/lib/components/Editor.svelte @@ -116,6 +116,7 @@ scrollBeyondLastLine: false, wordWrap: settings.wordWrap as 'on' | 'off' | 'wordWrapColumn' | 'bounded', lineNumbers: settings.lineNumbers as 'on' | 'off' | 'relative' | 'interval', + renderLineHighlight: settings.renderLineHighlight ? 'line' : 'none', }); if (tabManager.activeTab?.editorViewState) { @@ -187,6 +188,32 @@ }, }); + editor.addAction({ + id: 'toggle-line-highlight', + label: 'Toggle Line Highlight', + run: () => { + settings.toggleLineHighlight(); + }, + }); + + editor.addAction({ + id: 'toggle-tabs', + label: 'Toggle Tabs', + keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyB], + run: () => { + settings.toggleTabs(); + }, + }); + + editor.addAction({ + id: 'toggle-zen-mode', + label: 'Toggle Zen Mode', + keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyZ], + run: () => { + settings.toggleZenMode(); + }, + }); + const updateTheme = () => { monaco.editor.setTheme(getTheme()); }; @@ -498,6 +525,7 @@ minimap: { enabled: settings.minimap }, wordWrap: settings.wordWrap as 'on' | 'off' | 'wordWrapColumn' | 'bounded', lineNumbers: settings.lineNumbers as 'on' | 'off' | 'relative' | 'interval', + renderLineHighlight: settings.renderLineHighlight as 'line' | 'none', fontSize: 14 * (zoomLevel / 100), }); } diff --git a/src/lib/components/TitleBar.svelte b/src/lib/components/TitleBar.svelte index 3b030db..c11e321 100644 --- a/src/lib/components/TitleBar.svelte +++ b/src/lib/components/TitleBar.svelte @@ -6,6 +6,7 @@ import iconUrl from '../../assets/icon.png'; import TabList from './TabList.svelte'; import { tabManager } from '../stores/tabs.svelte.js'; + import { settings } from '../stores/settings.svelte.js'; let { isFocused, @@ -198,7 +199,7 @@ - {#if tabManager.tabs.length > 0} + {#if tabManager.tabs.length > 0 && settings.showTabs}
tabManager.addNewTab()} {ondetach} {showHome} {ontabclick} {oncloseTab} />
diff --git a/src/lib/stores/settings.svelte.ts b/src/lib/stores/settings.svelte.ts index 46cbfd4..4e8888f 100644 --- a/src/lib/stores/settings.svelte.ts +++ b/src/lib/stores/settings.svelte.ts @@ -5,6 +5,16 @@ export class SettingsStore { vimMode = $state(false); statusBar = $state(true); wordCount = $state(false); + renderLineHighlight = $state('none'); + showTabs = $state(true); + zenMode = $state(false); + preZenState = $state<{ + renderLineHighlight: string; + showTabs: boolean; + statusBar: boolean; + minimap: boolean; + lineNumbers: string; + } | null>(null); constructor() { if (typeof localStorage !== 'undefined') { @@ -13,14 +23,30 @@ export class SettingsStore { const savedLineNumbers = localStorage.getItem('editor.lineNumbers'); const savedVimMode = localStorage.getItem('editor.vimMode'); const savedStatusBar = localStorage.getItem('editor.statusBar'); + const savedWordCount = localStorage.getItem('editor.wordCount'); + const savedRenderLineHighlight = localStorage.getItem('editor.renderLineHighlight'); + const savedShowTabs = localStorage.getItem('editor.showTabs'); + const savedZenMode = localStorage.getItem('editor.zenMode'); + const savedPreZenState = localStorage.getItem('editor.preZenState'); if (savedMinimap !== null) this.minimap = savedMinimap === 'true'; if (savedWordWrap !== null) this.wordWrap = savedWordWrap; if (savedLineNumbers !== null) this.lineNumbers = savedLineNumbers; if (savedVimMode !== null) this.vimMode = savedVimMode === 'true'; if (savedStatusBar !== null) this.statusBar = savedStatusBar === 'true'; + if (savedWordCount !== null) this.wordCount = savedWordCount === 'true'; + if (savedRenderLineHighlight !== null) this.renderLineHighlight = savedRenderLineHighlight; + if (savedShowTabs !== null) this.showTabs = savedShowTabs === 'true'; + if (savedZenMode !== null) this.zenMode = savedZenMode === 'true'; + if (savedPreZenState !== null) { + try { + this.preZenState = JSON.parse(savedPreZenState); + } catch (e) { + console.error('Failed to parse preZenState', e); + } + } $effect.root(() => { $effect(() => { @@ -29,7 +55,16 @@ export class SettingsStore { localStorage.setItem('editor.lineNumbers', this.lineNumbers); localStorage.setItem('editor.vimMode', String(this.vimMode)); localStorage.setItem('editor.statusBar', String(this.statusBar)); + localStorage.setItem('editor.wordCount', String(this.wordCount)); + localStorage.setItem('editor.renderLineHighlight', this.renderLineHighlight); + localStorage.setItem('editor.showTabs', String(this.showTabs)); + localStorage.setItem('editor.zenMode', String(this.zenMode)); + if (this.preZenState) { + localStorage.setItem('editor.preZenState', JSON.stringify(this.preZenState)); + } else { + localStorage.removeItem('editor.preZenState'); + } }); }); } @@ -58,6 +93,41 @@ export class SettingsStore { toggleWordCount() { this.wordCount = !this.wordCount; } + + toggleLineHighlight() { + this.renderLineHighlight = this.renderLineHighlight === 'line' ? 'none' : 'line'; + } + + toggleTabs() { + this.showTabs = !this.showTabs; + } + + toggleZenMode() { + this.zenMode = !this.zenMode; + if (this.zenMode) { + this.preZenState = { + renderLineHighlight: this.renderLineHighlight, + showTabs: this.showTabs, + statusBar: this.statusBar, + minimap: this.minimap, + lineNumbers: this.lineNumbers, + }; + this.renderLineHighlight = 'none'; + this.showTabs = false; + this.statusBar = false; + this.minimap = false; + this.lineNumbers = 'off'; + } else { + if (this.preZenState) { + this.renderLineHighlight = this.preZenState.renderLineHighlight; + this.showTabs = this.preZenState.showTabs; + this.statusBar = this.preZenState.statusBar; + this.minimap = this.preZenState.minimap; + this.lineNumbers = this.preZenState.lineNumbers; + this.preZenState = null; + } + } + } } export const settings = new SettingsStore();