From 92789b2d38b11118a6c874367aaf140ca6db1051 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 13 Sep 2026 18:30:00 +0100 Subject: [PATCH] Implement Pinch Zoom and Scroll Preservation for PDF and Template Previews - Added usePinchZoom and usePreserveZoomScroll hooks to enable pinch zoom functionality and maintain scroll position during zooming in PDFViewer and TemplatePreview components. - Introduced a new clampPreviewScale function to ensure zoom levels remain within defined limits. - Enhanced TemplatePreview with a zoom slider and overlay for better user interaction. - Updated PDFViewer to handle scale changes and improve rendering performance. - Refactored related components to support the new zooming features, enhancing overall user experience. --- assets/stylesheets/App.css | 22 ++ .../Dashboard/common/PDFPreview.jsx | 6 +- src/components/Dashboard/common/PDFViewer.jsx | 119 +++++++++-- .../Dashboard/common/TemplatePreview.jsx | 103 ++++++++-- .../Dashboard/hooks/usePinchZoom.js | 193 ++++++++++++++++++ .../Dashboard/hooks/usePreserveZoomScroll.js | 163 +++++++++++++++ 6 files changed, 570 insertions(+), 36 deletions(-) create mode 100644 src/components/Dashboard/hooks/usePinchZoom.js create mode 100644 src/components/Dashboard/hooks/usePreserveZoomScroll.js diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css index 2290b9ae..d0e7d61d 100644 --- a/assets/stylesheets/App.css +++ b/assets/stylesheets/App.css @@ -2470,6 +2470,28 @@ body.objectKanbanColumnResizing * { pointer-events: none; } +.previewZoomOverlay { + position: absolute; + right: 12px; + bottom: 12px; + z-index: 2; +} + +.previewZoomCard { + background-color: color-mix( + in srgb, + var(--layout-header-bg) 80%, + transparent + ); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); +} + +.ant-slider .ant-slider-handle.previewZoomSliderHandle::after { + box-shadow: 0 0 0 2px var(--color-primary); + background: var(--color-primary); +} + .react-pdf__Page { border: 1px solid #000; box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); diff --git a/src/components/Dashboard/common/PDFPreview.jsx b/src/components/Dashboard/common/PDFPreview.jsx index 78fceab0..a1b7ceb9 100644 --- a/src/components/Dashboard/common/PDFPreview.jsx +++ b/src/components/Dashboard/common/PDFPreview.jsx @@ -6,6 +6,7 @@ import MinusIcon from '../../Icons/MinusIcon.jsx' import PanIcon from '../../Icons/PanIcon.jsx' import PanFilledIcon from '../../Icons/PanFilledIcon.jsx' import PDFViewer from './PDFViewer.jsx' +import { clampPreviewScale } from '../hooks/usePinchZoom.js' const PDFPreview = ({ file, loading = false, style }) => { const [previewScale, setPreviewScale] = useState(1) @@ -30,14 +31,14 @@ const PDFPreview = ({ file, loading = false, style }) => {