canvu-react 0.4.25 → 0.4.27
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.
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +53 -25
- package/dist/native.cjs.map +1 -1
- package/dist/native.js +54 -26
- package/dist/native.js.map +1 -1
- package/dist/react.cjs +4 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +4 -3
- package/dist/react.js.map +1 -1
- package/dist/tldraw.cjs.map +1 -1
- package/dist/tldraw.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/math/rect.ts","../src/camera/camera.ts","../src/image/canvas-encode.ts","../src/image/indexed-db-image-store.ts","../src/image/pdf-loader.ts","../src/image/raster-image.ts","../src/input/pan-momentum.ts","../src/input/apple-pencil-navigation.ts","../src/input/attach-viewport-input.ts","../src/math/item-transform.ts","../src/scene/custom-shape.ts","../src/scene/text-svg.ts","../src/scene/shape-builders.ts","../src/interaction/resize-handles.ts","../src/interaction/arrow-bindings.ts","../src/interaction/hit-test.ts","../src/react/asset-hydration.ts","../src/scene/spatial-cull.ts","../src/scene/cull.ts","../src/renderer/svg-vector-renderer.ts","../src/scene/clone-item.ts","../src/scene/link-item.ts","../src/scene/managed-images.ts","../src/scene/scene.ts"],"names":["d","op","b","s","g","escapeHtmlText"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Axis-aligned rectangle in 2D (world or screen space).\n */\nexport type Rect = {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly width: number;\n\treadonly height: number;\n};\n\n/**\n * Returns whether two axis-aligned rectangles intersect (edges touching count).\n */\nexport function rectsIntersect(a: Rect, b: Rect): boolean {\n\treturn (\n\t\ta.x < b.x + b.width &&\n\t\ta.x + a.width > b.x &&\n\t\ta.y < b.y + b.height &&\n\t\ta.y + a.height > b.y\n\t);\n}\n\n/**\n * Normalizes a rect so width and height are non-negative.\n */\nexport function normalizeRect(r: Rect): Rect {\n\tconst x0 = r.width >= 0 ? r.x : r.x + r.width;\n\tconst y0 = r.height >= 0 ? r.y : r.y + r.height;\n\treturn {\n\t\tx: x0,\n\t\ty: y0,\n\t\twidth: Math.abs(r.width),\n\t\theight: Math.abs(r.height),\n\t};\n}\n","import type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\n\nexport type Camera2DOptions = {\n\t/** Minimum zoom scale (world units per CSS pixel). */\n\tminZoom?: number;\n\t/** Maximum zoom scale. */\n\tmaxZoom?: number;\n};\n\n/**\n * 2D camera: pan (`x`, `y`) in **screen space** (CSS pixels) and uniform zoom `zoom`.\n *\n * Screen mapping: `screen = world * zoom + cameraOffset`\n * (world origin maps to `(x, y)` on screen).\n */\nexport class Camera2D {\n\tx = 0;\n\ty = 0;\n\t/** Scale: world units per CSS pixel (larger = more zoomed in). */\n\tzoom = 1;\n\n\treadonly minZoom: number;\n\treadonly maxZoom: number;\n\n\tconstructor(options: Camera2DOptions = {}) {\n\t\tthis.minZoom = options.minZoom ?? 0.05;\n\t\tthis.maxZoom = options.maxZoom ?? 32;\n\t}\n\n\t/**\n\t * Converts a point from world coordinates to CSS pixel coordinates relative to the viewport top-left.\n\t */\n\tworldToScreen(\n\t\tworldX: number,\n\t\tworldY: number,\n\t): { screenX: number; screenY: number } {\n\t\treturn {\n\t\t\tscreenX: worldX * this.zoom + this.x,\n\t\t\tscreenY: worldY * this.zoom + this.y,\n\t\t};\n\t}\n\n\t/**\n\t * Converts a point from CSS pixel coordinates (viewport-relative) to world coordinates.\n\t */\n\tscreenToWorld(\n\t\tscreenX: number,\n\t\tscreenY: number,\n\t): { worldX: number; worldY: number } {\n\t\tconst z = this.zoom;\n\t\tif (z === 0) {\n\t\t\treturn { worldX: 0, worldY: 0 };\n\t\t}\n\t\treturn {\n\t\t\tworldX: (screenX - this.x) / z,\n\t\t\tworldY: (screenY - this.y) / z,\n\t\t};\n\t}\n\n\t/**\n\t * Sets zoom, clamped to `[minZoom, maxZoom]`, optionally anchoring a screen point so it stays under the cursor.\n\t */\n\tsetZoom(nextZoom: number, anchorScreen?: { x: number; y: number }): void {\n\t\tconst clamped = Math.min(this.maxZoom, Math.max(this.minZoom, nextZoom));\n\t\tif (!anchorScreen) {\n\t\t\tthis.zoom = clamped;\n\t\t\treturn;\n\t\t}\n\t\t// World point under the anchor before changing zoom (using current pan + zoom).\n\t\tconst anchorWorld = this.screenToWorld(anchorScreen.x, anchorScreen.y);\n\t\tthis.zoom = clamped;\n\t\t// screen = world * zoom + offset → offset = screen - world * zoom\n\t\tthis.x = anchorScreen.x - anchorWorld.worldX * this.zoom;\n\t\tthis.y = anchorScreen.y - anchorWorld.worldY * this.zoom;\n\t}\n\n\t/**\n\t * Returns the world-space rectangle visible in a viewport of `viewportWidth` x `viewportHeight` CSS pixels.\n\t */\n\tgetVisibleWorldRect(viewportWidth: number, viewportHeight: number): Rect {\n\t\tconst topLeft = this.screenToWorld(0, 0);\n\t\tconst bottomRight = this.screenToWorld(viewportWidth, viewportHeight);\n\t\treturn normalizeRect({\n\t\t\tx: topLeft.worldX,\n\t\t\ty: topLeft.worldY,\n\t\t\twidth: bottomRight.worldX - topLeft.worldX,\n\t\t\theight: bottomRight.worldY - topLeft.worldY,\n\t\t});\n\t}\n}\n","export type EncodeCanvasToBlobOptions = {\n\tmimeType?: string;\n\tquality?: number;\n\tfallbackMimeTypes?: readonly string[];\n};\n\nconst DEFAULT_FALLBACK_MIME_TYPES = [\"image/png\"] as const;\n\nconst tryCanvasToBlob = (\n\tcanvas: HTMLCanvasElement,\n\tmimeType: string,\n\tquality?: number,\n): Promise<Blob | null> =>\n\tnew Promise((resolve) => {\n\t\tcanvas.toBlob((blob) => resolve(blob), mimeType, quality);\n\t});\n\nconst blobFromDataUrl = async (dataUrl: string): Promise<Blob> => {\n\tconst response = await fetch(dataUrl);\n\tconst blob = await response.blob();\n\tif (blob.size === 0) {\n\t\tthrow new Error(\"Failed to encode canvas to blob\");\n\t}\n\treturn blob;\n};\n\nexport async function encodeCanvasToBlob(\n\tcanvas: HTMLCanvasElement,\n\toptions?: EncodeCanvasToBlobOptions,\n): Promise<Blob> {\n\tconst primaryMimeType = options?.mimeType ?? \"image/png\";\n\tconst quality = options?.quality;\n\tconst mimeTypes = [\n\t\tprimaryMimeType,\n\t\t...(options?.fallbackMimeTypes ?? DEFAULT_FALLBACK_MIME_TYPES),\n\t].filter(\n\t\t(mimeType, index, mimeTypeList) => mimeTypeList.indexOf(mimeType) === index,\n\t);\n\n\tfor (const mimeType of mimeTypes) {\n\t\tconst blob = await tryCanvasToBlob(\n\t\t\tcanvas,\n\t\t\tmimeType,\n\t\t\tmimeType === primaryMimeType ? quality : undefined,\n\t\t);\n\t\tif (blob) {\n\t\t\treturn blob;\n\t\t}\n\t}\n\n\tfor (const mimeType of mimeTypes) {\n\t\tconst dataUrl = canvas.toDataURL(mimeType, quality);\n\t\tif (dataUrl && dataUrl !== \"data:,\") {\n\t\t\treturn blobFromDataUrl(dataUrl);\n\t\t}\n\t}\n\n\tthrow new Error(\"Failed to encode canvas to blob\");\n}\n","import { encodeCanvasToBlob } from \"./canvas-encode\";\n\nconst DB_NAME = \"canvu-image-store\";\nconst DB_VERSION = 1;\n\nfunction openDb(): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(DB_NAME, DB_VERSION);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(\"images\")) {\n\t\t\t\tdb.createObjectStore(\"images\");\n\t\t\t}\n\t\t\tif (!db.objectStoreNames.contains(\"thumbnails\")) {\n\t\t\t\tdb.createObjectStore(\"thumbnails\");\n\t\t\t}\n\t\t};\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction getFromStore(\n\tdb: IDBDatabase,\n\tstoreName: string,\n\tid: string,\n): Promise<Blob | undefined> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(storeName, \"readonly\");\n\t\tconst req = tx.objectStore(storeName).get(id);\n\t\treq.onsuccess = () => resolve(req.result ?? undefined);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction putInStore(\n\tdb: IDBDatabase,\n\tstoreName: string,\n\tid: string,\n\tblob: Blob,\n): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(storeName, \"readwrite\");\n\t\tconst req = tx.objectStore(storeName).put(blob, id);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction deleteFromStore(\n\tdb: IDBDatabase,\n\tstoreName: string,\n\tid: string,\n): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(storeName, \"readwrite\");\n\t\tconst req = tx.objectStore(storeName).delete(id);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction generateBlobId(): string {\n\treturn crypto.randomUUID();\n}\n\nexport class IndexedDbImageStore {\n\tprivate dbPromise: Promise<IDBDatabase> | null = null;\n\n\tprivate getDb(): Promise<IDBDatabase> {\n\t\tif (!this.dbPromise) {\n\t\t\tthis.dbPromise = openDb();\n\t\t}\n\t\treturn this.dbPromise;\n\t}\n\n\tasync storeOriginal(blob: Blob): Promise<string> {\n\t\tconst id = generateBlobId();\n\t\tconst db = await this.getDb();\n\t\tawait putInStore(db, \"images\", id, blob);\n\t\treturn id;\n\t}\n\n\tasync getOriginal(id: string): Promise<Blob | undefined> {\n\t\tconst db = await this.getDb();\n\t\treturn getFromStore(db, \"images\", id);\n\t}\n\n\tasync deleteOriginal(id: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tawait deleteFromStore(db, \"images\", id);\n\t}\n\n\tasync storeThumbnail(blob: Blob): Promise<string> {\n\t\tconst id = generateBlobId();\n\t\tconst db = await this.getDb();\n\t\tawait putInStore(db, \"thumbnails\", id, blob);\n\t\treturn id;\n\t}\n\n\tasync getThumbnail(id: string): Promise<Blob | undefined> {\n\t\tconst db = await this.getDb();\n\t\treturn getFromStore(db, \"thumbnails\", id);\n\t}\n\n\tasync deleteThumbnail(id: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tawait deleteFromStore(db, \"thumbnails\", id);\n\t}\n}\n\nfunction decodeImageToCanvas(\n\tblob: Blob,\n\tmaxDimension?: number,\n): Promise<{ canvas: HTMLCanvasElement; width: number; height: number }> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = new Image();\n\t\timg.onload = () => {\n\t\t\tconst w0 = img.naturalWidth;\n\t\t\tconst h0 = img.naturalHeight;\n\t\t\tif (w0 < 1 || h0 < 1) {\n\t\t\t\treject(new Error(\"Image has no dimensions\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst scale = maxDimension ? Math.min(1, maxDimension / Math.max(w0, h0)) : 1;\n\t\t\tconst cw = Math.max(1, Math.round(w0 * scale));\n\t\t\tconst ch = Math.max(1, Math.round(h0 * scale));\n\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\tcanvas.width = cw;\n\t\t\tcanvas.height = ch;\n\t\t\tconst ctx = canvas.getContext(\"2d\");\n\t\t\tif (!ctx) {\n\t\t\t\treject(new Error(\"Canvas 2D context unavailable\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.imageSmoothingEnabled = true;\n\t\t\tctx.imageSmoothingQuality = \"high\";\n\t\t\tctx.drawImage(img, 0, 0, cw, ch);\n\t\t\tURL.revokeObjectURL(img.src);\n\t\t\tresolve({ canvas, width: cw, height: ch });\n\t\t};\n\t\timg.onerror = () => {\n\t\t\tURL.revokeObjectURL(img.src);\n\t\t\treject(new Error(\"Could not decode image\"));\n\t\t};\n\t\timg.src = URL.createObjectURL(blob);\n\t});\n}\n\nfunction canvasToBlob(\n\tcanvas: HTMLCanvasElement,\n\tmime: string,\n\tquality?: number,\n): Promise<Blob> {\n\treturn encodeCanvasToBlob(canvas, { mimeType: mime, quality });\n}\n\nexport type StoredImageResult = {\n\tblobId: string;\n\tthumbnailBlobId: string;\n\twidth: number;\n\theight: number;\n};\n\n/**\n * Stores an image file in IndexedDB at original resolution and generates a 256px thumbnail.\n * Returns blob IDs that can be referenced from `VectorSceneItem.imageBlobId`.\n */\nexport async function loadImageToStore(\n\tfile: File,\n\tstore: IndexedDbImageStore,\n): Promise<StoredImageResult> {\n\tconst originalBlob = file;\n\tconst blobId = await store.storeOriginal(originalBlob);\n\n\tconst { canvas, width, height } = await decodeImageToCanvas(originalBlob);\n\n\tconst thumbScale = Math.min(1, 256 / Math.max(width, height));\n\tconst tw = Math.max(1, Math.round(width * thumbScale));\n\tconst th = Math.max(1, Math.round(height * thumbScale));\n\tconst thumbCanvas = document.createElement(\"canvas\");\n\tthumbCanvas.width = tw;\n\tthumbCanvas.height = th;\n\tconst tCtx = thumbCanvas.getContext(\"2d\");\n\tif (tCtx) {\n\t\ttCtx.imageSmoothingEnabled = true;\n\t\ttCtx.imageSmoothingQuality = \"high\";\n\t\ttCtx.drawImage(canvas, 0, 0, tw, th);\n\t}\n\tconst thumbBlob = await canvasToBlob(\n\t\tthumbCanvas,\n\t\tfile.type === \"image/jpeg\" || file.type === \"image/jpg\"\n\t\t\t? \"image/jpeg\"\n\t\t\t: \"image/png\",\n\t\tfile.type.startsWith(\"image/jpeg\") ? 0.85 : undefined,\n\t);\n\tconst thumbnailBlobId = await store.storeThumbnail(thumbBlob);\n\n\treturn { blobId, thumbnailBlobId, width, height };\n}\n\n/**\n * Fetches a blob from IndexedDB and creates a session-scoped `blob:` URL.\n * Caller must revoke via `URL.revokeObjectURL` when done.\n */\nexport async function createBlobUrlFromStore(\n\tstore: IndexedDbImageStore,\n\tblobId: string,\n): Promise<string | null> {\n\tconst blob = await store.getOriginal(blobId);\n\tif (!blob) return null;\n\treturn URL.createObjectURL(blob);\n}\n\n/**\n * Creates a `blob:` URL for the thumbnail from IndexedDB.\n */\nexport async function createThumbnailBlobUrlFromStore(\n\tstore: IndexedDbImageStore,\n\tthumbnailBlobId: string,\n): Promise<string | null> {\n\tconst blob = await store.getThumbnail(thumbnailBlobId);\n\tif (!blob) return null;\n\treturn URL.createObjectURL(blob);\n}\n\nexport async function deleteImageFromStore(\n\tstore: IndexedDbImageStore,\n\tblobId: string,\n\tthumbnailBlobId?: string,\n): Promise<void> {\n\tawait store.deleteOriginal(blobId);\n\tif (thumbnailBlobId) {\n\t\tawait store.deleteThumbnail(thumbnailBlobId);\n\t}\n}\n","import { encodeCanvasToBlob } from \"./canvas-encode\";\nimport type {\n\tIndexedDbImageStore,\n\tStoredImageResult,\n} from \"./indexed-db-image-store\";\n\ntype PdfJsLib = typeof import(\"pdfjs-dist\");\n\nlet pdfjsPromise: Promise<PdfJsLib> | null = null;\n\nfunction getPdfJs(): Promise<PdfJsLib> {\n\tif (!pdfjsPromise) {\n\t\tpdfjsPromise = import(\"pdfjs-dist\").then((mod) => {\n\t\t\tconst workerSrc = new URL(\n\t\t\t\t\"pdfjs-dist/build/pdf.worker.min.mjs\",\n\t\t\t\timport.meta.url,\n\t\t\t).toString();\n\t\t\tmod.GlobalWorkerOptions.workerSrc = workerSrc;\n\t\t\treturn mod;\n\t\t});\n\t}\n\treturn pdfjsPromise;\n}\n\nasync function renderPageToCanvas(\n\tpage: import(\"pdfjs-dist\").PDFPageProxy,\n\tscale: number,\n): Promise<{ canvas: HTMLCanvasElement; width: number; height: number }> {\n\tconst raw = page.getViewport({ scale: 1 });\n\tconst adjustedScale = Math.round(raw.width * scale) / raw.width;\n\tconst viewport = page.getViewport({ scale: adjustedScale });\n\tconst w = Math.round(viewport.width);\n\tconst h = Math.round(viewport.height);\n\tconst canvas = document.createElement(\"canvas\");\n\tcanvas.width = w;\n\tcanvas.height = h;\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) throw new Error(\"Canvas 2D context unavailable\");\n\tctx.imageSmoothingEnabled = true;\n\tctx.imageSmoothingQuality = \"high\";\n\tawait page.render({ canvas, viewport }).promise;\n\treturn { canvas, width: w, height: h };\n}\n\ntype PdfPageResult = StoredImageResult & { pageNumber: number };\n\ntype LoadPdfToStoreOptions = {\n\tscale?: number;\n\tpageNumbers?: readonly number[];\n\tpageConcurrency?: number;\n\tstoreThumbnails?: boolean;\n\tonPageStored?: (page: PdfPageResult) => void | Promise<void>;\n};\n\nfunction normalizePdfPageNumbers(\n\tpageNumbers: readonly number[] | undefined,\n\tpageCount: number,\n): number[] {\n\tif (!pageNumbers || pageNumbers.length === 0) {\n\t\treturn Array.from({ length: pageCount }, (_, index) => index + 1);\n\t}\n\n\treturn [...new Set(pageNumbers)]\n\t\t.filter((pageNumber) => pageNumber >= 1 && pageNumber <= pageCount)\n\t\t.sort((left, right) => left - right);\n}\n\nasync function runWithConcurrency<TItem, TResult>(\n\titems: readonly TItem[],\n\tconcurrency: number,\n\texecute: (item: TItem) => Promise<TResult>,\n): Promise<TResult[]> {\n\tconst results = new Array<TResult>(items.length);\n\tlet nextIndex = 0;\n\tconst workerCount = Math.max(1, Math.min(concurrency, items.length));\n\n\tawait Promise.all(\n\t\tArray.from({ length: workerCount }, async () => {\n\t\t\twhile (nextIndex < items.length) {\n\t\t\t\tconst currentIndex = nextIndex;\n\t\t\t\tnextIndex += 1;\n\t\t\t\tconst item = items[currentIndex];\n\t\t\t\tif (item === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresults[currentIndex] = await execute(item);\n\t\t\t}\n\t\t}),\n\t);\n\n\treturn results;\n}\n\n/**\n * Renders each page of a PDF to a bitmap blob, stores original + thumbnail in IndexedDB,\n * and returns the results for creating `VectorSceneItem` entries.\n *\n * Pages are rendered at 1.5× screen DPI by default for crisp zoom.\n */\nexport async function loadPdfToStore(\n\tfile: Blob,\n\tstore: IndexedDbImageStore,\n\toptions?: LoadPdfToStoreOptions,\n): Promise<PdfPageResult[]> {\n\tconst scale = options?.scale ?? 1.5;\n\tconst pageConcurrency = options?.pageConcurrency ?? 2;\n\tconst storeThumbnails = options?.storeThumbnails ?? false;\n\tconst pdfjs = await getPdfJs();\n\tconst arrayBuffer = await file.arrayBuffer();\n\tconst pdf = await pdfjs.getDocument({ data: arrayBuffer }).promise;\n\tconst pageNumbers = normalizePdfPageNumbers(options?.pageNumbers, pdf.numPages);\n\tconst bufferedResults = new Map<number, PdfPageResult>();\n\tlet nextEmitIndex = 0;\n\tlet emitChain = Promise.resolve();\n\n\tconst queuePageEmission = async (pageResult: PdfPageResult) => {\n\t\tbufferedResults.set(pageResult.pageNumber, pageResult);\n\t\tconst run = async () => {\n\t\t\twhile (nextEmitIndex < pageNumbers.length) {\n\t\t\t\tconst nextPageNumber = pageNumbers[nextEmitIndex];\n\t\t\t\tif (nextPageNumber == null) break;\n\t\t\t\tconst bufferedResult = bufferedResults.get(nextPageNumber);\n\t\t\t\tif (!bufferedResult) break;\n\t\t\t\tbufferedResults.delete(nextPageNumber);\n\t\t\t\tnextEmitIndex += 1;\n\t\t\t\tawait options?.onPageStored?.(bufferedResult);\n\t\t\t}\n\t\t};\n\t\tconst nextChain = emitChain.then(run, run);\n\t\temitChain = nextChain.catch(() => {});\n\t\tawait nextChain;\n\t};\n\n\treturn await runWithConcurrency(\n\t\tpageNumbers,\n\t\tpageConcurrency,\n\t\tasync (pageNumber) => {\n\t\t\tconst page = await pdf.getPage(pageNumber);\n\t\t\tconst { canvas, width, height } = await renderPageToCanvas(page, scale);\n\t\t\tconst mime = \"image/png\";\n\t\t\tconst pageBlob = await encodeCanvasToBlob(canvas, { mimeType: mime });\n\t\t\tconst blobId = await store.storeOriginal(pageBlob);\n\t\t\tconst thumbnailBlobId = storeThumbnails\n\t\t\t\t? await (async () => {\n\t\t\t\t\t\tconst thumbScale = Math.min(1, 256 / Math.max(width, height));\n\t\t\t\t\t\tconst tw = Math.max(1, Math.round(width * thumbScale));\n\t\t\t\t\t\tconst th = Math.max(1, Math.round(height * thumbScale));\n\t\t\t\t\t\tconst thumbCanvas = document.createElement(\"canvas\");\n\t\t\t\t\t\tthumbCanvas.width = tw;\n\t\t\t\t\t\tthumbCanvas.height = th;\n\t\t\t\t\t\tconst tCtx = thumbCanvas.getContext(\"2d\");\n\t\t\t\t\t\tif (tCtx) {\n\t\t\t\t\t\t\ttCtx.imageSmoothingEnabled = true;\n\t\t\t\t\t\t\ttCtx.imageSmoothingQuality = \"high\";\n\t\t\t\t\t\t\ttCtx.drawImage(canvas, 0, 0, tw, th);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst thumbBlob = await encodeCanvasToBlob(thumbCanvas, {\n\t\t\t\t\t\t\tmimeType: mime,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn await store.storeThumbnail(thumbBlob);\n\t\t\t\t\t})()\n\t\t\t\t: \"\";\n\t\t\tconst pageResult = {\n\t\t\t\tblobId,\n\t\t\t\tthumbnailBlobId,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tpageNumber,\n\t\t\t};\n\t\t\tawait queuePageEmission(pageResult);\n\t\t\treturn pageResult;\n\t\t},\n\t);\n}\n","/**\n * Embeds the bitmap as a single SVG `<image>` (data URL or blob URL) instead of tracing paths.\n * Avoids huge path counts and keeps screenshots/photos sharp.\n */\n\nimport { encodeCanvasToBlob } from \"./canvas-encode\";\n\n/**\n * Default max width/height (px) before encoding. Larger = sharper zoom / bigger snapshots.\n * Override per app via {@link loadImageFileAsRasterSceneSource} or `VectorViewport` `imageRasterMaxDimension`.\n */\nexport const MAX_RASTER_EMBED_DIMENSION = 4096;\n\n/** How raster pixels are exposed to SVG `<image href>`. */\nexport type RasterEmbedMode = \"dataUrl\" | \"blobUrl\";\n\nexport type LoadRasterImageFileOptions = {\n\t/** Longest edge (px). Images larger than this are scaled down (canvas). */\n\tmaxDimension?: number;\n\t/**\n\t * `dataUrl` — easy to persist (JSON), higher memory use with many large images.\n\t * `blobUrl` — lower overhead; **revoke** URLs when items leave the scene (handled by `VectorViewport` for its own loads).\n\t */\n\tembedMode?: RasterEmbedMode;\n};\n\nfunction normalizeLoadOptions(\n\tmaxDimensionOrOptions?: number | LoadRasterImageFileOptions,\n): Required<Pick<LoadRasterImageFileOptions, \"maxDimension\" | \"embedMode\">> {\n\tif (typeof maxDimensionOrOptions === \"number\") {\n\t\treturn {\n\t\t\tmaxDimension: maxDimensionOrOptions,\n\t\t\tembedMode: \"dataUrl\",\n\t\t};\n\t}\n\treturn {\n\t\tmaxDimension: maxDimensionOrOptions?.maxDimension ?? MAX_RASTER_EMBED_DIMENSION,\n\t\tembedMode: maxDimensionOrOptions?.embedMode ?? \"dataUrl\",\n\t};\n}\n\nfunction loadImageFromObjectUrl(objectUrl: string): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = new Image();\n\t\timg.onload = () => resolve(img);\n\t\timg.onerror = () => reject(new Error(\"Could not decode image\"));\n\t\timg.decoding = \"async\";\n\t\timg.src = objectUrl;\n\t});\n}\n\nfunction canvasToObjectUrl(\n\tcanvas: HTMLCanvasElement,\n\tmime: string,\n\tquality?: number,\n): Promise<string> {\n\treturn encodeCanvasToBlob(canvas, { mimeType: mime, quality }).then((blob) =>\n\t\tURL.createObjectURL(blob),\n\t);\n}\n\nexport type RasterSceneSource = {\n\t/**\n\t * Value for SVG `<image href>`: `data:image/...;base64,...` or `blob:https://...`.\n\t * Despite the name, `blobUrl` mode stores a blob URL here.\n\t */\n\tdataUrl: string;\n\twidth: number;\n\theight: number;\n};\n\n/**\n * Decodes a file and returns a raster source for {@link createImageItem}.\n *\n * - `dataUrl` (default): canvas downscale + base64 (serializable).\n * - `blobUrl`: uses `URL.createObjectURL(file)` at **full resolution** when the longest edge\n * is ≤ `maxDimension`; otherwise downscales like data mode but keeps a blob URL (smaller than base64).\n */\nexport async function loadImageFileAsRasterSceneSource(\n\tfile: File,\n\tmaxDimensionOrOptions?: number | LoadRasterImageFileOptions,\n): Promise<RasterSceneSource> {\n\tconst { maxDimension: maxDim, embedMode } =\n\t\tnormalizeLoadOptions(maxDimensionOrOptions);\n\n\tconst fileObjectUrl = URL.createObjectURL(file);\n\tlet fileUrlReleased = false;\n\ttry {\n\t\tconst img = await loadImageFromObjectUrl(fileObjectUrl);\n\t\tconst w0 = img.naturalWidth;\n\t\tconst h0 = img.naturalHeight;\n\t\tif (w0 < 1 || h0 < 1) {\n\t\t\tthrow new Error(\"Image has no dimensions\");\n\t\t}\n\n\t\tconst scale = Math.min(1, maxDim / Math.max(w0, h0));\n\t\tconst needsDownscale = scale < 1 - 1e-9;\n\n\t\tif (embedMode === \"blobUrl\" && !needsDownscale) {\n\t\t\t// Keep file blob URL; no recompression, full native pixels within cap.\n\t\t\tfileUrlReleased = true;\n\t\t\treturn { dataUrl: fileObjectUrl, width: w0, height: h0 };\n\t\t}\n\n\t\tURL.revokeObjectURL(fileObjectUrl);\n\t\tfileUrlReleased = true;\n\n\t\tconst cw = needsDownscale\n\t\t\t? Math.max(1, Math.round(w0 * scale))\n\t\t\t: Math.max(1, w0);\n\t\tconst ch = needsDownscale\n\t\t\t? Math.max(1, Math.round(h0 * scale))\n\t\t\t: Math.max(1, h0);\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tcanvas.width = cw;\n\t\tcanvas.height = ch;\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tif (!ctx) {\n\t\t\tthrow new Error(\"Canvas 2D context unavailable\");\n\t\t}\n\t\tctx.imageSmoothingEnabled = true;\n\t\tctx.imageSmoothingQuality = \"high\";\n\t\tctx.drawImage(img, 0, 0, cw, ch);\n\n\t\tconst isJpeg =\n\t\t\tfile.type === \"image/jpeg\" ||\n\t\t\tfile.type === \"image/jpg\" ||\n\t\t\tfile.type === \"image/pjpeg\";\n\n\t\tif (embedMode === \"blobUrl\") {\n\t\t\tconst mime = isJpeg ? \"image/jpeg\" : \"image/png\";\n\t\t\tconst blobHref = await canvasToObjectUrl(\n\t\t\t\tcanvas,\n\t\t\t\tmime,\n\t\t\t\tisJpeg ? 0.92 : undefined,\n\t\t\t);\n\t\t\treturn { dataUrl: blobHref, width: cw, height: ch };\n\t\t}\n\n\t\tconst dataUrl = isJpeg\n\t\t\t? canvas.toDataURL(\"image/jpeg\", 0.92)\n\t\t\t: canvas.toDataURL(\"image/png\");\n\t\treturn { dataUrl, width: cw, height: ch };\n\t} catch (e) {\n\t\tif (!fileUrlReleased) {\n\t\t\tURL.revokeObjectURL(fileObjectUrl);\n\t\t}\n\t\tthrow e;\n\t}\n}\n","import type { Camera2D } from \"../camera/camera\";\n\nconst VELOCITY_SAMPLE_WINDOW = 80;\nconst FRICTION = 0.94;\nconst MIN_VELOCITY = 0.3;\n\ntype VelocitySample = { dx: number; dy: number; time: number };\n\nexport type PanMomentumController = {\n\trecordMove: (dx: number, dy: number) => void;\n\tstartMomentum: () => void;\n\tcancel: () => void;\n\treset: () => void;\n};\n\nexport function createPanMomentumController(\n\tcamera: Camera2D,\n\tonUpdate: () => void,\n\tsensitivity: number,\n): PanMomentumController {\n\tconst samples: VelocitySample[] = [];\n\tlet animationFrameId: number | null = null;\n\n\tconst cancel = () => {\n\t\tif (animationFrameId !== null) {\n\t\t\tcancelAnimationFrame(animationFrameId);\n\t\t\tanimationFrameId = null;\n\t\t}\n\t};\n\n\tconst reset = () => {\n\t\tcancel();\n\t\tsamples.length = 0;\n\t};\n\n\tconst recordMove = (dx: number, dy: number) => {\n\t\tconst now = performance.now();\n\t\tsamples.push({ dx, dy, time: now });\n\n\t\tconst cutoff = now - VELOCITY_SAMPLE_WINDOW;\n\t\tlet oldestSample = samples[0];\n\t\twhile (oldestSample && oldestSample.time < cutoff) {\n\t\t\tsamples.shift();\n\t\t\toldestSample = samples[0];\n\t\t}\n\t};\n\n\tconst computeReleaseVelocity = (): { vx: number; vy: number } => {\n\t\tif (samples.length < 2) return { vx: 0, vy: 0 };\n\n\t\tconst first = samples[0];\n\t\tconst last = samples[samples.length - 1];\n\t\tif (!first || !last) return { vx: 0, vy: 0 };\n\t\tconst elapsed = last.time - first.time;\n\t\tif (elapsed < 4) return { vx: 0, vy: 0 };\n\n\t\tlet totalDx = 0;\n\t\tlet totalDy = 0;\n\t\tfor (const sample of samples) {\n\t\t\ttotalDx += sample.dx;\n\t\t\ttotalDy += sample.dy;\n\t\t}\n\n\t\tconst msPerFrame = 1000 / 60;\n\t\treturn {\n\t\t\tvx: (totalDx / elapsed) * msPerFrame * sensitivity,\n\t\t\tvy: (totalDy / elapsed) * msPerFrame * sensitivity,\n\t\t};\n\t};\n\n\tconst startMomentum = () => {\n\t\tcancel();\n\t\tconst { vx, vy } = computeReleaseVelocity();\n\t\tsamples.length = 0;\n\n\t\tif (Math.abs(vx) < MIN_VELOCITY && Math.abs(vy) < MIN_VELOCITY) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentVx = vx;\n\t\tlet currentVy = vy;\n\n\t\tconst animate = () => {\n\t\t\tcurrentVx *= FRICTION;\n\t\t\tcurrentVy *= FRICTION;\n\n\t\t\tif (Math.abs(currentVx) < MIN_VELOCITY && Math.abs(currentVy) < MIN_VELOCITY) {\n\t\t\t\tanimationFrameId = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcamera.x += currentVx;\n\t\t\tcamera.y += currentVy;\n\t\t\tonUpdate();\n\t\t\tanimationFrameId = requestAnimationFrame(animate);\n\t\t};\n\n\t\tanimationFrameId = requestAnimationFrame(animate);\n\t};\n\n\treturn { recordMove, startMomentum, cancel, reset };\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nconst DRAWING_LIKE_TOOLS = new Set([\n\t\"draw\",\n\t\"marker\",\n\t\"annotate\",\n\t\"pen\",\n\t\"highlight\",\n\t\"rect\",\n\t\"ellipse\",\n\t\"line\",\n\t\"arrow\",\n\t\"text\",\n\t\"image\",\n]);\n\nexport type ApplePencilNavOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Current tool id from your app (e.g. `\"hand\"` vs `\"draw\"`). */\n\tgetCurrentToolId: () => string;\n\tonUpdate: () => void;\n\ttouchPanSensitivity?: number;\n};\n\n/**\n * After a **stylus** (`pointerType === \"pen\"`) has been used, finger touches on the canvas\n * pan/pinch the camera instead of passing through to drawing tools — similar to iPad behavior\n * in many design apps. No-op until the first pen contact.\n *\n * Compose with {@link attachViewportInput} by calling this **after** it so capture handlers run first,\n * or use only one of them depending on product needs.\n */\nexport function attachApplePencilNavigation(\n\toptions: ApplePencilNavOptions,\n): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tgetCurrentToolId,\n\t\tonUpdate,\n\t\ttouchPanSensitivity = 1.25,\n\t} = options;\n\n\tlet penDetected = false;\n\tconst activePenPointerIds = new Set<number>();\n\tconst blockedTouchPointerIds = new Set<number>();\n\tconst pointers = new Map<number, { x: number; y: number }>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: { x: number; y: number } | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst shouldIntercept = (e: PointerEvent): boolean => {\n\t\tif (e.pointerType !== \"touch\") return false;\n\t\tconst tool = getCurrentToolId();\n\t\tif (tool === \"hand\") return true;\n\t\treturn penDetected && DRAWING_LIKE_TOOLS.has(tool);\n\t};\n\n\tconst dist = (a: { x: number; y: number }, b: { x: number; y: number }) =>\n\t\tMath.hypot(b.x - a.x, b.y - a.y);\n\n\tconst mid = (a: { x: number; y: number }, b: { x: number; y: number }) => ({\n\t\tx: (a.x + b.x) / 2,\n\t\ty: (a.y + b.y) / 2,\n\t});\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tpenDetected = true;\n\t\t\tactivePenPointerIds.add(e.pointerId);\n\t\t\tpointers.clear();\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.cancel();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"touch\" && activePenPointerIds.size > 0) {\n\t\t\tblockedTouchPointerIds.add(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!shouldIntercept(e)) return;\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tif (pointers.size === 1) {\n\t\t\tmode = \"pan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\tcamera,\n\t\t\t\tonUpdate,\n\t\t\t\ttouchPanSensitivity,\n\t\t\t);\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = dist(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = mid(a, b);\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"idle\" || !pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst d = dist(a, b);\n\t\t\tconst m = mid(a, b);\n\t\t\tconst scale = d / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: m.x - rect.left,\n\t\t\t\ty: m.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tcamera.x += m.x - panLast.x;\n\t\t\t\tcamera.y += m.y - panLast.y;\n\t\t\t\tpanLast = m;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tactivePenPointerIds.delete(e.pointerId);\n\t\t\treturn;\n\t\t}\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\tblockedTouchPointerIds.delete(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst r = Array.from(pointers.values())[0];\n\t\t\tpanLast = r ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\telement.addEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\telement.addEventListener(\"pointermove\", onPointerMove, { capture: true });\n\telement.addEventListener(\"pointerup\", onPointerUp, { capture: true });\n\telement.addEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\t\telement.removeEventListener(\"pointermove\", onPointerMove, { capture: true });\n\t\telement.removeEventListener(\"pointerup\", onPointerUp, { capture: true });\n\t\telement.removeEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\t};\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nexport type ViewportInputOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Called after any camera mutation so the renderer can redraw. */\n\tonUpdate: () => void;\n\t/**\n\t * Element to attach the wheel listener to. Defaults to `element`.\n\t * Useful when an overlay with `pointer-events: auto` sits above `element` and\n\t * would otherwise intercept wheel events before they reach the scene container.\n\t */\n\twheelElement?: HTMLElement;\n\twheelPanSensitivity?: number;\n\t/** Multiplier applied to wheel delta for zoom (with Ctrl/Meta). */\n\twheelZoomSensitivity?: number;\n\ttouchPanSensitivity?: number;\n\t/**\n\t * When `true`, pointer events with `pointerType === \"touch\"` are ignored so another layer\n\t * (e.g. `attachApplePencilNavigation`) can handle them without double panning.\n\t */\n\ttouchHandledElsewhere?: boolean;\n\t/**\n\t * When `false`, one-finger / primary-button drag does **not** pan the camera (e.g. shape tools).\n\t * Wheel zoom and two-finger pinch still work.\n\t */\n\tallowPrimaryPointerPan?: () => boolean;\n};\n\ntype PointerRecord = { x: number; y: number };\n\nfunction distanceBetween(a: PointerRecord, b: PointerRecord): number {\n\tconst dx = b.x - a.x;\n\tconst dy = b.y - a.y;\n\treturn Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction midpoint(a: PointerRecord, b: PointerRecord): PointerRecord {\n\treturn { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n}\n\n/** Normalize wheel delta so zoom speed is similar across mice (lines) and trackpads (pixels). */\nfunction wheelDeltaPixels(delta: number, deltaMode: number): number {\n\tswitch (deltaMode) {\n\t\tcase WheelEvent.DOM_DELTA_LINE:\n\t\t\treturn delta * 16;\n\t\tcase WheelEvent.DOM_DELTA_PAGE:\n\t\t\treturn delta * 400;\n\t\tdefault:\n\t\t\treturn delta;\n\t}\n}\n\n// Trackpad fires many small deltas; mouse wheels fire one big delta per click.\n// Pass small deltas through so trackpad feel is preserved; soften large ones.\nconst TRACKPAD_MAX_DELTA = 20;\nconst MOUSE_WHEEL_DAMPING = 0.4;\n\nfunction softenWheelDelta(d: number): number {\n\tconst a = Math.abs(d);\n\tif (a <= TRACKPAD_MAX_DELTA) return d;\n\treturn (\n\t\tMath.sign(d) *\n\t\t(TRACKPAD_MAX_DELTA + (a - TRACKPAD_MAX_DELTA) * MOUSE_WHEEL_DAMPING)\n\t);\n}\n\n/**\n * Attaches wheel (pan / Ctrl+zoom), pointer drag pan, and two-finger pinch zoom.\n * Uses `touch-action: none` on `element` — set that in CSS on the same node.\n *\n * @returns A dispose function that removes all listeners.\n */\nexport function attachViewportInput(options: ViewportInputOptions): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tonUpdate,\n\t\twheelElement,\n\t\twheelPanSensitivity = 0.5,\n\t\twheelZoomSensitivity = 0.0015,\n\t\ttouchPanSensitivity = 1.25,\n\t\ttouchHandledElsewhere = false,\n\t\tallowPrimaryPointerPan = () => true,\n\t} = options;\n\n\tconst wheelTarget = wheelElement ?? element;\n\n\tconst pointers = new Map<number, PointerRecord>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" | \"mousePan\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: PointerRecord | null = null;\n\tlet mousePanButton: number | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst onWheel = (e: WheelEvent) => {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tconst dy = wheelDeltaPixels(e.deltaY, e.deltaMode);\n\t\t\t// Trackpad generates very small deltas (1-5px) vs mouse (100-200px).\n\t\t\t// Normalize so both feel responsive: amplify small deltas (trackpad).\n\t\t\tconst normDy = Math.abs(dy) < TRACKPAD_MAX_DELTA ? dy * 12 : dy;\n\t\t\tconst factor = Math.exp(-normDy * wheelZoomSensitivity);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * factor, {\n\t\t\t\tx: e.clientX - rect.left,\n\t\t\t\ty: e.clientY - rect.top,\n\t\t\t});\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst panDx = softenWheelDelta(wheelDeltaPixels(e.deltaX, e.deltaMode));\n\t\tconst panDy = softenWheelDelta(wheelDeltaPixels(e.deltaY, e.deltaMode));\n\t\tcamera.x -= (panDx * wheelPanSensitivity) / camera.zoom;\n\t\tcamera.y -= (panDy * wheelPanSensitivity) / camera.zoom;\n\t\tonUpdate();\n\t};\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\t\tconst panOk = allowPrimaryPointerPan();\n\t\tif (e.pointerType === \"mouse\" && e.button === 0) {\n\t\t\tif (!panOk) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmousePanButton = 0;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"mouse\" && e.button === 1) {\n\t\t\tmousePanButton = 1;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (pointers.size === 1 && e.pointerType === \"touch\") {\n\t\t\tif (panOk) {\n\t\t\t\tmode = \"pan\";\n\t\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\t\tcamera,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\ttouchPanSensitivity,\n\t\t\t\t);\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = distanceBetween(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = midpoint(a, b);\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\" && panLast && mousePanButton !== null) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx;\n\t\t\tcamera.y += dy;\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst dist = distanceBetween(a, b);\n\t\t\tconst mid = midpoint(a, b);\n\t\t\tconst scale = dist / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: mid.x - rect.left,\n\t\t\t\ty: mid.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tconst dx = mid.x - panLast.x;\n\t\t\t\tconst dy = mid.y - panLast.y;\n\t\t\t\tcamera.x += dx;\n\t\t\t\tcamera.y += dy;\n\t\t\t\tpanLast = mid;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\") {\n\t\t\tif (e.pointerType === \"mouse\" && e.button === mousePanButton) {\n\t\t\t\tmode = \"idle\";\n\t\t\t\tpanLast = null;\n\t\t\t\tmousePanButton = null;\n\t\t\t\ttry {\n\t\t\t\t\telement.releasePointerCapture(e.pointerId);\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore */\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst remaining = Array.from(pointers.values())[0];\n\t\t\tpanLast = remaining ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst onPointerCancel = (e: PointerEvent) => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\tonPointerUp(e);\n\t};\n\n\twheelTarget.addEventListener(\"wheel\", onWheel, { passive: false });\n\telement.addEventListener(\"pointerdown\", onPointerDown);\n\telement.addEventListener(\"pointermove\", onPointerMove);\n\telement.addEventListener(\"pointerup\", onPointerUp);\n\telement.addEventListener(\"pointercancel\", onPointerCancel);\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\twheelTarget.removeEventListener(\"wheel\", onWheel);\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown);\n\t\telement.removeEventListener(\"pointermove\", onPointerMove);\n\t\telement.removeEventListener(\"pointerup\", onPointerUp);\n\t\telement.removeEventListener(\"pointercancel\", onPointerCancel);\n\t};\n}\n","import type { VectorSceneItem } from \"../scene/types\";\nimport type { Rect } from \"./rect\";\nimport { normalizeRect } from \"./rect\";\n\n/** Rotation in radians; `undefined` / `0` means no rotation. */\nexport function getItemRotationRad(item: VectorSceneItem): number {\n\treturn item.rotation ?? 0;\n}\n\n/**\n * Converts a point in item **local** space (origin top-left, 0…w × 0…h) to world,\n * with rotation around the box center.\n */\nexport function itemLocalToWorld(\n\tlx: number,\n\tly: number,\n\titemX: number,\n\titemY: number,\n\tw: number,\n\th: number,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst c = { x: w / 2, y: h / 2 };\n\tconst dlx = lx - c.x;\n\tconst dly = ly - c.y;\n\tconst cos = Math.cos(rotationRad);\n\tconst sin = Math.sin(rotationRad);\n\treturn {\n\t\tx: itemX + c.x + cos * dlx - sin * dly,\n\t\ty: itemY + c.y + sin * dlx + cos * dly,\n\t};\n}\n\n/**\n * Inverse of {@link itemLocalToWorld}.\n */\nexport function worldToItemLocal(\n\twx: number,\n\twy: number,\n\titemX: number,\n\titemY: number,\n\tw: number,\n\th: number,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst c = { x: w / 2, y: h / 2 };\n\tconst vx = wx - itemX;\n\tconst vy = wy - itemY;\n\tconst dx = vx - c.x;\n\tconst dy = vy - c.y;\n\tconst cos = Math.cos(-rotationRad);\n\tconst sin = Math.sin(-rotationRad);\n\tconst lx = cos * dx - sin * dy;\n\tconst ly = sin * dx + cos * dy;\n\treturn { x: c.x + lx, y: c.y + ly };\n}\n\n/** World-space center of the item’s unrotated bounds (rotation pivot). */\nexport function itemPivotWorld(item: VectorSceneItem): { x: number; y: number } {\n\tconst r = normalizeRect(item.bounds);\n\treturn { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n}\n\n/** Axis-aligned bounding box in world space that contains the rotated rectangle. */\nexport function boundsAabbForRotatedItem(item: VectorSceneItem): Rect {\n\tconst rot = getItemRotationRad(item);\n\tif (Math.abs(rot) < 1e-12 && item.bounds.width >= 0 && item.bounds.height >= 0) {\n\t\treturn item.bounds;\n\t}\n\tconst r = normalizeRect(item.bounds);\n\tif (Math.abs(rot) < 1e-12) {\n\t\treturn r;\n\t}\n\tconst corners: [number, number][] = [\n\t\t[0, 0],\n\t\t[r.width, 0],\n\t\t[r.width, r.height],\n\t\t[0, r.height],\n\t];\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const [lx, ly] of corners) {\n\t\tconst p = itemLocalToWorld(lx, ly, item.x, item.y, r.width, r.height, rot);\n\t\tminX = Math.min(minX, p.x);\n\t\tminY = Math.min(minY, p.y);\n\t\tmaxX = Math.max(maxX, p.x);\n\t\tmaxY = Math.max(maxY, p.y);\n\t}\n\treturn { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Width/height of the shape’s local drawing box (same as `bounds` at creation). */\nexport type CustomShapeSize = { width: number; height: number };\n\n/**\n * How to build the inner SVG (inside the item’s bounding box).\n *\n * - **`svg`**: paste-friendly markup. Use `{{w}}`, `{{h}}`, `{{width}}`, or `{{height}}` where the size should go.\n * - **`render`**: a small function when you prefer code over a string template.\n */\nexport type CreateCustomShapeContent =\n\t| {\n\t\t\t/**\n\t\t\t * SVG fragment for `<g>` contents (no outer `<svg>`). Placeholders are replaced with numeric sizes:\n\t\t\t * `{{w}}`, `{{h}}`, `{{width}}`, `{{height}}`.\n\t\t\t */\n\t\t\tsvg: string;\n\t }\n\t| {\n\t\t\t/** Returns inner SVG for the given box size (same coordinate range as `bounds`). */\n\t\t\trender: (size: CustomShapeSize) => string;\n\t };\n\n/**\n * Replaces `{{w}}`, `{{h}}`, `{{width}}`, and `{{height}}` in a string with the given dimensions.\n * Use this if you build SVG strings yourself and want the same rules as {@link createCustomShapeItem}.\n */\nexport function expandCustomShapeTemplate(\n\ttemplate: string,\n\twidth: number,\n\theight: number,\n): string {\n\treturn template\n\t\t.replace(/\\{\\{w\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{h\\}\\}/g, String(height))\n\t\t.replace(/\\{\\{width\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{height\\}\\}/g, String(height));\n}\n\nfunction resolveCustomInner(\n\tcontent: CreateCustomShapeContent,\n\tsize: CustomShapeSize,\n): string {\n\tif (\"render\" in content) {\n\t\treturn content.render(size);\n\t}\n\treturn expandCustomShapeTemplate(content.svg, size.width, size.height);\n}\n\n/**\n * Builds the scaled `<g>` wrapper used for `childrenSvg` on custom shapes that support resize.\n */\nexport function buildCustomShapeChildrenSvg(\n\tinner: string,\n\tintrinsic: CustomShapeSize,\n\tbounds: Rect,\n): string {\n\tconst b = normalizeRect(bounds);\n\tconst sx = b.width / intrinsic.width;\n\tconst sy = b.height / intrinsic.height;\n\treturn `<g transform=\"scale(${sx},${sy})\">${inner}</g>`;\n}\n\n/**\n * Creates a user-defined shape from SVG markup or a `render` callback.\n *\n * Coordinates are **local**: draw from `(0,0)` to `(width, height)` of `bounds`. The library stores an\n * intrinsic copy so resize handles (when interactive) scale the drawing uniformly.\n *\n * @example\n * ```ts\n * const star = createCustomShapeItem(createShapeId(), rect, {\n * svg: `<polygon points=\"...\" fill=\"gold\" stroke=\"#b45309\" stroke-width=\"2\" />`,\n * });\n * ```\n *\n * @example Template (good for copy-paste from design tools)\n * ```ts\n * createCustomShapeItem(id, rect, {\n * svg: `<rect width=\"{{w}}\" height=\"{{h}}\" rx=\"8\" fill=\"#e0e7ff\" stroke=\"#6366f1\" />`,\n * });\n * ```\n */\nexport function createCustomShapeItem(\n\tid: string,\n\tbounds: Rect,\n\tcontent: CreateCustomShapeContent,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst intrinsic: CustomShapeSize = { width: r.width, height: r.height };\n\tconst inner = resolveCustomInner(content, intrinsic);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"custom\",\n\t\tcustomIntrinsicSize: intrinsic,\n\t\tcustomInnerSvg: inner,\n\t\tchildrenSvg: buildCustomShapeChildrenSvg(inner, intrinsic, r),\n\t};\n}\n","/**\n * Escape text for use inside SVG `<text>` / `<tspan>` (not full XML attribute context).\n */\nexport function escapeSvgTextContent(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Escape for plain text inside HTML `foreignObject` body (not attribute). */\nfunction escapeHtmlText(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Default body font size for vector text (local SVG units). */\nexport const DEFAULT_TEXT_FONT_SIZE = 18;\n/**\n * Sophisticated sans-serif used for both canvas text rendering and inline editing.\n * Inter is loaded by host apps (e.g. demo/index.html); system-ui fallback keeps the canvas\n * usable when the webfont hasn't loaded yet.\n */\nexport const TEXT_FONT_FAMILY =\n\t\"Inter, -apple-system, BlinkMacSystemFont, ui-sans-serif, system-ui, sans-serif\";\nconst LINE_HEIGHT_RATIO = 22 / 18;\n/**\n * Where the first text baseline sits, expressed in font-size units. Picked so\n * the SVG glyph and the inline-edit textarea agree visually (the textarea's\n * natural first-line baseline lands at this same y when padded by\n * {@link EDIT_TOP_PAD_RATIO}). See {@link TextEditOverlay} for the matching\n * inset.\n */\nconst FIRST_LINE_BASELINE_RATIO = 20 / 18;\n/** Textarea top inset (font-size units) that lines up with the SVG baseline. */\nexport const EDIT_TOP_PAD_RATIO = 4 / 18;\n/** Extra space below the descender so glyphs aren't clipped at the bounds. */\nconst BOTTOM_PAD_RATIO = 4 / 18;\nconst PLACEHOLDER = \"Tap to type\";\n\nconst MIN_TEXT_BOX_W = 40;\nconst MIN_TEXT_BOX_H = 26;\n/** Horizontal padding in local space (matches `<text x=\"4\">`). */\nconst TEXT_PAD_X = 4;\nconst MAX_TEXT_MEASURE_CACHE_ENTRIES = 2000;\n\nlet sharedMeasureContext: CanvasRenderingContext2D | null | undefined;\nconst textMeasureCache = new Map<string, { width: number; height: number }>();\n\nfunction getSharedMeasureContext(): CanvasRenderingContext2D | null {\n\tif (sharedMeasureContext !== undefined) {\n\t\treturn sharedMeasureContext;\n\t}\n\tif (typeof document === \"undefined\") {\n\t\tsharedMeasureContext = null;\n\t\treturn sharedMeasureContext;\n\t}\n\tconst canvas = document.createElement(\"canvas\");\n\tsharedMeasureContext = canvas.getContext(\"2d\");\n\treturn sharedMeasureContext;\n}\n\nfunction textMeasureCacheKey(content: string, fontSize: number): string {\n\treturn `${fontSize}\\n${content}`;\n}\n\nfunction cacheMeasuredBounds(\n\tkey: string,\n\tbounds: { width: number; height: number },\n): void {\n\tif (textMeasureCache.size >= MAX_TEXT_MEASURE_CACHE_ENTRIES) {\n\t\ttextMeasureCache.clear();\n\t}\n\ttextMeasureCache.set(key, bounds);\n}\n\nfunction lineHeightFor(fontSize: number): number {\n\treturn fontSize * LINE_HEIGHT_RATIO;\n}\n\nfunction firstLineBaselineY(fontSize: number): number {\n\treturn fontSize * FIRST_LINE_BASELINE_RATIO;\n}\n\n/** Public version used by callers that need the same baseline as SVG rendering. */\nexport function textBaselineYFor(fontSize: number): number {\n\treturn firstLineBaselineY(fontSize);\n}\n\n/** Public version used by callers that need the same line height as SVG rendering. */\nexport function textLineHeightFor(fontSize: number): number {\n\treturn lineHeightFor(fontSize);\n}\n\n/**\n * Local width/height for a text item so bounds match rendered SVG (no fixed max width).\n * Uses canvas measureText when `document` is available; rough fallback otherwise.\n */\nexport function measureTextBoundsLocal(\n\tcontent: string,\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): {\n\twidth: number;\n\theight: number;\n} {\n\tconst cacheKey = textMeasureCacheKey(content, fontSize);\n\tconst cached = textMeasureCache.get(cacheKey);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst lh = lineHeightFor(fontSize);\n\tconst baselineY = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tconst lines = trimmed.length === 0 ? [PLACEHOLDER] : content.split(\"\\n\");\n\n\tlet maxInnerW = 0;\n\tconst ctx = getSharedMeasureContext();\n\tif (ctx) {\n\t\tctx.font = `${fontSize}px ${TEXT_FONT_FAMILY}`;\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, ctx.measureText(toMeasure).width);\n\t\t}\n\t}\n\tif (maxInnerW === 0) {\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, toMeasure.length * fontSize * 0.52);\n\t\t}\n\t}\n\n\tconst minW = Math.max(MIN_TEXT_BOX_W, TEXT_PAD_X * 2 + fontSize);\n\tconst width = Math.max(minW, TEXT_PAD_X * 2 + maxInnerW);\n\tconst height = Math.max(\n\t\tMIN_TEXT_BOX_H,\n\t\tbaselineY + (lines.length - 1) * lh + Math.max(4, fontSize * BOTTOM_PAD_RATIO),\n\t);\n\tconst measured = { width, height };\n\tcacheMeasuredBounds(cacheKey, measured);\n\treturn measured;\n}\n\n/**\n * Builds SVG `<text>` markup for a text box in local coordinates [0, w] × [0, h].\n * @param fillColor — Text fill (defaults to blue-gray placeholder / blue body).\n */\nexport function buildTextSvg(\n\tcontent: string,\n\t_width: number,\n\t_height: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst lh = lineHeightFor(fontSize);\n\tconst y0 = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tif (trimmed.length === 0) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"#94a3b8\" font-style=\"italic\">${escapeSvgTextContent(PLACEHOLDER)}</text>`;\n\t}\n\n\tconst lines = content.split(\"\\n\");\n\tif (lines.length === 1) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${escapeSvgTextContent(lines[0] ?? \"\")}</text>`;\n\t}\n\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i] ?? \"\";\n\t\tif (i === 0) {\n\t\t\tparts.push(`<tspan x=\"4\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t} else {\n\t\t\tparts.push(`<tspan x=\"4\" dy=\"${lh}\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t}\n\t}\n\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${parts.join(\"\")}</text>`;\n}\n\n/**\n * Text that wraps inside a fixed rectangle (after user resize). Uses `foreignObject` + XHTML\n * so wrapping matches browser layout.\n */\nexport function buildTextFixedBoundsSvg(\n\tcontent: string,\n\twidth: number,\n\theight: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst w = Math.max(1, width);\n\tconst h = Math.max(1, height);\n\tconst lh = lineHeightFor(fontSize);\n\tconst trimmed = content.trim();\n\tconst padTop = EDIT_TOP_PAD_RATIO * fontSize;\n\tif (trimmed.length === 0) {\n\t\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:#94a3b8;font-style:italic\">${escapeHtmlText(PLACEHOLDER)}</div></foreignObject>`;\n\t}\n\tconst body = escapeHtmlText(content);\n\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:${fillColor}\">${body}</div></foreignObject>`;\n}\n","import type { StrokeOptions } from \"perfect-freehand\";\nimport getStroke from \"perfect-freehand\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport { buildCustomShapeChildrenSvg } from \"./custom-shape\";\nimport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n} from \"./text-svg\";\nimport type {\n\tArrowBindings,\n\tLineEndpointsLocal,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"./types\";\n\nexport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n};\n\n/**\n * While inline-editing: sync bounds to draft width/height and hide SVG so only the textarea shows text.\n */\nexport function applyTextDraftWhileEditing(\n\titem: VectorSceneItem,\n\tdraft: string,\n): VectorSceneItem {\n\tif (item.toolKind !== \"text\") return item;\n\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tif (item.textFixedBounds) {\n\t\treturn {\n\t\t\t...item,\n\t\t\ttext: draft,\n\t\t\tchildrenSvg: \"\",\n\t\t};\n\t}\n\tconst m = measureTextBoundsLocal(draft, fs);\n\treturn {\n\t\t...item,\n\t\ttext: draft,\n\t\tbounds: {\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t},\n\t\tchildrenSvg: \"\",\n\t};\n}\n\n/** Stroke dash pattern for freehand drawings. `solid` = perfect-freehand fill; `dashed` = centerline stroke with dashes. */\nexport type StrokeDash = \"solid\" | \"dashed\";\n\n/** Resolved stroke for SVG generation. */\nexport type StrokeStyle = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: StrokeDash;\n};\n\nexport const DEFAULT_STROKE_STYLE: StrokeStyle = {\n\tstroke: \"#1d1d1d\",\n\tstrokeWidth: 2,\n};\n\nconst TOOL_FREEHAND_DEFAULTS: Record<\n\t\"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tPartial<StrokeStyle>\n> = {\n\tdraw: { strokeWidth: 10 },\n\tpencil: { strokeWidth: 3 },\n\tbrush: { strokeWidth: 10 },\n\tmarker: { stroke: \"#fde047\", strokeWidth: 16, strokeOpacity: 0.5 },\n};\n\nfunction perfectFreehandOptions(\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstyle: StrokeStyle,\n\tstrokeComplete: boolean,\n\tpressureAware = false,\n): StrokeOptions {\n\tconst sw = style.strokeWidth;\n\tconst base: StrokeOptions = {\n\t\tlast: strokeComplete,\n\t\tsimulatePressure: true,\n\t};\n\tif (toolKind === \"draw\" || toolKind === \"pencil\") {\n\t\tif (pressureAware && toolKind === \"draw\") {\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tsize: Math.max(2, sw * 1.05),\n\t\t\t\tthinning: 0.42,\n\t\t\t\tsmoothing: 0.78,\n\t\t\t\tstreamline: 0.62,\n\t\t\t\tsimulatePressure: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(2, sw * 1.18),\n\t\t\tthinning: 0.12,\n\t\t\tsmoothing: 0.85,\n\t\t\tstreamline: 0.78,\n\t\t\tsimulatePressure: true,\n\t\t};\n\t}\n\tif (toolKind === \"brush\") {\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(4, sw * 1.22),\n\t\t\tthinning: 0.52,\n\t\t\tsmoothing: 0.64,\n\t\t\tstreamline: 0.68,\n\t\t};\n\t}\n\treturn {\n\t\t...base,\n\t\tsize: Math.max(6, sw * 1.08),\n\t\tthinning: 0.08,\n\t\tsmoothing: 0.88,\n\t\tstreamline: 0.84,\n\t\tsimulatePressure: true,\n\t};\n}\n\nexport function resolveStrokeStyle(item: VectorSceneItem): StrokeStyle {\n\treturn {\n\t\tstroke: item.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\tstrokeWidth: item.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\tstrokeOpacity: item.strokeOpacity,\n\t\tstrokeDash: item.strokeDash,\n\t};\n}\n\nfunction strokeOpacityAttr(style: StrokeStyle): string {\n\treturn style.strokeOpacity != null\n\t\t? ` stroke-opacity=\"${style.strokeOpacity}\"`\n\t\t: \"\";\n}\n\nfunction svgNumber(value: number): string {\n\tif (!Number.isFinite(value)) return \"0\";\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Number.isInteger(rounded) ? String(rounded) : String(rounded);\n}\n\nconst ARCHITECTURAL_CLOUD_RADIUS = 38;\nconst ARCHITECTURAL_CLOUD_TARGET_SPACING = 50;\nconst ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO = 0.38;\nconst ARCHITECTURAL_CLOUD_ROUNDED_RADIUS = 72;\nconst ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS = 44;\nconst ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING = 98;\n\ntype CloudPoint = readonly [number, number];\n\ntype CloudPathSegment = {\n\tlength: number;\n\tpointAt: (t: number) => CloudPoint;\n};\n\nfunction architecturalCloudCenterCount(edgeLength: number, radius: number): number {\n\tconst targetSpacing = Math.min(\n\t\tARCHITECTURAL_CLOUD_TARGET_SPACING,\n\t\tMath.max(1, radius * 1.3),\n\t);\n\treturn Math.max(2, Math.round(edgeLength / targetSpacing) + 1);\n}\n\nfunction distributeRange(start: number, end: number, count: number): number[] {\n\tif (count <= 1) return [start];\n\tconst step = (end - start) / (count - 1);\n\treturn Array.from({ length: count }, (_, index) => start + step * index);\n}\n\nfunction lineCloudPathSegment(start: CloudPoint, end: CloudPoint): CloudPathSegment {\n\tconst dx = end[0] - start[0];\n\tconst dy = end[1] - start[1];\n\tconst length = Math.hypot(dx, dy);\n\treturn {\n\t\tlength,\n\t\tpointAt: (t) => [start[0] + dx * t, start[1] + dy * t],\n\t};\n}\n\nfunction ellipsePoint(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tangle: number,\n): CloudPoint {\n\treturn [centerX + Math.cos(angle) * radiusX, centerY + Math.sin(angle) * radiusY];\n}\n\nfunction approximateEllipseArcLength(\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): number {\n\tconst steps = Math.max(\n\t\t4,\n\t\tMath.ceil(Math.abs(endAngle - startAngle) / (Math.PI / 16)),\n\t);\n\tlet length = 0;\n\tlet previous = ellipsePoint(0, 0, radiusX, radiusY, startAngle);\n\tfor (let index = 1; index <= steps; index += 1) {\n\t\tconst angle = startAngle + ((endAngle - startAngle) * index) / steps;\n\t\tconst next = ellipsePoint(0, 0, radiusX, radiusY, angle);\n\t\tlength += Math.hypot(next[0] - previous[0], next[1] - previous[1]);\n\t\tprevious = next;\n\t}\n\treturn length;\n}\n\nfunction ellipseCloudPathSegment(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): CloudPathSegment {\n\treturn {\n\t\tlength: approximateEllipseArcLength(radiusX, radiusY, startAngle, endAngle),\n\t\tpointAt: (t) =>\n\t\t\tellipsePoint(\n\t\t\t\tcenterX,\n\t\t\t\tcenterY,\n\t\t\t\tradiusX,\n\t\t\t\tradiusY,\n\t\t\t\tstartAngle + (endAngle - startAngle) * t,\n\t\t\t),\n\t};\n}\n\nfunction cloudPathPerimeter(segments: CloudPathSegment[]): number {\n\tconst usableSegments = segments.filter((segment) => segment.length > 1e-9);\n\treturn usableSegments.reduce((sum, segment) => sum + segment.length, 0);\n}\n\nfunction pointOnCloudPath(\n\tsegments: CloudPathSegment[],\n\tdistance: number,\n): CloudPoint {\n\tconst perimeter = cloudPathPerimeter(segments);\n\tif (perimeter <= 0) return [0, 0];\n\n\tlet remaining = ((distance % perimeter) + perimeter) % perimeter;\n\tfor (const segment of segments) {\n\t\tif (segment.length <= 1e-9) continue;\n\t\tif (remaining <= segment.length) {\n\t\t\tconst t = remaining / segment.length;\n\t\t\treturn segment.pointAt(t);\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\n\tconst fallback = segments.find((segment) => segment.length > 1e-9);\n\treturn fallback?.pointAt(0) ?? [0, 0];\n}\n\nfunction buildRoundedCapsulePathSegments(\n\twidth: number,\n\theight: number,\n\tinset: number,\n): CloudPathSegment[] {\n\tconst left = inset;\n\tconst top = inset;\n\tconst right = width - inset;\n\tconst bottom = height - inset;\n\tconst capsuleWidth = Math.max(0, right - left);\n\tconst capsuleHeight = Math.max(0, bottom - top);\n\tconst radius = Math.min(capsuleWidth, capsuleHeight) / 2;\n\tif (radius <= 0) return [];\n\n\tconst leftCenterX = left + radius;\n\tconst rightCenterX = right - radius;\n\tconst topCenterY = top + radius;\n\tconst bottomCenterY = bottom - radius;\n\n\treturn [\n\t\tlineCloudPathSegment([leftCenterX, top], [rightCenterX, top]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t-Math.PI / 2,\n\t\t\t0,\n\t\t),\n\t\tlineCloudPathSegment([right, topCenterY], [right, bottomCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t),\n\t\tlineCloudPathSegment([rightCenterX, bottom], [leftCenterX, bottom]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI / 2,\n\t\t\tMath.PI,\n\t\t),\n\t\tlineCloudPathSegment([left, bottomCenterY], [left, topCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI,\n\t\t\tMath.PI * 1.5,\n\t\t),\n\t];\n}\n\nfunction buildRoundedArcCloudPathD(\n\tcloudWidth: number,\n\tcloudHeight: number,\n\tcenter: CloudPoint,\n): string {\n\tconst minDimension = Math.min(cloudWidth, cloudHeight);\n\tconst radius = Math.min(\n\t\tARCHITECTURAL_CLOUD_ROUNDED_RADIUS,\n\t\tMath.max(ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS, minDimension * 0.16),\n\t);\n\tconst centerPath = buildRoundedCapsulePathSegments(\n\t\tcloudWidth,\n\t\tcloudHeight,\n\t\tradius,\n\t);\n\tconst centerPerimeter = cloudPathPerimeter(centerPath);\n\tif (centerPerimeter <= 0) return \"\";\n\n\tconst lobeCount = Math.max(\n\t\t8,\n\t\tMath.round(centerPerimeter / ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING),\n\t);\n\tconst centers = Array.from({ length: lobeCount }, (_, index) =>\n\t\tpointOnCloudPath(centerPath, (centerPerimeter * index) / lobeCount),\n\t);\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudCircleIntersection(previous, point, radius, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\nfunction cloudCircleIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradius: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst midX = (a[0] + b[0]) / 2;\n\tconst midY = (a[1] + b[1]) / 2;\n\tconst dx = b[0] - a[0];\n\tconst dy = b[1] - a[1];\n\tconst distance = Math.hypot(dx, dy);\n\tif (distance <= 1e-9) return [midX, midY];\n\n\tconst halfDistance = distance / 2;\n\tconst offset = Math.sqrt(\n\t\tMath.max(0, radius * radius - halfDistance * halfDistance),\n\t);\n\tconst normalX = -dy / distance;\n\tconst normalY = dx / distance;\n\tconst first: [number, number] = [midX + normalX * offset, midY + normalY * offset];\n\tconst second: [number, number] = [\n\t\tmidX - normalX * offset,\n\t\tmidY - normalY * offset,\n\t];\n\tconst firstDistance =\n\t\t(first[0] - center[0]) * (first[0] - center[0]) +\n\t\t(first[1] - center[1]) * (first[1] - center[1]);\n\tconst secondDistance =\n\t\t(second[0] - center[0]) * (second[0] - center[0]) +\n\t\t(second[1] - center[1]) * (second[1] - center[1]);\n\treturn firstDistance >= secondDistance ? first : second;\n}\n\nfunction cloudEllipseIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradiusX: number,\n\tradiusY: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst scaleY = radiusX / radiusY;\n\tconst [x, y] = cloudCircleIntersection(\n\t\t[a[0], a[1] * scaleY],\n\t\t[b[0], b[1] * scaleY],\n\t\tradiusX,\n\t\t[center[0], center[1] * scaleY],\n\t);\n\treturn [x, y / scaleY];\n}\n\nexport function buildRectSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<rect width=\"${width}\" height=\"${height}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" rx=\"4\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildEllipseSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst rx = width / 2;\n\tconst ry = height / 2;\n\treturn `<ellipse cx=\"${rx}\" cy=\"${ry}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\n/**\n * Returns the local SVG path for a scalable architectural revision cloud.\n *\n * Use this low-level helper when you need to preview or inspect the shape without\n * creating a full scene item. Prefer {@link createArchitecturalCloudItem} when\n * adding a cloud to a `VectorSceneItem[]`, because it keeps `toolKind`, bounds,\n * stroke fields, and `childrenSvg` synchronized for editing.\n *\n * @example\n * ```ts\n * const d = buildArchitecturalCloudPathD(180, 90);\n * ```\n */\nexport function buildArchitecturalCloudPathD(\n\twidth: number,\n\theight: number,\n\tstrokeWidth = DEFAULT_STROKE_STYLE.strokeWidth,\n): string {\n\tconst w = Math.max(0, width);\n\tconst h = Math.max(0, height);\n\tif (w <= 0 || h <= 0) return \"\";\n\n\tconst padding = Math.max(0, strokeWidth * 2);\n\tconst cloudWidth = Math.max(0, w - padding);\n\tconst cloudHeight = Math.max(0, h - padding);\n\tif (cloudWidth <= 0 || cloudHeight <= 0) return \"\";\n\n\tconst radiusX = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudWidth * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tconst radiusY = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudHeight * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tif (radiusX <= 0 || radiusY <= 0) return \"\";\n\n\tconst center: CloudPoint = [cloudWidth / 2, cloudHeight / 2];\n\tconst leftCenterX = radiusX;\n\tconst rightCenterX = cloudWidth - radiusX;\n\tconst topCenterY = radiusY;\n\tconst bottomCenterY = cloudHeight - radiusY;\n\tconst horizontalCenters = distributeRange(\n\t\tleftCenterX,\n\t\trightCenterX,\n\t\tarchitecturalCloudCenterCount(Math.max(0, rightCenterX - leftCenterX), radiusX),\n\t);\n\tconst verticalCenters = distributeRange(\n\t\ttopCenterY,\n\t\tbottomCenterY,\n\t\tarchitecturalCloudCenterCount(Math.max(0, bottomCenterY - topCenterY), radiusY),\n\t);\n\tif (horizontalCenters.length > 3 && verticalCenters.length > 3) {\n\t\tconst roundedArcCloudPath = buildRoundedArcCloudPathD(\n\t\t\tcloudWidth,\n\t\t\tcloudHeight,\n\t\t\tcenter,\n\t\t);\n\t\tif (roundedArcCloudPath !== \"\") return roundedArcCloudPath;\n\t}\n\tconst rectangularCenters: CloudPoint[] = [\n\t\t...horizontalCenters.map((x) => [x, topCenterY] as const),\n\t\t...verticalCenters.slice(1).map((y) => [rightCenterX, y] as const),\n\t\t...horizontalCenters\n\t\t\t.slice(0, -1)\n\t\t\t.reverse()\n\t\t\t.map((x) => [x, bottomCenterY] as const),\n\t\t...verticalCenters\n\t\t\t.slice(1, -1)\n\t\t\t.reverse()\n\t\t\t.map((y) => [leftCenterX, y] as const),\n\t];\n\tconst centers = rectangularCenters;\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudEllipseIntersection(previous, point, radiusX, radiusY, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\n/**\n * Builds an SVG fragment for an architectural revision cloud outline.\n *\n * This is the renderer-level primitive behind the built-in `\"architectural-cloud\"`\n * tool. Prefer {@link createArchitecturalCloudItem} for app code that inserts a\n * normal editable scene item.\n */\nexport function buildArchitecturalCloudSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst d = buildArchitecturalCloudPathD(width, height, style.strokeWidth);\n\treturn `<path d=\"${d}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildLineSvg(\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${line.x2}\" y2=\"${line.y2}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\nexport type StraightArrowGeometry = {\n\tshaftEndX: number;\n\tshaftEndY: number;\n\theadTipX: number;\n\theadTipY: number;\n\theadLeftX: number;\n\theadLeftY: number;\n\theadRightX: number;\n\theadRightY: number;\n};\n\nexport function computeStraightArrowGeometry(\n\tline: LineEndpointsLocal,\n\tstrokeWidth: number,\n): StraightArrowGeometry | null {\n\tconst dx = line.x2 - line.x1;\n\tconst dy = line.y2 - line.y1;\n\tconst len = Math.hypot(dx, dy);\n\tif (len < 1e-6) return null;\n\tconst ux = dx / len;\n\tconst uy = dy / len;\n\tconst headLength = Math.min(Math.max(strokeWidth * 4.2, 12), len * 0.38);\n\tconst headAngle = Math.PI / 6;\n\tconst cos = Math.cos(headAngle);\n\tconst sin = Math.sin(headAngle);\n\tconst rx1 = ux * cos - uy * sin;\n\tconst ry1 = ux * sin + uy * cos;\n\tconst rx2 = ux * cos + uy * sin;\n\tconst ry2 = -ux * sin + uy * cos;\n\treturn {\n\t\tshaftEndX: line.x2,\n\t\tshaftEndY: line.y2,\n\t\theadTipX: line.x2,\n\t\theadTipY: line.y2,\n\t\theadLeftX: line.x2 - rx1 * headLength,\n\t\theadLeftY: line.y2 - ry1 * headLength,\n\t\theadRightX: line.x2 - rx2 * headLength,\n\t\theadRightY: line.y2 - ry2 * headLength,\n\t};\n}\n\nexport function buildArrowSvg(\n\titemId: string,\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tvoid itemId;\n\tconst geometry = computeStraightArrowGeometry(line, style.strokeWidth);\n\tif (!geometry) {\n\t\treturn buildLineSvg(line, style);\n\t}\n\tconst op = strokeOpacityAttr(style);\n\treturn `\n\t\t<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${geometry.shaftEndX}\" y2=\"${geometry.shaftEndY}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\"${op} />\n\t\t<path d=\"M ${geometry.headLeftX} ${geometry.headLeftY} L ${geometry.headTipX} ${geometry.headTipY} L ${geometry.headRightX} ${geometry.headRightY}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op} />\n\t`;\n}\n\nexport function buildDrawDotSvg(\n\tr: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst op =\n\t\tstyle.strokeOpacity != null ? ` fill-opacity=\"${style.strokeOpacity}\"` : \"\";\n\treturn `<circle cx=\"${r}\" cy=\"${r}\" r=\"${r}\" fill=\"${style.stroke}\" shape-rendering=\"geometricPrecision\"${op} />`;\n}\n\n/** Structured result for React overlays; scene uses {@link buildFreehandPathSvg} string. */\nexport type FreehandSvgPayload =\n\t| {\n\t\t\tkind: \"circle\";\n\t\t\tcx: number;\n\t\t\tcy: number;\n\t\t\tr: number;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"fillPath\";\n\t\t\td: string;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"strokePath\";\n\t\t\td: string;\n\t\t\tstroke: string;\n\t\t\tstrokeWidth: number;\n\t\t\tstrokeOpacity?: number;\n\t\t\tstrokeDasharray?: string;\n\t };\n\nfunction dashArrayForDrawStroke(strokeWidth: number): string {\n\tconst dash = Math.max(strokeWidth * 1.8, 4);\n\tconst gap = Math.max(strokeWidth * 1.4, 3);\n\treturn `${dash} ${gap}`;\n}\n\nfunction buildSmoothedCenterlinePath(\n\tpoints: readonly { x: number; y: number }[],\n): string | null {\n\tif (points.length < 2) return null;\n\tconst first = points[0];\n\tif (!first) return null;\n\tlet d = `M ${first.x} ${first.y}`;\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst a = points[i];\n\t\tconst b = points[i + 1];\n\t\tif (!a || !b) continue;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\td += ` Q ${a.x} ${a.y} ${midX} ${midY}`;\n\t}\n\tconst last = points[points.length - 1];\n\tif (last) {\n\t\td += ` L ${last.x} ${last.y}`;\n\t}\n\treturn d;\n}\n\n/**\n * Computes freehand geometry (perfect-freehand + fallback). Used by {@link buildFreehandPathSvg}\n * and React overlays without `dangerouslySetInnerHTML`.\n */\nexport function computeFreehandSvgPayload(\n\tpathPointsLocal: readonly VectorPathPoint[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): FreehandSvgPayload | null {\n\tif (pathPointsLocal.length === 0) return null;\n\tif (pathPointsLocal.length === 1) {\n\t\tconst p = pathPointsLocal[0];\n\t\tif (!p) return null;\n\t\treturn {\n\t\t\tkind: \"circle\",\n\t\t\tcx: p.x,\n\t\t\tcy: p.y,\n\t\t\tr: Math.max(0.5, style.strokeWidth / 2),\n\t\t\tfill: style.stroke,\n\t\t\tfillOpacity: style.strokeOpacity,\n\t\t};\n\t}\n\tif (\n\t\tstyle.strokeDash === \"dashed\" &&\n\t\t(toolKind === \"draw\" || toolKind === \"pencil\")\n\t) {\n\t\tconst d = buildSmoothedCenterlinePath(pathPointsLocal);\n\t\tif (!d) return null;\n\t\treturn {\n\t\t\tkind: \"strokePath\",\n\t\t\td,\n\t\t\tstroke: style.stroke,\n\t\t\tstrokeWidth: style.strokeWidth,\n\t\t\tstrokeOpacity: style.strokeOpacity,\n\t\t\tstrokeDasharray: dashArrayForDrawStroke(style.strokeWidth),\n\t\t};\n\t}\n\tconst hasPressure = pathPointsLocal.some(\n\t\t(p) => p.pressure != null && Number.isFinite(p.pressure),\n\t);\n\tconst input = hasPressure\n\t\t? pathPointsLocal.map(\n\t\t\t\t(p) =>\n\t\t\t\t\t[p.x, p.y, Math.min(1, Math.max(0, p.pressure ?? 0.5))] as [\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t],\n\t\t\t)\n\t\t: pathPointsLocal.map((p) => [p.x, p.y] as [number, number]);\n\tconst stroke = getStroke(\n\t\tinput,\n\t\tperfectFreehandOptions(toolKind, style, strokeComplete, hasPressure),\n\t);\n\tif (stroke.length < 3) return null;\n\tconst first = stroke[0];\n\tif (!first) return null;\n\tlet d = `M ${first[0]} ${first[1]} Q`;\n\tfor (let i = 0; i < stroke.length; i++) {\n\t\tconst a = stroke[i];\n\t\tconst b = stroke[(i + 1) % stroke.length];\n\t\tif (!a || !b) continue;\n\t\td += ` ${a[0]} ${a[1]} ${(a[0] + b[0]) / 2} ${(a[1] + b[1]) / 2}`;\n\t}\n\td += \" Z\";\n\treturn {\n\t\tkind: \"fillPath\",\n\t\td,\n\t\tfill: style.stroke,\n\t\tfillOpacity: style.strokeOpacity,\n\t};\n}\n\nfunction freehandPayloadToSvgString(payload: FreehandSvgPayload): string {\n\tif (payload.kind === \"circle\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<circle cx=\"${payload.cx}\" cy=\"${payload.cy}\" r=\"${payload.r}\" fill=\"${payload.fill}\" shape-rendering=\"geometricPrecision\"${op} />`;\n\t}\n\tif (payload.kind === \"fillPath\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<path d=\"${payload.d}\" fill=\"${payload.fill}\" fill-rule=\"nonzero\" stroke=\"none\"${op} shape-rendering=\"geometricPrecision\" />`;\n\t}\n\tconst op = strokeOpacityAttr({\n\t\tstroke: payload.stroke,\n\t\tstrokeWidth: payload.strokeWidth,\n\t\tstrokeOpacity: payload.strokeOpacity,\n\t});\n\tconst dash = payload.strokeDasharray\n\t\t? ` stroke-dasharray=\"${payload.strokeDasharray}\"`\n\t\t: \"\";\n\treturn `<path d=\"${payload.d}\" fill=\"none\" stroke=\"${payload.stroke}\" stroke-width=\"${payload.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op}${dash} />`;\n}\n\n/**\n * Freehand stroke in local coordinates using [perfect-freehand](https://github.com/steveruizok/perfect-freehand)\n * (filled outline, tapered caps — similar spirit to tldraw / Excalidraw ink).\n */\nexport function buildFreehandPathSvg(\n\tpathPointsLocal: readonly { x: number; y: number }[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): string {\n\tconst payload = computeFreehandSvgPayload(\n\t\tpathPointsLocal,\n\t\tstyle,\n\t\ttoolKind,\n\t\tstrokeComplete,\n\t);\n\tif (!payload) return \"\";\n\treturn freehandPayloadToSvgString(payload);\n}\n\n/**\n * Creates a new unique id for a shape (for `VectorSceneItem.id` when adding from code or API).\n */\nexport function createShapeId(): string {\n\tconst uid =\n\t\ttypeof crypto !== \"undefined\" && crypto.randomUUID\n\t\t\t? crypto.randomUUID()\n\t\t\t: String(Date.now());\n\treturn `user-shape-${uid}`;\n}\n\n/**\n * Converts line segment endpoints from **world** coordinates to **local** coordinates\n * (origin = top-left of `bounds`). Use with {@link createLineItem}.\n */\nexport function lineEndpointsToLocal(\n\tbounds: Rect,\n\tworldEndA: { x: number; y: number },\n\tworldEndB: { x: number; y: number },\n): LineEndpointsLocal {\n\tconst b = normalizeRect(bounds);\n\treturn {\n\t\tx1: worldEndA.x - b.x,\n\t\ty1: worldEndA.y - b.y,\n\t\tx2: worldEndB.x - b.x,\n\t\ty2: worldEndB.y - b.y,\n\t};\n}\n\n/**\n * Rebuilds the SVG fragment (`childrenSvg`) from geometry + stroke fields (after edits or resize).\n */\nexport function rebuildItemSvg(item: VectorSceneItem): VectorSceneItem {\n\tconst style = resolveStrokeStyle(item);\n\tconst k = item.toolKind;\n\n\tif (k === \"rect\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRectSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"ellipse\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildEllipseSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"architectural-cloud\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildArchitecturalCloudSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif ((k === \"line\" || k === \"arrow\") && item.line) {\n\t\tconst line = item.line;\n\t\tconst childrenSvg =\n\t\t\tk === \"arrow\"\n\t\t\t\t? buildArrowSvg(item.id, line, style)\n\t\t\t\t: buildLineSvg(line, style);\n\t\treturn { ...item, childrenSvg };\n\t}\n\tif (k === \"text\" && item.text !== undefined) {\n\t\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\t\tif (item.textFixedBounds) {\n\t\t\tconst b = normalizeRect(item.bounds);\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: b.x,\n\t\t\t\ty: b.y,\n\t\t\t\tbounds: b,\n\t\t\t\tchildrenSvg: buildTextFixedBoundsSvg(\n\t\t\t\t\titem.text,\n\t\t\t\t\tb.width,\n\t\t\t\t\tb.height,\n\t\t\t\t\tstyle.stroke,\n\t\t\t\t\tfs,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tconst m = measureTextBoundsLocal(item.text, fs);\n\t\tconst b = normalizeRect({\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t});\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildTextSvg(item.text, b.width, b.height, style.stroke, fs),\n\t\t};\n\t}\n\tif (\n\t\t(k === \"draw\" || k === \"pencil\" || k === \"brush\" || k === \"marker\") &&\n\t\titem.pathPointsLocal &&\n\t\titem.pathPointsLocal.length > 0\n\t) {\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildFreehandPathSvg(item.pathPointsLocal, style, k),\n\t\t};\n\t}\n\tif (k === \"draw\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\tconst r = Math.min(b.width, b.height) / 2;\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildDrawDotSvg(r, style),\n\t\t};\n\t}\n\tif (k === \"image\" && item.imageRasterHref && item.imageIntrinsicSize) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\titem.imageRasterHref,\n\t\t\t\titem.imageIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\tif (k === \"custom\" && item.customIntrinsicSize && item.customInnerSvg) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildCustomShapeChildrenSvg(\n\t\t\t\titem.customInnerSvg,\n\t\t\t\titem.customIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\n\treturn item;\n}\n\n/** Updates stroke color / width / opacity and refreshes the item’s SVG. */\nexport function applyStrokeToItem(\n\titem: VectorSceneItem,\n\tpatch: Partial<\n\t\tPick<\n\t\t\tVectorSceneItem,\n\t\t\t\"stroke\" | \"strokeWidth\" | \"strokeOpacity\" | \"strokeDash\" | \"textFontSize\"\n\t\t>\n\t>,\n): VectorSceneItem {\n\treturn rebuildItemSvg({ ...item, ...patch });\n}\n\n/** Creates a rectangle shape ready to append to your scene `items` array. */\nexport function createRectangleItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"rect\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an ellipse shape. */\nexport function createEllipseItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"ellipse\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/**\n * Creates an architectural revision cloud shape.\n *\n * Use this high-level builder when adding the built-in cloud shape from code or\n * from custom integrations. It creates an editable `VectorSceneItem` with\n * `toolKind: \"architectural-cloud\"`, so resize, stroke styling, selection, and\n * serialization continue to work like the built-in rectangle and ellipse tools.\n *\n * @example\n * ```ts\n * const cloud = createArchitecturalCloudItem(createShapeId(), {\n * x: 40,\n * y: 30,\n * width: 180,\n * height: 90,\n * });\n * ```\n */\nexport function createArchitecturalCloudItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"architectural-cloud\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates a straight line or arrow; `line` is usually from {@link lineEndpointsToLocal}. */\nexport function createLineItem(\n\tid: string,\n\tbounds: Rect,\n\tline: LineEndpointsLocal,\n\ttoolKind: \"line\" | \"arrow\",\n\tstyle?: Partial<StrokeStyle>,\n\tarrowBind?: ArrowBindings,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind,\n\t\tline: { ...line },\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(arrowBind ? { arrowBind } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** “Draw dot” tool: a small filled circle at (`worldX`, `worldY`). */\nexport function createDrawDotItem(\n\tid: string,\n\tworldX: number,\n\tworldY: number,\n\tradius: number,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: worldX - radius,\n\t\ty: worldY - radius,\n\t\tbounds: {\n\t\t\tx: worldX - radius,\n\t\t\ty: worldY - radius,\n\t\t\twidth: radius * 2,\n\t\t\theight: radius * 2,\n\t\t},\n\t\ttoolKind: \"draw\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an editable text box (`stroke` is used as text fill). */\nexport function createTextItem(\n\tid: string,\n\tbounds: Rect,\n\ttext = \"\",\n\tstyle?: Partial<StrokeStyle>,\n\ttextFontSize?: number,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"text\",\n\t\ttext,\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(textFontSize != null ? { textFontSize } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Freehand stroke from world-space points (main pen or marker highlight). */\nexport function createFreehandStrokeItem(\n\tid: string,\n\tpointsWorld: readonly VectorPathPoint[],\n\ttoolKind: \"draw\" | \"marker\",\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem | null {\n\tif (pointsWorld.length === 0) return null;\n\n\tconst merged: StrokeStyle = {\n\t\t...DEFAULT_STROKE_STYLE,\n\t\t...TOOL_FREEHAND_DEFAULTS[toolKind],\n\t\t...style,\n\t};\n\n\tconst sw = merged.strokeWidth;\n\t/** Filled outline extends ~size/2 past the polyline; keep generous padding to avoid clipping. */\n\tconst pad = Math.max(sw * 0.75 + 4, sw / 2 + 6);\n\tconst xs = pointsWorld.map((p) => p.x);\n\tconst ys = pointsWorld.map((p) => p.y);\n\tconst minX = Math.min(...xs);\n\tconst maxX = Math.max(...xs);\n\tconst minY = Math.min(...ys);\n\tconst maxY = Math.max(...ys);\n\n\tconst x = minX - pad;\n\tconst y = minY - pad;\n\tconst w = Math.max(maxX - minX + 2 * pad, sw);\n\tconst h = Math.max(maxY - minY + 2 * pad, sw);\n\n\tconst pathPointsLocal = pointsWorld.map((p) => ({\n\t\tx: p.x - x,\n\t\ty: p.y - y,\n\t\t...(p.pressure != null ? { pressure: p.pressure } : {}),\n\t}));\n\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx,\n\t\ty,\n\t\tbounds: { x, y, width: w, height: h },\n\t\ttoolKind,\n\t\tstroke: merged.stroke,\n\t\tstrokeWidth: merged.strokeWidth,\n\t\t...(merged.strokeOpacity != null ? { strokeOpacity: merged.strokeOpacity } : {}),\n\t\t...(merged.strokeDash != null ? { strokeDash: merged.strokeDash } : {}),\n\t\tpathPointsLocal,\n\t\tchildrenSvg: \"\",\n\t});\n}\n\nfunction escapeSvgAttr(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\");\n}\n\n/**\n * Builds `<g><image href=\"data:...\"/></g>` inside `bounds` from intrinsic pixel dimensions.\n * When bounds match intrinsic aspect (normal after aspect-locked resize), uses a uniform **fill** scale.\n * Otherwise uses **contain** + center for legacy or pasted rects with wrong proportion.\n */\nexport function buildRasterImageChildrenSvg(\n\tdataUrl: string,\n\tintrinsic: { width: number; height: number },\n\tbounds: Rect,\n): string {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, intrinsic.width);\n\tconst ih = Math.max(1e-6, intrinsic.height);\n\tconst href = escapeSvgAttr(dataUrl);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = iw / ih;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / iw;\n\t\treturn `<g transform=\"scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n\t}\n\tconst s = Math.min(r.width / iw, r.height / ih);\n\tconst tx = (r.width - iw * s) / 2;\n\tconst ty = (r.height - ih * s) / 2;\n\treturn `<g transform=\"translate(${tx}, ${ty}) scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n}\n\n/** Places a bitmap (e.g. `data:image/png;base64,...`) inside `bounds`. */\nexport function createImageItem(\n\tid: string,\n\tbounds: Rect,\n\timageRasterHref: string,\n\timageIntrinsicSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, imageIntrinsicSize.width);\n\tconst ih = Math.max(1e-6, imageIntrinsicSize.height);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageRasterHref,\n\t\timageIntrinsicSize: { width: iw, height: ih },\n\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\timageRasterHref,\n\t\t\t{ width: iw, height: ih },\n\t\t\tr,\n\t\t),\n\t};\n}\n\n/** @internal Legacy traced path content — prefer {@link createImageItem} with a raster data URL. */\nexport function createImageFromVectorTrace(\n\tid: string,\n\tbounds: Rect,\n\timageVectorInnerSvg: string,\n\timageVectorLocalSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst lw = Math.max(1e-6, imageVectorLocalSize.width);\n\tconst lh = Math.max(1e-6, imageVectorLocalSize.height);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = lw / lh;\n\tlet childrenSvg: string;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / lw;\n\t\tchildrenSvg = `<g transform=\"scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t} else {\n\t\tconst s = Math.min(r.width / lw, r.height / lh);\n\t\tconst tx = (r.width - lw * s) / 2;\n\t\tconst ty = (r.height - lh * s) / 2;\n\t\tchildrenSvg = `<g transform=\"translate(${tx}, ${ty}) scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t}\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageVectorInnerSvg,\n\t\timageVectorLocalSize: { width: lw, height: lh },\n\t\tchildrenSvg,\n\t};\n}\n","import { itemLocalToWorld, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\n\nexport type ResizeHandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nconst HANDLE_IDS: ResizeHandleId[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\n\nexport function getHandleWorldPosition(\n\tbounds: Rect,\n\tid: ResizeHandleId,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst cx = r.x + r.width / 2;\n\tconst cy = r.y + r.height / 2;\n\tswitch (id) {\n\t\tcase \"nw\":\n\t\t\treturn { x: r.x, y: r.y };\n\t\tcase \"n\":\n\t\t\treturn { x: cx, y: r.y };\n\t\tcase \"ne\":\n\t\t\treturn { x: r.x + r.width, y: r.y };\n\t\tcase \"e\":\n\t\t\treturn { x: r.x + r.width, y: cy };\n\t\tcase \"se\":\n\t\t\treturn { x: r.x + r.width, y: r.y + r.height };\n\t\tcase \"s\":\n\t\t\treturn { x: cx, y: r.y + r.height };\n\t\tcase \"sw\":\n\t\t\treturn { x: r.x, y: r.y + r.height };\n\t\tcase \"w\":\n\t\t\treturn { x: r.x, y: cy };\n\t}\n}\n\n/**\n * Hit-tests resize handles in **local** item space (handles rotation).\n */\nexport function hitTestResizeHandle(\n\tbounds: Rect,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\trotationRad: number = 0,\n): ResizeHandleId | null {\n\tconst r = normalizeRect(bounds);\n\tconst pl = worldToItemLocal(\n\t\tworldX,\n\t\tworldY,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n\tconst localBounds = { x: 0, y: 0, width: r.width, height: r.height };\n\tlet best: ResizeHandleId | null = null;\n\tlet bestD = radiusWorld;\n\tfor (const id of HANDLE_IDS) {\n\t\tconst p = getHandleWorldPosition(localBounds, id);\n\t\tconst d = Math.hypot(pl.x - p.x, pl.y - p.y);\n\t\tif (d <= bestD) {\n\t\t\tbestD = d;\n\t\t\tbest = id;\n\t\t}\n\t}\n\treturn best;\n}\n\n/** World position of a resize handle when the item is rotated around its center. */\nexport function getHandleWorldPositionRotated(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst p = getHandleWorldPosition(\n\t\t{ x: 0, y: 0, width: r.width, height: r.height },\n\t\thandle,\n\t);\n\treturn itemLocalToWorld(p.x, p.y, r.x, r.y, r.width, r.height, rotationRad);\n}\n\n/** World position of the rotation handle (above the top edge of the bounds). */\nexport function getRotationHandleWorldPosition(\n\tbounds: Rect,\n\trotationRad: number,\n\thandleOffsetWorld: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\treturn itemLocalToWorld(\n\t\tr.width / 2,\n\t\t-handleOffsetWorld,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n}\n\nexport function hitTestRotateHandle(\n\tbounds: Rect,\n\trotationRad: number,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\thandleOffsetWorld: number,\n): boolean {\n\tconst p = getRotationHandleWorldPosition(bounds, rotationRad, handleOffsetWorld);\n\treturn Math.hypot(worldX - p.x, worldY - p.y) <= radiusWorld;\n}\n\nexport function rectFromCorners(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n): Rect {\n\tconst minX = Math.min(a.x, b.x);\n\tconst maxX = Math.max(a.x, b.x);\n\tconst minY = Math.min(a.y, b.y);\n\tconst maxY = Math.max(a.y, b.y);\n\treturn { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction clampMinSize(r: Rect, min: number): Rect {\n\tconst n = normalizeRect(r);\n\treturn {\n\t\tx: n.x,\n\t\ty: n.y,\n\t\twidth: Math.max(min, n.width),\n\t\theight: Math.max(min, n.height),\n\t};\n}\n\n/**\n * Computes new axis-aligned bounds when dragging a resize handle to `currentWorld`.\n */\nexport function computeResizeBounds(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst minSize = 8;\n\n\tswitch (handle) {\n\t\tcase \"nw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y1 }), minSize);\n\t\tcase \"ne\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y1 }), minSize);\n\t\tcase \"se\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y0 }), minSize);\n\t\tcase \"sw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y0 }), minSize);\n\t\tcase \"n\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: currentWorld.y }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"s\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: x1, y: currentWorld.y }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"e\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: currentWorld.x, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"w\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: currentWorld.x, y: y0 }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n\n/**\n * Resize bounds with fixed width/height ratio (`aspect` = width ÷ height), similar to tldraw\n * image resize: corners follow the cursor by adjusting the other dimension to preserve aspect;\n * edges resize from the opposite edge with the box centered on the orthogonal axis.\n */\nexport function computeResizeBoundsFixedAspect(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n\taspect: number,\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst w = r.width;\n\tconst h = r.height;\n\tconst minSize = 8;\n\tconst a = Math.max(1e-9, aspect);\n\n\tfunction cornerAspectRect(\n\t\tanchor: { x: number; y: number },\n\t\tcursor: { x: number; y: number },\n\t): Rect {\n\t\tconst dx = cursor.x - anchor.x;\n\t\tconst dy = cursor.y - anchor.y;\n\t\tconst aw = Math.abs(dx);\n\t\tconst ah = Math.abs(dy);\n\t\tlet W: number;\n\t\tlet H: number;\n\t\tif (aw < 1e-12 && ah < 1e-12) {\n\t\t\tW = minSize;\n\t\t\tH = minSize / a;\n\t\t} else if (ah < 1e-12) {\n\t\t\tW = Math.max(minSize, aw);\n\t\t\tH = W / a;\n\t\t} else if (aw < 1e-12) {\n\t\t\tH = Math.max(minSize, ah);\n\t\t\tW = H * a;\n\t\t} else if (aw / ah > a) {\n\t\t\tW = aw;\n\t\t\tH = aw / a;\n\t\t} else {\n\t\t\tH = ah;\n\t\t\tW = ah * a;\n\t\t}\n\t\tif (W < minSize || H < minSize) {\n\t\t\tconst scale = Math.max(minSize / W, minSize / H);\n\t\t\tW *= scale;\n\t\t\tH *= scale;\n\t\t}\n\t\tconst sx = Math.sign(dx) || 1;\n\t\tconst sy = Math.sign(dy) || 1;\n\t\treturn rectFromCorners(anchor, {\n\t\t\tx: anchor.x + sx * W,\n\t\t\ty: anchor.y + sy * H,\n\t\t});\n\t}\n\n\tswitch (handle) {\n\t\tcase \"se\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y0 }, currentWorld);\n\t\tcase \"nw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y1 }, currentWorld);\n\t\tcase \"ne\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y1 }, currentWorld);\n\t\tcase \"sw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y0 }, currentWorld);\n\t\tcase \"e\": {\n\t\t\tconst rawW = currentWorld.x - x0;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({ x: x0, y: newY, width: sign * aw, height: H });\n\t\t}\n\t\tcase \"w\": {\n\t\t\tconst rawW = x1 - currentWorld.x;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: x1 - sign * aw,\n\t\t\t\ty: newY,\n\t\t\t\twidth: sign * aw,\n\t\t\t\theight: H,\n\t\t\t});\n\t\t}\n\t\tcase \"n\": {\n\t\t\tconst rawH = y1 - currentWorld.y;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: newX,\n\t\t\t\ty: y1 - sign * ah,\n\t\t\t\twidth: W,\n\t\t\t\theight: sign * ah,\n\t\t\t});\n\t\t}\n\t\tcase \"s\": {\n\t\t\tconst rawH = currentWorld.y - y0;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({ x: newX, y: y0, width: W, height: sign * ah });\n\t\t}\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n","import {\n\tgetItemRotationRad,\n\titemLocalToWorld,\n\tworldToItemLocal,\n} from \"../math/item-transform\";\nimport { normalizeRect } from \"../math/rect\";\nimport { lineEndpointsToLocal, rebuildItemSvg } from \"../scene/shape-builders\";\nimport type { ArrowEndpointBinding, VectorSceneItem } from \"../scene/types\";\nimport { rectFromCorners } from \"./resize-handles\";\n\n/** Default screen px — converted to world with `/ camera.zoom` when snapping. */\nexport const ARROW_BIND_SNAP_PX = 16;\n\nfunction closestPointOnSegment(\n\tpx: number,\n\tpy: number,\n\tax: number,\n\tay: number,\n\tbx: number,\n\tby: number,\n): { x: number; y: number } {\n\tconst abx = bx - ax;\n\tconst aby = by - ay;\n\tconst apx = px - ax;\n\tconst apy = py - ay;\n\tconst abLenSq = abx * abx + aby * aby;\n\tif (abLenSq < 1e-12) {\n\t\treturn { x: ax, y: ay };\n\t}\n\tlet t = (apx * abx + apy * aby) / abLenSq;\n\tt = Math.max(0, Math.min(1, t));\n\treturn { x: ax + t * abx, y: ay + t * aby };\n}\n\n/** Closest point on the boundary of axis-aligned rect [0,w]×[0,h] to (px,py). */\nfunction closestPointOnRectBoundaryLocal(\n\tpx: number,\n\tpy: number,\n\tw: number,\n\th: number,\n): { x: number; y: number } {\n\tconst edges: [number, number, number, number][] = [\n\t\t[0, 0, w, 0],\n\t\t[w, 0, w, h],\n\t\t[w, h, 0, h],\n\t\t[0, h, 0, 0],\n\t];\n\tlet best = { x: 0, y: 0, d: Infinity };\n\tfor (const [ax, ay, bx, by] of edges) {\n\t\tconst p = closestPointOnSegment(px, py, ax, ay, bx, by);\n\t\tconst d = Math.hypot(px - p.x, py - p.y);\n\t\tif (d < best.d) {\n\t\t\tbest = { x: p.x, y: p.y, d };\n\t\t}\n\t}\n\treturn { x: best.x, y: best.y };\n}\n\nfunction closestPointOnEllipseBoundaryLocal(\n\tpx: number,\n\tpy: number,\n\tw: number,\n\th: number,\n): { x: number; y: number } {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst rx = w / 2;\n\tconst ry = h / 2;\n\tif (rx < 1e-9 || ry < 1e-9) {\n\t\treturn { x: cx, y: cy };\n\t}\n\tconst dx = px - cx;\n\tconst dy = py - cy;\n\tif (dx === 0 && dy === 0) {\n\t\treturn { x: cx + rx, y: cy };\n\t}\n\tconst t = Math.atan2(dy / ry, dx / rx);\n\treturn {\n\t\tx: cx + rx * Math.cos(t),\n\t\ty: cy + ry * Math.sin(t),\n\t};\n}\n\nexport function isArrowBindTarget(item: VectorSceneItem): boolean {\n\tif (item.locked) return false;\n\tconst k = item.toolKind;\n\tif (!k) return false;\n\treturn (\n\t\tk === \"rect\" ||\n\t\tk === \"ellipse\" ||\n\t\tk === \"architectural-cloud\" ||\n\t\tk === \"text\" ||\n\t\tk === \"image\" ||\n\t\tk === \"custom\"\n\t);\n}\n\nfunction closestPointOnShapeBoundaryLocal(\n\titem: VectorSceneItem,\n\tlx: number,\n\tly: number,\n\tw: number,\n\th: number,\n): { x: number; y: number } {\n\tif (item.toolKind === \"ellipse\") {\n\t\treturn closestPointOnEllipseBoundaryLocal(lx, ly, w, h);\n\t}\n\treturn closestPointOnRectBoundaryLocal(lx, ly, w, h);\n}\n\nfunction anchorNormalizedToWorld(\n\ttarget: VectorSceneItem,\n\tanchor: { x: number; y: number },\n): { x: number; y: number } {\n\tconst b = normalizeRect(target.bounds);\n\tconst w = b.width;\n\tconst h = b.height;\n\tconst lx = anchor.x * w;\n\tconst ly = anchor.y * h;\n\tconst rot = getItemRotationRad(target);\n\treturn itemLocalToWorld(lx, ly, target.x, target.y, w, h, rot);\n}\n\n/**\n * If `worldX/worldY` is within `maxDistWorld` of a bindable shape’s boundary,\n * returns the snapped point on that boundary plus binding metadata.\n */\nexport function snapArrowEndpointToShape(\n\tworldX: number,\n\tworldY: number,\n\titems: readonly VectorSceneItem[],\n\texcludeIds: ReadonlySet<string>,\n\tmaxDistWorld: number,\n): { world: { x: number; y: number }; binding: ArrowEndpointBinding } | null {\n\tlet best: {\n\t\tworld: { x: number; y: number };\n\t\tbinding: ArrowEndpointBinding;\n\t\td: number;\n\t} | null = null;\n\n\tfor (const item of items) {\n\t\tif (excludeIds.has(item.id)) continue;\n\t\tif (!isArrowBindTarget(item)) continue;\n\n\t\tconst b = normalizeRect(item.bounds);\n\t\tconst w = b.width;\n\t\tconst h = b.height;\n\t\tconst rot = getItemRotationRad(item);\n\t\tconst pl = worldToItemLocal(worldX, worldY, item.x, item.y, w, h, rot);\n\n\t\tconst localClosest = closestPointOnShapeBoundaryLocal(item, pl.x, pl.y, w, h);\n\t\tconst worldClosest = itemLocalToWorld(\n\t\t\tlocalClosest.x,\n\t\t\tlocalClosest.y,\n\t\t\titem.x,\n\t\t\titem.y,\n\t\t\tw,\n\t\t\th,\n\t\t\trot,\n\t\t);\n\t\tconst d = Math.hypot(worldX - worldClosest.x, worldY - worldClosest.y);\n\t\tif (d > maxDistWorld) continue;\n\t\tif (!best || d < best.d) {\n\t\t\tbest = {\n\t\t\t\td,\n\t\t\t\tworld: worldClosest,\n\t\t\t\tbinding: {\n\t\t\t\t\ttargetId: item.id,\n\t\t\t\t\tanchor: {\n\t\t\t\t\t\tx: localClosest.x / Math.max(1e-9, w),\n\t\t\t\t\t\ty: localClosest.y / Math.max(1e-9, h),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\treturn best ? { world: best.world, binding: best.binding } : null;\n}\n\nfunction resolveOneArrowItem(\n\titem: VectorSceneItem,\n\tmap: Map<string, VectorSceneItem>,\n): VectorSceneItem {\n\tconst bind = item.arrowBind;\n\tif (!bind || item.toolKind !== \"arrow\") return item;\n\tconst ln = item.line;\n\tif (!ln) return item;\n\n\tconst b0 = normalizeRect(item.bounds);\n\tconst rot = getItemRotationRad(item);\n\tconst w0 = b0.width;\n\tconst h0 = b0.height;\n\tconst startFallback = itemLocalToWorld(ln.x1, ln.y1, item.x, item.y, w0, h0, rot);\n\tconst endFallback = itemLocalToWorld(ln.x2, ln.y2, item.x, item.y, w0, h0, rot);\n\n\tconst startW = bind.start\n\t\t? (() => {\n\t\t\t\tconst t = map.get(bind.start.targetId);\n\t\t\t\treturn t ? anchorNormalizedToWorld(t, bind.start.anchor) : startFallback;\n\t\t\t})()\n\t\t: startFallback;\n\tconst endW = bind.end\n\t\t? (() => {\n\t\t\t\tconst t = map.get(bind.end.targetId);\n\t\t\t\treturn t ? anchorNormalizedToWorld(t, bind.end.anchor) : endFallback;\n\t\t\t})()\n\t\t: endFallback;\n\n\tconst raw = rectFromCorners(startW, endW);\n\tconst br = normalizeRect(raw);\n\tconst newLine = lineEndpointsToLocal(br, startW, endW);\n\tconst next: VectorSceneItem = {\n\t\t...item,\n\t\tx: br.x,\n\t\ty: br.y,\n\t\tbounds: br,\n\t\tline: newLine,\n\t\trotation: 0,\n\t};\n\treturn rebuildItemSvg(next);\n}\n\n/**\n * Recomputes every arrow item that has {@link VectorSceneItem.arrowBind} so endpoints\n * follow bound shapes (move/resize).\n */\nexport function resolveArrowBindingsInScene(\n\titems: readonly VectorSceneItem[],\n): readonly VectorSceneItem[] {\n\tlet hasBoundArrow = false;\n\tfor (const item of items) {\n\t\tif (item.toolKind === \"arrow\" && item.arrowBind) {\n\t\t\thasBoundArrow = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!hasBoundArrow) {\n\t\treturn items;\n\t}\n\n\tconst map = new Map(items.map((i) => [i.id, i]));\n\treturn items.map((item) => {\n\t\tif (item.toolKind !== \"arrow\" || !item.arrowBind) return item;\n\t\treturn resolveOneArrowItem(item, map);\n\t});\n}\n\n/**\n * Converts a bound arrow to a plain arrow (drops bindings) using the current resolved\n * geometry so move/resize gestures don’t fight binding resolution.\n */\nexport function bakeArrowItemToAbsolute(\n\titem: VectorSceneItem,\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem {\n\tif (item.toolKind !== \"arrow\" || !item.arrowBind) return item;\n\tconst map = new Map(items.map((i) => [i.id, i]));\n\tconst resolved = resolveOneArrowItem(item, map);\n\tconst { arrowBind: _a, ...rest } = resolved;\n\treturn { ...rest };\n}\n","import {\n\tgetItemRotationRad,\n\titemLocalToWorld,\n\tworldToItemLocal,\n} from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Returns whether a world point lies inside an axis-aligned rectangle.\n */\nexport function pointInWorldRect(px: number, py: number, rect: Rect): boolean {\n\tconst r = normalizeRect(rect);\n\treturn px >= r.x && px <= r.x + r.width && py >= r.y && py <= r.y + r.height;\n}\n\nfunction pointInLocalRect(lx: number, ly: number, w: number, h: number): boolean {\n\treturn lx >= 0 && lx <= w && ly >= 0 && ly <= h;\n}\n\nfunction pointInLocalEllipse(lx: number, ly: number, w: number, h: number): boolean {\n\tconst rx = w / 2;\n\tconst ry = h / 2;\n\tif (rx < 1e-9 || ry < 1e-9) {\n\t\treturn false;\n\t}\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst nx = (lx - cx) / rx;\n\tconst ny = (ly - cy) / ry;\n\treturn nx * nx + ny * ny <= 1;\n}\n\n/**\n * Distance from point `p` to segment `a`–`b` in 2D.\n */\nexport function distancePointToSegment(\n\tpx: number,\n\tpy: number,\n\tax: number,\n\tay: number,\n\tbx: number,\n\tby: number,\n): number {\n\tconst abx = bx - ax;\n\tconst aby = by - ay;\n\tconst apx = px - ax;\n\tconst apy = py - ay;\n\tconst abLenSq = abx * abx + aby * aby;\n\tif (abLenSq < 1e-12) {\n\t\treturn Math.hypot(px - ax, py - ay);\n\t}\n\tlet t = (apx * abx + apy * aby) / abLenSq;\n\tt = Math.max(0, Math.min(1, t));\n\tconst qx = ax + t * abx;\n\tconst qy = ay + t * aby;\n\treturn Math.hypot(px - qx, py - qy);\n}\n\nexport type HitTestWorldPointOptions = {\n\t/** Max distance to a line segment in **world** units (e.g. ~10 / camera.zoom for ~10px on screen). */\n\tlineHitWorld?: number;\n\t/** When true, locked items are ignored as interaction targets. */\n\tignoreLocked?: boolean;\n};\n\nfunction hitTestFilledShape(\n\titem: VectorSceneItem,\n\tworldX: number,\n\tworldY: number,\n): boolean {\n\tconst b = normalizeRect(item.bounds);\n\tconst w = b.width;\n\tconst h = b.height;\n\tconst rot = getItemRotationRad(item);\n\tconst pl = worldToItemLocal(worldX, worldY, item.x, item.y, w, h, rot);\n\n\tif (item.toolKind === \"ellipse\") {\n\t\treturn pointInLocalEllipse(pl.x, pl.y, w, h);\n\t}\n\treturn pointInLocalRect(pl.x, pl.y, w, h);\n}\n\n/**\n * Whether `worldX/worldY` hits this item’s visible geometry (stroke/area).\n */\nexport function itemHitTestWorldPoint(\n\titem: VectorSceneItem,\n\tworldX: number,\n\tworldY: number,\n\toptions?: HitTestWorldPointOptions,\n): boolean {\n\tconst lineHit = options?.lineHitWorld ?? 8;\n\tconst lineHitSq = lineHit * lineHit;\n\n\tconst b = normalizeRect(item.bounds);\n\tconst w = b.width;\n\tconst h = b.height;\n\tconst rot = getItemRotationRad(item);\n\n\tif (item.toolKind === \"line\" || item.toolKind === \"arrow\") {\n\t\tconst ln = item.line;\n\t\tif (ln) {\n\t\t\tconst a = itemLocalToWorld(ln.x1, ln.y1, item.x, item.y, w, h, rot);\n\t\t\tconst p2 = itemLocalToWorld(ln.x2, ln.y2, item.x, item.y, w, h, rot);\n\t\t\tconst d = distancePointToSegment(worldX, worldY, a.x, a.y, p2.x, p2.y);\n\t\t\tif (d * d <= lineHitSq) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (hitTestFilledShape(item, worldX, worldY)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tif (\n\t\titem.toolKind === \"draw\" ||\n\t\titem.toolKind === \"pencil\" ||\n\t\titem.toolKind === \"brush\" ||\n\t\titem.toolKind === \"marker\"\n\t) {\n\t\tconst pts = item.pathPointsLocal;\n\t\tconst halfW = Math.max((item.strokeWidth ?? 2) / 2, lineHit * 0.5);\n\t\tconst tol = Math.max(lineHit, halfW);\n\t\tconst tolSq = tol * tol;\n\t\tif (pts && pts.length >= 2) {\n\t\t\tfor (let j = 0; j < pts.length - 1; j++) {\n\t\t\t\tconst a = pts[j];\n\t\t\t\tconst p2 = pts[j + 1];\n\t\t\t\tif (!a || !p2) continue;\n\t\t\t\tconst aw = itemLocalToWorld(a.x, a.y, item.x, item.y, w, h, rot);\n\t\t\t\tconst bw = itemLocalToWorld(p2.x, p2.y, item.x, item.y, w, h, rot);\n\t\t\t\tconst d = distancePointToSegment(worldX, worldY, aw.x, aw.y, bw.x, bw.y);\n\t\t\t\tif (d * d <= tolSq) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// A freehand stroke is only its ink. Do NOT fall back to the\n\t\t\t// bounding box — that erased/selected the stroke from anywhere\n\t\t\t// inside its (often large, mostly empty) rect.\n\t\t\treturn false;\n\t\t}\n\t\tif (pts && pts.length === 1) {\n\t\t\tconst p = pts[0];\n\t\t\tif (!p) return false;\n\t\t\tconst cw = itemLocalToWorld(p.x, p.y, item.x, item.y, w, h, rot);\n\t\t\tconst dsq = (worldX - cw.x) ** 2 + (worldY - cw.y) ** 2;\n\t\t\treturn dsq <= tolSq;\n\t\t}\n\t\t// No usable path points (malformed item): last-resort bbox test.\n\t\treturn hitTestFilledShape(item, worldX, worldY);\n\t}\n\treturn hitTestFilledShape(item, worldX, worldY);\n}\n\n/**\n * Hit-tests a scene item in world coordinates (top-most = last in array wins if overlapping).\n */\nexport function hitTestWorldPoint(\n\titems: readonly VectorSceneItem[],\n\tworldX: number,\n\tworldY: number,\n\toptions?: HitTestWorldPointOptions,\n): VectorSceneItem | null {\n\tfor (let i = items.length - 1; i >= 0; i--) {\n\t\tconst item = items[i];\n\t\tif (item === undefined) continue;\n\t\tif (options?.ignoreLocked && item.locked) continue;\n\t\tif (itemHitTestWorldPoint(item, worldX, worldY, options)) {\n\t\t\treturn item;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Eraser: IDs of every **unlocked** item hit at this point.\n * Locked items are ignored so protected background layers do not block erasing editable shapes above them.\n */\nexport function collectEraserTargetsAtWorldPoint(\n\titems: readonly VectorSceneItem[],\n\tworldX: number,\n\tworldY: number,\n\toptions?: HitTestWorldPointOptions,\n): string[] {\n\tconst topHit = hitTestWorldPoint(items, worldX, worldY, {\n\t\t...options,\n\t\tignoreLocked: true,\n\t});\n\tif (!topHit) return [];\n\n\tconst ids: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst item = items[i];\n\t\tif (item === undefined || item.locked) continue;\n\t\tif (!itemHitTestWorldPoint(item, worldX, worldY, options)) continue;\n\t\tif (!seen.has(item.id)) {\n\t\t\tseen.add(item.id);\n\t\t\tids.push(item.id);\n\t\t}\n\t}\n\treturn ids;\n}\n","\"use client\";\n\nimport { IndexedDbImageStore } from \"../image/indexed-db-image-store\";\nimport { loadPdfToStore } from \"../image/pdf-loader\";\nimport { rebuildItemSvg } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport type {\n\tVectorViewportAssetHydrationRequest,\n\tVectorViewportAssetResolveResult,\n\tVectorViewportAssetStore,\n} from \"./asset-store\";\n\nconst HYDRATION_CACHE_NAME = \"canvu-asset-hydration-v1\";\nconst DEFAULT_PDF_SCALE = 1.15;\nconst DEFAULT_PDF_PAGE_CONCURRENCY = 2;\n\ntype HydratedAssetRecord = {\n\thref: string;\n\twidth?: number;\n\theight?: number;\n};\n\ntype HydratedAssetSource = {\n\tblob: Blob;\n\twidth?: number;\n\theight?: number;\n};\n\ntype PdfHydrationGroup = {\n\tassetId: string;\n\tscale: number;\n\tpageNumbers: number[];\n};\n\ntype HydrateSceneItemsWithAssetsOptions = {\n\timageStore?: IndexedDbImageStore;\n\tpdfScale?: number;\n\tpdfPageConcurrency?: number;\n\tpreferCachedRasters?: boolean;\n};\n\nexport type HydratedSceneItemsWithAssetsResult = {\n\titems: VectorSceneItem[];\n\tobjectUrls: string[];\n};\n\nconst hydrationSourcePromises = new Map<\n\tstring,\n\tPromise<HydratedAssetSource | null>\n>();\nconst pdfSourceBlobPromises = new Map<string, Promise<Blob | null>>();\n\nfunction buildImageHydrationKey(assetId: string): string {\n\treturn `image:${assetId}`;\n}\n\nfunction buildPdfHydrationKey(\n\tassetId: string,\n\tpageNumber: number,\n\tscale: number,\n): string {\n\treturn `pdf:${assetId}:page:${pageNumber}:scale:${scale}`;\n}\n\nfunction getCacheRequest(key: string): Request {\n\treturn new Request(\n\t\t`https://canvu.local/asset-hydration/${encodeURIComponent(key)}`,\n\t);\n}\n\nasync function openHydrationCache(): Promise<Cache | null> {\n\tif (typeof caches === \"undefined\") return null;\n\ttry {\n\t\treturn await caches.open(HYDRATION_CACHE_NAME);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function readCachedHydrationBlob(key: string): Promise<Blob | null> {\n\tconst cache = await openHydrationCache();\n\tif (!cache) return null;\n\ttry {\n\t\tconst response = await cache.match(getCacheRequest(key));\n\t\tif (!response?.ok) return null;\n\t\treturn await response.blob();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeCachedHydrationBlob(key: string, blob: Blob): Promise<void> {\n\tconst cache = await openHydrationCache();\n\tif (!cache) return;\n\ttry {\n\t\tawait cache.put(getCacheRequest(key), new Response(blob));\n\t} catch {}\n}\n\nasync function fetchBlob(url: string): Promise<Blob | null> {\n\ttry {\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) return null;\n\t\treturn await response.blob();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function getHydrationSource(\n\tkey: string,\n\tpreferCachedRasters: boolean,\n\tloader: () => Promise<HydratedAssetSource | null>,\n): Promise<HydratedAssetSource | null> {\n\tconst cached = preferCachedRasters ? await readCachedHydrationBlob(key) : null;\n\tif (cached) {\n\t\treturn {\n\t\t\tblob: cached,\n\t\t};\n\t}\n\tconst inFlight = hydrationSourcePromises.get(key);\n\tif (inFlight) return await inFlight;\n\tconst nextPromise = (async () => {\n\t\tconst source = await loader();\n\t\tif (source?.blob) {\n\t\t\tawait writeCachedHydrationBlob(key, source.blob);\n\t\t}\n\t\treturn source;\n\t})();\n\thydrationSourcePromises.set(key, nextPromise);\n\ttry {\n\t\treturn await nextPromise;\n\t} finally {\n\t\thydrationSourcePromises.delete(key);\n\t}\n}\n\nasync function getPdfSourceBlob(url: string): Promise<Blob | null> {\n\tconst inFlight = pdfSourceBlobPromises.get(url);\n\tif (inFlight) return await inFlight;\n\tconst nextPromise = fetchBlob(url);\n\tpdfSourceBlobPromises.set(url, nextPromise);\n\ttry {\n\t\treturn await nextPromise;\n\t} finally {\n\t\tpdfSourceBlobPromises.delete(url);\n\t}\n}\n\nfunction registerObjectUrl(objectUrls: string[], blob: Blob): string {\n\tconst href = URL.createObjectURL(blob);\n\tobjectUrls.push(href);\n\treturn href;\n}\n\nfunction getHydrationRequests(\n\titems: readonly VectorSceneItem[],\n\tassetStore: VectorViewportAssetStore,\n\tpdfScale: number,\n): Array<{\n\trequest: VectorViewportAssetHydrationRequest;\n}> {\n\tif (!assetStore.getHydrationRequest) return [];\n\treturn items.flatMap((item) => {\n\t\tconst request = assetStore.getHydrationRequest?.(item);\n\t\tif (!request) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\trequest: {\n\t\t\t\t\t...request,\n\t\t\t\t\tscale: request.scale ?? pdfScale,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction createPdfHydrationGroups(\n\trequests: Array<{\n\t\trequest: VectorViewportAssetHydrationRequest;\n\t}>,\n): PdfHydrationGroup[] {\n\tconst groups = new Map<string, PdfHydrationGroup>();\n\tfor (const entry of requests) {\n\t\tif (entry.request.kind !== \"pdf\" || entry.request.pageNumber == null) continue;\n\t\tconst scale = entry.request.scale ?? DEFAULT_PDF_SCALE;\n\t\tconst key = `${entry.request.assetId}:${scale}`;\n\t\tconst existingGroup = groups.get(key);\n\t\tif (existingGroup) {\n\t\t\tif (!existingGroup.pageNumbers.includes(entry.request.pageNumber)) {\n\t\t\t\texistingGroup.pageNumbers.push(entry.request.pageNumber);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tgroups.set(key, {\n\t\t\tassetId: entry.request.assetId,\n\t\t\tscale,\n\t\t\tpageNumbers: [entry.request.pageNumber],\n\t\t});\n\t}\n\treturn [...groups.values()];\n}\n\nasync function hydrateImageAssets(\n\trequests: Array<{\n\t\trequest: VectorViewportAssetHydrationRequest;\n\t}>,\n\tresolvedAssetUrls: VectorViewportAssetResolveResult,\n\tobjectUrls: string[],\n\tpreferCachedRasters: boolean,\n): Promise<Map<string, HydratedAssetRecord | null>> {\n\tconst uniqueAssetIds = [\n\t\t...new Set(requests.map((entry) => entry.request.assetId)),\n\t];\n\tconst hydratedEntries = await Promise.all(\n\t\tuniqueAssetIds.map(async (assetId) => {\n\t\t\tconst resolvedAsset = resolvedAssetUrls[assetId];\n\t\t\tif (!resolvedAsset?.url) {\n\t\t\t\treturn [assetId, null] as const;\n\t\t\t}\n\t\t\tconst source = await getHydrationSource(\n\t\t\t\tbuildImageHydrationKey(assetId),\n\t\t\t\tpreferCachedRasters,\n\t\t\t\tasync () => {\n\t\t\t\t\tconst blob = await fetchBlob(resolvedAsset.url);\n\t\t\t\t\tif (!blob) return null;\n\t\t\t\t\treturn { blob };\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (!source?.blob) {\n\t\t\t\treturn [assetId, null] as const;\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tassetId,\n\t\t\t\t{\n\t\t\t\t\thref: registerObjectUrl(objectUrls, source.blob),\n\t\t\t\t},\n\t\t\t] as const;\n\t\t}),\n\t);\n\treturn new Map<string, HydratedAssetRecord | null>(hydratedEntries);\n}\n\nasync function hydratePdfAssets(\n\trequests: Array<{\n\t\trequest: VectorViewportAssetHydrationRequest;\n\t}>,\n\tresolvedAssetUrls: VectorViewportAssetResolveResult,\n\tobjectUrls: string[],\n\toptions: {\n\t\timageStore: IndexedDbImageStore;\n\t\tpdfPageConcurrency: number;\n\t\tpreferCachedRasters: boolean;\n\t},\n): Promise<Map<string, HydratedAssetRecord>> {\n\tconst hydratedPages = new Map<string, HydratedAssetRecord>();\n\tconst groups = createPdfHydrationGroups(requests);\n\n\tfor (const group of groups) {\n\t\tconst resolvedAsset = resolvedAssetUrls[group.assetId];\n\t\tif (!resolvedAsset?.url) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst pageKeys = group.pageNumbers.map((pageNumber) => ({\n\t\t\tpageNumber,\n\t\t\tcacheKey: buildPdfHydrationKey(group.assetId, pageNumber, group.scale),\n\t\t}));\n\t\tconst pagesToRender: typeof pageKeys = [];\n\t\tfor (const { pageNumber, cacheKey } of pageKeys) {\n\t\t\tconst cachedBlob = options.preferCachedRasters\n\t\t\t\t? await readCachedHydrationBlob(cacheKey)\n\t\t\t\t: null;\n\t\t\tif (cachedBlob) {\n\t\t\t\thydratedPages.set(cacheKey, {\n\t\t\t\t\thref: registerObjectUrl(objectUrls, cachedBlob),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!hydrationSourcePromises.has(cacheKey)) {\n\t\t\t\tpagesToRender.push({ pageNumber, cacheKey });\n\t\t\t}\n\t\t}\n\t\tif (pagesToRender.length > 0) {\n\t\t\tconst renderPromise = (async () => {\n\t\t\t\tconst pdfBlob = await getPdfSourceBlob(resolvedAsset.url);\n\t\t\t\tif (!pdfBlob) {\n\t\t\t\t\treturn new Map<number, HydratedAssetSource | null>();\n\t\t\t\t}\n\t\t\t\tconst renderedPages = await loadPdfToStore(pdfBlob, options.imageStore, {\n\t\t\t\t\tscale: group.scale,\n\t\t\t\t\tpageNumbers: pagesToRender.map(({ pageNumber }) => pageNumber),\n\t\t\t\t\tpageConcurrency: options.pdfPageConcurrency,\n\t\t\t\t});\n\t\t\t\tconst renderedByPage = new Map<number, HydratedAssetSource | null>();\n\t\t\t\tfor (const renderedPage of renderedPages) {\n\t\t\t\t\tconst pageBlob = await options.imageStore.getOriginal(renderedPage.blobId);\n\t\t\t\t\trenderedByPage.set(\n\t\t\t\t\t\trenderedPage.pageNumber,\n\t\t\t\t\t\tpageBlob\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tblob: pageBlob,\n\t\t\t\t\t\t\t\t\twidth: renderedPage.width,\n\t\t\t\t\t\t\t\t\theight: renderedPage.height,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn renderedByPage;\n\t\t\t})();\n\n\t\t\tfor (const { pageNumber, cacheKey } of pagesToRender) {\n\t\t\t\tconst pagePromise = getHydrationSource(\n\t\t\t\t\tcacheKey,\n\t\t\t\t\toptions.preferCachedRasters,\n\t\t\t\t\tasync () => (await renderPromise).get(pageNumber) ?? null,\n\t\t\t\t);\n\t\t\t\thydrationSourcePromises.set(cacheKey, pagePromise);\n\t\t\t}\n\t\t}\n\n\t\tfor (const { cacheKey } of pageKeys) {\n\t\t\tif (hydratedPages.has(cacheKey)) continue;\n\t\t\tconst source = await getHydrationSource(\n\t\t\t\tcacheKey,\n\t\t\t\toptions.preferCachedRasters,\n\t\t\t\tasync () => null,\n\t\t\t);\n\t\t\tif (!source?.blob) continue;\n\t\t\thydratedPages.set(cacheKey, {\n\t\t\t\thref: registerObjectUrl(objectUrls, source.blob),\n\t\t\t\twidth: source.width,\n\t\t\t\theight: source.height,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn hydratedPages;\n}\n\nexport async function hydrateSceneItemsWithAssets(\n\titems: readonly VectorSceneItem[],\n\tassetStore: VectorViewportAssetStore,\n\toptions: HydrateSceneItemsWithAssetsOptions = {},\n): Promise<HydratedSceneItemsWithAssetsResult> {\n\tif (!assetStore.resolve || !assetStore.getHydrationRequest) {\n\t\treturn {\n\t\t\titems: [...items],\n\t\t\tobjectUrls: [],\n\t\t};\n\t}\n\n\tconst pdfScale = options.pdfScale ?? DEFAULT_PDF_SCALE;\n\tconst pdfPageConcurrency =\n\t\toptions.pdfPageConcurrency ?? DEFAULT_PDF_PAGE_CONCURRENCY;\n\tconst preferCachedRasters = options.preferCachedRasters ?? true;\n\tconst imageStore = options.imageStore ?? new IndexedDbImageStore();\n\tconst hydrationRequests = getHydrationRequests(items, assetStore, pdfScale);\n\n\tif (hydrationRequests.length === 0) {\n\t\treturn {\n\t\t\titems: [...items],\n\t\t\tobjectUrls: [],\n\t\t};\n\t}\n\n\tconst assetIds = [\n\t\t...new Set(hydrationRequests.map((entry) => entry.request.assetId)),\n\t];\n\tconst resolvedAssetUrls = await assetStore.resolve({ assetIds });\n\tconst objectUrls: string[] = [];\n\tconst hydratedImages = await hydrateImageAssets(\n\t\thydrationRequests.filter((entry) => entry.request.kind === \"image\"),\n\t\tresolvedAssetUrls,\n\t\tobjectUrls,\n\t\tpreferCachedRasters,\n\t);\n\tconst hydratedPdfPages = await hydratePdfAssets(\n\t\thydrationRequests.filter((entry) => entry.request.kind === \"pdf\"),\n\t\tresolvedAssetUrls,\n\t\tobjectUrls,\n\t\t{\n\t\t\timageStore,\n\t\t\tpdfPageConcurrency,\n\t\t\tpreferCachedRasters,\n\t\t},\n\t);\n\n\treturn {\n\t\titems: items.map((item) => {\n\t\t\tconst request = assetStore.getHydrationRequest?.(item);\n\t\t\tif (!request || item.toolKind !== \"image\") return item;\n\n\t\t\tif (request.kind === \"image\") {\n\t\t\t\tconst hydratedImage = hydratedImages.get(request.assetId);\n\t\t\t\tif (!hydratedImage) return item;\n\t\t\t\treturn rebuildItemSvg({\n\t\t\t\t\t...item,\n\t\t\t\t\timageRasterHref: hydratedImage.href,\n\t\t\t\t\timageThumbnailHref: hydratedImage.href,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (request.pageNumber == null) return item;\n\t\t\tconst hydratedPdfPage = hydratedPdfPages.get(\n\t\t\t\tbuildPdfHydrationKey(\n\t\t\t\t\trequest.assetId,\n\t\t\t\t\trequest.pageNumber,\n\t\t\t\t\trequest.scale ?? pdfScale,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (!hydratedPdfPage) return item;\n\t\t\treturn rebuildItemSvg({\n\t\t\t\t...item,\n\t\t\t\timageRasterHref: hydratedPdfPage.href,\n\t\t\t\timageThumbnailHref: hydratedPdfPage.href,\n\t\t\t\timageIntrinsicSize: {\n\t\t\t\t\twidth:\n\t\t\t\t\t\titem.imageIntrinsicSize?.width ??\n\t\t\t\t\t\tMath.max(1, Math.round(hydratedPdfPage.width ?? item.bounds.width)),\n\t\t\t\t\theight:\n\t\t\t\t\t\titem.imageIntrinsicSize?.height ??\n\t\t\t\t\t\tMath.max(1, Math.round(hydratedPdfPage.height ?? item.bounds.height)),\n\t\t\t\t},\n\t\t\t});\n\t\t}),\n\t\tobjectUrls,\n\t};\n}\n","import { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect, rectsIntersect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"./types\";\n\ntype SpatialIndex = {\n\treadonly cellSize: number;\n\treadonly aabbs: readonly Rect[];\n\treadonly buckets: ReadonlyMap<string, readonly number[]>;\n};\n\nconst spatialIndexCache = new WeakMap<readonly VectorSceneItem[], SpatialIndex>();\n\nfunction cellKey(ix: number, iy: number): string {\n\treturn `${ix},${iy}`;\n}\n\nfunction buildSpatialIndex(\n\titems: readonly VectorSceneItem[],\n\tcellSize: number,\n): SpatialIndex {\n\tconst cached = spatialIndexCache.get(items);\n\tif (cached && cached.cellSize === cellSize) {\n\t\treturn cached;\n\t}\n\n\tconst aabbs: Rect[] = new Array(items.length);\n\tconst buckets = new Map<string, number[]>();\n\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (!item) continue;\n\t\tconst aabb = boundsAabbForRotatedItem(item);\n\t\taabbs[index] = aabb;\n\t\tconst { minIx, maxIx, minIy, maxIy } = cellRangeForRect(aabb, cellSize);\n\t\tfor (let ix = minIx; ix <= maxIx; ix += 1) {\n\t\t\tfor (let iy = minIy; iy <= maxIy; iy += 1) {\n\t\t\t\tconst key = cellKey(ix, iy);\n\t\t\t\tlet bucket = buckets.get(key);\n\t\t\t\tif (!bucket) {\n\t\t\t\t\tbucket = [];\n\t\t\t\t\tbuckets.set(key, bucket);\n\t\t\t\t}\n\t\t\t\tbucket.push(index);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst next: SpatialIndex = {\n\t\tcellSize,\n\t\taabbs,\n\t\tbuckets,\n\t};\n\tspatialIndexCache.set(items, next);\n\treturn next;\n}\n\n/**\n * Axis-aligned cell range (inclusive indices) for a rectangle in a uniform grid.\n */\nfunction cellRangeForRect(\n\tr: Rect,\n\tcellSize: number,\n): {\n\tminIx: number;\n\tmaxIx: number;\n\tminIy: number;\n\tmaxIy: number;\n} {\n\tconst n = normalizeRect(r);\n\tconst x1 = n.x + n.width;\n\tconst y1 = n.y + n.height;\n\tconst minIx = Math.floor(n.x / cellSize);\n\tconst maxIx = Math.max(minIx, Math.ceil(x1 / cellSize) - 1);\n\tconst minIy = Math.floor(n.y / cellSize);\n\tconst maxIy = Math.max(minIy, Math.ceil(y1 / cellSize) - 1);\n\treturn { minIx, maxIx, minIy, maxIy };\n}\n\n/**\n * Viewport cull using a uniform grid: each item is inserted into every cell its bounds\n * overlap. Query walks cells overlapping the viewport, dedupes by id, then applies an exact\n * {@link rectsIntersect} test. Output order matches the original `items` array (z-order).\n *\n * Build cost is O(n × cells per item); query cost is O(viewport cells × bucket size).\n * Use only when {@link items}.length is large enough that this beats a linear scan.\n */\nexport function cullItemsByViewportSpatial(\n\titems: readonly VectorSceneItem[],\n\tvisibleWorld: Rect,\n\tcellSize: number,\n): VectorSceneItem[] {\n\tconst { aabbs, buckets } = buildSpatialIndex(items, cellSize);\n\n\tconst vr = cellRangeForRect(visibleWorld, cellSize);\n\tconst seen = new Set<number>();\n\tconst outIndices: number[] = [];\n\n\tfor (let ix = vr.minIx; ix <= vr.maxIx; ix++) {\n\t\tfor (let iy = vr.minIy; iy <= vr.maxIy; iy++) {\n\t\t\tconst bucket = buckets.get(cellKey(ix, iy));\n\t\t\tif (!bucket) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const index of bucket) {\n\t\t\t\tif (seen.has(index)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseen.add(index);\n\t\t\t\tconst aabb = aabbs[index];\n\t\t\t\tif (aabb && rectsIntersect(aabb, visibleWorld)) {\n\t\t\t\t\toutIndices.push(index);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toutIndices.sort((a, b) => a - b);\n\treturn outIndices.map((index) => items[index]).filter((item) => item != null);\n}\n","import { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { rectsIntersect } from \"../math/rect\";\nimport { cullItemsByViewportSpatial } from \"./spatial-cull\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Below this count, a linear scan is cheaper than building the spatial grid. */\nconst SPATIAL_MIN_ITEMS = 400;\n\n/** World-space cell size for the uniform grid (px in world units). */\nconst SPATIAL_CELL_SIZE = 256;\n\nfunction cullItemsLinear(\n\titems: readonly VectorSceneItem[],\n\tvisibleWorld: Rect,\n): VectorSceneItem[] {\n\treturn items.filter((item) =>\n\t\trectsIntersect(boundsAabbForCull(item), visibleWorld),\n\t);\n}\n\nfunction boundsAabbForCull(item: VectorSceneItem): Rect {\n\treturn boundsAabbForRotatedItem(item);\n}\n\n/**\n * Returns scene items whose `bounds` intersect the visible world rectangle.\n *\n * Uses a uniform grid when there are many items; otherwise a linear filter (faster for\n * small scenes due to grid build overhead).\n */\nexport function cullItemsByViewport(\n\titems: readonly VectorSceneItem[],\n\tvisibleWorld: Rect,\n): VectorSceneItem[] {\n\tif (items.length < SPATIAL_MIN_ITEMS) {\n\t\treturn cullItemsLinear(items, visibleWorld);\n\t}\n\treturn cullItemsByViewportSpatial(items, visibleWorld, SPATIAL_CELL_SIZE);\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect } from \"../math/rect\";\nimport { cullItemsByViewport } from \"../scene/cull\";\nimport type { VectorScene } from \"../scene/scene\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Builds the SVG `transform` attribute for mapping world coordinates to viewport CSS pixels.\n */\nexport function formatCameraTransform(camera: Camera2D): string {\n\tconst z = camera.zoom;\n\treturn `matrix(${z}, 0, 0, ${z}, ${camera.x}, ${camera.y})`;\n}\n\n/**\n * Transform for item `<g>`: `translate(x,y)` plus optional rotation around the bounds center.\n * SVG `rotate` uses degrees.\n */\nexport function formatItemPlacementTransform(item: VectorSceneItem): string {\n\tconst r = normalizeRect(item.bounds);\n\tconst rot = item.rotation ?? 0;\n\tif (Math.abs(rot) < 1e-12) {\n\t\treturn `translate(${item.x}, ${item.y})`;\n\t}\n\tconst deg = (rot * 180) / Math.PI;\n\tconst cx = r.width / 2;\n\tconst cy = r.height / 2;\n\treturn `translate(${item.x}, ${item.y}) translate(${cx}, ${cy}) rotate(${deg}) translate(${-cx}, ${-cy})`;\n}\n\nexport type SvgVectorRendererOptions = {\n\t/** Root element (typically `position: relative` and fixed size). */\n\tcontainer: HTMLElement;\n\tscene: VectorScene;\n\tcamera: Camera2D;\n\t/**\n\t * When true, the scene SVG ignores pointer events so an overlay can own hit-testing\n\t * (interactive selection / resize / placement).\n\t */\n\tpointerEventsNone?: boolean;\n};\n\ntype CachedItemG = {\n\treadonly g: SVGGElement;\n\tlastChildrenSvg: string;\n\tlastTransform: string;\n};\n\n/**\n * Renders vector scene items into a single SVG: camera as an outer `<g>` transform,\n * so geometry stays sharp at any zoom (no fixed-resolution raster).\n *\n * Uses incremental DOM updates: keeps a stable `<g>` per visible item id, updates\n * `innerHTML` only when `childrenSvg` changes, and only adjusts the camera transform\n * when pan/zoom changes without content edits.\n */\nexport class SvgVectorRenderer {\n\tprivate readonly container: HTMLElement;\n\tprivate readonly scene: VectorScene;\n\tprivate readonly camera: Camera2D;\n\tprivate readonly svg: SVGSVGElement;\n\tprivate readonly rootG: SVGGElement;\n\tprivate readonly itemNodeCache = new Map<string, CachedItemG>();\n\tprivate liveOverlay: CachedItemG | null = null;\n\tprivate readonly resizeObserver: ResizeObserver;\n\n\tconstructor(options: SvgVectorRendererOptions) {\n\t\tthis.container = options.container;\n\t\tthis.scene = options.scene;\n\t\tthis.camera = options.camera;\n\n\t\tthis.svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tthis.svg.setAttribute(\"width\", \"100%\");\n\t\tthis.svg.setAttribute(\"height\", \"100%\");\n\t\tthis.svg.setAttribute(\"shape-rendering\", \"geometricPrecision\");\n\t\tthis.svg.style.display = \"block\";\n\t\tthis.svg.setAttribute(\"role\", \"presentation\");\n\t\tthis.svg.setAttribute(\"focusable\", \"false\");\n\t\tthis.setPointerEventsNone(options.pointerEventsNone ?? false);\n\n\t\tthis.rootG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tthis.svg.appendChild(this.rootG);\n\n\t\tthis.container.appendChild(this.svg);\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.render());\n\t\tthis.resizeObserver.observe(this.container);\n\t}\n\n\t/**\n\t * Reads container size, culls items, and updates the SVG (incrementally when possible).\n\t */\n\trender(): void {\n\t\tconst w = this.container.clientWidth;\n\t\tconst h = this.container.clientHeight;\n\t\tif (w <= 0 || h <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.svg.setAttribute(\"viewBox\", `0 0 ${w} ${h}`);\n\t\tthis.svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid slice\");\n\n\t\tconst visible = this.camera.getVisibleWorldRect(w, h);\n\t\tconst items = cullItemsByViewport(this.scene.getItems(), visible);\n\n\t\tthis.syncVisibleItems(items);\n\t\tthis.rootG.setAttribute(\"transform\", formatCameraTransform(this.camera));\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\t/**\n\t * Updates only the in-progress (live) stroke node without re-culling or\n\t * re-syncing the committed scene items. Drawing tools call this on every\n\t * pointer move, so it must stay O(1) regardless of how many items the\n\t * board already contains.\n\t *\n\t * Pass `null` to remove the live overlay (e.g. when the stroke is committed).\n\t */\n\trenderLiveItem(item: VectorSceneItem | null): void {\n\t\tif (!item) {\n\t\t\tif (this.liveOverlay) {\n\t\t\t\tthis.liveOverlay.g.remove();\n\t\t\t\tthis.liveOverlay = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.liveOverlay) {\n\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\tg.setAttribute(\"data-live-overlay\", \"true\");\n\t\t\tthis.liveOverlay = {\n\t\t\t\tg,\n\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\tlastTransform: \"\",\n\t\t\t};\n\t\t\tthis.rootG.appendChild(g);\n\t\t}\n\n\t\tconst cached = this.liveOverlay;\n\t\tconst t = formatItemPlacementTransform(item);\n\t\tif (cached.lastTransform !== t) {\n\t\t\tcached.g.setAttribute(\"transform\", t);\n\t\t\tcached.lastTransform = t;\n\t\t}\n\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\tcached.g.innerHTML = item.childrenSvg;\n\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t}\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\tprivate keepLiveOverlayOnTop(): void {\n\t\tif (this.liveOverlay && this.rootG.lastChild !== this.liveOverlay.g) {\n\t\t\tthis.rootG.appendChild(this.liveOverlay.g);\n\t\t}\n\t}\n\n\tprivate syncVisibleItems(items: readonly VectorSceneItem[]): void {\n\t\tconst visibleIds = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tvisibleIds.add(item.id);\n\t\t}\n\n\t\tfor (const [id, cached] of this.itemNodeCache) {\n\t\t\tif (!visibleIds.has(id)) {\n\t\t\t\tcached.g.remove();\n\t\t\t}\n\t\t}\n\n\t\tlet previousNode: ChildNode | null = null;\n\t\tfor (const item of items) {\n\t\t\tlet cached = this.itemNodeCache.get(item.id);\n\t\t\tif (!cached) {\n\t\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\t\tg.setAttribute(\"data-item-id\", item.id);\n\t\t\t\tcached = {\n\t\t\t\t\tg,\n\t\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\t\tlastTransform: \"\",\n\t\t\t\t};\n\t\t\t\tthis.itemNodeCache.set(item.id, cached);\n\t\t\t}\n\n\t\t\tconst { g } = cached;\n\t\t\tconst t = formatItemPlacementTransform(item);\n\t\t\tif (cached.lastTransform !== t) {\n\t\t\t\tg.setAttribute(\"transform\", t);\n\t\t\t\tcached.lastTransform = t;\n\t\t\t}\n\n\t\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\t\tg.innerHTML = item.childrenSvg;\n\t\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t\t}\n\n\t\t\tconst expectedPosition: ChildNode | null = previousNode\n\t\t\t\t? previousNode.nextSibling\n\t\t\t\t: this.rootG.firstChild;\n\t\t\tif (expectedPosition !== g) {\n\t\t\t\tthis.rootG.insertBefore(g, expectedPosition);\n\t\t\t}\n\t\t\tpreviousNode = g;\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.itemNodeCache.clear();\n\t\tthis.liveOverlay = null;\n\t\tthis.svg.remove();\n\t}\n\n\t/** Toggle whether the scene SVG receives pointer events (vs overlay handling them). */\n\tsetPointerEventsNone(value: boolean): void {\n\t\tthis.svg.style.pointerEvents = value ? \"none\" : \"auto\";\n\t}\n}\n","import {\n\tbuildArrowSvg,\n\tcreateShapeId,\n\trebuildItemSvg,\n\tresolveStrokeStyle,\n} from \"./shape-builders\";\nimport type { VectorSceneItem } from \"./types\";\n\n/**\n * Deep-clones an item with a new id. Rebuilds SVG where the id is embedded (arrow, text, custom).\n */\nexport function cloneVectorSceneItemWithNewId(\n\titem: VectorSceneItem,\n): VectorSceneItem {\n\tconst id = createShapeId();\n\tconst copy = JSON.parse(JSON.stringify(item)) as VectorSceneItem;\n\tlet next: VectorSceneItem = { ...copy, id };\n\tif (next.toolKind === \"arrow\" && next.line) {\n\t\tnext = {\n\t\t\t...next,\n\t\t\tchildrenSvg: buildArrowSvg(id, next.line, resolveStrokeStyle(next)),\n\t\t};\n\t}\n\tif (next.toolKind === \"text\" && next.text !== undefined) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\tif (\n\t\tnext.toolKind === \"custom\" &&\n\t\tnext.customInnerSvg &&\n\t\tnext.customIntrinsicSize\n\t) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\treturn next;\n}\n\nexport function cloneVectorSceneItemsWithNewIds(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\treturn items.map(cloneVectorSceneItemWithNewId);\n}\n","import type { Rect } from \"../math/rect\";\nimport { createCustomShapeItem } from \"./custom-shape\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Plugin key under which link metadata is stored on a link item's `pluginData`. */\nexport const LINK_PLUGIN_KEY = \"canvuLink\";\n\n/**\n * Metadata describing a clickable link/bookmark item.\n * `href` is required; the rest enrich the rendered card (unfurl result).\n */\nexport type CanvuLinkData = {\n\t/** Absolute URL the card points to. */\n\thref: string;\n\t/** Human readable title (falls back to the hostname). */\n\ttitle?: string;\n\t/** Short description shown under the title. */\n\tdescription?: string;\n\t/** Preview image URL (og:image). */\n\timage?: string;\n\t/** Favicon URL shown in the leading badge. */\n\tfavicon?: string;\n};\n\nconst DEFAULT_LINK_CARD_WIDTH = 360;\nconst DEFAULT_LINK_CARD_HEIGHT = 132;\nconst LINK_CARD_BORDER = \"#e2e8f0\";\nconst LINK_CARD_ACCENT = \"#2563eb\";\nconst LINK_CARD_TITLE_COLOR = \"#0f172a\";\nconst LINK_CARD_TEXT_COLOR = \"#475569\";\n\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.min(max, Math.max(min, value));\n\nconst formatNumber = (value: number): string => {\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Object.is(rounded, -0) ? \"0\" : String(rounded);\n};\n\nconst escapeXmlAttribute = (value: string): string =>\n\tvalue\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\")\n\t\t.replaceAll('\"', \""\")\n\t\t.replaceAll(\"'\", \"'\");\n\nconst escapeHtmlText = (value: string): string =>\n\tvalue.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n\nconst getLinkHostname = (href: string): string => {\n\ttry {\n\t\treturn new URL(href).hostname.replace(/^www\\./, \"\");\n\t} catch {\n\t\treturn href;\n\t}\n};\n\ntype LinkTextBand = {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\ttext: string;\n\tfontSize: number;\n\tcolor: string;\n\tfontWeight?: number;\n\tclampLines?: number;\n};\n\nconst buildLinkTextBand = (band: LinkTextBand): string => {\n\tconst lineHeight = band.fontSize * 1.3;\n\tconst weight = band.fontWeight != null ? `font-weight:${band.fontWeight};` : \"\";\n\tconst lineClampStyle = band.clampLines\n\t\t? `display:-webkit-box;-webkit-line-clamp:${band.clampLines};-webkit-box-orient:vertical;`\n\t\t: \"\";\n\treturn `<foreignObject x=\"${formatNumber(band.x)}\" y=\"${formatNumber(band.y)}\" width=\"${formatNumber(Math.max(1, band.width))}\" height=\"${formatNumber(Math.max(1, band.height))}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;font-family:system-ui,sans-serif;font-size:${formatNumber(band.fontSize)}px;line-height:${formatNumber(lineHeight)}px;color:${band.color};overflow:hidden;word-break:break-word;${lineClampStyle}${weight}\">${escapeHtmlText(band.text)}</div></foreignObject>`;\n};\n\n/**\n * Builds the inner SVG (no outer `<svg>`) for a link/bookmark card at the given box size.\n * Uses fixed pixel bands so text never overlaps regardless of the card's aspect ratio.\n */\nexport function buildLinkCardSvg(\n\twidth: number,\n\theight: number,\n\tlink: CanvuLinkData,\n): string {\n\tconst cardWidth = Math.max(1, width);\n\tconst cardHeight = Math.max(1, height);\n\tconst padding = 14;\n\tconst badgeSize = clamp(Math.min(72, cardHeight - padding * 2), 28, 96);\n\tconst textX = padding + badgeSize + 14;\n\tconst textWidth = Math.max(1, cardWidth - textX - padding);\n\tconst hostname = getLinkHostname(link.href);\n\tconst title = link.title?.trim() || hostname || \"Link\";\n\tconst description = link.description?.trim() || link.href;\n\n\tconst titleY = padding;\n\tconst titleHeight = clamp(cardHeight * 0.22, 18, 28);\n\tconst hostY = titleY + titleHeight + 2;\n\tconst hostHeight = 16;\n\tconst descY = hostY + hostHeight + 4;\n\tconst descHeight = Math.max(1, cardHeight - descY - padding);\n\n\tconst badge = link.favicon\n\t\t? `<clipPath id=\"canvu-link-badge\"><rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" /></clipPath>\n\t\t<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"#f8fafc\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" />\n\t\t<image href=\"${escapeXmlAttribute(link.favicon)}\" x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" preserveAspectRatio=\"xMidYMid slice\" clip-path=\"url(#canvu-link-badge)\" />`\n\t\t: `<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"${LINK_CARD_ACCENT}\" fill-opacity=\"0.1\" stroke=\"${LINK_CARD_ACCENT}\" stroke-opacity=\"0.3\" stroke-width=\"1\" />\n\t\t<g transform=\"translate(${formatNumber(padding + badgeSize / 2)},${formatNumber(padding + badgeSize / 2)})\" stroke=\"${LINK_CARD_ACCENT}\" stroke-width=\"2.4\" stroke-linecap=\"round\" fill=\"none\">\n\t\t\t<path d=\"M-9 3 a6 6 0 0 1 0 -8 l4 -4 a6 6 0 0 1 8 8 l-2 2\" />\n\t\t\t<path d=\"M9 -3 a6 6 0 0 1 0 8 l-4 4 a6 6 0 0 1 -8 -8 l2 -2\" />\n\t\t</g>`;\n\n\tconst externalIconX = cardWidth - padding - 16;\n\tconst externalIcon = `<g transform=\"translate(${formatNumber(externalIconX)},${formatNumber(padding)})\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n\t\t<path d=\"M6 1 H11 V6\" />\n\t\t<path d=\"M11 1 L4.5 7.5\" />\n\t\t<path d=\"M9 7 V10 a1 1 0 0 1 -1 1 H2 a1 1 0 0 1 -1 -1 V4 a1 1 0 0 1 1 -1 H5\" />\n\t</g>`;\n\n\treturn `\n\t\t<rect width=\"${formatNumber(cardWidth)}\" height=\"${formatNumber(cardHeight)}\" rx=\"16\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1.5\" />\n\t\t${badge}\n\t\t${externalIcon}\n\t\t${buildLinkTextBand({ x: textX, y: titleY, width: textWidth - 18, height: titleHeight, text: title, fontSize: 15, color: LINK_CARD_TITLE_COLOR, fontWeight: 700, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: hostY, width: textWidth, height: hostHeight, text: hostname, fontSize: 12, color: LINK_CARD_ACCENT, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: descY, width: textWidth, height: descHeight, text: description, fontSize: 12, color: LINK_CARD_TEXT_COLOR, clampLines: 2 })}\n\t`;\n}\n\nconst isCanvuLinkData = (value: unknown): value is CanvuLinkData => {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst candidate = value as Record<string, unknown>;\n\treturn typeof candidate.href === \"string\" && candidate.href.length > 0;\n};\n\n/** Reads the link metadata from an item, or `null` when the item is not a link. */\nexport function getLinkData(item: VectorSceneItem): CanvuLinkData | null {\n\tconst entry = item.pluginData?.[LINK_PLUGIN_KEY];\n\treturn isCanvuLinkData(entry) ? entry : null;\n}\n\n/** True when the item carries link metadata (clickable card). */\nexport function isLinkItem(item: VectorSceneItem): boolean {\n\treturn getLinkData(item) != null;\n}\n\n/**\n * Creates a clickable link/bookmark card item ready to append to the scene.\n * The card resizes by scaling its authored SVG, like other custom shapes.\n */\nexport function createLinkItem(\n\tid: string,\n\tbounds: Rect,\n\tlink: CanvuLinkData,\n): VectorSceneItem {\n\tconst width = bounds.width || DEFAULT_LINK_CARD_WIDTH;\n\tconst height = bounds.height || DEFAULT_LINK_CARD_HEIGHT;\n\tconst item = createCustomShapeItem(\n\t\tid,\n\t\t{ ...bounds, width, height },\n\t\t{ render: (size) => buildLinkCardSvg(size.width, size.height, link) },\n\t);\n\treturn {\n\t\t...item,\n\t\tpluginData: {\n\t\t\t...(item.pluginData ?? {}),\n\t\t\t[LINK_PLUGIN_KEY]: link,\n\t\t},\n\t};\n}\n\n/** Default card size used when placing a new link without explicit bounds. */\nexport const DEFAULT_LINK_CARD_SIZE = {\n\twidth: DEFAULT_LINK_CARD_WIDTH,\n\theight: DEFAULT_LINK_CARD_HEIGHT,\n} as const;\n","import { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport { cloneVectorSceneItemWithNewId } from \"./clone-item\";\nimport type { VectorSceneItem } from \"./types\";\n\nexport const MANAGED_KEY = \"managed\";\n\nconst STACK_GAP_WORLD = 16;\n\nexport function isManagedImage(item: VectorSceneItem): boolean {\n\tconst data = item.pluginData;\n\treturn data != null && (data as { [key: string]: unknown })[MANAGED_KEY] === true;\n}\n\nexport function markImageAsManaged(item: VectorSceneItem): VectorSceneItem {\n\treturn {\n\t\t...item,\n\t\tlocked: true,\n\t\tpluginData: { ...(item.pluginData ?? {}), [MANAGED_KEY]: true },\n\t};\n}\n\n/**\n * Repositions every managed image into a single vertical stack. The stack\n * origin is the current topmost (minimum Y) managed item — that point in world\n * space is stable across reorder/copy/delete operations, so reorder swaps slots\n * instead of making the whole stack drift downward. Subsequent items are\n * centered on the anchor's center X and stacked downward with a fixed gap.\n *\n * Non-managed items keep their position. Call this after any operation that\n * changes the relative order or count of managed images so the canvas reflects\n * the menu order.\n */\nexport function restackManagedImages(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\tlet anchorAabbY = Infinity;\n\tlet anchorCenterX = 0;\n\tfor (const item of items) {\n\t\tif (!isManagedImage(item)) continue;\n\t\tconst aabb = boundsAabbForRotatedItem(item);\n\t\tif (aabb.y < anchorAabbY) {\n\t\t\tanchorAabbY = aabb.y;\n\t\t\tanchorCenterX = aabb.x + aabb.width / 2;\n\t\t}\n\t}\n\tif (!Number.isFinite(anchorAabbY)) return [...items];\n\tlet cursorY = anchorAabbY;\n\treturn items.map((item) => {\n\t\tif (!isManagedImage(item)) return item;\n\t\t// Rotation pivots around the unrotated bounds' center, which is also the\n\t\t// AABB's center. Place the item so its AABB top-left lands at the cursor\n\t\t// centered on the anchor's AABB center X, then advance the cursor by the\n\t\t// AABB height so rotated items push subsequent items down.\n\t\tconst aabb = boundsAabbForRotatedItem(item);\n\t\tconst centerY = cursorY + aabb.height / 2;\n\t\tconst newX = anchorCenterX - item.bounds.width / 2;\n\t\tconst newY = centerY - item.bounds.height / 2;\n\t\tcursorY += aabb.height + STACK_GAP_WORLD;\n\t\tif (item.bounds.x === newX && item.bounds.y === newY) return item;\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: newX,\n\t\t\ty: newY,\n\t\t\tbounds: { ...item.bounds, x: newX, y: newY },\n\t\t};\n\t});\n}\n\n/**\n * Marks `newItem` as a managed image (locked + `pluginData.managed = true`),\n * appends it to `items`, and restacks all managed images so the new one lands\n * at the bottom of the stack with the anchor preserved.\n *\n * Typical usage: after producing scene items with\n * `ingestAssetFilesToSceneItems`, push each result through this helper to add\n * them to the managed-images stack:\n *\n * ```ts\n * let next = doc.items;\n * for (const created of result.items) next = addManagedImage(next, created);\n * doc.onItemsChange(next);\n * ```\n */\nexport function addManagedImage(\n\titems: readonly VectorSceneItem[],\n\tnewItem: VectorSceneItem,\n): VectorSceneItem[] {\n\treturn restackManagedImages([...items, markImageAsManaged(newItem)]);\n}\n\nexport function copyManagedImage(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n): VectorSceneItem[] {\n\tconst idx = items.findIndex((i) => i.id === id);\n\tif (idx < 0) return [...items];\n\tconst source = items[idx];\n\tif (!source) return [...items];\n\tconst clone = markImageAsManaged(cloneVectorSceneItemWithNewId(source));\n\tconst inserted = [...items.slice(0, idx + 1), clone, ...items.slice(idx + 1)];\n\treturn restackManagedImages(inserted);\n}\n\nexport function rotateManagedImage(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n): VectorSceneItem[] {\n\treturn restackManagedImages(\n\t\titems.map((i) =>\n\t\t\ti.id === id\n\t\t\t\t? { ...i, rotation: ((i.rotation ?? 0) + Math.PI / 2) % (Math.PI * 2) }\n\t\t\t\t: i,\n\t\t),\n\t);\n}\n\nexport function deleteManagedImage(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n): VectorSceneItem[] {\n\treturn restackManagedImages(items.filter((i) => i.id !== id));\n}\n\nexport function reorderManagedImages(\n\titems: readonly VectorSceneItem[],\n\torderedManagedIds: readonly string[],\n): VectorSceneItem[] {\n\tconst managedSlots: number[] = [];\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst item = items[i];\n\t\tif (item && isManagedImage(item)) managedSlots.push(i);\n\t}\n\tif (managedSlots.length !== orderedManagedIds.length) {\n\t\treturn [...items];\n\t}\n\tconst byId = new Map(items.map((i) => [i.id, i]));\n\tconst next = [...items];\n\tmanagedSlots.forEach((slot, k) => {\n\t\tconst orderedId = orderedManagedIds[k];\n\t\tif (orderedId === undefined) return;\n\t\tconst replacement = byId.get(orderedId);\n\t\tif (replacement) next[slot] = replacement;\n\t});\n\treturn restackManagedImages(next);\n}\n","import type { VectorSceneItem } from \"./types\";\n\n/**\n * Mutable collection of vector scene items (replace wholesale for simplicity in MVP).\n */\nexport class VectorScene {\n\tprivate items: VectorSceneItem[] = [];\n\n\tgetItems(): readonly VectorSceneItem[] {\n\t\treturn this.items;\n\t}\n\n\t/**\n\t * Replaces the entire scene contents.\n\t */\n\tsetItems(next: readonly VectorSceneItem[]): void {\n\t\tthis.items = [...next];\n\t}\n\n\tclear(): void {\n\t\tthis.items = [];\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/math/rect.ts","../src/camera/camera.ts","../src/image/canvas-encode.ts","../src/image/indexed-db-image-store.ts","../src/image/pdf-loader.ts","../src/image/raster-image.ts","../src/input/pan-momentum.ts","../src/input/apple-pencil-navigation.ts","../src/input/attach-viewport-input.ts","../src/math/item-transform.ts","../src/scene/custom-shape.ts","../src/scene/text-svg.ts","../src/scene/shape-builders.ts","../src/interaction/resize-handles.ts","../src/interaction/arrow-bindings.ts","../src/interaction/hit-test.ts","../src/react/asset-hydration.ts","../src/scene/spatial-cull.ts","../src/scene/cull.ts","../src/renderer/svg-vector-renderer.ts","../src/scene/clone-item.ts","../src/scene/link-item.ts","../src/scene/managed-images.ts","../src/scene/scene.ts"],"names":["d","op","b","s","g","escapeHtmlText"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Axis-aligned rectangle in 2D (world or screen space).\n */\nexport type Rect = {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly width: number;\n\treadonly height: number;\n};\n\n/**\n * Returns whether two axis-aligned rectangles intersect (edges touching count).\n */\nexport function rectsIntersect(a: Rect, b: Rect): boolean {\n\treturn (\n\t\ta.x < b.x + b.width &&\n\t\ta.x + a.width > b.x &&\n\t\ta.y < b.y + b.height &&\n\t\ta.y + a.height > b.y\n\t);\n}\n\n/**\n * Normalizes a rect so width and height are non-negative.\n */\nexport function normalizeRect(r: Rect): Rect {\n\tconst x0 = r.width >= 0 ? r.x : r.x + r.width;\n\tconst y0 = r.height >= 0 ? r.y : r.y + r.height;\n\treturn {\n\t\tx: x0,\n\t\ty: y0,\n\t\twidth: Math.abs(r.width),\n\t\theight: Math.abs(r.height),\n\t};\n}\n","import type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\n\nexport type Camera2DOptions = {\n\t/** Minimum zoom scale (world units per CSS pixel). */\n\tminZoom?: number;\n\t/** Maximum zoom scale. */\n\tmaxZoom?: number;\n};\n\n/**\n * 2D camera: pan (`x`, `y`) in **screen space** (CSS pixels) and uniform zoom `zoom`.\n *\n * Screen mapping: `screen = world * zoom + cameraOffset`\n * (world origin maps to `(x, y)` on screen).\n */\nexport class Camera2D {\n\tx = 0;\n\ty = 0;\n\t/** Scale: world units per CSS pixel (larger = more zoomed in). */\n\tzoom = 1;\n\n\treadonly minZoom: number;\n\treadonly maxZoom: number;\n\n\tconstructor(options: Camera2DOptions = {}) {\n\t\tthis.minZoom = options.minZoom ?? 0.05;\n\t\tthis.maxZoom = options.maxZoom ?? 32;\n\t}\n\n\t/**\n\t * Converts a point from world coordinates to CSS pixel coordinates relative to the viewport top-left.\n\t */\n\tworldToScreen(\n\t\tworldX: number,\n\t\tworldY: number,\n\t): { screenX: number; screenY: number } {\n\t\treturn {\n\t\t\tscreenX: worldX * this.zoom + this.x,\n\t\t\tscreenY: worldY * this.zoom + this.y,\n\t\t};\n\t}\n\n\t/**\n\t * Converts a point from CSS pixel coordinates (viewport-relative) to world coordinates.\n\t */\n\tscreenToWorld(\n\t\tscreenX: number,\n\t\tscreenY: number,\n\t): { worldX: number; worldY: number } {\n\t\tconst z = this.zoom;\n\t\tif (z === 0) {\n\t\t\treturn { worldX: 0, worldY: 0 };\n\t\t}\n\t\treturn {\n\t\t\tworldX: (screenX - this.x) / z,\n\t\t\tworldY: (screenY - this.y) / z,\n\t\t};\n\t}\n\n\t/**\n\t * Sets zoom, clamped to `[minZoom, maxZoom]`, optionally anchoring a screen point so it stays under the cursor.\n\t */\n\tsetZoom(nextZoom: number, anchorScreen?: { x: number; y: number }): void {\n\t\tconst clamped = Math.min(this.maxZoom, Math.max(this.minZoom, nextZoom));\n\t\tif (!anchorScreen) {\n\t\t\tthis.zoom = clamped;\n\t\t\treturn;\n\t\t}\n\t\t// World point under the anchor before changing zoom (using current pan + zoom).\n\t\tconst anchorWorld = this.screenToWorld(anchorScreen.x, anchorScreen.y);\n\t\tthis.zoom = clamped;\n\t\t// screen = world * zoom + offset → offset = screen - world * zoom\n\t\tthis.x = anchorScreen.x - anchorWorld.worldX * this.zoom;\n\t\tthis.y = anchorScreen.y - anchorWorld.worldY * this.zoom;\n\t}\n\n\t/**\n\t * Returns the world-space rectangle visible in a viewport of `viewportWidth` x `viewportHeight` CSS pixels.\n\t */\n\tgetVisibleWorldRect(viewportWidth: number, viewportHeight: number): Rect {\n\t\tconst topLeft = this.screenToWorld(0, 0);\n\t\tconst bottomRight = this.screenToWorld(viewportWidth, viewportHeight);\n\t\treturn normalizeRect({\n\t\t\tx: topLeft.worldX,\n\t\t\ty: topLeft.worldY,\n\t\t\twidth: bottomRight.worldX - topLeft.worldX,\n\t\t\theight: bottomRight.worldY - topLeft.worldY,\n\t\t});\n\t}\n}\n","export type EncodeCanvasToBlobOptions = {\n\tmimeType?: string;\n\tquality?: number;\n\tfallbackMimeTypes?: readonly string[];\n};\n\nconst DEFAULT_FALLBACK_MIME_TYPES = [\"image/png\"] as const;\n\nconst tryCanvasToBlob = (\n\tcanvas: HTMLCanvasElement,\n\tmimeType: string,\n\tquality?: number,\n): Promise<Blob | null> =>\n\tnew Promise((resolve) => {\n\t\tcanvas.toBlob((blob) => resolve(blob), mimeType, quality);\n\t});\n\nconst blobFromDataUrl = async (dataUrl: string): Promise<Blob> => {\n\tconst response = await fetch(dataUrl);\n\tconst blob = await response.blob();\n\tif (blob.size === 0) {\n\t\tthrow new Error(\"Failed to encode canvas to blob\");\n\t}\n\treturn blob;\n};\n\nexport async function encodeCanvasToBlob(\n\tcanvas: HTMLCanvasElement,\n\toptions?: EncodeCanvasToBlobOptions,\n): Promise<Blob> {\n\tconst primaryMimeType = options?.mimeType ?? \"image/png\";\n\tconst quality = options?.quality;\n\tconst mimeTypes = [\n\t\tprimaryMimeType,\n\t\t...(options?.fallbackMimeTypes ?? DEFAULT_FALLBACK_MIME_TYPES),\n\t].filter(\n\t\t(mimeType, index, mimeTypeList) => mimeTypeList.indexOf(mimeType) === index,\n\t);\n\n\tfor (const mimeType of mimeTypes) {\n\t\tconst blob = await tryCanvasToBlob(\n\t\t\tcanvas,\n\t\t\tmimeType,\n\t\t\tmimeType === primaryMimeType ? quality : undefined,\n\t\t);\n\t\tif (blob) {\n\t\t\treturn blob;\n\t\t}\n\t}\n\n\tfor (const mimeType of mimeTypes) {\n\t\tconst dataUrl = canvas.toDataURL(mimeType, quality);\n\t\tif (dataUrl && dataUrl !== \"data:,\") {\n\t\t\treturn blobFromDataUrl(dataUrl);\n\t\t}\n\t}\n\n\tthrow new Error(\"Failed to encode canvas to blob\");\n}\n","import { encodeCanvasToBlob } from \"./canvas-encode\";\n\nconst DB_NAME = \"canvu-image-store\";\nconst DB_VERSION = 1;\n\nfunction openDb(): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(DB_NAME, DB_VERSION);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(\"images\")) {\n\t\t\t\tdb.createObjectStore(\"images\");\n\t\t\t}\n\t\t\tif (!db.objectStoreNames.contains(\"thumbnails\")) {\n\t\t\t\tdb.createObjectStore(\"thumbnails\");\n\t\t\t}\n\t\t};\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction getFromStore(\n\tdb: IDBDatabase,\n\tstoreName: string,\n\tid: string,\n): Promise<Blob | undefined> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(storeName, \"readonly\");\n\t\tconst req = tx.objectStore(storeName).get(id);\n\t\treq.onsuccess = () => resolve(req.result ?? undefined);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction putInStore(\n\tdb: IDBDatabase,\n\tstoreName: string,\n\tid: string,\n\tblob: Blob,\n): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(storeName, \"readwrite\");\n\t\tconst req = tx.objectStore(storeName).put(blob, id);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction deleteFromStore(\n\tdb: IDBDatabase,\n\tstoreName: string,\n\tid: string,\n): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(storeName, \"readwrite\");\n\t\tconst req = tx.objectStore(storeName).delete(id);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction generateBlobId(): string {\n\treturn crypto.randomUUID();\n}\n\nexport class IndexedDbImageStore {\n\tprivate dbPromise: Promise<IDBDatabase> | null = null;\n\n\tprivate getDb(): Promise<IDBDatabase> {\n\t\tif (!this.dbPromise) {\n\t\t\tthis.dbPromise = openDb();\n\t\t}\n\t\treturn this.dbPromise;\n\t}\n\n\tasync storeOriginal(blob: Blob): Promise<string> {\n\t\tconst id = generateBlobId();\n\t\tconst db = await this.getDb();\n\t\tawait putInStore(db, \"images\", id, blob);\n\t\treturn id;\n\t}\n\n\tasync getOriginal(id: string): Promise<Blob | undefined> {\n\t\tconst db = await this.getDb();\n\t\treturn getFromStore(db, \"images\", id);\n\t}\n\n\tasync deleteOriginal(id: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tawait deleteFromStore(db, \"images\", id);\n\t}\n\n\tasync storeThumbnail(blob: Blob): Promise<string> {\n\t\tconst id = generateBlobId();\n\t\tconst db = await this.getDb();\n\t\tawait putInStore(db, \"thumbnails\", id, blob);\n\t\treturn id;\n\t}\n\n\tasync getThumbnail(id: string): Promise<Blob | undefined> {\n\t\tconst db = await this.getDb();\n\t\treturn getFromStore(db, \"thumbnails\", id);\n\t}\n\n\tasync deleteThumbnail(id: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tawait deleteFromStore(db, \"thumbnails\", id);\n\t}\n}\n\nfunction decodeImageToCanvas(\n\tblob: Blob,\n\tmaxDimension?: number,\n): Promise<{ canvas: HTMLCanvasElement; width: number; height: number }> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = new Image();\n\t\timg.onload = () => {\n\t\t\tconst w0 = img.naturalWidth;\n\t\t\tconst h0 = img.naturalHeight;\n\t\t\tif (w0 < 1 || h0 < 1) {\n\t\t\t\treject(new Error(\"Image has no dimensions\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst scale = maxDimension ? Math.min(1, maxDimension / Math.max(w0, h0)) : 1;\n\t\t\tconst cw = Math.max(1, Math.round(w0 * scale));\n\t\t\tconst ch = Math.max(1, Math.round(h0 * scale));\n\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\tcanvas.width = cw;\n\t\t\tcanvas.height = ch;\n\t\t\tconst ctx = canvas.getContext(\"2d\");\n\t\t\tif (!ctx) {\n\t\t\t\treject(new Error(\"Canvas 2D context unavailable\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.imageSmoothingEnabled = true;\n\t\t\tctx.imageSmoothingQuality = \"high\";\n\t\t\tctx.drawImage(img, 0, 0, cw, ch);\n\t\t\tURL.revokeObjectURL(img.src);\n\t\t\tresolve({ canvas, width: cw, height: ch });\n\t\t};\n\t\timg.onerror = () => {\n\t\t\tURL.revokeObjectURL(img.src);\n\t\t\treject(new Error(\"Could not decode image\"));\n\t\t};\n\t\timg.src = URL.createObjectURL(blob);\n\t});\n}\n\nfunction canvasToBlob(\n\tcanvas: HTMLCanvasElement,\n\tmime: string,\n\tquality?: number,\n): Promise<Blob> {\n\treturn encodeCanvasToBlob(canvas, { mimeType: mime, quality });\n}\n\nexport type StoredImageResult = {\n\tblobId: string;\n\tthumbnailBlobId: string;\n\twidth: number;\n\theight: number;\n};\n\n/**\n * Stores an image file in IndexedDB at original resolution and generates a 256px thumbnail.\n * Returns blob IDs that can be referenced from `VectorSceneItem.imageBlobId`.\n */\nexport async function loadImageToStore(\n\tfile: File,\n\tstore: IndexedDbImageStore,\n): Promise<StoredImageResult> {\n\tconst originalBlob = file;\n\tconst blobId = await store.storeOriginal(originalBlob);\n\n\tconst { canvas, width, height } = await decodeImageToCanvas(originalBlob);\n\n\tconst thumbScale = Math.min(1, 256 / Math.max(width, height));\n\tconst tw = Math.max(1, Math.round(width * thumbScale));\n\tconst th = Math.max(1, Math.round(height * thumbScale));\n\tconst thumbCanvas = document.createElement(\"canvas\");\n\tthumbCanvas.width = tw;\n\tthumbCanvas.height = th;\n\tconst tCtx = thumbCanvas.getContext(\"2d\");\n\tif (tCtx) {\n\t\ttCtx.imageSmoothingEnabled = true;\n\t\ttCtx.imageSmoothingQuality = \"high\";\n\t\ttCtx.drawImage(canvas, 0, 0, tw, th);\n\t}\n\tconst thumbBlob = await canvasToBlob(\n\t\tthumbCanvas,\n\t\tfile.type === \"image/jpeg\" || file.type === \"image/jpg\"\n\t\t\t? \"image/jpeg\"\n\t\t\t: \"image/png\",\n\t\tfile.type.startsWith(\"image/jpeg\") ? 0.85 : undefined,\n\t);\n\tconst thumbnailBlobId = await store.storeThumbnail(thumbBlob);\n\n\treturn { blobId, thumbnailBlobId, width, height };\n}\n\n/**\n * Fetches a blob from IndexedDB and creates a session-scoped `blob:` URL.\n * Caller must revoke via `URL.revokeObjectURL` when done.\n */\nexport async function createBlobUrlFromStore(\n\tstore: IndexedDbImageStore,\n\tblobId: string,\n): Promise<string | null> {\n\tconst blob = await store.getOriginal(blobId);\n\tif (!blob) return null;\n\treturn URL.createObjectURL(blob);\n}\n\n/**\n * Creates a `blob:` URL for the thumbnail from IndexedDB.\n */\nexport async function createThumbnailBlobUrlFromStore(\n\tstore: IndexedDbImageStore,\n\tthumbnailBlobId: string,\n): Promise<string | null> {\n\tconst blob = await store.getThumbnail(thumbnailBlobId);\n\tif (!blob) return null;\n\treturn URL.createObjectURL(blob);\n}\n\nexport async function deleteImageFromStore(\n\tstore: IndexedDbImageStore,\n\tblobId: string,\n\tthumbnailBlobId?: string,\n): Promise<void> {\n\tawait store.deleteOriginal(blobId);\n\tif (thumbnailBlobId) {\n\t\tawait store.deleteThumbnail(thumbnailBlobId);\n\t}\n}\n","import { encodeCanvasToBlob } from \"./canvas-encode\";\nimport type {\n\tIndexedDbImageStore,\n\tStoredImageResult,\n} from \"./indexed-db-image-store\";\n\ntype PdfJsLib = typeof import(\"pdfjs-dist\");\n\nlet pdfjsPromise: Promise<PdfJsLib> | null = null;\n\nfunction getPdfJs(): Promise<PdfJsLib> {\n\tif (!pdfjsPromise) {\n\t\tpdfjsPromise = import(\"pdfjs-dist\").then((mod) => {\n\t\t\tconst workerSrc = new URL(\n\t\t\t\t\"pdfjs-dist/build/pdf.worker.min.mjs\",\n\t\t\t\timport.meta.url,\n\t\t\t).toString();\n\t\t\tmod.GlobalWorkerOptions.workerSrc = workerSrc;\n\t\t\treturn mod;\n\t\t});\n\t}\n\treturn pdfjsPromise;\n}\n\nasync function renderPageToCanvas(\n\tpage: import(\"pdfjs-dist\").PDFPageProxy,\n\tscale: number,\n): Promise<{ canvas: HTMLCanvasElement; width: number; height: number }> {\n\tconst raw = page.getViewport({ scale: 1 });\n\tconst adjustedScale = Math.round(raw.width * scale) / raw.width;\n\tconst viewport = page.getViewport({ scale: adjustedScale });\n\tconst w = Math.round(viewport.width);\n\tconst h = Math.round(viewport.height);\n\tconst canvas = document.createElement(\"canvas\");\n\tcanvas.width = w;\n\tcanvas.height = h;\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) throw new Error(\"Canvas 2D context unavailable\");\n\tctx.imageSmoothingEnabled = true;\n\tctx.imageSmoothingQuality = \"high\";\n\tawait page.render({ canvas, viewport }).promise;\n\treturn { canvas, width: w, height: h };\n}\n\ntype PdfPageResult = StoredImageResult & { pageNumber: number };\n\ntype LoadPdfToStoreOptions = {\n\tscale?: number;\n\tpageNumbers?: readonly number[];\n\tpageConcurrency?: number;\n\tstoreThumbnails?: boolean;\n\tonPageStored?: (page: PdfPageResult) => void | Promise<void>;\n};\n\nfunction normalizePdfPageNumbers(\n\tpageNumbers: readonly number[] | undefined,\n\tpageCount: number,\n): number[] {\n\tif (!pageNumbers || pageNumbers.length === 0) {\n\t\treturn Array.from({ length: pageCount }, (_, index) => index + 1);\n\t}\n\n\treturn [...new Set(pageNumbers)]\n\t\t.filter((pageNumber) => pageNumber >= 1 && pageNumber <= pageCount)\n\t\t.sort((left, right) => left - right);\n}\n\nasync function runWithConcurrency<TItem, TResult>(\n\titems: readonly TItem[],\n\tconcurrency: number,\n\texecute: (item: TItem) => Promise<TResult>,\n): Promise<TResult[]> {\n\tconst results = new Array<TResult>(items.length);\n\tlet nextIndex = 0;\n\tconst workerCount = Math.max(1, Math.min(concurrency, items.length));\n\n\tawait Promise.all(\n\t\tArray.from({ length: workerCount }, async () => {\n\t\t\twhile (nextIndex < items.length) {\n\t\t\t\tconst currentIndex = nextIndex;\n\t\t\t\tnextIndex += 1;\n\t\t\t\tconst item = items[currentIndex];\n\t\t\t\tif (item === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresults[currentIndex] = await execute(item);\n\t\t\t}\n\t\t}),\n\t);\n\n\treturn results;\n}\n\n/**\n * Renders each page of a PDF to a bitmap blob, stores original + thumbnail in IndexedDB,\n * and returns the results for creating `VectorSceneItem` entries.\n *\n * Pages are rendered at 1.5× screen DPI by default for crisp zoom.\n */\nexport async function loadPdfToStore(\n\tfile: Blob,\n\tstore: IndexedDbImageStore,\n\toptions?: LoadPdfToStoreOptions,\n): Promise<PdfPageResult[]> {\n\tconst scale = options?.scale ?? 1.5;\n\tconst pageConcurrency = options?.pageConcurrency ?? 2;\n\tconst storeThumbnails = options?.storeThumbnails ?? false;\n\tconst pdfjs = await getPdfJs();\n\tconst arrayBuffer = await file.arrayBuffer();\n\tconst pdf = await pdfjs.getDocument({ data: arrayBuffer }).promise;\n\tconst pageNumbers = normalizePdfPageNumbers(options?.pageNumbers, pdf.numPages);\n\tconst bufferedResults = new Map<number, PdfPageResult>();\n\tlet nextEmitIndex = 0;\n\tlet emitChain = Promise.resolve();\n\n\tconst queuePageEmission = async (pageResult: PdfPageResult) => {\n\t\tbufferedResults.set(pageResult.pageNumber, pageResult);\n\t\tconst run = async () => {\n\t\t\twhile (nextEmitIndex < pageNumbers.length) {\n\t\t\t\tconst nextPageNumber = pageNumbers[nextEmitIndex];\n\t\t\t\tif (nextPageNumber == null) break;\n\t\t\t\tconst bufferedResult = bufferedResults.get(nextPageNumber);\n\t\t\t\tif (!bufferedResult) break;\n\t\t\t\tbufferedResults.delete(nextPageNumber);\n\t\t\t\tnextEmitIndex += 1;\n\t\t\t\tawait options?.onPageStored?.(bufferedResult);\n\t\t\t}\n\t\t};\n\t\tconst nextChain = emitChain.then(run, run);\n\t\temitChain = nextChain.catch(() => {});\n\t\tawait nextChain;\n\t};\n\n\treturn await runWithConcurrency(\n\t\tpageNumbers,\n\t\tpageConcurrency,\n\t\tasync (pageNumber) => {\n\t\t\tconst page = await pdf.getPage(pageNumber);\n\t\t\tconst { canvas, width, height } = await renderPageToCanvas(page, scale);\n\t\t\tconst mime = \"image/png\";\n\t\t\tconst pageBlob = await encodeCanvasToBlob(canvas, { mimeType: mime });\n\t\t\tconst blobId = await store.storeOriginal(pageBlob);\n\t\t\tconst thumbnailBlobId = storeThumbnails\n\t\t\t\t? await (async () => {\n\t\t\t\t\t\tconst thumbScale = Math.min(1, 256 / Math.max(width, height));\n\t\t\t\t\t\tconst tw = Math.max(1, Math.round(width * thumbScale));\n\t\t\t\t\t\tconst th = Math.max(1, Math.round(height * thumbScale));\n\t\t\t\t\t\tconst thumbCanvas = document.createElement(\"canvas\");\n\t\t\t\t\t\tthumbCanvas.width = tw;\n\t\t\t\t\t\tthumbCanvas.height = th;\n\t\t\t\t\t\tconst tCtx = thumbCanvas.getContext(\"2d\");\n\t\t\t\t\t\tif (tCtx) {\n\t\t\t\t\t\t\ttCtx.imageSmoothingEnabled = true;\n\t\t\t\t\t\t\ttCtx.imageSmoothingQuality = \"high\";\n\t\t\t\t\t\t\ttCtx.drawImage(canvas, 0, 0, tw, th);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst thumbBlob = await encodeCanvasToBlob(thumbCanvas, {\n\t\t\t\t\t\t\tmimeType: mime,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn await store.storeThumbnail(thumbBlob);\n\t\t\t\t\t})()\n\t\t\t\t: \"\";\n\t\t\tconst pageResult = {\n\t\t\t\tblobId,\n\t\t\t\tthumbnailBlobId,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tpageNumber,\n\t\t\t};\n\t\t\tawait queuePageEmission(pageResult);\n\t\t\treturn pageResult;\n\t\t},\n\t);\n}\n","/**\n * Embeds the bitmap as a single SVG `<image>` (data URL or blob URL) instead of tracing paths.\n * Avoids huge path counts and keeps screenshots/photos sharp.\n */\n\nimport { encodeCanvasToBlob } from \"./canvas-encode\";\n\n/**\n * Default max width/height (px) before encoding. Larger = sharper zoom / bigger snapshots.\n * Override per app via {@link loadImageFileAsRasterSceneSource} or `VectorViewport` `imageRasterMaxDimension`.\n */\nexport const MAX_RASTER_EMBED_DIMENSION = 4096;\n\n/** How raster pixels are exposed to SVG `<image href>`. */\nexport type RasterEmbedMode = \"dataUrl\" | \"blobUrl\";\n\nexport type LoadRasterImageFileOptions = {\n\t/** Longest edge (px). Images larger than this are scaled down (canvas). */\n\tmaxDimension?: number;\n\t/**\n\t * `dataUrl` — easy to persist (JSON), higher memory use with many large images.\n\t * `blobUrl` — lower overhead; **revoke** URLs when items leave the scene (handled by `VectorViewport` for its own loads).\n\t */\n\tembedMode?: RasterEmbedMode;\n};\n\nfunction normalizeLoadOptions(\n\tmaxDimensionOrOptions?: number | LoadRasterImageFileOptions,\n): Required<Pick<LoadRasterImageFileOptions, \"maxDimension\" | \"embedMode\">> {\n\tif (typeof maxDimensionOrOptions === \"number\") {\n\t\treturn {\n\t\t\tmaxDimension: maxDimensionOrOptions,\n\t\t\tembedMode: \"dataUrl\",\n\t\t};\n\t}\n\treturn {\n\t\tmaxDimension: maxDimensionOrOptions?.maxDimension ?? MAX_RASTER_EMBED_DIMENSION,\n\t\tembedMode: maxDimensionOrOptions?.embedMode ?? \"dataUrl\",\n\t};\n}\n\nfunction loadImageFromObjectUrl(objectUrl: string): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = new Image();\n\t\timg.onload = () => resolve(img);\n\t\timg.onerror = () => reject(new Error(\"Could not decode image\"));\n\t\timg.decoding = \"async\";\n\t\timg.src = objectUrl;\n\t});\n}\n\nfunction canvasToObjectUrl(\n\tcanvas: HTMLCanvasElement,\n\tmime: string,\n\tquality?: number,\n): Promise<string> {\n\treturn encodeCanvasToBlob(canvas, { mimeType: mime, quality }).then((blob) =>\n\t\tURL.createObjectURL(blob),\n\t);\n}\n\nexport type RasterSceneSource = {\n\t/**\n\t * Value for SVG `<image href>`: `data:image/...;base64,...` or `blob:https://...`.\n\t * Despite the name, `blobUrl` mode stores a blob URL here.\n\t */\n\tdataUrl: string;\n\twidth: number;\n\theight: number;\n};\n\n/**\n * Decodes a file and returns a raster source for {@link createImageItem}.\n *\n * - `dataUrl` (default): canvas downscale + base64 (serializable).\n * - `blobUrl`: uses `URL.createObjectURL(file)` at **full resolution** when the longest edge\n * is ≤ `maxDimension`; otherwise downscales like data mode but keeps a blob URL (smaller than base64).\n */\nexport async function loadImageFileAsRasterSceneSource(\n\tfile: File,\n\tmaxDimensionOrOptions?: number | LoadRasterImageFileOptions,\n): Promise<RasterSceneSource> {\n\tconst { maxDimension: maxDim, embedMode } =\n\t\tnormalizeLoadOptions(maxDimensionOrOptions);\n\n\tconst fileObjectUrl = URL.createObjectURL(file);\n\tlet fileUrlReleased = false;\n\ttry {\n\t\tconst img = await loadImageFromObjectUrl(fileObjectUrl);\n\t\tconst w0 = img.naturalWidth;\n\t\tconst h0 = img.naturalHeight;\n\t\tif (w0 < 1 || h0 < 1) {\n\t\t\tthrow new Error(\"Image has no dimensions\");\n\t\t}\n\n\t\tconst scale = Math.min(1, maxDim / Math.max(w0, h0));\n\t\tconst needsDownscale = scale < 1 - 1e-9;\n\n\t\tif (embedMode === \"blobUrl\" && !needsDownscale) {\n\t\t\t// Keep file blob URL; no recompression, full native pixels within cap.\n\t\t\tfileUrlReleased = true;\n\t\t\treturn { dataUrl: fileObjectUrl, width: w0, height: h0 };\n\t\t}\n\n\t\tURL.revokeObjectURL(fileObjectUrl);\n\t\tfileUrlReleased = true;\n\n\t\tconst cw = needsDownscale\n\t\t\t? Math.max(1, Math.round(w0 * scale))\n\t\t\t: Math.max(1, w0);\n\t\tconst ch = needsDownscale\n\t\t\t? Math.max(1, Math.round(h0 * scale))\n\t\t\t: Math.max(1, h0);\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tcanvas.width = cw;\n\t\tcanvas.height = ch;\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tif (!ctx) {\n\t\t\tthrow new Error(\"Canvas 2D context unavailable\");\n\t\t}\n\t\tctx.imageSmoothingEnabled = true;\n\t\tctx.imageSmoothingQuality = \"high\";\n\t\tctx.drawImage(img, 0, 0, cw, ch);\n\n\t\tconst isJpeg =\n\t\t\tfile.type === \"image/jpeg\" ||\n\t\t\tfile.type === \"image/jpg\" ||\n\t\t\tfile.type === \"image/pjpeg\";\n\n\t\tif (embedMode === \"blobUrl\") {\n\t\t\tconst mime = isJpeg ? \"image/jpeg\" : \"image/png\";\n\t\t\tconst blobHref = await canvasToObjectUrl(\n\t\t\t\tcanvas,\n\t\t\t\tmime,\n\t\t\t\tisJpeg ? 0.92 : undefined,\n\t\t\t);\n\t\t\treturn { dataUrl: blobHref, width: cw, height: ch };\n\t\t}\n\n\t\tconst dataUrl = isJpeg\n\t\t\t? canvas.toDataURL(\"image/jpeg\", 0.92)\n\t\t\t: canvas.toDataURL(\"image/png\");\n\t\treturn { dataUrl, width: cw, height: ch };\n\t} catch (e) {\n\t\tif (!fileUrlReleased) {\n\t\t\tURL.revokeObjectURL(fileObjectUrl);\n\t\t}\n\t\tthrow e;\n\t}\n}\n","import type { Camera2D } from \"../camera/camera\";\n\nconst VELOCITY_SAMPLE_WINDOW = 80;\nconst FRICTION = 0.94;\nconst MIN_VELOCITY = 0.3;\n\ntype VelocitySample = { dx: number; dy: number; time: number };\n\nexport type PanMomentumController = {\n\trecordMove: (dx: number, dy: number) => void;\n\tstartMomentum: () => void;\n\tcancel: () => void;\n\treset: () => void;\n};\n\nexport function createPanMomentumController(\n\tcamera: Camera2D,\n\tonUpdate: () => void,\n\tsensitivity: number,\n): PanMomentumController {\n\tconst samples: VelocitySample[] = [];\n\tlet animationFrameId: number | null = null;\n\n\tconst cancel = () => {\n\t\tif (animationFrameId !== null) {\n\t\t\tcancelAnimationFrame(animationFrameId);\n\t\t\tanimationFrameId = null;\n\t\t}\n\t};\n\n\tconst reset = () => {\n\t\tcancel();\n\t\tsamples.length = 0;\n\t};\n\n\tconst recordMove = (dx: number, dy: number) => {\n\t\tconst now = performance.now();\n\t\tsamples.push({ dx, dy, time: now });\n\n\t\tconst cutoff = now - VELOCITY_SAMPLE_WINDOW;\n\t\tlet oldestSample = samples[0];\n\t\twhile (oldestSample && oldestSample.time < cutoff) {\n\t\t\tsamples.shift();\n\t\t\toldestSample = samples[0];\n\t\t}\n\t};\n\n\tconst computeReleaseVelocity = (): { vx: number; vy: number } => {\n\t\tif (samples.length < 2) return { vx: 0, vy: 0 };\n\n\t\tconst first = samples[0];\n\t\tconst last = samples[samples.length - 1];\n\t\tif (!first || !last) return { vx: 0, vy: 0 };\n\t\tconst elapsed = last.time - first.time;\n\t\tif (elapsed < 4) return { vx: 0, vy: 0 };\n\n\t\tlet totalDx = 0;\n\t\tlet totalDy = 0;\n\t\tfor (const sample of samples) {\n\t\t\ttotalDx += sample.dx;\n\t\t\ttotalDy += sample.dy;\n\t\t}\n\n\t\tconst msPerFrame = 1000 / 60;\n\t\treturn {\n\t\t\tvx: (totalDx / elapsed) * msPerFrame * sensitivity,\n\t\t\tvy: (totalDy / elapsed) * msPerFrame * sensitivity,\n\t\t};\n\t};\n\n\tconst startMomentum = () => {\n\t\tcancel();\n\t\tconst { vx, vy } = computeReleaseVelocity();\n\t\tsamples.length = 0;\n\n\t\tif (Math.abs(vx) < MIN_VELOCITY && Math.abs(vy) < MIN_VELOCITY) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentVx = vx;\n\t\tlet currentVy = vy;\n\n\t\tconst animate = () => {\n\t\t\tcurrentVx *= FRICTION;\n\t\t\tcurrentVy *= FRICTION;\n\n\t\t\tif (Math.abs(currentVx) < MIN_VELOCITY && Math.abs(currentVy) < MIN_VELOCITY) {\n\t\t\t\tanimationFrameId = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcamera.x += currentVx;\n\t\t\tcamera.y += currentVy;\n\t\t\tonUpdate();\n\t\t\tanimationFrameId = requestAnimationFrame(animate);\n\t\t};\n\n\t\tanimationFrameId = requestAnimationFrame(animate);\n\t};\n\n\treturn { recordMove, startMomentum, cancel, reset };\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nconst DRAWING_LIKE_TOOLS = new Set([\n\t\"draw\",\n\t\"marker\",\n\t\"annotate\",\n\t\"pen\",\n\t\"highlight\",\n\t\"rect\",\n\t\"ellipse\",\n\t\"line\",\n\t\"arrow\",\n\t\"text\",\n\t\"image\",\n]);\n\nexport type ApplePencilNavOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Current tool id from your app (e.g. `\"hand\"` vs `\"draw\"`). */\n\tgetCurrentToolId: () => string;\n\tonUpdate: () => void;\n\ttouchPanSensitivity?: number;\n};\n\n/**\n * After a **stylus** (`pointerType === \"pen\"`) has been used, finger touches on the canvas\n * pan/pinch the camera instead of passing through to drawing tools — similar to iPad behavior\n * in many design apps. No-op until the first pen contact.\n *\n * Compose with {@link attachViewportInput} by calling this **after** it so capture handlers run first,\n * or use only one of them depending on product needs.\n */\nexport function attachApplePencilNavigation(\n\toptions: ApplePencilNavOptions,\n): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tgetCurrentToolId,\n\t\tonUpdate,\n\t\ttouchPanSensitivity = 1.25,\n\t} = options;\n\n\tlet penDetected = false;\n\tconst activePenPointerIds = new Set<number>();\n\tconst blockedTouchPointerIds = new Set<number>();\n\tconst pointers = new Map<number, { x: number; y: number }>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: { x: number; y: number } | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst shouldIntercept = (e: PointerEvent): boolean => {\n\t\tif (e.pointerType !== \"touch\") return false;\n\t\tconst tool = getCurrentToolId();\n\t\tif (tool === \"hand\") return true;\n\t\treturn penDetected && DRAWING_LIKE_TOOLS.has(tool);\n\t};\n\n\tconst dist = (a: { x: number; y: number }, b: { x: number; y: number }) =>\n\t\tMath.hypot(b.x - a.x, b.y - a.y);\n\n\tconst mid = (a: { x: number; y: number }, b: { x: number; y: number }) => ({\n\t\tx: (a.x + b.x) / 2,\n\t\ty: (a.y + b.y) / 2,\n\t});\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tpenDetected = true;\n\t\t\tactivePenPointerIds.add(e.pointerId);\n\t\t\tpointers.clear();\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.cancel();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"touch\" && activePenPointerIds.size > 0) {\n\t\t\tblockedTouchPointerIds.add(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!shouldIntercept(e)) return;\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tif (pointers.size === 1) {\n\t\t\tmode = \"pan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\tcamera,\n\t\t\t\tonUpdate,\n\t\t\t\ttouchPanSensitivity,\n\t\t\t);\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = dist(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = mid(a, b);\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"idle\" || !pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst d = dist(a, b);\n\t\t\tconst m = mid(a, b);\n\t\t\tconst scale = d / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: m.x - rect.left,\n\t\t\t\ty: m.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tcamera.x += m.x - panLast.x;\n\t\t\t\tcamera.y += m.y - panLast.y;\n\t\t\t\tpanLast = m;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tactivePenPointerIds.delete(e.pointerId);\n\t\t\treturn;\n\t\t}\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\tblockedTouchPointerIds.delete(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst r = Array.from(pointers.values())[0];\n\t\t\tpanLast = r ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\telement.addEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\telement.addEventListener(\"pointermove\", onPointerMove, { capture: true });\n\telement.addEventListener(\"pointerup\", onPointerUp, { capture: true });\n\telement.addEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\t\telement.removeEventListener(\"pointermove\", onPointerMove, { capture: true });\n\t\telement.removeEventListener(\"pointerup\", onPointerUp, { capture: true });\n\t\telement.removeEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\t};\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nexport type ViewportInputOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Called after any camera mutation so the renderer can redraw. */\n\tonUpdate: () => void;\n\t/**\n\t * Element to attach the wheel listener to. Defaults to `element`.\n\t * Useful when an overlay with `pointer-events: auto` sits above `element` and\n\t * would otherwise intercept wheel events before they reach the scene container.\n\t */\n\twheelElement?: HTMLElement;\n\twheelPanSensitivity?: number;\n\t/** Multiplier applied to wheel delta for zoom (with Ctrl/Meta). */\n\twheelZoomSensitivity?: number;\n\ttouchPanSensitivity?: number;\n\t/**\n\t * When `true`, pointer events with `pointerType === \"touch\"` are ignored so another layer\n\t * (e.g. `attachApplePencilNavigation`) can handle them without double panning.\n\t */\n\ttouchHandledElsewhere?: boolean;\n\t/**\n\t * When `false`, one-finger / primary-button drag does **not** pan the camera (e.g. shape tools).\n\t * Wheel zoom and two-finger pinch still work.\n\t */\n\tallowPrimaryPointerPan?: () => boolean;\n};\n\ntype PointerRecord = { x: number; y: number };\n\nfunction distanceBetween(a: PointerRecord, b: PointerRecord): number {\n\tconst dx = b.x - a.x;\n\tconst dy = b.y - a.y;\n\treturn Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction midpoint(a: PointerRecord, b: PointerRecord): PointerRecord {\n\treturn { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n}\n\n/** Normalize wheel delta so zoom speed is similar across mice (lines) and trackpads (pixels). */\nfunction wheelDeltaPixels(delta: number, deltaMode: number): number {\n\tswitch (deltaMode) {\n\t\tcase WheelEvent.DOM_DELTA_LINE:\n\t\t\treturn delta * 16;\n\t\tcase WheelEvent.DOM_DELTA_PAGE:\n\t\t\treturn delta * 400;\n\t\tdefault:\n\t\t\treturn delta;\n\t}\n}\n\n// Trackpad fires many small deltas; mouse wheels fire one big delta per click.\n// Pass small deltas through so trackpad feel is preserved; soften large ones.\nconst TRACKPAD_MAX_DELTA = 20;\nconst MOUSE_WHEEL_DAMPING = 0.4;\n\nfunction softenWheelDelta(d: number): number {\n\tconst a = Math.abs(d);\n\tif (a <= TRACKPAD_MAX_DELTA) return d;\n\treturn (\n\t\tMath.sign(d) *\n\t\t(TRACKPAD_MAX_DELTA + (a - TRACKPAD_MAX_DELTA) * MOUSE_WHEEL_DAMPING)\n\t);\n}\n\n/**\n * Attaches wheel (pan / Ctrl+zoom), pointer drag pan, and two-finger pinch zoom.\n * Uses `touch-action: none` on `element` — set that in CSS on the same node.\n *\n * @returns A dispose function that removes all listeners.\n */\nexport function attachViewportInput(options: ViewportInputOptions): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tonUpdate,\n\t\twheelElement,\n\t\twheelPanSensitivity = 0.5,\n\t\twheelZoomSensitivity = 0.0015,\n\t\ttouchPanSensitivity = 1.25,\n\t\ttouchHandledElsewhere = false,\n\t\tallowPrimaryPointerPan = () => true,\n\t} = options;\n\n\tconst wheelTarget = wheelElement ?? element;\n\n\tconst pointers = new Map<number, PointerRecord>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" | \"mousePan\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: PointerRecord | null = null;\n\tlet mousePanButton: number | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst onWheel = (e: WheelEvent) => {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tconst dy = wheelDeltaPixels(e.deltaY, e.deltaMode);\n\t\t\t// Trackpad generates very small deltas (1-5px) vs mouse (100-200px).\n\t\t\t// Normalize so both feel responsive: amplify small deltas (trackpad).\n\t\t\tconst normDy = Math.abs(dy) < TRACKPAD_MAX_DELTA ? dy * 12 : dy;\n\t\t\tconst factor = Math.exp(-normDy * wheelZoomSensitivity);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * factor, {\n\t\t\t\tx: e.clientX - rect.left,\n\t\t\t\ty: e.clientY - rect.top,\n\t\t\t});\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst panDx = softenWheelDelta(wheelDeltaPixels(e.deltaX, e.deltaMode));\n\t\tconst panDy = softenWheelDelta(wheelDeltaPixels(e.deltaY, e.deltaMode));\n\t\tcamera.x -= (panDx * wheelPanSensitivity) / camera.zoom;\n\t\tcamera.y -= (panDy * wheelPanSensitivity) / camera.zoom;\n\t\tonUpdate();\n\t};\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\t\tconst panOk = allowPrimaryPointerPan();\n\t\tif (e.pointerType === \"mouse\" && e.button === 0) {\n\t\t\tif (!panOk) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmousePanButton = 0;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"mouse\" && e.button === 1) {\n\t\t\tmousePanButton = 1;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (pointers.size === 1 && e.pointerType === \"touch\") {\n\t\t\tif (panOk) {\n\t\t\t\tmode = \"pan\";\n\t\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\t\tcamera,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\ttouchPanSensitivity,\n\t\t\t\t);\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = distanceBetween(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = midpoint(a, b);\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\" && panLast && mousePanButton !== null) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx;\n\t\t\tcamera.y += dy;\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst dist = distanceBetween(a, b);\n\t\t\tconst mid = midpoint(a, b);\n\t\t\tconst scale = dist / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: mid.x - rect.left,\n\t\t\t\ty: mid.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tconst dx = mid.x - panLast.x;\n\t\t\t\tconst dy = mid.y - panLast.y;\n\t\t\t\tcamera.x += dx;\n\t\t\t\tcamera.y += dy;\n\t\t\t\tpanLast = mid;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\") {\n\t\t\tif (e.pointerType === \"mouse\" && e.button === mousePanButton) {\n\t\t\t\tmode = \"idle\";\n\t\t\t\tpanLast = null;\n\t\t\t\tmousePanButton = null;\n\t\t\t\ttry {\n\t\t\t\t\telement.releasePointerCapture(e.pointerId);\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore */\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst remaining = Array.from(pointers.values())[0];\n\t\t\tpanLast = remaining ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst onPointerCancel = (e: PointerEvent) => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\tonPointerUp(e);\n\t};\n\n\twheelTarget.addEventListener(\"wheel\", onWheel, { passive: false });\n\telement.addEventListener(\"pointerdown\", onPointerDown);\n\telement.addEventListener(\"pointermove\", onPointerMove);\n\telement.addEventListener(\"pointerup\", onPointerUp);\n\telement.addEventListener(\"pointercancel\", onPointerCancel);\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\twheelTarget.removeEventListener(\"wheel\", onWheel);\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown);\n\t\telement.removeEventListener(\"pointermove\", onPointerMove);\n\t\telement.removeEventListener(\"pointerup\", onPointerUp);\n\t\telement.removeEventListener(\"pointercancel\", onPointerCancel);\n\t};\n}\n","import type { VectorSceneItem } from \"../scene/types\";\nimport type { Rect } from \"./rect\";\nimport { normalizeRect } from \"./rect\";\n\n/** Rotation in radians; `undefined` / `0` means no rotation. */\nexport function getItemRotationRad(item: VectorSceneItem): number {\n\treturn item.rotation ?? 0;\n}\n\n/**\n * Converts a point in item **local** space (origin top-left, 0…w × 0…h) to world,\n * with rotation around the box center.\n */\nexport function itemLocalToWorld(\n\tlx: number,\n\tly: number,\n\titemX: number,\n\titemY: number,\n\tw: number,\n\th: number,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst c = { x: w / 2, y: h / 2 };\n\tconst dlx = lx - c.x;\n\tconst dly = ly - c.y;\n\tconst cos = Math.cos(rotationRad);\n\tconst sin = Math.sin(rotationRad);\n\treturn {\n\t\tx: itemX + c.x + cos * dlx - sin * dly,\n\t\ty: itemY + c.y + sin * dlx + cos * dly,\n\t};\n}\n\n/**\n * Inverse of {@link itemLocalToWorld}.\n */\nexport function worldToItemLocal(\n\twx: number,\n\twy: number,\n\titemX: number,\n\titemY: number,\n\tw: number,\n\th: number,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst c = { x: w / 2, y: h / 2 };\n\tconst vx = wx - itemX;\n\tconst vy = wy - itemY;\n\tconst dx = vx - c.x;\n\tconst dy = vy - c.y;\n\tconst cos = Math.cos(-rotationRad);\n\tconst sin = Math.sin(-rotationRad);\n\tconst lx = cos * dx - sin * dy;\n\tconst ly = sin * dx + cos * dy;\n\treturn { x: c.x + lx, y: c.y + ly };\n}\n\n/** World-space center of the item’s unrotated bounds (rotation pivot). */\nexport function itemPivotWorld(item: VectorSceneItem): { x: number; y: number } {\n\tconst r = normalizeRect(item.bounds);\n\treturn { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n}\n\n/** Axis-aligned bounding box in world space that contains the rotated rectangle. */\nexport function boundsAabbForRotatedItem(item: VectorSceneItem): Rect {\n\tconst rot = getItemRotationRad(item);\n\tif (Math.abs(rot) < 1e-12 && item.bounds.width >= 0 && item.bounds.height >= 0) {\n\t\treturn item.bounds;\n\t}\n\tconst r = normalizeRect(item.bounds);\n\tif (Math.abs(rot) < 1e-12) {\n\t\treturn r;\n\t}\n\tconst corners: [number, number][] = [\n\t\t[0, 0],\n\t\t[r.width, 0],\n\t\t[r.width, r.height],\n\t\t[0, r.height],\n\t];\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const [lx, ly] of corners) {\n\t\tconst p = itemLocalToWorld(lx, ly, item.x, item.y, r.width, r.height, rot);\n\t\tminX = Math.min(minX, p.x);\n\t\tminY = Math.min(minY, p.y);\n\t\tmaxX = Math.max(maxX, p.x);\n\t\tmaxY = Math.max(maxY, p.y);\n\t}\n\treturn { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Width/height of the shape’s local drawing box (same as `bounds` at creation). */\nexport type CustomShapeSize = { width: number; height: number };\n\n/**\n * How to build the inner SVG (inside the item’s bounding box).\n *\n * - **`svg`**: paste-friendly markup. Use `{{w}}`, `{{h}}`, `{{width}}`, or `{{height}}` where the size should go.\n * - **`render`**: a small function when you prefer code over a string template.\n */\nexport type CreateCustomShapeContent =\n\t| {\n\t\t\t/**\n\t\t\t * SVG fragment for `<g>` contents (no outer `<svg>`). Placeholders are replaced with numeric sizes:\n\t\t\t * `{{w}}`, `{{h}}`, `{{width}}`, `{{height}}`.\n\t\t\t */\n\t\t\tsvg: string;\n\t }\n\t| {\n\t\t\t/** Returns inner SVG for the given box size (same coordinate range as `bounds`). */\n\t\t\trender: (size: CustomShapeSize) => string;\n\t };\n\n/**\n * Replaces `{{w}}`, `{{h}}`, `{{width}}`, and `{{height}}` in a string with the given dimensions.\n * Use this if you build SVG strings yourself and want the same rules as {@link createCustomShapeItem}.\n */\nexport function expandCustomShapeTemplate(\n\ttemplate: string,\n\twidth: number,\n\theight: number,\n): string {\n\treturn template\n\t\t.replace(/\\{\\{w\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{h\\}\\}/g, String(height))\n\t\t.replace(/\\{\\{width\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{height\\}\\}/g, String(height));\n}\n\nfunction resolveCustomInner(\n\tcontent: CreateCustomShapeContent,\n\tsize: CustomShapeSize,\n): string {\n\tif (\"render\" in content) {\n\t\treturn content.render(size);\n\t}\n\treturn expandCustomShapeTemplate(content.svg, size.width, size.height);\n}\n\n/**\n * Builds the scaled `<g>` wrapper used for `childrenSvg` on custom shapes that support resize.\n */\nexport function buildCustomShapeChildrenSvg(\n\tinner: string,\n\tintrinsic: CustomShapeSize,\n\tbounds: Rect,\n): string {\n\tconst b = normalizeRect(bounds);\n\tconst sx = b.width / intrinsic.width;\n\tconst sy = b.height / intrinsic.height;\n\treturn `<g transform=\"scale(${sx},${sy})\">${inner}</g>`;\n}\n\n/**\n * Creates a user-defined shape from SVG markup or a `render` callback.\n *\n * Coordinates are **local**: draw from `(0,0)` to `(width, height)` of `bounds`. The library stores an\n * intrinsic copy so resize handles (when interactive) scale the drawing uniformly.\n *\n * @example\n * ```ts\n * const star = createCustomShapeItem(createShapeId(), rect, {\n * svg: `<polygon points=\"...\" fill=\"gold\" stroke=\"#b45309\" stroke-width=\"2\" />`,\n * });\n * ```\n *\n * @example Template (good for copy-paste from design tools)\n * ```ts\n * createCustomShapeItem(id, rect, {\n * svg: `<rect width=\"{{w}}\" height=\"{{h}}\" rx=\"8\" fill=\"#e0e7ff\" stroke=\"#6366f1\" />`,\n * });\n * ```\n */\nexport function createCustomShapeItem(\n\tid: string,\n\tbounds: Rect,\n\tcontent: CreateCustomShapeContent,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst intrinsic: CustomShapeSize = { width: r.width, height: r.height };\n\tconst inner = resolveCustomInner(content, intrinsic);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"custom\",\n\t\tcustomIntrinsicSize: intrinsic,\n\t\tcustomInnerSvg: inner,\n\t\tchildrenSvg: buildCustomShapeChildrenSvg(inner, intrinsic, r),\n\t};\n}\n","/**\n * Escape text for use inside SVG `<text>` / `<tspan>` (not full XML attribute context).\n */\nexport function escapeSvgTextContent(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Escape for plain text inside HTML `foreignObject` body (not attribute). */\nfunction escapeHtmlText(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Default body font size for vector text (local SVG units). */\nexport const DEFAULT_TEXT_FONT_SIZE = 18;\n/** Default font size used when the text tool creates a new text item. */\nexport const DEFAULT_TEXT_TOOL_FONT_SIZE = 28;\n/**\n * Sophisticated sans-serif used for both canvas text rendering and inline editing.\n * Inter is loaded by host apps (e.g. demo/index.html); system-ui fallback keeps the canvas\n * usable when the webfont hasn't loaded yet.\n */\nexport const TEXT_FONT_FAMILY =\n\t\"Inter, -apple-system, BlinkMacSystemFont, ui-sans-serif, system-ui, sans-serif\";\nconst LINE_HEIGHT_RATIO = 22 / 18;\n/**\n * Where the first text baseline sits, expressed in font-size units. Picked so\n * the SVG glyph and the inline-edit textarea agree visually (the textarea's\n * natural first-line baseline lands at this same y when padded by\n * {@link EDIT_TOP_PAD_RATIO}). See {@link TextEditOverlay} for the matching\n * inset.\n */\nconst FIRST_LINE_BASELINE_RATIO = 20 / 18;\n/** Textarea top inset (font-size units) that lines up with the SVG baseline. */\nexport const EDIT_TOP_PAD_RATIO = 4 / 18;\n/** Extra space below the descender so glyphs aren't clipped at the bounds. */\nconst BOTTOM_PAD_RATIO = 4 / 18;\nconst PLACEHOLDER = \"Tap to type\";\n\nconst MIN_TEXT_BOX_W = 40;\nconst MIN_TEXT_BOX_H = 26;\n/** Horizontal padding in local space (matches `<text x=\"4\">`). */\nconst TEXT_PAD_X = 4;\nconst MAX_TEXT_MEASURE_CACHE_ENTRIES = 2000;\n\nlet sharedMeasureContext: CanvasRenderingContext2D | null | undefined;\nconst textMeasureCache = new Map<string, { width: number; height: number }>();\n\nfunction getSharedMeasureContext(): CanvasRenderingContext2D | null {\n\tif (sharedMeasureContext !== undefined) {\n\t\treturn sharedMeasureContext;\n\t}\n\tif (typeof document === \"undefined\") {\n\t\tsharedMeasureContext = null;\n\t\treturn sharedMeasureContext;\n\t}\n\tconst canvas = document.createElement(\"canvas\");\n\tsharedMeasureContext = canvas.getContext(\"2d\");\n\treturn sharedMeasureContext;\n}\n\nfunction textMeasureCacheKey(content: string, fontSize: number): string {\n\treturn `${fontSize}\\n${content}`;\n}\n\nfunction cacheMeasuredBounds(\n\tkey: string,\n\tbounds: { width: number; height: number },\n): void {\n\tif (textMeasureCache.size >= MAX_TEXT_MEASURE_CACHE_ENTRIES) {\n\t\ttextMeasureCache.clear();\n\t}\n\ttextMeasureCache.set(key, bounds);\n}\n\nfunction lineHeightFor(fontSize: number): number {\n\treturn fontSize * LINE_HEIGHT_RATIO;\n}\n\nfunction firstLineBaselineY(fontSize: number): number {\n\treturn fontSize * FIRST_LINE_BASELINE_RATIO;\n}\n\n/** Public version used by callers that need the same baseline as SVG rendering. */\nexport function textBaselineYFor(fontSize: number): number {\n\treturn firstLineBaselineY(fontSize);\n}\n\n/** Public version used by callers that need the same line height as SVG rendering. */\nexport function textLineHeightFor(fontSize: number): number {\n\treturn lineHeightFor(fontSize);\n}\n\n/**\n * Local width/height for a text item so bounds match rendered SVG (no fixed max width).\n * Uses canvas measureText when `document` is available; rough fallback otherwise.\n */\nexport function measureTextBoundsLocal(\n\tcontent: string,\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): {\n\twidth: number;\n\theight: number;\n} {\n\tconst cacheKey = textMeasureCacheKey(content, fontSize);\n\tconst cached = textMeasureCache.get(cacheKey);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst lh = lineHeightFor(fontSize);\n\tconst baselineY = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tconst lines = trimmed.length === 0 ? [PLACEHOLDER] : content.split(\"\\n\");\n\n\tlet maxInnerW = 0;\n\tconst ctx = getSharedMeasureContext();\n\tif (ctx) {\n\t\tctx.font = `${fontSize}px ${TEXT_FONT_FAMILY}`;\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, ctx.measureText(toMeasure).width);\n\t\t}\n\t}\n\tif (maxInnerW === 0) {\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, toMeasure.length * fontSize * 0.52);\n\t\t}\n\t}\n\n\tconst minW = Math.max(MIN_TEXT_BOX_W, TEXT_PAD_X * 2 + fontSize);\n\tconst width = Math.max(minW, TEXT_PAD_X * 2 + maxInnerW);\n\tconst height = Math.max(\n\t\tMIN_TEXT_BOX_H,\n\t\tbaselineY + (lines.length - 1) * lh + Math.max(4, fontSize * BOTTOM_PAD_RATIO),\n\t);\n\tconst measured = { width, height };\n\tcacheMeasuredBounds(cacheKey, measured);\n\treturn measured;\n}\n\n/**\n * Builds SVG `<text>` markup for a text box in local coordinates [0, w] × [0, h].\n * @param fillColor — Text fill (defaults to blue-gray placeholder / blue body).\n */\nexport function buildTextSvg(\n\tcontent: string,\n\t_width: number,\n\t_height: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst lh = lineHeightFor(fontSize);\n\tconst y0 = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tif (trimmed.length === 0) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"#94a3b8\" font-style=\"italic\">${escapeSvgTextContent(PLACEHOLDER)}</text>`;\n\t}\n\n\tconst lines = content.split(\"\\n\");\n\tif (lines.length === 1) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${escapeSvgTextContent(lines[0] ?? \"\")}</text>`;\n\t}\n\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i] ?? \"\";\n\t\tif (i === 0) {\n\t\t\tparts.push(`<tspan x=\"4\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t} else {\n\t\t\tparts.push(`<tspan x=\"4\" dy=\"${lh}\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t}\n\t}\n\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${parts.join(\"\")}</text>`;\n}\n\n/**\n * Text that wraps inside a fixed rectangle (after user resize). Uses `foreignObject` + XHTML\n * so wrapping matches browser layout.\n */\nexport function buildTextFixedBoundsSvg(\n\tcontent: string,\n\twidth: number,\n\theight: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst w = Math.max(1, width);\n\tconst h = Math.max(1, height);\n\tconst lh = lineHeightFor(fontSize);\n\tconst trimmed = content.trim();\n\tconst padTop = EDIT_TOP_PAD_RATIO * fontSize;\n\tif (trimmed.length === 0) {\n\t\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:#94a3b8;font-style:italic\">${escapeHtmlText(PLACEHOLDER)}</div></foreignObject>`;\n\t}\n\tconst body = escapeHtmlText(content);\n\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:${fillColor}\">${body}</div></foreignObject>`;\n}\n","import type { StrokeOptions } from \"perfect-freehand\";\nimport getStroke from \"perfect-freehand\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport { buildCustomShapeChildrenSvg } from \"./custom-shape\";\nimport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n} from \"./text-svg\";\nimport type {\n\tArrowBindings,\n\tLineEndpointsLocal,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"./types\";\n\nexport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n};\n\n/**\n * While inline-editing: sync bounds to draft width/height and hide SVG so only the textarea shows text.\n */\nexport function applyTextDraftWhileEditing(\n\titem: VectorSceneItem,\n\tdraft: string,\n): VectorSceneItem {\n\tif (item.toolKind !== \"text\") return item;\n\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tif (item.textFixedBounds) {\n\t\treturn {\n\t\t\t...item,\n\t\t\ttext: draft,\n\t\t\tchildrenSvg: \"\",\n\t\t};\n\t}\n\tconst m = measureTextBoundsLocal(draft, fs);\n\treturn {\n\t\t...item,\n\t\ttext: draft,\n\t\tbounds: {\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t},\n\t\tchildrenSvg: \"\",\n\t};\n}\n\n/** Stroke dash pattern for freehand drawings. `solid` = perfect-freehand fill; `dashed` = centerline stroke with dashes. */\nexport type StrokeDash = \"solid\" | \"dashed\";\n\n/** Resolved stroke for SVG generation. */\nexport type StrokeStyle = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: StrokeDash;\n};\n\nexport const DEFAULT_STROKE_STYLE: StrokeStyle = {\n\tstroke: \"#1d1d1d\",\n\tstrokeWidth: 2,\n};\n\nconst TOOL_FREEHAND_DEFAULTS: Record<\n\t\"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tPartial<StrokeStyle>\n> = {\n\tdraw: { strokeWidth: 10 },\n\tpencil: { strokeWidth: 3 },\n\tbrush: { strokeWidth: 10 },\n\tmarker: { stroke: \"#fde047\", strokeWidth: 16, strokeOpacity: 0.5 },\n};\n\nfunction perfectFreehandOptions(\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstyle: StrokeStyle,\n\tstrokeComplete: boolean,\n\tpressureAware = false,\n): StrokeOptions {\n\tconst sw = style.strokeWidth;\n\tconst base: StrokeOptions = {\n\t\tlast: strokeComplete,\n\t\tsimulatePressure: true,\n\t};\n\tif (toolKind === \"draw\" || toolKind === \"pencil\") {\n\t\tif (pressureAware && toolKind === \"draw\") {\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tsize: Math.max(2, sw * 1.05),\n\t\t\t\tthinning: 0.42,\n\t\t\t\tsmoothing: 0.78,\n\t\t\t\tstreamline: 0.62,\n\t\t\t\tsimulatePressure: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(2, sw * 1.18),\n\t\t\tthinning: 0.12,\n\t\t\tsmoothing: 0.85,\n\t\t\tstreamline: 0.78,\n\t\t\tsimulatePressure: true,\n\t\t};\n\t}\n\tif (toolKind === \"brush\") {\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(4, sw * 1.22),\n\t\t\tthinning: 0.52,\n\t\t\tsmoothing: 0.64,\n\t\t\tstreamline: 0.68,\n\t\t};\n\t}\n\treturn {\n\t\t...base,\n\t\tsize: Math.max(6, sw * 1.08),\n\t\tthinning: 0.08,\n\t\tsmoothing: 0.88,\n\t\tstreamline: 0.84,\n\t\tsimulatePressure: true,\n\t};\n}\n\nexport function resolveStrokeStyle(item: VectorSceneItem): StrokeStyle {\n\treturn {\n\t\tstroke: item.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\tstrokeWidth: item.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\tstrokeOpacity: item.strokeOpacity,\n\t\tstrokeDash: item.strokeDash,\n\t};\n}\n\nfunction strokeOpacityAttr(style: StrokeStyle): string {\n\treturn style.strokeOpacity != null\n\t\t? ` stroke-opacity=\"${style.strokeOpacity}\"`\n\t\t: \"\";\n}\n\nfunction svgNumber(value: number): string {\n\tif (!Number.isFinite(value)) return \"0\";\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Number.isInteger(rounded) ? String(rounded) : String(rounded);\n}\n\nconst ARCHITECTURAL_CLOUD_RADIUS = 38;\nconst ARCHITECTURAL_CLOUD_TARGET_SPACING = 50;\nconst ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO = 0.38;\nconst ARCHITECTURAL_CLOUD_ROUNDED_RADIUS = 72;\nconst ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS = 44;\nconst ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING = 98;\n\ntype CloudPoint = readonly [number, number];\n\ntype CloudPathSegment = {\n\tlength: number;\n\tpointAt: (t: number) => CloudPoint;\n};\n\nfunction architecturalCloudCenterCount(edgeLength: number, radius: number): number {\n\tconst targetSpacing = Math.min(\n\t\tARCHITECTURAL_CLOUD_TARGET_SPACING,\n\t\tMath.max(1, radius * 1.3),\n\t);\n\treturn Math.max(2, Math.round(edgeLength / targetSpacing) + 1);\n}\n\nfunction distributeRange(start: number, end: number, count: number): number[] {\n\tif (count <= 1) return [start];\n\tconst step = (end - start) / (count - 1);\n\treturn Array.from({ length: count }, (_, index) => start + step * index);\n}\n\nfunction lineCloudPathSegment(start: CloudPoint, end: CloudPoint): CloudPathSegment {\n\tconst dx = end[0] - start[0];\n\tconst dy = end[1] - start[1];\n\tconst length = Math.hypot(dx, dy);\n\treturn {\n\t\tlength,\n\t\tpointAt: (t) => [start[0] + dx * t, start[1] + dy * t],\n\t};\n}\n\nfunction ellipsePoint(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tangle: number,\n): CloudPoint {\n\treturn [centerX + Math.cos(angle) * radiusX, centerY + Math.sin(angle) * radiusY];\n}\n\nfunction approximateEllipseArcLength(\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): number {\n\tconst steps = Math.max(\n\t\t4,\n\t\tMath.ceil(Math.abs(endAngle - startAngle) / (Math.PI / 16)),\n\t);\n\tlet length = 0;\n\tlet previous = ellipsePoint(0, 0, radiusX, radiusY, startAngle);\n\tfor (let index = 1; index <= steps; index += 1) {\n\t\tconst angle = startAngle + ((endAngle - startAngle) * index) / steps;\n\t\tconst next = ellipsePoint(0, 0, radiusX, radiusY, angle);\n\t\tlength += Math.hypot(next[0] - previous[0], next[1] - previous[1]);\n\t\tprevious = next;\n\t}\n\treturn length;\n}\n\nfunction ellipseCloudPathSegment(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): CloudPathSegment {\n\treturn {\n\t\tlength: approximateEllipseArcLength(radiusX, radiusY, startAngle, endAngle),\n\t\tpointAt: (t) =>\n\t\t\tellipsePoint(\n\t\t\t\tcenterX,\n\t\t\t\tcenterY,\n\t\t\t\tradiusX,\n\t\t\t\tradiusY,\n\t\t\t\tstartAngle + (endAngle - startAngle) * t,\n\t\t\t),\n\t};\n}\n\nfunction cloudPathPerimeter(segments: CloudPathSegment[]): number {\n\tconst usableSegments = segments.filter((segment) => segment.length > 1e-9);\n\treturn usableSegments.reduce((sum, segment) => sum + segment.length, 0);\n}\n\nfunction pointOnCloudPath(\n\tsegments: CloudPathSegment[],\n\tdistance: number,\n): CloudPoint {\n\tconst perimeter = cloudPathPerimeter(segments);\n\tif (perimeter <= 0) return [0, 0];\n\n\tlet remaining = ((distance % perimeter) + perimeter) % perimeter;\n\tfor (const segment of segments) {\n\t\tif (segment.length <= 1e-9) continue;\n\t\tif (remaining <= segment.length) {\n\t\t\tconst t = remaining / segment.length;\n\t\t\treturn segment.pointAt(t);\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\n\tconst fallback = segments.find((segment) => segment.length > 1e-9);\n\treturn fallback?.pointAt(0) ?? [0, 0];\n}\n\nfunction buildRoundedCapsulePathSegments(\n\twidth: number,\n\theight: number,\n\tinset: number,\n): CloudPathSegment[] {\n\tconst left = inset;\n\tconst top = inset;\n\tconst right = width - inset;\n\tconst bottom = height - inset;\n\tconst capsuleWidth = Math.max(0, right - left);\n\tconst capsuleHeight = Math.max(0, bottom - top);\n\tconst radius = Math.min(capsuleWidth, capsuleHeight) / 2;\n\tif (radius <= 0) return [];\n\n\tconst leftCenterX = left + radius;\n\tconst rightCenterX = right - radius;\n\tconst topCenterY = top + radius;\n\tconst bottomCenterY = bottom - radius;\n\n\treturn [\n\t\tlineCloudPathSegment([leftCenterX, top], [rightCenterX, top]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t-Math.PI / 2,\n\t\t\t0,\n\t\t),\n\t\tlineCloudPathSegment([right, topCenterY], [right, bottomCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t),\n\t\tlineCloudPathSegment([rightCenterX, bottom], [leftCenterX, bottom]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI / 2,\n\t\t\tMath.PI,\n\t\t),\n\t\tlineCloudPathSegment([left, bottomCenterY], [left, topCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI,\n\t\t\tMath.PI * 1.5,\n\t\t),\n\t];\n}\n\nfunction buildRoundedArcCloudPathD(\n\tcloudWidth: number,\n\tcloudHeight: number,\n\tcenter: CloudPoint,\n): string {\n\tconst minDimension = Math.min(cloudWidth, cloudHeight);\n\tconst radius = Math.min(\n\t\tARCHITECTURAL_CLOUD_ROUNDED_RADIUS,\n\t\tMath.max(ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS, minDimension * 0.16),\n\t);\n\tconst centerPath = buildRoundedCapsulePathSegments(\n\t\tcloudWidth,\n\t\tcloudHeight,\n\t\tradius,\n\t);\n\tconst centerPerimeter = cloudPathPerimeter(centerPath);\n\tif (centerPerimeter <= 0) return \"\";\n\n\tconst lobeCount = Math.max(\n\t\t8,\n\t\tMath.round(centerPerimeter / ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING),\n\t);\n\tconst centers = Array.from({ length: lobeCount }, (_, index) =>\n\t\tpointOnCloudPath(centerPath, (centerPerimeter * index) / lobeCount),\n\t);\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudCircleIntersection(previous, point, radius, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\nfunction cloudCircleIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradius: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst midX = (a[0] + b[0]) / 2;\n\tconst midY = (a[1] + b[1]) / 2;\n\tconst dx = b[0] - a[0];\n\tconst dy = b[1] - a[1];\n\tconst distance = Math.hypot(dx, dy);\n\tif (distance <= 1e-9) return [midX, midY];\n\n\tconst halfDistance = distance / 2;\n\tconst offset = Math.sqrt(\n\t\tMath.max(0, radius * radius - halfDistance * halfDistance),\n\t);\n\tconst normalX = -dy / distance;\n\tconst normalY = dx / distance;\n\tconst first: [number, number] = [midX + normalX * offset, midY + normalY * offset];\n\tconst second: [number, number] = [\n\t\tmidX - normalX * offset,\n\t\tmidY - normalY * offset,\n\t];\n\tconst firstDistance =\n\t\t(first[0] - center[0]) * (first[0] - center[0]) +\n\t\t(first[1] - center[1]) * (first[1] - center[1]);\n\tconst secondDistance =\n\t\t(second[0] - center[0]) * (second[0] - center[0]) +\n\t\t(second[1] - center[1]) * (second[1] - center[1]);\n\treturn firstDistance >= secondDistance ? first : second;\n}\n\nfunction cloudEllipseIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradiusX: number,\n\tradiusY: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst scaleY = radiusX / radiusY;\n\tconst [x, y] = cloudCircleIntersection(\n\t\t[a[0], a[1] * scaleY],\n\t\t[b[0], b[1] * scaleY],\n\t\tradiusX,\n\t\t[center[0], center[1] * scaleY],\n\t);\n\treturn [x, y / scaleY];\n}\n\nexport function buildRectSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<rect width=\"${width}\" height=\"${height}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" rx=\"4\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildEllipseSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst rx = width / 2;\n\tconst ry = height / 2;\n\treturn `<ellipse cx=\"${rx}\" cy=\"${ry}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\n/**\n * Returns the local SVG path for a scalable architectural revision cloud.\n *\n * Use this low-level helper when you need to preview or inspect the shape without\n * creating a full scene item. Prefer {@link createArchitecturalCloudItem} when\n * adding a cloud to a `VectorSceneItem[]`, because it keeps `toolKind`, bounds,\n * stroke fields, and `childrenSvg` synchronized for editing.\n *\n * @example\n * ```ts\n * const d = buildArchitecturalCloudPathD(180, 90);\n * ```\n */\nexport function buildArchitecturalCloudPathD(\n\twidth: number,\n\theight: number,\n\tstrokeWidth = DEFAULT_STROKE_STYLE.strokeWidth,\n): string {\n\tconst w = Math.max(0, width);\n\tconst h = Math.max(0, height);\n\tif (w <= 0 || h <= 0) return \"\";\n\n\tconst padding = Math.max(0, strokeWidth * 2);\n\tconst cloudWidth = Math.max(0, w - padding);\n\tconst cloudHeight = Math.max(0, h - padding);\n\tif (cloudWidth <= 0 || cloudHeight <= 0) return \"\";\n\n\tconst radiusX = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudWidth * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tconst radiusY = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudHeight * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tif (radiusX <= 0 || radiusY <= 0) return \"\";\n\n\tconst center: CloudPoint = [cloudWidth / 2, cloudHeight / 2];\n\tconst leftCenterX = radiusX;\n\tconst rightCenterX = cloudWidth - radiusX;\n\tconst topCenterY = radiusY;\n\tconst bottomCenterY = cloudHeight - radiusY;\n\tconst horizontalCenters = distributeRange(\n\t\tleftCenterX,\n\t\trightCenterX,\n\t\tarchitecturalCloudCenterCount(Math.max(0, rightCenterX - leftCenterX), radiusX),\n\t);\n\tconst verticalCenters = distributeRange(\n\t\ttopCenterY,\n\t\tbottomCenterY,\n\t\tarchitecturalCloudCenterCount(Math.max(0, bottomCenterY - topCenterY), radiusY),\n\t);\n\tif (horizontalCenters.length > 3 && verticalCenters.length > 3) {\n\t\tconst roundedArcCloudPath = buildRoundedArcCloudPathD(\n\t\t\tcloudWidth,\n\t\t\tcloudHeight,\n\t\t\tcenter,\n\t\t);\n\t\tif (roundedArcCloudPath !== \"\") return roundedArcCloudPath;\n\t}\n\tconst rectangularCenters: CloudPoint[] = [\n\t\t...horizontalCenters.map((x) => [x, topCenterY] as const),\n\t\t...verticalCenters.slice(1).map((y) => [rightCenterX, y] as const),\n\t\t...horizontalCenters\n\t\t\t.slice(0, -1)\n\t\t\t.reverse()\n\t\t\t.map((x) => [x, bottomCenterY] as const),\n\t\t...verticalCenters\n\t\t\t.slice(1, -1)\n\t\t\t.reverse()\n\t\t\t.map((y) => [leftCenterX, y] as const),\n\t];\n\tconst centers = rectangularCenters;\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudEllipseIntersection(previous, point, radiusX, radiusY, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\n/**\n * Builds an SVG fragment for an architectural revision cloud outline.\n *\n * This is the renderer-level primitive behind the built-in `\"architectural-cloud\"`\n * tool. Prefer {@link createArchitecturalCloudItem} for app code that inserts a\n * normal editable scene item.\n */\nexport function buildArchitecturalCloudSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst d = buildArchitecturalCloudPathD(width, height, style.strokeWidth);\n\treturn `<path d=\"${d}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildLineSvg(\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${line.x2}\" y2=\"${line.y2}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\nexport type StraightArrowGeometry = {\n\tshaftEndX: number;\n\tshaftEndY: number;\n\theadTipX: number;\n\theadTipY: number;\n\theadLeftX: number;\n\theadLeftY: number;\n\theadRightX: number;\n\theadRightY: number;\n};\n\nexport function computeStraightArrowGeometry(\n\tline: LineEndpointsLocal,\n\tstrokeWidth: number,\n): StraightArrowGeometry | null {\n\tconst dx = line.x2 - line.x1;\n\tconst dy = line.y2 - line.y1;\n\tconst len = Math.hypot(dx, dy);\n\tif (len < 1e-6) return null;\n\tconst ux = dx / len;\n\tconst uy = dy / len;\n\tconst headLength = Math.min(Math.max(strokeWidth * 4.2, 12), len * 0.38);\n\tconst headAngle = Math.PI / 6;\n\tconst cos = Math.cos(headAngle);\n\tconst sin = Math.sin(headAngle);\n\tconst rx1 = ux * cos - uy * sin;\n\tconst ry1 = ux * sin + uy * cos;\n\tconst rx2 = ux * cos + uy * sin;\n\tconst ry2 = -ux * sin + uy * cos;\n\treturn {\n\t\tshaftEndX: line.x2,\n\t\tshaftEndY: line.y2,\n\t\theadTipX: line.x2,\n\t\theadTipY: line.y2,\n\t\theadLeftX: line.x2 - rx1 * headLength,\n\t\theadLeftY: line.y2 - ry1 * headLength,\n\t\theadRightX: line.x2 - rx2 * headLength,\n\t\theadRightY: line.y2 - ry2 * headLength,\n\t};\n}\n\nexport function buildArrowSvg(\n\titemId: string,\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tvoid itemId;\n\tconst geometry = computeStraightArrowGeometry(line, style.strokeWidth);\n\tif (!geometry) {\n\t\treturn buildLineSvg(line, style);\n\t}\n\tconst op = strokeOpacityAttr(style);\n\treturn `\n\t\t<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${geometry.shaftEndX}\" y2=\"${geometry.shaftEndY}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\"${op} />\n\t\t<path d=\"M ${geometry.headLeftX} ${geometry.headLeftY} L ${geometry.headTipX} ${geometry.headTipY} L ${geometry.headRightX} ${geometry.headRightY}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op} />\n\t`;\n}\n\nexport function buildDrawDotSvg(\n\tr: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst op =\n\t\tstyle.strokeOpacity != null ? ` fill-opacity=\"${style.strokeOpacity}\"` : \"\";\n\treturn `<circle cx=\"${r}\" cy=\"${r}\" r=\"${r}\" fill=\"${style.stroke}\" shape-rendering=\"geometricPrecision\"${op} />`;\n}\n\n/** Structured result for React overlays; scene uses {@link buildFreehandPathSvg} string. */\nexport type FreehandSvgPayload =\n\t| {\n\t\t\tkind: \"circle\";\n\t\t\tcx: number;\n\t\t\tcy: number;\n\t\t\tr: number;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"fillPath\";\n\t\t\td: string;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"strokePath\";\n\t\t\td: string;\n\t\t\tstroke: string;\n\t\t\tstrokeWidth: number;\n\t\t\tstrokeOpacity?: number;\n\t\t\tstrokeDasharray?: string;\n\t };\n\nfunction dashArrayForDrawStroke(strokeWidth: number): string {\n\tconst dash = Math.max(strokeWidth * 1.8, 4);\n\tconst gap = Math.max(strokeWidth * 1.4, 3);\n\treturn `${dash} ${gap}`;\n}\n\nfunction buildSmoothedCenterlinePath(\n\tpoints: readonly { x: number; y: number }[],\n): string | null {\n\tif (points.length < 2) return null;\n\tconst first = points[0];\n\tif (!first) return null;\n\tlet d = `M ${first.x} ${first.y}`;\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst a = points[i];\n\t\tconst b = points[i + 1];\n\t\tif (!a || !b) continue;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\td += ` Q ${a.x} ${a.y} ${midX} ${midY}`;\n\t}\n\tconst last = points[points.length - 1];\n\tif (last) {\n\t\td += ` L ${last.x} ${last.y}`;\n\t}\n\treturn d;\n}\n\n/**\n * Computes freehand geometry (perfect-freehand + fallback). Used by {@link buildFreehandPathSvg}\n * and React overlays without `dangerouslySetInnerHTML`.\n */\nexport function computeFreehandSvgPayload(\n\tpathPointsLocal: readonly VectorPathPoint[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): FreehandSvgPayload | null {\n\tif (pathPointsLocal.length === 0) return null;\n\tif (pathPointsLocal.length === 1) {\n\t\tconst p = pathPointsLocal[0];\n\t\tif (!p) return null;\n\t\treturn {\n\t\t\tkind: \"circle\",\n\t\t\tcx: p.x,\n\t\t\tcy: p.y,\n\t\t\tr: Math.max(0.5, style.strokeWidth / 2),\n\t\t\tfill: style.stroke,\n\t\t\tfillOpacity: style.strokeOpacity,\n\t\t};\n\t}\n\tif (\n\t\tstyle.strokeDash === \"dashed\" &&\n\t\t(toolKind === \"draw\" || toolKind === \"pencil\")\n\t) {\n\t\tconst d = buildSmoothedCenterlinePath(pathPointsLocal);\n\t\tif (!d) return null;\n\t\treturn {\n\t\t\tkind: \"strokePath\",\n\t\t\td,\n\t\t\tstroke: style.stroke,\n\t\t\tstrokeWidth: style.strokeWidth,\n\t\t\tstrokeOpacity: style.strokeOpacity,\n\t\t\tstrokeDasharray: dashArrayForDrawStroke(style.strokeWidth),\n\t\t};\n\t}\n\tconst hasPressure = pathPointsLocal.some(\n\t\t(p) => p.pressure != null && Number.isFinite(p.pressure),\n\t);\n\tconst input = hasPressure\n\t\t? pathPointsLocal.map(\n\t\t\t\t(p) =>\n\t\t\t\t\t[p.x, p.y, Math.min(1, Math.max(0, p.pressure ?? 0.5))] as [\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t],\n\t\t\t)\n\t\t: pathPointsLocal.map((p) => [p.x, p.y] as [number, number]);\n\tconst stroke = getStroke(\n\t\tinput,\n\t\tperfectFreehandOptions(toolKind, style, strokeComplete, hasPressure),\n\t);\n\tif (stroke.length < 3) return null;\n\tconst first = stroke[0];\n\tif (!first) return null;\n\tlet d = `M ${first[0]} ${first[1]} Q`;\n\tfor (let i = 0; i < stroke.length; i++) {\n\t\tconst a = stroke[i];\n\t\tconst b = stroke[(i + 1) % stroke.length];\n\t\tif (!a || !b) continue;\n\t\td += ` ${a[0]} ${a[1]} ${(a[0] + b[0]) / 2} ${(a[1] + b[1]) / 2}`;\n\t}\n\td += \" Z\";\n\treturn {\n\t\tkind: \"fillPath\",\n\t\td,\n\t\tfill: style.stroke,\n\t\tfillOpacity: style.strokeOpacity,\n\t};\n}\n\nfunction freehandPayloadToSvgString(payload: FreehandSvgPayload): string {\n\tif (payload.kind === \"circle\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<circle cx=\"${payload.cx}\" cy=\"${payload.cy}\" r=\"${payload.r}\" fill=\"${payload.fill}\" shape-rendering=\"geometricPrecision\"${op} />`;\n\t}\n\tif (payload.kind === \"fillPath\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<path d=\"${payload.d}\" fill=\"${payload.fill}\" fill-rule=\"nonzero\" stroke=\"none\"${op} shape-rendering=\"geometricPrecision\" />`;\n\t}\n\tconst op = strokeOpacityAttr({\n\t\tstroke: payload.stroke,\n\t\tstrokeWidth: payload.strokeWidth,\n\t\tstrokeOpacity: payload.strokeOpacity,\n\t});\n\tconst dash = payload.strokeDasharray\n\t\t? ` stroke-dasharray=\"${payload.strokeDasharray}\"`\n\t\t: \"\";\n\treturn `<path d=\"${payload.d}\" fill=\"none\" stroke=\"${payload.stroke}\" stroke-width=\"${payload.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op}${dash} />`;\n}\n\n/**\n * Freehand stroke in local coordinates using [perfect-freehand](https://github.com/steveruizok/perfect-freehand)\n * (filled outline, tapered caps — similar spirit to tldraw / Excalidraw ink).\n */\nexport function buildFreehandPathSvg(\n\tpathPointsLocal: readonly { x: number; y: number }[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): string {\n\tconst payload = computeFreehandSvgPayload(\n\t\tpathPointsLocal,\n\t\tstyle,\n\t\ttoolKind,\n\t\tstrokeComplete,\n\t);\n\tif (!payload) return \"\";\n\treturn freehandPayloadToSvgString(payload);\n}\n\n/**\n * Creates a new unique id for a shape (for `VectorSceneItem.id` when adding from code or API).\n */\nexport function createShapeId(): string {\n\tconst uid =\n\t\ttypeof crypto !== \"undefined\" && crypto.randomUUID\n\t\t\t? crypto.randomUUID()\n\t\t\t: String(Date.now());\n\treturn `user-shape-${uid}`;\n}\n\n/**\n * Converts line segment endpoints from **world** coordinates to **local** coordinates\n * (origin = top-left of `bounds`). Use with {@link createLineItem}.\n */\nexport function lineEndpointsToLocal(\n\tbounds: Rect,\n\tworldEndA: { x: number; y: number },\n\tworldEndB: { x: number; y: number },\n): LineEndpointsLocal {\n\tconst b = normalizeRect(bounds);\n\treturn {\n\t\tx1: worldEndA.x - b.x,\n\t\ty1: worldEndA.y - b.y,\n\t\tx2: worldEndB.x - b.x,\n\t\ty2: worldEndB.y - b.y,\n\t};\n}\n\n/**\n * Rebuilds the SVG fragment (`childrenSvg`) from geometry + stroke fields (after edits or resize).\n */\nexport function rebuildItemSvg(item: VectorSceneItem): VectorSceneItem {\n\tconst style = resolveStrokeStyle(item);\n\tconst k = item.toolKind;\n\n\tif (k === \"rect\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRectSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"ellipse\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildEllipseSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"architectural-cloud\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildArchitecturalCloudSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif ((k === \"line\" || k === \"arrow\") && item.line) {\n\t\tconst line = item.line;\n\t\tconst childrenSvg =\n\t\t\tk === \"arrow\"\n\t\t\t\t? buildArrowSvg(item.id, line, style)\n\t\t\t\t: buildLineSvg(line, style);\n\t\treturn { ...item, childrenSvg };\n\t}\n\tif (k === \"text\" && item.text !== undefined) {\n\t\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\t\tif (item.textFixedBounds) {\n\t\t\tconst b = normalizeRect(item.bounds);\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: b.x,\n\t\t\t\ty: b.y,\n\t\t\t\tbounds: b,\n\t\t\t\tchildrenSvg: buildTextFixedBoundsSvg(\n\t\t\t\t\titem.text,\n\t\t\t\t\tb.width,\n\t\t\t\t\tb.height,\n\t\t\t\t\tstyle.stroke,\n\t\t\t\t\tfs,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tconst m = measureTextBoundsLocal(item.text, fs);\n\t\tconst b = normalizeRect({\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t});\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildTextSvg(item.text, b.width, b.height, style.stroke, fs),\n\t\t};\n\t}\n\tif (\n\t\t(k === \"draw\" || k === \"pencil\" || k === \"brush\" || k === \"marker\") &&\n\t\titem.pathPointsLocal &&\n\t\titem.pathPointsLocal.length > 0\n\t) {\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildFreehandPathSvg(item.pathPointsLocal, style, k),\n\t\t};\n\t}\n\tif (k === \"draw\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\tconst r = Math.min(b.width, b.height) / 2;\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildDrawDotSvg(r, style),\n\t\t};\n\t}\n\tif (k === \"image\" && item.imageRasterHref && item.imageIntrinsicSize) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\titem.imageRasterHref,\n\t\t\t\titem.imageIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\tif (k === \"custom\" && item.customIntrinsicSize && item.customInnerSvg) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildCustomShapeChildrenSvg(\n\t\t\t\titem.customInnerSvg,\n\t\t\t\titem.customIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\n\treturn item;\n}\n\n/** Updates stroke color / width / opacity and refreshes the item’s SVG. */\nexport function applyStrokeToItem(\n\titem: VectorSceneItem,\n\tpatch: Partial<\n\t\tPick<\n\t\t\tVectorSceneItem,\n\t\t\t\"stroke\" | \"strokeWidth\" | \"strokeOpacity\" | \"strokeDash\" | \"textFontSize\"\n\t\t>\n\t>,\n): VectorSceneItem {\n\treturn rebuildItemSvg({ ...item, ...patch });\n}\n\n/** Creates a rectangle shape ready to append to your scene `items` array. */\nexport function createRectangleItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"rect\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an ellipse shape. */\nexport function createEllipseItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"ellipse\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/**\n * Creates an architectural revision cloud shape.\n *\n * Use this high-level builder when adding the built-in cloud shape from code or\n * from custom integrations. It creates an editable `VectorSceneItem` with\n * `toolKind: \"architectural-cloud\"`, so resize, stroke styling, selection, and\n * serialization continue to work like the built-in rectangle and ellipse tools.\n *\n * @example\n * ```ts\n * const cloud = createArchitecturalCloudItem(createShapeId(), {\n * x: 40,\n * y: 30,\n * width: 180,\n * height: 90,\n * });\n * ```\n */\nexport function createArchitecturalCloudItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"architectural-cloud\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates a straight line or arrow; `line` is usually from {@link lineEndpointsToLocal}. */\nexport function createLineItem(\n\tid: string,\n\tbounds: Rect,\n\tline: LineEndpointsLocal,\n\ttoolKind: \"line\" | \"arrow\",\n\tstyle?: Partial<StrokeStyle>,\n\tarrowBind?: ArrowBindings,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind,\n\t\tline: { ...line },\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(arrowBind ? { arrowBind } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** “Draw dot” tool: a small filled circle at (`worldX`, `worldY`). */\nexport function createDrawDotItem(\n\tid: string,\n\tworldX: number,\n\tworldY: number,\n\tradius: number,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: worldX - radius,\n\t\ty: worldY - radius,\n\t\tbounds: {\n\t\t\tx: worldX - radius,\n\t\t\ty: worldY - radius,\n\t\t\twidth: radius * 2,\n\t\t\theight: radius * 2,\n\t\t},\n\t\ttoolKind: \"draw\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an editable text box (`stroke` is used as text fill). */\nexport function createTextItem(\n\tid: string,\n\tbounds: Rect,\n\ttext = \"\",\n\tstyle?: Partial<StrokeStyle>,\n\ttextFontSize?: number,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"text\",\n\t\ttext,\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(textFontSize != null ? { textFontSize } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Freehand stroke from world-space points (main pen or marker highlight). */\nexport function createFreehandStrokeItem(\n\tid: string,\n\tpointsWorld: readonly VectorPathPoint[],\n\ttoolKind: \"draw\" | \"marker\",\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem | null {\n\tif (pointsWorld.length === 0) return null;\n\n\tconst merged: StrokeStyle = {\n\t\t...DEFAULT_STROKE_STYLE,\n\t\t...TOOL_FREEHAND_DEFAULTS[toolKind],\n\t\t...style,\n\t};\n\n\tconst sw = merged.strokeWidth;\n\t/** Filled outline extends ~size/2 past the polyline; keep generous padding to avoid clipping. */\n\tconst pad = Math.max(sw * 0.75 + 4, sw / 2 + 6);\n\tconst xs = pointsWorld.map((p) => p.x);\n\tconst ys = pointsWorld.map((p) => p.y);\n\tconst minX = Math.min(...xs);\n\tconst maxX = Math.max(...xs);\n\tconst minY = Math.min(...ys);\n\tconst maxY = Math.max(...ys);\n\n\tconst x = minX - pad;\n\tconst y = minY - pad;\n\tconst w = Math.max(maxX - minX + 2 * pad, sw);\n\tconst h = Math.max(maxY - minY + 2 * pad, sw);\n\n\tconst pathPointsLocal = pointsWorld.map((p) => ({\n\t\tx: p.x - x,\n\t\ty: p.y - y,\n\t\t...(p.pressure != null ? { pressure: p.pressure } : {}),\n\t}));\n\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx,\n\t\ty,\n\t\tbounds: { x, y, width: w, height: h },\n\t\ttoolKind,\n\t\tstroke: merged.stroke,\n\t\tstrokeWidth: merged.strokeWidth,\n\t\t...(merged.strokeOpacity != null ? { strokeOpacity: merged.strokeOpacity } : {}),\n\t\t...(merged.strokeDash != null ? { strokeDash: merged.strokeDash } : {}),\n\t\tpathPointsLocal,\n\t\tchildrenSvg: \"\",\n\t});\n}\n\nfunction escapeSvgAttr(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\");\n}\n\n/**\n * Builds `<g><image href=\"data:...\"/></g>` inside `bounds` from intrinsic pixel dimensions.\n * When bounds match intrinsic aspect (normal after aspect-locked resize), uses a uniform **fill** scale.\n * Otherwise uses **contain** + center for legacy or pasted rects with wrong proportion.\n */\nexport function buildRasterImageChildrenSvg(\n\tdataUrl: string,\n\tintrinsic: { width: number; height: number },\n\tbounds: Rect,\n): string {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, intrinsic.width);\n\tconst ih = Math.max(1e-6, intrinsic.height);\n\tconst href = escapeSvgAttr(dataUrl);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = iw / ih;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / iw;\n\t\treturn `<g transform=\"scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n\t}\n\tconst s = Math.min(r.width / iw, r.height / ih);\n\tconst tx = (r.width - iw * s) / 2;\n\tconst ty = (r.height - ih * s) / 2;\n\treturn `<g transform=\"translate(${tx}, ${ty}) scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n}\n\n/** Places a bitmap (e.g. `data:image/png;base64,...`) inside `bounds`. */\nexport function createImageItem(\n\tid: string,\n\tbounds: Rect,\n\timageRasterHref: string,\n\timageIntrinsicSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, imageIntrinsicSize.width);\n\tconst ih = Math.max(1e-6, imageIntrinsicSize.height);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageRasterHref,\n\t\timageIntrinsicSize: { width: iw, height: ih },\n\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\timageRasterHref,\n\t\t\t{ width: iw, height: ih },\n\t\t\tr,\n\t\t),\n\t};\n}\n\n/** @internal Legacy traced path content — prefer {@link createImageItem} with a raster data URL. */\nexport function createImageFromVectorTrace(\n\tid: string,\n\tbounds: Rect,\n\timageVectorInnerSvg: string,\n\timageVectorLocalSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst lw = Math.max(1e-6, imageVectorLocalSize.width);\n\tconst lh = Math.max(1e-6, imageVectorLocalSize.height);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = lw / lh;\n\tlet childrenSvg: string;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / lw;\n\t\tchildrenSvg = `<g transform=\"scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t} else {\n\t\tconst s = Math.min(r.width / lw, r.height / lh);\n\t\tconst tx = (r.width - lw * s) / 2;\n\t\tconst ty = (r.height - lh * s) / 2;\n\t\tchildrenSvg = `<g transform=\"translate(${tx}, ${ty}) scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t}\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageVectorInnerSvg,\n\t\timageVectorLocalSize: { width: lw, height: lh },\n\t\tchildrenSvg,\n\t};\n}\n","import { itemLocalToWorld, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\n\nexport type ResizeHandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nconst HANDLE_IDS: ResizeHandleId[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\n\nexport function getHandleWorldPosition(\n\tbounds: Rect,\n\tid: ResizeHandleId,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst cx = r.x + r.width / 2;\n\tconst cy = r.y + r.height / 2;\n\tswitch (id) {\n\t\tcase \"nw\":\n\t\t\treturn { x: r.x, y: r.y };\n\t\tcase \"n\":\n\t\t\treturn { x: cx, y: r.y };\n\t\tcase \"ne\":\n\t\t\treturn { x: r.x + r.width, y: r.y };\n\t\tcase \"e\":\n\t\t\treturn { x: r.x + r.width, y: cy };\n\t\tcase \"se\":\n\t\t\treturn { x: r.x + r.width, y: r.y + r.height };\n\t\tcase \"s\":\n\t\t\treturn { x: cx, y: r.y + r.height };\n\t\tcase \"sw\":\n\t\t\treturn { x: r.x, y: r.y + r.height };\n\t\tcase \"w\":\n\t\t\treturn { x: r.x, y: cy };\n\t}\n}\n\n/**\n * Hit-tests resize handles in **local** item space (handles rotation).\n */\nexport function hitTestResizeHandle(\n\tbounds: Rect,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\trotationRad: number = 0,\n): ResizeHandleId | null {\n\tconst r = normalizeRect(bounds);\n\tconst pl = worldToItemLocal(\n\t\tworldX,\n\t\tworldY,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n\tconst localBounds = { x: 0, y: 0, width: r.width, height: r.height };\n\tlet best: ResizeHandleId | null = null;\n\tlet bestD = radiusWorld;\n\tfor (const id of HANDLE_IDS) {\n\t\tconst p = getHandleWorldPosition(localBounds, id);\n\t\tconst d = Math.hypot(pl.x - p.x, pl.y - p.y);\n\t\tif (d <= bestD) {\n\t\t\tbestD = d;\n\t\t\tbest = id;\n\t\t}\n\t}\n\treturn best;\n}\n\n/** World position of a resize handle when the item is rotated around its center. */\nexport function getHandleWorldPositionRotated(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst p = getHandleWorldPosition(\n\t\t{ x: 0, y: 0, width: r.width, height: r.height },\n\t\thandle,\n\t);\n\treturn itemLocalToWorld(p.x, p.y, r.x, r.y, r.width, r.height, rotationRad);\n}\n\n/** World position of the rotation handle (above the top edge of the bounds). */\nexport function getRotationHandleWorldPosition(\n\tbounds: Rect,\n\trotationRad: number,\n\thandleOffsetWorld: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\treturn itemLocalToWorld(\n\t\tr.width / 2,\n\t\t-handleOffsetWorld,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n}\n\nexport function hitTestRotateHandle(\n\tbounds: Rect,\n\trotationRad: number,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\thandleOffsetWorld: number,\n): boolean {\n\tconst p = getRotationHandleWorldPosition(bounds, rotationRad, handleOffsetWorld);\n\treturn Math.hypot(worldX - p.x, worldY - p.y) <= radiusWorld;\n}\n\nexport function rectFromCorners(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n): Rect {\n\tconst minX = Math.min(a.x, b.x);\n\tconst maxX = Math.max(a.x, b.x);\n\tconst minY = Math.min(a.y, b.y);\n\tconst maxY = Math.max(a.y, b.y);\n\treturn { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction clampMinSize(r: Rect, min: number): Rect {\n\tconst n = normalizeRect(r);\n\treturn {\n\t\tx: n.x,\n\t\ty: n.y,\n\t\twidth: Math.max(min, n.width),\n\t\theight: Math.max(min, n.height),\n\t};\n}\n\n/**\n * Computes new axis-aligned bounds when dragging a resize handle to `currentWorld`.\n */\nexport function computeResizeBounds(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst minSize = 8;\n\n\tswitch (handle) {\n\t\tcase \"nw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y1 }), minSize);\n\t\tcase \"ne\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y1 }), minSize);\n\t\tcase \"se\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y0 }), minSize);\n\t\tcase \"sw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y0 }), minSize);\n\t\tcase \"n\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: currentWorld.y }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"s\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: x1, y: currentWorld.y }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"e\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: currentWorld.x, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"w\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: currentWorld.x, y: y0 }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n\n/**\n * Resize bounds with fixed width/height ratio (`aspect` = width ÷ height), similar to tldraw\n * image resize: corners follow the cursor by adjusting the other dimension to preserve aspect;\n * edges resize from the opposite edge with the box centered on the orthogonal axis.\n */\nexport function computeResizeBoundsFixedAspect(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n\taspect: number,\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst w = r.width;\n\tconst h = r.height;\n\tconst minSize = 8;\n\tconst a = Math.max(1e-9, aspect);\n\n\tfunction cornerAspectRect(\n\t\tanchor: { x: number; y: number },\n\t\tcursor: { x: number; y: number },\n\t): Rect {\n\t\tconst dx = cursor.x - anchor.x;\n\t\tconst dy = cursor.y - anchor.y;\n\t\tconst aw = Math.abs(dx);\n\t\tconst ah = Math.abs(dy);\n\t\tlet W: number;\n\t\tlet H: number;\n\t\tif (aw < 1e-12 && ah < 1e-12) {\n\t\t\tW = minSize;\n\t\t\tH = minSize / a;\n\t\t} else if (ah < 1e-12) {\n\t\t\tW = Math.max(minSize, aw);\n\t\t\tH = W / a;\n\t\t} else if (aw < 1e-12) {\n\t\t\tH = Math.max(minSize, ah);\n\t\t\tW = H * a;\n\t\t} else if (aw / ah > a) {\n\t\t\tW = aw;\n\t\t\tH = aw / a;\n\t\t} else {\n\t\t\tH = ah;\n\t\t\tW = ah * a;\n\t\t}\n\t\tif (W < minSize || H < minSize) {\n\t\t\tconst scale = Math.max(minSize / W, minSize / H);\n\t\t\tW *= scale;\n\t\t\tH *= scale;\n\t\t}\n\t\tconst sx = Math.sign(dx) || 1;\n\t\tconst sy = Math.sign(dy) || 1;\n\t\treturn rectFromCorners(anchor, {\n\t\t\tx: anchor.x + sx * W,\n\t\t\ty: anchor.y + sy * H,\n\t\t});\n\t}\n\n\tswitch (handle) {\n\t\tcase \"se\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y0 }, currentWorld);\n\t\tcase \"nw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y1 }, currentWorld);\n\t\tcase \"ne\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y1 }, currentWorld);\n\t\tcase \"sw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y0 }, currentWorld);\n\t\tcase \"e\": {\n\t\t\tconst rawW = currentWorld.x - x0;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({ x: x0, y: newY, width: sign * aw, height: H });\n\t\t}\n\t\tcase \"w\": {\n\t\t\tconst rawW = x1 - currentWorld.x;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: x1 - sign * aw,\n\t\t\t\ty: newY,\n\t\t\t\twidth: sign * aw,\n\t\t\t\theight: H,\n\t\t\t});\n\t\t}\n\t\tcase \"n\": {\n\t\t\tconst rawH = y1 - currentWorld.y;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: newX,\n\t\t\t\ty: y1 - sign * ah,\n\t\t\t\twidth: W,\n\t\t\t\theight: sign * ah,\n\t\t\t});\n\t\t}\n\t\tcase \"s\": {\n\t\t\tconst rawH = currentWorld.y - y0;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({ x: newX, y: y0, width: W, height: sign * ah });\n\t\t}\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n","import {\n\tgetItemRotationRad,\n\titemLocalToWorld,\n\tworldToItemLocal,\n} from \"../math/item-transform\";\nimport { normalizeRect } from \"../math/rect\";\nimport { lineEndpointsToLocal, rebuildItemSvg } from \"../scene/shape-builders\";\nimport type { ArrowEndpointBinding, VectorSceneItem } from \"../scene/types\";\nimport { rectFromCorners } from \"./resize-handles\";\n\n/** Default screen px — converted to world with `/ camera.zoom` when snapping. */\nexport const ARROW_BIND_SNAP_PX = 16;\n\nfunction closestPointOnSegment(\n\tpx: number,\n\tpy: number,\n\tax: number,\n\tay: number,\n\tbx: number,\n\tby: number,\n): { x: number; y: number } {\n\tconst abx = bx - ax;\n\tconst aby = by - ay;\n\tconst apx = px - ax;\n\tconst apy = py - ay;\n\tconst abLenSq = abx * abx + aby * aby;\n\tif (abLenSq < 1e-12) {\n\t\treturn { x: ax, y: ay };\n\t}\n\tlet t = (apx * abx + apy * aby) / abLenSq;\n\tt = Math.max(0, Math.min(1, t));\n\treturn { x: ax + t * abx, y: ay + t * aby };\n}\n\n/** Closest point on the boundary of axis-aligned rect [0,w]×[0,h] to (px,py). */\nfunction closestPointOnRectBoundaryLocal(\n\tpx: number,\n\tpy: number,\n\tw: number,\n\th: number,\n): { x: number; y: number } {\n\tconst edges: [number, number, number, number][] = [\n\t\t[0, 0, w, 0],\n\t\t[w, 0, w, h],\n\t\t[w, h, 0, h],\n\t\t[0, h, 0, 0],\n\t];\n\tlet best = { x: 0, y: 0, d: Infinity };\n\tfor (const [ax, ay, bx, by] of edges) {\n\t\tconst p = closestPointOnSegment(px, py, ax, ay, bx, by);\n\t\tconst d = Math.hypot(px - p.x, py - p.y);\n\t\tif (d < best.d) {\n\t\t\tbest = { x: p.x, y: p.y, d };\n\t\t}\n\t}\n\treturn { x: best.x, y: best.y };\n}\n\nfunction closestPointOnEllipseBoundaryLocal(\n\tpx: number,\n\tpy: number,\n\tw: number,\n\th: number,\n): { x: number; y: number } {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst rx = w / 2;\n\tconst ry = h / 2;\n\tif (rx < 1e-9 || ry < 1e-9) {\n\t\treturn { x: cx, y: cy };\n\t}\n\tconst dx = px - cx;\n\tconst dy = py - cy;\n\tif (dx === 0 && dy === 0) {\n\t\treturn { x: cx + rx, y: cy };\n\t}\n\tconst t = Math.atan2(dy / ry, dx / rx);\n\treturn {\n\t\tx: cx + rx * Math.cos(t),\n\t\ty: cy + ry * Math.sin(t),\n\t};\n}\n\nexport function isArrowBindTarget(item: VectorSceneItem): boolean {\n\tif (item.locked) return false;\n\tconst k = item.toolKind;\n\tif (!k) return false;\n\treturn (\n\t\tk === \"rect\" ||\n\t\tk === \"ellipse\" ||\n\t\tk === \"architectural-cloud\" ||\n\t\tk === \"text\" ||\n\t\tk === \"image\" ||\n\t\tk === \"custom\"\n\t);\n}\n\nfunction closestPointOnShapeBoundaryLocal(\n\titem: VectorSceneItem,\n\tlx: number,\n\tly: number,\n\tw: number,\n\th: number,\n): { x: number; y: number } {\n\tif (item.toolKind === \"ellipse\") {\n\t\treturn closestPointOnEllipseBoundaryLocal(lx, ly, w, h);\n\t}\n\treturn closestPointOnRectBoundaryLocal(lx, ly, w, h);\n}\n\nfunction anchorNormalizedToWorld(\n\ttarget: VectorSceneItem,\n\tanchor: { x: number; y: number },\n): { x: number; y: number } {\n\tconst b = normalizeRect(target.bounds);\n\tconst w = b.width;\n\tconst h = b.height;\n\tconst lx = anchor.x * w;\n\tconst ly = anchor.y * h;\n\tconst rot = getItemRotationRad(target);\n\treturn itemLocalToWorld(lx, ly, target.x, target.y, w, h, rot);\n}\n\n/**\n * If `worldX/worldY` is within `maxDistWorld` of a bindable shape’s boundary,\n * returns the snapped point on that boundary plus binding metadata.\n */\nexport function snapArrowEndpointToShape(\n\tworldX: number,\n\tworldY: number,\n\titems: readonly VectorSceneItem[],\n\texcludeIds: ReadonlySet<string>,\n\tmaxDistWorld: number,\n): { world: { x: number; y: number }; binding: ArrowEndpointBinding } | null {\n\tlet best: {\n\t\tworld: { x: number; y: number };\n\t\tbinding: ArrowEndpointBinding;\n\t\td: number;\n\t} | null = null;\n\n\tfor (const item of items) {\n\t\tif (excludeIds.has(item.id)) continue;\n\t\tif (!isArrowBindTarget(item)) continue;\n\n\t\tconst b = normalizeRect(item.bounds);\n\t\tconst w = b.width;\n\t\tconst h = b.height;\n\t\tconst rot = getItemRotationRad(item);\n\t\tconst pl = worldToItemLocal(worldX, worldY, item.x, item.y, w, h, rot);\n\n\t\tconst localClosest = closestPointOnShapeBoundaryLocal(item, pl.x, pl.y, w, h);\n\t\tconst worldClosest = itemLocalToWorld(\n\t\t\tlocalClosest.x,\n\t\t\tlocalClosest.y,\n\t\t\titem.x,\n\t\t\titem.y,\n\t\t\tw,\n\t\t\th,\n\t\t\trot,\n\t\t);\n\t\tconst d = Math.hypot(worldX - worldClosest.x, worldY - worldClosest.y);\n\t\tif (d > maxDistWorld) continue;\n\t\tif (!best || d < best.d) {\n\t\t\tbest = {\n\t\t\t\td,\n\t\t\t\tworld: worldClosest,\n\t\t\t\tbinding: {\n\t\t\t\t\ttargetId: item.id,\n\t\t\t\t\tanchor: {\n\t\t\t\t\t\tx: localClosest.x / Math.max(1e-9, w),\n\t\t\t\t\t\ty: localClosest.y / Math.max(1e-9, h),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\treturn best ? { world: best.world, binding: best.binding } : null;\n}\n\nfunction resolveOneArrowItem(\n\titem: VectorSceneItem,\n\tmap: Map<string, VectorSceneItem>,\n): VectorSceneItem {\n\tconst bind = item.arrowBind;\n\tif (!bind || item.toolKind !== \"arrow\") return item;\n\tconst ln = item.line;\n\tif (!ln) return item;\n\n\tconst b0 = normalizeRect(item.bounds);\n\tconst rot = getItemRotationRad(item);\n\tconst w0 = b0.width;\n\tconst h0 = b0.height;\n\tconst startFallback = itemLocalToWorld(ln.x1, ln.y1, item.x, item.y, w0, h0, rot);\n\tconst endFallback = itemLocalToWorld(ln.x2, ln.y2, item.x, item.y, w0, h0, rot);\n\n\tconst startW = bind.start\n\t\t? (() => {\n\t\t\t\tconst t = map.get(bind.start.targetId);\n\t\t\t\treturn t ? anchorNormalizedToWorld(t, bind.start.anchor) : startFallback;\n\t\t\t})()\n\t\t: startFallback;\n\tconst endW = bind.end\n\t\t? (() => {\n\t\t\t\tconst t = map.get(bind.end.targetId);\n\t\t\t\treturn t ? anchorNormalizedToWorld(t, bind.end.anchor) : endFallback;\n\t\t\t})()\n\t\t: endFallback;\n\n\tconst raw = rectFromCorners(startW, endW);\n\tconst br = normalizeRect(raw);\n\tconst newLine = lineEndpointsToLocal(br, startW, endW);\n\tconst next: VectorSceneItem = {\n\t\t...item,\n\t\tx: br.x,\n\t\ty: br.y,\n\t\tbounds: br,\n\t\tline: newLine,\n\t\trotation: 0,\n\t};\n\treturn rebuildItemSvg(next);\n}\n\n/**\n * Recomputes every arrow item that has {@link VectorSceneItem.arrowBind} so endpoints\n * follow bound shapes (move/resize).\n */\nexport function resolveArrowBindingsInScene(\n\titems: readonly VectorSceneItem[],\n): readonly VectorSceneItem[] {\n\tlet hasBoundArrow = false;\n\tfor (const item of items) {\n\t\tif (item.toolKind === \"arrow\" && item.arrowBind) {\n\t\t\thasBoundArrow = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!hasBoundArrow) {\n\t\treturn items;\n\t}\n\n\tconst map = new Map(items.map((i) => [i.id, i]));\n\treturn items.map((item) => {\n\t\tif (item.toolKind !== \"arrow\" || !item.arrowBind) return item;\n\t\treturn resolveOneArrowItem(item, map);\n\t});\n}\n\n/**\n * Converts a bound arrow to a plain arrow (drops bindings) using the current resolved\n * geometry so move/resize gestures don’t fight binding resolution.\n */\nexport function bakeArrowItemToAbsolute(\n\titem: VectorSceneItem,\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem {\n\tif (item.toolKind !== \"arrow\" || !item.arrowBind) return item;\n\tconst map = new Map(items.map((i) => [i.id, i]));\n\tconst resolved = resolveOneArrowItem(item, map);\n\tconst { arrowBind: _a, ...rest } = resolved;\n\treturn { ...rest };\n}\n","import {\n\tgetItemRotationRad,\n\titemLocalToWorld,\n\tworldToItemLocal,\n} from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Returns whether a world point lies inside an axis-aligned rectangle.\n */\nexport function pointInWorldRect(px: number, py: number, rect: Rect): boolean {\n\tconst r = normalizeRect(rect);\n\treturn px >= r.x && px <= r.x + r.width && py >= r.y && py <= r.y + r.height;\n}\n\nfunction pointInLocalRect(lx: number, ly: number, w: number, h: number): boolean {\n\treturn lx >= 0 && lx <= w && ly >= 0 && ly <= h;\n}\n\nfunction pointInLocalEllipse(lx: number, ly: number, w: number, h: number): boolean {\n\tconst rx = w / 2;\n\tconst ry = h / 2;\n\tif (rx < 1e-9 || ry < 1e-9) {\n\t\treturn false;\n\t}\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst nx = (lx - cx) / rx;\n\tconst ny = (ly - cy) / ry;\n\treturn nx * nx + ny * ny <= 1;\n}\n\n/**\n * Distance from point `p` to segment `a`–`b` in 2D.\n */\nexport function distancePointToSegment(\n\tpx: number,\n\tpy: number,\n\tax: number,\n\tay: number,\n\tbx: number,\n\tby: number,\n): number {\n\tconst abx = bx - ax;\n\tconst aby = by - ay;\n\tconst apx = px - ax;\n\tconst apy = py - ay;\n\tconst abLenSq = abx * abx + aby * aby;\n\tif (abLenSq < 1e-12) {\n\t\treturn Math.hypot(px - ax, py - ay);\n\t}\n\tlet t = (apx * abx + apy * aby) / abLenSq;\n\tt = Math.max(0, Math.min(1, t));\n\tconst qx = ax + t * abx;\n\tconst qy = ay + t * aby;\n\treturn Math.hypot(px - qx, py - qy);\n}\n\nexport type HitTestWorldPointOptions = {\n\t/** Max distance to a line segment in **world** units (e.g. ~10 / camera.zoom for ~10px on screen). */\n\tlineHitWorld?: number;\n\t/** When true, locked items are ignored as interaction targets. */\n\tignoreLocked?: boolean;\n};\n\nfunction hitTestFilledShape(\n\titem: VectorSceneItem,\n\tworldX: number,\n\tworldY: number,\n): boolean {\n\tconst b = normalizeRect(item.bounds);\n\tconst w = b.width;\n\tconst h = b.height;\n\tconst rot = getItemRotationRad(item);\n\tconst pl = worldToItemLocal(worldX, worldY, item.x, item.y, w, h, rot);\n\n\tif (item.toolKind === \"ellipse\") {\n\t\treturn pointInLocalEllipse(pl.x, pl.y, w, h);\n\t}\n\treturn pointInLocalRect(pl.x, pl.y, w, h);\n}\n\n/**\n * Whether `worldX/worldY` hits this item’s visible geometry (stroke/area).\n */\nexport function itemHitTestWorldPoint(\n\titem: VectorSceneItem,\n\tworldX: number,\n\tworldY: number,\n\toptions?: HitTestWorldPointOptions,\n): boolean {\n\tconst lineHit = options?.lineHitWorld ?? 8;\n\tconst lineHitSq = lineHit * lineHit;\n\n\tconst b = normalizeRect(item.bounds);\n\tconst w = b.width;\n\tconst h = b.height;\n\tconst rot = getItemRotationRad(item);\n\n\tif (item.toolKind === \"line\" || item.toolKind === \"arrow\") {\n\t\tconst ln = item.line;\n\t\tif (ln) {\n\t\t\tconst a = itemLocalToWorld(ln.x1, ln.y1, item.x, item.y, w, h, rot);\n\t\t\tconst p2 = itemLocalToWorld(ln.x2, ln.y2, item.x, item.y, w, h, rot);\n\t\t\tconst d = distancePointToSegment(worldX, worldY, a.x, a.y, p2.x, p2.y);\n\t\t\tif (d * d <= lineHitSq) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (hitTestFilledShape(item, worldX, worldY)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tif (\n\t\titem.toolKind === \"draw\" ||\n\t\titem.toolKind === \"pencil\" ||\n\t\titem.toolKind === \"brush\" ||\n\t\titem.toolKind === \"marker\"\n\t) {\n\t\tconst pts = item.pathPointsLocal;\n\t\tconst halfW = Math.max((item.strokeWidth ?? 2) / 2, lineHit * 0.5);\n\t\tconst tol = Math.max(lineHit, halfW);\n\t\tconst tolSq = tol * tol;\n\t\tif (pts && pts.length >= 2) {\n\t\t\tfor (let j = 0; j < pts.length - 1; j++) {\n\t\t\t\tconst a = pts[j];\n\t\t\t\tconst p2 = pts[j + 1];\n\t\t\t\tif (!a || !p2) continue;\n\t\t\t\tconst aw = itemLocalToWorld(a.x, a.y, item.x, item.y, w, h, rot);\n\t\t\t\tconst bw = itemLocalToWorld(p2.x, p2.y, item.x, item.y, w, h, rot);\n\t\t\t\tconst d = distancePointToSegment(worldX, worldY, aw.x, aw.y, bw.x, bw.y);\n\t\t\t\tif (d * d <= tolSq) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// A freehand stroke is only its ink. Do NOT fall back to the\n\t\t\t// bounding box — that erased/selected the stroke from anywhere\n\t\t\t// inside its (often large, mostly empty) rect.\n\t\t\treturn false;\n\t\t}\n\t\tif (pts && pts.length === 1) {\n\t\t\tconst p = pts[0];\n\t\t\tif (!p) return false;\n\t\t\tconst cw = itemLocalToWorld(p.x, p.y, item.x, item.y, w, h, rot);\n\t\t\tconst dsq = (worldX - cw.x) ** 2 + (worldY - cw.y) ** 2;\n\t\t\treturn dsq <= tolSq;\n\t\t}\n\t\t// No usable path points (malformed item): last-resort bbox test.\n\t\treturn hitTestFilledShape(item, worldX, worldY);\n\t}\n\treturn hitTestFilledShape(item, worldX, worldY);\n}\n\n/**\n * Hit-tests a scene item in world coordinates (top-most = last in array wins if overlapping).\n */\nexport function hitTestWorldPoint(\n\titems: readonly VectorSceneItem[],\n\tworldX: number,\n\tworldY: number,\n\toptions?: HitTestWorldPointOptions,\n): VectorSceneItem | null {\n\tfor (let i = items.length - 1; i >= 0; i--) {\n\t\tconst item = items[i];\n\t\tif (item === undefined) continue;\n\t\tif (options?.ignoreLocked && item.locked) continue;\n\t\tif (itemHitTestWorldPoint(item, worldX, worldY, options)) {\n\t\t\treturn item;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Eraser: IDs of every **unlocked** item hit at this point.\n * Locked items are ignored so protected background layers do not block erasing editable shapes above them.\n */\nexport function collectEraserTargetsAtWorldPoint(\n\titems: readonly VectorSceneItem[],\n\tworldX: number,\n\tworldY: number,\n\toptions?: HitTestWorldPointOptions,\n): string[] {\n\tconst topHit = hitTestWorldPoint(items, worldX, worldY, {\n\t\t...options,\n\t\tignoreLocked: true,\n\t});\n\tif (!topHit) return [];\n\n\tconst ids: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst item = items[i];\n\t\tif (item === undefined || item.locked) continue;\n\t\tif (!itemHitTestWorldPoint(item, worldX, worldY, options)) continue;\n\t\tif (!seen.has(item.id)) {\n\t\t\tseen.add(item.id);\n\t\t\tids.push(item.id);\n\t\t}\n\t}\n\treturn ids;\n}\n","\"use client\";\n\nimport { IndexedDbImageStore } from \"../image/indexed-db-image-store\";\nimport { loadPdfToStore } from \"../image/pdf-loader\";\nimport { rebuildItemSvg } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport type {\n\tVectorViewportAssetHydrationRequest,\n\tVectorViewportAssetResolveResult,\n\tVectorViewportAssetStore,\n} from \"./asset-store\";\n\nconst HYDRATION_CACHE_NAME = \"canvu-asset-hydration-v1\";\nconst DEFAULT_PDF_SCALE = 1.15;\nconst DEFAULT_PDF_PAGE_CONCURRENCY = 2;\n\ntype HydratedAssetRecord = {\n\thref: string;\n\twidth?: number;\n\theight?: number;\n};\n\ntype HydratedAssetSource = {\n\tblob: Blob;\n\twidth?: number;\n\theight?: number;\n};\n\ntype PdfHydrationGroup = {\n\tassetId: string;\n\tscale: number;\n\tpageNumbers: number[];\n};\n\ntype HydrateSceneItemsWithAssetsOptions = {\n\timageStore?: IndexedDbImageStore;\n\tpdfScale?: number;\n\tpdfPageConcurrency?: number;\n\tpreferCachedRasters?: boolean;\n};\n\nexport type HydratedSceneItemsWithAssetsResult = {\n\titems: VectorSceneItem[];\n\tobjectUrls: string[];\n};\n\nconst hydrationSourcePromises = new Map<\n\tstring,\n\tPromise<HydratedAssetSource | null>\n>();\nconst pdfSourceBlobPromises = new Map<string, Promise<Blob | null>>();\n\nfunction buildImageHydrationKey(assetId: string): string {\n\treturn `image:${assetId}`;\n}\n\nfunction buildPdfHydrationKey(\n\tassetId: string,\n\tpageNumber: number,\n\tscale: number,\n): string {\n\treturn `pdf:${assetId}:page:${pageNumber}:scale:${scale}`;\n}\n\nfunction getCacheRequest(key: string): Request {\n\treturn new Request(\n\t\t`https://canvu.local/asset-hydration/${encodeURIComponent(key)}`,\n\t);\n}\n\nasync function openHydrationCache(): Promise<Cache | null> {\n\tif (typeof caches === \"undefined\") return null;\n\ttry {\n\t\treturn await caches.open(HYDRATION_CACHE_NAME);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function readCachedHydrationBlob(key: string): Promise<Blob | null> {\n\tconst cache = await openHydrationCache();\n\tif (!cache) return null;\n\ttry {\n\t\tconst response = await cache.match(getCacheRequest(key));\n\t\tif (!response?.ok) return null;\n\t\treturn await response.blob();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeCachedHydrationBlob(key: string, blob: Blob): Promise<void> {\n\tconst cache = await openHydrationCache();\n\tif (!cache) return;\n\ttry {\n\t\tawait cache.put(getCacheRequest(key), new Response(blob));\n\t} catch {}\n}\n\nasync function fetchBlob(url: string): Promise<Blob | null> {\n\ttry {\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) return null;\n\t\treturn await response.blob();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function getHydrationSource(\n\tkey: string,\n\tpreferCachedRasters: boolean,\n\tloader: () => Promise<HydratedAssetSource | null>,\n): Promise<HydratedAssetSource | null> {\n\tconst cached = preferCachedRasters ? await readCachedHydrationBlob(key) : null;\n\tif (cached) {\n\t\treturn {\n\t\t\tblob: cached,\n\t\t};\n\t}\n\tconst inFlight = hydrationSourcePromises.get(key);\n\tif (inFlight) return await inFlight;\n\tconst nextPromise = (async () => {\n\t\tconst source = await loader();\n\t\tif (source?.blob) {\n\t\t\tawait writeCachedHydrationBlob(key, source.blob);\n\t\t}\n\t\treturn source;\n\t})();\n\thydrationSourcePromises.set(key, nextPromise);\n\ttry {\n\t\treturn await nextPromise;\n\t} finally {\n\t\thydrationSourcePromises.delete(key);\n\t}\n}\n\nasync function getPdfSourceBlob(url: string): Promise<Blob | null> {\n\tconst inFlight = pdfSourceBlobPromises.get(url);\n\tif (inFlight) return await inFlight;\n\tconst nextPromise = fetchBlob(url);\n\tpdfSourceBlobPromises.set(url, nextPromise);\n\ttry {\n\t\treturn await nextPromise;\n\t} finally {\n\t\tpdfSourceBlobPromises.delete(url);\n\t}\n}\n\nfunction registerObjectUrl(objectUrls: string[], blob: Blob): string {\n\tconst href = URL.createObjectURL(blob);\n\tobjectUrls.push(href);\n\treturn href;\n}\n\nfunction getHydrationRequests(\n\titems: readonly VectorSceneItem[],\n\tassetStore: VectorViewportAssetStore,\n\tpdfScale: number,\n): Array<{\n\trequest: VectorViewportAssetHydrationRequest;\n}> {\n\tif (!assetStore.getHydrationRequest) return [];\n\treturn items.flatMap((item) => {\n\t\tconst request = assetStore.getHydrationRequest?.(item);\n\t\tif (!request) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\trequest: {\n\t\t\t\t\t...request,\n\t\t\t\t\tscale: request.scale ?? pdfScale,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t});\n}\n\nfunction createPdfHydrationGroups(\n\trequests: Array<{\n\t\trequest: VectorViewportAssetHydrationRequest;\n\t}>,\n): PdfHydrationGroup[] {\n\tconst groups = new Map<string, PdfHydrationGroup>();\n\tfor (const entry of requests) {\n\t\tif (entry.request.kind !== \"pdf\" || entry.request.pageNumber == null) continue;\n\t\tconst scale = entry.request.scale ?? DEFAULT_PDF_SCALE;\n\t\tconst key = `${entry.request.assetId}:${scale}`;\n\t\tconst existingGroup = groups.get(key);\n\t\tif (existingGroup) {\n\t\t\tif (!existingGroup.pageNumbers.includes(entry.request.pageNumber)) {\n\t\t\t\texistingGroup.pageNumbers.push(entry.request.pageNumber);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tgroups.set(key, {\n\t\t\tassetId: entry.request.assetId,\n\t\t\tscale,\n\t\t\tpageNumbers: [entry.request.pageNumber],\n\t\t});\n\t}\n\treturn [...groups.values()];\n}\n\nasync function hydrateImageAssets(\n\trequests: Array<{\n\t\trequest: VectorViewportAssetHydrationRequest;\n\t}>,\n\tresolvedAssetUrls: VectorViewportAssetResolveResult,\n\tobjectUrls: string[],\n\tpreferCachedRasters: boolean,\n): Promise<Map<string, HydratedAssetRecord | null>> {\n\tconst uniqueAssetIds = [\n\t\t...new Set(requests.map((entry) => entry.request.assetId)),\n\t];\n\tconst hydratedEntries = await Promise.all(\n\t\tuniqueAssetIds.map(async (assetId) => {\n\t\t\tconst resolvedAsset = resolvedAssetUrls[assetId];\n\t\t\tif (!resolvedAsset?.url) {\n\t\t\t\treturn [assetId, null] as const;\n\t\t\t}\n\t\t\tconst source = await getHydrationSource(\n\t\t\t\tbuildImageHydrationKey(assetId),\n\t\t\t\tpreferCachedRasters,\n\t\t\t\tasync () => {\n\t\t\t\t\tconst blob = await fetchBlob(resolvedAsset.url);\n\t\t\t\t\tif (!blob) return null;\n\t\t\t\t\treturn { blob };\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (!source?.blob) {\n\t\t\t\treturn [assetId, null] as const;\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tassetId,\n\t\t\t\t{\n\t\t\t\t\thref: registerObjectUrl(objectUrls, source.blob),\n\t\t\t\t},\n\t\t\t] as const;\n\t\t}),\n\t);\n\treturn new Map<string, HydratedAssetRecord | null>(hydratedEntries);\n}\n\nasync function hydratePdfAssets(\n\trequests: Array<{\n\t\trequest: VectorViewportAssetHydrationRequest;\n\t}>,\n\tresolvedAssetUrls: VectorViewportAssetResolveResult,\n\tobjectUrls: string[],\n\toptions: {\n\t\timageStore: IndexedDbImageStore;\n\t\tpdfPageConcurrency: number;\n\t\tpreferCachedRasters: boolean;\n\t},\n): Promise<Map<string, HydratedAssetRecord>> {\n\tconst hydratedPages = new Map<string, HydratedAssetRecord>();\n\tconst groups = createPdfHydrationGroups(requests);\n\n\tfor (const group of groups) {\n\t\tconst resolvedAsset = resolvedAssetUrls[group.assetId];\n\t\tif (!resolvedAsset?.url) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst pageKeys = group.pageNumbers.map((pageNumber) => ({\n\t\t\tpageNumber,\n\t\t\tcacheKey: buildPdfHydrationKey(group.assetId, pageNumber, group.scale),\n\t\t}));\n\t\tconst pagesToRender: typeof pageKeys = [];\n\t\tfor (const { pageNumber, cacheKey } of pageKeys) {\n\t\t\tconst cachedBlob = options.preferCachedRasters\n\t\t\t\t? await readCachedHydrationBlob(cacheKey)\n\t\t\t\t: null;\n\t\t\tif (cachedBlob) {\n\t\t\t\thydratedPages.set(cacheKey, {\n\t\t\t\t\thref: registerObjectUrl(objectUrls, cachedBlob),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!hydrationSourcePromises.has(cacheKey)) {\n\t\t\t\tpagesToRender.push({ pageNumber, cacheKey });\n\t\t\t}\n\t\t}\n\t\tif (pagesToRender.length > 0) {\n\t\t\tconst renderPromise = (async () => {\n\t\t\t\tconst pdfBlob = await getPdfSourceBlob(resolvedAsset.url);\n\t\t\t\tif (!pdfBlob) {\n\t\t\t\t\treturn new Map<number, HydratedAssetSource | null>();\n\t\t\t\t}\n\t\t\t\tconst renderedPages = await loadPdfToStore(pdfBlob, options.imageStore, {\n\t\t\t\t\tscale: group.scale,\n\t\t\t\t\tpageNumbers: pagesToRender.map(({ pageNumber }) => pageNumber),\n\t\t\t\t\tpageConcurrency: options.pdfPageConcurrency,\n\t\t\t\t});\n\t\t\t\tconst renderedByPage = new Map<number, HydratedAssetSource | null>();\n\t\t\t\tfor (const renderedPage of renderedPages) {\n\t\t\t\t\tconst pageBlob = await options.imageStore.getOriginal(renderedPage.blobId);\n\t\t\t\t\trenderedByPage.set(\n\t\t\t\t\t\trenderedPage.pageNumber,\n\t\t\t\t\t\tpageBlob\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tblob: pageBlob,\n\t\t\t\t\t\t\t\t\twidth: renderedPage.width,\n\t\t\t\t\t\t\t\t\theight: renderedPage.height,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn renderedByPage;\n\t\t\t})();\n\n\t\t\tfor (const { pageNumber, cacheKey } of pagesToRender) {\n\t\t\t\tconst pagePromise = getHydrationSource(\n\t\t\t\t\tcacheKey,\n\t\t\t\t\toptions.preferCachedRasters,\n\t\t\t\t\tasync () => (await renderPromise).get(pageNumber) ?? null,\n\t\t\t\t);\n\t\t\t\thydrationSourcePromises.set(cacheKey, pagePromise);\n\t\t\t}\n\t\t}\n\n\t\tfor (const { cacheKey } of pageKeys) {\n\t\t\tif (hydratedPages.has(cacheKey)) continue;\n\t\t\tconst source = await getHydrationSource(\n\t\t\t\tcacheKey,\n\t\t\t\toptions.preferCachedRasters,\n\t\t\t\tasync () => null,\n\t\t\t);\n\t\t\tif (!source?.blob) continue;\n\t\t\thydratedPages.set(cacheKey, {\n\t\t\t\thref: registerObjectUrl(objectUrls, source.blob),\n\t\t\t\twidth: source.width,\n\t\t\t\theight: source.height,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn hydratedPages;\n}\n\nexport async function hydrateSceneItemsWithAssets(\n\titems: readonly VectorSceneItem[],\n\tassetStore: VectorViewportAssetStore,\n\toptions: HydrateSceneItemsWithAssetsOptions = {},\n): Promise<HydratedSceneItemsWithAssetsResult> {\n\tif (!assetStore.resolve || !assetStore.getHydrationRequest) {\n\t\treturn {\n\t\t\titems: [...items],\n\t\t\tobjectUrls: [],\n\t\t};\n\t}\n\n\tconst pdfScale = options.pdfScale ?? DEFAULT_PDF_SCALE;\n\tconst pdfPageConcurrency =\n\t\toptions.pdfPageConcurrency ?? DEFAULT_PDF_PAGE_CONCURRENCY;\n\tconst preferCachedRasters = options.preferCachedRasters ?? true;\n\tconst imageStore = options.imageStore ?? new IndexedDbImageStore();\n\tconst hydrationRequests = getHydrationRequests(items, assetStore, pdfScale);\n\n\tif (hydrationRequests.length === 0) {\n\t\treturn {\n\t\t\titems: [...items],\n\t\t\tobjectUrls: [],\n\t\t};\n\t}\n\n\tconst assetIds = [\n\t\t...new Set(hydrationRequests.map((entry) => entry.request.assetId)),\n\t];\n\tconst resolvedAssetUrls = await assetStore.resolve({ assetIds });\n\tconst objectUrls: string[] = [];\n\tconst hydratedImages = await hydrateImageAssets(\n\t\thydrationRequests.filter((entry) => entry.request.kind === \"image\"),\n\t\tresolvedAssetUrls,\n\t\tobjectUrls,\n\t\tpreferCachedRasters,\n\t);\n\tconst hydratedPdfPages = await hydratePdfAssets(\n\t\thydrationRequests.filter((entry) => entry.request.kind === \"pdf\"),\n\t\tresolvedAssetUrls,\n\t\tobjectUrls,\n\t\t{\n\t\t\timageStore,\n\t\t\tpdfPageConcurrency,\n\t\t\tpreferCachedRasters,\n\t\t},\n\t);\n\n\treturn {\n\t\titems: items.map((item) => {\n\t\t\tconst request = assetStore.getHydrationRequest?.(item);\n\t\t\tif (!request || item.toolKind !== \"image\") return item;\n\n\t\t\tif (request.kind === \"image\") {\n\t\t\t\tconst hydratedImage = hydratedImages.get(request.assetId);\n\t\t\t\tif (!hydratedImage) return item;\n\t\t\t\treturn rebuildItemSvg({\n\t\t\t\t\t...item,\n\t\t\t\t\timageRasterHref: hydratedImage.href,\n\t\t\t\t\timageThumbnailHref: hydratedImage.href,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (request.pageNumber == null) return item;\n\t\t\tconst hydratedPdfPage = hydratedPdfPages.get(\n\t\t\t\tbuildPdfHydrationKey(\n\t\t\t\t\trequest.assetId,\n\t\t\t\t\trequest.pageNumber,\n\t\t\t\t\trequest.scale ?? pdfScale,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (!hydratedPdfPage) return item;\n\t\t\treturn rebuildItemSvg({\n\t\t\t\t...item,\n\t\t\t\timageRasterHref: hydratedPdfPage.href,\n\t\t\t\timageThumbnailHref: hydratedPdfPage.href,\n\t\t\t\timageIntrinsicSize: {\n\t\t\t\t\twidth:\n\t\t\t\t\t\titem.imageIntrinsicSize?.width ??\n\t\t\t\t\t\tMath.max(1, Math.round(hydratedPdfPage.width ?? item.bounds.width)),\n\t\t\t\t\theight:\n\t\t\t\t\t\titem.imageIntrinsicSize?.height ??\n\t\t\t\t\t\tMath.max(1, Math.round(hydratedPdfPage.height ?? item.bounds.height)),\n\t\t\t\t},\n\t\t\t});\n\t\t}),\n\t\tobjectUrls,\n\t};\n}\n","import { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect, rectsIntersect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"./types\";\n\ntype SpatialIndex = {\n\treadonly cellSize: number;\n\treadonly aabbs: readonly Rect[];\n\treadonly buckets: ReadonlyMap<string, readonly number[]>;\n};\n\nconst spatialIndexCache = new WeakMap<readonly VectorSceneItem[], SpatialIndex>();\n\nfunction cellKey(ix: number, iy: number): string {\n\treturn `${ix},${iy}`;\n}\n\nfunction buildSpatialIndex(\n\titems: readonly VectorSceneItem[],\n\tcellSize: number,\n): SpatialIndex {\n\tconst cached = spatialIndexCache.get(items);\n\tif (cached && cached.cellSize === cellSize) {\n\t\treturn cached;\n\t}\n\n\tconst aabbs: Rect[] = new Array(items.length);\n\tconst buckets = new Map<string, number[]>();\n\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (!item) continue;\n\t\tconst aabb = boundsAabbForRotatedItem(item);\n\t\taabbs[index] = aabb;\n\t\tconst { minIx, maxIx, minIy, maxIy } = cellRangeForRect(aabb, cellSize);\n\t\tfor (let ix = minIx; ix <= maxIx; ix += 1) {\n\t\t\tfor (let iy = minIy; iy <= maxIy; iy += 1) {\n\t\t\t\tconst key = cellKey(ix, iy);\n\t\t\t\tlet bucket = buckets.get(key);\n\t\t\t\tif (!bucket) {\n\t\t\t\t\tbucket = [];\n\t\t\t\t\tbuckets.set(key, bucket);\n\t\t\t\t}\n\t\t\t\tbucket.push(index);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst next: SpatialIndex = {\n\t\tcellSize,\n\t\taabbs,\n\t\tbuckets,\n\t};\n\tspatialIndexCache.set(items, next);\n\treturn next;\n}\n\n/**\n * Axis-aligned cell range (inclusive indices) for a rectangle in a uniform grid.\n */\nfunction cellRangeForRect(\n\tr: Rect,\n\tcellSize: number,\n): {\n\tminIx: number;\n\tmaxIx: number;\n\tminIy: number;\n\tmaxIy: number;\n} {\n\tconst n = normalizeRect(r);\n\tconst x1 = n.x + n.width;\n\tconst y1 = n.y + n.height;\n\tconst minIx = Math.floor(n.x / cellSize);\n\tconst maxIx = Math.max(minIx, Math.ceil(x1 / cellSize) - 1);\n\tconst minIy = Math.floor(n.y / cellSize);\n\tconst maxIy = Math.max(minIy, Math.ceil(y1 / cellSize) - 1);\n\treturn { minIx, maxIx, minIy, maxIy };\n}\n\n/**\n * Viewport cull using a uniform grid: each item is inserted into every cell its bounds\n * overlap. Query walks cells overlapping the viewport, dedupes by id, then applies an exact\n * {@link rectsIntersect} test. Output order matches the original `items` array (z-order).\n *\n * Build cost is O(n × cells per item); query cost is O(viewport cells × bucket size).\n * Use only when {@link items}.length is large enough that this beats a linear scan.\n */\nexport function cullItemsByViewportSpatial(\n\titems: readonly VectorSceneItem[],\n\tvisibleWorld: Rect,\n\tcellSize: number,\n): VectorSceneItem[] {\n\tconst { aabbs, buckets } = buildSpatialIndex(items, cellSize);\n\n\tconst vr = cellRangeForRect(visibleWorld, cellSize);\n\tconst seen = new Set<number>();\n\tconst outIndices: number[] = [];\n\n\tfor (let ix = vr.minIx; ix <= vr.maxIx; ix++) {\n\t\tfor (let iy = vr.minIy; iy <= vr.maxIy; iy++) {\n\t\t\tconst bucket = buckets.get(cellKey(ix, iy));\n\t\t\tif (!bucket) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const index of bucket) {\n\t\t\t\tif (seen.has(index)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseen.add(index);\n\t\t\t\tconst aabb = aabbs[index];\n\t\t\t\tif (aabb && rectsIntersect(aabb, visibleWorld)) {\n\t\t\t\t\toutIndices.push(index);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toutIndices.sort((a, b) => a - b);\n\treturn outIndices.map((index) => items[index]).filter((item) => item != null);\n}\n","import { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { rectsIntersect } from \"../math/rect\";\nimport { cullItemsByViewportSpatial } from \"./spatial-cull\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Below this count, a linear scan is cheaper than building the spatial grid. */\nconst SPATIAL_MIN_ITEMS = 400;\n\n/** World-space cell size for the uniform grid (px in world units). */\nconst SPATIAL_CELL_SIZE = 256;\n\nfunction cullItemsLinear(\n\titems: readonly VectorSceneItem[],\n\tvisibleWorld: Rect,\n): VectorSceneItem[] {\n\treturn items.filter((item) =>\n\t\trectsIntersect(boundsAabbForCull(item), visibleWorld),\n\t);\n}\n\nfunction boundsAabbForCull(item: VectorSceneItem): Rect {\n\treturn boundsAabbForRotatedItem(item);\n}\n\n/**\n * Returns scene items whose `bounds` intersect the visible world rectangle.\n *\n * Uses a uniform grid when there are many items; otherwise a linear filter (faster for\n * small scenes due to grid build overhead).\n */\nexport function cullItemsByViewport(\n\titems: readonly VectorSceneItem[],\n\tvisibleWorld: Rect,\n): VectorSceneItem[] {\n\tif (items.length < SPATIAL_MIN_ITEMS) {\n\t\treturn cullItemsLinear(items, visibleWorld);\n\t}\n\treturn cullItemsByViewportSpatial(items, visibleWorld, SPATIAL_CELL_SIZE);\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect } from \"../math/rect\";\nimport { cullItemsByViewport } from \"../scene/cull\";\nimport type { VectorScene } from \"../scene/scene\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Builds the SVG `transform` attribute for mapping world coordinates to viewport CSS pixels.\n */\nexport function formatCameraTransform(camera: Camera2D): string {\n\tconst z = camera.zoom;\n\treturn `matrix(${z}, 0, 0, ${z}, ${camera.x}, ${camera.y})`;\n}\n\n/**\n * Transform for item `<g>`: `translate(x,y)` plus optional rotation around the bounds center.\n * SVG `rotate` uses degrees.\n */\nexport function formatItemPlacementTransform(item: VectorSceneItem): string {\n\tconst r = normalizeRect(item.bounds);\n\tconst rot = item.rotation ?? 0;\n\tif (Math.abs(rot) < 1e-12) {\n\t\treturn `translate(${item.x}, ${item.y})`;\n\t}\n\tconst deg = (rot * 180) / Math.PI;\n\tconst cx = r.width / 2;\n\tconst cy = r.height / 2;\n\treturn `translate(${item.x}, ${item.y}) translate(${cx}, ${cy}) rotate(${deg}) translate(${-cx}, ${-cy})`;\n}\n\nexport type SvgVectorRendererOptions = {\n\t/** Root element (typically `position: relative` and fixed size). */\n\tcontainer: HTMLElement;\n\tscene: VectorScene;\n\tcamera: Camera2D;\n\t/**\n\t * When true, the scene SVG ignores pointer events so an overlay can own hit-testing\n\t * (interactive selection / resize / placement).\n\t */\n\tpointerEventsNone?: boolean;\n};\n\ntype CachedItemG = {\n\treadonly g: SVGGElement;\n\tlastChildrenSvg: string;\n\tlastTransform: string;\n};\n\n/**\n * Renders vector scene items into a single SVG: camera as an outer `<g>` transform,\n * so geometry stays sharp at any zoom (no fixed-resolution raster).\n *\n * Uses incremental DOM updates: keeps a stable `<g>` per visible item id, updates\n * `innerHTML` only when `childrenSvg` changes, and only adjusts the camera transform\n * when pan/zoom changes without content edits.\n */\nexport class SvgVectorRenderer {\n\tprivate readonly container: HTMLElement;\n\tprivate readonly scene: VectorScene;\n\tprivate readonly camera: Camera2D;\n\tprivate readonly svg: SVGSVGElement;\n\tprivate readonly rootG: SVGGElement;\n\tprivate readonly itemNodeCache = new Map<string, CachedItemG>();\n\tprivate liveOverlay: CachedItemG | null = null;\n\tprivate readonly resizeObserver: ResizeObserver;\n\n\tconstructor(options: SvgVectorRendererOptions) {\n\t\tthis.container = options.container;\n\t\tthis.scene = options.scene;\n\t\tthis.camera = options.camera;\n\n\t\tthis.svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tthis.svg.setAttribute(\"width\", \"100%\");\n\t\tthis.svg.setAttribute(\"height\", \"100%\");\n\t\tthis.svg.setAttribute(\"shape-rendering\", \"geometricPrecision\");\n\t\tthis.svg.style.display = \"block\";\n\t\tthis.svg.setAttribute(\"role\", \"presentation\");\n\t\tthis.svg.setAttribute(\"focusable\", \"false\");\n\t\tthis.setPointerEventsNone(options.pointerEventsNone ?? false);\n\n\t\tthis.rootG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tthis.svg.appendChild(this.rootG);\n\n\t\tthis.container.appendChild(this.svg);\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.render());\n\t\tthis.resizeObserver.observe(this.container);\n\t}\n\n\t/**\n\t * Reads container size, culls items, and updates the SVG (incrementally when possible).\n\t */\n\trender(): void {\n\t\tconst w = this.container.clientWidth;\n\t\tconst h = this.container.clientHeight;\n\t\tif (w <= 0 || h <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.svg.setAttribute(\"viewBox\", `0 0 ${w} ${h}`);\n\t\tthis.svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid slice\");\n\n\t\tconst visible = this.camera.getVisibleWorldRect(w, h);\n\t\tconst items = cullItemsByViewport(this.scene.getItems(), visible);\n\n\t\tthis.syncVisibleItems(items);\n\t\tthis.rootG.setAttribute(\"transform\", formatCameraTransform(this.camera));\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\t/**\n\t * Updates only the in-progress (live) stroke node without re-culling or\n\t * re-syncing the committed scene items. Drawing tools call this on every\n\t * pointer move, so it must stay O(1) regardless of how many items the\n\t * board already contains.\n\t *\n\t * Pass `null` to remove the live overlay (e.g. when the stroke is committed).\n\t */\n\trenderLiveItem(item: VectorSceneItem | null): void {\n\t\tif (!item) {\n\t\t\tif (this.liveOverlay) {\n\t\t\t\tthis.liveOverlay.g.remove();\n\t\t\t\tthis.liveOverlay = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.liveOverlay) {\n\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\tg.setAttribute(\"data-live-overlay\", \"true\");\n\t\t\tthis.liveOverlay = {\n\t\t\t\tg,\n\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\tlastTransform: \"\",\n\t\t\t};\n\t\t\tthis.rootG.appendChild(g);\n\t\t}\n\n\t\tconst cached = this.liveOverlay;\n\t\tconst t = formatItemPlacementTransform(item);\n\t\tif (cached.lastTransform !== t) {\n\t\t\tcached.g.setAttribute(\"transform\", t);\n\t\t\tcached.lastTransform = t;\n\t\t}\n\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\tcached.g.innerHTML = item.childrenSvg;\n\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t}\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\tprivate keepLiveOverlayOnTop(): void {\n\t\tif (this.liveOverlay && this.rootG.lastChild !== this.liveOverlay.g) {\n\t\t\tthis.rootG.appendChild(this.liveOverlay.g);\n\t\t}\n\t}\n\n\tprivate syncVisibleItems(items: readonly VectorSceneItem[]): void {\n\t\tconst visibleIds = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tvisibleIds.add(item.id);\n\t\t}\n\n\t\tfor (const [id, cached] of this.itemNodeCache) {\n\t\t\tif (!visibleIds.has(id)) {\n\t\t\t\tcached.g.remove();\n\t\t\t}\n\t\t}\n\n\t\tlet previousNode: ChildNode | null = null;\n\t\tfor (const item of items) {\n\t\t\tlet cached = this.itemNodeCache.get(item.id);\n\t\t\tif (!cached) {\n\t\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\t\tg.setAttribute(\"data-item-id\", item.id);\n\t\t\t\tcached = {\n\t\t\t\t\tg,\n\t\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\t\tlastTransform: \"\",\n\t\t\t\t};\n\t\t\t\tthis.itemNodeCache.set(item.id, cached);\n\t\t\t}\n\n\t\t\tconst { g } = cached;\n\t\t\tconst t = formatItemPlacementTransform(item);\n\t\t\tif (cached.lastTransform !== t) {\n\t\t\t\tg.setAttribute(\"transform\", t);\n\t\t\t\tcached.lastTransform = t;\n\t\t\t}\n\n\t\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\t\tg.innerHTML = item.childrenSvg;\n\t\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t\t}\n\n\t\t\tconst expectedPosition: ChildNode | null = previousNode\n\t\t\t\t? previousNode.nextSibling\n\t\t\t\t: this.rootG.firstChild;\n\t\t\tif (expectedPosition !== g) {\n\t\t\t\tthis.rootG.insertBefore(g, expectedPosition);\n\t\t\t}\n\t\t\tpreviousNode = g;\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.itemNodeCache.clear();\n\t\tthis.liveOverlay = null;\n\t\tthis.svg.remove();\n\t}\n\n\t/** Toggle whether the scene SVG receives pointer events (vs overlay handling them). */\n\tsetPointerEventsNone(value: boolean): void {\n\t\tthis.svg.style.pointerEvents = value ? \"none\" : \"auto\";\n\t}\n}\n","import {\n\tbuildArrowSvg,\n\tcreateShapeId,\n\trebuildItemSvg,\n\tresolveStrokeStyle,\n} from \"./shape-builders\";\nimport type { VectorSceneItem } from \"./types\";\n\n/**\n * Deep-clones an item with a new id. Rebuilds SVG where the id is embedded (arrow, text, custom).\n */\nexport function cloneVectorSceneItemWithNewId(\n\titem: VectorSceneItem,\n): VectorSceneItem {\n\tconst id = createShapeId();\n\tconst copy = JSON.parse(JSON.stringify(item)) as VectorSceneItem;\n\tlet next: VectorSceneItem = { ...copy, id };\n\tif (next.toolKind === \"arrow\" && next.line) {\n\t\tnext = {\n\t\t\t...next,\n\t\t\tchildrenSvg: buildArrowSvg(id, next.line, resolveStrokeStyle(next)),\n\t\t};\n\t}\n\tif (next.toolKind === \"text\" && next.text !== undefined) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\tif (\n\t\tnext.toolKind === \"custom\" &&\n\t\tnext.customInnerSvg &&\n\t\tnext.customIntrinsicSize\n\t) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\treturn next;\n}\n\nexport function cloneVectorSceneItemsWithNewIds(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\treturn items.map(cloneVectorSceneItemWithNewId);\n}\n","import type { Rect } from \"../math/rect\";\nimport { createCustomShapeItem } from \"./custom-shape\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Plugin key under which link metadata is stored on a link item's `pluginData`. */\nexport const LINK_PLUGIN_KEY = \"canvuLink\";\n\n/**\n * Metadata describing a clickable link/bookmark item.\n * `href` is required; the rest enrich the rendered card (unfurl result).\n */\nexport type CanvuLinkData = {\n\t/** Absolute URL the card points to. */\n\thref: string;\n\t/** Human readable title (falls back to the hostname). */\n\ttitle?: string;\n\t/** Short description shown under the title. */\n\tdescription?: string;\n\t/** Preview image URL (og:image). */\n\timage?: string;\n\t/** Favicon URL shown in the leading badge. */\n\tfavicon?: string;\n};\n\nconst DEFAULT_LINK_CARD_WIDTH = 360;\nconst DEFAULT_LINK_CARD_HEIGHT = 132;\nconst LINK_CARD_BORDER = \"#e2e8f0\";\nconst LINK_CARD_ACCENT = \"#2563eb\";\nconst LINK_CARD_TITLE_COLOR = \"#0f172a\";\nconst LINK_CARD_TEXT_COLOR = \"#475569\";\n\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.min(max, Math.max(min, value));\n\nconst formatNumber = (value: number): string => {\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Object.is(rounded, -0) ? \"0\" : String(rounded);\n};\n\nconst escapeXmlAttribute = (value: string): string =>\n\tvalue\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\")\n\t\t.replaceAll('\"', \""\")\n\t\t.replaceAll(\"'\", \"'\");\n\nconst escapeHtmlText = (value: string): string =>\n\tvalue.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n\nconst getLinkHostname = (href: string): string => {\n\ttry {\n\t\treturn new URL(href).hostname.replace(/^www\\./, \"\");\n\t} catch {\n\t\treturn href;\n\t}\n};\n\ntype LinkTextBand = {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\ttext: string;\n\tfontSize: number;\n\tcolor: string;\n\tfontWeight?: number;\n\tclampLines?: number;\n};\n\nconst buildLinkTextBand = (band: LinkTextBand): string => {\n\tconst lineHeight = band.fontSize * 1.3;\n\tconst weight = band.fontWeight != null ? `font-weight:${band.fontWeight};` : \"\";\n\tconst lineClampStyle = band.clampLines\n\t\t? `display:-webkit-box;-webkit-line-clamp:${band.clampLines};-webkit-box-orient:vertical;`\n\t\t: \"\";\n\treturn `<foreignObject x=\"${formatNumber(band.x)}\" y=\"${formatNumber(band.y)}\" width=\"${formatNumber(Math.max(1, band.width))}\" height=\"${formatNumber(Math.max(1, band.height))}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;font-family:system-ui,sans-serif;font-size:${formatNumber(band.fontSize)}px;line-height:${formatNumber(lineHeight)}px;color:${band.color};overflow:hidden;word-break:break-word;${lineClampStyle}${weight}\">${escapeHtmlText(band.text)}</div></foreignObject>`;\n};\n\n/**\n * Builds the inner SVG (no outer `<svg>`) for a link/bookmark card at the given box size.\n * Uses fixed pixel bands so text never overlaps regardless of the card's aspect ratio.\n */\nexport function buildLinkCardSvg(\n\twidth: number,\n\theight: number,\n\tlink: CanvuLinkData,\n): string {\n\tconst cardWidth = Math.max(1, width);\n\tconst cardHeight = Math.max(1, height);\n\tconst padding = 14;\n\tconst badgeSize = clamp(Math.min(72, cardHeight - padding * 2), 28, 96);\n\tconst textX = padding + badgeSize + 14;\n\tconst textWidth = Math.max(1, cardWidth - textX - padding);\n\tconst hostname = getLinkHostname(link.href);\n\tconst title = link.title?.trim() || hostname || \"Link\";\n\tconst description = link.description?.trim() || link.href;\n\n\tconst titleY = padding;\n\tconst titleHeight = clamp(cardHeight * 0.22, 18, 28);\n\tconst hostY = titleY + titleHeight + 2;\n\tconst hostHeight = 16;\n\tconst descY = hostY + hostHeight + 4;\n\tconst descHeight = Math.max(1, cardHeight - descY - padding);\n\n\tconst badge = link.favicon\n\t\t? `<clipPath id=\"canvu-link-badge\"><rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" /></clipPath>\n\t\t<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"#f8fafc\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" />\n\t\t<image href=\"${escapeXmlAttribute(link.favicon)}\" x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" preserveAspectRatio=\"xMidYMid slice\" clip-path=\"url(#canvu-link-badge)\" />`\n\t\t: `<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"${LINK_CARD_ACCENT}\" fill-opacity=\"0.1\" stroke=\"${LINK_CARD_ACCENT}\" stroke-opacity=\"0.3\" stroke-width=\"1\" />\n\t\t<g transform=\"translate(${formatNumber(padding + badgeSize / 2)},${formatNumber(padding + badgeSize / 2)})\" stroke=\"${LINK_CARD_ACCENT}\" stroke-width=\"2.4\" stroke-linecap=\"round\" fill=\"none\">\n\t\t\t<path d=\"M-9 3 a6 6 0 0 1 0 -8 l4 -4 a6 6 0 0 1 8 8 l-2 2\" />\n\t\t\t<path d=\"M9 -3 a6 6 0 0 1 0 8 l-4 4 a6 6 0 0 1 -8 -8 l2 -2\" />\n\t\t</g>`;\n\n\tconst externalIconX = cardWidth - padding - 16;\n\tconst externalIcon = `<g transform=\"translate(${formatNumber(externalIconX)},${formatNumber(padding)})\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n\t\t<path d=\"M6 1 H11 V6\" />\n\t\t<path d=\"M11 1 L4.5 7.5\" />\n\t\t<path d=\"M9 7 V10 a1 1 0 0 1 -1 1 H2 a1 1 0 0 1 -1 -1 V4 a1 1 0 0 1 1 -1 H5\" />\n\t</g>`;\n\n\treturn `\n\t\t<rect width=\"${formatNumber(cardWidth)}\" height=\"${formatNumber(cardHeight)}\" rx=\"16\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1.5\" />\n\t\t${badge}\n\t\t${externalIcon}\n\t\t${buildLinkTextBand({ x: textX, y: titleY, width: textWidth - 18, height: titleHeight, text: title, fontSize: 15, color: LINK_CARD_TITLE_COLOR, fontWeight: 700, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: hostY, width: textWidth, height: hostHeight, text: hostname, fontSize: 12, color: LINK_CARD_ACCENT, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: descY, width: textWidth, height: descHeight, text: description, fontSize: 12, color: LINK_CARD_TEXT_COLOR, clampLines: 2 })}\n\t`;\n}\n\nconst isCanvuLinkData = (value: unknown): value is CanvuLinkData => {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst candidate = value as Record<string, unknown>;\n\treturn typeof candidate.href === \"string\" && candidate.href.length > 0;\n};\n\n/** Reads the link metadata from an item, or `null` when the item is not a link. */\nexport function getLinkData(item: VectorSceneItem): CanvuLinkData | null {\n\tconst entry = item.pluginData?.[LINK_PLUGIN_KEY];\n\treturn isCanvuLinkData(entry) ? entry : null;\n}\n\n/** True when the item carries link metadata (clickable card). */\nexport function isLinkItem(item: VectorSceneItem): boolean {\n\treturn getLinkData(item) != null;\n}\n\n/**\n * Creates a clickable link/bookmark card item ready to append to the scene.\n * The card resizes by scaling its authored SVG, like other custom shapes.\n */\nexport function createLinkItem(\n\tid: string,\n\tbounds: Rect,\n\tlink: CanvuLinkData,\n): VectorSceneItem {\n\tconst width = bounds.width || DEFAULT_LINK_CARD_WIDTH;\n\tconst height = bounds.height || DEFAULT_LINK_CARD_HEIGHT;\n\tconst item = createCustomShapeItem(\n\t\tid,\n\t\t{ ...bounds, width, height },\n\t\t{ render: (size) => buildLinkCardSvg(size.width, size.height, link) },\n\t);\n\treturn {\n\t\t...item,\n\t\tpluginData: {\n\t\t\t...(item.pluginData ?? {}),\n\t\t\t[LINK_PLUGIN_KEY]: link,\n\t\t},\n\t};\n}\n\n/** Default card size used when placing a new link without explicit bounds. */\nexport const DEFAULT_LINK_CARD_SIZE = {\n\twidth: DEFAULT_LINK_CARD_WIDTH,\n\theight: DEFAULT_LINK_CARD_HEIGHT,\n} as const;\n","import { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport { cloneVectorSceneItemWithNewId } from \"./clone-item\";\nimport type { VectorSceneItem } from \"./types\";\n\nexport const MANAGED_KEY = \"managed\";\n\nconst STACK_GAP_WORLD = 16;\n\nexport function isManagedImage(item: VectorSceneItem): boolean {\n\tconst data = item.pluginData;\n\treturn data != null && (data as { [key: string]: unknown })[MANAGED_KEY] === true;\n}\n\nexport function markImageAsManaged(item: VectorSceneItem): VectorSceneItem {\n\treturn {\n\t\t...item,\n\t\tlocked: true,\n\t\tpluginData: { ...(item.pluginData ?? {}), [MANAGED_KEY]: true },\n\t};\n}\n\n/**\n * Repositions every managed image into a single vertical stack. The stack\n * origin is the current topmost (minimum Y) managed item — that point in world\n * space is stable across reorder/copy/delete operations, so reorder swaps slots\n * instead of making the whole stack drift downward. Subsequent items are\n * centered on the anchor's center X and stacked downward with a fixed gap.\n *\n * Non-managed items keep their position. Call this after any operation that\n * changes the relative order or count of managed images so the canvas reflects\n * the menu order.\n */\nexport function restackManagedImages(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\tlet anchorAabbY = Infinity;\n\tlet anchorCenterX = 0;\n\tfor (const item of items) {\n\t\tif (!isManagedImage(item)) continue;\n\t\tconst aabb = boundsAabbForRotatedItem(item);\n\t\tif (aabb.y < anchorAabbY) {\n\t\t\tanchorAabbY = aabb.y;\n\t\t\tanchorCenterX = aabb.x + aabb.width / 2;\n\t\t}\n\t}\n\tif (!Number.isFinite(anchorAabbY)) return [...items];\n\tlet cursorY = anchorAabbY;\n\treturn items.map((item) => {\n\t\tif (!isManagedImage(item)) return item;\n\t\t// Rotation pivots around the unrotated bounds' center, which is also the\n\t\t// AABB's center. Place the item so its AABB top-left lands at the cursor\n\t\t// centered on the anchor's AABB center X, then advance the cursor by the\n\t\t// AABB height so rotated items push subsequent items down.\n\t\tconst aabb = boundsAabbForRotatedItem(item);\n\t\tconst centerY = cursorY + aabb.height / 2;\n\t\tconst newX = anchorCenterX - item.bounds.width / 2;\n\t\tconst newY = centerY - item.bounds.height / 2;\n\t\tcursorY += aabb.height + STACK_GAP_WORLD;\n\t\tif (item.bounds.x === newX && item.bounds.y === newY) return item;\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: newX,\n\t\t\ty: newY,\n\t\t\tbounds: { ...item.bounds, x: newX, y: newY },\n\t\t};\n\t});\n}\n\n/**\n * Marks `newItem` as a managed image (locked + `pluginData.managed = true`),\n * appends it to `items`, and restacks all managed images so the new one lands\n * at the bottom of the stack with the anchor preserved.\n *\n * Typical usage: after producing scene items with\n * `ingestAssetFilesToSceneItems`, push each result through this helper to add\n * them to the managed-images stack:\n *\n * ```ts\n * let next = doc.items;\n * for (const created of result.items) next = addManagedImage(next, created);\n * doc.onItemsChange(next);\n * ```\n */\nexport function addManagedImage(\n\titems: readonly VectorSceneItem[],\n\tnewItem: VectorSceneItem,\n): VectorSceneItem[] {\n\treturn restackManagedImages([...items, markImageAsManaged(newItem)]);\n}\n\nexport function copyManagedImage(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n): VectorSceneItem[] {\n\tconst idx = items.findIndex((i) => i.id === id);\n\tif (idx < 0) return [...items];\n\tconst source = items[idx];\n\tif (!source) return [...items];\n\tconst clone = markImageAsManaged(cloneVectorSceneItemWithNewId(source));\n\tconst inserted = [...items.slice(0, idx + 1), clone, ...items.slice(idx + 1)];\n\treturn restackManagedImages(inserted);\n}\n\nexport function rotateManagedImage(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n): VectorSceneItem[] {\n\treturn restackManagedImages(\n\t\titems.map((i) =>\n\t\t\ti.id === id\n\t\t\t\t? { ...i, rotation: ((i.rotation ?? 0) + Math.PI / 2) % (Math.PI * 2) }\n\t\t\t\t: i,\n\t\t),\n\t);\n}\n\nexport function deleteManagedImage(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n): VectorSceneItem[] {\n\treturn restackManagedImages(items.filter((i) => i.id !== id));\n}\n\nexport function reorderManagedImages(\n\titems: readonly VectorSceneItem[],\n\torderedManagedIds: readonly string[],\n): VectorSceneItem[] {\n\tconst managedSlots: number[] = [];\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst item = items[i];\n\t\tif (item && isManagedImage(item)) managedSlots.push(i);\n\t}\n\tif (managedSlots.length !== orderedManagedIds.length) {\n\t\treturn [...items];\n\t}\n\tconst byId = new Map(items.map((i) => [i.id, i]));\n\tconst next = [...items];\n\tmanagedSlots.forEach((slot, k) => {\n\t\tconst orderedId = orderedManagedIds[k];\n\t\tif (orderedId === undefined) return;\n\t\tconst replacement = byId.get(orderedId);\n\t\tif (replacement) next[slot] = replacement;\n\t});\n\treturn restackManagedImages(next);\n}\n","import type { VectorSceneItem } from \"./types\";\n\n/**\n * Mutable collection of vector scene items (replace wholesale for simplicity in MVP).\n */\nexport class VectorScene {\n\tprivate items: VectorSceneItem[] = [];\n\n\tgetItems(): readonly VectorSceneItem[] {\n\t\treturn this.items;\n\t}\n\n\t/**\n\t * Replaces the entire scene contents.\n\t */\n\tsetItems(next: readonly VectorSceneItem[]): void {\n\t\tthis.items = [...next];\n\t}\n\n\tclear(): void {\n\t\tthis.items = [];\n\t}\n}\n"]}
|