{
  "version": 3,
  "sources": ["../../../../../src/lib/ui/components/Minimap/DefaultMinimap.tsx"],
  "sourcesContent": ["import {\n\tBox,\n\tTLPointerEventInfo,\n\tVec,\n\tgetPointerInfo,\n\tisAccelKey,\n\tnormalizeWheel,\n\tsetPointerCapture,\n\tuseContainer,\n\tuseColorMode,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\nimport * as React from 'react'\nimport { useTranslation } from '../../hooks/useTranslation/useTranslation'\nimport { MinimapManager } from './MinimapManager'\n\n// Squared distance (in screen pixels) the pointer can move after pointer down before\n// it counts as a drag. Sub-pixel jitter that accompanies a click stays below this, so\n// it doesn't recenter the camera instantly and cut off the easing animation.\nconst CLICK_JITTER_THRESHOLD_SQ = 4\n\n/** @public @react */\nexport function DefaultMinimap() {\n\tconst editor = useEditor()\n\tconst container = useContainer()\n\tconst msg = useTranslation()\n\n\tconst rCanvas = React.useRef<HTMLCanvasElement>(null!)\n\tconst rPointing = React.useRef(false)\n\tconst rActivePointerId = React.useRef<number | null>(null)\n\tconst rOriginScreenPoint = React.useRef(new Vec())\n\n\tconst minimapRef = React.useRef<MinimapManager | undefined>(undefined)\n\n\tReact.useEffect(() => {\n\t\ttry {\n\t\t\tconst minimap = new MinimapManager(editor, rCanvas.current, container)\n\t\t\tminimapRef.current = minimap\n\t\t\treturn minimapRef.current.close\n\t\t} catch (e) {\n\t\t\teditor.annotateError(e, {\n\t\t\t\torigin: 'minimap',\n\t\t\t\twillCrashApp: false,\n\t\t\t})\n\t\t\teditor.timers.setTimeout(() => {\n\t\t\t\tthrow e\n\t\t\t})\n\t\t\treturn undefined\n\t\t}\n\t}, [editor, container])\n\n\tconst onDoubleClick = React.useCallback(\n\t\t(e: React.MouseEvent<HTMLCanvasElement>) => {\n\t\t\tif (!editor.getCurrentPageShapeIds().size) return\n\t\t\tconst minimap = minimapRef.current\n\t\t\tif (!minimap) return\n\n\t\t\tconst { clientX: x, clientY: y } = e\n\n\t\t\t// Stash the clamped point / clamped viewport page center\n\t\t\tconst clampedPoint = minimap.minimapScreenPointToPagePoint(x, y, false, true)\n\t\t\tminimap.originPagePoint.setTo(clampedPoint)\n\t\t\tminimap.originPageCenter.setTo(editor.getViewportPageBounds().center)\n\n\t\t\t// Then center on the unclamped point\n\t\t\tconst point = minimap.minimapScreenPointToPagePoint(x, y, false, false)\n\t\t\teditor.centerOnPoint(point, { animation: { duration: editor.options.animationMediumMs } })\n\t\t},\n\t\t[editor]\n\t)\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLCanvasElement>) => {\n\t\t\tconst minimap = minimapRef.current\n\t\t\tif (!minimap) return\n\t\t\tif (e.button !== 0) return\n\n\t\t\tconst elm = e.currentTarget\n\t\t\tsetPointerCapture(elm, e)\n\t\t\tif (!editor.getCurrentPageShapeIds().size) return\n\n\t\t\tconst { clientX: x, clientY: y } = e\n\n\t\t\trPointing.current = true\n\t\t\trActivePointerId.current = e.pointerId\n\t\t\trOriginScreenPoint.current = new Vec(x, y)\n\n\t\t\tminimap.isInViewport = false\n\n\t\t\tconst point = minimap.minimapScreenPointToPagePoint(x, y, false, false)\n\n\t\t\tconst vpPageBounds = editor.getViewportPageBounds()\n\t\t\tconst commonBounds = minimap.getContentPageBounds()\n\t\t\tconst allowedBounds = new Box(\n\t\t\t\tcommonBounds.x - vpPageBounds.width / 2,\n\t\t\t\tcommonBounds.y - vpPageBounds.height / 2,\n\t\t\t\tcommonBounds.width + vpPageBounds.width,\n\t\t\t\tcommonBounds.height + vpPageBounds.height\n\t\t\t)\n\n\t\t\t// If we clicked inside of the allowed area, but outside of the viewport\n\t\t\tif (allowedBounds.containsPoint(point) && !vpPageBounds.containsPoint(point)) {\n\t\t\t\tconst delta = Vec.Sub(vpPageBounds.center, vpPageBounds.point)\n\t\t\t\tconst pagePoint = Vec.Add(point, delta)\n\t\t\t\tminimap.originPagePoint.setTo(pagePoint)\n\t\t\t\tminimap.originPageCenter.setTo(point)\n\t\t\t\teditor.centerOnPoint(point, { animation: { duration: editor.options.animationMediumMs } })\n\t\t\t} else {\n\t\t\t\tconst clampedPoint = minimap.minimapScreenPointToPagePoint(x, y, false, true)\n\t\t\t\tminimap.isInViewport = vpPageBounds.containsPoint(clampedPoint)\n\t\t\t\tminimap.originPagePoint.setTo(clampedPoint)\n\t\t\t\tminimap.originPageCenter.setTo(vpPageBounds.center)\n\t\t\t}\n\n\t\t\tconst body = editor.getContainerDocument().body\n\n\t\t\tfunction endDrag() {\n\t\t\t\tif (rActivePointerId.current !== null && elm.hasPointerCapture(rActivePointerId.current)) {\n\t\t\t\t\telm.releasePointerCapture(rActivePointerId.current)\n\t\t\t\t}\n\n\t\t\t\trPointing.current = false\n\t\t\t\trActivePointerId.current = null\n\t\t\t\tbody.removeEventListener('pointerup', endDrag)\n\t\t\t\tbody.removeEventListener('pointercancel', endDrag)\n\t\t\t\tbody.removeEventListener('contextmenu', endDrag, true)\n\t\t\t}\n\n\t\t\tbody.addEventListener('pointerup', endDrag)\n\t\t\tbody.addEventListener('pointercancel', endDrag)\n\t\t\tbody.addEventListener('contextmenu', endDrag, true)\n\t\t},\n\t\t[editor]\n\t)\n\n\tconst onPointerMove = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLCanvasElement>) => {\n\t\t\tconst minimap = minimapRef.current\n\t\t\tif (!minimap) return\n\n\t\t\tconst { clientX: x, clientY: y } = e\n\n\t\t\tconst point = minimap.minimapScreenPointToPagePoint(x, y, e.shiftKey, true)\n\n\t\t\tif (rPointing.current) {\n\t\t\t\t// Ignore the sub-pixel pointer jitter that accompanies a click, so it doesn't\n\t\t\t\t// cut off the easing animation started on pointer down.\n\t\t\t\tif (Vec.Dist2(rOriginScreenPoint.current, new Vec(x, y)) <= CLICK_JITTER_THRESHOLD_SQ) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (minimap.isInViewport) {\n\t\t\t\t\tconst delta = minimap.originPagePoint.clone().sub(minimap.originPageCenter)\n\t\t\t\t\teditor.centerOnPoint(Vec.Sub(point, delta))\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\teditor.centerOnPoint(point)\n\t\t\t}\n\n\t\t\tconst pagePoint = minimap.getMinimapPagePoint(x, y)\n\n\t\t\tconst screenPoint = editor.pageToScreen(pagePoint)\n\n\t\t\tconst info: TLPointerEventInfo = {\n\t\t\t\ttype: 'pointer',\n\t\t\t\ttarget: 'canvas',\n\t\t\t\tname: 'pointer_move',\n\t\t\t\t...getPointerInfo(editor, e),\n\t\t\t\tpoint: screenPoint,\n\t\t\t\tisPen: editor.getInstanceState().isPenMode,\n\t\t\t}\n\n\t\t\teditor.dispatch(info)\n\t\t},\n\t\t[editor]\n\t)\n\n\tconst onWheel = React.useCallback(\n\t\t(e: React.WheelEvent<HTMLCanvasElement>) => {\n\t\t\tconst offset = normalizeWheel(e)\n\n\t\t\teditor.dispatch({\n\t\t\t\ttype: 'wheel',\n\t\t\t\tname: 'wheel',\n\t\t\t\tdelta: offset,\n\t\t\t\tpoint: new Vec(e.clientX, e.clientY),\n\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\taltKey: e.altKey,\n\t\t\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\t\t\tmetaKey: e.metaKey,\n\t\t\t\taccelKey: isAccelKey(e),\n\t\t\t})\n\t\t},\n\t\t[editor]\n\t)\n\n\tconst colorMode = useColorMode()\n\tconst currentThemeId = useValue('current theme id', () => editor.getCurrentThemeId(), [editor])\n\n\tReact.useEffect(() => {\n\t\t// need to wait a tick for next theme css to be applied\n\t\t// otherwise the minimap will render with the wrong colors\n\t\teditor.timers.setTimeout(() => {\n\t\t\tminimapRef.current?.updateColors()\n\t\t\tminimapRef.current?.render()\n\t\t})\n\t}, [colorMode, currentThemeId, editor])\n\n\treturn (\n\t\t<div className=\"tlui-minimap\">\n\t\t\t<canvas\n\t\t\t\tref={rCanvas}\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label={msg('navigation-zone.minimap')}\n\t\t\t\tdata-testid=\"minimap.canvas\"\n\t\t\t\tclassName=\"tlui-minimap__canvas\"\n\t\t\t\tonDoubleClick={onDoubleClick}\n\t\t\t\tonPointerMove={onPointerMove}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\tonWheelCapture={onWheel}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],
  "mappings": "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",
  "names": []
}
