fix: anchor board zoom to pointer
This commit is contained in:
+9
-3
@@ -1,7 +1,7 @@
|
||||
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'
|
||||
import { BookOpen, Building2, CalendarClock, ChevronRight, CircleHelp, FileText, FolderOpen, Hand, Image as ImageIcon, Link2, Minus, MousePointer2, Network, NotebookPen, Pencil, Plus, RotateCcw, Search, Trash2, Upload, UserRound, X, ZoomIn, ZoomOut } from 'lucide-react'
|
||||
import type { BriefConcept, CaseDocument, CaseState, Connection, Evidence, LevelBrief, OrganizationKind, PartyKind, SourceFileType, TimelineRange, WidgetRelation } from './types'
|
||||
import { clampBoardZoom, containedIds, dateValue, folderIsOpen, moveBoardPoint, nextOpenBoardPosition, normalizeCase, panViewport, relationPosition, threadCurve, timelinePositionPercent, timelineRange, zoomFromPinch, zoomFromWheel } from './boardDomain'
|
||||
import { clampBoardZoom, containedIds, dateValue, folderIsOpen, moveBoardPoint, nextOpenBoardPosition, normalizeCase, panViewport, relationPosition, threadCurve, timelinePositionPercent, timelineRange, zoomFromPinch, zoomFromWheel, zoomViewportAt } from './boardDomain'
|
||||
import { documentWidget, exhibitWidget } from './exhibitRegistry'
|
||||
|
||||
const BOARD_W = 2400
|
||||
@@ -440,7 +440,9 @@ function Board({ state, selected, linkFrom, recentlyCreatedExhibitId, recentlyCr
|
||||
event.preventDefault()
|
||||
event.stopPropagation()
|
||||
if (event.ctrlKey || event.metaKey || event.deltaY === 0) return
|
||||
update(s => ({ ...s, viewport: { ...s.viewport, zoom: zoomFromWheel(s.viewport.zoom, event.deltaY) } }))
|
||||
const bounds = board.getBoundingClientRect()
|
||||
const anchor = { x: event.clientX - bounds.left, y: event.clientY - bounds.top }
|
||||
update(s => ({ ...s, viewport: zoomViewportAt(s.viewport, zoomFromWheel(s.viewport.zoom, event.deltaY), anchor) }))
|
||||
}
|
||||
board.addEventListener('wheel', handleWheelZoom, { passive: false })
|
||||
return () => board.removeEventListener('wheel', handleWheelZoom)
|
||||
@@ -477,7 +479,11 @@ function Board({ state, selected, linkFrom, recentlyCreatedExhibitId, recentlyCr
|
||||
const points = [...touchPoints.current.values()]
|
||||
const distance = Math.hypot(points[1].x - points[0].x, points[1].y - points[0].y)
|
||||
const previous = pinchDistance.current
|
||||
if (previous) update(s => ({ ...s, viewport: { ...s.viewport, zoom: zoomFromPinch(s.viewport.zoom, previous, distance) } }))
|
||||
if (previous && boardRef.current) {
|
||||
const bounds = boardRef.current.getBoundingClientRect()
|
||||
const anchor = { x: (points[0].x + points[1].x) / 2 - bounds.left, y: (points[0].y + points[1].y) / 2 - bounds.top }
|
||||
update(s => ({ ...s, viewport: zoomViewportAt(s.viewport, zoomFromPinch(s.viewport.zoom, previous, distance), anchor) }))
|
||||
}
|
||||
pinchDistance.current = distance
|
||||
suppressClick.current = true
|
||||
event.preventDefault()
|
||||
|
||||
Reference in New Issue
Block a user