canvu-react 0.4.69 → 0.4.71
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/{asset-hydration-D2xaUoAT.d.cts → asset-hydration-BeWWxiBq.d.cts} +1 -1
- package/dist/{asset-hydration-D9eThWse.d.ts → asset-hydration-CLoDkZDh.d.ts} +1 -1
- package/dist/chatbot.d.cts +2 -2
- package/dist/chatbot.d.ts +2 -2
- package/dist/index.cjs +52 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +52 -2
- package/dist/index.js.map +1 -1
- package/dist/{raster-image-canvas-CCOmB4NY.d.ts → raster-image-canvas-BqBgE8C-.d.ts} +33 -1
- package/dist/{raster-image-canvas-nK9kM9UJ.d.cts → raster-image-canvas-Byq087t9.d.cts} +33 -1
- package/dist/react.cjs +52 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -6
- package/dist/react.d.ts +6 -6
- package/dist/react.js +52 -2
- package/dist/react.js.map +1 -1
- package/dist/realtime.cjs.map +1 -1
- package/dist/realtime.d.cts +2 -2
- package/dist/realtime.d.ts +2 -2
- package/dist/realtime.js.map +1 -1
- package/dist/{types-CMuEaiM7.d.ts → types-D_cQxUug.d.ts} +1 -1
- package/dist/{types-D402X18k.d.cts → types-f8d-2-6N.d.cts} +1 -1
- package/package.json +1 -1
package/dist/index.cjs.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/link-item.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/raster-image-canvas.ts","../src/renderer/svg-vector-renderer.ts","../src/scene/clone-item.ts","../src/scene/managed-images.ts","../src/scene/scene.ts"],"names":["escapeHtmlText","startX","startY","d","getStroke","op","b","s","height","width","g"],"mappings":"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","file":"index.cjs","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?: (event: PointerEvent) => 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(e);\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 { CustomShapeResizeHandles } from \"../interaction/resize-handles\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"./types\";\n\nexport type { CustomShapeResizeHandles } from \"../interaction/resize-handles\";\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 * Optional behavior and styling hooks for {@link createCustomShapeItem}.\n */\nexport type CreateCustomShapeOptions = {\n\t/**\n\t * Controls which resize handles are visible and active for the custom shape.\n\t *\n\t * Defaults to `\"all\"`. Use `\"corners\"` for corner-only resize, explicit handle ids such\n\t * as `[\"se\"]` for constrained tools, or an empty array to hide resize dots while keeping\n\t * selection and rotation available.\n\t */\n\tresizeHandles?: CustomShapeResizeHandles;\n\t/**\n\t * CSS class applied to the outer rendered SVG `<g>`.\n\t *\n\t * Useful for custom animations and styling. In interactive canvases, prefer\n\t * `[data-canvu-hovered=\"true\"]` over `:hover` because the scene SVG often has\n\t * `pointer-events: none` while Canvu owns hit-testing in a separate layer.\n\t */\n\tsvgClassName?: string;\n};\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 *\n * @example One resize handle and a CSS animation hook\n * ```ts\n * createCustomShapeItem(id, rect, { svg }, {\n * resizeHandles: [\"se\"],\n * svgClassName: \"sticky-note\",\n * });\n * ```\n */\nexport function createCustomShapeItem(\n\tid: string,\n\tbounds: Rect,\n\tcontent: CreateCustomShapeContent,\n\toptions: CreateCustomShapeOptions = {},\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\t...(options.resizeHandles !== undefined\n\t\t\t? { customResizeHandles: options.resizeHandles }\n\t\t\t: {}),\n\t\t...(options.svgClassName ? { svgClassName: options.svgClassName } : {}),\n\t\tchildrenSvg: buildCustomShapeChildrenSvg(inner, intrinsic, r),\n\t};\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 = 320;\nconst DEFAULT_LINK_CARD_HEIGHT = 70;\nexport const LINK_CARD_MIN_SCALE = 0.6;\nexport const LINK_CARD_MAX_SCALE = 6;\nexport const LINK_CARD_ASPECT = DEFAULT_LINK_CARD_WIDTH / DEFAULT_LINK_CARD_HEIGHT;\nconst LINK_CARD_BORDER = \"oklch(0.918 0.008 255)\";\nconst LINK_CARD_BORDER_STRONG = \"oklch(0.86 0.012 255)\";\nconst LINK_CARD_ACCENT = \"oklch(0.55 0.19 264)\";\nconst LINK_CARD_ACCENT_DEEP = \"oklch(0.46 0.18 264)\";\nconst LINK_CARD_TITLE_COLOR = \"oklch(0.26 0.022 265)\";\nconst LINK_CARD_TEXT_COLOR = \"oklch(0.55 0.022 265)\";\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 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};\n\nconst buildLinkTextBand = (band: LinkTextBand): string => {\n\tconst lineHeight = band.height;\n\tconst weight = band.fontWeight != null ? `font-weight:${band.fontWeight};` : \"\";\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;letter-spacing:-0.01em;color:${band.color};overflow:hidden;white-space:nowrap;text-overflow:ellipsis;${weight}\">${escapeHtmlText(band.text)}</div></foreignObject>`;\n};\n\nconst getLinkProtocol = (href: string): string => {\n\ttry {\n\t\treturn new URL(href).protocol;\n\t} catch {\n\t\treturn \"\";\n\t}\n};\n\nconst getLinkInitial = (hostname: string): string => {\n\tconst first = hostname.trim().charAt(0).toUpperCase();\n\treturn first || \"L\";\n};\n\nconst getStableLinkIdSuffix = (value: string): string => {\n\tlet hash = 0;\n\tfor (const char of value) {\n\t\thash = (hash * 31 + char.charCodeAt(0)) >>> 0;\n\t}\n\treturn hash.toString(36);\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\t_height: number,\n\tlink: CanvuLinkData,\n): string {\n\tconst cardWidth = Math.max(1, width);\n\tconst scale = cardWidth / DEFAULT_LINK_CARD_WIDTH;\n\tconst contentWidth = DEFAULT_LINK_CARD_WIDTH;\n\tconst contentHeight = DEFAULT_LINK_CARD_HEIGHT;\n\tconst padding = 14;\n\tconst badgeSize = 42;\n\tconst gap = 13;\n\tconst buttonSize = 34;\n\tconst textX = padding + badgeSize + gap;\n\tconst textWidth = Math.max(1, contentWidth - textX - buttonSize - gap - padding);\n\tconst hostname = getLinkHostname(link.href);\n\tconst title = link.title?.trim() || hostname || \"Link\";\n\tconst protocol = getLinkProtocol(link.href);\n\tconst subtitle = hostname || link.href;\n\tconst idSuffix = getStableLinkIdSuffix(`${hostname}:${link.href}`);\n\tconst gradientId = `canvu-link-favicon-gradient-${idSuffix}`;\n\tconst buttonX = contentWidth - padding - buttonSize;\n\tconst buttonY = (contentHeight - buttonSize) / 2;\n\tconst isSecure = protocol === \"https:\";\n\tconst subtitleX = isSecure ? textX + 13 : textX;\n\tconst subtitleWidth = isSecure ? textWidth - 13 : textWidth;\n\n\treturn `\n\t\t<style>\n\t\t\t.canvu-link-card-root .canvu-link-card { transition: transform .18s ease, filter .18s ease, stroke .18s ease; }\n\t\t\t.canvu-link-card-root .canvu-link-open { opacity: 0; transform: translateX(-4px); transition: opacity .18s ease, transform .18s ease; }\n\t\t\t.canvu-link-card-root:hover .canvu-link-card { transform: translateY(-2px); filter: drop-shadow(0 4px 14px oklch(0.4 0.05 265 / .08)) drop-shadow(0 1px 3px oklch(0.4 0.05 265 / .06)); stroke: ${LINK_CARD_BORDER_STRONG}; }\n\t\t\t.canvu-link-card-root:hover .canvu-link-open { opacity: 1; transform: translateX(0); }\n\t\t</style>\n\t\t<g class=\"canvu-link-card-root\" transform=\"scale(${formatNumber(scale)})\">\n\t\t\t<rect class=\"canvu-link-card\" width=\"${formatNumber(contentWidth)}\" height=\"${formatNumber(contentHeight)}\" rx=\"16\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" filter=\"drop-shadow(0 1px 2px oklch(0.4 0.03 265 / .05)) drop-shadow(0 1px 1px oklch(0.4 0.03 265 / .04))\" />\n\t\t\t<defs>\n\t\t\t\t<linearGradient id=\"${gradientId}\" x1=\"8\" y1=\"48\" x2=\"48\" y2=\"8\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<stop stop-color=\"${LINK_CARD_ACCENT}\" />\n\t\t\t\t\t<stop offset=\"1\" stop-color=\"${LINK_CARD_ACCENT_DEEP}\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t\t<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"11\" fill=\"url(#${gradientId})\" />\n\t\t\t<text x=\"${formatNumber(padding + badgeSize / 2)}\" y=\"${formatNumber(padding + badgeSize / 2 + 5)}\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"17\" font-weight=\"700\" fill=\"#ffffff\">${escapeHtmlText(getLinkInitial(hostname))}</text>\n\t\t\t${buildLinkTextBand({ x: textX, y: 16, width: textWidth, height: 19, text: title, fontSize: 14.5, color: LINK_CARD_TITLE_COLOR, fontWeight: 700 })}\n\t\t\t${\n\t\t\t\tisSecure\n\t\t\t\t\t? `<g transform=\"translate(${formatNumber(textX)},40)\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"><rect x=\"1.5\" y=\"4.5\" width=\"7\" height=\"6\" rx=\"1\" /><path d=\"M3 4.5 V3 a2 2 0 0 1 4 0 v1.5\" /></g>`\n\t\t\t\t\t: \"\"\n\t\t\t}\n\t\t\t${buildLinkTextBand({ x: subtitleX, y: 36, width: subtitleWidth, height: 17, text: subtitle, fontSize: 12.5, color: LINK_CARD_TEXT_COLOR })}\n\t\t\t<g class=\"canvu-link-open\" transform=\"translate(${formatNumber(buttonX)},${formatNumber(buttonY)})\">\n\t\t\t\t<rect width=\"${formatNumber(buttonSize)}\" height=\"${formatNumber(buttonSize)}\" rx=\"10\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" />\n\t\t\t\t<g transform=\"translate(10,10)\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n\t\t\t\t\t<path d=\"M8 2 H14 V8\" />\n\t\t\t\t\t<path d=\"M14 2 L7 9\" />\n\t\t\t\t\t<path d=\"M12 10 V13 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 V5 a1 1 0 0 1 1 -1 H6\" />\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\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\nexport function rebuildLinkItemSvg(item: VectorSceneItem): VectorSceneItem {\n\tconst link = getLinkData(item);\n\tif (!link) return item;\n\tconst scale = clamp(\n\t\titem.bounds.width / DEFAULT_LINK_CARD_WIDTH,\n\t\tLINK_CARD_MIN_SCALE,\n\t\tLINK_CARD_MAX_SCALE,\n\t);\n\tconst width = DEFAULT_LINK_CARD_WIDTH * scale;\n\tconst height = DEFAULT_LINK_CARD_HEIGHT * scale;\n\tconst bounds = {\n\t\t...item.bounds,\n\t\twidth,\n\t\theight,\n\t};\n\tconst customInnerSvg = buildLinkCardSvg(\n\t\tDEFAULT_LINK_CARD_WIDTH,\n\t\tDEFAULT_LINK_CARD_HEIGHT,\n\t\tlink,\n\t);\n\treturn {\n\t\t...item,\n\t\tx: bounds.x,\n\t\ty: bounds.y,\n\t\tbounds,\n\t\tcustomIntrinsicSize: {\n\t\t\twidth: DEFAULT_LINK_CARD_WIDTH,\n\t\t\theight: DEFAULT_LINK_CARD_HEIGHT,\n\t\t},\n\t\tcustomInnerSvg,\n\t\tchildrenSvg: buildLinkCardSvg(width, height, link),\n\t};\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 rebuildLinkItemSvg({\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","/**\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 { getLinkData, rebuildLinkItemSvg } from \"./link-item\";\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;\n\ntype CloudPoint = readonly [number, number];\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\tarcRadius = ARCHITECTURAL_CLOUD_RADIUS,\n\tbulge = 1,\n): string {\n\tconst padding = Math.max(0, strokeWidth * 2);\n\tconst cloudWidth = Math.max(0, width - padding);\n\tconst cloudHeight = Math.max(0, height - padding);\n\tif (cloudWidth <= 0 || cloudHeight <= 0 || arcRadius <= 0 || bulge <= 0) return \"\";\n\n\tconst offset = padding / 2;\n\tconst corners: CloudPoint[] = [\n\t\t[offset, offset],\n\t\t[offset + cloudWidth, offset],\n\t\t[offset + cloudWidth, offset + cloudHeight],\n\t\t[offset, offset + cloudHeight],\n\t];\n\n\tconst points: Array<readonly [number, number, number]> = [];\n\tfor (let index = 0; index < corners.length; index += 1) {\n\t\tconst [startX, startY] = corners[index] ?? [0, 0];\n\t\tconst [endX, endY] = corners[(index + 1) % corners.length] ?? [0, 0];\n\t\tconst edgeLength = Math.hypot(endX - startX, endY - startY);\n\t\tconst arcCount = Math.max(1, Math.round(edgeLength / (2 * arcRadius)));\n\t\tconst chord = edgeLength / arcCount;\n\n\t\tfor (let arcIndex = 1; arcIndex <= arcCount; arcIndex += 1) {\n\t\t\tconst t = arcIndex / arcCount;\n\t\t\tpoints.push([\n\t\t\t\tstartX + (endX - startX) * t,\n\t\t\t\tstartY + (endY - startY) * t,\n\t\t\t\tchord,\n\t\t\t] as const);\n\t\t}\n\t}\n\n\tconst [startX, startY] = corners[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [pointX, pointY, chord] of points) {\n\t\tconst radius = (chord / 2) * bulge;\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(pointX)} ${svgNumber(pointY)}`,\n\t\t);\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 (getLinkData(item)) {\n\t\treturn rebuildLinkItemSvg(item);\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\";\nimport { getLinkData } from \"../scene/link-item\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type ResizeHandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nexport const ALL_RESIZE_HANDLES: readonly ResizeHandleId[] = [\n\t\"nw\",\n\t\"n\",\n\t\"ne\",\n\t\"e\",\n\t\"se\",\n\t\"s\",\n\t\"sw\",\n\t\"w\",\n];\nexport const CORNER_RESIZE_HANDLES: readonly ResizeHandleId[] = [\n\t\"nw\",\n\t\"ne\",\n\t\"se\",\n\t\"sw\",\n];\n\n/**\n * Resize handles exposed for a custom shape.\n *\n * Use `\"all\"` for the default 8 handles, `\"corners\"` for corner-only resize,\n * or pass explicit handle ids for constrained tools such as a single southeast\n * corner handle. An empty array hides resize dots but leaves selection and\n * rotation available.\n */\nexport type CustomShapeResizeHandles = \"all\" | \"corners\" | readonly ResizeHandleId[];\n\nfunction dedupeHandles(\n\thandles: readonly ResizeHandleId[],\n): readonly ResizeHandleId[] {\n\tconst allowed = new Set(handles);\n\treturn ALL_RESIZE_HANDLES.filter((handle) => allowed.has(handle));\n}\n\nfunction resolveCustomResizeHandles(\n\thandles: CustomShapeResizeHandles | undefined,\n): readonly ResizeHandleId[] {\n\tif (handles === \"corners\") return CORNER_RESIZE_HANDLES;\n\tif (handles === \"all\" || handles === undefined) return ALL_RESIZE_HANDLES;\n\treturn dedupeHandles(handles);\n}\n\n/**\n * Returns the resize handles that should be visible and active for an item.\n *\n * Link cards keep their historical corner-only behavior. Custom shapes may\n * narrow the handle set through `customResizeHandles`; all other resizable\n * items use the full 8-handle set.\n */\nexport function resolveResizeHandlesForItem(\n\titem: VectorSceneItem | null | undefined,\n): readonly ResizeHandleId[] {\n\tif (!item) return ALL_RESIZE_HANDLES;\n\tif (getLinkData(item)) return CORNER_RESIZE_HANDLES;\n\tif (item.toolKind === \"custom\") {\n\t\treturn resolveCustomResizeHandles(item.customResizeHandles);\n\t}\n\treturn ALL_RESIZE_HANDLES;\n}\n\n/** Returns whether a handle is currently visible/active for an item. */\nexport function itemAllowsResizeHandle(\n\titem: VectorSceneItem | null | undefined,\n\thandle: ResizeHandleId,\n): boolean {\n\treturn resolveResizeHandlesForItem(item).includes(handle);\n}\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\thandles: readonly ResizeHandleId[] = ALL_RESIZE_HANDLES,\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 handles) {\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 { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nconst DEFAULT_PIXEL_HEADROOM = 1.5;\nconst DEFAULT_MAX_PIXEL_COUNT = 12_000_000;\nconst DEFAULT_MAX_DIMENSION = 4096;\nconst DEFAULT_UPSCALE_REDRAW_RATIO = 1.15;\n\n/**\n * Input passed to `imageCanvasRendering.resolveSourceSize`.\n *\n * Use it when the item's current `imageIntrinsicSize` is only a preview size,\n * but your backing image service can provide a larger source for zoomed canvas\n * rendering. Return the effective source size Canvu should cap against before\n * computing the next bitmap target.\n */\nexport type RasterImageCanvasSourceSizeRequest = {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tcontentRect: Rect;\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\tdevicePixelRatio: number;\n};\n\n/**\n * Maps an image item to the effective source size used for zoom-aware bitmap\n * sizing.\n *\n * Return `null`/`undefined` to use the item's `imageIntrinsicSize`.\n */\nexport type RasterImageCanvasSourceSizeResolver = (\n\trequest: RasterImageCanvasSourceSizeRequest,\n) => { width: number; height: number } | null | undefined;\n\n/**\n * Input passed to `imageCanvasRendering.resolveRenderTarget`.\n *\n * Use it to map the current image item and zoom-derived bitmap size to the best\n * available resized URL from your image service. Apps that do not provide a\n * resolver still get canvas drawing from the original `imageRasterHref`.\n *\n * @example\n * ```ts\n * const resolveRenderTarget = ({ href, targetSize }) =>\n * `${href}&w=${targetSize.width}`;\n * ```\n */\nexport type RasterImageCanvasRenderRequest = {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tsourceSize: { width: number; height: number };\n\tcontentRect: Rect;\n\ttargetSize: { width: number; height: number };\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\tdevicePixelRatio: number;\n};\n\n/**\n * Resolved raster source for a zoom-aware canvas redraw.\n *\n * Return a stable `sourceKey` when multiple URLs may represent the same bitmap\n * quality tier. Canvu uses it to avoid redundant redraws and to keep the\n * previous canvas visible until a sharper target has decoded.\n */\nexport type RasterImageCanvasRenderTarget = {\n\thref: string;\n\tsourceKey?: string;\n};\n\n/**\n * Maps an image item plus requested bitmap size to the URL that should be\n * decoded into the canvas overlay.\n *\n * Return a string for simple URL rewriting, an object when you need a custom\n * `sourceKey`, or `null`/`undefined` to keep using the item's `imageRasterHref`.\n */\nexport type RasterImageCanvasRenderTargetResolver = (\n\trequest: RasterImageCanvasRenderRequest,\n) => string | RasterImageCanvasRenderTarget | null | undefined;\n\n/**\n * Enables zoom-aware canvas rendering for image items in `VectorViewport`.\n *\n * This is intended for large raster pages such as PDFs. The original SVG image\n * remains mounted as a fallback, while Canvu decodes and draws a canvas bitmap\n * sized for the current zoom. On zoom out, Canvu keeps the sharper bitmap\n * already drawn instead of downgrading immediately.\n */\nexport type RasterImageCanvasRenderingOptions = {\n\tresolveSourceSize?: RasterImageCanvasSourceSizeResolver;\n\tresolveRenderTarget?: RasterImageCanvasRenderTargetResolver;\n\tdevicePixelRatio?: number;\n\tpixelHeadroom?: number;\n\tmaxPixelCount?: number;\n\tmaxDimension?: number;\n\tupscaleRedrawRatio?: number;\n};\n\nexport type ResolvedRasterImageCanvasRenderingOptions = {\n\tresolveSourceSize?: RasterImageCanvasSourceSizeResolver;\n\tresolveRenderTarget?: RasterImageCanvasRenderTargetResolver;\n\tdevicePixelRatio: number;\n\tpixelHeadroom: number;\n\tmaxPixelCount: number;\n\tmaxDimension: number;\n\tupscaleRedrawRatio: number;\n};\n\nexport type ResolvedRasterImageCanvasRenderTarget = {\n\thref: string;\n\tsourceKey: string;\n\ttargetSize: { width: number; height: number };\n\tcontentRect: Rect;\n};\n\nexport function resolveRasterImageCanvasRenderingOptions(\n\toptions: RasterImageCanvasRenderingOptions | null | undefined,\n): ResolvedRasterImageCanvasRenderingOptions | null {\n\tif (!options) return null;\n\tconst fallbackDevicePixelRatio =\n\t\ttypeof window === \"undefined\" ? 1 : window.devicePixelRatio;\n\treturn {\n\t\tresolveSourceSize: options.resolveSourceSize,\n\t\tresolveRenderTarget: options.resolveRenderTarget,\n\t\tdevicePixelRatio: toPositiveFiniteNumber(\n\t\t\toptions.devicePixelRatio,\n\t\t\tfallbackDevicePixelRatio,\n\t\t),\n\t\tpixelHeadroom: toPositiveFiniteNumber(\n\t\t\toptions.pixelHeadroom,\n\t\t\tDEFAULT_PIXEL_HEADROOM,\n\t\t),\n\t\tmaxPixelCount: toPositiveFiniteNumber(\n\t\t\toptions.maxPixelCount,\n\t\t\tDEFAULT_MAX_PIXEL_COUNT,\n\t\t),\n\t\tmaxDimension: toPositiveFiniteNumber(\n\t\t\toptions.maxDimension,\n\t\t\tDEFAULT_MAX_DIMENSION,\n\t\t),\n\t\tupscaleRedrawRatio: toPositiveFiniteNumber(\n\t\t\toptions.upscaleRedrawRatio,\n\t\t\tDEFAULT_UPSCALE_REDRAW_RATIO,\n\t\t),\n\t};\n}\n\nexport function getRasterImageContentRect(item: VectorSceneItem): Rect | null {\n\tif (item.toolKind !== \"image\" || !item.imageIntrinsicSize) return null;\n\tconst bounds = normalizeRect(item.bounds);\n\tconst intrinsicWidth = Math.max(1e-6, item.imageIntrinsicSize.width);\n\tconst intrinsicHeight = Math.max(1e-6, item.imageIntrinsicSize.height);\n\tconst boundsAspectRatio = bounds.width / Math.max(1e-9, bounds.height);\n\tconst imageAspectRatio = intrinsicWidth / intrinsicHeight;\n\n\tif (Math.abs(boundsAspectRatio - imageAspectRatio) < 1e-3) {\n\t\treturn { x: 0, y: 0, width: bounds.width, height: bounds.height };\n\t}\n\n\tif (boundsAspectRatio > imageAspectRatio) {\n\t\tconst height = bounds.height;\n\t\tconst width = height * imageAspectRatio;\n\t\treturn { x: (bounds.width - width) / 2, y: 0, width, height };\n\t}\n\n\tconst width = bounds.width;\n\tconst height = width / imageAspectRatio;\n\treturn { x: 0, y: (bounds.height - height) / 2, width, height };\n}\n\nexport function resolveRasterImageCanvasSourceSize({\n\titem,\n\thref,\n\tintrinsicSize,\n\tcontentRect,\n\tviewportSize,\n\tcameraZoom,\n\toptions,\n}: {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tcontentRect: Rect;\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\toptions: ResolvedRasterImageCanvasRenderingOptions;\n}): { width: number; height: number } {\n\tconst resolved = options.resolveSourceSize?.({\n\t\titem,\n\t\thref,\n\t\tintrinsicSize,\n\t\tcontentRect,\n\t\tviewportSize,\n\t\tcameraZoom,\n\t\tdevicePixelRatio: options.devicePixelRatio,\n\t});\n\tconst width = toPositiveFiniteNumber(resolved?.width, intrinsicSize.width);\n\tconst height = toPositiveFiniteNumber(resolved?.height, intrinsicSize.height);\n\n\treturn { width, height };\n}\n\nexport function getRasterImageCanvasTargetSize({\n\tintrinsicSize,\n\tcontentRect,\n\tcameraZoom,\n\tdevicePixelRatio,\n\tpixelHeadroom,\n\tmaxPixelCount,\n\tmaxDimension,\n}: {\n\tintrinsicSize: { width: number; height: number };\n\tcontentRect: Rect;\n\tcameraZoom: number;\n\tdevicePixelRatio: number;\n\tpixelHeadroom: number;\n\tmaxPixelCount: number;\n\tmaxDimension: number;\n}): { width: number; height: number } {\n\tconst intrinsicWidth = Math.max(1, Math.round(intrinsicSize.width));\n\tconst intrinsicHeight = Math.max(1, Math.round(intrinsicSize.height));\n\tconst targetCssWidth = Math.max(1, contentRect.width * cameraZoom);\n\tconst targetCssHeight = Math.max(1, contentRect.height * cameraZoom);\n\tconst desiredWidth =\n\t\ttargetCssWidth * toPositiveFiniteNumber(devicePixelRatio, 1) * pixelHeadroom;\n\tconst desiredHeight =\n\t\ttargetCssHeight * toPositiveFiniteNumber(devicePixelRatio, 1) * pixelHeadroom;\n\tconst dimensionScale = Math.min(\n\t\t1,\n\t\ttoPositiveFiniteNumber(maxDimension, intrinsicWidth) /\n\t\t\tMath.max(intrinsicWidth, intrinsicHeight),\n\t);\n\tconst pixelScale = Math.min(\n\t\t1,\n\t\tMath.sqrt(\n\t\t\ttoPositiveFiniteNumber(maxPixelCount, intrinsicWidth * intrinsicHeight) /\n\t\t\t\t(intrinsicWidth * intrinsicHeight),\n\t\t),\n\t);\n\tconst viewportScale = Math.min(\n\t\t1,\n\t\tdesiredWidth / intrinsicWidth,\n\t\tdesiredHeight / intrinsicHeight,\n\t);\n\tconst scale = Math.min(dimensionScale, pixelScale, viewportScale);\n\tconst width = Math.max(1, Math.round(intrinsicWidth * scale));\n\tconst height = Math.max(1, Math.round(width * (intrinsicHeight / intrinsicWidth)));\n\n\treturn { width, height };\n}\n\nexport function resolveRasterImageCanvasRenderTarget({\n\titem,\n\thref,\n\tintrinsicSize,\n\tsourceSize,\n\tcontentRect,\n\ttargetSize,\n\tviewportSize,\n\tcameraZoom,\n\toptions,\n}: {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tsourceSize: { width: number; height: number };\n\tcontentRect: Rect;\n\ttargetSize: { width: number; height: number };\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\toptions: ResolvedRasterImageCanvasRenderingOptions;\n}): ResolvedRasterImageCanvasRenderTarget {\n\tconst request: RasterImageCanvasRenderRequest = {\n\t\titem,\n\t\thref,\n\t\tintrinsicSize,\n\t\tsourceSize,\n\t\tcontentRect,\n\t\ttargetSize,\n\t\tviewportSize,\n\t\tcameraZoom,\n\t\tdevicePixelRatio: options.devicePixelRatio,\n\t};\n\tconst resolved = options.resolveRenderTarget?.(request);\n\tif (typeof resolved === \"string\") {\n\t\treturn { href: resolved, sourceKey: resolved, targetSize, contentRect };\n\t}\n\tif (resolved?.href) {\n\t\treturn {\n\t\t\thref: resolved.href,\n\t\t\tsourceKey: resolved.sourceKey ?? resolved.href,\n\t\t\ttargetSize,\n\t\t\tcontentRect,\n\t\t};\n\t}\n\treturn { href, sourceKey: href, targetSize, contentRect };\n}\n\nexport function shouldRedrawRasterImageCanvas({\n\tcurrentSourceKey,\n\tcurrentWidth,\n\tcurrentHeight,\n\tnextSourceKey,\n\tnextWidth,\n\tnextHeight,\n\tupscaleRedrawRatio,\n}: {\n\tcurrentSourceKey: string | null;\n\tcurrentWidth: number;\n\tcurrentHeight: number;\n\tnextSourceKey: string;\n\tnextWidth: number;\n\tnextHeight: number;\n\tupscaleRedrawRatio: number;\n}): boolean {\n\tconst safeCurrentWidth = Math.max(0, Math.round(currentWidth));\n\tconst safeCurrentHeight = Math.max(0, Math.round(currentHeight));\n\tconst safeNextWidth = Math.max(1, Math.round(nextWidth));\n\tconst safeNextHeight = Math.max(1, Math.round(nextHeight));\n\n\tif (!currentSourceKey || safeCurrentWidth <= 1 || safeCurrentHeight <= 1) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tcurrentSourceKey !== nextSourceKey &&\n\t\tsafeCurrentWidth === safeNextWidth &&\n\t\tsafeCurrentHeight === safeNextHeight\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tsafeNextWidth > safeCurrentWidth * upscaleRedrawRatio ||\n\t\tsafeNextHeight > safeCurrentHeight * upscaleRedrawRatio\n\t);\n}\n\nfunction toPositiveFiniteNumber(\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0\n\t\t? value\n\t\t: fallback;\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect, type Rect } from \"../math/rect\";\nimport { cullItemsByViewport } from \"../scene/cull\";\nimport type { VectorScene } from \"../scene/scene\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\tgetRasterImageCanvasTargetSize,\n\tgetRasterImageContentRect,\n\ttype RasterImageCanvasRenderingOptions,\n\ttype ResolvedRasterImageCanvasRenderingOptions,\n\ttype ResolvedRasterImageCanvasRenderTarget,\n\tresolveRasterImageCanvasRenderingOptions,\n\tresolveRasterImageCanvasRenderTarget,\n\tresolveRasterImageCanvasSourceSize,\n\tshouldRedrawRasterImageCanvas,\n} from \"./raster-image-canvas\";\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\trasterImageCanvas?: RasterImageCanvasRenderingOptions | null;\n};\n\nexport type SvgVectorRendererInteractionState = {\n\tselectedIds?: readonly string[];\n\thoveredItemId?: string | null;\n};\n\ntype CachedItemG = {\n\treadonly g: SVGGElement;\n\tlastChildrenSvg: string;\n\tlastTransform: string;\n\trasterCanvas?: CachedRasterImageCanvas;\n};\n\ntype CachedRasterImageCanvas = {\n\treadonly foreignObject: SVGForeignObjectElement;\n\treadonly canvas: HTMLCanvasElement;\n\titemHref: string | null;\n\tsourceKey: string | null;\n\twidth: number;\n\theight: number;\n\tloadSequence: number;\n\tabortController: AbortController | null;\n\tloadingItemHref: string | null;\n\tloadingSourceKey: string | null;\n\tloadingWidth: number;\n\tloadingHeight: number;\n\tqueuedTarget: QueuedRasterImageCanvasTarget | null;\n};\n\ntype QueuedRasterImageCanvasTarget = {\n\titemHref: string;\n\ttarget: ResolvedRasterImageCanvasRenderTarget;\n};\n\nfunction itemClassName(item: VectorSceneItem): string {\n\tconst kind = item.toolKind ?? \"unknown\";\n\tconst classes = [`canvu-item`, `canvu-item--${kind}`];\n\tif (item.svgClassName) {\n\t\tclasses.push(item.svgClassName);\n\t}\n\treturn classes.join(\" \");\n}\n\ntype DecodedRasterImage = {\n\twidth: number;\n\theight: number;\n\tdraw: (context: CanvasRenderingContext2D) => void;\n\tclose: () => void;\n};\n\nasync function decodeRasterImage(\n\thref: string,\n\twidth: number,\n\theight: number,\n\tsignal: AbortSignal,\n): Promise<DecodedRasterImage> {\n\tif (typeof createImageBitmap === \"function\") {\n\t\ttry {\n\t\t\tconst response = await fetch(href, { signal, credentials: \"same-origin\" });\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch raster image: ${response.status}`);\n\t\t\t}\n\t\t\tconst blob = await response.blob();\n\t\t\tif (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n\t\t\tconst bitmap = await createImageBitmap(blob, {\n\t\t\t\tresizeWidth: width,\n\t\t\t\tresizeHeight: height,\n\t\t\t\tresizeQuality: \"high\",\n\t\t\t});\n\t\t\treturn {\n\t\t\t\twidth: bitmap.width,\n\t\t\t\theight: bitmap.height,\n\t\t\t\tdraw: (context) => {\n\t\t\t\t\tcontext.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height);\n\t\t\t\t},\n\t\t\t\tclose: () => bitmap.close(),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (signal.aborted) throw error;\n\t\t}\n\t}\n\n\tconst image = await loadImageElement(href, signal);\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tdraw: (context) => {\n\t\t\tcontext.drawImage(image, 0, 0, width, height);\n\t\t},\n\t\tclose: () => {},\n\t};\n}\n\nfunction loadImageElement(\n\thref: string,\n\tsignal: AbortSignal,\n): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal.aborted) {\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tconst image = new Image();\n\t\tconst cleanup = () => {\n\t\t\tsignal.removeEventListener(\"abort\", abort);\n\t\t\timage.onload = null;\n\t\t\timage.onerror = null;\n\t\t};\n\t\tconst abort = () => {\n\t\t\tcleanup();\n\t\t\timage.removeAttribute(\"src\");\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t};\n\t\timage.decoding = \"async\";\n\t\timage.onload = () => {\n\t\t\tconst decodePromise = image.decode?.();\n\t\t\tif (!decodePromise) {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(image);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdecodePromise.then(\n\t\t\t\t() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(image);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(image);\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t\timage.onerror = () => {\n\t\t\tcleanup();\n\t\t\treject(new Error(\"Failed to load raster image\"));\n\t\t};\n\t\tsignal.addEventListener(\"abort\", abort, { once: true });\n\t\timage.src = href;\n\t});\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 selectedIds = new Set<string>();\n\tprivate hoveredItemId: string | null = null;\n\tprivate liveOverlay: CachedItemG | null = null;\n\tprivate readonly resizeObserver: ResizeObserver;\n\tprivate rasterImageCanvasRendering: ResolvedRasterImageCanvasRenderingOptions | null;\n\n\tconstructor(options: SvgVectorRendererOptions) {\n\t\tthis.container = options.container;\n\t\tthis.scene = options.scene;\n\t\tthis.camera = options.camera;\n\t\tthis.rasterImageCanvasRendering = resolveRasterImageCanvasRenderingOptions(\n\t\t\toptions.rasterImageCanvas,\n\t\t);\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 * Updates interaction attributes on item groups for CSS hooks.\n\t *\n\t * Use `[data-canvu-selected=\"true\"]` and `[data-canvu-hovered=\"true\"]`\n\t * for animations in interactive canvases where the scene SVG may ignore\n\t * pointer events.\n\t */\n\tsetInteractionState(state: SvgVectorRendererInteractionState): void {\n\t\tthis.selectedIds = new Set(state.selectedIds ?? []);\n\t\tthis.hoveredItemId = state.hoveredItemId ?? null;\n\t\tfor (const [id, cached] of this.itemNodeCache) {\n\t\t\tthis.applyInteractionAttributes(cached.g, id);\n\t\t}\n\t}\n\n\tsetRasterImageCanvasRendering(\n\t\toptions: RasterImageCanvasRenderingOptions | null | undefined,\n\t): void {\n\t\tthis.rasterImageCanvasRendering =\n\t\t\tresolveRasterImageCanvasRenderingOptions(options);\n\t\tif (!this.rasterImageCanvasRendering) {\n\t\t\tfor (const cached of this.itemNodeCache.values()) {\n\t\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t\t}\n\t\t}\n\t\tthis.render();\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\tg.setAttribute(\"data-canvu-item\", \"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\tcached.g.setAttribute(\"class\", itemClassName(item));\n\t\tcached.g.setAttribute(\"data-item-id\", item.id);\n\t\tcached.g.setAttribute(\"data-tool-kind\", item.toolKind ?? \"\");\n\t\tcached.g.setAttribute(\"data-canvu-selected\", \"false\");\n\t\tcached.g.setAttribute(\"data-canvu-hovered\", \"false\");\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\tthis.releaseRasterImageCanvas(cached);\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-canvu-item\", \"true\");\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\tg.setAttribute(\"class\", itemClassName(item));\n\t\t\tg.setAttribute(\"data-canvu-item\", \"true\");\n\t\t\tg.setAttribute(\"data-item-id\", item.id);\n\t\t\tg.setAttribute(\"data-tool-kind\", item.toolKind ?? \"\");\n\t\t\tthis.applyInteractionAttributes(g, item.id);\n\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\t\t\tthis.syncRasterImageCanvas(cached, item);\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\tprivate syncRasterImageCanvas(cached: CachedItemG, item: VectorSceneItem): void {\n\t\tconst options = this.rasterImageCanvasRendering;\n\t\tif (\n\t\t\t!options ||\n\t\t\titem.toolKind !== \"image\" ||\n\t\t\t!item.imageRasterHref ||\n\t\t\t!item.imageIntrinsicSize\n\t\t) {\n\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t\treturn;\n\t\t}\n\n\t\tconst contentRect = getRasterImageContentRect(item);\n\t\tconst viewportSize = {\n\t\t\twidth: this.container.clientWidth,\n\t\t\theight: this.container.clientHeight,\n\t\t};\n\t\tif (!contentRect || viewportSize.width <= 0 || viewportSize.height <= 0) {\n\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourceSize = resolveRasterImageCanvasSourceSize({\n\t\t\titem,\n\t\t\thref: item.imageRasterHref,\n\t\t\tintrinsicSize: item.imageIntrinsicSize,\n\t\t\tcontentRect,\n\t\t\tviewportSize,\n\t\t\tcameraZoom: this.camera.zoom,\n\t\t\toptions,\n\t\t});\n\t\tconst targetSize = getRasterImageCanvasTargetSize({\n\t\t\tintrinsicSize: sourceSize,\n\t\t\tcontentRect,\n\t\t\tcameraZoom: this.camera.zoom,\n\t\t\tdevicePixelRatio: options.devicePixelRatio,\n\t\t\tpixelHeadroom: options.pixelHeadroom,\n\t\t\tmaxPixelCount: options.maxPixelCount,\n\t\t\tmaxDimension: options.maxDimension,\n\t\t});\n\t\tconst target = resolveRasterImageCanvasRenderTarget({\n\t\t\titem,\n\t\t\thref: item.imageRasterHref,\n\t\t\tintrinsicSize: item.imageIntrinsicSize,\n\t\t\tsourceSize,\n\t\t\tcontentRect,\n\t\t\ttargetSize,\n\t\t\tviewportSize,\n\t\t\tcameraZoom: this.camera.zoom,\n\t\t\toptions,\n\t\t});\n\t\tconst rasterCanvas = this.ensureRasterImageCanvas(cached);\n\t\tthis.positionRasterImageCanvas(rasterCanvas, target.contentRect);\n\t\tif (\n\t\t\trasterCanvas.itemHref !== null &&\n\t\t\trasterCanvas.itemHref !== item.imageRasterHref\n\t\t) {\n\t\t\tthis.clearRasterImageCanvasBitmap(rasterCanvas);\n\t\t}\n\t\tif (\n\t\t\t!shouldRedrawRasterImageCanvas({\n\t\t\t\tcurrentSourceKey: rasterCanvas.sourceKey,\n\t\t\t\tcurrentWidth: rasterCanvas.width,\n\t\t\t\tcurrentHeight: rasterCanvas.height,\n\t\t\t\tnextSourceKey: target.sourceKey,\n\t\t\t\tnextWidth: target.targetSize.width,\n\t\t\t\tnextHeight: target.targetSize.height,\n\t\t\t\tupscaleRedrawRatio: options.upscaleRedrawRatio,\n\t\t\t})\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst request: QueuedRasterImageCanvasTarget = {\n\t\t\titemHref: item.imageRasterHref,\n\t\t\ttarget,\n\t\t};\n\t\tif (rasterCanvas.abortController) {\n\t\t\tif (rasterCanvas.loadingItemHref !== item.imageRasterHref) {\n\t\t\t\trasterCanvas.abortController.abort();\n\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\trasterCanvas.queuedTarget = null;\n\t\t\t\tthis.drawRasterImageCanvas(rasterCanvas, request);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\trasterCanvas.loadingSourceKey === target.sourceKey &&\n\t\t\t\trasterCanvas.loadingWidth === target.targetSize.width &&\n\t\t\t\trasterCanvas.loadingHeight === target.targetSize.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tshouldRedrawRasterImageCanvas({\n\t\t\t\t\tcurrentSourceKey: rasterCanvas.loadingSourceKey,\n\t\t\t\t\tcurrentWidth: rasterCanvas.loadingWidth,\n\t\t\t\t\tcurrentHeight: rasterCanvas.loadingHeight,\n\t\t\t\t\tnextSourceKey: target.sourceKey,\n\t\t\t\t\tnextWidth: target.targetSize.width,\n\t\t\t\t\tnextHeight: target.targetSize.height,\n\t\t\t\t\tupscaleRedrawRatio: options.upscaleRedrawRatio,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\trasterCanvas.queuedTarget = request;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.drawRasterImageCanvas(rasterCanvas, request);\n\t}\n\n\tprivate ensureRasterImageCanvas(cached: CachedItemG): CachedRasterImageCanvas {\n\t\tif (cached.rasterCanvas) {\n\t\t\tif (!cached.rasterCanvas.foreignObject.isConnected) {\n\t\t\t\tcached.g.appendChild(cached.rasterCanvas.foreignObject);\n\t\t\t}\n\t\t\treturn cached.rasterCanvas;\n\t\t}\n\n\t\tconst foreignObject = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"foreignObject\",\n\t\t);\n\t\tforeignObject.setAttribute(\"data-canvu-raster-canvas\", \"true\");\n\t\tforeignObject.style.pointerEvents = \"none\";\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tcanvas.style.display = \"block\";\n\t\tcanvas.style.width = \"100%\";\n\t\tcanvas.style.height = \"100%\";\n\t\tforeignObject.appendChild(canvas);\n\t\tcached.g.appendChild(foreignObject);\n\t\tcached.rasterCanvas = {\n\t\t\tforeignObject,\n\t\t\tcanvas,\n\t\t\titemHref: null,\n\t\t\tsourceKey: null,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tloadSequence: 0,\n\t\t\tabortController: null,\n\t\t\tloadingItemHref: null,\n\t\t\tloadingSourceKey: null,\n\t\t\tloadingWidth: 0,\n\t\t\tloadingHeight: 0,\n\t\t\tqueuedTarget: null,\n\t\t};\n\t\treturn cached.rasterCanvas;\n\t}\n\n\tprivate positionRasterImageCanvas(\n\t\trasterCanvas: CachedRasterImageCanvas,\n\t\tcontentRect: Rect,\n\t): void {\n\t\trasterCanvas.foreignObject.setAttribute(\"x\", String(contentRect.x));\n\t\trasterCanvas.foreignObject.setAttribute(\"y\", String(contentRect.y));\n\t\trasterCanvas.foreignObject.setAttribute(\"width\", String(contentRect.width));\n\t\trasterCanvas.foreignObject.setAttribute(\"height\", String(contentRect.height));\n\t}\n\n\tprivate drawRasterImageCanvas(\n\t\trasterCanvas: CachedRasterImageCanvas,\n\t\trequest: QueuedRasterImageCanvasTarget,\n\t): void {\n\t\tconst { target } = request;\n\t\tconst width = Math.max(1, Math.round(target.targetSize.width));\n\t\tconst height = Math.max(1, Math.round(target.targetSize.height));\n\t\tconst sequence = rasterCanvas.loadSequence + 1;\n\t\trasterCanvas.loadSequence = sequence;\n\t\trasterCanvas.abortController?.abort();\n\t\tconst abortController = new AbortController();\n\t\trasterCanvas.abortController = abortController;\n\t\trasterCanvas.loadingItemHref = request.itemHref;\n\t\trasterCanvas.loadingSourceKey = target.sourceKey;\n\t\trasterCanvas.loadingWidth = width;\n\t\trasterCanvas.loadingHeight = height;\n\t\trasterCanvas.queuedTarget = null;\n\n\t\tdecodeRasterImage(target.href, width, height, abortController.signal)\n\t\t\t.then((decoded) => {\n\t\t\t\tif (\n\t\t\t\t\tabortController.signal.aborted ||\n\t\t\t\t\trasterCanvas.loadSequence !== sequence\n\t\t\t\t) {\n\t\t\t\t\tdecoded.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst context = rasterCanvas.canvas.getContext(\"2d\");\n\t\t\t\tif (!context) {\n\t\t\t\t\tdecoded.close();\n\t\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\t\tthis.drawQueuedRasterImageCanvasTarget(rasterCanvas);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trasterCanvas.canvas.width = decoded.width;\n\t\t\t\trasterCanvas.canvas.height = decoded.height;\n\t\t\t\tcontext.clearRect(0, 0, decoded.width, decoded.height);\n\t\t\t\tdecoded.draw(context);\n\t\t\t\tdecoded.close();\n\t\t\t\trasterCanvas.itemHref = request.itemHref;\n\t\t\t\trasterCanvas.sourceKey = target.sourceKey;\n\t\t\t\trasterCanvas.width = decoded.width;\n\t\t\t\trasterCanvas.height = decoded.height;\n\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\tthis.drawQueuedRasterImageCanvasTarget(rasterCanvas);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") return;\n\t\t\t\tif (rasterCanvas.loadSequence === sequence) {\n\t\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\t\tthis.drawQueuedRasterImageCanvasTarget(rasterCanvas);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tprivate drawQueuedRasterImageCanvasTarget(\n\t\trasterCanvas: CachedRasterImageCanvas,\n\t): void {\n\t\tconst queuedTarget = rasterCanvas.queuedTarget;\n\t\tif (!queuedTarget) return;\n\t\trasterCanvas.queuedTarget = null;\n\t\tif (\n\t\t\t!shouldRedrawRasterImageCanvas({\n\t\t\t\tcurrentSourceKey: rasterCanvas.sourceKey,\n\t\t\t\tcurrentWidth: rasterCanvas.width,\n\t\t\t\tcurrentHeight: rasterCanvas.height,\n\t\t\t\tnextSourceKey: queuedTarget.target.sourceKey,\n\t\t\t\tnextWidth: queuedTarget.target.targetSize.width,\n\t\t\t\tnextHeight: queuedTarget.target.targetSize.height,\n\t\t\t\tupscaleRedrawRatio: this.rasterImageCanvasRendering?.upscaleRedrawRatio ?? 1,\n\t\t\t})\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.drawRasterImageCanvas(rasterCanvas, queuedTarget);\n\t}\n\n\tprivate clearRasterImageCanvasBitmap(rasterCanvas: CachedRasterImageCanvas): void {\n\t\tconst context = rasterCanvas.canvas.getContext(\"2d\");\n\t\tcontext?.clearRect(0, 0, rasterCanvas.canvas.width, rasterCanvas.canvas.height);\n\t\trasterCanvas.canvas.width = 1;\n\t\trasterCanvas.canvas.height = 1;\n\t\trasterCanvas.itemHref = null;\n\t\trasterCanvas.sourceKey = null;\n\t\trasterCanvas.width = 0;\n\t\trasterCanvas.height = 0;\n\t}\n\n\tprivate releaseRasterImageCanvas(cached: CachedItemG): void {\n\t\tconst rasterCanvas = cached.rasterCanvas;\n\t\tif (!rasterCanvas) return;\n\t\trasterCanvas.abortController?.abort();\n\t\trasterCanvas.loadSequence += 1;\n\t\trasterCanvas.queuedTarget = null;\n\t\trasterCanvas.foreignObject.remove();\n\t\tcached.rasterCanvas = undefined;\n\t}\n\n\tprivate applyInteractionAttributes(g: SVGGElement, itemId: string): void {\n\t\tg.setAttribute(\n\t\t\t\"data-canvu-selected\",\n\t\t\tthis.selectedIds.has(itemId) ? \"true\" : \"false\",\n\t\t);\n\t\tg.setAttribute(\n\t\t\t\"data-canvu-hovered\",\n\t\t\tthis.hoveredItemId === itemId ? \"true\" : \"false\",\n\t\t);\n\t}\n\n\tdestroy(): void {\n\t\tthis.resizeObserver.disconnect();\n\t\tfor (const cached of this.itemNodeCache.values()) {\n\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t}\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 { 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/link-item.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/raster-image-canvas.ts","../src/renderer/svg-vector-renderer.ts","../src/scene/clone-item.ts","../src/scene/managed-images.ts","../src/scene/scene.ts"],"names":["escapeHtmlText","startX","startY","d","getStroke","op","b","s","height","width","g"],"mappings":"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","file":"index.cjs","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?: (event: PointerEvent) => 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(e);\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 { CustomShapeResizeHandles } from \"../interaction/resize-handles\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"./types\";\n\nexport type { CustomShapeResizeHandles } from \"../interaction/resize-handles\";\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 * Optional behavior and styling hooks for {@link createCustomShapeItem}.\n */\nexport type CreateCustomShapeOptions = {\n\t/**\n\t * Controls which resize handles are visible and active for the custom shape.\n\t *\n\t * Defaults to `\"all\"`. Use `\"corners\"` for corner-only resize, explicit handle ids such\n\t * as `[\"se\"]` for constrained tools, or an empty array to hide resize dots while keeping\n\t * selection and rotation available.\n\t */\n\tresizeHandles?: CustomShapeResizeHandles;\n\t/**\n\t * CSS class applied to the outer rendered SVG `<g>`.\n\t *\n\t * Useful for custom animations and styling. In interactive canvases, prefer\n\t * `[data-canvu-hovered=\"true\"]` over `:hover` because the scene SVG often has\n\t * `pointer-events: none` while Canvu owns hit-testing in a separate layer.\n\t */\n\tsvgClassName?: string;\n};\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 *\n * @example One resize handle and a CSS animation hook\n * ```ts\n * createCustomShapeItem(id, rect, { svg }, {\n * resizeHandles: [\"se\"],\n * svgClassName: \"sticky-note\",\n * });\n * ```\n */\nexport function createCustomShapeItem(\n\tid: string,\n\tbounds: Rect,\n\tcontent: CreateCustomShapeContent,\n\toptions: CreateCustomShapeOptions = {},\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\t...(options.resizeHandles !== undefined\n\t\t\t? { customResizeHandles: options.resizeHandles }\n\t\t\t: {}),\n\t\t...(options.svgClassName ? { svgClassName: options.svgClassName } : {}),\n\t\tchildrenSvg: buildCustomShapeChildrenSvg(inner, intrinsic, r),\n\t};\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 = 320;\nconst DEFAULT_LINK_CARD_HEIGHT = 70;\nexport const LINK_CARD_MIN_SCALE = 0.6;\nexport const LINK_CARD_MAX_SCALE = 6;\nexport const LINK_CARD_ASPECT = DEFAULT_LINK_CARD_WIDTH / DEFAULT_LINK_CARD_HEIGHT;\nconst LINK_CARD_BORDER = \"oklch(0.918 0.008 255)\";\nconst LINK_CARD_BORDER_STRONG = \"oklch(0.86 0.012 255)\";\nconst LINK_CARD_ACCENT = \"oklch(0.55 0.19 264)\";\nconst LINK_CARD_ACCENT_DEEP = \"oklch(0.46 0.18 264)\";\nconst LINK_CARD_TITLE_COLOR = \"oklch(0.26 0.022 265)\";\nconst LINK_CARD_TEXT_COLOR = \"oklch(0.55 0.022 265)\";\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 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};\n\nconst buildLinkTextBand = (band: LinkTextBand): string => {\n\tconst lineHeight = band.height;\n\tconst weight = band.fontWeight != null ? `font-weight:${band.fontWeight};` : \"\";\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;letter-spacing:-0.01em;color:${band.color};overflow:hidden;white-space:nowrap;text-overflow:ellipsis;${weight}\">${escapeHtmlText(band.text)}</div></foreignObject>`;\n};\n\nconst getLinkProtocol = (href: string): string => {\n\ttry {\n\t\treturn new URL(href).protocol;\n\t} catch {\n\t\treturn \"\";\n\t}\n};\n\nconst getLinkInitial = (hostname: string): string => {\n\tconst first = hostname.trim().charAt(0).toUpperCase();\n\treturn first || \"L\";\n};\n\nconst getStableLinkIdSuffix = (value: string): string => {\n\tlet hash = 0;\n\tfor (const char of value) {\n\t\thash = (hash * 31 + char.charCodeAt(0)) >>> 0;\n\t}\n\treturn hash.toString(36);\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\t_height: number,\n\tlink: CanvuLinkData,\n): string {\n\tconst cardWidth = Math.max(1, width);\n\tconst scale = cardWidth / DEFAULT_LINK_CARD_WIDTH;\n\tconst contentWidth = DEFAULT_LINK_CARD_WIDTH;\n\tconst contentHeight = DEFAULT_LINK_CARD_HEIGHT;\n\tconst padding = 14;\n\tconst badgeSize = 42;\n\tconst gap = 13;\n\tconst buttonSize = 34;\n\tconst textX = padding + badgeSize + gap;\n\tconst textWidth = Math.max(1, contentWidth - textX - buttonSize - gap - padding);\n\tconst hostname = getLinkHostname(link.href);\n\tconst title = link.title?.trim() || hostname || \"Link\";\n\tconst protocol = getLinkProtocol(link.href);\n\tconst subtitle = hostname || link.href;\n\tconst idSuffix = getStableLinkIdSuffix(`${hostname}:${link.href}`);\n\tconst gradientId = `canvu-link-favicon-gradient-${idSuffix}`;\n\tconst buttonX = contentWidth - padding - buttonSize;\n\tconst buttonY = (contentHeight - buttonSize) / 2;\n\tconst isSecure = protocol === \"https:\";\n\tconst subtitleX = isSecure ? textX + 13 : textX;\n\tconst subtitleWidth = isSecure ? textWidth - 13 : textWidth;\n\n\treturn `\n\t\t<style>\n\t\t\t.canvu-link-card-root .canvu-link-card { transition: transform .18s ease, filter .18s ease, stroke .18s ease; }\n\t\t\t.canvu-link-card-root .canvu-link-open { opacity: 0; transform: translateX(-4px); transition: opacity .18s ease, transform .18s ease; }\n\t\t\t.canvu-link-card-root:hover .canvu-link-card { transform: translateY(-2px); filter: drop-shadow(0 4px 14px oklch(0.4 0.05 265 / .08)) drop-shadow(0 1px 3px oklch(0.4 0.05 265 / .06)); stroke: ${LINK_CARD_BORDER_STRONG}; }\n\t\t\t.canvu-link-card-root:hover .canvu-link-open { opacity: 1; transform: translateX(0); }\n\t\t</style>\n\t\t<g class=\"canvu-link-card-root\" transform=\"scale(${formatNumber(scale)})\">\n\t\t\t<rect class=\"canvu-link-card\" width=\"${formatNumber(contentWidth)}\" height=\"${formatNumber(contentHeight)}\" rx=\"16\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" filter=\"drop-shadow(0 1px 2px oklch(0.4 0.03 265 / .05)) drop-shadow(0 1px 1px oklch(0.4 0.03 265 / .04))\" />\n\t\t\t<defs>\n\t\t\t\t<linearGradient id=\"${gradientId}\" x1=\"8\" y1=\"48\" x2=\"48\" y2=\"8\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<stop stop-color=\"${LINK_CARD_ACCENT}\" />\n\t\t\t\t\t<stop offset=\"1\" stop-color=\"${LINK_CARD_ACCENT_DEEP}\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t\t<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"11\" fill=\"url(#${gradientId})\" />\n\t\t\t<text x=\"${formatNumber(padding + badgeSize / 2)}\" y=\"${formatNumber(padding + badgeSize / 2 + 5)}\" text-anchor=\"middle\" font-family=\"system-ui,sans-serif\" font-size=\"17\" font-weight=\"700\" fill=\"#ffffff\">${escapeHtmlText(getLinkInitial(hostname))}</text>\n\t\t\t${buildLinkTextBand({ x: textX, y: 16, width: textWidth, height: 19, text: title, fontSize: 14.5, color: LINK_CARD_TITLE_COLOR, fontWeight: 700 })}\n\t\t\t${\n\t\t\t\tisSecure\n\t\t\t\t\t? `<g transform=\"translate(${formatNumber(textX)},40)\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"><rect x=\"1.5\" y=\"4.5\" width=\"7\" height=\"6\" rx=\"1\" /><path d=\"M3 4.5 V3 a2 2 0 0 1 4 0 v1.5\" /></g>`\n\t\t\t\t\t: \"\"\n\t\t\t}\n\t\t\t${buildLinkTextBand({ x: subtitleX, y: 36, width: subtitleWidth, height: 17, text: subtitle, fontSize: 12.5, color: LINK_CARD_TEXT_COLOR })}\n\t\t\t<g class=\"canvu-link-open\" transform=\"translate(${formatNumber(buttonX)},${formatNumber(buttonY)})\">\n\t\t\t\t<rect width=\"${formatNumber(buttonSize)}\" height=\"${formatNumber(buttonSize)}\" rx=\"10\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" />\n\t\t\t\t<g transform=\"translate(10,10)\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n\t\t\t\t\t<path d=\"M8 2 H14 V8\" />\n\t\t\t\t\t<path d=\"M14 2 L7 9\" />\n\t\t\t\t\t<path d=\"M12 10 V13 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 V5 a1 1 0 0 1 1 -1 H6\" />\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\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\nexport function rebuildLinkItemSvg(item: VectorSceneItem): VectorSceneItem {\n\tconst link = getLinkData(item);\n\tif (!link) return item;\n\tconst scale = clamp(\n\t\titem.bounds.width / DEFAULT_LINK_CARD_WIDTH,\n\t\tLINK_CARD_MIN_SCALE,\n\t\tLINK_CARD_MAX_SCALE,\n\t);\n\tconst width = DEFAULT_LINK_CARD_WIDTH * scale;\n\tconst height = DEFAULT_LINK_CARD_HEIGHT * scale;\n\tconst bounds = {\n\t\t...item.bounds,\n\t\twidth,\n\t\theight,\n\t};\n\tconst customInnerSvg = buildLinkCardSvg(\n\t\tDEFAULT_LINK_CARD_WIDTH,\n\t\tDEFAULT_LINK_CARD_HEIGHT,\n\t\tlink,\n\t);\n\treturn {\n\t\t...item,\n\t\tx: bounds.x,\n\t\ty: bounds.y,\n\t\tbounds,\n\t\tcustomIntrinsicSize: {\n\t\t\twidth: DEFAULT_LINK_CARD_WIDTH,\n\t\t\theight: DEFAULT_LINK_CARD_HEIGHT,\n\t\t},\n\t\tcustomInnerSvg,\n\t\tchildrenSvg: buildLinkCardSvg(width, height, link),\n\t};\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 rebuildLinkItemSvg({\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","/**\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 { getLinkData, rebuildLinkItemSvg } from \"./link-item\";\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;\n\ntype CloudPoint = readonly [number, number];\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\tarcRadius = ARCHITECTURAL_CLOUD_RADIUS,\n\tbulge = 1,\n): string {\n\tconst padding = Math.max(0, strokeWidth * 2);\n\tconst cloudWidth = Math.max(0, width - padding);\n\tconst cloudHeight = Math.max(0, height - padding);\n\tif (cloudWidth <= 0 || cloudHeight <= 0 || arcRadius <= 0 || bulge <= 0) return \"\";\n\n\tconst offset = padding / 2;\n\tconst corners: CloudPoint[] = [\n\t\t[offset, offset],\n\t\t[offset + cloudWidth, offset],\n\t\t[offset + cloudWidth, offset + cloudHeight],\n\t\t[offset, offset + cloudHeight],\n\t];\n\n\tconst points: Array<readonly [number, number, number]> = [];\n\tfor (let index = 0; index < corners.length; index += 1) {\n\t\tconst [startX, startY] = corners[index] ?? [0, 0];\n\t\tconst [endX, endY] = corners[(index + 1) % corners.length] ?? [0, 0];\n\t\tconst edgeLength = Math.hypot(endX - startX, endY - startY);\n\t\tconst arcCount = Math.max(1, Math.round(edgeLength / (2 * arcRadius)));\n\t\tconst chord = edgeLength / arcCount;\n\n\t\tfor (let arcIndex = 1; arcIndex <= arcCount; arcIndex += 1) {\n\t\t\tconst t = arcIndex / arcCount;\n\t\t\tpoints.push([\n\t\t\t\tstartX + (endX - startX) * t,\n\t\t\t\tstartY + (endY - startY) * t,\n\t\t\t\tchord,\n\t\t\t] as const);\n\t\t}\n\t}\n\n\tconst [startX, startY] = corners[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [pointX, pointY, chord] of points) {\n\t\tconst radius = (chord / 2) * bulge;\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(pointX)} ${svgNumber(pointY)}`,\n\t\t);\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 (getLinkData(item)) {\n\t\treturn rebuildLinkItemSvg(item);\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\";\nimport { getLinkData } from \"../scene/link-item\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type ResizeHandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nexport const ALL_RESIZE_HANDLES: readonly ResizeHandleId[] = [\n\t\"nw\",\n\t\"n\",\n\t\"ne\",\n\t\"e\",\n\t\"se\",\n\t\"s\",\n\t\"sw\",\n\t\"w\",\n];\nexport const CORNER_RESIZE_HANDLES: readonly ResizeHandleId[] = [\n\t\"nw\",\n\t\"ne\",\n\t\"se\",\n\t\"sw\",\n];\n\n/**\n * Resize handles exposed for a custom shape.\n *\n * Use `\"all\"` for the default 8 handles, `\"corners\"` for corner-only resize,\n * or pass explicit handle ids for constrained tools such as a single southeast\n * corner handle. An empty array hides resize dots but leaves selection and\n * rotation available.\n */\nexport type CustomShapeResizeHandles = \"all\" | \"corners\" | readonly ResizeHandleId[];\n\nfunction dedupeHandles(\n\thandles: readonly ResizeHandleId[],\n): readonly ResizeHandleId[] {\n\tconst allowed = new Set(handles);\n\treturn ALL_RESIZE_HANDLES.filter((handle) => allowed.has(handle));\n}\n\nfunction resolveCustomResizeHandles(\n\thandles: CustomShapeResizeHandles | undefined,\n): readonly ResizeHandleId[] {\n\tif (handles === \"corners\") return CORNER_RESIZE_HANDLES;\n\tif (handles === \"all\" || handles === undefined) return ALL_RESIZE_HANDLES;\n\treturn dedupeHandles(handles);\n}\n\n/**\n * Returns the resize handles that should be visible and active for an item.\n *\n * Link cards keep their historical corner-only behavior. Custom shapes may\n * narrow the handle set through `customResizeHandles`; all other resizable\n * items use the full 8-handle set.\n */\nexport function resolveResizeHandlesForItem(\n\titem: VectorSceneItem | null | undefined,\n): readonly ResizeHandleId[] {\n\tif (!item) return ALL_RESIZE_HANDLES;\n\tif (getLinkData(item)) return CORNER_RESIZE_HANDLES;\n\tif (item.toolKind === \"custom\") {\n\t\treturn resolveCustomResizeHandles(item.customResizeHandles);\n\t}\n\treturn ALL_RESIZE_HANDLES;\n}\n\n/** Returns whether a handle is currently visible/active for an item. */\nexport function itemAllowsResizeHandle(\n\titem: VectorSceneItem | null | undefined,\n\thandle: ResizeHandleId,\n): boolean {\n\treturn resolveResizeHandlesForItem(item).includes(handle);\n}\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\thandles: readonly ResizeHandleId[] = ALL_RESIZE_HANDLES,\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 handles) {\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 { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nconst DEFAULT_PIXEL_HEADROOM = 1.5;\nconst DEFAULT_MAX_PIXEL_COUNT = 12_000_000;\nconst DEFAULT_MAX_DIMENSION = 4096;\nconst DEFAULT_UPSCALE_REDRAW_RATIO = 1.15;\n\n/**\n * Input passed to `imageCanvasRendering.resolveSourceSize`.\n *\n * Use it when the item's current `imageIntrinsicSize` is only a preview size,\n * but your backing image service can provide a larger source for zoomed canvas\n * rendering. Return the effective source size Canvu should cap against before\n * computing the next bitmap target.\n */\nexport type RasterImageCanvasSourceSizeRequest = {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tcontentRect: Rect;\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\tdevicePixelRatio: number;\n};\n\n/**\n * Maps an image item to the effective source size used for zoom-aware bitmap\n * sizing.\n *\n * Return `null`/`undefined` to use the item's `imageIntrinsicSize`.\n */\nexport type RasterImageCanvasSourceSizeResolver = (\n\trequest: RasterImageCanvasSourceSizeRequest,\n) => { width: number; height: number } | null | undefined;\n\n/**\n * Input passed to `imageCanvasRendering.resolveRenderTarget`.\n *\n * Use it to map the current image item and zoom-derived bitmap size to the best\n * available resized URL from your image service. Apps that do not provide a\n * resolver still get canvas drawing from the original `imageRasterHref`.\n *\n * @example\n * ```ts\n * const resolveRenderTarget = ({ href, targetSize }) =>\n * `${href}&w=${targetSize.width}`;\n * ```\n */\nexport type RasterImageCanvasRenderRequest = {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tsourceSize: { width: number; height: number };\n\tcontentRect: Rect;\n\ttargetSize: { width: number; height: number };\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\tdevicePixelRatio: number;\n};\n\n/**\n * Bitmap-like source returned by `imageCanvasRendering.resolveCanvasSource`.\n *\n * Apps can render into an offscreen canvas, create an `ImageBitmap`, or wrap any\n * other canvas-compatible source and let Canvu copy it into the visible canvas\n * without changing the underlying SVG image URL.\n */\nexport type RasterImageCanvasSource = {\n\twidth: number;\n\theight: number;\n\tdraw: (context: CanvasRenderingContext2D) => void;\n\tclose?: () => void;\n};\n\n/**\n * Input passed to `imageCanvasRendering.resolveCanvasSource`.\n *\n * Use this for custom async rendering pipelines such as PDF page rasterization.\n * Canvu keeps the previous canvas visible while this request resolves and aborts\n * stale requests when the item leaves the viewport or a sharper target is queued.\n */\nexport type RasterImageCanvasSourceRequest = RasterImageCanvasRenderRequest & {\n\ttargetHref: string;\n\tsourceKey: string;\n\tsignal: AbortSignal;\n};\n\n/**\n * Maps an image item plus requested bitmap size to a custom canvas source.\n *\n * Return `null`/`undefined` to let Canvu fetch and decode the resolved URL.\n */\nexport type RasterImageCanvasSourceResolver = (\n\trequest: RasterImageCanvasSourceRequest,\n) =>\n\t| RasterImageCanvasSource\n\t| null\n\t| undefined\n\t| Promise<RasterImageCanvasSource | null | undefined>;\n\n/**\n * Resolved raster source for a zoom-aware canvas redraw.\n *\n * Return a stable `sourceKey` when multiple URLs may represent the same bitmap\n * quality tier. Canvu uses it to avoid redundant redraws and to keep the\n * previous canvas visible until a sharper target has decoded.\n */\nexport type RasterImageCanvasRenderTarget = {\n\thref: string;\n\tsourceKey?: string;\n};\n\n/**\n * Maps an image item plus requested bitmap size to the URL that should be\n * decoded into the canvas overlay.\n *\n * Return a string for simple URL rewriting, an object when you need a custom\n * `sourceKey`, or `null`/`undefined` to keep using the item's `imageRasterHref`.\n */\nexport type RasterImageCanvasRenderTargetResolver = (\n\trequest: RasterImageCanvasRenderRequest,\n) => string | RasterImageCanvasRenderTarget | null | undefined;\n\n/**\n * Enables zoom-aware canvas rendering for image items in `VectorViewport`.\n *\n * This is intended for large raster pages such as PDFs. The original SVG image\n * remains mounted as a fallback, while Canvu decodes and draws a canvas bitmap\n * sized for the current zoom. On zoom out, Canvu keeps the sharper bitmap\n * already drawn instead of downgrading immediately.\n */\nexport type RasterImageCanvasRenderingOptions = {\n\tresolveSourceSize?: RasterImageCanvasSourceSizeResolver;\n\tresolveRenderTarget?: RasterImageCanvasRenderTargetResolver;\n\tresolveCanvasSource?: RasterImageCanvasSourceResolver;\n\tdevicePixelRatio?: number;\n\tpixelHeadroom?: number;\n\tmaxPixelCount?: number;\n\tmaxDimension?: number;\n\tupscaleRedrawRatio?: number;\n};\n\nexport type ResolvedRasterImageCanvasRenderingOptions = {\n\tresolveSourceSize?: RasterImageCanvasSourceSizeResolver;\n\tresolveRenderTarget?: RasterImageCanvasRenderTargetResolver;\n\tresolveCanvasSource?: RasterImageCanvasSourceResolver;\n\tdevicePixelRatio: number;\n\tpixelHeadroom: number;\n\tmaxPixelCount: number;\n\tmaxDimension: number;\n\tupscaleRedrawRatio: number;\n};\n\nexport type ResolvedRasterImageCanvasRenderTarget = {\n\thref: string;\n\tsourceKey: string;\n\ttargetSize: { width: number; height: number };\n\tcontentRect: Rect;\n};\n\nexport function resolveRasterImageCanvasRenderingOptions(\n\toptions: RasterImageCanvasRenderingOptions | null | undefined,\n): ResolvedRasterImageCanvasRenderingOptions | null {\n\tif (!options) return null;\n\tconst fallbackDevicePixelRatio =\n\t\ttypeof window === \"undefined\" ? 1 : window.devicePixelRatio;\n\treturn {\n\t\tresolveSourceSize: options.resolveSourceSize,\n\t\tresolveRenderTarget: options.resolveRenderTarget,\n\t\tresolveCanvasSource: options.resolveCanvasSource,\n\t\tdevicePixelRatio: toPositiveFiniteNumber(\n\t\t\toptions.devicePixelRatio,\n\t\t\tfallbackDevicePixelRatio,\n\t\t),\n\t\tpixelHeadroom: toPositiveFiniteNumber(\n\t\t\toptions.pixelHeadroom,\n\t\t\tDEFAULT_PIXEL_HEADROOM,\n\t\t),\n\t\tmaxPixelCount: toPositiveFiniteNumber(\n\t\t\toptions.maxPixelCount,\n\t\t\tDEFAULT_MAX_PIXEL_COUNT,\n\t\t),\n\t\tmaxDimension: toPositiveFiniteNumber(\n\t\t\toptions.maxDimension,\n\t\t\tDEFAULT_MAX_DIMENSION,\n\t\t),\n\t\tupscaleRedrawRatio: toPositiveFiniteNumber(\n\t\t\toptions.upscaleRedrawRatio,\n\t\t\tDEFAULT_UPSCALE_REDRAW_RATIO,\n\t\t),\n\t};\n}\n\nexport function getRasterImageContentRect(item: VectorSceneItem): Rect | null {\n\tif (item.toolKind !== \"image\" || !item.imageIntrinsicSize) return null;\n\tconst bounds = normalizeRect(item.bounds);\n\tconst intrinsicWidth = Math.max(1e-6, item.imageIntrinsicSize.width);\n\tconst intrinsicHeight = Math.max(1e-6, item.imageIntrinsicSize.height);\n\tconst boundsAspectRatio = bounds.width / Math.max(1e-9, bounds.height);\n\tconst imageAspectRatio = intrinsicWidth / intrinsicHeight;\n\n\tif (Math.abs(boundsAspectRatio - imageAspectRatio) < 1e-3) {\n\t\treturn { x: 0, y: 0, width: bounds.width, height: bounds.height };\n\t}\n\n\tif (boundsAspectRatio > imageAspectRatio) {\n\t\tconst height = bounds.height;\n\t\tconst width = height * imageAspectRatio;\n\t\treturn { x: (bounds.width - width) / 2, y: 0, width, height };\n\t}\n\n\tconst width = bounds.width;\n\tconst height = width / imageAspectRatio;\n\treturn { x: 0, y: (bounds.height - height) / 2, width, height };\n}\n\nexport function resolveRasterImageCanvasSourceSize({\n\titem,\n\thref,\n\tintrinsicSize,\n\tcontentRect,\n\tviewportSize,\n\tcameraZoom,\n\toptions,\n}: {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tcontentRect: Rect;\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\toptions: ResolvedRasterImageCanvasRenderingOptions;\n}): { width: number; height: number } {\n\tconst resolved = options.resolveSourceSize?.({\n\t\titem,\n\t\thref,\n\t\tintrinsicSize,\n\t\tcontentRect,\n\t\tviewportSize,\n\t\tcameraZoom,\n\t\tdevicePixelRatio: options.devicePixelRatio,\n\t});\n\tconst width = toPositiveFiniteNumber(resolved?.width, intrinsicSize.width);\n\tconst height = toPositiveFiniteNumber(resolved?.height, intrinsicSize.height);\n\n\treturn { width, height };\n}\n\nexport function getRasterImageCanvasTargetSize({\n\tintrinsicSize,\n\tcontentRect,\n\tcameraZoom,\n\tdevicePixelRatio,\n\tpixelHeadroom,\n\tmaxPixelCount,\n\tmaxDimension,\n}: {\n\tintrinsicSize: { width: number; height: number };\n\tcontentRect: Rect;\n\tcameraZoom: number;\n\tdevicePixelRatio: number;\n\tpixelHeadroom: number;\n\tmaxPixelCount: number;\n\tmaxDimension: number;\n}): { width: number; height: number } {\n\tconst intrinsicWidth = Math.max(1, Math.round(intrinsicSize.width));\n\tconst intrinsicHeight = Math.max(1, Math.round(intrinsicSize.height));\n\tconst targetCssWidth = Math.max(1, contentRect.width * cameraZoom);\n\tconst targetCssHeight = Math.max(1, contentRect.height * cameraZoom);\n\tconst desiredWidth =\n\t\ttargetCssWidth * toPositiveFiniteNumber(devicePixelRatio, 1) * pixelHeadroom;\n\tconst desiredHeight =\n\t\ttargetCssHeight * toPositiveFiniteNumber(devicePixelRatio, 1) * pixelHeadroom;\n\tconst dimensionScale = Math.min(\n\t\t1,\n\t\ttoPositiveFiniteNumber(maxDimension, intrinsicWidth) /\n\t\t\tMath.max(intrinsicWidth, intrinsicHeight),\n\t);\n\tconst pixelScale = Math.min(\n\t\t1,\n\t\tMath.sqrt(\n\t\t\ttoPositiveFiniteNumber(maxPixelCount, intrinsicWidth * intrinsicHeight) /\n\t\t\t\t(intrinsicWidth * intrinsicHeight),\n\t\t),\n\t);\n\tconst viewportScale = Math.min(\n\t\t1,\n\t\tdesiredWidth / intrinsicWidth,\n\t\tdesiredHeight / intrinsicHeight,\n\t);\n\tconst scale = Math.min(dimensionScale, pixelScale, viewportScale);\n\tconst width = Math.max(1, Math.round(intrinsicWidth * scale));\n\tconst height = Math.max(1, Math.round(width * (intrinsicHeight / intrinsicWidth)));\n\n\treturn { width, height };\n}\n\nexport function resolveRasterImageCanvasRenderTarget({\n\titem,\n\thref,\n\tintrinsicSize,\n\tsourceSize,\n\tcontentRect,\n\ttargetSize,\n\tviewportSize,\n\tcameraZoom,\n\toptions,\n}: {\n\titem: VectorSceneItem;\n\thref: string;\n\tintrinsicSize: { width: number; height: number };\n\tsourceSize: { width: number; height: number };\n\tcontentRect: Rect;\n\ttargetSize: { width: number; height: number };\n\tviewportSize: { width: number; height: number };\n\tcameraZoom: number;\n\toptions: ResolvedRasterImageCanvasRenderingOptions;\n}): ResolvedRasterImageCanvasRenderTarget {\n\tconst request: RasterImageCanvasRenderRequest = {\n\t\titem,\n\t\thref,\n\t\tintrinsicSize,\n\t\tsourceSize,\n\t\tcontentRect,\n\t\ttargetSize,\n\t\tviewportSize,\n\t\tcameraZoom,\n\t\tdevicePixelRatio: options.devicePixelRatio,\n\t};\n\tconst resolved = options.resolveRenderTarget?.(request);\n\tif (typeof resolved === \"string\") {\n\t\treturn { href: resolved, sourceKey: resolved, targetSize, contentRect };\n\t}\n\tif (resolved?.href) {\n\t\treturn {\n\t\t\thref: resolved.href,\n\t\t\tsourceKey: resolved.sourceKey ?? resolved.href,\n\t\t\ttargetSize,\n\t\t\tcontentRect,\n\t\t};\n\t}\n\treturn { href, sourceKey: href, targetSize, contentRect };\n}\n\nexport function shouldRedrawRasterImageCanvas({\n\tcurrentSourceKey,\n\tcurrentWidth,\n\tcurrentHeight,\n\tnextSourceKey,\n\tnextWidth,\n\tnextHeight,\n\tupscaleRedrawRatio,\n}: {\n\tcurrentSourceKey: string | null;\n\tcurrentWidth: number;\n\tcurrentHeight: number;\n\tnextSourceKey: string;\n\tnextWidth: number;\n\tnextHeight: number;\n\tupscaleRedrawRatio: number;\n}): boolean {\n\tconst safeCurrentWidth = Math.max(0, Math.round(currentWidth));\n\tconst safeCurrentHeight = Math.max(0, Math.round(currentHeight));\n\tconst safeNextWidth = Math.max(1, Math.round(nextWidth));\n\tconst safeNextHeight = Math.max(1, Math.round(nextHeight));\n\n\tif (!currentSourceKey || safeCurrentWidth <= 1 || safeCurrentHeight <= 1) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tcurrentSourceKey !== nextSourceKey &&\n\t\tsafeCurrentWidth === safeNextWidth &&\n\t\tsafeCurrentHeight === safeNextHeight\n\t) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tsafeNextWidth > safeCurrentWidth * upscaleRedrawRatio ||\n\t\tsafeNextHeight > safeCurrentHeight * upscaleRedrawRatio\n\t);\n}\n\nfunction toPositiveFiniteNumber(\n\tvalue: number | undefined,\n\tfallback: number,\n): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0\n\t\t? value\n\t\t: fallback;\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect, type Rect } from \"../math/rect\";\nimport { cullItemsByViewport } from \"../scene/cull\";\nimport type { VectorScene } from \"../scene/scene\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\tgetRasterImageCanvasTargetSize,\n\tgetRasterImageContentRect,\n\ttype RasterImageCanvasRenderingOptions,\n\ttype RasterImageCanvasSource,\n\ttype RasterImageCanvasSourceRequest,\n\ttype ResolvedRasterImageCanvasRenderingOptions,\n\ttype ResolvedRasterImageCanvasRenderTarget,\n\tresolveRasterImageCanvasRenderingOptions,\n\tresolveRasterImageCanvasRenderTarget,\n\tresolveRasterImageCanvasSourceSize,\n\tshouldRedrawRasterImageCanvas,\n} from \"./raster-image-canvas\";\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\trasterImageCanvas?: RasterImageCanvasRenderingOptions | null;\n};\n\nexport type SvgVectorRendererInteractionState = {\n\tselectedIds?: readonly string[];\n\thoveredItemId?: string | null;\n};\n\ntype CachedItemG = {\n\treadonly g: SVGGElement;\n\tlastChildrenSvg: string;\n\tlastTransform: string;\n\trasterCanvas?: CachedRasterImageCanvas;\n};\n\ntype CachedRasterImageCanvas = {\n\treadonly foreignObject: SVGForeignObjectElement;\n\treadonly canvas: HTMLCanvasElement;\n\titemHref: string | null;\n\tsourceKey: string | null;\n\twidth: number;\n\theight: number;\n\tloadSequence: number;\n\tabortController: AbortController | null;\n\tloadingItemHref: string | null;\n\tloadingSourceKey: string | null;\n\tloadingWidth: number;\n\tloadingHeight: number;\n\tqueuedTarget: QueuedRasterImageCanvasTarget | null;\n};\n\ntype QueuedRasterImageCanvasTarget = {\n\titemHref: string;\n\ttarget: ResolvedRasterImageCanvasRenderTarget;\n\tsourceRequest: Omit<RasterImageCanvasSourceRequest, \"signal\">;\n};\n\nfunction itemClassName(item: VectorSceneItem): string {\n\tconst kind = item.toolKind ?? \"unknown\";\n\tconst classes = [`canvu-item`, `canvu-item--${kind}`];\n\tif (item.svgClassName) {\n\t\tclasses.push(item.svgClassName);\n\t}\n\treturn classes.join(\" \");\n}\n\ntype DecodedRasterImage = {\n\twidth: number;\n\theight: number;\n\tdraw: (context: CanvasRenderingContext2D) => void;\n\tclose: () => void;\n};\n\nasync function decodeRasterImage(\n\thref: string,\n\twidth: number,\n\theight: number,\n\tsignal: AbortSignal,\n): Promise<DecodedRasterImage> {\n\tif (typeof createImageBitmap === \"function\") {\n\t\ttry {\n\t\t\tconst response = await fetch(href, { signal, credentials: \"same-origin\" });\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch raster image: ${response.status}`);\n\t\t\t}\n\t\t\tconst blob = await response.blob();\n\t\t\tif (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n\t\t\tconst bitmap = await createImageBitmap(blob, {\n\t\t\t\tresizeWidth: width,\n\t\t\t\tresizeHeight: height,\n\t\t\t\tresizeQuality: \"high\",\n\t\t\t});\n\t\t\treturn {\n\t\t\t\twidth: bitmap.width,\n\t\t\t\theight: bitmap.height,\n\t\t\t\tdraw: (context) => {\n\t\t\t\t\tcontext.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height);\n\t\t\t\t},\n\t\t\t\tclose: () => bitmap.close(),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (signal.aborted) throw error;\n\t\t}\n\t}\n\n\tconst image = await loadImageElement(href, signal);\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tdraw: (context) => {\n\t\t\tcontext.drawImage(image, 0, 0, width, height);\n\t\t},\n\t\tclose: () => {},\n\t};\n}\n\nfunction loadImageElement(\n\thref: string,\n\tsignal: AbortSignal,\n): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal.aborted) {\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tconst image = new Image();\n\t\tconst cleanup = () => {\n\t\t\tsignal.removeEventListener(\"abort\", abort);\n\t\t\timage.onload = null;\n\t\t\timage.onerror = null;\n\t\t};\n\t\tconst abort = () => {\n\t\t\tcleanup();\n\t\t\timage.removeAttribute(\"src\");\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t};\n\t\timage.decoding = \"async\";\n\t\timage.onload = () => {\n\t\t\tconst decodePromise = image.decode?.();\n\t\t\tif (!decodePromise) {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(image);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdecodePromise.then(\n\t\t\t\t() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(image);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(image);\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t\timage.onerror = () => {\n\t\t\tcleanup();\n\t\t\treject(new Error(\"Failed to load raster image\"));\n\t\t};\n\t\tsignal.addEventListener(\"abort\", abort, { once: true });\n\t\timage.src = href;\n\t});\n}\n\nfunction normalizeDecodedRasterImageSource(\n\tsource: RasterImageCanvasSource | null | undefined,\n): DecodedRasterImage | null {\n\tif (!source) return null;\n\tconst width = Math.max(1, Math.round(source.width));\n\tconst height = Math.max(1, Math.round(source.height));\n\tif (!Number.isFinite(width) || !Number.isFinite(height)) return null;\n\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tdraw: source.draw,\n\t\tclose: source.close ?? (() => {}),\n\t};\n}\n\nasync function resolveDecodedRasterImageSource({\n\toptions,\n\trequest,\n\twidth,\n\theight,\n\tsignal,\n}: {\n\toptions: ResolvedRasterImageCanvasRenderingOptions | null;\n\trequest: Omit<RasterImageCanvasSourceRequest, \"signal\">;\n\twidth: number;\n\theight: number;\n\tsignal: AbortSignal;\n}): Promise<DecodedRasterImage> {\n\tif (options?.resolveCanvasSource) {\n\t\tconst source = await options.resolveCanvasSource({\n\t\t\t...request,\n\t\t\tsignal,\n\t\t});\n\t\tconst decoded = normalizeDecodedRasterImageSource(source);\n\t\tif (decoded) return decoded;\n\t}\n\n\treturn decodeRasterImage(request.targetHref, width, height, signal);\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 selectedIds = new Set<string>();\n\tprivate hoveredItemId: string | null = null;\n\tprivate liveOverlay: CachedItemG | null = null;\n\tprivate readonly resizeObserver: ResizeObserver;\n\tprivate rasterImageCanvasRendering: ResolvedRasterImageCanvasRenderingOptions | null;\n\n\tconstructor(options: SvgVectorRendererOptions) {\n\t\tthis.container = options.container;\n\t\tthis.scene = options.scene;\n\t\tthis.camera = options.camera;\n\t\tthis.rasterImageCanvasRendering = resolveRasterImageCanvasRenderingOptions(\n\t\t\toptions.rasterImageCanvas,\n\t\t);\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 * Updates interaction attributes on item groups for CSS hooks.\n\t *\n\t * Use `[data-canvu-selected=\"true\"]` and `[data-canvu-hovered=\"true\"]`\n\t * for animations in interactive canvases where the scene SVG may ignore\n\t * pointer events.\n\t */\n\tsetInteractionState(state: SvgVectorRendererInteractionState): void {\n\t\tthis.selectedIds = new Set(state.selectedIds ?? []);\n\t\tthis.hoveredItemId = state.hoveredItemId ?? null;\n\t\tfor (const [id, cached] of this.itemNodeCache) {\n\t\t\tthis.applyInteractionAttributes(cached.g, id);\n\t\t}\n\t}\n\n\tsetRasterImageCanvasRendering(\n\t\toptions: RasterImageCanvasRenderingOptions | null | undefined,\n\t): void {\n\t\tthis.rasterImageCanvasRendering =\n\t\t\tresolveRasterImageCanvasRenderingOptions(options);\n\t\tif (!this.rasterImageCanvasRendering) {\n\t\t\tfor (const cached of this.itemNodeCache.values()) {\n\t\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t\t}\n\t\t}\n\t\tthis.render();\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\tg.setAttribute(\"data-canvu-item\", \"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\tcached.g.setAttribute(\"class\", itemClassName(item));\n\t\tcached.g.setAttribute(\"data-item-id\", item.id);\n\t\tcached.g.setAttribute(\"data-tool-kind\", item.toolKind ?? \"\");\n\t\tcached.g.setAttribute(\"data-canvu-selected\", \"false\");\n\t\tcached.g.setAttribute(\"data-canvu-hovered\", \"false\");\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\tthis.releaseRasterImageCanvas(cached);\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-canvu-item\", \"true\");\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\tg.setAttribute(\"class\", itemClassName(item));\n\t\t\tg.setAttribute(\"data-canvu-item\", \"true\");\n\t\t\tg.setAttribute(\"data-item-id\", item.id);\n\t\t\tg.setAttribute(\"data-tool-kind\", item.toolKind ?? \"\");\n\t\t\tthis.applyInteractionAttributes(g, item.id);\n\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\t\t\tthis.syncRasterImageCanvas(cached, item);\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\tprivate syncRasterImageCanvas(cached: CachedItemG, item: VectorSceneItem): void {\n\t\tconst options = this.rasterImageCanvasRendering;\n\t\tif (\n\t\t\t!options ||\n\t\t\titem.toolKind !== \"image\" ||\n\t\t\t!item.imageRasterHref ||\n\t\t\t!item.imageIntrinsicSize\n\t\t) {\n\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t\treturn;\n\t\t}\n\n\t\tconst contentRect = getRasterImageContentRect(item);\n\t\tconst viewportSize = {\n\t\t\twidth: this.container.clientWidth,\n\t\t\theight: this.container.clientHeight,\n\t\t};\n\t\tif (!contentRect || viewportSize.width <= 0 || viewportSize.height <= 0) {\n\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourceSize = resolveRasterImageCanvasSourceSize({\n\t\t\titem,\n\t\t\thref: item.imageRasterHref,\n\t\t\tintrinsicSize: item.imageIntrinsicSize,\n\t\t\tcontentRect,\n\t\t\tviewportSize,\n\t\t\tcameraZoom: this.camera.zoom,\n\t\t\toptions,\n\t\t});\n\t\tconst targetSize = getRasterImageCanvasTargetSize({\n\t\t\tintrinsicSize: sourceSize,\n\t\t\tcontentRect,\n\t\t\tcameraZoom: this.camera.zoom,\n\t\t\tdevicePixelRatio: options.devicePixelRatio,\n\t\t\tpixelHeadroom: options.pixelHeadroom,\n\t\t\tmaxPixelCount: options.maxPixelCount,\n\t\t\tmaxDimension: options.maxDimension,\n\t\t});\n\t\tconst target = resolveRasterImageCanvasRenderTarget({\n\t\t\titem,\n\t\t\thref: item.imageRasterHref,\n\t\t\tintrinsicSize: item.imageIntrinsicSize,\n\t\t\tsourceSize,\n\t\t\tcontentRect,\n\t\t\ttargetSize,\n\t\t\tviewportSize,\n\t\t\tcameraZoom: this.camera.zoom,\n\t\t\toptions,\n\t\t});\n\t\tconst rasterCanvas = this.ensureRasterImageCanvas(cached);\n\t\tthis.positionRasterImageCanvas(rasterCanvas, target.contentRect);\n\t\tif (\n\t\t\trasterCanvas.itemHref !== null &&\n\t\t\trasterCanvas.itemHref !== item.imageRasterHref\n\t\t) {\n\t\t\tthis.clearRasterImageCanvasBitmap(rasterCanvas);\n\t\t}\n\t\tif (\n\t\t\t!shouldRedrawRasterImageCanvas({\n\t\t\t\tcurrentSourceKey: rasterCanvas.sourceKey,\n\t\t\t\tcurrentWidth: rasterCanvas.width,\n\t\t\t\tcurrentHeight: rasterCanvas.height,\n\t\t\t\tnextSourceKey: target.sourceKey,\n\t\t\t\tnextWidth: target.targetSize.width,\n\t\t\t\tnextHeight: target.targetSize.height,\n\t\t\t\tupscaleRedrawRatio: options.upscaleRedrawRatio,\n\t\t\t})\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst request: QueuedRasterImageCanvasTarget = {\n\t\t\titemHref: item.imageRasterHref,\n\t\t\ttarget,\n\t\t\tsourceRequest: {\n\t\t\t\titem,\n\t\t\t\thref: item.imageRasterHref,\n\t\t\t\tintrinsicSize: item.imageIntrinsicSize,\n\t\t\t\tsourceSize,\n\t\t\t\tcontentRect: target.contentRect,\n\t\t\t\ttargetSize: target.targetSize,\n\t\t\t\tviewportSize,\n\t\t\t\tcameraZoom: this.camera.zoom,\n\t\t\t\tdevicePixelRatio: options.devicePixelRatio,\n\t\t\t\ttargetHref: target.href,\n\t\t\t\tsourceKey: target.sourceKey,\n\t\t\t},\n\t\t};\n\t\tif (rasterCanvas.abortController) {\n\t\t\tif (rasterCanvas.loadingItemHref !== item.imageRasterHref) {\n\t\t\t\trasterCanvas.abortController.abort();\n\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\trasterCanvas.queuedTarget = null;\n\t\t\t\tthis.drawRasterImageCanvas(rasterCanvas, request);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\trasterCanvas.loadingSourceKey === target.sourceKey &&\n\t\t\t\trasterCanvas.loadingWidth === target.targetSize.width &&\n\t\t\t\trasterCanvas.loadingHeight === target.targetSize.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tshouldRedrawRasterImageCanvas({\n\t\t\t\t\tcurrentSourceKey: rasterCanvas.loadingSourceKey,\n\t\t\t\t\tcurrentWidth: rasterCanvas.loadingWidth,\n\t\t\t\t\tcurrentHeight: rasterCanvas.loadingHeight,\n\t\t\t\t\tnextSourceKey: target.sourceKey,\n\t\t\t\t\tnextWidth: target.targetSize.width,\n\t\t\t\t\tnextHeight: target.targetSize.height,\n\t\t\t\t\tupscaleRedrawRatio: options.upscaleRedrawRatio,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\trasterCanvas.queuedTarget = request;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.drawRasterImageCanvas(rasterCanvas, request);\n\t}\n\n\tprivate ensureRasterImageCanvas(cached: CachedItemG): CachedRasterImageCanvas {\n\t\tif (cached.rasterCanvas) {\n\t\t\tif (!cached.rasterCanvas.foreignObject.isConnected) {\n\t\t\t\tcached.g.appendChild(cached.rasterCanvas.foreignObject);\n\t\t\t}\n\t\t\treturn cached.rasterCanvas;\n\t\t}\n\n\t\tconst foreignObject = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"foreignObject\",\n\t\t);\n\t\tforeignObject.setAttribute(\"data-canvu-raster-canvas\", \"true\");\n\t\tforeignObject.style.pointerEvents = \"none\";\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tcanvas.style.display = \"block\";\n\t\tcanvas.style.width = \"100%\";\n\t\tcanvas.style.height = \"100%\";\n\t\tforeignObject.appendChild(canvas);\n\t\tcached.g.appendChild(foreignObject);\n\t\tcached.rasterCanvas = {\n\t\t\tforeignObject,\n\t\t\tcanvas,\n\t\t\titemHref: null,\n\t\t\tsourceKey: null,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tloadSequence: 0,\n\t\t\tabortController: null,\n\t\t\tloadingItemHref: null,\n\t\t\tloadingSourceKey: null,\n\t\t\tloadingWidth: 0,\n\t\t\tloadingHeight: 0,\n\t\t\tqueuedTarget: null,\n\t\t};\n\t\treturn cached.rasterCanvas;\n\t}\n\n\tprivate positionRasterImageCanvas(\n\t\trasterCanvas: CachedRasterImageCanvas,\n\t\tcontentRect: Rect,\n\t): void {\n\t\trasterCanvas.foreignObject.setAttribute(\"x\", String(contentRect.x));\n\t\trasterCanvas.foreignObject.setAttribute(\"y\", String(contentRect.y));\n\t\trasterCanvas.foreignObject.setAttribute(\"width\", String(contentRect.width));\n\t\trasterCanvas.foreignObject.setAttribute(\"height\", String(contentRect.height));\n\t}\n\n\tprivate drawRasterImageCanvas(\n\t\trasterCanvas: CachedRasterImageCanvas,\n\t\trequest: QueuedRasterImageCanvasTarget,\n\t): void {\n\t\tconst { target } = request;\n\t\tconst width = Math.max(1, Math.round(target.targetSize.width));\n\t\tconst height = Math.max(1, Math.round(target.targetSize.height));\n\t\tconst sequence = rasterCanvas.loadSequence + 1;\n\t\trasterCanvas.loadSequence = sequence;\n\t\trasterCanvas.abortController?.abort();\n\t\tconst abortController = new AbortController();\n\t\trasterCanvas.abortController = abortController;\n\t\trasterCanvas.loadingItemHref = request.itemHref;\n\t\trasterCanvas.loadingSourceKey = target.sourceKey;\n\t\trasterCanvas.loadingWidth = width;\n\t\trasterCanvas.loadingHeight = height;\n\t\trasterCanvas.queuedTarget = null;\n\n\t\tresolveDecodedRasterImageSource({\n\t\t\toptions: this.rasterImageCanvasRendering,\n\t\t\trequest: request.sourceRequest,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tsignal: abortController.signal,\n\t\t})\n\t\t\t.then((decoded) => {\n\t\t\t\tif (\n\t\t\t\t\tabortController.signal.aborted ||\n\t\t\t\t\trasterCanvas.loadSequence !== sequence\n\t\t\t\t) {\n\t\t\t\t\tdecoded.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst context = rasterCanvas.canvas.getContext(\"2d\");\n\t\t\t\tif (!context) {\n\t\t\t\t\tdecoded.close();\n\t\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\t\tthis.drawQueuedRasterImageCanvasTarget(rasterCanvas);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trasterCanvas.canvas.width = decoded.width;\n\t\t\t\trasterCanvas.canvas.height = decoded.height;\n\t\t\t\tcontext.clearRect(0, 0, decoded.width, decoded.height);\n\t\t\t\tdecoded.draw(context);\n\t\t\t\tdecoded.close();\n\t\t\t\trasterCanvas.itemHref = request.itemHref;\n\t\t\t\trasterCanvas.sourceKey = target.sourceKey;\n\t\t\t\trasterCanvas.width = decoded.width;\n\t\t\t\trasterCanvas.height = decoded.height;\n\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\tthis.drawQueuedRasterImageCanvasTarget(rasterCanvas);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") return;\n\t\t\t\tif (rasterCanvas.loadSequence === sequence) {\n\t\t\t\t\trasterCanvas.abortController = null;\n\t\t\t\t\trasterCanvas.loadingItemHref = null;\n\t\t\t\t\trasterCanvas.loadingSourceKey = null;\n\t\t\t\t\trasterCanvas.loadingWidth = 0;\n\t\t\t\t\trasterCanvas.loadingHeight = 0;\n\t\t\t\t\tthis.drawQueuedRasterImageCanvasTarget(rasterCanvas);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tprivate drawQueuedRasterImageCanvasTarget(\n\t\trasterCanvas: CachedRasterImageCanvas,\n\t): void {\n\t\tconst queuedTarget = rasterCanvas.queuedTarget;\n\t\tif (!queuedTarget) return;\n\t\trasterCanvas.queuedTarget = null;\n\t\tif (\n\t\t\t!shouldRedrawRasterImageCanvas({\n\t\t\t\tcurrentSourceKey: rasterCanvas.sourceKey,\n\t\t\t\tcurrentWidth: rasterCanvas.width,\n\t\t\t\tcurrentHeight: rasterCanvas.height,\n\t\t\t\tnextSourceKey: queuedTarget.target.sourceKey,\n\t\t\t\tnextWidth: queuedTarget.target.targetSize.width,\n\t\t\t\tnextHeight: queuedTarget.target.targetSize.height,\n\t\t\t\tupscaleRedrawRatio: this.rasterImageCanvasRendering?.upscaleRedrawRatio ?? 1,\n\t\t\t})\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.drawRasterImageCanvas(rasterCanvas, queuedTarget);\n\t}\n\n\tprivate clearRasterImageCanvasBitmap(rasterCanvas: CachedRasterImageCanvas): void {\n\t\tconst context = rasterCanvas.canvas.getContext(\"2d\");\n\t\tcontext?.clearRect(0, 0, rasterCanvas.canvas.width, rasterCanvas.canvas.height);\n\t\trasterCanvas.canvas.width = 1;\n\t\trasterCanvas.canvas.height = 1;\n\t\trasterCanvas.itemHref = null;\n\t\trasterCanvas.sourceKey = null;\n\t\trasterCanvas.width = 0;\n\t\trasterCanvas.height = 0;\n\t}\n\n\tprivate releaseRasterImageCanvas(cached: CachedItemG): void {\n\t\tconst rasterCanvas = cached.rasterCanvas;\n\t\tif (!rasterCanvas) return;\n\t\trasterCanvas.abortController?.abort();\n\t\trasterCanvas.loadSequence += 1;\n\t\trasterCanvas.queuedTarget = null;\n\t\trasterCanvas.foreignObject.remove();\n\t\tcached.rasterCanvas = undefined;\n\t}\n\n\tprivate applyInteractionAttributes(g: SVGGElement, itemId: string): void {\n\t\tg.setAttribute(\n\t\t\t\"data-canvu-selected\",\n\t\t\tthis.selectedIds.has(itemId) ? \"true\" : \"false\",\n\t\t);\n\t\tg.setAttribute(\n\t\t\t\"data-canvu-hovered\",\n\t\t\tthis.hoveredItemId === itemId ? \"true\" : \"false\",\n\t\t);\n\t}\n\n\tdestroy(): void {\n\t\tthis.resizeObserver.disconnect();\n\t\tfor (const cached of this.itemNodeCache.values()) {\n\t\t\tthis.releaseRasterImageCanvas(cached);\n\t\t}\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 { 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"]}
|