{
  "version": 3,
  "sources": ["../../src/canvas/region-box.tsx"],
  "sourcesContent": ["import { type PointerEvent as ReactPointerEvent, useRef } from 'react'\nimport { type BoxModel, Editor, useValue, VecLike } from 'tldraw'\nimport { regionDraft } from './state'\n\n/** A region's dashed box. Purely visual \u2014 a region moves by its pin and resizes from its corner\n *  handles, so the box itself takes no pointer events. Positioned in viewport space, as a sibling\n *  of the pins in the canvas layer. */\nexport function RegionBox({ editor, box }: { editor: Editor; box: BoxModel }) {\n\tconst rect = useValue(\n\t\t'region rect',\n\t\t() => {\n\t\t\t// Position from the page\u2192viewport top-left; screen size scales with zoom, page size doesn't.\n\t\t\tconst topLeft = editor.pageToViewport({ x: box.x, y: box.y })\n\t\t\tconst zoom = editor.getZoomLevel()\n\t\t\treturn { left: topLeft.x, top: topLeft.y, width: box.w * zoom, height: box.h * zoom }\n\t\t},\n\t\t[editor, box.x, box.y, box.w, box.h]\n\t)\n\treturn <div className=\"tlui-cmt-canvas-region\" style={rect} />\n}\n\n/** The live region being dragged out by the comment tool, or nothing when not dragging. */\nexport function RegionDraftBox({ editor }: { editor: Editor }) {\n\tconst box = useValue('region draft', () => regionDraft.get(editor), [editor])\n\tif (!box) return null\n\treturn <RegionBox editor={editor} box={box} />\n}\n\n// A resize handle's normalized 0\u20131 spot on the box, and its cursor. An axis at 0.5 is *not*\n// controlled by that handle \u2014 the resize math reads the spot rather than special-casing corners.\nexport interface RegionHandle {\n\tx: number\n\ty: number\n\tcursor: string\n}\n\n// The four corners, each resizing both axes.\nexport const REGION_CORNERS: readonly RegionHandle[] = [\n\t{ x: 0, y: 0, cursor: 'nwse-resize' },\n\t{ x: 1, y: 0, cursor: 'nesw-resize' },\n\t{ x: 0, y: 1, cursor: 'nesw-resize' },\n\t{ x: 1, y: 1, cursor: 'nwse-resize' },\n]\n\n// Screen-space slack around a region's bounds within which its box and handles stay revealed, so\n// the handles (which sit on the edge) are comfortably reachable.\nexport const REGION_HANDLE_MARGIN_PX = 12\n\n/** Resize `box` by dragging `handle` to `cursor` (page coords). Each controlled axis spans from the\n *  handle's fixed opposite edge to the cursor (normalized, so dragging past it flips); an axis the\n *  handle doesn't control (a midpoint, at 0.5) keeps its original position and size. */\nfunction resizeRegion(box: BoxModel, handle: RegionHandle, cursor: VecLike): BoxModel {\n\tconst controlsX = handle.x !== 0.5\n\tconst controlsY = handle.y !== 0.5\n\tconst fixedX = box.x + (1 - handle.x) * box.w\n\tconst fixedY = box.y + (1 - handle.y) * box.h\n\treturn {\n\t\tx: controlsX ? Math.min(fixedX, cursor.x) : box.x,\n\t\ty: controlsY ? Math.min(fixedY, cursor.y) : box.y,\n\t\tw: controlsX ? Math.abs(cursor.x - fixedX) : box.w,\n\t\th: controlsY ? Math.abs(cursor.y - fixedY) : box.h,\n\t}\n}\n\n/** Draggable handles that resize a region \u2014 corners (both axes) or edges (one axis), per the resize\n *  option. Previews live, commits on release. */\nexport function RegionResizeHandles({\n\teditor,\n\tbox,\n\thandles,\n\tonPreview,\n\tonCommit,\n}: {\n\teditor: Editor\n\tbox: BoxModel\n\thandles: readonly RegionHandle[]\n\tonPreview(bounds: BoxModel | null): void\n\tonCommit(bounds: BoxModel): void\n}) {\n\t// The box at pointer-down, captured so the box prop reflowing under the live preview doesn't move\n\t// the fixed edges mid-drag.\n\tconst boxRef = useRef<BoxModel | null>(null)\n\tconst points = useValue(\n\t\t'region handle points',\n\t\t() =>\n\t\t\thandles.map((h) => {\n\t\t\t\tconst p = editor.pageToViewport({ x: box.x + h.x * box.w, y: box.y + h.y * box.h })\n\t\t\t\treturn { ...h, key: `${h.x}-${h.y}`, left: p.x, top: p.y }\n\t\t\t}),\n\t\t[editor, box.x, box.y, box.w, box.h, handles]\n\t)\n\tconst startResize = (e: ReactPointerEvent<HTMLDivElement>) => {\n\t\te.stopPropagation()\n\t\tboxRef.current = box\n\t\te.currentTarget.setPointerCapture(e.pointerId)\n\t}\n\tconst resizedTo = (h: RegionHandle, e: ReactPointerEvent<HTMLDivElement>): BoxModel =>\n\t\tresizeRegion(boxRef.current!, h, editor.screenToPage({ x: e.clientX, y: e.clientY }))\n\tconst onResize = (h: RegionHandle) => (e: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (boxRef.current) onPreview(resizedTo(h, e))\n\t}\n\tconst endResize = (h: RegionHandle) => (e: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (!boxRef.current) return\n\t\tconst bounds = resizedTo(h, e)\n\t\tboxRef.current = null\n\t\tif (e.currentTarget.hasPointerCapture(e.pointerId))\n\t\t\te.currentTarget.releasePointerCapture(e.pointerId)\n\t\tonCommit(bounds)\n\t}\n\treturn (\n\t\t<>\n\t\t\t{points.map((h) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={h.key}\n\t\t\t\t\tclassName=\"tlui-cmt-canvas-region-handle\"\n\t\t\t\t\tstyle={{ left: h.left, top: h.top, cursor: h.cursor }}\n\t\t\t\t\tonPointerDown={startResize}\n\t\t\t\t\tonPointerMove={onResize(h)}\n\t\t\t\t\tonPointerUp={endResize(h)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t)\n}\n"],
  "mappings": "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",
  "names": []
}
