diff --git a/src/features/reader/components/Reader.svelte b/src/features/reader/components/Reader.svelte index 07e388b..5d371b2 100644 --- a/src/features/reader/components/Reader.svelte +++ b/src/features/reader/components/Reader.svelte @@ -465,6 +465,7 @@ onDeleteMarker={deleteCurrentMarker} onClampZoom={clampZoom} onDlOpen={() => readerState.dlOpen = true} + onSettingsOpen={() => setSettingsOpen(true)} {win} /> diff --git a/src/features/reader/components/ReaderControls.svelte b/src/features/reader/components/ReaderControls.svelte index 6c093e2..a3cb512 100644 --- a/src/features/reader/components/ReaderControls.svelte +++ b/src/features/reader/components/ReaderControls.svelte @@ -4,11 +4,13 @@ Square, Rows, BookOpen, MonitorPlay, ArrowsLeftRight, ArrowsIn, ArrowsOut, ArrowsVertical, MagnifyingGlassMinus, MagnifyingGlassPlus, - Bookmark, MapPin, Download, Check, + Bookmark, MapPin, Download, Check, GearSix, } from "phosphor-svelte"; import { store, updateSettings } from "@store/state.svelte"; import { openReader, closeReader } from "@store/state.svelte"; import { readerState, MARKER_COLORS, MARKER_COLOR_HEX, ZOOM_STEP, ZOOM_MIN, ZOOM_MAX, PAGE_STYLES } from "../store/readerState.svelte"; + import { fly } from "svelte/transition"; + import { cubicOut, cubicIn } from "svelte/easing"; import type { FitMode } from "@store/state.svelte"; import type { Chapter } from "@types"; @@ -38,6 +40,7 @@ onDeleteMarker: () => void; onClampZoom: (z: number) => number; onDlOpen: () => void; + onSettingsOpen: () => void; win: import("@tauri-apps/api/window").Window; } @@ -48,7 +51,7 @@ autoNext, markOnNext, uiVisible, hideTimer, onCaptureZoomAnchor, onRestoreZoomAnchor, onMaybeMarkRead, onToggleBookmark, onCommitMarker, onDeleteMarker, - onClampZoom, onDlOpen, win, + onClampZoom, onDlOpen, onSettingsOpen, win, }: Props = $props(); function adjustZoom(delta: number) { @@ -78,6 +81,19 @@ if (hideTimer) clearTimeout(hideTimer); } + let wcTimer: ReturnType | null = null; + + function wcResetTimer() { + if (wcTimer) clearTimeout(wcTimer); + wcTimer = setTimeout(() => { readerState.winOpen = false; }, 1500); + } + + $effect(() => { + if (readerState.winOpen) wcResetTimer(); + else if (wcTimer) { clearTimeout(wcTimer); wcTimer = null; } + return () => { if (wcTimer) clearTimeout(wcTimer); }; + }); + function openMarkerPopover() { if (currentPageMarkers.length > 0) { const first = currentPageMarkers[0]; @@ -268,32 +284,41 @@ {#if readerState.winOpen} - + {/if} @@ -301,7 +326,7 @@ \ No newline at end of file diff --git a/src/features/reader/lib/readerKeybinds.ts b/src/features/reader/lib/readerKeybinds.ts index a1ea077..c268df7 100644 --- a/src/features/reader/lib/readerKeybinds.ts +++ b/src/features/reader/lib/readerKeybinds.ts @@ -56,4 +56,4 @@ export function createReaderKeyHandler(actions: ReaderKeyActions): (e: KeyboardE else if (matchesKeybind(e, kb.toggleBookmark)) { e.preventDefault(); actions.toggleBookmark(); } else if (matchesKeybind(e, kb.toggleMarker)) { e.preventDefault(); actions.toggleMarker(); } }; -} +} \ No newline at end of file diff --git a/src/features/settings/components/Settings.svelte b/src/features/settings/components/Settings.svelte index ada94f0..04f656b 100644 --- a/src/features/settings/components/Settings.svelte +++ b/src/features/settings/components/Settings.svelte @@ -65,9 +65,9 @@ let listeningKey: keyof Keybinds | null = $state(null); $effect(() => { - const onKey = (e: KeyboardEvent) => { if (e.key === "Escape" && !listeningKey) close(); }; - window.addEventListener("keydown", onKey); - return () => window.removeEventListener("keydown", onKey); + const onKey = (e: KeyboardEvent) => { if (e.key === "Escape" && !listeningKey) { e.stopPropagation(); close(); } }; + window.addEventListener("keydown", onKey, true); + return () => window.removeEventListener("keydown", onKey, true); }); $effect(() => { @@ -118,7 +118,7 @@