Skip to content

Commit 1e053bc

Browse files
committed
feat(settings): add toggle for dialog backdrop blur
New setting to enable/disable the backdrop blur effect when dialogs are open. Defaults to enabled (existing behavior). Persisted across restarts.
1 parent bc8a127 commit 1e053bc

8 files changed

Lines changed: 45 additions & 1 deletion

File tree

src/components/Dialog.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Portal } from 'solid-js/web';
33
import { createFocusRestore } from '../lib/focus-restore';
44
import { createFocusTrap } from '../lib/focus-trap';
55
import { theme } from '../lib/theme';
6+
import { store } from '../store/store';
67

78
interface DialogProps {
89
open: boolean;
@@ -67,7 +68,7 @@ export function Dialog(props: DialogProps) {
6768
<Portal>
6869
<Show when={props.open}>
6970
<div
70-
class="dialog-overlay"
71+
class={`dialog-overlay${store.dialogBlur ? ' dialog-blur' : ''}`}
7172
style={{
7273
position: 'fixed',
7374
inset: '0',

src/components/SettingsDialog.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
store,
1313
setTerminalFont,
1414
setThemePreset,
15+
setDialogBlur,
1516
setAutoTrustFolders,
1617
setShowPlans,
1718
setDesktopNotificationsEnabled,
@@ -216,6 +217,33 @@ export function SettingsDialog(props: SettingsDialogProps) {
216217
</span>
217218
</div>
218219
</label>
220+
<label
221+
style={{
222+
display: 'flex',
223+
'align-items': 'center',
224+
gap: '10px',
225+
cursor: 'pointer',
226+
padding: '8px 12px',
227+
'border-radius': '8px',
228+
background: theme.bgInput,
229+
border: `1px solid ${theme.border}`,
230+
}}
231+
>
232+
<input
233+
type="checkbox"
234+
checked={store.dialogBlur}
235+
onChange={(e) => setDialogBlur(e.currentTarget.checked)}
236+
style={{ 'accent-color': theme.accent, cursor: 'pointer' }}
237+
/>
238+
<div style={{ display: 'flex', 'flex-direction': 'column', gap: '2px' }}>
239+
<span style={{ 'font-size': '13px', color: theme.fg }}>
240+
Blur background when dialogs are open
241+
</span>
242+
<span style={{ 'font-size': '11px', color: theme.fgSubtle }}>
243+
Apply a backdrop blur effect behind dialog overlays
244+
</span>
245+
</div>
246+
</label>
219247
</div>
220248

221249
<div style={{ display: 'flex', 'flex-direction': 'column', gap: '10px' }}>

src/store/core.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const [store, setStore] = createStore<AppStore>({
3838
mergedLinesRemoved: 0,
3939
terminalFont: DEFAULT_TERMINAL_FONT,
4040
themePreset: 'minimal',
41+
dialogBlur: true,
4142
windowState: null,
4243
autoTrustFolders: false,
4344
showPlans: true,

src/store/persistence.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export async function saveState(): Promise<void> {
4848
mergedLinesRemoved: store.mergedLinesRemoved,
4949
terminalFont: store.terminalFont,
5050
themePreset: store.themePreset,
51+
dialogBlur: store.dialogBlur,
5152
windowState: store.windowState ? { ...store.windowState } : undefined,
5253
autoTrustFolders: store.autoTrustFolders,
5354
showPlans: store.showPlans,
@@ -187,6 +188,7 @@ interface LegacyPersistedState {
187188
mergedLinesRemoved?: unknown;
188189
terminalFont?: unknown;
189190
themePreset?: unknown;
191+
dialogBlur?: unknown;
190192
windowState?: unknown;
191193
autoTrustFolders?: unknown;
192194
showPlans?: unknown;
@@ -297,6 +299,7 @@ export async function loadState(): Promise<void> {
297299
? raw.terminalFont
298300
: DEFAULT_TERMINAL_FONT;
299301
s.themePreset = isLookPreset(raw.themePreset) ? raw.themePreset : 'minimal';
302+
s.dialogBlur = typeof raw.dialogBlur === 'boolean' ? raw.dialogBlur : true;
300303
s.windowState = parsePersistedWindowState(raw.windowState);
301304
s.autoTrustFolders = typeof raw.autoTrustFolders === 'boolean' ? raw.autoTrustFolders : false;
302305
s.showPlans = typeof raw.showPlans === 'boolean' ? raw.showPlans : true;

src/store/store.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export {
9494
toggleArena,
9595
setTerminalFont,
9696
setThemePreset,
97+
setDialogBlur,
9798
setAutoTrustFolders,
9899
setShowPlans,
99100
setDesktopNotificationsEnabled,

src/store/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export interface PersistedState {
119119
mergedLinesRemoved?: number;
120120
terminalFont?: string;
121121
themePreset?: LookPreset;
122+
dialogBlur?: boolean;
122123
windowState?: PersistedWindowState;
123124
autoTrustFolders?: boolean;
124125
showPlans?: boolean;
@@ -183,6 +184,7 @@ export interface AppStore {
183184
mergedLinesRemoved: number;
184185
terminalFont: string;
185186
themePreset: LookPreset;
187+
dialogBlur: boolean;
186188
windowState: PersistedWindowState | null;
187189
autoTrustFolders: boolean;
188190
showPlans: boolean;

src/store/ui.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ export function setThemePreset(themePreset: LookPreset): void {
7878
setStore('themePreset', themePreset);
7979
}
8080

81+
export function setDialogBlur(enabled: boolean): void {
82+
setStore('dialogBlur', enabled);
83+
}
84+
8185
export function setAutoTrustFolders(autoTrustFolders: boolean): void {
8286
setStore('autoTrustFolders', autoTrustFolders);
8387
}

src/styles.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,10 @@ textarea::placeholder {
645645
.dialog-overlay {
646646
animation: fadeIn 0.16s ease;
647647
background: color-mix(in srgb, #000 44%, transparent);
648+
backdrop-filter: saturate(1.15);
649+
}
650+
651+
.dialog-overlay.dialog-blur {
648652
backdrop-filter: blur(6px) saturate(1.15);
649653
}
650654

0 commit comments

Comments
 (0)