{ "version": 3, "sources": ["../../../../../src/lib/ui/components/NavigationZone/MinimapManager.ts"], "sourcesContent": ["import {\n\tBox2d,\n\tEditor,\n\tPI2,\n\tTLInstancePresence,\n\tTLShapeId,\n\tVec2d,\n\tclamp,\n\tuniqueId,\n} from '@tldraw/editor'\n\nexport class MinimapManager {\n\tconstructor(public editor: Editor) {}\n\n\tdpr = 1\n\n\tcolors = {\n\t\tshapeFill: 'rgba(144, 144, 144, .1)',\n\t\tselectFill: '#2f80ed',\n\t\tviewportFill: 'rgba(144, 144, 144, .1)',\n\t}\n\n\tid = uniqueId()\n\tcvs: HTMLCanvasElement | null = null\n\tpageBounds: (Box2d & { id: TLShapeId })[] = []\n\tcollaborators: TLInstancePresence[] = []\n\n\tcanvasScreenBounds = new Box2d()\n\tcanvasPageBounds = new Box2d()\n\n\tcontentPageBounds = new Box2d()\n\tcontentScreenBounds = new Box2d()\n\n\toriginPagePoint = new Vec2d()\n\toriginPageCenter = new Vec2d()\n\n\tisInViewport = false\n\n\tdebug = false\n\n\tsetDpr(dpr: number) {\n\t\tthis.dpr = +dpr.toFixed(2)\n\t}\n\n\tupdateContentScreenBounds = () => {\n\t\tconst { contentScreenBounds, contentPageBounds: content, canvasScreenBounds: canvas } = this\n\n\t\tlet { x, y, w, h } = contentScreenBounds\n\n\t\tif (content.w > content.h) {\n\t\t\tconst sh = canvas.w / (content.w / content.h)\n\t\t\tif (sh > canvas.h) {\n\t\t\t\tx = (canvas.w - canvas.w * (canvas.h / sh)) / 2\n\t\t\t\ty = 0\n\t\t\t\tw = canvas.w * (canvas.h / sh)\n\t\t\t\th = canvas.h\n\t\t\t} else {\n\t\t\t\tx = 0\n\t\t\t\ty = (canvas.h - sh) / 2\n\t\t\t\tw = canvas.w\n\t\t\t\th = sh\n\t\t\t}\n\t\t} else if (content.w < content.h) {\n\t\t\tconst sw = canvas.h / (content.h / content.w)\n\t\t\tx = (canvas.w - sw) / 2\n\t\t\ty = 0\n\t\t\tw = sw\n\t\t\th = canvas.h\n\t\t} else {\n\t\t\tx = canvas.h / 2\n\t\t\ty = 0\n\t\t\tw = canvas.h\n\t\t\th = canvas.h\n\t\t}\n\n\t\tcontentScreenBounds.set(x, y, w, h)\n\t}\n\n\t/** Get the canvas's true bounds converted to page bounds. */\n\tupdateCanvasPageBounds = () => {\n\t\tconst { canvasPageBounds, canvasScreenBounds, contentPageBounds, contentScreenBounds } = this\n\n\t\tcanvasPageBounds.set(\n\t\t\t0,\n\t\t\t0,\n\t\t\tcontentPageBounds.width / (contentScreenBounds.width / canvasScreenBounds.width),\n\t\t\tcontentPageBounds.height / (contentScreenBounds.height / canvasScreenBounds.height)\n\t\t)\n\n\t\tcanvasPageBounds.center = contentPageBounds.center\n\t}\n\n\tgetScreenPoint = (x: number, y: number) => {\n\t\tconst { canvasScreenBounds } = this\n\n\t\tconst screenX = (x - canvasScreenBounds.minX) * this.dpr\n\t\tconst screenY = (y - canvasScreenBounds.minY) * this.dpr\n\n\t\treturn { x: screenX, y: screenY }\n\t}\n\n\tgetPagePoint = (x: number, y: number) => {\n\t\tconst { contentPageBounds, contentScreenBounds, canvasPageBounds } = this\n\n\t\tconst { x: screenX, y: screenY } = this.getScreenPoint(x, y)\n\n\t\treturn new Vec2d(\n\t\t\tcanvasPageBounds.minX + (screenX * contentPageBounds.width) / contentScreenBounds.width,\n\t\t\tcanvasPageBounds.minY + (screenY * contentPageBounds.height) / contentScreenBounds.height,\n\t\t\t1\n\t\t)\n\t}\n\n\tminimapScreenPointToPagePoint = (\n\t\tx: number,\n\t\ty: number,\n\t\tshiftKey = false,\n\t\tclampToBounds = false\n\t) => {\n\t\tconst { editor } = this\n\t\tconst { viewportPageBounds } = editor\n\n\t\tlet { x: px, y: py } = this.getPagePoint(x, y)\n\n\t\tif (clampToBounds) {\n\t\t\tconst shapesPageBounds = this.editor.currentPageBounds\n\t\t\tconst vpPageBounds = viewportPageBounds\n\n\t\t\tconst minX = (shapesPageBounds?.minX ?? 0) - vpPageBounds.width / 2\n\t\t\tconst maxX = (shapesPageBounds?.maxX ?? 0) + vpPageBounds.width / 2\n\t\t\tconst minY = (shapesPageBounds?.minY ?? 0) - vpPageBounds.height / 2\n\t\t\tconst maxY = (shapesPageBounds?.maxY ?? 0) + vpPageBounds.height / 2\n\n\t\t\tconst lx = Math.max(0, minX + vpPageBounds.width - px)\n\t\t\tconst rx = Math.max(0, -(maxX - vpPageBounds.width - px))\n\t\t\tconst ly = Math.max(0, minY + vpPageBounds.height - py)\n\t\t\tconst ry = Math.max(0, -(maxY - vpPageBounds.height - py))\n\n\t\t\tconst ql = Math.max(0, lx - rx)\n\t\t\tconst qr = Math.max(0, rx - lx)\n\t\t\tconst qt = Math.max(0, ly - ry)\n\t\t\tconst qb = Math.max(0, ry - ly)\n\n\t\t\tif (ql && ql > qr) {\n\t\t\t\tpx += ql / 2\n\t\t\t} else if (qr) {\n\t\t\t\tpx -= qr / 2\n\t\t\t}\n\n\t\t\tif (qt && qt > qb) {\n\t\t\t\tpy += qt / 2\n\t\t\t} else if (qb) {\n\t\t\t\tpy -= qb / 2\n\t\t\t}\n\n\t\t\tpx = clamp(px, minX, maxX)\n\t\t\tpy = clamp(py, minY, maxY)\n\t\t}\n\n\t\tif (shiftKey) {\n\t\t\tconst { originPagePoint } = this\n\t\t\tconst dx = Math.abs(px - originPagePoint.x)\n\t\t\tconst dy = Math.abs(py - originPagePoint.y)\n\t\t\tif (dx > dy) {\n\t\t\t\tpy = originPagePoint.y\n\t\t\t} else {\n\t\t\t\tpx = originPagePoint.x\n\t\t\t}\n\t\t}\n\n\t\treturn new Vec2d(px, py)\n\t}\n\n\trender = () => {\n\t\tconst { cvs, pageBounds } = this\n\t\tthis.updateCanvasPageBounds()\n\n\t\tconst { editor, canvasScreenBounds, canvasPageBounds, contentPageBounds, contentScreenBounds } =\n\t\t\tthis\n\t\tconst { width: cw, height: ch } = canvasScreenBounds\n\t\tconst { viewportPageBounds, selectedShapeIds } = editor\n\n\t\tif (!cvs || !pageBounds) {\n\t\t\treturn\n\t\t}\n\n\t\tconst ctx = cvs.getContext('2d')!\n\n\t\tif (!ctx) {\n\t\t\tthrow new Error('Minimap (shapes): Could not get context')\n\t\t}\n\n\t\tctx.resetTransform()\n\t\tctx.globalAlpha = 1\n\t\tctx.clearRect(0, 0, cw, ch)\n\n\t\t// Transform canvas\n\n\t\tconst sx = contentScreenBounds.width / contentPageBounds.width\n\t\tconst sy = contentScreenBounds.height / contentPageBounds.height\n\n\t\tctx.translate((cw - contentScreenBounds.width) / 2, (ch - contentScreenBounds.height) / 2)\n\t\tctx.scale(sx, sy)\n\t\tctx.translate(-contentPageBounds.minX, -contentPageBounds.minY)\n\n\t\t// Default radius for rounded rects\n\t\tconst rx = 8 / sx\n\t\tconst ry = 8 / sx\n\t\t// Min radius\n\t\tconst ax = 1 / sx\n\t\tconst ay = 1 / sx\n\t\t// Max radius factor\n\t\tconst bx = rx / 4\n\t\tconst by = ry / 4\n\n\t\t// shapes\n\t\tconst shapesPath = new Path2D()\n\t\tconst selectedPath = new Path2D()\n\n\t\tconst { shapeFill, selectFill, viewportFill } = this.colors\n\n\t\t// When there are many shapes, don't draw rounded rectangles;\n\t\t// consider using the shape's size instead.\n\n\t\tlet pb: Box2d & { id: TLShapeId }\n\t\tfor (let i = 0, n = pageBounds.length; i < n; i++) {\n\t\t\tpb = pageBounds[i]\n\t\t\tMinimapManager.roundedRect(\n\t\t\t\tselectedShapeIds.includes(pb.id) ? selectedPath : shapesPath,\n\t\t\t\tpb.minX,\n\t\t\t\tpb.minY,\n\t\t\t\tpb.width,\n\t\t\t\tpb.height,\n\t\t\t\tclamp(rx, ax, pb.width / bx),\n\t\t\t\tclamp(ry, ay, pb.height / by)\n\t\t\t)\n\t\t}\n\n\t\t// Fill the shapes paths\n\t\tctx.fillStyle = shapeFill\n\t\tctx.fill(shapesPath)\n\n\t\t// Fill the selected paths\n\t\tctx.fillStyle = selectFill\n\t\tctx.fill(selectedPath)\n\n\t\tif (this.debug) {\n\t\t\t// Page bounds\n\t\t\tconst commonBounds = Box2d.Common(pageBounds)\n\t\t\tconst { minX, minY, width, height } = commonBounds\n\t\t\tctx.strokeStyle = 'green'\n\t\t\tctx.lineWidth = 2 / sx\n\t\t\tctx.strokeRect(minX + 1 / sx, minY + 1 / sy, width - 2 / sx, height - 2 / sy)\n\t\t}\n\n\t\t// Brush\n\t\t{\n\t\t\tconst { brush } = editor.instanceState\n\t\t\tif (brush) {\n\t\t\t\tconst { x, y, w, h } = brush\n\t\t\t\tctx.beginPath()\n\t\t\t\tMinimapManager.sharpRect(ctx, x, y, w, h)\n\t\t\t\tctx.closePath()\n\t\t\t\tctx.fillStyle = viewportFill\n\t\t\t\tctx.fill()\n\t\t\t}\n\t\t}\n\n\t\t// Viewport\n\t\t{\n\t\t\tconst { minX, minY, width, height } = viewportPageBounds\n\n\t\t\tctx.beginPath()\n\n\t\t\tconst rx = 12 / sx\n\t\t\tconst ry = 12 / sx\n\t\t\tMinimapManager.roundedRect(\n\t\t\t\tctx,\n\t\t\t\tminX,\n\t\t\t\tminY,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tMath.min(width / 4, rx),\n\t\t\t\tMath.min(height / 4, ry)\n\t\t\t)\n\t\t\tctx.closePath()\n\t\t\tctx.fillStyle = viewportFill\n\t\t\tctx.fill()\n\n\t\t\tif (this.debug) {\n\t\t\t\tctx.strokeStyle = 'orange'\n\t\t\t\tctx.strokeRect(minX + 1 / sx, minY + 1 / sy, width - 2 / sx, height - 2 / sy)\n\t\t\t}\n\t\t}\n\n\t\t// Show collaborator cursors\n\n\t\t// Padding for canvas bounds edges\n\t\tconst px = 2.5 / sx\n\t\tconst py = 2.5 / sy\n\n\t\tconst { currentPageId } = editor\n\n\t\tlet collaborator: TLInstancePresence\n\t\tfor (let i = 0; i < this.collaborators.length; i++) {\n\t\t\tcollaborator = this.collaborators[i]\n\t\t\tif (collaborator.currentPageId !== currentPageId) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tctx.beginPath()\n\t\t\tctx.ellipse(\n\t\t\t\tclamp(collaborator.cursor.x, canvasPageBounds.minX + px, canvasPageBounds.maxX - px),\n\t\t\t\tclamp(collaborator.cursor.y, canvasPageBounds.minY + py, canvasPageBounds.maxY - py),\n\t\t\t\t5 / sx,\n\t\t\t\t5 / sy,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tPI2\n\t\t\t)\n\t\t\tctx.fillStyle = collaborator.color\n\t\t\tctx.fill()\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tctx.lineWidth = 2 / sx\n\n\t\t\t{\n\t\t\t\t// Minimap Bounds\n\t\t\t\tconst { minX, minY, width, height } = contentPageBounds\n\t\t\t\tctx.strokeStyle = 'red'\n\t\t\t\tctx.strokeRect(minX + 1 / sx, minY + 1 / sy, width - 2 / sx, height - 2 / sy)\n\t\t\t}\n\n\t\t\t{\n\t\t\t\t// Canvas Bounds\n\t\t\t\tconst { minX, minY, width, height } = canvasPageBounds\n\t\t\t\tctx.strokeStyle = 'blue'\n\t\t\t\tctx.strokeRect(minX + 1 / sx, minY + 1 / sy, width - 2 / sx, height - 2 / sy)\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic roundedRect(\n\t\tctx: CanvasRenderingContext2D | Path2D,\n\t\tx: number,\n\t\ty: number,\n\t\twidth: number,\n\t\theight: number,\n\t\trx: number,\n\t\try: number\n\t) {\n\t\tif (rx < 1 && ry < 1) {\n\t\t\tctx.rect(x, y, width, height)\n\t\t\treturn\n\t\t}\n\n\t\tctx.moveTo(x + rx, y)\n\t\tctx.lineTo(x + width - rx, y)\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry)\n\t\tctx.lineTo(x + width, y + height - ry)\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)\n\t\tctx.lineTo(x + rx, y + height)\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry)\n\t\tctx.lineTo(x, y + ry)\n\t\tctx.quadraticCurveTo(x, y, x + rx, y)\n\t}\n\n\tstatic sharpRect(\n\t\tctx: CanvasRenderingContext2D | Path2D,\n\t\tx: number,\n\t\ty: number,\n\t\twidth: number,\n\t\theight: number,\n\t\t_rx?: number,\n\t\t_ry?: number\n\t) {\n\t\tctx.rect(x, y, width, height)\n\t}\n}\n"], "mappings": "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", "names": ["rx", "ry"] }