{ "version": 3, "sources": ["../../../../../src/lib/ui/components/NavigationZone/Minimap.tsx"], "sourcesContent": ["import {\n\tANIMATION_MEDIUM_MS,\n\tBox2d,\n\tTLPointerEventInfo,\n\tTLShapeId,\n\tVec2d,\n\tgetPointerInfo,\n\tintersectPolygonPolygon,\n\tnormalizeWheel,\n\treleasePointerCapture,\n\tsetPointerCapture,\n\tuseComputed,\n\tuseEditor,\n\tuseIsDarkMode,\n\tuseQuickReactor,\n} from '@tldraw/editor'\nimport * as React from 'react'\nimport { MinimapManager } from './MinimapManager'\n\nexport interface MinimapProps {\n\tshapeFill: string\n\tselectFill: string\n\tviewportFill: string\n}\n\nexport function Minimap({ shapeFill, selectFill, viewportFill }: MinimapProps) {\n\tconst editor = useEditor()\n\n\tconst rCanvas = React.useRef(null!)\n\tconst rPointing = React.useRef(false)\n\n\tconst isDarkMode = useIsDarkMode()\n\tconst devicePixelRatio = useComputed('dpr', () => editor.instanceState.devicePixelRatio, [editor])\n\tconst presences = React.useMemo(() => editor.store.query.records('instance_presence'), [editor])\n\n\tconst minimap = React.useMemo(() => new MinimapManager(editor), [editor])\n\n\tReact.useEffect(() => {\n\t\t// Must check after render\n\t\tconst raf = requestAnimationFrame(() => {\n\t\t\tconst style = getComputedStyle(editor.getContainer())\n\n\t\t\tminimap.colors = {\n\t\t\t\tshapeFill: style.getPropertyValue(shapeFill).trim(),\n\t\t\t\tselectFill: style.getPropertyValue(selectFill).trim(),\n\t\t\t\tviewportFill: style.getPropertyValue(viewportFill).trim(),\n\t\t\t}\n\n\t\t\tminimap.render()\n\t\t})\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(raf)\n\t\t}\n\t}, [editor, selectFill, shapeFill, viewportFill, minimap, isDarkMode])\n\n\tconst onDoubleClick = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!editor.currentPageShapeIds.size) return\n\n\t\t\tconst point = minimap.minimapScreenPointToPagePoint(e.clientX, e.clientY, false, false)\n\n\t\t\tconst clampedPoint = minimap.minimapScreenPointToPagePoint(e.clientX, e.clientY, false, true)\n\n\t\t\tminimap.originPagePoint.setTo(clampedPoint)\n\t\t\tminimap.originPageCenter.setTo(editor.viewportPageBounds.center)\n\n\t\t\teditor.centerOnPoint(point, { duration: ANIMATION_MEDIUM_MS })\n\t\t},\n\t\t[editor, minimap]\n\t)\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tconst elm = e.currentTarget\n\t\t\tsetPointerCapture(elm, e)\n\t\t\tif (!editor.currentPageShapeIds.size) return\n\n\t\t\trPointing.current = true\n\n\t\t\tminimap.isInViewport = false\n\n\t\t\tconst point = minimap.minimapScreenPointToPagePoint(e.clientX, e.clientY, false, false)\n\n\t\t\tconst clampedPoint = minimap.minimapScreenPointToPagePoint(e.clientX, e.clientY, false, true)\n\n\t\t\tconst _vpPageBounds = editor.viewportPageBounds\n\n\t\t\tminimap.isInViewport = _vpPageBounds.containsPoint(clampedPoint)\n\n\t\t\tif (minimap.isInViewport) {\n\t\t\t\tminimap.originPagePoint.setTo(clampedPoint)\n\t\t\t\tminimap.originPageCenter.setTo(_vpPageBounds.center)\n\t\t\t} else {\n\t\t\t\tconst delta = Vec2d.Sub(_vpPageBounds.center, _vpPageBounds.point)\n\t\t\t\tconst pagePoint = Vec2d.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, { duration: ANIMATION_MEDIUM_MS })\n\t\t\t}\n\n\t\t\tfunction release(e: PointerEvent) {\n\t\t\t\tif (elm) {\n\t\t\t\t\treleasePointerCapture(elm, e)\n\t\t\t\t}\n\t\t\t\trPointing.current = false\n\t\t\t\tdocument.body.removeEventListener('pointerup', release)\n\t\t\t}\n\n\t\t\tdocument.body.addEventListener('pointerup', release)\n\t\t},\n\t\t[editor, minimap]\n\t)\n\n\tconst onPointerMove = React.useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tconst point = minimap.minimapScreenPointToPagePoint(e.clientX, e.clientY, e.shiftKey, true)\n\n\t\t\tif (rPointing.current) {\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(Vec2d.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.getPagePoint(e.clientX, e.clientY)\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(e),\n\t\t\t\tpoint: screenPoint,\n\t\t\t\tisPen: editor.instanceState.isPenMode,\n\t\t\t}\n\n\t\t\teditor.dispatch(info)\n\t\t},\n\t\t[editor, minimap]\n\t)\n\n\tconst onWheel = React.useCallback(\n\t\t(e: React.WheelEvent) => {\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\tshiftKey: e.shiftKey,\n\t\t\t\taltKey: e.altKey,\n\t\t\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\t\t})\n\t\t},\n\t\t[editor]\n\t)\n\n\t// Update the minimap's dpr when the dpr changes\n\tuseQuickReactor(\n\t\t'update when dpr changes',\n\t\t() => {\n\t\t\tconst dpr = devicePixelRatio.value\n\t\t\tminimap.setDpr(dpr)\n\n\t\t\tconst canvas = rCanvas.current as HTMLCanvasElement\n\t\t\tconst rect = canvas.getBoundingClientRect()\n\t\t\tconst width = rect.width * dpr\n\t\t\tconst height = rect.height * dpr\n\n\t\t\t// These must happen in order\n\t\t\tcanvas.width = width\n\t\t\tcanvas.height = height\n\t\t\tminimap.canvasScreenBounds.set(rect.x, rect.y, width, height)\n\n\t\t\tminimap.cvs = rCanvas.current\n\t\t},\n\t\t[devicePixelRatio, minimap]\n\t)\n\n\tuseQuickReactor(\n\t\t'minimap render when pagebounds or collaborators changes',\n\t\t() => {\n\t\t\tconst {\n\t\t\t\tcurrentPageShapeIds: shapeIdsOnCurrentPage,\n\t\t\t\tviewportPageBounds,\n\t\t\t\tcurrentPageBounds: commonBoundsOfAllShapesOnCurrentPage,\n\t\t\t} = editor\n\n\t\t\tconst _dpr = devicePixelRatio.value // dereference\n\n\t\t\tminimap.contentPageBounds = commonBoundsOfAllShapesOnCurrentPage\n\t\t\t\t? Box2d.Expand(commonBoundsOfAllShapesOnCurrentPage, viewportPageBounds)\n\t\t\t\t: viewportPageBounds\n\n\t\t\tminimap.updateContentScreenBounds()\n\n\t\t\t// All shape bounds\n\n\t\t\tconst allShapeBounds = [] as (Box2d & { id: TLShapeId })[]\n\n\t\t\tshapeIdsOnCurrentPage.forEach((id) => {\n\t\t\t\tlet pageBounds = editor.getShapePageBounds(id) as Box2d & { id: TLShapeId }\n\t\t\t\tif (!pageBounds) return\n\n\t\t\t\tconst pageMask = editor.getShapeMask(id)\n\n\t\t\t\tif (pageMask) {\n\t\t\t\t\tconst intersection = intersectPolygonPolygon(pageMask, pageBounds.corners)\n\t\t\t\t\tif (!intersection) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tpageBounds = Box2d.FromPoints(intersection) as Box2d & { id: TLShapeId }\n\t\t\t\t}\n\n\t\t\t\tif (pageBounds) {\n\t\t\t\t\tpageBounds.id = id // kinda dirty but we want to include the id here\n\t\t\t\t\tallShapeBounds.push(pageBounds)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tminimap.pageBounds = allShapeBounds\n\t\t\tminimap.collaborators = presences.value\n\t\t\tminimap.render()\n\t\t},\n\t\t[editor, minimap]\n\t)\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t
\n\t)\n}\n"], "mappings": "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", "names": ["e"] }