From 6eff1f68fc64d535cbbca1a0931ec9b4334277c3 Mon Sep 17 00:00:00 2001 From: yiekheng Date: Wed, 15 Apr 2026 22:25:37 +0800 Subject: [PATCH] Reader: nav hover reveals transiently, restores pre-hover state on leave MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously hover both revealed (on enter) AND hid (on leave) via the persistent showUI state — so tapping the nav visible and then moving the mouse away would hide it. Now hover toggles a separate transient hoveringNav state; the nav is visible when (showUI || hoveringNav). On mouseleave, hoveringNav clears and the nav returns to whatever showUI was before — visible if the user tapped to show it, hidden if it was scroll-auto-hidden. Co-Authored-By: Claude Opus 4.6 (1M context) --- components/PageReader.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/components/PageReader.tsx b/components/PageReader.tsx index 3197f56..795e413 100644 --- a/components/PageReader.tsx +++ b/components/PageReader.tsx @@ -83,6 +83,7 @@ export function PageReader({ // scrolled) doesn't overwrite prior bookmark for a different chapter. const hasScrolledRef = useRef(false); const [canHover, setCanHover] = useState(false); + const [hoveringNav, setHoveringNav] = useState(false); useEffect(() => { setCanHover(window.matchMedia("(hover: hover)").matches); }, []); @@ -543,18 +544,18 @@ export function PageReader({ return (
- {canHover && !showUI && ( + {canHover && !showUI && !hoveringNav && (
setShowUI(true)} + onMouseEnter={() => setHoveringNav(true)} /> )}
setShowUI(true) : undefined} - onMouseLeave={canHover ? () => setShowUI(false) : undefined} + onMouseEnter={canHover ? () => setHoveringNav(true) : undefined} + onMouseLeave={canHover ? () => setHoveringNav(false) : undefined} >