@tsdraw/react 0.8.5 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SelectionOverlay.tsx","../src/components/StylePanel.tsx","../src/components/ToolOverlay.tsx","../src/components/Toolbar.tsx","../src/canvas/cursor.ts","../src/canvas/touchInteractions.ts","../src/canvas/keyboardShortcuts.ts","../src/persistence/localIndexedDb.ts","../src/persistence/sessionId.ts","../src/canvas/useTsdrawCanvasController.ts","../src/components/TsdrawCanvas.tsx"],"names":["jsxs","Fragment","jsx","DEFAULT_COLORS","resolveThemeColor","IconPointer","IconPencil","IconSquare","IconCircle","IconEraser","IconHandStop","IconArrowBackUp","IconArrowForwardUp","isSelectTool","beginCameraPan","moveCameraPan","startCameraSlide","pageToScreen","useRef","useState","useEffect","useCallback","getSelectionBoundsPage","buildTransformSnapshots","Editor","document","getTopShapeAtPoint","buildStartPositions","applyRotation","applyResize","applyMove","normalizeSelectionBounds","getShapesInBounds","HandDraggingState","STROKE_WIDTHS","ERASER_MARGIN","useMemo"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { ResizeHandle, ToolId } from '@tsdraw/core';\nimport type { ScreenRect } from '../types.js';\n\ninterface SelectionOverlayProps {\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n currentTool: ToolId;\n selectedCount: number;\n onRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n onResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n}\n\nexport function SelectionOverlay({\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n currentTool,\n selectedCount,\n onRotatePointerDown,\n onResizePointerDown,\n}: SelectionOverlayProps) {\n return (\n <>\n {selectionBrush && (\n <div\n className=\"tsdraw-selection-brush\"\n style={{\n left: selectionBrush.left,\n top: selectionBrush.top,\n width: selectionBrush.width,\n height: selectionBrush.height,\n }}\n />\n )}\n {selectionBounds && (\n <div\n className=\"tsdraw-selection-frame\"\n style={{\n left: selectionBounds.left,\n top: selectionBounds.top,\n width: selectionBounds.width,\n height: selectionBounds.height,\n transform: `rotate(${selectionRotationDeg}deg)`,\n }}\n >\n <div className=\"tsdraw-selection-bounds\" />\n {currentTool === 'select' && selectedCount > 0 && (\n <>\n <div className=\"tsdraw-rotation-stem\" />\n <button\n type=\"button\"\n className=\"tsdraw-rotation-handle\"\n aria-label=\"Rotate selection\"\n onPointerDown={onRotatePointerDown}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--nw\"\n style={{ left: '0%', top: '0%' }}\n aria-label=\"Resize top left\"\n onPointerDown={(e) => onResizePointerDown(e, 'nw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--ne\"\n style={{ left: '100%', top: '0%' }}\n aria-label=\"Resize top right\"\n onPointerDown={(e) => onResizePointerDown(e, 'ne')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--sw\"\n style={{ left: '0%', top: '100%' }}\n aria-label=\"Resize bottom left\"\n onPointerDown={(e) => onResizePointerDown(e, 'sw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--se\"\n style={{ left: '100%', top: '100%' }}\n aria-label=\"Resize bottom right\"\n onPointerDown={(e) => onResizePointerDown(e, 'se')}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}","import { DEFAULT_COLORS, resolveThemeColor } from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, FillStyle, SizeStyle } from '@tsdraw/core';\nimport type { CSSProperties, ReactNode } from 'react';\n\nconst STYLE_COLORS = Object.entries(DEFAULT_COLORS)\n .filter(([key]) => key !== 'white')\n .map(([value]) => ({ value }));\n\nconst STYLE_DASHES: DashStyle[] = ['draw', 'solid', 'dashed', 'dotted'];\nconst STYLE_FILLS: FillStyle[] = ['none', 'blank', 'semi', 'solid'];\nconst STYLE_SIZES: SizeStyle[] = ['s', 'm', 'l', 'xl'];\n\nexport type TsdrawStylePanelPartItem = | 'colors' | 'dashes' | 'fills' | 'sizes' | (string & {});\n\nexport interface TsdrawStylePanelRenderContext {\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawFill: FillStyle;\n drawSize: SizeStyle;\n onColorSelect: (color: ColorStyle) => void;\n onDashSelect: (dash: DashStyle) => void;\n onFillSelect: (fill: FillStyle) => void;\n onSizeSelect: (size: SizeStyle) => void;\n}\n\nexport interface TsdrawStylePanelCustomPart {\n id: string;\n render: (context: TsdrawStylePanelRenderContext) => ReactNode;\n}\n\ninterface StylePanelProps extends TsdrawStylePanelRenderContext {\n visible: boolean;\n parts: TsdrawStylePanelPartItem[];\n customParts?: TsdrawStylePanelCustomPart[];\n style?: CSSProperties;\n theme: 'light' | 'dark';\n}\n\nexport function StylePanel({\n visible,\n parts,\n customParts,\n style,\n theme,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n onColorSelect,\n onDashSelect,\n onFillSelect,\n onSizeSelect,\n}: StylePanelProps) {\n if (!visible || parts.length === 0) return null;\n\n const context: TsdrawStylePanelRenderContext = {\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n onColorSelect,\n onDashSelect,\n onFillSelect,\n onSizeSelect,\n };\n const customPartMap = new Map((customParts ?? []).map((customPart) => [customPart.id, customPart]));\n\n return (\n <div className=\"tsdraw-style-panel\" style={style} aria-label=\"Draw style panel\">\n {parts.map((part) => {\n if (part === 'colors') {\n return (\n <div key={part} className=\"tsdraw-style-colors\">\n {STYLE_COLORS.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n className=\"tsdraw-style-color\"\n data-active={drawColor === item.value ? 'true' : undefined}\n aria-label={`Color ${item.value}`}\n title={item.value}\n onClick={() => onColorSelect(item.value)}\n >\n <span\n className=\"tsdraw-style-color-dot\"\n style={{ background: resolveThemeColor(item.value, theme) }}\n />\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'dashes') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_DASHES.map((dash) => (\n <button\n key={dash}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawDash === dash ? 'true' : undefined}\n aria-label={`Stroke ${dash}`}\n title={dash}\n onClick={() => onDashSelect(dash)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-preview-line tsdraw-style-preview-line--${dash}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'fills') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_FILLS.map((fill) => (\n <button\n key={fill}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawFill === fill ? 'true' : undefined}\n aria-label={`Fill ${fill}`}\n title={fill}\n onClick={() => onFillSelect(fill)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-fill tsdraw-style-fill--${fill}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'sizes') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_SIZES.map((size) => (\n <button\n key={size}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawSize === size ? 'true' : undefined}\n aria-label={`Thickness ${size}`}\n title={size}\n onClick={() => onSizeSelect(size)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-size tsdraw-style-size--${size}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n const customPart = customPartMap.get(part);\n if (!customPart) return null;\n return (\n <div key={part} className=\"tsdraw-style-section tsdraw-style-section--custom\">\n {customPart.render(context)}\n </div>\n );\n })}\n </div>\n );\n}","interface ToolOverlayProps {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport function ToolOverlay({\n visible,\n pointerX,\n pointerY,\n isPenPreview,\n penRadius,\n penColor,\n eraserRadius,\n}: ToolOverlayProps) {\n if (!visible) return null;\n\n return (\n <div className=\"tsdraw-tool-overlay\" aria-hidden=\"true\">\n {isPenPreview ? (\n <span\n className=\"tsdraw-tool-dot\"\n style={{\n left: pointerX,\n top: pointerY,\n width: penRadius * 2,\n height: penRadius * 2,\n backgroundColor: penColor,\n }}\n />\n ) : (\n <span\n className=\"tsdraw-tool-ring\"\n style={{\n left: pointerX,\n top: pointerY,\n width: eraserRadius * 2,\n height: eraserRadius * 2,\n }}\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport type { ToolId } from '@tsdraw/core';\nimport { IconArrowBackUp, IconArrowForwardUp, IconEraser, IconHandStop, IconPencil, IconPointer, IconSquare, IconCircle } from '@tabler/icons-react';\n\nexport interface ToolbarToolItem {\n type: 'tool';\n id: ToolId;\n label: string;\n icon: ReactNode | ((isActive: boolean) => ReactNode);\n}\n\nexport interface ToolbarActionItem {\n type: 'action';\n id: 'undo' | 'redo';\n label: string;\n disabled: boolean;\n onSelect: () => void;\n}\n\nexport type ToolbarRenderItem = ToolbarToolItem | ToolbarActionItem;\n\nexport interface ToolbarPart {\n id: string;\n items: ToolbarRenderItem[];\n}\n\ninterface ToolbarProps {\n parts: ToolbarPart[];\n currentTool: ToolId | null;\n onToolChange: (tool: ToolId) => void;\n disabled?: boolean;\n style?: CSSProperties;\n}\n\nexport function getDefaultToolbarIcon(toolId: ToolId, isActive: boolean): ReactNode {\n if (toolId === 'select') return <IconPointer size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'pen') return <IconPencil size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'square') return <IconSquare size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'circle') return <IconCircle size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'eraser') return <IconEraser size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'hand') return <IconHandStop size={16} stroke={isActive ? 1 : 1.8} fill={isActive ? 'currentColor' : 'none'} style={isActive ? { stroke: '#000000' } : undefined} />;\n return null;\n}\n\nfunction getActionIcon(actionId: 'undo' | 'redo'): ReactNode {\n if (actionId === 'undo') return <IconArrowBackUp size={16} stroke={1.8} />;\n return <IconArrowForwardUp size={16} stroke={1.8} />;\n}\n\nexport function Toolbar({ parts, currentTool, onToolChange, disabled, style }: ToolbarProps) {\n return (\n <div className=\"tsdraw-toolbar\" style={style}>\n {parts.map((part, partIndex) => (\n <div key={part.id} className=\"tsdraw-toolbar-part\">\n {part.items.map((item) => {\n if (item.type === 'action') {\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n onClick={item.onSelect}\n title={item.label}\n aria-label={item.label}\n disabled={disabled || item.disabled}\n >\n {getActionIcon(item.id)}\n </button>\n );\n }\n\n const isActive = currentTool === item.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n data-active={isActive ? 'true' : undefined}\n onClick={() => onToolChange(item.id)}\n title={item.label}\n aria-label={item.label}\n disabled={disabled}\n >\n {typeof item.icon === 'function' ? item.icon(isActive) : item.icon}\n </button>\n );\n })}\n {partIndex < parts.length - 1 ? <div className=\"tsdraw-toolbar-separator\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n","import type { ToolId } from '@tsdraw/core';\nimport { isSelectTool } from '@tsdraw/core';\n\nexport function getCanvasCursor(\n currentTool: ToolId,\n state: {\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n isHoveringSelectionBounds: boolean;\n showToolOverlay: boolean;\n }\n) {\n if (currentTool === 'hand') return 'grab';\n\n if (isSelectTool(currentTool)) {\n if (state.isRotatingSelection) return 'grabbing';\n if (state.isResizingSelection) return 'nwse-resize';\n if (state.isMovingSelection) return 'grabbing';\n if (state.isHoveringSelectionBounds) return 'move';\n return 'default';\n }\n\n return state.showToolOverlay ? 'none' : 'crosshair'; // Let tool overlay handle the cursor\n}","import {\n type Editor,\n type CameraPanSession,\n type CameraSlideAnimation,\n type CameraSlideOptions,\n beginCameraPan,\n moveCameraPan,\n startCameraSlide,\n} from '@tsdraw/core';\nimport type { TsdrawTouchOptions } from './canvasOptions.js';\n\nconst TAP_MAX_DURATION_MS = 100; // the max time of a tap gesture\nconst DOUBLE_TAP_INTERVAL_MS = 100; // the min time between double taps\nconst TAP_MOVE_TOLERANCE = 14; // the min distance user can move their finger to register as a tap\nconst PINCH_MODE_ZOOM_DISTANCE = 24; // the min distance user can pinch to zoom the camera\nconst PINCH_MODE_PAN_DISTANCE = 16; // the min distance user can pinch to pan the camera\nconst PINCH_MODE_SWITCH_TO_ZOOM_DISTANCE = 64; // the min distance user can pinch to switch from panning to zooming\n\ntype TouchCameraMode = 'not-sure' | 'zooming' | 'panning';\n\ninterface TouchTapState {\n active: boolean;\n startTime: number;\n maxTouchCount: number;\n moved: boolean;\n startPoints: Map<number, { x: number; y: number }>;\n lastTapAtByCount: Partial<Record<2 | 3, number>>;\n}\n\ninterface TouchCameraState {\n active: boolean;\n mode: TouchCameraMode;\n previousCenter: { x: number; y: number };\n initialCenter: { x: number; y: number };\n initialDistance: number;\n initialZoom: number;\n}\n\nexport interface TouchInteractionHandlers {\n cancelActivePointerInteraction: () => void;\n refreshView: () => void;\n runUndo: () => boolean;\n runRedo: () => boolean;\n isPenModeActive: () => boolean;\n getSlideOptions: () => { enabled: boolean; slideOptions?: CameraSlideOptions };\n}\n\nexport interface TouchInteractionController {\n handlePointerDown: (event: PointerEvent) => boolean;\n handlePointerMove: (event: PointerEvent) => boolean;\n handlePointerUpOrCancel: (event: PointerEvent) => boolean;\n handleGestureEvent: (event: Event, container: HTMLElement) => void;\n reset: () => void;\n isCameraGestureActive: () => boolean;\n isFingerPanActive: () => boolean;\n isTrackpadZoomActive: () => boolean;\n}\n\nexport function createTouchInteractionController(\n editor: Editor,\n canvas: HTMLCanvasElement,\n handlers: TouchInteractionHandlers,\n touchOptions?: TsdrawTouchOptions\n): TouchInteractionController {\n const allowPinchZoom = touchOptions?.pinchToZoom !== false;\n const allowFingerPan = touchOptions?.fingerPanInPenMode !== false;\n const allowTapUndoRedo = touchOptions?.tapUndoRedo !== false;\n const allowTrackpadGestures = touchOptions?.trackpadGestures !== false;\n const activeTouchPoints = new Map<number, { x: number; y: number }>();\n const touchTapState: TouchTapState = {\n active: false,\n startTime: 0,\n maxTouchCount: 0,\n moved: false,\n startPoints: new Map(),\n lastTapAtByCount: {},\n };\n const touchCameraState: TouchCameraState = {\n active: false,\n mode: 'not-sure',\n previousCenter: { x: 0, y: 0 },\n initialCenter: { x: 0, y: 0 },\n initialDistance: 1,\n initialZoom: 1,\n };\n\n let fingerPanPointerId: number | null = null;\n let fingerPanSession: CameraPanSession | null = null;\n let fingerPanSlide: CameraSlideAnimation | null = null;\n\n const isTouchPointer = (event: PointerEvent) => event.pointerType === 'touch';\n\n const stopFingerPanSlide = () => {\n if (fingerPanSlide) {\n fingerPanSlide.stop();\n fingerPanSlide = null;\n }\n };\n\n const endFingerPan = () => {\n fingerPanPointerId = null;\n fingerPanSession = null;\n };\n\n const endTouchCameraGesture = () => {\n touchCameraState.active = false;\n touchCameraState.mode = 'not-sure';\n touchCameraState.initialDistance = 1;\n touchCameraState.initialZoom = 1;\n };\n\n const maybeHandleTouchTapGesture = () => {\n if (activeTouchPoints.size > 0) return;\n if (!touchTapState.active) return;\n\n const elapsed = performance.now() - touchTapState.startTime;\n if (allowTapUndoRedo && !touchTapState.moved && elapsed <= TAP_MAX_DURATION_MS && (touchTapState.maxTouchCount === 2 || touchTapState.maxTouchCount === 3)) {\n const fingerCount = touchTapState.maxTouchCount as 2 | 3;\n const now = performance.now();\n const previousTapTime = touchTapState.lastTapAtByCount[fingerCount] ?? 0;\n const isDoubleTap = previousTapTime > 0 && now - previousTapTime <= DOUBLE_TAP_INTERVAL_MS;\n if (isDoubleTap) {\n touchTapState.lastTapAtByCount[fingerCount] = 0;\n if (fingerCount === 2) {\n if (handlers.runUndo()) handlers.refreshView();\n } else if (handlers.runRedo()) handlers.refreshView();\n } else touchTapState.lastTapAtByCount[fingerCount] = now;\n }\n\n touchTapState.active = false;\n touchTapState.startPoints.clear();\n touchTapState.maxTouchCount = 0;\n touchTapState.moved = false;\n };\n\n const beginTouchCameraGesture = () => {\n const points = [...activeTouchPoints.values()];\n if (points.length !== 2) return;\n\n handlers.cancelActivePointerInteraction();\n const first = points[0]!;\n const second = points[1]!;\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n const distance = Math.hypot(second.x - first.x, second.y - first.y);\n\n touchCameraState.active = true;\n touchCameraState.mode = 'not-sure';\n touchCameraState.previousCenter = center;\n touchCameraState.initialCenter = center;\n touchCameraState.initialDistance = Math.max(1, distance);\n touchCameraState.initialZoom = editor.getZoomLevel();\n };\n\n const updateTouchCameraGesture = () => {\n if (!touchCameraState.active) return false;\n const points = [...activeTouchPoints.values()];\n if (points.length !== 2) {\n endTouchCameraGesture();\n return false;\n }\n\n const first = points[0]!;\n const second = points[1]!;\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n const distance = Math.max(1, Math.hypot(second.x - first.x, second.y - first.y));\n const centerDx = center.x - touchCameraState.previousCenter.x;\n const centerDy = center.y - touchCameraState.previousCenter.y;\n const touchDistance = Math.abs(distance - touchCameraState.initialDistance);\n const originDistance = Math.hypot(center.x - touchCameraState.initialCenter.x, center.y - touchCameraState.initialCenter.y);\n\n if (touchCameraState.mode === 'not-sure') {\n if (allowPinchZoom && touchDistance > PINCH_MODE_ZOOM_DISTANCE) touchCameraState.mode = 'zooming';\n else if (originDistance > PINCH_MODE_PAN_DISTANCE) touchCameraState.mode = 'panning';\n } else if (allowPinchZoom && touchCameraState.mode === 'panning' && touchDistance > PINCH_MODE_SWITCH_TO_ZOOM_DISTANCE) touchCameraState.mode = 'zooming';\n\n const canvasRect = canvas.getBoundingClientRect();\n const centerOnCanvasX = center.x - canvasRect.left;\n const centerOnCanvasY = center.y - canvasRect.top;\n\n if (touchCameraState.mode === 'zooming') {\n const targetZoom = Math.max(0.1, Math.min(4, touchCameraState.initialZoom * (distance / touchCameraState.initialDistance)));\n const pannedX = editor.viewport.x + centerDx;\n const pannedY = editor.viewport.y + centerDy;\n const pageAtCenterX = (centerOnCanvasX - pannedX) / editor.viewport.zoom;\n const pageAtCenterY = (centerOnCanvasY - pannedY) / editor.viewport.zoom;\n editor.setViewport({\n x: centerOnCanvasX - pageAtCenterX * targetZoom,\n y: centerOnCanvasY - pageAtCenterY * targetZoom,\n zoom: targetZoom,\n });\n } else {\n editor.panBy(centerDx, centerDy);\n }\n\n touchCameraState.previousCenter = center;\n handlers.refreshView();\n return true;\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!isTouchPointer(event)) return false;\n\n stopFingerPanSlide();\n activeTouchPoints.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (!touchTapState.active) {\n touchTapState.active = true;\n touchTapState.startTime = performance.now();\n touchTapState.maxTouchCount = activeTouchPoints.size;\n touchTapState.moved = false;\n touchTapState.startPoints.clear();\n } else {\n touchTapState.maxTouchCount = Math.max(touchTapState.maxTouchCount, activeTouchPoints.size);\n }\n touchTapState.startPoints.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (activeTouchPoints.size === 2) {\n endFingerPan();\n beginTouchCameraGesture();\n return true;\n }\n\n if (allowFingerPan && handlers.isPenModeActive() && activeTouchPoints.size === 1) {\n handlers.cancelActivePointerInteraction();\n fingerPanPointerId = event.pointerId;\n fingerPanSession = beginCameraPan(editor.viewport, event.clientX, event.clientY);\n return true;\n }\n\n return false;\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!isTouchPointer(event)) return false;\n if (activeTouchPoints.has(event.pointerId)) activeTouchPoints.set(event.pointerId, { x: event.clientX, y: event.clientY });\n \n const tapStart = touchTapState.startPoints.get(event.pointerId);\n if (tapStart) {\n const moved = Math.hypot(event.clientX - tapStart.x, event.clientY - tapStart.y);\n if (moved > TAP_MOVE_TOLERANCE) touchTapState.moved = true;\n }\n\n if (fingerPanPointerId === event.pointerId && fingerPanSession) {\n const target = moveCameraPan(fingerPanSession, event.clientX, event.clientY);\n editor.setViewport({ x: target.x, y: target.y });\n handlers.refreshView();\n return true;\n }\n\n return updateTouchCameraGesture();\n };\n\n const handlePointerUpOrCancel = (event: PointerEvent) => {\n if (!isTouchPointer(event)) return false;\n const wasCameraGestureActive = touchCameraState.active;\n const wasFingerPan = fingerPanPointerId === event.pointerId;\n const releasedPanSession = wasFingerPan ? fingerPanSession : null;\n activeTouchPoints.delete(event.pointerId);\n touchTapState.startPoints.delete(event.pointerId);\n if (activeTouchPoints.size < 2) endTouchCameraGesture();\n if (wasFingerPan) {\n endFingerPan();\n if (releasedPanSession) {\n const slideConfig = handlers.getSlideOptions();\n if (slideConfig.enabled) {\n fingerPanSlide = startCameraSlide(\n releasedPanSession,\n (dx, dy) => editor.panBy(dx, dy),\n () => handlers.refreshView(),\n slideConfig.slideOptions\n );\n }\n }\n }\n maybeHandleTouchTapGesture();\n return wasCameraGestureActive || wasFingerPan;\n };\n\n let gestureLastScale = 1;\n let gestureActive = false;\n\n const handleGestureEvent = (event: Event, container: HTMLElement) => {\n if (!container.contains(event.target as Node)) return;\n event.preventDefault();\n if (!allowTrackpadGestures) return;\n\n const gestureEvent = event as Event & { scale?: number; clientX?: number; clientY?: number };\n if (gestureEvent.scale == null) return;\n\n if (event.type === 'gesturestart') {\n gestureLastScale = gestureEvent.scale;\n gestureActive = true;\n return;\n }\n\n if (event.type === 'gestureend') {\n gestureActive = false;\n gestureLastScale = 1;\n return;\n }\n\n if (event.type === 'gesturechange' && gestureActive) {\n const zoomFactor = gestureEvent.scale / gestureLastScale;\n gestureLastScale = gestureEvent.scale;\n const canvasRect = canvas.getBoundingClientRect();\n const cx = (gestureEvent.clientX ?? canvasRect.left + canvasRect.width / 2) - canvasRect.left;\n const cy = (gestureEvent.clientY ?? canvasRect.top + canvasRect.height / 2) - canvasRect.top;\n editor.zoomAt(zoomFactor, cx, cy);\n handlers.refreshView();\n }\n };\n\n const reset = () => {\n activeTouchPoints.clear();\n touchTapState.active = false;\n touchTapState.startPoints.clear();\n endTouchCameraGesture();\n endFingerPan();\n stopFingerPanSlide();\n };\n\n return {\n handlePointerDown,\n handlePointerMove,\n handlePointerUpOrCancel,\n handleGestureEvent,\n reset,\n isCameraGestureActive: () => touchCameraState.active,\n isFingerPanActive: () => fingerPanPointerId !== null,\n isTrackpadZoomActive: () => gestureActive,\n };\n}","import type { ToolId } from '@tsdraw/core';\nimport type { TsdrawKeyboardShortcutOptions } from './canvasOptions.js';\n\nconst DEFAULT_TOOL_SHORTCUTS: Partial<Record<string, ToolId>> = {\n v: 'select',\n h: 'hand',\n e: 'eraser',\n p: 'pen',\n b: 'pen',\n d: 'pen',\n x: 'pen',\n r: 'square',\n o: 'circle',\n c: 'circle',\n};\n\nexport function resolveToolShortcuts(shortcutOptions?: TsdrawKeyboardShortcutOptions): Partial<Record<string, ToolId>> {\n if (!shortcutOptions?.toolShortcuts) return DEFAULT_TOOL_SHORTCUTS;\n if (shortcutOptions.overrideDefaults) return { ...shortcutOptions.toolShortcuts };\n return { ...DEFAULT_TOOL_SHORTCUTS, ...shortcutOptions.toolShortcuts };\n}\n\nexport interface KeyboardShortcutHandlers {\n isToolAvailable: (tool: ToolId) => boolean;\n setToolFromShortcut: (tool: ToolId) => void;\n runHistoryShortcut: (shouldRedo: boolean) => boolean;\n deleteSelection: () => boolean;\n dispatchKeyDown: (event: KeyboardEvent) => void;\n dispatchKeyUp: (event: KeyboardEvent) => void;\n}\n\nexport function isEditableTarget(eventTarget: EventTarget | null): boolean {\n const element = eventTarget as HTMLElement | null;\n if (!element) return false;\n if (element.isContentEditable) return true;\n const tagName = element.tagName;\n return tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT';\n}\n\nexport function handleKeyboardShortcutKeyDown(\n event: KeyboardEvent,\n handlers: KeyboardShortcutHandlers,\n toolShortcutMap: Partial<Record<string, ToolId>> = DEFAULT_TOOL_SHORTCUTS\n): void {\n if (isEditableTarget(event.target)) return;\n\n const loweredKey = event.key.toLowerCase();\n const isMetaPressed = event.metaKey || event.ctrlKey;\n\n if (isMetaPressed && (loweredKey === 'z' || loweredKey === 'y')) {\n const shouldRedo = loweredKey === 'y' || (loweredKey === 'z' && event.shiftKey);\n if (handlers.runHistoryShortcut(shouldRedo)) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n if (!isMetaPressed && !event.altKey) {\n const nextToolId = toolShortcutMap[loweredKey];\n if (nextToolId && handlers.isToolAvailable(nextToolId)) {\n handlers.setToolFromShortcut(nextToolId);\n event.preventDefault();\n return;\n }\n }\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (handlers.deleteSelection()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n handlers.dispatchKeyDown(event);\n}\n\nexport function handleKeyboardShortcutKeyUp(event: KeyboardEvent, handlers: KeyboardShortcutHandlers): void {\n if (isEditableTarget(event.target)) return;\n handlers.dispatchKeyUp(event);\n}","import type { TsdrawHistorySnapshot, TsdrawPersistedRecord, TsdrawSessionStateSnapshot } from '@tsdraw/core';\n\nconst DATABASE_PREFIX = 'tsdraw_v1_';\nconst DATABASE_VERSION = 2;\n\nconst STORE = {\n records: 'records',\n state: 'state',\n history: 'history',\n} as const;\n\ninterface StateRow {\n id: string;\n snapshot: TsdrawSessionStateSnapshot;\n updatedAt: number;\n}\n\ninterface HistoryRow {\n id: string;\n snapshot: TsdrawHistorySnapshot;\n updatedAt: number;\n}\n\nexport interface LocalLoadResult {\n records: TsdrawPersistedRecord[];\n state: TsdrawSessionStateSnapshot | null;\n history: TsdrawHistorySnapshot | null;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n });\n}\n\nfunction transactionDone(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction aborted'));\n });\n}\n\nfunction openLocalDatabase(persistenceKey: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(`${DATABASE_PREFIX}${persistenceKey}`, DATABASE_VERSION);\n\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE.records)) { database.createObjectStore(STORE.records); }\n if (!database.objectStoreNames.contains(STORE.state)) { database.createObjectStore(STORE.state); }\n if (!database.objectStoreNames.contains(STORE.history)) { database.createObjectStore(STORE.history); }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Failed to open IndexedDB'));\n });\n}\n\nexport class TsdrawLocalIndexedDb {\n private readonly databasePromise: Promise<IDBDatabase>;\n\n constructor(persistenceKey: string) {\n this.databasePromise = openLocalDatabase(persistenceKey);\n }\n\n async close(): Promise<void> {\n const database = await this.databasePromise;\n database.close();\n }\n\n async load(sessionId: string): Promise<LocalLoadResult> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readonly');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n const records = (await requestToPromise(recordStore.getAll())) as TsdrawPersistedRecord[];\n let state = (await requestToPromise(stateStore.get(sessionId)) as StateRow | undefined)?.snapshot ?? null;\n let history = (await requestToPromise(historyStore.get(sessionId)) as HistoryRow | undefined)?.snapshot ?? null;\n\n if (!state) {\n const allStates = (await requestToPromise(stateStore.getAll())) as StateRow[];\n if (allStates.length > 0) {\n allStates.sort((left, right) => left.updatedAt - right.updatedAt);\n state = allStates[allStates.length - 1]?.snapshot ?? null;\n }\n }\n\n if (!history) {\n const allHistoryRows = (await requestToPromise(historyStore.getAll())) as HistoryRow[];\n if (allHistoryRows.length > 0) {\n allHistoryRows.sort((left, right) => left.updatedAt - right.updatedAt);\n history = allHistoryRows[allHistoryRows.length - 1]?.snapshot ?? null;\n }\n }\n\n await transactionDone(transaction);\n return { records, state, history };\n }\n\n async storeSnapshot(args: {\n records: TsdrawPersistedRecord[];\n sessionId: string;\n state: TsdrawSessionStateSnapshot;\n history: TsdrawHistorySnapshot;\n }): Promise<void> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readwrite');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n recordStore.clear();\n for (const record of args.records) {\n recordStore.put(record, record.id);\n }\n\n const stateRow: StateRow = {\n id: args.sessionId,\n snapshot: args.state,\n updatedAt: Date.now(),\n };\n stateStore.put(stateRow, args.sessionId);\n\n const historyRow: HistoryRow = {\n id: args.sessionId,\n snapshot: args.history,\n updatedAt: Date.now(),\n };\n historyStore.put(historyRow, args.sessionId);\n\n await transactionDone(transaction);\n }\n}\n\nexport function getPersistenceDatabaseName(persistenceKey: string): string {\n return `${DATABASE_PREFIX}${persistenceKey}`;\n}","const SESSION_STORAGE_KEY = 'TSDRAW_TAB_SESSION_ID_v1';\n\nfunction createSessionId(): string {\n const timestamp = Date.now().toString(36);\n const randomPart = Math.random().toString(36).slice(2, 10);\n return `tsdraw-session-${timestamp}-${randomPart}`;\n}\n\nexport function getOrCreateSessionId(): string {\n if (typeof window === 'undefined') return createSessionId();\n\n try {\n const existing = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n\n const newId = createSessionId();\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, newId);\n return newId;\n } catch {\n return createSessionId();\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { RefObject } from 'react';\nimport {\n Editor,\n ERASER_MARGIN,\n STROKE_WIDTHS,\n pageToScreen,\n normalizeSelectionBounds,\n applyMove,\n applyResize,\n applyRotation,\n buildStartPositions,\n buildTransformSnapshots,\n getSelectionBoundsPage,\n getShapesInBounds,\n getTopShapeAtPoint,\n resolveThemeColor,\n startCameraSlide,\n HandDraggingState,\n type CameraSlideAnimation,\n type ResizeHandle,\n type ToolDefinition,\n type ToolId,\n type Viewport,\n type TsdrawEditorSnapshot,\n} from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, FillStyle, ShapeId, SizeStyle, SelectionBounds, TsdrawDocumentSnapshot } from '@tsdraw/core';\nimport { getCanvasCursor } from './cursor.js';\nimport { createTouchInteractionController } from './touchInteractions.js';\nimport { handleKeyboardShortcutKeyDown, handleKeyboardShortcutKeyUp, resolveToolShortcuts } from './keyboardShortcuts.js';\nimport type { ScreenRect } from '../types.js';\nimport { TsdrawLocalIndexedDb } from '../persistence/localIndexedDb.js';\nimport { getOrCreateSessionId } from '../persistence/sessionId.js';\nimport type { TsdrawCameraOptions, TsdrawTouchOptions, TsdrawKeyboardShortcutOptions, TsdrawPenOptions } from './canvasOptions.js';\n\ntype SelectDragMode = 'none' | 'marquee' | 'move' | 'resize' | 'rotate';\n\nexport interface TsdrawCursorContext {\n currentTool: ToolId;\n defaultCursor: string;\n showToolOverlay: boolean;\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n}\n\nexport interface TsdrawToolOverlayState {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport interface TsdrawMountApi {\n editor: Editor;\n container: HTMLDivElement;\n canvas: HTMLCanvasElement;\n setTool: (tool: ToolId) => void;\n getCurrentTool: () => ToolId;\n undo: () => boolean;\n redo: () => boolean;\n canUndo: () => boolean;\n canRedo: () => boolean;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n}\n\nexport interface UseTsdrawCanvasControllerOptions {\n toolDefinitions?: ToolDefinition[];\n initialTool?: ToolId;\n theme?: 'light' | 'dark';\n persistenceKey?: string;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n cameraOptions?: TsdrawCameraOptions;\n touchOptions?: TsdrawTouchOptions;\n keyboardShortcuts?: TsdrawKeyboardShortcutOptions;\n penOptions?: TsdrawPenOptions;\n readOnly?: boolean;\n autoFocus?: boolean;\n snapshot?: TsdrawEditorSnapshot;\n onChange?: (snapshot: TsdrawDocumentSnapshot) => void;\n onCameraChange?: (viewport: Viewport) => void;\n onToolChange?: (toolId: ToolId) => void;\n}\n\nexport interface TsdrawCanvasController {\n containerRef: RefObject<HTMLDivElement>;\n canvasRef: RefObject<HTMLCanvasElement>;\n currentTool: ToolId;\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawFill: FillStyle;\n drawSize: SizeStyle;\n selectedShapeIds: ShapeId[];\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n canvasCursor: string;\n cursorContext: TsdrawCursorContext;\n toolOverlay: TsdrawToolOverlayState;\n isPersistenceReady: boolean;\n canUndo: boolean;\n canRedo: boolean;\n undo: () => boolean;\n redo: () => boolean;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n handleResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n handleRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n}\n\nfunction toScreenRect(editor: Editor, bounds: SelectionBounds): ScreenRect {\n const topLeft = pageToScreen(editor.viewport, bounds.minX, bounds.minY);\n const topRight = pageToScreen(editor.viewport, bounds.maxX, bounds.minY);\n const bottomLeft = pageToScreen(editor.viewport, bounds.minX, bounds.maxY);\n const bottomRight = pageToScreen(editor.viewport, bounds.maxX, bounds.maxY);\n const minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n const minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n const maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n const maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n return {\n left: minX,\n top: minY,\n width: Math.max(0, maxX - minX),\n height: Math.max(0, maxY - minY),\n };\n}\n\nfunction resolveDrawColor(colorStyle: ColorStyle, theme: 'light' | 'dark'): string {\n return resolveThemeColor(colorStyle, theme);\n}\n\nfunction getHandlePagePoint(bounds: SelectionBounds, handle: ResizeHandle): { x: number; y: number } {\n switch (handle) {\n case 'nw': return { x: bounds.minX, y: bounds.minY };\n case 'ne': return { x: bounds.maxX, y: bounds.minY };\n case 'sw': return { x: bounds.minX, y: bounds.maxY };\n case 'se': return { x: bounds.maxX, y: bounds.maxY };\n }\n}\n\nconst ZOOM_WHEEL_CAP = 10;\n\nconst VIEW_ONLY_TOOLS = new Set<ToolId>(['select', 'hand']);\n\nexport function useTsdrawCanvasController(options: UseTsdrawCanvasControllerOptions = {}): TsdrawCanvasController {\n const onMountRef = useRef(options.onMount);\n const onChangeRef = useRef(options.onChange);\n const onCameraChangeRef = useRef(options.onCameraChange);\n const onToolChangeRef = useRef(options.onToolChange);\n const cameraOptionsRef = useRef(options.cameraOptions);\n const touchOptionsRef = useRef(options.touchOptions);\n const keyboardShortcutsRef = useRef(options.keyboardShortcuts);\n const penOptionsRef = useRef(options.penOptions);\n const readOnlyRef = useRef(options.readOnly ?? false);\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<Editor | null>(null);\n const dprRef = useRef(1);\n const penDetectedRef = useRef(false);\n const penModeRef = useRef(false);\n const lastPointerDownWithRef = useRef<'mouse' | 'touch' | 'pen'>('mouse');\n const activePointerIdsRef = useRef(new Set<number>());\n const lastPointerClientRef = useRef<{ x: number; y: number } | null>(null);\n const currentToolRef = useRef<ToolId>(options.initialTool ?? 'pen');\n const selectedShapeIdsRef = useRef<ShapeId[]>([]);\n const schedulePersistRef = useRef<(() => void) | null>(null);\n const isPointerActiveRef = useRef(false);\n const pendingRemoteDocumentRef = useRef<TsdrawDocumentSnapshot | null>(null);\n const activeCameraSlideRef = useRef<CameraSlideAnimation | null>(null);\n const selectionRotationRef = useRef(0);\n const resizeRef = useRef<{\n handle: ResizeHandle | null;\n startBounds: ReturnType<typeof getSelectionBoundsPage>;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n cursorHandleOffset: { x: number; y: number };\n }>({\n handle: null,\n startBounds: null,\n startShapes: new Map(),\n cursorHandleOffset: { x: 0, y: 0 },\n });\n const rotateRef = useRef<{\n center: { x: number; y: number } | null;\n startAngle: number;\n startSelectionRotationDeg: number;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n }>({\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: 0,\n startShapes: new Map(),\n });\n const selectDragRef = useRef<{\n mode: SelectDragMode;\n startPage: { x: number; y: number };\n currentPage: { x: number; y: number };\n startPositions: ReturnType<typeof buildStartPositions>;\n additive: boolean;\n initialSelection: ShapeId[];\n }>({\n mode: 'none',\n startPage: { x: 0, y: 0 },\n currentPage: { x: 0, y: 0 },\n startPositions: new Map(),\n additive: false,\n initialSelection: [],\n });\n\n const [currentTool, setCurrentToolState] = useState<ToolId>(options.initialTool ?? 'pen');\n const [drawColor, setDrawColor] = useState<ColorStyle>('black');\n const [drawDash, setDrawDash] = useState<DashStyle>('draw');\n const [drawFill, setDrawFill] = useState<FillStyle>('none');\n const [drawSize, setDrawSize] = useState<SizeStyle>('m');\n const [selectedShapeIds, setSelectedShapeIds] = useState<ShapeId[]>([]);\n const [selectionBrush, setSelectionBrush] = useState<ScreenRect | null>(null);\n const [selectionBounds, setSelectionBounds] = useState<ScreenRect | null>(null);\n const [selectionRotationDeg, setSelectionRotationDeg] = useState(0);\n const [isMovingSelection, setIsMovingSelection] = useState(false);\n const [isResizingSelection, setIsResizingSelection] = useState(false);\n const [isRotatingSelection, setIsRotatingSelection] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [isPersistenceReady, setIsPersistenceReady] = useState(!options.persistenceKey);\n const [pointerScreenPoint, setPointerScreenPoint] = useState({ x: 0, y: 0 });\n const [isPointerInsideCanvas, setIsPointerInsideCanvas] = useState(false);\n\n useEffect(() => { currentToolRef.current = currentTool; }, [currentTool]);\n useEffect(() => { onMountRef.current = options.onMount; }, [options.onMount]);\n useEffect(() => { onChangeRef.current = options.onChange; }, [options.onChange]);\n useEffect(() => { onCameraChangeRef.current = options.onCameraChange; }, [options.onCameraChange]);\n useEffect(() => { onToolChangeRef.current = options.onToolChange; }, [options.onToolChange]);\n useEffect(() => { cameraOptionsRef.current = options.cameraOptions; }, [options.cameraOptions]);\n useEffect(() => { touchOptionsRef.current = options.touchOptions; }, [options.touchOptions]);\n useEffect(() => { keyboardShortcutsRef.current = options.keyboardShortcuts; }, [options.keyboardShortcuts]);\n useEffect(() => { penOptionsRef.current = options.penOptions; }, [options.penOptions]);\n useEffect(() => { readOnlyRef.current = options.readOnly ?? false; }, [options.readOnly]);\n\n useEffect(() => {\n selectedShapeIdsRef.current = selectedShapeIds;\n }, [selectedShapeIds]);\n\n useEffect(() => {\n selectionRotationRef.current = selectionRotationDeg;\n }, [selectionRotationDeg]);\n\n useEffect(() => {\n schedulePersistRef.current?.();\n }, [selectedShapeIds, currentTool, drawColor, drawDash, drawFill, drawSize]);\n\n const render = useCallback(() => {\n const canvas = canvasRef.current;\n const editor = editorRef.current;\n if (!canvas || !editor) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = dprRef.current || 1;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr);\n editor.render(ctx);\n }, []);\n\n // Keep overlays screen-space bounds in sync with the current page-space selection\n const refreshSelectionBounds = useCallback((editor: Editor, ids = selectedShapeIdsRef.current) => {\n const pageBounds = getSelectionBoundsPage(editor, ids);\n setSelectionBounds(pageBounds ? toScreenRect(editor, pageBounds) : null);\n }, []);\n\n const getPagePointFromClient = useCallback((editor: Editor, clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(clientX - rect.left, clientY - rect.top);\n }, []);\n\n const updatePointerPreview = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const isInside =\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom;\n\n setIsPointerInsideCanvas(isInside);\n setPointerScreenPoint({\n x: clientX - rect.left,\n y: clientY - rect.top,\n });\n }, []);\n\n const resetSelectUi = useCallback(() => {\n setSelectionBrush(null);\n setSelectionRotationDeg(0);\n setIsMovingSelection(false);\n setIsResizingSelection(false);\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map(), cursorHandleOffset: { x: 0, y: 0 } };\n rotateRef.current = { center: null, startAngle: 0, startSelectionRotationDeg: 0, startShapes: new Map() };\n }, []);\n\n const handleResizePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n const canvas = canvasRef.current;\n if (!editor || !canvas || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n const handlePagePoint = getHandlePagePoint(bounds, handle);\n const pointerPage = getPagePointFromClient(editor, e.clientX, e.clientY);\n const cursorOffset = {\n x: pointerPage.x - handlePagePoint.x,\n y: pointerPage.y - handlePagePoint.y,\n };\n\n resizeRef.current = {\n handle,\n startBounds: bounds,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n cursorHandleOffset: cursorOffset,\n };\n isPointerActiveRef.current = true;\n activePointerIdsRef.current.add(e.pointerId);\n canvas.setPointerCapture(e.pointerId);\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'resize';\n editor.input.pointerDown(handlePagePoint.x, handlePagePoint.y, 0.5, false);\n selectDragRef.current.startPage = handlePagePoint;\n selectDragRef.current.currentPage = handlePagePoint;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsResizingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n const handleRotatePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n const canvas = canvasRef.current;\n if (!editor || !canvas || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n const center = {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n };\n const p = getPagePointFromClient(editor, e.clientX, e.clientY);\n rotateRef.current = {\n center,\n startAngle: Math.atan2(p.y - center.y, p.x - center.x),\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n };\n isPointerActiveRef.current = true;\n activePointerIdsRef.current.add(e.pointerId);\n canvas.setPointerCapture(e.pointerId);\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'rotate';\n editor.input.pointerDown(p.x, p.y, 0.5, false);\n selectDragRef.current.startPage = p;\n selectDragRef.current.currentPage = p;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsRotatingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) return;\n\n const initialTool = options.initialTool ?? 'pen';\n const cameraOpts = cameraOptionsRef.current;\n const touchOpts = touchOptionsRef.current;\n const toolShortcutMap = resolveToolShortcuts(keyboardShortcutsRef.current);\n const editor = new Editor({\n toolDefinitions: options.toolDefinitions,\n initialToolId: initialTool,\n zoomRange: cameraOpts?.zoomRange,\n });\n editor.renderer.setTheme(options.theme ?? 'light');\n if (!editor.tools.hasTool(initialTool)) {\n editor.setCurrentTool('pen');\n }\n\n if (options.snapshot) {\n editor.loadPersistenceSnapshot(options.snapshot);\n }\n\n let disposed = false;\n let ignorePersistenceChanges = false;\n let disposeMount: void | (() => void);\n let persistenceDb: TsdrawLocalIndexedDb | null = null;\n let persistenceChannel: BroadcastChannel | null = null;\n let isPersisting = false;\n let needsAnotherPersist = false;\n let persistenceActive = false;\n const persistenceKey = options.persistenceKey;\n const sessionId = getOrCreateSessionId();\n const syncHistoryState = () => {\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n };\n\n const activeTool = editor.getCurrentToolId();\n editorRef.current = editor;\n setCurrentToolState(activeTool);\n currentToolRef.current = activeTool;\n syncHistoryState();\n\n const initialStyle = editor.getCurrentDrawStyle();\n setDrawColor(initialStyle.color);\n setDrawDash(initialStyle.dash);\n setDrawFill(initialStyle.fill);\n setDrawSize(initialStyle.size);\n\n const resize = () => {\n const dpr = window.devicePixelRatio ?? 1;\n dprRef.current = dpr;\n const rect = container.getBoundingClientRect();\n canvas.width = Math.round(rect.width * dpr);\n canvas.height = Math.round(rect.height * dpr);\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n if (!persistenceActive) {\n editor.setViewport({ x: 0, y: 0, zoom: 1 });\n }\n render();\n refreshSelectionBounds(editor);\n };\n\n const persistSnapshot = async () => {\n if (!persistenceDb || !persistenceKey || ignorePersistenceChanges || disposed) return;\n const snapshot = editor.getPersistenceSnapshot({\n selectedShapeIds: selectedShapeIdsRef.current,\n });\n await persistenceDb.storeSnapshot({\n records: snapshot.document.records,\n state: snapshot.state,\n history: editor.getHistorySnapshot(),\n sessionId,\n });\n if (disposed) return;\n persistenceChannel?.postMessage({\n type: 'tsdraw:persisted',\n senderSessionId: sessionId,\n });\n };\n\n const schedulePersist = () => {\n if (!persistenceDb || !persistenceKey || disposed) return;\n const runPersist = async () => {\n if (isPersisting) {\n needsAnotherPersist = true;\n return;\n }\n\n isPersisting = true;\n try {\n do {\n needsAnotherPersist = false;\n await persistSnapshot();\n } while (needsAnotherPersist && !disposed);\n } catch (error) {\n console.error('tsdraw persistence failed', error);\n } finally {\n isPersisting = false;\n }\n };\n\n void runPersist();\n };\n\n schedulePersistRef.current = schedulePersist;\n\n const reconcileSelectionAfterDocumentLoad = () => {\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n refreshSelectionBounds(editor, nextSelectedShapeIds);\n };\n\n const applyRemoteDocumentSnapshot = (document: TsdrawDocumentSnapshot) => {\n ignorePersistenceChanges = true;\n editor.loadDocumentSnapshot(document);\n editor.clearRedoHistory();\n reconcileSelectionAfterDocumentLoad();\n render();\n ignorePersistenceChanges = false;\n };\n\n const applyLoadedSnapshot = (snapshot: Partial<TsdrawEditorSnapshot>) => {\n ignorePersistenceChanges = true;\n const nextSelectionIds = editor.loadPersistenceSnapshot(snapshot);\n setSelectedShapeIds(nextSelectionIds);\n selectedShapeIdsRef.current = nextSelectionIds;\n const nextTool = editor.getCurrentToolId();\n currentToolRef.current = nextTool;\n setCurrentToolState(nextTool);\n const nextDrawStyle = editor.getCurrentDrawStyle();\n setDrawColor(nextDrawStyle.color);\n setDrawDash(nextDrawStyle.dash);\n setDrawFill(nextDrawStyle.fill);\n setDrawSize(nextDrawStyle.size);\n render();\n refreshSelectionBounds(editor, nextSelectionIds);\n ignorePersistenceChanges = false;\n };\n\n const getPagePoint = (e: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(e.clientX - rect.left, e.clientY - rect.top);\n };\n\n const sampleEvents = (e: PointerEvent) => {\n const coalesced = e.getCoalescedEvents?.();\n return coalesced && coalesced.length > 0 ? coalesced : [e];\n };\n\n const applyDocumentChangeResult = (changed: boolean) => {\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n render();\n syncHistoryState();\n return true;\n };\n\n const normalizeWheelDelta = (event: WheelEvent) => {\n let deltaX = event.deltaX;\n let deltaY = event.deltaY;\n let deltaZoom = 0;\n if (event.ctrlKey || event.metaKey || event.altKey) {\n const clamped = Math.abs(deltaY) > ZOOM_WHEEL_CAP ? ZOOM_WHEEL_CAP * Math.sign(deltaY) : deltaY;\n deltaZoom = -clamped / 100;\n } else if (event.shiftKey && !navigator.userAgent.includes('Mac') && !navigator.userAgent.includes('iPhone') && !navigator.userAgent.includes('iPad')) {\n deltaX = deltaY;\n deltaY = 0;\n }\n return { x: -deltaX, y: -deltaY, z: deltaZoom };\n };\n\n const deleteCurrentSelection = () => {\n const selectedIds = selectedShapeIdsRef.current;\n if (selectedIds.length === 0) return false;\n editor.beginHistoryEntry();\n editor.deleteShapes(selectedIds);\n editor.endHistoryEntry();\n setSelectedShapeIds([]);\n selectedShapeIdsRef.current = [];\n setSelectionBounds(null);\n resetSelectUi();\n render();\n syncHistoryState();\n return true;\n };\n\n const cancelActivePointerInteraction = () => {\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n editor.input.pointerUp();\n if (currentToolRef.current === 'select') {\n resetSelectUi();\n } else {\n editor.tools.pointerUp();\n }\n editor.endHistoryEntry();\n render();\n refreshSelectionBounds(editor);\n };\n const emitCameraChange = () => {\n onCameraChangeRef.current?.({ ...editor.viewport });\n };\n\n const touchInteractions = createTouchInteractionController(editor, canvas, {\n cancelActivePointerInteraction,\n refreshView: () => {\n render();\n refreshSelectionBounds(editor);\n emitCameraChange();\n },\n runUndo: () => applyDocumentChangeResult(editor.undo()),\n runRedo: () => applyDocumentChangeResult(editor.redo()),\n isPenModeActive: () => penModeRef.current,\n getSlideOptions: () => ({\n enabled: cameraOptionsRef.current?.slideEnabled !== false,\n slideOptions: { friction: cameraOptionsRef.current?.slideFriction },\n }),\n }, touchOpts);\n\n const hasRealPressure = (pressure: number | undefined) => pressure != null && pressure > 0 && pressure !== 0.5;\n\n const stopActiveSlide = () => {\n if (activeCameraSlideRef.current) {\n activeCameraSlideRef.current.stop();\n activeCameraSlideRef.current = null;\n }\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n if (!canvas.contains(e.target as Node)) return;\n if (cameraOptionsRef.current?.locked && e.pointerType !== 'pen') return;\n\n stopActiveSlide();\n\n const penAutoDetect = penOptionsRef.current?.autoDetect !== false;\n if (penAutoDetect && !penDetectedRef.current && (e.pointerType === 'pen' || hasRealPressure(e.pressure))) {\n penDetectedRef.current = true;\n penModeRef.current = true;\n }\n lastPointerDownWithRef.current = e.pointerType as 'mouse' | 'touch' | 'pen';\n activePointerIdsRef.current.add(e.pointerId);\n\n const startedCameraGesture = touchInteractions.handlePointerDown(e);\n if (startedCameraGesture || touchInteractions.isCameraGestureActive() || touchInteractions.isFingerPanActive()) {\n e.preventDefault();\n if (!canvas.hasPointerCapture(e.pointerId)) {\n canvas.setPointerCapture(e.pointerId);\n }\n return;\n }\n\n const isTouchBlockedByPenMode = penModeRef.current && e.pointerType === 'touch';\n\n if (isTouchBlockedByPenMode) { return; }\n if (activePointerIdsRef.current.size > 1) { return; }\n if (readOnlyRef.current && !VIEW_ONLY_TOOLS.has(currentToolRef.current)) { return; }\n\n isPointerActiveRef.current = true;\n editor.beginHistoryEntry();\n canvas.setPointerCapture(e.pointerId);\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n updatePointerPreview(e.clientX, e.clientY);\n\n const first = sampleEvents(e)[0]!;\n const { x, y } = getPagePoint(first);\n const pressureSensitivity = penOptionsRef.current?.pressureSensitivity ?? 1;\n const pressure = (first.pressure ?? 0.5) * pressureSensitivity;\n const isPen = first.pointerType === 'pen' || hasRealPressure(first.pressure);\n\n if (currentToolRef.current === 'select') {\n const hit = getTopShapeAtPoint(editor, { x, y });\n const isHitSelected = !!(hit && selectedShapeIdsRef.current.includes(hit.id));\n\n const isInsideSelectionBounds = (() => {\n if (selectedShapeIdsRef.current.length === 0) return false;\n const pageBounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!pageBounds) return false;\n return x >= pageBounds.minX && x <= pageBounds.maxX && y >= pageBounds.minY && y <= pageBounds.maxY;\n })();\n\n if (isHitSelected || isInsideSelectionBounds) {\n selectDragRef.current = {\n mode: 'move',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: buildStartPositions(editor, selectedShapeIdsRef.current),\n additive: false,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setIsMovingSelection(true);\n return;\n }\n\n selectDragRef.current = {\n mode: 'marquee',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: new Map(),\n additive: first.shiftKey,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setSelectionBrush(toScreenRect(editor, { minX: x, minY: y, maxX: x, maxY: y }));\n if (!e.shiftKey) {\n setSelectedShapeIds([]);\n selectedShapeIdsRef.current = [];\n setSelectionBounds(null);\n setSelectionRotationDeg(0);\n }\n return;\n }\n\n editor.input.pointerDown(x, y, pressure, isPen);\n editor.input.setModifiers(first.shiftKey, first.ctrlKey, first.metaKey);\n editor.tools.pointerDown({ point: { x, y, z: pressure }, screenX: e.clientX, screenY: e.clientY });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n const penAutoDetectOnMove = penOptionsRef.current?.autoDetect !== false;\n if (penAutoDetectOnMove && !penDetectedRef.current && (e.pointerType === 'pen' || hasRealPressure(e.pressure))) {\n penDetectedRef.current = true;\n penModeRef.current = true;\n }\n if (touchInteractions.handlePointerMove(e)) {\n e.preventDefault();\n return;\n }\n if (penModeRef.current && e.pointerType === 'touch' && !isPointerActiveRef.current) return;\n if (activePointerIdsRef.current.size > 1) return;\n updatePointerPreview(e.clientX, e.clientY);\n const prevClient = lastPointerClientRef.current;\n const dx = prevClient ? e.clientX - prevClient.x : 0;\n const dy = prevClient ? e.clientY - prevClient.y : 0;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n\n const movePressureSensitivity = penOptionsRef.current?.pressureSensitivity ?? 1;\n for (const sample of sampleEvents(e)) {\n const { x, y } = getPagePoint(sample);\n const pressure = (sample.pressure ?? 0.5) * movePressureSensitivity;\n const isPen = sample.pointerType === 'pen' || hasRealPressure(sample.pressure);\n editor.input.pointerMove(x, y, pressure, isPen);\n }\n\n if (currentToolRef.current === 'select') {\n const mode = selectDragRef.current.mode;\n const { x: px, y: py } = editor.input.getCurrentPagePoint();\n\n if (mode === 'rotate') {\n const { center, startAngle, startSelectionRotationDeg, startShapes } = rotateRef.current;\n if (!center) return;\n const angle = Math.atan2(py - center.y, px - center.x);\n const delta = angle - startAngle;\n setSelectionRotationDeg(startSelectionRotationDeg + (delta * 180) / Math.PI);\n applyRotation(editor, startShapes, center, delta);\n render();\n return;\n }\n\n // Resize and move both work using captured snapshots so the transform stays stable throughout the drag instead of adding up shape updates on each pointer move\n if (mode === 'resize') {\n const { handle, startBounds, startShapes, cursorHandleOffset } = resizeRef.current;\n if (!handle || !startBounds) return;\n applyResize(editor, handle, startBounds, startShapes, { x: px - cursorHandleOffset.x, y: py - cursorHandleOffset.y }, e.shiftKey);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n if (mode === 'move') {\n const drag = selectDragRef.current;\n applyMove(editor, drag.startPositions, px - drag.startPage.x, py - drag.startPage.y);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n // Marquee selection updates live as brush changes so that the overlay matches feedback\n if (mode === 'marquee') {\n selectDragRef.current.currentPage = { x: px, y: py };\n const pageRect = normalizeSelectionBounds(selectDragRef.current.startPage, selectDragRef.current.currentPage);\n setSelectionBrush(toScreenRect(editor, pageRect));\n const ids = getShapesInBounds(editor, pageRect);\n const nextIds = selectDragRef.current.additive ? Array.from(new Set([...selectDragRef.current.initialSelection, ...ids])) : ids;\n setSelectedShapeIds(nextIds);\n selectedShapeIdsRef.current = nextIds;\n refreshSelectionBounds(editor, nextIds);\n return;\n }\n }\n\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.pointerMove({ screenDeltaX: dx, screenDeltaY: dy, screenX: e.clientX, screenY: e.clientY });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n activePointerIdsRef.current.delete(e.pointerId);\n const hadTouchCameraGesture = touchInteractions.handlePointerUpOrCancel(e);\n if (hadTouchCameraGesture || touchInteractions.isCameraGestureActive()) {\n e.preventDefault();\n return;\n }\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n updatePointerPreview(e.clientX, e.clientY);\n const { x, y } = getPagePoint(e);\n editor.input.pointerMove(x, y);\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n\n // Rotation resets overlay back to normal selection box after release while rotated geometry stays\n if (drag.mode === 'rotate') {\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n setSelectionRotationDeg(0);\n rotateRef.current = { center: null, startAngle: 0, startSelectionRotationDeg: 0, startShapes: new Map() };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'resize') {\n setIsResizingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map(), cursorHandleOffset: { x: 0, y: 0 } };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'move') {\n setIsMovingSelection(false);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'marquee') {\n const rect = normalizeSelectionBounds(drag.startPage, { x, y });\n const moved = Math.abs(x - drag.startPage.x) > 2 || Math.abs(y - drag.startPage.y) > 2;\n let ids: ShapeId[] = [];\n\n if (!moved) {\n const hit = getTopShapeAtPoint(editor, { x, y });\n if (hit) {\n ids = drag.additive ? Array.from(new Set([...drag.initialSelection, hit.id])) : [hit.id];\n } else {\n ids = drag.additive ? drag.initialSelection : [];\n }\n } else {\n ids = getShapesInBounds(editor, rect);\n if (drag.additive) {\n ids = Array.from(new Set([...drag.initialSelection, ...ids]));\n }\n }\n\n setSelectedShapeIds(ids);\n selectedShapeIdsRef.current = ids;\n setSelectionBrush(null);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor, ids);\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n return;\n }\n }\n\n let handPanSession = null as ReturnType<HandDraggingState['getPanSession']>;\n if (currentToolRef.current === 'hand') {\n const currentState = editor.tools.getCurrentState();\n if (currentState instanceof HandDraggingState) {\n handPanSession = currentState.getPanSession();\n }\n }\n\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n\n if (handPanSession && cameraOptionsRef.current?.slideEnabled !== false) {\n activeCameraSlideRef.current = startCameraSlide(\n handPanSession,\n (slideDx, slideDy) => { editor.panBy(slideDx, slideDy); emitCameraChange(); },\n () => { render(); refreshSelectionBounds(editor); },\n { friction: cameraOptionsRef.current?.slideFriction }\n );\n }\n\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n };\n\n const handlePointerCancel = (e: PointerEvent) => {\n activePointerIdsRef.current.delete(e.pointerId);\n const hadTouchCameraGesture = touchInteractions.handlePointerUpOrCancel(e);\n if (hadTouchCameraGesture || touchInteractions.isCameraGestureActive()) return;\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n if (drag.mode === 'rotate') setIsRotatingSelection(false);\n if (drag.mode === 'resize') setIsResizingSelection(false);\n if (drag.mode === 'move') setIsMovingSelection(false);\n if (drag.mode === 'marquee') setSelectionBrush(null);\n if (drag.mode !== 'none') {\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n }\n editor.endHistoryEntry();\n } else {\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n }\n\n if (pendingRemoteDocumentRef.current) {\n const pending = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pending);\n }\n };\n\n const handleWheel = (e: WheelEvent) => {\n if (!container.contains(e.target as Node)) return;\n e.preventDefault();\n const camOpts = cameraOptionsRef.current;\n if (camOpts?.locked) return;\n if (camOpts?.wheelBehavior === 'none') return;\n if (touchInteractions.isTrackpadZoomActive()) return;\n const delta = normalizeWheelDelta(e);\n const panMultiplier = camOpts?.panSpeed ?? 1;\n const zoomMultiplier = camOpts?.zoomSpeed ?? 1;\n if (delta.z !== 0) {\n const rect = canvas.getBoundingClientRect();\n const pointX = e.clientX - rect.left;\n const pointY = e.clientY - rect.top;\n editor.zoomAt(Math.exp(delta.z * zoomMultiplier), pointX, pointY);\n } else {\n editor.panBy(delta.x * panMultiplier, delta.y * panMultiplier);\n }\n render();\n refreshSelectionBounds(editor);\n emitCameraChange();\n };\n\n const handleGestureEvent = (e: Event) => {\n touchInteractions.handleGestureEvent(e, container);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (keyboardShortcutsRef.current?.enabled === false) return;\n const isReadOnly = readOnlyRef.current;\n handleKeyboardShortcutKeyDown(e, {\n isToolAvailable: (tool) => {\n if (isReadOnly && !VIEW_ONLY_TOOLS.has(tool)) return false;\n return editor.tools.hasTool(tool);\n },\n setToolFromShortcut: (tool) => {\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n if (tool !== 'select') resetSelectUi();\n render();\n onToolChangeRef.current?.(tool);\n },\n runHistoryShortcut: (shouldRedo) => {\n if (isReadOnly) return false;\n return applyDocumentChangeResult(shouldRedo ? editor.redo() : editor.undo());\n },\n deleteSelection: () => {\n if (isReadOnly) return false;\n return currentToolRef.current === 'select' ? deleteCurrentSelection() : false;\n },\n dispatchKeyDown: (event) => {\n editor.input.setModifiers(event.shiftKey, event.ctrlKey, event.metaKey);\n editor.tools.keyDown({ key: event.key });\n render();\n },\n dispatchKeyUp: () => undefined,\n }, toolShortcutMap);\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n handleKeyboardShortcutKeyUp(e, {\n isToolAvailable: () => false,\n setToolFromShortcut: () => undefined,\n runHistoryShortcut: () => false,\n deleteSelection: () => false,\n dispatchKeyDown: () => undefined,\n dispatchKeyUp: (event) => {\n editor.input.setModifiers(event.shiftKey, event.ctrlKey, event.metaKey);\n editor.tools.keyUp({ key: event.key });\n render();\n },\n });\n };\n\n const initializePersistence = async () => {\n if (!persistenceKey) { setIsPersistenceReady(true); return; }\n\n try {\n persistenceDb = new TsdrawLocalIndexedDb(persistenceKey);\n const loaded = await persistenceDb.load(sessionId);\n const snapshot: Partial<TsdrawEditorSnapshot> = {};\n if (loaded.records.length > 0) {\n snapshot.document = { records: loaded.records };\n }\n if (loaded.state) {\n snapshot.state = loaded.state;\n }\n if (snapshot.document || snapshot.state) {\n applyLoadedSnapshot(snapshot);\n }\n editor.loadHistorySnapshot(loaded.history);\n syncHistoryState();\n\n if (disposed) return;\n persistenceActive = true;\n if (typeof BroadcastChannel !== 'undefined') {\n persistenceChannel = new BroadcastChannel(`tsdraw:persistence:${persistenceKey}`);\n let isLoadingRemote = false;\n let pendingRemoteLoad = false;\n persistenceChannel.onmessage = () => {\n if (disposed) return;\n if (isLoadingRemote) {\n pendingRemoteLoad = true;\n return;\n }\n isLoadingRemote = true;\n const processLoad = async () => {\n try {\n do {\n pendingRemoteLoad = false;\n if (!persistenceDb || disposed) return;\n const nextLoaded = await persistenceDb.load(sessionId);\n if (disposed) return;\n if (nextLoaded.records.length > 0) {\n const nextDocument: TsdrawDocumentSnapshot = { records: nextLoaded.records };\n if (isPointerActiveRef.current) {\n pendingRemoteDocumentRef.current = nextDocument;\n return;\n }\n applyRemoteDocumentSnapshot(nextDocument);\n }\n } while (pendingRemoteLoad && !disposed);\n } finally {\n isLoadingRemote = false;\n }\n };\n void processLoad();\n };\n }\n } finally {\n if (!disposed) { setIsPersistenceReady(true); }\n }\n };\n\n const cleanupEditorListener = editor.listen(() => {\n if (ignorePersistenceChanges) return;\n schedulePersist();\n onChangeRef.current?.(editor.getDocumentSnapshot());\n });\n const cleanupHistoryListener = editor.listenHistory(() => {\n syncHistoryState();\n if (ignorePersistenceChanges) return;\n schedulePersist();\n });\n\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n const handlePointerLeaveViewport = (e: PointerEvent) => {\n if (e.relatedTarget === null) {\n setIsPointerInsideCanvas(false);\n }\n };\n\n canvas.addEventListener('pointerdown', handlePointerDown);\n container.addEventListener('wheel', handleWheel, { passive: false });\n document.addEventListener('gesturestart', handleGestureEvent);\n document.addEventListener('gesturechange', handleGestureEvent);\n document.addEventListener('gestureend', handleGestureEvent);\n document.documentElement.addEventListener('pointerleave', handlePointerLeaveViewport);\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerCancel);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n void initializePersistence().catch((error) => {\n console.error('failed to initialize tsdraw persistence', error);\n });\n\n disposeMount = onMountRef.current?.({\n editor,\n container,\n canvas,\n setTool: (tool) => {\n if (!editor.tools.hasTool(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n },\n getCurrentTool: () => editor.getCurrentToolId(),\n undo: () => {\n const changed = editor.undo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n render();\n syncHistoryState();\n return true;\n },\n redo: () => {\n const changed = editor.redo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n render();\n syncHistoryState();\n return true;\n },\n canUndo: () => editor.canUndo(),\n canRedo: () => editor.canRedo(),\n applyDrawStyle: (partial) => {\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.fill) setDrawFill(partial.fill);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n });\n\n if (options.autoFocus !== false) {\n container.focus({ preventScroll: true });\n }\n\n return () => {\n disposed = true;\n schedulePersistRef.current = null;\n cleanupEditorListener();\n cleanupHistoryListener();\n disposeMount?.();\n ro.disconnect();\n canvas.removeEventListener('pointerdown', handlePointerDown);\n container.removeEventListener('wheel', handleWheel);\n document.removeEventListener('gesturestart', handleGestureEvent);\n document.removeEventListener('gesturechange', handleGestureEvent);\n document.removeEventListener('gestureend', handleGestureEvent);\n document.documentElement.removeEventListener('pointerleave', handlePointerLeaveViewport);\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerCancel);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n isPointerActiveRef.current = false;\n activePointerIdsRef.current.clear();\n pendingRemoteDocumentRef.current = null;\n stopActiveSlide();\n touchInteractions.reset();\n persistenceChannel?.close();\n void persistenceDb?.close();\n editorRef.current = null;\n };\n }, [\n getPagePointFromClient,\n options.initialTool,\n options.persistenceKey,\n options.toolDefinitions,\n refreshSelectionBounds,\n resetSelectUi,\n render,\n updatePointerPreview,\n ]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.renderer.setTheme(options.theme ?? 'light');\n render();\n }, [options.theme, render]);\n\n const setTool = useCallback(\n (tool: ToolId) => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!editor.tools.hasTool(tool)) return;\n if (readOnlyRef.current && !VIEW_ONLY_TOOLS.has(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n if (tool !== 'select') resetSelectUi();\n onToolChangeRef.current?.(tool);\n },\n [resetSelectUi]\n );\n\n const applyDrawStyle = useCallback(\n (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.fill) setDrawFill(partial.fill);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n [render]\n );\n\n const undo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.undo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const redo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.redo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const isHoveringSelectionBounds = isPointerInsideCanvas\n && currentTool === 'select'\n && selectedShapeIds.length > 0\n && selectionBounds != null\n && pointerScreenPoint.x >= selectionBounds.left\n && pointerScreenPoint.x <= selectionBounds.left + selectionBounds.width\n && pointerScreenPoint.y >= selectionBounds.top\n && pointerScreenPoint.y <= selectionBounds.top + selectionBounds.height;\n\n const showToolOverlay = isPointerInsideCanvas && (currentTool === 'pen' || currentTool === 'eraser');\n const canvasCursor = getCanvasCursor(currentTool, {\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n isHoveringSelectionBounds,\n showToolOverlay,\n });\n const cursorContext: TsdrawCursorContext = {\n currentTool,\n defaultCursor: canvasCursor,\n showToolOverlay,\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n };\n const toolOverlay: TsdrawToolOverlayState = {\n visible: showToolOverlay,\n pointerX: pointerScreenPoint.x,\n pointerY: pointerScreenPoint.y,\n isPenPreview: currentTool === 'pen',\n penRadius: Math.max(2, STROKE_WIDTHS[drawSize] / 2),\n penColor: resolveDrawColor(drawColor, options.theme ?? 'light'),\n eraserRadius: ERASER_MARGIN,\n };\n\n return {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ColorStyle, DashStyle, DefaultToolId, FillStyle, SizeStyle, ToolDefinition, ToolId, Viewport, TsdrawDocumentSnapshot, TsdrawEditorSnapshot } from '@tsdraw/core';\nimport type { TsdrawCameraOptions, TsdrawTouchOptions, TsdrawKeyboardShortcutOptions, TsdrawPenOptions } from '../canvas/canvasOptions.js';\nimport { SelectionOverlay } from './SelectionOverlay.js';\nimport { StylePanel, type TsdrawStylePanelCustomPart, type TsdrawStylePanelPartItem } from './StylePanel.js';\nimport { ToolOverlay } from './ToolOverlay.js';\nimport { Toolbar, getDefaultToolbarIcon, type ToolbarPart } from './Toolbar.js';\nimport {\n useTsdrawCanvasController,\n type TsdrawCursorContext,\n type TsdrawMountApi,\n type TsdrawToolOverlayState,\n} from '../canvas/useTsdrawCanvasController.js';\n\nconst DEFAULT_TOOLBAR_PARTS: ToolbarPartItem[][] = [['undo', 'redo'], ['select', 'hand', 'pen', 'eraser', 'square', 'circle']];\nconst EMPTY_CUSTOM_TOOLS: TsdrawCustomTool[] = [];\nconst EMPTY_CUSTOM_ELEMENTS: TsdrawCustomElement[] = [];\nconst EMPTY_STYLE_PANEL_PARTS: TsdrawStylePanelPartItem[] = [];\nconst EMPTY_STYLE_PANEL_CUSTOM_PARTS: TsdrawStylePanelCustomPart[] = [];\nconst DEFAULT_STYLE_PANEL_PARTS_BY_TOOL: Partial<Record<DefaultToolId, TsdrawStylePanelPartItem[]>> = {\n pen: ['colors', 'dashes', 'sizes'],\n square: ['colors', 'dashes', 'fills', 'sizes'],\n circle: ['colors', 'dashes', 'fills', 'sizes'],\n};\n\nconst DEFAULT_TOOL_LABELS: Record<DefaultToolId, string> = {\n select: 'Select',\n pen: 'Pen',\n square: 'Rectangle',\n circle: 'Ellipse',\n eraser: 'Eraser',\n hand: 'Hand',\n};\n\ntype VerticalPart = 'top' | 'bottom' | 'center';\ntype HorizontalPart = 'left' | 'right' | 'center';\nexport type UiAnchor = | `${VerticalPart}-${HorizontalPart}` | `${HorizontalPart}-${VerticalPart}`;\n\nfunction parseAnchor(anchor: UiAnchor): { vertical: VerticalPart; horizontal: HorizontalPart } {\n const parts = anchor.split('-') as string[];\n let vertical: VerticalPart = 'center';\n let horizontal: HorizontalPart = 'center';\n for (const part of parts) {\n if (part === 'top' || part === 'bottom') vertical = part;\n else if (part === 'left' || part === 'right') horizontal = part;\n }\n return { vertical, horizontal };\n}\n\nexport interface TsdrawCustomTool {\n id: ToolId;\n label: string;\n icon: ReactNode;\n iconSelected?: ReactNode;\n definition: ToolDefinition;\n stylePanel?: {\n parts?: TsdrawStylePanelPartItem[];\n customParts?: TsdrawStylePanelCustomPart[];\n };\n}\n\nexport type TsdrawToolbarBuiltInAction = 'undo' | 'redo';\nexport type ToolbarPartItem = ToolId | TsdrawToolbarBuiltInAction;\n\nexport interface TsdrawUiPlacement {\n anchor?: UiAnchor;\n offsetX?: number;\n offsetY?: number;\n style?: CSSProperties;\n}\n\nexport interface TsdrawUiOptions {\n toolbar?: {\n hide?: boolean;\n placement?: TsdrawUiPlacement;\n parts?: ToolbarPartItem[][];\n };\n stylePanel?: {\n hide?: boolean;\n placement?: TsdrawUiPlacement;\n };\n customElements?: TsdrawCustomElement[];\n cursor?: {\n getCursor?: (context: TsdrawCursorContext) => string;\n };\n overlays?: {\n renderToolOverlay?: (args: {\n defaultOverlay: ReactNode;\n overlayState: TsdrawToolOverlayState;\n currentTool: ToolId;\n }) => ReactNode;\n };\n}\n\nexport interface TsdrawCustomElementRenderArgs {\n currentTool: ToolId;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n}\n\nexport interface TsdrawCustomElement {\n id: string;\n placement?: TsdrawUiPlacement;\n render: (args: TsdrawCustomElementRenderArgs) => ReactNode;\n}\n\nexport interface TsdrawProps {\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n theme?: 'light' | 'dark' | 'system';\n persistenceKey?: string;\n customTools?: TsdrawCustomTool[];\n initialToolId?: ToolId;\n uiOptions?: TsdrawUiOptions;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n cameraOptions?: TsdrawCameraOptions;\n touchOptions?: TsdrawTouchOptions;\n keyboardShortcuts?: TsdrawKeyboardShortcutOptions;\n penOptions?: TsdrawPenOptions;\n readOnly?: boolean;\n autoFocus?: boolean;\n snapshot?: TsdrawEditorSnapshot;\n onChange?: (snapshot: TsdrawDocumentSnapshot) => void;\n onCameraChange?: (viewport: Viewport) => void;\n onToolChange?: (toolId: ToolId) => void;\n}\n\nexport type TsdrawCanvasProps = TsdrawProps;\n\nfunction isToolbarAction(item: ToolbarPartItem): item is TsdrawToolbarBuiltInAction {\n return item === 'undo' || item === 'redo';\n}\n\nfunction resolvePlacementStyle(\n placement: TsdrawUiPlacement | undefined,\n fallbackAnchor: UiAnchor,\n fallbackOffsetX: number,\n fallbackOffsetY: number\n): CSSProperties {\n const anchor = placement?.anchor ?? fallbackAnchor;\n const offsetX = placement?.offsetX ?? fallbackOffsetX;\n const offsetY = placement?.offsetY ?? fallbackOffsetY;\n const { vertical, horizontal } = parseAnchor(anchor);\n const result: CSSProperties = {};\n const transforms: string[] = [];\n\n if (horizontal === 'left') {\n result.left = offsetX;\n } else if (horizontal === 'right') {\n result.right = offsetX;\n } else {\n result.left = '50%';\n transforms.push('translateX(-50%)');\n if (offsetX) transforms.push(`translateX(${offsetX}px)`);\n }\n\n if (vertical === 'top') {\n result.top = offsetY;\n } else if (vertical === 'bottom') {\n result.bottom = offsetY;\n } else {\n result.top = '50%';\n transforms.push('translateY(-50%)');\n if (offsetY) transforms.push(`translateY(${offsetY}px)`);\n }\n\n if (transforms.length > 0) result.transform = transforms.join(' ');\n\n return placement?.style ? { ...result, ...placement.style } : result;\n}\n\nexport function Tsdraw(props: TsdrawProps) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n const customTools = props.customTools ?? EMPTY_CUSTOM_TOOLS;\n const toolbarPartIds = props.uiOptions?.toolbar?.parts ?? DEFAULT_TOOLBAR_PARTS;\n const customToolMap = useMemo(\n () => new Map(customTools.map((customTool) => [customTool.id, customTool])),\n [customTools]\n );\n const toolbarToolIds = useMemo(() => {\n const ids = new Set<ToolId>();\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n ids.add(item);\n }\n }\n }\n return ids;\n }, [customToolMap, toolbarPartIds]);\n const toolDefinitions = useMemo(\n () => customTools.filter((customTool) => toolbarToolIds.has(customTool.id)).map((customTool) => customTool.definition),\n [customTools, toolbarToolIds]\n );\n const firstToolbarTool = useMemo(() => {\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n return item;\n }\n }\n }\n return undefined;\n }, [customToolMap, toolbarPartIds]);\n const initialTool: ToolId = props.initialToolId ?? firstToolbarTool ?? 'pen';\n const requestedTheme = props.theme ?? 'light';\n\n // Themes and so that system theme works\n useEffect(() => {\n if (requestedTheme !== 'system' || typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const syncSystemTheme = () => setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n\n syncSystemTheme();\n mediaQuery.addEventListener('change', syncSystemTheme);\n\n return () => mediaQuery.removeEventListener('change', syncSystemTheme);\n }, [requestedTheme]);\n\n const resolvedTheme = requestedTheme === 'system' ? systemTheme : requestedTheme;\n\n const {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor: defaultCanvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n } = useTsdrawCanvasController({\n toolDefinitions,\n initialTool,\n theme: resolvedTheme,\n persistenceKey: props.persistenceKey,\n onMount: props.onMount,\n cameraOptions: props.cameraOptions,\n touchOptions: props.touchOptions,\n keyboardShortcuts: props.keyboardShortcuts,\n penOptions: props.penOptions,\n readOnly: props.readOnly,\n autoFocus: props.autoFocus,\n snapshot: props.snapshot,\n onChange: props.onChange,\n onCameraChange: props.onCameraChange,\n onToolChange: props.onToolChange,\n });\n\n const toolbarPlacementStyle = resolvePlacementStyle(props.uiOptions?.toolbar?.placement, 'bottom-center', 0, 14);\n const stylePanelPlacementStyle = resolvePlacementStyle(props.uiOptions?.stylePanel?.placement, 'top-right', 8, 8);\n const isToolbarHidden = props.uiOptions?.toolbar?.hide === true;\n const isStylePanelHidden = props.uiOptions?.stylePanel?.hide === true || props.readOnly === true;\n const canvasCursor = props.uiOptions?.cursor?.getCursor?.(cursorContext) ?? defaultCanvasCursor;\n const defaultToolOverlay = (\n <ToolOverlay\n visible={toolOverlay.visible}\n pointerX={toolOverlay.pointerX}\n pointerY={toolOverlay.pointerY}\n isPenPreview={toolOverlay.isPenPreview}\n penRadius={toolOverlay.penRadius}\n penColor={toolOverlay.penColor}\n eraserRadius={toolOverlay.eraserRadius}\n />\n );\n const overlayNode = props.uiOptions?.overlays?.renderToolOverlay?.({ defaultOverlay: defaultToolOverlay, overlayState: toolOverlay, currentTool }) ?? defaultToolOverlay;\n const customElements = props.uiOptions?.customElements ?? EMPTY_CUSTOM_ELEMENTS;\n const onColorSelect = useCallback((color: ColorStyle) => {\n applyDrawStyle({ color });\n }, [applyDrawStyle]);\n const onDashSelect = useCallback((dash: DashStyle) => {\n applyDrawStyle({ dash });\n }, [applyDrawStyle]);\n const onFillSelect = useCallback((fill: FillStyle) => {\n applyDrawStyle({ fill });\n }, [applyDrawStyle]);\n const onSizeSelect = useCallback((size: SizeStyle) => {\n applyDrawStyle({ size });\n }, [applyDrawStyle]);\n const activeCustomTool = customToolMap.get(currentTool);\n const stylePanelParts = useMemo<TsdrawStylePanelPartItem[]>(\n () => {\n const fromCustomTool = activeCustomTool?.stylePanel?.parts;\n if (fromCustomTool && fromCustomTool.length > 0) return fromCustomTool;\n if (activeCustomTool?.stylePanel?.customParts && activeCustomTool.stylePanel.customParts.length > 0) return activeCustomTool.stylePanel.customParts.map((customPart) => customPart.id);\n if (currentTool in DEFAULT_STYLE_PANEL_PARTS_BY_TOOL) return DEFAULT_STYLE_PANEL_PARTS_BY_TOOL[currentTool as DefaultToolId] ?? EMPTY_STYLE_PANEL_PARTS;\n return EMPTY_STYLE_PANEL_PARTS;\n },\n [activeCustomTool, currentTool]\n );\n const stylePanelCustomParts = activeCustomTool?.stylePanel?.customParts ?? EMPTY_STYLE_PANEL_CUSTOM_PARTS;\n const toolbarParts = useMemo<ToolbarPart[]>(\n () =>\n toolbarPartIds\n .map((toolbarPart, partIndex) => {\n const items = toolbarPart\n .map((item) => {\n if (item === 'undo') {\n return {\n type: 'action' as const,\n id: 'undo' as const,\n label: 'Undo',\n disabled: !canUndo,\n onSelect: undo,\n };\n }\n\n if (item === 'redo') {\n return {\n type: 'action' as const,\n id: 'redo' as const,\n label: 'Redo',\n disabled: !canRedo,\n onSelect: redo,\n };\n }\n\n if (item in DEFAULT_TOOL_LABELS) {\n return {\n type: 'tool' as const,\n id: item,\n label: DEFAULT_TOOL_LABELS[item as DefaultToolId],\n icon: (isActive: boolean) => getDefaultToolbarIcon(item, isActive),\n };\n }\n\n const customTool = customToolMap.get(item);\n if (!customTool) return null;\n return {\n type: 'tool' as const,\n id: customTool.id,\n label: customTool.label,\n icon: (isActive: boolean) => (isActive && customTool.iconSelected ? customTool.iconSelected : customTool.icon),\n };\n })\n .filter((nextItem): nextItem is NonNullable<typeof nextItem> => nextItem != null);\n return {\n id: `toolbar-part-${partIndex.toString(36)}`,\n items,\n };\n })\n .filter((part) => part.items.length > 0),\n [canRedo, canUndo, customToolMap, redo, toolbarPartIds, undo]\n );\n\n return (\n <div\n ref={containerRef}\n tabIndex={0}\n className={`tsdraw tsdraw-${resolvedTheme}mode ${props.className ?? ''}`}\n style={{\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n position: 'relative',\n overflow: 'hidden',\n outline: 'none',\n ...props.style,\n }}\n >\n <canvas\n ref={canvasRef}\n style={{\n display: 'block',\n width: '100%',\n height: '100%',\n touchAction: 'none',\n cursor: canvasCursor,\n }}\n data-testid=\"tsdraw-canvas\"\n />\n {overlayNode}\n <SelectionOverlay\n selectionBrush={selectionBrush}\n selectionBounds={selectionBounds}\n selectionRotationDeg={selectionRotationDeg}\n currentTool={currentTool}\n selectedCount={selectedShapeIds.length}\n onRotatePointerDown={handleRotatePointerDown}\n onResizePointerDown={handleResizePointerDown}\n />\n <StylePanel\n visible={!isStylePanelHidden && isPersistenceReady && stylePanelParts.length > 0}\n parts={stylePanelParts}\n customParts={stylePanelCustomParts}\n style={stylePanelPlacementStyle}\n theme={resolvedTheme}\n drawColor={drawColor}\n drawDash={drawDash}\n drawFill={drawFill}\n drawSize={drawSize}\n onColorSelect={onColorSelect}\n onDashSelect={onDashSelect}\n onFillSelect={onFillSelect}\n onSizeSelect={onSizeSelect}\n />\n {customElements.map((customElement) => (\n <div\n key={customElement.id}\n style={{\n position: 'absolute',\n zIndex: 130,\n pointerEvents: 'all',\n ...resolvePlacementStyle(customElement.placement, 'top-left', 8, 8),\n }}\n >\n {customElement.render({ currentTool, setTool, applyDrawStyle })}\n </div>\n ))}\n {!isToolbarHidden ? (\n <Toolbar\n parts={toolbarParts}\n style={toolbarPlacementStyle}\n currentTool={isPersistenceReady ? currentTool : null}\n onToolChange={setTool}\n disabled={!isPersistenceReady}\n />\n ) : null}\n </div>\n );\n}\n\nexport function TsdrawCanvas(props: TsdrawCanvasProps) {\n return <Tsdraw {...props} />;\n}"]}
1
+ {"version":3,"sources":["../src/components/SelectionOverlay.tsx","../src/components/StylePanel.tsx","../src/components/ToolOverlay.tsx","../src/components/Toolbar.tsx","../src/canvas/cursor.ts","../src/canvas/touchInteractions.ts","../src/canvas/keyboardShortcuts.ts","../src/persistence/localIndexedDb.ts","../src/persistence/sessionId.ts","../src/canvas/useTsdrawCanvasController.ts","../src/components/TsdrawCanvas.tsx"],"names":["jsxs","Fragment","jsx","DEFAULT_COLORS","resolveThemeColor","IconPointer","IconPencil","IconSquare","IconCircle","IconEraser","IconHandStop","IconArrowBackUp","IconArrowForwardUp","isSelectTool","beginCameraPan","moveCameraPan","startCameraSlide","pageToScreen","useRef","useState","useEffect","useCallback","renderCanvasBackground","getSelectionBoundsPage","buildTransformSnapshots","Editor","document","getTopShapeAtPoint","buildStartPositions","applyRotation","applyResize","applyMove","normalizeSelectionBounds","getShapesInBounds","HandDraggingState","STROKE_WIDTHS","ERASER_MARGIN","useMemo"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { ResizeHandle, ToolId } from '@tsdraw/core';\nimport type { ScreenRect } from '../types.js';\n\ninterface SelectionOverlayProps {\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n currentTool: ToolId;\n selectedCount: number;\n onRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n onResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n}\n\nexport function SelectionOverlay({\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n currentTool,\n selectedCount,\n onRotatePointerDown,\n onResizePointerDown,\n}: SelectionOverlayProps) {\n return (\n <>\n {selectionBrush && (\n <div\n className=\"tsdraw-selection-brush\"\n style={{\n left: selectionBrush.left,\n top: selectionBrush.top,\n width: selectionBrush.width,\n height: selectionBrush.height,\n }}\n />\n )}\n {selectionBounds && (\n <div\n className=\"tsdraw-selection-frame\"\n style={{\n left: selectionBounds.left,\n top: selectionBounds.top,\n width: selectionBounds.width,\n height: selectionBounds.height,\n transform: `rotate(${selectionRotationDeg}deg)`,\n }}\n >\n <div className=\"tsdraw-selection-bounds\" />\n {currentTool === 'select' && selectedCount > 0 && (\n <>\n <div className=\"tsdraw-rotation-stem\" />\n <button\n type=\"button\"\n className=\"tsdraw-rotation-handle\"\n aria-label=\"Rotate selection\"\n onPointerDown={onRotatePointerDown}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--nw\"\n style={{ left: '0%', top: '0%' }}\n aria-label=\"Resize top left\"\n onPointerDown={(e) => onResizePointerDown(e, 'nw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--ne\"\n style={{ left: '100%', top: '0%' }}\n aria-label=\"Resize top right\"\n onPointerDown={(e) => onResizePointerDown(e, 'ne')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--sw\"\n style={{ left: '0%', top: '100%' }}\n aria-label=\"Resize bottom left\"\n onPointerDown={(e) => onResizePointerDown(e, 'sw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--se\"\n style={{ left: '100%', top: '100%' }}\n aria-label=\"Resize bottom right\"\n onPointerDown={(e) => onResizePointerDown(e, 'se')}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}","import { DEFAULT_COLORS, resolveThemeColor } from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, FillStyle, SizeStyle } from '@tsdraw/core';\nimport type { CSSProperties, ReactNode } from 'react';\n\nconst STYLE_COLORS = Object.entries(DEFAULT_COLORS)\n .filter(([key]) => key !== 'white')\n .map(([value]) => ({ value }));\n\nconst STYLE_DASHES: DashStyle[] = ['draw', 'solid', 'dashed', 'dotted'];\nconst STYLE_FILLS: FillStyle[] = ['none', 'blank', 'semi', 'solid'];\nconst STYLE_SIZES: SizeStyle[] = ['s', 'm', 'l', 'xl'];\n\nexport type TsdrawStylePanelPartItem = | 'colors' | 'dashes' | 'fills' | 'sizes' | (string & {});\n\nexport interface TsdrawStylePanelRenderContext {\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawFill: FillStyle;\n drawSize: SizeStyle;\n onColorSelect: (color: ColorStyle) => void;\n onDashSelect: (dash: DashStyle) => void;\n onFillSelect: (fill: FillStyle) => void;\n onSizeSelect: (size: SizeStyle) => void;\n}\n\nexport interface TsdrawStylePanelCustomPart {\n id: string;\n render: (context: TsdrawStylePanelRenderContext) => ReactNode;\n}\n\ninterface StylePanelProps extends TsdrawStylePanelRenderContext {\n visible: boolean;\n parts: TsdrawStylePanelPartItem[];\n customParts?: TsdrawStylePanelCustomPart[];\n style?: CSSProperties;\n theme: 'light' | 'dark';\n}\n\nexport function StylePanel({\n visible,\n parts,\n customParts,\n style,\n theme,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n onColorSelect,\n onDashSelect,\n onFillSelect,\n onSizeSelect,\n}: StylePanelProps) {\n if (!visible || parts.length === 0) return null;\n\n const context: TsdrawStylePanelRenderContext = {\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n onColorSelect,\n onDashSelect,\n onFillSelect,\n onSizeSelect,\n };\n const customPartMap = new Map((customParts ?? []).map((customPart) => [customPart.id, customPart]));\n\n return (\n <div className=\"tsdraw-style-panel\" style={style} aria-label=\"Draw style panel\">\n {parts.map((part) => {\n if (part === 'colors') {\n return (\n <div key={part} className=\"tsdraw-style-colors\">\n {STYLE_COLORS.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n className=\"tsdraw-style-color\"\n data-active={drawColor === item.value ? 'true' : undefined}\n aria-label={`Color ${item.value}`}\n title={item.value}\n onClick={() => onColorSelect(item.value)}\n >\n <span\n className=\"tsdraw-style-color-dot\"\n style={{ background: resolveThemeColor(item.value, theme) }}\n />\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'dashes') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_DASHES.map((dash) => (\n <button\n key={dash}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawDash === dash ? 'true' : undefined}\n aria-label={`Stroke ${dash}`}\n title={dash}\n onClick={() => onDashSelect(dash)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-preview-line tsdraw-style-preview-line--${dash}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'fills') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_FILLS.map((fill) => (\n <button\n key={fill}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawFill === fill ? 'true' : undefined}\n aria-label={`Fill ${fill}`}\n title={fill}\n onClick={() => onFillSelect(fill)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-fill tsdraw-style-fill--${fill}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'sizes') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_SIZES.map((size) => (\n <button\n key={size}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawSize === size ? 'true' : undefined}\n aria-label={`Thickness ${size}`}\n title={size}\n onClick={() => onSizeSelect(size)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-size tsdraw-style-size--${size}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n const customPart = customPartMap.get(part);\n if (!customPart) return null;\n return (\n <div key={part} className=\"tsdraw-style-section tsdraw-style-section--custom\">\n {customPart.render(context)}\n </div>\n );\n })}\n </div>\n );\n}","interface ToolOverlayProps {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport function ToolOverlay({\n visible,\n pointerX,\n pointerY,\n isPenPreview,\n penRadius,\n penColor,\n eraserRadius,\n}: ToolOverlayProps) {\n if (!visible) return null;\n\n return (\n <div className=\"tsdraw-tool-overlay\" aria-hidden=\"true\">\n {isPenPreview ? (\n <span\n className=\"tsdraw-tool-dot\"\n style={{\n left: pointerX,\n top: pointerY,\n width: penRadius * 2,\n height: penRadius * 2,\n backgroundColor: penColor,\n }}\n />\n ) : (\n <span\n className=\"tsdraw-tool-ring\"\n style={{\n left: pointerX,\n top: pointerY,\n width: eraserRadius * 2,\n height: eraserRadius * 2,\n }}\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport type { ToolId } from '@tsdraw/core';\nimport { IconArrowBackUp, IconArrowForwardUp, IconEraser, IconHandStop, IconPencil, IconPointer, IconSquare, IconCircle } from '@tabler/icons-react';\n\nexport interface ToolbarToolItem {\n type: 'tool';\n id: ToolId;\n label: string;\n icon: ReactNode | ((isActive: boolean) => ReactNode);\n}\n\nexport interface ToolbarActionItem {\n type: 'action';\n id: 'undo' | 'redo';\n label: string;\n disabled: boolean;\n onSelect: () => void;\n}\n\nexport type ToolbarRenderItem = ToolbarToolItem | ToolbarActionItem;\n\nexport interface ToolbarPart {\n id: string;\n items: ToolbarRenderItem[];\n}\n\ninterface ToolbarProps {\n parts: ToolbarPart[];\n currentTool: ToolId | null;\n onToolChange: (tool: ToolId) => void;\n disabled?: boolean;\n style?: CSSProperties;\n}\n\nexport function getDefaultToolbarIcon(toolId: ToolId, isActive: boolean): ReactNode {\n if (toolId === 'select') return <IconPointer size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'pen') return <IconPencil size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'square') return <IconSquare size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'circle') return <IconCircle size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'eraser') return <IconEraser size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'hand') return <IconHandStop size={16} stroke={isActive ? 1 : 1.8} fill={isActive ? 'currentColor' : 'none'} style={isActive ? { stroke: '#000000' } : undefined} />;\n return null;\n}\n\nfunction getActionIcon(actionId: 'undo' | 'redo'): ReactNode {\n if (actionId === 'undo') return <IconArrowBackUp size={16} stroke={1.8} />;\n return <IconArrowForwardUp size={16} stroke={1.8} />;\n}\n\nexport function Toolbar({ parts, currentTool, onToolChange, disabled, style }: ToolbarProps) {\n return (\n <div className=\"tsdraw-toolbar\" style={style}>\n {parts.map((part, partIndex) => (\n <div key={part.id} className=\"tsdraw-toolbar-part\">\n {part.items.map((item) => {\n if (item.type === 'action') {\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n onClick={item.onSelect}\n title={item.label}\n aria-label={item.label}\n disabled={disabled || item.disabled}\n >\n {getActionIcon(item.id)}\n </button>\n );\n }\n\n const isActive = currentTool === item.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n data-active={isActive ? 'true' : undefined}\n onClick={() => onToolChange(item.id)}\n title={item.label}\n aria-label={item.label}\n disabled={disabled}\n >\n {typeof item.icon === 'function' ? item.icon(isActive) : item.icon}\n </button>\n );\n })}\n {partIndex < parts.length - 1 ? <div className=\"tsdraw-toolbar-separator\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n","import type { ToolId } from '@tsdraw/core';\nimport { isSelectTool } from '@tsdraw/core';\n\nexport function getCanvasCursor(\n currentTool: ToolId,\n state: {\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n isHoveringSelectionBounds: boolean;\n showToolOverlay: boolean;\n }\n) {\n if (currentTool === 'hand') return 'grab';\n\n if (isSelectTool(currentTool)) {\n if (state.isRotatingSelection) return 'grabbing';\n if (state.isResizingSelection) return 'nwse-resize';\n if (state.isMovingSelection) return 'grabbing';\n if (state.isHoveringSelectionBounds) return 'move';\n return 'default';\n }\n\n return state.showToolOverlay ? 'none' : 'crosshair'; // Let tool overlay handle the cursor\n}","import {\n type Editor,\n type CameraPanSession,\n type CameraSlideAnimation,\n type CameraSlideOptions,\n beginCameraPan,\n moveCameraPan,\n startCameraSlide,\n} from '@tsdraw/core';\nimport type { TsdrawTouchOptions } from './canvasOptions.js';\n\nconst TAP_MAX_DURATION_MS = 100; // the max time of a tap gesture\nconst DOUBLE_TAP_INTERVAL_MS = 100; // the min time between double taps\nconst TAP_MOVE_TOLERANCE = 14; // the min distance user can move their finger to register as a tap\nconst PINCH_MODE_ZOOM_DISTANCE = 24; // the min distance user can pinch to zoom the camera\nconst PINCH_MODE_PAN_DISTANCE = 16; // the min distance user can pinch to pan the camera\nconst PINCH_MODE_SWITCH_TO_ZOOM_DISTANCE = 64; // the min distance user can pinch to switch from panning to zooming\n\ntype TouchCameraMode = 'not-sure' | 'zooming' | 'panning';\n\ninterface TouchTapState {\n active: boolean;\n startTime: number;\n maxTouchCount: number;\n moved: boolean;\n startPoints: Map<number, { x: number; y: number }>;\n lastTapAtByCount: Partial<Record<2 | 3, number>>;\n}\n\ninterface TouchCameraState {\n active: boolean;\n mode: TouchCameraMode;\n previousCenter: { x: number; y: number };\n initialCenter: { x: number; y: number };\n initialDistance: number;\n initialZoom: number;\n}\n\nexport interface TouchInteractionHandlers {\n cancelActivePointerInteraction: () => void;\n refreshView: () => void;\n runUndo: () => boolean;\n runRedo: () => boolean;\n isPenModeActive: () => boolean;\n getSlideOptions: () => { enabled: boolean; slideOptions?: CameraSlideOptions };\n}\n\nexport interface TouchInteractionController {\n handlePointerDown: (event: PointerEvent) => boolean;\n handlePointerMove: (event: PointerEvent) => boolean;\n handlePointerUpOrCancel: (event: PointerEvent) => boolean;\n handleGestureEvent: (event: Event, container: HTMLElement) => void;\n reset: () => void;\n isCameraGestureActive: () => boolean;\n isFingerPanActive: () => boolean;\n isTrackpadZoomActive: () => boolean;\n}\n\nexport function createTouchInteractionController(\n editor: Editor,\n canvas: HTMLCanvasElement,\n handlers: TouchInteractionHandlers,\n touchOptions?: TsdrawTouchOptions\n): TouchInteractionController {\n const allowPinchZoom = touchOptions?.pinchToZoom !== false;\n const allowFingerPan = touchOptions?.fingerPanInPenMode !== false;\n const allowTapUndoRedo = touchOptions?.tapUndoRedo !== false;\n const allowTrackpadGestures = touchOptions?.trackpadGestures !== false;\n const activeTouchPoints = new Map<number, { x: number; y: number }>();\n const touchTapState: TouchTapState = {\n active: false,\n startTime: 0,\n maxTouchCount: 0,\n moved: false,\n startPoints: new Map(),\n lastTapAtByCount: {},\n };\n const touchCameraState: TouchCameraState = {\n active: false,\n mode: 'not-sure',\n previousCenter: { x: 0, y: 0 },\n initialCenter: { x: 0, y: 0 },\n initialDistance: 1,\n initialZoom: 1,\n };\n\n let fingerPanPointerId: number | null = null;\n let fingerPanSession: CameraPanSession | null = null;\n let fingerPanSlide: CameraSlideAnimation | null = null;\n\n const isTouchPointer = (event: PointerEvent) => event.pointerType === 'touch';\n\n const stopFingerPanSlide = () => {\n if (fingerPanSlide) {\n fingerPanSlide.stop();\n fingerPanSlide = null;\n }\n };\n\n const endFingerPan = () => {\n fingerPanPointerId = null;\n fingerPanSession = null;\n };\n\n const endTouchCameraGesture = () => {\n touchCameraState.active = false;\n touchCameraState.mode = 'not-sure';\n touchCameraState.initialDistance = 1;\n touchCameraState.initialZoom = 1;\n };\n\n const maybeHandleTouchTapGesture = () => {\n if (activeTouchPoints.size > 0) return;\n if (!touchTapState.active) return;\n\n const elapsed = performance.now() - touchTapState.startTime;\n if (allowTapUndoRedo && !touchTapState.moved && elapsed <= TAP_MAX_DURATION_MS && (touchTapState.maxTouchCount === 2 || touchTapState.maxTouchCount === 3)) {\n const fingerCount = touchTapState.maxTouchCount as 2 | 3;\n const now = performance.now();\n const previousTapTime = touchTapState.lastTapAtByCount[fingerCount] ?? 0;\n const isDoubleTap = previousTapTime > 0 && now - previousTapTime <= DOUBLE_TAP_INTERVAL_MS;\n if (isDoubleTap) {\n touchTapState.lastTapAtByCount[fingerCount] = 0;\n if (fingerCount === 2) {\n if (handlers.runUndo()) handlers.refreshView();\n } else if (handlers.runRedo()) handlers.refreshView();\n } else touchTapState.lastTapAtByCount[fingerCount] = now;\n }\n\n touchTapState.active = false;\n touchTapState.startPoints.clear();\n touchTapState.maxTouchCount = 0;\n touchTapState.moved = false;\n };\n\n const beginTouchCameraGesture = () => {\n const points = [...activeTouchPoints.values()];\n if (points.length !== 2) return;\n\n handlers.cancelActivePointerInteraction();\n const first = points[0]!;\n const second = points[1]!;\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n const distance = Math.hypot(second.x - first.x, second.y - first.y);\n\n touchCameraState.active = true;\n touchCameraState.mode = 'not-sure';\n touchCameraState.previousCenter = center;\n touchCameraState.initialCenter = center;\n touchCameraState.initialDistance = Math.max(1, distance);\n touchCameraState.initialZoom = editor.getZoomLevel();\n };\n\n const updateTouchCameraGesture = () => {\n if (!touchCameraState.active) return false;\n const points = [...activeTouchPoints.values()];\n if (points.length !== 2) {\n endTouchCameraGesture();\n return false;\n }\n\n const first = points[0]!;\n const second = points[1]!;\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n const distance = Math.max(1, Math.hypot(second.x - first.x, second.y - first.y));\n const centerDx = center.x - touchCameraState.previousCenter.x;\n const centerDy = center.y - touchCameraState.previousCenter.y;\n const touchDistance = Math.abs(distance - touchCameraState.initialDistance);\n const originDistance = Math.hypot(center.x - touchCameraState.initialCenter.x, center.y - touchCameraState.initialCenter.y);\n\n if (touchCameraState.mode === 'not-sure') {\n if (allowPinchZoom && touchDistance > PINCH_MODE_ZOOM_DISTANCE) touchCameraState.mode = 'zooming';\n else if (originDistance > PINCH_MODE_PAN_DISTANCE) touchCameraState.mode = 'panning';\n } else if (allowPinchZoom && touchCameraState.mode === 'panning' && touchDistance > PINCH_MODE_SWITCH_TO_ZOOM_DISTANCE) touchCameraState.mode = 'zooming';\n\n const canvasRect = canvas.getBoundingClientRect();\n const centerOnCanvasX = center.x - canvasRect.left;\n const centerOnCanvasY = center.y - canvasRect.top;\n\n if (touchCameraState.mode === 'zooming') {\n const targetZoom = Math.max(0.1, Math.min(4, touchCameraState.initialZoom * (distance / touchCameraState.initialDistance)));\n const pannedX = editor.viewport.x + centerDx;\n const pannedY = editor.viewport.y + centerDy;\n const pageAtCenterX = (centerOnCanvasX - pannedX) / editor.viewport.zoom;\n const pageAtCenterY = (centerOnCanvasY - pannedY) / editor.viewport.zoom;\n editor.setViewport({\n x: centerOnCanvasX - pageAtCenterX * targetZoom,\n y: centerOnCanvasY - pageAtCenterY * targetZoom,\n zoom: targetZoom,\n });\n } else {\n editor.panBy(centerDx, centerDy);\n }\n\n touchCameraState.previousCenter = center;\n handlers.refreshView();\n return true;\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!isTouchPointer(event)) return false;\n\n stopFingerPanSlide();\n activeTouchPoints.set(event.pointerId, { x: event.clientX, y: event.clientY });\n if (!touchTapState.active) {\n touchTapState.active = true;\n touchTapState.startTime = performance.now();\n touchTapState.maxTouchCount = activeTouchPoints.size;\n touchTapState.moved = false;\n touchTapState.startPoints.clear();\n } else {\n touchTapState.maxTouchCount = Math.max(touchTapState.maxTouchCount, activeTouchPoints.size);\n }\n touchTapState.startPoints.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n if (activeTouchPoints.size === 2) {\n endFingerPan();\n beginTouchCameraGesture();\n return true;\n }\n\n if (allowFingerPan && handlers.isPenModeActive() && activeTouchPoints.size === 1) {\n handlers.cancelActivePointerInteraction();\n fingerPanPointerId = event.pointerId;\n fingerPanSession = beginCameraPan(editor.viewport, event.clientX, event.clientY);\n return true;\n }\n\n return false;\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!isTouchPointer(event)) return false;\n if (activeTouchPoints.has(event.pointerId)) activeTouchPoints.set(event.pointerId, { x: event.clientX, y: event.clientY });\n \n const tapStart = touchTapState.startPoints.get(event.pointerId);\n if (tapStart) {\n const moved = Math.hypot(event.clientX - tapStart.x, event.clientY - tapStart.y);\n if (moved > TAP_MOVE_TOLERANCE) touchTapState.moved = true;\n }\n\n if (fingerPanPointerId === event.pointerId && fingerPanSession) {\n const target = moveCameraPan(fingerPanSession, event.clientX, event.clientY);\n editor.setViewport({ x: target.x, y: target.y });\n handlers.refreshView();\n return true;\n }\n\n return updateTouchCameraGesture();\n };\n\n const handlePointerUpOrCancel = (event: PointerEvent) => {\n if (!isTouchPointer(event)) return false;\n const wasCameraGestureActive = touchCameraState.active;\n const wasFingerPan = fingerPanPointerId === event.pointerId;\n const releasedPanSession = wasFingerPan ? fingerPanSession : null;\n activeTouchPoints.delete(event.pointerId);\n touchTapState.startPoints.delete(event.pointerId);\n if (activeTouchPoints.size < 2) endTouchCameraGesture();\n if (wasFingerPan) {\n endFingerPan();\n if (releasedPanSession) {\n const slideConfig = handlers.getSlideOptions();\n if (slideConfig.enabled) {\n fingerPanSlide = startCameraSlide(\n releasedPanSession,\n (dx, dy) => editor.panBy(dx, dy),\n () => handlers.refreshView(),\n slideConfig.slideOptions\n );\n }\n }\n }\n maybeHandleTouchTapGesture();\n return wasCameraGestureActive || wasFingerPan;\n };\n\n let gestureLastScale = 1;\n let gestureActive = false;\n\n const handleGestureEvent = (event: Event, container: HTMLElement) => {\n if (!container.contains(event.target as Node)) return;\n event.preventDefault();\n if (!allowTrackpadGestures) return;\n\n const gestureEvent = event as Event & { scale?: number; clientX?: number; clientY?: number };\n if (gestureEvent.scale == null) return;\n\n if (event.type === 'gesturestart') {\n gestureLastScale = gestureEvent.scale;\n gestureActive = true;\n return;\n }\n\n if (event.type === 'gestureend') {\n gestureActive = false;\n gestureLastScale = 1;\n return;\n }\n\n if (event.type === 'gesturechange' && gestureActive) {\n const zoomFactor = gestureEvent.scale / gestureLastScale;\n gestureLastScale = gestureEvent.scale;\n const canvasRect = canvas.getBoundingClientRect();\n const cx = (gestureEvent.clientX ?? canvasRect.left + canvasRect.width / 2) - canvasRect.left;\n const cy = (gestureEvent.clientY ?? canvasRect.top + canvasRect.height / 2) - canvasRect.top;\n editor.zoomAt(zoomFactor, cx, cy);\n handlers.refreshView();\n }\n };\n\n const reset = () => {\n activeTouchPoints.clear();\n touchTapState.active = false;\n touchTapState.startPoints.clear();\n endTouchCameraGesture();\n endFingerPan();\n stopFingerPanSlide();\n };\n\n return {\n handlePointerDown,\n handlePointerMove,\n handlePointerUpOrCancel,\n handleGestureEvent,\n reset,\n isCameraGestureActive: () => touchCameraState.active,\n isFingerPanActive: () => fingerPanPointerId !== null,\n isTrackpadZoomActive: () => gestureActive,\n };\n}","import type { ToolId } from '@tsdraw/core';\nimport type { TsdrawKeyboardShortcutOptions } from './canvasOptions.js';\n\nconst DEFAULT_TOOL_SHORTCUTS: Partial<Record<string, ToolId>> = {\n v: 'select',\n h: 'hand',\n e: 'eraser',\n p: 'pen',\n b: 'pen',\n d: 'pen',\n x: 'pen',\n r: 'square',\n o: 'circle',\n c: 'circle',\n};\n\nexport function resolveToolShortcuts(shortcutOptions?: TsdrawKeyboardShortcutOptions): Partial<Record<string, ToolId>> {\n if (!shortcutOptions?.toolShortcuts) return DEFAULT_TOOL_SHORTCUTS;\n if (shortcutOptions.overrideDefaults) return { ...shortcutOptions.toolShortcuts };\n return { ...DEFAULT_TOOL_SHORTCUTS, ...shortcutOptions.toolShortcuts };\n}\n\nexport interface KeyboardShortcutHandlers {\n isToolAvailable: (tool: ToolId) => boolean;\n setToolFromShortcut: (tool: ToolId) => void;\n runHistoryShortcut: (shouldRedo: boolean) => boolean;\n deleteSelection: () => boolean;\n dispatchKeyDown: (event: KeyboardEvent) => void;\n dispatchKeyUp: (event: KeyboardEvent) => void;\n}\n\nexport function isEditableTarget(eventTarget: EventTarget | null): boolean {\n const element = eventTarget as HTMLElement | null;\n if (!element) return false;\n if (element.isContentEditable) return true;\n const tagName = element.tagName;\n return tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT';\n}\n\nexport function handleKeyboardShortcutKeyDown(\n event: KeyboardEvent,\n handlers: KeyboardShortcutHandlers,\n toolShortcutMap: Partial<Record<string, ToolId>> = DEFAULT_TOOL_SHORTCUTS\n): void {\n if (isEditableTarget(event.target)) return;\n\n const loweredKey = event.key.toLowerCase();\n const isMetaPressed = event.metaKey || event.ctrlKey;\n\n if (isMetaPressed && (loweredKey === 'z' || loweredKey === 'y')) {\n const shouldRedo = loweredKey === 'y' || (loweredKey === 'z' && event.shiftKey);\n if (handlers.runHistoryShortcut(shouldRedo)) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n if (!isMetaPressed && !event.altKey) {\n const nextToolId = toolShortcutMap[loweredKey];\n if (nextToolId && handlers.isToolAvailable(nextToolId)) {\n handlers.setToolFromShortcut(nextToolId);\n event.preventDefault();\n return;\n }\n }\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (handlers.deleteSelection()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n handlers.dispatchKeyDown(event);\n}\n\nexport function handleKeyboardShortcutKeyUp(event: KeyboardEvent, handlers: KeyboardShortcutHandlers): void {\n if (isEditableTarget(event.target)) return;\n handlers.dispatchKeyUp(event);\n}","import type { TsdrawHistorySnapshot, TsdrawPersistedRecord, TsdrawSessionStateSnapshot } from '@tsdraw/core';\n\nconst DATABASE_PREFIX = 'tsdraw_v1_';\nconst DATABASE_VERSION = 2;\n\nconst STORE = {\n records: 'records',\n state: 'state',\n history: 'history',\n} as const;\n\ninterface StateRow {\n id: string;\n snapshot: TsdrawSessionStateSnapshot;\n updatedAt: number;\n}\n\ninterface HistoryRow {\n id: string;\n snapshot: TsdrawHistorySnapshot;\n updatedAt: number;\n}\n\nexport interface LocalLoadResult {\n records: TsdrawPersistedRecord[];\n state: TsdrawSessionStateSnapshot | null;\n history: TsdrawHistorySnapshot | null;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n });\n}\n\nfunction transactionDone(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction aborted'));\n });\n}\n\nfunction openLocalDatabase(persistenceKey: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(`${DATABASE_PREFIX}${persistenceKey}`, DATABASE_VERSION);\n\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE.records)) { database.createObjectStore(STORE.records); }\n if (!database.objectStoreNames.contains(STORE.state)) { database.createObjectStore(STORE.state); }\n if (!database.objectStoreNames.contains(STORE.history)) { database.createObjectStore(STORE.history); }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Failed to open IndexedDB'));\n });\n}\n\nexport class TsdrawLocalIndexedDb {\n private readonly databasePromise: Promise<IDBDatabase>;\n\n constructor(persistenceKey: string) {\n this.databasePromise = openLocalDatabase(persistenceKey);\n }\n\n async close(): Promise<void> {\n const database = await this.databasePromise;\n database.close();\n }\n\n async load(sessionId: string): Promise<LocalLoadResult> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readonly');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n const records = (await requestToPromise(recordStore.getAll())) as TsdrawPersistedRecord[];\n let state = (await requestToPromise(stateStore.get(sessionId)) as StateRow | undefined)?.snapshot ?? null;\n let history = (await requestToPromise(historyStore.get(sessionId)) as HistoryRow | undefined)?.snapshot ?? null;\n\n if (!state) {\n const allStates = (await requestToPromise(stateStore.getAll())) as StateRow[];\n if (allStates.length > 0) {\n allStates.sort((left, right) => left.updatedAt - right.updatedAt);\n state = allStates[allStates.length - 1]?.snapshot ?? null;\n }\n }\n\n if (!history) {\n const allHistoryRows = (await requestToPromise(historyStore.getAll())) as HistoryRow[];\n if (allHistoryRows.length > 0) {\n allHistoryRows.sort((left, right) => left.updatedAt - right.updatedAt);\n history = allHistoryRows[allHistoryRows.length - 1]?.snapshot ?? null;\n }\n }\n\n await transactionDone(transaction);\n return { records, state, history };\n }\n\n async storeSnapshot(args: {\n records: TsdrawPersistedRecord[];\n sessionId: string;\n state: TsdrawSessionStateSnapshot;\n history: TsdrawHistorySnapshot;\n }): Promise<void> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readwrite');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n recordStore.clear();\n for (const record of args.records) {\n recordStore.put(record, record.id);\n }\n\n const stateRow: StateRow = {\n id: args.sessionId,\n snapshot: args.state,\n updatedAt: Date.now(),\n };\n stateStore.put(stateRow, args.sessionId);\n\n const historyRow: HistoryRow = {\n id: args.sessionId,\n snapshot: args.history,\n updatedAt: Date.now(),\n };\n historyStore.put(historyRow, args.sessionId);\n\n await transactionDone(transaction);\n }\n}\n\nexport function getPersistenceDatabaseName(persistenceKey: string): string {\n return `${DATABASE_PREFIX}${persistenceKey}`;\n}","const SESSION_STORAGE_KEY = 'TSDRAW_TAB_SESSION_ID_v1';\n\nfunction createSessionId(): string {\n const timestamp = Date.now().toString(36);\n const randomPart = Math.random().toString(36).slice(2, 10);\n return `tsdraw-session-${timestamp}-${randomPart}`;\n}\n\nexport function getOrCreateSessionId(): string {\n if (typeof window === 'undefined') return createSessionId();\n\n try {\n const existing = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n\n const newId = createSessionId();\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, newId);\n return newId;\n } catch {\n return createSessionId();\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { RefObject } from 'react';\nimport {\n Editor,\n ERASER_MARGIN,\n STROKE_WIDTHS,\n pageToScreen,\n normalizeSelectionBounds,\n applyMove,\n applyResize,\n applyRotation,\n buildStartPositions,\n buildTransformSnapshots,\n getSelectionBoundsPage,\n getShapesInBounds,\n getTopShapeAtPoint,\n resolveThemeColor,\n startCameraSlide,\n renderCanvasBackground,\n HandDraggingState,\n type CameraSlideAnimation,\n type ResizeHandle,\n type ToolDefinition,\n type ToolId,\n type Viewport,\n type TsdrawEditorSnapshot,\n type TsdrawBackgroundOptions,\n} from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, FillStyle, ShapeId, SizeStyle, SelectionBounds, TsdrawDocumentSnapshot } from '@tsdraw/core';\nimport { getCanvasCursor } from './cursor.js';\nimport { createTouchInteractionController } from './touchInteractions.js';\nimport { handleKeyboardShortcutKeyDown, handleKeyboardShortcutKeyUp, resolveToolShortcuts } from './keyboardShortcuts.js';\nimport type { ScreenRect } from '../types.js';\nimport { TsdrawLocalIndexedDb } from '../persistence/localIndexedDb.js';\nimport { getOrCreateSessionId } from '../persistence/sessionId.js';\nimport type { TsdrawCameraOptions, TsdrawTouchOptions, TsdrawKeyboardShortcutOptions, TsdrawPenOptions } from './canvasOptions.js';\n\ntype SelectDragMode = 'none' | 'marquee' | 'move' | 'resize' | 'rotate';\n\nexport interface TsdrawCursorContext {\n currentTool: ToolId;\n defaultCursor: string;\n showToolOverlay: boolean;\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n}\n\nexport interface TsdrawToolOverlayState {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport interface TsdrawMountApi {\n editor: Editor;\n container: HTMLDivElement;\n canvas: HTMLCanvasElement;\n setTool: (tool: ToolId) => void;\n getCurrentTool: () => ToolId;\n undo: () => boolean;\n redo: () => boolean;\n canUndo: () => boolean;\n canRedo: () => boolean;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n}\n\nexport interface UseTsdrawCanvasControllerOptions {\n toolDefinitions?: ToolDefinition[];\n initialTool?: ToolId;\n theme?: 'light' | 'dark';\n persistenceKey?: string;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n cameraOptions?: TsdrawCameraOptions;\n touchOptions?: TsdrawTouchOptions;\n keyboardShortcuts?: TsdrawKeyboardShortcutOptions;\n penOptions?: TsdrawPenOptions;\n background?: TsdrawBackgroundOptions;\n readOnly?: boolean;\n autoFocus?: boolean;\n snapshot?: TsdrawEditorSnapshot;\n onChange?: (snapshot: TsdrawDocumentSnapshot) => void;\n onCameraChange?: (viewport: Viewport) => void;\n onToolChange?: (toolId: ToolId) => void;\n}\n\nexport interface TsdrawCanvasController {\n containerRef: RefObject<HTMLDivElement>;\n canvasRef: RefObject<HTMLCanvasElement>;\n currentTool: ToolId;\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawFill: FillStyle;\n drawSize: SizeStyle;\n selectedShapeIds: ShapeId[];\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n canvasCursor: string;\n cursorContext: TsdrawCursorContext;\n toolOverlay: TsdrawToolOverlayState;\n isPersistenceReady: boolean;\n canUndo: boolean;\n canRedo: boolean;\n undo: () => boolean;\n redo: () => boolean;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n handleResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n handleRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n}\n\nfunction toScreenRect(editor: Editor, bounds: SelectionBounds): ScreenRect {\n const topLeft = pageToScreen(editor.viewport, bounds.minX, bounds.minY);\n const topRight = pageToScreen(editor.viewport, bounds.maxX, bounds.minY);\n const bottomLeft = pageToScreen(editor.viewport, bounds.minX, bounds.maxY);\n const bottomRight = pageToScreen(editor.viewport, bounds.maxX, bounds.maxY);\n const minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n const minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n const maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n const maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n return {\n left: minX,\n top: minY,\n width: Math.max(0, maxX - minX),\n height: Math.max(0, maxY - minY),\n };\n}\n\nfunction resolveDrawColor(colorStyle: ColorStyle, theme: 'light' | 'dark'): string {\n return resolveThemeColor(colorStyle, theme);\n}\n\nfunction getHandlePagePoint(bounds: SelectionBounds, handle: ResizeHandle): { x: number; y: number } {\n switch (handle) {\n case 'nw': return { x: bounds.minX, y: bounds.minY };\n case 'ne': return { x: bounds.maxX, y: bounds.minY };\n case 'sw': return { x: bounds.minX, y: bounds.maxY };\n case 'se': return { x: bounds.maxX, y: bounds.maxY };\n }\n}\n\nconst ZOOM_WHEEL_CAP = 10;\n\nconst VIEW_ONLY_TOOLS = new Set<ToolId>(['select', 'hand']);\n\nexport function useTsdrawCanvasController(options: UseTsdrawCanvasControllerOptions = {}): TsdrawCanvasController {\n const onMountRef = useRef(options.onMount);\n const onChangeRef = useRef(options.onChange);\n const onCameraChangeRef = useRef(options.onCameraChange);\n const onToolChangeRef = useRef(options.onToolChange);\n const cameraOptionsRef = useRef(options.cameraOptions);\n const touchOptionsRef = useRef(options.touchOptions);\n const keyboardShortcutsRef = useRef(options.keyboardShortcuts);\n const penOptionsRef = useRef(options.penOptions);\n const backgroundRef = useRef(options.background);\n const readOnlyRef = useRef(options.readOnly ?? false);\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<Editor | null>(null);\n const dprRef = useRef(1);\n const penDetectedRef = useRef(false);\n const penModeRef = useRef(false);\n const lastPointerDownWithRef = useRef<'mouse' | 'touch' | 'pen'>('mouse');\n const activePointerIdsRef = useRef(new Set<number>());\n const lastPointerClientRef = useRef<{ x: number; y: number } | null>(null);\n const currentToolRef = useRef<ToolId>(options.initialTool ?? 'pen');\n const selectedShapeIdsRef = useRef<ShapeId[]>([]);\n const schedulePersistRef = useRef<(() => void) | null>(null);\n const isPointerActiveRef = useRef(false);\n const pendingRemoteDocumentRef = useRef<TsdrawDocumentSnapshot | null>(null);\n const activeCameraSlideRef = useRef<CameraSlideAnimation | null>(null);\n const selectionRotationRef = useRef(0);\n const resizeRef = useRef<{\n handle: ResizeHandle | null;\n startBounds: ReturnType<typeof getSelectionBoundsPage>;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n cursorHandleOffset: { x: number; y: number };\n }>({\n handle: null,\n startBounds: null,\n startShapes: new Map(),\n cursorHandleOffset: { x: 0, y: 0 },\n });\n const rotateRef = useRef<{\n center: { x: number; y: number } | null;\n startAngle: number;\n startSelectionRotationDeg: number;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n }>({\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: 0,\n startShapes: new Map(),\n });\n const selectDragRef = useRef<{\n mode: SelectDragMode;\n startPage: { x: number; y: number };\n currentPage: { x: number; y: number };\n startPositions: ReturnType<typeof buildStartPositions>;\n additive: boolean;\n initialSelection: ShapeId[];\n }>({\n mode: 'none',\n startPage: { x: 0, y: 0 },\n currentPage: { x: 0, y: 0 },\n startPositions: new Map(),\n additive: false,\n initialSelection: [],\n });\n\n const [currentTool, setCurrentToolState] = useState<ToolId>(options.initialTool ?? 'pen');\n const [drawColor, setDrawColor] = useState<ColorStyle>('black');\n const [drawDash, setDrawDash] = useState<DashStyle>('draw');\n const [drawFill, setDrawFill] = useState<FillStyle>('none');\n const [drawSize, setDrawSize] = useState<SizeStyle>('m');\n const [selectedShapeIds, setSelectedShapeIds] = useState<ShapeId[]>([]);\n const [selectionBrush, setSelectionBrush] = useState<ScreenRect | null>(null);\n const [selectionBounds, setSelectionBounds] = useState<ScreenRect | null>(null);\n const [selectionRotationDeg, setSelectionRotationDeg] = useState(0);\n const [isMovingSelection, setIsMovingSelection] = useState(false);\n const [isResizingSelection, setIsResizingSelection] = useState(false);\n const [isRotatingSelection, setIsRotatingSelection] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [isPersistenceReady, setIsPersistenceReady] = useState(!options.persistenceKey);\n const [pointerScreenPoint, setPointerScreenPoint] = useState({ x: 0, y: 0 });\n const [isPointerInsideCanvas, setIsPointerInsideCanvas] = useState(false);\n\n useEffect(() => { currentToolRef.current = currentTool; }, [currentTool]);\n useEffect(() => { onMountRef.current = options.onMount; }, [options.onMount]);\n useEffect(() => { onChangeRef.current = options.onChange; }, [options.onChange]);\n useEffect(() => { onCameraChangeRef.current = options.onCameraChange; }, [options.onCameraChange]);\n useEffect(() => { onToolChangeRef.current = options.onToolChange; }, [options.onToolChange]);\n useEffect(() => { cameraOptionsRef.current = options.cameraOptions; }, [options.cameraOptions]);\n useEffect(() => { touchOptionsRef.current = options.touchOptions; }, [options.touchOptions]);\n useEffect(() => { keyboardShortcutsRef.current = options.keyboardShortcuts; }, [options.keyboardShortcuts]);\n useEffect(() => { penOptionsRef.current = options.penOptions; }, [options.penOptions]);\n useEffect(() => { backgroundRef.current = options.background; }, [options.background]);\n useEffect(() => { readOnlyRef.current = options.readOnly ?? false; }, [options.readOnly]);\n\n useEffect(() => {\n selectedShapeIdsRef.current = selectedShapeIds;\n }, [selectedShapeIds]);\n\n useEffect(() => {\n selectionRotationRef.current = selectionRotationDeg;\n }, [selectionRotationDeg]);\n\n useEffect(() => {\n schedulePersistRef.current?.();\n }, [selectedShapeIds, currentTool, drawColor, drawDash, drawFill, drawSize]);\n\n const render = useCallback(() => {\n const canvas = canvasRef.current;\n const editor = editorRef.current;\n if (!canvas || !editor) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = dprRef.current || 1;\n const logicalWidth = canvas.width / dpr;\n const logicalHeight = canvas.height / dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, logicalWidth, logicalHeight);\n renderCanvasBackground(ctx, editor.viewport, logicalWidth, logicalHeight, backgroundRef.current, editor.renderer.theme);\n editor.render(ctx);\n }, []);\n\n // Keep overlays screen-space bounds in sync with the current page-space selection\n const refreshSelectionBounds = useCallback((editor: Editor, ids = selectedShapeIdsRef.current) => {\n const pageBounds = getSelectionBoundsPage(editor, ids);\n setSelectionBounds(pageBounds ? toScreenRect(editor, pageBounds) : null);\n }, []);\n\n const getPagePointFromClient = useCallback((editor: Editor, clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(clientX - rect.left, clientY - rect.top);\n }, []);\n\n const updatePointerPreview = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const isInside =\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom;\n\n setIsPointerInsideCanvas(isInside);\n setPointerScreenPoint({\n x: clientX - rect.left,\n y: clientY - rect.top,\n });\n }, []);\n\n const resetSelectUi = useCallback(() => {\n setSelectionBrush(null);\n setSelectionRotationDeg(0);\n setIsMovingSelection(false);\n setIsResizingSelection(false);\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map(), cursorHandleOffset: { x: 0, y: 0 } };\n rotateRef.current = { center: null, startAngle: 0, startSelectionRotationDeg: 0, startShapes: new Map() };\n }, []);\n\n const handleResizePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n const canvas = canvasRef.current;\n if (!editor || !canvas || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n const handlePagePoint = getHandlePagePoint(bounds, handle);\n const pointerPage = getPagePointFromClient(editor, e.clientX, e.clientY);\n const cursorOffset = {\n x: pointerPage.x - handlePagePoint.x,\n y: pointerPage.y - handlePagePoint.y,\n };\n\n resizeRef.current = {\n handle,\n startBounds: bounds,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n cursorHandleOffset: cursorOffset,\n };\n isPointerActiveRef.current = true;\n activePointerIdsRef.current.add(e.pointerId);\n canvas.setPointerCapture(e.pointerId);\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'resize';\n editor.input.pointerDown(handlePagePoint.x, handlePagePoint.y, 0.5, false);\n selectDragRef.current.startPage = handlePagePoint;\n selectDragRef.current.currentPage = handlePagePoint;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsResizingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n const handleRotatePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n const canvas = canvasRef.current;\n if (!editor || !canvas || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n const center = {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n };\n const p = getPagePointFromClient(editor, e.clientX, e.clientY);\n rotateRef.current = {\n center,\n startAngle: Math.atan2(p.y - center.y, p.x - center.x),\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n };\n isPointerActiveRef.current = true;\n activePointerIdsRef.current.add(e.pointerId);\n canvas.setPointerCapture(e.pointerId);\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'rotate';\n editor.input.pointerDown(p.x, p.y, 0.5, false);\n selectDragRef.current.startPage = p;\n selectDragRef.current.currentPage = p;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsRotatingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) return;\n\n const initialTool = options.initialTool ?? 'pen';\n const cameraOpts = cameraOptionsRef.current;\n const touchOpts = touchOptionsRef.current;\n const toolShortcutMap = resolveToolShortcuts(keyboardShortcutsRef.current);\n const editor = new Editor({\n toolDefinitions: options.toolDefinitions,\n initialToolId: initialTool,\n zoomRange: cameraOpts?.zoomRange,\n });\n editor.renderer.setTheme(options.theme ?? 'light');\n if (!editor.tools.hasTool(initialTool)) {\n editor.setCurrentTool('pen');\n }\n\n if (options.snapshot) {\n editor.loadPersistenceSnapshot(options.snapshot);\n }\n\n let disposed = false;\n let ignorePersistenceChanges = false;\n let disposeMount: void | (() => void);\n let persistenceDb: TsdrawLocalIndexedDb | null = null;\n let persistenceChannel: BroadcastChannel | null = null;\n let isPersisting = false;\n let needsAnotherPersist = false;\n let persistenceActive = false;\n const persistenceKey = options.persistenceKey;\n const sessionId = getOrCreateSessionId();\n const syncHistoryState = () => {\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n };\n\n const activeTool = editor.getCurrentToolId();\n editorRef.current = editor;\n setCurrentToolState(activeTool);\n currentToolRef.current = activeTool;\n syncHistoryState();\n\n const initialStyle = editor.getCurrentDrawStyle();\n setDrawColor(initialStyle.color);\n setDrawDash(initialStyle.dash);\n setDrawFill(initialStyle.fill);\n setDrawSize(initialStyle.size);\n\n const resize = () => {\n const dpr = window.devicePixelRatio ?? 1;\n dprRef.current = dpr;\n const rect = container.getBoundingClientRect();\n canvas.width = Math.round(rect.width * dpr);\n canvas.height = Math.round(rect.height * dpr);\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n if (!persistenceActive) {\n editor.setViewport({ x: 0, y: 0, zoom: 1 });\n }\n render();\n refreshSelectionBounds(editor);\n };\n\n const persistSnapshot = async () => {\n if (!persistenceDb || !persistenceKey || ignorePersistenceChanges || disposed) return;\n const snapshot = editor.getPersistenceSnapshot({\n selectedShapeIds: selectedShapeIdsRef.current,\n });\n await persistenceDb.storeSnapshot({\n records: snapshot.document.records,\n state: snapshot.state,\n history: editor.getHistorySnapshot(),\n sessionId,\n });\n if (disposed) return;\n persistenceChannel?.postMessage({\n type: 'tsdraw:persisted',\n senderSessionId: sessionId,\n });\n };\n\n const schedulePersist = () => {\n if (!persistenceDb || !persistenceKey || disposed) return;\n const runPersist = async () => {\n if (isPersisting) {\n needsAnotherPersist = true;\n return;\n }\n\n isPersisting = true;\n try {\n do {\n needsAnotherPersist = false;\n await persistSnapshot();\n } while (needsAnotherPersist && !disposed);\n } catch (error) {\n console.error('tsdraw persistence failed', error);\n } finally {\n isPersisting = false;\n }\n };\n\n void runPersist();\n };\n\n schedulePersistRef.current = schedulePersist;\n\n const reconcileSelectionAfterDocumentLoad = () => {\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n refreshSelectionBounds(editor, nextSelectedShapeIds);\n };\n\n const applyRemoteDocumentSnapshot = (document: TsdrawDocumentSnapshot) => {\n ignorePersistenceChanges = true;\n editor.loadDocumentSnapshot(document);\n editor.clearRedoHistory();\n reconcileSelectionAfterDocumentLoad();\n render();\n ignorePersistenceChanges = false;\n };\n\n const applyLoadedSnapshot = (snapshot: Partial<TsdrawEditorSnapshot>) => {\n ignorePersistenceChanges = true;\n const nextSelectionIds = editor.loadPersistenceSnapshot(snapshot);\n setSelectedShapeIds(nextSelectionIds);\n selectedShapeIdsRef.current = nextSelectionIds;\n const nextTool = editor.getCurrentToolId();\n currentToolRef.current = nextTool;\n setCurrentToolState(nextTool);\n const nextDrawStyle = editor.getCurrentDrawStyle();\n setDrawColor(nextDrawStyle.color);\n setDrawDash(nextDrawStyle.dash);\n setDrawFill(nextDrawStyle.fill);\n setDrawSize(nextDrawStyle.size);\n render();\n refreshSelectionBounds(editor, nextSelectionIds);\n ignorePersistenceChanges = false;\n };\n\n const getPagePoint = (e: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(e.clientX - rect.left, e.clientY - rect.top);\n };\n\n const sampleEvents = (e: PointerEvent) => {\n const coalesced = e.getCoalescedEvents?.();\n return coalesced && coalesced.length > 0 ? coalesced : [e];\n };\n\n const applyDocumentChangeResult = (changed: boolean) => {\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n render();\n syncHistoryState();\n return true;\n };\n\n const normalizeWheelDelta = (event: WheelEvent) => {\n let deltaX = event.deltaX;\n let deltaY = event.deltaY;\n let deltaZoom = 0;\n if (event.ctrlKey || event.metaKey || event.altKey) {\n const clamped = Math.abs(deltaY) > ZOOM_WHEEL_CAP ? ZOOM_WHEEL_CAP * Math.sign(deltaY) : deltaY;\n deltaZoom = -clamped / 100;\n } else if (event.shiftKey && !navigator.userAgent.includes('Mac') && !navigator.userAgent.includes('iPhone') && !navigator.userAgent.includes('iPad')) {\n deltaX = deltaY;\n deltaY = 0;\n }\n return { x: -deltaX, y: -deltaY, z: deltaZoom };\n };\n\n const deleteCurrentSelection = () => {\n const selectedIds = selectedShapeIdsRef.current;\n if (selectedIds.length === 0) return false;\n editor.beginHistoryEntry();\n editor.deleteShapes(selectedIds);\n editor.endHistoryEntry();\n setSelectedShapeIds([]);\n selectedShapeIdsRef.current = [];\n setSelectionBounds(null);\n resetSelectUi();\n render();\n syncHistoryState();\n return true;\n };\n\n const cancelActivePointerInteraction = () => {\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n editor.input.pointerUp();\n if (currentToolRef.current === 'select') {\n resetSelectUi();\n } else {\n editor.tools.pointerUp();\n }\n editor.endHistoryEntry();\n render();\n refreshSelectionBounds(editor);\n };\n const emitCameraChange = () => {\n onCameraChangeRef.current?.({ ...editor.viewport });\n };\n\n const touchInteractions = createTouchInteractionController(editor, canvas, {\n cancelActivePointerInteraction,\n refreshView: () => {\n render();\n refreshSelectionBounds(editor);\n emitCameraChange();\n },\n runUndo: () => applyDocumentChangeResult(editor.undo()),\n runRedo: () => applyDocumentChangeResult(editor.redo()),\n isPenModeActive: () => penModeRef.current,\n getSlideOptions: () => ({\n enabled: cameraOptionsRef.current?.slideEnabled !== false,\n slideOptions: { friction: cameraOptionsRef.current?.slideFriction },\n }),\n }, touchOpts);\n\n const hasRealPressure = (pressure: number | undefined) => pressure != null && pressure > 0 && pressure !== 0.5;\n\n const stopActiveSlide = () => {\n if (activeCameraSlideRef.current) {\n activeCameraSlideRef.current.stop();\n activeCameraSlideRef.current = null;\n }\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n if (!canvas.contains(e.target as Node)) return;\n if (cameraOptionsRef.current?.locked && e.pointerType !== 'pen') return;\n\n stopActiveSlide();\n\n const penAutoDetect = penOptionsRef.current?.autoDetect !== false;\n if (penAutoDetect && !penDetectedRef.current && (e.pointerType === 'pen' || hasRealPressure(e.pressure))) {\n penDetectedRef.current = true;\n penModeRef.current = true;\n }\n lastPointerDownWithRef.current = e.pointerType as 'mouse' | 'touch' | 'pen';\n activePointerIdsRef.current.add(e.pointerId);\n\n const startedCameraGesture = touchInteractions.handlePointerDown(e);\n if (startedCameraGesture || touchInteractions.isCameraGestureActive() || touchInteractions.isFingerPanActive()) {\n e.preventDefault();\n if (!canvas.hasPointerCapture(e.pointerId)) {\n canvas.setPointerCapture(e.pointerId);\n }\n return;\n }\n\n const isTouchBlockedByPenMode = penModeRef.current && e.pointerType === 'touch';\n\n if (isTouchBlockedByPenMode) { return; }\n if (activePointerIdsRef.current.size > 1) { return; }\n if (readOnlyRef.current && !VIEW_ONLY_TOOLS.has(currentToolRef.current)) { return; }\n\n isPointerActiveRef.current = true;\n editor.beginHistoryEntry();\n canvas.setPointerCapture(e.pointerId);\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n updatePointerPreview(e.clientX, e.clientY);\n\n const first = sampleEvents(e)[0]!;\n const { x, y } = getPagePoint(first);\n const pressureSensitivity = penOptionsRef.current?.pressureSensitivity ?? 1;\n const pressure = (first.pressure ?? 0.5) * pressureSensitivity;\n const isPen = first.pointerType === 'pen' || hasRealPressure(first.pressure);\n\n if (currentToolRef.current === 'select') {\n const hit = getTopShapeAtPoint(editor, { x, y });\n const isHitSelected = !!(hit && selectedShapeIdsRef.current.includes(hit.id));\n\n const isInsideSelectionBounds = (() => {\n if (selectedShapeIdsRef.current.length === 0) return false;\n const pageBounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!pageBounds) return false;\n return x >= pageBounds.minX && x <= pageBounds.maxX && y >= pageBounds.minY && y <= pageBounds.maxY;\n })();\n\n if (isHitSelected || isInsideSelectionBounds) {\n selectDragRef.current = {\n mode: 'move',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: buildStartPositions(editor, selectedShapeIdsRef.current),\n additive: false,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setIsMovingSelection(true);\n return;\n }\n\n selectDragRef.current = {\n mode: 'marquee',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: new Map(),\n additive: first.shiftKey,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setSelectionBrush(toScreenRect(editor, { minX: x, minY: y, maxX: x, maxY: y }));\n if (!e.shiftKey) {\n setSelectedShapeIds([]);\n selectedShapeIdsRef.current = [];\n setSelectionBounds(null);\n setSelectionRotationDeg(0);\n }\n return;\n }\n\n editor.input.pointerDown(x, y, pressure, isPen);\n editor.input.setModifiers(first.shiftKey, first.ctrlKey, first.metaKey);\n editor.tools.pointerDown({ point: { x, y, z: pressure }, screenX: e.clientX, screenY: e.clientY });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n const penAutoDetectOnMove = penOptionsRef.current?.autoDetect !== false;\n if (penAutoDetectOnMove && !penDetectedRef.current && (e.pointerType === 'pen' || hasRealPressure(e.pressure))) {\n penDetectedRef.current = true;\n penModeRef.current = true;\n }\n if (touchInteractions.handlePointerMove(e)) {\n e.preventDefault();\n return;\n }\n if (penModeRef.current && e.pointerType === 'touch' && !isPointerActiveRef.current) return;\n if (activePointerIdsRef.current.size > 1) return;\n updatePointerPreview(e.clientX, e.clientY);\n const prevClient = lastPointerClientRef.current;\n const dx = prevClient ? e.clientX - prevClient.x : 0;\n const dy = prevClient ? e.clientY - prevClient.y : 0;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n\n const movePressureSensitivity = penOptionsRef.current?.pressureSensitivity ?? 1;\n for (const sample of sampleEvents(e)) {\n const { x, y } = getPagePoint(sample);\n const pressure = (sample.pressure ?? 0.5) * movePressureSensitivity;\n const isPen = sample.pointerType === 'pen' || hasRealPressure(sample.pressure);\n editor.input.pointerMove(x, y, pressure, isPen);\n }\n\n if (currentToolRef.current === 'select') {\n const mode = selectDragRef.current.mode;\n const { x: px, y: py } = editor.input.getCurrentPagePoint();\n\n if (mode === 'rotate') {\n const { center, startAngle, startSelectionRotationDeg, startShapes } = rotateRef.current;\n if (!center) return;\n const angle = Math.atan2(py - center.y, px - center.x);\n const delta = angle - startAngle;\n setSelectionRotationDeg(startSelectionRotationDeg + (delta * 180) / Math.PI);\n applyRotation(editor, startShapes, center, delta);\n render();\n return;\n }\n\n // Resize and move both work using captured snapshots so the transform stays stable throughout the drag instead of adding up shape updates on each pointer move\n if (mode === 'resize') {\n const { handle, startBounds, startShapes, cursorHandleOffset } = resizeRef.current;\n if (!handle || !startBounds) return;\n applyResize(editor, handle, startBounds, startShapes, { x: px - cursorHandleOffset.x, y: py - cursorHandleOffset.y }, e.shiftKey);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n if (mode === 'move') {\n const drag = selectDragRef.current;\n applyMove(editor, drag.startPositions, px - drag.startPage.x, py - drag.startPage.y);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n // Marquee selection updates live as brush changes so that the overlay matches feedback\n if (mode === 'marquee') {\n selectDragRef.current.currentPage = { x: px, y: py };\n const pageRect = normalizeSelectionBounds(selectDragRef.current.startPage, selectDragRef.current.currentPage);\n setSelectionBrush(toScreenRect(editor, pageRect));\n const ids = getShapesInBounds(editor, pageRect);\n const nextIds = selectDragRef.current.additive ? Array.from(new Set([...selectDragRef.current.initialSelection, ...ids])) : ids;\n setSelectedShapeIds(nextIds);\n selectedShapeIdsRef.current = nextIds;\n refreshSelectionBounds(editor, nextIds);\n return;\n }\n }\n\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.pointerMove({ screenDeltaX: dx, screenDeltaY: dy, screenX: e.clientX, screenY: e.clientY });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n activePointerIdsRef.current.delete(e.pointerId);\n const hadTouchCameraGesture = touchInteractions.handlePointerUpOrCancel(e);\n if (hadTouchCameraGesture || touchInteractions.isCameraGestureActive()) {\n e.preventDefault();\n return;\n }\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n updatePointerPreview(e.clientX, e.clientY);\n const { x, y } = getPagePoint(e);\n editor.input.pointerMove(x, y);\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n\n // Rotation resets overlay back to normal selection box after release while rotated geometry stays\n if (drag.mode === 'rotate') {\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n setSelectionRotationDeg(0);\n rotateRef.current = { center: null, startAngle: 0, startSelectionRotationDeg: 0, startShapes: new Map() };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'resize') {\n setIsResizingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map(), cursorHandleOffset: { x: 0, y: 0 } };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'move') {\n setIsMovingSelection(false);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'marquee') {\n const rect = normalizeSelectionBounds(drag.startPage, { x, y });\n const moved = Math.abs(x - drag.startPage.x) > 2 || Math.abs(y - drag.startPage.y) > 2;\n let ids: ShapeId[] = [];\n\n if (!moved) {\n const hit = getTopShapeAtPoint(editor, { x, y });\n if (hit) {\n ids = drag.additive ? Array.from(new Set([...drag.initialSelection, hit.id])) : [hit.id];\n } else {\n ids = drag.additive ? drag.initialSelection : [];\n }\n } else {\n ids = getShapesInBounds(editor, rect);\n if (drag.additive) {\n ids = Array.from(new Set([...drag.initialSelection, ...ids]));\n }\n }\n\n setSelectedShapeIds(ids);\n selectedShapeIdsRef.current = ids;\n setSelectionBrush(null);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor, ids);\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n return;\n }\n }\n\n let handPanSession = null as ReturnType<HandDraggingState['getPanSession']>;\n if (currentToolRef.current === 'hand') {\n const currentState = editor.tools.getCurrentState();\n if (currentState instanceof HandDraggingState) {\n handPanSession = currentState.getPanSession();\n }\n }\n\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n\n if (handPanSession && cameraOptionsRef.current?.slideEnabled !== false) {\n activeCameraSlideRef.current = startCameraSlide(\n handPanSession,\n (slideDx, slideDy) => { editor.panBy(slideDx, slideDy); emitCameraChange(); },\n () => { render(); refreshSelectionBounds(editor); },\n { friction: cameraOptionsRef.current?.slideFriction }\n );\n }\n\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n };\n\n const handlePointerCancel = (e: PointerEvent) => {\n activePointerIdsRef.current.delete(e.pointerId);\n const hadTouchCameraGesture = touchInteractions.handlePointerUpOrCancel(e);\n if (hadTouchCameraGesture || touchInteractions.isCameraGestureActive()) return;\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n if (drag.mode === 'rotate') setIsRotatingSelection(false);\n if (drag.mode === 'resize') setIsResizingSelection(false);\n if (drag.mode === 'move') setIsMovingSelection(false);\n if (drag.mode === 'marquee') setSelectionBrush(null);\n if (drag.mode !== 'none') {\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n }\n editor.endHistoryEntry();\n } else {\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n }\n\n if (pendingRemoteDocumentRef.current) {\n const pending = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pending);\n }\n };\n\n const handleWheel = (e: WheelEvent) => {\n if (!container.contains(e.target as Node)) return;\n e.preventDefault();\n const camOpts = cameraOptionsRef.current;\n if (camOpts?.locked) return;\n if (camOpts?.wheelBehavior === 'none') return;\n if (touchInteractions.isTrackpadZoomActive()) return;\n const delta = normalizeWheelDelta(e);\n const panMultiplier = camOpts?.panSpeed ?? 1;\n const zoomMultiplier = camOpts?.zoomSpeed ?? 1;\n if (delta.z !== 0) {\n const rect = canvas.getBoundingClientRect();\n const pointX = e.clientX - rect.left;\n const pointY = e.clientY - rect.top;\n editor.zoomAt(Math.exp(delta.z * zoomMultiplier), pointX, pointY);\n } else {\n editor.panBy(delta.x * panMultiplier, delta.y * panMultiplier);\n }\n render();\n refreshSelectionBounds(editor);\n emitCameraChange();\n };\n\n const handleGestureEvent = (e: Event) => {\n touchInteractions.handleGestureEvent(e, container);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (keyboardShortcutsRef.current?.enabled === false) return;\n const isReadOnly = readOnlyRef.current;\n handleKeyboardShortcutKeyDown(e, {\n isToolAvailable: (tool) => {\n if (isReadOnly && !VIEW_ONLY_TOOLS.has(tool)) return false;\n return editor.tools.hasTool(tool);\n },\n setToolFromShortcut: (tool) => {\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n if (tool !== 'select') resetSelectUi();\n render();\n onToolChangeRef.current?.(tool);\n },\n runHistoryShortcut: (shouldRedo) => {\n if (isReadOnly) return false;\n return applyDocumentChangeResult(shouldRedo ? editor.redo() : editor.undo());\n },\n deleteSelection: () => {\n if (isReadOnly) return false;\n return currentToolRef.current === 'select' ? deleteCurrentSelection() : false;\n },\n dispatchKeyDown: (event) => {\n editor.input.setModifiers(event.shiftKey, event.ctrlKey, event.metaKey);\n editor.tools.keyDown({ key: event.key });\n render();\n },\n dispatchKeyUp: () => undefined,\n }, toolShortcutMap);\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n handleKeyboardShortcutKeyUp(e, {\n isToolAvailable: () => false,\n setToolFromShortcut: () => undefined,\n runHistoryShortcut: () => false,\n deleteSelection: () => false,\n dispatchKeyDown: () => undefined,\n dispatchKeyUp: (event) => {\n editor.input.setModifiers(event.shiftKey, event.ctrlKey, event.metaKey);\n editor.tools.keyUp({ key: event.key });\n render();\n },\n });\n };\n\n const initializePersistence = async () => {\n if (!persistenceKey) { setIsPersistenceReady(true); return; }\n\n try {\n persistenceDb = new TsdrawLocalIndexedDb(persistenceKey);\n const loaded = await persistenceDb.load(sessionId);\n const snapshot: Partial<TsdrawEditorSnapshot> = {};\n if (loaded.records.length > 0) {\n snapshot.document = { records: loaded.records };\n }\n if (loaded.state) {\n snapshot.state = loaded.state;\n }\n if (snapshot.document || snapshot.state) {\n applyLoadedSnapshot(snapshot);\n }\n editor.loadHistorySnapshot(loaded.history);\n syncHistoryState();\n\n if (disposed) return;\n persistenceActive = true;\n if (typeof BroadcastChannel !== 'undefined') {\n persistenceChannel = new BroadcastChannel(`tsdraw:persistence:${persistenceKey}`);\n let isLoadingRemote = false;\n let pendingRemoteLoad = false;\n persistenceChannel.onmessage = () => {\n if (disposed) return;\n if (isLoadingRemote) {\n pendingRemoteLoad = true;\n return;\n }\n isLoadingRemote = true;\n const processLoad = async () => {\n try {\n do {\n pendingRemoteLoad = false;\n if (!persistenceDb || disposed) return;\n const nextLoaded = await persistenceDb.load(sessionId);\n if (disposed) return;\n if (nextLoaded.records.length > 0) {\n const nextDocument: TsdrawDocumentSnapshot = { records: nextLoaded.records };\n if (isPointerActiveRef.current) {\n pendingRemoteDocumentRef.current = nextDocument;\n return;\n }\n applyRemoteDocumentSnapshot(nextDocument);\n }\n } while (pendingRemoteLoad && !disposed);\n } finally {\n isLoadingRemote = false;\n }\n };\n void processLoad();\n };\n }\n } finally {\n if (!disposed) { setIsPersistenceReady(true); }\n }\n };\n\n const cleanupEditorListener = editor.listen(() => {\n if (ignorePersistenceChanges) return;\n schedulePersist();\n onChangeRef.current?.(editor.getDocumentSnapshot());\n });\n const cleanupHistoryListener = editor.listenHistory(() => {\n syncHistoryState();\n if (ignorePersistenceChanges) return;\n schedulePersist();\n });\n\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n const handlePointerLeaveViewport = (e: PointerEvent) => {\n if (e.relatedTarget === null) {\n setIsPointerInsideCanvas(false);\n }\n };\n\n canvas.addEventListener('pointerdown', handlePointerDown);\n container.addEventListener('wheel', handleWheel, { passive: false });\n document.addEventListener('gesturestart', handleGestureEvent);\n document.addEventListener('gesturechange', handleGestureEvent);\n document.addEventListener('gestureend', handleGestureEvent);\n document.documentElement.addEventListener('pointerleave', handlePointerLeaveViewport);\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerCancel);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n void initializePersistence().catch((error) => {\n console.error('failed to initialize tsdraw persistence', error);\n });\n\n disposeMount = onMountRef.current?.({\n editor,\n container,\n canvas,\n setTool: (tool) => {\n if (!editor.tools.hasTool(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n },\n getCurrentTool: () => editor.getCurrentToolId(),\n undo: () => {\n const changed = editor.undo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n render();\n syncHistoryState();\n return true;\n },\n redo: () => {\n const changed = editor.redo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n render();\n syncHistoryState();\n return true;\n },\n canUndo: () => editor.canUndo(),\n canRedo: () => editor.canRedo(),\n applyDrawStyle: (partial) => {\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.fill) setDrawFill(partial.fill);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n });\n\n if (options.autoFocus !== false) {\n container.focus({ preventScroll: true });\n }\n\n return () => {\n disposed = true;\n schedulePersistRef.current = null;\n cleanupEditorListener();\n cleanupHistoryListener();\n disposeMount?.();\n ro.disconnect();\n canvas.removeEventListener('pointerdown', handlePointerDown);\n container.removeEventListener('wheel', handleWheel);\n document.removeEventListener('gesturestart', handleGestureEvent);\n document.removeEventListener('gesturechange', handleGestureEvent);\n document.removeEventListener('gestureend', handleGestureEvent);\n document.documentElement.removeEventListener('pointerleave', handlePointerLeaveViewport);\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerCancel);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n isPointerActiveRef.current = false;\n activePointerIdsRef.current.clear();\n pendingRemoteDocumentRef.current = null;\n stopActiveSlide();\n touchInteractions.reset();\n persistenceChannel?.close();\n void persistenceDb?.close();\n editorRef.current = null;\n };\n }, [\n getPagePointFromClient,\n options.initialTool,\n options.persistenceKey,\n options.toolDefinitions,\n refreshSelectionBounds,\n resetSelectUi,\n render,\n updatePointerPreview,\n ]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.renderer.setTheme(options.theme ?? 'light');\n render();\n }, [options.theme, render]);\n\n useEffect(() => {\n if (!editorRef.current) return;\n render();\n }, [options.background, render]);\n\n const setTool = useCallback(\n (tool: ToolId) => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!editor.tools.hasTool(tool)) return;\n if (readOnlyRef.current && !VIEW_ONLY_TOOLS.has(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n if (tool !== 'select') resetSelectUi();\n onToolChangeRef.current?.(tool);\n },\n [resetSelectUi]\n );\n\n const applyDrawStyle = useCallback(\n (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.fill) setDrawFill(partial.fill);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n [render]\n );\n\n const undo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.undo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const redo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.redo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const isHoveringSelectionBounds = isPointerInsideCanvas\n && currentTool === 'select'\n && selectedShapeIds.length > 0\n && selectionBounds != null\n && pointerScreenPoint.x >= selectionBounds.left\n && pointerScreenPoint.x <= selectionBounds.left + selectionBounds.width\n && pointerScreenPoint.y >= selectionBounds.top\n && pointerScreenPoint.y <= selectionBounds.top + selectionBounds.height;\n\n const showToolOverlay = isPointerInsideCanvas && (currentTool === 'pen' || currentTool === 'eraser');\n const canvasCursor = getCanvasCursor(currentTool, {\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n isHoveringSelectionBounds,\n showToolOverlay,\n });\n const cursorContext: TsdrawCursorContext = {\n currentTool,\n defaultCursor: canvasCursor,\n showToolOverlay,\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n };\n const toolOverlay: TsdrawToolOverlayState = {\n visible: showToolOverlay,\n pointerX: pointerScreenPoint.x,\n pointerY: pointerScreenPoint.y,\n isPenPreview: currentTool === 'pen',\n penRadius: Math.max(2, STROKE_WIDTHS[drawSize] / 2),\n penColor: resolveDrawColor(drawColor, options.theme ?? 'light'),\n eraserRadius: ERASER_MARGIN,\n };\n\n return {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ColorStyle, DashStyle, DefaultToolId, FillStyle, SizeStyle, ToolDefinition, ToolId, Viewport, TsdrawDocumentSnapshot, TsdrawEditorSnapshot, TsdrawBackgroundOptions } from '@tsdraw/core';\nimport type { TsdrawCameraOptions, TsdrawTouchOptions, TsdrawKeyboardShortcutOptions, TsdrawPenOptions } from '../canvas/canvasOptions.js';\nimport { SelectionOverlay } from './SelectionOverlay.js';\nimport { StylePanel, type TsdrawStylePanelCustomPart, type TsdrawStylePanelPartItem } from './StylePanel.js';\nimport { ToolOverlay } from './ToolOverlay.js';\nimport { Toolbar, getDefaultToolbarIcon, type ToolbarPart } from './Toolbar.js';\nimport {\n useTsdrawCanvasController,\n type TsdrawCursorContext,\n type TsdrawMountApi,\n type TsdrawToolOverlayState,\n} from '../canvas/useTsdrawCanvasController.js';\n\nconst DEFAULT_TOOLBAR_PARTS: ToolbarPartItem[][] = [['undo', 'redo'], ['select', 'hand', 'pen', 'eraser', 'square', 'circle']];\nconst EMPTY_CUSTOM_TOOLS: TsdrawCustomTool[] = [];\nconst EMPTY_CUSTOM_ELEMENTS: TsdrawCustomElement[] = [];\nconst EMPTY_STYLE_PANEL_PARTS: TsdrawStylePanelPartItem[] = [];\nconst EMPTY_STYLE_PANEL_CUSTOM_PARTS: TsdrawStylePanelCustomPart[] = [];\nconst DEFAULT_STYLE_PANEL_PARTS_BY_TOOL: Partial<Record<DefaultToolId, TsdrawStylePanelPartItem[]>> = {\n pen: ['colors', 'dashes', 'sizes'],\n square: ['colors', 'dashes', 'fills', 'sizes'],\n circle: ['colors', 'dashes', 'fills', 'sizes'],\n};\n\nconst DEFAULT_TOOL_LABELS: Record<DefaultToolId, string> = {\n select: 'Select',\n pen: 'Pen',\n square: 'Rectangle',\n circle: 'Ellipse',\n eraser: 'Eraser',\n hand: 'Hand',\n};\n\ntype VerticalPart = 'top' | 'bottom' | 'center';\ntype HorizontalPart = 'left' | 'right' | 'center';\nexport type UiAnchor = | `${VerticalPart}-${HorizontalPart}` | `${HorizontalPart}-${VerticalPart}`;\n\nfunction parseAnchor(anchor: UiAnchor): { vertical: VerticalPart; horizontal: HorizontalPart } {\n const parts = anchor.split('-') as string[];\n let vertical: VerticalPart = 'center';\n let horizontal: HorizontalPart = 'center';\n for (const part of parts) {\n if (part === 'top' || part === 'bottom') vertical = part;\n else if (part === 'left' || part === 'right') horizontal = part;\n }\n return { vertical, horizontal };\n}\n\nexport interface TsdrawCustomTool {\n id: ToolId;\n label: string;\n icon: ReactNode;\n iconSelected?: ReactNode;\n definition: ToolDefinition;\n stylePanel?: {\n parts?: TsdrawStylePanelPartItem[];\n customParts?: TsdrawStylePanelCustomPart[];\n };\n}\n\nexport type TsdrawToolbarBuiltInAction = 'undo' | 'redo';\nexport type ToolbarPartItem = ToolId | TsdrawToolbarBuiltInAction;\n\nexport interface TsdrawUiPlacement {\n anchor?: UiAnchor;\n offsetX?: number;\n offsetY?: number;\n style?: CSSProperties;\n}\n\nexport interface TsdrawUiOptions {\n toolbar?: {\n hide?: boolean;\n placement?: TsdrawUiPlacement;\n parts?: ToolbarPartItem[][];\n };\n stylePanel?: {\n hide?: boolean;\n placement?: TsdrawUiPlacement;\n };\n customElements?: TsdrawCustomElement[];\n cursor?: {\n getCursor?: (context: TsdrawCursorContext) => string;\n };\n overlays?: {\n renderToolOverlay?: (args: {\n defaultOverlay: ReactNode;\n overlayState: TsdrawToolOverlayState;\n currentTool: ToolId;\n }) => ReactNode;\n };\n}\n\nexport interface TsdrawCustomElementRenderArgs {\n currentTool: ToolId;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n}\n\nexport interface TsdrawCustomElement {\n id: string;\n placement?: TsdrawUiPlacement;\n render: (args: TsdrawCustomElementRenderArgs) => ReactNode;\n}\n\nexport interface TsdrawProps {\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n theme?: 'light' | 'dark' | 'system';\n persistenceKey?: string;\n customTools?: TsdrawCustomTool[];\n initialToolId?: ToolId;\n uiOptions?: TsdrawUiOptions;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n cameraOptions?: TsdrawCameraOptions;\n touchOptions?: TsdrawTouchOptions;\n keyboardShortcuts?: TsdrawKeyboardShortcutOptions;\n penOptions?: TsdrawPenOptions;\n background?: TsdrawBackgroundOptions;\n readOnly?: boolean;\n autoFocus?: boolean;\n snapshot?: TsdrawEditorSnapshot;\n onChange?: (snapshot: TsdrawDocumentSnapshot) => void;\n onCameraChange?: (viewport: Viewport) => void;\n onToolChange?: (toolId: ToolId) => void;\n}\n\nexport type TsdrawCanvasProps = TsdrawProps;\n\nfunction isToolbarAction(item: ToolbarPartItem): item is TsdrawToolbarBuiltInAction {\n return item === 'undo' || item === 'redo';\n}\n\nfunction resolvePlacementStyle(\n placement: TsdrawUiPlacement | undefined,\n fallbackAnchor: UiAnchor,\n fallbackOffsetX: number,\n fallbackOffsetY: number\n): CSSProperties {\n const anchor = placement?.anchor ?? fallbackAnchor;\n const offsetX = placement?.offsetX ?? fallbackOffsetX;\n const offsetY = placement?.offsetY ?? fallbackOffsetY;\n const { vertical, horizontal } = parseAnchor(anchor);\n const result: CSSProperties = {};\n const transforms: string[] = [];\n\n if (horizontal === 'left') {\n result.left = offsetX;\n } else if (horizontal === 'right') {\n result.right = offsetX;\n } else {\n result.left = '50%';\n transforms.push('translateX(-50%)');\n if (offsetX) transforms.push(`translateX(${offsetX}px)`);\n }\n\n if (vertical === 'top') {\n result.top = offsetY;\n } else if (vertical === 'bottom') {\n result.bottom = offsetY;\n } else {\n result.top = '50%';\n transforms.push('translateY(-50%)');\n if (offsetY) transforms.push(`translateY(${offsetY}px)`);\n }\n\n if (transforms.length > 0) result.transform = transforms.join(' ');\n\n return placement?.style ? { ...result, ...placement.style } : result;\n}\n\nexport function Tsdraw(props: TsdrawProps) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n const customTools = props.customTools ?? EMPTY_CUSTOM_TOOLS;\n const toolbarPartIds = props.uiOptions?.toolbar?.parts ?? DEFAULT_TOOLBAR_PARTS;\n const customToolMap = useMemo(\n () => new Map(customTools.map((customTool) => [customTool.id, customTool])),\n [customTools]\n );\n const toolbarToolIds = useMemo(() => {\n const ids = new Set<ToolId>();\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n ids.add(item);\n }\n }\n }\n return ids;\n }, [customToolMap, toolbarPartIds]);\n const toolDefinitions = useMemo(\n () => customTools.filter((customTool) => toolbarToolIds.has(customTool.id)).map((customTool) => customTool.definition),\n [customTools, toolbarToolIds]\n );\n const firstToolbarTool = useMemo(() => {\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n return item;\n }\n }\n }\n return undefined;\n }, [customToolMap, toolbarPartIds]);\n const initialTool: ToolId = props.initialToolId ?? firstToolbarTool ?? 'pen';\n const requestedTheme = props.theme ?? 'light';\n\n // Themes and so that system theme works\n useEffect(() => {\n if (requestedTheme !== 'system' || typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const syncSystemTheme = () => setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n\n syncSystemTheme();\n mediaQuery.addEventListener('change', syncSystemTheme);\n\n return () => mediaQuery.removeEventListener('change', syncSystemTheme);\n }, [requestedTheme]);\n\n const resolvedTheme = requestedTheme === 'system' ? systemTheme : requestedTheme;\n\n const {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor: defaultCanvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n } = useTsdrawCanvasController({\n toolDefinitions,\n initialTool,\n theme: resolvedTheme,\n persistenceKey: props.persistenceKey,\n onMount: props.onMount,\n cameraOptions: props.cameraOptions,\n touchOptions: props.touchOptions,\n keyboardShortcuts: props.keyboardShortcuts,\n penOptions: props.penOptions,\n background: props.background,\n readOnly: props.readOnly,\n autoFocus: props.autoFocus,\n snapshot: props.snapshot,\n onChange: props.onChange,\n onCameraChange: props.onCameraChange,\n onToolChange: props.onToolChange,\n });\n\n const toolbarPlacementStyle = resolvePlacementStyle(props.uiOptions?.toolbar?.placement, 'bottom-center', 0, 14);\n const stylePanelPlacementStyle = resolvePlacementStyle(props.uiOptions?.stylePanel?.placement, 'top-right', 8, 8);\n const isToolbarHidden = props.uiOptions?.toolbar?.hide === true;\n const isStylePanelHidden = props.uiOptions?.stylePanel?.hide === true || props.readOnly === true;\n const canvasCursor = props.uiOptions?.cursor?.getCursor?.(cursorContext) ?? defaultCanvasCursor;\n const defaultToolOverlay = (\n <ToolOverlay\n visible={toolOverlay.visible}\n pointerX={toolOverlay.pointerX}\n pointerY={toolOverlay.pointerY}\n isPenPreview={toolOverlay.isPenPreview}\n penRadius={toolOverlay.penRadius}\n penColor={toolOverlay.penColor}\n eraserRadius={toolOverlay.eraserRadius}\n />\n );\n const overlayNode = props.uiOptions?.overlays?.renderToolOverlay?.({ defaultOverlay: defaultToolOverlay, overlayState: toolOverlay, currentTool }) ?? defaultToolOverlay;\n const customElements = props.uiOptions?.customElements ?? EMPTY_CUSTOM_ELEMENTS;\n const onColorSelect = useCallback((color: ColorStyle) => {\n applyDrawStyle({ color });\n }, [applyDrawStyle]);\n const onDashSelect = useCallback((dash: DashStyle) => {\n applyDrawStyle({ dash });\n }, [applyDrawStyle]);\n const onFillSelect = useCallback((fill: FillStyle) => {\n applyDrawStyle({ fill });\n }, [applyDrawStyle]);\n const onSizeSelect = useCallback((size: SizeStyle) => {\n applyDrawStyle({ size });\n }, [applyDrawStyle]);\n const activeCustomTool = customToolMap.get(currentTool);\n const stylePanelParts = useMemo<TsdrawStylePanelPartItem[]>(\n () => {\n const fromCustomTool = activeCustomTool?.stylePanel?.parts;\n if (fromCustomTool && fromCustomTool.length > 0) return fromCustomTool;\n if (activeCustomTool?.stylePanel?.customParts && activeCustomTool.stylePanel.customParts.length > 0) return activeCustomTool.stylePanel.customParts.map((customPart) => customPart.id);\n if (currentTool in DEFAULT_STYLE_PANEL_PARTS_BY_TOOL) return DEFAULT_STYLE_PANEL_PARTS_BY_TOOL[currentTool as DefaultToolId] ?? EMPTY_STYLE_PANEL_PARTS;\n return EMPTY_STYLE_PANEL_PARTS;\n },\n [activeCustomTool, currentTool]\n );\n const stylePanelCustomParts = activeCustomTool?.stylePanel?.customParts ?? EMPTY_STYLE_PANEL_CUSTOM_PARTS;\n const toolbarParts = useMemo<ToolbarPart[]>(\n () =>\n toolbarPartIds\n .map((toolbarPart, partIndex) => {\n const items = toolbarPart\n .map((item) => {\n if (item === 'undo') {\n return {\n type: 'action' as const,\n id: 'undo' as const,\n label: 'Undo',\n disabled: !canUndo,\n onSelect: undo,\n };\n }\n\n if (item === 'redo') {\n return {\n type: 'action' as const,\n id: 'redo' as const,\n label: 'Redo',\n disabled: !canRedo,\n onSelect: redo,\n };\n }\n\n if (item in DEFAULT_TOOL_LABELS) {\n return {\n type: 'tool' as const,\n id: item,\n label: DEFAULT_TOOL_LABELS[item as DefaultToolId],\n icon: (isActive: boolean) => getDefaultToolbarIcon(item, isActive),\n };\n }\n\n const customTool = customToolMap.get(item);\n if (!customTool) return null;\n return {\n type: 'tool' as const,\n id: customTool.id,\n label: customTool.label,\n icon: (isActive: boolean) => (isActive && customTool.iconSelected ? customTool.iconSelected : customTool.icon),\n };\n })\n .filter((nextItem): nextItem is NonNullable<typeof nextItem> => nextItem != null);\n return {\n id: `toolbar-part-${partIndex.toString(36)}`,\n items,\n };\n })\n .filter((part) => part.items.length > 0),\n [canRedo, canUndo, customToolMap, redo, toolbarPartIds, undo]\n );\n\n return (\n <div\n ref={containerRef}\n tabIndex={0}\n className={`tsdraw tsdraw-${resolvedTheme}mode ${props.className ?? ''}`}\n style={{\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n position: 'relative',\n overflow: 'hidden',\n outline: 'none',\n ...props.style,\n }}\n >\n <canvas\n ref={canvasRef}\n style={{\n display: 'block',\n width: '100%',\n height: '100%',\n touchAction: 'none',\n cursor: canvasCursor,\n }}\n data-testid=\"tsdraw-canvas\"\n />\n {overlayNode}\n <SelectionOverlay\n selectionBrush={selectionBrush}\n selectionBounds={selectionBounds}\n selectionRotationDeg={selectionRotationDeg}\n currentTool={currentTool}\n selectedCount={selectedShapeIds.length}\n onRotatePointerDown={handleRotatePointerDown}\n onResizePointerDown={handleResizePointerDown}\n />\n <StylePanel\n visible={!isStylePanelHidden && isPersistenceReady && stylePanelParts.length > 0}\n parts={stylePanelParts}\n customParts={stylePanelCustomParts}\n style={stylePanelPlacementStyle}\n theme={resolvedTheme}\n drawColor={drawColor}\n drawDash={drawDash}\n drawFill={drawFill}\n drawSize={drawSize}\n onColorSelect={onColorSelect}\n onDashSelect={onDashSelect}\n onFillSelect={onFillSelect}\n onSizeSelect={onSizeSelect}\n />\n {customElements.map((customElement) => (\n <div\n key={customElement.id}\n style={{\n position: 'absolute',\n zIndex: 130,\n pointerEvents: 'all',\n ...resolvePlacementStyle(customElement.placement, 'top-left', 8, 8),\n }}\n >\n {customElement.render({ currentTool, setTool, applyDrawStyle })}\n </div>\n ))}\n {!isToolbarHidden ? (\n <Toolbar\n parts={toolbarParts}\n style={toolbarPlacementStyle}\n currentTool={isPersistenceReady ? currentTool : null}\n onToolChange={setTool}\n disabled={!isPersistenceReady}\n />\n ) : null}\n </div>\n );\n}\n\nexport function TsdrawCanvas(props: TsdrawCanvasProps) {\n return <Tsdraw {...props} />;\n}"]}