Make zoom key command behave the same regardless of mouse position (#6508)

# Description of Changes
Make zoom key command behave the same regardless of mouse position.
Previously only zoomed the editor if the mouse was over the editor.
This commit is contained in:
James Brunton
2026-06-03 11:09:55 +00:00
committed by GitHub
parent e6974d52f7
commit 71633861d0
2 changed files with 32 additions and 35 deletions
@@ -75,7 +75,6 @@ const PageEditor = ({ onFunctionsReady }: PageEditorProps) => {
// Zoom state management // Zoom state management
const [zoomLevel, setZoomLevel] = useState(1.0); const [zoomLevel, setZoomLevel] = useState(1.0);
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const [isContainerHovered, setIsContainerHovered] = useState(false);
const rootFontSize = useMemo(() => { const rootFontSize = useMemo(() => {
if (typeof window === "undefined") { if (typeof window === "undefined") {
return 16; return 16;
@@ -560,31 +559,32 @@ const PageEditor = ({ onFunctionsReady }: PageEditorProps) => {
// Handle keyboard zoom shortcuts // Handle keyboard zoom shortcuts
useEffect(() => { useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => { const handleKeyDown = (event: KeyboardEvent) => {
if (!isContainerHovered) return; if (!(event.ctrlKey || event.metaKey)) return;
const target = event.target as Element | null;
const isInTextInput =
target?.tagName === "INPUT" ||
target?.tagName === "TEXTAREA" ||
(target as HTMLElement | null)?.isContentEditable === true;
if (isInTextInput) return;
// Check if Ctrl (Windows/Linux) or Cmd (Mac) is pressed
if (event.ctrlKey || event.metaKey) {
if (event.key === "=" || event.key === "+") { if (event.key === "=" || event.key === "+") {
// Ctrl+= or Ctrl++ for zoom in
event.preventDefault(); event.preventDefault();
zoomIn(); zoomIn();
} else if (event.key === "-" || event.key === "_") { } else if (event.key === "-" || event.key === "_") {
// Ctrl+- for zoom out
event.preventDefault(); event.preventDefault();
zoomOut(); zoomOut();
} else if (event.key === "0") { } else if (event.key === "0") {
// Ctrl+0 for reset zoom
event.preventDefault(); event.preventDefault();
setZoomLevel(1.0); setZoomLevel(1.0);
} }
}
}; };
document.addEventListener("keydown", handleKeyDown); document.addEventListener("keydown", handleKeyDown);
return () => { return () => {
document.removeEventListener("keydown", handleKeyDown); document.removeEventListener("keydown", handleKeyDown);
}; };
}, [isContainerHovered, zoomIn, zoomOut]); }, [zoomIn, zoomOut, setZoomLevel]);
// Display all pages - use edited or original document // Display all pages - use edited or original document
const displayedPages = displayDocument?.pages || []; const displayedPages = displayDocument?.pages || [];
@@ -673,8 +673,6 @@ const PageEditor = ({ onFunctionsReady }: PageEditorProps) => {
<div <div
ref={containerRef} ref={containerRef}
data-scrolling-container="true" data-scrolling-container="true"
onMouseEnter={() => setIsContainerHovered(true)}
onMouseLeave={() => setIsContainerHovered(false)}
style={{ style={{
height: "100%", height: "100%",
overflow: "auto", overflow: "auto",
@@ -441,6 +441,20 @@ const EmbedPdfViewerContent = ({
event.preventDefault(); event.preventDefault();
printActions.print(); printActions.print();
return; return;
case "=":
case "+":
event.preventDefault();
zoomActions.zoomIn();
return;
case "-":
case "_":
event.preventDefault();
zoomActions.zoomOut();
return;
case "0":
event.preventDefault();
zoomActions.requestZoom("fit-width");
return;
} }
} }
} }
@@ -454,21 +468,6 @@ const EmbedPdfViewerContent = ({
// Modifier key shortcuts (Ctrl/Cmd + key) // Modifier key shortcuts (Ctrl/Cmd + key)
if (mod) { if (mod) {
switch (event.key) { switch (event.key) {
case "=":
case "+":
event.preventDefault();
zoomActions.zoomIn();
return;
case "-":
case "_":
event.preventDefault();
zoomActions.zoomOut();
return;
case "0":
// Ctrl+0: Reset zoom to fit width
event.preventDefault();
zoomActions.requestZoom("fit-width");
return;
case "a": case "a":
case "A": case "A":
// Ctrl+A: Prevent browser from selecting all UI text // Ctrl+A: Prevent browser from selecting all UI text