canvu-react 0.4.28 → 0.4.30
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/native.cjs +4 -4
- package/dist/native.cjs.map +1 -1
- package/dist/native.js +4 -4
- package/dist/native.js.map +1 -1
- package/dist/react.cjs +3 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -1
- package/dist/react.d.ts +6 -1
- package/dist/react.js +3 -2
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/math/rect.ts","../src/scene/custom-shape.ts","../src/scene/text-svg.ts","../src/scene/shape-builders.ts","../src/image/canvas-encode.ts","../src/image/indexed-db-image-store.ts","../src/image/pdf-loader.ts","../src/react/asset-hydration.ts","../src/react/asset-ingestion.ts","../src/react/asset-store.ts","../src/react/chrome-context.ts","../src/math/item-transform.ts","../src/scene/clone-item.ts","../src/scene/managed-images.ts","../src/react/ImagesMenu.tsx","../src/react/board-position.ts","../src/react/navmenu/minimap.tsx","../src/react/navmenu/shared.ts","../src/react/navmenu/undo-redo.tsx","../src/react/navmenu/zoom-controls.tsx","../src/react/navmenu/index.tsx","../src/react/persistence/indexed-db-adapter.ts","../src/react/persistence/local-storage-adapter.ts","../src/react/persistence/use-vector-canvas-document.ts","../src/react/plugins/types.ts","../src/react/plugins/tool-plugin.tsx","../src/react/ShapeContextMenu.tsx","../src/react/tools/icons.tsx","../src/react/tools/default-tools.tsx","../src/react/VectorSelectionInspector.tsx","../src/react/VectorCanvasLayout.tsx","../src/react/VectorToolbar.tsx","../src/camera/camera.ts","../src/input/pan-momentum.ts","../src/input/apple-pencil-navigation.ts","../src/input/attach-viewport-input.ts","../src/interaction/arrow-bindings.ts","../src/interaction/resize-handles.ts","../src/interaction/hit-test.ts","../src/interaction/mutations.ts","../src/react/VectorViewport.tsx","../src/renderer/svg-vector-renderer.ts","../src/scene/cull.ts","../src/scene/spatial-cull.ts","../src/scene/link-item.ts","../src/scene/scene.ts","../src/react/blob-url-lifecycle.ts","../src/react/InteractionOverlay.tsx","../src/scene/freehand-path.ts","../src/react/presence/PresenceRemoteLayer.tsx","../src/react/presence/peer-color.ts","../src/react/stable-selection.ts","../src/react/TextEditOverlay.tsx","../src/react/vector-viewport-support.ts","../src/react/vector-tool-cursors.ts"],"names":["base","d","getStroke","op","b","s","uploadResult","fullUrl","naturalTopY","stackedTopY","bounds","itemContext","item","createContext","useContext","useMemo","useSensors","useSensor","PointerSensor","useState","useEffect","jsx","Images","arrayMove","jsxs","ChevronRight","DndContext","SortableContext","verticalListSortingStrategy","useSortable","CSS","GripVertical","Copy","RotateCw","Trash2","useRef","useCallback","Fragment","createPortal","Undo2","Redo2","useLayoutEffect","Hand","MousePointer2","Square","Circle","Minus","ArrowUpRight","PenLine","Highlighter","Eraser","Type","Image","headerStyle","preventMouseDefault","Lock","LockOpen","useId","Children","isValidElement","Shapes","ChevronDown","noop","g","forwardRef","VectorViewport","items","buildRasterImageChildrenSvg","useImperativeHandle","worldX","worldY","id","pen","rootStyle"],"mappings":"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","file":"react.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\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Width/height of the shape’s local drawing box (same as `bounds` at creation). */\nexport type CustomShapeSize = { width: number; height: number };\n\n/**\n * How to build the inner SVG (inside the item’s bounding box).\n *\n * - **`svg`**: paste-friendly markup. Use `{{w}}`, `{{h}}`, `{{width}}`, or `{{height}}` where the size should go.\n * - **`render`**: a small function when you prefer code over a string template.\n */\nexport type CreateCustomShapeContent =\n\t| {\n\t\t\t/**\n\t\t\t * SVG fragment for `<g>` contents (no outer `<svg>`). Placeholders are replaced with numeric sizes:\n\t\t\t * `{{w}}`, `{{h}}`, `{{width}}`, `{{height}}`.\n\t\t\t */\n\t\t\tsvg: string;\n\t }\n\t| {\n\t\t\t/** Returns inner SVG for the given box size (same coordinate range as `bounds`). */\n\t\t\trender: (size: CustomShapeSize) => string;\n\t };\n\n/**\n * Replaces `{{w}}`, `{{h}}`, `{{width}}`, and `{{height}}` in a string with the given dimensions.\n * Use this if you build SVG strings yourself and want the same rules as {@link createCustomShapeItem}.\n */\nexport function expandCustomShapeTemplate(\n\ttemplate: string,\n\twidth: number,\n\theight: number,\n): string {\n\treturn template\n\t\t.replace(/\\{\\{w\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{h\\}\\}/g, String(height))\n\t\t.replace(/\\{\\{width\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{height\\}\\}/g, String(height));\n}\n\nfunction resolveCustomInner(\n\tcontent: CreateCustomShapeContent,\n\tsize: CustomShapeSize,\n): string {\n\tif (\"render\" in content) {\n\t\treturn content.render(size);\n\t}\n\treturn expandCustomShapeTemplate(content.svg, size.width, size.height);\n}\n\n/**\n * Builds the scaled `<g>` wrapper used for `childrenSvg` on custom shapes that support resize.\n */\nexport function buildCustomShapeChildrenSvg(\n\tinner: string,\n\tintrinsic: CustomShapeSize,\n\tbounds: Rect,\n): string {\n\tconst b = normalizeRect(bounds);\n\tconst sx = b.width / intrinsic.width;\n\tconst sy = b.height / intrinsic.height;\n\treturn `<g transform=\"scale(${sx},${sy})\">${inner}</g>`;\n}\n\n/**\n * Creates a user-defined shape from SVG markup or a `render` callback.\n *\n * Coordinates are **local**: draw from `(0,0)` to `(width, height)` of `bounds`. The library stores an\n * intrinsic copy so resize handles (when interactive) scale the drawing uniformly.\n *\n * @example\n * ```ts\n * const star = createCustomShapeItem(createShapeId(), rect, {\n * svg: `<polygon points=\"...\" fill=\"gold\" stroke=\"#b45309\" stroke-width=\"2\" />`,\n * });\n * ```\n *\n * @example Template (good for copy-paste from design tools)\n * ```ts\n * createCustomShapeItem(id, rect, {\n * svg: `<rect width=\"{{w}}\" height=\"{{h}}\" rx=\"8\" fill=\"#e0e7ff\" stroke=\"#6366f1\" />`,\n * });\n * ```\n */\nexport function createCustomShapeItem(\n\tid: string,\n\tbounds: Rect,\n\tcontent: CreateCustomShapeContent,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst intrinsic: CustomShapeSize = { width: r.width, height: r.height };\n\tconst inner = resolveCustomInner(content, intrinsic);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"custom\",\n\t\tcustomIntrinsicSize: intrinsic,\n\t\tcustomInnerSvg: inner,\n\t\tchildrenSvg: buildCustomShapeChildrenSvg(inner, intrinsic, r),\n\t};\n}\n","/**\n * Escape text for use inside SVG `<text>` / `<tspan>` (not full XML attribute context).\n */\nexport function escapeSvgTextContent(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Escape for plain text inside HTML `foreignObject` body (not attribute). */\nfunction escapeHtmlText(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Default body font size for vector text (local SVG units). */\nexport const DEFAULT_TEXT_FONT_SIZE = 18;\n/** Default font size used when the text tool creates a new text item. */\nexport const DEFAULT_TEXT_TOOL_FONT_SIZE = 28;\n/**\n * Sophisticated sans-serif used for both canvas text rendering and inline editing.\n * Inter is loaded by host apps (e.g. demo/index.html); system-ui fallback keeps the canvas\n * usable when the webfont hasn't loaded yet.\n */\nexport const TEXT_FONT_FAMILY =\n\t\"Inter, -apple-system, BlinkMacSystemFont, ui-sans-serif, system-ui, sans-serif\";\nconst LINE_HEIGHT_RATIO = 22 / 18;\n/**\n * Where the first text baseline sits, expressed in font-size units. Picked so\n * the SVG glyph and the inline-edit textarea agree visually (the textarea's\n * natural first-line baseline lands at this same y when padded by\n * {@link EDIT_TOP_PAD_RATIO}). See {@link TextEditOverlay} for the matching\n * inset.\n */\nconst FIRST_LINE_BASELINE_RATIO = 20 / 18;\n/** Textarea top inset (font-size units) that lines up with the SVG baseline. */\nexport const EDIT_TOP_PAD_RATIO = 4 / 18;\n/** Extra space below the descender so glyphs aren't clipped at the bounds. */\nconst BOTTOM_PAD_RATIO = 4 / 18;\nconst PLACEHOLDER = \"Tap to type\";\n\nconst MIN_TEXT_BOX_W = 40;\nconst MIN_TEXT_BOX_H = 26;\n/** Horizontal padding in local space (matches `<text x=\"4\">`). */\nconst TEXT_PAD_X = 4;\nconst MAX_TEXT_MEASURE_CACHE_ENTRIES = 2000;\n\nlet sharedMeasureContext: CanvasRenderingContext2D | null | undefined;\nconst textMeasureCache = new Map<string, { width: number; height: number }>();\n\nfunction getSharedMeasureContext(): CanvasRenderingContext2D | null {\n\tif (sharedMeasureContext !== undefined) {\n\t\treturn sharedMeasureContext;\n\t}\n\tif (typeof document === \"undefined\") {\n\t\tsharedMeasureContext = null;\n\t\treturn sharedMeasureContext;\n\t}\n\tconst canvas = document.createElement(\"canvas\");\n\tsharedMeasureContext = canvas.getContext(\"2d\");\n\treturn sharedMeasureContext;\n}\n\nfunction textMeasureCacheKey(content: string, fontSize: number): string {\n\treturn `${fontSize}\\n${content}`;\n}\n\nfunction cacheMeasuredBounds(\n\tkey: string,\n\tbounds: { width: number; height: number },\n): void {\n\tif (textMeasureCache.size >= MAX_TEXT_MEASURE_CACHE_ENTRIES) {\n\t\ttextMeasureCache.clear();\n\t}\n\ttextMeasureCache.set(key, bounds);\n}\n\nfunction lineHeightFor(fontSize: number): number {\n\treturn fontSize * LINE_HEIGHT_RATIO;\n}\n\nfunction firstLineBaselineY(fontSize: number): number {\n\treturn fontSize * FIRST_LINE_BASELINE_RATIO;\n}\n\n/** Public version used by callers that need the same baseline as SVG rendering. */\nexport function textBaselineYFor(fontSize: number): number {\n\treturn firstLineBaselineY(fontSize);\n}\n\n/** Public version used by callers that need the same line height as SVG rendering. */\nexport function textLineHeightFor(fontSize: number): number {\n\treturn lineHeightFor(fontSize);\n}\n\n/**\n * Local width/height for a text item so bounds match rendered SVG (no fixed max width).\n * Uses canvas measureText when `document` is available; rough fallback otherwise.\n */\nexport function measureTextBoundsLocal(\n\tcontent: string,\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): {\n\twidth: number;\n\theight: number;\n} {\n\tconst cacheKey = textMeasureCacheKey(content, fontSize);\n\tconst cached = textMeasureCache.get(cacheKey);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst lh = lineHeightFor(fontSize);\n\tconst baselineY = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tconst lines = trimmed.length === 0 ? [PLACEHOLDER] : content.split(\"\\n\");\n\n\tlet maxInnerW = 0;\n\tconst ctx = getSharedMeasureContext();\n\tif (ctx) {\n\t\tctx.font = `${fontSize}px ${TEXT_FONT_FAMILY}`;\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, ctx.measureText(toMeasure).width);\n\t\t}\n\t}\n\tif (maxInnerW === 0) {\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, toMeasure.length * fontSize * 0.52);\n\t\t}\n\t}\n\n\tconst minW = Math.max(MIN_TEXT_BOX_W, TEXT_PAD_X * 2 + fontSize);\n\tconst width = Math.max(minW, TEXT_PAD_X * 2 + maxInnerW);\n\tconst height = Math.max(\n\t\tMIN_TEXT_BOX_H,\n\t\tbaselineY + (lines.length - 1) * lh + Math.max(4, fontSize * BOTTOM_PAD_RATIO),\n\t);\n\tconst measured = { width, height };\n\tcacheMeasuredBounds(cacheKey, measured);\n\treturn measured;\n}\n\n/**\n * Builds SVG `<text>` markup for a text box in local coordinates [0, w] × [0, h].\n * @param fillColor — Text fill (defaults to blue-gray placeholder / blue body).\n */\nexport function buildTextSvg(\n\tcontent: string,\n\t_width: number,\n\t_height: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst lh = lineHeightFor(fontSize);\n\tconst y0 = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tif (trimmed.length === 0) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"#94a3b8\" font-style=\"italic\">${escapeSvgTextContent(PLACEHOLDER)}</text>`;\n\t}\n\n\tconst lines = content.split(\"\\n\");\n\tif (lines.length === 1) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${escapeSvgTextContent(lines[0] ?? \"\")}</text>`;\n\t}\n\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i] ?? \"\";\n\t\tif (i === 0) {\n\t\t\tparts.push(`<tspan x=\"4\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t} else {\n\t\t\tparts.push(`<tspan x=\"4\" dy=\"${lh}\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t}\n\t}\n\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${parts.join(\"\")}</text>`;\n}\n\n/**\n * Text that wraps inside a fixed rectangle (after user resize). Uses `foreignObject` + XHTML\n * so wrapping matches browser layout.\n */\nexport function buildTextFixedBoundsSvg(\n\tcontent: string,\n\twidth: number,\n\theight: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst w = Math.max(1, width);\n\tconst h = Math.max(1, height);\n\tconst lh = lineHeightFor(fontSize);\n\tconst trimmed = content.trim();\n\tconst padTop = EDIT_TOP_PAD_RATIO * fontSize;\n\tif (trimmed.length === 0) {\n\t\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:#94a3b8;font-style:italic\">${escapeHtmlText(PLACEHOLDER)}</div></foreignObject>`;\n\t}\n\tconst body = escapeHtmlText(content);\n\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:${fillColor}\">${body}</div></foreignObject>`;\n}\n","import type { StrokeOptions } from \"perfect-freehand\";\nimport getStroke from \"perfect-freehand\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport { buildCustomShapeChildrenSvg } from \"./custom-shape\";\nimport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n} from \"./text-svg\";\nimport type {\n\tArrowBindings,\n\tLineEndpointsLocal,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"./types\";\n\nexport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n};\n\n/**\n * While inline-editing: sync bounds to draft width/height and hide SVG so only the textarea shows text.\n */\nexport function applyTextDraftWhileEditing(\n\titem: VectorSceneItem,\n\tdraft: string,\n): VectorSceneItem {\n\tif (item.toolKind !== \"text\") return item;\n\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tif (item.textFixedBounds) {\n\t\treturn {\n\t\t\t...item,\n\t\t\ttext: draft,\n\t\t\tchildrenSvg: \"\",\n\t\t};\n\t}\n\tconst m = measureTextBoundsLocal(draft, fs);\n\treturn {\n\t\t...item,\n\t\ttext: draft,\n\t\tbounds: {\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t},\n\t\tchildrenSvg: \"\",\n\t};\n}\n\n/** Stroke dash pattern for freehand drawings. `solid` = perfect-freehand fill; `dashed` = centerline stroke with dashes. */\nexport type StrokeDash = \"solid\" | \"dashed\";\n\n/** Resolved stroke for SVG generation. */\nexport type StrokeStyle = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: StrokeDash;\n};\n\nexport const DEFAULT_STROKE_STYLE: StrokeStyle = {\n\tstroke: \"#1d1d1d\",\n\tstrokeWidth: 2,\n};\n\nconst TOOL_FREEHAND_DEFAULTS: Record<\n\t\"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tPartial<StrokeStyle>\n> = {\n\tdraw: { strokeWidth: 10 },\n\tpencil: { strokeWidth: 3 },\n\tbrush: { strokeWidth: 10 },\n\tmarker: { stroke: \"#fde047\", strokeWidth: 16, strokeOpacity: 0.5 },\n};\n\nfunction perfectFreehandOptions(\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstyle: StrokeStyle,\n\tstrokeComplete: boolean,\n\tpressureAware = false,\n): StrokeOptions {\n\tconst sw = style.strokeWidth;\n\tconst base: StrokeOptions = {\n\t\tlast: strokeComplete,\n\t\tsimulatePressure: true,\n\t};\n\tif (toolKind === \"draw\" || toolKind === \"pencil\") {\n\t\tif (pressureAware && toolKind === \"draw\") {\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tsize: Math.max(2, sw * 1.05),\n\t\t\t\tthinning: 0.42,\n\t\t\t\tsmoothing: 0.78,\n\t\t\t\tstreamline: 0.62,\n\t\t\t\tsimulatePressure: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(2, sw * 1.18),\n\t\t\tthinning: 0.12,\n\t\t\tsmoothing: 0.85,\n\t\t\tstreamline: 0.78,\n\t\t\tsimulatePressure: true,\n\t\t};\n\t}\n\tif (toolKind === \"brush\") {\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(4, sw * 1.22),\n\t\t\tthinning: 0.52,\n\t\t\tsmoothing: 0.64,\n\t\t\tstreamline: 0.68,\n\t\t};\n\t}\n\treturn {\n\t\t...base,\n\t\tsize: Math.max(6, sw * 1.08),\n\t\tthinning: 0.08,\n\t\tsmoothing: 0.88,\n\t\tstreamline: 0.84,\n\t\tsimulatePressure: true,\n\t};\n}\n\nexport function resolveStrokeStyle(item: VectorSceneItem): StrokeStyle {\n\treturn {\n\t\tstroke: item.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\tstrokeWidth: item.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\tstrokeOpacity: item.strokeOpacity,\n\t\tstrokeDash: item.strokeDash,\n\t};\n}\n\nfunction strokeOpacityAttr(style: StrokeStyle): string {\n\treturn style.strokeOpacity != null\n\t\t? ` stroke-opacity=\"${style.strokeOpacity}\"`\n\t\t: \"\";\n}\n\nfunction svgNumber(value: number): string {\n\tif (!Number.isFinite(value)) return \"0\";\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Number.isInteger(rounded) ? String(rounded) : String(rounded);\n}\n\nconst ARCHITECTURAL_CLOUD_RADIUS = 38;\nconst ARCHITECTURAL_CLOUD_TARGET_SPACING = 50;\nconst ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO = 0.38;\nconst ARCHITECTURAL_CLOUD_ROUNDED_RADIUS = 72;\nconst ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS = 44;\nconst ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING = 98;\n\ntype CloudPoint = readonly [number, number];\n\ntype CloudPathSegment = {\n\tlength: number;\n\tpointAt: (t: number) => CloudPoint;\n};\n\nfunction architecturalCloudCenterCount(edgeLength: number, radius: number): number {\n\tconst targetSpacing = Math.min(\n\t\tARCHITECTURAL_CLOUD_TARGET_SPACING,\n\t\tMath.max(1, radius * 1.3),\n\t);\n\treturn Math.max(2, Math.round(edgeLength / targetSpacing) + 1);\n}\n\nfunction distributeRange(start: number, end: number, count: number): number[] {\n\tif (count <= 1) return [start];\n\tconst step = (end - start) / (count - 1);\n\treturn Array.from({ length: count }, (_, index) => start + step * index);\n}\n\nfunction lineCloudPathSegment(start: CloudPoint, end: CloudPoint): CloudPathSegment {\n\tconst dx = end[0] - start[0];\n\tconst dy = end[1] - start[1];\n\tconst length = Math.hypot(dx, dy);\n\treturn {\n\t\tlength,\n\t\tpointAt: (t) => [start[0] + dx * t, start[1] + dy * t],\n\t};\n}\n\nfunction ellipsePoint(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tangle: number,\n): CloudPoint {\n\treturn [centerX + Math.cos(angle) * radiusX, centerY + Math.sin(angle) * radiusY];\n}\n\nfunction approximateEllipseArcLength(\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): number {\n\tconst steps = Math.max(\n\t\t4,\n\t\tMath.ceil(Math.abs(endAngle - startAngle) / (Math.PI / 16)),\n\t);\n\tlet length = 0;\n\tlet previous = ellipsePoint(0, 0, radiusX, radiusY, startAngle);\n\tfor (let index = 1; index <= steps; index += 1) {\n\t\tconst angle = startAngle + ((endAngle - startAngle) * index) / steps;\n\t\tconst next = ellipsePoint(0, 0, radiusX, radiusY, angle);\n\t\tlength += Math.hypot(next[0] - previous[0], next[1] - previous[1]);\n\t\tprevious = next;\n\t}\n\treturn length;\n}\n\nfunction ellipseCloudPathSegment(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): CloudPathSegment {\n\treturn {\n\t\tlength: approximateEllipseArcLength(radiusX, radiusY, startAngle, endAngle),\n\t\tpointAt: (t) =>\n\t\t\tellipsePoint(\n\t\t\t\tcenterX,\n\t\t\t\tcenterY,\n\t\t\t\tradiusX,\n\t\t\t\tradiusY,\n\t\t\t\tstartAngle + (endAngle - startAngle) * t,\n\t\t\t),\n\t};\n}\n\nfunction cloudPathPerimeter(segments: CloudPathSegment[]): number {\n\tconst usableSegments = segments.filter((segment) => segment.length > 1e-9);\n\treturn usableSegments.reduce((sum, segment) => sum + segment.length, 0);\n}\n\nfunction pointOnCloudPath(\n\tsegments: CloudPathSegment[],\n\tdistance: number,\n): CloudPoint {\n\tconst perimeter = cloudPathPerimeter(segments);\n\tif (perimeter <= 0) return [0, 0];\n\n\tlet remaining = ((distance % perimeter) + perimeter) % perimeter;\n\tfor (const segment of segments) {\n\t\tif (segment.length <= 1e-9) continue;\n\t\tif (remaining <= segment.length) {\n\t\t\tconst t = remaining / segment.length;\n\t\t\treturn segment.pointAt(t);\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\n\tconst fallback = segments.find((segment) => segment.length > 1e-9);\n\treturn fallback?.pointAt(0) ?? [0, 0];\n}\n\nfunction buildRoundedCapsulePathSegments(\n\twidth: number,\n\theight: number,\n\tinset: number,\n): CloudPathSegment[] {\n\tconst left = inset;\n\tconst top = inset;\n\tconst right = width - inset;\n\tconst bottom = height - inset;\n\tconst capsuleWidth = Math.max(0, right - left);\n\tconst capsuleHeight = Math.max(0, bottom - top);\n\tconst radius = Math.min(capsuleWidth, capsuleHeight) / 2;\n\tif (radius <= 0) return [];\n\n\tconst leftCenterX = left + radius;\n\tconst rightCenterX = right - radius;\n\tconst topCenterY = top + radius;\n\tconst bottomCenterY = bottom - radius;\n\n\treturn [\n\t\tlineCloudPathSegment([leftCenterX, top], [rightCenterX, top]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t-Math.PI / 2,\n\t\t\t0,\n\t\t),\n\t\tlineCloudPathSegment([right, topCenterY], [right, bottomCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t),\n\t\tlineCloudPathSegment([rightCenterX, bottom], [leftCenterX, bottom]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI / 2,\n\t\t\tMath.PI,\n\t\t),\n\t\tlineCloudPathSegment([left, bottomCenterY], [left, topCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI,\n\t\t\tMath.PI * 1.5,\n\t\t),\n\t];\n}\n\nfunction buildRoundedArcCloudPathD(\n\tcloudWidth: number,\n\tcloudHeight: number,\n\tcenter: CloudPoint,\n): string {\n\tconst minDimension = Math.min(cloudWidth, cloudHeight);\n\tconst radius = Math.min(\n\t\tARCHITECTURAL_CLOUD_ROUNDED_RADIUS,\n\t\tMath.max(ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS, minDimension * 0.16),\n\t);\n\tconst centerPath = buildRoundedCapsulePathSegments(\n\t\tcloudWidth,\n\t\tcloudHeight,\n\t\tradius,\n\t);\n\tconst centerPerimeter = cloudPathPerimeter(centerPath);\n\tif (centerPerimeter <= 0) return \"\";\n\n\tconst lobeCount = Math.max(\n\t\t8,\n\t\tMath.round(centerPerimeter / ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING),\n\t);\n\tconst centers = Array.from({ length: lobeCount }, (_, index) =>\n\t\tpointOnCloudPath(centerPath, (centerPerimeter * index) / lobeCount),\n\t);\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudCircleIntersection(previous, point, radius, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\nfunction cloudCircleIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradius: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst midX = (a[0] + b[0]) / 2;\n\tconst midY = (a[1] + b[1]) / 2;\n\tconst dx = b[0] - a[0];\n\tconst dy = b[1] - a[1];\n\tconst distance = Math.hypot(dx, dy);\n\tif (distance <= 1e-9) return [midX, midY];\n\n\tconst halfDistance = distance / 2;\n\tconst offset = Math.sqrt(\n\t\tMath.max(0, radius * radius - halfDistance * halfDistance),\n\t);\n\tconst normalX = -dy / distance;\n\tconst normalY = dx / distance;\n\tconst first: [number, number] = [midX + normalX * offset, midY + normalY * offset];\n\tconst second: [number, number] = [\n\t\tmidX - normalX * offset,\n\t\tmidY - normalY * offset,\n\t];\n\tconst firstDistance =\n\t\t(first[0] - center[0]) * (first[0] - center[0]) +\n\t\t(first[1] - center[1]) * (first[1] - center[1]);\n\tconst secondDistance =\n\t\t(second[0] - center[0]) * (second[0] - center[0]) +\n\t\t(second[1] - center[1]) * (second[1] - center[1]);\n\treturn firstDistance >= secondDistance ? first : second;\n}\n\nfunction cloudEllipseIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradiusX: number,\n\tradiusY: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst scaleY = radiusX / radiusY;\n\tconst [x, y] = cloudCircleIntersection(\n\t\t[a[0], a[1] * scaleY],\n\t\t[b[0], b[1] * scaleY],\n\t\tradiusX,\n\t\t[center[0], center[1] * scaleY],\n\t);\n\treturn [x, y / scaleY];\n}\n\nexport function buildRectSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<rect width=\"${width}\" height=\"${height}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" rx=\"4\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildEllipseSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst rx = width / 2;\n\tconst ry = height / 2;\n\treturn `<ellipse cx=\"${rx}\" cy=\"${ry}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\n/**\n * Returns the local SVG path for a scalable architectural revision cloud.\n *\n * Use this low-level helper when you need to preview or inspect the shape without\n * creating a full scene item. Prefer {@link createArchitecturalCloudItem} when\n * adding a cloud to a `VectorSceneItem[]`, because it keeps `toolKind`, bounds,\n * stroke fields, and `childrenSvg` synchronized for editing.\n *\n * @example\n * ```ts\n * const d = buildArchitecturalCloudPathD(180, 90);\n * ```\n */\nexport function buildArchitecturalCloudPathD(\n\twidth: number,\n\theight: number,\n\tstrokeWidth = DEFAULT_STROKE_STYLE.strokeWidth,\n): string {\n\tconst w = Math.max(0, width);\n\tconst h = Math.max(0, height);\n\tif (w <= 0 || h <= 0) return \"\";\n\n\tconst padding = Math.max(0, strokeWidth * 2);\n\tconst cloudWidth = Math.max(0, w - padding);\n\tconst cloudHeight = Math.max(0, h - padding);\n\tif (cloudWidth <= 0 || cloudHeight <= 0) return \"\";\n\n\tconst radiusX = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudWidth * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tconst radiusY = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudHeight * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tif (radiusX <= 0 || radiusY <= 0) return \"\";\n\n\tconst center: CloudPoint = [cloudWidth / 2, cloudHeight / 2];\n\tconst leftCenterX = radiusX;\n\tconst rightCenterX = cloudWidth - radiusX;\n\tconst topCenterY = radiusY;\n\tconst bottomCenterY = cloudHeight - radiusY;\n\tconst horizontalCenters = distributeRange(\n\t\tleftCenterX,\n\t\trightCenterX,\n\t\tarchitecturalCloudCenterCount(Math.max(0, rightCenterX - leftCenterX), radiusX),\n\t);\n\tconst verticalCenters = distributeRange(\n\t\ttopCenterY,\n\t\tbottomCenterY,\n\t\tarchitecturalCloudCenterCount(Math.max(0, bottomCenterY - topCenterY), radiusY),\n\t);\n\tif (horizontalCenters.length > 3 && verticalCenters.length > 3) {\n\t\tconst roundedArcCloudPath = buildRoundedArcCloudPathD(\n\t\t\tcloudWidth,\n\t\t\tcloudHeight,\n\t\t\tcenter,\n\t\t);\n\t\tif (roundedArcCloudPath !== \"\") return roundedArcCloudPath;\n\t}\n\tconst rectangularCenters: CloudPoint[] = [\n\t\t...horizontalCenters.map((x) => [x, topCenterY] as const),\n\t\t...verticalCenters.slice(1).map((y) => [rightCenterX, y] as const),\n\t\t...horizontalCenters\n\t\t\t.slice(0, -1)\n\t\t\t.reverse()\n\t\t\t.map((x) => [x, bottomCenterY] as const),\n\t\t...verticalCenters\n\t\t\t.slice(1, -1)\n\t\t\t.reverse()\n\t\t\t.map((y) => [leftCenterX, y] as const),\n\t];\n\tconst centers = rectangularCenters;\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudEllipseIntersection(previous, point, radiusX, radiusY, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\n/**\n * Builds an SVG fragment for an architectural revision cloud outline.\n *\n * This is the renderer-level primitive behind the built-in `\"architectural-cloud\"`\n * tool. Prefer {@link createArchitecturalCloudItem} for app code that inserts a\n * normal editable scene item.\n */\nexport function buildArchitecturalCloudSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst d = buildArchitecturalCloudPathD(width, height, style.strokeWidth);\n\treturn `<path d=\"${d}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildLineSvg(\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${line.x2}\" y2=\"${line.y2}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\nexport type StraightArrowGeometry = {\n\tshaftEndX: number;\n\tshaftEndY: number;\n\theadTipX: number;\n\theadTipY: number;\n\theadLeftX: number;\n\theadLeftY: number;\n\theadRightX: number;\n\theadRightY: number;\n};\n\nexport function computeStraightArrowGeometry(\n\tline: LineEndpointsLocal,\n\tstrokeWidth: number,\n): StraightArrowGeometry | null {\n\tconst dx = line.x2 - line.x1;\n\tconst dy = line.y2 - line.y1;\n\tconst len = Math.hypot(dx, dy);\n\tif (len < 1e-6) return null;\n\tconst ux = dx / len;\n\tconst uy = dy / len;\n\tconst headLength = Math.min(Math.max(strokeWidth * 4.2, 12), len * 0.38);\n\tconst headAngle = Math.PI / 6;\n\tconst cos = Math.cos(headAngle);\n\tconst sin = Math.sin(headAngle);\n\tconst rx1 = ux * cos - uy * sin;\n\tconst ry1 = ux * sin + uy * cos;\n\tconst rx2 = ux * cos + uy * sin;\n\tconst ry2 = -ux * sin + uy * cos;\n\treturn {\n\t\tshaftEndX: line.x2,\n\t\tshaftEndY: line.y2,\n\t\theadTipX: line.x2,\n\t\theadTipY: line.y2,\n\t\theadLeftX: line.x2 - rx1 * headLength,\n\t\theadLeftY: line.y2 - ry1 * headLength,\n\t\theadRightX: line.x2 - rx2 * headLength,\n\t\theadRightY: line.y2 - ry2 * headLength,\n\t};\n}\n\nexport function buildArrowSvg(\n\titemId: string,\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tvoid itemId;\n\tconst geometry = computeStraightArrowGeometry(line, style.strokeWidth);\n\tif (!geometry) {\n\t\treturn buildLineSvg(line, style);\n\t}\n\tconst op = strokeOpacityAttr(style);\n\treturn `\n\t\t<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${geometry.shaftEndX}\" y2=\"${geometry.shaftEndY}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\"${op} />\n\t\t<path d=\"M ${geometry.headLeftX} ${geometry.headLeftY} L ${geometry.headTipX} ${geometry.headTipY} L ${geometry.headRightX} ${geometry.headRightY}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op} />\n\t`;\n}\n\nexport function buildDrawDotSvg(\n\tr: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst op =\n\t\tstyle.strokeOpacity != null ? ` fill-opacity=\"${style.strokeOpacity}\"` : \"\";\n\treturn `<circle cx=\"${r}\" cy=\"${r}\" r=\"${r}\" fill=\"${style.stroke}\" shape-rendering=\"geometricPrecision\"${op} />`;\n}\n\n/** Structured result for React overlays; scene uses {@link buildFreehandPathSvg} string. */\nexport type FreehandSvgPayload =\n\t| {\n\t\t\tkind: \"circle\";\n\t\t\tcx: number;\n\t\t\tcy: number;\n\t\t\tr: number;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"fillPath\";\n\t\t\td: string;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"strokePath\";\n\t\t\td: string;\n\t\t\tstroke: string;\n\t\t\tstrokeWidth: number;\n\t\t\tstrokeOpacity?: number;\n\t\t\tstrokeDasharray?: string;\n\t };\n\nfunction dashArrayForDrawStroke(strokeWidth: number): string {\n\tconst dash = Math.max(strokeWidth * 1.8, 4);\n\tconst gap = Math.max(strokeWidth * 1.4, 3);\n\treturn `${dash} ${gap}`;\n}\n\nfunction buildSmoothedCenterlinePath(\n\tpoints: readonly { x: number; y: number }[],\n): string | null {\n\tif (points.length < 2) return null;\n\tconst first = points[0];\n\tif (!first) return null;\n\tlet d = `M ${first.x} ${first.y}`;\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst a = points[i];\n\t\tconst b = points[i + 1];\n\t\tif (!a || !b) continue;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\td += ` Q ${a.x} ${a.y} ${midX} ${midY}`;\n\t}\n\tconst last = points[points.length - 1];\n\tif (last) {\n\t\td += ` L ${last.x} ${last.y}`;\n\t}\n\treturn d;\n}\n\n/**\n * Computes freehand geometry (perfect-freehand + fallback). Used by {@link buildFreehandPathSvg}\n * and React overlays without `dangerouslySetInnerHTML`.\n */\nexport function computeFreehandSvgPayload(\n\tpathPointsLocal: readonly VectorPathPoint[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): FreehandSvgPayload | null {\n\tif (pathPointsLocal.length === 0) return null;\n\tif (pathPointsLocal.length === 1) {\n\t\tconst p = pathPointsLocal[0];\n\t\tif (!p) return null;\n\t\treturn {\n\t\t\tkind: \"circle\",\n\t\t\tcx: p.x,\n\t\t\tcy: p.y,\n\t\t\tr: Math.max(0.5, style.strokeWidth / 2),\n\t\t\tfill: style.stroke,\n\t\t\tfillOpacity: style.strokeOpacity,\n\t\t};\n\t}\n\tif (\n\t\tstyle.strokeDash === \"dashed\" &&\n\t\t(toolKind === \"draw\" || toolKind === \"pencil\")\n\t) {\n\t\tconst d = buildSmoothedCenterlinePath(pathPointsLocal);\n\t\tif (!d) return null;\n\t\treturn {\n\t\t\tkind: \"strokePath\",\n\t\t\td,\n\t\t\tstroke: style.stroke,\n\t\t\tstrokeWidth: style.strokeWidth,\n\t\t\tstrokeOpacity: style.strokeOpacity,\n\t\t\tstrokeDasharray: dashArrayForDrawStroke(style.strokeWidth),\n\t\t};\n\t}\n\tconst hasPressure = pathPointsLocal.some(\n\t\t(p) => p.pressure != null && Number.isFinite(p.pressure),\n\t);\n\tconst input = hasPressure\n\t\t? pathPointsLocal.map(\n\t\t\t\t(p) =>\n\t\t\t\t\t[p.x, p.y, Math.min(1, Math.max(0, p.pressure ?? 0.5))] as [\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t],\n\t\t\t)\n\t\t: pathPointsLocal.map((p) => [p.x, p.y] as [number, number]);\n\tconst stroke = getStroke(\n\t\tinput,\n\t\tperfectFreehandOptions(toolKind, style, strokeComplete, hasPressure),\n\t);\n\tif (stroke.length < 3) return null;\n\tconst first = stroke[0];\n\tif (!first) return null;\n\tlet d = `M ${first[0]} ${first[1]} Q`;\n\tfor (let i = 0; i < stroke.length; i++) {\n\t\tconst a = stroke[i];\n\t\tconst b = stroke[(i + 1) % stroke.length];\n\t\tif (!a || !b) continue;\n\t\td += ` ${a[0]} ${a[1]} ${(a[0] + b[0]) / 2} ${(a[1] + b[1]) / 2}`;\n\t}\n\td += \" Z\";\n\treturn {\n\t\tkind: \"fillPath\",\n\t\td,\n\t\tfill: style.stroke,\n\t\tfillOpacity: style.strokeOpacity,\n\t};\n}\n\nfunction freehandPayloadToSvgString(payload: FreehandSvgPayload): string {\n\tif (payload.kind === \"circle\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<circle cx=\"${payload.cx}\" cy=\"${payload.cy}\" r=\"${payload.r}\" fill=\"${payload.fill}\" shape-rendering=\"geometricPrecision\"${op} />`;\n\t}\n\tif (payload.kind === \"fillPath\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<path d=\"${payload.d}\" fill=\"${payload.fill}\" fill-rule=\"nonzero\" stroke=\"none\"${op} shape-rendering=\"geometricPrecision\" />`;\n\t}\n\tconst op = strokeOpacityAttr({\n\t\tstroke: payload.stroke,\n\t\tstrokeWidth: payload.strokeWidth,\n\t\tstrokeOpacity: payload.strokeOpacity,\n\t});\n\tconst dash = payload.strokeDasharray\n\t\t? ` stroke-dasharray=\"${payload.strokeDasharray}\"`\n\t\t: \"\";\n\treturn `<path d=\"${payload.d}\" fill=\"none\" stroke=\"${payload.stroke}\" stroke-width=\"${payload.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op}${dash} />`;\n}\n\n/**\n * Freehand stroke in local coordinates using [perfect-freehand](https://github.com/steveruizok/perfect-freehand)\n * (filled outline, tapered caps — similar spirit to tldraw / Excalidraw ink).\n */\nexport function buildFreehandPathSvg(\n\tpathPointsLocal: readonly { x: number; y: number }[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): string {\n\tconst payload = computeFreehandSvgPayload(\n\t\tpathPointsLocal,\n\t\tstyle,\n\t\ttoolKind,\n\t\tstrokeComplete,\n\t);\n\tif (!payload) return \"\";\n\treturn freehandPayloadToSvgString(payload);\n}\n\n/**\n * Creates a new unique id for a shape (for `VectorSceneItem.id` when adding from code or API).\n */\nexport function createShapeId(): string {\n\tconst uid =\n\t\ttypeof crypto !== \"undefined\" && crypto.randomUUID\n\t\t\t? crypto.randomUUID()\n\t\t\t: String(Date.now());\n\treturn `user-shape-${uid}`;\n}\n\n/**\n * Converts line segment endpoints from **world** coordinates to **local** coordinates\n * (origin = top-left of `bounds`). Use with {@link createLineItem}.\n */\nexport function lineEndpointsToLocal(\n\tbounds: Rect,\n\tworldEndA: { x: number; y: number },\n\tworldEndB: { x: number; y: number },\n): LineEndpointsLocal {\n\tconst b = normalizeRect(bounds);\n\treturn {\n\t\tx1: worldEndA.x - b.x,\n\t\ty1: worldEndA.y - b.y,\n\t\tx2: worldEndB.x - b.x,\n\t\ty2: worldEndB.y - b.y,\n\t};\n}\n\n/**\n * Rebuilds the SVG fragment (`childrenSvg`) from geometry + stroke fields (after edits or resize).\n */\nexport function rebuildItemSvg(item: VectorSceneItem): VectorSceneItem {\n\tconst style = resolveStrokeStyle(item);\n\tconst k = item.toolKind;\n\n\tif (k === \"rect\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRectSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"ellipse\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildEllipseSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"architectural-cloud\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildArchitecturalCloudSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif ((k === \"line\" || k === \"arrow\") && item.line) {\n\t\tconst line = item.line;\n\t\tconst childrenSvg =\n\t\t\tk === \"arrow\"\n\t\t\t\t? buildArrowSvg(item.id, line, style)\n\t\t\t\t: buildLineSvg(line, style);\n\t\treturn { ...item, childrenSvg };\n\t}\n\tif (k === \"text\" && item.text !== undefined) {\n\t\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\t\tif (item.textFixedBounds) {\n\t\t\tconst b = normalizeRect(item.bounds);\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: b.x,\n\t\t\t\ty: b.y,\n\t\t\t\tbounds: b,\n\t\t\t\tchildrenSvg: buildTextFixedBoundsSvg(\n\t\t\t\t\titem.text,\n\t\t\t\t\tb.width,\n\t\t\t\t\tb.height,\n\t\t\t\t\tstyle.stroke,\n\t\t\t\t\tfs,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tconst m = measureTextBoundsLocal(item.text, fs);\n\t\tconst b = normalizeRect({\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t});\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildTextSvg(item.text, b.width, b.height, style.stroke, fs),\n\t\t};\n\t}\n\tif (\n\t\t(k === \"draw\" || k === \"pencil\" || k === \"brush\" || k === \"marker\") &&\n\t\titem.pathPointsLocal &&\n\t\titem.pathPointsLocal.length > 0\n\t) {\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildFreehandPathSvg(item.pathPointsLocal, style, k),\n\t\t};\n\t}\n\tif (k === \"draw\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\tconst r = Math.min(b.width, b.height) / 2;\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildDrawDotSvg(r, style),\n\t\t};\n\t}\n\tif (k === \"image\" && item.imageRasterHref && item.imageIntrinsicSize) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\titem.imageRasterHref,\n\t\t\t\titem.imageIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\tif (k === \"custom\" && item.customIntrinsicSize && item.customInnerSvg) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildCustomShapeChildrenSvg(\n\t\t\t\titem.customInnerSvg,\n\t\t\t\titem.customIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\n\treturn item;\n}\n\n/** Updates stroke color / width / opacity and refreshes the item’s SVG. */\nexport function applyStrokeToItem(\n\titem: VectorSceneItem,\n\tpatch: Partial<\n\t\tPick<\n\t\t\tVectorSceneItem,\n\t\t\t\"stroke\" | \"strokeWidth\" | \"strokeOpacity\" | \"strokeDash\" | \"textFontSize\"\n\t\t>\n\t>,\n): VectorSceneItem {\n\treturn rebuildItemSvg({ ...item, ...patch });\n}\n\n/** Creates a rectangle shape ready to append to your scene `items` array. */\nexport function createRectangleItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"rect\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an ellipse shape. */\nexport function createEllipseItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"ellipse\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/**\n * Creates an architectural revision cloud shape.\n *\n * Use this high-level builder when adding the built-in cloud shape from code or\n * from custom integrations. It creates an editable `VectorSceneItem` with\n * `toolKind: \"architectural-cloud\"`, so resize, stroke styling, selection, and\n * serialization continue to work like the built-in rectangle and ellipse tools.\n *\n * @example\n * ```ts\n * const cloud = createArchitecturalCloudItem(createShapeId(), {\n * x: 40,\n * y: 30,\n * width: 180,\n * height: 90,\n * });\n * ```\n */\nexport function createArchitecturalCloudItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"architectural-cloud\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates a straight line or arrow; `line` is usually from {@link lineEndpointsToLocal}. */\nexport function createLineItem(\n\tid: string,\n\tbounds: Rect,\n\tline: LineEndpointsLocal,\n\ttoolKind: \"line\" | \"arrow\",\n\tstyle?: Partial<StrokeStyle>,\n\tarrowBind?: ArrowBindings,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind,\n\t\tline: { ...line },\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(arrowBind ? { arrowBind } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** “Draw dot” tool: a small filled circle at (`worldX`, `worldY`). */\nexport function createDrawDotItem(\n\tid: string,\n\tworldX: number,\n\tworldY: number,\n\tradius: number,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: worldX - radius,\n\t\ty: worldY - radius,\n\t\tbounds: {\n\t\t\tx: worldX - radius,\n\t\t\ty: worldY - radius,\n\t\t\twidth: radius * 2,\n\t\t\theight: radius * 2,\n\t\t},\n\t\ttoolKind: \"draw\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an editable text box (`stroke` is used as text fill). */\nexport function createTextItem(\n\tid: string,\n\tbounds: Rect,\n\ttext = \"\",\n\tstyle?: Partial<StrokeStyle>,\n\ttextFontSize?: number,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"text\",\n\t\ttext,\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(textFontSize != null ? { textFontSize } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Freehand stroke from world-space points (main pen or marker highlight). */\nexport function createFreehandStrokeItem(\n\tid: string,\n\tpointsWorld: readonly VectorPathPoint[],\n\ttoolKind: \"draw\" | \"marker\",\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem | null {\n\tif (pointsWorld.length === 0) return null;\n\n\tconst merged: StrokeStyle = {\n\t\t...DEFAULT_STROKE_STYLE,\n\t\t...TOOL_FREEHAND_DEFAULTS[toolKind],\n\t\t...style,\n\t};\n\n\tconst sw = merged.strokeWidth;\n\t/** Filled outline extends ~size/2 past the polyline; keep generous padding to avoid clipping. */\n\tconst pad = Math.max(sw * 0.75 + 4, sw / 2 + 6);\n\tconst xs = pointsWorld.map((p) => p.x);\n\tconst ys = pointsWorld.map((p) => p.y);\n\tconst minX = Math.min(...xs);\n\tconst maxX = Math.max(...xs);\n\tconst minY = Math.min(...ys);\n\tconst maxY = Math.max(...ys);\n\n\tconst x = minX - pad;\n\tconst y = minY - pad;\n\tconst w = Math.max(maxX - minX + 2 * pad, sw);\n\tconst h = Math.max(maxY - minY + 2 * pad, sw);\n\n\tconst pathPointsLocal = pointsWorld.map((p) => ({\n\t\tx: p.x - x,\n\t\ty: p.y - y,\n\t\t...(p.pressure != null ? { pressure: p.pressure } : {}),\n\t}));\n\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx,\n\t\ty,\n\t\tbounds: { x, y, width: w, height: h },\n\t\ttoolKind,\n\t\tstroke: merged.stroke,\n\t\tstrokeWidth: merged.strokeWidth,\n\t\t...(merged.strokeOpacity != null ? { strokeOpacity: merged.strokeOpacity } : {}),\n\t\t...(merged.strokeDash != null ? { strokeDash: merged.strokeDash } : {}),\n\t\tpathPointsLocal,\n\t\tchildrenSvg: \"\",\n\t});\n}\n\nfunction escapeSvgAttr(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\");\n}\n\n/**\n * Builds `<g><image href=\"data:...\"/></g>` inside `bounds` from intrinsic pixel dimensions.\n * When bounds match intrinsic aspect (normal after aspect-locked resize), uses a uniform **fill** scale.\n * Otherwise uses **contain** + center for legacy or pasted rects with wrong proportion.\n */\nexport function buildRasterImageChildrenSvg(\n\tdataUrl: string,\n\tintrinsic: { width: number; height: number },\n\tbounds: Rect,\n): string {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, intrinsic.width);\n\tconst ih = Math.max(1e-6, intrinsic.height);\n\tconst href = escapeSvgAttr(dataUrl);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = iw / ih;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / iw;\n\t\treturn `<g transform=\"scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n\t}\n\tconst s = Math.min(r.width / iw, r.height / ih);\n\tconst tx = (r.width - iw * s) / 2;\n\tconst ty = (r.height - ih * s) / 2;\n\treturn `<g transform=\"translate(${tx}, ${ty}) scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n}\n\n/** Places a bitmap (e.g. `data:image/png;base64,...`) inside `bounds`. */\nexport function createImageItem(\n\tid: string,\n\tbounds: Rect,\n\timageRasterHref: string,\n\timageIntrinsicSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, imageIntrinsicSize.width);\n\tconst ih = Math.max(1e-6, imageIntrinsicSize.height);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageRasterHref,\n\t\timageIntrinsicSize: { width: iw, height: ih },\n\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\timageRasterHref,\n\t\t\t{ width: iw, height: ih },\n\t\t\tr,\n\t\t),\n\t};\n}\n\n/** @internal Legacy traced path content — prefer {@link createImageItem} with a raster data URL. */\nexport function createImageFromVectorTrace(\n\tid: string,\n\tbounds: Rect,\n\timageVectorInnerSvg: string,\n\timageVectorLocalSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst lw = Math.max(1e-6, imageVectorLocalSize.width);\n\tconst lh = Math.max(1e-6, imageVectorLocalSize.height);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = lw / lh;\n\tlet childrenSvg: string;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / lw;\n\t\tchildrenSvg = `<g transform=\"scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t} else {\n\t\tconst s = Math.min(r.width / lw, r.height / lh);\n\t\tconst tx = (r.width - lw * s) / 2;\n\t\tconst ty = (r.height - lh * s) / 2;\n\t\tchildrenSvg = `<g transform=\"translate(${tx}, ${ty}) scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t}\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageVectorInnerSvg,\n\t\timageVectorLocalSize: { width: lw, height: lh },\n\t\tchildrenSvg,\n\t};\n}\n","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","\"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","\"use client\";\n\nimport {\n\tcreateBlobUrlFromStore,\n\tIndexedDbImageStore,\n\tloadImageToStore,\n} from \"../image/indexed-db-image-store\";\nimport { loadPdfToStore } from \"../image/pdf-loader\";\nimport { buildRasterImageChildrenSvg, createShapeId } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\tapplyAssetUploadResultToItem,\n\ttype VectorViewportAssetKind,\n\ttype VectorViewportAssetStore,\n\ttype VectorViewportAssetUploadResult,\n} from \"./asset-store\";\n\n/**\n * Extra context for each item created by {@link ingestAssetFilesToSceneItems}.\n *\n * Use this when you need to lock imported pages, assign custom ids, or attach\n * additional metadata beyond the `pluginData` returned by {@link VectorViewportAssetStore.upload}.\n */\nexport type IngestedAssetItemContext = {\n\tfile: File;\n\tkind: VectorViewportAssetKind;\n\titemIndex: number;\n\tpageNumber?: number;\n};\n\n/**\n * Structured error produced while ingesting a file into scene items.\n *\n * The helper keeps partial success by default: one file can fail without\n * preventing the remaining files from being converted.\n */\nexport type IngestAssetFileError = {\n\tfile: File;\n\tkind?: VectorViewportAssetKind;\n\terror: unknown;\n};\n\n/**\n * Options for {@link ingestAssetFilesToSceneItems}.\n *\n * This is the shared ingestion pipeline used by canvu's built-in file flow.\n * Use it when files originate outside the viewport, such as:\n *\n * - custom upload dialogs\n * - board/version creation flows\n * - programmatic imports\n * - legacy migrations\n *\n * Prefer passing `assetStore` directly to `VectorViewport` when the user is\n * already interacting with canvu's native file picker or drag-and-drop UI.\n *\n * @example\n * ```ts\n * const result = await ingestAssetFilesToSceneItems({\n * files: Array.from(input.files ?? []),\n * worldCenter: { x: 0, y: 0 },\n * assetStore,\n * decorateItem(item) {\n * return {\n * ...item,\n * locked: true,\n * };\n * },\n * });\n *\n * doc.onItemsChange([...doc.items, ...result.items]);\n * ```\n */\nexport type IngestAssetFilesToSceneItemsOptions = {\n\tfiles: readonly File[];\n\texistingItems?: readonly VectorSceneItem[];\n\tworldCenter: {\n\t\tx: number;\n\t\ty: number;\n\t};\n\t/**\n\t * Optional binary persistence bridge shared with `VectorViewport`.\n\t *\n\t * When provided, `upload(...)` is called once per source file before canvu\n\t * converts that file into one or more scene items.\n\t */\n\tassetStore?: VectorViewportAssetStore;\n\t/**\n\t * Optional local blob store used to keep canvu's default image/PDF runtime\n\t * behavior consistent across reload-safe persistence adapters.\n\t *\n\t * Omit this unless you need to share an existing store instance.\n\t */\n\timageStore?: IndexedDbImageStore;\n\t/**\n\t * Optional custom id factory for imported items.\n\t *\n\t * Defaults to `createShapeId()`.\n\t */\n\tcreateId?: () => string;\n\t/**\n\t * Vertical gap between stacked PDF pages.\n\t *\n\t * Defaults to `16`, matching the built-in viewport flow.\n\t */\n\tgapWorld?: number;\n\t/**\n\t * Offset step used when placing standalone raster images.\n\t *\n\t * Defaults to `48`, matching the built-in viewport flow.\n\t */\n\tstepWorld?: number;\n\t/**\n\t * PDF rasterization scale forwarded to `pdfjs-dist`.\n\t *\n\t * Defaults to `1.15` to balance first paint latency with zoom quality.\n\t */\n\tpdfScale?: number;\n\tpdfPageConcurrency?: number;\n\t/**\n\t * Called as soon as canvu finishes converting one or more items from the\n\t * source files.\n\t */\n\tonItemsReady?: (\n\t\titems: VectorSceneItem[],\n\t\tcontext: {\n\t\t\tfile: File;\n\t\t\tkind: VectorViewportAssetKind;\n\t\t},\n\t) => void;\n\t/**\n\t * Final hook to customize each created item after canvu attaches its own\n\t * image metadata and any `assetStore.upload(...)` `pluginData`.\n\t */\n\tdecorateItem?: (\n\t\titem: VectorSceneItem,\n\t\tcontext: IngestedAssetItemContext,\n\t) => VectorSceneItem;\n\t/**\n\t * Optional side-channel for per-file errors.\n\t *\n\t * This is useful for toasts or telemetry in addition to reading the returned\n\t * `errors` array.\n\t */\n\tonError?: (error: IngestAssetFileError) => void;\n};\n\n/**\n * Result of {@link ingestAssetFilesToSceneItems}.\n */\nexport type IngestAssetFilesToSceneItemsResult = {\n\titems: VectorSceneItem[];\n\terrors: IngestAssetFileError[];\n};\n\nfunction getAssetKindForFile(file: File): VectorViewportAssetKind | null {\n\tif (file.type === \"application/pdf\") return \"pdf\";\n\tif (file.type.startsWith(\"image/\")) return \"image\";\n\treturn null;\n}\n\nfunction finalizeIngestedItem(\n\titem: VectorSceneItem,\n\tcontext: IngestedAssetItemContext,\n\tuploadResult: VectorViewportAssetUploadResult | null,\n\tdecorateItem: IngestAssetFilesToSceneItemsOptions[\"decorateItem\"] | undefined,\n): VectorSceneItem {\n\tconst itemWithAssetData = applyAssetUploadResultToItem(item, uploadResult);\n\treturn decorateItem ? decorateItem(itemWithAssetData, context) : itemWithAssetData;\n}\n\nasync function uploadAssetIfNeeded(\n\tassetStore: VectorViewportAssetStore | undefined,\n\tfile: File,\n\tkind: VectorViewportAssetKind,\n): Promise<VectorViewportAssetUploadResult | null> {\n\tif (!assetStore) return null;\n\tconst result = await assetStore.upload({ file, kind });\n\treturn result ?? null;\n}\n\n/**\n * Converts browser files into `VectorSceneItem[]` using the same ingestion\n * pipeline as canvu's built-in file flow.\n *\n * Use this for external imports that should behave like the native canvas\n * upload experience without reimplementing PDF rasterization, image storage, or\n * `pluginData` attachment in app code.\n *\n * Do not use this as a persistence layer by itself. It only produces runtime\n * scene items. Persist the resulting snapshot with your existing\n * `useVectorCanvasDocument(...)` adapter or another app-specific document store.\n */\nexport async function ingestAssetFilesToSceneItems(\n\toptions: IngestAssetFilesToSceneItemsOptions,\n): Promise<IngestAssetFilesToSceneItemsResult> {\n\tconst {\n\t\tfiles,\n\t\texistingItems = [],\n\t\tworldCenter,\n\t\tassetStore,\n\t\timageStore = new IndexedDbImageStore(),\n\t\tcreateId = createShapeId,\n\t\tgapWorld = 16,\n\t\tpdfScale = 1.15,\n\t\tpdfPageConcurrency = 2,\n\t\tdecorateItem,\n\t\tonItemsReady,\n\t\tonError,\n\t} = options;\n\n\tconst items: VectorSceneItem[] = [];\n\tconst errors: IngestAssetFileError[] = [];\n\tlet occupiedBottomY: number | null =\n\t\texistingItems.length > 0\n\t\t\t? Math.max(...existingItems.map((item) => item.bounds.y + item.bounds.height))\n\t\t\t: null;\n\n\tfor (const file of files) {\n\t\tconst kind = getAssetKindForFile(file);\n\t\tif (!kind) {\n\t\t\tconst error = {\n\t\t\t\tfile,\n\t\t\t\terror: new Error(`Unsupported asset type: ${file.type || \"unknown\"}`),\n\t\t\t} satisfies IngestAssetFileError;\n\t\t\terrors.push(error);\n\t\t\tonError?.(error);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tif (kind === \"pdf\") {\n\t\t\t\tconst uploadResultPromise = uploadAssetIfNeeded(assetStore, file, kind);\n\t\t\t\tawait loadPdfToStore(file, imageStore, {\n\t\t\t\t\tscale: pdfScale,\n\t\t\t\t\tpageConcurrency: pdfPageConcurrency,\n\t\t\t\t\tstoreThumbnails: false,\n\t\t\t\t\tonPageStored: async (page) => {\n\t\t\t\t\t\tconst uploadResult = await uploadResultPromise;\n\t\t\t\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, page.blobId);\n\t\t\t\t\t\tconst naturalTopY = worldCenter.y - page.height / 2;\n\t\t\t\t\t\tconst stackedTopY: number =\n\t\t\t\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\t\t\t\tconst bounds: {\n\t\t\t\t\t\t\tx: number;\n\t\t\t\t\t\t\ty: number;\n\t\t\t\t\t\t\twidth: number;\n\t\t\t\t\t\t\theight: number;\n\t\t\t\t\t\t} = {\n\t\t\t\t\t\t\tx: worldCenter.x - page.width / 2,\n\t\t\t\t\t\t\ty: Math.max(naturalTopY, stackedTopY),\n\t\t\t\t\t\t\twidth: page.width,\n\t\t\t\t\t\t\theight: page.height,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst itemContext = {\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\titemIndex: items.length,\n\t\t\t\t\t\t\tpageNumber: page.pageNumber,\n\t\t\t\t\t\t} satisfies IngestedAssetItemContext;\n\t\t\t\t\t\tconst item = finalizeIngestedItem(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: createId(),\n\t\t\t\t\t\t\t\tx: bounds.x,\n\t\t\t\t\t\t\t\ty: bounds.y,\n\t\t\t\t\t\t\t\tbounds: { ...bounds },\n\t\t\t\t\t\t\t\ttoolKind: \"image\",\n\t\t\t\t\t\t\t\timageBlobId: page.blobId,\n\t\t\t\t\t\t\t\timageRasterHref: fullUrl ?? undefined,\n\t\t\t\t\t\t\t\timageIntrinsicSize: {\n\t\t\t\t\t\t\t\t\twidth: page.width,\n\t\t\t\t\t\t\t\t\theight: page.height,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tchildrenSvg: fullUrl\n\t\t\t\t\t\t\t\t\t? buildRasterImageChildrenSvg(\n\t\t\t\t\t\t\t\t\t\t\tfullUrl,\n\t\t\t\t\t\t\t\t\t\t\t{ width: page.width, height: page.height },\n\t\t\t\t\t\t\t\t\t\t\tbounds,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t} as VectorSceneItem,\n\t\t\t\t\t\t\titemContext,\n\t\t\t\t\t\t\tuploadResult,\n\t\t\t\t\t\t\tdecorateItem,\n\t\t\t\t\t\t);\n\t\t\t\t\t\titems.push(item);\n\t\t\t\t\t\toccupiedBottomY = bounds.y + page.height;\n\t\t\t\t\t\tonItemsReady?.([item], { file, kind });\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [uploadResult, storedImage] = await Promise.all([\n\t\t\t\tuploadAssetIfNeeded(assetStore, file, kind),\n\t\t\t\tloadImageToStore(file, imageStore),\n\t\t\t]);\n\t\t\tconst { blobId, thumbnailBlobId, width, height } = storedImage;\n\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, blobId);\n\t\t\tconst thumbBlob = await imageStore.getThumbnail(thumbnailBlobId);\n\t\t\tconst thumbnailHref = thumbBlob ? URL.createObjectURL(thumbBlob) : null;\n\t\t\tconst naturalTopY = worldCenter.y - height / 2;\n\t\t\tconst stackedTopY =\n\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\tconst bounds = {\n\t\t\t\tx: worldCenter.x - width / 2,\n\t\t\t\ty: Math.max(naturalTopY, stackedTopY),\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t};\n\t\t\tconst href = thumbnailHref ?? fullUrl ?? \"\";\n\t\t\tconst itemContext = {\n\t\t\t\tfile,\n\t\t\t\tkind,\n\t\t\t\titemIndex: items.length,\n\t\t\t} satisfies IngestedAssetItemContext;\n\t\t\tconst item = finalizeIngestedItem(\n\t\t\t\t{\n\t\t\t\t\tid: createId(),\n\t\t\t\t\tx: bounds.x,\n\t\t\t\t\ty: bounds.y,\n\t\t\t\t\tbounds: { ...bounds },\n\t\t\t\t\ttoolKind: \"image\",\n\t\t\t\t\timageBlobId: blobId,\n\t\t\t\t\timageThumbnailBlobId: thumbnailBlobId,\n\t\t\t\t\timageRasterHref: fullUrl ?? undefined,\n\t\t\t\t\timageThumbnailHref: thumbnailHref ?? undefined,\n\t\t\t\t\timageIntrinsicSize: { width, height },\n\t\t\t\t\tchildrenSvg: buildRasterImageChildrenSvg(href, { width, height }, bounds),\n\t\t\t\t} as VectorSceneItem,\n\t\t\t\titemContext,\n\t\t\t\tuploadResult,\n\t\t\t\tdecorateItem,\n\t\t\t);\n\t\t\titems.push(item);\n\t\t\tonItemsReady?.([item], { file, kind });\n\t\t\toccupiedBottomY =\n\t\t\t\toccupiedBottomY == null\n\t\t\t\t\t? bounds.y + height\n\t\t\t\t\t: Math.max(occupiedBottomY, bounds.y + height);\n\t\t} catch (error) {\n\t\t\tconst fileError = {\n\t\t\t\tfile,\n\t\t\t\tkind,\n\t\t\t\terror,\n\t\t\t} satisfies IngestAssetFileError;\n\t\t\terrors.push(fileError);\n\t\t\tonError?.(fileError);\n\t\t}\n\t}\n\n\treturn {\n\t\titems,\n\t\terrors,\n\t};\n}\n","\"use client\";\n\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Kind of binary selected through the built-in canvu asset ingestion flow.\n *\n * Use this to branch your backend upload logic when images and PDFs should be\n * stored differently.\n */\nexport type VectorViewportAssetKind = \"image\" | \"pdf\";\n\n/**\n * Original browser `File` intercepted from the built-in asset flow.\n *\n * This is the high-level hook for apps that want canvu to keep its native file\n * UX while still uploading the raw binary to their backend or object storage.\n *\n * The same request shape is also reused by\n * {@link ingestAssetFilesToSceneItems}, so custom import flows and the native\n * viewport UX can share one backend contract.\n */\nexport type VectorViewportAssetUploadRequest = {\n\t/** Original browser file before canvu converts it into scene items. */\n\tfile: File;\n\t/** High-level bucket for routing image vs PDF upload behavior. */\n\tkind: VectorViewportAssetKind;\n};\n\n/**\n * Persisted metadata returned by a custom asset upload.\n *\n * The returned `pluginData` is shallow-merged into every `VectorSceneItem`\n * created from the uploaded file, making it available to custom persistence\n * adapters and later hydration flows.\n *\n * @example\n * ```ts\n * const assetStore: VectorViewportAssetStore = {\n * async upload({ file, kind }) {\n * const form = new FormData();\n * form.append(\"file\", file);\n * form.append(\"kind\", kind);\n *\n * const response = await fetch(\"/api/canvu/assets\", {\n * method: \"POST\",\n * body: form,\n * });\n *\n * const asset = await response.json();\n * return {\n * pluginData: {\n * assetId: asset.id,\n * assetKey: asset.key,\n * mimeType: file.type,\n * },\n * };\n * },\n * async resolve({ assetIds }) {\n * const response = await fetch(\"/api/canvu/assets/resolve\", {\n * method: \"POST\",\n * headers: { \"content-type\": \"application/json\" },\n * body: JSON.stringify({ assetIds }),\n * });\n *\n * return response.json();\n * },\n * };\n * ```\n */\nexport type VectorViewportAssetUploadResult = {\n\t/**\n\t * Opaque persisted metadata attached to created items.\n\t *\n\t * Use this for asset ids, bucket keys, original file names, or any backend\n\t * reference needed to rehydrate the binary later from your own persistence\n\t * adapter.\n\t */\n\tpluginData?: VectorSceneItem[\"pluginData\"];\n};\n\n/**\n * Request to resolve persisted asset ids back into runtime URLs.\n *\n * This is useful inside custom persistence adapters when you want to rehydrate\n * signed URLs or CDN URLs after loading a snapshot.\n */\nexport type VectorViewportAssetResolveRequest = {\n\tassetIds: string[];\n};\n\n/**\n * Runtime URL payload returned by a custom asset resolver.\n */\nexport type VectorViewportAssetResolveResult = Record<\n\tstring,\n\t{\n\t\turl: string;\n\t\tthumbnailUrl?: string;\n\t}\n>;\n\nexport type VectorViewportAssetHydrationRequest = {\n\tassetId: string;\n\tkind: VectorViewportAssetKind;\n\tpageNumber?: number;\n\tscale?: number;\n};\n\n/**\n * High-level hook for apps that want to persist raw binaries out-of-band while\n * keeping canvu's built-in file UX.\n *\n * `upload` is used by the built-in file picker / drag-and-drop flow and by\n * {@link ingestAssetFilesToSceneItems}. `resolve` is optional for custom\n * persistence adapters and future hydration flows.\n */\nexport type VectorViewportAssetStore = {\n\tupload: (\n\t\trequest: VectorViewportAssetUploadRequest,\n\t) => Promise<VectorViewportAssetUploadResult | undefined>;\n\tresolve?: (\n\t\trequest: VectorViewportAssetResolveRequest,\n\t) => Promise<VectorViewportAssetResolveResult>;\n\tgetHydrationRequest?: (\n\t\titem: VectorSceneItem,\n\t) => VectorViewportAssetHydrationRequest | null;\n};\n\nexport function applyAssetUploadResultToItem(\n\titem: VectorSceneItem,\n\tresult: VectorViewportAssetUploadResult | null | undefined,\n): VectorSceneItem {\n\tif (!result?.pluginData) return item;\n\treturn {\n\t\t...item,\n\t\tpluginData: {\n\t\t\t...(item.pluginData ?? {}),\n\t\t\t...result.pluginData,\n\t\t},\n\t};\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { Camera2D } from \"../camera/camera\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type CanvuChromeActiveToolStyle = StrokeStyle & {\n\ttoolKind:\n\t\t| \"draw\"\n\t\t| \"marker\"\n\t\t| \"text\"\n\t\t| \"rect\"\n\t\t| \"ellipse\"\n\t\t| \"architectural-cloud\"\n\t\t| \"line\"\n\t\t| \"arrow\";\n\tlabel?: string;\n\t/** Local font size when `toolKind === \"text\"`. */\n\ttextFontSize?: number;\n};\n\nexport type CanvuChromeSelectionStyleChange = (patch: {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: \"solid\" | \"dashed\";\n\ttextFontSize?: number;\n}) => void;\n\n/**\n * Runtime data and handlers shared with floating board chrome (e.g. {@link NavMenu},\n * {@link VectorSelectionInspector}). Populated by `VectorViewport` and consumed via\n * {@link useCanvuChromeContext}.\n */\nexport type CanvuChromeContextValue = {\n\tcamera: Camera2D | null;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\titems: readonly VectorSceneItem[];\n\tselectedItems: readonly VectorSceneItem[];\n\tinteractive: boolean;\n\tcanEditSelection: boolean;\n\tactiveToolStyle: CanvuChromeActiveToolStyle | null;\n\tonSelectionStyleChange: CanvuChromeSelectionStyleChange | null;\n\tzoomPercent: number;\n\tonZoomIn: () => void;\n\tonZoomOut: () => void;\n\tonUndo: () => void;\n\tonRedo: () => void;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tonRequestRender: () => void;\n};\n\nexport const CanvuChromeContext = createContext<CanvuChromeContextValue | null>(\n\tnull,\n);\n\n/** Returns the current chrome context or `null` when used outside `VectorViewport`. */\nexport function useCanvuChromeContext(): CanvuChromeContextValue | null {\n\treturn useContext(CanvuChromeContext);\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 {\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","\"use client\";\n\nimport {\n\tDndContext,\n\ttype DragEndEvent,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors,\n} from \"@dnd-kit/core\";\nimport {\n\tarrayMove,\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n\tChevronRight,\n\tCopy,\n\tGripVertical,\n\tImages,\n\tRotateCw,\n\tTrash2,\n} from \"lucide-react\";\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\nimport {\n\tcopyManagedImage,\n\tdeleteManagedImage,\n\tisManagedImage,\n\treorderManagedImages,\n\trotateManagedImage,\n} from \"../scene/managed-images\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nconst OPEN_KEYFRAME_ID = \"canvu-images-menu-open-keyframe\";\nconst OPEN_KEYFRAME_CSS = `\n@keyframes canvu-images-menu-open {\n\tfrom { opacity: 0; transform: scale(0.6); }\n\tto { opacity: 1; transform: scale(1); }\n}\n`;\n\nfunction ensureOpenKeyframe() {\n\tif (typeof document === \"undefined\") return;\n\tif (document.getElementById(OPEN_KEYFRAME_ID)) return;\n\tconst style = document.createElement(\"style\");\n\tstyle.id = OPEN_KEYFRAME_ID;\n\tstyle.textContent = OPEN_KEYFRAME_CSS;\n\tdocument.head.appendChild(style);\n}\n\nconst panelStyle: CSSProperties = {\n\twidth: \"fit-content\",\n\tmaxHeight: \"min(85dvh, 820px)\",\n\toverflow: \"auto\",\n\tbackgroundColor: \"#ffffff\",\n\tborder: \"1px solid #e2e8f0\",\n\tborderRadius: 10,\n\tboxShadow: \"0 10px 40px rgba(15, 23, 42, 0.12)\",\n\tfontFamily: \"system-ui, sans-serif\",\n\tfontSize: 14,\n\tcolor: \"#0f172a\",\n\ttransformOrigin: \"top right\",\n\tanimation: \"canvu-images-menu-open 180ms cubic-bezier(0.2, 0.8, 0.2, 1)\",\n};\n\nconst headerStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"space-between\",\n\tgap: 8,\n\tpadding: \"8px 8px 8px 14px\",\n\tborderBottom: \"1px solid #e2e8f0\",\n\tfontWeight: 600,\n\tletterSpacing: \"0.02em\",\n};\n\nconst headerTitleStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tgap: 8,\n};\n\nconst countStyle: CSSProperties = {\n\tcolor: \"#64748b\",\n\tfontWeight: 500,\n};\n\nconst listStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tpadding: 8,\n\tgap: 6,\n};\n\nconst rowStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 12,\n\tpadding: \"10px 12px\",\n\tborderRadius: 10,\n};\n\nconst handleStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 28,\n\theight: 128,\n\tborder: \"none\",\n\tbackground: \"transparent\",\n\tcolor: \"#94a3b8\",\n\tcursor: \"grab\",\n\ttouchAction: \"none\",\n\tpadding: 0,\n};\n\nconst thumbBoxStyle: CSSProperties = {\n\twidth: 128,\n\theight: 128,\n\tflex: \"0 0 auto\",\n\toverflow: \"hidden\",\n\tborderRadius: 8,\n\tbackgroundColor: \"#e2e8f0\",\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n};\n\nconst thumbImgStyle: CSSProperties = {\n\twidth: \"100%\",\n\theight: \"100%\",\n\tobjectFit: \"cover\",\n\tdisplay: \"block\",\n};\n\nconst actionsColumnStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tgap: 4,\n};\n\nconst actionButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 32,\n\theight: 32,\n\tborder: \"none\",\n\tborderRadius: 6,\n\tbackground: \"transparent\",\n\tcolor: \"#0f172a\",\n\tcursor: \"pointer\",\n\tpadding: 0,\n};\n\nconst tooltipWrapperStyle: CSSProperties = {\n\tposition: \"relative\",\n\tdisplay: \"inline-flex\",\n};\n\nconst tooltipBubbleStyle: CSSProperties = {\n\tposition: \"absolute\",\n\tright: \"calc(100% + 8px)\",\n\ttop: \"50%\",\n\ttransform: \"translateY(-50%)\",\n\tpadding: \"4px 8px\",\n\tbackgroundColor: \"#0f172a\",\n\tcolor: \"#ffffff\",\n\tfontSize: 11,\n\tfontWeight: 500,\n\tborderRadius: 4,\n\twhiteSpace: \"nowrap\",\n\tpointerEvents: \"none\",\n\tzIndex: 100,\n\tboxShadow: \"0 2px 8px rgba(15, 23, 42, 0.25)\",\n};\n\nconst dangerColor = \"#b91c1c\";\n\nconst collapseButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 32,\n\theight: 32,\n\tborder: \"none\",\n\tborderRadius: 8,\n\tbackground: \"transparent\",\n\tcolor: \"#0f172a\",\n\tcursor: \"pointer\",\n\tpadding: 0,\n};\n\nconst collapsedButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 44,\n\theight: 44,\n\tpadding: 0,\n\tborder: \"1px solid #e2e8f0\",\n\tborderRadius: 10,\n\tbackground: \"#ffffff\",\n\tcolor: \"#0f172a\",\n\tcursor: \"pointer\",\n\tboxShadow: \"0 8px 24px rgba(15, 23, 42, 0.12)\",\n};\n\nexport type ImagesMenuLabels = {\n\ttitle?: string;\n\tdragHandle?: string;\n\tfocus?: string;\n\tcopy?: string;\n\trotate?: string;\n\tdelete?: string;\n\tcollapse?: string;\n\texpand?: string;\n};\n\nconst defaultLabels: Required<ImagesMenuLabels> = {\n\ttitle: \"Images\",\n\tdragHandle: \"Drag to reorder\",\n\tfocus: \"Focus on canvas\",\n\tcopy: \"Copy\",\n\trotate: \"Rotate\",\n\tdelete: \"Delete\",\n\tcollapse: \"Collapse images menu\",\n\texpand: \"Open images menu\",\n};\n\nexport type ImagesMenuProps = {\n\titems: readonly VectorSceneItem[];\n\tonItemsChange: (items: VectorSceneItem[]) => void;\n\t/**\n\t * Fires when the user clicks an image's thumbnail/label area. Use this to\n\t * pan/zoom the canvas to the item (e.g. `viewportRef.current?.fitWorldRect(item.bounds)`).\n\t */\n\tonFocusItem?: (item: VectorSceneItem) => void;\n\tlabels?: ImagesMenuLabels;\n};\n\n/**\n * Floating side panel that lists images marked as \"managed\"\n * (via `pluginData.managed === true`) and offers copy, rotate, delete, and\n * drag-to-reorder actions. Managed images are also `locked`, so they do not\n * respond to direct canvas interaction.\n */\nexport function ImagesMenu({\n\titems,\n\tonItemsChange,\n\tonFocusItem,\n\tlabels,\n}: ImagesMenuProps) {\n\tconst managed = useMemo(() => items.filter(isManagedImage), [items]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: { distance: 4 },\n\t\t}),\n\t);\n\tconst [collapsed, setCollapsed] = useState(false);\n\n\tuseEffect(() => {\n\t\tensureOpenKeyframe();\n\t}, []);\n\n\tif (managed.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst resolvedLabels = { ...defaultLabels, ...labels };\n\n\tif (collapsed) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdata-slot=\"images-menu-collapsed\"\n\t\t\t\tstyle={collapsedButtonStyle}\n\t\t\t\taria-label={resolvedLabels.expand}\n\t\t\t\ttitle={resolvedLabels.expand}\n\t\t\t\tonClick={() => setCollapsed(false)}\n\t\t\t>\n\t\t\t\t<Images size={20} />\n\t\t\t</button>\n\t\t);\n\t}\n\n\tconst onDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event;\n\t\tif (!over || active.id === over.id) return;\n\t\tconst oldIndex = managed.findIndex((i) => i.id === active.id);\n\t\tconst newIndex = managed.findIndex((i) => i.id === over.id);\n\t\tif (oldIndex < 0 || newIndex < 0) return;\n\t\tconst reorderedManaged = arrayMove(managed, oldIndex, newIndex);\n\t\tconst orderedIds = reorderedManaged.map((i) => i.id);\n\t\tonItemsChange(reorderManagedImages(items, orderedIds));\n\t};\n\n\treturn (\n\t\t<section\n\t\t\tdata-slot=\"images-menu\"\n\t\t\tstyle={panelStyle}\n\t\t\taria-label={resolvedLabels.title}\n\t\t>\n\t\t\t<div style={headerStyle}>\n\t\t\t\t<span style={headerTitleStyle}>\n\t\t\t\t\t<span>{resolvedLabels.title}</span>\n\t\t\t\t\t<span style={countStyle}>{managed.length}</span>\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={collapseButtonStyle}\n\t\t\t\t\taria-label={resolvedLabels.collapse}\n\t\t\t\t\ttitle={resolvedLabels.collapse}\n\t\t\t\t\tonClick={() => setCollapsed(true)}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight size={20} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<DndContext sensors={sensors} onDragEnd={onDragEnd}>\n\t\t\t\t<SortableContext\n\t\t\t\t\titems={managed.map((i) => i.id)}\n\t\t\t\t\tstrategy={verticalListSortingStrategy}\n\t\t\t\t>\n\t\t\t\t\t<div style={listStyle}>\n\t\t\t\t\t\t{managed.map((item) => (\n\t\t\t\t\t\t\t<ImagesMenuRow\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\tlabels={resolvedLabels}\n\t\t\t\t\t\t\t\tonFocus={onFocusItem ? () => onFocusItem(item) : undefined}\n\t\t\t\t\t\t\t\tonCopy={() => onItemsChange(copyManagedImage(items, item.id))}\n\t\t\t\t\t\t\t\tonRotate={() => onItemsChange(rotateManagedImage(items, item.id))}\n\t\t\t\t\t\t\t\tonDelete={() => onItemsChange(deleteManagedImage(items, item.id))}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\t\t\t</DndContext>\n\t\t</section>\n\t);\n}\n\ntype ImagesMenuRowProps = {\n\titem: VectorSceneItem;\n\tlabels: Required<ImagesMenuLabels>;\n\tonFocus?: () => void;\n\tonCopy: () => void;\n\tonRotate: () => void;\n\tonDelete: () => void;\n};\n\nfunction ImagesMenuRow({\n\titem,\n\tlabels,\n\tonFocus,\n\tonCopy,\n\tonRotate,\n\tonDelete,\n}: ImagesMenuRowProps) {\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({ id: item.id });\n\n\tconst feedbackTransition = \"background-color 140ms ease, opacity 140ms ease\";\n\tconst wrapperStyle: CSSProperties = {\n\t\t...rowStyle,\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition: transition\n\t\t\t? `${transition}, ${feedbackTransition}`\n\t\t\t: feedbackTransition,\n\t\tbackground: isDragging ? \"#eef2f7\" : \"transparent\",\n\t\topacity: isDragging ? 0.85 : 1,\n\t};\n\n\tconst src = item.imageThumbnailHref ?? item.imageRasterHref ?? \"\";\n\n\treturn (\n\t\t<div ref={setNodeRef} style={wrapperStyle}>\n\t\t\t<button\n\t\t\t\tref={setActivatorNodeRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={handleStyle}\n\t\t\t\taria-label={labels.dragHandle}\n\t\t\t\ttitle={labels.dragHandle}\n\t\t\t\t{...attributes}\n\t\t\t\t{...listeners}\n\t\t\t>\n\t\t\t\t<GripVertical size={18} />\n\t\t\t</button>\n\t\t\t<FocusTarget label={labels.focus} onFocus={onFocus}>\n\t\t\t\t<div style={thumbBoxStyle}>\n\t\t\t\t\t{src ? (\n\t\t\t\t\t\t<img src={src} alt=\"\" style={thumbImgStyle} draggable={false} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</FocusTarget>\n\t\t\t<div style={actionsColumnStyle}>\n\t\t\t\t<ImagesMenuAction label={labels.copy} onClick={onCopy}>\n\t\t\t\t\t<Copy size={18} />\n\t\t\t\t</ImagesMenuAction>\n\t\t\t\t<ImagesMenuAction label={labels.rotate} onClick={onRotate}>\n\t\t\t\t\t<RotateCw size={18} />\n\t\t\t\t</ImagesMenuAction>\n\t\t\t\t<ImagesMenuAction label={labels.delete} onClick={onDelete} danger>\n\t\t\t\t\t<Trash2 size={18} />\n\t\t\t\t</ImagesMenuAction>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nconst focusTargetBaseStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tflex: \"0 0 auto\",\n\tpadding: 0,\n\tborder: \"none\",\n\tbackground: \"transparent\",\n\ttextAlign: \"left\",\n\tcolor: \"inherit\",\n\tfont: \"inherit\",\n};\n\ntype FocusTargetProps = {\n\tlabel: string;\n\tonFocus?: () => void;\n\tchildren: ReactNode;\n};\n\nfunction FocusTarget({ label, onFocus, children }: FocusTargetProps) {\n\tif (!onFocus) {\n\t\treturn (\n\t\t\t<div style={{ ...focusTargetBaseStyle, cursor: \"default\" }}>{children}</div>\n\t\t);\n\t}\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tstyle={{ ...focusTargetBaseStyle, cursor: \"pointer\" }}\n\t\t\taria-label={label}\n\t\t\ttitle={label}\n\t\t\tonClick={onFocus}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\ntype ImagesMenuActionProps = {\n\tlabel: string;\n\tonClick: () => void;\n\tdanger?: boolean;\n\tchildren: ReactNode;\n};\n\nfunction ImagesMenuAction({\n\tlabel,\n\tonClick,\n\tdanger,\n\tchildren,\n}: ImagesMenuActionProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst style: CSSProperties = {\n\t\t...actionButtonStyle,\n\t\tcolor: danger ? dangerColor : actionButtonStyle.color,\n\t};\n\treturn (\n\t\t<span style={tooltipWrapperStyle}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={style}\n\t\t\t\taria-label={label}\n\t\t\t\tonClick={onClick}\n\t\t\t\tonMouseEnter={() => setOpen(true)}\n\t\t\t\tonMouseLeave={() => setOpen(false)}\n\t\t\t\tonFocus={() => setOpen(true)}\n\t\t\t\tonBlur={() => setOpen(false)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</button>\n\t\t\t{open ? (\n\t\t\t\t<span role=\"tooltip\" style={tooltipBubbleStyle}>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Anchor presets for floating board components.\n *\n * Names are `<edge>-<position-along-edge>`:\n * - `top-*` / `bottom-*` anchor to the top or bottom edge.\n * - `left-*` / `right-*` anchor to the left or right edge.\n *\n * Corner aliases are equivalent (e.g. `top-left` and `left-top` resolve to the same anchor),\n * but kept distinct so callers can pick whichever reads best in their layout (a vertical\n * strip might prefer `left-top`; a horizontal strip prefers `top-left`).\n */\nexport type BoardComponentPosition =\n\t| \"top-left\"\n\t| \"top-center\"\n\t| \"top-right\"\n\t| \"bottom-left\"\n\t| \"bottom-center\"\n\t| \"bottom-right\"\n\t| \"left-top\"\n\t| \"left-center\"\n\t| \"left-bottom\"\n\t| \"right-top\"\n\t| \"right-center\"\n\t| \"right-bottom\"\n\t| \"center\"\n\t| \"fill\";\n\n/** @deprecated Use {@link BoardComponentPosition}. */\nexport type VectorCanvasSpacePosition = BoardComponentPosition;\n\n/**\n * Compute absolute-position CSS for a board component anchor preset.\n * Returns `position`, `zIndex`, and the relevant edge offsets / transforms.\n * Callers merge the result with their own style/className overrides.\n */\nexport function getBoardPositionStyle(\n\tposition: BoardComponentPosition,\n\tinset = 12,\n\tzIndex = 40,\n): CSSProperties {\n\tconst base: CSSProperties = { position: \"absolute\", zIndex };\n\tswitch (position) {\n\t\tcase \"fill\":\n\t\t\treturn { ...base, inset };\n\t\tcase \"top-left\":\n\t\tcase \"left-top\":\n\t\t\treturn { ...base, top: inset, left: inset };\n\t\tcase \"top-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttop: inset,\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t};\n\t\tcase \"top-right\":\n\t\tcase \"right-top\":\n\t\t\treturn { ...base, top: inset, right: inset };\n\t\tcase \"bottom-left\":\n\t\tcase \"left-bottom\":\n\t\t\treturn { ...base, bottom: inset, left: inset };\n\t\tcase \"bottom-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tbottom: inset,\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t};\n\t\tcase \"bottom-right\":\n\t\tcase \"right-bottom\":\n\t\t\treturn { ...base, bottom: inset, right: inset };\n\t\tcase \"left-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tleft: inset,\n\t\t\t\ttop: \"50%\",\n\t\t\t\ttransform: \"translateY(-50%)\",\n\t\t\t};\n\t\tcase \"right-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tright: inset,\n\t\t\t\ttop: \"50%\",\n\t\t\t\ttransform: \"translateY(-50%)\",\n\t\t\t};\n\t\tcase \"center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttop: \"50%\",\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: \"translate(-50%, -50%)\",\n\t\t\t};\n\t\tdefault:\n\t\t\treturn base;\n\t}\n}\n","\"use client\";\n\nimport { useCallback, useContext, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { Camera2D } from \"../../camera/camera\";\nimport { boundsAabbForRotatedItem } from \"../../math/item-transform\";\nimport type { Rect } from \"../../math/rect\";\nimport { normalizeRect } from \"../../math/rect\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport { useCanvuChromeContext } from \"../chrome-context\";\nimport {\n\tBG,\n\tBORDER_COLOR,\n\tBORDER_RADIUS,\n\tchevronBtnStyle,\n\tNavMenuMinimapSlotContext,\n\tnoop,\n\tpreventMouseDefault,\n} from \"./shared\";\n\nconst MINIMAP_W = 180;\nconst MINIMAP_H = 120;\nconst PADDING = 12;\nconst ITEM_FILL = \"rgba(0,0,0,0.08)\";\nconst ITEM_STROKE = \"rgba(0,0,0,0.15)\";\nconst VIEWPORT_FILL = \"rgba(59,130,246,0.08)\";\nconst VIEWPORT_STROKE = \"#3b82f6\";\n\nexport type NavMenuMinimapProps = {\n\tclassName?: string;\n\t/** @default false */\n\tdefaultExpanded?: boolean;\n\tcamera?: Camera2D;\n\tviewportWidth?: number;\n\tviewportHeight?: number;\n\titems?: readonly VectorSceneItem[];\n\tonRequestRender?: () => void;\n};\n\n/**\n * Chevron toggle plus the expandable minimap panel.\n *\n * The toggle button renders inline in the nav-menu strip; the SVG panel is portaled into a slot\n * NavMenu provides below the strip. With a bottom-anchored NavMenu, expanding pushes the strip\n * up to make room — matching the original `<NavMenu />` behaviour.\n */\nexport function NavMenuMinimap({\n\tclassName,\n\tdefaultExpanded = false,\n\tcamera: cameraProp,\n\tviewportWidth: viewportWidthProp,\n\tviewportHeight: viewportHeightProp,\n\titems: itemsProp,\n\tonRequestRender: onRequestRenderProp,\n}: NavMenuMinimapProps = {}) {\n\tconst ctx = useCanvuChromeContext();\n\tconst camera = cameraProp ?? ctx?.camera ?? null;\n\tconst viewportWidth = viewportWidthProp ?? ctx?.viewportWidth ?? 0;\n\tconst viewportHeight = viewportHeightProp ?? ctx?.viewportHeight ?? 0;\n\tconst items = itemsProp ?? ctx?.items ?? [];\n\tconst onRequestRender = onRequestRenderProp ?? ctx?.onRequestRender ?? noop;\n\tconst slotEl = useContext(NavMenuMinimapSlotContext);\n\n\tconst [expanded, setExpanded] = useState(defaultExpanded);\n\tconst svgRef = useRef<SVGSVGElement>(null);\n\tconst [dragging, setDragging] = useState(false);\n\tconst [mouseDown, setMouseDown] = useState(false);\n\n\tconst worldBounds = computeWorldBounds(items);\n\tconst isEmpty = worldBounds.width <= 0 || worldBounds.height <= 0;\n\n\tconst scale = Math.min(\n\t\t(MINIMAP_W - PADDING * 2) / Math.max(worldBounds.width, 1),\n\t\t(MINIMAP_H - PADDING * 2) / Math.max(worldBounds.height, 1),\n\t);\n\tconst originX = worldBounds.x;\n\tconst originY = worldBounds.y;\n\n\tconst toMinimapX = (wx: number) => (wx - originX) * scale + PADDING;\n\tconst toMinimapY = (wy: number) => (wy - originY) * scale + PADDING;\n\tconst toMinimapW = (ww: number) => ww * scale;\n\tconst toMinimapH = (wh: number) => wh * scale;\n\n\tconst viewportWorld = camera\n\t\t? camera.getVisibleWorldRect(viewportWidth, viewportHeight)\n\t\t: { x: 0, y: 0, width: 0, height: 0 };\n\tconst vpMinimap = {\n\t\tx: toMinimapX(viewportWorld.x),\n\t\ty: toMinimapY(viewportWorld.y),\n\t\twidth: toMinimapW(viewportWorld.width),\n\t\theight: toMinimapH(viewportWorld.height),\n\t};\n\n\tconst worldFromMinimap = useCallback(\n\t\t(mx: number, my: number) => ({\n\t\t\tworldX: (mx - PADDING) / scale + originX,\n\t\t\tworldY: (my - PADDING) / scale + originY,\n\t\t}),\n\t\t[scale, originX, originY],\n\t);\n\n\tconst panTo = useCallback(\n\t\t(mx: number, my: number) => {\n\t\t\tif (!camera) return;\n\t\t\tconst { worldX, worldY } = worldFromMinimap(mx, my);\n\t\t\tcamera.x = viewportWidth / 2 - worldX * camera.zoom;\n\t\t\tcamera.y = viewportHeight / 2 - worldY * camera.zoom;\n\t\t\tonRequestRender();\n\t\t},\n\t\t[worldFromMinimap, camera, viewportWidth, viewportHeight, onRequestRender],\n\t);\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (isEmpty) return;\n\t\t\tsetDragging(true);\n\t\t\tsetMouseDown(true);\n\t\t\tconst rect = svgRef.current?.getBoundingClientRect();\n\t\t\tif (!rect) return;\n\t\t\tpanTo(e.clientX - rect.left, e.clientY - rect.top);\n\t\t\tsvgRef.current?.setPointerCapture(e.pointerId);\n\t\t},\n\t\t[isEmpty, panTo],\n\t);\n\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (!mouseDown || isEmpty) return;\n\t\t\tconst rect = svgRef.current?.getBoundingClientRect();\n\t\t\tif (!rect) return;\n\t\t\tpanTo(e.clientX - rect.left, e.clientY - rect.top);\n\t\t},\n\t\t[mouseDown, isEmpty, panTo],\n\t);\n\n\tconst handlePointerUp = useCallback(() => {\n\t\tsetDragging(false);\n\t\tsetMouseDown(false);\n\t}, []);\n\n\tconst toggleExpanded = useCallback(() => {\n\t\tsetExpanded((v) => !v);\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={chevronBtnStyle}\n\t\t\t\taria-label={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\ttitle={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\taria-expanded={expanded}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={toggleExpanded}\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\twidth=\"12\"\n\t\t\t\t\theight=\"12\"\n\t\t\t\t\tviewBox=\"0 0 12 12\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\ttransform: expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n\t\t\t\t\t\ttransition: \"transform 0.15s ease\",\n\t\t\t\t\t}}\n\t\t\t\t\taria-hidden\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M2 4 L6 8 L10 4\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{expanded && slotEl\n\t\t\t\t? createPortal(\n\t\t\t\t\t\t<nav aria-label=\"Minimap\" style={{ pointerEvents: \"auto\" }}>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\tref={svgRef}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: MINIMAP_W,\n\t\t\t\t\t\t\t\t\theight: MINIMAP_H,\n\t\t\t\t\t\t\t\t\tborderRadius: BORDER_RADIUS,\n\t\t\t\t\t\t\t\t\tborder: `1px solid ${BORDER_COLOR}`,\n\t\t\t\t\t\t\t\t\tbackground: BG,\n\t\t\t\t\t\t\t\t\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\t\t\t\t\t\t\t\t\tcursor: isEmpty ? \"default\" : dragging ? \"grabbing\" : \"grab\",\n\t\t\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\t\t\t\tonPointerMove={handlePointerMove}\n\t\t\t\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\t\t\t\tonPointerCancel={handlePointerUp}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isEmpty ? null : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{items.map((it) => {\n\t\t\t\t\t\t\t\t\t\t\tconst b = normalizeRect(boundsAabbForRotatedItem(it));\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={it.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tx={toMinimapX(b.x)}\n\t\t\t\t\t\t\t\t\t\t\t\t\ty={toMinimapY(b.y)}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={toMinimapW(b.width)}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={toMinimapH(b.height)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill={ITEM_FILL}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke={ITEM_STROKE}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={0.5}\n\t\t\t\t\t\t\t\t\t\t\t\t\trx={1}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\tx={vpMinimap.x}\n\t\t\t\t\t\t\t\t\t\t\ty={vpMinimap.y}\n\t\t\t\t\t\t\t\t\t\t\twidth={vpMinimap.width}\n\t\t\t\t\t\t\t\t\t\t\theight={vpMinimap.height}\n\t\t\t\t\t\t\t\t\t\t\tfill={VIEWPORT_FILL}\n\t\t\t\t\t\t\t\t\t\t\tstroke={VIEWPORT_STROKE}\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\t\t\trx={2}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</nav>,\n\t\t\t\t\t\tslotEl,\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</>\n\t);\n}\n\nfunction computeWorldBounds(items: readonly VectorSceneItem[]): Rect {\n\tif (items.length === 0) {\n\t\treturn { x: 0, y: 0, width: 0, height: 0 };\n\t}\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const it of items) {\n\t\tconst b = boundsAabbForRotatedItem(it);\n\t\tminX = Math.min(minX, b.x);\n\t\tminY = Math.min(minY, b.y);\n\t\tmaxX = Math.max(maxX, b.x + b.width);\n\t\tmaxY = Math.max(maxY, b.y + b.height);\n\t}\n\tconst pad = Math.max((maxX - minX) * 0.1, (maxY - minY) * 0.1, 40);\n\treturn {\n\t\tx: minX - pad,\n\t\ty: minY - pad,\n\t\twidth: maxX - minX + pad * 2,\n\t\theight: maxY - minY + pad * 2,\n\t};\n}\n","import { type CSSProperties, createContext } from \"react\";\n\n/**\n * Internal: the main `NavMenu` shell places a sibling DOM node below the strip.\n * `NavMenuMinimap` portals its expanded SVG panel into that node so the strip\n * grows upward (when bottom-anchored) instead of getting clipped off the viewport.\n */\nexport const NavMenuMinimapSlotContext = createContext<HTMLDivElement | null>(null);\n\nexport function noop() {}\n\n/**\n * Block the default mousedown-induced focus shift so the surrounding viewport\n * keeps focus while the user clicks a control. No-op for touch / pen.\n */\nexport function preventMouseDefault(e: React.PointerEvent) {\n\tif (e.pointerType === \"mouse\") {\n\t\te.preventDefault();\n\t}\n}\n\n/** Shell colors shared by every panel rendered inside the nav menu. */\nexport const BG = \"#ffffff\";\nexport const BORDER_COLOR = \"rgba(0,0,0,0.12)\";\nexport const BORDER_RADIUS = 8;\n\n/** Square buttons inside the strip (zoom in/out). */\nexport const btnStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\twidth: 36,\n\theight: 36,\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tcursor: \"pointer\",\n\tfontSize: 18,\n\tlineHeight: 1,\n\tcolor: \"#18181b\",\n\tpadding: 0,\n\tborder: \"none\",\n\toutline: \"none\",\n\tbackground: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\n/** Narrow icon-only buttons (chevron toggle for the minimap). */\nexport const chevronBtnStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\twidth: 24,\n\theight: 36,\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tcursor: \"pointer\",\n\tfontSize: 12,\n\tlineHeight: 1,\n\tcolor: \"#52525b\",\n\tpadding: 0,\n\tborder: \"none\",\n\toutline: \"none\",\n\tbackground: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\n/** Slightly wider variant for undo/redo. */\nexport const undoBtnStyle: CSSProperties = {\n\t...chevronBtnStyle,\n\twidth: 30,\n\topacity: 1,\n\tcolor: \"#18181b\",\n};\n\n/** Zoom percentage label between the zoom-out and zoom-in buttons. */\nexport const labelStyle: CSSProperties = {\n\tfontSize: 10,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\ttextAlign: \"center\",\n\tuserSelect: \"none\",\n\tpadding: \"2px 0\",\n};\n\n/** Outer fieldset layout (column, so portaled minimap stacks below the strip). */\nexport const panelLayoutStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\talignItems: \"flex-start\",\n\tgap: 4,\n\ttouchAction: \"none\",\n\tpointerEvents: \"none\",\n\tuserSelect: \"none\",\n};\n\n/** Inner row containing zoom controls / undo / redo / chevron. */\nexport const innerStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\tdisplay: \"flex\",\n\tflexDirection: \"row\",\n\talignItems: \"center\",\n\tgap: 4,\n\tbackground: BG,\n\tborderRadius: BORDER_RADIUS,\n\tborder: `1px solid ${BORDER_COLOR}`,\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tpadding: 4,\n};\n\n/** Portal target div: `display: contents` so it adds no flex gap when empty. */\nexport const minimapSlotStyle: CSSProperties = {\n\tdisplay: \"contents\",\n};\n","\"use client\";\n\nimport { Redo2, Undo2 } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useCanvuChromeContext } from \"../chrome-context\";\nimport { noop, preventMouseDefault, undoBtnStyle } from \"./shared\";\n\nexport type NavMenuUndoRedoProps = {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tonUndo?: () => void;\n\tonRedo?: () => void;\n\tcanUndo?: boolean;\n\tcanRedo?: boolean;\n};\n\n/** Undo + Redo buttons, gated by `canUndo` / `canRedo`. */\nexport function NavMenuUndoRedo({\n\tclassName,\n\tstyle,\n\tonUndo: onUndoProp,\n\tonRedo: onRedoProp,\n\tcanUndo: canUndoProp,\n\tcanRedo: canRedoProp,\n}: NavMenuUndoRedoProps = {}) {\n\tconst ctx = useCanvuChromeContext();\n\tconst onUndo = onUndoProp ?? ctx?.onUndo ?? noop;\n\tconst onRedo = onRedoProp ?? ctx?.onRedo ?? noop;\n\tconst canUndo = canUndoProp ?? ctx?.canUndo ?? false;\n\tconst canRedo = canRedoProp ?? ctx?.canRedo ?? false;\n\n\treturn (\n\t\t<span\n\t\t\tclassName={className}\n\t\t\tstyle={{ display: \"inline-flex\", alignItems: \"center\", ...style }}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\taria-label=\"Undo\"\n\t\t\t\ttitle=\"Undo\"\n\t\t\t\tdisabled={!canUndo}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onUndo}\n\t\t\t>\n\t\t\t\t<Undo2 size={16} />\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\taria-label=\"Redo\"\n\t\t\t\ttitle=\"Redo\"\n\t\t\t\tdisabled={!canRedo}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onRedo}\n\t\t\t>\n\t\t\t\t<Redo2 size={16} />\n\t\t\t</button>\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport { useCanvuChromeContext } from \"../chrome-context\";\nimport { btnStyle, labelStyle, noop, preventMouseDefault } from \"./shared\";\n\nexport type NavMenuZoomControlsProps = {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tzoomPercent?: number;\n\tonZoomIn?: () => void;\n\tonZoomOut?: () => void;\n};\n\n/** Zoom-out button, percentage label, and zoom-in button. */\nexport function NavMenuZoomControls({\n\tclassName,\n\tstyle,\n\tzoomPercent: zoomPercentProp,\n\tonZoomIn: onZoomInProp,\n\tonZoomOut: onZoomOutProp,\n}: NavMenuZoomControlsProps = {}) {\n\tconst ctx = useCanvuChromeContext();\n\tconst zoomPercent = zoomPercentProp ?? ctx?.zoomPercent ?? 100;\n\tconst onZoomIn = onZoomInProp ?? ctx?.onZoomIn ?? noop;\n\tconst onZoomOut = onZoomOutProp ?? ctx?.onZoomOut ?? noop;\n\n\treturn (\n\t\t<span\n\t\t\tclassName={className}\n\t\t\tstyle={{ display: \"inline-flex\", alignItems: \"center\", ...style }}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={btnStyle}\n\t\t\t\taria-label=\"Zoom out\"\n\t\t\t\ttitle=\"Zoom out\"\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onZoomOut}\n\t\t\t>\n\t\t\t\t−\n\t\t\t</button>\n\t\t\t<span style={labelStyle} aria-hidden>\n\t\t\t\t{zoomPercent}%\n\t\t\t</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={btnStyle}\n\t\t\t\taria-label=\"Zoom in\"\n\t\t\t\ttitle=\"Zoom in\"\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onZoomIn}\n\t\t\t>\n\t\t\t\t+\n\t\t\t</button>\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport {\n\ttype CSSProperties,\n\ttype ReactElement,\n\ttype ReactNode,\n\tuseState,\n} from \"react\";\nimport type { Camera2D } from \"../../camera/camera\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"../board-position\";\nimport { NavMenuMinimap } from \"./minimap\";\nimport {\n\tinnerStyle,\n\tminimapSlotStyle,\n\tNavMenuMinimapSlotContext,\n\tpanelLayoutStyle,\n} from \"./shared\";\nimport { NavMenuUndoRedo } from \"./undo-redo\";\nimport { NavMenuZoomControls } from \"./zoom-controls\";\n\nexport { NavMenuMinimap, type NavMenuMinimapProps } from \"./minimap\";\nexport { NavMenuUndoRedo, type NavMenuUndoRedoProps } from \"./undo-redo\";\nexport {\n\tNavMenuZoomControls,\n\ttype NavMenuZoomControlsProps,\n} from \"./zoom-controls\";\n\n/**\n * Floating bottom-bar combining zoom controls, undo/redo, and an expandable minimap.\n *\n * Two rendering modes:\n * - **Default** (no `children`): renders all three feature groups using `props` ?? context values.\n * - **Composable** (JSX `children`): pick which features to render\n * (e.g. `<NavMenu.UndoRedo />`, `<NavMenu.Minimap />`). Each subcomponent reads its data from\n * {@link CanvuChromeContext} unless its own override props are supplied.\n */\nexport type NavMenuProps = {\n\tcamera?: Camera2D;\n\tviewportWidth?: number;\n\tviewportHeight?: number;\n\titems?: readonly VectorSceneItem[];\n\tzoomPercent?: number;\n\tonZoomIn?: () => void;\n\tonZoomOut?: () => void;\n\tonUndo?: () => void;\n\tonRedo?: () => void;\n\tcanUndo?: boolean;\n\tcanRedo?: boolean;\n\tonRequestRender?: () => void;\n\t/** Anchor preset. Defaults to bottom-left. */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from anchored edges. @default 12 */\n\tinset?: number;\n\t/** @default 23 */\n\tzIndex?: number;\n\tclassName?: string;\n\t/** Merged on top of position-derived styles for custom tweaks. */\n\tstyle?: CSSProperties;\n\t/**\n\t * Composable contents. When omitted, renders the default trio\n\t * (`NavMenu.ZoomControls`, `NavMenu.UndoRedo`, `NavMenu.Minimap`).\n\t */\n\tchildren?: ReactNode;\n};\n\n/**\n * @example\n * ```tsx\n * // Default — renders zoom, undo/redo, and minimap.\n * <NavMenu />\n *\n * // Composable — keep only the parts you want.\n * <NavMenu>\n * <NavMenu.UndoRedo />\n * <NavMenu.Minimap />\n * </NavMenu>\n * ```\n */\nfunction NavMenuComponent({\n\tcamera: cameraProp,\n\tviewportWidth: viewportWidthProp,\n\tviewportHeight: viewportHeightProp,\n\titems: itemsProp,\n\tzoomPercent: zoomPercentProp,\n\tonZoomIn: onZoomInProp,\n\tonZoomOut: onZoomOutProp,\n\tonUndo: onUndoProp,\n\tonRedo: onRedoProp,\n\tcanUndo: canUndoProp,\n\tcanRedo: canRedoProp,\n\tonRequestRender: onRequestRenderProp,\n\tposition = \"bottom-left\",\n\tinset = 12,\n\tzIndex = 23,\n\tclassName,\n\tstyle,\n\tchildren,\n}: NavMenuProps) {\n\tconst [slotEl, setSlotEl] = useState<HTMLDivElement | null>(null);\n\tconst anchorStyle = getBoardPositionStyle(position, inset, zIndex);\n\treturn (\n\t\t<fieldset\n\t\t\tdata-slot=\"canvu-nav-menu\"\n\t\t\tdata-position={position}\n\t\t\tclassName={className}\n\t\t\tstyle={{\n\t\t\t\t...anchorStyle,\n\t\t\t\t...panelLayoutStyle,\n\t\t\t\tborder: \"none\",\n\t\t\t\tmargin: 0,\n\t\t\t\tpadding: 0,\n\t\t\t\tminWidth: 0,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\taria-label=\"Zoom and minimap controls\"\n\t\t>\n\t\t\t<NavMenuMinimapSlotContext.Provider value={slotEl}>\n\t\t\t\t<div style={innerStyle}>\n\t\t\t\t\t{children ?? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<NavMenuZoomControls\n\t\t\t\t\t\t\t\tzoomPercent={zoomPercentProp}\n\t\t\t\t\t\t\t\tonZoomIn={onZoomInProp}\n\t\t\t\t\t\t\t\tonZoomOut={onZoomOutProp}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<NavMenuUndoRedo\n\t\t\t\t\t\t\t\tonUndo={onUndoProp}\n\t\t\t\t\t\t\t\tonRedo={onRedoProp}\n\t\t\t\t\t\t\t\tcanUndo={canUndoProp}\n\t\t\t\t\t\t\t\tcanRedo={canRedoProp}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<NavMenuMinimap\n\t\t\t\t\t\t\t\tcamera={cameraProp}\n\t\t\t\t\t\t\t\tviewportWidth={viewportWidthProp}\n\t\t\t\t\t\t\t\tviewportHeight={viewportHeightProp}\n\t\t\t\t\t\t\t\titems={itemsProp}\n\t\t\t\t\t\t\t\tonRequestRender={onRequestRenderProp}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div ref={setSlotEl} style={minimapSlotStyle} />\n\t\t\t</NavMenuMinimapSlotContext.Provider>\n\t\t</fieldset>\n\t);\n}\nNavMenuComponent.displayName = \"NavMenu\";\n\ntype NavMenuWithStatics = ((props: NavMenuProps) => ReactElement) & {\n\tZoomControls: typeof NavMenuZoomControls;\n\tUndoRedo: typeof NavMenuUndoRedo;\n\tMinimap: typeof NavMenuMinimap;\n};\n\n/**\n * `NavMenu` is a function component with attached subcomponents\n * (`NavMenu.ZoomControls`, `NavMenu.UndoRedo`, `NavMenu.Minimap`).\n *\n * The explicit type annotation is what makes the static properties survive\n * `.d.ts` bundling — relying on TypeScript's expando-function inference loses\n * them in tsup output.\n */\nexport const NavMenu: NavMenuWithStatics = Object.assign(NavMenuComponent, {\n\tZoomControls: NavMenuZoomControls,\n\tUndoRedo: NavMenuUndoRedo,\n\tMinimap: NavMenuMinimap,\n});\n","import {\n\tcreateBlobUrlFromStore,\n\tcreateThumbnailBlobUrlFromStore,\n\tIndexedDbImageStore,\n} from \"../../image/indexed-db-image-store\";\nimport { rebuildItemSvg } from \"../../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport type { VectorCanvasPersistenceAdapter, VectorCanvasSnapshot } from \"./types\";\n\nconst DOCUMENT_STORE = \"document\";\nconst DOCUMENT_KEY = \"main\";\n\nfunction openDocumentDb(dbName: string): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(dbName, 1);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(DOCUMENT_STORE)) {\n\t\t\t\tdb.createObjectStore(DOCUMENT_STORE);\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\n/**\n * Persistence adapter that stores the document JSON in IndexedDB and manages\n * image blobs separately. Images are stored at original resolution in a dedicated\n * `images` object store via {@link IndexedDbImageStore}, keeping the document JSON\n * lightweight and enabling full-resolution zoom without blur.\n *\n * On load, blob URLs are created from the stored blobs and `childrenSvg` is\n * rebuilt for each image item. Blob URLs are session-scoped and revoked on\n * subsequent saves / cleanup.\n */\nexport function createIndexedDbPersistenceAdapter(\n\toptions: { dbName?: string } = {},\n): VectorCanvasPersistenceAdapter {\n\tconst dbName = options.dbName ?? \"canvu-document\";\n\tconst imageStore = new IndexedDbImageStore();\n\tlet documentDbPromise: Promise<IDBDatabase> | null = null;\n\n\tfunction getDocDb(): Promise<IDBDatabase> {\n\t\tif (!documentDbPromise) {\n\t\t\tdocumentDbPromise = openDocumentDb(dbName);\n\t\t}\n\t\treturn documentDbPromise;\n\t}\n\n\tasync function getFromDocDb<T>(key: string): Promise<T | undefined> {\n\t\tconst db = await getDocDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DOCUMENT_STORE, \"readonly\");\n\t\t\tconst req = tx.objectStore(DOCUMENT_STORE).get(key);\n\t\t\treq.onsuccess = () => resolve(req.result as T | undefined);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync function putInDocDb(key: string, value: unknown): Promise<void> {\n\t\tconst db = await getDocDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DOCUMENT_STORE, \"readwrite\");\n\t\t\tconst req = tx.objectStore(DOCUMENT_STORE).put(value, key);\n\t\t\treq.onsuccess = () => resolve();\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\t/**\n\t * Blob URLs currently referenced by some item in the last saved snapshot.\n\t * Used to detect URLs that became orphaned between saves and revoke only\n\t * those — never revoke a URL that is still in use, otherwise images\n\t * subsequently remounted with that href fail to load.\n\t */\n\tconst liveHrefs = new Set<string>();\n\n\tfunction stripBlobsForPersist(item: VectorSceneItem): VectorSceneItem {\n\t\tconst out = { ...item };\n\t\tdelete out.imageRasterHref;\n\t\tdelete out.imageThumbnailHref;\n\t\t// Remove the stale childrenSvg since it contains the blob URL\n\t\tif (item.toolKind === \"image\") {\n\t\t\tout.childrenSvg = \"\";\n\t\t}\n\t\treturn out;\n\t}\n\n\tfunction collectLiveHrefs(items: readonly VectorSceneItem[]): Set<string> {\n\t\tconst set = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tif (item.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\t\tset.add(item.imageRasterHref);\n\t\t\t}\n\t\t\tif (item.imageThumbnailHref?.startsWith(\"blob:\")) {\n\t\t\t\tset.add(item.imageThumbnailHref);\n\t\t\t}\n\t\t}\n\t\treturn set;\n\t}\n\n\treturn {\n\t\tasync load(): Promise<VectorCanvasSnapshot | null> {\n\t\t\tconst raw = await getFromDocDb<{\n\t\t\t\titems: VectorSceneItem[];\n\t\t\t\tversion?: number;\n\t\t\t}>(DOCUMENT_KEY);\n\t\t\tif (!raw?.items) return null;\n\n\t\t\tconst resolved: VectorSceneItem[] = [];\n\t\t\tfor (const item of raw.items) {\n\t\t\t\tif (item.toolKind === \"image\" && item.imageBlobId) {\n\t\t\t\t\tconst itemWithBlob = { ...item } as VectorSceneItem & {\n\t\t\t\t\t\timageRasterHref?: string;\n\t\t\t\t\t\timageThumbnailHref?: string;\n\t\t\t\t\t};\n\t\t\t\t\t// Create thumbnail blob URL first for progressive loading\n\t\t\t\t\tif (item.imageThumbnailBlobId) {\n\t\t\t\t\t\tconst thumbUrl = await createThumbnailBlobUrlFromStore(\n\t\t\t\t\t\t\timageStore,\n\t\t\t\t\t\t\titem.imageThumbnailBlobId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (thumbUrl) {\n\t\t\t\t\t\t\titemWithBlob.imageThumbnailHref = thumbUrl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Create full-res blob URL\n\t\t\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, item.imageBlobId);\n\t\t\t\t\tif (fullUrl) {\n\t\t\t\t\t\titemWithBlob.imageRasterHref = fullUrl;\n\t\t\t\t\t}\n\t\t\t\t\t// Rebuild childrenSvg with the blob URL\n\t\t\t\t\tconst rebuilt = rebuildItemSvg(itemWithBlob as VectorSceneItem);\n\t\t\t\t\tresolved.push(rebuilt);\n\t\t\t\t} else {\n\t\t\t\t\tresolved.push(item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { items: resolved, version: raw.version ?? 1 };\n\t\t},\n\n\t\tasync save(snapshot: VectorCanvasSnapshot): Promise<void> {\n\t\t\t// Determine which URLs are still in use; only revoke ones that\n\t\t\t// dropped out of the snapshot since the last save. URLs still\n\t\t\t// referenced by some item must stay valid — clones, duplicates,\n\t\t\t// or any item kept in memory will read them via `<image href>`.\n\t\t\tconst nextLive = collectLiveHrefs(snapshot.items);\n\t\t\tfor (const href of liveHrefs) {\n\t\t\t\tif (!nextLive.has(href)) {\n\t\t\t\t\tURL.revokeObjectURL(href);\n\t\t\t\t}\n\t\t\t}\n\t\t\tliveHrefs.clear();\n\t\t\tfor (const href of nextLive) liveHrefs.add(href);\n\n\t\t\t// Strip blob URLs from items before persisting\n\t\t\tconst cleanItems = snapshot.items.map(stripBlobsForPersist);\n\t\t\tawait putInDocDb(DOCUMENT_KEY, {\n\t\t\t\titems: cleanItems,\n\t\t\t\tversion: snapshot.version ?? 1,\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function createNoopPersistenceAdapter(): VectorCanvasPersistenceAdapter {\n\treturn {\n\t\tload: () => Promise.resolve(null),\n\t\tsave: () => Promise.resolve(),\n\t};\n}\n","import type { VectorCanvasPersistenceAdapter, VectorCanvasSnapshot } from \"./types\";\n\nexport const DEFAULT_VECTOR_CANVAS_STORAGE_KEY = \"trazo.vector-canvas.v1\";\n\nconst SNAPSHOT_VERSION = 1;\n\nexport type CreateLocalStoragePersistenceAdapterOptions = {\n\t/** Defaults to {@link DEFAULT_VECTOR_CANVAS_STORAGE_KEY} */\n\tkey?: string;\n\t/** Defaults to `window.localStorage` when `typeof window !== \"undefined\"` */\n\tstorage?: Storage | null;\n};\n\n/**\n * Default persistence: `JSON.stringify` snapshot under a single localStorage key.\n * Pass the same `key` in every session to restore the board.\n */\nexport function createLocalStoragePersistenceAdapter(\n\toptions: CreateLocalStoragePersistenceAdapterOptions = {},\n): VectorCanvasPersistenceAdapter {\n\tconst key = options.key ?? DEFAULT_VECTOR_CANVAS_STORAGE_KEY;\n\tconst storage =\n\t\toptions.storage ??\n\t\t(typeof globalThis !== \"undefined\" &&\n\t\t\"localStorage\" in globalThis &&\n\t\tglobalThis.localStorage\n\t\t\t? globalThis.localStorage\n\t\t\t: null);\n\n\treturn {\n\t\tload(): Promise<VectorCanvasSnapshot | null> {\n\t\t\tif (!storage) return Promise.resolve(null);\n\t\t\ttry {\n\t\t\t\tconst raw = storage.getItem(key);\n\t\t\t\tif (!raw) return Promise.resolve(null);\n\t\t\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\t\t\tif (\n\t\t\t\t\t!parsed ||\n\t\t\t\t\ttypeof parsed !== \"object\" ||\n\t\t\t\t\t!(\"items\" in parsed) ||\n\t\t\t\t\t!Array.isArray((parsed as VectorCanvasSnapshot).items)\n\t\t\t\t) {\n\t\t\t\t\treturn Promise.resolve(null);\n\t\t\t\t}\n\t\t\t\treturn Promise.resolve(parsed as VectorCanvasSnapshot);\n\t\t\t} catch {\n\t\t\t\treturn Promise.resolve(null);\n\t\t\t}\n\t\t},\n\t\tsave(snapshot: VectorCanvasSnapshot): Promise<void> {\n\t\t\tif (!storage) return Promise.resolve();\n\t\t\ttry {\n\t\t\t\tstorage.setItem(\n\t\t\t\t\tkey,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t...snapshot,\n\t\t\t\t\t\tversion: snapshot.version ?? SNAPSHOT_VERSION,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\t/* quota / private mode */\n\t\t\t}\n\t\t\treturn Promise.resolve();\n\t\t},\n\t};\n}\n\nfunction createNoopPersistenceAdapter(): VectorCanvasPersistenceAdapter {\n\treturn {\n\t\tload: () => Promise.resolve(null),\n\t\tsave: () => Promise.resolve(),\n\t};\n}\n\nexport { createNoopPersistenceAdapter };\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport {\n\tcreateLocalStoragePersistenceAdapter,\n\tcreateNoopPersistenceAdapter,\n\tDEFAULT_VECTOR_CANVAS_STORAGE_KEY,\n} from \"./local-storage-adapter\";\nimport type {\n\tVectorCanvasPersistenceAdapter,\n\tVectorCanvasRemoteAdapter,\n} from \"./types\";\n\nexport type UseVectorCanvasDocumentOptions = {\n\t/**\n\t * Storage key for the built-in localStorage adapter (ignored if `persistence` is set).\n\t * @default {@link DEFAULT_VECTOR_CANVAS_STORAGE_KEY}\n\t */\n\tpersistenceKey?: string;\n\t/**\n\t * Custom persistence (Postgres via API, IndexedDB, …).\n\t * - `undefined` → default **localStorage** adapter with `persistenceKey`\n\t * - `false` → no persistence (memory only)\n\t */\n\tpersistence?: VectorCanvasPersistenceAdapter | false;\n\t/** Debounce before writing to storage after edits. @default 400 */\n\tdebounceMs?: number;\n\t/**\n\t * Optional: WebSocket / server sync — `subscribe` receives remote `items`;\n\t * `send` is called after local edits (after debounce) so you can push upstream.\n\t */\n\tremote?: VectorCanvasRemoteAdapter;\n};\n\nexport type UseVectorCanvasDocumentResult = {\n\titems: VectorSceneItem[];\n\t/** Pass to `VectorViewport` `onItemsChange` */\n\tonItemsChange: (next: VectorSceneItem[]) => void;\n\t/** Same as `onItemsChange`; included for flexibility */\n\tsetItems: (next: VectorSceneItem[]) => void;\n\t/** `false` until the first `load()` finished (avoid SSR flash / empty overwrite) */\n\tisHydrated: boolean;\n\t/** Clear persisted snapshot (and reset state to `[]`) */\n\tclearPersistedDocument: () => void;\n};\n\n/**\n * Default **localStorage** persistence + optional **remote** sync hook.\n *\n * @example\n * ```tsx\n * const doc = useVectorCanvasDocument();\n * return (\n * <VectorViewport\n * items={doc.items}\n * onItemsChange={doc.onItemsChange}\n * interactive\n * ariaLabel=\"Board\"\n * />\n * );\n * ```\n *\n * @example Custom API\n * ```ts\n * const persistence = useMemo(() => ({\n * load: () => fetch(\"/api/board\").then((r) => r.json()),\n * save: (snap) => fetch(\"/api/board\", { method: \"PUT\", body: JSON.stringify(snap) }),\n * }), []);\n * useVectorCanvasDocument({ persistence });\n * ```\n */\nexport function useVectorCanvasDocument(\n\toptions: UseVectorCanvasDocumentOptions = {},\n): UseVectorCanvasDocumentResult {\n\tconst {\n\t\tpersistenceKey = DEFAULT_VECTOR_CANVAS_STORAGE_KEY,\n\t\tpersistence,\n\t\tdebounceMs = 400,\n\t\tremote,\n\t} = options;\n\n\tconst adapter = useMemo((): VectorCanvasPersistenceAdapter => {\n\t\tif (persistence === false) return createNoopPersistenceAdapter();\n\t\tif (persistence) return persistence;\n\t\treturn createLocalStoragePersistenceAdapter({ key: persistenceKey });\n\t}, [persistence, persistenceKey]);\n\n\tconst [items, setItems] = useState<VectorSceneItem[]>([]);\n\tconst [isHydrated, setIsHydrated] = useState(false);\n\tconst saveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst adapterRef = useRef(adapter);\n\tadapterRef.current = adapter;\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tadapter.load().then((snap) => {\n\t\t\tif (cancelled) return;\n\t\t\tif (snap?.items && snap.items.length > 0) {\n\t\t\t\tsetItems(snap.items);\n\t\t\t}\n\t\t\tsetIsHydrated(true);\n\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [adapter]);\n\n\tconst persist = useCallback((next: VectorSceneItem[]) => {\n\t\tvoid adapterRef.current.save({ items: next, version: 1 });\n\t}, []);\n\n\tconst onItemsChange = useCallback(\n\t\t(next: VectorSceneItem[]) => {\n\t\t\tsetItems(next);\n\t\t\tremote?.send?.(next);\n\t\t\tif (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n\t\t\tsaveTimerRef.current = setTimeout(() => {\n\t\t\t\tpersist(next);\n\t\t\t\tsaveTimerRef.current = null;\n\t\t\t}, debounceMs);\n\t\t},\n\t\t[debounceMs, persist, remote],\n\t);\n\n\t/** After local load, wire server so a fast WS message does not get overwritten by stale LS. */\n\tuseEffect(() => {\n\t\tif (!remote || !isHydrated) return;\n\t\treturn remote.subscribe((serverItems) => {\n\t\t\tsetItems(serverItems);\n\t\t\tpersist(serverItems);\n\t\t});\n\t}, [remote, isHydrated, persist]);\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tif (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n\t\t},\n\t\t[],\n\t);\n\n\tconst clearPersistedDocument = useCallback(() => {\n\t\tsetItems([]);\n\t\tvoid adapterRef.current.save({ items: [], version: 1 });\n\t}, []);\n\n\treturn {\n\t\titems,\n\t\tonItemsChange,\n\t\tsetItems: onItemsChange,\n\t\tisHydrated,\n\t\tclearPersistedDocument,\n\t};\n}\n","\"use client\";\n\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\ttype RefObject,\n\tuseContext,\n\tuseLayoutEffect,\n} from \"react\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport type { VectorToolDefinition } from \"../tools/types\";\nimport type {\n\tCustomShapePlacementOptions,\n\tVectorViewportHandle,\n\tVectorViewportProps,\n} from \"../VectorViewport\";\n\nexport type CanvasPluginRenderContext = {\n\t/** Live viewport handle when the plugin needs camera or viewport size. */\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n};\n\nexport type CanvasPluginItemsChangeMiddlewareContext = {\n\t/** Current board items before the pending change is applied. */\n\tcurrentItems: readonly VectorSceneItem[];\n\t/** Continue the item change pipeline. */\n\tnext: NonNullable<VectorViewportProps[\"onItemsChange\"]>;\n\t/** Original consumer callback passed to `VectorViewport`. */\n\tconsumerOnItemsChange?: VectorViewportProps[\"onItemsChange\"];\n\t/** Live viewport handle for advanced integrations. */\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n};\n\nexport type CanvasPluginContribution = {\n\t/** Additional tools injected into the board toolbar/runtime. */\n\ttools?: readonly VectorToolDefinition[];\n\t/** Transform the resolved tool list (reorder, replace, or filter existing tools). */\n\ttoolTransform?: (tools: VectorToolDefinition[]) => VectorToolDefinition[];\n\t/** Multiple custom placements contributed by plugins; the active one is resolved by `toolId`. */\n\tcustomPlacements?: readonly CustomShapePlacementOptions[];\n\t/** Simple viewport prop overrides owned by the plugin runtime. */\n\tviewportProps?: Partial<\n\t\tPick<VectorViewportProps, \"remotePresence\" | \"presenceOverlay\">\n\t>;\n\t/** Event callbacks chained into the viewport without manual wiring in app code. */\n\tcallbacks?: Partial<\n\t\tPick<\n\t\t\tVectorViewportProps,\n\t\t\t| \"onWorldPointerDown\"\n\t\t\t| \"onWorldPointerMove\"\n\t\t\t| \"onWorldPointerLeave\"\n\t\t\t| \"onPlacementPreviewChange\"\n\t\t\t| \"onCameraChange\"\n\t\t>\n\t>;\n\t/** Middleware around `onItemsChange` for collaboration, comments, persistence, etc. */\n\twrapOnItemsChange?: (\n\t\tnextItems: VectorSceneItem[],\n\t\tctx: CanvasPluginItemsChangeMiddlewareContext,\n\t) => void;\n};\n\nexport type CanvasPluginComponentProps = {\n\t/** Stable plugin id so the component can register contributions. */\n\tpluginId: string;\n};\n\nexport type CanvasPlugin = {\n\t/** Stable id, e.g. `canvu.plugin.chatbot`. */\n\tid: string;\n\t/**\n\t * Legacy/simple rendering path for purely visual plugins.\n\t *\n\t * Prefer `Component` for plugins that need hooks, document integration, tools, or runtime contributions.\n\t */\n\trender?: (ctx: CanvasPluginRenderContext) => ReactNode;\n\t/**\n\t * Preferred plugin entrypoint for first-party and advanced plugins.\n\t *\n\t * The component can use hooks and register contributions through `useCanvuPluginContribution`.\n\t */\n\tComponent?: (props: CanvasPluginComponentProps) => ReactNode;\n};\n\nexport type CanvuPluginViewportSnapshot = Pick<\n\tVectorViewportProps,\n\t| \"items\"\n\t| \"onItemsChange\"\n\t| \"toolId\"\n\t| \"interactive\"\n\t| \"toolLocked\"\n\t| \"onToolChangeRequest\"\n>;\n\nexport type CanvuPluginContextValue = {\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n\tviewport: CanvuPluginViewportSnapshot;\n\tresolvedTools: VectorToolDefinition[];\n\tregisterContribution: (\n\t\tpluginId: string,\n\t\tcontribution: CanvasPluginContribution,\n\t) => void;\n\tunregisterContribution: (pluginId: string) => void;\n};\n\nexport const CanvuPluginContext = createContext<CanvuPluginContextValue | null>(\n\tnull,\n);\n\n/**\n * Creates a typed canvu plugin descriptor.\n *\n * Use this helper when authoring custom plugins so your editor can infer the plugin shape\n * and surface better hover documentation for the returned object.\n */\nexport function createCanvuPlugin(plugin: CanvasPlugin): CanvasPlugin {\n\treturn plugin;\n}\n\n/**\n * Returns the low-level canvu plugin runtime context.\n *\n * This is an advanced API for custom plugin authors. Prefer first-party plugin factories such as\n * `chatbotPlugin(...)` and `realtimeCollaborationPlugin(...)` for the common path.\n */\nexport function useCanvuPluginContext(): CanvuPluginContextValue {\n\tconst ctx = useContext(CanvuPluginContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"useCanvuPluginContext must be used inside a VectorViewport plugin runtime.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n/**\n * Returns the current viewport-facing board state exposed to plugins.\n *\n * Use this when a custom plugin needs access to items, the active tool, or the consumer's\n * `onToolChangeRequest` callback.\n */\nexport function useCanvuViewportContext(): {\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n\tviewport: CanvuPluginViewportSnapshot;\n} {\n\tconst { viewportRef, viewport } = useCanvuPluginContext();\n\treturn { viewportRef, viewport };\n}\n\n/**\n * Returns the board document context exposed to plugins.\n *\n * This hook is intended for advanced plugins that need to read items or integrate with the board's\n * `onItemsChange` lifecycle.\n */\nexport function useCanvuDocumentContext(): {\n\titems: readonly VectorSceneItem[];\n\tonItemsChange?: VectorViewportProps[\"onItemsChange\"];\n} {\n\tconst { viewport } = useCanvuPluginContext();\n\treturn {\n\t\titems: viewport.items,\n\t\tonItemsChange: viewport.onItemsChange,\n\t};\n}\n\n/**\n * Returns the tool list already resolved by the plugin runtime.\n *\n * `VectorToolbar` consumes this automatically when you omit its `tools` prop, so most apps do not\n * need this hook directly.\n */\nexport function useCanvuResolvedTools(): VectorToolDefinition[] {\n\treturn useCanvuPluginContext().resolvedTools;\n}\n\n/**\n * Registers non-visual plugin contributions with the current `VectorViewport` runtime.\n *\n * Use this inside `plugin.Component` when you want to inject tools, pointer/camera behavior, or\n * document middleware without requiring the consumer to wire hooks manually.\n */\nexport function useCanvuPluginContribution(\n\tpluginId: string,\n\tcontribution: CanvasPluginContribution,\n): void {\n\tconst { registerContribution, unregisterContribution } = useCanvuPluginContext();\n\tuseLayoutEffect(() => {\n\t\tregisterContribution(pluginId, contribution);\n\t\treturn () => unregisterContribution(pluginId);\n\t}, [contribution, pluginId, registerContribution, unregisterContribution]);\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport type { VectorToolDefinition } from \"../tools/types\";\nimport type { CustomShapePlacementOptions } from \"../VectorViewport\";\nimport {\n\ttype CanvasPlugin,\n\tcreateCanvuPlugin,\n\tuseCanvuPluginContribution,\n} from \"./types\";\n\nexport type CreateToolPluginOptions = VectorToolDefinition & {\n\t/**\n\t * Optional custom placement factory for tools that create scene items directly.\n\t *\n\t * When provided, the resulting plugin contributes a `customPlacement` entry for this tool id.\n\t */\n\tcreateItem?: (args: {\n\t\tid: string;\n\t\tbounds: { x: number; y: number; width: number; height: number };\n\t}) => VectorSceneItem;\n\t/**\n\t * Optional tool list transform applied after this tool is merged.\n\t *\n\t * Use this when you need custom ordering or to replace an existing tool position.\n\t */\n\ttoolTransform?: (tools: VectorToolDefinition[]) => VectorToolDefinition[];\n};\n\nfunction ToolPluginComponent({\n\tpluginId,\n\ttool,\n\ttoolTransform,\n\tcreateItem,\n}: {\n\tpluginId: string;\n\ttool: VectorToolDefinition;\n\ttoolTransform?: (tools: VectorToolDefinition[]) => VectorToolDefinition[];\n\tcreateItem?: CustomShapePlacementOptions[\"createItem\"];\n}) {\n\tconst contribution = useMemo(\n\t\t() => ({\n\t\t\ttools: [tool],\n\t\t\ttoolTransform,\n\t\t\tcustomPlacements: createItem\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttoolId: tool.id,\n\t\t\t\t\t\t\tcreateItem,\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: undefined,\n\t\t}),\n\t\t[createItem, tool, toolTransform],\n\t);\n\tuseCanvuPluginContribution(pluginId, contribution);\n\treturn null;\n}\n\n/**\n * Creates a lightweight plugin that contributes a single tool to `VectorViewport`.\n *\n * Use this for isolated tools such as custom shapes, review pins, or lightweight creation flows.\n * For larger features that also need presence, panels, or network integration, prefer a dedicated\n * feature plugin such as `realtimeCollaborationPlugin(...)`.\n */\nexport function createToolPlugin(options: CreateToolPluginOptions): CanvasPlugin {\n\tconst { createItem, toolTransform, ...tool } = options;\n\tconst pluginId = `canvu.plugin.tool:${tool.id}`;\n\treturn createCanvuPlugin({\n\t\tid: pluginId,\n\t\tComponent() {\n\t\t\treturn (\n\t\t\t\t<ToolPluginComponent\n\t\t\t\t\tpluginId={pluginId}\n\t\t\t\t\ttool={tool}\n\t\t\t\t\ttoolTransform={toolTransform}\n\t\t\t\t\tcreateItem={createItem}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t});\n}\n","\"use client\";\n\nimport { type CSSProperties, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nconst menuStyle: CSSProperties = {\n\tposition: \"fixed\",\n\tzIndex: 10000,\n\tminWidth: 200,\n\tpadding: 4,\n\tbackgroundColor: \"#ffffff\",\n\tborder: \"1px solid #e2e8f0\",\n\tborderRadius: 8,\n\tboxShadow: \"0 10px 40px rgba(15, 23, 42, 0.12)\",\n\tfontSize: 13,\n\tfontFamily: \"system-ui, sans-serif\",\n\tcolor: \"#0f172a\",\n};\n\nconst itemStyle: CSSProperties = {\n\tdisplay: \"block\",\n\twidth: \"100%\",\n\ttextAlign: \"left\",\n\tpadding: \"8px 12px\",\n\tmargin: 0,\n\tborder: \"none\",\n\tborderRadius: 4,\n\tbackground: \"transparent\",\n\tcursor: \"pointer\",\n};\n\nconst dividerStyle: CSSProperties = {\n\theight: 1,\n\tmargin: \"4px 8px\",\n\tbackground: \"#e2e8f0\",\n};\n\nexport type ShapeContextMenuProps = {\n\t/** Viewport client coordinates (from `clientX` / `clientY`). */\n\tx: number;\n\ty: number;\n\t/** When true, all selected items are locked — action is “unlock”. */\n\tallSelectedLocked: boolean;\n\tonClose: () => void;\n\tonToggleLock: () => void;\n\tonCut: () => void;\n\tonCopy: () => void;\n\tonBringToFront: () => void;\n\tonBringForward: () => void;\n\tonSendBackward: () => void;\n\tonSendToBack: () => void;\n\tonDuplicate: () => void;\n\tonDelete: () => void;\n};\n\n/**\n * Floating menu for shape actions (reorder, clipboard, lock, delete).\n * Renders in a portal and closes on Escape or outside click.\n */\nexport function ShapeContextMenu({\n\tx,\n\ty,\n\tallSelectedLocked,\n\tonClose,\n\tonToggleLock,\n\tonCut,\n\tonCopy,\n\tonBringToFront,\n\tonBringForward,\n\tonSendBackward,\n\tonSendToBack,\n\tonDuplicate,\n\tonDelete,\n}: ShapeContextMenuProps) {\n\tconst rootRef = useRef<HTMLDivElement>(null);\n\n\tuseLayoutEffect(() => {\n\t\tconst el = rootRef.current;\n\t\tif (!el) return;\n\t\tconst pad = 8;\n\t\tconst w = el.offsetWidth || 200;\n\t\tconst h = el.offsetHeight || 160;\n\t\tlet left = x;\n\t\tlet top = y;\n\t\tif (left + w + pad > window.innerWidth) {\n\t\t\tleft = Math.max(pad, window.innerWidth - w - pad);\n\t\t}\n\t\tif (top + h + pad > window.innerHeight) {\n\t\t\ttop = Math.max(pad, window.innerHeight - h - pad);\n\t\t}\n\t\tel.style.left = `${left}px`;\n\t\tel.style.top = `${top}px`;\n\t}, [x, y]);\n\n\tuseEffect(() => {\n\t\tconst onKey = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\t\tconst onPointerDown = (e: PointerEvent) => {\n\t\t\tconst t = e.target as Node | null;\n\t\t\tif (t && rootRef.current?.contains(t)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClose();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", onKey);\n\t\tdocument.addEventListener(\"pointerdown\", onPointerDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", onKey);\n\t\t\tdocument.removeEventListener(\"pointerdown\", onPointerDown, true);\n\t\t};\n\t}, [onClose]);\n\n\tconst run = (fn: () => void) => () => {\n\t\tfn();\n\t\tonClose();\n\t};\n\n\tconst renderAction = (\n\t\tlabel: string,\n\t\tonClick: () => void,\n\t\toptions?: { danger?: boolean },\n\t) => (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\trole=\"menuitem\"\n\t\t\tstyle={{\n\t\t\t\t...itemStyle,\n\t\t\t\t...(options?.danger ? { color: \"#b91c1c\" } : {}),\n\t\t\t}}\n\t\t\tonMouseEnter={(e) => {\n\t\t\t\te.currentTarget.style.background = options?.danger ? \"#fef2f2\" : \"#f1f5f9\";\n\t\t\t}}\n\t\t\tonMouseLeave={(e) => {\n\t\t\t\te.currentTarget.style.background = \"transparent\";\n\t\t\t}}\n\t\t\tonClick={run(onClick)}\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n\n\tconst menu = (\n\t\t<div\n\t\t\tref={rootRef}\n\t\t\tdata-slot=\"shape-context-menu\"\n\t\t\tstyle={{ ...menuStyle, left: x, top: y }}\n\t\t\trole=\"menu\"\n\t\t>\n\t\t\t{renderAction(\"Recortar\", onCut)}\n\t\t\t{renderAction(\"Copiar\", onCopy)}\n\t\t\t{renderAction(\"Duplicar\", onDuplicate)}\n\t\t\t<div aria-hidden style={dividerStyle} />\n\t\t\t{renderAction(\"Trazer para frente\", onBringToFront)}\n\t\t\t{renderAction(\"Avancar uma camada\", onBringForward)}\n\t\t\t{renderAction(\"Recuar uma camada\", onSendBackward)}\n\t\t\t{renderAction(\"Enviar para tras\", onSendToBack)}\n\t\t\t<div aria-hidden style={dividerStyle} />\n\t\t\t{renderAction(allSelectedLocked ? \"Desbloquear\" : \"Bloquear\", onToggleLock)}\n\t\t\t{renderAction(\"Apagar\", onDelete, { danger: true })}\n\t\t</div>\n\t);\n\n\tif (typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\treturn createPortal(menu, document.body);\n}\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nconst architecturalCloudIconPath =\n\t\"M1.5 12 A 4.94 5.23 0 0 1 9.07 6 A 4.94 5.23 0 0 1 14.93 6 A 4.94 5.23 0 0 1 22.5 12 A 4.94 5.23 0 0 1 14.93 18 A 4.94 5.23 0 0 1 9.07 18 A 4.94 5.23 0 0 1 1.5 12 Z\";\n\nconst base = {\n\twidth: 20,\n\theight: 20,\n\tviewBox: \"0 0 24 24\",\n\tfill: \"none\",\n\tstroke: \"currentColor\",\n\tstrokeWidth: 2,\n\tstrokeLinecap: \"round\" as const,\n\tstrokeLinejoin: \"round\" as const,\n};\n\nexport function IconHand(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\" />\n\t\t\t<path d=\"M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v2\" />\n\t\t\t<path d=\"M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v8\" />\n\t\t\t<path d=\"M18 8a2 2 0 1 1 4 0v5a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconSelect(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\" />\n\t\t\t<path d=\"M13 13l6 6\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconRect(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconEllipse(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"6\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconArchitecturalCloud(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d={architecturalCloudIconPath} />\n\t\t</svg>\n\t);\n}\n\nexport function IconLine(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconArrow(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n\t\t\t<polyline points=\"12 5 19 5 19 12\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconDraw(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M12 19l7-7 3 3-7 7-3-3z\" />\n\t\t\t<path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\" />\n\t\t\t<path d=\"M2 2l7.586 7.586\" />\n\t\t\t<circle cx=\"11\" cy=\"11\" r=\"2\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconText(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\" />\n\t\t\t<path d=\"M9 21h6\" />\n\t\t\t<path d=\"M12 3v18\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconImage(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n\t\t\t<circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n\t\t\t<polyline points=\"21 15 16 10 5 21\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconPencil(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M12 19l7-7 3 3-7 7-3-3z\" />\n\t\t\t<path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\" />\n\t\t\t<path d=\"M2 2l7.586 7.586\" />\n\t\t\t<path d=\"M11 4h4v4\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconBrush(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M9.06 11.9l8.07-8.06a2.85 2.85 0 0 1 4.03 4.03l-8.06 8.07\" />\n\t\t\t<path d=\"M7.5 15.5L3 21l5.5-4.5\" />\n\t\t\t<path d=\"M2 22l4-1\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconMarker(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M4 20h16\" />\n\t\t\t<path d=\"M6 16l6-12 6 12\" fill=\"currentColor\" fillOpacity={0.35} />\n\t\t\t<path d=\"M8 14h8\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconLaser(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<circle cx=\"12\" cy=\"12\" r=\"2.5\" />\n\t\t\t<path d=\"M12 4v4\" />\n\t\t\t<path d=\"M12 16v4\" />\n\t\t\t<path d=\"M4 12h4\" />\n\t\t\t<path d=\"M16 12h4\" />\n\t\t</svg>\n\t);\n}\n","import {\n\tArrowUpRight,\n\tCircle,\n\tEraser,\n\tHand,\n\tHighlighter,\n\tImage,\n\tMinus,\n\tMousePointer2,\n\tPenLine,\n\tSquare,\n\tType,\n} from \"lucide-react\";\nimport { IconArchitecturalCloud, IconLaser } from \"./icons\";\nimport type { VectorToolDefinition } from \"./types\";\n\n/** Match previous 20×20 toolbar glyphs; Lucide scales with `currentColor`. */\nconst ic = { size: 20, strokeWidth: 2 } as const;\n\n/**\n * Tool ids shown in the overflow menu at the end of the default toolbar (horizontal layout).\n * Order: shapes, marker, laser, image.\n */\nexport const DEFAULT_OVERFLOW_TOOL_IDS = [\n\t\"rect\",\n\t\"ellipse\",\n\t\"architectural-cloud\",\n\t\"line\",\n\t\"marker\",\n\t\"laser\",\n\t\"image\",\n] as const;\n\n/**\n * Opinionated default tool strip using [Lucide](https://lucide.dev) icons.\n * Pass a subset or your own list via {@link VectorToolbarProps.tools}.\n */\nexport const DEFAULT_VECTOR_TOOLS: VectorToolDefinition[] = [\n\t{\n\t\tid: \"hand\",\n\t\tlabel: \"Hand\",\n\t\ticon: <Hand {...ic} aria-hidden />,\n\t\tshortcutHint: \"H\",\n\t},\n\t{\n\t\tid: \"select\",\n\t\tlabel: \"Select\",\n\t\ticon: <MousePointer2 {...ic} aria-hidden />,\n\t\tshortcutHint: \"V\",\n\t},\n\t{\n\t\tid: \"rect\",\n\t\tlabel: \"Rectangle\",\n\t\ticon: <Square {...ic} aria-hidden />,\n\t\tshortcutHint: \"R\",\n\t},\n\t{\n\t\tid: \"ellipse\",\n\t\tlabel: \"Ellipse\",\n\t\ticon: <Circle {...ic} aria-hidden />,\n\t\tshortcutHint: \"O\",\n\t},\n\t{\n\t\tid: \"architectural-cloud\",\n\t\tlabel: \"Nuvem arquitetural\",\n\t\ttooltipLabel: \"Architectural cloud\",\n\t\ticon: <IconArchitecturalCloud aria-hidden />,\n\t\tshortcutHint: \"C\",\n\t},\n\t{\n\t\tid: \"line\",\n\t\tlabel: \"Line\",\n\t\ticon: <Minus {...ic} aria-hidden />,\n\t\tshortcutHint: \"L\",\n\t},\n\t{\n\t\tid: \"arrow\",\n\t\tlabel: \"Arrow\",\n\t\ticon: <ArrowUpRight {...ic} aria-hidden />,\n\t\tshortcutHint: \"A\",\n\t},\n\t{\n\t\tid: \"draw\",\n\t\tlabel: \"Desenhar\",\n\t\ttooltipLabel: \"Draw\",\n\t\ticon: <PenLine {...ic} aria-hidden />,\n\t\tshortcutHint: \"D\",\n\t},\n\t{\n\t\tid: \"marker\",\n\t\tlabel: \"Realce\",\n\t\ttooltipLabel: \"Highlighter\",\n\t\ticon: <Highlighter {...ic} aria-hidden />,\n\t\tshortcutHint: \"M\",\n\t},\n\t{\n\t\tid: \"laser\",\n\t\tlabel: \"Laser\",\n\t\ticon: <IconLaser aria-hidden />,\n\t\tshortcutHint: \"K\",\n\t},\n\t{\n\t\tid: \"eraser\",\n\t\tlabel: \"Borracha\",\n\t\ttooltipLabel: \"Eraser\",\n\t\ticon: <Eraser {...ic} aria-hidden />,\n\t\tshortcutHint: \"E\",\n\t},\n\t{\n\t\tid: \"text\",\n\t\tlabel: \"Text\",\n\t\ticon: <Type {...ic} aria-hidden />,\n\t\tshortcutHint: \"T\",\n\t},\n\t{\n\t\tid: \"image\",\n\t\tlabel: \"File\",\n\t\ticon: <Image {...ic} aria-hidden />,\n\t\tshortcutHint: \"I\",\n\t},\n];\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport { useState } from \"react\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport { DEFAULT_TEXT_FONT_SIZE } from \"../scene/text-svg\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./board-position\";\nimport {\n\ttype CanvuChromeSelectionStyleChange,\n\tuseCanvuChromeContext,\n} from \"./chrome-context\";\n\ntype ActiveToolStyle = StrokeStyle & {\n\ttoolKind:\n\t\t| \"draw\"\n\t\t| \"marker\"\n\t\t| \"text\"\n\t\t| \"rect\"\n\t\t| \"ellipse\"\n\t\t| \"architectural-cloud\"\n\t\t| \"line\"\n\t\t| \"arrow\";\n\tlabel?: string;\n\ttextFontSize?: number;\n};\n\n/**\n * Color + stroke-width inspector for the current selection (or active drawing tool style).\n * When rendered inside `VectorViewport` (e.g. via the `selectionInspector` slot), `items`,\n * `activeToolStyle`, and `onChange` default to values from {@link CanvuChromeContext};\n * pass any prop to override.\n */\nexport type VectorSelectionInspectorProps = {\n\t/** Selected items that support stroke/fill styling (caller may filter). */\n\titems?: readonly VectorSceneItem[];\n\t/** Optional active tool style shown even without a selection. */\n\tactiveToolStyle?: ActiveToolStyle | null;\n\t/** Apply stroke / width / opacity / dash / text size to every item in `items`. */\n\tonChange?: CanvuChromeSelectionStyleChange;\n\t/** Anchor preset. Defaults to top-left. */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from anchored edges. @default 12 */\n\tinset?: number;\n\t/** @default 24 */\n\tzIndex?: number;\n\tclassName?: string;\n\t/** Merged on top of position-derived styles for custom tweaks. */\n\tstyle?: CSSProperties;\n};\n\nconst shellLook: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 10,\n\tminWidth: 200,\n\tpadding: \"12px 14px\",\n\tborderRadius: 10,\n\tborder: \"1px solid rgba(0,0,0,0.1)\",\n\tbackground: \"rgba(255,255,255,0.97)\",\n\tboxShadow: \"0 4px 16px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.08)\",\n\tpointerEvents: \"auto\",\n};\n\nconst sectionLabelStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 6,\n\tfontSize: 11,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\tletterSpacing: \"0.02em\",\n\ttextTransform: \"uppercase\",\n};\n\nconst mixedHintStyle: CSSProperties = {\n\tfontWeight: 400,\n\tcolor: \"#a1a1aa\",\n\ttextTransform: \"none\",\n\tletterSpacing: 0,\n};\n\n/**\n * tldraw default canvas palette. Order chosen so the most-used neutrals sit\n * at the start; named to match what tldraw exposes in its style picker.\n */\nconst TLDRAW_PALETTE: ReadonlyArray<{ name: string; hex: string }> = [\n\t{ name: \"black\", hex: \"#1d1d1d\" },\n\t{ name: \"grey\", hex: \"#9fa8b2\" },\n\t{ name: \"light-violet\", hex: \"#e085f4\" },\n\t{ name: \"violet\", hex: \"#ae3ec9\" },\n\t{ name: \"blue\", hex: \"#4263eb\" },\n\t{ name: \"light-blue\", hex: \"#4dabf7\" },\n\t{ name: \"yellow\", hex: \"#ffc078\" },\n\t{ name: \"orange\", hex: \"#f76707\" },\n\t{ name: \"green\", hex: \"#099268\" },\n\t{ name: \"light-green\", hex: \"#40c057\" },\n\t{ name: \"light-red\", hex: \"#ff8787\" },\n\t{ name: \"red\", hex: \"#e03131\" },\n];\n\nfunction normalizeHex(stroke: string): string {\n\tif (/^#[0-9A-Fa-f]{6}$/.test(stroke)) return stroke;\n\treturn \"#1d1d1d\";\n}\n\nfunction hexesEqual(a: string, b: string): boolean {\n\treturn a.toLowerCase() === b.toLowerCase();\n}\n\nfunction isStylableKind(\n\ttk: VectorSceneItem[\"toolKind\"],\n): tk is NonNullable<VectorSceneItem[\"toolKind\"]> {\n\treturn (\n\t\ttk === \"rect\" ||\n\t\ttk === \"ellipse\" ||\n\t\ttk === \"architectural-cloud\" ||\n\t\ttk === \"line\" ||\n\t\ttk === \"arrow\" ||\n\t\ttk === \"draw\" ||\n\t\ttk === \"pencil\" ||\n\t\ttk === \"brush\" ||\n\t\ttk === \"marker\" ||\n\t\ttk === \"text\"\n\t);\n}\n\nconst FONT_SIZE_PRESETS: ReadonlyArray<{ label: string; size: number }> = [\n\t{ label: \"S\", size: 14 },\n\t{ label: \"M\", size: 18 },\n\t{ label: \"L\", size: 28 },\n\t{ label: \"XL\", size: 44 },\n];\n\ntype SwatchProps = {\n\tcolor: { name: string; hex: string };\n\tselected: boolean;\n\tonSelect: () => void;\n};\n\nfunction ColorSwatch({ color, selected, onSelect }: SwatchProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={color.name}\n\t\t\taria-pressed={selected}\n\t\t\tonClick={onSelect}\n\t\t\tonPointerDown={(e) => {\n\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t}}\n\t\t\tstyle={{\n\t\t\t\twidth: 24,\n\t\t\t\theight: 24,\n\t\t\t\tpadding: 0,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tborder: selected ? \"2px solid #18181b\" : \"1px solid rgba(0,0,0,0.12)\",\n\t\t\t\tbackground: color.hex,\n\t\t\t\tcursor: \"pointer\",\n\t\t\t\toutline: \"none\",\n\t\t\t\tboxShadow: selected ? \"0 0 0 2px rgba(255,255,255,0.95) inset\" : \"none\",\n\t\t\t\ttransition: \"transform 0.08s ease\",\n\t\t\t\ttransform: selected ? \"scale(1.08)\" : \"scale(1)\",\n\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t}}\n\t\t/>\n\t);\n}\n\ntype PaletteProps = {\n\tvalue: string;\n\tonChange: (hex: string) => void;\n};\n\nfunction ColorPalette({ value, onChange }: PaletteProps) {\n\tconst [showCustom, setShowCustom] = useState(false);\n\tconst normalized = normalizeHex(value);\n\tconst inPalette = TLDRAW_PALETTE.some((c) => hexesEqual(c.hex, normalized));\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"repeat(6, 24px)\",\n\t\t\t\tgap: 6,\n\t\t\t\trowGap: 6,\n\t\t\t\talignItems: \"center\",\n\t\t\t}}\n\t\t>\n\t\t\t{TLDRAW_PALETTE.map((c) => (\n\t\t\t\t<ColorSwatch\n\t\t\t\t\tkey={c.name}\n\t\t\t\t\tcolor={c}\n\t\t\t\t\tselected={hexesEqual(c.hex, normalized)}\n\t\t\t\t\tonSelect={() => onChange(c.hex)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Custom color\"\n\t\t\t\taria-pressed={showCustom || !inPalette}\n\t\t\t\tonClick={() => setShowCustom((v) => !v)}\n\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t}}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: 24,\n\t\t\t\t\theight: 24,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\tborder:\n\t\t\t\t\t\t!inPalette || showCustom\n\t\t\t\t\t\t\t? \"2px solid #18181b\"\n\t\t\t\t\t\t\t: \"1px solid rgba(0,0,0,0.12)\",\n\t\t\t\t\tbackground:\n\t\t\t\t\t\t\"conic-gradient(from 0deg, #ff5757, #ffbd59, #59ff7e, #59ddff, #b259ff, #ff59c1, #ff5757)\",\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\toutline: \"none\",\n\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{showCustom || !inPalette ? (\n\t\t\t\t<label\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tgridColumn: \"1 / -1\",\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\tcolor: \"#71717a\",\n\t\t\t\t\t\ttextTransform: \"none\",\n\t\t\t\t\t\tletterSpacing: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\tvalue={normalized}\n\t\t\t\t\t\tonChange={(e) => onChange(e.target.value)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: 28,\n\t\t\t\t\t\t\theight: 28,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<span style={{ fontVariantNumeric: \"tabular-nums\" }}>\n\t\t\t\t\t\t{normalized.toUpperCase()}\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\ntype DashTabsProps = {\n\tvalue: \"solid\" | \"dashed\";\n\tonChange: (next: \"solid\" | \"dashed\") => void;\n};\n\nfunction DashTabs({ value, onChange }: DashTabsProps) {\n\tconst tabs: ReadonlyArray<{ id: \"solid\" | \"dashed\"; label: string }> = [\n\t\t{ id: \"solid\", label: \"Solid\" },\n\t\t{ id: \"dashed\", label: \"Dashed\" },\n\t];\n\treturn (\n\t\t<div\n\t\t\trole=\"radiogroup\"\n\t\t\taria-label=\"Stroke style\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tbackground: \"rgba(24,24,27,0.06)\",\n\t\t\t\tborderRadius: 7,\n\t\t\t\tpadding: 2,\n\t\t\t\tgap: 2,\n\t\t\t}}\n\t\t>\n\t\t\t{tabs.map((t) => {\n\t\t\t\tconst selected = value === t.id;\n\t\t\t\treturn (\n\t\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: styled segmented control needs button, not input[type=radio]\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"radio\"\n\t\t\t\t\t\taria-checked={selected}\n\t\t\t\t\t\tonClick={() => onChange(t.id)}\n\t\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\tpadding: \"5px 8px\",\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\tcolor: selected ? \"#18181b\" : \"#71717a\",\n\t\t\t\t\t\t\tbackground: selected ? \"#fff\" : \"transparent\",\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tboxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.1)\" : \"none\",\n\t\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<DashTabSwatch dashed={t.id === \"dashed\"} />\n\t\t\t\t\t\t<span style={{ marginLeft: 6 }}>{t.label}</span>\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nfunction DashTabSwatch({ dashed }: { dashed: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\twidth={26}\n\t\t\theight={6}\n\t\t\taria-hidden\n\t\t\tstyle={{ flexShrink: 0, display: \"block\" }}\n\t\t>\n\t\t\t<title>{dashed ? \"dashed\" : \"solid\"}</title>\n\t\t\t<line\n\t\t\t\tx1={1}\n\t\t\t\ty1={3}\n\t\t\t\tx2={25}\n\t\t\t\ty2={3}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeDasharray={dashed ? \"4 3\" : undefined}\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\ntype SizeTabsProps = {\n\tvalue: number;\n\tonChange: (size: number) => void;\n};\n\nfunction FontSizeTabs({ value, onChange }: SizeTabsProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"radiogroup\"\n\t\t\taria-label=\"Text size\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tbackground: \"rgba(24,24,27,0.06)\",\n\t\t\t\tborderRadius: 7,\n\t\t\t\tpadding: 2,\n\t\t\t\tgap: 2,\n\t\t\t}}\n\t\t>\n\t\t\t{FONT_SIZE_PRESETS.map((p) => {\n\t\t\t\tconst selected = Math.abs(value - p.size) < 0.5;\n\t\t\t\treturn (\n\t\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: styled segmented control needs button, not input[type=radio]\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={p.label}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"radio\"\n\t\t\t\t\t\taria-checked={selected}\n\t\t\t\t\t\taria-label={`${p.label} (${p.size}px)`}\n\t\t\t\t\t\tonClick={() => onChange(p.size)}\n\t\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tpadding: \"5px 0\",\n\t\t\t\t\t\t\tfontSize: p.label === \"XL\" ? 14 : p.label === \"L\" ? 13 : 12,\n\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\tcolor: selected ? \"#18181b\" : \"#71717a\",\n\t\t\t\t\t\t\tbackground: selected ? \"#fff\" : \"transparent\",\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tboxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.1)\" : \"none\",\n\t\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{p.label}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\ntype InspectorPatch = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: \"solid\" | \"dashed\";\n\ttextFontSize?: number;\n};\n\ntype InspectorViewModel = {\n\tlabel: string;\n\tcount: number;\n\thex: string;\n\tstrokeWidth: number;\n\tstrokeOpacity: number;\n\tstrokeDash: \"solid\" | \"dashed\";\n\ttextFontSize: number;\n\tshowStrokeWidth: boolean;\n\tshowDash: boolean;\n\tshowFontSize: boolean;\n\tshowMarkerOpacity: boolean;\n\tmixedStroke: boolean;\n\tmixedWidth: boolean;\n\tmixedDash: boolean;\n\tmixedFontSize: boolean;\n\tmixedOpacity: boolean;\n\t/** Snapshot of the current full style — caller spreads the field they're changing. */\n\tcurrent: InspectorPatch;\n};\n\nfunction viewModelFromActiveTool(\n\tactiveToolStyle: ActiveToolStyle,\n): InspectorViewModel {\n\tconst hex = normalizeHex(activeToolStyle.stroke);\n\tconst strokeWidth = activeToolStyle.strokeWidth;\n\tconst strokeOpacity = activeToolStyle.strokeOpacity ?? 1;\n\tconst strokeDash: \"solid\" | \"dashed\" =\n\t\tactiveToolStyle.strokeDash === \"dashed\" ? \"dashed\" : \"solid\";\n\tconst textFontSize = activeToolStyle.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tconst isText = activeToolStyle.toolKind === \"text\";\n\tconst isDraw = activeToolStyle.toolKind === \"draw\";\n\tconst isMarker = activeToolStyle.toolKind === \"marker\";\n\tconst current: InspectorPatch = {\n\t\tstroke: hex,\n\t\tstrokeWidth,\n\t\t...(activeToolStyle.strokeOpacity != null\n\t\t\t? { strokeOpacity: activeToolStyle.strokeOpacity }\n\t\t\t: {}),\n\t\t...(activeToolStyle.strokeDash != null\n\t\t\t? { strokeDash: activeToolStyle.strokeDash }\n\t\t\t: {}),\n\t\t...(isText ? { textFontSize } : {}),\n\t};\n\treturn {\n\t\tlabel: activeToolStyle.label ?? \"Tool style\",\n\t\tcount: 0,\n\t\thex,\n\t\tstrokeWidth,\n\t\tstrokeOpacity,\n\t\tstrokeDash,\n\t\ttextFontSize,\n\t\tshowStrokeWidth: !isText,\n\t\tshowDash: isDraw,\n\t\tshowFontSize: isText,\n\t\tshowMarkerOpacity: isMarker,\n\t\tmixedStroke: false,\n\t\tmixedWidth: false,\n\t\tmixedDash: false,\n\t\tmixedFontSize: false,\n\t\tmixedOpacity: false,\n\t\tcurrent,\n\t};\n}\n\nfunction viewModelFromSelection(\n\tstylable: VectorSceneItem[],\n): InspectorViewModel | null {\n\tconst first = stylable[0];\n\tif (!first) return null;\n\tconst hex = normalizeHex(first.stroke ?? \"#1d1d1d\");\n\tconst strokeWidth = first.strokeWidth ?? 2;\n\tconst allSameStroke = stylable.every(\n\t\t(it) => (it.stroke ?? \"#1d1d1d\") === (first.stroke ?? \"#1d1d1d\"),\n\t);\n\tconst allSameWidth = stylable.every(\n\t\t(it) => (it.strokeWidth ?? 2) === (first.strokeWidth ?? 2),\n\t);\n\n\tconst draws = stylable.filter(\n\t\t(it) => it.toolKind === \"draw\" || it.toolKind === \"pencil\",\n\t);\n\tconst showDash = draws.length > 0;\n\tconst firstDraw = draws[0];\n\tconst strokeDash: \"solid\" | \"dashed\" =\n\t\tfirstDraw?.strokeDash === \"dashed\" ? \"dashed\" : \"solid\";\n\tconst allSameDash =\n\t\tdraws.length === 0 ||\n\t\tdraws.every((it) => (it.strokeDash ?? \"solid\") === strokeDash);\n\n\tconst markers = stylable.filter((it) => it.toolKind === \"marker\");\n\tconst showMarkerOpacity = markers.length > 0;\n\tconst firstMarker = markers[0];\n\tconst strokeOpacity = firstMarker?.strokeOpacity ?? 1;\n\tconst allSameOpacity =\n\t\tmarkers.length === 0 ||\n\t\tmarkers.every(\n\t\t\t(it) => (it.strokeOpacity ?? 1) === (firstMarker?.strokeOpacity ?? 1),\n\t\t);\n\n\tconst texts = stylable.filter((it) => it.toolKind === \"text\");\n\tconst showFontSize = texts.length > 0;\n\tconst firstText = texts[0];\n\tconst textFontSize = firstText?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tconst allSameFontSize =\n\t\ttexts.length === 0 ||\n\t\ttexts.every(\n\t\t\t(it) => (it.textFontSize ?? DEFAULT_TEXT_FONT_SIZE) === textFontSize,\n\t\t);\n\n\tconst current: InspectorPatch = {\n\t\tstroke: hex,\n\t\tstrokeWidth,\n\t\t...(showMarkerOpacity ? { strokeOpacity } : {}),\n\t\t...(showDash ? { strokeDash } : {}),\n\t\t...(showFontSize ? { textFontSize } : {}),\n\t};\n\n\treturn {\n\t\tlabel: \"Selection style\",\n\t\tcount: stylable.length,\n\t\thex,\n\t\tstrokeWidth,\n\t\tstrokeOpacity,\n\t\tstrokeDash,\n\t\ttextFontSize,\n\t\tshowStrokeWidth: true,\n\t\tshowDash,\n\t\tshowFontSize,\n\t\tshowMarkerOpacity,\n\t\tmixedStroke: !allSameStroke,\n\t\tmixedWidth: !allSameWidth,\n\t\tmixedDash: !allSameDash,\n\t\tmixedFontSize: !allSameFontSize,\n\t\tmixedOpacity: !allSameOpacity,\n\t\tcurrent,\n\t};\n}\n\n/**\n * Color + stroke width for the current selection. Supports multiple selected shapes: one change applies to all.\n */\nexport function VectorSelectionInspector({\n\titems: itemsProp,\n\tactiveToolStyle: activeToolStyleProp,\n\tonChange: onChangeProp,\n\tposition = \"top-left\",\n\tinset = 12,\n\tzIndex = 24,\n\tclassName,\n\tstyle,\n}: VectorSelectionInspectorProps) {\n\tconst ctx = useCanvuChromeContext();\n\tconst items = itemsProp ?? ctx?.selectedItems ?? [];\n\tconst activeToolStyle =\n\t\tactiveToolStyleProp === undefined\n\t\t\t? (ctx?.activeToolStyle ?? null)\n\t\t\t: activeToolStyleProp;\n\tconst onChange = onChangeProp ?? ctx?.onSelectionStyleChange ?? null;\n\tif (!onChange) return null;\n\n\tlet vm: InspectorViewModel | null = null;\n\tif (activeToolStyle) {\n\t\tvm = viewModelFromActiveTool(activeToolStyle);\n\t} else {\n\t\tconst stylable = items.filter(\n\t\t\t(it) => !it.locked && it.toolKind && isStylableKind(it.toolKind),\n\t\t);\n\t\tif (stylable.length === 0) return null;\n\t\tvm = viewModelFromSelection(stylable);\n\t}\n\tif (!vm) return null;\n\n\tconst apply = (changes: Partial<InspectorPatch>) =>\n\t\tonChange({ ...vm.current, ...changes });\n\n\tconst shell: CSSProperties = {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\t...shellLook,\n\t\t...style,\n\t};\n\tconst opacityPct = Math.round(vm.strokeOpacity * 100);\n\n\treturn (\n\t\t<section\n\t\t\tdata-slot=\"vector-selection-inspector\"\n\t\t\tdata-position={position}\n\t\t\tclassName={className}\n\t\t\taria-label={vm.label}\n\t\t\tstyle={shell}\n\t\t>\n\t\t\t{vm.count > 1 ? (\n\t\t\t\t<p style={{ margin: 0, fontSize: 11, color: \"#71717a\" }}>\n\t\t\t\t\t{vm.count} objects selected\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: fieldset would impose default browser styling that breaks the inspector layout */}\n\t\t\t<div role=\"group\" aria-label=\"Color\" style={sectionLabelStyle}>\n\t\t\t\t<span>\n\t\t\t\t\tColor\n\t\t\t\t\t{vm.mixedStroke ? (\n\t\t\t\t\t\t<span style={mixedHintStyle}> (mixed values)</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t\t<ColorPalette value={vm.hex} onChange={(h) => apply({ stroke: h })} />\n\t\t\t</div>\n\t\t\t{vm.showStrokeWidth ? (\n\t\t\t\t<label style={sectionLabelStyle}>\n\t\t\t\t\tThickness\n\t\t\t\t\t{vm.mixedWidth ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={48}\n\t\t\t\t\t\tvalue={vm.strokeWidth}\n\t\t\t\t\t\tonChange={(e) => apply({ strokeWidth: Number(e.target.value) })}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t) : null}\n\t\t\t{vm.showDash ? (\n\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: fieldset would impose default browser styling that breaks the inspector layout\n\t\t\t\t<div role=\"group\" aria-label=\"Stroke\" style={sectionLabelStyle}>\n\t\t\t\t\t<span>\n\t\t\t\t\t\tStroke\n\t\t\t\t\t\t{vm.mixedDash ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t</span>\n\t\t\t\t\t<DashTabs\n\t\t\t\t\t\tvalue={vm.strokeDash}\n\t\t\t\t\t\tonChange={(next) => apply({ strokeDash: next })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{vm.showFontSize ? (\n\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: fieldset would impose default browser styling that breaks the inspector layout\n\t\t\t\t<div role=\"group\" aria-label=\"Size\" style={sectionLabelStyle}>\n\t\t\t\t\t<span>\n\t\t\t\t\t\tSize\n\t\t\t\t\t\t{vm.mixedFontSize ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t</span>\n\t\t\t\t\t<FontSizeTabs\n\t\t\t\t\t\tvalue={vm.textFontSize}\n\t\t\t\t\t\tonChange={(size) => apply({ textFontSize: size })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{vm.showMarkerOpacity ? (\n\t\t\t\t<label style={sectionLabelStyle}>\n\t\t\t\t\tOpacity\n\t\t\t\t\t{vm.mixedOpacity ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tvalue={opacityPct}\n\t\t\t\t\t\tonChange={(e) => apply({ strokeOpacity: Number(e.target.value) / 100 })}\n\t\t\t\t\t/>\n\t\t\t\t\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{opacityPct}%</span>\n\t\t\t\t</label>\n\t\t\t) : null}\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties, ReactNode } from \"react\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n\ttype VectorCanvasSpacePosition,\n} from \"./board-position\";\nimport { NavMenu } from \"./navmenu\";\nimport { VectorSelectionInspector } from \"./VectorSelectionInspector\";\n\nexport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n\ttype VectorCanvasSpacePosition,\n};\n\nexport type VectorCanvasSlotProps = {\n\tchildren?: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\n\nexport type VectorCanvasSpaceProps = VectorCanvasSlotProps & {\n\tposition?: BoardComponentPosition;\n\t/** @default 12 */\n\tinset?: number;\n\t/** @default 40 */\n\tzIndex?: number;\n\t/** Pointer events value on the content wrapper. @default \"auto\" */\n\tcontentPointerEvents?: CSSProperties[\"pointerEvents\"];\n};\n\nconst rootStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\theight: \"100%\",\n\tminHeight: 0,\n\twidth: \"100%\",\n};\n\nconst headerStyle: CSSProperties = {\n\tflexShrink: 0,\n\tdisplay: \"flex\",\n\tflexWrap: \"wrap\",\n\talignItems: \"center\",\n\tgap: \"0.75rem\",\n\tpadding: \"0.75rem 1rem\",\n\tborderBottom: \"1px solid #e4e4e7\",\n\tbackground: \"#fff\",\n\tfontSize: \"0.875rem\",\n};\n\nconst bodyStyle: CSSProperties = {\n\tflex: 1,\n\tminHeight: 0,\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n};\n\nconst mainStyle: CSSProperties = {\n\tflex: 1,\n\tminHeight: 0,\n\tposition: \"relative\",\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n};\n\nconst viewportSurfaceStyle: CSSProperties = {\n\tflex: 1,\n\tminHeight: 0,\n\tposition: \"relative\",\n\twidth: \"100%\",\n\talignSelf: \"stretch\",\n\tbackground: \"#fff\",\n\ttouchAction: \"none\",\n};\n\nfunction mergeStyle(\n\tbase: CSSProperties,\n\tstyle: CSSProperties | undefined,\n): CSSProperties {\n\treturn style ? { ...base, ...style } : base;\n}\n\nfunction vectorCanvasSpaceStyle(\n\tposition: BoardComponentPosition,\n\tinset: number,\n\tzIndex: number,\n): CSSProperties {\n\treturn {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\tpointerEvents: \"none\",\n\t};\n}\n\n/**\n * Full-viewport column shell for a vector canvas (header + body with stage).\n * Use with {@link VectorCanvasBody}, {@link VectorCanvasMain}. Pass `toolbar` on {@link VectorViewport};\n * Compose the floating tool strip with {@link VectorCanvasToolbar} around {@link VectorToolbar} (see example below).\n */\nexport function VectorCanvasRoot({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-root\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(rootStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/** Optional top chrome (title, hints, toggles). */\nexport function VectorCanvasHeader({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<header\n\t\t\tdata-slot=\"vector-canvas-header\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(headerStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</header>\n\t);\n}\n\n/** Fills remaining space below the header (typically one {@link VectorCanvasMain}). */\nexport function VectorCanvasBody({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-body\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(bodyStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/**\n * Stretch area for {@link VectorViewport} (or any child that should fill the stage).\n */\nexport function VectorCanvasMain({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-main\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(mainStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/**\n * Flex child that fills {@link VectorCanvasMain} and gives {@link VectorViewport} a bounded height\n * (white surface by default). Omit if you set the background on `Main` or the viewport yourself.\n */\nexport function VectorCanvasViewportSurface({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-viewport-surface\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(viewportSurfaceStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type VectorCanvasToolbarProps = {\n\tchildren?: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\t/** Anchor preset. @default \"bottom-center\" */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from the anchored edge(s). @default 12 */\n\tinset?: number;\n\t/** @default 30 */\n\tzIndex?: number;\n};\n\n/**\n * Floating strip anchor for {@link VectorToolbar} or custom controls. Defaults to bottom-center.\n * Renders `pointer-events: none` on the shell and `auto` on children so the canvas keeps receiving hits outside the bar.\n * Pass as the `toolbar` prop of `VectorViewport`; pick a different `position` for top / side anchoring.\n * Z-index defaults to 30 so the strip stays above zoom controls.\n */\nexport function VectorCanvasToolbar({\n\tchildren,\n\tclassName,\n\tstyle,\n\tposition = \"bottom-center\",\n\tinset = 12,\n\tzIndex = 30,\n}: VectorCanvasToolbarProps) {\n\tconst base: CSSProperties = {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\tdisplay: \"flex\",\n\t\tjustifyContent: \"center\",\n\t\talignItems: \"center\",\n\t\tmaxWidth: \"calc(100% - 24px)\",\n\t\tpointerEvents: \"none\",\n\t};\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-toolbar\"\n\t\t\tdata-position={position}\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(base, style)}\n\t\t>\n\t\t\t<div style={{ pointerEvents: \"auto\" }}>{children}</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Absolute canvas-aligned space for floating UI such as chats, rosters, inspectors, and overlays.\n * Use this instead of ad-hoc wrapper divs or plugin hosts when a feature can be expressed as React nodes.\n */\nexport function VectorCanvasSpace({\n\tchildren,\n\tclassName,\n\tstyle,\n\tposition = \"top-right\",\n\tinset = 12,\n\tzIndex = 40,\n\tcontentPointerEvents = \"auto\",\n}: VectorCanvasSpaceProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot={`vector-canvas-space-${position}`}\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(vectorCanvasSpaceStyle(position, inset, zIndex), style)}\n\t\t>\n\t\t\t<div style={{ pointerEvents: contentPointerEvents }}>{children}</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Namespaced layout primitives for composing a vector canvas shell without ad-hoc wrapper divs.\n *\n * @example\n * ```tsx\n * <VectorCanvas.Root>\n * <VectorCanvas.Header>…</VectorCanvas.Header>\n * <VectorCanvas.Body>\n * <VectorCanvas.Main>\n * <VectorCanvas.ViewportSurface>\n * <VectorViewport\n * toolbar={\n * <VectorCanvas.Toolbar>\n * <VectorToolbar … />\n * </VectorCanvas.Toolbar>\n * }\n * …\n * />\n * </VectorCanvas.ViewportSurface>\n * </VectorCanvas.Main>\n * </VectorCanvas.Body>\n * </VectorCanvas.Root>\n * ```\n */\nexport const VectorCanvas = {\n\tRoot: VectorCanvasRoot,\n\tHeader: VectorCanvasHeader,\n\tBody: VectorCanvasBody,\n\tMain: VectorCanvasMain,\n\tViewportSurface: VectorCanvasViewportSurface,\n\tToolbar: VectorCanvasToolbar,\n\tSpace: VectorCanvasSpace,\n\tNavMenu,\n\tSelectionInspector: VectorSelectionInspector,\n} as const;\n","\"use client\";\n\nimport { ChevronDown, Lock, LockOpen, Shapes } from \"lucide-react\";\nimport {\n\tChildren,\n\ttype CSSProperties,\n\tcreateContext,\n\tisValidElement,\n\ttype ReactElement,\n\ttype ReactNode,\n\ttype RefObject,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseId,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { CanvuPluginContext } from \"./plugins\";\nimport {\n\tDEFAULT_OVERFLOW_TOOL_IDS,\n\tDEFAULT_VECTOR_TOOLS,\n} from \"./tools/default-tools\";\nimport type { VectorToolDefinition } from \"./tools/types\";\n\nexport type VectorToolbarRenderContext = {\n\ttools: VectorToolDefinition[];\n\tselectedId: string;\n\tselectTool: (id: string) => void;\n\ttoolLocked: boolean;\n\tsetToolLocked: (locked: boolean) => void;\n};\n\nexport type VectorToolbarProps = {\n\t/** Controlled selection. */\n\tvalue: string;\n\tonChange: (toolId: string) => void;\n\t/** Defaults to {@link DEFAULT_VECTOR_TOOLS}. Ignored when JSX `children` are provided. */\n\ttools?: VectorToolDefinition[];\n\t/**\n\t * Tool ids placed in the overflow menu at the end of the toolbar (horizontal) or bottom (vertical).\n\t * Defaults to {@link DEFAULT_OVERFLOW_TOOL_IDS}. Pass an empty array to show every tool in the main strip.\n\t * Ignored when JSX `children` are provided.\n\t */\n\toverflowToolIds?: readonly string[];\n\t/** Accessible name for the overflow trigger (menu button). Default: `\"More tools\"`. */\n\toverflowMenuAriaLabel?: string;\n\t/** Accessible name for the toolbar landmark. */\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\t/** Layout direction. */\n\torientation?: \"horizontal\" | \"vertical\";\n\t/** Optional style for the outer `role=\"toolbar\"` element. */\n\tstyle?: CSSProperties;\n\t/** Class names applied to every tool button. */\n\tbuttonClassName?: string;\n\t/** Extra class names when that tool is selected. */\n\tactiveButtonClassName?: string;\n\t/** Shows a lock toggle that keeps current tool active after use. Ignored when JSX `children` are provided. */\n\tshowToolLockToggle?: boolean;\n\t/** Controlled lock state for tool persistence. */\n\ttoolLocked?: boolean;\n\t/** Called when lock state changes. */\n\tonToolLockedChange?: (locked: boolean) => void;\n\t/** `compact` = icon + tooltip only; `comfortable` = small caption under the icon. */\n\tdensity?: \"compact\" | \"comfortable\";\n\t/**\n\t * Toolbar contents.\n\t *\n\t * - **Render function**: full control via {@link VectorToolbarRenderContext}. Default buttons are not rendered.\n\t * - **JSX nodes** (e.g. `<VectorToolbar.Hand />`, `<VectorToolbar.Tool id=\"…\" />`): composable items.\n\t * Pick exactly which tools to render; default tool list and `showToolLockToggle` are ignored.\n\t * - **Omitted**: render the default tool strip from `tools` / {@link DEFAULT_VECTOR_TOOLS}.\n\t */\n\tchildren?: ReactNode | ((ctx: VectorToolbarRenderContext) => ReactNode);\n\t/**\n\t * Partial customization: render the content of each tool button (icon + label layout).\n\t * Default: icon with optional label below on narrow toolbars, or icon-only if `icon` is set.\n\t */\n\trenderToolButton?: (props: {\n\t\ttool: VectorToolDefinition;\n\t\tselected: boolean;\n\t\tonSelect: () => void;\n\t}) => ReactNode;\n};\n\n/**\n * Props for {@link VectorToolbar.Tool}.\n *\n * Identical to {@link VectorToolDefinition} so any tool can be rendered as\n * `<VectorToolbar.Tool {...def} />`. Use the pre-bound bindings (e.g. `<VectorToolbar.Hand />`)\n * for the built-in tools and `<VectorToolbar.Tool />` for custom ones.\n */\nexport type VectorToolbarToolProps = VectorToolDefinition & {\n\tclassName?: string;\n};\n\n/** Props for {@link VectorToolbar.ToolLock}. */\nexport type VectorToolbarToolLockProps = {\n\tclassName?: string;\n\t/** Render the trailing visual divider that separates the lock from the tools. @default true */\n\tdivider?: boolean;\n};\n\n/** Props for {@link VectorToolbar.Overflow}. */\nexport type VectorToolbarOverflowProps = {\n\t/** Tools rendered inside the dropdown (typically `<VectorToolbar.Tool />` items). */\n\tchildren: ReactNode;\n\t/** Accessible name for the overflow trigger. @default \"More tools\" */\n\tariaLabel?: string;\n};\n\ntype VectorToolbarItemContextValue = {\n\tselectedId: string;\n\tselectTool: (id: string) => void;\n\ttoolLocked: boolean;\n\tsetToolLocked: (locked: boolean) => void;\n\tdensity: \"compact\" | \"comfortable\";\n\tbuttonClassName: string;\n\tactiveButtonClassName: string;\n\trenderToolButton?: VectorToolbarProps[\"renderToolButton\"];\n\tinsideOverflow: boolean;\n\tcloseOverflow: () => void;\n\torientation: \"horizontal\" | \"vertical\";\n};\n\nconst VectorToolbarItemContext = createContext<VectorToolbarItemContextValue | null>(\n\tnull,\n);\n\nfunction useVectorToolbarItemContext(\n\tcomponentName: string,\n): VectorToolbarItemContextValue {\n\tconst ctx = useContext(VectorToolbarItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(`${componentName} must be used inside <VectorToolbar>`);\n\t}\n\treturn ctx;\n}\n\nconst toolbarStyles: CSSProperties = {\n\tdisplay: \"flex\",\n\tgap: \"4px\",\n\talignItems: \"center\",\n\tflexWrap: \"wrap\",\n\tpadding: \"6px 8px\",\n\tborderRadius: \"8px\",\n\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\tbackground: \"rgba(255,255,255,0.95)\",\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tuserSelect: \"none\",\n\tWebkitUserSelect: \"none\",\n\tWebkitTouchCallout: \"none\",\n};\n\n/** Injected once; tooltips show on hover / keyboard focus within the tool wrap. */\nconst TOOLBAR_TOOLTIP_CSS = `\n.vector-toolbar-tool-wrap {\n\tposition: relative;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n.vector-toolbar-tip {\n\tposition: absolute;\n\tleft: 50%;\n\tbottom: calc(100% + 8px);\n\ttransform: translateX(-50%);\n\tpadding: 5px 10px;\n\tfont-size: 11px;\n\tfont-weight: 600;\n\tline-height: 1.25;\n\twhite-space: nowrap;\n\tbackground: #18181b;\n\tcolor: #fafafa;\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 14px rgba(0,0,0,0.18);\n\tpointer-events: none;\n\tz-index: 100;\n\topacity: 0;\n\tvisibility: hidden;\n\ttransition: opacity 0.12s ease, visibility 0.12s ease;\n\tmax-width: min(240px, 70vw);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.vector-toolbar-tool-wrap:has(button:hover) .vector-toolbar-tip,\n.vector-toolbar-tool-wrap:has(button:focus-visible) .vector-toolbar-tip {\n\topacity: 1;\n\tvisibility: visible;\n}\n[data-slot=\"vector-canvas-toolbar\"][data-position^=\"top-\"] .vector-toolbar-tip {\n\ttop: calc(100% + 8px);\n\tbottom: auto;\n}\n`;\n\nconst OVERFLOW_MENU_CSS = `\n.vector-toolbar-overflow-panel {\n\tposition: absolute;\n\tbottom: calc(100% + 6px);\n\ttop: auto;\n\tright: 0;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, 40px);\n\tgap: 6px;\n\tpadding: 10px;\n\tborder-radius: 10px;\n\tborder: 1px solid rgba(0,0,0,0.1);\n\tbackground: rgba(255,255,255,0.98);\n\tbox-shadow:\n\t\t0 -4px 24px rgba(0,0,0,0.08),\n\t\t0 0 0 1px rgba(255,255,255,0.6) inset;\n\tz-index: 200;\n\toverflow: visible;\n}\n.vector-toolbar-overflow-anchor {\n\tposition: relative;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n.vector-toolbar-overflow-anchor .vector-toolbar-tip {\n\tleft: auto;\n\tright: 0;\n\ttransform: none;\n}\n.vector-toolbar-overflow-cell {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 40px;\n\theight: 40px;\n}\n.vector-toolbar-overflow-cell > button {\n\twidth: 100%;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n}\n.vector-toolbar-overflow-tip {\n\tposition: absolute;\n\tleft: 50%;\n\tbottom: calc(100% + 8px);\n\ttop: auto;\n\ttransform: translateX(-50%);\n\tpadding: 6px 10px;\n\tfont-size: 11px;\n\tfont-weight: 600;\n\tline-height: 1.35;\n\ttext-align: center;\n\twhite-space: normal;\n\tbackground: #18181b;\n\tcolor: #fafafa;\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 14px rgba(0,0,0,0.2);\n\tpointer-events: none;\n\tz-index: 210;\n\topacity: 0;\n\tvisibility: hidden;\n\ttransition: opacity 0.12s ease, visibility 0.12s ease;\n\tmax-width: min(220px, 70vw);\n}\n.vector-toolbar-overflow-tip-shortcut {\n\tdisplay: block;\n\tmargin-top: 2px;\n\tfont-size: 10px;\n\tfont-weight: 600;\n\tfont-variant-numeric: tabular-nums;\n\tletter-spacing: 0.04em;\n\topacity: 0.85;\n\tcolor: #a1a1aa;\n}\n.vector-toolbar-overflow-cell:has(button:hover) .vector-toolbar-overflow-tip,\n.vector-toolbar-overflow-cell:has(button:focus-visible) .vector-toolbar-overflow-tip {\n\topacity: 1;\n\tvisibility: visible;\n}\n[data-slot=\"vector-canvas-toolbar\"][data-position^=\"top-\"] .vector-toolbar-overflow-tip {\n\ttop: calc(100% + 8px);\n\tbottom: auto;\n}\n.vector-toolbar-overflow-cell > button {\n\tbackground: rgba(24,24,27,0.05);\n}\n.vector-toolbar-overflow-cell > button:hover {\n\tbackground: rgba(24,24,27,0.1);\n}\n.vector-toolbar-overflow-cell > button[aria-checked=\"true\"] {\n\tbackground: rgba(24,24,27,0.14);\n\tborder-color: rgba(24,24,27,0.22);\n\tbox-shadow: inset 0 0 0 1px rgba(24,24,27,0.08);\n}\n.vector-toolbar-overflow-cell > button[aria-checked=\"true\"]:hover {\n\tbackground: rgba(24,24,27,0.18);\n}\n.vector-toolbar-overflow-cell > button:focus-visible {\n\toutline: 2px solid rgba(24,24,27,0.35);\n\toutline-offset: 1px;\n}\n`;\n\n/** Narrow viewports: single-row scroll strip, tighter chrome, safe overflow palette width. */\nconst TOOLBAR_MOBILE_CSS = `\n@media (max-width: 639px) {\n\t.vector-toolbar[data-orientation=\"horizontal\"] {\n\t\tflex-wrap: nowrap;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tpadding: 4px 4px;\n\t\tmax-width: 100%;\n\t\toverflow-x: auto;\n\t\toverflow-y: hidden;\n\t\t-webkit-overflow-scrolling: touch;\n\t\toverscroll-behavior-x: contain;\n\t\ttouch-action: pan-x;\n\t\tscrollbar-width: none;\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"]::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"] .vector-toolbar-spacer {\n\t\tflex: 1 1 4px;\n\t\tmin-width: 2px;\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"] .vector-toolbar-tool-wrap button {\n\t\tmin-width: 38px;\n\t\tmin-height: 38px;\n\t\tpadding: 4px 5px;\n\t}\n\t.vector-toolbar-overflow-panel {\n\t\tmax-width: min(calc(100vw - 16px), 260px);\n\t\tright: 0;\n\t\tleft: auto;\n\t\tgrid-template-columns: repeat(3, 36px);\n\t\tgap: 5px;\n\t\tpadding: 8px;\n\t}\n\t.vector-toolbar-overflow-cell {\n\t\twidth: 36px;\n\t\theight: 36px;\n\t}\n\t.vector-toolbar-overflow-tip {\n\t\tfont-size: 10px;\n\t\tpadding: 5px 8px;\n\t\tmax-width: min(200px, 85vw);\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"] button.vector-toolbar-overflow-trigger {\n\t\tmin-width: 40px !important;\n\t\tmin-height: 38px !important;\n\t\tpadding: 4px 6px !important;\n\t}\n}\n`;\n\nconst defaultButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\tflexDirection: \"column\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tgap: \"2px\",\n\tminWidth: \"44px\",\n\tminHeight: \"44px\",\n\tpadding: \"4px 6px\",\n\tborderWidth: \"1px\",\n\tborderStyle: \"solid\",\n\tborderColor: \"transparent\",\n\tborderRadius: \"6px\",\n\tbackground: \"transparent\",\n\tcursor: \"pointer\",\n\tfontSize: \"10px\",\n\tcolor: \"#18181b\",\n\toutline: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n\tuserSelect: \"none\",\n\tWebkitUserSelect: \"none\",\n\tWebkitTouchCallout: \"none\",\n};\n\nconst toolLockDividerStyle: CSSProperties = {\n\twidth: 1,\n\talignSelf: \"stretch\",\n\tbackground: \"rgba(24,24,27,0.14)\",\n\tmargin: \"4px 6px\",\n};\n\nconst overflowSpacerStyle: CSSProperties = {\n\tflex: \"1 1 0\",\n\tminWidth: \"8px\",\n\tminHeight: \"8px\",\n};\n\n/** Icon-only grid tile inside the overflow palette (surface + border from CSS). */\nconst overflowGridCellButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tpadding: 0,\n\tborderWidth: \"1px\",\n\tborderStyle: \"solid\",\n\tborderColor: \"transparent\",\n\tborderRadius: \"8px\",\n\tcursor: \"pointer\",\n\tcolor: \"#18181b\",\n\toutline: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\n/** Style overlay applied to a toolbar button when its tool is active / locked / open. */\nconst activeToggleStyle: CSSProperties = {\n\tbackground: \"rgba(24,24,27,0.1)\",\n\tborderColor: \"rgba(24,24,27,0.28)\",\n\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\n};\n\nconst inactiveToggleStyle: CSSProperties = {\n\tborderColor: \"transparent\",\n\tboxShadow: \"none\",\n};\n\n/**\n * Block the default mousedown-induced focus shift so the surrounding viewport\n * keeps focus while the user picks a tool. No-op for touch / pen so virtual\n * keyboards and pencil affordances behave normally.\n */\nfunction preventMouseDefault(e: React.PointerEvent) {\n\tif (e.pointerType === \"mouse\") {\n\t\te.preventDefault();\n\t}\n}\n\nfunction ToolLockGlyph({ locked }: { locked: boolean }) {\n\tconst Icon = locked ? Lock : LockOpen;\n\treturn <Icon size={18} strokeWidth={2} aria-hidden />;\n}\n\nfunction splitToolbarTools(\n\ttools: VectorToolDefinition[],\n\toverflowIds: readonly string[],\n): { primary: VectorToolDefinition[]; overflow: VectorToolDefinition[] } {\n\tif (overflowIds.length === 0) {\n\t\treturn { primary: tools, overflow: [] };\n\t}\n\tconst overflowSet = new Set<string>(overflowIds);\n\tconst primary = tools.filter((t) => !overflowSet.has(t.id));\n\tconst overflow = overflowIds\n\t\t.map((id) => tools.find((t) => t.id === id))\n\t\t.filter((t): t is VectorToolDefinition => Boolean(t));\n\treturn { primary, overflow };\n}\n\n/**\n * Tracks the last overflow-menu tool the user picked so we can surface it as a\n * dedicated button next to the overflow trigger. `overflowTools` comes from\n * a `useMemo` upstream — its identity changes when the tool list changes,\n * which is exactly when this effect should re-run, so listing it in the deps\n * array is correct (not a stable-reference smell).\n */\nfunction usePromotedOverflowTool({\n\toverflowTools,\n\tselectedId,\n\tinitialPromotedId,\n}: {\n\toverflowTools: VectorToolDefinition[];\n\tselectedId: string;\n\tinitialPromotedId: string | null;\n}): {\n\tpromotedTool: VectorToolDefinition | undefined;\n\tremainingOverflowTools: VectorToolDefinition[];\n} {\n\tconst [lastOverflowToolId, setLastOverflowToolId] = useState<string | null>(() => {\n\t\tif (initialPromotedId == null) return null;\n\t\treturn overflowTools.some((t) => t.id === initialPromotedId)\n\t\t\t? initialPromotedId\n\t\t\t: null;\n\t});\n\tuseEffect(() => {\n\t\tif (overflowTools.some((t) => t.id === selectedId)) {\n\t\t\tsetLastOverflowToolId(selectedId);\n\t\t}\n\t}, [selectedId, overflowTools]);\n\n\tconst promotedTool = lastOverflowToolId\n\t\t? overflowTools.find((t) => t.id === lastOverflowToolId)\n\t\t: undefined;\n\tconst remainingOverflowTools = promotedTool\n\t\t? overflowTools.filter((t) => t.id !== promotedTool.id)\n\t\t: overflowTools;\n\treturn { promotedTool, remainingOverflowTools };\n}\n\nconst icOverflow = { size: 18, strokeWidth: 2 } as const;\n\ntype UseOverflowDropdownResult = {\n\topen: boolean;\n\tsetOpen: React.Dispatch<React.SetStateAction<boolean>>;\n\tclose: () => void;\n\twrapRef: RefObject<HTMLDivElement | null>;\n\ttriggerRef: RefObject<HTMLButtonElement | null>;\n\tmenuId: string;\n};\n\n/** Shared open/close logic for the overflow dropdown (outside-click, Escape, focus restore). */\nfunction useOverflowDropdown(): UseOverflowDropdownResult {\n\tconst [open, setOpen] = useState(false);\n\tconst wrapRef = useRef<HTMLDivElement>(null);\n\tconst triggerRef = useRef<HTMLButtonElement>(null);\n\tconst menuId = useId();\n\n\tconst close = useCallback(() => {\n\t\tsetOpen(false);\n\t}, []);\n\n\tconst prevOpenRef = useRef(open);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst onDocPointerDown = (e: PointerEvent) => {\n\t\t\tif (wrapRef.current?.contains(e.target as Node)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclose();\n\t\t};\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\te.stopPropagation();\n\t\t\t\tclose();\n\t\t\t\ttriggerRef.current?.focus();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"pointerdown\", onDocPointerDown, true);\n\t\tdocument.addEventListener(\"keydown\", onKeyDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"pointerdown\", onDocPointerDown, true);\n\t\t\tdocument.removeEventListener(\"keydown\", onKeyDown, true);\n\t\t};\n\t}, [open, close]);\n\n\tuseEffect(() => {\n\t\tif (prevOpenRef.current && !open) {\n\t\t\ttriggerRef.current?.focus({ preventScroll: true });\n\t\t}\n\t\tprevOpenRef.current = open;\n\t}, [open]);\n\n\treturn { open, setOpen, close, wrapRef, triggerRef, menuId };\n}\n\ntype InlineButtonContext = Pick<\n\tVectorToolbarItemContextValue,\n\t| \"selectedId\"\n\t| \"selectTool\"\n\t| \"density\"\n\t| \"buttonClassName\"\n\t| \"activeButtonClassName\"\n\t| \"renderToolButton\"\n>;\n\n/** Renders one tool in the primary toolbar row. Pure — drives button styles from `density` and active state. */\nfunction renderInlineToolButton(\n\ttool: VectorToolDefinition,\n\tctx: InlineButtonContext,\n): ReactNode {\n\tconst {\n\t\tselectedId,\n\t\tselectTool,\n\t\tdensity,\n\t\tbuttonClassName,\n\t\tactiveButtonClassName,\n\t\trenderToolButton,\n\t} = ctx;\n\tconst selected = tool.id === selectedId;\n\tconst label = tool.ariaLabel ?? tool.label;\n\n\tif (renderToolButton) {\n\t\treturn (\n\t\t\t<div key={tool.id}>\n\t\t\t\t{renderToolButton({\n\t\t\t\t\ttool,\n\t\t\t\t\tselected,\n\t\t\t\t\tonSelect: () => selectTool(tool.id),\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\tconst tooltipText =\n\t\ttool.shortcutHint !== undefined\n\t\t\t? `${tooltipName} · ${tool.shortcutHint}`\n\t\t\t: tooltipName;\n\n\tconst labelOnly = tool.icon == null;\n\tconst labelTextStyle: CSSProperties = labelOnly\n\t\t? {\n\t\t\t\tfontSize: \"12px\",\n\t\t\t\tfontWeight: 600,\n\t\t\t\tletterSpacing: \"0.02em\",\n\t\t\t\tlineHeight: 1.2,\n\t\t\t\tWebkitFontSmoothing: \"antialiased\",\n\t\t\t\tMozOsxFontSmoothing: \"grayscale\",\n\t\t\t\ttextRendering: \"geometricPrecision\",\n\t\t\t}\n\t\t: {};\n\n\treturn (\n\t\t<span key={tool.id} className=\"vector-toolbar-tool-wrap\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-pressed={selected}\n\t\t\t\taria-label={label}\n\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t: {})}\n\t\t\t\tclassName={`${buttonClassName} ${selected ? activeButtonClassName : \"\"}`.trim()}\n\t\t\t\tstyle={{\n\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t...(density === \"compact\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tminHeight: \"40px\",\n\t\t\t\t\t\t\t\tminWidth: labelOnly ? \"52px\" : \"40px\",\n\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(selected ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t}}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={() => selectTool(tool.id)}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{tool.icon ?? <span style={labelTextStyle}>{tool.label}</span>}\n\t\t\t\t</span>\n\t\t\t\t{density === \"comfortable\" && tool.icon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t\tmaxWidth: \"56px\",\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tool.label}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</button>\n\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t{tooltipText}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\ntype OverflowButtonContext = {\n\tselectedId: string;\n\tselectTool: (id: string) => void;\n\tcloseMenu: () => void;\n\trenderToolButton?: VectorToolbarProps[\"renderToolButton\"];\n\ttabIndex?: number;\n};\n\n/** Renders one tool inside the overflow grid cell. */\nfunction renderOverflowToolButton(\n\ttool: VectorToolDefinition,\n\tctx: OverflowButtonContext,\n): ReactNode {\n\tconst { selectedId, selectTool, closeMenu, renderToolButton, tabIndex } = ctx;\n\tconst selected = tool.id === selectedId;\n\tconst label = tool.ariaLabel ?? tool.label;\n\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\n\tif (renderToolButton) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={tool.id}\n\t\t\t\tclassName=\"vector-toolbar-overflow-cell\"\n\t\t\t\trole=\"presentation\"\n\t\t\t>\n\t\t\t\t{renderToolButton({\n\t\t\t\t\ttool,\n\t\t\t\t\tselected,\n\t\t\t\t\tonSelect: () => {\n\t\t\t\t\t\tselectTool(tool.id);\n\t\t\t\t\t\tcloseMenu();\n\t\t\t\t\t},\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div key={tool.id} className=\"vector-toolbar-overflow-cell\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"menuitemradio\"\n\t\t\t\taria-checked={selected}\n\t\t\t\ttabIndex={tabIndex ?? -1}\n\t\t\t\taria-label={label}\n\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t: {})}\n\t\t\t\tstyle={overflowGridCellButtonStyle}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tselectTool(tool.id);\n\t\t\t\t\tcloseMenu();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\tlineHeight: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{tool.icon ?? (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: \"11px\",\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tlineHeight: 1.1,\n\t\t\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\t\t\tmaxWidth: \"34px\",\n\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{tool.label.slice(0, 3)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"vector-toolbar-overflow-tip\" aria-hidden=\"true\">\n\t\t\t\t\t<span>{tooltipName}</span>\n\t\t\t\t\t{tool.shortcutHint !== undefined ? (\n\t\t\t\t\t\t<span className=\"vector-toolbar-overflow-tip-shortcut\">\n\t\t\t\t\t\t\t{tool.shortcutHint}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction hasToolIdProp(value: unknown): value is { toolId: string } {\n\treturn (\n\t\ttypeof value === \"function\" &&\n\t\t\"toolId\" in value &&\n\t\ttypeof (value as { toolId: unknown }).toolId === \"string\"\n\t);\n}\n\n/**\n * Inspects each child of `<VectorToolbar.Overflow>` and returns a partial tool\n * definition for the one whose id matches `selectedId`. Used to highlight the\n * trigger and show the active tool's icon when the dropdown is closed.\n *\n * Recognized child types:\n * - Pre-bound bindings (e.g. `<VectorToolbar.Hand />`): identified by a\n * `toolId` static property on the component function.\n * - `<VectorToolbar.Tool>` and any element whose props carry `id`/`icon`/`label`.\n */\nfunction findActiveOverflowChild(\n\tchildren: ReactNode,\n\tselectedId: string,\n): { id: string; label: string; icon: ReactNode } | null {\n\tlet result: { id: string; label: string; icon: ReactNode } | null = null;\n\tChildren.forEach(children, (child) => {\n\t\tif (result || !isValidElement(child)) {\n\t\t\treturn;\n\t\t}\n\t\tconst childType: unknown = child.type;\n\t\tlet toolId: string | undefined;\n\t\tlet label = \"\";\n\t\tlet icon: ReactNode = null;\n\n\t\tconst childProps = (child.props ?? {}) as Partial<VectorToolDefinition>;\n\t\tif (hasToolIdProp(childType)) {\n\t\t\ttoolId = childType.toolId;\n\t\t\tconst def = DEFAULT_VECTOR_TOOLS.find((t) => t.id === toolId);\n\t\t\tif (def) {\n\t\t\t\tlabel = def.label;\n\t\t\t\ticon = def.icon ?? null;\n\t\t\t}\n\t\t} else {\n\t\t\ttoolId = childProps.id;\n\t\t\tlabel = childProps.label ?? \"\";\n\t\t\ticon = childProps.icon ?? null;\n\t\t}\n\n\t\tif (childProps.icon !== undefined) {\n\t\t\ticon = childProps.icon;\n\t\t}\n\t\tif (childProps.label !== undefined && childProps.label !== \"\") {\n\t\t\tlabel = childProps.label;\n\t\t}\n\n\t\tif (toolId !== undefined && toolId === selectedId) {\n\t\t\tresult = { id: toolId, label, icon };\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * A single tool inside `<VectorToolbar>`. Use the pre-bound bindings for built-in tools\n * (e.g. `<VectorToolbar.Hand />`) or this component for custom ones.\n *\n * Automatically adapts its layout based on whether it sits in the primary strip or inside\n * an `<VectorToolbar.Overflow>` dropdown.\n *\n * @example\n * ```tsx\n * <VectorToolbar value={toolId} onChange={setToolId}>\n * <VectorToolbar.Tool id=\"my-tool\" label=\"Custom\" icon={<MyIcon />} shortcutHint=\"C\" />\n * </VectorToolbar>\n * ```\n */\nexport function VectorToolbarTool(props: VectorToolbarToolProps) {\n\tconst ctx = useVectorToolbarItemContext(\"VectorToolbar.Tool\");\n\tconst tool: VectorToolDefinition = {\n\t\tid: props.id,\n\t\tlabel: props.label,\n\t\ttooltipLabel: props.tooltipLabel,\n\t\ticon: props.icon,\n\t\tshortcutHint: props.shortcutHint,\n\t\tariaLabel: props.ariaLabel,\n\t};\n\n\tif (ctx.insideOverflow) {\n\t\treturn renderOverflowToolButton(tool, {\n\t\t\tselectedId: ctx.selectedId,\n\t\t\tselectTool: ctx.selectTool,\n\t\t\tcloseMenu: ctx.closeOverflow,\n\t\t\trenderToolButton: ctx.renderToolButton,\n\t\t});\n\t}\n\n\treturn renderInlineToolButton(tool, {\n\t\tselectedId: ctx.selectedId,\n\t\tselectTool: ctx.selectTool,\n\t\tdensity: ctx.density,\n\t\tbuttonClassName: ctx.buttonClassName,\n\t\tactiveButtonClassName: ctx.activeButtonClassName,\n\t\trenderToolButton: ctx.renderToolButton,\n\t});\n}\n\n/**\n * Lock toggle button. When on, the active tool persists after each use instead of\n * auto-reverting to the previous tool.\n */\nexport function VectorToolbarToolLock({\n\tclassName,\n\tdivider = true,\n}: VectorToolbarToolLockProps = {}) {\n\tconst ctx = useVectorToolbarItemContext(\"VectorToolbar.ToolLock\");\n\tconst {\n\t\ttoolLocked,\n\t\tsetToolLocked,\n\t\tbuttonClassName,\n\t\tactiveButtonClassName,\n\t\tdensity,\n\t} = ctx;\n\treturn (\n\t\t<>\n\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={toolLocked}\n\t\t\t\t\taria-label={toolLocked ? \"Unlock tool\" : \"Lock tool\"}\n\t\t\t\t\tclassName={`${buttonClassName} ${toolLocked ? activeButtonClassName : \"\"} ${className ?? \"\"}`.trim()}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\t...(density === \"compact\"\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tminHeight: \"40px\",\n\t\t\t\t\t\t\t\t\tminWidth: \"40px\",\n\t\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t...(toolLocked ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\tonClick={() => setToolLocked(!toolLocked)}\n\t\t\t\t>\n\t\t\t\t\t<ToolLockGlyph locked={toolLocked} />\n\t\t\t\t</button>\n\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t{toolLocked ? \"Tool lock on\" : \"Tool lock off\"}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t{divider ? <span aria-hidden style={toolLockDividerStyle} /> : null}\n\t\t</>\n\t);\n}\n\n/**\n * Composable overflow dropdown. Children render inside a 3-column grid revealed when the user\n * clicks the chevron trigger. The trigger highlights itself when its currently active child is selected.\n *\n * @example\n * ```tsx\n * <VectorToolbar value={toolId} onChange={setToolId}>\n * <VectorToolbar.Hand />\n * <VectorToolbar.Overflow>\n * <VectorToolbar.Rect />\n * <VectorToolbar.Ellipse />\n * </VectorToolbar.Overflow>\n * </VectorToolbar>\n * ```\n */\nexport function VectorToolbarOverflow({\n\tchildren,\n\tariaLabel = \"More tools\",\n}: VectorToolbarOverflowProps) {\n\tconst ctx = useVectorToolbarItemContext(\"VectorToolbar.Overflow\");\n\tconst { open, setOpen, close, wrapRef, triggerRef, menuId } =\n\t\tuseOverflowDropdown();\n\n\tif (ctx.insideOverflow) {\n\t\tthrow new Error(\"VectorToolbar.Overflow cannot be nested.\");\n\t}\n\n\tconst activeChild = findActiveOverflowChild(children, ctx.selectedId);\n\tconst triggerHighlighted = open || activeChild !== null;\n\tconst customRenderer = Boolean(ctx.renderToolButton);\n\n\tconst nestedCtx: VectorToolbarItemContextValue = {\n\t\t...ctx,\n\t\tinsideOverflow: true,\n\t\tcloseOverflow: close,\n\t};\n\n\treturn (\n\t\t<div ref={wrapRef} className=\"vector-toolbar-overflow-anchor\">\n\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t<button\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tid={`${menuId}-trigger`}\n\t\t\t\t\taria-haspopup={customRenderer ? \"true\" : \"menu\"}\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\taria-controls={open ? `${menuId}-menu` : undefined}\n\t\t\t\t\taria-label={activeChild ? `${ariaLabel}: ${activeChild.label}` : ariaLabel}\n\t\t\t\t\tclassName={`vector-toolbar-overflow-trigger ${ctx.buttonClassName} ${triggerHighlighted ? ctx.activeButtonClassName : \"\"}`.trim()}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\tflexDirection: \"row\",\n\t\t\t\t\t\tminWidth: \"48px\",\n\t\t\t\t\t\tminHeight: ctx.density === \"compact\" ? \"40px\" : \"44px\",\n\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\tgap: \"4px\",\n\t\t\t\t\t\t...(triggerHighlighted ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\tonClick={() => setOpen((o) => !o)}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (e.key === \"ArrowDown\" && !open) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{activeChild?.icon ?? (\n\t\t\t\t\t\t\t<Shapes {...icOverflow} aria-hidden strokeWidth={2} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: 0.75,\n\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\ttransform: open ? \"rotate(180deg)\" : undefined,\n\t\t\t\t\t\t\ttransition: \"transform 0.15s ease\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t{ariaLabel}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t{open ? (\n\t\t\t\tcustomRenderer ? (\n\t\t\t\t\t<section\n\t\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<VectorToolbarItemContext.Provider value={nestedCtx}>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</VectorToolbarItemContext.Provider>\n\t\t\t\t\t</section>\n\t\t\t\t) : (\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<VectorToolbarItemContext.Provider value={nestedCtx}>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</VectorToolbarItemContext.Provider>\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\ntype OverflowMenuProps = {\n\ttools: VectorToolDefinition[];\n\tselectedId: string;\n\tonSelect: (id: string) => void;\n\tdensity: \"compact\" | \"comfortable\";\n\tbuttonClassName: string;\n\tactiveButtonClassName: string;\n\trenderToolButton?: VectorToolbarProps[\"renderToolButton\"];\n\tmenuAriaLabel: string;\n};\n\n/** Default overflow menu used by `VectorToolbar` when no JSX children are provided. */\nfunction ToolbarOverflowMenu({\n\ttools,\n\tselectedId,\n\tonSelect,\n\tdensity,\n\tbuttonClassName,\n\tactiveButtonClassName,\n\trenderToolButton,\n\tmenuAriaLabel,\n}: OverflowMenuProps) {\n\tconst { open, setOpen, close, wrapRef, triggerRef, menuId } =\n\t\tuseOverflowDropdown();\n\n\tconst activeInOverflow = tools.some((t) => t.id === selectedId);\n\tconst activeTool = tools.find((t) => t.id === selectedId);\n\n\tconst triggerHighlighted = open || activeInOverflow;\n\n\treturn (\n\t\t<div ref={wrapRef} className=\"vector-toolbar-overflow-anchor\">\n\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t<button\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tid={`${menuId}-trigger`}\n\t\t\t\t\taria-haspopup={renderToolButton ? \"true\" : \"menu\"}\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\taria-controls={open ? `${menuId}-menu` : undefined}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tactiveTool\n\t\t\t\t\t\t\t? `${menuAriaLabel}: ${activeTool.ariaLabel ?? activeTool.label}`\n\t\t\t\t\t\t\t: menuAriaLabel\n\t\t\t\t\t}\n\t\t\t\t\tclassName={`vector-toolbar-overflow-trigger ${buttonClassName} ${triggerHighlighted ? activeButtonClassName : \"\"}`.trim()}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\tflexDirection: \"row\",\n\t\t\t\t\t\tminWidth: \"48px\",\n\t\t\t\t\t\tminHeight: density === \"compact\" ? \"40px\" : \"44px\",\n\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\tgap: \"4px\",\n\t\t\t\t\t\t...(triggerHighlighted ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\tonClick={() => setOpen((o) => !o)}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (e.key === \"ArrowDown\" && !open) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{activeTool?.icon ?? (\n\t\t\t\t\t\t\t<Shapes {...icOverflow} aria-hidden strokeWidth={2} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: 0.75,\n\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\ttransform: open ? \"rotate(180deg)\" : undefined,\n\t\t\t\t\t\t\ttransition: \"transform 0.15s ease\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t{menuAriaLabel}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t{open && renderToolButton ? (\n\t\t\t\t<section\n\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\taria-label={menuAriaLabel}\n\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t>\n\t\t\t\t\t{tools.map((tool) =>\n\t\t\t\t\t\trenderOverflowToolButton(tool, {\n\t\t\t\t\t\t\tselectedId,\n\t\t\t\t\t\t\tselectTool: onSelect,\n\t\t\t\t\t\t\tcloseMenu: close,\n\t\t\t\t\t\t\trenderToolButton,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)}\n\t\t\t\t</section>\n\t\t\t) : null}\n\t\t\t{open && !renderToolButton ? (\n\t\t\t\t<div\n\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\trole=\"menu\"\n\t\t\t\t\taria-label={menuAriaLabel}\n\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t>\n\t\t\t\t\t{tools.map((tool, index) =>\n\t\t\t\t\t\trenderOverflowToolButton(tool, {\n\t\t\t\t\t\t\tselectedId,\n\t\t\t\t\t\t\tselectTool: onSelect,\n\t\t\t\t\t\t\tcloseMenu: close,\n\t\t\t\t\t\t\ttabIndex: index === 0 ? 0 : -1,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\n/**\n * Default floating-style toolbar for choosing vector tools (hand, shapes, draw, marker, text, …).\n *\n * Three modes:\n * - **Default** (no `children`): renders the full tool strip from `tools` / {@link DEFAULT_VECTOR_TOOLS},\n * with the standard overflow dropdown and optional lock toggle.\n * - **Composable** (JSX `children`): pick exactly which items to render\n * (e.g. `<VectorToolbar.Hand />`, `<VectorToolbar.Overflow>…</VectorToolbar.Overflow>`).\n * - **Render-prop** (`children` is a function): full control. The default chrome is not rendered.\n *\n * @example\n * ```tsx\n * const [tool, setTool] = useState(\"hand\");\n *\n * // Default\n * <VectorToolbar value={tool} onChange={setTool} aria-label=\"Canvas tools\" />\n *\n * // Composable\n * <VectorToolbar value={tool} onChange={setTool}>\n * <VectorToolbar.ToolLock />\n * <VectorToolbar.Hand />\n * <VectorToolbar.Select />\n * <VectorToolbar.Draw />\n * <VectorToolbar.Overflow>\n * <VectorToolbar.Rect />\n * <VectorToolbar.Ellipse />\n * </VectorToolbar.Overflow>\n * </VectorToolbar>\n * ```\n */\nfunction VectorToolbarComponent({\n\tvalue,\n\tonChange,\n\ttools,\n\toverflowToolIds = DEFAULT_OVERFLOW_TOOL_IDS,\n\toverflowMenuAriaLabel = \"More tools\",\n\t\"aria-label\": ariaLabel = \"Canvas tools\",\n\tclassName = \"\",\n\torientation = \"horizontal\",\n\tstyle,\n\tbuttonClassName = \"\",\n\tactiveButtonClassName = \"\",\n\tshowToolLockToggle = true,\n\ttoolLocked = false,\n\tonToolLockedChange,\n\tdensity = \"compact\",\n\tchildren,\n\trenderToolButton,\n}: VectorToolbarProps) {\n\tconst pluginContext = useContext(CanvuPluginContext);\n\tconst runtimeTools = pluginContext?.resolvedTools;\n\tconst resolvedTools = tools ?? runtimeTools ?? DEFAULT_VECTOR_TOOLS;\n\n\t/**\n\t * Compute the overflow split + promoted-tool state up here so the\n\t * `usePromotedOverflowTool` hook runs unconditionally on every render.\n\t * The two early-return paths below don't use these values, but moving the\n\t * hook above them is what satisfies the Rules of Hooks.\n\t */\n\tconst { primary: primaryTools, overflow: overflowTools } = splitToolbarTools(\n\t\tresolvedTools,\n\t\toverflowToolIds,\n\t);\n\tconst { promotedTool, remainingOverflowTools } = usePromotedOverflowTool({\n\t\toverflowTools,\n\t\tselectedId: value,\n\t\tinitialPromotedId: overflowToolIds[0] ?? null,\n\t});\n\n\tif (typeof children === \"function\") {\n\t\tconst ctx: VectorToolbarRenderContext = {\n\t\t\ttools: resolvedTools,\n\t\t\tselectedId: value,\n\t\t\tselectTool: onChange,\n\t\t\ttoolLocked,\n\t\t\tsetToolLocked: (locked: boolean) => onToolLockedChange?.(locked),\n\t\t};\n\t\treturn (\n\t\t\t<div className={className} style={style}>\n\t\t\t\t{children(ctx)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst flexDir = orientation === \"vertical\" ? \"column\" : \"row\";\n\tconst toolbarClass =\n\t\tclassName.trim() === \"\"\n\t\t\t? \"vector-toolbar\"\n\t\t\t: `vector-toolbar ${className.trim()}`;\n\n\tif (children !== undefined && children !== null) {\n\t\tconst itemCtx: VectorToolbarItemContextValue = {\n\t\t\tselectedId: value,\n\t\t\tselectTool: onChange,\n\t\t\ttoolLocked,\n\t\t\tsetToolLocked: (locked: boolean) => onToolLockedChange?.(locked),\n\t\t\tdensity,\n\t\t\tbuttonClassName,\n\t\t\tactiveButtonClassName,\n\t\t\trenderToolButton,\n\t\t\tinsideOverflow: false,\n\t\t\tcloseOverflow: noop,\n\t\t\torientation,\n\t\t};\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<style>{TOOLBAR_TOOLTIP_CSS}</style>\n\t\t\t\t<style>{OVERFLOW_MENU_CSS}</style>\n\t\t\t\t<style>{TOOLBAR_MOBILE_CSS}</style>\n\t\t\t\t<div\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\tdata-orientation={orientation}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-orientation={orientation === \"vertical\" ? \"vertical\" : \"horizontal\"}\n\t\t\t\t\tclassName={toolbarClass}\n\t\t\t\t\tstyle={{ ...toolbarStyles, flexDirection: flexDir, ...style }}\n\t\t\t\t>\n\t\t\t\t\t<VectorToolbarItemContext.Provider value={itemCtx}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</VectorToolbarItemContext.Provider>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t);\n\t}\n\n\tconst showOverflowMenu = overflowTools.length > 0;\n\tconst showOverflowDropdown = remainingOverflowTools.length > 0;\n\n\tconst inlineCtx: InlineButtonContext = {\n\t\tselectedId: value,\n\t\tselectTool: onChange,\n\t\tdensity,\n\t\tbuttonClassName,\n\t\tactiveButtonClassName,\n\t\trenderToolButton,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<style>{TOOLBAR_TOOLTIP_CSS}</style>\n\t\t\t<style>{OVERFLOW_MENU_CSS}</style>\n\t\t\t<style>{TOOLBAR_MOBILE_CSS}</style>\n\t\t\t<div\n\t\t\t\trole=\"toolbar\"\n\t\t\t\tdata-orientation={orientation}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-orientation={orientation === \"vertical\" ? \"vertical\" : \"horizontal\"}\n\t\t\t\tclassName={toolbarClass}\n\t\t\t\tstyle={{ ...toolbarStyles, flexDirection: flexDir, ...style }}\n\t\t\t>\n\t\t\t\t{showToolLockToggle ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={toolLocked}\n\t\t\t\t\t\t\t\taria-label={toolLocked ? \"Unlock tool\" : \"Lock tool\"}\n\t\t\t\t\t\t\t\tclassName={`${buttonClassName} ${toolLocked ? activeButtonClassName : \"\"}`.trim()}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\t\t\t\t...(density === \"compact\"\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\tminHeight: \"40px\",\n\t\t\t\t\t\t\t\t\t\t\t\tminWidth: \"40px\",\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t...(toolLocked ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\t\t\t\tonClick={() => onToolLockedChange?.(!toolLocked)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ToolLockGlyph locked={toolLocked} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t{toolLocked ? \"Tool lock on\" : \"Tool lock off\"}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span aria-hidden style={toolLockDividerStyle} />\n\t\t\t\t\t</>\n\t\t\t\t) : null}\n\t\t\t\t{primaryTools.map((tool) => renderInlineToolButton(tool, inlineCtx))}\n\t\t\t\t{promotedTool ? renderInlineToolButton(promotedTool, inlineCtx) : null}\n\t\t\t\t{showOverflowMenu && orientation === \"horizontal\" ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tclassName=\"vector-toolbar-spacer\"\n\t\t\t\t\t\tstyle={overflowSpacerStyle}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t{showOverflowDropdown ? (\n\t\t\t\t\t<ToolbarOverflowMenu\n\t\t\t\t\t\ttools={remainingOverflowTools}\n\t\t\t\t\t\tselectedId={value}\n\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\tbuttonClassName={buttonClassName}\n\t\t\t\t\t\tactiveButtonClassName={activeButtonClassName}\n\t\t\t\t\t\trenderToolButton={renderToolButton}\n\t\t\t\t\t\tmenuAriaLabel={overflowMenuAriaLabel}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nfunction noop() {}\n\ntype ToolBinding = ((props?: { className?: string }) => ReactNode) & {\n\ttoolId: string;\n\tdisplayName: string;\n};\n\nfunction makeToolBinding(id: string): ToolBinding {\n\tconst def = DEFAULT_VECTOR_TOOLS.find((t) => t.id === id);\n\tif (!def) {\n\t\tthrow new Error(`No default tool with id \"${id}\"`);\n\t}\n\tconst Component: ToolBinding = ((props?: { className?: string }) => (\n\t\t<VectorToolbarTool {...def} className={props?.className} />\n\t)) as ToolBinding;\n\tComponent.toolId = id;\n\tComponent.displayName = `VectorToolbar.${def.label}`;\n\treturn Component;\n}\n\nconst HandBinding = makeToolBinding(\"hand\");\nconst SelectBinding = makeToolBinding(\"select\");\nconst RectBinding = makeToolBinding(\"rect\");\nconst EllipseBinding = makeToolBinding(\"ellipse\");\nconst ArchitecturalCloudBinding = makeToolBinding(\"architectural-cloud\");\nconst LineBinding = makeToolBinding(\"line\");\nconst ArrowBinding = makeToolBinding(\"arrow\");\nconst DrawBinding = makeToolBinding(\"draw\");\nconst MarkerBinding = makeToolBinding(\"marker\");\nconst LaserBinding = makeToolBinding(\"laser\");\nconst EraserBinding = makeToolBinding(\"eraser\");\nconst TextBinding = makeToolBinding(\"text\");\nconst ImageBinding = makeToolBinding(\"image\");\n\nVectorToolbarComponent.displayName = \"VectorToolbar\";\n\ntype VectorToolbarWithStatics = ((props: VectorToolbarProps) => ReactElement) & {\n\tTool: typeof VectorToolbarTool;\n\tToolLock: typeof VectorToolbarToolLock;\n\tOverflow: typeof VectorToolbarOverflow;\n\tHand: typeof HandBinding;\n\tSelect: typeof SelectBinding;\n\tRect: typeof RectBinding;\n\tEllipse: typeof EllipseBinding;\n\tArchitecturalCloud: typeof ArchitecturalCloudBinding;\n\tLine: typeof LineBinding;\n\tArrow: typeof ArrowBinding;\n\tDraw: typeof DrawBinding;\n\tMarker: typeof MarkerBinding;\n\tLaser: typeof LaserBinding;\n\tEraser: typeof EraserBinding;\n\tText: typeof TextBinding;\n\tImage: typeof ImageBinding;\n};\n\n/**\n * `VectorToolbar` is a function component with attached subcomponents\n * (`.Tool`, `.ToolLock`, `.Overflow`, and one binding per default tool).\n *\n * The explicit type annotation is what makes the static properties survive\n * `.d.ts` bundling — relying on TypeScript's expando-function inference loses\n * them in tsup output.\n */\nexport const VectorToolbar: VectorToolbarWithStatics = Object.assign(\n\tVectorToolbarComponent,\n\t{\n\t\tTool: VectorToolbarTool,\n\t\tToolLock: VectorToolbarToolLock,\n\t\tOverflow: VectorToolbarOverflow,\n\t\tHand: HandBinding,\n\t\tSelect: SelectBinding,\n\t\tRect: RectBinding,\n\t\tEllipse: EllipseBinding,\n\t\tArchitecturalCloud: ArchitecturalCloudBinding,\n\t\tLine: LineBinding,\n\t\tArrow: ArrowBinding,\n\t\tDraw: DrawBinding,\n\t\tMarker: MarkerBinding,\n\t\tLaser: LaserBinding,\n\t\tEraser: EraserBinding,\n\t\tText: TextBinding,\n\t\tImage: ImageBinding,\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","import type { Camera2D } from \"../camera/camera\";\n\nconst VELOCITY_SAMPLE_WINDOW = 80;\nconst FRICTION = 0.94;\nconst MIN_VELOCITY = 0.3;\n\ntype VelocitySample = { dx: number; dy: number; time: number };\n\nexport type PanMomentumController = {\n\trecordMove: (dx: number, dy: number) => void;\n\tstartMomentum: () => void;\n\tcancel: () => void;\n\treset: () => void;\n};\n\nexport function createPanMomentumController(\n\tcamera: Camera2D,\n\tonUpdate: () => void,\n\tsensitivity: number,\n): PanMomentumController {\n\tconst samples: VelocitySample[] = [];\n\tlet animationFrameId: number | null = null;\n\n\tconst cancel = () => {\n\t\tif (animationFrameId !== null) {\n\t\t\tcancelAnimationFrame(animationFrameId);\n\t\t\tanimationFrameId = null;\n\t\t}\n\t};\n\n\tconst reset = () => {\n\t\tcancel();\n\t\tsamples.length = 0;\n\t};\n\n\tconst recordMove = (dx: number, dy: number) => {\n\t\tconst now = performance.now();\n\t\tsamples.push({ dx, dy, time: now });\n\n\t\tconst cutoff = now - VELOCITY_SAMPLE_WINDOW;\n\t\tlet oldestSample = samples[0];\n\t\twhile (oldestSample && oldestSample.time < cutoff) {\n\t\t\tsamples.shift();\n\t\t\toldestSample = samples[0];\n\t\t}\n\t};\n\n\tconst computeReleaseVelocity = (): { vx: number; vy: number } => {\n\t\tif (samples.length < 2) return { vx: 0, vy: 0 };\n\n\t\tconst first = samples[0];\n\t\tconst last = samples[samples.length - 1];\n\t\tif (!first || !last) return { vx: 0, vy: 0 };\n\t\tconst elapsed = last.time - first.time;\n\t\tif (elapsed < 4) return { vx: 0, vy: 0 };\n\n\t\tlet totalDx = 0;\n\t\tlet totalDy = 0;\n\t\tfor (const sample of samples) {\n\t\t\ttotalDx += sample.dx;\n\t\t\ttotalDy += sample.dy;\n\t\t}\n\n\t\tconst msPerFrame = 1000 / 60;\n\t\treturn {\n\t\t\tvx: (totalDx / elapsed) * msPerFrame * sensitivity,\n\t\t\tvy: (totalDy / elapsed) * msPerFrame * sensitivity,\n\t\t};\n\t};\n\n\tconst startMomentum = () => {\n\t\tcancel();\n\t\tconst { vx, vy } = computeReleaseVelocity();\n\t\tsamples.length = 0;\n\n\t\tif (Math.abs(vx) < MIN_VELOCITY && Math.abs(vy) < MIN_VELOCITY) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentVx = vx;\n\t\tlet currentVy = vy;\n\n\t\tconst animate = () => {\n\t\t\tcurrentVx *= FRICTION;\n\t\t\tcurrentVy *= FRICTION;\n\n\t\t\tif (Math.abs(currentVx) < MIN_VELOCITY && Math.abs(currentVy) < MIN_VELOCITY) {\n\t\t\t\tanimationFrameId = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcamera.x += currentVx;\n\t\t\tcamera.y += currentVy;\n\t\t\tonUpdate();\n\t\t\tanimationFrameId = requestAnimationFrame(animate);\n\t\t};\n\n\t\tanimationFrameId = requestAnimationFrame(animate);\n\t};\n\n\treturn { recordMove, startMomentum, cancel, reset };\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nconst DRAWING_LIKE_TOOLS = new Set([\n\t\"draw\",\n\t\"marker\",\n\t\"annotate\",\n\t\"pen\",\n\t\"highlight\",\n\t\"rect\",\n\t\"ellipse\",\n\t\"line\",\n\t\"arrow\",\n\t\"text\",\n\t\"image\",\n]);\n\nexport type ApplePencilNavOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Current tool id from your app (e.g. `\"hand\"` vs `\"draw\"`). */\n\tgetCurrentToolId: () => string;\n\tonUpdate: () => void;\n\ttouchPanSensitivity?: number;\n};\n\n/**\n * After a **stylus** (`pointerType === \"pen\"`) has been used, finger touches on the canvas\n * pan/pinch the camera instead of passing through to drawing tools — similar to iPad behavior\n * in many design apps. No-op until the first pen contact.\n *\n * Compose with {@link attachViewportInput} by calling this **after** it so capture handlers run first,\n * or use only one of them depending on product needs.\n */\nexport function attachApplePencilNavigation(\n\toptions: ApplePencilNavOptions,\n): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tgetCurrentToolId,\n\t\tonUpdate,\n\t\ttouchPanSensitivity = 1.25,\n\t} = options;\n\n\tlet penDetected = false;\n\tconst activePenPointerIds = new Set<number>();\n\tconst blockedTouchPointerIds = new Set<number>();\n\tconst pointers = new Map<number, { x: number; y: number }>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: { x: number; y: number } | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst shouldIntercept = (e: PointerEvent): boolean => {\n\t\tif (e.pointerType !== \"touch\") return false;\n\t\tconst tool = getCurrentToolId();\n\t\tif (tool === \"hand\") return true;\n\t\treturn penDetected && DRAWING_LIKE_TOOLS.has(tool);\n\t};\n\n\tconst dist = (a: { x: number; y: number }, b: { x: number; y: number }) =>\n\t\tMath.hypot(b.x - a.x, b.y - a.y);\n\n\tconst mid = (a: { x: number; y: number }, b: { x: number; y: number }) => ({\n\t\tx: (a.x + b.x) / 2,\n\t\ty: (a.y + b.y) / 2,\n\t});\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tpenDetected = true;\n\t\t\tactivePenPointerIds.add(e.pointerId);\n\t\t\tpointers.clear();\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.cancel();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"touch\" && activePenPointerIds.size > 0) {\n\t\t\tblockedTouchPointerIds.add(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!shouldIntercept(e)) return;\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tif (pointers.size === 1) {\n\t\t\tmode = \"pan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\tcamera,\n\t\t\t\tonUpdate,\n\t\t\t\ttouchPanSensitivity,\n\t\t\t);\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = dist(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = mid(a, b);\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"idle\" || !pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst d = dist(a, b);\n\t\t\tconst m = mid(a, b);\n\t\t\tconst scale = d / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: m.x - rect.left,\n\t\t\t\ty: m.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tcamera.x += m.x - panLast.x;\n\t\t\t\tcamera.y += m.y - panLast.y;\n\t\t\t\tpanLast = m;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tactivePenPointerIds.delete(e.pointerId);\n\t\t\treturn;\n\t\t}\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\tblockedTouchPointerIds.delete(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst r = Array.from(pointers.values())[0];\n\t\t\tpanLast = r ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\telement.addEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\telement.addEventListener(\"pointermove\", onPointerMove, { capture: true });\n\telement.addEventListener(\"pointerup\", onPointerUp, { capture: true });\n\telement.addEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\t\telement.removeEventListener(\"pointermove\", onPointerMove, { capture: true });\n\t\telement.removeEventListener(\"pointerup\", onPointerUp, { capture: true });\n\t\telement.removeEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\t};\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nexport type ViewportInputOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Called after any camera mutation so the renderer can redraw. */\n\tonUpdate: () => void;\n\t/**\n\t * Element to attach the wheel listener to. Defaults to `element`.\n\t * Useful when an overlay with `pointer-events: auto` sits above `element` and\n\t * would otherwise intercept wheel events before they reach the scene container.\n\t */\n\twheelElement?: HTMLElement;\n\twheelPanSensitivity?: number;\n\t/** Multiplier applied to wheel delta for zoom (with Ctrl/Meta). */\n\twheelZoomSensitivity?: number;\n\ttouchPanSensitivity?: number;\n\t/**\n\t * When `true`, pointer events with `pointerType === \"touch\"` are ignored so another layer\n\t * (e.g. `attachApplePencilNavigation`) can handle them without double panning.\n\t */\n\ttouchHandledElsewhere?: boolean;\n\t/**\n\t * When `false`, one-finger / primary-button drag does **not** pan the camera (e.g. shape tools).\n\t * Wheel zoom and two-finger pinch still work.\n\t */\n\tallowPrimaryPointerPan?: () => boolean;\n};\n\ntype PointerRecord = { x: number; y: number };\n\nfunction distanceBetween(a: PointerRecord, b: PointerRecord): number {\n\tconst dx = b.x - a.x;\n\tconst dy = b.y - a.y;\n\treturn Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction midpoint(a: PointerRecord, b: PointerRecord): PointerRecord {\n\treturn { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n}\n\n/** Normalize wheel delta so zoom speed is similar across mice (lines) and trackpads (pixels). */\nfunction wheelDeltaPixels(delta: number, deltaMode: number): number {\n\tswitch (deltaMode) {\n\t\tcase WheelEvent.DOM_DELTA_LINE:\n\t\t\treturn delta * 16;\n\t\tcase WheelEvent.DOM_DELTA_PAGE:\n\t\t\treturn delta * 400;\n\t\tdefault:\n\t\t\treturn delta;\n\t}\n}\n\n// Trackpad fires many small deltas; mouse wheels fire one big delta per click.\n// Pass small deltas through so trackpad feel is preserved; soften large ones.\nconst TRACKPAD_MAX_DELTA = 20;\nconst MOUSE_WHEEL_DAMPING = 0.4;\n\nfunction softenWheelDelta(d: number): number {\n\tconst a = Math.abs(d);\n\tif (a <= TRACKPAD_MAX_DELTA) return d;\n\treturn (\n\t\tMath.sign(d) *\n\t\t(TRACKPAD_MAX_DELTA + (a - TRACKPAD_MAX_DELTA) * MOUSE_WHEEL_DAMPING)\n\t);\n}\n\n/**\n * Attaches wheel (pan / Ctrl+zoom), pointer drag pan, and two-finger pinch zoom.\n * Uses `touch-action: none` on `element` — set that in CSS on the same node.\n *\n * @returns A dispose function that removes all listeners.\n */\nexport function attachViewportInput(options: ViewportInputOptions): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tonUpdate,\n\t\twheelElement,\n\t\twheelPanSensitivity = 0.5,\n\t\twheelZoomSensitivity = 0.0015,\n\t\ttouchPanSensitivity = 1.25,\n\t\ttouchHandledElsewhere = false,\n\t\tallowPrimaryPointerPan = () => true,\n\t} = options;\n\n\tconst wheelTarget = wheelElement ?? element;\n\n\tconst pointers = new Map<number, PointerRecord>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" | \"mousePan\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: PointerRecord | null = null;\n\tlet mousePanButton: number | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst onWheel = (e: WheelEvent) => {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tconst dy = wheelDeltaPixels(e.deltaY, e.deltaMode);\n\t\t\t// Trackpad generates very small deltas (1-5px) vs mouse (100-200px).\n\t\t\t// Normalize so both feel responsive: amplify small deltas (trackpad).\n\t\t\tconst normDy = Math.abs(dy) < TRACKPAD_MAX_DELTA ? dy * 12 : dy;\n\t\t\tconst factor = Math.exp(-normDy * wheelZoomSensitivity);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * factor, {\n\t\t\t\tx: e.clientX - rect.left,\n\t\t\t\ty: e.clientY - rect.top,\n\t\t\t});\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst panDx = softenWheelDelta(wheelDeltaPixels(e.deltaX, e.deltaMode));\n\t\tconst panDy = softenWheelDelta(wheelDeltaPixels(e.deltaY, e.deltaMode));\n\t\tcamera.x -= (panDx * wheelPanSensitivity) / camera.zoom;\n\t\tcamera.y -= (panDy * wheelPanSensitivity) / camera.zoom;\n\t\tonUpdate();\n\t};\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\t\tconst panOk = allowPrimaryPointerPan();\n\t\tif (e.pointerType === \"mouse\" && e.button === 0) {\n\t\t\tif (!panOk) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmousePanButton = 0;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"mouse\" && e.button === 1) {\n\t\t\tmousePanButton = 1;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (pointers.size === 1 && e.pointerType === \"touch\") {\n\t\t\tif (panOk) {\n\t\t\t\tmode = \"pan\";\n\t\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\t\tcamera,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\ttouchPanSensitivity,\n\t\t\t\t);\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = distanceBetween(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = midpoint(a, b);\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\" && panLast && mousePanButton !== null) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx;\n\t\t\tcamera.y += dy;\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst dist = distanceBetween(a, b);\n\t\t\tconst mid = midpoint(a, b);\n\t\t\tconst scale = dist / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: mid.x - rect.left,\n\t\t\t\ty: mid.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tconst dx = mid.x - panLast.x;\n\t\t\t\tconst dy = mid.y - panLast.y;\n\t\t\t\tcamera.x += dx;\n\t\t\t\tcamera.y += dy;\n\t\t\t\tpanLast = mid;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\") {\n\t\t\tif (e.pointerType === \"mouse\" && e.button === mousePanButton) {\n\t\t\t\tmode = \"idle\";\n\t\t\t\tpanLast = null;\n\t\t\t\tmousePanButton = null;\n\t\t\t\ttry {\n\t\t\t\t\telement.releasePointerCapture(e.pointerId);\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore */\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst remaining = Array.from(pointers.values())[0];\n\t\t\tpanLast = remaining ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst onPointerCancel = (e: PointerEvent) => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\tonPointerUp(e);\n\t};\n\n\twheelTarget.addEventListener(\"wheel\", onWheel, { passive: false });\n\telement.addEventListener(\"pointerdown\", onPointerDown);\n\telement.addEventListener(\"pointermove\", onPointerMove);\n\telement.addEventListener(\"pointerup\", onPointerUp);\n\telement.addEventListener(\"pointercancel\", onPointerCancel);\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\twheelTarget.removeEventListener(\"wheel\", onWheel);\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown);\n\t\telement.removeEventListener(\"pointermove\", onPointerMove);\n\t\telement.removeEventListener(\"pointerup\", onPointerUp);\n\t\telement.removeEventListener(\"pointercancel\", onPointerCancel);\n\t};\n}\n","import {\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 { itemLocalToWorld, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\n\nexport type ResizeHandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nconst HANDLE_IDS: ResizeHandleId[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\n\nexport function getHandleWorldPosition(\n\tbounds: Rect,\n\tid: ResizeHandleId,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst cx = r.x + r.width / 2;\n\tconst cy = r.y + r.height / 2;\n\tswitch (id) {\n\t\tcase \"nw\":\n\t\t\treturn { x: r.x, y: r.y };\n\t\tcase \"n\":\n\t\t\treturn { x: cx, y: r.y };\n\t\tcase \"ne\":\n\t\t\treturn { x: r.x + r.width, y: r.y };\n\t\tcase \"e\":\n\t\t\treturn { x: r.x + r.width, y: cy };\n\t\tcase \"se\":\n\t\t\treturn { x: r.x + r.width, y: r.y + r.height };\n\t\tcase \"s\":\n\t\t\treturn { x: cx, y: r.y + r.height };\n\t\tcase \"sw\":\n\t\t\treturn { x: r.x, y: r.y + r.height };\n\t\tcase \"w\":\n\t\t\treturn { x: r.x, y: cy };\n\t}\n}\n\n/**\n * Hit-tests resize handles in **local** item space (handles rotation).\n */\nexport function hitTestResizeHandle(\n\tbounds: Rect,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\trotationRad: number = 0,\n): ResizeHandleId | null {\n\tconst r = normalizeRect(bounds);\n\tconst pl = worldToItemLocal(\n\t\tworldX,\n\t\tworldY,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n\tconst localBounds = { x: 0, y: 0, width: r.width, height: r.height };\n\tlet best: ResizeHandleId | null = null;\n\tlet bestD = radiusWorld;\n\tfor (const id of HANDLE_IDS) {\n\t\tconst p = getHandleWorldPosition(localBounds, id);\n\t\tconst d = Math.hypot(pl.x - p.x, pl.y - p.y);\n\t\tif (d <= bestD) {\n\t\t\tbestD = d;\n\t\t\tbest = id;\n\t\t}\n\t}\n\treturn best;\n}\n\n/** World position of a resize handle when the item is rotated around its center. */\nexport function getHandleWorldPositionRotated(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst p = getHandleWorldPosition(\n\t\t{ x: 0, y: 0, width: r.width, height: r.height },\n\t\thandle,\n\t);\n\treturn itemLocalToWorld(p.x, p.y, r.x, r.y, r.width, r.height, rotationRad);\n}\n\n/** World position of the rotation handle (above the top edge of the bounds). */\nexport function getRotationHandleWorldPosition(\n\tbounds: Rect,\n\trotationRad: number,\n\thandleOffsetWorld: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\treturn itemLocalToWorld(\n\t\tr.width / 2,\n\t\t-handleOffsetWorld,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n}\n\nexport function hitTestRotateHandle(\n\tbounds: Rect,\n\trotationRad: number,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\thandleOffsetWorld: number,\n): boolean {\n\tconst p = getRotationHandleWorldPosition(bounds, rotationRad, handleOffsetWorld);\n\treturn Math.hypot(worldX - p.x, worldY - p.y) <= radiusWorld;\n}\n\nexport function rectFromCorners(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n): Rect {\n\tconst minX = Math.min(a.x, b.x);\n\tconst maxX = Math.max(a.x, b.x);\n\tconst minY = Math.min(a.y, b.y);\n\tconst maxY = Math.max(a.y, b.y);\n\treturn { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction clampMinSize(r: Rect, min: number): Rect {\n\tconst n = normalizeRect(r);\n\treturn {\n\t\tx: n.x,\n\t\ty: n.y,\n\t\twidth: Math.max(min, n.width),\n\t\theight: Math.max(min, n.height),\n\t};\n}\n\n/**\n * Computes new axis-aligned bounds when dragging a resize handle to `currentWorld`.\n */\nexport function computeResizeBounds(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst minSize = 8;\n\n\tswitch (handle) {\n\t\tcase \"nw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y1 }), minSize);\n\t\tcase \"ne\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y1 }), minSize);\n\t\tcase \"se\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y0 }), minSize);\n\t\tcase \"sw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y0 }), minSize);\n\t\tcase \"n\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: currentWorld.y }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"s\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: x1, y: currentWorld.y }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"e\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: currentWorld.x, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"w\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: currentWorld.x, y: y0 }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n\n/**\n * Resize bounds with fixed width/height ratio (`aspect` = width ÷ height), similar to tldraw\n * image resize: corners follow the cursor by adjusting the other dimension to preserve aspect;\n * edges resize from the opposite edge with the box centered on the orthogonal axis.\n */\nexport function computeResizeBoundsFixedAspect(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n\taspect: number,\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst w = r.width;\n\tconst h = r.height;\n\tconst minSize = 8;\n\tconst a = Math.max(1e-9, aspect);\n\n\tfunction cornerAspectRect(\n\t\tanchor: { x: number; y: number },\n\t\tcursor: { x: number; y: number },\n\t): Rect {\n\t\tconst dx = cursor.x - anchor.x;\n\t\tconst dy = cursor.y - anchor.y;\n\t\tconst aw = Math.abs(dx);\n\t\tconst ah = Math.abs(dy);\n\t\tlet W: number;\n\t\tlet H: number;\n\t\tif (aw < 1e-12 && ah < 1e-12) {\n\t\t\tW = minSize;\n\t\t\tH = minSize / a;\n\t\t} else if (ah < 1e-12) {\n\t\t\tW = Math.max(minSize, aw);\n\t\t\tH = W / a;\n\t\t} else if (aw < 1e-12) {\n\t\t\tH = Math.max(minSize, ah);\n\t\t\tW = H * a;\n\t\t} else if (aw / ah > a) {\n\t\t\tW = aw;\n\t\t\tH = aw / a;\n\t\t} else {\n\t\t\tH = ah;\n\t\t\tW = ah * a;\n\t\t}\n\t\tif (W < minSize || H < minSize) {\n\t\t\tconst scale = Math.max(minSize / W, minSize / H);\n\t\t\tW *= scale;\n\t\t\tH *= scale;\n\t\t}\n\t\tconst sx = Math.sign(dx) || 1;\n\t\tconst sy = Math.sign(dy) || 1;\n\t\treturn rectFromCorners(anchor, {\n\t\t\tx: anchor.x + sx * W,\n\t\t\ty: anchor.y + sy * H,\n\t\t});\n\t}\n\n\tswitch (handle) {\n\t\tcase \"se\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y0 }, currentWorld);\n\t\tcase \"nw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y1 }, currentWorld);\n\t\tcase \"ne\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y1 }, currentWorld);\n\t\tcase \"sw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y0 }, currentWorld);\n\t\tcase \"e\": {\n\t\t\tconst rawW = currentWorld.x - x0;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({ x: x0, y: newY, width: sign * aw, height: H });\n\t\t}\n\t\tcase \"w\": {\n\t\t\tconst rawW = x1 - currentWorld.x;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: x1 - sign * aw,\n\t\t\t\ty: newY,\n\t\t\t\twidth: sign * aw,\n\t\t\t\theight: H,\n\t\t\t});\n\t\t}\n\t\tcase \"n\": {\n\t\t\tconst rawH = y1 - currentWorld.y;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: newX,\n\t\t\t\ty: y1 - sign * ah,\n\t\t\t\twidth: W,\n\t\t\t\theight: sign * ah,\n\t\t\t});\n\t\t}\n\t\tcase \"s\": {\n\t\t\tconst rawH = currentWorld.y - y0;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({ x: newX, y: y0, width: W, height: sign * ah });\n\t\t}\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n","import {\n\tgetItemRotationRad,\n\titemLocalToWorld,\n\tworldToItemLocal,\n} from \"../math/item-transform\";\nimport 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","import { getItemRotationRad, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tbuildArchitecturalCloudSvg,\n\tbuildArrowSvg,\n\tbuildEllipseSvg,\n\tbuildLineSvg,\n\tbuildRasterImageChildrenSvg,\n\tbuildRectSvg,\n\trebuildItemSvg,\n\tresolveStrokeStyle,\n} from \"../scene/shape-builders\";\nimport { DEFAULT_TEXT_FONT_SIZE } from \"../scene/text-svg\";\nimport type { LineEndpointsLocal, VectorSceneItem } from \"../scene/types\";\nimport {\n\tcomputeResizeBounds,\n\tcomputeResizeBoundsFixedAspect,\n\ttype ResizeHandleId,\n} from \"./resize-handles\";\n\nfunction computeNewBoundsForResize(\n\titem: VectorSceneItem,\n\tsb: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): Rect {\n\tconst rot = getItemRotationRad(item);\n\tif (Math.abs(rot) < 1e-12) {\n\t\tif (item.toolKind === \"image\") {\n\t\t\tlet aspect: number | undefined;\n\t\t\tif (item.imageIntrinsicSize) {\n\t\t\t\tconst iw = Math.max(1e-9, item.imageIntrinsicSize.width);\n\t\t\t\tconst ih = Math.max(1e-9, item.imageIntrinsicSize.height);\n\t\t\t\taspect = iw / ih;\n\t\t\t} else if (item.imageVectorLocalSize) {\n\t\t\t\tconst lw = Math.max(1e-9, item.imageVectorLocalSize.width);\n\t\t\t\tconst lh = Math.max(1e-9, item.imageVectorLocalSize.height);\n\t\t\t\taspect = lw / lh;\n\t\t\t}\n\t\t\treturn aspect !== undefined\n\t\t\t\t? computeResizeBoundsFixedAspect(sb, handle, currentWorld, aspect)\n\t\t\t\t: computeResizeBounds(sb, handle, currentWorld);\n\t\t}\n\t\treturn computeResizeBounds(sb, handle, currentWorld);\n\t}\n\n\tconst local = worldToItemLocal(\n\t\tcurrentWorld.x,\n\t\tcurrentWorld.y,\n\t\tsb.x,\n\t\tsb.y,\n\t\tsb.width,\n\t\tsb.height,\n\t\trot,\n\t);\n\tconst localBounds = { x: 0, y: 0, width: sb.width, height: sb.height };\n\tlet nbLocal: Rect;\n\tif (item.toolKind === \"image\") {\n\t\tlet aspect: number | undefined;\n\t\tif (item.imageIntrinsicSize) {\n\t\t\tconst iw = Math.max(1e-9, item.imageIntrinsicSize.width);\n\t\t\tconst ih = Math.max(1e-9, item.imageIntrinsicSize.height);\n\t\t\taspect = iw / ih;\n\t\t} else if (item.imageVectorLocalSize) {\n\t\t\tconst lw = Math.max(1e-9, item.imageVectorLocalSize.width);\n\t\t\tconst lh = Math.max(1e-9, item.imageVectorLocalSize.height);\n\t\t\taspect = lw / lh;\n\t\t}\n\t\tnbLocal =\n\t\t\taspect !== undefined\n\t\t\t\t? computeResizeBoundsFixedAspect(localBounds, handle, local, aspect)\n\t\t\t\t: computeResizeBounds(localBounds, handle, local);\n\t} else {\n\t\tnbLocal = computeResizeBounds(localBounds, handle, local);\n\t}\n\treturn {\n\t\tx: sb.x + nbLocal.x,\n\t\ty: sb.y + nbLocal.y,\n\t\twidth: nbLocal.width,\n\t\theight: nbLocal.height,\n\t};\n}\n\n/** Unwraps pointer angle delta so rotation stays continuous across ±π. */\nexport function applyRotationFromPointer(\n\titem: VectorSceneItem,\n\tstartRotation: number,\n\tstartPointerAngleRad: number,\n\tpointerAngleRad: number,\n): VectorSceneItem {\n\tlet delta = pointerAngleRad - startPointerAngleRad;\n\twhile (delta > Math.PI) {\n\t\tdelta -= 2 * Math.PI;\n\t}\n\twhile (delta < -Math.PI) {\n\t\tdelta += 2 * Math.PI;\n\t}\n\treturn { ...item, rotation: startRotation + delta };\n}\n\nexport function moveItemByDelta(\n\titem: VectorSceneItem,\n\tdx: number,\n\tdy: number,\n): VectorSceneItem {\n\treturn {\n\t\t...item,\n\t\tx: item.x + dx,\n\t\ty: item.y + dy,\n\t\tbounds: {\n\t\t\t...item.bounds,\n\t\t\tx: item.bounds.x + dx,\n\t\t\ty: item.bounds.y + dy,\n\t\t},\n\t};\n}\n\n/**\n * Resizes an item by dragging a corner/edge handle. Line/arrow endpoints scale\n * proportionally within the resize start bounds.\n */\nexport function resizeItemByHandle(\n\titem: VectorSceneItem,\n\tstart: { bounds: Rect; line?: LineEndpointsLocal },\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): VectorSceneItem {\n\tconst sb = normalizeRect(start.bounds);\n\tconst newBoundsRaw = computeNewBoundsForResize(item, sb, handle, currentWorld);\n\tconst nb = normalizeRect(newBoundsRaw);\n\tconst k = item.toolKind;\n\n\tif (k === \"rect\") {\n\t\tconst style = resolveStrokeStyle(item);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tchildrenSvg: buildRectSvg(nb.width, nb.height, style),\n\t\t};\n\t}\n\tif (k === \"ellipse\") {\n\t\tconst style = resolveStrokeStyle(item);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tchildrenSvg: buildEllipseSvg(nb.width, nb.height, style),\n\t\t};\n\t}\n\tif (k === \"architectural-cloud\") {\n\t\tconst style = resolveStrokeStyle(item);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tchildrenSvg: buildArchitecturalCloudSvg(nb.width, nb.height, style),\n\t\t};\n\t}\n\tif (k === \"text\" && item.text !== undefined) {\n\t\tconst sfw = Math.max(sb.width, 1e-6);\n\t\tconst sfh = Math.max(sb.height, 1e-6);\n\t\tconst baseFs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\t\tconst areaRatio = (nb.width * nb.height) / (sfw * sfh);\n\t\tconst scale = Math.sqrt(Math.max(areaRatio, 1e-12));\n\t\tconst nextFs = Math.min(256, Math.max(6, baseFs * scale));\n\t\treturn rebuildItemSvg({\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\ttextFixedBounds: true,\n\t\t\ttextFontSize: nextFs,\n\t\t});\n\t}\n\tif (k === \"image\") {\n\t\tif (item.imageRasterHref && item.imageIntrinsicSize) {\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: nb.x,\n\t\t\t\ty: nb.y,\n\t\t\t\tbounds: nb,\n\t\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\t\titem.imageRasterHref,\n\t\t\t\t\titem.imageIntrinsicSize,\n\t\t\t\t\tnb,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tif (item.imageVectorInnerSvg && item.imageVectorLocalSize) {\n\t\t\tconst lw = Math.max(1e-6, item.imageVectorLocalSize.width);\n\t\t\tconst lh = Math.max(1e-6, item.imageVectorLocalSize.height);\n\t\t\tconst arB = nb.width / Math.max(1e-9, nb.height);\n\t\t\tconst arI = lw / lh;\n\t\t\tlet childrenSvg: string;\n\t\t\tif (Math.abs(arB - arI) < 1e-3) {\n\t\t\t\tconst s = nb.width / lw;\n\t\t\t\tchildrenSvg = `<g transform=\"scale(${s})\">${item.imageVectorInnerSvg}</g>`;\n\t\t\t} else {\n\t\t\t\tconst s = Math.min(nb.width / lw, nb.height / lh);\n\t\t\t\tconst tx = (nb.width - lw * s) / 2;\n\t\t\t\tconst ty = (nb.height - lh * s) / 2;\n\t\t\t\tchildrenSvg = `<g transform=\"translate(${tx}, ${ty}) scale(${s})\">${item.imageVectorInnerSvg}</g>`;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: nb.x,\n\t\t\t\ty: nb.y,\n\t\t\t\tbounds: nb,\n\t\t\t\tchildrenSvg,\n\t\t\t};\n\t\t}\n\t}\n\tif ((k === \"line\" || k === \"arrow\") && start.line) {\n\t\tconst sfw = Math.max(sb.width, 1e-6);\n\t\tconst sfh = Math.max(sb.height, 1e-6);\n\t\tconst f = start.line;\n\t\tconst u1 = f.x1 / sfw;\n\t\tconst v1 = f.y1 / sfh;\n\t\tconst u2 = f.x2 / sfw;\n\t\tconst v2 = f.y2 / sfh;\n\t\tconst newLine: LineEndpointsLocal = {\n\t\t\tx1: u1 * nb.width,\n\t\t\ty1: v1 * nb.height,\n\t\t\tx2: u2 * nb.width,\n\t\t\ty2: v2 * nb.height,\n\t\t};\n\t\tconst style = resolveStrokeStyle(item);\n\t\tconst childrenSvg =\n\t\t\tk === \"arrow\"\n\t\t\t\t? buildArrowSvg(item.id, newLine, style)\n\t\t\t\t: buildLineSvg(newLine, style);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tline: newLine,\n\t\t\tchildrenSvg,\n\t\t};\n\t}\n\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\tconst sfw = Math.max(sb.width, 1e-6);\n\t\tconst sfh = Math.max(sb.height, 1e-6);\n\t\tconst sx = nb.width / sfw;\n\t\tconst sy = nb.height / sfh;\n\t\tconst scaledPoints = item.pathPointsLocal.map((p) => ({\n\t\t\tx: p.x * sx,\n\t\t\ty: p.y * sy,\n\t\t\t...(p.pressure != null ? { pressure: p.pressure } : {}),\n\t\t}));\n\t\treturn rebuildItemSvg({\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tpathPointsLocal: scaledPoints,\n\t\t});\n\t}\n\n\tif (k === \"custom\" && item.customIntrinsicSize && item.customInnerSvg) {\n\t\treturn rebuildItemSvg({\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t});\n\t}\n\n\treturn { ...item, x: nb.x, y: nb.y, bounds: nb };\n}\n","\"use client\";\n\nimport {\n\ttype ChangeEvent,\n\ttype ClipboardEvent,\n\ttype CSSProperties,\n\ttype DragEvent,\n\tforwardRef,\n\ttype KeyboardEvent,\n\ttype MouseEvent,\n\ttype ReactNode,\n\ttype PointerEvent as ReactPointerEvent,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { Camera2D } from \"../camera/camera\";\nimport { IndexedDbImageStore } from \"../image/indexed-db-image-store\";\nimport { attachApplePencilNavigation } from \"../input/apple-pencil-navigation\";\nimport { attachViewportInput } from \"../input/attach-viewport-input\";\nimport {\n\tARROW_BIND_SNAP_PX,\n\tbakeArrowItemToAbsolute,\n\tresolveArrowBindingsInScene,\n\tsnapArrowEndpointToShape,\n} from \"../interaction/arrow-bindings\";\nimport {\n\tcollectEraserTargetsAtWorldPoint,\n\thitTestWorldPoint,\n} from \"../interaction/hit-test\";\nimport {\n\tapplyRotationFromPointer,\n\tmoveItemByDelta,\n\tresizeItemByHandle,\n} from \"../interaction/mutations\";\nimport {\n\thitTestResizeHandle,\n\thitTestRotateHandle,\n\trectFromCorners,\n} from \"../interaction/resize-handles\";\nimport { itemPivotWorld, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tformatCameraTransform,\n\tSvgVectorRenderer,\n} from \"../renderer/svg-vector-renderer\";\nimport { cloneVectorSceneItemsWithNewIds } from \"../scene/clone-item\";\nimport { type CanvuLinkData, getLinkData } from \"../scene/link-item\";\nimport { VectorScene } from \"../scene/scene\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\n\n/**\n * Bundles the active tool's stroke style with the font size used when placing\n * new text items, so the inspector has a single state atom to read/write.\n * `StrokeStyle` stays pure for SVG generation; this extension lives in the\n * viewport state only.\n */\ntype ActiveToolStyleState = StrokeStyle & { textFontSize: number };\n\nimport {\n\tapplyStrokeToItem,\n\tapplyTextDraftWhileEditing,\n\tcreateArchitecturalCloudItem,\n\tcreateEllipseItem,\n\tcreateFreehandStrokeItem,\n\tcreateLineItem,\n\tcreateRectangleItem,\n\tcreateShapeId,\n\tcreateTextItem,\n\tDEFAULT_STROKE_STYLE,\n\tlineEndpointsToLocal,\n\trebuildItemSvg,\n} from \"../scene/shape-builders\";\nimport {\n\tDEFAULT_TEXT_TOOL_FONT_SIZE,\n\ttextBaselineYFor,\n\ttextLineHeightFor,\n} from \"../scene/text-svg\";\nimport type {\n\tArrowBindings,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"../scene/types\";\nimport { ingestAssetFilesToSceneItems } from \"./asset-ingestion\";\nimport type { VectorViewportAssetStore } from \"./asset-store\";\nimport {\n\treleaseRememberedBlobHrefs,\n\trememberImageBlobHrefs,\n} from \"./blob-url-lifecycle\";\nimport { CanvuChromeContext, type CanvuChromeContextValue } from \"./chrome-context\";\nimport { InteractionOverlay, type PlacementPreview } from \"./InteractionOverlay\";\nimport { NavMenu } from \"./navmenu\";\nimport {\n\ttype CanvasPlugin,\n\ttype CanvasPluginContribution,\n\ttype CanvasPluginItemsChangeMiddlewareContext,\n\ttype CanvasPluginRenderContext,\n\tCanvuPluginContext,\n} from \"./plugins\";\nimport { PresenceRemoteLayer } from \"./presence/PresenceRemoteLayer\";\nimport type {\n\tPresenceOverlayRenderContext,\n\tRemotePresencePeer,\n} from \"./presence/types\";\nimport { ShapeContextMenu } from \"./ShapeContextMenu\";\nimport { shallowEqualStringArray } from \"./stable-selection\";\nimport { TextEditOverlay } from \"./TextEditOverlay\";\nimport { DEFAULT_VECTOR_TOOLS } from \"./tools/default-tools\";\nimport type { VectorToolDefinition } from \"./tools/types\";\nimport {\n\tVectorSelectionInspector,\n\ttype VectorSelectionInspectorProps,\n} from \"./VectorSelectionInspector\";\nimport {\n\tcollectItemIdsInRect,\n\tcursorForVectorToolId,\n\ttype DragState,\n\tdefaultPlacementWorld,\n\tfitCameraToWorldRect,\n\tMIN_ARROW_DRAG_PX,\n\tMIN_MARQUEE_WORLD,\n\tMIN_PLACE_SIZE,\n\treplaceItem,\n\tsupportsResizeHandles,\n\tTAP_PX,\n\ttryPointerCaptureOnTarget,\n\tusePrefersReducedMotion,\n\tVIEWPORT_ZOOM_IN_STEP,\n\tVIEWPORT_ZOOM_OUT_STEP,\n\tvisuallyHidden,\n} from \"./vector-viewport-support\";\n\nexport type WorldPointerDownDetail = {\n\tworldX: number;\n\tworldY: number;\n\ttoolId: string;\n\tpointerType: string;\n};\n\nfunction pointInSelectedItemBounds(\n\titem: VectorSceneItem,\n\tworldX: number,\n\tworldY: number,\n): boolean {\n\tconst bounds = normalizeRect(item.bounds);\n\tconst local = worldToItemLocal(\n\t\tworldX,\n\t\tworldY,\n\t\titem.x,\n\t\titem.y,\n\t\tbounds.width,\n\t\tbounds.height,\n\t\titem.rotation ?? 0,\n\t);\n\treturn (\n\t\tlocal.x >= 0 &&\n\t\tlocal.x <= bounds.width &&\n\t\tlocal.y >= 0 &&\n\t\tlocal.y <= bounds.height\n\t);\n}\n\nfunction pointerEventSamples(ev: PointerEvent): readonly PointerEvent[] {\n\tif (ev.pointerType !== \"pen\" || typeof ev.getCoalescedEvents !== \"function\") {\n\t\treturn [ev];\n\t}\n\tconst samples = ev.getCoalescedEvents();\n\treturn samples.length > 0 ? samples : [ev];\n}\n\nconst CANVU_PEN_ACTIVE_UI_BLOCK_CSS = `\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-canvas-toolbar\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-canvas-toolbar\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"canvu-plugin-layer\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"canvu-plugin-layer\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-selection-inspector\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-selection-inspector\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"zoom-minimap-panel\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"zoom-minimap-panel\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"text-edit-overlay\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"text-edit-overlay\"] *,\n[data-canvu-pen-active=\"true\"] .vector-toolbar-overflow-panel,\n[data-canvu-pen-active=\"true\"] .vector-toolbar-overflow-panel *,\nbody[data-canvu-pen-active=\"true\"] [data-slot=\"shape-context-menu\"],\nbody[data-canvu-pen-active=\"true\"] [data-slot=\"shape-context-menu\"] * {\n\tpointer-events: none !important;\n\tuser-select: none !important;\n\t-webkit-user-select: none !important;\n\t-webkit-touch-callout: none !important;\n}\n`;\n\nconst DEBUG_APPLE_PENCIL_POINTERS = false;\nconst STRAIGHT_STROKE_HOLD_DURATION_MS = 1000;\nconst STRAIGHT_STROKE_JITTER_TOLERANCE_SQUARED = 5 * 5;\n\nfunction debugApplePencilPointer(\n\tphase: string,\n\tdetail: Record<string, unknown>,\n): void {\n\tif (!DEBUG_APPLE_PENCIL_POINTERS) return;\n\tconsole.debug(`[canvu][apple-pencil] ${phase}`, detail);\n}\n\nconst MARKER_TOOL_STYLE: StrokeStyle = {\n\tstroke: \"#fde047\",\n\tstrokeWidth: 16,\n\tstrokeOpacity: 0.5,\n};\n\ntype ReorderDirection = \"front\" | \"forward\" | \"backward\" | \"back\";\n\nfunction reorderItemsByIds(\n\titems: readonly VectorSceneItem[],\n\tids: readonly string[],\n\tdirection: ReorderDirection,\n): VectorSceneItem[] {\n\tif (ids.length === 0 || items.length <= 1) {\n\t\treturn [...items];\n\t}\n\tconst idSet = new Set(ids);\n\tif (direction === \"front\") {\n\t\tconst rest = items.filter((item) => !idSet.has(item.id));\n\t\tconst selected = items.filter((item) => idSet.has(item.id));\n\t\treturn [...rest, ...selected];\n\t}\n\tif (direction === \"back\") {\n\t\tconst selected = items.filter((item) => idSet.has(item.id));\n\t\tconst rest = items.filter((item) => !idSet.has(item.id));\n\t\treturn [...selected, ...rest];\n\t}\n\tconst next = [...items];\n\tif (direction === \"forward\") {\n\t\tfor (let index = next.length - 2; index >= 0; index--) {\n\t\t\tconst current = next[index];\n\t\t\tconst after = next[index + 1];\n\t\t\tif (!current || !after) continue;\n\t\t\tif (idSet.has(current.id) && !idSet.has(after.id)) {\n\t\t\t\tnext[index] = after;\n\t\t\t\tnext[index + 1] = current;\n\t\t\t}\n\t\t}\n\t\treturn next;\n\t}\n\tfor (let index = 1; index < next.length; index++) {\n\t\tconst before = next[index - 1];\n\t\tconst current = next[index];\n\t\tif (!before || !current) continue;\n\t\tif (idSet.has(current.id) && !idSet.has(before.id)) {\n\t\t\tnext[index - 1] = current;\n\t\t\tnext[index] = before;\n\t\t}\n\t}\n\treturn next;\n}\n\nfunction isDefaultMarkerToolStyle(style: StrokeStyle): boolean {\n\treturn (\n\t\tstyle.stroke === MARKER_TOOL_STYLE.stroke &&\n\t\tstyle.strokeWidth === MARKER_TOOL_STYLE.strokeWidth &&\n\t\tstyle.strokeOpacity === MARKER_TOOL_STYLE.strokeOpacity\n\t);\n}\n\n/**\n * Imperative API for pan/zoom and integrations (e.g. AI agents following a region).\n * Call {@link requestRender} after mutating the {@link Camera2D} from {@link getCamera}.\n */\nexport type VectorViewportHandle = {\n\t/** The live camera instance, or `null` before mount / after unmount. */\n\tgetCamera: () => Camera2D | null;\n\t/**\n\t * Re-run SVG + overlay after changing `x`, `y`, or `zoom` on the camera from {@link getCamera}.\n\t */\n\trequestRender: () => void;\n\t/** CSS pixel size of the scene surface (`clientWidth` / `clientHeight`). */\n\tgetViewportSize: () => { width: number; height: number };\n\t/**\n\t * Sets pan/zoom so `worldRect` fits in the viewport with optional margin (fraction of rect size per side, default `0.08`).\n\t */\n\tfitWorldRect: (worldRect: Rect, options?: { padding?: number }) => void;\n};\n\n/** Drag-to-place a custom shape (same interaction as rectangle). Use with `createCustomShapeItem` from `canvu`. */\nexport type CustomShapePlacementOptions = {\n\ttoolId: string;\n\tcreateItem: (args: { id: string; bounds: Rect }) => VectorSceneItem;\n};\n\nexport type VectorViewportProps = {\n\t/** Vector items to draw (SVG fragments). */\n\titems: readonly VectorSceneItem[];\n\tclassName?: string;\n\t/** Accessible name for the application region. */\n\tariaLabel: string;\n\t/**\n\t * When `applePencilNav` is true, used with `attachApplePencilNavigation` to decide\n\t * when finger touches navigate (e.g. `\"hand\"` vs `\"draw\"`).\n\t */\n\ttoolId?: string;\n\t/** Enable Apple Pencil vs finger split (optional). */\n\tapplePencilNav?: boolean;\n\t/**\n\t * When true, selection, drag-to-move, resize handles, and drag-to-create shapes are enabled.\n\t * Requires `onItemsChange` to persist mutations.\n\t */\n\tinteractive?: boolean;\n\t/** Selected item ids (order preserved). Empty = none. */\n\tselectedIds?: readonly string[];\n\tonSelectionChange?: (ids: string[]) => void;\n\tonItemsChange?: (items: VectorSceneItem[]) => void;\n\t/**\n\t * Fires when a link/bookmark item is activated (double-click / double-tap).\n\t * When omitted, the link opens in a new browser tab by default (web only).\n\t * Provide this to customize navigation (e.g. in-app preview, confirmation).\n\t */\n\tonActivateLink?: (detail: { link: CanvuLinkData; item: VectorSceneItem }) => void;\n\t/**\n\t * Fires on primary pointer down on the viewport in **world** coordinates.\n\t * Not called when `toolId` is `\"hand\"` (use that tool for panning).\n\t * Ignored when `interactive` is true (placement uses drag-to-define).\n\t */\n\tonWorldPointerDown?: (detail: WorldPointerDownDetail) => void;\n\t/**\n\t * Floating UI above the scene. Compose with `VectorCanvas.Toolbar` + {@link VectorToolbar}\n\t * so the strip anchors at the bottom center (`data-slot=\"vector-canvas-toolbar\"`).\n\t */\n\ttoolbar?: ReactNode;\n\t/**\n\t * Floating bottom-left zoom / undo / minimap bar. Omit to render the default `NavMenu`.\n\t * Pass `<VectorCanvas.NavMenu position=\"...\" />` to relocate or style it. Pass `null` to hide it.\n\t */\n\tnavMenu?: ReactNode | null;\n\t/**\n\t * Floating selection / active-tool style inspector. Omit to render the default `VectorSelectionInspector`.\n\t * Pass `<VectorCanvas.SelectionInspector position=\"...\" />` to relocate or style it. Pass `null` to hide it.\n\t */\n\tselectionInspector?: ReactNode | null;\n\t/**\n\t * Props forwarded to the built-in {@link VectorSelectionInspector}.\n\t *\n\t * Use this to reposition or theme the default left-side style panel without replacing it.\n\t */\n\tselectionInspectorProps?: Pick<\n\t\tVectorSelectionInspectorProps,\n\t\t\"className\" | \"style\"\n\t>;\n\t/**\n\t * Plug and play board extensions.\n\t *\n\t * First-party plugins such as `chatbotPlugin(...)` and `realtimeCollaborationPlugin(...)`\n\t * should be passed here. Advanced authors can create their own plugins with `createCanvuPlugin(...)`.\n\t */\n\tplugins?: readonly CanvasPlugin[];\n\t/**\n\t * Called after the scene/camera redraw (pan, zoom, items update, or {@link VectorViewportHandle.requestRender}).\n\t * Can fire often during gestures — throttle/debounce if needed.\n\t */\n\tonCameraChange?: () => void;\n\t/**\n\t * When `interactive` is true, enables drag (or tap) placement for `toolId`, like built-in shapes.\n\t * Implement `createItem` with `createCustomShapeItem` from `canvu`.\n\t */\n\tcustomPlacement?: CustomShapePlacementOptions;\n\t/**\n\t * Multiple custom placements contributed by plugins or app code.\n\t *\n\t * When both `customPlacement` and `customPlacements` are provided, they are combined and the active\n\t * placement is resolved by the current `toolId`.\n\t */\n\tcustomPlacements?: readonly CustomShapePlacementOptions[];\n\t/**\n\t * Optional asset persistence bridge for the built-in image/file flow.\n\t *\n\t * Use this when you want canvu to keep its native file picker and drag-and-drop\n\t * behavior, while also uploading the original binary to your backend or bucket.\n\t * Returned `pluginData` is persisted on every created item from that file.\n\t *\n\t * This is a high-level persistence hook. For fully custom ingestion UIs or\n\t * imports that start outside the viewport, prefer\n\t * `ingestAssetFilesToSceneItems(...)` so your app reuses the same pipeline as\n\t * canvu's native file tool.\n\t */\n\tassetStore?: VectorViewportAssetStore;\n\t/**\n\t * When false (default), finishing a draw/place/erase gesture requests switching back to `autoResetToolTo`.\n\t * Use with controlled tool state (`onToolChangeRequest`) to keep \"select-after-use\" behavior.\n\t */\n\ttoolLocked?: boolean;\n\t/** Tool id requested after one-shot actions complete. Default `\"select\"`. */\n\tautoResetToolTo?: string;\n\t/** Called when viewport requests a tool change (e.g. auto reset to select). */\n\tonToolChangeRequest?: (toolId: string) => void;\n\t/**\n\t * Remote participants (cursors + optional in-progress strokes). Renders a world-space overlay\n\t * below the local interaction layer. Transport is your app (WebSocket, party server, …).\n\t */\n\tremotePresence?: readonly RemotePresencePeer[];\n\t/**\n\t * Replace the default presence layer (e.g. custom cursors). When set, `remotePresence` is not\n\t * rendered unless you read it from the parent closure inside this callback.\n\t */\n\tpresenceOverlay?: (ctx: PresenceOverlayRenderContext) => ReactNode;\n\t/**\n\t * Throttled pointer position in **world** space while the cursor moves over the viewport\n\t * (for broadcasting your cursor). Pair with `onWorldPointerLeave`.\n\t */\n\tonWorldPointerMove?: (world: { x: number; y: number }) => void;\n\t/** Fires when the pointer leaves the viewport (clear your broadcast cursor). */\n\tonWorldPointerLeave?: () => void;\n\t/**\n\t * Fires when drag placement preview updates (rect, line, freehand stroke, …). Use it to broadcast\n\t * {@link RemotePresencePeer.markupStroke} for other participants while drawing.\n\t */\n\tonPlacementPreviewChange?: (preview: PlacementPreview | null) => void;\n};\n\nfunction mergeToolListById(\n\tbaseTools: VectorToolDefinition[],\n\tpluginTools: readonly VectorToolDefinition[],\n): VectorToolDefinition[] {\n\tconst next = [...baseTools];\n\tfor (const tool of pluginTools) {\n\t\tconst index = next.findIndex((candidate) => candidate.id === tool.id);\n\t\tif (index >= 0) {\n\t\t\tnext[index] = tool;\n\t\t\tcontinue;\n\t\t}\n\t\tnext.push(tool);\n\t}\n\treturn next;\n}\n\nfunction composePluginEvent<TArgs extends readonly unknown[]>(\n\tconsumerHandler: ((...args: TArgs) => void) | undefined,\n\tpluginHandlers: readonly (((...args: TArgs) => void) | undefined)[],\n): ((...args: TArgs) => void) | undefined {\n\tconst activePluginHandlers = pluginHandlers.filter(\n\t\t(handler): handler is (...args: TArgs) => void => handler != null,\n\t);\n\tif (!consumerHandler && activePluginHandlers.length === 0) return undefined;\n\treturn (...args: TArgs) => {\n\t\tconsumerHandler?.(...args);\n\t\tfor (const handler of activePluginHandlers) {\n\t\t\thandler(...args);\n\t\t}\n\t};\n}\n\nfunction VectorViewportPluginInstances({\n\tplugins,\n\trenderContext,\n}: {\n\tplugins: readonly CanvasPlugin[];\n\trenderContext: CanvasPluginRenderContext;\n}) {\n\tif (plugins.length === 0) return null;\n\treturn (\n\t\t<>\n\t\t\t{plugins.map((plugin) => {\n\t\t\t\tconst Component = plugin.Component;\n\t\t\t\treturn (\n\t\t\t\t\t<div key={plugin.id} style={{ pointerEvents: \"none\", height: \"100%\" }}>\n\t\t\t\t\t\t{plugin.render?.(renderContext)}\n\t\t\t\t\t\t{Component ? <Component pluginId={plugin.id} /> : null}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</>\n\t);\n}\n\nfunction appendInterpolatedPoints(\n\tpoints: VectorPathPoint[],\n\tnext: VectorPathPoint,\n\tmaxStepWorld: number,\n): VectorPathPoint[] {\n\tvoid maxStepWorld;\n\tif (points.length === 0) return [next];\n\tconst last = points[points.length - 1];\n\tif (!last) return [...points, next];\n\tconst dx = next.x - last.x;\n\tconst dy = next.y - last.y;\n\tif (dx * dx + dy * dy < 1e-12) return points;\n\treturn [...points, next];\n}\n\nfunction pointerSampleToWorldPoint(\n\tscreenToWorldFn: (\n\t\tclientX: number,\n\t\tclientY: number,\n\t) => {\n\t\tworldX: number;\n\t\tworldY: number;\n\t},\n\tclientX: number,\n\tclientY: number,\n\tpressure?: number,\n): VectorPathPoint {\n\tconst { worldX, worldY } = screenToWorldFn(clientX, clientY);\n\tconst safePressure =\n\t\tpressure != null && Number.isFinite(pressure)\n\t\t\t? Math.min(1, Math.max(0, pressure))\n\t\t\t: undefined;\n\treturn {\n\t\tx: worldX,\n\t\ty: worldY,\n\t\t...(safePressure != null ? { pressure: safePressure } : {}),\n\t};\n}\n\ntype SafariTouch = Touch & {\n\tforce?: number;\n\tradiusX?: number;\n\tradiusY?: number;\n\ttouchType?: string;\n};\n\nfunction touchPressure(touch: Touch): number | undefined {\n\tconst force = (touch as SafariTouch).force;\n\tif (force == null || !Number.isFinite(force) || force <= 0) return undefined;\n\treturn Math.min(1, Math.max(0, force));\n}\n\nfunction touchKind(touch: Touch): string | undefined {\n\tconst kind = (touch as SafariTouch).touchType;\n\treturn typeof kind === \"string\" ? kind.toLowerCase() : undefined;\n}\n\nfunction isLikelyStylusTouch(touch: Touch): boolean {\n\tconst kind = touchKind(touch);\n\tif (kind === \"stylus\" || kind === \"pen\" || kind === \"pencil\") return true;\n\tif (kind === \"direct\") return false;\n\n\tconst force = touchPressure(touch);\n\tconst radiusX = (touch as SafariTouch).radiusX;\n\tconst radiusY = (touch as SafariTouch).radiusY;\n\tconst hasSmallRadius =\n\t\t(radiusX == null || radiusX <= 12) && (radiusY == null || radiusY <= 12);\n\treturn force != null && hasSmallRadius;\n}\n\nfunction appendPointerEventSamplesToStrokePoints(\n\tpoints: VectorPathPoint[],\n\tev: PointerEvent,\n\tzoom: number,\n\tscreenToWorldFn: (\n\t\tclientX: number,\n\t\tclientY: number,\n\t) => {\n\t\tworldX: number;\n\t\tworldY: number;\n\t},\n): VectorPathPoint[] {\n\tlet interpolated = points;\n\tconst maxStepWorld = ev.pointerType === \"pen\" ? 0.35 / zoom : 1.0 / zoom;\n\tfor (const sample of pointerEventSamples(ev)) {\n\t\tconst nextPoint = pointerSampleToWorldPoint(\n\t\t\tscreenToWorldFn,\n\t\t\tsample.clientX,\n\t\t\tsample.clientY,\n\t\t\tsample.pointerType === \"pen\" ? sample.pressure : undefined,\n\t\t);\n\t\tinterpolated = appendInterpolatedPoints(interpolated, nextPoint, maxStepWorld);\n\t}\n\treturn interpolated;\n}\n\nfunction appendTouchToStrokePoints(\n\tpoints: VectorPathPoint[],\n\ttouch: Touch,\n\tzoom: number,\n\tscreenToWorldFn: (\n\t\tclientX: number,\n\t\tclientY: number,\n\t) => {\n\t\tworldX: number;\n\t\tworldY: number;\n\t},\n): VectorPathPoint[] {\n\tconst nextPoint = pointerSampleToWorldPoint(\n\t\tscreenToWorldFn,\n\t\ttouch.clientX,\n\t\ttouch.clientY,\n\t\ttouchPressure(touch),\n\t);\n\treturn appendInterpolatedPoints(points, nextPoint, 0.35 / zoom);\n}\n\ntype StrokeDragState = Extract<DragState, { kind: \"stroke\" }>;\ntype StraightStrokeState = NonNullable<StrokeDragState[\"straightLine\"]>;\n\nfunction createStraightStrokeState(\n\tanchorPoint: VectorPathPoint,\n\tclientX: number,\n\tclientY: number,\n): StraightStrokeState {\n\treturn {\n\t\tactive: false,\n\t\tanchorPoint,\n\t\tholdScreen: { x: clientX, y: clientY },\n\t\tholdTimer: null,\n\t};\n}\n\nfunction clearStraightStrokeHoldTimer(strokeState: StrokeDragState): void {\n\tconst straightLine = strokeState.straightLine;\n\tif (!straightLine?.holdTimer) return;\n\tclearTimeout(straightLine.holdTimer);\n\tstraightLine.holdTimer = null;\n}\n\nfunction lastStrokePoint(\n\tpoints: readonly VectorPathPoint[],\n): VectorPathPoint | null {\n\treturn points[points.length - 1] ?? null;\n}\n\nfunction hasMovedPastStraightStrokeJitter(\n\tstraightLine: StraightStrokeState,\n\tclientX: number,\n\tclientY: number,\n): boolean {\n\tconst deltaX = clientX - straightLine.holdScreen.x;\n\tconst deltaY = clientY - straightLine.holdScreen.y;\n\treturn (\n\t\tdeltaX * deltaX + deltaY * deltaY > STRAIGHT_STROKE_JITTER_TOLERANCE_SQUARED\n\t);\n}\n\n/**\n * Full-viewport vector canvas: SVG rendering + pan/zoom/pinch + optional Apple Pencil navigation.\n * Pass a `className` that includes `touch-action: none` (e.g. Tailwind `touch-none`) on the viewport.\n */\nexport const VectorViewport = forwardRef<VectorViewportHandle, VectorViewportProps>(\n\tfunction VectorViewport(\n\t\t{\n\t\t\titems,\n\t\t\tclassName = \"\",\n\t\t\tariaLabel,\n\t\t\ttoolId = \"hand\",\n\t\t\tapplePencilNav = false,\n\t\t\tinteractive = false,\n\t\t\tselectedIds: selectedIdsProp,\n\t\t\tonSelectionChange,\n\t\t\tonItemsChange: consumerOnItemsChange,\n\t\t\tonActivateLink,\n\t\t\tonWorldPointerDown: consumerOnWorldPointerDown,\n\t\t\ttoolbar,\n\t\t\tnavMenu,\n\t\t\tselectionInspector,\n\t\t\tselectionInspectorProps,\n\t\t\tplugins = [],\n\t\t\tonCameraChange: consumerOnCameraChange,\n\t\t\tcustomPlacement: consumerCustomPlacement,\n\t\t\tcustomPlacements: consumerCustomPlacements,\n\t\t\tassetStore,\n\t\t\ttoolLocked = false,\n\t\t\tautoResetToolTo = \"select\",\n\t\t\tonToolChangeRequest,\n\t\t\tremotePresence: consumerRemotePresence,\n\t\t\tpresenceOverlay: consumerPresenceOverlay,\n\t\t\tonWorldPointerMove: consumerOnWorldPointerMove,\n\t\t\tonWorldPointerLeave: consumerOnWorldPointerLeave,\n\t\t\tonPlacementPreviewChange: consumerOnPlacementPreviewChange,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst wrapperRef = useRef<HTMLDivElement>(null);\n\t\tconst interactionRootRef = useRef<HTMLDivElement>(null);\n\t\tconst sceneContainerRef = useRef<HTMLDivElement>(null);\n\t\tconst lastPointerScreenRef = useRef<{ x: number; y: number } | null>(null);\n\t\tconst activeInteractionPointerIdRef = useRef<number | null>(null);\n\t\tconst activeInteractionPointerTargetRef = useRef<HTMLDivElement | null>(null);\n\t\tconst activeInteractionTouchIdRef = useRef<number | null>(null);\n\t\tconst penDetectedRef = useRef(false);\n\t\tconst lastPenPointerDownAtRef = useRef(0);\n\t\tconst cameraRef = useRef<Camera2D | null>(null);\n\t\tconst viewportSizeRef = useRef({ width: 0, height: 0 });\n\t\tconst [cameraForOverlay, setCameraForOverlay] = useState<Camera2D | null>(null);\n\t\tconst sceneRef = useRef<VectorScene | null>(null);\n\t\tconst rendererRef = useRef<SvgVectorRenderer | null>(null);\n\t\tconst pluginViewportRef = useRef<VectorViewportHandle | null>(null);\n\t\tconst [pluginContributions, setPluginContributions] = useState<\n\t\t\tRecord<string, CanvasPluginContribution>\n\t\t>({});\n\n\t\tconst registerContribution = useCallback(\n\t\t\t(pluginId: string, contribution: CanvasPluginContribution) => {\n\t\t\t\tsetPluginContributions((current) => {\n\t\t\t\t\tif (current[pluginId] === contribution) return current;\n\t\t\t\t\treturn { ...current, [pluginId]: contribution };\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst unregisterContribution = useCallback((pluginId: string) => {\n\t\t\tsetPluginContributions((current) => {\n\t\t\t\tif (!(pluginId in current)) return current;\n\t\t\t\tconst next = { ...current };\n\t\t\t\tdelete next[pluginId];\n\t\t\t\treturn next;\n\t\t\t});\n\t\t}, []);\n\n\t\tconst orderedPluginContributions = useMemo(\n\t\t\t() =>\n\t\t\t\tplugins\n\t\t\t\t\t.map((plugin) => pluginContributions[plugin.id])\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(contribution): contribution is CanvasPluginContribution =>\n\t\t\t\t\t\t\tcontribution != null,\n\t\t\t\t\t),\n\t\t\t[pluginContributions, plugins],\n\t\t);\n\n\t\tconst resolvedTools = useMemo(() => {\n\t\t\tlet nextTools = [...DEFAULT_VECTOR_TOOLS];\n\t\t\tfor (const contribution of orderedPluginContributions) {\n\t\t\t\tif (contribution.tools?.length) {\n\t\t\t\t\tnextTools = mergeToolListById(nextTools, contribution.tools);\n\t\t\t\t}\n\t\t\t\tif (contribution.toolTransform) {\n\t\t\t\t\tnextTools = contribution.toolTransform(nextTools);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nextTools;\n\t\t}, [orderedPluginContributions]);\n\n\t\tconst allCustomPlacements = useMemo(() => {\n\t\t\tconst placements: CustomShapePlacementOptions[] = [];\n\t\t\tif (consumerCustomPlacement) placements.push(consumerCustomPlacement);\n\t\t\tif (consumerCustomPlacements?.length) {\n\t\t\t\tplacements.push(...consumerCustomPlacements);\n\t\t\t}\n\t\t\tfor (const contribution of orderedPluginContributions) {\n\t\t\t\tif (contribution.customPlacements?.length) {\n\t\t\t\t\tplacements.push(...contribution.customPlacements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn placements;\n\t\t}, [\n\t\t\tconsumerCustomPlacement,\n\t\t\tconsumerCustomPlacements,\n\t\t\torderedPluginContributions,\n\t\t]);\n\n\t\tconst customPlacement = useMemo(\n\t\t\t() =>\n\t\t\t\t[...allCustomPlacements]\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.find((placement) => placement.toolId === toolId),\n\t\t\t[allCustomPlacements, toolId],\n\t\t);\n\n\t\tconst remotePresence =\n\t\t\t[...orderedPluginContributions]\n\t\t\t\t.reverse()\n\t\t\t\t.map((contribution) => contribution.viewportProps?.remotePresence)\n\t\t\t\t.find((value) => value !== undefined) ?? consumerRemotePresence;\n\n\t\tconst presenceOverlay =\n\t\t\t[...orderedPluginContributions]\n\t\t\t\t.reverse()\n\t\t\t\t.map((contribution) => contribution.viewportProps?.presenceOverlay)\n\t\t\t\t.find((value) => value !== undefined) ?? consumerPresenceOverlay;\n\n\t\tconst onWorldPointerDown = composePluginEvent(\n\t\t\tconsumerOnWorldPointerDown,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onWorldPointerDown,\n\t\t\t),\n\t\t);\n\t\tconst onWorldPointerMove = composePluginEvent(\n\t\t\tconsumerOnWorldPointerMove,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onWorldPointerMove,\n\t\t\t),\n\t\t);\n\t\tconst onWorldPointerLeave = composePluginEvent(\n\t\t\tconsumerOnWorldPointerLeave,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onWorldPointerLeave,\n\t\t\t),\n\t\t);\n\t\tconst onPlacementPreviewChange = composePluginEvent(\n\t\t\tconsumerOnPlacementPreviewChange,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onPlacementPreviewChange,\n\t\t\t),\n\t\t);\n\t\tconst onCameraChange = composePluginEvent(\n\t\t\tconsumerOnCameraChange,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onCameraChange,\n\t\t\t),\n\t\t);\n\n\t\tconst onItemsChange = useMemo(() => {\n\t\t\tconst middlewares = orderedPluginContributions\n\t\t\t\t.map((contribution) => contribution.wrapOnItemsChange)\n\t\t\t\t.filter(\n\t\t\t\t\t(\n\t\t\t\t\t\tmiddleware,\n\t\t\t\t\t): middleware is NonNullable<\n\t\t\t\t\t\tCanvasPluginContribution[\"wrapOnItemsChange\"]\n\t\t\t\t\t> => middleware != null,\n\t\t\t\t);\n\t\t\tif (!consumerOnItemsChange && middlewares.length === 0) return undefined;\n\t\t\tconst baseNext: NonNullable<VectorViewportProps[\"onItemsChange\"]> = (\n\t\t\t\tnextItems,\n\t\t\t) => {\n\t\t\t\tconsumerOnItemsChange?.(nextItems);\n\t\t\t};\n\t\t\treturn middlewares.reduceRight<\n\t\t\t\tNonNullable<VectorViewportProps[\"onItemsChange\"]>\n\t\t\t>(\n\t\t\t\t(next, middleware) => (nextItems) => {\n\t\t\t\t\tconst ctx: CanvasPluginItemsChangeMiddlewareContext = {\n\t\t\t\t\t\tcurrentItems: items,\n\t\t\t\t\t\tnext,\n\t\t\t\t\t\tconsumerOnItemsChange,\n\t\t\t\t\t\tviewportRef: pluginViewportRef,\n\t\t\t\t\t};\n\t\t\t\t\tmiddleware(nextItems, ctx);\n\t\t\t\t},\n\t\t\t\tbaseNext,\n\t\t\t);\n\t\t}, [consumerOnItemsChange, items, orderedPluginContributions]);\n\n\t\tconst pluginRenderContext = useMemo<CanvasPluginRenderContext>(\n\t\t\t() => ({ viewportRef: pluginViewportRef }),\n\t\t\t[],\n\t\t);\n\n\t\tconst pluginContextValue = useMemo(\n\t\t\t() => ({\n\t\t\t\tviewportRef: pluginViewportRef,\n\t\t\t\tviewport: {\n\t\t\t\t\titems,\n\t\t\t\t\tonItemsChange: consumerOnItemsChange,\n\t\t\t\t\ttoolId,\n\t\t\t\t\tinteractive,\n\t\t\t\t\ttoolLocked,\n\t\t\t\t\tonToolChangeRequest,\n\t\t\t\t},\n\t\t\t\tresolvedTools,\n\t\t\t\tregisterContribution,\n\t\t\t\tunregisterContribution,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tconsumerOnItemsChange,\n\t\t\t\tinteractive,\n\t\t\t\titems,\n\t\t\t\tonToolChangeRequest,\n\t\t\t\tregisterContribution,\n\t\t\t\tresolvedTools,\n\t\t\t\ttoolId,\n\t\t\t\ttoolLocked,\n\t\t\t\tunregisterContribution,\n\t\t\t],\n\t\t);\n\t\tconst toolIdRef = useRef(toolId);\n\t\tconst interactiveRef = useRef(interactive);\n\t\tconst reducedMotionRef = useRef(false);\n\t\tconst itemsRef = useRef(items);\n\t\tconst onWorldPointerDownRef = useRef(onWorldPointerDown);\n\t\tconst onItemsChangeRef = useRef(onItemsChange);\n\t\tconst onActivateLinkRef = useRef(onActivateLink);\n\t\tonActivateLinkRef.current = onActivateLink;\n\t\tconst assetStoreRef = useRef(assetStore);\n\t\tassetStoreRef.current = assetStore;\n\t\tconst customPlacementRef = useRef(customPlacement);\n\t\tcustomPlacementRef.current = customPlacement;\n\t\tconst dragStateRef = useRef<DragState>({ kind: \"idle\" });\n\t\tconst clipboardRef = useRef<VectorSceneItem[] | null>(null);\n\t\tconst undoStackRef = useRef<VectorSceneItem[][]>([]);\n\t\tconst redoStackRef = useRef<VectorSceneItem[][]>([]);\n\t\tconst isUndoingRef = useRef(false);\n\t\tconst MAX_HISTORY = 50;\n\t\tconst [canUndo, setCanUndo] = useState(false);\n\t\tconst [canRedo, setCanRedo] = useState(false);\n\n\t\tconst pushUndo = useCallback(() => {\n\t\t\tundoStackRef.current.push(itemsRef.current.map((i) => structuredClone(i)));\n\t\t\tif (undoStackRef.current.length > MAX_HISTORY) {\n\t\t\t\tundoStackRef.current.shift();\n\t\t\t}\n\t\t\tredoStackRef.current = [];\n\t\t\tsetCanUndo(true);\n\t\t\tsetCanRedo(false);\n\t\t}, []);\n\n\t\tconst undo = useCallback(() => {\n\t\t\tconst stack = undoStackRef.current;\n\t\t\tif (stack.length === 0) return;\n\t\t\tconst prev = stack.pop() as VectorSceneItem[];\n\t\t\tconst current = itemsRef.current.map((i) => structuredClone(i));\n\t\t\tredoStackRef.current.push(current);\n\t\t\tsetCanRedo(true);\n\t\t\tsetCanUndo(stack.length > 0);\n\t\t\tisUndoingRef.current = true;\n\t\t\tonItemsChangeRef.current?.(prev);\n\t\t}, []);\n\n\t\tconst redo = useCallback(() => {\n\t\t\tconst stack = redoStackRef.current;\n\t\t\tif (stack.length === 0) return;\n\t\t\tconst next = stack.pop() as VectorSceneItem[];\n\t\t\tconst current = itemsRef.current.map((i) => structuredClone(i));\n\t\t\tundoStackRef.current.push(current);\n\t\t\tsetCanUndo(true);\n\t\t\tsetCanRedo(stack.length > 0);\n\t\t\tisUndoingRef.current = true;\n\t\t\tonItemsChangeRef.current?.(next);\n\t\t}, []);\n\t\tconst [contextMenu, setContextMenu] = useState<{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\titemIds: string[];\n\t\t} | null>(null);\n\n\t\tconst [uncontrolledSel, setUncontrolledSel] = useState<string[]>([]);\n\t\tconst isSelectionControlled = onSelectionChange !== undefined;\n\t\t/**\n\t\t * Stable when only `items` changes: controlled branch keys off serialized ids so parents\n\t\t * that pass a new `selectedIds` array reference each render with the same contents do not\n\t\t * invalidate this memo every frame (avoids orphan-selection effect + update-depth issues).\n\t\t */\n\t\tconst controlledSelectedKey = JSON.stringify(selectedIdsProp ?? []);\n\t\tconst effectiveSelectedIds = useMemo((): string[] => {\n\t\t\tif (isSelectionControlled) {\n\t\t\t\treturn [...(JSON.parse(controlledSelectedKey) as string[])];\n\t\t\t}\n\t\t\treturn uncontrolledSel;\n\t\t}, [isSelectionControlled, controlledSelectedKey, uncontrolledSel]);\n\n\t\tconst effectiveSelectedIdsRef = useRef<string[]>([]);\n\t\teffectiveSelectedIdsRef.current = effectiveSelectedIds;\n\n\t\tconst setEffectiveSelectedIds = useCallback(\n\t\t\t(ids: readonly string[]) => {\n\t\t\t\tconst next = [...ids];\n\t\t\t\tif (isSelectionControlled) {\n\t\t\t\t\tonSelectionChange?.(next);\n\t\t\t\t} else {\n\t\t\t\t\tsetUncontrolledSel(next);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[isSelectionControlled, onSelectionChange],\n\t\t);\n\n\t\tconst setEffectiveSelectedIdsRef = useRef(setEffectiveSelectedIds);\n\t\tsetEffectiveSelectedIdsRef.current = setEffectiveSelectedIds;\n\n\t\ttoolIdRef.current = toolId;\n\t\tinteractiveRef.current = interactive;\n\t\titemsRef.current = items;\n\t\tonWorldPointerDownRef.current = onWorldPointerDown;\n\t\tconst originalOnItemsChangeRef = useRef(onItemsChange);\n\t\toriginalOnItemsChangeRef.current = onItemsChange;\n\t\tconst changeItems = useCallback(\n\t\t\t(items: VectorSceneItem[]) => {\n\t\t\t\tif (!isUndoingRef.current) {\n\t\t\t\t\tpushUndo();\n\t\t\t\t}\n\t\t\t\tisUndoingRef.current = false;\n\t\t\t\toriginalOnItemsChangeRef.current?.(items);\n\t\t\t},\n\t\t\t[pushUndo],\n\t\t);\n\t\tonItemsChangeRef.current = changeItems;\n\t\tconst toolLockedRef = useRef(toolLocked);\n\t\ttoolLockedRef.current = toolLocked;\n\t\tconst autoResetToolToRef = useRef(autoResetToolTo);\n\t\tautoResetToolToRef.current = autoResetToolTo;\n\t\tconst onToolChangeRequestRef = useRef(onToolChangeRequest);\n\t\tonToolChangeRequestRef.current = onToolChangeRequest;\n\n\t\tconst resolvedItems = useMemo(() => resolveArrowBindingsInScene(items), [items]);\n\t\tconst resolvedItemsRef = useRef(resolvedItems);\n\t\tresolvedItemsRef.current = resolvedItems;\n\n\t\tconst liveId = useId();\n\t\tconst reducedMotion = usePrefersReducedMotion();\n\t\treducedMotionRef.current = reducedMotion;\n\t\tconst [zoomPercent, setZoomPercent] = useState(100);\n\t\tconst [cameraTick, setCameraTick] = useState(0);\n\t\tconst [placementPreview, setPlacementPreview] =\n\t\t\tuseState<PlacementPreview | null>(null);\n\t\tconst [eraserTrail, setEraserTrail] = useState<\n\t\t\t{ x: number; y: number; t: number }[]\n\t\t>([]);\n\t\tconst [laserTrail, setLaserTrail] = useState<\n\t\t\t{ x: number; y: number; t: number }[]\n\t\t>([]);\n\t\tconst [eraserPreviewIds, setEraserPreviewIds] = useState<string[]>([]);\n\t\tconst eraserPreviewIdsRef = useRef<Set<string>>(new Set());\n\t\t/** Items the active marquee currently covers — live preview of what\n\t\t * releasing will select. Kept in sync with the same hit-test pointer-up\n\t\t * uses, so the preview never disagrees with the committed selection. */\n\t\tconst [marqueeCandidateIds, setMarqueeCandidateIds] = useState<string[]>([]);\n\t\tconst marqueeCandidateIdsRef = useRef<string[]>([]);\n\t\tmarqueeCandidateIdsRef.current = marqueeCandidateIds;\n\t\tconst resolvedSceneItems = useMemo(() => {\n\t\t\tif (eraserPreviewIds.length === 0) return resolvedItems;\n\t\t\tconst hiddenIds = new Set(eraserPreviewIds);\n\t\t\treturn resolvedItems.filter((it) => !hiddenIds.has(it.id));\n\t\t}, [eraserPreviewIds, resolvedItems]);\n\t\tconst livePenStrokeItemRef = useRef<VectorSceneItem | null>(null);\n\t\tconst [eraserActive, setEraserActive] = useState(false);\n\t\tconst [editingTextId, setEditingTextId] = useState<string | null>(null);\n\t\tconst [draftText, setDraftText] = useState(\"\");\n\t\tconst draftTextRef = useRef(\"\");\n\t\tdraftTextRef.current = draftText;\n\t\tconst [loadingSkeletons, setLoadingSkeletons] = useState<\n\t\t\t{ id: string; x: number; y: number; width: number; height: number }[]\n\t\t>([]);\n\t\tconst skeletonSeqRef = useRef(0);\n\t\t/** Snapshot when inline edit starts; used to restore on Escape if draft changed. */\n\t\tconst editingTextSnapshotRef = useRef<VectorSceneItem | null>(null);\n\t\tconst editingTextIdRef = useRef<string | null>(null);\n\t\teditingTextIdRef.current = editingTextId;\n\t\tconst pendingImagePlacementRef = useRef<{\n\t\t\tworldX: number;\n\t\t\tworldY: number;\n\t\t} | null>(null);\n\t\tconst lastToolIdRef = useRef(toolId);\n\t\tconst imageInputRef = useRef<HTMLInputElement>(null);\n\t\tconst imageStoreRef = useRef<IndexedDbImageStore | null>(null);\n\t\tif (typeof indexedDB !== \"undefined\" && !imageStoreRef.current) {\n\t\t\timageStoreRef.current = new IndexedDbImageStore();\n\t\t}\n\t\tconst rememberedImageBlobHrefsRef = useRef<Set<string>>(new Set());\n\t\tconst strokeStyleRef = useRef<ActiveToolStyleState>({\n\t\t\t...DEFAULT_STROKE_STYLE,\n\t\t\ttextFontSize: DEFAULT_TEXT_TOOL_FONT_SIZE,\n\t\t});\n\t\tconst [strokeStyleState, setStrokeStyleState] = useState<ActiveToolStyleState>({\n\t\t\t...DEFAULT_STROKE_STYLE,\n\t\t\ttextFontSize: DEFAULT_TEXT_TOOL_FONT_SIZE,\n\t\t});\n\t\tconst setCurrentStrokeStyle = useCallback((next: ActiveToolStyleState) => {\n\t\t\tstrokeStyleRef.current = next;\n\t\t\tsetStrokeStyleState(next);\n\t\t}, []);\n\t\tconst patchCurrentStrokeStyle = useCallback(\n\t\t\t(patch: Partial<ActiveToolStyleState>) => {\n\t\t\t\tconst merged: ActiveToolStyleState = { ...strokeStyleRef.current };\n\t\t\t\tfor (const key of Object.keys(patch) as (keyof ActiveToolStyleState)[]) {\n\t\t\t\t\tconst v = patch[key];\n\t\t\t\t\tif (v !== undefined) {\n\t\t\t\t\t\t(merged as Record<string, unknown>)[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstrokeStyleRef.current = merged;\n\t\t\t\tsetStrokeStyleState(merged);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\t/* ── Progressive image loading (thumbnail → full-res) ── */\n\t\tconst progressiveQueueRef = useRef<Set<string>>(new Set());\n\t\tuseEffect(() => {\n\t\t\tconst store = imageStoreRef.current;\n\t\t\tif (!store) return;\n\t\t\tlet cancelled = false;\n\t\t\tconst timer = setTimeout(async () => {\n\t\t\t\tfor (const item of items) {\n\t\t\t\t\tif (\n\t\t\t\t\t\titem.toolKind === \"image\" &&\n\t\t\t\t\t\titem.imageBlobId &&\n\t\t\t\t\t\ttypeof item.imageRasterHref === \"string\" &&\n\t\t\t\t\t\titem.imageRasterHref.startsWith(\"blob:\") &&\n\t\t\t\t\t\titem.imageThumbnailHref &&\n\t\t\t\t\t\t!progressiveQueueRef.current.has(item.id)\n\t\t\t\t\t) {\n\t\t\t\t\t\tprogressiveQueueRef.current.add(item.id);\n\t\t\t\t\t\tconst fullUrl = item.imageRasterHref;\n\t\t\t\t\t\t// Pre-decode the full-res image\n\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\tconst img = new Image();\n\t\t\t\t\t\t\timg.onload = () => resolve();\n\t\t\t\t\t\t\timg.onerror = () => reject();\n\t\t\t\t\t\t\timg.src = fullUrl;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\t// Swap childrenSvg to use full-res\n\t\t\t\t\t\tconst { buildRasterImageChildrenSvg } = await import(\n\t\t\t\t\t\t\t\"../scene/shape-builders\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\t\tif (!change) return;\n\t\t\t\t\t\tconst list = itemsRef.current;\n\t\t\t\t\t\tconst existing = list.find((i) => i.id === item.id);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!existing ||\n\t\t\t\t\t\t\texisting.toolKind !== \"image\" ||\n\t\t\t\t\t\t\t!existing.imageIntrinsicSize\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tconst { imageIntrinsicSize: isize } = existing;\n\t\t\t\t\t\tconst rebuilt = {\n\t\t\t\t\t\t\t...existing,\n\t\t\t\t\t\t\timageThumbnailHref: undefined,\n\t\t\t\t\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\t\t\t\t\tfullUrl,\n\t\t\t\t\t\t\t\tisize,\n\t\t\t\t\t\t\t\texisting.bounds,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t} as VectorSceneItem;\n\t\t\t\t\t\tchange(list.map((i) => (i.id === item.id ? rebuilt : i)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t\treturn () => {\n\t\t\t\tcancelled = true;\n\t\t\t\tclearTimeout(timer);\n\t\t\t};\n\t\t}, [items]);\n\t\tconst onCameraChangeRef = useRef(onCameraChange);\n\t\tonCameraChangeRef.current = onCameraChange;\n\t\tconst onWorldPointerMoveRef = useRef(onWorldPointerMove);\n\t\tonWorldPointerMoveRef.current = onWorldPointerMove;\n\t\tconst onWorldPointerLeaveRef = useRef(onWorldPointerLeave);\n\t\tonWorldPointerLeaveRef.current = onWorldPointerLeave;\n\t\tconst onPlacementPreviewChangeRef = useRef(onPlacementPreviewChange);\n\t\tonPlacementPreviewChangeRef.current = onPlacementPreviewChange;\n\t\tconst directRemoteStrokePreviewRef = useRef(false);\n\t\tconst remoteStrokePreviewFrameRef = useRef<number | null>(null);\n\t\tconst remoteStrokePreviewClearTimerRef = useRef<number | null>(null);\n\t\tconst pendingRemoteStrokePreviewRef = useRef<{\n\t\t\ttool: Extract<DragState, { kind: \"stroke\" }>[\"tool\"];\n\t\t\tpoints: VectorPathPoint[];\n\t\t} | null>(null);\n\n\t\tconst cancelPendingRemoteStrokePreviewClear = useCallback(() => {\n\t\t\tif (remoteStrokePreviewClearTimerRef.current != null) {\n\t\t\t\tclearTimeout(remoteStrokePreviewClearTimerRef.current);\n\t\t\t\tremoteStrokePreviewClearTimerRef.current = null;\n\t\t\t}\n\t\t}, []);\n\n\t\tconst flushRemoteStrokePreviewWithStyle = useCallback(() => {\n\t\t\tremoteStrokePreviewFrameRef.current = null;\n\t\t\tconst pending = pendingRemoteStrokePreviewRef.current;\n\t\t\tif (!pending) return;\n\t\t\tonPlacementPreviewChangeRef.current?.({\n\t\t\t\tkind: \"stroke\",\n\t\t\t\ttool: pending.tool,\n\t\t\t\tpoints: pending.points,\n\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t});\n\t\t}, []);\n\n\t\tconst emitRemoteStrokePreview = useCallback(\n\t\t\t(\n\t\t\t\ttool: Extract<DragState, { kind: \"stroke\" }>[\"tool\"],\n\t\t\t\tpoints: VectorPathPoint[],\n\t\t\t) => {\n\t\t\t\tif (tool === \"laser\") return;\n\t\t\t\tcancelPendingRemoteStrokePreviewClear();\n\t\t\t\tdirectRemoteStrokePreviewRef.current = true;\n\t\t\t\tpendingRemoteStrokePreviewRef.current = { tool, points };\n\t\t\t\tif (remoteStrokePreviewFrameRef.current != null) return;\n\t\t\t\tremoteStrokePreviewFrameRef.current = requestAnimationFrame(\n\t\t\t\t\tflushRemoteStrokePreviewWithStyle,\n\t\t\t\t);\n\t\t\t},\n\t\t\t[cancelPendingRemoteStrokePreviewClear, flushRemoteStrokePreviewWithStyle],\n\t\t);\n\n\t\t/** Latency between local commit and the committed item reaching peers via\n\t\t * `document:update` (debounce + websocket RTT). Keep the markup preview\n\t\t * alive a bit longer so peers don't see a blank frame between preview clear\n\t\t * and the rendered committed item. */\n\t\tconst REMOTE_STROKE_PREVIEW_HOLD_MS = 350;\n\n\t\tconst emitRemoteStrokePreviewClear = useCallback(() => {\n\t\t\tif (remoteStrokePreviewFrameRef.current != null) {\n\t\t\t\tcancelAnimationFrame(remoteStrokePreviewFrameRef.current);\n\t\t\t\tremoteStrokePreviewFrameRef.current = null;\n\t\t\t}\n\t\t\tcancelPendingRemoteStrokePreviewClear();\n\t\t\tremoteStrokePreviewClearTimerRef.current = window.setTimeout(() => {\n\t\t\t\tremoteStrokePreviewClearTimerRef.current = null;\n\t\t\t\tpendingRemoteStrokePreviewRef.current = null;\n\t\t\t\tdirectRemoteStrokePreviewRef.current = false;\n\t\t\t\tonPlacementPreviewChangeRef.current?.(null);\n\t\t\t}, REMOTE_STROKE_PREVIEW_HOLD_MS);\n\t\t}, [cancelPendingRemoteStrokePreviewClear]);\n\t\t/** Re-render overlays when the camera moves — including non-interactive + `remotePresence`. */\n\t\tconst overlayCameraTickRef = useRef(false);\n\t\toverlayCameraTickRef.current =\n\t\t\tinteractive ||\n\t\t\t(remotePresence != null && remotePresence.length > 0) ||\n\t\t\tpresenceOverlay != null;\n\t\tconst pruneEraserTrail = useCallback(\n\t\t\t(points: { x: number; y: number; t: number }[]) => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst maxAgeMs = 150;\n\t\t\t\treturn points.filter((p) => now - p.t <= maxAgeMs);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\t\tconst pruneLaserTrail = useCallback(\n\t\t\t(points: { x: number; y: number; t: number }[]) => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst maxAgeMs = 650;\n\t\t\t\treturn points.filter((p) => now - p.t <= maxAgeMs);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\t\tconst requestAutoResetTool = useCallback((usedTool: string) => {\n\t\t\tif (toolLockedRef.current) return;\n\t\t\tif (usedTool === \"select\" || usedTool === \"hand\") return;\n\t\t\tonToolChangeRequestRef.current?.(autoResetToolToRef.current);\n\t\t}, []);\n\n\t\tconst shouldKeepToolForContinuousPenInput = useCallback(\n\t\t\t(tool: string, pointerType: string) =>\n\t\t\t\tpointerType === \"pen\" && (tool === \"draw\" || tool === \"marker\"),\n\t\t\t[],\n\t\t);\n\n\t\tconst commitCompletedStroke = useCallback(\n\t\t\t(args: {\n\t\t\t\ttool: Extract<DragState, { kind: \"stroke\" }>[\"tool\"];\n\t\t\t\tpointerType: string;\n\t\t\t\tpoints: VectorPathPoint[];\n\t\t\t\tstyle: StrokeStyle;\n\t\t\t\titemId?: string;\n\t\t\t}) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change) return;\n\t\t\t\tif (args.tool === \"laser\") {\n\t\t\t\t\tif (!shouldKeepToolForContinuousPenInput(args.tool, args.pointerType)) {\n\t\t\t\t\t\trequestAutoResetTool(args.tool);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst id = args.itemId ?? createShapeId();\n\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\tid,\n\t\t\t\t\targs.points,\n\t\t\t\t\targs.tool,\n\t\t\t\t\targs.style,\n\t\t\t\t);\n\t\t\t\tif (item) {\n\t\t\t\t\tconst exists = itemsRef.current.some((it) => it.id === id);\n\t\t\t\t\tchange(\n\t\t\t\t\t\texists\n\t\t\t\t\t\t\t? replaceItem(itemsRef.current, id, item)\n\t\t\t\t\t\t\t: [...itemsRef.current, item],\n\t\t\t\t\t);\n\t\t\t\t\tpatchCurrentStrokeStyle({\n\t\t\t\t\t\tstroke: item.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\t\t\t\t\tstrokeWidth: item.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\t\t\t\t\tstrokeOpacity: item.strokeOpacity,\n\t\t\t\t\t\tstrokeDash: item.strokeDash,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!shouldKeepToolForContinuousPenInput(args.tool, args.pointerType)) {\n\t\t\t\t\trequestAutoResetTool(args.tool);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tpatchCurrentStrokeStyle,\n\t\t\t\trequestAutoResetTool,\n\t\t\t\tshouldKeepToolForContinuousPenInput,\n\t\t\t],\n\t\t);\n\n\t\tconst captureInteractionPointer = useCallback(\n\t\t\t(\n\t\t\t\ttarget: HTMLDivElement,\n\t\t\t\tpointerId: number,\n\t\t\t\toptions?: { captureNativePointer?: boolean },\n\t\t\t) => {\n\t\t\t\tconst captureNativePointer = options?.captureNativePointer ?? true;\n\t\t\t\tdebugApplePencilPointer(\"capture\", { pointerId, captureNativePointer });\n\t\t\t\tactiveInteractionPointerIdRef.current = pointerId;\n\t\t\t\tactiveInteractionPointerTargetRef.current = captureNativePointer\n\t\t\t\t\t? target\n\t\t\t\t\t: null;\n\t\t\t\tif (captureNativePointer) {\n\t\t\t\t\ttryPointerCaptureOnTarget(target, pointerId);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst releaseInteractionPointer = useCallback(() => {\n\t\t\tconst pointerId = activeInteractionPointerIdRef.current;\n\t\t\tconst target = activeInteractionPointerTargetRef.current;\n\t\t\tdebugApplePencilPointer(\"release\", { pointerId });\n\t\t\tif (pointerId != null && target) {\n\t\t\t\ttry {\n\t\t\t\t\tif (target.hasPointerCapture(pointerId)) {\n\t\t\t\t\t\ttarget.releasePointerCapture(pointerId);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore Safari/iPad capture races */\n\t\t\t\t}\n\t\t\t}\n\t\t\tactiveInteractionPointerIdRef.current = null;\n\t\t\tactiveInteractionPointerTargetRef.current = null;\n\t\t\tactiveInteractionTouchIdRef.current = null;\n\t\t}, []);\n\n\t\tconst renderSceneWithLivePenStroke = useCallback(\n\t\t\t(item: VectorSceneItem | null) => {\n\t\t\t\tlivePenStrokeItemRef.current = item;\n\t\t\t\tconst renderer = rendererRef.current;\n\t\t\t\tif (!renderer) return;\n\t\t\t\trenderer.renderLiveItem(item);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst updateStrokePreviewPoints = useCallback(\n\t\t\t(strokeState: StrokeDragState, points: VectorPathPoint[]) => {\n\t\t\t\tstrokeState.points = points;\n\t\t\t\tif (strokeState.itemId && strokeState.tool !== \"laser\") {\n\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\tstrokeState.itemId,\n\t\t\t\t\t\tpoints,\n\t\t\t\t\t\tstrokeState.tool,\n\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t);\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t}\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\temitRemoteStrokePreview(strokeState.tool, points);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (strokeState.tool === \"laser\") return;\n\t\t\t\tsetPlacementPreview({\n\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\ttool: strokeState.tool,\n\t\t\t\t\tpoints,\n\t\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t\t});\n\t\t\t},\n\t\t\t[emitRemoteStrokePreview, renderSceneWithLivePenStroke],\n\t\t);\n\n\t\tconst setStraightStrokeEndpoint = useCallback(\n\t\t\t(strokeState: StrokeDragState, endpoint: VectorPathPoint) => {\n\t\t\t\tconst straightLine = strokeState.straightLine;\n\t\t\t\tif (!straightLine) return;\n\t\t\t\tstraightLine.active = true;\n\t\t\t\tupdateStrokePreviewPoints(strokeState, [straightLine.anchorPoint, endpoint]);\n\t\t\t},\n\t\t\t[updateStrokePreviewPoints],\n\t\t);\n\n\t\tconst startOrRestartStraightStrokeHoldTimer = useCallback(\n\t\t\t(strokeState: StrokeDragState) => {\n\t\t\t\tconst straightLine = strokeState.straightLine;\n\t\t\t\tif (!straightLine || strokeState.tool !== \"draw\") return;\n\t\t\t\tclearStraightStrokeHoldTimer(strokeState);\n\t\t\t\tstraightLine.holdTimer = window.setTimeout(() => {\n\t\t\t\t\tstraightLine.holdTimer = null;\n\t\t\t\t\tconst currentStrokeState = dragStateRef.current;\n\t\t\t\t\tif (\n\t\t\t\t\t\tcurrentStrokeState.kind !== \"stroke\" ||\n\t\t\t\t\t\tcurrentStrokeState !== strokeState\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst endpoint = lastStrokePoint(currentStrokeState.points);\n\t\t\t\t\tif (!endpoint) return;\n\t\t\t\t\tsetStraightStrokeEndpoint(currentStrokeState, endpoint);\n\t\t\t\t}, STRAIGHT_STROKE_HOLD_DURATION_MS);\n\t\t\t},\n\t\t\t[setStraightStrokeEndpoint],\n\t\t);\n\n\t\tconst updateStraightStrokeForMove = useCallback(\n\t\t\t(\n\t\t\t\tstrokeState: StrokeDragState,\n\t\t\t\tclientX: number,\n\t\t\t\tclientY: number,\n\t\t\t\tendpoint: VectorPathPoint,\n\t\t\t): boolean => {\n\t\t\t\tconst straightLine = strokeState.straightLine;\n\t\t\t\tif (!straightLine || strokeState.tool !== \"draw\") return false;\n\t\t\t\tif (straightLine.active) {\n\t\t\t\t\tsetStraightStrokeEndpoint(strokeState, endpoint);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tstraightLine.holdTimer &&\n\t\t\t\t\thasMovedPastStraightStrokeJitter(straightLine, clientX, clientY)\n\t\t\t\t) {\n\t\t\t\t\tstraightLine.holdScreen = { x: clientX, y: clientY };\n\t\t\t\t\tstartOrRestartStraightStrokeHoldTimer(strokeState);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\t[setStraightStrokeEndpoint, startOrRestartStraightStrokeHoldTimer],\n\t\t);\n\n\t\tconst finalizeStrokeDragState = useCallback(\n\t\t\t(strokeState: Extract<DragState, { kind: \"stroke\" }>) => {\n\t\t\t\tconst tool = strokeState.tool;\n\t\t\t\tconst pts = strokeState.points;\n\t\t\t\tconst pointerType = strokeState.pointerType;\n\t\t\t\tconst itemId = strokeState.itemId;\n\t\t\t\tconst style = { ...strokeStyleRef.current };\n\t\t\t\tdebugApplePencilPointer(\"finalize-stroke\", {\n\t\t\t\t\tpointerType,\n\t\t\t\t\ttool,\n\t\t\t\t\tpoints: pts.length,\n\t\t\t\t});\n\t\t\t\tclearStraightStrokeHoldTimer(strokeState);\n\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\treleaseInteractionPointer();\n\t\t\t\tif (itemId) {\n\t\t\t\t\trenderSceneWithLivePenStroke(null);\n\t\t\t\t}\n\t\t\t\temitRemoteStrokePreviewClear();\n\t\t\t\tsetPlacementPreview(null);\n\t\t\t\tcommitCompletedStroke({\n\t\t\t\t\ttool,\n\t\t\t\t\tpointerType,\n\t\t\t\t\tpoints: [...pts],\n\t\t\t\t\tstyle,\n\t\t\t\t\titemId,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[\n\t\t\t\tcommitCompletedStroke,\n\t\t\t\temitRemoteStrokePreviewClear,\n\t\t\t\treleaseInteractionPointer,\n\t\t\t\trenderSceneWithLivePenStroke,\n\t\t\t],\n\t\t);\n\n\t\tconst renderFrame = useCallback(() => {\n\t\t\tconst renderer = rendererRef.current;\n\t\t\tconst cam = cameraRef.current;\n\t\t\tif (!renderer || !cam) return;\n\t\t\trenderer.render();\n\t\t\tif (overlayCameraTickRef.current) {\n\t\t\t\tsetCameraTick((n) => n + 1);\n\t\t\t}\n\t\t\tif (!reducedMotionRef.current) {\n\t\t\t\tsetZoomPercent(Math.round(cam.zoom * 100));\n\t\t\t}\n\t\t\tonCameraChangeRef.current?.();\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tconst interactionEl = interactionRootRef.current;\n\t\t\tif (!el || !interactionEl) return;\n\n\t\t\tconst camera = new Camera2D({ minZoom: 0.1, maxZoom: 24 });\n\t\t\tcameraRef.current = camera;\n\t\t\tsetCameraForOverlay(camera);\n\n\t\t\tconst scene = new VectorScene();\n\t\t\tsceneRef.current = scene;\n\t\t\tscene.setItems(itemsRef.current);\n\n\t\t\tconst renderer = new SvgVectorRenderer({\n\t\t\t\tcontainer: el,\n\t\t\t\tscene,\n\t\t\t\tcamera,\n\t\t\t\tpointerEventsNone: interactiveRef.current,\n\t\t\t});\n\t\t\trendererRef.current = renderer;\n\t\t\trenderer.render();\n\t\t\tif (!reducedMotionRef.current) {\n\t\t\t\tsetZoomPercent(Math.round(camera.zoom * 100));\n\t\t\t}\n\n\t\t\tconst detachInput = attachViewportInput({\n\t\t\t\telement: interactionEl,\n\t\t\t\tcamera,\n\t\t\t\tonUpdate: renderFrame,\n\t\t\t\twheelElement: wrapperRef.current ?? undefined,\n\t\t\t\ttouchHandledElsewhere: applePencilNav,\n\t\t\t\tallowPrimaryPointerPan: () => {\n\t\t\t\t\tif (interactiveRef.current) {\n\t\t\t\t\t\treturn toolIdRef.current === \"hand\";\n\t\t\t\t\t}\n\t\t\t\t\tconst t = toolIdRef.current;\n\t\t\t\t\treturn t === \"hand\" || t === \"select\";\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlet detachPencil: (() => void) | undefined;\n\t\t\tif (applePencilNav) {\n\t\t\t\tdetachPencil = attachApplePencilNavigation({\n\t\t\t\t\telement: interactionEl,\n\t\t\t\t\tcamera,\n\t\t\t\t\tgetCurrentToolId: () => toolIdRef.current,\n\t\t\t\t\tonUpdate: renderFrame,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tdetachInput();\n\t\t\t\tdetachPencil?.();\n\t\t\t\trenderer.destroy();\n\t\t\t\trendererRef.current = null;\n\t\t\t\tsceneRef.current = null;\n\t\t\t\tcameraRef.current = null;\n\t\t\t\tsetCameraForOverlay(null);\n\t\t\t};\n\t\t}, [applePencilNav, renderFrame]);\n\n\t\tuseEffect(() => {\n\t\t\tconst r = rendererRef.current;\n\t\t\tif (!r) return;\n\t\t\tr.setPointerEventsNone(interactive);\n\t\t}, [interactive]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!eraserActive && laserTrail.length === 0) return;\n\t\t\tconst timer = window.setInterval(() => {\n\t\t\t\tsetEraserTrail((prev) => pruneEraserTrail(prev));\n\t\t\t\tsetLaserTrail((prev) => pruneLaserTrail(prev));\n\t\t\t}, 50);\n\t\t\treturn () => window.clearInterval(timer);\n\t\t}, [eraserActive, laserTrail.length, pruneEraserTrail, pruneLaserTrail]);\n\n\t\tuseEffect(() => {\n\t\t\tconst root = wrapperRef.current;\n\t\t\tif (!root || !onWorldPointerMove) return;\n\t\t\tlet lastEmit = 0;\n\t\t\tconst throttleMs = 33;\n\t\t\tconst move = (e: PointerEvent) => {\n\t\t\t\tconst now = performance.now();\n\t\t\t\tif (now - lastEmit < throttleMs) return;\n\t\t\t\tlastEmit = now;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tconst rect = sceneContainerRef.current?.getBoundingClientRect();\n\t\t\t\tif (!cam || !rect) return;\n\t\t\t\tconst { worldX, worldY } = cam.screenToWorld(\n\t\t\t\t\te.clientX - rect.left,\n\t\t\t\t\te.clientY - rect.top,\n\t\t\t\t);\n\t\t\t\tonWorldPointerMoveRef.current?.({ x: worldX, y: worldY });\n\t\t\t};\n\t\t\tconst leave = () => onWorldPointerLeaveRef.current?.();\n\t\t\troot.addEventListener(\"pointermove\", move, { passive: true });\n\t\t\troot.addEventListener(\"pointerleave\", leave);\n\t\t\treturn () => {\n\t\t\t\troot.removeEventListener(\"pointermove\", move);\n\t\t\t\troot.removeEventListener(\"pointerleave\", leave);\n\t\t\t};\n\t\t}, [onWorldPointerMove]);\n\n\t\t// Track the latest cursor screen position so pasted content can spawn\n\t\t// under the cursor, mirroring drag & drop placement.\n\t\tuseEffect(() => {\n\t\t\tconst root = wrapperRef.current;\n\t\t\tif (!root) return;\n\t\t\tconst record = (e: PointerEvent) => {\n\t\t\t\tlastPointerScreenRef.current = { x: e.clientX, y: e.clientY };\n\t\t\t};\n\t\t\tconst clear = () => {\n\t\t\t\tlastPointerScreenRef.current = null;\n\t\t\t};\n\t\t\troot.addEventListener(\"pointermove\", record, { passive: true });\n\t\t\troot.addEventListener(\"pointerdown\", record, { passive: true });\n\t\t\troot.addEventListener(\"pointerleave\", clear);\n\t\t\treturn () => {\n\t\t\t\troot.removeEventListener(\"pointermove\", record);\n\t\t\t\troot.removeEventListener(\"pointerdown\", record);\n\t\t\t\troot.removeEventListener(\"pointerleave\", clear);\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tif (directRemoteStrokePreviewRef.current && placementPreview === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonPlacementPreviewChangeRef.current?.(placementPreview);\n\t\t}, [placementPreview]);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (remoteStrokePreviewFrameRef.current != null) {\n\t\t\t\t\tcancelAnimationFrame(remoteStrokePreviewFrameRef.current);\n\t\t\t\t}\n\t\t\t\tif (remoteStrokePreviewClearTimerRef.current != null) {\n\t\t\t\t\tclearTimeout(remoteStrokePreviewClearTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst scene = sceneRef.current;\n\t\t\tconst renderer = rendererRef.current;\n\t\t\tif (scene) {\n\t\t\t\tconst live = livePenStrokeItemRef.current;\n\t\t\t\tif (live && resolvedSceneItems.some((it) => it.id === live.id)) {\n\t\t\t\t\tlivePenStrokeItemRef.current = null;\n\t\t\t\t}\n\t\t\t\tscene.setItems(resolvedSceneItems);\n\t\t\t\trenderFrame();\n\t\t\t\trenderer?.renderLiveItem(livePenStrokeItemRef.current);\n\t\t\t}\n\t\t}, [resolvedSceneItems, renderFrame]);\n\n\t\t/** Drop selection ids that no longer exist (e.g. erased item). */\n\t\tuseEffect(() => {\n\t\t\tconst ids = effectiveSelectedIds;\n\t\t\tconst valid = ids.filter((id) => items.some((i) => i.id === id));\n\t\t\tif (valid.length === ids.length) return;\n\t\t\tsetEffectiveSelectedIdsRef.current(valid);\n\t\t}, [items, effectiveSelectedIds]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!editingTextId) return;\n\t\t\tconst it = items.find((i) => i.id === editingTextId);\n\t\t\tif (!it || it.toolKind !== \"text\") {\n\t\t\t\tsetEditingTextId(null);\n\t\t\t}\n\t\t}, [items, editingTextId]);\n\n\t\tuseEffect(() => {\n\t\t\trememberImageBlobHrefs(items, rememberedImageBlobHrefsRef.current);\n\t\t}, [items]);\n\n\t\tconst blobRevokeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tuseEffect(() => {\n\t\t\tif (blobRevokeTimerRef.current !== null) {\n\t\t\t\tclearTimeout(blobRevokeTimerRef.current);\n\t\t\t\tblobRevokeTimerRef.current = null;\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tblobRevokeTimerRef.current = setTimeout(() => {\n\t\t\t\t\treleaseRememberedBlobHrefs(rememberedImageBlobHrefsRef.current, (href) =>\n\t\t\t\t\t\tURL.revokeObjectURL(href),\n\t\t\t\t\t);\n\t\t\t\t\tblobRevokeTimerRef.current = null;\n\t\t\t\t}, 100);\n\t\t\t};\n\t\t}, []);\n\n\t\tconst PASTE_OFFSET_WORLD = 24;\n\n\t\tconst copyIdsToInternalClipboard = useCallback((ids: readonly string[]) => {\n\t\t\tif (ids.length === 0) return;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst copies = ids\n\t\t\t\t.map((id) => list.find((i) => i.id === id))\n\t\t\t\t.filter((x): x is VectorSceneItem => x != null);\n\t\t\tclipboardRef.current = copies.map(\n\t\t\t\t(it) => JSON.parse(JSON.stringify(it)) as VectorSceneItem,\n\t\t\t);\n\t\t}, []);\n\n\t\tconst pasteFromInternalClipboard = useCallback(() => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tconst buf = clipboardRef.current;\n\t\t\tif (!change || !buf?.length) return;\n\t\t\tconst clones = cloneVectorSceneItemsWithNewIds(buf);\n\t\t\tconst moved = clones.map((it) =>\n\t\t\t\tmoveItemByDelta(it, PASTE_OFFSET_WORLD, PASTE_OFFSET_WORLD),\n\t\t\t);\n\t\t\tchange([...itemsRef.current, ...moved]);\n\t\t\tsetEffectiveSelectedIdsRef.current(moved.map((i) => i.id));\n\t\t}, []);\n\n\t\tconst duplicateIds = useCallback((ids: readonly string[]) => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change || ids.length === 0) return;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst selected = ids\n\t\t\t\t.map((id) => list.find((i) => i.id === id))\n\t\t\t\t.filter((x): x is VectorSceneItem => x != null);\n\t\t\tconst clones = cloneVectorSceneItemsWithNewIds(selected);\n\t\t\tconst moved = clones.map((it) =>\n\t\t\t\tmoveItemByDelta(it, PASTE_OFFSET_WORLD, PASTE_OFFSET_WORLD),\n\t\t\t);\n\t\t\tchange([...list, ...moved]);\n\t\t\tsetEffectiveSelectedIdsRef.current(moved.map((i) => i.id));\n\t\t}, []);\n\n\t\tconst deleteIds = useCallback((ids: readonly string[]) => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change || ids.length === 0) return;\n\t\t\tconst idSet = new Set(ids);\n\t\t\tchange(itemsRef.current.filter((i) => !idSet.has(i.id)));\n\t\t\tsetEffectiveSelectedIdsRef.current([]);\n\t\t}, []);\n\n\t\tconst cutIds = useCallback(\n\t\t\t(ids: readonly string[]) => {\n\t\t\t\tcopyIdsToInternalClipboard(ids);\n\t\t\t\tdeleteIds(ids);\n\t\t\t},\n\t\t\t[copyIdsToInternalClipboard, deleteIds],\n\t\t);\n\n\t\tconst setLockedOnIds = useCallback((ids: readonly string[], locked: boolean) => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change || ids.length === 0) return;\n\t\t\tconst idSet = new Set(ids);\n\t\t\tchange(\n\t\t\t\titemsRef.current.map((it) => (idSet.has(it.id) ? { ...it, locked } : it)),\n\t\t\t);\n\t\t}, []);\n\n\t\tconst reorderIds = useCallback(\n\t\t\t(ids: readonly string[], direction: ReorderDirection) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change || ids.length === 0) return;\n\t\t\t\tconst next = reorderItemsByIds(itemsRef.current, ids, direction);\n\t\t\t\tchange(next);\n\t\t\t\tsetEffectiveSelectedIdsRef.current([...ids]);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst onKeyDown = useCallback(\n\t\t\t(e: KeyboardEvent<HTMLDivElement>) => {\n\t\t\t\tconst t = e.target;\n\t\t\t\tif (\n\t\t\t\t\tt instanceof HTMLTextAreaElement ||\n\t\t\t\t\tt instanceof HTMLInputElement ||\n\t\t\t\t\t(t instanceof HTMLElement && t.isContentEditable)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (editingTextIdRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst camera = cameraRef.current;\n\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\tif (!camera || !el) return;\n\n\t\t\t\tif (interactive && onItemsChangeRef.current) {\n\t\t\t\t\tconst mod = e.ctrlKey || e.metaKey;\n\t\t\t\t\tif (mod && e.key === \"c\") {\n\t\t\t\t\t\tconst ids = effectiveSelectedIdsRef.current;\n\t\t\t\t\t\tif (ids.length > 0) {\n\t\t\t\t\t\t\tcopyIdsToInternalClipboard(ids);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (mod && e.key === \"v\") {\n\t\t\t\t\t\tif (clipboardRef.current?.length) {\n\t\t\t\t\t\t\tpasteFromInternalClipboard();\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (mod && e.key === \"z\") {\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tredo();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tundo();\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (mod && e.key === \"Z\") {\n\t\t\t\t\t\tredo();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.key === \"Delete\" || e.key === \"Backspace\") {\n\t\t\t\t\t\tconst ids = effectiveSelectedIdsRef.current;\n\t\t\t\t\t\tif (ids.length > 0) {\n\t\t\t\t\t\t\tdeleteIds(ids);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst step = 40 / camera.zoom;\n\t\t\t\tlet handled = false;\n\t\t\t\tif (e.key === \"ArrowLeft\") {\n\t\t\t\t\tcamera.x += step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\t\t\tcamera.x -= step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\t\t\tcamera.y += step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"ArrowDown\") {\n\t\t\t\t\tcamera.y -= step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"+\" || e.key === \"=\") {\n\t\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_IN_STEP, {\n\t\t\t\t\t\tx: rect.width / 2,\n\t\t\t\t\t\ty: rect.height / 2,\n\t\t\t\t\t});\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"-\" || e.key === \"_\") {\n\t\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_OUT_STEP, {\n\t\t\t\t\t\tx: rect.width / 2,\n\t\t\t\t\t\ty: rect.height / 2,\n\t\t\t\t\t});\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"0\" && (e.metaKey || e.ctrlKey)) {\n\t\t\t\t\tcamera.zoom = 1;\n\t\t\t\t\tcamera.x = 0;\n\t\t\t\t\tcamera.y = 0;\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\n\t\t\t\tif (handled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\trenderFrame();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\trenderFrame,\n\t\t\t\tinteractive,\n\t\t\t\tcopyIdsToInternalClipboard,\n\t\t\t\tpasteFromInternalClipboard,\n\t\t\t\tdeleteIds,\n\t\t\t\tundo,\n\t\t\t\tredo,\n\t\t\t],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst el = wrapperRef.current;\n\t\t\tif (!el) return;\n\t\t\tel.tabIndex = 0;\n\n\t\t\t// Inject skeleton animation keyframe once\n\t\t\tif (!document.getElementById(\"canvu-skeleton-keyframe\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"canvu-skeleton-keyframe\";\n\t\t\t\tstyle.textContent =\n\t\t\t\t\t\"@keyframes canvu-pulse { 0%,100% { opacity: 0.3 } 50% { opacity: 0.7 } }\";\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t\tif (!document.getElementById(\"canvu-pen-active-ui-block\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"canvu-pen-active-ui-block\";\n\t\t\t\tstyle.textContent = CANVU_PEN_ACTIVE_UI_BLOCK_CSS;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\n\t\t\tconst focusOnPointerDown = (e: PointerEvent) => {\n\t\t\t\tconst t = e.target;\n\t\t\t\tif (\n\t\t\t\t\tt instanceof HTMLTextAreaElement ||\n\t\t\t\t\tt instanceof HTMLInputElement ||\n\t\t\t\t\t(t instanceof HTMLElement && t.isContentEditable)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tel.focus({ preventScroll: true });\n\t\t\t};\n\t\t\tel.addEventListener(\"pointerdown\", focusOnPointerDown);\n\n\t\t\tconst ro = new ResizeObserver((entries) => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tconst { inlineSize, blockSize } = entry.borderBoxSize[0] ?? {};\n\t\t\t\t\tif (inlineSize && blockSize) {\n\t\t\t\t\t\tviewportSizeRef.current = {\n\t\t\t\t\t\t\twidth: inlineSize,\n\t\t\t\t\t\t\theight: blockSize,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tro.observe(el);\n\n\t\t\treturn () => {\n\t\t\t\tel.removeEventListener(\"pointerdown\", focusOnPointerDown);\n\t\t\t\tro.disconnect();\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst root = wrapperRef.current;\n\t\t\tif (!root) return;\n\t\t\tconst surface =\n\t\t\t\t(root.closest(\n\t\t\t\t\t'[data-slot=\"vector-canvas-viewport-surface\"]',\n\t\t\t\t) as HTMLElement | null) ?? root;\n\t\t\tconst activePenPointerIds = new Set<number>();\n\t\t\tconst isInteractiveUiTarget = (target: EventTarget | null): boolean => {\n\t\t\t\tif (!(target instanceof HTMLElement)) return false;\n\t\t\t\tif (target.closest('[data-slot=\"shape-context-menu\"]')) return true;\n\t\t\t\tconst ui = target.closest(\n\t\t\t\t\t[\n\t\t\t\t\t\t'[data-slot=\"vector-canvas-toolbar\"]',\n\t\t\t\t\t\t'[data-slot=\"canvu-plugin-layer\"]',\n\t\t\t\t\t\t'[data-slot=\"vector-selection-inspector\"]',\n\t\t\t\t\t\t'[data-slot=\"zoom-minimap-panel\"]',\n\t\t\t\t\t\t'[data-slot=\"text-edit-overlay\"]',\n\t\t\t\t\t\t\".vector-toolbar-overflow-panel\",\n\t\t\t\t\t].join(\", \"),\n\t\t\t\t);\n\t\t\t\tif (!ui) return false;\n\t\t\t\treturn surface.contains(ui);\n\t\t\t};\n\t\t\tconst syncPenActive = () => {\n\t\t\t\tconst active = activePenPointerIds.size > 0;\n\t\t\t\tsurface.toggleAttribute(\"data-canvu-pen-active\", active);\n\t\t\t\tdocument.body.toggleAttribute(\"data-canvu-pen-active\", active);\n\t\t\t};\n\t\t\tconst onPointerDownCapture = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"pen\") return;\n\t\t\t\tpenDetectedRef.current = true;\n\t\t\t\tlastPenPointerDownAtRef.current = performance.now();\n\t\t\t\t// Pen taps landing on UI controls (selection inspector, toolbar, etc.)\n\t\t\t\t// must not toggle pen-active — that CSS would immediately set\n\t\t\t\t// pointer-events:none on the target and break the very tap that\n\t\t\t\t// triggered it.\n\t\t\t\tif (isInteractiveUiTarget(e.target)) return;\n\t\t\t\tactivePenPointerIds.add(e.pointerId);\n\t\t\t\tsyncPenActive();\n\t\t\t};\n\t\t\tconst suppressTouchUiEvent = (e: Event) => {\n\t\t\t\t// Only suppress UI touches while a pen is actively touching the\n\t\t\t\t// surface (palm rejection during drawing). Once the pen lifts,\n\t\t\t\t// finger taps on UI should work normally.\n\t\t\t\tif (activePenPointerIds.size === 0) return;\n\t\t\t\tif (!isInteractiveUiTarget(e.target)) return;\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t};\n\t\t\tconst onTouchPointerCapture = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"touch\") return;\n\t\t\t\tsuppressTouchUiEvent(e);\n\t\t\t};\n\t\t\tconst onPointerEndCapture = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"pen\") return;\n\t\t\t\tactivePenPointerIds.delete(e.pointerId);\n\t\t\t\tsyncPenActive();\n\t\t\t};\n\t\t\tsurface.addEventListener(\"pointerdown\", onPointerDownCapture, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\tsurface.addEventListener(\"pointerup\", onPointerEndCapture, { capture: true });\n\t\t\tsurface.addEventListener(\"pointercancel\", onPointerEndCapture, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"pointerdown\", onTouchPointerCapture, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchstart\", suppressTouchUiEvent, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchmove\", suppressTouchUiEvent, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"selectstart\", suppressTouchUiEvent, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tsurface.removeEventListener(\"pointerdown\", onPointerDownCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tsurface.removeEventListener(\"pointerup\", onPointerEndCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tsurface.removeEventListener(\"pointercancel\", onPointerEndCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"pointerdown\", onTouchPointerCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchstart\", suppressTouchUiEvent, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchmove\", suppressTouchUiEvent, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"selectstart\", suppressTouchUiEvent, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tsurface.removeAttribute(\"data-canvu-pen-active\");\n\t\t\t\tdocument.body.removeAttribute(\"data-canvu-pen-active\");\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tif (!el) return;\n\t\t\tif (interactive) return;\n\n\t\t\tconst onPointerDownForTools = (e: PointerEvent) => {\n\t\t\t\tif (e.button !== 0) return;\n\t\t\t\tif (toolIdRef.current === \"hand\") return;\n\t\t\t\tconst cb = onWorldPointerDownRef.current;\n\t\t\t\tif (!cb) return;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\tconst { worldX, worldY } = cam.screenToWorld(\n\t\t\t\t\te.clientX - rect.left,\n\t\t\t\t\te.clientY - rect.top,\n\t\t\t\t);\n\t\t\t\tcb({\n\t\t\t\t\tworldX,\n\t\t\t\t\tworldY,\n\t\t\t\t\ttoolId: toolIdRef.current,\n\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tel.addEventListener(\"pointerdown\", onPointerDownForTools);\n\t\t\treturn () => el.removeEventListener(\"pointerdown\", onPointerDownForTools);\n\t\t}, [interactive]);\n\n\t\tconst screenToWorld = useCallback((clientX: number, clientY: number) => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tconst cam = cameraRef.current;\n\t\t\tif (!el || !cam) return { worldX: 0, worldY: 0 };\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\treturn cam.screenToWorld(clientX - rect.left, clientY - rect.top);\n\t\t}, []);\n\n\t\tconst handleOverlayContextMenu = useCallback(\n\t\t\t(e: MouseEvent<HTMLDivElement>) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (toolIdRef.current !== \"select\") return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\t\t\t\tconst hit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {\n\t\t\t\t\tlineHitWorld,\n\t\t\t\t\tignoreLocked: true,\n\t\t\t\t});\n\t\t\t\tif (!hit) {\n\t\t\t\t\tsetContextMenu(null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cur = effectiveSelectedIdsRef.current;\n\t\t\t\tlet nextIds: string[];\n\t\t\t\tif (!cur.includes(hit.id)) {\n\t\t\t\t\tnextIds = e.shiftKey ? [...cur, hit.id] : [hit.id];\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current(nextIds);\n\t\t\t\t} else {\n\t\t\t\t\tnextIds = cur;\n\t\t\t\t}\n\t\t\t\tsetContextMenu({\n\t\t\t\t\tx: e.clientX,\n\t\t\t\t\ty: e.clientY,\n\t\t\t\t\titemIds: nextIds,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[screenToWorld],\n\t\t);\n\n\t\tconst viewportHandle = useMemo<VectorViewportHandle>(\n\t\t\t() => ({\n\t\t\t\tgetCamera: () => cameraRef.current,\n\t\t\t\trequestRender: () => {\n\t\t\t\t\trenderFrame();\n\t\t\t\t},\n\t\t\t\tgetViewportSize: () => {\n\t\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\t\tif (!el) {\n\t\t\t\t\t\treturn { width: 0, height: 0 };\n\t\t\t\t\t}\n\t\t\t\t\treturn { width: el.clientWidth, height: el.clientHeight };\n\t\t\t\t},\n\t\t\t\tfitWorldRect: (worldRect, options) => {\n\t\t\t\t\tconst camera = cameraRef.current;\n\t\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\t\tif (!camera || !el) return;\n\t\t\t\t\tconst w = el.clientWidth;\n\t\t\t\t\tconst h = el.clientHeight;\n\t\t\t\t\tfitCameraToWorldRect(camera, w, h, worldRect, options?.padding ?? 0.08);\n\t\t\t\t\trenderFrame();\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[renderFrame],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tpluginViewportRef.current = viewportHandle;\n\t\t\treturn () => {\n\t\t\t\tif (pluginViewportRef.current === viewportHandle) {\n\t\t\t\t\tpluginViewportRef.current = null;\n\t\t\t\t}\n\t\t\t};\n\t\t}, [viewportHandle]);\n\n\t\tuseImperativeHandle(ref, () => viewportHandle, [viewportHandle]);\n\n\t\tconst handleZoomInClick = useCallback(() => {\n\t\t\tconst camera = cameraRef.current;\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tif (!camera || !el) return;\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_IN_STEP, {\n\t\t\t\tx: rect.width / 2,\n\t\t\t\ty: rect.height / 2,\n\t\t\t});\n\t\t\trenderFrame();\n\t\t}, [renderFrame]);\n\n\t\tconst handleZoomOutClick = useCallback(() => {\n\t\t\tconst camera = cameraRef.current;\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tif (!camera || !el) return;\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_OUT_STEP, {\n\t\t\t\tx: rect.width / 2,\n\t\t\t\ty: rect.height / 2,\n\t\t\t});\n\t\t\trenderFrame();\n\t\t}, [renderFrame]);\n\n\t\tuseEffect(() => {\n\t\t\tconst current = strokeStyleRef.current;\n\t\t\tif (toolId === \"marker\") {\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\t...current,\n\t\t\t\t\t...MARKER_TOOL_STYLE,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t/* Leaving marker resets opacity (draw items would inherit 0.5 otherwise);\n\t\t\t strokeDash and textFontSize survive the reset so the user keeps their\n\t\t\t choices when switching back. */\n\t\t\tif (isDefaultMarkerToolStyle(current)) {\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\tstroke: DEFAULT_STROKE_STYLE.stroke,\n\t\t\t\t\tstrokeWidth: toolId === \"draw\" ? 10 : DEFAULT_STROKE_STYLE.strokeWidth,\n\t\t\t\t\tstrokeDash: current.strokeDash,\n\t\t\t\t\ttextFontSize: current.textFontSize,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentStrokeStyle({\n\t\t\t\tstroke: current.stroke,\n\t\t\t\tstrokeWidth: toolId === \"draw\" ? 10 : current.strokeWidth,\n\t\t\t\tstrokeDash: current.strokeDash,\n\t\t\t\ttextFontSize: current.textFontSize,\n\t\t\t});\n\t\t}, [setCurrentStrokeStyle, toolId]);\n\n\t\tuseEffect(() => {\n\t\t\tconst primaryId = effectiveSelectedIds[0];\n\t\t\tif (primaryId == null) return;\n\t\t\tconst it = items.find((i) => i.id === primaryId);\n\t\t\tif (!it || it.locked) return;\n\t\t\tif (it.toolKind === \"image\") return;\n\t\t\tpatchCurrentStrokeStyle({\n\t\t\t\tstroke: it.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\t\t\tstrokeWidth: it.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\t\t\tstrokeOpacity: it.strokeOpacity,\n\t\t\t\tstrokeDash: it.strokeDash,\n\t\t\t\t...(it.toolKind === \"text\" && it.textFontSize != null\n\t\t\t\t\t? { textFontSize: it.textFontSize }\n\t\t\t\t\t: {}),\n\t\t\t});\n\t\t}, [effectiveSelectedIds, items, patchCurrentStrokeStyle]);\n\n\t\tconst handleSelectionStyleChange = useCallback(\n\t\t\t(patch: {\n\t\t\t\tstroke: string;\n\t\t\t\tstrokeWidth: number;\n\t\t\t\tstrokeOpacity?: number;\n\t\t\t\tstrokeDash?: \"solid\" | \"dashed\";\n\t\t\t\ttextFontSize?: number;\n\t\t\t}) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change) return;\n\t\t\t\tconst ids = effectiveSelectedIdsRef.current;\n\t\t\t\tif (ids.length === 0) return;\n\t\t\t\tlet nextList: VectorSceneItem[] = [...itemsRef.current];\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tconst it = nextList.find((i) => i.id === id);\n\t\t\t\t\tif (!it || it.locked) continue;\n\t\t\t\t\tconst next = applyStrokeToItem(it, patch);\n\t\t\t\t\tconst out =\n\t\t\t\t\t\teditingTextIdRef.current === id && next.toolKind === \"text\"\n\t\t\t\t\t\t\t? applyTextDraftWhileEditing(next, draftTextRef.current)\n\t\t\t\t\t\t\t: next;\n\t\t\t\t\tnextList = replaceItem(nextList, id, out);\n\t\t\t\t}\n\t\t\t\tchange(nextList);\n\t\t\t\tpatchCurrentStrokeStyle(patch);\n\t\t\t},\n\t\t\t[patchCurrentStrokeStyle],\n\t\t);\n\n\t\tconst handleActiveToolStyleChange = useCallback(\n\t\t\t(patch: {\n\t\t\t\tstroke: string;\n\t\t\t\tstrokeWidth: number;\n\t\t\t\tstrokeOpacity?: number;\n\t\t\t\tstrokeDash?: \"solid\" | \"dashed\";\n\t\t\t\ttextFontSize?: number;\n\t\t\t}) => {\n\t\t\t\tpatchCurrentStrokeStyle(patch);\n\t\t\t},\n\t\t\t[patchCurrentStrokeStyle],\n\t\t);\n\n\t\tconst commitTextEdit = useCallback(() => {\n\t\t\tconst id = editingTextIdRef.current;\n\t\t\tif (!id) return;\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change) return;\n\t\t\tconst text = draftTextRef.current;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst it = list.find((i) => i.id === id);\n\t\t\tif (!it || it.toolKind !== \"text\") {\n\t\t\t\tsetEditingTextId(null);\n\t\t\t\teditingTextSnapshotRef.current = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst next = rebuildItemSvg({ ...it, text });\n\t\t\tchange(replaceItem(list, id, next));\n\t\t\teditingTextSnapshotRef.current = null;\n\t\t\tsetEditingTextId(null);\n\t\t}, []);\n\n\t\tconst handleDraftTextChange = useCallback((v: string) => {\n\t\t\tsetDraftText(v);\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tconst editId = editingTextIdRef.current;\n\t\t\tif (!change || !editId) return;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst it = list.find((i) => i.id === editId);\n\t\t\tif (!it || it.toolKind !== \"text\") return;\n\t\t\tchange(replaceItem(list, editId, applyTextDraftWhileEditing(it, v)));\n\t\t}, []);\n\n\t\t/** End inline text edit when switching to a tool that places on the canvas (draw, shapes…). */\n\t\tuseEffect(() => {\n\t\t\tif (!editingTextId) return;\n\t\t\tif (toolId === \"select\" || toolId === \"text\") return;\n\t\t\tcommitTextEdit();\n\t\t}, [toolId, editingTextId, commitTextEdit]);\n\n\t\tconst cancelTextEdit = useCallback(() => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tconst id = editingTextIdRef.current;\n\t\t\tconst snap = editingTextSnapshotRef.current;\n\t\t\tif (change && id && snap) {\n\t\t\t\tchange(replaceItem(itemsRef.current, id, snap));\n\t\t\t}\n\t\t\teditingTextSnapshotRef.current = null;\n\t\t\tsetEditingTextId(null);\n\t\t}, []);\n\n\t\tconst placeImageFilesAtWorld = useCallback(\n\t\t\tasync (\n\t\t\t\tfiles: File[],\n\t\t\t\tworldX: number,\n\t\t\t\tworldY: number,\n\t\t\t\toptions?: { stackBelowExistingItems?: boolean },\n\t\t\t) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change || files.length === 0) return;\n\t\t\t\tconst store = imageStoreRef.current;\n\t\t\t\tif (!store) return;\n\t\t\t\tconst stackBelowExistingItems = options?.stackBelowExistingItems ?? true;\n\t\t\t\ttry {\n\t\t\t\t\tconst pdfFiles = files.filter((file) => file.type === \"application/pdf\");\n\t\t\t\t\tif (pdfFiles.length > 0) {\n\t\t\t\t\t\tconst gapWorld = 16;\n\t\t\t\t\t\tconst estW = 1241;\n\t\t\t\t\t\tconst estH = 1754;\n\t\t\t\t\t\tconst estPages = 10;\n\t\t\t\t\t\tconst skels: {\n\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\tx: number;\n\t\t\t\t\t\t\ty: number;\n\t\t\t\t\t\t\twidth: number;\n\t\t\t\t\t\t\theight: number;\n\t\t\t\t\t\t}[] = [];\n\t\t\t\t\t\tfor (const [fileIndex] of pdfFiles.entries()) {\n\t\t\t\t\t\t\tfor (let pageIndex = 0; pageIndex < estPages; pageIndex++) {\n\t\t\t\t\t\t\t\tconst id = `skeleton-${skeletonSeqRef.current++}`;\n\t\t\t\t\t\t\t\tconst offsetIndex = fileIndex * estPages + pageIndex;\n\t\t\t\t\t\t\t\tskels.push({\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tx: worldX - estW / 2,\n\t\t\t\t\t\t\t\t\ty: worldY - estH / 2 + offsetIndex * (estH + gapWorld),\n\t\t\t\t\t\t\t\t\twidth: estW,\n\t\t\t\t\t\t\t\t\theight: estH,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetLoadingSkeletons(skels);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = await ingestAssetFilesToSceneItems({\n\t\t\t\t\t\tfiles,\n\t\t\t\t\t\texistingItems: stackBelowExistingItems ? itemsRef.current : [],\n\t\t\t\t\t\tworldCenter: {\n\t\t\t\t\t\t\tx: worldX,\n\t\t\t\t\t\t\ty: worldY,\n\t\t\t\t\t\t},\n\t\t\t\t\t\timageStore: store,\n\t\t\t\t\t\tassetStore: assetStoreRef.current ?? undefined,\n\t\t\t\t\t\tonItemsReady: (nextItems) => {\n\t\t\t\t\t\t\tif (nextItems.length === 0) return;\n\t\t\t\t\t\t\tsetLoadingSkeletons([]);\n\t\t\t\t\t\t\tchange([...itemsRef.current, ...nextItems]);\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(nextItems.map((item) => item.id));\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tif (result.errors.length > 0) {\n\t\t\t\t\t\tfor (const error of result.errors) {\n\t\t\t\t\t\t\tconsole.error(\"Failed to add file:\", error.error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (result.items.length === 0) return;\n\t\t\t\t} finally {\n\t\t\t\t\tsetLoadingSkeletons([]);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[],\n\t\t);\n\t\tconst handleImageFileChange = useCallback(\n\t\t\tasync (e: ChangeEvent<HTMLInputElement>) => {\n\t\t\t\tconst files = e.target.files ? Array.from(e.target.files) : [];\n\t\t\t\te.target.value = \"\";\n\t\t\t\tconst pending = pendingImagePlacementRef.current;\n\t\t\t\tpendingImagePlacementRef.current = null;\n\t\t\t\tif (files.length === 0 || !pending) return;\n\t\t\t\tawait placeImageFilesAtWorld(files, pending.worldX, pending.worldY);\n\t\t\t},\n\t\t\t[placeImageFilesAtWorld],\n\t\t);\n\t\tconst openImagePickerAtViewportCenter = useCallback(() => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tconst cam = cameraRef.current;\n\t\t\tconst input = imageInputRef.current;\n\t\t\tif (!el || !cam || !input) return;\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tconst center = cam.screenToWorld(rect.width / 2, rect.height / 2);\n\t\t\tpendingImagePlacementRef.current = {\n\t\t\t\tworldX: center.worldX,\n\t\t\t\tworldY: center.worldY,\n\t\t\t};\n\t\t\tif (typeof input.showPicker === \"function\") {\n\t\t\t\tinput.showPicker();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinput.click();\n\t\t}, []);\n\t\tuseEffect(() => {\n\t\t\tconst prevToolId = lastToolIdRef.current;\n\t\t\tif (\n\t\t\t\ttoolId !== \"image\" ||\n\t\t\t\tprevToolId === \"image\" ||\n\t\t\t\t!interactive ||\n\t\t\t\tonItemsChange == null\n\t\t\t) {\n\t\t\t\tlastToolIdRef.current = toolId;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\topenImagePickerAtViewportCenter();\n\t\t\trequestAutoResetTool(\"image\");\n\t\t\tlastToolIdRef.current = toolId;\n\t\t}, [\n\t\t\tinteractive,\n\t\t\tonItemsChange,\n\t\t\topenImagePickerAtViewportCenter,\n\t\t\trequestAutoResetTool,\n\t\t\ttoolId,\n\t\t]);\n\n\t\tconst handleWrapperDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\n\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\tif (!Array.from(e.dataTransfer.types).includes(\"Files\")) return;\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"copy\";\n\t\t}, []);\n\n\t\tconst handleWrapperDrop = useCallback(\n\t\t\tasync (e: DragEvent<HTMLDivElement>) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tconst fl = e.dataTransfer.files;\n\t\t\t\tif (!fl?.length) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst files = Array.from(fl).filter(\n\t\t\t\t\t(f) => f.type.startsWith(\"image/\") || f.type === \"application/pdf\",\n\t\t\t\t);\n\t\t\t\tif (files.length === 0) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tawait placeImageFilesAtWorld(files, worldX, worldY, {\n\t\t\t\t\tstackBelowExistingItems: false,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[screenToWorld, placeImageFilesAtWorld],\n\t\t);\n\n\t\tconst handleWrapperPaste = useCallback(\n\t\t\tasync (e: ClipboardEvent<HTMLDivElement>) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tconst t = e.target;\n\t\t\t\tif (\n\t\t\t\t\tt instanceof HTMLTextAreaElement ||\n\t\t\t\t\tt instanceof HTMLInputElement ||\n\t\t\t\t\t(t instanceof HTMLElement && t.isContentEditable)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (editingTextIdRef.current) return;\n\t\t\t\tconst dt = e.clipboardData;\n\t\t\t\tif (!dt) return;\n\t\t\t\tconst files: File[] = [];\n\t\t\t\tfor (const file of Array.from(dt.files)) {\n\t\t\t\t\tif (file.type.startsWith(\"image/\")) files.push(file);\n\t\t\t\t}\n\t\t\t\tif (files.length === 0) {\n\t\t\t\t\tfor (const item of Array.from(dt.items)) {\n\t\t\t\t\t\tif (item.kind === \"file\" && item.type.startsWith(\"image/\")) {\n\t\t\t\t\t\t\tconst file = item.getAsFile();\n\t\t\t\t\t\t\tif (file) files.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (files.length === 0) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst last = lastPointerScreenRef.current;\n\t\t\t\tlet target: { worldX: number; worldY: number };\n\t\t\t\tif (last) {\n\t\t\t\t\ttarget = screenToWorld(last.x, last.y);\n\t\t\t\t} else {\n\t\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\t\tif (el && cam) {\n\t\t\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\t\t\ttarget = cam.screenToWorld(rect.width / 2, rect.height / 2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget = { worldX: 0, worldY: 0 };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait placeImageFilesAtWorld(files, target.worldX, target.worldY, {\n\t\t\t\t\tstackBelowExistingItems: false,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[screenToWorld, placeImageFilesAtWorld],\n\t\t);\n\n\t\tconst handleOverlayDoubleClick = useCallback(\n\t\t\t(e: MouseEvent<HTMLDivElement>) => {\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\n\t\t\t\tconst linkHit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {\n\t\t\t\t\tlineHitWorld,\n\t\t\t\t\tignoreLocked: false,\n\t\t\t\t});\n\t\t\t\tconst link = linkHit ? getLinkData(linkHit) : null;\n\t\t\t\tif (linkHit && link) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (onActivateLinkRef.current) {\n\t\t\t\t\t\tonActivateLinkRef.current({ link, item: linkHit });\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof window !== \"undefined\" &&\n\t\t\t\t\t\ttypeof window.open === \"function\"\n\t\t\t\t\t) {\n\t\t\t\t\t\twindow.open(link.href, \"_blank\", \"noopener,noreferrer\");\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (toolIdRef.current !== \"select\") return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst hit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {\n\t\t\t\t\tlineHitWorld,\n\t\t\t\t\tignoreLocked: true,\n\t\t\t\t});\n\t\t\t\tif (hit?.toolKind === \"text\") {\n\t\t\t\t\tconst draft = hit.text ?? \"\";\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tconst list = itemsRef.current;\n\t\t\t\t\tconst it = list.find((i) => i.id === hit.id);\n\t\t\t\t\teditingTextSnapshotRef.current =\n\t\t\t\t\t\tit != null\n\t\t\t\t\t\t\t? { ...it, bounds: { ...it.bounds } }\n\t\t\t\t\t\t\t: { ...hit, bounds: { ...hit.bounds } };\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current([hit.id]);\n\t\t\t\t\tsetDraftText(draft);\n\t\t\t\t\tsetEditingTextId(hit.id);\n\t\t\t\t\tif (change && it && it.toolKind === \"text\") {\n\t\t\t\t\t\tchange(replaceItem(list, hit.id, applyTextDraftWhileEditing(it, draft)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[screenToWorld],\n\t\t);\n\n\t\tconst handleOverlayPointerDown = useCallback(\n\t\t\t(e: ReactPointerEvent<HTMLDivElement>) => {\n\t\t\t\tlet currentDragState = dragStateRef.current;\n\t\t\t\tlet activePointerId = activeInteractionPointerIdRef.current;\n\t\t\t\tif (e.pointerType === \"pen\" || e.pointerType === \"touch\") {\n\t\t\t\t\tdebugApplePencilPointer(\"pointerdown\", {\n\t\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tpressure: e.pointerType === \"pen\" ? e.pressure : undefined,\n\t\t\t\t\t\tactivePointerId,\n\t\t\t\t\t\tdragKind: currentDragState.kind,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\te.pointerType === \"pen\" &&\n\t\t\t\t\tcurrentDragState.kind === \"stroke\" &&\n\t\t\t\t\tcurrentDragState.pointerType === \"pen\"\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"pen-reentry\", {\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tpreviousPointerId: activePointerId,\n\t\t\t\t\t\tpreviousPoints: currentDragState.points.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(currentDragState);\n\t\t\t\t\tcurrentDragState = dragStateRef.current;\n\t\t\t\t\tactivePointerId = activeInteractionPointerIdRef.current;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcurrentDragState.kind !== \"idle\" &&\n\t\t\t\t\tactivePointerId != null &&\n\t\t\t\t\tactivePointerId !== e.pointerId\n\t\t\t\t) {\n\t\t\t\t\tif (dragStateRef.current.kind !== \"idle\") {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (currentDragState.kind !== \"idle\" && activePointerId == null) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (e.button !== 0) return;\n\t\t\t\tif (editingTextIdRef.current) return;\n\n\t\t\t\twrapperRef.current?.focus({ preventScroll: true });\n\t\t\t\tsetContextMenu(null);\n\n\t\t\t\tconst tool = toolIdRef.current;\n\t\t\t\tif (tool === \"hand\") return;\n\t\t\t\tif (\n\t\t\t\t\tapplePencilNav &&\n\t\t\t\t\te.pointerType === \"pen\" &&\n\t\t\t\t\tnavigator.maxTouchPoints > 0 &&\n\t\t\t\t\t(tool === \"draw\" || tool === \"marker\")\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\t\t\t\tconst handleRadiusWorld = 6 / cam.zoom;\n\n\t\t\t\tconst canonical = itemsRef.current;\n\t\t\t\tconst resolved = resolvedItemsRef.current;\n\n\t\t\t\tconst bakedSnapshot = (id: string): VectorSceneItem | undefined => {\n\t\t\t\t\tconst raw = canonical.find((i) => i.id === id);\n\t\t\t\t\tif (!raw) return undefined;\n\t\t\t\t\treturn raw.toolKind === \"arrow\" && raw.arrowBind\n\t\t\t\t\t\t? bakeArrowItemToAbsolute(raw, canonical)\n\t\t\t\t\t\t: raw;\n\t\t\t\t};\n\n\t\t\t\tif (tool === \"eraser\") {\n\t\t\t\t\tdragStateRef.current = { kind: \"erase\" };\n\t\t\t\t\teraserPreviewIdsRef.current = new Set();\n\t\t\t\t\tsetEraserPreviewIds([]);\n\t\t\t\t\tsetEraserTrail([{ x: worldX, y: worldY, t: Date.now() }]);\n\t\t\t\t\tsetEraserActive(true);\n\t\t\t\t\tconst toErase = collectEraserTargetsAtWorldPoint(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tworldX,\n\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlineHitWorld,\n\t\t\t\t\t\t\tignoreLocked: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (toErase.length > 0) {\n\t\t\t\t\t\tfor (const id of toErase) {\n\t\t\t\t\t\t\teraserPreviewIdsRef.current.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetEraserPreviewIds(Array.from(eraserPreviewIdsRef.current));\n\t\t\t\t\t}\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current([]);\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tool === \"select\") {\n\t\t\t\t\tconst cur = effectiveSelectedIdsRef.current;\n\t\t\t\t\tconst primaryId = cur.length === 1 ? cur[0] : undefined;\n\t\t\t\t\tconst selected =\n\t\t\t\t\t\tprimaryId != null ? resolved.find((i) => i.id === primaryId) : undefined;\n\t\t\t\t\tconst showHandles =\n\t\t\t\t\t\tselected &&\n\t\t\t\t\t\tcur.length === 1 &&\n\t\t\t\t\t\t!selected.locked &&\n\t\t\t\t\t\tsupportsResizeHandles(selected) &&\n\t\t\t\t\t\ttool === \"select\";\n\n\t\t\t\t\tif (showHandles && selected) {\n\t\t\t\t\t\tconst rb = normalizeRect(selected.bounds);\n\t\t\t\t\t\tconst rot = selected.rotation ?? 0;\n\t\t\t\t\t\tconst rotateOffsetWorld = 24 / cam.zoom;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\thitTestRotateHandle(\n\t\t\t\t\t\t\t\trb,\n\t\t\t\t\t\t\t\trot,\n\t\t\t\t\t\t\t\tworldX,\n\t\t\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t\t\thandleRadiusWorld,\n\t\t\t\t\t\t\t\trotateOffsetWorld,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst snapSpin = bakedSnapshot(selected.id);\n\t\t\t\t\t\t\tif (!snapSpin) return;\n\t\t\t\t\t\t\tconst pivot = itemPivotWorld(selected);\n\t\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\t\tkind: \"rotate\",\n\t\t\t\t\t\t\t\tid: selected.id,\n\t\t\t\t\t\t\t\tsnapshot: snapSpin,\n\t\t\t\t\t\t\t\tpivotWorld: pivot,\n\t\t\t\t\t\t\t\tstartPointerAngleRad: Math.atan2(worldY - pivot.y, worldX - pivot.x),\n\t\t\t\t\t\t\t\tstartRotation: selected.rotation ?? 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst hb = hitTestResizeHandle(\n\t\t\t\t\t\t\trb,\n\t\t\t\t\t\t\tworldX,\n\t\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t\thandleRadiusWorld,\n\t\t\t\t\t\t\trot,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (hb) {\n\t\t\t\t\t\t\tconst snapRs = bakedSnapshot(selected.id);\n\t\t\t\t\t\t\tif (!snapRs) return;\n\t\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\t\tkind: \"resize\",\n\t\t\t\t\t\t\t\tid: selected.id,\n\t\t\t\t\t\t\t\thandle: hb,\n\t\t\t\t\t\t\t\tsnapshot: snapRs,\n\t\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\t\tbounds: snapRs.bounds,\n\t\t\t\t\t\t\t\t\tline: snapRs.line,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hit = hitTestWorldPoint(resolved, worldX, worldY, {\n\t\t\t\t\t\tlineHitWorld,\n\t\t\t\t\t\tignoreLocked: true,\n\t\t\t\t\t});\n\t\t\t\t\tif (hit) {\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tconst next = cur.includes(hit.id)\n\t\t\t\t\t\t\t\t? cur.filter((id) => id !== hit.id)\n\t\t\t\t\t\t\t\t: [...cur, hit.id];\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(next);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet idsToMove: string[];\n\t\t\t\t\t\tif (!cur.includes(hit.id)) {\n\t\t\t\t\t\t\tidsToMove = [hit.id];\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(idsToMove);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tidsToMove = [...cur];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst snapshots: Record<string, VectorSceneItem> = {};\n\t\t\t\t\t\tfor (const id of idsToMove) {\n\t\t\t\t\t\t\tconst snap = bakedSnapshot(id);\n\t\t\t\t\t\t\tif (snap) {\n\t\t\t\t\t\t\t\tsnapshots[id] = snap;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\tkind: \"move\",\n\t\t\t\t\t\t\tids: idsToMove,\n\t\t\t\t\t\t\tsnapshots,\n\t\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!e.shiftKey && cur.length > 0) {\n\t\t\t\t\t\tconst selectedUnlockedItems = cur\n\t\t\t\t\t\t\t.map((id) => resolved.find((it) => it.id === id))\n\t\t\t\t\t\t\t.filter((it): it is VectorSceneItem => it != null && !it.locked);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tselectedUnlockedItems.some((it) =>\n\t\t\t\t\t\t\t\tpointInSelectedItemBounds(it, worldX, worldY),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst snapshots: Record<string, VectorSceneItem> = {};\n\t\t\t\t\t\t\tfor (const id of cur) {\n\t\t\t\t\t\t\t\tconst snap = bakedSnapshot(id);\n\t\t\t\t\t\t\t\tif (snap && !snap.locked) {\n\t\t\t\t\t\t\t\t\tsnapshots[id] = snap;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (Object.keys(snapshots).length > 0) {\n\t\t\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\t\t\tkind: \"move\",\n\t\t\t\t\t\t\t\t\tids: Object.keys(snapshots),\n\t\t\t\t\t\t\t\t\tsnapshots,\n\t\t\t\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\tkind: \"marquee\",\n\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\tstartScreen: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\t\t\tselectionBefore: [...cur],\n\t\t\t\t\t};\n\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\tkind: \"marquee\",\n\t\t\t\t\t\trect: rectFromCorners(\n\t\t\t\t\t\t\t{ x: worldX, y: worldY },\n\t\t\t\t\t\t\t{ x: worldX, y: worldY },\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tool === \"draw\" || tool === \"marker\" || tool === \"laser\") {\n\t\t\t\t\tconst startPoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\te.clientX,\n\t\t\t\t\t\te.clientY,\n\t\t\t\t\t\te.pointerType === \"pen\" ? e.pressure : undefined,\n\t\t\t\t\t);\n\t\t\t\t\tconst straightLine =\n\t\t\t\t\t\ttool === \"draw\"\n\t\t\t\t\t\t\t? createStraightStrokeState(startPoint, e.clientX, e.clientY)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst directPenStroke =\n\t\t\t\t\t\te.pointerType === \"pen\" && (tool === \"draw\" || tool === \"marker\");\n\t\t\t\t\tlet itemId: string | undefined;\n\t\t\t\t\tif (directPenStroke) {\n\t\t\t\t\t\titemId = createShapeId();\n\t\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\t\titemId,\n\t\t\t\t\t\t\t[startPoint],\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst nextDragState: StrokeDragState = {\n\t\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\t\t...(itemId ? { itemId } : {}),\n\t\t\t\t\t\t...(straightLine ? { straightLine } : {}),\n\t\t\t\t\t};\n\t\t\t\t\tdragStateRef.current = nextDragState;\n\t\t\t\t\tstartOrRestartStraightStrokeHoldTimer(nextDragState);\n\t\t\t\t\tif (tool === \"laser\") {\n\t\t\t\t\t\tsetLaserTrail([{ x: worldX, y: worldY, t: Date.now() }]);\n\t\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\t} else if (directPenStroke) {\n\t\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\t\temitRemoteStrokePreview(tool, [startPoint]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tool === \"text\" || tool === \"image\") {\n\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\tkind: \"tap\",\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\tstartScreen: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t};\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst cp = customPlacementRef.current;\n\t\t\t\tif (\n\t\t\t\t\ttool === \"rect\" ||\n\t\t\t\t\ttool === \"ellipse\" ||\n\t\t\t\t\ttool === \"architectural-cloud\" ||\n\t\t\t\t\ttool === \"line\" ||\n\t\t\t\t\ttool === \"arrow\" ||\n\t\t\t\t\t(cp && tool === cp.toolId)\n\t\t\t\t) {\n\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\tkind: \"place\",\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\tstartScreen: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t};\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tapplePencilNav,\n\t\t\t\tcaptureInteractionPointer,\n\t\t\t\temitRemoteStrokePreview,\n\t\t\t\tfinalizeStrokeDragState,\n\t\t\t\trenderSceneWithLivePenStroke,\n\t\t\t\tscreenToWorld,\n\t\t\t\tstartOrRestartStraightStrokeHoldTimer,\n\t\t\t],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (!interactive) return;\n\t\t\tconst el = interactionRootRef.current;\n\t\t\tif (!el) return;\n\n\t\t\tconst onNativePenPointerDown = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"pen\") return;\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (e.button !== 0) return;\n\t\t\t\tif (editingTextIdRef.current) return;\n\n\t\t\t\tconst tool = toolIdRef.current;\n\t\t\t\tif (tool !== \"draw\" && tool !== \"marker\") return;\n\t\t\t\tif (applePencilNav && navigator.maxTouchPoints > 0) return;\n\n\t\t\t\tconst currentDragState = dragStateRef.current;\n\t\t\t\tif (\n\t\t\t\t\tcurrentDragState.kind === \"stroke\" &&\n\t\t\t\t\tcurrentDragState.pointerType === \"pen\"\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"native-pen-reentry\", {\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tpreviousPointerId: activeInteractionPointerIdRef.current,\n\t\t\t\t\t\tpreviousPoints: currentDragState.points.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(currentDragState);\n\t\t\t\t} else if (currentDragState.kind !== \"idle\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twrapperRef.current?.focus({ preventScroll: true });\n\t\t\t\tsetContextMenu(null);\n\t\t\t\tconst startPoint = pointerSampleToWorldPoint(\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t\te.clientX,\n\t\t\t\t\te.clientY,\n\t\t\t\t\te.pressure,\n\t\t\t\t);\n\t\t\t\tconst straightLine =\n\t\t\t\t\ttool === \"draw\"\n\t\t\t\t\t\t? createStraightStrokeState(startPoint, e.clientX, e.clientY)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst itemId = createShapeId();\n\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\titemId,\n\t\t\t\t\t[startPoint],\n\t\t\t\t\ttool,\n\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t);\n\t\t\t\tif (item) {\n\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t}\n\t\t\t\tconst nextDragState: StrokeDragState = {\n\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\ttool,\n\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\titemId,\n\t\t\t\t\t...(straightLine ? { straightLine } : {}),\n\t\t\t\t};\n\t\t\t\tdragStateRef.current = nextDragState;\n\t\t\t\tstartOrRestartStraightStrokeHoldTimer(nextDragState);\n\t\t\t\tactiveInteractionPointerIdRef.current = e.pointerId;\n\t\t\t\tactiveInteractionPointerTargetRef.current = null;\n\t\t\t\tsetPlacementPreview(null);\n\t\t\t\temitRemoteStrokePreview(tool, [startPoint]);\n\t\t\t\tdebugApplePencilPointer(\"native-pointerdown\", {\n\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\tpressure: e.pressure,\n\t\t\t\t\ttool,\n\t\t\t\t});\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopImmediatePropagation();\n\t\t\t};\n\n\t\t\tel.addEventListener(\"pointerdown\", onNativePenPointerDown, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tel.removeEventListener(\"pointerdown\", onNativePenPointerDown, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t};\n\t\t}, [\n\t\t\tapplePencilNav,\n\t\t\temitRemoteStrokePreview,\n\t\t\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\n\t\t\tstartOrRestartStraightStrokeHoldTimer,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!interactive) return;\n\t\t\tconst el = interactionRootRef.current;\n\t\t\tif (!el) return;\n\n\t\t\tconst findChangedTouch = (touches: TouchList): Touch | null => {\n\t\t\t\tconst activeTouchId = activeInteractionTouchIdRef.current;\n\t\t\t\tif (activeTouchId == null) return null;\n\t\t\t\tfor (let i = 0; i < touches.length; i += 1) {\n\t\t\t\t\tconst touch = touches.item(i);\n\t\t\t\t\tif (touch?.identifier === activeTouchId) return touch;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\tconst findStartTouch = (touches: TouchList): Touch | null => {\n\t\t\t\tfor (let i = 0; i < touches.length; i += 1) {\n\t\t\t\t\tconst touch = touches.item(i);\n\t\t\t\t\tif (!touch) continue;\n\t\t\t\t\tif (touchKind(touch) === \"direct\") continue;\n\t\t\t\t\tif (!applePencilNav || isLikelyStylusTouch(touch)) return touch;\n\t\t\t\t\tif (penDetectedRef.current && touchPressure(touch) != null) return touch;\n\t\t\t\t\tif (\n\t\t\t\t\t\tpenDetectedRef.current &&\n\t\t\t\t\t\tperformance.now() - lastPenPointerDownAtRef.current < 750\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn touch;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\tconst stopTouchEvent = (ev: TouchEvent) => {\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopImmediatePropagation();\n\t\t\t};\n\n\t\t\tconst onTouchStart = (ev: TouchEvent) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (editingTextIdRef.current) return;\n\t\t\t\tconst tool = toolIdRef.current;\n\t\t\t\tif (tool !== \"draw\" && tool !== \"marker\") return;\n\n\t\t\t\tconst touch = findStartTouch(ev.changedTouches);\n\t\t\t\tif (!touch) return;\n\n\t\t\t\tconst currentDragState = dragStateRef.current;\n\t\t\t\tif (\n\t\t\t\t\tcurrentDragState.kind === \"stroke\" &&\n\t\t\t\t\tcurrentDragState.pointerType === \"pen\"\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"touch-pen-reentry\", {\n\t\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\t\tpreviousPoints: currentDragState.points.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(currentDragState);\n\t\t\t\t} else if (currentDragState.kind !== \"idle\") {\n\t\t\t\t\tstopTouchEvent(ev);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twrapperRef.current?.focus({ preventScroll: true });\n\t\t\t\tsetContextMenu(null);\n\t\t\t\tpenDetectedRef.current = true;\n\n\t\t\t\tconst startPoint = pointerSampleToWorldPoint(\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t\ttouch.clientX,\n\t\t\t\t\ttouch.clientY,\n\t\t\t\t\ttouchPressure(touch),\n\t\t\t\t);\n\t\t\t\tconst straightLine =\n\t\t\t\t\ttool === \"draw\"\n\t\t\t\t\t\t? createStraightStrokeState(startPoint, touch.clientX, touch.clientY)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst itemId = createShapeId();\n\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\titemId,\n\t\t\t\t\t[startPoint],\n\t\t\t\t\ttool,\n\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t);\n\t\t\t\tif (item) {\n\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t}\n\t\t\t\tconst nextDragState: StrokeDragState = {\n\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\ttool,\n\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\tpointerType: \"pen\",\n\t\t\t\t\titemId,\n\t\t\t\t\t...(straightLine ? { straightLine } : {}),\n\t\t\t\t};\n\t\t\t\tdragStateRef.current = nextDragState;\n\t\t\t\tstartOrRestartStraightStrokeHoldTimer(nextDragState);\n\t\t\t\tactiveInteractionPointerIdRef.current = null;\n\t\t\t\tactiveInteractionPointerTargetRef.current = null;\n\t\t\t\tactiveInteractionTouchIdRef.current = touch.identifier;\n\t\t\t\tsetPlacementPreview(null);\n\t\t\t\temitRemoteStrokePreview(tool, [startPoint]);\n\t\t\t\tdebugApplePencilPointer(\"touchstart-stroke\", {\n\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\ttouchType: touchKind(touch),\n\t\t\t\t\tforce: touchPressure(touch),\n\t\t\t\t\ttool,\n\t\t\t\t});\n\t\t\t\tstopTouchEvent(ev);\n\t\t\t};\n\n\t\t\tconst onTouchMove = (ev: TouchEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tif (st.kind !== \"stroke\") return;\n\t\t\t\tconst touch = findChangedTouch(ev.changedTouches);\n\t\t\t\tif (!touch) return;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\n\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t\ttouch.clientX,\n\t\t\t\t\ttouch.clientY,\n\t\t\t\t\ttouchPressure(touch),\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tupdateStraightStrokeForMove(st, touch.clientX, touch.clientY, endpoint)\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"touchmove-stroke\", {\n\t\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\t\tpoints: st.points.length,\n\t\t\t\t\t\tforce: touchPressure(touch),\n\t\t\t\t\t});\n\t\t\t\t\tstopTouchEvent(ev);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst interpolated = appendTouchToStrokePoints(\n\t\t\t\t\tst.points,\n\t\t\t\t\ttouch,\n\t\t\t\t\tcam.zoom,\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t);\n\t\t\t\tst.points = interpolated;\n\t\t\t\tif (st.itemId && st.tool !== \"laser\") {\n\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\tst.itemId,\n\t\t\t\t\t\tinterpolated,\n\t\t\t\t\t\tst.tool,\n\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t);\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t}\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\temitRemoteStrokePreview(st.tool, interpolated);\n\t\t\t\t}\n\t\t\t\tdebugApplePencilPointer(\"touchmove-stroke\", {\n\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\tpoints: interpolated.length,\n\t\t\t\t\tforce: touchPressure(touch),\n\t\t\t\t});\n\t\t\t\tstopTouchEvent(ev);\n\t\t\t};\n\n\t\t\tconst onTouchEnd = (ev: TouchEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tif (st.kind !== \"stroke\") return;\n\t\t\t\tconst touch = findChangedTouch(ev.changedTouches);\n\t\t\t\tif (!touch) return;\n\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (cam) {\n\t\t\t\t\tif (st.straightLine?.active) {\n\t\t\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t\ttouch.clientX,\n\t\t\t\t\t\t\ttouch.clientY,\n\t\t\t\t\t\t\ttouchPressure(touch),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetStraightStrokeEndpoint(st, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst completedPoints = appendTouchToStrokePoints(\n\t\t\t\t\t\t\tst.points,\n\t\t\t\t\t\t\ttouch,\n\t\t\t\t\t\t\tcam.zoom,\n\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tst.points = completedPoints;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdebugApplePencilPointer(\"touchend-stroke\", {\n\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\tpoints: st.points.length,\n\t\t\t\t});\n\t\t\t\tfinalizeStrokeDragState(st);\n\t\t\t\tstopTouchEvent(ev);\n\t\t\t};\n\n\t\t\tel.addEventListener(\"touchstart\", onTouchStart, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchmove\", onTouchMove, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchend\", onTouchEnd, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchcancel\", onTouchEnd, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tel.removeEventListener(\"touchstart\", onTouchStart, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchmove\", onTouchMove, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchend\", onTouchEnd, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchcancel\", onTouchEnd, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t};\n\t\t}, [\n\t\t\tapplePencilNav,\n\t\t\temitRemoteStrokePreview,\n\t\t\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\n\t\t\tsetStraightStrokeEndpoint,\n\t\t\tstartOrRestartStraightStrokeHoldTimer,\n\t\t\tupdateStraightStrokeForMove,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!interactive) return;\n\n\t\t\tconst onMove = (ev: PointerEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam || st.kind === \"idle\") return;\n\t\t\t\tif (activeInteractionPointerIdRef.current !== ev.pointerId) return;\n\n\t\t\t\t/* Tap placement (draw/text/image): validate on pointerup only — early move\n\t\t\t\t * cancellation caused false negatives from tiny pointer jitter on trackpads. */\n\t\t\t\tif (st.kind === \"tap\") return;\n\n\t\t\t\tif (st.kind === \"marquee\") {\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst raw = rectFromCorners(st.startWorld, { x: worldX, y: worldY });\n\t\t\t\t\tsetPlacementPreview({ kind: \"marquee\", rect: raw });\n\t\t\t\t\tconst nextCand = collectItemIdsInRect(\n\t\t\t\t\t\tresolvedItemsRef.current,\n\t\t\t\t\t\tnormalizeRect(raw),\n\t\t\t\t\t);\n\t\t\t\t\tif (!shallowEqualStringArray(nextCand, marqueeCandidateIdsRef.current)) {\n\t\t\t\t\t\tmarqueeCandidateIdsRef.current = nextCand;\n\t\t\t\t\t\tsetMarqueeCandidateIds(nextCand);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"stroke\") {\n\t\t\t\t\tif (ev.pointerType === \"pen\" || ev.pointerType === \"touch\") {\n\t\t\t\t\t\tdebugApplePencilPointer(\"pointermove\", {\n\t\t\t\t\t\t\tpointerType: ev.pointerType,\n\t\t\t\t\t\t\tpointerId: ev.pointerId,\n\t\t\t\t\t\t\tpointsBefore: st.points.length,\n\t\t\t\t\t\t\tpressure: ev.pointerType === \"pen\" ? ev.pressure : undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\tev.clientX,\n\t\t\t\t\t\tev.clientY,\n\t\t\t\t\t\tev.pointerType === \"pen\" ? ev.pressure : undefined,\n\t\t\t\t\t);\n\t\t\t\t\tif (updateStraightStrokeForMove(st, ev.clientX, ev.clientY, endpoint)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst interpolated = appendPointerEventSamplesToStrokePoints(\n\t\t\t\t\t\tst.points,\n\t\t\t\t\t\tev,\n\t\t\t\t\t\tcam.zoom,\n\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t);\n\t\t\t\t\tst.points = interpolated;\n\t\t\t\t\tif (st.itemId && st.pointerType === \"pen\" && st.tool !== \"laser\") {\n\t\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\t\tst.itemId,\n\t\t\t\t\t\t\tinterpolated,\n\t\t\t\t\t\t\tst.tool,\n\t\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\t\temitRemoteStrokePreview(st.tool, interpolated);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (st.tool === \"laser\") {\n\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\tsetLaserTrail((prev) =>\n\t\t\t\t\t\t\tpruneLaserTrail([\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t...interpolated\n\t\t\t\t\t\t\t\t\t.slice(Math.max(0, interpolated.length - 3))\n\t\t\t\t\t\t\t\t\t.map((p) => ({\n\t\t\t\t\t\t\t\t\t\tx: p.x,\n\t\t\t\t\t\t\t\t\t\ty: p.y,\n\t\t\t\t\t\t\t\t\t\tt: now,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\t\t\ttool: st.tool,\n\t\t\t\t\t\t\tpoints: interpolated,\n\t\t\t\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"erase\") {\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\t\t\t\t\tsetEraserTrail((prev) =>\n\t\t\t\t\t\tpruneEraserTrail([...prev, { x: worldX, y: worldY, t: Date.now() }]),\n\t\t\t\t\t);\n\t\t\t\t\tconst toErase = collectEraserTargetsAtWorldPoint(\n\t\t\t\t\t\tresolvedItemsRef.current,\n\t\t\t\t\t\tworldX,\n\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlineHitWorld,\n\t\t\t\t\t\t\tignoreLocked: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (toErase.length > 0) {\n\t\t\t\t\t\tfor (const id of toErase) {\n\t\t\t\t\t\t\teraserPreviewIdsRef.current.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetEraserPreviewIds(Array.from(eraserPreviewIdsRef.current));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst list = itemsRef.current;\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\n\t\t\t\tif (st.kind === \"move\") {\n\t\t\t\t\tconst dx = worldX - st.startWorld.x;\n\t\t\t\t\tconst dy = worldY - st.startWorld.y;\n\t\t\t\t\tlet nextList: VectorSceneItem[] = [...list];\n\t\t\t\t\tfor (const id of st.ids) {\n\t\t\t\t\t\tconst snap = st.snapshots[id];\n\t\t\t\t\t\tif (!snap) continue;\n\t\t\t\t\t\tconst next = moveItemByDelta(snap, dx, dy);\n\t\t\t\t\t\tnextList = replaceItem(nextList, id, next);\n\t\t\t\t\t}\n\t\t\t\t\tchange(nextList);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"rotate\") {\n\t\t\t\t\tconst p = st.pivotWorld;\n\t\t\t\t\tconst angle = Math.atan2(worldY - p.y, worldX - p.x);\n\t\t\t\t\tconst next = applyRotationFromPointer(\n\t\t\t\t\t\tst.snapshot,\n\t\t\t\t\t\tst.startRotation,\n\t\t\t\t\t\tst.startPointerAngleRad,\n\t\t\t\t\t\tangle,\n\t\t\t\t\t);\n\t\t\t\t\tchange(replaceItem(list, st.id, next));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"resize\") {\n\t\t\t\t\tconst next = resizeItemByHandle(st.snapshot, st.start, st.handle, {\n\t\t\t\t\t\tx: worldX,\n\t\t\t\t\t\ty: worldY,\n\t\t\t\t\t});\n\t\t\t\t\tchange(replaceItem(list, st.id, next));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"place\") {\n\t\t\t\t\tconst a = st.startWorld;\n\t\t\t\t\tconst b = { x: worldX, y: worldY };\n\t\t\t\t\tconst cp = customPlacementRef.current;\n\t\t\t\t\tif (st.tool === \"rect\") {\n\t\t\t\t\t\tsetPlacementPreview({ kind: \"rect\", rect: rectFromCorners(a, b) });\n\t\t\t\t\t} else if (st.tool === \"ellipse\") {\n\t\t\t\t\t\tsetPlacementPreview({ kind: \"ellipse\", rect: rectFromCorners(a, b) });\n\t\t\t\t\t} else if (st.tool === \"architectural-cloud\") {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"architectural-cloud\",\n\t\t\t\t\t\t\trect: rectFromCorners(a, b),\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (st.tool === \"line\") {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"line\",\n\t\t\t\t\t\t\tstart: a,\n\t\t\t\t\t\t\tend: b,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (st.tool === \"arrow\") {\n\t\t\t\t\t\tconst maxDist = ARROW_BIND_SNAP_PX / cam.zoom;\n\t\t\t\t\t\tconst exclude = new Set<string>();\n\t\t\t\t\t\tconst snapA = snapArrowEndpointToShape(\n\t\t\t\t\t\t\ta.x,\n\t\t\t\t\t\t\ta.y,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst snapB = snapArrowEndpointToShape(\n\t\t\t\t\t\t\tworldX,\n\t\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst startW = snapA ? snapA.world : a;\n\t\t\t\t\t\tconst endW = snapB ? snapB.world : { x: worldX, y: worldY };\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"arrow\",\n\t\t\t\t\t\t\tstart: startW,\n\t\t\t\t\t\t\tend: endW,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (cp && st.tool === cp.toolId) {\n\t\t\t\t\t\tsetPlacementPreview({ kind: \"rect\", rect: rectFromCorners(a, b) });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst onUp = (ev: PointerEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tif (ev.pointerType === \"pen\" || ev.pointerType === \"touch\") {\n\t\t\t\t\tdebugApplePencilPointer(\"pointerup\", {\n\t\t\t\t\t\tpointerType: ev.pointerType,\n\t\t\t\t\t\tpointerId: ev.pointerId,\n\t\t\t\t\t\tdragKind: st.kind,\n\t\t\t\t\t\tactivePointerId: activeInteractionPointerIdRef.current,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tst.kind !== \"idle\" &&\n\t\t\t\t\tactiveInteractionPointerIdRef.current !== ev.pointerId\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) {\n\t\t\t\t\tif (st.kind === \"stroke\") {\n\t\t\t\t\t\tclearStraightStrokeHoldTimer(st);\n\t\t\t\t\t\temitRemoteStrokePreviewClear();\n\t\t\t\t\t}\n\t\t\t\t\tif (st.kind === \"erase\") {\n\t\t\t\t\t\teraserPreviewIdsRef.current.clear();\n\t\t\t\t\t\tsetEraserPreviewIds([]);\n\t\t\t\t\t\tsetEraserTrail([]);\n\t\t\t\t\t\tsetEraserActive(false);\n\t\t\t\t\t}\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tmarqueeCandidateIdsRef.current = [];\n\t\t\t\t\tsetMarqueeCandidateIds([]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"move\" || st.kind === \"resize\" || st.kind === \"rotate\") {\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"marquee\") {\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tmarqueeCandidateIdsRef.current = [];\n\t\t\t\t\tsetMarqueeCandidateIds([]);\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst raw = rectFromCorners(st.startWorld, { x: worldX, y: worldY });\n\t\t\t\t\tconst br = normalizeRect(raw);\n\t\t\t\t\tconst screenDx = ev.clientX - st.startScreen.x;\n\t\t\t\t\tconst screenDy = ev.clientY - st.startScreen.y;\n\t\t\t\t\tconst tooSmall =\n\t\t\t\t\t\tMath.hypot(screenDx, screenDy) < TAP_PX ||\n\t\t\t\t\t\t(br.width < MIN_MARQUEE_WORLD && br.height < MIN_MARQUEE_WORLD);\n\t\t\t\t\tif (tooSmall) {\n\t\t\t\t\t\tif (!st.shiftKey) {\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst picked = collectItemIdsInRect(resolvedItemsRef.current, br);\n\t\t\t\t\tif (st.shiftKey) {\n\t\t\t\t\t\tconst seen = new Set(st.selectionBefore);\n\t\t\t\t\t\tconst merged = [...st.selectionBefore];\n\t\t\t\t\t\tfor (const id of picked) {\n\t\t\t\t\t\t\tif (!seen.has(id)) {\n\t\t\t\t\t\t\t\tseen.add(id);\n\t\t\t\t\t\t\t\tmerged.push(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(merged);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(picked);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"stroke\") {\n\t\t\t\t\tconst completedPoints = (() => {\n\t\t\t\t\t\tif (st.straightLine?.active) {\n\t\t\t\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t\t\tev.clientX,\n\t\t\t\t\t\t\t\tev.clientY,\n\t\t\t\t\t\t\t\tev.pointerType === \"pen\" ? ev.pressure : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tsetStraightStrokeEndpoint(st, endpoint);\n\t\t\t\t\t\t\treturn st.points;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst points = appendPointerEventSamplesToStrokePoints(\n\t\t\t\t\t\t\tst.points,\n\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\tcam.zoom,\n\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tst.points = points;\n\t\t\t\t\t\treturn points;\n\t\t\t\t\t})();\n\t\t\t\t\tdebugApplePencilPointer(\"pointerup-stroke-points\", {\n\t\t\t\t\t\tpointerType: ev.pointerType,\n\t\t\t\t\t\tpointerId: ev.pointerId,\n\t\t\t\t\t\tpointsAfterUp: completedPoints.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(st);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"erase\") {\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tif (change && eraserPreviewIdsRef.current.size > 0) {\n\t\t\t\t\t\tconst idSet = new Set(eraserPreviewIdsRef.current);\n\t\t\t\t\t\tchange(itemsRef.current.filter((i) => !idSet.has(i.id)));\n\t\t\t\t\t}\n\t\t\t\t\teraserPreviewIdsRef.current.clear();\n\t\t\t\t\tsetEraserPreviewIds([]);\n\t\t\t\t\tsetEraserTrail([]);\n\t\t\t\t\tsetEraserActive(false);\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\trequestAutoResetTool(\"eraser\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"tap\") {\n\t\t\t\t\tconst dx = ev.clientX - st.startScreen.x;\n\t\t\t\t\tconst dy = ev.clientY - st.startScreen.y;\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tif (Math.hypot(dx, dy) > TAP_PX) return;\n\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tif (!change) return;\n\t\t\t\t\tconst id = createShapeId();\n\t\t\t\t\tconst { x: worldX, y: worldY } = st.startWorld;\n\t\t\t\t\tif (st.tool === \"text\") {\n\t\t\t\t\t\tconst fs = strokeStyleRef.current.textFontSize;\n\t\t\t\t\t\tconst baseline = textBaselineYFor(fs);\n\t\t\t\t\t\tconst lh = textLineHeightFor(fs);\n\t\t\t\t\t\tconst minH = Math.max(26, baseline + Math.max(4, lh * 0.2));\n\t\t\t\t\t\tconst newItem = createTextItem(\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tx: worldX - 4,\n\t\t\t\t\t\t\t\ty: worldY - baseline,\n\t\t\t\t\t\t\t\twidth: 160,\n\t\t\t\t\t\t\t\theight: minH,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t\t\tfs,\n\t\t\t\t\t\t);\n\t\t\t\t\t\teditingTextSnapshotRef.current = {\n\t\t\t\t\t\t\t...newItem,\n\t\t\t\t\t\t\tbounds: { ...newItem.bounds },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst hidden = applyTextDraftWhileEditing(newItem, \"\");\n\t\t\t\t\t\tchange([...itemsRef.current, hidden]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t\tsetEditingTextId(id);\n\t\t\t\t\t\tsetDraftText(\"\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpendingImagePlacementRef.current = { worldX, worldY };\n\t\t\t\t\t\timageInputRef.current?.click();\n\t\t\t\t\t}\n\t\t\t\t\trequestAutoResetTool(st.tool);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"place\") {\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst a = st.startWorld;\n\t\t\t\t\tconst b = { x: worldX, y: worldY };\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tif (!change) return;\n\n\t\t\t\t\tif (st.tool === \"arrow\") {\n\t\t\t\t\t\tconst screenDx = ev.clientX - st.startScreen.x;\n\t\t\t\t\t\tconst screenDy = ev.clientY - st.startScreen.y;\n\t\t\t\t\t\tif (Math.hypot(screenDx, screenDy) < MIN_ARROW_DRAG_PX) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst maxDist = ARROW_BIND_SNAP_PX / cam.zoom;\n\t\t\t\t\t\tconst exclude = new Set<string>();\n\t\t\t\t\t\tconst snapA = snapArrowEndpointToShape(\n\t\t\t\t\t\t\ta.x,\n\t\t\t\t\t\t\ta.y,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst snapB = snapArrowEndpointToShape(\n\t\t\t\t\t\t\tb.x,\n\t\t\t\t\t\t\tb.y,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst startW = snapA ? snapA.world : a;\n\t\t\t\t\t\tconst endW = snapB ? snapB.world : b;\n\t\t\t\t\t\tconst rawArrow = rectFromCorners(startW, endW);\n\t\t\t\t\t\tconst id = createShapeId();\n\t\t\t\t\t\tconst pen = strokeStyleRef.current;\n\t\t\t\t\t\tconst line = lineEndpointsToLocal(rawArrow, startW, endW);\n\t\t\t\t\t\tlet arrowBind: ArrowBindings | undefined;\n\t\t\t\t\t\tif (snapA || snapB) {\n\t\t\t\t\t\t\tarrowBind = {\n\t\t\t\t\t\t\t\t...(snapA ? { start: snapA.binding } : {}),\n\t\t\t\t\t\t\t\t...(snapB ? { end: snapB.binding } : {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchange([\n\t\t\t\t\t\t\t...itemsRef.current,\n\t\t\t\t\t\t\tcreateLineItem(id, rawArrow, line, \"arrow\", pen, arrowBind),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet raw = rectFromCorners(a, b);\n\t\t\t\t\tlet br = normalizeRect(raw);\n\t\t\t\t\tlet lineA = a;\n\t\t\t\t\tlet lineB = b;\n\n\t\t\t\t\tconst cpUp = customPlacementRef.current;\n\t\t\t\t\tif (br.width < MIN_PLACE_SIZE || br.height < MIN_PLACE_SIZE) {\n\t\t\t\t\t\tconst center = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n\t\t\t\t\t\tif (cpUp && st.tool === cpUp.toolId) {\n\t\t\t\t\t\t\traw = { x: center.x - 60, y: center.y - 40, width: 120, height: 80 };\n\t\t\t\t\t\t\tbr = normalizeRect(raw);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst def = defaultPlacementWorld(st.tool, center);\n\t\t\t\t\t\t\traw = def.raw;\n\t\t\t\t\t\t\tbr = normalizeRect(raw);\n\t\t\t\t\t\t\tif (def.lineWorld) {\n\t\t\t\t\t\t\t\tlineA = def.lineWorld[0];\n\t\t\t\t\t\t\t\tlineB = def.lineWorld[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst id = createShapeId();\n\t\t\t\t\tconst pen = strokeStyleRef.current;\n\t\t\t\t\tif (cpUp && st.tool === cpUp.toolId) {\n\t\t\t\t\t\tchange(itemsRef.current.concat(cpUp.createItem({ id, bounds: br })));\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (st.tool === \"rect\") {\n\t\t\t\t\t\tchange([...itemsRef.current, createRectangleItem(id, raw, pen)]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t} else if (st.tool === \"ellipse\") {\n\t\t\t\t\t\tchange([...itemsRef.current, createEllipseItem(id, raw, pen)]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t} else if (st.tool === \"architectural-cloud\") {\n\t\t\t\t\t\tchange([\n\t\t\t\t\t\t\t...itemsRef.current,\n\t\t\t\t\t\t\tcreateArchitecturalCloudItem(id, raw, pen),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t} else if (st.tool === \"line\" || st.tool === \"arrow\") {\n\t\t\t\t\t\tconst line = lineEndpointsToLocal(raw, lineA, lineB);\n\t\t\t\t\t\tchange([\n\t\t\t\t\t\t\t...itemsRef.current,\n\t\t\t\t\t\t\tcreateLineItem(\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\traw,\n\t\t\t\t\t\t\t\tline,\n\t\t\t\t\t\t\t\tst.tool === \"arrow\" ? \"arrow\" : \"line\",\n\t\t\t\t\t\t\t\tpen,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t}\n\t\t\t\t\trequestAutoResetTool(st.tool);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.addEventListener(\"pointermove\", onMove);\n\t\t\tdocument.addEventListener(\"pointerup\", onUp);\n\t\t\tdocument.addEventListener(\"pointercancel\", onUp);\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener(\"pointermove\", onMove);\n\t\t\t\tdocument.removeEventListener(\"pointerup\", onUp);\n\t\t\t\tdocument.removeEventListener(\"pointercancel\", onUp);\n\t\t\t};\n\t\t}, [\n\t\t\temitRemoteStrokePreview,\n\t\t\temitRemoteStrokePreviewClear,\n\t\t\tinteractive,\n\t\t\tpruneEraserTrail,\n\t\t\tpruneLaserTrail,\n\t\t\tfinalizeStrokeDragState,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\treleaseInteractionPointer,\n\t\t\trequestAutoResetTool,\n\t\t\tscreenToWorld,\n\t\t\tsetStraightStrokeEndpoint,\n\t\t\tupdateStraightStrokeForMove,\n\t\t]);\n\n\t\tconst selectedItemsForOverlay = useMemo(() => {\n\t\t\treturn effectiveSelectedIds\n\t\t\t\t.map((id) => resolvedItems.find((i) => i.id === id))\n\t\t\t\t.filter((i): i is VectorSceneItem => i != null);\n\t\t}, [effectiveSelectedIds, resolvedItems]);\n\t\tconst activeToolInspectorStyle = useMemo(() => {\n\t\t\tif (toolId === \"draw\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"draw\" as const,\n\t\t\t\t\tlabel: \"Caneta\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"marker\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"marker\" as const,\n\t\t\t\t\tlabel: \"Marcador\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"text\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"text\" as const,\n\t\t\t\t\tlabel: \"Texto\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"rect\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"rect\" as const,\n\t\t\t\t\tlabel: \"Retângulo\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"ellipse\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"ellipse\" as const,\n\t\t\t\t\tlabel: \"Elipse\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"architectural-cloud\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"architectural-cloud\" as const,\n\t\t\t\t\tlabel: \"Nuvem\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"line\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"line\" as const,\n\t\t\t\t\tlabel: \"Linha\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"arrow\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"arrow\" as const,\n\t\t\t\t\tlabel: \"Seta\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}, [strokeStyleState, toolId]);\n\t\tconst eraserPreviewItemsForOverlay = useMemo(() => {\n\t\t\treturn eraserPreviewIds\n\t\t\t\t.map((id) => resolvedItems.find((i) => i.id === id))\n\t\t\t\t.filter((i): i is VectorSceneItem => i != null);\n\t\t}, [eraserPreviewIds, resolvedItems]);\n\t\tconst marqueeCandidateItemsForOverlay = useMemo(() => {\n\t\t\tif (marqueeCandidateIds.length === 0) return [];\n\t\t\t// Items already selected keep their solid selection box; only the\n\t\t\t// not-yet-selected ones get the dashed \"will be added\" highlight.\n\t\t\tconst selected = new Set(effectiveSelectedIds);\n\t\t\treturn marqueeCandidateIds\n\t\t\t\t.filter((id) => !selected.has(id))\n\t\t\t\t.map((id) => resolvedItems.find((i) => i.id === id))\n\t\t\t\t.filter((i): i is VectorSceneItem => i != null);\n\t\t}, [marqueeCandidateIds, effectiveSelectedIds, resolvedItems]);\n\n\t\tconst presenceLayer = useMemo(() => {\n\t\t\tif (!cameraForOverlay) return null;\n\t\t\tif (presenceOverlay) {\n\t\t\t\treturn presenceOverlay({\n\t\t\t\t\tcamera: cameraForOverlay,\n\t\t\t\t\tcameraVersion: cameraTick,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (remotePresence && remotePresence.length > 0) {\n\t\t\t\treturn (\n\t\t\t\t\t<PresenceRemoteLayer\n\t\t\t\t\t\tcamera={cameraForOverlay}\n\t\t\t\t\t\tcameraVersion={cameraTick}\n\t\t\t\t\t\tpeers={remotePresence}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn null;\n\t\t}, [cameraForOverlay, cameraTick, presenceOverlay, remotePresence]);\n\n\t\tconst primarySelected =\n\t\t\teffectiveSelectedIds.length === 1\n\t\t\t\t? (resolvedItems.find((i) => i.id === effectiveSelectedIds[0]) ?? null)\n\t\t\t\t: null;\n\n\t\tconst editingTextItem = editingTextId\n\t\t\t? (items.find((i) => i.id === editingTextId && i.toolKind === \"text\") ?? null)\n\t\t\t: null;\n\t\tconst showResizeHandles =\n\t\t\ttoolId === \"select\" &&\n\t\t\t!!primarySelected &&\n\t\t\t!primarySelected.locked &&\n\t\t\tsupportsResizeHandles(primarySelected);\n\n\t\tconst overlayPointerEvents: \"none\" | \"auto\" =\n\t\t\tinteractive && toolId !== \"hand\" ? \"auto\" : \"none\";\n\n\t\tconst viewportCursor =\n\t\t\tcustomPlacement?.toolId === toolId\n\t\t\t\t? \"crosshair\"\n\t\t\t\t: cursorForVectorToolId(toolId);\n\n\t\tconst rootStyle: CSSProperties = {\n\t\t\tposition: \"relative\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tminHeight: 0,\n\t\t\toutline: \"none\",\n\t\t\tcursor: viewportCursor,\n\t\t\tuserSelect: \"none\",\n\t\t\tWebkitUserSelect: \"none\",\n\t\t\tWebkitTouchCallout: \"none\",\n\t\t};\n\n\t\tconst canEditSelection = interactive && !!onItemsChange;\n\t\tconst chromeContextValue: CanvuChromeContextValue = {\n\t\t\tcamera: cameraForOverlay,\n\t\t\tviewportWidth: viewportSizeRef.current.width,\n\t\t\tviewportHeight: viewportSizeRef.current.height,\n\t\t\titems,\n\t\t\tselectedItems: selectedItemsForOverlay,\n\t\t\tinteractive,\n\t\t\tcanEditSelection,\n\t\t\tactiveToolStyle: activeToolInspectorStyle ?? null,\n\t\t\tonSelectionStyleChange: canEditSelection\n\t\t\t\t? activeToolInspectorStyle\n\t\t\t\t\t? handleActiveToolStyleChange\n\t\t\t\t\t: handleSelectionStyleChange\n\t\t\t\t: null,\n\t\t\tzoomPercent,\n\t\t\tonZoomIn: handleZoomInClick,\n\t\t\tonZoomOut: handleZoomOutClick,\n\t\t\tonUndo: undo,\n\t\t\tonRedo: redo,\n\t\t\tcanUndo,\n\t\t\tcanRedo,\n\t\t\tonRequestRender: renderFrame,\n\t\t};\n\n\t\tconst defaultSelectionInspector =\n\t\t\tcameraForOverlay && canEditSelection ? (\n\t\t\t\t<VectorSelectionInspector\n\t\t\t\t\tclassName={selectionInspectorProps?.className}\n\t\t\t\t\tstyle={selectionInspectorProps?.style}\n\t\t\t\t/>\n\t\t\t) : null;\n\t\tconst defaultNavMenu = cameraForOverlay ? <NavMenu /> : null;\n\n\t\tconst resolvedSelectionInspector =\n\t\t\tselectionInspector === undefined\n\t\t\t\t? defaultSelectionInspector\n\t\t\t\t: selectionInspector;\n\t\tconst resolvedNavMenu = navMenu === undefined ? defaultNavMenu : navMenu;\n\n\t\treturn (\n\t\t\t<CanvuPluginContext.Provider value={pluginContextValue}>\n\t\t\t\t<CanvuChromeContext.Provider value={chromeContextValue}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={wrapperRef}\n\t\t\t\t\t\tstyle={rootStyle}\n\t\t\t\t\t\trole=\"application\"\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-describedby={liveId}\n\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\tonPaste={handleWrapperPaste}\n\t\t\t\t\t\tonDragOver={handleWrapperDragOver}\n\t\t\t\t\t\tonDrop={handleWrapperDrop}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={interactionRootRef}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tzIndex: 0,\n\t\t\t\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tref={sceneContainerRef}\n\t\t\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\tzIndex: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{loadingSkeletons.length > 0 && cameraForOverlay && (\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<g transform={formatCameraTransform(cameraForOverlay)}>\n\t\t\t\t\t\t\t\t\t\t{loadingSkeletons.map((sk) => (\n\t\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\t\tkey={sk.id}\n\t\t\t\t\t\t\t\t\t\t\t\tx={sk.x}\n\t\t\t\t\t\t\t\t\t\t\t\ty={sk.y}\n\t\t\t\t\t\t\t\t\t\t\t\twidth={sk.width}\n\t\t\t\t\t\t\t\t\t\t\t\theight={sk.height}\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"#f4f4f5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"#d4d4d8\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1 / cameraForOverlay.zoom}\n\t\t\t\t\t\t\t\t\t\t\t\trx={2 / cameraForOverlay.zoom}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimation: \"canvu-pulse 1.5s ease-in-out infinite\",\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{presenceLayer}\n\t\t\t\t\t\t\t{cameraForOverlay && interactive && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<InteractionOverlay\n\t\t\t\t\t\t\t\t\t\tcamera={cameraForOverlay}\n\t\t\t\t\t\t\t\t\t\tcameraVersion={cameraTick}\n\t\t\t\t\t\t\t\t\t\tselectedItems={selectedItemsForOverlay}\n\t\t\t\t\t\t\t\t\t\tshowResizeHandles={showResizeHandles}\n\t\t\t\t\t\t\t\t\t\tplacementPreview={placementPreview}\n\t\t\t\t\t\t\t\t\t\teraserTrail={eraserTrail}\n\t\t\t\t\t\t\t\t\t\tlaserTrail={laserTrail}\n\t\t\t\t\t\t\t\t\t\teraserPreviewItems={eraserPreviewItemsForOverlay}\n\t\t\t\t\t\t\t\t\t\tmarqueeCandidateItems={marqueeCandidateItemsForOverlay}\n\t\t\t\t\t\t\t\t\t\tpreviewStrokeStyle={strokeStyleRef.current}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\t\t\t\tzIndex: 12,\n\t\t\t\t\t\t\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t\t\t\t\t\t\t\tpointerEvents: overlayPointerEvents,\n\t\t\t\t\t\t\t\t\t\t\tcursor: viewportCursor,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonPointerDown={handleOverlayPointerDown}\n\t\t\t\t\t\t\t\t\t\tonContextMenu={handleOverlayContextMenu}\n\t\t\t\t\t\t\t\t\t\tonDoubleClick={handleOverlayDoubleClick}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref={imageInputRef}\n\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\taccept=\"image/*,application/pdf\"\n\t\t\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\t\t\taria-label=\"Select image or PDF to place on canvas\"\n\t\t\t\t\t\t\tonChange={handleImageFileChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{toolbar}\n\t\t\t\t\t\t{plugins.length > 0 ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tdata-slot=\"canvu-plugin-layer\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\tzIndex: 40,\n\t\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<VectorViewportPluginInstances\n\t\t\t\t\t\t\t\t\tplugins={plugins}\n\t\t\t\t\t\t\t\t\trenderContext={pluginRenderContext}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{cameraForOverlay && interactive && editingTextItem && (\n\t\t\t\t\t\t\t<TextEditOverlay\n\t\t\t\t\t\t\t\tcamera={cameraForOverlay}\n\t\t\t\t\t\t\t\tcameraVersion={cameraTick}\n\t\t\t\t\t\t\t\titem={editingTextItem}\n\t\t\t\t\t\t\t\tdraftText={draftText}\n\t\t\t\t\t\t\t\tonDraftChange={handleDraftTextChange}\n\t\t\t\t\t\t\t\tonCommit={commitTextEdit}\n\t\t\t\t\t\t\t\tonCancel={cancelTextEdit}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{resolvedSelectionInspector}\n\t\t\t\t\t\t{interactive && onItemsChange && contextMenu && (\n\t\t\t\t\t\t\t<ShapeContextMenu\n\t\t\t\t\t\t\t\tx={contextMenu.x}\n\t\t\t\t\t\t\t\ty={contextMenu.y}\n\t\t\t\t\t\t\t\tallSelectedLocked={\n\t\t\t\t\t\t\t\t\tcontextMenu.itemIds.length > 0 &&\n\t\t\t\t\t\t\t\t\tcontextMenu.itemIds.every(\n\t\t\t\t\t\t\t\t\t\t(id) => items.find((i) => i.id === id)?.locked,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClose={() => setContextMenu(null)}\n\t\t\t\t\t\t\t\tonToggleLock={() => {\n\t\t\t\t\t\t\t\t\tconst ids = contextMenu.itemIds;\n\t\t\t\t\t\t\t\t\tconst allLocked =\n\t\t\t\t\t\t\t\t\t\tids.length > 0 &&\n\t\t\t\t\t\t\t\t\t\tids.every((id) => items.find((i) => i.id === id)?.locked);\n\t\t\t\t\t\t\t\t\tsetLockedOnIds(ids, !allLocked);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonCut={() => cutIds(contextMenu.itemIds)}\n\t\t\t\t\t\t\t\tonCopy={() => copyIdsToInternalClipboard(contextMenu.itemIds)}\n\t\t\t\t\t\t\t\tonBringToFront={() => reorderIds(contextMenu.itemIds, \"front\")}\n\t\t\t\t\t\t\t\tonBringForward={() => reorderIds(contextMenu.itemIds, \"forward\")}\n\t\t\t\t\t\t\t\tonSendBackward={() => reorderIds(contextMenu.itemIds, \"backward\")}\n\t\t\t\t\t\t\t\tonSendToBack={() => reorderIds(contextMenu.itemIds, \"back\")}\n\t\t\t\t\t\t\t\tonDuplicate={() => duplicateIds(contextMenu.itemIds)}\n\t\t\t\t\t\t\t\tonDelete={() => deleteIds(contextMenu.itemIds)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{resolvedNavMenu}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={liveId}\n\t\t\t\t\t\t\tstyle={visuallyHidden}\n\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{`Zoom ${zoomPercent} percent.`}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</CanvuChromeContext.Provider>\n\t\t\t</CanvuPluginContext.Provider>\n\t\t);\n\t},\n);\n\nVectorViewport.displayName = \"VectorViewport\";\n\nexport { cursorForVectorToolId };\n","import type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect } from \"../math/rect\";\nimport { cullItemsByViewport } from \"../scene/cull\";\nimport type { VectorScene } from \"../scene/scene\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Builds the SVG `transform` attribute for mapping world coordinates to viewport CSS pixels.\n */\nexport function formatCameraTransform(camera: Camera2D): string {\n\tconst z = camera.zoom;\n\treturn `matrix(${z}, 0, 0, ${z}, ${camera.x}, ${camera.y})`;\n}\n\n/**\n * Transform for item `<g>`: `translate(x,y)` plus optional rotation around the bounds center.\n * SVG `rotate` uses degrees.\n */\nexport function formatItemPlacementTransform(item: VectorSceneItem): string {\n\tconst r = normalizeRect(item.bounds);\n\tconst rot = item.rotation ?? 0;\n\tif (Math.abs(rot) < 1e-12) {\n\t\treturn `translate(${item.x}, ${item.y})`;\n\t}\n\tconst deg = (rot * 180) / Math.PI;\n\tconst cx = r.width / 2;\n\tconst cy = r.height / 2;\n\treturn `translate(${item.x}, ${item.y}) translate(${cx}, ${cy}) rotate(${deg}) translate(${-cx}, ${-cy})`;\n}\n\nexport type SvgVectorRendererOptions = {\n\t/** Root element (typically `position: relative` and fixed size). */\n\tcontainer: HTMLElement;\n\tscene: VectorScene;\n\tcamera: Camera2D;\n\t/**\n\t * When true, the scene SVG ignores pointer events so an overlay can own hit-testing\n\t * (interactive selection / resize / placement).\n\t */\n\tpointerEventsNone?: boolean;\n};\n\ntype CachedItemG = {\n\treadonly g: SVGGElement;\n\tlastChildrenSvg: string;\n\tlastTransform: string;\n};\n\n/**\n * Renders vector scene items into a single SVG: camera as an outer `<g>` transform,\n * so geometry stays sharp at any zoom (no fixed-resolution raster).\n *\n * Uses incremental DOM updates: keeps a stable `<g>` per visible item id, updates\n * `innerHTML` only when `childrenSvg` changes, and only adjusts the camera transform\n * when pan/zoom changes without content edits.\n */\nexport class SvgVectorRenderer {\n\tprivate readonly container: HTMLElement;\n\tprivate readonly scene: VectorScene;\n\tprivate readonly camera: Camera2D;\n\tprivate readonly svg: SVGSVGElement;\n\tprivate readonly rootG: SVGGElement;\n\tprivate readonly itemNodeCache = new Map<string, CachedItemG>();\n\tprivate liveOverlay: CachedItemG | null = null;\n\tprivate readonly resizeObserver: ResizeObserver;\n\n\tconstructor(options: SvgVectorRendererOptions) {\n\t\tthis.container = options.container;\n\t\tthis.scene = options.scene;\n\t\tthis.camera = options.camera;\n\n\t\tthis.svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tthis.svg.setAttribute(\"width\", \"100%\");\n\t\tthis.svg.setAttribute(\"height\", \"100%\");\n\t\tthis.svg.setAttribute(\"shape-rendering\", \"geometricPrecision\");\n\t\tthis.svg.style.display = \"block\";\n\t\tthis.svg.setAttribute(\"role\", \"presentation\");\n\t\tthis.svg.setAttribute(\"focusable\", \"false\");\n\t\tthis.setPointerEventsNone(options.pointerEventsNone ?? false);\n\n\t\tthis.rootG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tthis.svg.appendChild(this.rootG);\n\n\t\tthis.container.appendChild(this.svg);\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.render());\n\t\tthis.resizeObserver.observe(this.container);\n\t}\n\n\t/**\n\t * Reads container size, culls items, and updates the SVG (incrementally when possible).\n\t */\n\trender(): void {\n\t\tconst w = this.container.clientWidth;\n\t\tconst h = this.container.clientHeight;\n\t\tif (w <= 0 || h <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.svg.setAttribute(\"viewBox\", `0 0 ${w} ${h}`);\n\t\tthis.svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid slice\");\n\n\t\tconst visible = this.camera.getVisibleWorldRect(w, h);\n\t\tconst items = cullItemsByViewport(this.scene.getItems(), visible);\n\n\t\tthis.syncVisibleItems(items);\n\t\tthis.rootG.setAttribute(\"transform\", formatCameraTransform(this.camera));\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\t/**\n\t * Updates only the in-progress (live) stroke node without re-culling or\n\t * re-syncing the committed scene items. Drawing tools call this on every\n\t * pointer move, so it must stay O(1) regardless of how many items the\n\t * board already contains.\n\t *\n\t * Pass `null` to remove the live overlay (e.g. when the stroke is committed).\n\t */\n\trenderLiveItem(item: VectorSceneItem | null): void {\n\t\tif (!item) {\n\t\t\tif (this.liveOverlay) {\n\t\t\t\tthis.liveOverlay.g.remove();\n\t\t\t\tthis.liveOverlay = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.liveOverlay) {\n\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\tg.setAttribute(\"data-live-overlay\", \"true\");\n\t\t\tthis.liveOverlay = {\n\t\t\t\tg,\n\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\tlastTransform: \"\",\n\t\t\t};\n\t\t\tthis.rootG.appendChild(g);\n\t\t}\n\n\t\tconst cached = this.liveOverlay;\n\t\tconst t = formatItemPlacementTransform(item);\n\t\tif (cached.lastTransform !== t) {\n\t\t\tcached.g.setAttribute(\"transform\", t);\n\t\t\tcached.lastTransform = t;\n\t\t}\n\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\tcached.g.innerHTML = item.childrenSvg;\n\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t}\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\tprivate keepLiveOverlayOnTop(): void {\n\t\tif (this.liveOverlay && this.rootG.lastChild !== this.liveOverlay.g) {\n\t\t\tthis.rootG.appendChild(this.liveOverlay.g);\n\t\t}\n\t}\n\n\tprivate syncVisibleItems(items: readonly VectorSceneItem[]): void {\n\t\tconst visibleIds = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tvisibleIds.add(item.id);\n\t\t}\n\n\t\tfor (const [id, cached] of this.itemNodeCache) {\n\t\t\tif (!visibleIds.has(id)) {\n\t\t\t\tcached.g.remove();\n\t\t\t}\n\t\t}\n\n\t\tlet previousNode: ChildNode | null = null;\n\t\tfor (const item of items) {\n\t\t\tlet cached = this.itemNodeCache.get(item.id);\n\t\t\tif (!cached) {\n\t\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\t\tg.setAttribute(\"data-item-id\", item.id);\n\t\t\t\tcached = {\n\t\t\t\t\tg,\n\t\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\t\tlastTransform: \"\",\n\t\t\t\t};\n\t\t\t\tthis.itemNodeCache.set(item.id, cached);\n\t\t\t}\n\n\t\t\tconst { g } = cached;\n\t\t\tconst t = formatItemPlacementTransform(item);\n\t\t\tif (cached.lastTransform !== t) {\n\t\t\t\tg.setAttribute(\"transform\", t);\n\t\t\t\tcached.lastTransform = t;\n\t\t\t}\n\n\t\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\t\tg.innerHTML = item.childrenSvg;\n\t\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t\t}\n\n\t\t\tconst expectedPosition: ChildNode | null = previousNode\n\t\t\t\t? previousNode.nextSibling\n\t\t\t\t: this.rootG.firstChild;\n\t\t\tif (expectedPosition !== g) {\n\t\t\t\tthis.rootG.insertBefore(g, expectedPosition);\n\t\t\t}\n\t\t\tpreviousNode = g;\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.itemNodeCache.clear();\n\t\tthis.liveOverlay = null;\n\t\tthis.svg.remove();\n\t}\n\n\t/** Toggle whether the scene SVG receives pointer events (vs overlay handling them). */\n\tsetPointerEventsNone(value: boolean): void {\n\t\tthis.svg.style.pointerEvents = value ? \"none\" : \"auto\";\n\t}\n}\n","import { 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 { 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 type { Rect } from \"../math/rect\";\nimport { createCustomShapeItem } from \"./custom-shape\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Plugin key under which link metadata is stored on a link item's `pluginData`. */\nexport const LINK_PLUGIN_KEY = \"canvuLink\";\n\n/**\n * Metadata describing a clickable link/bookmark item.\n * `href` is required; the rest enrich the rendered card (unfurl result).\n */\nexport type CanvuLinkData = {\n\t/** Absolute URL the card points to. */\n\thref: string;\n\t/** Human readable title (falls back to the hostname). */\n\ttitle?: string;\n\t/** Short description shown under the title. */\n\tdescription?: string;\n\t/** Preview image URL (og:image). */\n\timage?: string;\n\t/** Favicon URL shown in the leading badge. */\n\tfavicon?: string;\n};\n\nconst DEFAULT_LINK_CARD_WIDTH = 360;\nconst DEFAULT_LINK_CARD_HEIGHT = 132;\nconst LINK_CARD_BORDER = \"#e2e8f0\";\nconst LINK_CARD_ACCENT = \"#2563eb\";\nconst LINK_CARD_TITLE_COLOR = \"#0f172a\";\nconst LINK_CARD_TEXT_COLOR = \"#475569\";\n\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.min(max, Math.max(min, value));\n\nconst formatNumber = (value: number): string => {\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Object.is(rounded, -0) ? \"0\" : String(rounded);\n};\n\nconst escapeXmlAttribute = (value: string): string =>\n\tvalue\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\")\n\t\t.replaceAll('\"', \""\")\n\t\t.replaceAll(\"'\", \"'\");\n\nconst escapeHtmlText = (value: string): string =>\n\tvalue.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n\nconst getLinkHostname = (href: string): string => {\n\ttry {\n\t\treturn new URL(href).hostname.replace(/^www\\./, \"\");\n\t} catch {\n\t\treturn href;\n\t}\n};\n\ntype LinkTextBand = {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\ttext: string;\n\tfontSize: number;\n\tcolor: string;\n\tfontWeight?: number;\n\tclampLines?: number;\n};\n\nconst buildLinkTextBand = (band: LinkTextBand): string => {\n\tconst lineHeight = band.fontSize * 1.3;\n\tconst weight = band.fontWeight != null ? `font-weight:${band.fontWeight};` : \"\";\n\tconst lineClampStyle = band.clampLines\n\t\t? `display:-webkit-box;-webkit-line-clamp:${band.clampLines};-webkit-box-orient:vertical;`\n\t\t: \"\";\n\treturn `<foreignObject x=\"${formatNumber(band.x)}\" y=\"${formatNumber(band.y)}\" width=\"${formatNumber(Math.max(1, band.width))}\" height=\"${formatNumber(Math.max(1, band.height))}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;font-family:system-ui,sans-serif;font-size:${formatNumber(band.fontSize)}px;line-height:${formatNumber(lineHeight)}px;color:${band.color};overflow:hidden;word-break:break-word;${lineClampStyle}${weight}\">${escapeHtmlText(band.text)}</div></foreignObject>`;\n};\n\n/**\n * Builds the inner SVG (no outer `<svg>`) for a link/bookmark card at the given box size.\n * Uses fixed pixel bands so text never overlaps regardless of the card's aspect ratio.\n */\nexport function buildLinkCardSvg(\n\twidth: number,\n\theight: number,\n\tlink: CanvuLinkData,\n): string {\n\tconst cardWidth = Math.max(1, width);\n\tconst cardHeight = Math.max(1, height);\n\tconst padding = 14;\n\tconst badgeSize = clamp(Math.min(72, cardHeight - padding * 2), 28, 96);\n\tconst textX = padding + badgeSize + 14;\n\tconst textWidth = Math.max(1, cardWidth - textX - padding);\n\tconst hostname = getLinkHostname(link.href);\n\tconst title = link.title?.trim() || hostname || \"Link\";\n\tconst description = link.description?.trim() || link.href;\n\n\tconst titleY = padding;\n\tconst titleHeight = clamp(cardHeight * 0.22, 18, 28);\n\tconst hostY = titleY + titleHeight + 2;\n\tconst hostHeight = 16;\n\tconst descY = hostY + hostHeight + 4;\n\tconst descHeight = Math.max(1, cardHeight - descY - padding);\n\n\tconst badge = link.favicon\n\t\t? `<clipPath id=\"canvu-link-badge\"><rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" /></clipPath>\n\t\t<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"#f8fafc\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" />\n\t\t<image href=\"${escapeXmlAttribute(link.favicon)}\" x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" preserveAspectRatio=\"xMidYMid slice\" clip-path=\"url(#canvu-link-badge)\" />`\n\t\t: `<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"${LINK_CARD_ACCENT}\" fill-opacity=\"0.1\" stroke=\"${LINK_CARD_ACCENT}\" stroke-opacity=\"0.3\" stroke-width=\"1\" />\n\t\t<g transform=\"translate(${formatNumber(padding + badgeSize / 2)},${formatNumber(padding + badgeSize / 2)})\" stroke=\"${LINK_CARD_ACCENT}\" stroke-width=\"2.4\" stroke-linecap=\"round\" fill=\"none\">\n\t\t\t<path d=\"M-9 3 a6 6 0 0 1 0 -8 l4 -4 a6 6 0 0 1 8 8 l-2 2\" />\n\t\t\t<path d=\"M9 -3 a6 6 0 0 1 0 8 l-4 4 a6 6 0 0 1 -8 -8 l2 -2\" />\n\t\t</g>`;\n\n\tconst externalIconX = cardWidth - padding - 16;\n\tconst externalIcon = `<g transform=\"translate(${formatNumber(externalIconX)},${formatNumber(padding)})\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n\t\t<path d=\"M6 1 H11 V6\" />\n\t\t<path d=\"M11 1 L4.5 7.5\" />\n\t\t<path d=\"M9 7 V10 a1 1 0 0 1 -1 1 H2 a1 1 0 0 1 -1 -1 V4 a1 1 0 0 1 1 -1 H5\" />\n\t</g>`;\n\n\treturn `\n\t\t<rect width=\"${formatNumber(cardWidth)}\" height=\"${formatNumber(cardHeight)}\" rx=\"16\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1.5\" />\n\t\t${badge}\n\t\t${externalIcon}\n\t\t${buildLinkTextBand({ x: textX, y: titleY, width: textWidth - 18, height: titleHeight, text: title, fontSize: 15, color: LINK_CARD_TITLE_COLOR, fontWeight: 700, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: hostY, width: textWidth, height: hostHeight, text: hostname, fontSize: 12, color: LINK_CARD_ACCENT, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: descY, width: textWidth, height: descHeight, text: description, fontSize: 12, color: LINK_CARD_TEXT_COLOR, clampLines: 2 })}\n\t`;\n}\n\nconst isCanvuLinkData = (value: unknown): value is CanvuLinkData => {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst candidate = value as Record<string, unknown>;\n\treturn typeof candidate.href === \"string\" && candidate.href.length > 0;\n};\n\n/** Reads the link metadata from an item, or `null` when the item is not a link. */\nexport function getLinkData(item: VectorSceneItem): CanvuLinkData | null {\n\tconst entry = item.pluginData?.[LINK_PLUGIN_KEY];\n\treturn isCanvuLinkData(entry) ? entry : null;\n}\n\n/** True when the item carries link metadata (clickable card). */\nexport function isLinkItem(item: VectorSceneItem): boolean {\n\treturn getLinkData(item) != null;\n}\n\n/**\n * Creates a clickable link/bookmark card item ready to append to the scene.\n * The card resizes by scaling its authored SVG, like other custom shapes.\n */\nexport function createLinkItem(\n\tid: string,\n\tbounds: Rect,\n\tlink: CanvuLinkData,\n): VectorSceneItem {\n\tconst width = bounds.width || DEFAULT_LINK_CARD_WIDTH;\n\tconst height = bounds.height || DEFAULT_LINK_CARD_HEIGHT;\n\tconst item = createCustomShapeItem(\n\t\tid,\n\t\t{ ...bounds, width, height },\n\t\t{ render: (size) => buildLinkCardSvg(size.width, size.height, link) },\n\t);\n\treturn {\n\t\t...item,\n\t\tpluginData: {\n\t\t\t...(item.pluginData ?? {}),\n\t\t\t[LINK_PLUGIN_KEY]: link,\n\t\t},\n\t};\n}\n\n/** Default card size used when placing a new link without explicit bounds. */\nexport const DEFAULT_LINK_CARD_SIZE = {\n\twidth: DEFAULT_LINK_CARD_WIDTH,\n\theight: DEFAULT_LINK_CARD_HEIGHT,\n} as const;\n","import 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","import type { VectorSceneItem } from \"../scene/types\";\n\nconst SVG_BLOB_HREF_PATTERN = /\\b(?:href|xlink:href)=[\"'](blob:[^\"']+)[\"']/g;\n\nexport function collectImageBlobHrefs(\n\titems: readonly VectorSceneItem[],\n): Set<string> {\n\tconst hrefs = new Set<string>();\n\n\tfor (const item of items) {\n\t\tif (item.toolKind !== \"image\") continue;\n\n\t\tif (item.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\threfs.add(item.imageRasterHref);\n\t\t}\n\t\tif (item.imageThumbnailHref?.startsWith(\"blob:\")) {\n\t\t\threfs.add(item.imageThumbnailHref);\n\t\t}\n\n\t\tfor (const match of item.childrenSvg.matchAll(SVG_BLOB_HREF_PATTERN)) {\n\t\t\tconst href = match[1];\n\t\t\tif (href) {\n\t\t\t\threfs.add(href);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn hrefs;\n}\n\nexport function rememberImageBlobHrefs(\n\titems: readonly VectorSceneItem[],\n\trememberedHrefs: Set<string>,\n): void {\n\tfor (const href of collectImageBlobHrefs(items)) {\n\t\trememberedHrefs.add(href);\n\t}\n}\n\nexport function releaseRememberedBlobHrefs(\n\trememberedHrefs: Set<string>,\n\treleaseHref: (href: string) => void,\n): void {\n\tfor (const href of rememberedHrefs) {\n\t\treleaseHref(href);\n\t}\n\trememberedHrefs.clear();\n}\n","\"use client\";\n\nimport type { Camera2D } from \"../camera/camera\";\nimport {\n\tgetHandleWorldPositionRotated,\n\tgetRotationHandleWorldPosition,\n\ttype ResizeHandleId,\n} from \"../interaction/resize-handles\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tformatCameraTransform,\n\tformatItemPlacementTransform,\n} from \"../renderer/svg-vector-renderer\";\nimport { smoothFreehandPointsToPathD } from \"../scene/freehand-path\";\nimport {\n\tbuildArchitecturalCloudPathD,\n\tcomputeFreehandSvgPayload,\n\tcomputeStraightArrowGeometry,\n\ttype StrokeStyle,\n} from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nconst HANDLE_ORDER: ResizeHandleId[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\nconst ERASER_TINT = \"#cbd5e1\";\nconst ERASER_TINT_OPACITY = 0.95;\n/** Opacity applied to an item while it is queued for eraser deletion (real\n * geometry is shown dimmed instead of being redrawn as a gray skeleton). */\nconst ERASER_PREVIEW_OPACITY = 0.3;\n\nfunction pointsToSmoothPath(\n\tpoints: readonly { x: number; y: number }[],\n): string | null {\n\tif (points.length === 0) return null;\n\tconst d = smoothFreehandPointsToPathD(points);\n\treturn d || null;\n}\n\nexport type PlacementPreview =\n\t| { kind: \"rect\" | \"ellipse\" | \"architectural-cloud\"; rect: Rect }\n\t/** Multi-select drag (world rect), like image crop / rubber-band selection. */\n\t| { kind: \"marquee\"; rect: Rect }\n\t| {\n\t\t\tkind: \"line\" | \"arrow\";\n\t\t\tstart: { x: number; y: number };\n\t\t\tend: { x: number; y: number };\n\t }\n\t| {\n\t\t\tkind: \"stroke\";\n\t\t\ttool: \"draw\" | \"marker\" | \"laser\";\n\t\t\tpoints: { x: number; y: number }[];\n\t\t\t/** Mirrors the local stroke style so remote previews can match width/color/opacity. */\n\t\t\tstyle?: StrokeStyle;\n\t };\n\nexport type InteractionOverlayProps = {\n\tcamera: Camera2D;\n\t/** Bump when camera mutates so React redraws the overlay transform. */\n\tcameraVersion: number;\n\t/** Selected items (order preserved). Empty = no selection. */\n\tselectedItems: readonly VectorSceneItem[];\n\t/** When false, only the selection outline is shown (no resize handles). */\n\tshowResizeHandles: boolean;\n\tplacementPreview: PlacementPreview | null;\n\t/** Live eraser trail points in world space, newest at the end. */\n\teraserTrail?: readonly { x: number; y: number; t: number }[];\n\t/** Live laser trail points in world space, fades out after pointerup. */\n\tlaserTrail?: readonly { x: number; y: number; t: number }[];\n\t/** Shapes currently touched by eraser and queued to be removed on pointerup. */\n\teraserPreviewItems?: readonly VectorSceneItem[];\n\t/** Shapes the active marquee currently covers — a live preview of what\n\t * releasing will select (already-selected items are excluded). */\n\tmarqueeCandidateItems?: readonly VectorSceneItem[];\n\t/** Current stroke style used for local stroke previews (draw/marker). */\n\tpreviewStrokeStyle?: StrokeStyle;\n};\n\n/**\n * World-space decoration: selection bounds, resize handles, placement preview.\n * Renders above the scene SVG with `pointer-events: none` so a sibling HTML hit-layer\n * div can own all pointer capture for tools.\n */\nexport function InteractionOverlay({\n\tcamera,\n\tcameraVersion: _cameraVersion,\n\tselectedItems,\n\tshowResizeHandles,\n\tplacementPreview,\n\teraserTrail = [],\n\tlaserTrail = [],\n\teraserPreviewItems = [],\n\tmarqueeCandidateItems = [],\n\tpreviewStrokeStyle,\n}: InteractionOverlayProps) {\n\tvoid _cameraVersion;\n\tconst z = camera.zoom;\n\t/** World radius so handles stay ~5 CSS px after camera scale (see `formatCameraTransform`). */\n\tconst handleR = 5 / z;\n\t/**\n\t * Constant stroke in user units; `vectorEffect=\"non-scaling-stroke\"` keeps ~this many CSS px\n\t * regardless of zoom. Do not divide by `z` here — that doubled with non-scaling-stroke and made\n\t * borders/handles look overly thick when zoomed in.\n\t */\n\tconst overlayStrokePx = 1.25;\n\tconst dashPattern = \"4 4\";\n\tconst rotateHandleOffsetWorld = 24 / z;\n\t/** Screen-sized icon in world units (~16px at current zoom). */\n\tconst rotateIconWorld = 16 / z;\n\tconst rotateIconScale = rotateIconWorld / 24;\n\n\tconst rootTransform = formatCameraTransform(camera);\n\n\tlet selection: React.ReactNode = null;\n\tif (selectedItems.length > 0) {\n\t\tconst single = selectedItems.length === 1 ? selectedItems[0] : undefined;\n\t\tconst bSingle = single ? normalizeRect(single.bounds) : null;\n\t\tconst rotSingle = single?.rotation ?? 0;\n\t\tconst rotHandlePos =\n\t\t\tshowResizeHandles && bSingle && single\n\t\t\t\t? getRotationHandleWorldPosition(bSingle, rotSingle, rotateHandleOffsetWorld)\n\t\t\t\t: null;\n\t\tselection = (\n\t\t\t<g>\n\t\t\t\t{selectedItems.map((it) => {\n\t\t\t\t\tconst b = normalizeRect(it.bounds);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g key={it.id} transform={formatItemPlacementTransform(it)}>\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tx={0}\n\t\t\t\t\t\t\t\ty={0}\n\t\t\t\t\t\t\t\twidth={b.width}\n\t\t\t\t\t\t\t\theight={b.height}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{showResizeHandles && bSingle && single && rotHandlePos && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{HANDLE_ORDER.map((hid) => {\n\t\t\t\t\t\t\tconst p = getHandleWorldPositionRotated(bSingle, hid, rotSingle);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\tkey={hid}\n\t\t\t\t\t\t\t\t\tcx={p.x}\n\t\t\t\t\t\t\t\t\tcy={p.y}\n\t\t\t\t\t\t\t\t\tr={handleR}\n\t\t\t\t\t\t\t\t\tfill=\"#ffffff\"\n\t\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t\tdata-handle-id={hid}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<g\n\t\t\t\t\t\t\ttransform={`translate(${rotHandlePos.x}, ${rotHandlePos.y}) rotate(${(rotSingle * 180) / Math.PI})`}\n\t\t\t\t\t\t\tdata-rotate-handle=\"1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<g\n\t\t\t\t\t\t\t\ttransform={`translate(${-rotateIconWorld / 2}, ${-rotateIconWorld / 2}) scale(${rotateIconScale})`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Curved arrow (rotate) — Lucide-style arc + arrowhead */}\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M21 3v5h-5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</g>\n\t\t);\n\t}\n\n\tlet preview: React.ReactNode = null;\n\tif (placementPreview) {\n\t\tif (placementPreview.kind === \"marquee\") {\n\t\t\tconst r = normalizeRect(placementPreview.rect);\n\t\t\tpreview = (\n\t\t\t\t<rect\n\t\t\t\t\tx={r.x}\n\t\t\t\t\ty={r.y}\n\t\t\t\t\twidth={r.width}\n\t\t\t\t\theight={r.height}\n\t\t\t\t\tfill=\"rgba(59, 130, 246, 0.12)\"\n\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t/>\n\t\t\t);\n\t\t} else if (\n\t\t\tplacementPreview.kind === \"rect\" ||\n\t\t\tplacementPreview.kind === \"ellipse\" ||\n\t\t\tplacementPreview.kind === \"architectural-cloud\"\n\t\t) {\n\t\t\tconst r = normalizeRect(placementPreview.rect);\n\t\t\tconst shapeStroke = previewStrokeStyle?.stroke ?? \"#1d1d1d\";\n\t\t\tconst shapeWidth = previewStrokeStyle?.strokeWidth ?? 2;\n\t\t\tconst shapeOpacity = previewStrokeStyle?.strokeOpacity;\n\t\t\tpreview =\n\t\t\t\tplacementPreview.kind === \"rect\" ? (\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={r.x}\n\t\t\t\t\t\ty={r.y}\n\t\t\t\t\t\twidth={r.width}\n\t\t\t\t\t\theight={r.height}\n\t\t\t\t\t\trx={4}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t/>\n\t\t\t\t) : placementPreview.kind === \"ellipse\" ? (\n\t\t\t\t\t<ellipse\n\t\t\t\t\t\tcx={r.x + r.width / 2}\n\t\t\t\t\t\tcy={r.y + r.height / 2}\n\t\t\t\t\t\trx={r.width / 2}\n\t\t\t\t\t\try={r.height / 2}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<g transform={`translate(${r.x}, ${r.y})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={buildArchitecturalCloudPathD(r.width, r.height, shapeWidth)}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t);\n\t\t} else if (\n\t\t\tplacementPreview.kind === \"line\" ||\n\t\t\tplacementPreview.kind === \"arrow\"\n\t\t) {\n\t\t\tconst { start, end } = placementPreview;\n\t\t\tconst shapeStroke = previewStrokeStyle?.stroke ?? \"#1d1d1d\";\n\t\t\tconst shapeWidth = previewStrokeStyle?.strokeWidth ?? 2;\n\t\t\tconst shapeOpacity = previewStrokeStyle?.strokeOpacity;\n\t\t\tconst geometry =\n\t\t\t\tplacementPreview.kind === \"arrow\"\n\t\t\t\t\t? computeStraightArrowGeometry(\n\t\t\t\t\t\t\t{ x1: start.x, y1: start.y, x2: end.x, y2: end.y },\n\t\t\t\t\t\t\tshapeWidth,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null;\n\t\t\tpreview = (\n\t\t\t\t<>\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={start.x}\n\t\t\t\t\t\ty1={start.y}\n\t\t\t\t\t\tx2={geometry?.shaftEndX ?? end.x}\n\t\t\t\t\t\ty2={geometry?.shaftEndY ?? end.y}\n\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t/>\n\t\t\t\t\t{placementPreview.kind === \"arrow\" && geometry ? (\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={`M ${geometry.headLeftX} ${geometry.headLeftY} L ${geometry.headTipX} ${geometry.headTipY} L ${geometry.headRightX} ${geometry.headRightY}`}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t);\n\t\t} else if (placementPreview.kind === \"stroke\") {\n\t\t\tconst raw = placementPreview.points;\n\t\t\tconst tool = placementPreview.tool;\n\t\t\tif (raw.length >= 1) {\n\t\t\t\tconst isLaser = tool === \"laser\";\n\t\t\t\tconst previewStyle: StrokeStyle = {\n\t\t\t\t\tstroke: isLaser ? \"#f43f5e\" : (previewStrokeStyle?.stroke ?? \"#64748b\"),\n\t\t\t\t\tstrokeWidth: isLaser\n\t\t\t\t\t\t? 4\n\t\t\t\t\t\t: (previewStrokeStyle?.strokeWidth ?? (tool === \"marker\" ? 16 : 3)),\n\t\t\t\t\t...(previewStrokeStyle?.strokeOpacity != null && !isLaser\n\t\t\t\t\t\t? { strokeOpacity: previewStrokeStyle.strokeOpacity }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(previewStrokeStyle?.strokeDash != null && !isLaser\n\t\t\t\t\t\t? { strokeDash: previewStrokeStyle.strokeDash }\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\t\tconst payload = computeFreehandSvgPayload(\n\t\t\t\t\traw,\n\t\t\t\t\tpreviewStyle,\n\t\t\t\t\ttool === \"laser\" ? \"draw\" : tool,\n\t\t\t\t\traw.length === 2,\n\t\t\t\t);\n\t\t\t\tif (payload) {\n\t\t\t\t\tif (payload.kind === \"circle\") {\n\t\t\t\t\t\tpreview = (\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx={payload.cx}\n\t\t\t\t\t\t\t\tcy={payload.cy}\n\t\t\t\t\t\t\t\tr={payload.r}\n\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\tfillOpacity={payload.fillOpacity}\n\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (payload.kind === \"fillPath\") {\n\t\t\t\t\t\tpreview = (\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\tfillOpacity={payload.fillOpacity}\n\t\t\t\t\t\t\t\tfillRule=\"nonzero\"\n\t\t\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpreview = (\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={payload.stroke}\n\t\t\t\t\t\t\t\tstrokeWidth={payload.strokeWidth}\n\t\t\t\t\t\t\t\tstrokeOpacity={isLaser ? 0.85 : payload.strokeOpacity}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeDasharray={payload.strokeDasharray}\n\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlet eraserPreview: React.ReactNode = null;\n\tif (eraserPreviewItems.length > 0) {\n\t\t// Show the real item dimmed (not a redrawn gray skeleton) so the\n\t\t// deletion preview always matches the original geometry exactly.\n\t\t// Mirrors SvgVectorRenderer: same placement transform + childrenSvg.\n\t\teraserPreview = (\n\t\t\t<g>\n\t\t\t\t{eraserPreviewItems.map((it) => (\n\t\t\t\t\t<g\n\t\t\t\t\t\tkey={`erase-preview-${it.id}`}\n\t\t\t\t\t\ttransform={formatItemPlacementTransform(it)}\n\t\t\t\t\t\topacity={ERASER_PREVIEW_OPACITY}\n\t\t\t\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: trusted scene SVG fragment, same source as SvgVectorRenderer\n\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: it.childrenSvg }}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</g>\n\t\t);\n\t}\n\n\tlet marqueeCandidates: React.ReactNode = null;\n\tif (marqueeCandidateItems.length > 0) {\n\t\tmarqueeCandidates = (\n\t\t\t<g>\n\t\t\t\t{marqueeCandidateItems.map((it) => {\n\t\t\t\t\tconst b = normalizeRect(it.bounds);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g\n\t\t\t\t\t\t\tkey={`marquee-cand-${it.id}`}\n\t\t\t\t\t\t\ttransform={formatItemPlacementTransform(it)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tx={0}\n\t\t\t\t\t\t\t\ty={0}\n\t\t\t\t\t\t\t\twidth={b.width}\n\t\t\t\t\t\t\t\theight={b.height}\n\t\t\t\t\t\t\t\tfill=\"rgba(59, 130, 246, 0.10)\"\n\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</g>\n\t\t);\n\t}\n\n\tlet eraserTrailOverlay: React.ReactNode = null;\n\tif (eraserTrail.length >= 1) {\n\t\tconst now = Date.now();\n\t\tconst maxAgeMs = 150;\n\t\tconst alive = eraserTrail.filter((p) => now - p.t <= maxAgeMs);\n\t\tif (alive.length > 0) {\n\t\t\tconst d = pointsToSmoothPath(alive);\n\t\t\tconst newest = alive[alive.length - 1];\n\t\t\tconst newestAge = newest ? now - newest.t : maxAgeMs;\n\t\t\tconst headOpacity = Math.max(0, 1 - newestAge / maxAgeMs);\n\t\t\teraserTrailOverlay = (\n\t\t\t\t<g>\n\t\t\t\t\t{alive.length >= 2 && d ? (\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={ERASER_TINT}\n\t\t\t\t\t\t\tstrokeOpacity={ERASER_TINT_OPACITY}\n\t\t\t\t\t\t\tstrokeWidth={Math.max(3.5, overlayStrokePx)}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<circle\n\t\t\t\t\t\tcx={newest?.x ?? alive[0]?.x}\n\t\t\t\t\t\tcy={newest?.y ?? alive[0]?.y}\n\t\t\t\t\t\tr={Math.max(5 / z, 3)}\n\t\t\t\t\t\tfill={ERASER_TINT}\n\t\t\t\t\t\tfillOpacity={headOpacity}\n\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t}\n\n\tlet laserTrailOverlay: React.ReactNode = null;\n\tif (laserTrail.length >= 1) {\n\t\tconst now = Date.now();\n\t\tconst maxAgeMs = 650;\n\t\tconst alive = laserTrail.filter((p) => now - p.t <= maxAgeMs);\n\t\tif (alive.length > 0) {\n\t\t\tconst d = pointsToSmoothPath(alive);\n\t\t\tconst newest = alive[alive.length - 1];\n\t\t\tconst newestAge = newest ? now - newest.t : maxAgeMs;\n\t\t\tconst headOpacity = Math.max(0, 1 - newestAge / maxAgeMs);\n\t\t\tlaserTrailOverlay = (\n\t\t\t\t<g>\n\t\t\t\t\t{alive.length >= 2 && d ? (\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"#f43f5e\"\n\t\t\t\t\t\t\tstrokeOpacity={0.9}\n\t\t\t\t\t\t\tstrokeWidth={Math.max(4, overlayStrokePx)}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<circle\n\t\t\t\t\t\tcx={newest?.x ?? alive[0]?.x}\n\t\t\t\t\t\tcy={newest?.y ?? alive[0]?.y}\n\t\t\t\t\t\tr={Math.max(5 / z, 3)}\n\t\t\t\t\t\tfill=\"#f43f5e\"\n\t\t\t\t\t\tfillOpacity={headOpacity}\n\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\t<svg\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tzIndex: 11,\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\ttouchAction: \"none\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t}}\n\t\t\trole=\"presentation\"\n\t\t\taria-hidden\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t<g transform={rootTransform}>\n\t\t\t\t{marqueeCandidates}\n\t\t\t\t{preview}\n\t\t\t\t{laserTrailOverlay}\n\t\t\t\t{eraserTrailOverlay}\n\t\t\t\t{eraserPreview}\n\t\t\t\t{selection}\n\t\t\t</g>\n\t\t</svg>\n\t);\n}\n","/**\n * Freehand stroke helpers: dedupe noisy samples and build smooth SVG path `d` values\n * (quadratic Béziers) so strokes don't look jagged / \"pixelated\" from many short L segments.\n */\n\n/** Drop intermediate samples closer than `minDist` (local/world units) to reduce jitter. */\nexport function dedupeFreehandPoints<T extends { x: number; y: number }>(\n\tpoints: readonly T[],\n\tminDist: number,\n): T[] {\n\tif (points.length <= 2) {\n\t\treturn points.map((p) => ({ ...p }));\n\t}\n\tconst minSq = minDist * minDist;\n\tconst first = points[0];\n\tif (!first) return [];\n\tconst out: T[] = [{ ...first }];\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst p = points[i];\n\t\tconst last = out[out.length - 1];\n\t\tif (!p || !last) continue;\n\t\tconst dx = p.x - last.x;\n\t\tconst dy = p.y - last.y;\n\t\tif (dx * dx + dy * dy >= minSq) {\n\t\t\tout.push({ ...p });\n\t\t}\n\t}\n\tconst end = points[points.length - 1];\n\tconst lastKept = out[out.length - 1];\n\tif (!end || !lastKept) return out;\n\tif ((end.x - lastKept.x) ** 2 + (end.y - lastKept.y) ** 2 > 1e-12) {\n\t\tout.push({ ...end });\n\t}\n\treturn out;\n}\n\n/**\n * Smooth polyline → SVG path `d` using quadratic curves (canvas quadraticCurveTo midpoint pattern).\n * Avoids faceted \"broken\" lines from chaining many `L` commands.\n */\nexport function smoothFreehandPointsToPathD(\n\tpoints: readonly { x: number; y: number }[],\n): string {\n\tconst n = points.length;\n\tif (n === 0) return \"\";\n\tif (n === 1) {\n\t\tconst p = points[0];\n\t\tif (!p) return \"\";\n\t\treturn `M ${p.x} ${p.y}`;\n\t}\n\tif (n === 2) {\n\t\tconst a = points[0];\n\t\tconst b = points[1];\n\t\tif (!a || !b) return \"\";\n\t\treturn `M ${a.x} ${a.y} L ${b.x} ${b.y}`;\n\t}\n\tconst p0 = points[0];\n\tif (!p0) return \"\";\n\tlet d = `M ${p0.x} ${p0.y}`;\n\tlet i = 1;\n\tfor (; i < n - 2; i++) {\n\t\tconst pi = points[i];\n\t\tconst pi1 = points[i + 1];\n\t\tif (!pi || !pi1) continue;\n\t\tconst xc = (pi.x + pi1.x) / 2;\n\t\tconst yc = (pi.y + pi1.y) / 2;\n\t\td += ` Q ${pi.x} ${pi.y} ${xc} ${yc}`;\n\t}\n\tconst pLast = points[i];\n\tconst pEnd = points[i + 1];\n\tif (!pLast || !pEnd) return d;\n\td += ` Q ${pLast.x} ${pLast.y} ${pEnd.x} ${pEnd.y}`;\n\treturn d;\n}\n\n/**\n * Closed path from `perfect-freehand` outline → SVG `d` for fill.\n *\n * Uses the algorithm from the perfect-freehand README (`getSvgPathFromStroke`):\n * each outline point is a quadratic control point and the midpoint between\n * consecutive outline points is the curve endpoint. This produces\n * C1-continuous curves without the kinks that chained `T` or short `L` segments cause.\n */\nexport function outlineStrokeToClosedPathD(\n\toutline: readonly [number, number][],\n): string {\n\tconst len = outline.length;\n\tif (len === 0) return \"\";\n\tconst first = outline[0];\n\tif (!first) return \"\";\n\tif (len < 3) {\n\t\tlet d = `M ${first[0]} ${first[1]}`;\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tconst pt = outline[i];\n\t\t\tif (!pt) continue;\n\t\t\td += ` L ${pt[0]} ${pt[1]}`;\n\t\t}\n\t\treturn `${d} Z`;\n\t}\n\n\tlet d = `M ${first[0]} ${first[1]} Q`;\n\tfor (let i = 0; i < len; i++) {\n\t\tconst p0 = outline[i];\n\t\tconst p1 = outline[(i + 1) % len];\n\t\tif (!p0 || !p1) continue;\n\t\td += ` ${p0[0]} ${p0[1]} ${(p0[0] + p1[0]) / 2} ${(p0[1] + p1[1]) / 2}`;\n\t}\n\treturn `${d} Z`;\n}\n","\"use client\";\n\nimport { MousePointer2 } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { Camera2D } from \"../../camera/camera\";\nimport { formatCameraTransform } from \"../../renderer/svg-vector-renderer\";\nimport { smoothFreehandPointsToPathD } from \"../../scene/freehand-path\";\nimport {\n\tcomputeFreehandSvgPayload,\n\ttype StrokeStyle,\n} from \"../../scene/shape-builders\";\nimport { defaultPresenceColorForId } from \"./peer-color\";\nimport type { RemotePresenceMarkupStroke, RemotePresencePeer } from \"./types\";\n\nfunction strokePaint(\n\ttool: RemotePresenceMarkupStroke[\"tool\"],\n\tfallback: string,\n): { stroke: string; strokeOpacity: number; widthWorld: number } {\n\tswitch (tool) {\n\t\tcase \"laser\":\n\t\t\treturn { stroke: \"#f43f5e\", strokeOpacity: 0.92, widthWorld: 4 };\n\t\tcase \"marker\":\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.45, widthWorld: 14 };\n\t\tcase \"brush\":\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.85, widthWorld: 5 };\n\t\tcase \"pencil\":\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.9, widthWorld: 2.5 };\n\t\tdefault:\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.95, widthWorld: 3.5 };\n\t}\n}\n\nfunction isFreehandTool(\n\ttool: RemotePresenceMarkupStroke[\"tool\"],\n): tool is \"draw\" | \"marker\" | \"pencil\" | \"brush\" {\n\treturn (\n\t\ttool === \"draw\" || tool === \"marker\" || tool === \"pencil\" || tool === \"brush\"\n\t);\n}\n\nexport type PresenceRemoteLayerProps = {\n\tcamera: Camera2D;\n\t/** Bump when camera changes (same as {@link InteractionOverlay}). */\n\tcameraVersion: number;\n\tpeers: readonly RemotePresencePeer[];\n};\n\n/**\n * World-space SVG overlay: remote cursors + in-progress markup strokes.\n * Usually passed via {@link VectorViewport} `remotePresence` or `presenceOverlay`.\n */\nexport function PresenceRemoteLayer({\n\tcamera,\n\tcameraVersion: _cameraVersion,\n\tpeers,\n}: PresenceRemoteLayerProps) {\n\tvoid _cameraVersion;\n\tconst z = camera.zoom;\n\tconst rootTransform = formatCameraTransform(camera);\n\tconst overlayStrokePx = 1.25;\n\t/** Lucide `MousePointer2` viewBox; tip ≈ this point in icon space (see lucide `mouse-pointer-2`). */\n\tconst LUCIDE_POINTER_VIEWBOX = 24;\n\tconst LUCIDE_POINTER_TIP_X = 4.037;\n\tconst LUCIDE_POINTER_TIP_Y = 4.688;\n\t/** Target on-screen size (~px); scale in world space so it stays constant when zooming. */\n\tconst remoteCursorScreenPx = 22;\n\tconst iconWorldScale = remoteCursorScreenPx / (LUCIDE_POINTER_VIEWBOX * z);\n\n\treturn (\n\t\t<svg\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tzIndex: 9,\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\ttouchAction: \"none\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t}}\n\t\t\trole=\"presentation\"\n\t\t\taria-hidden\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t<g transform={rootTransform}>\n\t\t\t\t{peers.map((peer) => {\n\t\t\t\t\tconst color = peer.color ?? defaultPresenceColorForId(peer.id);\n\t\t\t\t\tconst markup = peer.markupStroke;\n\t\t\t\t\tlet strokeNode: ReactNode = null;\n\t\t\t\t\tif (markup && markup.points.length > 0) {\n\t\t\t\t\t\tconst fallbackPaint = strokePaint(markup.tool, color);\n\t\t\t\t\t\tconst paint = {\n\t\t\t\t\t\t\tstroke: markup.stroke ?? fallbackPaint.stroke,\n\t\t\t\t\t\t\tstrokeOpacity: markup.strokeOpacity ?? fallbackPaint.strokeOpacity,\n\t\t\t\t\t\t\twidthWorld: markup.strokeWidth ?? fallbackPaint.widthWorld,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (markup.tool === \"laser\") {\n\t\t\t\t\t\t\tconst d =\n\t\t\t\t\t\t\t\tmarkup.points.length >= 2\n\t\t\t\t\t\t\t\t\t? smoothFreehandPointsToPathD([...markup.points])\n\t\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t\tif (d) {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke={paint.stroke}\n\t\t\t\t\t\t\t\t\t\tstrokeOpacity={paint.strokeOpacity}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={Math.max(paint.widthWorld / z, overlayStrokePx)}\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (isFreehandTool(markup.tool)) {\n\t\t\t\t\t\t\tconst style: StrokeStyle = {\n\t\t\t\t\t\t\t\tstroke: paint.stroke,\n\t\t\t\t\t\t\t\tstrokeWidth: paint.widthWorld,\n\t\t\t\t\t\t\t\t...(paint.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t? { strokeOpacity: paint.strokeOpacity }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst payload = computeFreehandSvgPayload(\n\t\t\t\t\t\t\t\tmarkup.points.map((p) => ({ x: p.x, y: p.y })),\n\t\t\t\t\t\t\t\tstyle,\n\t\t\t\t\t\t\t\tmarkup.tool,\n\t\t\t\t\t\t\t\tmarkup.points.length === 2,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (payload?.kind === \"circle\") {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\t\tcx={payload.cx}\n\t\t\t\t\t\t\t\t\t\tcy={payload.cy}\n\t\t\t\t\t\t\t\t\t\tr={payload.r}\n\t\t\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\t\t\t{...(payload.fillOpacity != null\n\t\t\t\t\t\t\t\t\t\t\t? { fillOpacity: payload.fillOpacity }\n\t\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (payload?.kind === \"fillPath\") {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\t\t\tfillRule=\"nonzero\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\t\t\t\t\t{...(payload.fillOpacity != null\n\t\t\t\t\t\t\t\t\t\t\t? { fillOpacity: payload.fillOpacity }\n\t\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (payload?.kind === \"strokePath\") {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke={payload.stroke}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={payload.strokeWidth}\n\t\t\t\t\t\t\t\t\t\t{...(payload.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t\t\t? { strokeOpacity: payload.strokeOpacity }\n\t\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cur = peer.cursor;\n\t\t\t\t\tlet cursorNode: ReactNode = null;\n\t\t\t\t\tif (cur) {\n\t\t\t\t\t\tconst displayName = peer.displayName;\n\t\t\t\t\t\tconst labelOffsetX = 14 / z;\n\t\t\t\t\t\tconst labelOffsetY = 14 / z;\n\t\t\t\t\t\tconst labelFont = 12 / z;\n\t\t\t\t\t\tcursorNode = (\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<g\n\t\t\t\t\t\t\t\t\ttransform={`translate(${cur.x}, ${cur.y}) scale(${iconWorldScale}) translate(${-LUCIDE_POINTER_TIP_X}, ${-LUCIDE_POINTER_TIP_Y})`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<MousePointer2\n\t\t\t\t\t\t\t\t\t\tsize={LUCIDE_POINTER_VIEWBOX}\n\t\t\t\t\t\t\t\t\t\tcolor={color}\n\t\t\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t{displayName ? (\n\t\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t\tx={cur.x + labelOffsetX}\n\t\t\t\t\t\t\t\t\t\ty={cur.y + labelOffsetY}\n\t\t\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tfontSize: labelFont,\n\t\t\t\t\t\t\t\t\t\t\tfontFamily: \"system-ui, sans-serif\",\n\t\t\t\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g key={peer.id}>\n\t\t\t\t\t\t\t{strokeNode}\n\t\t\t\t\t\t\t{cursorNode}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</g>\n\t\t</svg>\n\t);\n}\n","/**\n * Deterministic accent from a peer id when `color` is not provided.\n */\nexport function defaultPresenceColorForId(id: string): string {\n\tlet h = 2166136261;\n\tfor (let i = 0; i < id.length; i++) {\n\t\th ^= id.charCodeAt(i);\n\t\th = Math.imul(h, 16777619);\n\t}\n\tconst hue = (h >>> 0) % 360;\n\treturn `hsl(${hue} 72% 42%)`;\n}\n","/**\n * Helpers to avoid React update loops when selection is controlled (`selectedIds` + `onSelectionChange`).\n *\n * - Do not put `selectedIds.map(...)` or `[...selectedIds]` in `useEffect` deps every render — use\n * `useMemo` keyed on `selectedIds` (stable reference from parent state) or compare with\n * {@link shallowEqualStringArray}.\n * - When `useEffect` registers global listeners (document `pointermove`), do not list `setState`\n * callbacks in the dependency array if their identity can change with the parent — use a ref\n * (`setEffectiveSelectedIdsRef.current = fn`) and keep deps `[interactive]` + stable inputs only.\n */\n\n/**\n * `true` when both arrays have the same length and same strings in order (reference-safe).\n */\nexport function shallowEqualStringArray(\n\ta: readonly string[] | undefined,\n\tb: readonly string[] | undefined,\n): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return a === b;\n\tif (a.length !== b.length) return false;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\treturn true;\n}\n","\"use client\";\n\nimport { type KeyboardEvent, useLayoutEffect, useRef } from \"react\";\nimport type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tDEFAULT_TEXT_FONT_SIZE,\n\tEDIT_TOP_PAD_RATIO,\n\tTEXT_FONT_FAMILY,\n} from \"../scene/text-svg\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type TextEditOverlayProps = {\n\tcamera: Camera2D;\n\t/** Re-render when camera pans/zooms so the field stays aligned. */\n\tcameraVersion: number;\n\titem: VectorSceneItem;\n\tdraftText: string;\n\tonDraftChange: (value: string) => void;\n\tonCommit: () => void;\n\tonCancel: () => void;\n};\n\n/**\n * Screen-space textarea aligned to a text item’s world bounds (above hit layer).\n */\nexport function TextEditOverlay({\n\tcamera,\n\tcameraVersion: _cameraVersion,\n\titem,\n\tdraftText,\n\tonDraftChange,\n\tonCommit,\n\tonCancel,\n}: TextEditOverlayProps) {\n\tvoid _cameraVersion;\n\tconst taRef = useRef<HTMLTextAreaElement>(null);\n\tconst skipCommitRef = useRef(false);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: re-focus when switching to another text item\n\tuseLayoutEffect(() => {\n\t\tconst el = taRef.current;\n\t\tif (!el) return;\n\t\tel.focus();\n\t\tel.select();\n\t}, [item.id]);\n\n\tconst handleBlur = () => {\n\t\tif (skipCommitRef.current) {\n\t\t\tskipCommitRef.current = false;\n\t\t\treturn;\n\t\t}\n\t\tonCommit();\n\t};\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\te.preventDefault();\n\t\t\tskipCommitRef.current = true;\n\t\t\tonCancel();\n\t\t}\n\t};\n\n\tconst b = normalizeRect(item.bounds);\n\tconst z = camera.zoom;\n\tconst w = b.width * z;\n\tconst h = b.height * z;\n\tconst rot = item.rotation ?? 0;\n\tconst cx = b.x + b.width / 2;\n\tconst cy = b.y + b.height / 2;\n\tconst cScreen = camera.worldToScreen(cx, cy);\n\tconst fsWorld = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tconst fontSize = fsWorld * z;\n\tconst lineHeight = fsWorld * (22 / 18) * z;\n\tconst fixedBox = !!item.textFixedBounds;\n\t/**\n\t * Pad the textarea so its first-line baseline matches the SVG `<text y>` baseline\n\t * (see {@link FIRST_LINE_BASELINE_RATIO} in `text-svg.ts`). Horizontal padding\n\t * (4px local) matches the `<text x=\"4\">` offset in {@link buildTextSvg}.\n\t */\n\tconst padTop = EDIT_TOP_PAD_RATIO * fsWorld * z;\n\tconst padX = 4 * z;\n\tconst textColor = item.stroke ?? \"#1d1d1d\";\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"text-edit-overlay\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: cScreen.screenX - w / 2,\n\t\t\t\ttop: cScreen.screenY - h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h,\n\t\t\t\tzIndex: 20,\n\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\toverflow: \"visible\",\n\t\t\t\ttransform:\n\t\t\t\t\tMath.abs(rot) < 1e-12 ? undefined : `rotate(${(rot * 180) / Math.PI}deg)`,\n\t\t\t\ttransformOrigin: \"center center\",\n\t\t\t}}\n\t\t>\n\t\t\t<textarea\n\t\t\t\tref={taRef}\n\t\t\t\tvalue={draftText}\n\t\t\t\tonChange={(e) => onDraftChange(e.target.value)}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\taria-label=\"Edit text\"\n\t\t\t\tstyle={{\n\t\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\theight: \"100%\",\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: `${padTop}px ${padX}px 0px ${padX}px`,\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tborderRadius: 0,\n\t\t\t\t\tresize: \"none\",\n\t\t\t\t\tfontFamily: TEXT_FONT_FAMILY,\n\t\t\t\t\tfontSize,\n\t\t\t\t\tlineHeight: `${lineHeight}px`,\n\t\t\t\t\tcolor: textColor,\n\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\tbackgroundColor: \"transparent\",\n\t\t\t\t\toutline: \"none\",\n\t\t\t\t\tboxShadow: \"none\",\n\t\t\t\t\tappearance: \"none\",\n\t\t\t\t\tWebkitAppearance: \"none\",\n\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t\twhiteSpace: fixedBox ? \"pre-wrap\" : \"pre\",\n\t\t\t\t\toverflow: fixedBox ? \"auto\" : \"hidden\",\n\t\t\t\t\toverflowX: fixedBox ? \"hidden\" : \"hidden\",\n\t\t\t\t\twordWrap: fixedBox ? \"break-word\" : \"normal\",\n\t\t\t\t\twordBreak: fixedBox ? \"break-word\" : \"normal\",\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport type { Camera2D } from \"../camera/camera\";\nimport type { ResizeHandleId } from \"../interaction/resize-handles\";\nimport { rectFromCorners } from \"../interaction/resize-handles\";\nimport { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect, rectsIntersect } from \"../math/rect\";\nimport type { VectorPathPoint, VectorSceneItem } from \"../scene/types\";\n\nexport function usePrefersReducedMotion(): boolean {\n\tconst [reduced, setReduced] = useState(false);\n\tuseEffect(() => {\n\t\tconst mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tsetReduced(mq.matches);\n\t\tconst listener = () => setReduced(mq.matches);\n\t\tmq.addEventListener(\"change\", listener);\n\t\treturn () => mq.removeEventListener(\"change\", listener);\n\t}, []);\n\treturn reduced;\n}\n\nexport const visuallyHidden: CSSProperties = {\n\tposition: \"absolute\",\n\twidth: 1,\n\theight: 1,\n\tpadding: 0,\n\tmargin: -1,\n\toverflow: \"hidden\",\n\tclip: \"rect(0, 0, 0, 0)\",\n\twhiteSpace: \"nowrap\",\n\tborder: 0,\n};\n\n/** Zoom in step factor. */\nexport const VIEWPORT_ZOOM_IN_STEP = 1.15;\n/** Zoom out step factor (reciprocal of zoom in to ensure equal sensitivity). */\nexport const VIEWPORT_ZOOM_OUT_STEP = 1 / 1.15;\n\nexport function replaceItem(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n\tnext: VectorSceneItem,\n): VectorSceneItem[] {\n\treturn items.map((it) => (it.id === id ? next : it));\n}\n\nexport function supportsResizeHandles(\n\titem: VectorSceneItem | null | undefined,\n): item is VectorSceneItem & {\n\ttoolKind:\n\t\t| \"rect\"\n\t\t| \"ellipse\"\n\t\t| \"architectural-cloud\"\n\t\t| \"line\"\n\t\t| \"arrow\"\n\t\t| \"image\"\n\t\t| \"text\"\n\t\t| \"custom\"\n\t\t| \"draw\"\n\t\t| \"pencil\"\n\t\t| \"brush\"\n\t\t| \"marker\";\n} {\n\tconst k = item?.toolKind;\n\tif (\n\t\tk === \"rect\" ||\n\t\tk === \"ellipse\" ||\n\t\tk === \"architectural-cloud\" ||\n\t\tk === \"line\" ||\n\t\tk === \"arrow\" ||\n\t\tk === \"image\" ||\n\t\tk === \"text\"\n\t) {\n\t\treturn true;\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 true;\n\t}\n\treturn k === \"custom\" && !!item?.customIntrinsicSize && !!item?.customInnerSvg;\n}\n\nexport type DragState =\n\t| { kind: \"idle\" }\n\t| {\n\t\t\tkind: \"move\";\n\t\t\tids: string[];\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tsnapshots: Record<string, VectorSceneItem>;\n\t }\n\t| {\n\t\t\tkind: \"resize\";\n\t\t\tid: string;\n\t\t\thandle: ResizeHandleId;\n\t\t\tsnapshot: VectorSceneItem;\n\t\t\tstart: {\n\t\t\t\tbounds: Rect;\n\t\t\t\tline?: import(\"../scene/types\").LineEndpointsLocal;\n\t\t\t};\n\t }\n\t| {\n\t\t\tkind: \"rotate\";\n\t\t\tid: string;\n\t\t\tsnapshot: VectorSceneItem;\n\t\t\tpivotWorld: { x: number; y: number };\n\t\t\tstartPointerAngleRad: number;\n\t\t\tstartRotation: number;\n\t }\n\t| {\n\t\t\tkind: \"place\";\n\t\t\ttool: string;\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tstartScreen: { x: number; y: number };\n\t }\n\t| {\n\t\t\tkind: \"tap\";\n\t\t\ttool: \"text\" | \"image\";\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tstartScreen: { x: number; y: number };\n\t }\n\t| {\n\t\t\tkind: \"stroke\";\n\t\t\ttool: \"draw\" | \"marker\" | \"laser\";\n\t\t\tpoints: VectorPathPoint[];\n\t\t\tpointerType: string;\n\t\t\titemId?: string;\n\t\t\tstraightLine?: {\n\t\t\t\tactive: boolean;\n\t\t\t\tanchorPoint: VectorPathPoint;\n\t\t\t\tholdScreen: { x: number; y: number };\n\t\t\t\tholdTimer: number | null;\n\t\t\t};\n\t }\n\t| { kind: \"erase\" }\n\t| {\n\t\t\tkind: \"marquee\";\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tstartScreen: { x: number; y: number };\n\t\t\tshiftKey: boolean;\n\t\t\tselectionBefore: string[];\n\t };\n\nexport const MIN_PLACE_SIZE = 8;\n/** Screen px — arrow is created only by drag; a click or micro-move cancels (tldraw-style). */\nexport const MIN_ARROW_DRAG_PX = 8;\n/** World units — ignore accidental micro-drags when rubber-band selecting. */\nexport const MIN_MARQUEE_WORLD = 4;\n/** Screen px — small jitter on trackpads cancels the tap if too low. */\nexport const TAP_PX = 20;\n\nexport function collectItemIdsInRect(\n\titems: readonly VectorSceneItem[],\n\tmarqueeWorld: Rect,\n): string[] {\n\tconst m = normalizeRect(marqueeWorld);\n\tconst out: string[] = [];\n\tfor (const it of items) {\n\t\tif (it.locked) continue;\n\t\tif (rectsIntersect(normalizeRect(boundsAabbForRotatedItem(it)), m)) {\n\t\t\tout.push(it.id);\n\t\t}\n\t}\n\treturn out;\n}\n\n/** Fits {@link Camera2D} so `worldRect` is visible in a viewport of `viewportW` × `viewportH` CSS px. */\nexport function fitCameraToWorldRect(\n\tcamera: Camera2D,\n\tviewportW: number,\n\tviewportH: number,\n\tworldRect: Rect,\n\tpadding: number,\n): void {\n\tconst r = normalizeRect(worldRect);\n\tif (r.width <= 0 || r.height <= 0 || viewportW <= 0 || viewportH <= 0) {\n\t\treturn;\n\t}\n\tconst pad = Math.max(0, padding);\n\tconst neededW = r.width * (1 + 2 * pad);\n\tconst neededH = r.height * (1 + 2 * pad);\n\tconst zoomX = viewportW / neededW;\n\tconst zoomY = viewportH / neededH;\n\tlet z = Math.min(zoomX, zoomY);\n\tz = Math.min(camera.maxZoom, Math.max(camera.minZoom, z));\n\tconst cx = r.x + r.width / 2;\n\tconst cy = r.y + r.height / 2;\n\tcamera.zoom = z;\n\tcamera.x = viewportW / 2 - cx * z;\n\tcamera.y = viewportH / 2 - cy * z;\n}\n\nexport function tryPointerCaptureOnTarget(\n\ttarget: EventTarget | null,\n\tpointerId: number,\n): void {\n\tif (!target || !(target instanceof HTMLElement)) return;\n\ttry {\n\t\ttarget.setPointerCapture(pointerId);\n\t} catch {\n\t\t/* ignore */\n\t}\n}\n\nexport { cursorForVectorToolId } from \"./vector-tool-cursors\";\n\n/** When the user clicks (or barely drags), use centered default sizes instead of rejecting. */\nexport function defaultPlacementWorld(\n\ttool: string,\n\tcenter: { x: number; y: number },\n): {\n\traw: Rect;\n\tlineWorld?: [{ x: number; y: number }, { x: number; y: number }];\n} {\n\tconst cx = center.x;\n\tconst cy = center.y;\n\tif (tool === \"rect\") {\n\t\treturn { raw: { x: cx - 60, y: cy - 40, width: 120, height: 80 } };\n\t}\n\tif (tool === \"ellipse\") {\n\t\treturn { raw: { x: cx - 70, y: cy - 45, width: 140, height: 90 } };\n\t}\n\tif (tool === \"architectural-cloud\") {\n\t\treturn { raw: { x: cx - 90, y: cy - 50, width: 180, height: 100 } };\n\t}\n\tconst a = { x: cx - 50, y: cy };\n\tconst b = { x: cx + 50, y: cy };\n\treturn {\n\t\traw: rectFromCorners(a, b),\n\t\tlineWorld: [a, b],\n\t};\n}\n","\"use client\";\n\n/**\n * SVG paths for drawing tools match Lucide icons in {@link DEFAULT_VECTOR_TOOLS} (lucide-react v1.x).\n */\nconst NS = 'xmlns=\"http://www.w3.org/2000/svg\"';\nconst STROKE = \"#18181b\";\n\nfunction wrapSvg(inner: string): string {\n\treturn `<svg ${NS} width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${STROKE}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${inner}</svg>`;\n}\n\nfunction svgUrlCursor(\n\tinner: string,\n\thx: number,\n\thy: number,\n\tfallback: string,\n): string {\n\treturn `url(\"data:image/svg+xml,${encodeURIComponent(wrapSvg(inner))}\") ${hx} ${hy}, ${fallback}`;\n}\n\n/** Lucide `pen-line` */\nconst DRAW_INNER = `<path d=\"M13 21h8\"/><path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\"/>`;\n/** Lucide `highlighter` */\nconst MARKER_INNER = `<path d=\"m9 11-6 6v3h9l3-3\"/><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\"/>`;\n/** Lucide `eraser` */\nconst ERASER_INNER = `<path d=\"M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21\"/><path d=\"m5.082 11.09 8.828 8.828\"/>`;\n/**\n * CSS `cursor` for the active toolbar tool id (see default vector tools).\n * SVG cursors matching Lucide toolbar glyphs are used for freehand tools only.\n * Shape tools keep the old native crosshair cursor.\n */\nexport function cursorForVectorToolId(toolId: string): string {\n\tconst fb = \"crosshair\";\n\tswitch (toolId) {\n\t\tcase \"hand\":\n\t\t\treturn \"grab\";\n\t\tcase \"select\":\n\t\t\treturn \"default\";\n\t\tcase \"rect\":\n\t\tcase \"ellipse\":\n\t\tcase \"architectural-cloud\":\n\t\tcase \"line\":\n\t\tcase \"arrow\":\n\t\t\treturn \"crosshair\";\n\t\tcase \"draw\":\n\t\t\treturn svgUrlCursor(DRAW_INNER, 4, 18, fb);\n\t\tcase \"marker\":\n\t\t\treturn svgUrlCursor(MARKER_INNER, 11, 14, fb);\n\t\tcase \"laser\":\n\t\t\treturn \"crosshair\";\n\t\tcase \"eraser\":\n\t\t\treturn svgUrlCursor(ERASER_INNER, 12, 14, fb);\n\t\tcase \"text\":\n\t\t\treturn \"text\";\n\t\tcase \"image\":\n\t\t\treturn \"crosshair\";\n\t\tdefault:\n\t\t\treturn \"default\";\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/math/rect.ts","../src/scene/custom-shape.ts","../src/scene/text-svg.ts","../src/scene/shape-builders.ts","../src/image/canvas-encode.ts","../src/image/indexed-db-image-store.ts","../src/image/pdf-loader.ts","../src/react/asset-hydration.ts","../src/react/asset-ingestion.ts","../src/react/asset-store.ts","../src/react/chrome-context.ts","../src/math/item-transform.ts","../src/scene/clone-item.ts","../src/scene/managed-images.ts","../src/react/ImagesMenu.tsx","../src/react/board-position.ts","../src/react/navmenu/minimap.tsx","../src/react/navmenu/shared.ts","../src/react/navmenu/undo-redo.tsx","../src/react/navmenu/zoom-controls.tsx","../src/react/navmenu/index.tsx","../src/react/persistence/indexed-db-adapter.ts","../src/react/persistence/local-storage-adapter.ts","../src/react/persistence/use-vector-canvas-document.ts","../src/react/plugins/types.ts","../src/react/plugins/tool-plugin.tsx","../src/react/ShapeContextMenu.tsx","../src/react/tools/icons.tsx","../src/react/tools/default-tools.tsx","../src/react/VectorSelectionInspector.tsx","../src/react/VectorCanvasLayout.tsx","../src/react/VectorToolbar.tsx","../src/camera/camera.ts","../src/input/pan-momentum.ts","../src/input/apple-pencil-navigation.ts","../src/input/attach-viewport-input.ts","../src/interaction/arrow-bindings.ts","../src/interaction/resize-handles.ts","../src/interaction/hit-test.ts","../src/interaction/mutations.ts","../src/react/VectorViewport.tsx","../src/renderer/svg-vector-renderer.ts","../src/scene/cull.ts","../src/scene/spatial-cull.ts","../src/scene/link-item.ts","../src/scene/scene.ts","../src/react/blob-url-lifecycle.ts","../src/react/InteractionOverlay.tsx","../src/scene/freehand-path.ts","../src/react/presence/PresenceRemoteLayer.tsx","../src/react/presence/peer-color.ts","../src/react/stable-selection.ts","../src/react/TextEditOverlay.tsx","../src/react/vector-viewport-support.ts","../src/react/vector-tool-cursors.ts"],"names":["base","d","getStroke","op","b","s","uploadResult","fullUrl","naturalTopY","stackedTopY","bounds","itemContext","item","createContext","useContext","useMemo","useSensors","useSensor","PointerSensor","useState","useEffect","jsx","Images","arrayMove","jsxs","ChevronRight","DndContext","SortableContext","verticalListSortingStrategy","useSortable","CSS","GripVertical","Copy","RotateCw","Trash2","useRef","useCallback","Fragment","createPortal","Undo2","Redo2","useLayoutEffect","Hand","MousePointer2","Square","Circle","Minus","ArrowUpRight","PenLine","Highlighter","Eraser","Type","Image","headerStyle","preventMouseDefault","Lock","LockOpen","useId","Children","isValidElement","Shapes","ChevronDown","noop","g","forwardRef","VectorViewport","items","buildRasterImageChildrenSvg","useImperativeHandle","worldX","worldY","id","pen","rootStyle"],"mappings":"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","file":"react.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\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Width/height of the shape’s local drawing box (same as `bounds` at creation). */\nexport type CustomShapeSize = { width: number; height: number };\n\n/**\n * How to build the inner SVG (inside the item’s bounding box).\n *\n * - **`svg`**: paste-friendly markup. Use `{{w}}`, `{{h}}`, `{{width}}`, or `{{height}}` where the size should go.\n * - **`render`**: a small function when you prefer code over a string template.\n */\nexport type CreateCustomShapeContent =\n\t| {\n\t\t\t/**\n\t\t\t * SVG fragment for `<g>` contents (no outer `<svg>`). Placeholders are replaced with numeric sizes:\n\t\t\t * `{{w}}`, `{{h}}`, `{{width}}`, `{{height}}`.\n\t\t\t */\n\t\t\tsvg: string;\n\t }\n\t| {\n\t\t\t/** Returns inner SVG for the given box size (same coordinate range as `bounds`). */\n\t\t\trender: (size: CustomShapeSize) => string;\n\t };\n\n/**\n * Replaces `{{w}}`, `{{h}}`, `{{width}}`, and `{{height}}` in a string with the given dimensions.\n * Use this if you build SVG strings yourself and want the same rules as {@link createCustomShapeItem}.\n */\nexport function expandCustomShapeTemplate(\n\ttemplate: string,\n\twidth: number,\n\theight: number,\n): string {\n\treturn template\n\t\t.replace(/\\{\\{w\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{h\\}\\}/g, String(height))\n\t\t.replace(/\\{\\{width\\}\\}/g, String(width))\n\t\t.replace(/\\{\\{height\\}\\}/g, String(height));\n}\n\nfunction resolveCustomInner(\n\tcontent: CreateCustomShapeContent,\n\tsize: CustomShapeSize,\n): string {\n\tif (\"render\" in content) {\n\t\treturn content.render(size);\n\t}\n\treturn expandCustomShapeTemplate(content.svg, size.width, size.height);\n}\n\n/**\n * Builds the scaled `<g>` wrapper used for `childrenSvg` on custom shapes that support resize.\n */\nexport function buildCustomShapeChildrenSvg(\n\tinner: string,\n\tintrinsic: CustomShapeSize,\n\tbounds: Rect,\n): string {\n\tconst b = normalizeRect(bounds);\n\tconst sx = b.width / intrinsic.width;\n\tconst sy = b.height / intrinsic.height;\n\treturn `<g transform=\"scale(${sx},${sy})\">${inner}</g>`;\n}\n\n/**\n * Creates a user-defined shape from SVG markup or a `render` callback.\n *\n * Coordinates are **local**: draw from `(0,0)` to `(width, height)` of `bounds`. The library stores an\n * intrinsic copy so resize handles (when interactive) scale the drawing uniformly.\n *\n * @example\n * ```ts\n * const star = createCustomShapeItem(createShapeId(), rect, {\n * svg: `<polygon points=\"...\" fill=\"gold\" stroke=\"#b45309\" stroke-width=\"2\" />`,\n * });\n * ```\n *\n * @example Template (good for copy-paste from design tools)\n * ```ts\n * createCustomShapeItem(id, rect, {\n * svg: `<rect width=\"{{w}}\" height=\"{{h}}\" rx=\"8\" fill=\"#e0e7ff\" stroke=\"#6366f1\" />`,\n * });\n * ```\n */\nexport function createCustomShapeItem(\n\tid: string,\n\tbounds: Rect,\n\tcontent: CreateCustomShapeContent,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst intrinsic: CustomShapeSize = { width: r.width, height: r.height };\n\tconst inner = resolveCustomInner(content, intrinsic);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"custom\",\n\t\tcustomIntrinsicSize: intrinsic,\n\t\tcustomInnerSvg: inner,\n\t\tchildrenSvg: buildCustomShapeChildrenSvg(inner, intrinsic, r),\n\t};\n}\n","/**\n * Escape text for use inside SVG `<text>` / `<tspan>` (not full XML attribute context).\n */\nexport function escapeSvgTextContent(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Escape for plain text inside HTML `foreignObject` body (not attribute). */\nfunction escapeHtmlText(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/** Default body font size for vector text (local SVG units). */\nexport const DEFAULT_TEXT_FONT_SIZE = 18;\n/** Default font size used when the text tool creates a new text item. */\nexport const DEFAULT_TEXT_TOOL_FONT_SIZE = 28;\n/**\n * Sophisticated sans-serif used for both canvas text rendering and inline editing.\n * Inter is loaded by host apps (e.g. demo/index.html); system-ui fallback keeps the canvas\n * usable when the webfont hasn't loaded yet.\n */\nexport const TEXT_FONT_FAMILY =\n\t\"Inter, -apple-system, BlinkMacSystemFont, ui-sans-serif, system-ui, sans-serif\";\nconst LINE_HEIGHT_RATIO = 22 / 18;\n/**\n * Where the first text baseline sits, expressed in font-size units. Picked so\n * the SVG glyph and the inline-edit textarea agree visually (the textarea's\n * natural first-line baseline lands at this same y when padded by\n * {@link EDIT_TOP_PAD_RATIO}). See {@link TextEditOverlay} for the matching\n * inset.\n */\nconst FIRST_LINE_BASELINE_RATIO = 20 / 18;\n/** Textarea top inset (font-size units) that lines up with the SVG baseline. */\nexport const EDIT_TOP_PAD_RATIO = 4 / 18;\n/** Extra space below the descender so glyphs aren't clipped at the bounds. */\nconst BOTTOM_PAD_RATIO = 4 / 18;\nconst PLACEHOLDER = \"Tap to type\";\n\nconst MIN_TEXT_BOX_W = 40;\nconst MIN_TEXT_BOX_H = 26;\n/** Horizontal padding in local space (matches `<text x=\"4\">`). */\nconst TEXT_PAD_X = 4;\nconst MAX_TEXT_MEASURE_CACHE_ENTRIES = 2000;\n\nlet sharedMeasureContext: CanvasRenderingContext2D | null | undefined;\nconst textMeasureCache = new Map<string, { width: number; height: number }>();\n\nfunction getSharedMeasureContext(): CanvasRenderingContext2D | null {\n\tif (sharedMeasureContext !== undefined) {\n\t\treturn sharedMeasureContext;\n\t}\n\tif (typeof document === \"undefined\") {\n\t\tsharedMeasureContext = null;\n\t\treturn sharedMeasureContext;\n\t}\n\tconst canvas = document.createElement(\"canvas\");\n\tsharedMeasureContext = canvas.getContext(\"2d\");\n\treturn sharedMeasureContext;\n}\n\nfunction textMeasureCacheKey(content: string, fontSize: number): string {\n\treturn `${fontSize}\\n${content}`;\n}\n\nfunction cacheMeasuredBounds(\n\tkey: string,\n\tbounds: { width: number; height: number },\n): void {\n\tif (textMeasureCache.size >= MAX_TEXT_MEASURE_CACHE_ENTRIES) {\n\t\ttextMeasureCache.clear();\n\t}\n\ttextMeasureCache.set(key, bounds);\n}\n\nfunction lineHeightFor(fontSize: number): number {\n\treturn fontSize * LINE_HEIGHT_RATIO;\n}\n\nfunction firstLineBaselineY(fontSize: number): number {\n\treturn fontSize * FIRST_LINE_BASELINE_RATIO;\n}\n\n/** Public version used by callers that need the same baseline as SVG rendering. */\nexport function textBaselineYFor(fontSize: number): number {\n\treturn firstLineBaselineY(fontSize);\n}\n\n/** Public version used by callers that need the same line height as SVG rendering. */\nexport function textLineHeightFor(fontSize: number): number {\n\treturn lineHeightFor(fontSize);\n}\n\n/**\n * Local width/height for a text item so bounds match rendered SVG (no fixed max width).\n * Uses canvas measureText when `document` is available; rough fallback otherwise.\n */\nexport function measureTextBoundsLocal(\n\tcontent: string,\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): {\n\twidth: number;\n\theight: number;\n} {\n\tconst cacheKey = textMeasureCacheKey(content, fontSize);\n\tconst cached = textMeasureCache.get(cacheKey);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst lh = lineHeightFor(fontSize);\n\tconst baselineY = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tconst lines = trimmed.length === 0 ? [PLACEHOLDER] : content.split(\"\\n\");\n\n\tlet maxInnerW = 0;\n\tconst ctx = getSharedMeasureContext();\n\tif (ctx) {\n\t\tctx.font = `${fontSize}px ${TEXT_FONT_FAMILY}`;\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, ctx.measureText(toMeasure).width);\n\t\t}\n\t}\n\tif (maxInnerW === 0) {\n\t\tfor (const line of lines) {\n\t\t\tconst toMeasure =\n\t\t\t\ttrimmed.length === 0 ? PLACEHOLDER : line.length === 0 ? \" \" : line;\n\t\t\tmaxInnerW = Math.max(maxInnerW, toMeasure.length * fontSize * 0.52);\n\t\t}\n\t}\n\n\tconst minW = Math.max(MIN_TEXT_BOX_W, TEXT_PAD_X * 2 + fontSize);\n\tconst width = Math.max(minW, TEXT_PAD_X * 2 + maxInnerW);\n\tconst height = Math.max(\n\t\tMIN_TEXT_BOX_H,\n\t\tbaselineY + (lines.length - 1) * lh + Math.max(4, fontSize * BOTTOM_PAD_RATIO),\n\t);\n\tconst measured = { width, height };\n\tcacheMeasuredBounds(cacheKey, measured);\n\treturn measured;\n}\n\n/**\n * Builds SVG `<text>` markup for a text box in local coordinates [0, w] × [0, h].\n * @param fillColor — Text fill (defaults to blue-gray placeholder / blue body).\n */\nexport function buildTextSvg(\n\tcontent: string,\n\t_width: number,\n\t_height: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst lh = lineHeightFor(fontSize);\n\tconst y0 = firstLineBaselineY(fontSize);\n\tconst trimmed = content.trim();\n\tif (trimmed.length === 0) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"#94a3b8\" font-style=\"italic\">${escapeSvgTextContent(PLACEHOLDER)}</text>`;\n\t}\n\n\tconst lines = content.split(\"\\n\");\n\tif (lines.length === 1) {\n\t\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${escapeSvgTextContent(lines[0] ?? \"\")}</text>`;\n\t}\n\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i] ?? \"\";\n\t\tif (i === 0) {\n\t\t\tparts.push(`<tspan x=\"4\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t} else {\n\t\t\tparts.push(`<tspan x=\"4\" dy=\"${lh}\">${escapeSvgTextContent(line)}</tspan>`);\n\t\t}\n\t}\n\treturn `<text x=\"4\" y=\"${y0}\" font-size=\"${fontSize}\" font-family=\"${TEXT_FONT_FAMILY}\" fill=\"${fillColor}\">${parts.join(\"\")}</text>`;\n}\n\n/**\n * Text that wraps inside a fixed rectangle (after user resize). Uses `foreignObject` + XHTML\n * so wrapping matches browser layout.\n */\nexport function buildTextFixedBoundsSvg(\n\tcontent: string,\n\twidth: number,\n\theight: number,\n\tfillColor = \"#1d1d1d\",\n\tfontSize: number = DEFAULT_TEXT_FONT_SIZE,\n): string {\n\tconst w = Math.max(1, width);\n\tconst h = Math.max(1, height);\n\tconst lh = lineHeightFor(fontSize);\n\tconst trimmed = content.trim();\n\tconst padTop = EDIT_TOP_PAD_RATIO * fontSize;\n\tif (trimmed.length === 0) {\n\t\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:#94a3b8;font-style:italic\">${escapeHtmlText(PLACEHOLDER)}</div></foreignObject>`;\n\t}\n\tconst body = escapeHtmlText(content);\n\treturn `<foreignObject width=\"${w}\" height=\"${h}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;padding:${padTop}px 4px 0 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:${TEXT_FONT_FAMILY};white-space:pre-wrap;word-wrap:break-word;overflow:hidden;color:${fillColor}\">${body}</div></foreignObject>`;\n}\n","import type { StrokeOptions } from \"perfect-freehand\";\nimport getStroke from \"perfect-freehand\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport { buildCustomShapeChildrenSvg } from \"./custom-shape\";\nimport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n} from \"./text-svg\";\nimport type {\n\tArrowBindings,\n\tLineEndpointsLocal,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"./types\";\n\nexport {\n\tbuildTextFixedBoundsSvg,\n\tbuildTextSvg,\n\tDEFAULT_TEXT_FONT_SIZE,\n\tmeasureTextBoundsLocal,\n};\n\n/**\n * While inline-editing: sync bounds to draft width/height and hide SVG so only the textarea shows text.\n */\nexport function applyTextDraftWhileEditing(\n\titem: VectorSceneItem,\n\tdraft: string,\n): VectorSceneItem {\n\tif (item.toolKind !== \"text\") return item;\n\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tif (item.textFixedBounds) {\n\t\treturn {\n\t\t\t...item,\n\t\t\ttext: draft,\n\t\t\tchildrenSvg: \"\",\n\t\t};\n\t}\n\tconst m = measureTextBoundsLocal(draft, fs);\n\treturn {\n\t\t...item,\n\t\ttext: draft,\n\t\tbounds: {\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t},\n\t\tchildrenSvg: \"\",\n\t};\n}\n\n/** Stroke dash pattern for freehand drawings. `solid` = perfect-freehand fill; `dashed` = centerline stroke with dashes. */\nexport type StrokeDash = \"solid\" | \"dashed\";\n\n/** Resolved stroke for SVG generation. */\nexport type StrokeStyle = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: StrokeDash;\n};\n\nexport const DEFAULT_STROKE_STYLE: StrokeStyle = {\n\tstroke: \"#1d1d1d\",\n\tstrokeWidth: 2,\n};\n\nconst TOOL_FREEHAND_DEFAULTS: Record<\n\t\"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tPartial<StrokeStyle>\n> = {\n\tdraw: { strokeWidth: 10 },\n\tpencil: { strokeWidth: 3 },\n\tbrush: { strokeWidth: 10 },\n\tmarker: { stroke: \"#fde047\", strokeWidth: 16, strokeOpacity: 0.5 },\n};\n\nfunction perfectFreehandOptions(\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstyle: StrokeStyle,\n\tstrokeComplete: boolean,\n\tpressureAware = false,\n): StrokeOptions {\n\tconst sw = style.strokeWidth;\n\tconst base: StrokeOptions = {\n\t\tlast: strokeComplete,\n\t\tsimulatePressure: true,\n\t};\n\tif (toolKind === \"draw\" || toolKind === \"pencil\") {\n\t\tif (pressureAware && toolKind === \"draw\") {\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tsize: Math.max(2, sw * 1.05),\n\t\t\t\tthinning: 0.42,\n\t\t\t\tsmoothing: 0.78,\n\t\t\t\tstreamline: 0.62,\n\t\t\t\tsimulatePressure: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(2, sw * 1.18),\n\t\t\tthinning: 0.12,\n\t\t\tsmoothing: 0.85,\n\t\t\tstreamline: 0.78,\n\t\t\tsimulatePressure: true,\n\t\t};\n\t}\n\tif (toolKind === \"brush\") {\n\t\treturn {\n\t\t\t...base,\n\t\t\tsize: Math.max(4, sw * 1.22),\n\t\t\tthinning: 0.52,\n\t\t\tsmoothing: 0.64,\n\t\t\tstreamline: 0.68,\n\t\t};\n\t}\n\treturn {\n\t\t...base,\n\t\tsize: Math.max(6, sw * 1.08),\n\t\tthinning: 0.08,\n\t\tsmoothing: 0.88,\n\t\tstreamline: 0.84,\n\t\tsimulatePressure: true,\n\t};\n}\n\nexport function resolveStrokeStyle(item: VectorSceneItem): StrokeStyle {\n\treturn {\n\t\tstroke: item.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\tstrokeWidth: item.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\tstrokeOpacity: item.strokeOpacity,\n\t\tstrokeDash: item.strokeDash,\n\t};\n}\n\nfunction strokeOpacityAttr(style: StrokeStyle): string {\n\treturn style.strokeOpacity != null\n\t\t? ` stroke-opacity=\"${style.strokeOpacity}\"`\n\t\t: \"\";\n}\n\nfunction svgNumber(value: number): string {\n\tif (!Number.isFinite(value)) return \"0\";\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Number.isInteger(rounded) ? String(rounded) : String(rounded);\n}\n\nconst ARCHITECTURAL_CLOUD_RADIUS = 38;\nconst ARCHITECTURAL_CLOUD_TARGET_SPACING = 50;\nconst ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO = 0.38;\nconst ARCHITECTURAL_CLOUD_ROUNDED_RADIUS = 72;\nconst ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS = 44;\nconst ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING = 98;\n\ntype CloudPoint = readonly [number, number];\n\ntype CloudPathSegment = {\n\tlength: number;\n\tpointAt: (t: number) => CloudPoint;\n};\n\nfunction architecturalCloudCenterCount(edgeLength: number, radius: number): number {\n\tconst targetSpacing = Math.min(\n\t\tARCHITECTURAL_CLOUD_TARGET_SPACING,\n\t\tMath.max(1, radius * 1.3),\n\t);\n\treturn Math.max(2, Math.round(edgeLength / targetSpacing) + 1);\n}\n\nfunction distributeRange(start: number, end: number, count: number): number[] {\n\tif (count <= 1) return [start];\n\tconst step = (end - start) / (count - 1);\n\treturn Array.from({ length: count }, (_, index) => start + step * index);\n}\n\nfunction lineCloudPathSegment(start: CloudPoint, end: CloudPoint): CloudPathSegment {\n\tconst dx = end[0] - start[0];\n\tconst dy = end[1] - start[1];\n\tconst length = Math.hypot(dx, dy);\n\treturn {\n\t\tlength,\n\t\tpointAt: (t) => [start[0] + dx * t, start[1] + dy * t],\n\t};\n}\n\nfunction ellipsePoint(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tangle: number,\n): CloudPoint {\n\treturn [centerX + Math.cos(angle) * radiusX, centerY + Math.sin(angle) * radiusY];\n}\n\nfunction approximateEllipseArcLength(\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): number {\n\tconst steps = Math.max(\n\t\t4,\n\t\tMath.ceil(Math.abs(endAngle - startAngle) / (Math.PI / 16)),\n\t);\n\tlet length = 0;\n\tlet previous = ellipsePoint(0, 0, radiusX, radiusY, startAngle);\n\tfor (let index = 1; index <= steps; index += 1) {\n\t\tconst angle = startAngle + ((endAngle - startAngle) * index) / steps;\n\t\tconst next = ellipsePoint(0, 0, radiusX, radiusY, angle);\n\t\tlength += Math.hypot(next[0] - previous[0], next[1] - previous[1]);\n\t\tprevious = next;\n\t}\n\treturn length;\n}\n\nfunction ellipseCloudPathSegment(\n\tcenterX: number,\n\tcenterY: number,\n\tradiusX: number,\n\tradiusY: number,\n\tstartAngle: number,\n\tendAngle: number,\n): CloudPathSegment {\n\treturn {\n\t\tlength: approximateEllipseArcLength(radiusX, radiusY, startAngle, endAngle),\n\t\tpointAt: (t) =>\n\t\t\tellipsePoint(\n\t\t\t\tcenterX,\n\t\t\t\tcenterY,\n\t\t\t\tradiusX,\n\t\t\t\tradiusY,\n\t\t\t\tstartAngle + (endAngle - startAngle) * t,\n\t\t\t),\n\t};\n}\n\nfunction cloudPathPerimeter(segments: CloudPathSegment[]): number {\n\tconst usableSegments = segments.filter((segment) => segment.length > 1e-9);\n\treturn usableSegments.reduce((sum, segment) => sum + segment.length, 0);\n}\n\nfunction pointOnCloudPath(\n\tsegments: CloudPathSegment[],\n\tdistance: number,\n): CloudPoint {\n\tconst perimeter = cloudPathPerimeter(segments);\n\tif (perimeter <= 0) return [0, 0];\n\n\tlet remaining = ((distance % perimeter) + perimeter) % perimeter;\n\tfor (const segment of segments) {\n\t\tif (segment.length <= 1e-9) continue;\n\t\tif (remaining <= segment.length) {\n\t\t\tconst t = remaining / segment.length;\n\t\t\treturn segment.pointAt(t);\n\t\t}\n\t\tremaining -= segment.length;\n\t}\n\n\tconst fallback = segments.find((segment) => segment.length > 1e-9);\n\treturn fallback?.pointAt(0) ?? [0, 0];\n}\n\nfunction buildRoundedCapsulePathSegments(\n\twidth: number,\n\theight: number,\n\tinset: number,\n): CloudPathSegment[] {\n\tconst left = inset;\n\tconst top = inset;\n\tconst right = width - inset;\n\tconst bottom = height - inset;\n\tconst capsuleWidth = Math.max(0, right - left);\n\tconst capsuleHeight = Math.max(0, bottom - top);\n\tconst radius = Math.min(capsuleWidth, capsuleHeight) / 2;\n\tif (radius <= 0) return [];\n\n\tconst leftCenterX = left + radius;\n\tconst rightCenterX = right - radius;\n\tconst topCenterY = top + radius;\n\tconst bottomCenterY = bottom - radius;\n\n\treturn [\n\t\tlineCloudPathSegment([leftCenterX, top], [rightCenterX, top]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t-Math.PI / 2,\n\t\t\t0,\n\t\t),\n\t\tlineCloudPathSegment([right, topCenterY], [right, bottomCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\trightCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\t0,\n\t\t\tMath.PI / 2,\n\t\t),\n\t\tlineCloudPathSegment([rightCenterX, bottom], [leftCenterX, bottom]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\tbottomCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI / 2,\n\t\t\tMath.PI,\n\t\t),\n\t\tlineCloudPathSegment([left, bottomCenterY], [left, topCenterY]),\n\t\tellipseCloudPathSegment(\n\t\t\tleftCenterX,\n\t\t\ttopCenterY,\n\t\t\tradius,\n\t\t\tradius,\n\t\t\tMath.PI,\n\t\t\tMath.PI * 1.5,\n\t\t),\n\t];\n}\n\nfunction buildRoundedArcCloudPathD(\n\tcloudWidth: number,\n\tcloudHeight: number,\n\tcenter: CloudPoint,\n): string {\n\tconst minDimension = Math.min(cloudWidth, cloudHeight);\n\tconst radius = Math.min(\n\t\tARCHITECTURAL_CLOUD_ROUNDED_RADIUS,\n\t\tMath.max(ARCHITECTURAL_CLOUD_ROUNDED_MIN_RADIUS, minDimension * 0.16),\n\t);\n\tconst centerPath = buildRoundedCapsulePathSegments(\n\t\tcloudWidth,\n\t\tcloudHeight,\n\t\tradius,\n\t);\n\tconst centerPerimeter = cloudPathPerimeter(centerPath);\n\tif (centerPerimeter <= 0) return \"\";\n\n\tconst lobeCount = Math.max(\n\t\t8,\n\t\tMath.round(centerPerimeter / ARCHITECTURAL_CLOUD_ROUNDED_TARGET_SPACING),\n\t);\n\tconst centers = Array.from({ length: lobeCount }, (_, index) =>\n\t\tpointOnCloudPath(centerPath, (centerPerimeter * index) / lobeCount),\n\t);\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudCircleIntersection(previous, point, radius, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radius)} ${svgNumber(radius)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\nfunction cloudCircleIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradius: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst midX = (a[0] + b[0]) / 2;\n\tconst midY = (a[1] + b[1]) / 2;\n\tconst dx = b[0] - a[0];\n\tconst dy = b[1] - a[1];\n\tconst distance = Math.hypot(dx, dy);\n\tif (distance <= 1e-9) return [midX, midY];\n\n\tconst halfDistance = distance / 2;\n\tconst offset = Math.sqrt(\n\t\tMath.max(0, radius * radius - halfDistance * halfDistance),\n\t);\n\tconst normalX = -dy / distance;\n\tconst normalY = dx / distance;\n\tconst first: [number, number] = [midX + normalX * offset, midY + normalY * offset];\n\tconst second: [number, number] = [\n\t\tmidX - normalX * offset,\n\t\tmidY - normalY * offset,\n\t];\n\tconst firstDistance =\n\t\t(first[0] - center[0]) * (first[0] - center[0]) +\n\t\t(first[1] - center[1]) * (first[1] - center[1]);\n\tconst secondDistance =\n\t\t(second[0] - center[0]) * (second[0] - center[0]) +\n\t\t(second[1] - center[1]) * (second[1] - center[1]);\n\treturn firstDistance >= secondDistance ? first : second;\n}\n\nfunction cloudEllipseIntersection(\n\ta: CloudPoint,\n\tb: CloudPoint,\n\tradiusX: number,\n\tradiusY: number,\n\tcenter: CloudPoint,\n): [number, number] {\n\tconst scaleY = radiusX / radiusY;\n\tconst [x, y] = cloudCircleIntersection(\n\t\t[a[0], a[1] * scaleY],\n\t\t[b[0], b[1] * scaleY],\n\t\tradiusX,\n\t\t[center[0], center[1] * scaleY],\n\t);\n\treturn [x, y / scaleY];\n}\n\nexport function buildRectSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<rect width=\"${width}\" height=\"${height}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" rx=\"4\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildEllipseSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst rx = width / 2;\n\tconst ry = height / 2;\n\treturn `<ellipse cx=\"${rx}\" cy=\"${ry}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\n/**\n * Returns the local SVG path for a scalable architectural revision cloud.\n *\n * Use this low-level helper when you need to preview or inspect the shape without\n * creating a full scene item. Prefer {@link createArchitecturalCloudItem} when\n * adding a cloud to a `VectorSceneItem[]`, because it keeps `toolKind`, bounds,\n * stroke fields, and `childrenSvg` synchronized for editing.\n *\n * @example\n * ```ts\n * const d = buildArchitecturalCloudPathD(180, 90);\n * ```\n */\nexport function buildArchitecturalCloudPathD(\n\twidth: number,\n\theight: number,\n\tstrokeWidth = DEFAULT_STROKE_STYLE.strokeWidth,\n): string {\n\tconst w = Math.max(0, width);\n\tconst h = Math.max(0, height);\n\tif (w <= 0 || h <= 0) return \"\";\n\n\tconst padding = Math.max(0, strokeWidth * 2);\n\tconst cloudWidth = Math.max(0, w - padding);\n\tconst cloudHeight = Math.max(0, h - padding);\n\tif (cloudWidth <= 0 || cloudHeight <= 0) return \"\";\n\n\tconst radiusX = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudWidth * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tconst radiusY = Math.min(\n\t\tARCHITECTURAL_CLOUD_RADIUS,\n\t\tcloudHeight * ARCHITECTURAL_CLOUD_FLAT_RADIUS_RATIO,\n\t);\n\tif (radiusX <= 0 || radiusY <= 0) return \"\";\n\n\tconst center: CloudPoint = [cloudWidth / 2, cloudHeight / 2];\n\tconst leftCenterX = radiusX;\n\tconst rightCenterX = cloudWidth - radiusX;\n\tconst topCenterY = radiusY;\n\tconst bottomCenterY = cloudHeight - radiusY;\n\tconst horizontalCenters = distributeRange(\n\t\tleftCenterX,\n\t\trightCenterX,\n\t\tarchitecturalCloudCenterCount(Math.max(0, rightCenterX - leftCenterX), radiusX),\n\t);\n\tconst verticalCenters = distributeRange(\n\t\ttopCenterY,\n\t\tbottomCenterY,\n\t\tarchitecturalCloudCenterCount(Math.max(0, bottomCenterY - topCenterY), radiusY),\n\t);\n\tif (horizontalCenters.length > 3 && verticalCenters.length > 3) {\n\t\tconst roundedArcCloudPath = buildRoundedArcCloudPathD(\n\t\t\tcloudWidth,\n\t\t\tcloudHeight,\n\t\t\tcenter,\n\t\t);\n\t\tif (roundedArcCloudPath !== \"\") return roundedArcCloudPath;\n\t}\n\tconst rectangularCenters: CloudPoint[] = [\n\t\t...horizontalCenters.map((x) => [x, topCenterY] as const),\n\t\t...verticalCenters.slice(1).map((y) => [rightCenterX, y] as const),\n\t\t...horizontalCenters\n\t\t\t.slice(0, -1)\n\t\t\t.reverse()\n\t\t\t.map((x) => [x, bottomCenterY] as const),\n\t\t...verticalCenters\n\t\t\t.slice(1, -1)\n\t\t\t.reverse()\n\t\t\t.map((y) => [leftCenterX, y] as const),\n\t];\n\tconst centers = rectangularCenters;\n\tconst points = centers.map((point, index) => {\n\t\tconst previous = centers[(index - 1 + centers.length) % centers.length] ?? point;\n\t\treturn cloudEllipseIntersection(previous, point, radiusX, radiusY, center);\n\t});\n\tconst [startX, startY] = points[0] ?? [0, 0];\n\tconst segments = [`M${svgNumber(startX)} ${svgNumber(startY)}`];\n\n\tfor (const [endX, endY] of points.slice(1)) {\n\t\tsegments.push(\n\t\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(endX)} ${svgNumber(endY)}`,\n\t\t);\n\t}\n\tsegments.push(\n\t\t`A ${svgNumber(radiusX)} ${svgNumber(radiusY)} 0 0 1 ${svgNumber(startX)} ${svgNumber(startY)}`,\n\t);\n\n\tsegments.push(\"Z\");\n\treturn segments.join(\" \");\n}\n\n/**\n * Builds an SVG fragment for an architectural revision cloud outline.\n *\n * This is the renderer-level primitive behind the built-in `\"architectural-cloud\"`\n * tool. Prefer {@link createArchitecturalCloudItem} for app code that inserts a\n * normal editable scene item.\n */\nexport function buildArchitecturalCloudSvg(\n\twidth: number,\n\theight: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst d = buildArchitecturalCloudPathD(width, height, style.strokeWidth);\n\treturn `<path d=\"${d}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${strokeOpacityAttr(style)} />`;\n}\n\nexport function buildLineSvg(\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\treturn `<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${line.x2}\" y2=\"${line.y2}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\"${strokeOpacityAttr(style)} />`;\n}\n\nexport type StraightArrowGeometry = {\n\tshaftEndX: number;\n\tshaftEndY: number;\n\theadTipX: number;\n\theadTipY: number;\n\theadLeftX: number;\n\theadLeftY: number;\n\theadRightX: number;\n\theadRightY: number;\n};\n\nexport function computeStraightArrowGeometry(\n\tline: LineEndpointsLocal,\n\tstrokeWidth: number,\n): StraightArrowGeometry | null {\n\tconst dx = line.x2 - line.x1;\n\tconst dy = line.y2 - line.y1;\n\tconst len = Math.hypot(dx, dy);\n\tif (len < 1e-6) return null;\n\tconst ux = dx / len;\n\tconst uy = dy / len;\n\tconst headLength = Math.min(Math.max(strokeWidth * 4.2, 12), len * 0.38);\n\tconst headAngle = Math.PI / 6;\n\tconst cos = Math.cos(headAngle);\n\tconst sin = Math.sin(headAngle);\n\tconst rx1 = ux * cos - uy * sin;\n\tconst ry1 = ux * sin + uy * cos;\n\tconst rx2 = ux * cos + uy * sin;\n\tconst ry2 = -ux * sin + uy * cos;\n\treturn {\n\t\tshaftEndX: line.x2,\n\t\tshaftEndY: line.y2,\n\t\theadTipX: line.x2,\n\t\theadTipY: line.y2,\n\t\theadLeftX: line.x2 - rx1 * headLength,\n\t\theadLeftY: line.y2 - ry1 * headLength,\n\t\theadRightX: line.x2 - rx2 * headLength,\n\t\theadRightY: line.y2 - ry2 * headLength,\n\t};\n}\n\nexport function buildArrowSvg(\n\titemId: string,\n\tline: LineEndpointsLocal,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tvoid itemId;\n\tconst geometry = computeStraightArrowGeometry(line, style.strokeWidth);\n\tif (!geometry) {\n\t\treturn buildLineSvg(line, style);\n\t}\n\tconst op = strokeOpacityAttr(style);\n\treturn `\n\t\t<line x1=\"${line.x1}\" y1=\"${line.y1}\" x2=\"${geometry.shaftEndX}\" y2=\"${geometry.shaftEndY}\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\"${op} />\n\t\t<path d=\"M ${geometry.headLeftX} ${geometry.headLeftY} L ${geometry.headTipX} ${geometry.headTipY} L ${geometry.headRightX} ${geometry.headRightY}\" fill=\"none\" stroke=\"${style.stroke}\" stroke-width=\"${style.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op} />\n\t`;\n}\n\nexport function buildDrawDotSvg(\n\tr: number,\n\tstyle: StrokeStyle = DEFAULT_STROKE_STYLE,\n): string {\n\tconst op =\n\t\tstyle.strokeOpacity != null ? ` fill-opacity=\"${style.strokeOpacity}\"` : \"\";\n\treturn `<circle cx=\"${r}\" cy=\"${r}\" r=\"${r}\" fill=\"${style.stroke}\" shape-rendering=\"geometricPrecision\"${op} />`;\n}\n\n/** Structured result for React overlays; scene uses {@link buildFreehandPathSvg} string. */\nexport type FreehandSvgPayload =\n\t| {\n\t\t\tkind: \"circle\";\n\t\t\tcx: number;\n\t\t\tcy: number;\n\t\t\tr: number;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"fillPath\";\n\t\t\td: string;\n\t\t\tfill: string;\n\t\t\tfillOpacity?: number;\n\t }\n\t| {\n\t\t\tkind: \"strokePath\";\n\t\t\td: string;\n\t\t\tstroke: string;\n\t\t\tstrokeWidth: number;\n\t\t\tstrokeOpacity?: number;\n\t\t\tstrokeDasharray?: string;\n\t };\n\nfunction dashArrayForDrawStroke(strokeWidth: number): string {\n\tconst dash = Math.max(strokeWidth * 1.8, 4);\n\tconst gap = Math.max(strokeWidth * 1.4, 3);\n\treturn `${dash} ${gap}`;\n}\n\nfunction buildSmoothedCenterlinePath(\n\tpoints: readonly { x: number; y: number }[],\n): string | null {\n\tif (points.length < 2) return null;\n\tconst first = points[0];\n\tif (!first) return null;\n\tlet d = `M ${first.x} ${first.y}`;\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst a = points[i];\n\t\tconst b = points[i + 1];\n\t\tif (!a || !b) continue;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\td += ` Q ${a.x} ${a.y} ${midX} ${midY}`;\n\t}\n\tconst last = points[points.length - 1];\n\tif (last) {\n\t\td += ` L ${last.x} ${last.y}`;\n\t}\n\treturn d;\n}\n\n/**\n * Computes freehand geometry (perfect-freehand + fallback). Used by {@link buildFreehandPathSvg}\n * and React overlays without `dangerouslySetInnerHTML`.\n */\nexport function computeFreehandSvgPayload(\n\tpathPointsLocal: readonly VectorPathPoint[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): FreehandSvgPayload | null {\n\tif (pathPointsLocal.length === 0) return null;\n\tif (pathPointsLocal.length === 1) {\n\t\tconst p = pathPointsLocal[0];\n\t\tif (!p) return null;\n\t\treturn {\n\t\t\tkind: \"circle\",\n\t\t\tcx: p.x,\n\t\t\tcy: p.y,\n\t\t\tr: Math.max(0.5, style.strokeWidth / 2),\n\t\t\tfill: style.stroke,\n\t\t\tfillOpacity: style.strokeOpacity,\n\t\t};\n\t}\n\tif (\n\t\tstyle.strokeDash === \"dashed\" &&\n\t\t(toolKind === \"draw\" || toolKind === \"pencil\")\n\t) {\n\t\tconst d = buildSmoothedCenterlinePath(pathPointsLocal);\n\t\tif (!d) return null;\n\t\treturn {\n\t\t\tkind: \"strokePath\",\n\t\t\td,\n\t\t\tstroke: style.stroke,\n\t\t\tstrokeWidth: style.strokeWidth,\n\t\t\tstrokeOpacity: style.strokeOpacity,\n\t\t\tstrokeDasharray: dashArrayForDrawStroke(style.strokeWidth),\n\t\t};\n\t}\n\tconst hasPressure = pathPointsLocal.some(\n\t\t(p) => p.pressure != null && Number.isFinite(p.pressure),\n\t);\n\tconst input = hasPressure\n\t\t? pathPointsLocal.map(\n\t\t\t\t(p) =>\n\t\t\t\t\t[p.x, p.y, Math.min(1, Math.max(0, p.pressure ?? 0.5))] as [\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t\tnumber,\n\t\t\t\t\t],\n\t\t\t)\n\t\t: pathPointsLocal.map((p) => [p.x, p.y] as [number, number]);\n\tconst stroke = getStroke(\n\t\tinput,\n\t\tperfectFreehandOptions(toolKind, style, strokeComplete, hasPressure),\n\t);\n\tif (stroke.length < 3) return null;\n\tconst first = stroke[0];\n\tif (!first) return null;\n\tlet d = `M ${first[0]} ${first[1]} Q`;\n\tfor (let i = 0; i < stroke.length; i++) {\n\t\tconst a = stroke[i];\n\t\tconst b = stroke[(i + 1) % stroke.length];\n\t\tif (!a || !b) continue;\n\t\td += ` ${a[0]} ${a[1]} ${(a[0] + b[0]) / 2} ${(a[1] + b[1]) / 2}`;\n\t}\n\td += \" Z\";\n\treturn {\n\t\tkind: \"fillPath\",\n\t\td,\n\t\tfill: style.stroke,\n\t\tfillOpacity: style.strokeOpacity,\n\t};\n}\n\nfunction freehandPayloadToSvgString(payload: FreehandSvgPayload): string {\n\tif (payload.kind === \"circle\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<circle cx=\"${payload.cx}\" cy=\"${payload.cy}\" r=\"${payload.r}\" fill=\"${payload.fill}\" shape-rendering=\"geometricPrecision\"${op} />`;\n\t}\n\tif (payload.kind === \"fillPath\") {\n\t\tconst op =\n\t\t\tpayload.fillOpacity != null ? ` fill-opacity=\"${payload.fillOpacity}\"` : \"\";\n\t\treturn `<path d=\"${payload.d}\" fill=\"${payload.fill}\" fill-rule=\"nonzero\" stroke=\"none\"${op} shape-rendering=\"geometricPrecision\" />`;\n\t}\n\tconst op = strokeOpacityAttr({\n\t\tstroke: payload.stroke,\n\t\tstrokeWidth: payload.strokeWidth,\n\t\tstrokeOpacity: payload.strokeOpacity,\n\t});\n\tconst dash = payload.strokeDasharray\n\t\t? ` stroke-dasharray=\"${payload.strokeDasharray}\"`\n\t\t: \"\";\n\treturn `<path d=\"${payload.d}\" fill=\"none\" stroke=\"${payload.stroke}\" stroke-width=\"${payload.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op}${dash} />`;\n}\n\n/**\n * Freehand stroke in local coordinates using [perfect-freehand](https://github.com/steveruizok/perfect-freehand)\n * (filled outline, tapered caps — similar spirit to tldraw / Excalidraw ink).\n */\nexport function buildFreehandPathSvg(\n\tpathPointsLocal: readonly { x: number; y: number }[],\n\tstyle: StrokeStyle,\n\ttoolKind: \"draw\" | \"pencil\" | \"brush\" | \"marker\",\n\tstrokeComplete = true,\n): string {\n\tconst payload = computeFreehandSvgPayload(\n\t\tpathPointsLocal,\n\t\tstyle,\n\t\ttoolKind,\n\t\tstrokeComplete,\n\t);\n\tif (!payload) return \"\";\n\treturn freehandPayloadToSvgString(payload);\n}\n\n/**\n * Creates a new unique id for a shape (for `VectorSceneItem.id` when adding from code or API).\n */\nexport function createShapeId(): string {\n\tconst uid =\n\t\ttypeof crypto !== \"undefined\" && crypto.randomUUID\n\t\t\t? crypto.randomUUID()\n\t\t\t: String(Date.now());\n\treturn `user-shape-${uid}`;\n}\n\n/**\n * Converts line segment endpoints from **world** coordinates to **local** coordinates\n * (origin = top-left of `bounds`). Use with {@link createLineItem}.\n */\nexport function lineEndpointsToLocal(\n\tbounds: Rect,\n\tworldEndA: { x: number; y: number },\n\tworldEndB: { x: number; y: number },\n): LineEndpointsLocal {\n\tconst b = normalizeRect(bounds);\n\treturn {\n\t\tx1: worldEndA.x - b.x,\n\t\ty1: worldEndA.y - b.y,\n\t\tx2: worldEndB.x - b.x,\n\t\ty2: worldEndB.y - b.y,\n\t};\n}\n\n/**\n * Rebuilds the SVG fragment (`childrenSvg`) from geometry + stroke fields (after edits or resize).\n */\nexport function rebuildItemSvg(item: VectorSceneItem): VectorSceneItem {\n\tconst style = resolveStrokeStyle(item);\n\tconst k = item.toolKind;\n\n\tif (k === \"rect\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRectSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"ellipse\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildEllipseSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif (k === \"architectural-cloud\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildArchitecturalCloudSvg(b.width, b.height, style),\n\t\t};\n\t}\n\tif ((k === \"line\" || k === \"arrow\") && item.line) {\n\t\tconst line = item.line;\n\t\tconst childrenSvg =\n\t\t\tk === \"arrow\"\n\t\t\t\t? buildArrowSvg(item.id, line, style)\n\t\t\t\t: buildLineSvg(line, style);\n\t\treturn { ...item, childrenSvg };\n\t}\n\tif (k === \"text\" && item.text !== undefined) {\n\t\tconst fs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\t\tif (item.textFixedBounds) {\n\t\t\tconst b = normalizeRect(item.bounds);\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: b.x,\n\t\t\t\ty: b.y,\n\t\t\t\tbounds: b,\n\t\t\t\tchildrenSvg: buildTextFixedBoundsSvg(\n\t\t\t\t\titem.text,\n\t\t\t\t\tb.width,\n\t\t\t\t\tb.height,\n\t\t\t\t\tstyle.stroke,\n\t\t\t\t\tfs,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tconst m = measureTextBoundsLocal(item.text, fs);\n\t\tconst b = normalizeRect({\n\t\t\tx: item.x,\n\t\t\ty: item.y,\n\t\t\twidth: m.width,\n\t\t\theight: m.height,\n\t\t});\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildTextSvg(item.text, b.width, b.height, style.stroke, fs),\n\t\t};\n\t}\n\tif (\n\t\t(k === \"draw\" || k === \"pencil\" || k === \"brush\" || k === \"marker\") &&\n\t\titem.pathPointsLocal &&\n\t\titem.pathPointsLocal.length > 0\n\t) {\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildFreehandPathSvg(item.pathPointsLocal, style, k),\n\t\t};\n\t}\n\tif (k === \"draw\") {\n\t\tconst b = normalizeRect(item.bounds);\n\t\tconst r = Math.min(b.width, b.height) / 2;\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildDrawDotSvg(r, style),\n\t\t};\n\t}\n\tif (k === \"image\" && item.imageRasterHref && item.imageIntrinsicSize) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\titem.imageRasterHref,\n\t\t\t\titem.imageIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\tif (k === \"custom\" && item.customIntrinsicSize && item.customInnerSvg) {\n\t\tconst b = normalizeRect(item.bounds);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: b.x,\n\t\t\ty: b.y,\n\t\t\tbounds: b,\n\t\t\tchildrenSvg: buildCustomShapeChildrenSvg(\n\t\t\t\titem.customInnerSvg,\n\t\t\t\titem.customIntrinsicSize,\n\t\t\t\tb,\n\t\t\t),\n\t\t};\n\t}\n\n\treturn item;\n}\n\n/** Updates stroke color / width / opacity and refreshes the item’s SVG. */\nexport function applyStrokeToItem(\n\titem: VectorSceneItem,\n\tpatch: Partial<\n\t\tPick<\n\t\t\tVectorSceneItem,\n\t\t\t\"stroke\" | \"strokeWidth\" | \"strokeOpacity\" | \"strokeDash\" | \"textFontSize\"\n\t\t>\n\t>,\n): VectorSceneItem {\n\treturn rebuildItemSvg({ ...item, ...patch });\n}\n\n/** Creates a rectangle shape ready to append to your scene `items` array. */\nexport function createRectangleItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"rect\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an ellipse shape. */\nexport function createEllipseItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"ellipse\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/**\n * Creates an architectural revision cloud shape.\n *\n * Use this high-level builder when adding the built-in cloud shape from code or\n * from custom integrations. It creates an editable `VectorSceneItem` with\n * `toolKind: \"architectural-cloud\"`, so resize, stroke styling, selection, and\n * serialization continue to work like the built-in rectangle and ellipse tools.\n *\n * @example\n * ```ts\n * const cloud = createArchitecturalCloudItem(createShapeId(), {\n * x: 40,\n * y: 30,\n * width: 180,\n * height: 90,\n * });\n * ```\n */\nexport function createArchitecturalCloudItem(\n\tid: string,\n\tbounds: Rect,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"architectural-cloud\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates a straight line or arrow; `line` is usually from {@link lineEndpointsToLocal}. */\nexport function createLineItem(\n\tid: string,\n\tbounds: Rect,\n\tline: LineEndpointsLocal,\n\ttoolKind: \"line\" | \"arrow\",\n\tstyle?: Partial<StrokeStyle>,\n\tarrowBind?: ArrowBindings,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind,\n\t\tline: { ...line },\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(arrowBind ? { arrowBind } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** “Draw dot” tool: a small filled circle at (`worldX`, `worldY`). */\nexport function createDrawDotItem(\n\tid: string,\n\tworldX: number,\n\tworldY: number,\n\tradius: number,\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem {\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: worldX - radius,\n\t\ty: worldY - radius,\n\t\tbounds: {\n\t\t\tx: worldX - radius,\n\t\t\ty: worldY - radius,\n\t\t\twidth: radius * 2,\n\t\t\theight: radius * 2,\n\t\t},\n\t\ttoolKind: \"draw\",\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Creates an editable text box (`stroke` is used as text fill). */\nexport function createTextItem(\n\tid: string,\n\tbounds: Rect,\n\ttext = \"\",\n\tstyle?: Partial<StrokeStyle>,\n\ttextFontSize?: number,\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst s = { ...DEFAULT_STROKE_STYLE, ...style };\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"text\",\n\t\ttext,\n\t\tstroke: s.stroke,\n\t\tstrokeWidth: s.strokeWidth,\n\t\t...(s.strokeOpacity != null ? { strokeOpacity: s.strokeOpacity } : {}),\n\t\t...(textFontSize != null ? { textFontSize } : {}),\n\t\tchildrenSvg: \"\",\n\t});\n}\n\n/** Freehand stroke from world-space points (main pen or marker highlight). */\nexport function createFreehandStrokeItem(\n\tid: string,\n\tpointsWorld: readonly VectorPathPoint[],\n\ttoolKind: \"draw\" | \"marker\",\n\tstyle?: Partial<StrokeStyle>,\n): VectorSceneItem | null {\n\tif (pointsWorld.length === 0) return null;\n\n\tconst merged: StrokeStyle = {\n\t\t...DEFAULT_STROKE_STYLE,\n\t\t...TOOL_FREEHAND_DEFAULTS[toolKind],\n\t\t...style,\n\t};\n\n\tconst sw = merged.strokeWidth;\n\t/** Filled outline extends ~size/2 past the polyline; keep generous padding to avoid clipping. */\n\tconst pad = Math.max(sw * 0.75 + 4, sw / 2 + 6);\n\tconst xs = pointsWorld.map((p) => p.x);\n\tconst ys = pointsWorld.map((p) => p.y);\n\tconst minX = Math.min(...xs);\n\tconst maxX = Math.max(...xs);\n\tconst minY = Math.min(...ys);\n\tconst maxY = Math.max(...ys);\n\n\tconst x = minX - pad;\n\tconst y = minY - pad;\n\tconst w = Math.max(maxX - minX + 2 * pad, sw);\n\tconst h = Math.max(maxY - minY + 2 * pad, sw);\n\n\tconst pathPointsLocal = pointsWorld.map((p) => ({\n\t\tx: p.x - x,\n\t\ty: p.y - y,\n\t\t...(p.pressure != null ? { pressure: p.pressure } : {}),\n\t}));\n\n\treturn rebuildItemSvg({\n\t\tid,\n\t\tx,\n\t\ty,\n\t\tbounds: { x, y, width: w, height: h },\n\t\ttoolKind,\n\t\tstroke: merged.stroke,\n\t\tstrokeWidth: merged.strokeWidth,\n\t\t...(merged.strokeOpacity != null ? { strokeOpacity: merged.strokeOpacity } : {}),\n\t\t...(merged.strokeDash != null ? { strokeDash: merged.strokeDash } : {}),\n\t\tpathPointsLocal,\n\t\tchildrenSvg: \"\",\n\t});\n}\n\nfunction escapeSvgAttr(s: string): string {\n\treturn s.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\");\n}\n\n/**\n * Builds `<g><image href=\"data:...\"/></g>` inside `bounds` from intrinsic pixel dimensions.\n * When bounds match intrinsic aspect (normal after aspect-locked resize), uses a uniform **fill** scale.\n * Otherwise uses **contain** + center for legacy or pasted rects with wrong proportion.\n */\nexport function buildRasterImageChildrenSvg(\n\tdataUrl: string,\n\tintrinsic: { width: number; height: number },\n\tbounds: Rect,\n): string {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, intrinsic.width);\n\tconst ih = Math.max(1e-6, intrinsic.height);\n\tconst href = escapeSvgAttr(dataUrl);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = iw / ih;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / iw;\n\t\treturn `<g transform=\"scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n\t}\n\tconst s = Math.min(r.width / iw, r.height / ih);\n\tconst tx = (r.width - iw * s) / 2;\n\tconst ty = (r.height - ih * s) / 2;\n\treturn `<g transform=\"translate(${tx}, ${ty}) scale(${s})\"><image href=\"${href}\" x=\"0\" y=\"0\" width=\"${iw}\" height=\"${ih}\" /></g>`;\n}\n\n/** Places a bitmap (e.g. `data:image/png;base64,...`) inside `bounds`. */\nexport function createImageItem(\n\tid: string,\n\tbounds: Rect,\n\timageRasterHref: string,\n\timageIntrinsicSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst iw = Math.max(1e-6, imageIntrinsicSize.width);\n\tconst ih = Math.max(1e-6, imageIntrinsicSize.height);\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageRasterHref,\n\t\timageIntrinsicSize: { width: iw, height: ih },\n\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\timageRasterHref,\n\t\t\t{ width: iw, height: ih },\n\t\t\tr,\n\t\t),\n\t};\n}\n\n/** @internal Legacy traced path content — prefer {@link createImageItem} with a raster data URL. */\nexport function createImageFromVectorTrace(\n\tid: string,\n\tbounds: Rect,\n\timageVectorInnerSvg: string,\n\timageVectorLocalSize: { width: number; height: number },\n): VectorSceneItem {\n\tconst r = normalizeRect(bounds);\n\tconst lw = Math.max(1e-6, imageVectorLocalSize.width);\n\tconst lh = Math.max(1e-6, imageVectorLocalSize.height);\n\tconst arB = r.width / Math.max(1e-9, r.height);\n\tconst arI = lw / lh;\n\tlet childrenSvg: string;\n\tif (Math.abs(arB - arI) < 1e-3) {\n\t\tconst s = r.width / lw;\n\t\tchildrenSvg = `<g transform=\"scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t} else {\n\t\tconst s = Math.min(r.width / lw, r.height / lh);\n\t\tconst tx = (r.width - lw * s) / 2;\n\t\tconst ty = (r.height - lh * s) / 2;\n\t\tchildrenSvg = `<g transform=\"translate(${tx}, ${ty}) scale(${s})\">${imageVectorInnerSvg}</g>`;\n\t}\n\treturn {\n\t\tid,\n\t\tx: r.x,\n\t\ty: r.y,\n\t\tbounds: { ...r },\n\t\ttoolKind: \"image\",\n\t\timageVectorInnerSvg,\n\t\timageVectorLocalSize: { width: lw, height: lh },\n\t\tchildrenSvg,\n\t};\n}\n","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","\"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","\"use client\";\n\nimport {\n\tcreateBlobUrlFromStore,\n\tIndexedDbImageStore,\n\tloadImageToStore,\n} from \"../image/indexed-db-image-store\";\nimport { loadPdfToStore } from \"../image/pdf-loader\";\nimport { buildRasterImageChildrenSvg, createShapeId } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\tapplyAssetUploadResultToItem,\n\ttype VectorViewportAssetKind,\n\ttype VectorViewportAssetStore,\n\ttype VectorViewportAssetUploadResult,\n} from \"./asset-store\";\n\n/**\n * Extra context for each item created by {@link ingestAssetFilesToSceneItems}.\n *\n * Use this when you need to lock imported pages, assign custom ids, or attach\n * additional metadata beyond the `pluginData` returned by {@link VectorViewportAssetStore.upload}.\n */\nexport type IngestedAssetItemContext = {\n\tfile: File;\n\tkind: VectorViewportAssetKind;\n\titemIndex: number;\n\tpageNumber?: number;\n};\n\n/**\n * Structured error produced while ingesting a file into scene items.\n *\n * The helper keeps partial success by default: one file can fail without\n * preventing the remaining files from being converted.\n */\nexport type IngestAssetFileError = {\n\tfile: File;\n\tkind?: VectorViewportAssetKind;\n\terror: unknown;\n};\n\n/**\n * Options for {@link ingestAssetFilesToSceneItems}.\n *\n * This is the shared ingestion pipeline used by canvu's built-in file flow.\n * Use it when files originate outside the viewport, such as:\n *\n * - custom upload dialogs\n * - board/version creation flows\n * - programmatic imports\n * - legacy migrations\n *\n * Prefer passing `assetStore` directly to `VectorViewport` when the user is\n * already interacting with canvu's native file picker or drag-and-drop UI.\n *\n * @example\n * ```ts\n * const result = await ingestAssetFilesToSceneItems({\n * files: Array.from(input.files ?? []),\n * worldCenter: { x: 0, y: 0 },\n * assetStore,\n * decorateItem(item) {\n * return {\n * ...item,\n * locked: true,\n * };\n * },\n * });\n *\n * doc.onItemsChange([...doc.items, ...result.items]);\n * ```\n */\nexport type IngestAssetFilesToSceneItemsOptions = {\n\tfiles: readonly File[];\n\texistingItems?: readonly VectorSceneItem[];\n\tworldCenter: {\n\t\tx: number;\n\t\ty: number;\n\t};\n\t/**\n\t * Optional binary persistence bridge shared with `VectorViewport`.\n\t *\n\t * When provided, `upload(...)` is called once per source file before canvu\n\t * converts that file into one or more scene items.\n\t */\n\tassetStore?: VectorViewportAssetStore;\n\t/**\n\t * Optional local blob store used to keep canvu's default image/PDF runtime\n\t * behavior consistent across reload-safe persistence adapters.\n\t *\n\t * Omit this unless you need to share an existing store instance.\n\t */\n\timageStore?: IndexedDbImageStore;\n\t/**\n\t * Optional custom id factory for imported items.\n\t *\n\t * Defaults to `createShapeId()`.\n\t */\n\tcreateId?: () => string;\n\t/**\n\t * Vertical gap between stacked PDF pages.\n\t *\n\t * Defaults to `16`, matching the built-in viewport flow.\n\t */\n\tgapWorld?: number;\n\t/**\n\t * Offset step used when placing standalone raster images.\n\t *\n\t * Defaults to `48`, matching the built-in viewport flow.\n\t */\n\tstepWorld?: number;\n\t/**\n\t * PDF rasterization scale forwarded to `pdfjs-dist`.\n\t *\n\t * Defaults to `1.15` to balance first paint latency with zoom quality.\n\t */\n\tpdfScale?: number;\n\tpdfPageConcurrency?: number;\n\t/**\n\t * Called as soon as canvu finishes converting one or more items from the\n\t * source files.\n\t */\n\tonItemsReady?: (\n\t\titems: VectorSceneItem[],\n\t\tcontext: {\n\t\t\tfile: File;\n\t\t\tkind: VectorViewportAssetKind;\n\t\t},\n\t) => void;\n\t/**\n\t * Final hook to customize each created item after canvu attaches its own\n\t * image metadata and any `assetStore.upload(...)` `pluginData`.\n\t */\n\tdecorateItem?: (\n\t\titem: VectorSceneItem,\n\t\tcontext: IngestedAssetItemContext,\n\t) => VectorSceneItem;\n\t/**\n\t * Optional side-channel for per-file errors.\n\t *\n\t * This is useful for toasts or telemetry in addition to reading the returned\n\t * `errors` array.\n\t */\n\tonError?: (error: IngestAssetFileError) => void;\n};\n\n/**\n * Result of {@link ingestAssetFilesToSceneItems}.\n */\nexport type IngestAssetFilesToSceneItemsResult = {\n\titems: VectorSceneItem[];\n\terrors: IngestAssetFileError[];\n};\n\nfunction getAssetKindForFile(file: File): VectorViewportAssetKind | null {\n\tif (file.type === \"application/pdf\") return \"pdf\";\n\tif (file.type.startsWith(\"image/\")) return \"image\";\n\treturn null;\n}\n\nfunction finalizeIngestedItem(\n\titem: VectorSceneItem,\n\tcontext: IngestedAssetItemContext,\n\tuploadResult: VectorViewportAssetUploadResult | null,\n\tdecorateItem: IngestAssetFilesToSceneItemsOptions[\"decorateItem\"] | undefined,\n): VectorSceneItem {\n\tconst itemWithAssetData = applyAssetUploadResultToItem(item, uploadResult);\n\treturn decorateItem ? decorateItem(itemWithAssetData, context) : itemWithAssetData;\n}\n\nasync function uploadAssetIfNeeded(\n\tassetStore: VectorViewportAssetStore | undefined,\n\tfile: File,\n\tkind: VectorViewportAssetKind,\n): Promise<VectorViewportAssetUploadResult | null> {\n\tif (!assetStore) return null;\n\tconst result = await assetStore.upload({ file, kind });\n\treturn result ?? null;\n}\n\n/**\n * Converts browser files into `VectorSceneItem[]` using the same ingestion\n * pipeline as canvu's built-in file flow.\n *\n * Use this for external imports that should behave like the native canvas\n * upload experience without reimplementing PDF rasterization, image storage, or\n * `pluginData` attachment in app code.\n *\n * Do not use this as a persistence layer by itself. It only produces runtime\n * scene items. Persist the resulting snapshot with your existing\n * `useVectorCanvasDocument(...)` adapter or another app-specific document store.\n */\nexport async function ingestAssetFilesToSceneItems(\n\toptions: IngestAssetFilesToSceneItemsOptions,\n): Promise<IngestAssetFilesToSceneItemsResult> {\n\tconst {\n\t\tfiles,\n\t\texistingItems = [],\n\t\tworldCenter,\n\t\tassetStore,\n\t\timageStore = new IndexedDbImageStore(),\n\t\tcreateId = createShapeId,\n\t\tgapWorld = 16,\n\t\tpdfScale = 1.15,\n\t\tpdfPageConcurrency = 2,\n\t\tdecorateItem,\n\t\tonItemsReady,\n\t\tonError,\n\t} = options;\n\n\tconst items: VectorSceneItem[] = [];\n\tconst errors: IngestAssetFileError[] = [];\n\tlet occupiedBottomY: number | null =\n\t\texistingItems.length > 0\n\t\t\t? Math.max(...existingItems.map((item) => item.bounds.y + item.bounds.height))\n\t\t\t: null;\n\n\tfor (const file of files) {\n\t\tconst kind = getAssetKindForFile(file);\n\t\tif (!kind) {\n\t\t\tconst error = {\n\t\t\t\tfile,\n\t\t\t\terror: new Error(`Unsupported asset type: ${file.type || \"unknown\"}`),\n\t\t\t} satisfies IngestAssetFileError;\n\t\t\terrors.push(error);\n\t\t\tonError?.(error);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tif (kind === \"pdf\") {\n\t\t\t\tconst uploadResultPromise = uploadAssetIfNeeded(assetStore, file, kind);\n\t\t\t\tawait loadPdfToStore(file, imageStore, {\n\t\t\t\t\tscale: pdfScale,\n\t\t\t\t\tpageConcurrency: pdfPageConcurrency,\n\t\t\t\t\tstoreThumbnails: false,\n\t\t\t\t\tonPageStored: async (page) => {\n\t\t\t\t\t\tconst uploadResult = await uploadResultPromise;\n\t\t\t\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, page.blobId);\n\t\t\t\t\t\tconst naturalTopY = worldCenter.y - page.height / 2;\n\t\t\t\t\t\tconst stackedTopY: number =\n\t\t\t\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\t\t\t\tconst bounds: {\n\t\t\t\t\t\t\tx: number;\n\t\t\t\t\t\t\ty: number;\n\t\t\t\t\t\t\twidth: number;\n\t\t\t\t\t\t\theight: number;\n\t\t\t\t\t\t} = {\n\t\t\t\t\t\t\tx: worldCenter.x - page.width / 2,\n\t\t\t\t\t\t\ty: Math.max(naturalTopY, stackedTopY),\n\t\t\t\t\t\t\twidth: page.width,\n\t\t\t\t\t\t\theight: page.height,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst itemContext = {\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\titemIndex: items.length,\n\t\t\t\t\t\t\tpageNumber: page.pageNumber,\n\t\t\t\t\t\t} satisfies IngestedAssetItemContext;\n\t\t\t\t\t\tconst item = finalizeIngestedItem(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: createId(),\n\t\t\t\t\t\t\t\tx: bounds.x,\n\t\t\t\t\t\t\t\ty: bounds.y,\n\t\t\t\t\t\t\t\tbounds: { ...bounds },\n\t\t\t\t\t\t\t\ttoolKind: \"image\",\n\t\t\t\t\t\t\t\timageBlobId: page.blobId,\n\t\t\t\t\t\t\t\timageRasterHref: fullUrl ?? undefined,\n\t\t\t\t\t\t\t\timageIntrinsicSize: {\n\t\t\t\t\t\t\t\t\twidth: page.width,\n\t\t\t\t\t\t\t\t\theight: page.height,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tchildrenSvg: fullUrl\n\t\t\t\t\t\t\t\t\t? buildRasterImageChildrenSvg(\n\t\t\t\t\t\t\t\t\t\t\tfullUrl,\n\t\t\t\t\t\t\t\t\t\t\t{ width: page.width, height: page.height },\n\t\t\t\t\t\t\t\t\t\t\tbounds,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t} as VectorSceneItem,\n\t\t\t\t\t\t\titemContext,\n\t\t\t\t\t\t\tuploadResult,\n\t\t\t\t\t\t\tdecorateItem,\n\t\t\t\t\t\t);\n\t\t\t\t\t\titems.push(item);\n\t\t\t\t\t\toccupiedBottomY = bounds.y + page.height;\n\t\t\t\t\t\tonItemsReady?.([item], { file, kind });\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [uploadResult, storedImage] = await Promise.all([\n\t\t\t\tuploadAssetIfNeeded(assetStore, file, kind),\n\t\t\t\tloadImageToStore(file, imageStore),\n\t\t\t]);\n\t\t\tconst { blobId, thumbnailBlobId, width, height } = storedImage;\n\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, blobId);\n\t\t\tconst thumbBlob = await imageStore.getThumbnail(thumbnailBlobId);\n\t\t\tconst thumbnailHref = thumbBlob ? URL.createObjectURL(thumbBlob) : null;\n\t\t\tconst naturalTopY = worldCenter.y - height / 2;\n\t\t\tconst stackedTopY =\n\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\tconst bounds = {\n\t\t\t\tx: worldCenter.x - width / 2,\n\t\t\t\ty: Math.max(naturalTopY, stackedTopY),\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t};\n\t\t\tconst href = thumbnailHref ?? fullUrl ?? \"\";\n\t\t\tconst itemContext = {\n\t\t\t\tfile,\n\t\t\t\tkind,\n\t\t\t\titemIndex: items.length,\n\t\t\t} satisfies IngestedAssetItemContext;\n\t\t\tconst item = finalizeIngestedItem(\n\t\t\t\t{\n\t\t\t\t\tid: createId(),\n\t\t\t\t\tx: bounds.x,\n\t\t\t\t\ty: bounds.y,\n\t\t\t\t\tbounds: { ...bounds },\n\t\t\t\t\ttoolKind: \"image\",\n\t\t\t\t\timageBlobId: blobId,\n\t\t\t\t\timageThumbnailBlobId: thumbnailBlobId,\n\t\t\t\t\timageRasterHref: fullUrl ?? undefined,\n\t\t\t\t\timageThumbnailHref: thumbnailHref ?? undefined,\n\t\t\t\t\timageIntrinsicSize: { width, height },\n\t\t\t\t\tchildrenSvg: buildRasterImageChildrenSvg(href, { width, height }, bounds),\n\t\t\t\t} as VectorSceneItem,\n\t\t\t\titemContext,\n\t\t\t\tuploadResult,\n\t\t\t\tdecorateItem,\n\t\t\t);\n\t\t\titems.push(item);\n\t\t\tonItemsReady?.([item], { file, kind });\n\t\t\toccupiedBottomY =\n\t\t\t\toccupiedBottomY == null\n\t\t\t\t\t? bounds.y + height\n\t\t\t\t\t: Math.max(occupiedBottomY, bounds.y + height);\n\t\t} catch (error) {\n\t\t\tconst fileError = {\n\t\t\t\tfile,\n\t\t\t\tkind,\n\t\t\t\terror,\n\t\t\t} satisfies IngestAssetFileError;\n\t\t\terrors.push(fileError);\n\t\t\tonError?.(fileError);\n\t\t}\n\t}\n\n\treturn {\n\t\titems,\n\t\terrors,\n\t};\n}\n","\"use client\";\n\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Kind of binary selected through the built-in canvu asset ingestion flow.\n *\n * Use this to branch your backend upload logic when images and PDFs should be\n * stored differently.\n */\nexport type VectorViewportAssetKind = \"image\" | \"pdf\";\n\n/**\n * Original browser `File` intercepted from the built-in asset flow.\n *\n * This is the high-level hook for apps that want canvu to keep its native file\n * UX while still uploading the raw binary to their backend or object storage.\n *\n * The same request shape is also reused by\n * {@link ingestAssetFilesToSceneItems}, so custom import flows and the native\n * viewport UX can share one backend contract.\n */\nexport type VectorViewportAssetUploadRequest = {\n\t/** Original browser file before canvu converts it into scene items. */\n\tfile: File;\n\t/** High-level bucket for routing image vs PDF upload behavior. */\n\tkind: VectorViewportAssetKind;\n};\n\n/**\n * Persisted metadata returned by a custom asset upload.\n *\n * The returned `pluginData` is shallow-merged into every `VectorSceneItem`\n * created from the uploaded file, making it available to custom persistence\n * adapters and later hydration flows.\n *\n * @example\n * ```ts\n * const assetStore: VectorViewportAssetStore = {\n * async upload({ file, kind }) {\n * const form = new FormData();\n * form.append(\"file\", file);\n * form.append(\"kind\", kind);\n *\n * const response = await fetch(\"/api/canvu/assets\", {\n * method: \"POST\",\n * body: form,\n * });\n *\n * const asset = await response.json();\n * return {\n * pluginData: {\n * assetId: asset.id,\n * assetKey: asset.key,\n * mimeType: file.type,\n * },\n * };\n * },\n * async resolve({ assetIds }) {\n * const response = await fetch(\"/api/canvu/assets/resolve\", {\n * method: \"POST\",\n * headers: { \"content-type\": \"application/json\" },\n * body: JSON.stringify({ assetIds }),\n * });\n *\n * return response.json();\n * },\n * };\n * ```\n */\nexport type VectorViewportAssetUploadResult = {\n\t/**\n\t * Opaque persisted metadata attached to created items.\n\t *\n\t * Use this for asset ids, bucket keys, original file names, or any backend\n\t * reference needed to rehydrate the binary later from your own persistence\n\t * adapter.\n\t */\n\tpluginData?: VectorSceneItem[\"pluginData\"];\n};\n\n/**\n * Request to resolve persisted asset ids back into runtime URLs.\n *\n * This is useful inside custom persistence adapters when you want to rehydrate\n * signed URLs or CDN URLs after loading a snapshot.\n */\nexport type VectorViewportAssetResolveRequest = {\n\tassetIds: string[];\n};\n\n/**\n * Runtime URL payload returned by a custom asset resolver.\n */\nexport type VectorViewportAssetResolveResult = Record<\n\tstring,\n\t{\n\t\turl: string;\n\t\tthumbnailUrl?: string;\n\t}\n>;\n\nexport type VectorViewportAssetHydrationRequest = {\n\tassetId: string;\n\tkind: VectorViewportAssetKind;\n\tpageNumber?: number;\n\tscale?: number;\n};\n\n/**\n * High-level hook for apps that want to persist raw binaries out-of-band while\n * keeping canvu's built-in file UX.\n *\n * `upload` is used by the built-in file picker / drag-and-drop flow and by\n * {@link ingestAssetFilesToSceneItems}. `resolve` is optional for custom\n * persistence adapters and future hydration flows.\n */\nexport type VectorViewportAssetStore = {\n\tupload: (\n\t\trequest: VectorViewportAssetUploadRequest,\n\t) => Promise<VectorViewportAssetUploadResult | undefined>;\n\tresolve?: (\n\t\trequest: VectorViewportAssetResolveRequest,\n\t) => Promise<VectorViewportAssetResolveResult>;\n\tgetHydrationRequest?: (\n\t\titem: VectorSceneItem,\n\t) => VectorViewportAssetHydrationRequest | null;\n};\n\nexport function applyAssetUploadResultToItem(\n\titem: VectorSceneItem,\n\tresult: VectorViewportAssetUploadResult | null | undefined,\n): VectorSceneItem {\n\tif (!result?.pluginData) return item;\n\treturn {\n\t\t...item,\n\t\tpluginData: {\n\t\t\t...(item.pluginData ?? {}),\n\t\t\t...result.pluginData,\n\t\t},\n\t};\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { Camera2D } from \"../camera/camera\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type CanvuChromeActiveToolStyle = StrokeStyle & {\n\ttoolKind:\n\t\t| \"draw\"\n\t\t| \"marker\"\n\t\t| \"text\"\n\t\t| \"rect\"\n\t\t| \"ellipse\"\n\t\t| \"architectural-cloud\"\n\t\t| \"line\"\n\t\t| \"arrow\";\n\tlabel?: string;\n\t/** Local font size when `toolKind === \"text\"`. */\n\ttextFontSize?: number;\n};\n\nexport type CanvuChromeSelectionStyleChange = (patch: {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: \"solid\" | \"dashed\";\n\ttextFontSize?: number;\n}) => void;\n\n/**\n * Runtime data and handlers shared with floating board chrome (e.g. {@link NavMenu},\n * {@link VectorSelectionInspector}). Populated by `VectorViewport` and consumed via\n * {@link useCanvuChromeContext}.\n */\nexport type CanvuChromeContextValue = {\n\tcamera: Camera2D | null;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\titems: readonly VectorSceneItem[];\n\tselectedItems: readonly VectorSceneItem[];\n\tinteractive: boolean;\n\tcanEditSelection: boolean;\n\tactiveToolStyle: CanvuChromeActiveToolStyle | null;\n\tonSelectionStyleChange: CanvuChromeSelectionStyleChange | null;\n\tzoomPercent: number;\n\tonZoomIn: () => void;\n\tonZoomOut: () => void;\n\tonUndo: () => void;\n\tonRedo: () => void;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tonRequestRender: () => void;\n};\n\nexport const CanvuChromeContext = createContext<CanvuChromeContextValue | null>(\n\tnull,\n);\n\n/** Returns the current chrome context or `null` when used outside `VectorViewport`. */\nexport function useCanvuChromeContext(): CanvuChromeContextValue | null {\n\treturn useContext(CanvuChromeContext);\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 {\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","\"use client\";\n\nimport {\n\tDndContext,\n\ttype DragEndEvent,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors,\n} from \"@dnd-kit/core\";\nimport {\n\tarrayMove,\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n\tChevronRight,\n\tCopy,\n\tGripVertical,\n\tImages,\n\tRotateCw,\n\tTrash2,\n} from \"lucide-react\";\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\nimport {\n\tcopyManagedImage,\n\tdeleteManagedImage,\n\tisManagedImage,\n\treorderManagedImages,\n\trotateManagedImage,\n} from \"../scene/managed-images\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nconst OPEN_KEYFRAME_ID = \"canvu-images-menu-open-keyframe\";\nconst OPEN_KEYFRAME_CSS = `\n@keyframes canvu-images-menu-open {\n\tfrom { opacity: 0; transform: scale(0.6); }\n\tto { opacity: 1; transform: scale(1); }\n}\n`;\n\nfunction ensureOpenKeyframe() {\n\tif (typeof document === \"undefined\") return;\n\tif (document.getElementById(OPEN_KEYFRAME_ID)) return;\n\tconst style = document.createElement(\"style\");\n\tstyle.id = OPEN_KEYFRAME_ID;\n\tstyle.textContent = OPEN_KEYFRAME_CSS;\n\tdocument.head.appendChild(style);\n}\n\nconst panelStyle: CSSProperties = {\n\twidth: \"fit-content\",\n\tmaxHeight: \"min(85dvh, 820px)\",\n\toverflow: \"auto\",\n\tbackgroundColor: \"#ffffff\",\n\tborder: \"1px solid #e2e8f0\",\n\tborderRadius: 10,\n\tboxShadow: \"0 10px 40px rgba(15, 23, 42, 0.12)\",\n\tfontFamily: \"system-ui, sans-serif\",\n\tfontSize: 14,\n\tcolor: \"#0f172a\",\n\ttransformOrigin: \"top right\",\n\tanimation: \"canvu-images-menu-open 180ms cubic-bezier(0.2, 0.8, 0.2, 1)\",\n};\n\nconst headerStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"space-between\",\n\tgap: 8,\n\tpadding: \"8px 8px 8px 14px\",\n\tborderBottom: \"1px solid #e2e8f0\",\n\tfontWeight: 600,\n\tletterSpacing: \"0.02em\",\n};\n\nconst headerTitleStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tgap: 8,\n};\n\nconst countStyle: CSSProperties = {\n\tcolor: \"#64748b\",\n\tfontWeight: 500,\n};\n\nconst listStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tpadding: 8,\n\tgap: 6,\n};\n\nconst rowStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 12,\n\tpadding: \"10px 12px\",\n\tborderRadius: 10,\n};\n\nconst handleStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 28,\n\theight: 128,\n\tborder: \"none\",\n\tbackground: \"transparent\",\n\tcolor: \"#94a3b8\",\n\tcursor: \"grab\",\n\ttouchAction: \"none\",\n\tpadding: 0,\n};\n\nconst thumbBoxStyle: CSSProperties = {\n\twidth: 128,\n\theight: 128,\n\tflex: \"0 0 auto\",\n\toverflow: \"hidden\",\n\tborderRadius: 8,\n\tbackgroundColor: \"#e2e8f0\",\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n};\n\nconst thumbImgStyle: CSSProperties = {\n\twidth: \"100%\",\n\theight: \"100%\",\n\tobjectFit: \"cover\",\n\tdisplay: \"block\",\n};\n\nconst actionsColumnStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tgap: 4,\n};\n\nconst actionButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 32,\n\theight: 32,\n\tborder: \"none\",\n\tborderRadius: 6,\n\tbackground: \"transparent\",\n\tcolor: \"#0f172a\",\n\tcursor: \"pointer\",\n\tpadding: 0,\n};\n\nconst tooltipWrapperStyle: CSSProperties = {\n\tposition: \"relative\",\n\tdisplay: \"inline-flex\",\n};\n\nconst tooltipBubbleStyle: CSSProperties = {\n\tposition: \"absolute\",\n\tright: \"calc(100% + 8px)\",\n\ttop: \"50%\",\n\ttransform: \"translateY(-50%)\",\n\tpadding: \"4px 8px\",\n\tbackgroundColor: \"#0f172a\",\n\tcolor: \"#ffffff\",\n\tfontSize: 11,\n\tfontWeight: 500,\n\tborderRadius: 4,\n\twhiteSpace: \"nowrap\",\n\tpointerEvents: \"none\",\n\tzIndex: 100,\n\tboxShadow: \"0 2px 8px rgba(15, 23, 42, 0.25)\",\n};\n\nconst dangerColor = \"#b91c1c\";\n\nconst collapseButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 32,\n\theight: 32,\n\tborder: \"none\",\n\tborderRadius: 8,\n\tbackground: \"transparent\",\n\tcolor: \"#0f172a\",\n\tcursor: \"pointer\",\n\tpadding: 0,\n};\n\nconst collapsedButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: 44,\n\theight: 44,\n\tpadding: 0,\n\tborder: \"1px solid #e2e8f0\",\n\tborderRadius: 10,\n\tbackground: \"#ffffff\",\n\tcolor: \"#0f172a\",\n\tcursor: \"pointer\",\n\tboxShadow: \"0 8px 24px rgba(15, 23, 42, 0.12)\",\n};\n\nexport type ImagesMenuLabels = {\n\ttitle?: string;\n\tdragHandle?: string;\n\tfocus?: string;\n\tcopy?: string;\n\trotate?: string;\n\tdelete?: string;\n\tcollapse?: string;\n\texpand?: string;\n};\n\nconst defaultLabels: Required<ImagesMenuLabels> = {\n\ttitle: \"Images\",\n\tdragHandle: \"Drag to reorder\",\n\tfocus: \"Focus on canvas\",\n\tcopy: \"Copy\",\n\trotate: \"Rotate\",\n\tdelete: \"Delete\",\n\tcollapse: \"Collapse images menu\",\n\texpand: \"Open images menu\",\n};\n\nexport type ImagesMenuProps = {\n\titems: readonly VectorSceneItem[];\n\tonItemsChange: (items: VectorSceneItem[]) => void;\n\t/**\n\t * Fires when the user clicks an image's thumbnail/label area. Use this to\n\t * pan/zoom the canvas to the item (e.g. `viewportRef.current?.fitWorldRect(item.bounds)`).\n\t */\n\tonFocusItem?: (item: VectorSceneItem) => void;\n\tlabels?: ImagesMenuLabels;\n\t/**\n\t * Whether the menu starts expanded. Defaults to `false` (collapsed), showing\n\t * only the floating toggle button until the user opens it.\n\t */\n\tdefaultOpen?: boolean;\n};\n\n/**\n * Floating side panel that lists images marked as \"managed\"\n * (via `pluginData.managed === true`) and offers copy, rotate, delete, and\n * drag-to-reorder actions. Managed images are also `locked`, so they do not\n * respond to direct canvas interaction.\n */\nexport function ImagesMenu({\n\titems,\n\tonItemsChange,\n\tonFocusItem,\n\tlabels,\n\tdefaultOpen = false,\n}: ImagesMenuProps) {\n\tconst managed = useMemo(() => items.filter(isManagedImage), [items]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: { distance: 4 },\n\t\t}),\n\t);\n\tconst [collapsed, setCollapsed] = useState(!defaultOpen);\n\n\tuseEffect(() => {\n\t\tensureOpenKeyframe();\n\t}, []);\n\n\tif (managed.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst resolvedLabels = { ...defaultLabels, ...labels };\n\n\tif (collapsed) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdata-slot=\"images-menu-collapsed\"\n\t\t\t\tstyle={collapsedButtonStyle}\n\t\t\t\taria-label={resolvedLabels.expand}\n\t\t\t\ttitle={resolvedLabels.expand}\n\t\t\t\tonClick={() => setCollapsed(false)}\n\t\t\t>\n\t\t\t\t<Images size={20} />\n\t\t\t</button>\n\t\t);\n\t}\n\n\tconst onDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event;\n\t\tif (!over || active.id === over.id) return;\n\t\tconst oldIndex = managed.findIndex((i) => i.id === active.id);\n\t\tconst newIndex = managed.findIndex((i) => i.id === over.id);\n\t\tif (oldIndex < 0 || newIndex < 0) return;\n\t\tconst reorderedManaged = arrayMove(managed, oldIndex, newIndex);\n\t\tconst orderedIds = reorderedManaged.map((i) => i.id);\n\t\tonItemsChange(reorderManagedImages(items, orderedIds));\n\t};\n\n\treturn (\n\t\t<section\n\t\t\tdata-slot=\"images-menu\"\n\t\t\tstyle={panelStyle}\n\t\t\taria-label={resolvedLabels.title}\n\t\t>\n\t\t\t<div style={headerStyle}>\n\t\t\t\t<span style={headerTitleStyle}>\n\t\t\t\t\t<span>{resolvedLabels.title}</span>\n\t\t\t\t\t<span style={countStyle}>{managed.length}</span>\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={collapseButtonStyle}\n\t\t\t\t\taria-label={resolvedLabels.collapse}\n\t\t\t\t\ttitle={resolvedLabels.collapse}\n\t\t\t\t\tonClick={() => setCollapsed(true)}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight size={20} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<DndContext sensors={sensors} onDragEnd={onDragEnd}>\n\t\t\t\t<SortableContext\n\t\t\t\t\titems={managed.map((i) => i.id)}\n\t\t\t\t\tstrategy={verticalListSortingStrategy}\n\t\t\t\t>\n\t\t\t\t\t<div style={listStyle}>\n\t\t\t\t\t\t{managed.map((item) => (\n\t\t\t\t\t\t\t<ImagesMenuRow\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\tlabels={resolvedLabels}\n\t\t\t\t\t\t\t\tonFocus={onFocusItem ? () => onFocusItem(item) : undefined}\n\t\t\t\t\t\t\t\tonCopy={() => onItemsChange(copyManagedImage(items, item.id))}\n\t\t\t\t\t\t\t\tonRotate={() => onItemsChange(rotateManagedImage(items, item.id))}\n\t\t\t\t\t\t\t\tonDelete={() => onItemsChange(deleteManagedImage(items, item.id))}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\t\t\t</DndContext>\n\t\t</section>\n\t);\n}\n\ntype ImagesMenuRowProps = {\n\titem: VectorSceneItem;\n\tlabels: Required<ImagesMenuLabels>;\n\tonFocus?: () => void;\n\tonCopy: () => void;\n\tonRotate: () => void;\n\tonDelete: () => void;\n};\n\nfunction ImagesMenuRow({\n\titem,\n\tlabels,\n\tonFocus,\n\tonCopy,\n\tonRotate,\n\tonDelete,\n}: ImagesMenuRowProps) {\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({ id: item.id });\n\n\tconst feedbackTransition = \"background-color 140ms ease, opacity 140ms ease\";\n\tconst wrapperStyle: CSSProperties = {\n\t\t...rowStyle,\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition: transition\n\t\t\t? `${transition}, ${feedbackTransition}`\n\t\t\t: feedbackTransition,\n\t\tbackground: isDragging ? \"#eef2f7\" : \"transparent\",\n\t\topacity: isDragging ? 0.85 : 1,\n\t};\n\n\tconst src = item.imageThumbnailHref ?? item.imageRasterHref ?? \"\";\n\n\treturn (\n\t\t<div ref={setNodeRef} style={wrapperStyle}>\n\t\t\t<button\n\t\t\t\tref={setActivatorNodeRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={handleStyle}\n\t\t\t\taria-label={labels.dragHandle}\n\t\t\t\ttitle={labels.dragHandle}\n\t\t\t\t{...attributes}\n\t\t\t\t{...listeners}\n\t\t\t>\n\t\t\t\t<GripVertical size={18} />\n\t\t\t</button>\n\t\t\t<FocusTarget label={labels.focus} onFocus={onFocus}>\n\t\t\t\t<div style={thumbBoxStyle}>\n\t\t\t\t\t{src ? (\n\t\t\t\t\t\t<img src={src} alt=\"\" style={thumbImgStyle} draggable={false} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</FocusTarget>\n\t\t\t<div style={actionsColumnStyle}>\n\t\t\t\t<ImagesMenuAction label={labels.copy} onClick={onCopy}>\n\t\t\t\t\t<Copy size={18} />\n\t\t\t\t</ImagesMenuAction>\n\t\t\t\t<ImagesMenuAction label={labels.rotate} onClick={onRotate}>\n\t\t\t\t\t<RotateCw size={18} />\n\t\t\t\t</ImagesMenuAction>\n\t\t\t\t<ImagesMenuAction label={labels.delete} onClick={onDelete} danger>\n\t\t\t\t\t<Trash2 size={18} />\n\t\t\t\t</ImagesMenuAction>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nconst focusTargetBaseStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tflex: \"0 0 auto\",\n\tpadding: 0,\n\tborder: \"none\",\n\tbackground: \"transparent\",\n\ttextAlign: \"left\",\n\tcolor: \"inherit\",\n\tfont: \"inherit\",\n};\n\ntype FocusTargetProps = {\n\tlabel: string;\n\tonFocus?: () => void;\n\tchildren: ReactNode;\n};\n\nfunction FocusTarget({ label, onFocus, children }: FocusTargetProps) {\n\tif (!onFocus) {\n\t\treturn (\n\t\t\t<div style={{ ...focusTargetBaseStyle, cursor: \"default\" }}>{children}</div>\n\t\t);\n\t}\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tstyle={{ ...focusTargetBaseStyle, cursor: \"pointer\" }}\n\t\t\taria-label={label}\n\t\t\ttitle={label}\n\t\t\tonClick={onFocus}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\ntype ImagesMenuActionProps = {\n\tlabel: string;\n\tonClick: () => void;\n\tdanger?: boolean;\n\tchildren: ReactNode;\n};\n\nfunction ImagesMenuAction({\n\tlabel,\n\tonClick,\n\tdanger,\n\tchildren,\n}: ImagesMenuActionProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst style: CSSProperties = {\n\t\t...actionButtonStyle,\n\t\tcolor: danger ? dangerColor : actionButtonStyle.color,\n\t};\n\treturn (\n\t\t<span style={tooltipWrapperStyle}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={style}\n\t\t\t\taria-label={label}\n\t\t\t\tonClick={onClick}\n\t\t\t\tonMouseEnter={() => setOpen(true)}\n\t\t\t\tonMouseLeave={() => setOpen(false)}\n\t\t\t\tonFocus={() => setOpen(true)}\n\t\t\t\tonBlur={() => setOpen(false)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</button>\n\t\t\t{open ? (\n\t\t\t\t<span role=\"tooltip\" style={tooltipBubbleStyle}>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Anchor presets for floating board components.\n *\n * Names are `<edge>-<position-along-edge>`:\n * - `top-*` / `bottom-*` anchor to the top or bottom edge.\n * - `left-*` / `right-*` anchor to the left or right edge.\n *\n * Corner aliases are equivalent (e.g. `top-left` and `left-top` resolve to the same anchor),\n * but kept distinct so callers can pick whichever reads best in their layout (a vertical\n * strip might prefer `left-top`; a horizontal strip prefers `top-left`).\n */\nexport type BoardComponentPosition =\n\t| \"top-left\"\n\t| \"top-center\"\n\t| \"top-right\"\n\t| \"bottom-left\"\n\t| \"bottom-center\"\n\t| \"bottom-right\"\n\t| \"left-top\"\n\t| \"left-center\"\n\t| \"left-bottom\"\n\t| \"right-top\"\n\t| \"right-center\"\n\t| \"right-bottom\"\n\t| \"center\"\n\t| \"fill\";\n\n/** @deprecated Use {@link BoardComponentPosition}. */\nexport type VectorCanvasSpacePosition = BoardComponentPosition;\n\n/**\n * Compute absolute-position CSS for a board component anchor preset.\n * Returns `position`, `zIndex`, and the relevant edge offsets / transforms.\n * Callers merge the result with their own style/className overrides.\n */\nexport function getBoardPositionStyle(\n\tposition: BoardComponentPosition,\n\tinset = 12,\n\tzIndex = 40,\n): CSSProperties {\n\tconst base: CSSProperties = { position: \"absolute\", zIndex };\n\tswitch (position) {\n\t\tcase \"fill\":\n\t\t\treturn { ...base, inset };\n\t\tcase \"top-left\":\n\t\tcase \"left-top\":\n\t\t\treturn { ...base, top: inset, left: inset };\n\t\tcase \"top-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttop: inset,\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t};\n\t\tcase \"top-right\":\n\t\tcase \"right-top\":\n\t\t\treturn { ...base, top: inset, right: inset };\n\t\tcase \"bottom-left\":\n\t\tcase \"left-bottom\":\n\t\t\treturn { ...base, bottom: inset, left: inset };\n\t\tcase \"bottom-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tbottom: inset,\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t};\n\t\tcase \"bottom-right\":\n\t\tcase \"right-bottom\":\n\t\t\treturn { ...base, bottom: inset, right: inset };\n\t\tcase \"left-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tleft: inset,\n\t\t\t\ttop: \"50%\",\n\t\t\t\ttransform: \"translateY(-50%)\",\n\t\t\t};\n\t\tcase \"right-center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tright: inset,\n\t\t\t\ttop: \"50%\",\n\t\t\t\ttransform: \"translateY(-50%)\",\n\t\t\t};\n\t\tcase \"center\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttop: \"50%\",\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: \"translate(-50%, -50%)\",\n\t\t\t};\n\t\tdefault:\n\t\t\treturn base;\n\t}\n}\n","\"use client\";\n\nimport { useCallback, useContext, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { Camera2D } from \"../../camera/camera\";\nimport { boundsAabbForRotatedItem } from \"../../math/item-transform\";\nimport type { Rect } from \"../../math/rect\";\nimport { normalizeRect } from \"../../math/rect\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport { useCanvuChromeContext } from \"../chrome-context\";\nimport {\n\tBG,\n\tBORDER_COLOR,\n\tBORDER_RADIUS,\n\tchevronBtnStyle,\n\tNavMenuMinimapSlotContext,\n\tnoop,\n\tpreventMouseDefault,\n} from \"./shared\";\n\nconst MINIMAP_W = 180;\nconst MINIMAP_H = 120;\nconst PADDING = 12;\nconst ITEM_FILL = \"rgba(0,0,0,0.08)\";\nconst ITEM_STROKE = \"rgba(0,0,0,0.15)\";\nconst VIEWPORT_FILL = \"rgba(59,130,246,0.08)\";\nconst VIEWPORT_STROKE = \"#3b82f6\";\n\nexport type NavMenuMinimapProps = {\n\tclassName?: string;\n\t/** @default false */\n\tdefaultExpanded?: boolean;\n\tcamera?: Camera2D;\n\tviewportWidth?: number;\n\tviewportHeight?: number;\n\titems?: readonly VectorSceneItem[];\n\tonRequestRender?: () => void;\n};\n\n/**\n * Chevron toggle plus the expandable minimap panel.\n *\n * The toggle button renders inline in the nav-menu strip; the SVG panel is portaled into a slot\n * NavMenu provides below the strip. With a bottom-anchored NavMenu, expanding pushes the strip\n * up to make room — matching the original `<NavMenu />` behaviour.\n */\nexport function NavMenuMinimap({\n\tclassName,\n\tdefaultExpanded = false,\n\tcamera: cameraProp,\n\tviewportWidth: viewportWidthProp,\n\tviewportHeight: viewportHeightProp,\n\titems: itemsProp,\n\tonRequestRender: onRequestRenderProp,\n}: NavMenuMinimapProps = {}) {\n\tconst ctx = useCanvuChromeContext();\n\tconst camera = cameraProp ?? ctx?.camera ?? null;\n\tconst viewportWidth = viewportWidthProp ?? ctx?.viewportWidth ?? 0;\n\tconst viewportHeight = viewportHeightProp ?? ctx?.viewportHeight ?? 0;\n\tconst items = itemsProp ?? ctx?.items ?? [];\n\tconst onRequestRender = onRequestRenderProp ?? ctx?.onRequestRender ?? noop;\n\tconst slotEl = useContext(NavMenuMinimapSlotContext);\n\n\tconst [expanded, setExpanded] = useState(defaultExpanded);\n\tconst svgRef = useRef<SVGSVGElement>(null);\n\tconst [dragging, setDragging] = useState(false);\n\tconst [mouseDown, setMouseDown] = useState(false);\n\n\tconst worldBounds = computeWorldBounds(items);\n\tconst isEmpty = worldBounds.width <= 0 || worldBounds.height <= 0;\n\n\tconst scale = Math.min(\n\t\t(MINIMAP_W - PADDING * 2) / Math.max(worldBounds.width, 1),\n\t\t(MINIMAP_H - PADDING * 2) / Math.max(worldBounds.height, 1),\n\t);\n\tconst originX = worldBounds.x;\n\tconst originY = worldBounds.y;\n\n\tconst toMinimapX = (wx: number) => (wx - originX) * scale + PADDING;\n\tconst toMinimapY = (wy: number) => (wy - originY) * scale + PADDING;\n\tconst toMinimapW = (ww: number) => ww * scale;\n\tconst toMinimapH = (wh: number) => wh * scale;\n\n\tconst viewportWorld = camera\n\t\t? camera.getVisibleWorldRect(viewportWidth, viewportHeight)\n\t\t: { x: 0, y: 0, width: 0, height: 0 };\n\tconst vpMinimap = {\n\t\tx: toMinimapX(viewportWorld.x),\n\t\ty: toMinimapY(viewportWorld.y),\n\t\twidth: toMinimapW(viewportWorld.width),\n\t\theight: toMinimapH(viewportWorld.height),\n\t};\n\n\tconst worldFromMinimap = useCallback(\n\t\t(mx: number, my: number) => ({\n\t\t\tworldX: (mx - PADDING) / scale + originX,\n\t\t\tworldY: (my - PADDING) / scale + originY,\n\t\t}),\n\t\t[scale, originX, originY],\n\t);\n\n\tconst panTo = useCallback(\n\t\t(mx: number, my: number) => {\n\t\t\tif (!camera) return;\n\t\t\tconst { worldX, worldY } = worldFromMinimap(mx, my);\n\t\t\tcamera.x = viewportWidth / 2 - worldX * camera.zoom;\n\t\t\tcamera.y = viewportHeight / 2 - worldY * camera.zoom;\n\t\t\tonRequestRender();\n\t\t},\n\t\t[worldFromMinimap, camera, viewportWidth, viewportHeight, onRequestRender],\n\t);\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (isEmpty) return;\n\t\t\tsetDragging(true);\n\t\t\tsetMouseDown(true);\n\t\t\tconst rect = svgRef.current?.getBoundingClientRect();\n\t\t\tif (!rect) return;\n\t\t\tpanTo(e.clientX - rect.left, e.clientY - rect.top);\n\t\t\tsvgRef.current?.setPointerCapture(e.pointerId);\n\t\t},\n\t\t[isEmpty, panTo],\n\t);\n\n\tconst handlePointerMove = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tif (!mouseDown || isEmpty) return;\n\t\t\tconst rect = svgRef.current?.getBoundingClientRect();\n\t\t\tif (!rect) return;\n\t\t\tpanTo(e.clientX - rect.left, e.clientY - rect.top);\n\t\t},\n\t\t[mouseDown, isEmpty, panTo],\n\t);\n\n\tconst handlePointerUp = useCallback(() => {\n\t\tsetDragging(false);\n\t\tsetMouseDown(false);\n\t}, []);\n\n\tconst toggleExpanded = useCallback(() => {\n\t\tsetExpanded((v) => !v);\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={chevronBtnStyle}\n\t\t\t\taria-label={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\ttitle={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\taria-expanded={expanded}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={toggleExpanded}\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\twidth=\"12\"\n\t\t\t\t\theight=\"12\"\n\t\t\t\t\tviewBox=\"0 0 12 12\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\ttransform: expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n\t\t\t\t\t\ttransition: \"transform 0.15s ease\",\n\t\t\t\t\t}}\n\t\t\t\t\taria-hidden\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M2 4 L6 8 L10 4\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{expanded && slotEl\n\t\t\t\t? createPortal(\n\t\t\t\t\t\t<nav aria-label=\"Minimap\" style={{ pointerEvents: \"auto\" }}>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\tref={svgRef}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: MINIMAP_W,\n\t\t\t\t\t\t\t\t\theight: MINIMAP_H,\n\t\t\t\t\t\t\t\t\tborderRadius: BORDER_RADIUS,\n\t\t\t\t\t\t\t\t\tborder: `1px solid ${BORDER_COLOR}`,\n\t\t\t\t\t\t\t\t\tbackground: BG,\n\t\t\t\t\t\t\t\t\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\t\t\t\t\t\t\t\t\tcursor: isEmpty ? \"default\" : dragging ? \"grabbing\" : \"grab\",\n\t\t\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\t\t\t\tonPointerMove={handlePointerMove}\n\t\t\t\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\t\t\t\tonPointerCancel={handlePointerUp}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isEmpty ? null : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{items.map((it) => {\n\t\t\t\t\t\t\t\t\t\t\tconst b = normalizeRect(boundsAabbForRotatedItem(it));\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={it.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tx={toMinimapX(b.x)}\n\t\t\t\t\t\t\t\t\t\t\t\t\ty={toMinimapY(b.y)}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={toMinimapW(b.width)}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={toMinimapH(b.height)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill={ITEM_FILL}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke={ITEM_STROKE}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={0.5}\n\t\t\t\t\t\t\t\t\t\t\t\t\trx={1}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\tx={vpMinimap.x}\n\t\t\t\t\t\t\t\t\t\t\ty={vpMinimap.y}\n\t\t\t\t\t\t\t\t\t\t\twidth={vpMinimap.width}\n\t\t\t\t\t\t\t\t\t\t\theight={vpMinimap.height}\n\t\t\t\t\t\t\t\t\t\t\tfill={VIEWPORT_FILL}\n\t\t\t\t\t\t\t\t\t\t\tstroke={VIEWPORT_STROKE}\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\t\t\trx={2}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</nav>,\n\t\t\t\t\t\tslotEl,\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</>\n\t);\n}\n\nfunction computeWorldBounds(items: readonly VectorSceneItem[]): Rect {\n\tif (items.length === 0) {\n\t\treturn { x: 0, y: 0, width: 0, height: 0 };\n\t}\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const it of items) {\n\t\tconst b = boundsAabbForRotatedItem(it);\n\t\tminX = Math.min(minX, b.x);\n\t\tminY = Math.min(minY, b.y);\n\t\tmaxX = Math.max(maxX, b.x + b.width);\n\t\tmaxY = Math.max(maxY, b.y + b.height);\n\t}\n\tconst pad = Math.max((maxX - minX) * 0.1, (maxY - minY) * 0.1, 40);\n\treturn {\n\t\tx: minX - pad,\n\t\ty: minY - pad,\n\t\twidth: maxX - minX + pad * 2,\n\t\theight: maxY - minY + pad * 2,\n\t};\n}\n","import { type CSSProperties, createContext } from \"react\";\n\n/**\n * Internal: the main `NavMenu` shell places a sibling DOM node below the strip.\n * `NavMenuMinimap` portals its expanded SVG panel into that node so the strip\n * grows upward (when bottom-anchored) instead of getting clipped off the viewport.\n */\nexport const NavMenuMinimapSlotContext = createContext<HTMLDivElement | null>(null);\n\nexport function noop() {}\n\n/**\n * Block the default mousedown-induced focus shift so the surrounding viewport\n * keeps focus while the user clicks a control. No-op for touch / pen.\n */\nexport function preventMouseDefault(e: React.PointerEvent) {\n\tif (e.pointerType === \"mouse\") {\n\t\te.preventDefault();\n\t}\n}\n\n/** Shell colors shared by every panel rendered inside the nav menu. */\nexport const BG = \"#ffffff\";\nexport const BORDER_COLOR = \"rgba(0,0,0,0.12)\";\nexport const BORDER_RADIUS = 8;\n\n/** Square buttons inside the strip (zoom in/out). */\nexport const btnStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\twidth: 36,\n\theight: 36,\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tcursor: \"pointer\",\n\tfontSize: 18,\n\tlineHeight: 1,\n\tcolor: \"#18181b\",\n\tpadding: 0,\n\tborder: \"none\",\n\toutline: \"none\",\n\tbackground: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\n/** Narrow icon-only buttons (chevron toggle for the minimap). */\nexport const chevronBtnStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\twidth: 24,\n\theight: 36,\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tcursor: \"pointer\",\n\tfontSize: 12,\n\tlineHeight: 1,\n\tcolor: \"#52525b\",\n\tpadding: 0,\n\tborder: \"none\",\n\toutline: \"none\",\n\tbackground: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\n/** Slightly wider variant for undo/redo. */\nexport const undoBtnStyle: CSSProperties = {\n\t...chevronBtnStyle,\n\twidth: 30,\n\topacity: 1,\n\tcolor: \"#18181b\",\n};\n\n/** Zoom percentage label between the zoom-out and zoom-in buttons. */\nexport const labelStyle: CSSProperties = {\n\tfontSize: 10,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\ttextAlign: \"center\",\n\tuserSelect: \"none\",\n\tpadding: \"2px 0\",\n};\n\n/** Outer fieldset layout (column, so portaled minimap stacks below the strip). */\nexport const panelLayoutStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\talignItems: \"flex-start\",\n\tgap: 4,\n\ttouchAction: \"none\",\n\tpointerEvents: \"none\",\n\tuserSelect: \"none\",\n};\n\n/** Inner row containing zoom controls / undo / redo / chevron. */\nexport const innerStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\tdisplay: \"flex\",\n\tflexDirection: \"row\",\n\talignItems: \"center\",\n\tgap: 4,\n\tbackground: BG,\n\tborderRadius: BORDER_RADIUS,\n\tborder: `1px solid ${BORDER_COLOR}`,\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tpadding: 4,\n};\n\n/** Portal target div: `display: contents` so it adds no flex gap when empty. */\nexport const minimapSlotStyle: CSSProperties = {\n\tdisplay: \"contents\",\n};\n","\"use client\";\n\nimport { Redo2, Undo2 } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useCanvuChromeContext } from \"../chrome-context\";\nimport { noop, preventMouseDefault, undoBtnStyle } from \"./shared\";\n\nexport type NavMenuUndoRedoProps = {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tonUndo?: () => void;\n\tonRedo?: () => void;\n\tcanUndo?: boolean;\n\tcanRedo?: boolean;\n};\n\n/** Undo + Redo buttons, gated by `canUndo` / `canRedo`. */\nexport function NavMenuUndoRedo({\n\tclassName,\n\tstyle,\n\tonUndo: onUndoProp,\n\tonRedo: onRedoProp,\n\tcanUndo: canUndoProp,\n\tcanRedo: canRedoProp,\n}: NavMenuUndoRedoProps = {}) {\n\tconst ctx = useCanvuChromeContext();\n\tconst onUndo = onUndoProp ?? ctx?.onUndo ?? noop;\n\tconst onRedo = onRedoProp ?? ctx?.onRedo ?? noop;\n\tconst canUndo = canUndoProp ?? ctx?.canUndo ?? false;\n\tconst canRedo = canRedoProp ?? ctx?.canRedo ?? false;\n\n\treturn (\n\t\t<span\n\t\t\tclassName={className}\n\t\t\tstyle={{ display: \"inline-flex\", alignItems: \"center\", ...style }}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\taria-label=\"Undo\"\n\t\t\t\ttitle=\"Undo\"\n\t\t\t\tdisabled={!canUndo}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onUndo}\n\t\t\t>\n\t\t\t\t<Undo2 size={16} />\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\taria-label=\"Redo\"\n\t\t\t\ttitle=\"Redo\"\n\t\t\t\tdisabled={!canRedo}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onRedo}\n\t\t\t>\n\t\t\t\t<Redo2 size={16} />\n\t\t\t</button>\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport { useCanvuChromeContext } from \"../chrome-context\";\nimport { btnStyle, labelStyle, noop, preventMouseDefault } from \"./shared\";\n\nexport type NavMenuZoomControlsProps = {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tzoomPercent?: number;\n\tonZoomIn?: () => void;\n\tonZoomOut?: () => void;\n};\n\n/** Zoom-out button, percentage label, and zoom-in button. */\nexport function NavMenuZoomControls({\n\tclassName,\n\tstyle,\n\tzoomPercent: zoomPercentProp,\n\tonZoomIn: onZoomInProp,\n\tonZoomOut: onZoomOutProp,\n}: NavMenuZoomControlsProps = {}) {\n\tconst ctx = useCanvuChromeContext();\n\tconst zoomPercent = zoomPercentProp ?? ctx?.zoomPercent ?? 100;\n\tconst onZoomIn = onZoomInProp ?? ctx?.onZoomIn ?? noop;\n\tconst onZoomOut = onZoomOutProp ?? ctx?.onZoomOut ?? noop;\n\n\treturn (\n\t\t<span\n\t\t\tclassName={className}\n\t\t\tstyle={{ display: \"inline-flex\", alignItems: \"center\", ...style }}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={btnStyle}\n\t\t\t\taria-label=\"Zoom out\"\n\t\t\t\ttitle=\"Zoom out\"\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onZoomOut}\n\t\t\t>\n\t\t\t\t−\n\t\t\t</button>\n\t\t\t<span style={labelStyle} aria-hidden>\n\t\t\t\t{zoomPercent}%\n\t\t\t</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tstyle={btnStyle}\n\t\t\t\taria-label=\"Zoom in\"\n\t\t\t\ttitle=\"Zoom in\"\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={onZoomIn}\n\t\t\t>\n\t\t\t\t+\n\t\t\t</button>\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport {\n\ttype CSSProperties,\n\ttype ReactElement,\n\ttype ReactNode,\n\tuseState,\n} from \"react\";\nimport type { Camera2D } from \"../../camera/camera\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"../board-position\";\nimport { NavMenuMinimap } from \"./minimap\";\nimport {\n\tinnerStyle,\n\tminimapSlotStyle,\n\tNavMenuMinimapSlotContext,\n\tpanelLayoutStyle,\n} from \"./shared\";\nimport { NavMenuUndoRedo } from \"./undo-redo\";\nimport { NavMenuZoomControls } from \"./zoom-controls\";\n\nexport { NavMenuMinimap, type NavMenuMinimapProps } from \"./minimap\";\nexport { NavMenuUndoRedo, type NavMenuUndoRedoProps } from \"./undo-redo\";\nexport {\n\tNavMenuZoomControls,\n\ttype NavMenuZoomControlsProps,\n} from \"./zoom-controls\";\n\n/**\n * Floating bottom-bar combining zoom controls, undo/redo, and an expandable minimap.\n *\n * Two rendering modes:\n * - **Default** (no `children`): renders all three feature groups using `props` ?? context values.\n * - **Composable** (JSX `children`): pick which features to render\n * (e.g. `<NavMenu.UndoRedo />`, `<NavMenu.Minimap />`). Each subcomponent reads its data from\n * {@link CanvuChromeContext} unless its own override props are supplied.\n */\nexport type NavMenuProps = {\n\tcamera?: Camera2D;\n\tviewportWidth?: number;\n\tviewportHeight?: number;\n\titems?: readonly VectorSceneItem[];\n\tzoomPercent?: number;\n\tonZoomIn?: () => void;\n\tonZoomOut?: () => void;\n\tonUndo?: () => void;\n\tonRedo?: () => void;\n\tcanUndo?: boolean;\n\tcanRedo?: boolean;\n\tonRequestRender?: () => void;\n\t/** Anchor preset. Defaults to bottom-left. */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from anchored edges. @default 12 */\n\tinset?: number;\n\t/** @default 23 */\n\tzIndex?: number;\n\tclassName?: string;\n\t/** Merged on top of position-derived styles for custom tweaks. */\n\tstyle?: CSSProperties;\n\t/**\n\t * Composable contents. When omitted, renders the default trio\n\t * (`NavMenu.ZoomControls`, `NavMenu.UndoRedo`, `NavMenu.Minimap`).\n\t */\n\tchildren?: ReactNode;\n};\n\n/**\n * @example\n * ```tsx\n * // Default — renders zoom, undo/redo, and minimap.\n * <NavMenu />\n *\n * // Composable — keep only the parts you want.\n * <NavMenu>\n * <NavMenu.UndoRedo />\n * <NavMenu.Minimap />\n * </NavMenu>\n * ```\n */\nfunction NavMenuComponent({\n\tcamera: cameraProp,\n\tviewportWidth: viewportWidthProp,\n\tviewportHeight: viewportHeightProp,\n\titems: itemsProp,\n\tzoomPercent: zoomPercentProp,\n\tonZoomIn: onZoomInProp,\n\tonZoomOut: onZoomOutProp,\n\tonUndo: onUndoProp,\n\tonRedo: onRedoProp,\n\tcanUndo: canUndoProp,\n\tcanRedo: canRedoProp,\n\tonRequestRender: onRequestRenderProp,\n\tposition = \"bottom-left\",\n\tinset = 12,\n\tzIndex = 23,\n\tclassName,\n\tstyle,\n\tchildren,\n}: NavMenuProps) {\n\tconst [slotEl, setSlotEl] = useState<HTMLDivElement | null>(null);\n\tconst anchorStyle = getBoardPositionStyle(position, inset, zIndex);\n\treturn (\n\t\t<fieldset\n\t\t\tdata-slot=\"canvu-nav-menu\"\n\t\t\tdata-position={position}\n\t\t\tclassName={className}\n\t\t\tstyle={{\n\t\t\t\t...anchorStyle,\n\t\t\t\t...panelLayoutStyle,\n\t\t\t\tborder: \"none\",\n\t\t\t\tmargin: 0,\n\t\t\t\tpadding: 0,\n\t\t\t\tminWidth: 0,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\taria-label=\"Zoom and minimap controls\"\n\t\t>\n\t\t\t<NavMenuMinimapSlotContext.Provider value={slotEl}>\n\t\t\t\t<div style={innerStyle}>\n\t\t\t\t\t{children ?? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<NavMenuZoomControls\n\t\t\t\t\t\t\t\tzoomPercent={zoomPercentProp}\n\t\t\t\t\t\t\t\tonZoomIn={onZoomInProp}\n\t\t\t\t\t\t\t\tonZoomOut={onZoomOutProp}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<NavMenuUndoRedo\n\t\t\t\t\t\t\t\tonUndo={onUndoProp}\n\t\t\t\t\t\t\t\tonRedo={onRedoProp}\n\t\t\t\t\t\t\t\tcanUndo={canUndoProp}\n\t\t\t\t\t\t\t\tcanRedo={canRedoProp}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<NavMenuMinimap\n\t\t\t\t\t\t\t\tcamera={cameraProp}\n\t\t\t\t\t\t\t\tviewportWidth={viewportWidthProp}\n\t\t\t\t\t\t\t\tviewportHeight={viewportHeightProp}\n\t\t\t\t\t\t\t\titems={itemsProp}\n\t\t\t\t\t\t\t\tonRequestRender={onRequestRenderProp}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div ref={setSlotEl} style={minimapSlotStyle} />\n\t\t\t</NavMenuMinimapSlotContext.Provider>\n\t\t</fieldset>\n\t);\n}\nNavMenuComponent.displayName = \"NavMenu\";\n\ntype NavMenuWithStatics = ((props: NavMenuProps) => ReactElement) & {\n\tZoomControls: typeof NavMenuZoomControls;\n\tUndoRedo: typeof NavMenuUndoRedo;\n\tMinimap: typeof NavMenuMinimap;\n};\n\n/**\n * `NavMenu` is a function component with attached subcomponents\n * (`NavMenu.ZoomControls`, `NavMenu.UndoRedo`, `NavMenu.Minimap`).\n *\n * The explicit type annotation is what makes the static properties survive\n * `.d.ts` bundling — relying on TypeScript's expando-function inference loses\n * them in tsup output.\n */\nexport const NavMenu: NavMenuWithStatics = Object.assign(NavMenuComponent, {\n\tZoomControls: NavMenuZoomControls,\n\tUndoRedo: NavMenuUndoRedo,\n\tMinimap: NavMenuMinimap,\n});\n","import {\n\tcreateBlobUrlFromStore,\n\tcreateThumbnailBlobUrlFromStore,\n\tIndexedDbImageStore,\n} from \"../../image/indexed-db-image-store\";\nimport { rebuildItemSvg } from \"../../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport type { VectorCanvasPersistenceAdapter, VectorCanvasSnapshot } from \"./types\";\n\nconst DOCUMENT_STORE = \"document\";\nconst DOCUMENT_KEY = \"main\";\n\nfunction openDocumentDb(dbName: string): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(dbName, 1);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(DOCUMENT_STORE)) {\n\t\t\t\tdb.createObjectStore(DOCUMENT_STORE);\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\n/**\n * Persistence adapter that stores the document JSON in IndexedDB and manages\n * image blobs separately. Images are stored at original resolution in a dedicated\n * `images` object store via {@link IndexedDbImageStore}, keeping the document JSON\n * lightweight and enabling full-resolution zoom without blur.\n *\n * On load, blob URLs are created from the stored blobs and `childrenSvg` is\n * rebuilt for each image item. Blob URLs are session-scoped and revoked on\n * subsequent saves / cleanup.\n */\nexport function createIndexedDbPersistenceAdapter(\n\toptions: { dbName?: string } = {},\n): VectorCanvasPersistenceAdapter {\n\tconst dbName = options.dbName ?? \"canvu-document\";\n\tconst imageStore = new IndexedDbImageStore();\n\tlet documentDbPromise: Promise<IDBDatabase> | null = null;\n\n\tfunction getDocDb(): Promise<IDBDatabase> {\n\t\tif (!documentDbPromise) {\n\t\t\tdocumentDbPromise = openDocumentDb(dbName);\n\t\t}\n\t\treturn documentDbPromise;\n\t}\n\n\tasync function getFromDocDb<T>(key: string): Promise<T | undefined> {\n\t\tconst db = await getDocDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DOCUMENT_STORE, \"readonly\");\n\t\t\tconst req = tx.objectStore(DOCUMENT_STORE).get(key);\n\t\t\treq.onsuccess = () => resolve(req.result as T | undefined);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync function putInDocDb(key: string, value: unknown): Promise<void> {\n\t\tconst db = await getDocDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DOCUMENT_STORE, \"readwrite\");\n\t\t\tconst req = tx.objectStore(DOCUMENT_STORE).put(value, key);\n\t\t\treq.onsuccess = () => resolve();\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\t/**\n\t * Blob URLs currently referenced by some item in the last saved snapshot.\n\t * Used to detect URLs that became orphaned between saves and revoke only\n\t * those — never revoke a URL that is still in use, otherwise images\n\t * subsequently remounted with that href fail to load.\n\t */\n\tconst liveHrefs = new Set<string>();\n\n\tfunction stripBlobsForPersist(item: VectorSceneItem): VectorSceneItem {\n\t\tconst out = { ...item };\n\t\tdelete out.imageRasterHref;\n\t\tdelete out.imageThumbnailHref;\n\t\t// Remove the stale childrenSvg since it contains the blob URL\n\t\tif (item.toolKind === \"image\") {\n\t\t\tout.childrenSvg = \"\";\n\t\t}\n\t\treturn out;\n\t}\n\n\tfunction collectLiveHrefs(items: readonly VectorSceneItem[]): Set<string> {\n\t\tconst set = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tif (item.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\t\tset.add(item.imageRasterHref);\n\t\t\t}\n\t\t\tif (item.imageThumbnailHref?.startsWith(\"blob:\")) {\n\t\t\t\tset.add(item.imageThumbnailHref);\n\t\t\t}\n\t\t}\n\t\treturn set;\n\t}\n\n\treturn {\n\t\tasync load(): Promise<VectorCanvasSnapshot | null> {\n\t\t\tconst raw = await getFromDocDb<{\n\t\t\t\titems: VectorSceneItem[];\n\t\t\t\tversion?: number;\n\t\t\t}>(DOCUMENT_KEY);\n\t\t\tif (!raw?.items) return null;\n\n\t\t\tconst resolved: VectorSceneItem[] = [];\n\t\t\tfor (const item of raw.items) {\n\t\t\t\tif (item.toolKind === \"image\" && item.imageBlobId) {\n\t\t\t\t\tconst itemWithBlob = { ...item } as VectorSceneItem & {\n\t\t\t\t\t\timageRasterHref?: string;\n\t\t\t\t\t\timageThumbnailHref?: string;\n\t\t\t\t\t};\n\t\t\t\t\t// Create thumbnail blob URL first for progressive loading\n\t\t\t\t\tif (item.imageThumbnailBlobId) {\n\t\t\t\t\t\tconst thumbUrl = await createThumbnailBlobUrlFromStore(\n\t\t\t\t\t\t\timageStore,\n\t\t\t\t\t\t\titem.imageThumbnailBlobId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (thumbUrl) {\n\t\t\t\t\t\t\titemWithBlob.imageThumbnailHref = thumbUrl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Create full-res blob URL\n\t\t\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, item.imageBlobId);\n\t\t\t\t\tif (fullUrl) {\n\t\t\t\t\t\titemWithBlob.imageRasterHref = fullUrl;\n\t\t\t\t\t}\n\t\t\t\t\t// Rebuild childrenSvg with the blob URL\n\t\t\t\t\tconst rebuilt = rebuildItemSvg(itemWithBlob as VectorSceneItem);\n\t\t\t\t\tresolved.push(rebuilt);\n\t\t\t\t} else {\n\t\t\t\t\tresolved.push(item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { items: resolved, version: raw.version ?? 1 };\n\t\t},\n\n\t\tasync save(snapshot: VectorCanvasSnapshot): Promise<void> {\n\t\t\t// Determine which URLs are still in use; only revoke ones that\n\t\t\t// dropped out of the snapshot since the last save. URLs still\n\t\t\t// referenced by some item must stay valid — clones, duplicates,\n\t\t\t// or any item kept in memory will read them via `<image href>`.\n\t\t\tconst nextLive = collectLiveHrefs(snapshot.items);\n\t\t\tfor (const href of liveHrefs) {\n\t\t\t\tif (!nextLive.has(href)) {\n\t\t\t\t\tURL.revokeObjectURL(href);\n\t\t\t\t}\n\t\t\t}\n\t\t\tliveHrefs.clear();\n\t\t\tfor (const href of nextLive) liveHrefs.add(href);\n\n\t\t\t// Strip blob URLs from items before persisting\n\t\t\tconst cleanItems = snapshot.items.map(stripBlobsForPersist);\n\t\t\tawait putInDocDb(DOCUMENT_KEY, {\n\t\t\t\titems: cleanItems,\n\t\t\t\tversion: snapshot.version ?? 1,\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function createNoopPersistenceAdapter(): VectorCanvasPersistenceAdapter {\n\treturn {\n\t\tload: () => Promise.resolve(null),\n\t\tsave: () => Promise.resolve(),\n\t};\n}\n","import type { VectorCanvasPersistenceAdapter, VectorCanvasSnapshot } from \"./types\";\n\nexport const DEFAULT_VECTOR_CANVAS_STORAGE_KEY = \"trazo.vector-canvas.v1\";\n\nconst SNAPSHOT_VERSION = 1;\n\nexport type CreateLocalStoragePersistenceAdapterOptions = {\n\t/** Defaults to {@link DEFAULT_VECTOR_CANVAS_STORAGE_KEY} */\n\tkey?: string;\n\t/** Defaults to `window.localStorage` when `typeof window !== \"undefined\"` */\n\tstorage?: Storage | null;\n};\n\n/**\n * Default persistence: `JSON.stringify` snapshot under a single localStorage key.\n * Pass the same `key` in every session to restore the board.\n */\nexport function createLocalStoragePersistenceAdapter(\n\toptions: CreateLocalStoragePersistenceAdapterOptions = {},\n): VectorCanvasPersistenceAdapter {\n\tconst key = options.key ?? DEFAULT_VECTOR_CANVAS_STORAGE_KEY;\n\tconst storage =\n\t\toptions.storage ??\n\t\t(typeof globalThis !== \"undefined\" &&\n\t\t\"localStorage\" in globalThis &&\n\t\tglobalThis.localStorage\n\t\t\t? globalThis.localStorage\n\t\t\t: null);\n\n\treturn {\n\t\tload(): Promise<VectorCanvasSnapshot | null> {\n\t\t\tif (!storage) return Promise.resolve(null);\n\t\t\ttry {\n\t\t\t\tconst raw = storage.getItem(key);\n\t\t\t\tif (!raw) return Promise.resolve(null);\n\t\t\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\t\t\tif (\n\t\t\t\t\t!parsed ||\n\t\t\t\t\ttypeof parsed !== \"object\" ||\n\t\t\t\t\t!(\"items\" in parsed) ||\n\t\t\t\t\t!Array.isArray((parsed as VectorCanvasSnapshot).items)\n\t\t\t\t) {\n\t\t\t\t\treturn Promise.resolve(null);\n\t\t\t\t}\n\t\t\t\treturn Promise.resolve(parsed as VectorCanvasSnapshot);\n\t\t\t} catch {\n\t\t\t\treturn Promise.resolve(null);\n\t\t\t}\n\t\t},\n\t\tsave(snapshot: VectorCanvasSnapshot): Promise<void> {\n\t\t\tif (!storage) return Promise.resolve();\n\t\t\ttry {\n\t\t\t\tstorage.setItem(\n\t\t\t\t\tkey,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t...snapshot,\n\t\t\t\t\t\tversion: snapshot.version ?? SNAPSHOT_VERSION,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\t/* quota / private mode */\n\t\t\t}\n\t\t\treturn Promise.resolve();\n\t\t},\n\t};\n}\n\nfunction createNoopPersistenceAdapter(): VectorCanvasPersistenceAdapter {\n\treturn {\n\t\tload: () => Promise.resolve(null),\n\t\tsave: () => Promise.resolve(),\n\t};\n}\n\nexport { createNoopPersistenceAdapter };\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport {\n\tcreateLocalStoragePersistenceAdapter,\n\tcreateNoopPersistenceAdapter,\n\tDEFAULT_VECTOR_CANVAS_STORAGE_KEY,\n} from \"./local-storage-adapter\";\nimport type {\n\tVectorCanvasPersistenceAdapter,\n\tVectorCanvasRemoteAdapter,\n} from \"./types\";\n\nexport type UseVectorCanvasDocumentOptions = {\n\t/**\n\t * Storage key for the built-in localStorage adapter (ignored if `persistence` is set).\n\t * @default {@link DEFAULT_VECTOR_CANVAS_STORAGE_KEY}\n\t */\n\tpersistenceKey?: string;\n\t/**\n\t * Custom persistence (Postgres via API, IndexedDB, …).\n\t * - `undefined` → default **localStorage** adapter with `persistenceKey`\n\t * - `false` → no persistence (memory only)\n\t */\n\tpersistence?: VectorCanvasPersistenceAdapter | false;\n\t/** Debounce before writing to storage after edits. @default 400 */\n\tdebounceMs?: number;\n\t/**\n\t * Optional: WebSocket / server sync — `subscribe` receives remote `items`;\n\t * `send` is called after local edits (after debounce) so you can push upstream.\n\t */\n\tremote?: VectorCanvasRemoteAdapter;\n};\n\nexport type UseVectorCanvasDocumentResult = {\n\titems: VectorSceneItem[];\n\t/** Pass to `VectorViewport` `onItemsChange` */\n\tonItemsChange: (next: VectorSceneItem[]) => void;\n\t/** Same as `onItemsChange`; included for flexibility */\n\tsetItems: (next: VectorSceneItem[]) => void;\n\t/** `false` until the first `load()` finished (avoid SSR flash / empty overwrite) */\n\tisHydrated: boolean;\n\t/** Clear persisted snapshot (and reset state to `[]`) */\n\tclearPersistedDocument: () => void;\n};\n\n/**\n * Default **localStorage** persistence + optional **remote** sync hook.\n *\n * @example\n * ```tsx\n * const doc = useVectorCanvasDocument();\n * return (\n * <VectorViewport\n * items={doc.items}\n * onItemsChange={doc.onItemsChange}\n * interactive\n * ariaLabel=\"Board\"\n * />\n * );\n * ```\n *\n * @example Custom API\n * ```ts\n * const persistence = useMemo(() => ({\n * load: () => fetch(\"/api/board\").then((r) => r.json()),\n * save: (snap) => fetch(\"/api/board\", { method: \"PUT\", body: JSON.stringify(snap) }),\n * }), []);\n * useVectorCanvasDocument({ persistence });\n * ```\n */\nexport function useVectorCanvasDocument(\n\toptions: UseVectorCanvasDocumentOptions = {},\n): UseVectorCanvasDocumentResult {\n\tconst {\n\t\tpersistenceKey = DEFAULT_VECTOR_CANVAS_STORAGE_KEY,\n\t\tpersistence,\n\t\tdebounceMs = 400,\n\t\tremote,\n\t} = options;\n\n\tconst adapter = useMemo((): VectorCanvasPersistenceAdapter => {\n\t\tif (persistence === false) return createNoopPersistenceAdapter();\n\t\tif (persistence) return persistence;\n\t\treturn createLocalStoragePersistenceAdapter({ key: persistenceKey });\n\t}, [persistence, persistenceKey]);\n\n\tconst [items, setItems] = useState<VectorSceneItem[]>([]);\n\tconst [isHydrated, setIsHydrated] = useState(false);\n\tconst saveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst adapterRef = useRef(adapter);\n\tadapterRef.current = adapter;\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tadapter.load().then((snap) => {\n\t\t\tif (cancelled) return;\n\t\t\tif (snap?.items && snap.items.length > 0) {\n\t\t\t\tsetItems(snap.items);\n\t\t\t}\n\t\t\tsetIsHydrated(true);\n\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [adapter]);\n\n\tconst persist = useCallback((next: VectorSceneItem[]) => {\n\t\tvoid adapterRef.current.save({ items: next, version: 1 });\n\t}, []);\n\n\tconst onItemsChange = useCallback(\n\t\t(next: VectorSceneItem[]) => {\n\t\t\tsetItems(next);\n\t\t\tremote?.send?.(next);\n\t\t\tif (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n\t\t\tsaveTimerRef.current = setTimeout(() => {\n\t\t\t\tpersist(next);\n\t\t\t\tsaveTimerRef.current = null;\n\t\t\t}, debounceMs);\n\t\t},\n\t\t[debounceMs, persist, remote],\n\t);\n\n\t/** After local load, wire server so a fast WS message does not get overwritten by stale LS. */\n\tuseEffect(() => {\n\t\tif (!remote || !isHydrated) return;\n\t\treturn remote.subscribe((serverItems) => {\n\t\t\tsetItems(serverItems);\n\t\t\tpersist(serverItems);\n\t\t});\n\t}, [remote, isHydrated, persist]);\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tif (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n\t\t},\n\t\t[],\n\t);\n\n\tconst clearPersistedDocument = useCallback(() => {\n\t\tsetItems([]);\n\t\tvoid adapterRef.current.save({ items: [], version: 1 });\n\t}, []);\n\n\treturn {\n\t\titems,\n\t\tonItemsChange,\n\t\tsetItems: onItemsChange,\n\t\tisHydrated,\n\t\tclearPersistedDocument,\n\t};\n}\n","\"use client\";\n\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\ttype RefObject,\n\tuseContext,\n\tuseLayoutEffect,\n} from \"react\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport type { VectorToolDefinition } from \"../tools/types\";\nimport type {\n\tCustomShapePlacementOptions,\n\tVectorViewportHandle,\n\tVectorViewportProps,\n} from \"../VectorViewport\";\n\nexport type CanvasPluginRenderContext = {\n\t/** Live viewport handle when the plugin needs camera or viewport size. */\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n};\n\nexport type CanvasPluginItemsChangeMiddlewareContext = {\n\t/** Current board items before the pending change is applied. */\n\tcurrentItems: readonly VectorSceneItem[];\n\t/** Continue the item change pipeline. */\n\tnext: NonNullable<VectorViewportProps[\"onItemsChange\"]>;\n\t/** Original consumer callback passed to `VectorViewport`. */\n\tconsumerOnItemsChange?: VectorViewportProps[\"onItemsChange\"];\n\t/** Live viewport handle for advanced integrations. */\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n};\n\nexport type CanvasPluginContribution = {\n\t/** Additional tools injected into the board toolbar/runtime. */\n\ttools?: readonly VectorToolDefinition[];\n\t/** Transform the resolved tool list (reorder, replace, or filter existing tools). */\n\ttoolTransform?: (tools: VectorToolDefinition[]) => VectorToolDefinition[];\n\t/** Multiple custom placements contributed by plugins; the active one is resolved by `toolId`. */\n\tcustomPlacements?: readonly CustomShapePlacementOptions[];\n\t/** Simple viewport prop overrides owned by the plugin runtime. */\n\tviewportProps?: Partial<\n\t\tPick<VectorViewportProps, \"remotePresence\" | \"presenceOverlay\">\n\t>;\n\t/** Event callbacks chained into the viewport without manual wiring in app code. */\n\tcallbacks?: Partial<\n\t\tPick<\n\t\t\tVectorViewportProps,\n\t\t\t| \"onWorldPointerDown\"\n\t\t\t| \"onWorldPointerMove\"\n\t\t\t| \"onWorldPointerLeave\"\n\t\t\t| \"onPlacementPreviewChange\"\n\t\t\t| \"onCameraChange\"\n\t\t>\n\t>;\n\t/** Middleware around `onItemsChange` for collaboration, comments, persistence, etc. */\n\twrapOnItemsChange?: (\n\t\tnextItems: VectorSceneItem[],\n\t\tctx: CanvasPluginItemsChangeMiddlewareContext,\n\t) => void;\n};\n\nexport type CanvasPluginComponentProps = {\n\t/** Stable plugin id so the component can register contributions. */\n\tpluginId: string;\n};\n\nexport type CanvasPlugin = {\n\t/** Stable id, e.g. `canvu.plugin.chatbot`. */\n\tid: string;\n\t/**\n\t * Legacy/simple rendering path for purely visual plugins.\n\t *\n\t * Prefer `Component` for plugins that need hooks, document integration, tools, or runtime contributions.\n\t */\n\trender?: (ctx: CanvasPluginRenderContext) => ReactNode;\n\t/**\n\t * Preferred plugin entrypoint for first-party and advanced plugins.\n\t *\n\t * The component can use hooks and register contributions through `useCanvuPluginContribution`.\n\t */\n\tComponent?: (props: CanvasPluginComponentProps) => ReactNode;\n};\n\nexport type CanvuPluginViewportSnapshot = Pick<\n\tVectorViewportProps,\n\t| \"items\"\n\t| \"onItemsChange\"\n\t| \"toolId\"\n\t| \"interactive\"\n\t| \"toolLocked\"\n\t| \"onToolChangeRequest\"\n>;\n\nexport type CanvuPluginContextValue = {\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n\tviewport: CanvuPluginViewportSnapshot;\n\tresolvedTools: VectorToolDefinition[];\n\tregisterContribution: (\n\t\tpluginId: string,\n\t\tcontribution: CanvasPluginContribution,\n\t) => void;\n\tunregisterContribution: (pluginId: string) => void;\n};\n\nexport const CanvuPluginContext = createContext<CanvuPluginContextValue | null>(\n\tnull,\n);\n\n/**\n * Creates a typed canvu plugin descriptor.\n *\n * Use this helper when authoring custom plugins so your editor can infer the plugin shape\n * and surface better hover documentation for the returned object.\n */\nexport function createCanvuPlugin(plugin: CanvasPlugin): CanvasPlugin {\n\treturn plugin;\n}\n\n/**\n * Returns the low-level canvu plugin runtime context.\n *\n * This is an advanced API for custom plugin authors. Prefer first-party plugin factories such as\n * `chatbotPlugin(...)` and `realtimeCollaborationPlugin(...)` for the common path.\n */\nexport function useCanvuPluginContext(): CanvuPluginContextValue {\n\tconst ctx = useContext(CanvuPluginContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"useCanvuPluginContext must be used inside a VectorViewport plugin runtime.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n/**\n * Returns the current viewport-facing board state exposed to plugins.\n *\n * Use this when a custom plugin needs access to items, the active tool, or the consumer's\n * `onToolChangeRequest` callback.\n */\nexport function useCanvuViewportContext(): {\n\tviewportRef?: RefObject<VectorViewportHandle | null>;\n\tviewport: CanvuPluginViewportSnapshot;\n} {\n\tconst { viewportRef, viewport } = useCanvuPluginContext();\n\treturn { viewportRef, viewport };\n}\n\n/**\n * Returns the board document context exposed to plugins.\n *\n * This hook is intended for advanced plugins that need to read items or integrate with the board's\n * `onItemsChange` lifecycle.\n */\nexport function useCanvuDocumentContext(): {\n\titems: readonly VectorSceneItem[];\n\tonItemsChange?: VectorViewportProps[\"onItemsChange\"];\n} {\n\tconst { viewport } = useCanvuPluginContext();\n\treturn {\n\t\titems: viewport.items,\n\t\tonItemsChange: viewport.onItemsChange,\n\t};\n}\n\n/**\n * Returns the tool list already resolved by the plugin runtime.\n *\n * `VectorToolbar` consumes this automatically when you omit its `tools` prop, so most apps do not\n * need this hook directly.\n */\nexport function useCanvuResolvedTools(): VectorToolDefinition[] {\n\treturn useCanvuPluginContext().resolvedTools;\n}\n\n/**\n * Registers non-visual plugin contributions with the current `VectorViewport` runtime.\n *\n * Use this inside `plugin.Component` when you want to inject tools, pointer/camera behavior, or\n * document middleware without requiring the consumer to wire hooks manually.\n */\nexport function useCanvuPluginContribution(\n\tpluginId: string,\n\tcontribution: CanvasPluginContribution,\n): void {\n\tconst { registerContribution, unregisterContribution } = useCanvuPluginContext();\n\tuseLayoutEffect(() => {\n\t\tregisterContribution(pluginId, contribution);\n\t\treturn () => unregisterContribution(pluginId);\n\t}, [contribution, pluginId, registerContribution, unregisterContribution]);\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { VectorSceneItem } from \"../../scene/types\";\nimport type { VectorToolDefinition } from \"../tools/types\";\nimport type { CustomShapePlacementOptions } from \"../VectorViewport\";\nimport {\n\ttype CanvasPlugin,\n\tcreateCanvuPlugin,\n\tuseCanvuPluginContribution,\n} from \"./types\";\n\nexport type CreateToolPluginOptions = VectorToolDefinition & {\n\t/**\n\t * Optional custom placement factory for tools that create scene items directly.\n\t *\n\t * When provided, the resulting plugin contributes a `customPlacement` entry for this tool id.\n\t */\n\tcreateItem?: (args: {\n\t\tid: string;\n\t\tbounds: { x: number; y: number; width: number; height: number };\n\t}) => VectorSceneItem;\n\t/**\n\t * Optional tool list transform applied after this tool is merged.\n\t *\n\t * Use this when you need custom ordering or to replace an existing tool position.\n\t */\n\ttoolTransform?: (tools: VectorToolDefinition[]) => VectorToolDefinition[];\n};\n\nfunction ToolPluginComponent({\n\tpluginId,\n\ttool,\n\ttoolTransform,\n\tcreateItem,\n}: {\n\tpluginId: string;\n\ttool: VectorToolDefinition;\n\ttoolTransform?: (tools: VectorToolDefinition[]) => VectorToolDefinition[];\n\tcreateItem?: CustomShapePlacementOptions[\"createItem\"];\n}) {\n\tconst contribution = useMemo(\n\t\t() => ({\n\t\t\ttools: [tool],\n\t\t\ttoolTransform,\n\t\t\tcustomPlacements: createItem\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttoolId: tool.id,\n\t\t\t\t\t\t\tcreateItem,\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: undefined,\n\t\t}),\n\t\t[createItem, tool, toolTransform],\n\t);\n\tuseCanvuPluginContribution(pluginId, contribution);\n\treturn null;\n}\n\n/**\n * Creates a lightweight plugin that contributes a single tool to `VectorViewport`.\n *\n * Use this for isolated tools such as custom shapes, review pins, or lightweight creation flows.\n * For larger features that also need presence, panels, or network integration, prefer a dedicated\n * feature plugin such as `realtimeCollaborationPlugin(...)`.\n */\nexport function createToolPlugin(options: CreateToolPluginOptions): CanvasPlugin {\n\tconst { createItem, toolTransform, ...tool } = options;\n\tconst pluginId = `canvu.plugin.tool:${tool.id}`;\n\treturn createCanvuPlugin({\n\t\tid: pluginId,\n\t\tComponent() {\n\t\t\treturn (\n\t\t\t\t<ToolPluginComponent\n\t\t\t\t\tpluginId={pluginId}\n\t\t\t\t\ttool={tool}\n\t\t\t\t\ttoolTransform={toolTransform}\n\t\t\t\t\tcreateItem={createItem}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t});\n}\n","\"use client\";\n\nimport { type CSSProperties, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nconst menuStyle: CSSProperties = {\n\tposition: \"fixed\",\n\tzIndex: 10000,\n\tminWidth: 200,\n\tpadding: 4,\n\tbackgroundColor: \"#ffffff\",\n\tborder: \"1px solid #e2e8f0\",\n\tborderRadius: 8,\n\tboxShadow: \"0 10px 40px rgba(15, 23, 42, 0.12)\",\n\tfontSize: 13,\n\tfontFamily: \"system-ui, sans-serif\",\n\tcolor: \"#0f172a\",\n};\n\nconst itemStyle: CSSProperties = {\n\tdisplay: \"block\",\n\twidth: \"100%\",\n\ttextAlign: \"left\",\n\tpadding: \"8px 12px\",\n\tmargin: 0,\n\tborder: \"none\",\n\tborderRadius: 4,\n\tbackground: \"transparent\",\n\tcursor: \"pointer\",\n};\n\nconst dividerStyle: CSSProperties = {\n\theight: 1,\n\tmargin: \"4px 8px\",\n\tbackground: \"#e2e8f0\",\n};\n\nexport type ShapeContextMenuProps = {\n\t/** Viewport client coordinates (from `clientX` / `clientY`). */\n\tx: number;\n\ty: number;\n\t/** When true, all selected items are locked — action is “unlock”. */\n\tallSelectedLocked: boolean;\n\tonClose: () => void;\n\tonToggleLock: () => void;\n\tonCut: () => void;\n\tonCopy: () => void;\n\tonBringToFront: () => void;\n\tonBringForward: () => void;\n\tonSendBackward: () => void;\n\tonSendToBack: () => void;\n\tonDuplicate: () => void;\n\tonDelete: () => void;\n};\n\n/**\n * Floating menu for shape actions (reorder, clipboard, lock, delete).\n * Renders in a portal and closes on Escape or outside click.\n */\nexport function ShapeContextMenu({\n\tx,\n\ty,\n\tallSelectedLocked,\n\tonClose,\n\tonToggleLock,\n\tonCut,\n\tonCopy,\n\tonBringToFront,\n\tonBringForward,\n\tonSendBackward,\n\tonSendToBack,\n\tonDuplicate,\n\tonDelete,\n}: ShapeContextMenuProps) {\n\tconst rootRef = useRef<HTMLDivElement>(null);\n\n\tuseLayoutEffect(() => {\n\t\tconst el = rootRef.current;\n\t\tif (!el) return;\n\t\tconst pad = 8;\n\t\tconst w = el.offsetWidth || 200;\n\t\tconst h = el.offsetHeight || 160;\n\t\tlet left = x;\n\t\tlet top = y;\n\t\tif (left + w + pad > window.innerWidth) {\n\t\t\tleft = Math.max(pad, window.innerWidth - w - pad);\n\t\t}\n\t\tif (top + h + pad > window.innerHeight) {\n\t\t\ttop = Math.max(pad, window.innerHeight - h - pad);\n\t\t}\n\t\tel.style.left = `${left}px`;\n\t\tel.style.top = `${top}px`;\n\t}, [x, y]);\n\n\tuseEffect(() => {\n\t\tconst onKey = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\t\tconst onPointerDown = (e: PointerEvent) => {\n\t\t\tconst t = e.target as Node | null;\n\t\t\tif (t && rootRef.current?.contains(t)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClose();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", onKey);\n\t\tdocument.addEventListener(\"pointerdown\", onPointerDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", onKey);\n\t\t\tdocument.removeEventListener(\"pointerdown\", onPointerDown, true);\n\t\t};\n\t}, [onClose]);\n\n\tconst run = (fn: () => void) => () => {\n\t\tfn();\n\t\tonClose();\n\t};\n\n\tconst renderAction = (\n\t\tlabel: string,\n\t\tonClick: () => void,\n\t\toptions?: { danger?: boolean },\n\t) => (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\trole=\"menuitem\"\n\t\t\tstyle={{\n\t\t\t\t...itemStyle,\n\t\t\t\t...(options?.danger ? { color: \"#b91c1c\" } : {}),\n\t\t\t}}\n\t\t\tonMouseEnter={(e) => {\n\t\t\t\te.currentTarget.style.background = options?.danger ? \"#fef2f2\" : \"#f1f5f9\";\n\t\t\t}}\n\t\t\tonMouseLeave={(e) => {\n\t\t\t\te.currentTarget.style.background = \"transparent\";\n\t\t\t}}\n\t\t\tonClick={run(onClick)}\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n\n\tconst menu = (\n\t\t<div\n\t\t\tref={rootRef}\n\t\t\tdata-slot=\"shape-context-menu\"\n\t\t\tstyle={{ ...menuStyle, left: x, top: y }}\n\t\t\trole=\"menu\"\n\t\t>\n\t\t\t{renderAction(\"Recortar\", onCut)}\n\t\t\t{renderAction(\"Copiar\", onCopy)}\n\t\t\t{renderAction(\"Duplicar\", onDuplicate)}\n\t\t\t<div aria-hidden style={dividerStyle} />\n\t\t\t{renderAction(\"Trazer para frente\", onBringToFront)}\n\t\t\t{renderAction(\"Avancar uma camada\", onBringForward)}\n\t\t\t{renderAction(\"Recuar uma camada\", onSendBackward)}\n\t\t\t{renderAction(\"Enviar para tras\", onSendToBack)}\n\t\t\t<div aria-hidden style={dividerStyle} />\n\t\t\t{renderAction(allSelectedLocked ? \"Desbloquear\" : \"Bloquear\", onToggleLock)}\n\t\t\t{renderAction(\"Apagar\", onDelete, { danger: true })}\n\t\t</div>\n\t);\n\n\tif (typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\treturn createPortal(menu, document.body);\n}\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nconst architecturalCloudIconPath =\n\t\"M1.5 12 A 4.94 5.23 0 0 1 9.07 6 A 4.94 5.23 0 0 1 14.93 6 A 4.94 5.23 0 0 1 22.5 12 A 4.94 5.23 0 0 1 14.93 18 A 4.94 5.23 0 0 1 9.07 18 A 4.94 5.23 0 0 1 1.5 12 Z\";\n\nconst base = {\n\twidth: 20,\n\theight: 20,\n\tviewBox: \"0 0 24 24\",\n\tfill: \"none\",\n\tstroke: \"currentColor\",\n\tstrokeWidth: 2,\n\tstrokeLinecap: \"round\" as const,\n\tstrokeLinejoin: \"round\" as const,\n};\n\nexport function IconHand(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\" />\n\t\t\t<path d=\"M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v2\" />\n\t\t\t<path d=\"M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v8\" />\n\t\t\t<path d=\"M18 8a2 2 0 1 1 4 0v5a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconSelect(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\" />\n\t\t\t<path d=\"M13 13l6 6\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconRect(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconEllipse(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"6\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconArchitecturalCloud(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d={architecturalCloudIconPath} />\n\t\t</svg>\n\t);\n}\n\nexport function IconLine(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconArrow(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n\t\t\t<polyline points=\"12 5 19 5 19 12\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconDraw(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M12 19l7-7 3 3-7 7-3-3z\" />\n\t\t\t<path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\" />\n\t\t\t<path d=\"M2 2l7.586 7.586\" />\n\t\t\t<circle cx=\"11\" cy=\"11\" r=\"2\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconText(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\" />\n\t\t\t<path d=\"M9 21h6\" />\n\t\t\t<path d=\"M12 3v18\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconImage(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n\t\t\t<circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n\t\t\t<polyline points=\"21 15 16 10 5 21\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconPencil(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M12 19l7-7 3 3-7 7-3-3z\" />\n\t\t\t<path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\" />\n\t\t\t<path d=\"M2 2l7.586 7.586\" />\n\t\t\t<path d=\"M11 4h4v4\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconBrush(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M9.06 11.9l8.07-8.06a2.85 2.85 0 0 1 4.03 4.03l-8.06 8.07\" />\n\t\t\t<path d=\"M7.5 15.5L3 21l5.5-4.5\" />\n\t\t\t<path d=\"M2 22l4-1\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconMarker(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<path d=\"M4 20h16\" />\n\t\t\t<path d=\"M6 16l6-12 6 12\" fill=\"currentColor\" fillOpacity={0.35} />\n\t\t\t<path d=\"M8 14h8\" />\n\t\t</svg>\n\t);\n}\n\nexport function IconLaser(props: IconProps) {\n\treturn (\n\t\t<svg {...base} {...props} aria-hidden>\n\t\t\t<circle cx=\"12\" cy=\"12\" r=\"2.5\" />\n\t\t\t<path d=\"M12 4v4\" />\n\t\t\t<path d=\"M12 16v4\" />\n\t\t\t<path d=\"M4 12h4\" />\n\t\t\t<path d=\"M16 12h4\" />\n\t\t</svg>\n\t);\n}\n","import {\n\tArrowUpRight,\n\tCircle,\n\tEraser,\n\tHand,\n\tHighlighter,\n\tImage,\n\tMinus,\n\tMousePointer2,\n\tPenLine,\n\tSquare,\n\tType,\n} from \"lucide-react\";\nimport { IconArchitecturalCloud, IconLaser } from \"./icons\";\nimport type { VectorToolDefinition } from \"./types\";\n\n/** Match previous 20×20 toolbar glyphs; Lucide scales with `currentColor`. */\nconst ic = { size: 20, strokeWidth: 2 } as const;\n\n/**\n * Tool ids shown in the overflow menu at the end of the default toolbar (horizontal layout).\n * Order: shapes, marker, laser, image.\n */\nexport const DEFAULT_OVERFLOW_TOOL_IDS = [\n\t\"rect\",\n\t\"ellipse\",\n\t\"architectural-cloud\",\n\t\"line\",\n\t\"marker\",\n\t\"laser\",\n\t\"image\",\n] as const;\n\n/**\n * Opinionated default tool strip using [Lucide](https://lucide.dev) icons.\n * Pass a subset or your own list via {@link VectorToolbarProps.tools}.\n */\nexport const DEFAULT_VECTOR_TOOLS: VectorToolDefinition[] = [\n\t{\n\t\tid: \"hand\",\n\t\tlabel: \"Hand\",\n\t\ticon: <Hand {...ic} aria-hidden />,\n\t\tshortcutHint: \"H\",\n\t},\n\t{\n\t\tid: \"select\",\n\t\tlabel: \"Select\",\n\t\ticon: <MousePointer2 {...ic} aria-hidden />,\n\t\tshortcutHint: \"V\",\n\t},\n\t{\n\t\tid: \"rect\",\n\t\tlabel: \"Rectangle\",\n\t\ticon: <Square {...ic} aria-hidden />,\n\t\tshortcutHint: \"R\",\n\t},\n\t{\n\t\tid: \"ellipse\",\n\t\tlabel: \"Ellipse\",\n\t\ticon: <Circle {...ic} aria-hidden />,\n\t\tshortcutHint: \"O\",\n\t},\n\t{\n\t\tid: \"architectural-cloud\",\n\t\tlabel: \"Nuvem arquitetural\",\n\t\ttooltipLabel: \"Architectural cloud\",\n\t\ticon: <IconArchitecturalCloud aria-hidden />,\n\t\tshortcutHint: \"C\",\n\t},\n\t{\n\t\tid: \"line\",\n\t\tlabel: \"Line\",\n\t\ticon: <Minus {...ic} aria-hidden />,\n\t\tshortcutHint: \"L\",\n\t},\n\t{\n\t\tid: \"arrow\",\n\t\tlabel: \"Arrow\",\n\t\ticon: <ArrowUpRight {...ic} aria-hidden />,\n\t\tshortcutHint: \"A\",\n\t},\n\t{\n\t\tid: \"draw\",\n\t\tlabel: \"Desenhar\",\n\t\ttooltipLabel: \"Draw\",\n\t\ticon: <PenLine {...ic} aria-hidden />,\n\t\tshortcutHint: \"D\",\n\t},\n\t{\n\t\tid: \"marker\",\n\t\tlabel: \"Realce\",\n\t\ttooltipLabel: \"Highlighter\",\n\t\ticon: <Highlighter {...ic} aria-hidden />,\n\t\tshortcutHint: \"M\",\n\t},\n\t{\n\t\tid: \"laser\",\n\t\tlabel: \"Laser\",\n\t\ticon: <IconLaser aria-hidden />,\n\t\tshortcutHint: \"K\",\n\t},\n\t{\n\t\tid: \"eraser\",\n\t\tlabel: \"Borracha\",\n\t\ttooltipLabel: \"Eraser\",\n\t\ticon: <Eraser {...ic} aria-hidden />,\n\t\tshortcutHint: \"E\",\n\t},\n\t{\n\t\tid: \"text\",\n\t\tlabel: \"Text\",\n\t\ticon: <Type {...ic} aria-hidden />,\n\t\tshortcutHint: \"T\",\n\t},\n\t{\n\t\tid: \"image\",\n\t\tlabel: \"File\",\n\t\ticon: <Image {...ic} aria-hidden />,\n\t\tshortcutHint: \"I\",\n\t},\n];\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport { useState } from \"react\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport { DEFAULT_TEXT_FONT_SIZE } from \"../scene/text-svg\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./board-position\";\nimport {\n\ttype CanvuChromeSelectionStyleChange,\n\tuseCanvuChromeContext,\n} from \"./chrome-context\";\n\ntype ActiveToolStyle = StrokeStyle & {\n\ttoolKind:\n\t\t| \"draw\"\n\t\t| \"marker\"\n\t\t| \"text\"\n\t\t| \"rect\"\n\t\t| \"ellipse\"\n\t\t| \"architectural-cloud\"\n\t\t| \"line\"\n\t\t| \"arrow\";\n\tlabel?: string;\n\ttextFontSize?: number;\n};\n\n/**\n * Color + stroke-width inspector for the current selection (or active drawing tool style).\n * When rendered inside `VectorViewport` (e.g. via the `selectionInspector` slot), `items`,\n * `activeToolStyle`, and `onChange` default to values from {@link CanvuChromeContext};\n * pass any prop to override.\n */\nexport type VectorSelectionInspectorProps = {\n\t/** Selected items that support stroke/fill styling (caller may filter). */\n\titems?: readonly VectorSceneItem[];\n\t/** Optional active tool style shown even without a selection. */\n\tactiveToolStyle?: ActiveToolStyle | null;\n\t/** Apply stroke / width / opacity / dash / text size to every item in `items`. */\n\tonChange?: CanvuChromeSelectionStyleChange;\n\t/** Anchor preset. Defaults to top-left. */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from anchored edges. @default 12 */\n\tinset?: number;\n\t/** @default 24 */\n\tzIndex?: number;\n\tclassName?: string;\n\t/** Merged on top of position-derived styles for custom tweaks. */\n\tstyle?: CSSProperties;\n};\n\nconst shellLook: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 10,\n\tminWidth: 200,\n\tpadding: \"12px 14px\",\n\tborderRadius: 10,\n\tborder: \"1px solid rgba(0,0,0,0.1)\",\n\tbackground: \"rgba(255,255,255,0.97)\",\n\tboxShadow: \"0 4px 16px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.08)\",\n\tpointerEvents: \"auto\",\n};\n\nconst sectionLabelStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 6,\n\tfontSize: 11,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\tletterSpacing: \"0.02em\",\n\ttextTransform: \"uppercase\",\n};\n\nconst mixedHintStyle: CSSProperties = {\n\tfontWeight: 400,\n\tcolor: \"#a1a1aa\",\n\ttextTransform: \"none\",\n\tletterSpacing: 0,\n};\n\n/**\n * tldraw default canvas palette. Order chosen so the most-used neutrals sit\n * at the start; named to match what tldraw exposes in its style picker.\n */\nconst TLDRAW_PALETTE: ReadonlyArray<{ name: string; hex: string }> = [\n\t{ name: \"black\", hex: \"#1d1d1d\" },\n\t{ name: \"grey\", hex: \"#9fa8b2\" },\n\t{ name: \"light-violet\", hex: \"#e085f4\" },\n\t{ name: \"violet\", hex: \"#ae3ec9\" },\n\t{ name: \"blue\", hex: \"#4263eb\" },\n\t{ name: \"light-blue\", hex: \"#4dabf7\" },\n\t{ name: \"yellow\", hex: \"#ffc078\" },\n\t{ name: \"orange\", hex: \"#f76707\" },\n\t{ name: \"green\", hex: \"#099268\" },\n\t{ name: \"light-green\", hex: \"#40c057\" },\n\t{ name: \"light-red\", hex: \"#ff8787\" },\n\t{ name: \"red\", hex: \"#e03131\" },\n];\n\nfunction normalizeHex(stroke: string): string {\n\tif (/^#[0-9A-Fa-f]{6}$/.test(stroke)) return stroke;\n\treturn \"#1d1d1d\";\n}\n\nfunction hexesEqual(a: string, b: string): boolean {\n\treturn a.toLowerCase() === b.toLowerCase();\n}\n\nfunction isStylableKind(\n\ttk: VectorSceneItem[\"toolKind\"],\n): tk is NonNullable<VectorSceneItem[\"toolKind\"]> {\n\treturn (\n\t\ttk === \"rect\" ||\n\t\ttk === \"ellipse\" ||\n\t\ttk === \"architectural-cloud\" ||\n\t\ttk === \"line\" ||\n\t\ttk === \"arrow\" ||\n\t\ttk === \"draw\" ||\n\t\ttk === \"pencil\" ||\n\t\ttk === \"brush\" ||\n\t\ttk === \"marker\" ||\n\t\ttk === \"text\"\n\t);\n}\n\nconst FONT_SIZE_PRESETS: ReadonlyArray<{ label: string; size: number }> = [\n\t{ label: \"S\", size: 14 },\n\t{ label: \"M\", size: 18 },\n\t{ label: \"L\", size: 28 },\n\t{ label: \"XL\", size: 44 },\n];\n\ntype SwatchProps = {\n\tcolor: { name: string; hex: string };\n\tselected: boolean;\n\tonSelect: () => void;\n};\n\nfunction ColorSwatch({ color, selected, onSelect }: SwatchProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={color.name}\n\t\t\taria-pressed={selected}\n\t\t\tonClick={onSelect}\n\t\t\tonPointerDown={(e) => {\n\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t}}\n\t\t\tstyle={{\n\t\t\t\twidth: 24,\n\t\t\t\theight: 24,\n\t\t\t\tpadding: 0,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tborder: selected ? \"2px solid #18181b\" : \"1px solid rgba(0,0,0,0.12)\",\n\t\t\t\tbackground: color.hex,\n\t\t\t\tcursor: \"pointer\",\n\t\t\t\toutline: \"none\",\n\t\t\t\tboxShadow: selected ? \"0 0 0 2px rgba(255,255,255,0.95) inset\" : \"none\",\n\t\t\t\ttransition: \"transform 0.08s ease\",\n\t\t\t\ttransform: selected ? \"scale(1.08)\" : \"scale(1)\",\n\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t}}\n\t\t/>\n\t);\n}\n\ntype PaletteProps = {\n\tvalue: string;\n\tonChange: (hex: string) => void;\n};\n\nfunction ColorPalette({ value, onChange }: PaletteProps) {\n\tconst [showCustom, setShowCustom] = useState(false);\n\tconst normalized = normalizeHex(value);\n\tconst inPalette = TLDRAW_PALETTE.some((c) => hexesEqual(c.hex, normalized));\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"repeat(6, 24px)\",\n\t\t\t\tgap: 6,\n\t\t\t\trowGap: 6,\n\t\t\t\talignItems: \"center\",\n\t\t\t}}\n\t\t>\n\t\t\t{TLDRAW_PALETTE.map((c) => (\n\t\t\t\t<ColorSwatch\n\t\t\t\t\tkey={c.name}\n\t\t\t\t\tcolor={c}\n\t\t\t\t\tselected={hexesEqual(c.hex, normalized)}\n\t\t\t\t\tonSelect={() => onChange(c.hex)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Custom color\"\n\t\t\t\taria-pressed={showCustom || !inPalette}\n\t\t\t\tonClick={() => setShowCustom((v) => !v)}\n\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t}}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: 24,\n\t\t\t\t\theight: 24,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\tborder:\n\t\t\t\t\t\t!inPalette || showCustom\n\t\t\t\t\t\t\t? \"2px solid #18181b\"\n\t\t\t\t\t\t\t: \"1px solid rgba(0,0,0,0.12)\",\n\t\t\t\t\tbackground:\n\t\t\t\t\t\t\"conic-gradient(from 0deg, #ff5757, #ffbd59, #59ff7e, #59ddff, #b259ff, #ff59c1, #ff5757)\",\n\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\toutline: \"none\",\n\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{showCustom || !inPalette ? (\n\t\t\t\t<label\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tgridColumn: \"1 / -1\",\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\tcolor: \"#71717a\",\n\t\t\t\t\t\ttextTransform: \"none\",\n\t\t\t\t\t\tletterSpacing: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\tvalue={normalized}\n\t\t\t\t\t\tonChange={(e) => onChange(e.target.value)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: 28,\n\t\t\t\t\t\t\theight: 28,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<span style={{ fontVariantNumeric: \"tabular-nums\" }}>\n\t\t\t\t\t\t{normalized.toUpperCase()}\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\ntype DashTabsProps = {\n\tvalue: \"solid\" | \"dashed\";\n\tonChange: (next: \"solid\" | \"dashed\") => void;\n};\n\nfunction DashTabs({ value, onChange }: DashTabsProps) {\n\tconst tabs: ReadonlyArray<{ id: \"solid\" | \"dashed\"; label: string }> = [\n\t\t{ id: \"solid\", label: \"Solid\" },\n\t\t{ id: \"dashed\", label: \"Dashed\" },\n\t];\n\treturn (\n\t\t<div\n\t\t\trole=\"radiogroup\"\n\t\t\taria-label=\"Stroke style\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tbackground: \"rgba(24,24,27,0.06)\",\n\t\t\t\tborderRadius: 7,\n\t\t\t\tpadding: 2,\n\t\t\t\tgap: 2,\n\t\t\t}}\n\t\t>\n\t\t\t{tabs.map((t) => {\n\t\t\t\tconst selected = value === t.id;\n\t\t\t\treturn (\n\t\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: styled segmented control needs button, not input[type=radio]\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"radio\"\n\t\t\t\t\t\taria-checked={selected}\n\t\t\t\t\t\tonClick={() => onChange(t.id)}\n\t\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tdisplay: \"inline-flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\tpadding: \"5px 8px\",\n\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\tcolor: selected ? \"#18181b\" : \"#71717a\",\n\t\t\t\t\t\t\tbackground: selected ? \"#fff\" : \"transparent\",\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tboxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.1)\" : \"none\",\n\t\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<DashTabSwatch dashed={t.id === \"dashed\"} />\n\t\t\t\t\t\t<span style={{ marginLeft: 6 }}>{t.label}</span>\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nfunction DashTabSwatch({ dashed }: { dashed: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\twidth={26}\n\t\t\theight={6}\n\t\t\taria-hidden\n\t\t\tstyle={{ flexShrink: 0, display: \"block\" }}\n\t\t>\n\t\t\t<title>{dashed ? \"dashed\" : \"solid\"}</title>\n\t\t\t<line\n\t\t\t\tx1={1}\n\t\t\t\ty1={3}\n\t\t\t\tx2={25}\n\t\t\t\ty2={3}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeDasharray={dashed ? \"4 3\" : undefined}\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\ntype SizeTabsProps = {\n\tvalue: number;\n\tonChange: (size: number) => void;\n};\n\nfunction FontSizeTabs({ value, onChange }: SizeTabsProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"radiogroup\"\n\t\t\taria-label=\"Text size\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tbackground: \"rgba(24,24,27,0.06)\",\n\t\t\t\tborderRadius: 7,\n\t\t\t\tpadding: 2,\n\t\t\t\tgap: 2,\n\t\t\t}}\n\t\t>\n\t\t\t{FONT_SIZE_PRESETS.map((p) => {\n\t\t\t\tconst selected = Math.abs(value - p.size) < 0.5;\n\t\t\t\treturn (\n\t\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: styled segmented control needs button, not input[type=radio]\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={p.label}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"radio\"\n\t\t\t\t\t\taria-checked={selected}\n\t\t\t\t\t\taria-label={`${p.label} (${p.size}px)`}\n\t\t\t\t\t\tonClick={() => onChange(p.size)}\n\t\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tpadding: \"5px 0\",\n\t\t\t\t\t\t\tfontSize: p.label === \"XL\" ? 14 : p.label === \"L\" ? 13 : 12,\n\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\tcolor: selected ? \"#18181b\" : \"#71717a\",\n\t\t\t\t\t\t\tbackground: selected ? \"#fff\" : \"transparent\",\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\tboxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.1)\" : \"none\",\n\t\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{p.label}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\ntype InspectorPatch = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n\tstrokeDash?: \"solid\" | \"dashed\";\n\ttextFontSize?: number;\n};\n\ntype InspectorViewModel = {\n\tlabel: string;\n\tcount: number;\n\thex: string;\n\tstrokeWidth: number;\n\tstrokeOpacity: number;\n\tstrokeDash: \"solid\" | \"dashed\";\n\ttextFontSize: number;\n\tshowStrokeWidth: boolean;\n\tshowDash: boolean;\n\tshowFontSize: boolean;\n\tshowMarkerOpacity: boolean;\n\tmixedStroke: boolean;\n\tmixedWidth: boolean;\n\tmixedDash: boolean;\n\tmixedFontSize: boolean;\n\tmixedOpacity: boolean;\n\t/** Snapshot of the current full style — caller spreads the field they're changing. */\n\tcurrent: InspectorPatch;\n};\n\nfunction viewModelFromActiveTool(\n\tactiveToolStyle: ActiveToolStyle,\n): InspectorViewModel {\n\tconst hex = normalizeHex(activeToolStyle.stroke);\n\tconst strokeWidth = activeToolStyle.strokeWidth;\n\tconst strokeOpacity = activeToolStyle.strokeOpacity ?? 1;\n\tconst strokeDash: \"solid\" | \"dashed\" =\n\t\tactiveToolStyle.strokeDash === \"dashed\" ? \"dashed\" : \"solid\";\n\tconst textFontSize = activeToolStyle.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tconst isText = activeToolStyle.toolKind === \"text\";\n\tconst isDraw = activeToolStyle.toolKind === \"draw\";\n\tconst isMarker = activeToolStyle.toolKind === \"marker\";\n\tconst current: InspectorPatch = {\n\t\tstroke: hex,\n\t\tstrokeWidth,\n\t\t...(activeToolStyle.strokeOpacity != null\n\t\t\t? { strokeOpacity: activeToolStyle.strokeOpacity }\n\t\t\t: {}),\n\t\t...(activeToolStyle.strokeDash != null\n\t\t\t? { strokeDash: activeToolStyle.strokeDash }\n\t\t\t: {}),\n\t\t...(isText ? { textFontSize } : {}),\n\t};\n\treturn {\n\t\tlabel: activeToolStyle.label ?? \"Tool style\",\n\t\tcount: 0,\n\t\thex,\n\t\tstrokeWidth,\n\t\tstrokeOpacity,\n\t\tstrokeDash,\n\t\ttextFontSize,\n\t\tshowStrokeWidth: !isText,\n\t\tshowDash: isDraw,\n\t\tshowFontSize: isText,\n\t\tshowMarkerOpacity: isMarker,\n\t\tmixedStroke: false,\n\t\tmixedWidth: false,\n\t\tmixedDash: false,\n\t\tmixedFontSize: false,\n\t\tmixedOpacity: false,\n\t\tcurrent,\n\t};\n}\n\nfunction viewModelFromSelection(\n\tstylable: VectorSceneItem[],\n): InspectorViewModel | null {\n\tconst first = stylable[0];\n\tif (!first) return null;\n\tconst hex = normalizeHex(first.stroke ?? \"#1d1d1d\");\n\tconst strokeWidth = first.strokeWidth ?? 2;\n\tconst allSameStroke = stylable.every(\n\t\t(it) => (it.stroke ?? \"#1d1d1d\") === (first.stroke ?? \"#1d1d1d\"),\n\t);\n\tconst allSameWidth = stylable.every(\n\t\t(it) => (it.strokeWidth ?? 2) === (first.strokeWidth ?? 2),\n\t);\n\n\tconst draws = stylable.filter(\n\t\t(it) => it.toolKind === \"draw\" || it.toolKind === \"pencil\",\n\t);\n\tconst showDash = draws.length > 0;\n\tconst firstDraw = draws[0];\n\tconst strokeDash: \"solid\" | \"dashed\" =\n\t\tfirstDraw?.strokeDash === \"dashed\" ? \"dashed\" : \"solid\";\n\tconst allSameDash =\n\t\tdraws.length === 0 ||\n\t\tdraws.every((it) => (it.strokeDash ?? \"solid\") === strokeDash);\n\n\tconst markers = stylable.filter((it) => it.toolKind === \"marker\");\n\tconst showMarkerOpacity = markers.length > 0;\n\tconst firstMarker = markers[0];\n\tconst strokeOpacity = firstMarker?.strokeOpacity ?? 1;\n\tconst allSameOpacity =\n\t\tmarkers.length === 0 ||\n\t\tmarkers.every(\n\t\t\t(it) => (it.strokeOpacity ?? 1) === (firstMarker?.strokeOpacity ?? 1),\n\t\t);\n\n\tconst texts = stylable.filter((it) => it.toolKind === \"text\");\n\tconst showFontSize = texts.length > 0;\n\tconst firstText = texts[0];\n\tconst textFontSize = firstText?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tconst allSameFontSize =\n\t\ttexts.length === 0 ||\n\t\ttexts.every(\n\t\t\t(it) => (it.textFontSize ?? DEFAULT_TEXT_FONT_SIZE) === textFontSize,\n\t\t);\n\n\tconst current: InspectorPatch = {\n\t\tstroke: hex,\n\t\tstrokeWidth,\n\t\t...(showMarkerOpacity ? { strokeOpacity } : {}),\n\t\t...(showDash ? { strokeDash } : {}),\n\t\t...(showFontSize ? { textFontSize } : {}),\n\t};\n\n\treturn {\n\t\tlabel: \"Selection style\",\n\t\tcount: stylable.length,\n\t\thex,\n\t\tstrokeWidth,\n\t\tstrokeOpacity,\n\t\tstrokeDash,\n\t\ttextFontSize,\n\t\tshowStrokeWidth: true,\n\t\tshowDash,\n\t\tshowFontSize,\n\t\tshowMarkerOpacity,\n\t\tmixedStroke: !allSameStroke,\n\t\tmixedWidth: !allSameWidth,\n\t\tmixedDash: !allSameDash,\n\t\tmixedFontSize: !allSameFontSize,\n\t\tmixedOpacity: !allSameOpacity,\n\t\tcurrent,\n\t};\n}\n\n/**\n * Color + stroke width for the current selection. Supports multiple selected shapes: one change applies to all.\n */\nexport function VectorSelectionInspector({\n\titems: itemsProp,\n\tactiveToolStyle: activeToolStyleProp,\n\tonChange: onChangeProp,\n\tposition = \"top-left\",\n\tinset = 12,\n\tzIndex = 24,\n\tclassName,\n\tstyle,\n}: VectorSelectionInspectorProps) {\n\tconst ctx = useCanvuChromeContext();\n\tconst items = itemsProp ?? ctx?.selectedItems ?? [];\n\tconst activeToolStyle =\n\t\tactiveToolStyleProp === undefined\n\t\t\t? (ctx?.activeToolStyle ?? null)\n\t\t\t: activeToolStyleProp;\n\tconst onChange = onChangeProp ?? ctx?.onSelectionStyleChange ?? null;\n\tif (!onChange) return null;\n\n\tlet vm: InspectorViewModel | null = null;\n\tif (activeToolStyle) {\n\t\tvm = viewModelFromActiveTool(activeToolStyle);\n\t} else {\n\t\tconst stylable = items.filter(\n\t\t\t(it) => !it.locked && it.toolKind && isStylableKind(it.toolKind),\n\t\t);\n\t\tif (stylable.length === 0) return null;\n\t\tvm = viewModelFromSelection(stylable);\n\t}\n\tif (!vm) return null;\n\n\tconst apply = (changes: Partial<InspectorPatch>) =>\n\t\tonChange({ ...vm.current, ...changes });\n\n\tconst shell: CSSProperties = {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\t...shellLook,\n\t\t...style,\n\t};\n\tconst opacityPct = Math.round(vm.strokeOpacity * 100);\n\n\treturn (\n\t\t<section\n\t\t\tdata-slot=\"vector-selection-inspector\"\n\t\t\tdata-position={position}\n\t\t\tclassName={className}\n\t\t\taria-label={vm.label}\n\t\t\tstyle={shell}\n\t\t>\n\t\t\t{vm.count > 1 ? (\n\t\t\t\t<p style={{ margin: 0, fontSize: 11, color: \"#71717a\" }}>\n\t\t\t\t\t{vm.count} objects selected\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: fieldset would impose default browser styling that breaks the inspector layout */}\n\t\t\t<div role=\"group\" aria-label=\"Color\" style={sectionLabelStyle}>\n\t\t\t\t<span>\n\t\t\t\t\tColor\n\t\t\t\t\t{vm.mixedStroke ? (\n\t\t\t\t\t\t<span style={mixedHintStyle}> (mixed values)</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t\t<ColorPalette value={vm.hex} onChange={(h) => apply({ stroke: h })} />\n\t\t\t</div>\n\t\t\t{vm.showStrokeWidth ? (\n\t\t\t\t<label style={sectionLabelStyle}>\n\t\t\t\t\tThickness\n\t\t\t\t\t{vm.mixedWidth ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={48}\n\t\t\t\t\t\tvalue={vm.strokeWidth}\n\t\t\t\t\t\tonChange={(e) => apply({ strokeWidth: Number(e.target.value) })}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t) : null}\n\t\t\t{vm.showDash ? (\n\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: fieldset would impose default browser styling that breaks the inspector layout\n\t\t\t\t<div role=\"group\" aria-label=\"Stroke\" style={sectionLabelStyle}>\n\t\t\t\t\t<span>\n\t\t\t\t\t\tStroke\n\t\t\t\t\t\t{vm.mixedDash ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t</span>\n\t\t\t\t\t<DashTabs\n\t\t\t\t\t\tvalue={vm.strokeDash}\n\t\t\t\t\t\tonChange={(next) => apply({ strokeDash: next })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{vm.showFontSize ? (\n\t\t\t\t// biome-ignore lint/a11y/useSemanticElements: fieldset would impose default browser styling that breaks the inspector layout\n\t\t\t\t<div role=\"group\" aria-label=\"Size\" style={sectionLabelStyle}>\n\t\t\t\t\t<span>\n\t\t\t\t\t\tSize\n\t\t\t\t\t\t{vm.mixedFontSize ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t</span>\n\t\t\t\t\t<FontSizeTabs\n\t\t\t\t\t\tvalue={vm.textFontSize}\n\t\t\t\t\t\tonChange={(size) => apply({ textFontSize: size })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{vm.showMarkerOpacity ? (\n\t\t\t\t<label style={sectionLabelStyle}>\n\t\t\t\t\tOpacity\n\t\t\t\t\t{vm.mixedOpacity ? <span style={mixedHintStyle}> (mixed)</span> : null}\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tvalue={opacityPct}\n\t\t\t\t\t\tonChange={(e) => apply({ strokeOpacity: Number(e.target.value) / 100 })}\n\t\t\t\t\t/>\n\t\t\t\t\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{opacityPct}%</span>\n\t\t\t\t</label>\n\t\t\t) : null}\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties, ReactNode } from \"react\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n\ttype VectorCanvasSpacePosition,\n} from \"./board-position\";\nimport { NavMenu } from \"./navmenu\";\nimport { VectorSelectionInspector } from \"./VectorSelectionInspector\";\n\nexport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n\ttype VectorCanvasSpacePosition,\n};\n\nexport type VectorCanvasSlotProps = {\n\tchildren?: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\n\nexport type VectorCanvasSpaceProps = VectorCanvasSlotProps & {\n\tposition?: BoardComponentPosition;\n\t/** @default 12 */\n\tinset?: number;\n\t/** @default 40 */\n\tzIndex?: number;\n\t/** Pointer events value on the content wrapper. @default \"auto\" */\n\tcontentPointerEvents?: CSSProperties[\"pointerEvents\"];\n};\n\nconst rootStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\theight: \"100%\",\n\tminHeight: 0,\n\twidth: \"100%\",\n};\n\nconst headerStyle: CSSProperties = {\n\tflexShrink: 0,\n\tdisplay: \"flex\",\n\tflexWrap: \"wrap\",\n\talignItems: \"center\",\n\tgap: \"0.75rem\",\n\tpadding: \"0.75rem 1rem\",\n\tborderBottom: \"1px solid #e4e4e7\",\n\tbackground: \"#fff\",\n\tfontSize: \"0.875rem\",\n};\n\nconst bodyStyle: CSSProperties = {\n\tflex: 1,\n\tminHeight: 0,\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n};\n\nconst mainStyle: CSSProperties = {\n\tflex: 1,\n\tminHeight: 0,\n\tposition: \"relative\",\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n};\n\nconst viewportSurfaceStyle: CSSProperties = {\n\tflex: 1,\n\tminHeight: 0,\n\tposition: \"relative\",\n\twidth: \"100%\",\n\talignSelf: \"stretch\",\n\tbackground: \"#fff\",\n\ttouchAction: \"none\",\n};\n\nfunction mergeStyle(\n\tbase: CSSProperties,\n\tstyle: CSSProperties | undefined,\n): CSSProperties {\n\treturn style ? { ...base, ...style } : base;\n}\n\nfunction vectorCanvasSpaceStyle(\n\tposition: BoardComponentPosition,\n\tinset: number,\n\tzIndex: number,\n): CSSProperties {\n\treturn {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\tpointerEvents: \"none\",\n\t};\n}\n\n/**\n * Full-viewport column shell for a vector canvas (header + body with stage).\n * Use with {@link VectorCanvasBody}, {@link VectorCanvasMain}. Pass `toolbar` on {@link VectorViewport};\n * Compose the floating tool strip with {@link VectorCanvasToolbar} around {@link VectorToolbar} (see example below).\n */\nexport function VectorCanvasRoot({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-root\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(rootStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/** Optional top chrome (title, hints, toggles). */\nexport function VectorCanvasHeader({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<header\n\t\t\tdata-slot=\"vector-canvas-header\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(headerStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</header>\n\t);\n}\n\n/** Fills remaining space below the header (typically one {@link VectorCanvasMain}). */\nexport function VectorCanvasBody({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-body\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(bodyStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/**\n * Stretch area for {@link VectorViewport} (or any child that should fill the stage).\n */\nexport function VectorCanvasMain({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-main\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(mainStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/**\n * Flex child that fills {@link VectorCanvasMain} and gives {@link VectorViewport} a bounded height\n * (white surface by default). Omit if you set the background on `Main` or the viewport yourself.\n */\nexport function VectorCanvasViewportSurface({\n\tchildren,\n\tclassName,\n\tstyle,\n}: VectorCanvasSlotProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-viewport-surface\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(viewportSurfaceStyle, style)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport type VectorCanvasToolbarProps = {\n\tchildren?: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\t/** Anchor preset. @default \"bottom-center\" */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from the anchored edge(s). @default 12 */\n\tinset?: number;\n\t/** @default 30 */\n\tzIndex?: number;\n};\n\n/**\n * Floating strip anchor for {@link VectorToolbar} or custom controls. Defaults to bottom-center.\n * Renders `pointer-events: none` on the shell and `auto` on children so the canvas keeps receiving hits outside the bar.\n * Pass as the `toolbar` prop of `VectorViewport`; pick a different `position` for top / side anchoring.\n * Z-index defaults to 30 so the strip stays above zoom controls.\n */\nexport function VectorCanvasToolbar({\n\tchildren,\n\tclassName,\n\tstyle,\n\tposition = \"bottom-center\",\n\tinset = 12,\n\tzIndex = 30,\n}: VectorCanvasToolbarProps) {\n\tconst base: CSSProperties = {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\tdisplay: \"flex\",\n\t\tjustifyContent: \"center\",\n\t\talignItems: \"center\",\n\t\tmaxWidth: \"calc(100% - 24px)\",\n\t\tpointerEvents: \"none\",\n\t};\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"vector-canvas-toolbar\"\n\t\t\tdata-position={position}\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(base, style)}\n\t\t>\n\t\t\t<div style={{ pointerEvents: \"auto\" }}>{children}</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Absolute canvas-aligned space for floating UI such as chats, rosters, inspectors, and overlays.\n * Use this instead of ad-hoc wrapper divs or plugin hosts when a feature can be expressed as React nodes.\n */\nexport function VectorCanvasSpace({\n\tchildren,\n\tclassName,\n\tstyle,\n\tposition = \"top-right\",\n\tinset = 12,\n\tzIndex = 40,\n\tcontentPointerEvents = \"auto\",\n}: VectorCanvasSpaceProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot={`vector-canvas-space-${position}`}\n\t\t\tclassName={className}\n\t\t\tstyle={mergeStyle(vectorCanvasSpaceStyle(position, inset, zIndex), style)}\n\t\t>\n\t\t\t<div style={{ pointerEvents: contentPointerEvents }}>{children}</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Namespaced layout primitives for composing a vector canvas shell without ad-hoc wrapper divs.\n *\n * @example\n * ```tsx\n * <VectorCanvas.Root>\n * <VectorCanvas.Header>…</VectorCanvas.Header>\n * <VectorCanvas.Body>\n * <VectorCanvas.Main>\n * <VectorCanvas.ViewportSurface>\n * <VectorViewport\n * toolbar={\n * <VectorCanvas.Toolbar>\n * <VectorToolbar … />\n * </VectorCanvas.Toolbar>\n * }\n * …\n * />\n * </VectorCanvas.ViewportSurface>\n * </VectorCanvas.Main>\n * </VectorCanvas.Body>\n * </VectorCanvas.Root>\n * ```\n */\nexport const VectorCanvas = {\n\tRoot: VectorCanvasRoot,\n\tHeader: VectorCanvasHeader,\n\tBody: VectorCanvasBody,\n\tMain: VectorCanvasMain,\n\tViewportSurface: VectorCanvasViewportSurface,\n\tToolbar: VectorCanvasToolbar,\n\tSpace: VectorCanvasSpace,\n\tNavMenu,\n\tSelectionInspector: VectorSelectionInspector,\n} as const;\n","\"use client\";\n\nimport { ChevronDown, Lock, LockOpen, Shapes } from \"lucide-react\";\nimport {\n\tChildren,\n\ttype CSSProperties,\n\tcreateContext,\n\tisValidElement,\n\ttype ReactElement,\n\ttype ReactNode,\n\ttype RefObject,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseId,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { CanvuPluginContext } from \"./plugins\";\nimport {\n\tDEFAULT_OVERFLOW_TOOL_IDS,\n\tDEFAULT_VECTOR_TOOLS,\n} from \"./tools/default-tools\";\nimport type { VectorToolDefinition } from \"./tools/types\";\n\nexport type VectorToolbarRenderContext = {\n\ttools: VectorToolDefinition[];\n\tselectedId: string;\n\tselectTool: (id: string) => void;\n\ttoolLocked: boolean;\n\tsetToolLocked: (locked: boolean) => void;\n};\n\nexport type VectorToolbarProps = {\n\t/** Controlled selection. */\n\tvalue: string;\n\tonChange: (toolId: string) => void;\n\t/** Defaults to {@link DEFAULT_VECTOR_TOOLS}. Ignored when JSX `children` are provided. */\n\ttools?: VectorToolDefinition[];\n\t/**\n\t * Tool ids placed in the overflow menu at the end of the toolbar (horizontal) or bottom (vertical).\n\t * Defaults to {@link DEFAULT_OVERFLOW_TOOL_IDS}. Pass an empty array to show every tool in the main strip.\n\t * Ignored when JSX `children` are provided.\n\t */\n\toverflowToolIds?: readonly string[];\n\t/** Accessible name for the overflow trigger (menu button). Default: `\"More tools\"`. */\n\toverflowMenuAriaLabel?: string;\n\t/** Accessible name for the toolbar landmark. */\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\t/** Layout direction. */\n\torientation?: \"horizontal\" | \"vertical\";\n\t/** Optional style for the outer `role=\"toolbar\"` element. */\n\tstyle?: CSSProperties;\n\t/** Class names applied to every tool button. */\n\tbuttonClassName?: string;\n\t/** Extra class names when that tool is selected. */\n\tactiveButtonClassName?: string;\n\t/** Shows a lock toggle that keeps current tool active after use. Ignored when JSX `children` are provided. */\n\tshowToolLockToggle?: boolean;\n\t/** Controlled lock state for tool persistence. */\n\ttoolLocked?: boolean;\n\t/** Called when lock state changes. */\n\tonToolLockedChange?: (locked: boolean) => void;\n\t/** `compact` = icon + tooltip only; `comfortable` = small caption under the icon. */\n\tdensity?: \"compact\" | \"comfortable\";\n\t/**\n\t * Toolbar contents.\n\t *\n\t * - **Render function**: full control via {@link VectorToolbarRenderContext}. Default buttons are not rendered.\n\t * - **JSX nodes** (e.g. `<VectorToolbar.Hand />`, `<VectorToolbar.Tool id=\"…\" />`): composable items.\n\t * Pick exactly which tools to render; default tool list and `showToolLockToggle` are ignored.\n\t * - **Omitted**: render the default tool strip from `tools` / {@link DEFAULT_VECTOR_TOOLS}.\n\t */\n\tchildren?: ReactNode | ((ctx: VectorToolbarRenderContext) => ReactNode);\n\t/**\n\t * Partial customization: render the content of each tool button (icon + label layout).\n\t * Default: icon with optional label below on narrow toolbars, or icon-only if `icon` is set.\n\t */\n\trenderToolButton?: (props: {\n\t\ttool: VectorToolDefinition;\n\t\tselected: boolean;\n\t\tonSelect: () => void;\n\t}) => ReactNode;\n};\n\n/**\n * Props for {@link VectorToolbar.Tool}.\n *\n * Identical to {@link VectorToolDefinition} so any tool can be rendered as\n * `<VectorToolbar.Tool {...def} />`. Use the pre-bound bindings (e.g. `<VectorToolbar.Hand />`)\n * for the built-in tools and `<VectorToolbar.Tool />` for custom ones.\n */\nexport type VectorToolbarToolProps = VectorToolDefinition & {\n\tclassName?: string;\n};\n\n/** Props for {@link VectorToolbar.ToolLock}. */\nexport type VectorToolbarToolLockProps = {\n\tclassName?: string;\n\t/** Render the trailing visual divider that separates the lock from the tools. @default true */\n\tdivider?: boolean;\n};\n\n/** Props for {@link VectorToolbar.Overflow}. */\nexport type VectorToolbarOverflowProps = {\n\t/** Tools rendered inside the dropdown (typically `<VectorToolbar.Tool />` items). */\n\tchildren: ReactNode;\n\t/** Accessible name for the overflow trigger. @default \"More tools\" */\n\tariaLabel?: string;\n};\n\ntype VectorToolbarItemContextValue = {\n\tselectedId: string;\n\tselectTool: (id: string) => void;\n\ttoolLocked: boolean;\n\tsetToolLocked: (locked: boolean) => void;\n\tdensity: \"compact\" | \"comfortable\";\n\tbuttonClassName: string;\n\tactiveButtonClassName: string;\n\trenderToolButton?: VectorToolbarProps[\"renderToolButton\"];\n\tinsideOverflow: boolean;\n\tcloseOverflow: () => void;\n\torientation: \"horizontal\" | \"vertical\";\n};\n\nconst VectorToolbarItemContext = createContext<VectorToolbarItemContextValue | null>(\n\tnull,\n);\n\nfunction useVectorToolbarItemContext(\n\tcomponentName: string,\n): VectorToolbarItemContextValue {\n\tconst ctx = useContext(VectorToolbarItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(`${componentName} must be used inside <VectorToolbar>`);\n\t}\n\treturn ctx;\n}\n\nconst toolbarStyles: CSSProperties = {\n\tdisplay: \"flex\",\n\tgap: \"4px\",\n\talignItems: \"center\",\n\tflexWrap: \"wrap\",\n\tpadding: \"6px 8px\",\n\tborderRadius: \"8px\",\n\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\tbackground: \"rgba(255,255,255,0.95)\",\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tuserSelect: \"none\",\n\tWebkitUserSelect: \"none\",\n\tWebkitTouchCallout: \"none\",\n};\n\n/** Injected once; tooltips show on hover / keyboard focus within the tool wrap. */\nconst TOOLBAR_TOOLTIP_CSS = `\n.vector-toolbar-tool-wrap {\n\tposition: relative;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n.vector-toolbar-tip {\n\tposition: absolute;\n\tleft: 50%;\n\tbottom: calc(100% + 8px);\n\ttransform: translateX(-50%);\n\tpadding: 5px 10px;\n\tfont-size: 11px;\n\tfont-weight: 600;\n\tline-height: 1.25;\n\twhite-space: nowrap;\n\tbackground: #18181b;\n\tcolor: #fafafa;\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 14px rgba(0,0,0,0.18);\n\tpointer-events: none;\n\tz-index: 100;\n\topacity: 0;\n\tvisibility: hidden;\n\ttransition: opacity 0.12s ease, visibility 0.12s ease;\n\tmax-width: min(240px, 70vw);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.vector-toolbar-tool-wrap:has(button:hover) .vector-toolbar-tip,\n.vector-toolbar-tool-wrap:has(button:focus-visible) .vector-toolbar-tip {\n\topacity: 1;\n\tvisibility: visible;\n}\n[data-slot=\"vector-canvas-toolbar\"][data-position^=\"top-\"] .vector-toolbar-tip {\n\ttop: calc(100% + 8px);\n\tbottom: auto;\n}\n`;\n\nconst OVERFLOW_MENU_CSS = `\n.vector-toolbar-overflow-panel {\n\tposition: absolute;\n\tbottom: calc(100% + 6px);\n\ttop: auto;\n\tright: 0;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, 40px);\n\tgap: 6px;\n\tpadding: 10px;\n\tborder-radius: 10px;\n\tborder: 1px solid rgba(0,0,0,0.1);\n\tbackground: rgba(255,255,255,0.98);\n\tbox-shadow:\n\t\t0 -4px 24px rgba(0,0,0,0.08),\n\t\t0 0 0 1px rgba(255,255,255,0.6) inset;\n\tz-index: 200;\n\toverflow: visible;\n}\n.vector-toolbar-overflow-anchor {\n\tposition: relative;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n.vector-toolbar-overflow-anchor .vector-toolbar-tip {\n\tleft: auto;\n\tright: 0;\n\ttransform: none;\n}\n.vector-toolbar-overflow-cell {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 40px;\n\theight: 40px;\n}\n.vector-toolbar-overflow-cell > button {\n\twidth: 100%;\n\theight: 100%;\n\tmin-width: 0;\n\tmin-height: 0;\n}\n.vector-toolbar-overflow-tip {\n\tposition: absolute;\n\tleft: 50%;\n\tbottom: calc(100% + 8px);\n\ttop: auto;\n\ttransform: translateX(-50%);\n\tpadding: 6px 10px;\n\tfont-size: 11px;\n\tfont-weight: 600;\n\tline-height: 1.35;\n\ttext-align: center;\n\twhite-space: normal;\n\tbackground: #18181b;\n\tcolor: #fafafa;\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 14px rgba(0,0,0,0.2);\n\tpointer-events: none;\n\tz-index: 210;\n\topacity: 0;\n\tvisibility: hidden;\n\ttransition: opacity 0.12s ease, visibility 0.12s ease;\n\tmax-width: min(220px, 70vw);\n}\n.vector-toolbar-overflow-tip-shortcut {\n\tdisplay: block;\n\tmargin-top: 2px;\n\tfont-size: 10px;\n\tfont-weight: 600;\n\tfont-variant-numeric: tabular-nums;\n\tletter-spacing: 0.04em;\n\topacity: 0.85;\n\tcolor: #a1a1aa;\n}\n.vector-toolbar-overflow-cell:has(button:hover) .vector-toolbar-overflow-tip,\n.vector-toolbar-overflow-cell:has(button:focus-visible) .vector-toolbar-overflow-tip {\n\topacity: 1;\n\tvisibility: visible;\n}\n[data-slot=\"vector-canvas-toolbar\"][data-position^=\"top-\"] .vector-toolbar-overflow-tip {\n\ttop: calc(100% + 8px);\n\tbottom: auto;\n}\n.vector-toolbar-overflow-cell > button {\n\tbackground: rgba(24,24,27,0.05);\n}\n.vector-toolbar-overflow-cell > button:hover {\n\tbackground: rgba(24,24,27,0.1);\n}\n.vector-toolbar-overflow-cell > button[aria-checked=\"true\"] {\n\tbackground: rgba(24,24,27,0.14);\n\tborder-color: rgba(24,24,27,0.22);\n\tbox-shadow: inset 0 0 0 1px rgba(24,24,27,0.08);\n}\n.vector-toolbar-overflow-cell > button[aria-checked=\"true\"]:hover {\n\tbackground: rgba(24,24,27,0.18);\n}\n.vector-toolbar-overflow-cell > button:focus-visible {\n\toutline: 2px solid rgba(24,24,27,0.35);\n\toutline-offset: 1px;\n}\n`;\n\n/** Narrow viewports: single-row scroll strip, tighter chrome, safe overflow palette width. */\nconst TOOLBAR_MOBILE_CSS = `\n@media (max-width: 639px) {\n\t.vector-toolbar[data-orientation=\"horizontal\"] {\n\t\tflex-wrap: nowrap;\n\t\talign-items: center;\n\t\tgap: 2px;\n\t\tpadding: 4px 4px;\n\t\tmax-width: 100%;\n\t\toverflow-x: auto;\n\t\toverflow-y: hidden;\n\t\t-webkit-overflow-scrolling: touch;\n\t\toverscroll-behavior-x: contain;\n\t\ttouch-action: pan-x;\n\t\tscrollbar-width: none;\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"]::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"] .vector-toolbar-spacer {\n\t\tflex: 1 1 4px;\n\t\tmin-width: 2px;\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"] .vector-toolbar-tool-wrap button {\n\t\tmin-width: 38px;\n\t\tmin-height: 38px;\n\t\tpadding: 4px 5px;\n\t}\n\t.vector-toolbar-overflow-panel {\n\t\tmax-width: min(calc(100vw - 16px), 260px);\n\t\tright: 0;\n\t\tleft: auto;\n\t\tgrid-template-columns: repeat(3, 36px);\n\t\tgap: 5px;\n\t\tpadding: 8px;\n\t}\n\t.vector-toolbar-overflow-cell {\n\t\twidth: 36px;\n\t\theight: 36px;\n\t}\n\t.vector-toolbar-overflow-tip {\n\t\tfont-size: 10px;\n\t\tpadding: 5px 8px;\n\t\tmax-width: min(200px, 85vw);\n\t}\n\t.vector-toolbar[data-orientation=\"horizontal\"] button.vector-toolbar-overflow-trigger {\n\t\tmin-width: 40px !important;\n\t\tmin-height: 38px !important;\n\t\tpadding: 4px 6px !important;\n\t}\n}\n`;\n\nconst defaultButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\tflexDirection: \"column\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tgap: \"2px\",\n\tminWidth: \"44px\",\n\tminHeight: \"44px\",\n\tpadding: \"4px 6px\",\n\tborderWidth: \"1px\",\n\tborderStyle: \"solid\",\n\tborderColor: \"transparent\",\n\tborderRadius: \"6px\",\n\tbackground: \"transparent\",\n\tcursor: \"pointer\",\n\tfontSize: \"10px\",\n\tcolor: \"#18181b\",\n\toutline: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n\tuserSelect: \"none\",\n\tWebkitUserSelect: \"none\",\n\tWebkitTouchCallout: \"none\",\n};\n\nconst toolLockDividerStyle: CSSProperties = {\n\twidth: 1,\n\talignSelf: \"stretch\",\n\tbackground: \"rgba(24,24,27,0.14)\",\n\tmargin: \"4px 6px\",\n};\n\nconst overflowSpacerStyle: CSSProperties = {\n\tflex: \"1 1 0\",\n\tminWidth: \"8px\",\n\tminHeight: \"8px\",\n};\n\n/** Icon-only grid tile inside the overflow palette (surface + border from CSS). */\nconst overflowGridCellButtonStyle: CSSProperties = {\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tpadding: 0,\n\tborderWidth: \"1px\",\n\tborderStyle: \"solid\",\n\tborderColor: \"transparent\",\n\tborderRadius: \"8px\",\n\tcursor: \"pointer\",\n\tcolor: \"#18181b\",\n\toutline: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\n/** Style overlay applied to a toolbar button when its tool is active / locked / open. */\nconst activeToggleStyle: CSSProperties = {\n\tbackground: \"rgba(24,24,27,0.1)\",\n\tborderColor: \"rgba(24,24,27,0.28)\",\n\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\n};\n\nconst inactiveToggleStyle: CSSProperties = {\n\tborderColor: \"transparent\",\n\tboxShadow: \"none\",\n};\n\n/**\n * Block the default mousedown-induced focus shift so the surrounding viewport\n * keeps focus while the user picks a tool. No-op for touch / pen so virtual\n * keyboards and pencil affordances behave normally.\n */\nfunction preventMouseDefault(e: React.PointerEvent) {\n\tif (e.pointerType === \"mouse\") {\n\t\te.preventDefault();\n\t}\n}\n\nfunction ToolLockGlyph({ locked }: { locked: boolean }) {\n\tconst Icon = locked ? Lock : LockOpen;\n\treturn <Icon size={18} strokeWidth={2} aria-hidden />;\n}\n\nfunction splitToolbarTools(\n\ttools: VectorToolDefinition[],\n\toverflowIds: readonly string[],\n): { primary: VectorToolDefinition[]; overflow: VectorToolDefinition[] } {\n\tif (overflowIds.length === 0) {\n\t\treturn { primary: tools, overflow: [] };\n\t}\n\tconst overflowSet = new Set<string>(overflowIds);\n\tconst primary = tools.filter((t) => !overflowSet.has(t.id));\n\tconst overflow = overflowIds\n\t\t.map((id) => tools.find((t) => t.id === id))\n\t\t.filter((t): t is VectorToolDefinition => Boolean(t));\n\treturn { primary, overflow };\n}\n\n/**\n * Tracks the last overflow-menu tool the user picked so we can surface it as a\n * dedicated button next to the overflow trigger. `overflowTools` comes from\n * a `useMemo` upstream — its identity changes when the tool list changes,\n * which is exactly when this effect should re-run, so listing it in the deps\n * array is correct (not a stable-reference smell).\n */\nfunction usePromotedOverflowTool({\n\toverflowTools,\n\tselectedId,\n\tinitialPromotedId,\n}: {\n\toverflowTools: VectorToolDefinition[];\n\tselectedId: string;\n\tinitialPromotedId: string | null;\n}): {\n\tpromotedTool: VectorToolDefinition | undefined;\n\tremainingOverflowTools: VectorToolDefinition[];\n} {\n\tconst [lastOverflowToolId, setLastOverflowToolId] = useState<string | null>(() => {\n\t\tif (initialPromotedId == null) return null;\n\t\treturn overflowTools.some((t) => t.id === initialPromotedId)\n\t\t\t? initialPromotedId\n\t\t\t: null;\n\t});\n\tuseEffect(() => {\n\t\tif (overflowTools.some((t) => t.id === selectedId)) {\n\t\t\tsetLastOverflowToolId(selectedId);\n\t\t}\n\t}, [selectedId, overflowTools]);\n\n\tconst promotedTool = lastOverflowToolId\n\t\t? overflowTools.find((t) => t.id === lastOverflowToolId)\n\t\t: undefined;\n\tconst remainingOverflowTools = promotedTool\n\t\t? overflowTools.filter((t) => t.id !== promotedTool.id)\n\t\t: overflowTools;\n\treturn { promotedTool, remainingOverflowTools };\n}\n\nconst icOverflow = { size: 18, strokeWidth: 2 } as const;\n\ntype UseOverflowDropdownResult = {\n\topen: boolean;\n\tsetOpen: React.Dispatch<React.SetStateAction<boolean>>;\n\tclose: () => void;\n\twrapRef: RefObject<HTMLDivElement | null>;\n\ttriggerRef: RefObject<HTMLButtonElement | null>;\n\tmenuId: string;\n};\n\n/** Shared open/close logic for the overflow dropdown (outside-click, Escape, focus restore). */\nfunction useOverflowDropdown(): UseOverflowDropdownResult {\n\tconst [open, setOpen] = useState(false);\n\tconst wrapRef = useRef<HTMLDivElement>(null);\n\tconst triggerRef = useRef<HTMLButtonElement>(null);\n\tconst menuId = useId();\n\n\tconst close = useCallback(() => {\n\t\tsetOpen(false);\n\t}, []);\n\n\tconst prevOpenRef = useRef(open);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst onDocPointerDown = (e: PointerEvent) => {\n\t\t\tif (wrapRef.current?.contains(e.target as Node)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclose();\n\t\t};\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\te.stopPropagation();\n\t\t\t\tclose();\n\t\t\t\ttriggerRef.current?.focus();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"pointerdown\", onDocPointerDown, true);\n\t\tdocument.addEventListener(\"keydown\", onKeyDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"pointerdown\", onDocPointerDown, true);\n\t\t\tdocument.removeEventListener(\"keydown\", onKeyDown, true);\n\t\t};\n\t}, [open, close]);\n\n\tuseEffect(() => {\n\t\tif (prevOpenRef.current && !open) {\n\t\t\ttriggerRef.current?.focus({ preventScroll: true });\n\t\t}\n\t\tprevOpenRef.current = open;\n\t}, [open]);\n\n\treturn { open, setOpen, close, wrapRef, triggerRef, menuId };\n}\n\ntype InlineButtonContext = Pick<\n\tVectorToolbarItemContextValue,\n\t| \"selectedId\"\n\t| \"selectTool\"\n\t| \"density\"\n\t| \"buttonClassName\"\n\t| \"activeButtonClassName\"\n\t| \"renderToolButton\"\n>;\n\n/** Renders one tool in the primary toolbar row. Pure — drives button styles from `density` and active state. */\nfunction renderInlineToolButton(\n\ttool: VectorToolDefinition,\n\tctx: InlineButtonContext,\n): ReactNode {\n\tconst {\n\t\tselectedId,\n\t\tselectTool,\n\t\tdensity,\n\t\tbuttonClassName,\n\t\tactiveButtonClassName,\n\t\trenderToolButton,\n\t} = ctx;\n\tconst selected = tool.id === selectedId;\n\tconst label = tool.ariaLabel ?? tool.label;\n\n\tif (renderToolButton) {\n\t\treturn (\n\t\t\t<div key={tool.id}>\n\t\t\t\t{renderToolButton({\n\t\t\t\t\ttool,\n\t\t\t\t\tselected,\n\t\t\t\t\tonSelect: () => selectTool(tool.id),\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\tconst tooltipText =\n\t\ttool.shortcutHint !== undefined\n\t\t\t? `${tooltipName} · ${tool.shortcutHint}`\n\t\t\t: tooltipName;\n\n\tconst labelOnly = tool.icon == null;\n\tconst labelTextStyle: CSSProperties = labelOnly\n\t\t? {\n\t\t\t\tfontSize: \"12px\",\n\t\t\t\tfontWeight: 600,\n\t\t\t\tletterSpacing: \"0.02em\",\n\t\t\t\tlineHeight: 1.2,\n\t\t\t\tWebkitFontSmoothing: \"antialiased\",\n\t\t\t\tMozOsxFontSmoothing: \"grayscale\",\n\t\t\t\ttextRendering: \"geometricPrecision\",\n\t\t\t}\n\t\t: {};\n\n\treturn (\n\t\t<span key={tool.id} className=\"vector-toolbar-tool-wrap\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-pressed={selected}\n\t\t\t\taria-label={label}\n\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t: {})}\n\t\t\t\tclassName={`${buttonClassName} ${selected ? activeButtonClassName : \"\"}`.trim()}\n\t\t\t\tstyle={{\n\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t...(density === \"compact\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tminHeight: \"40px\",\n\t\t\t\t\t\t\t\tminWidth: labelOnly ? \"52px\" : \"40px\",\n\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(selected ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t}}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={() => selectTool(tool.id)}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{tool.icon ?? <span style={labelTextStyle}>{tool.label}</span>}\n\t\t\t\t</span>\n\t\t\t\t{density === \"comfortable\" && tool.icon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t\tmaxWidth: \"56px\",\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tool.label}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</button>\n\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t{tooltipText}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\ntype OverflowButtonContext = {\n\tselectedId: string;\n\tselectTool: (id: string) => void;\n\tcloseMenu: () => void;\n\trenderToolButton?: VectorToolbarProps[\"renderToolButton\"];\n\ttabIndex?: number;\n};\n\n/** Renders one tool inside the overflow grid cell. */\nfunction renderOverflowToolButton(\n\ttool: VectorToolDefinition,\n\tctx: OverflowButtonContext,\n): ReactNode {\n\tconst { selectedId, selectTool, closeMenu, renderToolButton, tabIndex } = ctx;\n\tconst selected = tool.id === selectedId;\n\tconst label = tool.ariaLabel ?? tool.label;\n\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\n\tif (renderToolButton) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={tool.id}\n\t\t\t\tclassName=\"vector-toolbar-overflow-cell\"\n\t\t\t\trole=\"presentation\"\n\t\t\t>\n\t\t\t\t{renderToolButton({\n\t\t\t\t\ttool,\n\t\t\t\t\tselected,\n\t\t\t\t\tonSelect: () => {\n\t\t\t\t\t\tselectTool(tool.id);\n\t\t\t\t\t\tcloseMenu();\n\t\t\t\t\t},\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div key={tool.id} className=\"vector-toolbar-overflow-cell\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"menuitemradio\"\n\t\t\t\taria-checked={selected}\n\t\t\t\ttabIndex={tabIndex ?? -1}\n\t\t\t\taria-label={label}\n\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t: {})}\n\t\t\t\tstyle={overflowGridCellButtonStyle}\n\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tselectTool(tool.id);\n\t\t\t\t\tcloseMenu();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\tlineHeight: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{tool.icon ?? (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: \"11px\",\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tlineHeight: 1.1,\n\t\t\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\t\t\tmaxWidth: \"34px\",\n\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{tool.label.slice(0, 3)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"vector-toolbar-overflow-tip\" aria-hidden=\"true\">\n\t\t\t\t\t<span>{tooltipName}</span>\n\t\t\t\t\t{tool.shortcutHint !== undefined ? (\n\t\t\t\t\t\t<span className=\"vector-toolbar-overflow-tip-shortcut\">\n\t\t\t\t\t\t\t{tool.shortcutHint}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction hasToolIdProp(value: unknown): value is { toolId: string } {\n\treturn (\n\t\ttypeof value === \"function\" &&\n\t\t\"toolId\" in value &&\n\t\ttypeof (value as { toolId: unknown }).toolId === \"string\"\n\t);\n}\n\n/**\n * Inspects each child of `<VectorToolbar.Overflow>` and returns a partial tool\n * definition for the one whose id matches `selectedId`. Used to highlight the\n * trigger and show the active tool's icon when the dropdown is closed.\n *\n * Recognized child types:\n * - Pre-bound bindings (e.g. `<VectorToolbar.Hand />`): identified by a\n * `toolId` static property on the component function.\n * - `<VectorToolbar.Tool>` and any element whose props carry `id`/`icon`/`label`.\n */\nfunction findActiveOverflowChild(\n\tchildren: ReactNode,\n\tselectedId: string,\n): { id: string; label: string; icon: ReactNode } | null {\n\tlet result: { id: string; label: string; icon: ReactNode } | null = null;\n\tChildren.forEach(children, (child) => {\n\t\tif (result || !isValidElement(child)) {\n\t\t\treturn;\n\t\t}\n\t\tconst childType: unknown = child.type;\n\t\tlet toolId: string | undefined;\n\t\tlet label = \"\";\n\t\tlet icon: ReactNode = null;\n\n\t\tconst childProps = (child.props ?? {}) as Partial<VectorToolDefinition>;\n\t\tif (hasToolIdProp(childType)) {\n\t\t\ttoolId = childType.toolId;\n\t\t\tconst def = DEFAULT_VECTOR_TOOLS.find((t) => t.id === toolId);\n\t\t\tif (def) {\n\t\t\t\tlabel = def.label;\n\t\t\t\ticon = def.icon ?? null;\n\t\t\t}\n\t\t} else {\n\t\t\ttoolId = childProps.id;\n\t\t\tlabel = childProps.label ?? \"\";\n\t\t\ticon = childProps.icon ?? null;\n\t\t}\n\n\t\tif (childProps.icon !== undefined) {\n\t\t\ticon = childProps.icon;\n\t\t}\n\t\tif (childProps.label !== undefined && childProps.label !== \"\") {\n\t\t\tlabel = childProps.label;\n\t\t}\n\n\t\tif (toolId !== undefined && toolId === selectedId) {\n\t\t\tresult = { id: toolId, label, icon };\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * A single tool inside `<VectorToolbar>`. Use the pre-bound bindings for built-in tools\n * (e.g. `<VectorToolbar.Hand />`) or this component for custom ones.\n *\n * Automatically adapts its layout based on whether it sits in the primary strip or inside\n * an `<VectorToolbar.Overflow>` dropdown.\n *\n * @example\n * ```tsx\n * <VectorToolbar value={toolId} onChange={setToolId}>\n * <VectorToolbar.Tool id=\"my-tool\" label=\"Custom\" icon={<MyIcon />} shortcutHint=\"C\" />\n * </VectorToolbar>\n * ```\n */\nexport function VectorToolbarTool(props: VectorToolbarToolProps) {\n\tconst ctx = useVectorToolbarItemContext(\"VectorToolbar.Tool\");\n\tconst tool: VectorToolDefinition = {\n\t\tid: props.id,\n\t\tlabel: props.label,\n\t\ttooltipLabel: props.tooltipLabel,\n\t\ticon: props.icon,\n\t\tshortcutHint: props.shortcutHint,\n\t\tariaLabel: props.ariaLabel,\n\t};\n\n\tif (ctx.insideOverflow) {\n\t\treturn renderOverflowToolButton(tool, {\n\t\t\tselectedId: ctx.selectedId,\n\t\t\tselectTool: ctx.selectTool,\n\t\t\tcloseMenu: ctx.closeOverflow,\n\t\t\trenderToolButton: ctx.renderToolButton,\n\t\t});\n\t}\n\n\treturn renderInlineToolButton(tool, {\n\t\tselectedId: ctx.selectedId,\n\t\tselectTool: ctx.selectTool,\n\t\tdensity: ctx.density,\n\t\tbuttonClassName: ctx.buttonClassName,\n\t\tactiveButtonClassName: ctx.activeButtonClassName,\n\t\trenderToolButton: ctx.renderToolButton,\n\t});\n}\n\n/**\n * Lock toggle button. When on, the active tool persists after each use instead of\n * auto-reverting to the previous tool.\n */\nexport function VectorToolbarToolLock({\n\tclassName,\n\tdivider = true,\n}: VectorToolbarToolLockProps = {}) {\n\tconst ctx = useVectorToolbarItemContext(\"VectorToolbar.ToolLock\");\n\tconst {\n\t\ttoolLocked,\n\t\tsetToolLocked,\n\t\tbuttonClassName,\n\t\tactiveButtonClassName,\n\t\tdensity,\n\t} = ctx;\n\treturn (\n\t\t<>\n\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={toolLocked}\n\t\t\t\t\taria-label={toolLocked ? \"Unlock tool\" : \"Lock tool\"}\n\t\t\t\t\tclassName={`${buttonClassName} ${toolLocked ? activeButtonClassName : \"\"} ${className ?? \"\"}`.trim()}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\t...(density === \"compact\"\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tminHeight: \"40px\",\n\t\t\t\t\t\t\t\t\tminWidth: \"40px\",\n\t\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t...(toolLocked ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\tonClick={() => setToolLocked(!toolLocked)}\n\t\t\t\t>\n\t\t\t\t\t<ToolLockGlyph locked={toolLocked} />\n\t\t\t\t</button>\n\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t{toolLocked ? \"Tool lock on\" : \"Tool lock off\"}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t{divider ? <span aria-hidden style={toolLockDividerStyle} /> : null}\n\t\t</>\n\t);\n}\n\n/**\n * Composable overflow dropdown. Children render inside a 3-column grid revealed when the user\n * clicks the chevron trigger. The trigger highlights itself when its currently active child is selected.\n *\n * @example\n * ```tsx\n * <VectorToolbar value={toolId} onChange={setToolId}>\n * <VectorToolbar.Hand />\n * <VectorToolbar.Overflow>\n * <VectorToolbar.Rect />\n * <VectorToolbar.Ellipse />\n * </VectorToolbar.Overflow>\n * </VectorToolbar>\n * ```\n */\nexport function VectorToolbarOverflow({\n\tchildren,\n\tariaLabel = \"More tools\",\n}: VectorToolbarOverflowProps) {\n\tconst ctx = useVectorToolbarItemContext(\"VectorToolbar.Overflow\");\n\tconst { open, setOpen, close, wrapRef, triggerRef, menuId } =\n\t\tuseOverflowDropdown();\n\n\tif (ctx.insideOverflow) {\n\t\tthrow new Error(\"VectorToolbar.Overflow cannot be nested.\");\n\t}\n\n\tconst activeChild = findActiveOverflowChild(children, ctx.selectedId);\n\tconst triggerHighlighted = open || activeChild !== null;\n\tconst customRenderer = Boolean(ctx.renderToolButton);\n\n\tconst nestedCtx: VectorToolbarItemContextValue = {\n\t\t...ctx,\n\t\tinsideOverflow: true,\n\t\tcloseOverflow: close,\n\t};\n\n\treturn (\n\t\t<div ref={wrapRef} className=\"vector-toolbar-overflow-anchor\">\n\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t<button\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tid={`${menuId}-trigger`}\n\t\t\t\t\taria-haspopup={customRenderer ? \"true\" : \"menu\"}\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\taria-controls={open ? `${menuId}-menu` : undefined}\n\t\t\t\t\taria-label={activeChild ? `${ariaLabel}: ${activeChild.label}` : ariaLabel}\n\t\t\t\t\tclassName={`vector-toolbar-overflow-trigger ${ctx.buttonClassName} ${triggerHighlighted ? ctx.activeButtonClassName : \"\"}`.trim()}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\tflexDirection: \"row\",\n\t\t\t\t\t\tminWidth: \"48px\",\n\t\t\t\t\t\tminHeight: ctx.density === \"compact\" ? \"40px\" : \"44px\",\n\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\tgap: \"4px\",\n\t\t\t\t\t\t...(triggerHighlighted ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\tonClick={() => setOpen((o) => !o)}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (e.key === \"ArrowDown\" && !open) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{activeChild?.icon ?? (\n\t\t\t\t\t\t\t<Shapes {...icOverflow} aria-hidden strokeWidth={2} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: 0.75,\n\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\ttransform: open ? \"rotate(180deg)\" : undefined,\n\t\t\t\t\t\t\ttransition: \"transform 0.15s ease\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t{ariaLabel}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t{open ? (\n\t\t\t\tcustomRenderer ? (\n\t\t\t\t\t<section\n\t\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<VectorToolbarItemContext.Provider value={nestedCtx}>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</VectorToolbarItemContext.Provider>\n\t\t\t\t\t</section>\n\t\t\t\t) : (\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<VectorToolbarItemContext.Provider value={nestedCtx}>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</VectorToolbarItemContext.Provider>\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\ntype OverflowMenuProps = {\n\ttools: VectorToolDefinition[];\n\tselectedId: string;\n\tonSelect: (id: string) => void;\n\tdensity: \"compact\" | \"comfortable\";\n\tbuttonClassName: string;\n\tactiveButtonClassName: string;\n\trenderToolButton?: VectorToolbarProps[\"renderToolButton\"];\n\tmenuAriaLabel: string;\n};\n\n/** Default overflow menu used by `VectorToolbar` when no JSX children are provided. */\nfunction ToolbarOverflowMenu({\n\ttools,\n\tselectedId,\n\tonSelect,\n\tdensity,\n\tbuttonClassName,\n\tactiveButtonClassName,\n\trenderToolButton,\n\tmenuAriaLabel,\n}: OverflowMenuProps) {\n\tconst { open, setOpen, close, wrapRef, triggerRef, menuId } =\n\t\tuseOverflowDropdown();\n\n\tconst activeInOverflow = tools.some((t) => t.id === selectedId);\n\tconst activeTool = tools.find((t) => t.id === selectedId);\n\n\tconst triggerHighlighted = open || activeInOverflow;\n\n\treturn (\n\t\t<div ref={wrapRef} className=\"vector-toolbar-overflow-anchor\">\n\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t<button\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tid={`${menuId}-trigger`}\n\t\t\t\t\taria-haspopup={renderToolButton ? \"true\" : \"menu\"}\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\taria-controls={open ? `${menuId}-menu` : undefined}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tactiveTool\n\t\t\t\t\t\t\t? `${menuAriaLabel}: ${activeTool.ariaLabel ?? activeTool.label}`\n\t\t\t\t\t\t\t: menuAriaLabel\n\t\t\t\t\t}\n\t\t\t\t\tclassName={`vector-toolbar-overflow-trigger ${buttonClassName} ${triggerHighlighted ? activeButtonClassName : \"\"}`.trim()}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\tflexDirection: \"row\",\n\t\t\t\t\t\tminWidth: \"48px\",\n\t\t\t\t\t\tminHeight: density === \"compact\" ? \"40px\" : \"44px\",\n\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\tgap: \"4px\",\n\t\t\t\t\t\t...(triggerHighlighted ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\tonClick={() => setOpen((o) => !o)}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (e.key === \"ArrowDown\" && !open) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{activeTool?.icon ?? (\n\t\t\t\t\t\t\t<Shapes {...icOverflow} aria-hidden strokeWidth={2} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: 0.75,\n\t\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t\t\ttransform: open ? \"rotate(180deg)\" : undefined,\n\t\t\t\t\t\t\ttransition: \"transform 0.15s ease\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t{menuAriaLabel}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t{open && renderToolButton ? (\n\t\t\t\t<section\n\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\taria-label={menuAriaLabel}\n\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t>\n\t\t\t\t\t{tools.map((tool) =>\n\t\t\t\t\t\trenderOverflowToolButton(tool, {\n\t\t\t\t\t\t\tselectedId,\n\t\t\t\t\t\t\tselectTool: onSelect,\n\t\t\t\t\t\t\tcloseMenu: close,\n\t\t\t\t\t\t\trenderToolButton,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)}\n\t\t\t\t</section>\n\t\t\t) : null}\n\t\t\t{open && !renderToolButton ? (\n\t\t\t\t<div\n\t\t\t\t\tid={`${menuId}-menu`}\n\t\t\t\t\trole=\"menu\"\n\t\t\t\t\taria-label={menuAriaLabel}\n\t\t\t\t\tclassName=\"vector-toolbar-overflow-panel\"\n\t\t\t\t>\n\t\t\t\t\t{tools.map((tool, index) =>\n\t\t\t\t\t\trenderOverflowToolButton(tool, {\n\t\t\t\t\t\t\tselectedId,\n\t\t\t\t\t\t\tselectTool: onSelect,\n\t\t\t\t\t\t\tcloseMenu: close,\n\t\t\t\t\t\t\ttabIndex: index === 0 ? 0 : -1,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\n/**\n * Default floating-style toolbar for choosing vector tools (hand, shapes, draw, marker, text, …).\n *\n * Three modes:\n * - **Default** (no `children`): renders the full tool strip from `tools` / {@link DEFAULT_VECTOR_TOOLS},\n * with the standard overflow dropdown and optional lock toggle.\n * - **Composable** (JSX `children`): pick exactly which items to render\n * (e.g. `<VectorToolbar.Hand />`, `<VectorToolbar.Overflow>…</VectorToolbar.Overflow>`).\n * - **Render-prop** (`children` is a function): full control. The default chrome is not rendered.\n *\n * @example\n * ```tsx\n * const [tool, setTool] = useState(\"hand\");\n *\n * // Default\n * <VectorToolbar value={tool} onChange={setTool} aria-label=\"Canvas tools\" />\n *\n * // Composable\n * <VectorToolbar value={tool} onChange={setTool}>\n * <VectorToolbar.ToolLock />\n * <VectorToolbar.Hand />\n * <VectorToolbar.Select />\n * <VectorToolbar.Draw />\n * <VectorToolbar.Overflow>\n * <VectorToolbar.Rect />\n * <VectorToolbar.Ellipse />\n * </VectorToolbar.Overflow>\n * </VectorToolbar>\n * ```\n */\nfunction VectorToolbarComponent({\n\tvalue,\n\tonChange,\n\ttools,\n\toverflowToolIds = DEFAULT_OVERFLOW_TOOL_IDS,\n\toverflowMenuAriaLabel = \"More tools\",\n\t\"aria-label\": ariaLabel = \"Canvas tools\",\n\tclassName = \"\",\n\torientation = \"horizontal\",\n\tstyle,\n\tbuttonClassName = \"\",\n\tactiveButtonClassName = \"\",\n\tshowToolLockToggle = true,\n\ttoolLocked = false,\n\tonToolLockedChange,\n\tdensity = \"compact\",\n\tchildren,\n\trenderToolButton,\n}: VectorToolbarProps) {\n\tconst pluginContext = useContext(CanvuPluginContext);\n\tconst runtimeTools = pluginContext?.resolvedTools;\n\tconst resolvedTools = tools ?? runtimeTools ?? DEFAULT_VECTOR_TOOLS;\n\n\t/**\n\t * Compute the overflow split + promoted-tool state up here so the\n\t * `usePromotedOverflowTool` hook runs unconditionally on every render.\n\t * The two early-return paths below don't use these values, but moving the\n\t * hook above them is what satisfies the Rules of Hooks.\n\t */\n\tconst { primary: primaryTools, overflow: overflowTools } = splitToolbarTools(\n\t\tresolvedTools,\n\t\toverflowToolIds,\n\t);\n\tconst { promotedTool, remainingOverflowTools } = usePromotedOverflowTool({\n\t\toverflowTools,\n\t\tselectedId: value,\n\t\tinitialPromotedId: overflowToolIds[0] ?? null,\n\t});\n\n\tif (typeof children === \"function\") {\n\t\tconst ctx: VectorToolbarRenderContext = {\n\t\t\ttools: resolvedTools,\n\t\t\tselectedId: value,\n\t\t\tselectTool: onChange,\n\t\t\ttoolLocked,\n\t\t\tsetToolLocked: (locked: boolean) => onToolLockedChange?.(locked),\n\t\t};\n\t\treturn (\n\t\t\t<div className={className} style={style}>\n\t\t\t\t{children(ctx)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst flexDir = orientation === \"vertical\" ? \"column\" : \"row\";\n\tconst toolbarClass =\n\t\tclassName.trim() === \"\"\n\t\t\t? \"vector-toolbar\"\n\t\t\t: `vector-toolbar ${className.trim()}`;\n\n\tif (children !== undefined && children !== null) {\n\t\tconst itemCtx: VectorToolbarItemContextValue = {\n\t\t\tselectedId: value,\n\t\t\tselectTool: onChange,\n\t\t\ttoolLocked,\n\t\t\tsetToolLocked: (locked: boolean) => onToolLockedChange?.(locked),\n\t\t\tdensity,\n\t\t\tbuttonClassName,\n\t\t\tactiveButtonClassName,\n\t\t\trenderToolButton,\n\t\t\tinsideOverflow: false,\n\t\t\tcloseOverflow: noop,\n\t\t\torientation,\n\t\t};\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<style>{TOOLBAR_TOOLTIP_CSS}</style>\n\t\t\t\t<style>{OVERFLOW_MENU_CSS}</style>\n\t\t\t\t<style>{TOOLBAR_MOBILE_CSS}</style>\n\t\t\t\t<div\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\tdata-orientation={orientation}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-orientation={orientation === \"vertical\" ? \"vertical\" : \"horizontal\"}\n\t\t\t\t\tclassName={toolbarClass}\n\t\t\t\t\tstyle={{ ...toolbarStyles, flexDirection: flexDir, ...style }}\n\t\t\t\t>\n\t\t\t\t\t<VectorToolbarItemContext.Provider value={itemCtx}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</VectorToolbarItemContext.Provider>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t);\n\t}\n\n\tconst showOverflowMenu = overflowTools.length > 0;\n\tconst showOverflowDropdown = remainingOverflowTools.length > 0;\n\n\tconst inlineCtx: InlineButtonContext = {\n\t\tselectedId: value,\n\t\tselectTool: onChange,\n\t\tdensity,\n\t\tbuttonClassName,\n\t\tactiveButtonClassName,\n\t\trenderToolButton,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<style>{TOOLBAR_TOOLTIP_CSS}</style>\n\t\t\t<style>{OVERFLOW_MENU_CSS}</style>\n\t\t\t<style>{TOOLBAR_MOBILE_CSS}</style>\n\t\t\t<div\n\t\t\t\trole=\"toolbar\"\n\t\t\t\tdata-orientation={orientation}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-orientation={orientation === \"vertical\" ? \"vertical\" : \"horizontal\"}\n\t\t\t\tclassName={toolbarClass}\n\t\t\t\tstyle={{ ...toolbarStyles, flexDirection: flexDir, ...style }}\n\t\t\t>\n\t\t\t\t{showToolLockToggle ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"vector-toolbar-tool-wrap\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={toolLocked}\n\t\t\t\t\t\t\t\taria-label={toolLocked ? \"Unlock tool\" : \"Lock tool\"}\n\t\t\t\t\t\t\t\tclassName={`${buttonClassName} ${toolLocked ? activeButtonClassName : \"\"}`.trim()}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...defaultButtonStyle,\n\t\t\t\t\t\t\t\t\t...(density === \"compact\"\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\tminHeight: \"40px\",\n\t\t\t\t\t\t\t\t\t\t\t\tminWidth: \"40px\",\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t...(toolLocked ? activeToggleStyle : inactiveToggleStyle),\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonPointerDown={preventMouseDefault}\n\t\t\t\t\t\t\t\tonClick={() => onToolLockedChange?.(!toolLocked)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ToolLockGlyph locked={toolLocked} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<span className=\"vector-toolbar-tip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t{toolLocked ? \"Tool lock on\" : \"Tool lock off\"}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span aria-hidden style={toolLockDividerStyle} />\n\t\t\t\t\t</>\n\t\t\t\t) : null}\n\t\t\t\t{primaryTools.map((tool) => renderInlineToolButton(tool, inlineCtx))}\n\t\t\t\t{promotedTool ? renderInlineToolButton(promotedTool, inlineCtx) : null}\n\t\t\t\t{showOverflowMenu && orientation === \"horizontal\" ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\tclassName=\"vector-toolbar-spacer\"\n\t\t\t\t\t\tstyle={overflowSpacerStyle}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t{showOverflowDropdown ? (\n\t\t\t\t\t<ToolbarOverflowMenu\n\t\t\t\t\t\ttools={remainingOverflowTools}\n\t\t\t\t\t\tselectedId={value}\n\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\tbuttonClassName={buttonClassName}\n\t\t\t\t\t\tactiveButtonClassName={activeButtonClassName}\n\t\t\t\t\t\trenderToolButton={renderToolButton}\n\t\t\t\t\t\tmenuAriaLabel={overflowMenuAriaLabel}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nfunction noop() {}\n\ntype ToolBinding = ((props?: { className?: string }) => ReactNode) & {\n\ttoolId: string;\n\tdisplayName: string;\n};\n\nfunction makeToolBinding(id: string): ToolBinding {\n\tconst def = DEFAULT_VECTOR_TOOLS.find((t) => t.id === id);\n\tif (!def) {\n\t\tthrow new Error(`No default tool with id \"${id}\"`);\n\t}\n\tconst Component: ToolBinding = ((props?: { className?: string }) => (\n\t\t<VectorToolbarTool {...def} className={props?.className} />\n\t)) as ToolBinding;\n\tComponent.toolId = id;\n\tComponent.displayName = `VectorToolbar.${def.label}`;\n\treturn Component;\n}\n\nconst HandBinding = makeToolBinding(\"hand\");\nconst SelectBinding = makeToolBinding(\"select\");\nconst RectBinding = makeToolBinding(\"rect\");\nconst EllipseBinding = makeToolBinding(\"ellipse\");\nconst ArchitecturalCloudBinding = makeToolBinding(\"architectural-cloud\");\nconst LineBinding = makeToolBinding(\"line\");\nconst ArrowBinding = makeToolBinding(\"arrow\");\nconst DrawBinding = makeToolBinding(\"draw\");\nconst MarkerBinding = makeToolBinding(\"marker\");\nconst LaserBinding = makeToolBinding(\"laser\");\nconst EraserBinding = makeToolBinding(\"eraser\");\nconst TextBinding = makeToolBinding(\"text\");\nconst ImageBinding = makeToolBinding(\"image\");\n\nVectorToolbarComponent.displayName = \"VectorToolbar\";\n\ntype VectorToolbarWithStatics = ((props: VectorToolbarProps) => ReactElement) & {\n\tTool: typeof VectorToolbarTool;\n\tToolLock: typeof VectorToolbarToolLock;\n\tOverflow: typeof VectorToolbarOverflow;\n\tHand: typeof HandBinding;\n\tSelect: typeof SelectBinding;\n\tRect: typeof RectBinding;\n\tEllipse: typeof EllipseBinding;\n\tArchitecturalCloud: typeof ArchitecturalCloudBinding;\n\tLine: typeof LineBinding;\n\tArrow: typeof ArrowBinding;\n\tDraw: typeof DrawBinding;\n\tMarker: typeof MarkerBinding;\n\tLaser: typeof LaserBinding;\n\tEraser: typeof EraserBinding;\n\tText: typeof TextBinding;\n\tImage: typeof ImageBinding;\n};\n\n/**\n * `VectorToolbar` is a function component with attached subcomponents\n * (`.Tool`, `.ToolLock`, `.Overflow`, and one binding per default tool).\n *\n * The explicit type annotation is what makes the static properties survive\n * `.d.ts` bundling — relying on TypeScript's expando-function inference loses\n * them in tsup output.\n */\nexport const VectorToolbar: VectorToolbarWithStatics = Object.assign(\n\tVectorToolbarComponent,\n\t{\n\t\tTool: VectorToolbarTool,\n\t\tToolLock: VectorToolbarToolLock,\n\t\tOverflow: VectorToolbarOverflow,\n\t\tHand: HandBinding,\n\t\tSelect: SelectBinding,\n\t\tRect: RectBinding,\n\t\tEllipse: EllipseBinding,\n\t\tArchitecturalCloud: ArchitecturalCloudBinding,\n\t\tLine: LineBinding,\n\t\tArrow: ArrowBinding,\n\t\tDraw: DrawBinding,\n\t\tMarker: MarkerBinding,\n\t\tLaser: LaserBinding,\n\t\tEraser: EraserBinding,\n\t\tText: TextBinding,\n\t\tImage: ImageBinding,\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","import type { Camera2D } from \"../camera/camera\";\n\nconst VELOCITY_SAMPLE_WINDOW = 80;\nconst FRICTION = 0.94;\nconst MIN_VELOCITY = 0.3;\n\ntype VelocitySample = { dx: number; dy: number; time: number };\n\nexport type PanMomentumController = {\n\trecordMove: (dx: number, dy: number) => void;\n\tstartMomentum: () => void;\n\tcancel: () => void;\n\treset: () => void;\n};\n\nexport function createPanMomentumController(\n\tcamera: Camera2D,\n\tonUpdate: () => void,\n\tsensitivity: number,\n): PanMomentumController {\n\tconst samples: VelocitySample[] = [];\n\tlet animationFrameId: number | null = null;\n\n\tconst cancel = () => {\n\t\tif (animationFrameId !== null) {\n\t\t\tcancelAnimationFrame(animationFrameId);\n\t\t\tanimationFrameId = null;\n\t\t}\n\t};\n\n\tconst reset = () => {\n\t\tcancel();\n\t\tsamples.length = 0;\n\t};\n\n\tconst recordMove = (dx: number, dy: number) => {\n\t\tconst now = performance.now();\n\t\tsamples.push({ dx, dy, time: now });\n\n\t\tconst cutoff = now - VELOCITY_SAMPLE_WINDOW;\n\t\tlet oldestSample = samples[0];\n\t\twhile (oldestSample && oldestSample.time < cutoff) {\n\t\t\tsamples.shift();\n\t\t\toldestSample = samples[0];\n\t\t}\n\t};\n\n\tconst computeReleaseVelocity = (): { vx: number; vy: number } => {\n\t\tif (samples.length < 2) return { vx: 0, vy: 0 };\n\n\t\tconst first = samples[0];\n\t\tconst last = samples[samples.length - 1];\n\t\tif (!first || !last) return { vx: 0, vy: 0 };\n\t\tconst elapsed = last.time - first.time;\n\t\tif (elapsed < 4) return { vx: 0, vy: 0 };\n\n\t\tlet totalDx = 0;\n\t\tlet totalDy = 0;\n\t\tfor (const sample of samples) {\n\t\t\ttotalDx += sample.dx;\n\t\t\ttotalDy += sample.dy;\n\t\t}\n\n\t\tconst msPerFrame = 1000 / 60;\n\t\treturn {\n\t\t\tvx: (totalDx / elapsed) * msPerFrame * sensitivity,\n\t\t\tvy: (totalDy / elapsed) * msPerFrame * sensitivity,\n\t\t};\n\t};\n\n\tconst startMomentum = () => {\n\t\tcancel();\n\t\tconst { vx, vy } = computeReleaseVelocity();\n\t\tsamples.length = 0;\n\n\t\tif (Math.abs(vx) < MIN_VELOCITY && Math.abs(vy) < MIN_VELOCITY) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentVx = vx;\n\t\tlet currentVy = vy;\n\n\t\tconst animate = () => {\n\t\t\tcurrentVx *= FRICTION;\n\t\t\tcurrentVy *= FRICTION;\n\n\t\t\tif (Math.abs(currentVx) < MIN_VELOCITY && Math.abs(currentVy) < MIN_VELOCITY) {\n\t\t\t\tanimationFrameId = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcamera.x += currentVx;\n\t\t\tcamera.y += currentVy;\n\t\t\tonUpdate();\n\t\t\tanimationFrameId = requestAnimationFrame(animate);\n\t\t};\n\n\t\tanimationFrameId = requestAnimationFrame(animate);\n\t};\n\n\treturn { recordMove, startMomentum, cancel, reset };\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nconst DRAWING_LIKE_TOOLS = new Set([\n\t\"draw\",\n\t\"marker\",\n\t\"annotate\",\n\t\"pen\",\n\t\"highlight\",\n\t\"rect\",\n\t\"ellipse\",\n\t\"line\",\n\t\"arrow\",\n\t\"text\",\n\t\"image\",\n]);\n\nexport type ApplePencilNavOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Current tool id from your app (e.g. `\"hand\"` vs `\"draw\"`). */\n\tgetCurrentToolId: () => string;\n\tonUpdate: () => void;\n\ttouchPanSensitivity?: number;\n};\n\n/**\n * After a **stylus** (`pointerType === \"pen\"`) has been used, finger touches on the canvas\n * pan/pinch the camera instead of passing through to drawing tools — similar to iPad behavior\n * in many design apps. No-op until the first pen contact.\n *\n * Compose with {@link attachViewportInput} by calling this **after** it so capture handlers run first,\n * or use only one of them depending on product needs.\n */\nexport function attachApplePencilNavigation(\n\toptions: ApplePencilNavOptions,\n): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tgetCurrentToolId,\n\t\tonUpdate,\n\t\ttouchPanSensitivity = 1.25,\n\t} = options;\n\n\tlet penDetected = false;\n\tconst activePenPointerIds = new Set<number>();\n\tconst blockedTouchPointerIds = new Set<number>();\n\tconst pointers = new Map<number, { x: number; y: number }>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: { x: number; y: number } | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst shouldIntercept = (e: PointerEvent): boolean => {\n\t\tif (e.pointerType !== \"touch\") return false;\n\t\tconst tool = getCurrentToolId();\n\t\tif (tool === \"hand\") return true;\n\t\treturn penDetected && DRAWING_LIKE_TOOLS.has(tool);\n\t};\n\n\tconst dist = (a: { x: number; y: number }, b: { x: number; y: number }) =>\n\t\tMath.hypot(b.x - a.x, b.y - a.y);\n\n\tconst mid = (a: { x: number; y: number }, b: { x: number; y: number }) => ({\n\t\tx: (a.x + b.x) / 2,\n\t\ty: (a.y + b.y) / 2,\n\t});\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tpenDetected = true;\n\t\t\tactivePenPointerIds.add(e.pointerId);\n\t\t\tpointers.clear();\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.cancel();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"touch\" && activePenPointerIds.size > 0) {\n\t\t\tblockedTouchPointerIds.add(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!shouldIntercept(e)) return;\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tif (pointers.size === 1) {\n\t\t\tmode = \"pan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\tcamera,\n\t\t\t\tonUpdate,\n\t\t\t\ttouchPanSensitivity,\n\t\t\t);\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = dist(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = mid(a, b);\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"idle\" || !pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst d = dist(a, b);\n\t\t\tconst m = mid(a, b);\n\t\t\tconst scale = d / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: m.x - rect.left,\n\t\t\t\ty: m.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tcamera.x += m.x - panLast.x;\n\t\t\t\tcamera.y += m.y - panLast.y;\n\t\t\t\tpanLast = m;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") {\n\t\t\tactivePenPointerIds.delete(e.pointerId);\n\t\t\treturn;\n\t\t}\n\t\tif (blockedTouchPointerIds.has(e.pointerId)) {\n\t\t\tblockedTouchPointerIds.delete(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn;\n\t\t}\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst r = Array.from(pointers.values())[0];\n\t\t\tpanLast = r ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t\te.preventDefault();\n\t\te.stopImmediatePropagation();\n\t};\n\n\telement.addEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\telement.addEventListener(\"pointermove\", onPointerMove, { capture: true });\n\telement.addEventListener(\"pointerup\", onPointerUp, { capture: true });\n\telement.addEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown, { capture: true });\n\t\telement.removeEventListener(\"pointermove\", onPointerMove, { capture: true });\n\t\telement.removeEventListener(\"pointerup\", onPointerUp, { capture: true });\n\t\telement.removeEventListener(\"pointercancel\", onPointerUp, { capture: true });\n\t};\n}\n","import type { Camera2D } from \"../camera/camera\";\nimport {\n\tcreatePanMomentumController,\n\ttype PanMomentumController,\n} from \"./pan-momentum\";\n\nexport type ViewportInputOptions = {\n\telement: HTMLElement;\n\tcamera: Camera2D;\n\t/** Called after any camera mutation so the renderer can redraw. */\n\tonUpdate: () => void;\n\t/**\n\t * Element to attach the wheel listener to. Defaults to `element`.\n\t * Useful when an overlay with `pointer-events: auto` sits above `element` and\n\t * would otherwise intercept wheel events before they reach the scene container.\n\t */\n\twheelElement?: HTMLElement;\n\twheelPanSensitivity?: number;\n\t/** Multiplier applied to wheel delta for zoom (with Ctrl/Meta). */\n\twheelZoomSensitivity?: number;\n\ttouchPanSensitivity?: number;\n\t/**\n\t * When `true`, pointer events with `pointerType === \"touch\"` are ignored so another layer\n\t * (e.g. `attachApplePencilNavigation`) can handle them without double panning.\n\t */\n\ttouchHandledElsewhere?: boolean;\n\t/**\n\t * When `false`, one-finger / primary-button drag does **not** pan the camera (e.g. shape tools).\n\t * Wheel zoom and two-finger pinch still work.\n\t */\n\tallowPrimaryPointerPan?: () => boolean;\n};\n\ntype PointerRecord = { x: number; y: number };\n\nfunction distanceBetween(a: PointerRecord, b: PointerRecord): number {\n\tconst dx = b.x - a.x;\n\tconst dy = b.y - a.y;\n\treturn Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction midpoint(a: PointerRecord, b: PointerRecord): PointerRecord {\n\treturn { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n}\n\n/** Normalize wheel delta so zoom speed is similar across mice (lines) and trackpads (pixels). */\nfunction wheelDeltaPixels(delta: number, deltaMode: number): number {\n\tswitch (deltaMode) {\n\t\tcase WheelEvent.DOM_DELTA_LINE:\n\t\t\treturn delta * 16;\n\t\tcase WheelEvent.DOM_DELTA_PAGE:\n\t\t\treturn delta * 400;\n\t\tdefault:\n\t\t\treturn delta;\n\t}\n}\n\n// Trackpad fires many small deltas; mouse wheels fire one big delta per click.\n// Pass small deltas through so trackpad feel is preserved; soften large ones.\nconst TRACKPAD_MAX_DELTA = 20;\nconst MOUSE_WHEEL_DAMPING = 0.4;\n\nfunction softenWheelDelta(d: number): number {\n\tconst a = Math.abs(d);\n\tif (a <= TRACKPAD_MAX_DELTA) return d;\n\treturn (\n\t\tMath.sign(d) *\n\t\t(TRACKPAD_MAX_DELTA + (a - TRACKPAD_MAX_DELTA) * MOUSE_WHEEL_DAMPING)\n\t);\n}\n\n/**\n * Attaches wheel (pan / Ctrl+zoom), pointer drag pan, and two-finger pinch zoom.\n * Uses `touch-action: none` on `element` — set that in CSS on the same node.\n *\n * @returns A dispose function that removes all listeners.\n */\nexport function attachViewportInput(options: ViewportInputOptions): () => void {\n\tconst {\n\t\telement,\n\t\tcamera,\n\t\tonUpdate,\n\t\twheelElement,\n\t\twheelPanSensitivity = 0.5,\n\t\twheelZoomSensitivity = 0.0015,\n\t\ttouchPanSensitivity = 1.25,\n\t\ttouchHandledElsewhere = false,\n\t\tallowPrimaryPointerPan = () => true,\n\t} = options;\n\n\tconst wheelTarget = wheelElement ?? element;\n\n\tconst pointers = new Map<number, PointerRecord>();\n\tlet mode: \"idle\" | \"pan\" | \"pinch\" | \"mousePan\" = \"idle\";\n\tlet pinchStartDist = 0;\n\tlet pinchStartZoom = 1;\n\tlet panLast: PointerRecord | null = null;\n\tlet mousePanButton: number | null = null;\n\tlet touchMomentum: PanMomentumController | null = null;\n\n\tconst onWheel = (e: WheelEvent) => {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tconst dy = wheelDeltaPixels(e.deltaY, e.deltaMode);\n\t\t\t// Trackpad generates very small deltas (1-5px) vs mouse (100-200px).\n\t\t\t// Normalize so both feel responsive: amplify small deltas (trackpad).\n\t\t\tconst normDy = Math.abs(dy) < TRACKPAD_MAX_DELTA ? dy * 12 : dy;\n\t\t\tconst factor = Math.exp(-normDy * wheelZoomSensitivity);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * factor, {\n\t\t\t\tx: e.clientX - rect.left,\n\t\t\t\ty: e.clientY - rect.top,\n\t\t\t});\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst panDx = softenWheelDelta(wheelDeltaPixels(e.deltaX, e.deltaMode));\n\t\tconst panDy = softenWheelDelta(wheelDeltaPixels(e.deltaY, e.deltaMode));\n\t\tcamera.x -= (panDx * wheelPanSensitivity) / camera.zoom;\n\t\tcamera.y -= (panDy * wheelPanSensitivity) / camera.zoom;\n\t\tonUpdate();\n\t};\n\n\tconst onPointerDown = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t}\n\t\tconst panOk = allowPrimaryPointerPan();\n\t\tif (e.pointerType === \"mouse\" && e.button === 0) {\n\t\t\tif (!panOk) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmousePanButton = 0;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif (e.pointerType === \"mouse\" && e.button === 1) {\n\t\t\tmousePanButton = 1;\n\t\t\tmode = \"mousePan\";\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\telement.setPointerCapture(e.pointerId);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (pointers.size === 1 && e.pointerType === \"touch\") {\n\t\t\tif (panOk) {\n\t\t\t\tmode = \"pan\";\n\t\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\t\ttouchMomentum = createPanMomentumController(\n\t\t\t\t\tcamera,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\ttouchPanSensitivity,\n\t\t\t\t);\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t} else if (pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tmode = \"pinch\";\n\t\t\tpinchStartDist = distanceBetween(a, b);\n\t\t\tpinchStartZoom = camera.zoom;\n\t\t\tpanLast = midpoint(a, b);\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerMove = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\" && panLast && mousePanButton !== null) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx;\n\t\t\tcamera.y += dy;\n\t\t\tonUpdate();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pointers.has(e.pointerId)) return;\n\t\tpointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tif (mode === \"pan\" && pointers.size === 1 && panLast) {\n\t\t\tconst dx = e.clientX - panLast.x;\n\t\t\tconst dy = e.clientY - panLast.y;\n\t\t\tpanLast = { x: e.clientX, y: e.clientY };\n\t\t\tcamera.x += dx * touchPanSensitivity;\n\t\t\tcamera.y += dy * touchPanSensitivity;\n\t\t\ttouchMomentum?.recordMove(dx, dy);\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"pinch\" && pointers.size === 2) {\n\t\t\tconst vals = Array.from(pointers.values());\n\t\t\tconst a = vals[0];\n\t\t\tconst b = vals[1];\n\t\t\tif (a === undefined || b === undefined) return;\n\t\t\tconst dist = distanceBetween(a, b);\n\t\t\tconst mid = midpoint(a, b);\n\t\t\tconst scale = dist / Math.max(pinchStartDist, 1e-6);\n\t\t\tconst nextZoom = Math.min(\n\t\t\t\tcamera.maxZoom,\n\t\t\t\tMath.max(camera.minZoom, pinchStartZoom * scale),\n\t\t\t);\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tcamera.setZoom(nextZoom, {\n\t\t\t\tx: mid.x - rect.left,\n\t\t\t\ty: mid.y - rect.top,\n\t\t\t});\n\t\t\tif (panLast) {\n\t\t\t\tconst dx = mid.x - panLast.x;\n\t\t\t\tconst dy = mid.y - panLast.y;\n\t\t\t\tcamera.x += dx;\n\t\t\t\tcamera.y += dy;\n\t\t\t\tpanLast = mid;\n\t\t\t}\n\t\t\tonUpdate();\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst onPointerUp = (e: PointerEvent) => {\n\t\tif (e.pointerType === \"pen\") return;\n\t\tif (touchHandledElsewhere && e.pointerType === \"touch\") {\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mousePan\") {\n\t\t\tif (e.pointerType === \"mouse\" && e.button === mousePanButton) {\n\t\t\t\tmode = \"idle\";\n\t\t\t\tpanLast = null;\n\t\t\t\tmousePanButton = null;\n\t\t\t\ttry {\n\t\t\t\t\telement.releasePointerCapture(e.pointerId);\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore */\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tpointers.delete(e.pointerId);\n\t\tif (pointers.size === 0) {\n\t\t\tconst wasPanning = mode === \"pan\";\n\t\t\tmode = \"idle\";\n\t\t\tpanLast = null;\n\t\t\tif (wasPanning && touchMomentum) {\n\t\t\t\ttouchMomentum.startMomentum();\n\t\t\t\ttouchMomentum = null;\n\t\t\t}\n\t\t} else if (pointers.size === 1 && mode === \"pinch\") {\n\t\t\tmode = \"pan\";\n\t\t\tconst remaining = Array.from(pointers.values())[0];\n\t\t\tpanLast = remaining ?? null;\n\t\t\tif (touchMomentum) {\n\t\t\t\ttouchMomentum.reset();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst onPointerCancel = (e: PointerEvent) => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\tonPointerUp(e);\n\t};\n\n\twheelTarget.addEventListener(\"wheel\", onWheel, { passive: false });\n\telement.addEventListener(\"pointerdown\", onPointerDown);\n\telement.addEventListener(\"pointermove\", onPointerMove);\n\telement.addEventListener(\"pointerup\", onPointerUp);\n\telement.addEventListener(\"pointercancel\", onPointerCancel);\n\n\treturn () => {\n\t\tif (touchMomentum) {\n\t\t\ttouchMomentum.cancel();\n\t\t\ttouchMomentum = null;\n\t\t}\n\t\twheelTarget.removeEventListener(\"wheel\", onWheel);\n\t\telement.removeEventListener(\"pointerdown\", onPointerDown);\n\t\telement.removeEventListener(\"pointermove\", onPointerMove);\n\t\telement.removeEventListener(\"pointerup\", onPointerUp);\n\t\telement.removeEventListener(\"pointercancel\", onPointerCancel);\n\t};\n}\n","import {\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 { itemLocalToWorld, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\n\nexport type ResizeHandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nconst HANDLE_IDS: ResizeHandleId[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\n\nexport function getHandleWorldPosition(\n\tbounds: Rect,\n\tid: ResizeHandleId,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst cx = r.x + r.width / 2;\n\tconst cy = r.y + r.height / 2;\n\tswitch (id) {\n\t\tcase \"nw\":\n\t\t\treturn { x: r.x, y: r.y };\n\t\tcase \"n\":\n\t\t\treturn { x: cx, y: r.y };\n\t\tcase \"ne\":\n\t\t\treturn { x: r.x + r.width, y: r.y };\n\t\tcase \"e\":\n\t\t\treturn { x: r.x + r.width, y: cy };\n\t\tcase \"se\":\n\t\t\treturn { x: r.x + r.width, y: r.y + r.height };\n\t\tcase \"s\":\n\t\t\treturn { x: cx, y: r.y + r.height };\n\t\tcase \"sw\":\n\t\t\treturn { x: r.x, y: r.y + r.height };\n\t\tcase \"w\":\n\t\t\treturn { x: r.x, y: cy };\n\t}\n}\n\n/**\n * Hit-tests resize handles in **local** item space (handles rotation).\n */\nexport function hitTestResizeHandle(\n\tbounds: Rect,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\trotationRad: number = 0,\n): ResizeHandleId | null {\n\tconst r = normalizeRect(bounds);\n\tconst pl = worldToItemLocal(\n\t\tworldX,\n\t\tworldY,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n\tconst localBounds = { x: 0, y: 0, width: r.width, height: r.height };\n\tlet best: ResizeHandleId | null = null;\n\tlet bestD = radiusWorld;\n\tfor (const id of HANDLE_IDS) {\n\t\tconst p = getHandleWorldPosition(localBounds, id);\n\t\tconst d = Math.hypot(pl.x - p.x, pl.y - p.y);\n\t\tif (d <= bestD) {\n\t\t\tbestD = d;\n\t\t\tbest = id;\n\t\t}\n\t}\n\treturn best;\n}\n\n/** World position of a resize handle when the item is rotated around its center. */\nexport function getHandleWorldPositionRotated(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\trotationRad: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\tconst p = getHandleWorldPosition(\n\t\t{ x: 0, y: 0, width: r.width, height: r.height },\n\t\thandle,\n\t);\n\treturn itemLocalToWorld(p.x, p.y, r.x, r.y, r.width, r.height, rotationRad);\n}\n\n/** World position of the rotation handle (above the top edge of the bounds). */\nexport function getRotationHandleWorldPosition(\n\tbounds: Rect,\n\trotationRad: number,\n\thandleOffsetWorld: number,\n): { x: number; y: number } {\n\tconst r = normalizeRect(bounds);\n\treturn itemLocalToWorld(\n\t\tr.width / 2,\n\t\t-handleOffsetWorld,\n\t\tr.x,\n\t\tr.y,\n\t\tr.width,\n\t\tr.height,\n\t\trotationRad,\n\t);\n}\n\nexport function hitTestRotateHandle(\n\tbounds: Rect,\n\trotationRad: number,\n\tworldX: number,\n\tworldY: number,\n\tradiusWorld: number,\n\thandleOffsetWorld: number,\n): boolean {\n\tconst p = getRotationHandleWorldPosition(bounds, rotationRad, handleOffsetWorld);\n\treturn Math.hypot(worldX - p.x, worldY - p.y) <= radiusWorld;\n}\n\nexport function rectFromCorners(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n): Rect {\n\tconst minX = Math.min(a.x, b.x);\n\tconst maxX = Math.max(a.x, b.x);\n\tconst minY = Math.min(a.y, b.y);\n\tconst maxY = Math.max(a.y, b.y);\n\treturn { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction clampMinSize(r: Rect, min: number): Rect {\n\tconst n = normalizeRect(r);\n\treturn {\n\t\tx: n.x,\n\t\ty: n.y,\n\t\twidth: Math.max(min, n.width),\n\t\theight: Math.max(min, n.height),\n\t};\n}\n\n/**\n * Computes new axis-aligned bounds when dragging a resize handle to `currentWorld`.\n */\nexport function computeResizeBounds(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst minSize = 8;\n\n\tswitch (handle) {\n\t\tcase \"nw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y1 }), minSize);\n\t\tcase \"ne\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y1 }), minSize);\n\t\tcase \"se\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x0, y: y0 }), minSize);\n\t\tcase \"sw\":\n\t\t\treturn clampMinSize(rectFromCorners(currentWorld, { x: x1, y: y0 }), minSize);\n\t\tcase \"n\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: currentWorld.y }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"s\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: x1, y: currentWorld.y }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"e\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: x0, y: y0 }, { x: currentWorld.x, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tcase \"w\":\n\t\t\treturn clampMinSize(\n\t\t\t\trectFromCorners({ x: currentWorld.x, y: y0 }, { x: x1, y: y1 }),\n\t\t\t\tminSize,\n\t\t\t);\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n\n/**\n * Resize bounds with fixed width/height ratio (`aspect` = width ÷ height), similar to tldraw\n * image resize: corners follow the cursor by adjusting the other dimension to preserve aspect;\n * edges resize from the opposite edge with the box centered on the orthogonal axis.\n */\nexport function computeResizeBoundsFixedAspect(\n\tbounds: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n\taspect: number,\n): Rect {\n\tconst r = normalizeRect(bounds);\n\tconst x0 = r.x;\n\tconst y0 = r.y;\n\tconst x1 = r.x + r.width;\n\tconst y1 = r.y + r.height;\n\tconst w = r.width;\n\tconst h = r.height;\n\tconst minSize = 8;\n\tconst a = Math.max(1e-9, aspect);\n\n\tfunction cornerAspectRect(\n\t\tanchor: { x: number; y: number },\n\t\tcursor: { x: number; y: number },\n\t): Rect {\n\t\tconst dx = cursor.x - anchor.x;\n\t\tconst dy = cursor.y - anchor.y;\n\t\tconst aw = Math.abs(dx);\n\t\tconst ah = Math.abs(dy);\n\t\tlet W: number;\n\t\tlet H: number;\n\t\tif (aw < 1e-12 && ah < 1e-12) {\n\t\t\tW = minSize;\n\t\t\tH = minSize / a;\n\t\t} else if (ah < 1e-12) {\n\t\t\tW = Math.max(minSize, aw);\n\t\t\tH = W / a;\n\t\t} else if (aw < 1e-12) {\n\t\t\tH = Math.max(minSize, ah);\n\t\t\tW = H * a;\n\t\t} else if (aw / ah > a) {\n\t\t\tW = aw;\n\t\t\tH = aw / a;\n\t\t} else {\n\t\t\tH = ah;\n\t\t\tW = ah * a;\n\t\t}\n\t\tif (W < minSize || H < minSize) {\n\t\t\tconst scale = Math.max(minSize / W, minSize / H);\n\t\t\tW *= scale;\n\t\t\tH *= scale;\n\t\t}\n\t\tconst sx = Math.sign(dx) || 1;\n\t\tconst sy = Math.sign(dy) || 1;\n\t\treturn rectFromCorners(anchor, {\n\t\t\tx: anchor.x + sx * W,\n\t\t\ty: anchor.y + sy * H,\n\t\t});\n\t}\n\n\tswitch (handle) {\n\t\tcase \"se\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y0 }, currentWorld);\n\t\tcase \"nw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y1 }, currentWorld);\n\t\tcase \"ne\":\n\t\t\treturn cornerAspectRect({ x: x0, y: y1 }, currentWorld);\n\t\tcase \"sw\":\n\t\t\treturn cornerAspectRect({ x: x1, y: y0 }, currentWorld);\n\t\tcase \"e\": {\n\t\t\tconst rawW = currentWorld.x - x0;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({ x: x0, y: newY, width: sign * aw, height: H });\n\t\t}\n\t\tcase \"w\": {\n\t\t\tconst rawW = x1 - currentWorld.x;\n\t\t\tconst aw = Math.max(minSize, Math.abs(rawW));\n\t\t\tconst H = aw / a;\n\t\t\tconst newY = y0 + h / 2 - H / 2;\n\t\t\tconst sign = Math.sign(rawW) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: x1 - sign * aw,\n\t\t\t\ty: newY,\n\t\t\t\twidth: sign * aw,\n\t\t\t\theight: H,\n\t\t\t});\n\t\t}\n\t\tcase \"n\": {\n\t\t\tconst rawH = y1 - currentWorld.y;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({\n\t\t\t\tx: newX,\n\t\t\t\ty: y1 - sign * ah,\n\t\t\t\twidth: W,\n\t\t\t\theight: sign * ah,\n\t\t\t});\n\t\t}\n\t\tcase \"s\": {\n\t\t\tconst rawH = currentWorld.y - y0;\n\t\t\tconst ah = Math.max(minSize, Math.abs(rawH));\n\t\t\tconst W = ah * a;\n\t\t\tconst newX = x0 + w / 2 - W / 2;\n\t\t\tconst sign = Math.sign(rawH) || 1;\n\t\t\treturn normalizeRect({ x: newX, y: y0, width: W, height: sign * ah });\n\t\t}\n\t\tdefault:\n\t\t\treturn r;\n\t}\n}\n","import {\n\tgetItemRotationRad,\n\titemLocalToWorld,\n\tworldToItemLocal,\n} from \"../math/item-transform\";\nimport 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","import { getItemRotationRad, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tbuildArchitecturalCloudSvg,\n\tbuildArrowSvg,\n\tbuildEllipseSvg,\n\tbuildLineSvg,\n\tbuildRasterImageChildrenSvg,\n\tbuildRectSvg,\n\trebuildItemSvg,\n\tresolveStrokeStyle,\n} from \"../scene/shape-builders\";\nimport { DEFAULT_TEXT_FONT_SIZE } from \"../scene/text-svg\";\nimport type { LineEndpointsLocal, VectorSceneItem } from \"../scene/types\";\nimport {\n\tcomputeResizeBounds,\n\tcomputeResizeBoundsFixedAspect,\n\ttype ResizeHandleId,\n} from \"./resize-handles\";\n\nfunction computeNewBoundsForResize(\n\titem: VectorSceneItem,\n\tsb: Rect,\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): Rect {\n\tconst rot = getItemRotationRad(item);\n\tif (Math.abs(rot) < 1e-12) {\n\t\tif (item.toolKind === \"image\") {\n\t\t\tlet aspect: number | undefined;\n\t\t\tif (item.imageIntrinsicSize) {\n\t\t\t\tconst iw = Math.max(1e-9, item.imageIntrinsicSize.width);\n\t\t\t\tconst ih = Math.max(1e-9, item.imageIntrinsicSize.height);\n\t\t\t\taspect = iw / ih;\n\t\t\t} else if (item.imageVectorLocalSize) {\n\t\t\t\tconst lw = Math.max(1e-9, item.imageVectorLocalSize.width);\n\t\t\t\tconst lh = Math.max(1e-9, item.imageVectorLocalSize.height);\n\t\t\t\taspect = lw / lh;\n\t\t\t}\n\t\t\treturn aspect !== undefined\n\t\t\t\t? computeResizeBoundsFixedAspect(sb, handle, currentWorld, aspect)\n\t\t\t\t: computeResizeBounds(sb, handle, currentWorld);\n\t\t}\n\t\treturn computeResizeBounds(sb, handle, currentWorld);\n\t}\n\n\tconst local = worldToItemLocal(\n\t\tcurrentWorld.x,\n\t\tcurrentWorld.y,\n\t\tsb.x,\n\t\tsb.y,\n\t\tsb.width,\n\t\tsb.height,\n\t\trot,\n\t);\n\tconst localBounds = { x: 0, y: 0, width: sb.width, height: sb.height };\n\tlet nbLocal: Rect;\n\tif (item.toolKind === \"image\") {\n\t\tlet aspect: number | undefined;\n\t\tif (item.imageIntrinsicSize) {\n\t\t\tconst iw = Math.max(1e-9, item.imageIntrinsicSize.width);\n\t\t\tconst ih = Math.max(1e-9, item.imageIntrinsicSize.height);\n\t\t\taspect = iw / ih;\n\t\t} else if (item.imageVectorLocalSize) {\n\t\t\tconst lw = Math.max(1e-9, item.imageVectorLocalSize.width);\n\t\t\tconst lh = Math.max(1e-9, item.imageVectorLocalSize.height);\n\t\t\taspect = lw / lh;\n\t\t}\n\t\tnbLocal =\n\t\t\taspect !== undefined\n\t\t\t\t? computeResizeBoundsFixedAspect(localBounds, handle, local, aspect)\n\t\t\t\t: computeResizeBounds(localBounds, handle, local);\n\t} else {\n\t\tnbLocal = computeResizeBounds(localBounds, handle, local);\n\t}\n\treturn {\n\t\tx: sb.x + nbLocal.x,\n\t\ty: sb.y + nbLocal.y,\n\t\twidth: nbLocal.width,\n\t\theight: nbLocal.height,\n\t};\n}\n\n/** Unwraps pointer angle delta so rotation stays continuous across ±π. */\nexport function applyRotationFromPointer(\n\titem: VectorSceneItem,\n\tstartRotation: number,\n\tstartPointerAngleRad: number,\n\tpointerAngleRad: number,\n): VectorSceneItem {\n\tlet delta = pointerAngleRad - startPointerAngleRad;\n\twhile (delta > Math.PI) {\n\t\tdelta -= 2 * Math.PI;\n\t}\n\twhile (delta < -Math.PI) {\n\t\tdelta += 2 * Math.PI;\n\t}\n\treturn { ...item, rotation: startRotation + delta };\n}\n\nexport function moveItemByDelta(\n\titem: VectorSceneItem,\n\tdx: number,\n\tdy: number,\n): VectorSceneItem {\n\treturn {\n\t\t...item,\n\t\tx: item.x + dx,\n\t\ty: item.y + dy,\n\t\tbounds: {\n\t\t\t...item.bounds,\n\t\t\tx: item.bounds.x + dx,\n\t\t\ty: item.bounds.y + dy,\n\t\t},\n\t};\n}\n\n/**\n * Resizes an item by dragging a corner/edge handle. Line/arrow endpoints scale\n * proportionally within the resize start bounds.\n */\nexport function resizeItemByHandle(\n\titem: VectorSceneItem,\n\tstart: { bounds: Rect; line?: LineEndpointsLocal },\n\thandle: ResizeHandleId,\n\tcurrentWorld: { x: number; y: number },\n): VectorSceneItem {\n\tconst sb = normalizeRect(start.bounds);\n\tconst newBoundsRaw = computeNewBoundsForResize(item, sb, handle, currentWorld);\n\tconst nb = normalizeRect(newBoundsRaw);\n\tconst k = item.toolKind;\n\n\tif (k === \"rect\") {\n\t\tconst style = resolveStrokeStyle(item);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tchildrenSvg: buildRectSvg(nb.width, nb.height, style),\n\t\t};\n\t}\n\tif (k === \"ellipse\") {\n\t\tconst style = resolveStrokeStyle(item);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tchildrenSvg: buildEllipseSvg(nb.width, nb.height, style),\n\t\t};\n\t}\n\tif (k === \"architectural-cloud\") {\n\t\tconst style = resolveStrokeStyle(item);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tchildrenSvg: buildArchitecturalCloudSvg(nb.width, nb.height, style),\n\t\t};\n\t}\n\tif (k === \"text\" && item.text !== undefined) {\n\t\tconst sfw = Math.max(sb.width, 1e-6);\n\t\tconst sfh = Math.max(sb.height, 1e-6);\n\t\tconst baseFs = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\t\tconst areaRatio = (nb.width * nb.height) / (sfw * sfh);\n\t\tconst scale = Math.sqrt(Math.max(areaRatio, 1e-12));\n\t\tconst nextFs = Math.min(256, Math.max(6, baseFs * scale));\n\t\treturn rebuildItemSvg({\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\ttextFixedBounds: true,\n\t\t\ttextFontSize: nextFs,\n\t\t});\n\t}\n\tif (k === \"image\") {\n\t\tif (item.imageRasterHref && item.imageIntrinsicSize) {\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: nb.x,\n\t\t\t\ty: nb.y,\n\t\t\t\tbounds: nb,\n\t\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\t\titem.imageRasterHref,\n\t\t\t\t\titem.imageIntrinsicSize,\n\t\t\t\t\tnb,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tif (item.imageVectorInnerSvg && item.imageVectorLocalSize) {\n\t\t\tconst lw = Math.max(1e-6, item.imageVectorLocalSize.width);\n\t\t\tconst lh = Math.max(1e-6, item.imageVectorLocalSize.height);\n\t\t\tconst arB = nb.width / Math.max(1e-9, nb.height);\n\t\t\tconst arI = lw / lh;\n\t\t\tlet childrenSvg: string;\n\t\t\tif (Math.abs(arB - arI) < 1e-3) {\n\t\t\t\tconst s = nb.width / lw;\n\t\t\t\tchildrenSvg = `<g transform=\"scale(${s})\">${item.imageVectorInnerSvg}</g>`;\n\t\t\t} else {\n\t\t\t\tconst s = Math.min(nb.width / lw, nb.height / lh);\n\t\t\t\tconst tx = (nb.width - lw * s) / 2;\n\t\t\t\tconst ty = (nb.height - lh * s) / 2;\n\t\t\t\tchildrenSvg = `<g transform=\"translate(${tx}, ${ty}) scale(${s})\">${item.imageVectorInnerSvg}</g>`;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tx: nb.x,\n\t\t\t\ty: nb.y,\n\t\t\t\tbounds: nb,\n\t\t\t\tchildrenSvg,\n\t\t\t};\n\t\t}\n\t}\n\tif ((k === \"line\" || k === \"arrow\") && start.line) {\n\t\tconst sfw = Math.max(sb.width, 1e-6);\n\t\tconst sfh = Math.max(sb.height, 1e-6);\n\t\tconst f = start.line;\n\t\tconst u1 = f.x1 / sfw;\n\t\tconst v1 = f.y1 / sfh;\n\t\tconst u2 = f.x2 / sfw;\n\t\tconst v2 = f.y2 / sfh;\n\t\tconst newLine: LineEndpointsLocal = {\n\t\t\tx1: u1 * nb.width,\n\t\t\ty1: v1 * nb.height,\n\t\t\tx2: u2 * nb.width,\n\t\t\ty2: v2 * nb.height,\n\t\t};\n\t\tconst style = resolveStrokeStyle(item);\n\t\tconst childrenSvg =\n\t\t\tk === \"arrow\"\n\t\t\t\t? buildArrowSvg(item.id, newLine, style)\n\t\t\t\t: buildLineSvg(newLine, style);\n\t\treturn {\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tline: newLine,\n\t\t\tchildrenSvg,\n\t\t};\n\t}\n\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\tconst sfw = Math.max(sb.width, 1e-6);\n\t\tconst sfh = Math.max(sb.height, 1e-6);\n\t\tconst sx = nb.width / sfw;\n\t\tconst sy = nb.height / sfh;\n\t\tconst scaledPoints = item.pathPointsLocal.map((p) => ({\n\t\t\tx: p.x * sx,\n\t\t\ty: p.y * sy,\n\t\t\t...(p.pressure != null ? { pressure: p.pressure } : {}),\n\t\t}));\n\t\treturn rebuildItemSvg({\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t\tpathPointsLocal: scaledPoints,\n\t\t});\n\t}\n\n\tif (k === \"custom\" && item.customIntrinsicSize && item.customInnerSvg) {\n\t\treturn rebuildItemSvg({\n\t\t\t...item,\n\t\t\tx: nb.x,\n\t\t\ty: nb.y,\n\t\t\tbounds: nb,\n\t\t});\n\t}\n\n\treturn { ...item, x: nb.x, y: nb.y, bounds: nb };\n}\n","\"use client\";\n\nimport {\n\ttype ChangeEvent,\n\ttype ClipboardEvent,\n\ttype CSSProperties,\n\ttype DragEvent,\n\tforwardRef,\n\ttype KeyboardEvent,\n\ttype MouseEvent,\n\ttype ReactNode,\n\ttype PointerEvent as ReactPointerEvent,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { Camera2D } from \"../camera/camera\";\nimport { IndexedDbImageStore } from \"../image/indexed-db-image-store\";\nimport { attachApplePencilNavigation } from \"../input/apple-pencil-navigation\";\nimport { attachViewportInput } from \"../input/attach-viewport-input\";\nimport {\n\tARROW_BIND_SNAP_PX,\n\tbakeArrowItemToAbsolute,\n\tresolveArrowBindingsInScene,\n\tsnapArrowEndpointToShape,\n} from \"../interaction/arrow-bindings\";\nimport {\n\tcollectEraserTargetsAtWorldPoint,\n\thitTestWorldPoint,\n} from \"../interaction/hit-test\";\nimport {\n\tapplyRotationFromPointer,\n\tmoveItemByDelta,\n\tresizeItemByHandle,\n} from \"../interaction/mutations\";\nimport {\n\thitTestResizeHandle,\n\thitTestRotateHandle,\n\trectFromCorners,\n} from \"../interaction/resize-handles\";\nimport { itemPivotWorld, worldToItemLocal } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tformatCameraTransform,\n\tSvgVectorRenderer,\n} from \"../renderer/svg-vector-renderer\";\nimport { cloneVectorSceneItemsWithNewIds } from \"../scene/clone-item\";\nimport { type CanvuLinkData, getLinkData } from \"../scene/link-item\";\nimport { VectorScene } from \"../scene/scene\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\n\n/**\n * Bundles the active tool's stroke style with the font size used when placing\n * new text items, so the inspector has a single state atom to read/write.\n * `StrokeStyle` stays pure for SVG generation; this extension lives in the\n * viewport state only.\n */\ntype ActiveToolStyleState = StrokeStyle & { textFontSize: number };\n\nimport {\n\tapplyStrokeToItem,\n\tapplyTextDraftWhileEditing,\n\tcreateArchitecturalCloudItem,\n\tcreateEllipseItem,\n\tcreateFreehandStrokeItem,\n\tcreateLineItem,\n\tcreateRectangleItem,\n\tcreateShapeId,\n\tcreateTextItem,\n\tDEFAULT_STROKE_STYLE,\n\tlineEndpointsToLocal,\n\trebuildItemSvg,\n} from \"../scene/shape-builders\";\nimport {\n\tDEFAULT_TEXT_TOOL_FONT_SIZE,\n\ttextBaselineYFor,\n\ttextLineHeightFor,\n} from \"../scene/text-svg\";\nimport type {\n\tArrowBindings,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"../scene/types\";\nimport { ingestAssetFilesToSceneItems } from \"./asset-ingestion\";\nimport type { VectorViewportAssetStore } from \"./asset-store\";\nimport {\n\treleaseRememberedBlobHrefs,\n\trememberImageBlobHrefs,\n} from \"./blob-url-lifecycle\";\nimport { CanvuChromeContext, type CanvuChromeContextValue } from \"./chrome-context\";\nimport { InteractionOverlay, type PlacementPreview } from \"./InteractionOverlay\";\nimport { NavMenu } from \"./navmenu\";\nimport {\n\ttype CanvasPlugin,\n\ttype CanvasPluginContribution,\n\ttype CanvasPluginItemsChangeMiddlewareContext,\n\ttype CanvasPluginRenderContext,\n\tCanvuPluginContext,\n} from \"./plugins\";\nimport { PresenceRemoteLayer } from \"./presence/PresenceRemoteLayer\";\nimport type {\n\tPresenceOverlayRenderContext,\n\tRemotePresencePeer,\n} from \"./presence/types\";\nimport { ShapeContextMenu } from \"./ShapeContextMenu\";\nimport { shallowEqualStringArray } from \"./stable-selection\";\nimport { TextEditOverlay } from \"./TextEditOverlay\";\nimport { DEFAULT_VECTOR_TOOLS } from \"./tools/default-tools\";\nimport type { VectorToolDefinition } from \"./tools/types\";\nimport {\n\tVectorSelectionInspector,\n\ttype VectorSelectionInspectorProps,\n} from \"./VectorSelectionInspector\";\nimport {\n\tcollectItemIdsInRect,\n\tcursorForVectorToolId,\n\ttype DragState,\n\tdefaultPlacementWorld,\n\tfitCameraToWorldRect,\n\tMIN_ARROW_DRAG_PX,\n\tMIN_MARQUEE_WORLD,\n\tMIN_PLACE_SIZE,\n\treplaceItem,\n\tsupportsResizeHandles,\n\tTAP_PX,\n\ttryPointerCaptureOnTarget,\n\tusePrefersReducedMotion,\n\tVIEWPORT_ZOOM_IN_STEP,\n\tVIEWPORT_ZOOM_OUT_STEP,\n\tvisuallyHidden,\n} from \"./vector-viewport-support\";\n\nexport type WorldPointerDownDetail = {\n\tworldX: number;\n\tworldY: number;\n\ttoolId: string;\n\tpointerType: string;\n};\n\nfunction pointInSelectedItemBounds(\n\titem: VectorSceneItem,\n\tworldX: number,\n\tworldY: number,\n): boolean {\n\tconst bounds = normalizeRect(item.bounds);\n\tconst local = worldToItemLocal(\n\t\tworldX,\n\t\tworldY,\n\t\titem.x,\n\t\titem.y,\n\t\tbounds.width,\n\t\tbounds.height,\n\t\titem.rotation ?? 0,\n\t);\n\treturn (\n\t\tlocal.x >= 0 &&\n\t\tlocal.x <= bounds.width &&\n\t\tlocal.y >= 0 &&\n\t\tlocal.y <= bounds.height\n\t);\n}\n\nfunction pointerEventSamples(ev: PointerEvent): readonly PointerEvent[] {\n\tif (ev.pointerType !== \"pen\" || typeof ev.getCoalescedEvents !== \"function\") {\n\t\treturn [ev];\n\t}\n\tconst samples = ev.getCoalescedEvents();\n\treturn samples.length > 0 ? samples : [ev];\n}\n\nconst CANVU_PEN_ACTIVE_UI_BLOCK_CSS = `\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-canvas-toolbar\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-canvas-toolbar\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"canvu-plugin-layer\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"canvu-plugin-layer\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-selection-inspector\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"vector-selection-inspector\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"zoom-minimap-panel\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"zoom-minimap-panel\"] *,\n[data-canvu-pen-active=\"true\"] [data-slot=\"text-edit-overlay\"],\n[data-canvu-pen-active=\"true\"] [data-slot=\"text-edit-overlay\"] *,\n[data-canvu-pen-active=\"true\"] .vector-toolbar-overflow-panel,\n[data-canvu-pen-active=\"true\"] .vector-toolbar-overflow-panel *,\nbody[data-canvu-pen-active=\"true\"] [data-slot=\"shape-context-menu\"],\nbody[data-canvu-pen-active=\"true\"] [data-slot=\"shape-context-menu\"] * {\n\tpointer-events: none !important;\n\tuser-select: none !important;\n\t-webkit-user-select: none !important;\n\t-webkit-touch-callout: none !important;\n}\n`;\n\nconst DEBUG_APPLE_PENCIL_POINTERS = false;\nconst STRAIGHT_STROKE_HOLD_DURATION_MS = 1000;\nconst STRAIGHT_STROKE_JITTER_TOLERANCE_SQUARED = 5 * 5;\n\nfunction debugApplePencilPointer(\n\tphase: string,\n\tdetail: Record<string, unknown>,\n): void {\n\tif (!DEBUG_APPLE_PENCIL_POINTERS) return;\n\tconsole.debug(`[canvu][apple-pencil] ${phase}`, detail);\n}\n\nconst MARKER_TOOL_STYLE: StrokeStyle = {\n\tstroke: \"#fde047\",\n\tstrokeWidth: 16,\n\tstrokeOpacity: 0.5,\n};\n\ntype ReorderDirection = \"front\" | \"forward\" | \"backward\" | \"back\";\n\nfunction reorderItemsByIds(\n\titems: readonly VectorSceneItem[],\n\tids: readonly string[],\n\tdirection: ReorderDirection,\n): VectorSceneItem[] {\n\tif (ids.length === 0 || items.length <= 1) {\n\t\treturn [...items];\n\t}\n\tconst idSet = new Set(ids);\n\tif (direction === \"front\") {\n\t\tconst rest = items.filter((item) => !idSet.has(item.id));\n\t\tconst selected = items.filter((item) => idSet.has(item.id));\n\t\treturn [...rest, ...selected];\n\t}\n\tif (direction === \"back\") {\n\t\tconst selected = items.filter((item) => idSet.has(item.id));\n\t\tconst rest = items.filter((item) => !idSet.has(item.id));\n\t\treturn [...selected, ...rest];\n\t}\n\tconst next = [...items];\n\tif (direction === \"forward\") {\n\t\tfor (let index = next.length - 2; index >= 0; index--) {\n\t\t\tconst current = next[index];\n\t\t\tconst after = next[index + 1];\n\t\t\tif (!current || !after) continue;\n\t\t\tif (idSet.has(current.id) && !idSet.has(after.id)) {\n\t\t\t\tnext[index] = after;\n\t\t\t\tnext[index + 1] = current;\n\t\t\t}\n\t\t}\n\t\treturn next;\n\t}\n\tfor (let index = 1; index < next.length; index++) {\n\t\tconst before = next[index - 1];\n\t\tconst current = next[index];\n\t\tif (!before || !current) continue;\n\t\tif (idSet.has(current.id) && !idSet.has(before.id)) {\n\t\t\tnext[index - 1] = current;\n\t\t\tnext[index] = before;\n\t\t}\n\t}\n\treturn next;\n}\n\nfunction isDefaultMarkerToolStyle(style: StrokeStyle): boolean {\n\treturn (\n\t\tstyle.stroke === MARKER_TOOL_STYLE.stroke &&\n\t\tstyle.strokeWidth === MARKER_TOOL_STYLE.strokeWidth &&\n\t\tstyle.strokeOpacity === MARKER_TOOL_STYLE.strokeOpacity\n\t);\n}\n\n/**\n * Imperative API for pan/zoom and integrations (e.g. AI agents following a region).\n * Call {@link requestRender} after mutating the {@link Camera2D} from {@link getCamera}.\n */\nexport type VectorViewportHandle = {\n\t/** The live camera instance, or `null` before mount / after unmount. */\n\tgetCamera: () => Camera2D | null;\n\t/**\n\t * Re-run SVG + overlay after changing `x`, `y`, or `zoom` on the camera from {@link getCamera}.\n\t */\n\trequestRender: () => void;\n\t/** CSS pixel size of the scene surface (`clientWidth` / `clientHeight`). */\n\tgetViewportSize: () => { width: number; height: number };\n\t/**\n\t * Sets pan/zoom so `worldRect` fits in the viewport with optional margin (fraction of rect size per side, default `0.08`).\n\t */\n\tfitWorldRect: (worldRect: Rect, options?: { padding?: number }) => void;\n};\n\n/** Drag-to-place a custom shape (same interaction as rectangle). Use with `createCustomShapeItem` from `canvu`. */\nexport type CustomShapePlacementOptions = {\n\ttoolId: string;\n\tcreateItem: (args: { id: string; bounds: Rect }) => VectorSceneItem;\n};\n\nexport type VectorViewportProps = {\n\t/** Vector items to draw (SVG fragments). */\n\titems: readonly VectorSceneItem[];\n\tclassName?: string;\n\t/** Accessible name for the application region. */\n\tariaLabel: string;\n\t/**\n\t * When `applePencilNav` is true, used with `attachApplePencilNavigation` to decide\n\t * when finger touches navigate (e.g. `\"hand\"` vs `\"draw\"`).\n\t */\n\ttoolId?: string;\n\t/** Enable Apple Pencil vs finger split (optional). */\n\tapplePencilNav?: boolean;\n\t/**\n\t * When true, selection, drag-to-move, resize handles, and drag-to-create shapes are enabled.\n\t * Requires `onItemsChange` to persist mutations.\n\t */\n\tinteractive?: boolean;\n\t/** Selected item ids (order preserved). Empty = none. */\n\tselectedIds?: readonly string[];\n\tonSelectionChange?: (ids: string[]) => void;\n\tonItemsChange?: (items: VectorSceneItem[]) => void;\n\t/**\n\t * Fires when a link/bookmark item is activated (double-click / double-tap).\n\t * When omitted, the link opens in a new browser tab by default (web only).\n\t * Provide this to customize navigation (e.g. in-app preview, confirmation).\n\t */\n\tonActivateLink?: (detail: { link: CanvuLinkData; item: VectorSceneItem }) => void;\n\t/**\n\t * Fires on primary pointer down on the viewport in **world** coordinates.\n\t * Not called when `toolId` is `\"hand\"` (use that tool for panning).\n\t * Ignored when `interactive` is true (placement uses drag-to-define).\n\t */\n\tonWorldPointerDown?: (detail: WorldPointerDownDetail) => void;\n\t/**\n\t * Floating UI above the scene. Compose with `VectorCanvas.Toolbar` + {@link VectorToolbar}\n\t * so the strip anchors at the bottom center (`data-slot=\"vector-canvas-toolbar\"`).\n\t */\n\ttoolbar?: ReactNode;\n\t/**\n\t * Floating bottom-left zoom / undo / minimap bar. Omit to render the default `NavMenu`.\n\t * Pass `<VectorCanvas.NavMenu position=\"...\" />` to relocate or style it. Pass `null` to hide it.\n\t */\n\tnavMenu?: ReactNode | null;\n\t/**\n\t * Floating selection / active-tool style inspector. Omit to render the default `VectorSelectionInspector`.\n\t * Pass `<VectorCanvas.SelectionInspector position=\"...\" />` to relocate or style it. Pass `null` to hide it.\n\t */\n\tselectionInspector?: ReactNode | null;\n\t/**\n\t * Props forwarded to the built-in {@link VectorSelectionInspector}.\n\t *\n\t * Use this to reposition or theme the default left-side style panel without replacing it.\n\t */\n\tselectionInspectorProps?: Pick<\n\t\tVectorSelectionInspectorProps,\n\t\t\"className\" | \"style\"\n\t>;\n\t/**\n\t * Plug and play board extensions.\n\t *\n\t * First-party plugins such as `chatbotPlugin(...)` and `realtimeCollaborationPlugin(...)`\n\t * should be passed here. Advanced authors can create their own plugins with `createCanvuPlugin(...)`.\n\t */\n\tplugins?: readonly CanvasPlugin[];\n\t/**\n\t * Called after the scene/camera redraw (pan, zoom, items update, or {@link VectorViewportHandle.requestRender}).\n\t * Can fire often during gestures — throttle/debounce if needed.\n\t */\n\tonCameraChange?: () => void;\n\t/**\n\t * When `interactive` is true, enables drag (or tap) placement for `toolId`, like built-in shapes.\n\t * Implement `createItem` with `createCustomShapeItem` from `canvu`.\n\t */\n\tcustomPlacement?: CustomShapePlacementOptions;\n\t/**\n\t * Multiple custom placements contributed by plugins or app code.\n\t *\n\t * When both `customPlacement` and `customPlacements` are provided, they are combined and the active\n\t * placement is resolved by the current `toolId`.\n\t */\n\tcustomPlacements?: readonly CustomShapePlacementOptions[];\n\t/**\n\t * Optional asset persistence bridge for the built-in image/file flow.\n\t *\n\t * Use this when you want canvu to keep its native file picker and drag-and-drop\n\t * behavior, while also uploading the original binary to your backend or bucket.\n\t * Returned `pluginData` is persisted on every created item from that file.\n\t *\n\t * This is a high-level persistence hook. For fully custom ingestion UIs or\n\t * imports that start outside the viewport, prefer\n\t * `ingestAssetFilesToSceneItems(...)` so your app reuses the same pipeline as\n\t * canvu's native file tool.\n\t */\n\tassetStore?: VectorViewportAssetStore;\n\t/**\n\t * When false (default), finishing a draw/place/erase gesture requests switching back to `autoResetToolTo`.\n\t * Use with controlled tool state (`onToolChangeRequest`) to keep \"select-after-use\" behavior.\n\t */\n\ttoolLocked?: boolean;\n\t/** Tool id requested after one-shot actions complete. Default `\"select\"`. */\n\tautoResetToolTo?: string;\n\t/** Called when viewport requests a tool change (e.g. auto reset to select). */\n\tonToolChangeRequest?: (toolId: string) => void;\n\t/**\n\t * Remote participants (cursors + optional in-progress strokes). Renders a world-space overlay\n\t * below the local interaction layer. Transport is your app (WebSocket, party server, …).\n\t */\n\tremotePresence?: readonly RemotePresencePeer[];\n\t/**\n\t * Replace the default presence layer (e.g. custom cursors). When set, `remotePresence` is not\n\t * rendered unless you read it from the parent closure inside this callback.\n\t */\n\tpresenceOverlay?: (ctx: PresenceOverlayRenderContext) => ReactNode;\n\t/**\n\t * Throttled pointer position in **world** space while the cursor moves over the viewport\n\t * (for broadcasting your cursor). Pair with `onWorldPointerLeave`.\n\t */\n\tonWorldPointerMove?: (world: { x: number; y: number }) => void;\n\t/** Fires when the pointer leaves the viewport (clear your broadcast cursor). */\n\tonWorldPointerLeave?: () => void;\n\t/**\n\t * Fires when drag placement preview updates (rect, line, freehand stroke, …). Use it to broadcast\n\t * {@link RemotePresencePeer.markupStroke} for other participants while drawing.\n\t */\n\tonPlacementPreviewChange?: (preview: PlacementPreview | null) => void;\n};\n\nfunction mergeToolListById(\n\tbaseTools: VectorToolDefinition[],\n\tpluginTools: readonly VectorToolDefinition[],\n): VectorToolDefinition[] {\n\tconst next = [...baseTools];\n\tfor (const tool of pluginTools) {\n\t\tconst index = next.findIndex((candidate) => candidate.id === tool.id);\n\t\tif (index >= 0) {\n\t\t\tnext[index] = tool;\n\t\t\tcontinue;\n\t\t}\n\t\tnext.push(tool);\n\t}\n\treturn next;\n}\n\nfunction composePluginEvent<TArgs extends readonly unknown[]>(\n\tconsumerHandler: ((...args: TArgs) => void) | undefined,\n\tpluginHandlers: readonly (((...args: TArgs) => void) | undefined)[],\n): ((...args: TArgs) => void) | undefined {\n\tconst activePluginHandlers = pluginHandlers.filter(\n\t\t(handler): handler is (...args: TArgs) => void => handler != null,\n\t);\n\tif (!consumerHandler && activePluginHandlers.length === 0) return undefined;\n\treturn (...args: TArgs) => {\n\t\tconsumerHandler?.(...args);\n\t\tfor (const handler of activePluginHandlers) {\n\t\t\thandler(...args);\n\t\t}\n\t};\n}\n\nfunction VectorViewportPluginInstances({\n\tplugins,\n\trenderContext,\n}: {\n\tplugins: readonly CanvasPlugin[];\n\trenderContext: CanvasPluginRenderContext;\n}) {\n\tif (plugins.length === 0) return null;\n\treturn (\n\t\t<>\n\t\t\t{plugins.map((plugin) => {\n\t\t\t\tconst Component = plugin.Component;\n\t\t\t\treturn (\n\t\t\t\t\t<div key={plugin.id} style={{ pointerEvents: \"none\", height: \"100%\" }}>\n\t\t\t\t\t\t{plugin.render?.(renderContext)}\n\t\t\t\t\t\t{Component ? <Component pluginId={plugin.id} /> : null}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</>\n\t);\n}\n\nfunction appendInterpolatedPoints(\n\tpoints: VectorPathPoint[],\n\tnext: VectorPathPoint,\n\tmaxStepWorld: number,\n): VectorPathPoint[] {\n\tvoid maxStepWorld;\n\tif (points.length === 0) return [next];\n\tconst last = points[points.length - 1];\n\tif (!last) return [...points, next];\n\tconst dx = next.x - last.x;\n\tconst dy = next.y - last.y;\n\tif (dx * dx + dy * dy < 1e-12) return points;\n\treturn [...points, next];\n}\n\nfunction pointerSampleToWorldPoint(\n\tscreenToWorldFn: (\n\t\tclientX: number,\n\t\tclientY: number,\n\t) => {\n\t\tworldX: number;\n\t\tworldY: number;\n\t},\n\tclientX: number,\n\tclientY: number,\n\tpressure?: number,\n): VectorPathPoint {\n\tconst { worldX, worldY } = screenToWorldFn(clientX, clientY);\n\tconst safePressure =\n\t\tpressure != null && Number.isFinite(pressure)\n\t\t\t? Math.min(1, Math.max(0, pressure))\n\t\t\t: undefined;\n\treturn {\n\t\tx: worldX,\n\t\ty: worldY,\n\t\t...(safePressure != null ? { pressure: safePressure } : {}),\n\t};\n}\n\ntype SafariTouch = Touch & {\n\tforce?: number;\n\tradiusX?: number;\n\tradiusY?: number;\n\ttouchType?: string;\n};\n\nfunction touchPressure(touch: Touch): number | undefined {\n\tconst force = (touch as SafariTouch).force;\n\tif (force == null || !Number.isFinite(force) || force <= 0) return undefined;\n\treturn Math.min(1, Math.max(0, force));\n}\n\nfunction touchKind(touch: Touch): string | undefined {\n\tconst kind = (touch as SafariTouch).touchType;\n\treturn typeof kind === \"string\" ? kind.toLowerCase() : undefined;\n}\n\nfunction isLikelyStylusTouch(touch: Touch): boolean {\n\tconst kind = touchKind(touch);\n\tif (kind === \"stylus\" || kind === \"pen\" || kind === \"pencil\") return true;\n\tif (kind === \"direct\") return false;\n\n\tconst force = touchPressure(touch);\n\tconst radiusX = (touch as SafariTouch).radiusX;\n\tconst radiusY = (touch as SafariTouch).radiusY;\n\tconst hasSmallRadius =\n\t\t(radiusX == null || radiusX <= 12) && (radiusY == null || radiusY <= 12);\n\treturn force != null && hasSmallRadius;\n}\n\nfunction appendPointerEventSamplesToStrokePoints(\n\tpoints: VectorPathPoint[],\n\tev: PointerEvent,\n\tzoom: number,\n\tscreenToWorldFn: (\n\t\tclientX: number,\n\t\tclientY: number,\n\t) => {\n\t\tworldX: number;\n\t\tworldY: number;\n\t},\n): VectorPathPoint[] {\n\tlet interpolated = points;\n\tconst maxStepWorld = ev.pointerType === \"pen\" ? 0.35 / zoom : 1.0 / zoom;\n\tfor (const sample of pointerEventSamples(ev)) {\n\t\tconst nextPoint = pointerSampleToWorldPoint(\n\t\t\tscreenToWorldFn,\n\t\t\tsample.clientX,\n\t\t\tsample.clientY,\n\t\t\tsample.pointerType === \"pen\" ? sample.pressure : undefined,\n\t\t);\n\t\tinterpolated = appendInterpolatedPoints(interpolated, nextPoint, maxStepWorld);\n\t}\n\treturn interpolated;\n}\n\nfunction appendTouchToStrokePoints(\n\tpoints: VectorPathPoint[],\n\ttouch: Touch,\n\tzoom: number,\n\tscreenToWorldFn: (\n\t\tclientX: number,\n\t\tclientY: number,\n\t) => {\n\t\tworldX: number;\n\t\tworldY: number;\n\t},\n): VectorPathPoint[] {\n\tconst nextPoint = pointerSampleToWorldPoint(\n\t\tscreenToWorldFn,\n\t\ttouch.clientX,\n\t\ttouch.clientY,\n\t\ttouchPressure(touch),\n\t);\n\treturn appendInterpolatedPoints(points, nextPoint, 0.35 / zoom);\n}\n\ntype StrokeDragState = Extract<DragState, { kind: \"stroke\" }>;\ntype StraightStrokeState = NonNullable<StrokeDragState[\"straightLine\"]>;\n\nfunction createStraightStrokeState(\n\tanchorPoint: VectorPathPoint,\n\tclientX: number,\n\tclientY: number,\n): StraightStrokeState {\n\treturn {\n\t\tactive: false,\n\t\tanchorPoint,\n\t\tholdScreen: { x: clientX, y: clientY },\n\t\tholdTimer: null,\n\t};\n}\n\nfunction clearStraightStrokeHoldTimer(strokeState: StrokeDragState): void {\n\tconst straightLine = strokeState.straightLine;\n\tif (!straightLine?.holdTimer) return;\n\tclearTimeout(straightLine.holdTimer);\n\tstraightLine.holdTimer = null;\n}\n\nfunction lastStrokePoint(\n\tpoints: readonly VectorPathPoint[],\n): VectorPathPoint | null {\n\treturn points[points.length - 1] ?? null;\n}\n\nfunction hasMovedPastStraightStrokeJitter(\n\tstraightLine: StraightStrokeState,\n\tclientX: number,\n\tclientY: number,\n): boolean {\n\tconst deltaX = clientX - straightLine.holdScreen.x;\n\tconst deltaY = clientY - straightLine.holdScreen.y;\n\treturn (\n\t\tdeltaX * deltaX + deltaY * deltaY > STRAIGHT_STROKE_JITTER_TOLERANCE_SQUARED\n\t);\n}\n\n/**\n * Full-viewport vector canvas: SVG rendering + pan/zoom/pinch + optional Apple Pencil navigation.\n * Pass a `className` that includes `touch-action: none` (e.g. Tailwind `touch-none`) on the viewport.\n */\nexport const VectorViewport = forwardRef<VectorViewportHandle, VectorViewportProps>(\n\tfunction VectorViewport(\n\t\t{\n\t\t\titems,\n\t\t\tclassName = \"\",\n\t\t\tariaLabel,\n\t\t\ttoolId = \"hand\",\n\t\t\tapplePencilNav = false,\n\t\t\tinteractive = false,\n\t\t\tselectedIds: selectedIdsProp,\n\t\t\tonSelectionChange,\n\t\t\tonItemsChange: consumerOnItemsChange,\n\t\t\tonActivateLink,\n\t\t\tonWorldPointerDown: consumerOnWorldPointerDown,\n\t\t\ttoolbar,\n\t\t\tnavMenu,\n\t\t\tselectionInspector,\n\t\t\tselectionInspectorProps,\n\t\t\tplugins = [],\n\t\t\tonCameraChange: consumerOnCameraChange,\n\t\t\tcustomPlacement: consumerCustomPlacement,\n\t\t\tcustomPlacements: consumerCustomPlacements,\n\t\t\tassetStore,\n\t\t\ttoolLocked = false,\n\t\t\tautoResetToolTo = \"select\",\n\t\t\tonToolChangeRequest,\n\t\t\tremotePresence: consumerRemotePresence,\n\t\t\tpresenceOverlay: consumerPresenceOverlay,\n\t\t\tonWorldPointerMove: consumerOnWorldPointerMove,\n\t\t\tonWorldPointerLeave: consumerOnWorldPointerLeave,\n\t\t\tonPlacementPreviewChange: consumerOnPlacementPreviewChange,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst wrapperRef = useRef<HTMLDivElement>(null);\n\t\tconst interactionRootRef = useRef<HTMLDivElement>(null);\n\t\tconst sceneContainerRef = useRef<HTMLDivElement>(null);\n\t\tconst lastPointerScreenRef = useRef<{ x: number; y: number } | null>(null);\n\t\tconst activeInteractionPointerIdRef = useRef<number | null>(null);\n\t\tconst activeInteractionPointerTargetRef = useRef<HTMLDivElement | null>(null);\n\t\tconst activeInteractionTouchIdRef = useRef<number | null>(null);\n\t\tconst penDetectedRef = useRef(false);\n\t\tconst lastPenPointerDownAtRef = useRef(0);\n\t\tconst cameraRef = useRef<Camera2D | null>(null);\n\t\tconst viewportSizeRef = useRef({ width: 0, height: 0 });\n\t\tconst [cameraForOverlay, setCameraForOverlay] = useState<Camera2D | null>(null);\n\t\tconst sceneRef = useRef<VectorScene | null>(null);\n\t\tconst rendererRef = useRef<SvgVectorRenderer | null>(null);\n\t\tconst pluginViewportRef = useRef<VectorViewportHandle | null>(null);\n\t\tconst [pluginContributions, setPluginContributions] = useState<\n\t\t\tRecord<string, CanvasPluginContribution>\n\t\t>({});\n\n\t\tconst registerContribution = useCallback(\n\t\t\t(pluginId: string, contribution: CanvasPluginContribution) => {\n\t\t\t\tsetPluginContributions((current) => {\n\t\t\t\t\tif (current[pluginId] === contribution) return current;\n\t\t\t\t\treturn { ...current, [pluginId]: contribution };\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst unregisterContribution = useCallback((pluginId: string) => {\n\t\t\tsetPluginContributions((current) => {\n\t\t\t\tif (!(pluginId in current)) return current;\n\t\t\t\tconst next = { ...current };\n\t\t\t\tdelete next[pluginId];\n\t\t\t\treturn next;\n\t\t\t});\n\t\t}, []);\n\n\t\tconst orderedPluginContributions = useMemo(\n\t\t\t() =>\n\t\t\t\tplugins\n\t\t\t\t\t.map((plugin) => pluginContributions[plugin.id])\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(contribution): contribution is CanvasPluginContribution =>\n\t\t\t\t\t\t\tcontribution != null,\n\t\t\t\t\t),\n\t\t\t[pluginContributions, plugins],\n\t\t);\n\n\t\tconst resolvedTools = useMemo(() => {\n\t\t\tlet nextTools = [...DEFAULT_VECTOR_TOOLS];\n\t\t\tfor (const contribution of orderedPluginContributions) {\n\t\t\t\tif (contribution.tools?.length) {\n\t\t\t\t\tnextTools = mergeToolListById(nextTools, contribution.tools);\n\t\t\t\t}\n\t\t\t\tif (contribution.toolTransform) {\n\t\t\t\t\tnextTools = contribution.toolTransform(nextTools);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nextTools;\n\t\t}, [orderedPluginContributions]);\n\n\t\tconst allCustomPlacements = useMemo(() => {\n\t\t\tconst placements: CustomShapePlacementOptions[] = [];\n\t\t\tif (consumerCustomPlacement) placements.push(consumerCustomPlacement);\n\t\t\tif (consumerCustomPlacements?.length) {\n\t\t\t\tplacements.push(...consumerCustomPlacements);\n\t\t\t}\n\t\t\tfor (const contribution of orderedPluginContributions) {\n\t\t\t\tif (contribution.customPlacements?.length) {\n\t\t\t\t\tplacements.push(...contribution.customPlacements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn placements;\n\t\t}, [\n\t\t\tconsumerCustomPlacement,\n\t\t\tconsumerCustomPlacements,\n\t\t\torderedPluginContributions,\n\t\t]);\n\n\t\tconst customPlacement = useMemo(\n\t\t\t() =>\n\t\t\t\t[...allCustomPlacements]\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.find((placement) => placement.toolId === toolId),\n\t\t\t[allCustomPlacements, toolId],\n\t\t);\n\n\t\tconst remotePresence =\n\t\t\t[...orderedPluginContributions]\n\t\t\t\t.reverse()\n\t\t\t\t.map((contribution) => contribution.viewportProps?.remotePresence)\n\t\t\t\t.find((value) => value !== undefined) ?? consumerRemotePresence;\n\n\t\tconst presenceOverlay =\n\t\t\t[...orderedPluginContributions]\n\t\t\t\t.reverse()\n\t\t\t\t.map((contribution) => contribution.viewportProps?.presenceOverlay)\n\t\t\t\t.find((value) => value !== undefined) ?? consumerPresenceOverlay;\n\n\t\tconst onWorldPointerDown = composePluginEvent(\n\t\t\tconsumerOnWorldPointerDown,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onWorldPointerDown,\n\t\t\t),\n\t\t);\n\t\tconst onWorldPointerMove = composePluginEvent(\n\t\t\tconsumerOnWorldPointerMove,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onWorldPointerMove,\n\t\t\t),\n\t\t);\n\t\tconst onWorldPointerLeave = composePluginEvent(\n\t\t\tconsumerOnWorldPointerLeave,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onWorldPointerLeave,\n\t\t\t),\n\t\t);\n\t\tconst onPlacementPreviewChange = composePluginEvent(\n\t\t\tconsumerOnPlacementPreviewChange,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onPlacementPreviewChange,\n\t\t\t),\n\t\t);\n\t\tconst onCameraChange = composePluginEvent(\n\t\t\tconsumerOnCameraChange,\n\t\t\torderedPluginContributions.map(\n\t\t\t\t(contribution) => contribution.callbacks?.onCameraChange,\n\t\t\t),\n\t\t);\n\n\t\tconst onItemsChange = useMemo(() => {\n\t\t\tconst middlewares = orderedPluginContributions\n\t\t\t\t.map((contribution) => contribution.wrapOnItemsChange)\n\t\t\t\t.filter(\n\t\t\t\t\t(\n\t\t\t\t\t\tmiddleware,\n\t\t\t\t\t): middleware is NonNullable<\n\t\t\t\t\t\tCanvasPluginContribution[\"wrapOnItemsChange\"]\n\t\t\t\t\t> => middleware != null,\n\t\t\t\t);\n\t\t\tif (!consumerOnItemsChange && middlewares.length === 0) return undefined;\n\t\t\tconst baseNext: NonNullable<VectorViewportProps[\"onItemsChange\"]> = (\n\t\t\t\tnextItems,\n\t\t\t) => {\n\t\t\t\tconsumerOnItemsChange?.(nextItems);\n\t\t\t};\n\t\t\treturn middlewares.reduceRight<\n\t\t\t\tNonNullable<VectorViewportProps[\"onItemsChange\"]>\n\t\t\t>(\n\t\t\t\t(next, middleware) => (nextItems) => {\n\t\t\t\t\tconst ctx: CanvasPluginItemsChangeMiddlewareContext = {\n\t\t\t\t\t\tcurrentItems: items,\n\t\t\t\t\t\tnext,\n\t\t\t\t\t\tconsumerOnItemsChange,\n\t\t\t\t\t\tviewportRef: pluginViewportRef,\n\t\t\t\t\t};\n\t\t\t\t\tmiddleware(nextItems, ctx);\n\t\t\t\t},\n\t\t\t\tbaseNext,\n\t\t\t);\n\t\t}, [consumerOnItemsChange, items, orderedPluginContributions]);\n\n\t\tconst pluginRenderContext = useMemo<CanvasPluginRenderContext>(\n\t\t\t() => ({ viewportRef: pluginViewportRef }),\n\t\t\t[],\n\t\t);\n\n\t\tconst pluginContextValue = useMemo(\n\t\t\t() => ({\n\t\t\t\tviewportRef: pluginViewportRef,\n\t\t\t\tviewport: {\n\t\t\t\t\titems,\n\t\t\t\t\tonItemsChange: consumerOnItemsChange,\n\t\t\t\t\ttoolId,\n\t\t\t\t\tinteractive,\n\t\t\t\t\ttoolLocked,\n\t\t\t\t\tonToolChangeRequest,\n\t\t\t\t},\n\t\t\t\tresolvedTools,\n\t\t\t\tregisterContribution,\n\t\t\t\tunregisterContribution,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tconsumerOnItemsChange,\n\t\t\t\tinteractive,\n\t\t\t\titems,\n\t\t\t\tonToolChangeRequest,\n\t\t\t\tregisterContribution,\n\t\t\t\tresolvedTools,\n\t\t\t\ttoolId,\n\t\t\t\ttoolLocked,\n\t\t\t\tunregisterContribution,\n\t\t\t],\n\t\t);\n\t\tconst toolIdRef = useRef(toolId);\n\t\tconst interactiveRef = useRef(interactive);\n\t\tconst reducedMotionRef = useRef(false);\n\t\tconst itemsRef = useRef(items);\n\t\tconst onWorldPointerDownRef = useRef(onWorldPointerDown);\n\t\tconst onItemsChangeRef = useRef(onItemsChange);\n\t\tconst onActivateLinkRef = useRef(onActivateLink);\n\t\tonActivateLinkRef.current = onActivateLink;\n\t\tconst assetStoreRef = useRef(assetStore);\n\t\tassetStoreRef.current = assetStore;\n\t\tconst customPlacementRef = useRef(customPlacement);\n\t\tcustomPlacementRef.current = customPlacement;\n\t\tconst dragStateRef = useRef<DragState>({ kind: \"idle\" });\n\t\tconst clipboardRef = useRef<VectorSceneItem[] | null>(null);\n\t\tconst undoStackRef = useRef<VectorSceneItem[][]>([]);\n\t\tconst redoStackRef = useRef<VectorSceneItem[][]>([]);\n\t\tconst isUndoingRef = useRef(false);\n\t\tconst MAX_HISTORY = 50;\n\t\tconst [canUndo, setCanUndo] = useState(false);\n\t\tconst [canRedo, setCanRedo] = useState(false);\n\n\t\tconst pushUndo = useCallback(() => {\n\t\t\tundoStackRef.current.push(itemsRef.current.map((i) => structuredClone(i)));\n\t\t\tif (undoStackRef.current.length > MAX_HISTORY) {\n\t\t\t\tundoStackRef.current.shift();\n\t\t\t}\n\t\t\tredoStackRef.current = [];\n\t\t\tsetCanUndo(true);\n\t\t\tsetCanRedo(false);\n\t\t}, []);\n\n\t\tconst undo = useCallback(() => {\n\t\t\tconst stack = undoStackRef.current;\n\t\t\tif (stack.length === 0) return;\n\t\t\tconst prev = stack.pop() as VectorSceneItem[];\n\t\t\tconst current = itemsRef.current.map((i) => structuredClone(i));\n\t\t\tredoStackRef.current.push(current);\n\t\t\tsetCanRedo(true);\n\t\t\tsetCanUndo(stack.length > 0);\n\t\t\tisUndoingRef.current = true;\n\t\t\tonItemsChangeRef.current?.(prev);\n\t\t}, []);\n\n\t\tconst redo = useCallback(() => {\n\t\t\tconst stack = redoStackRef.current;\n\t\t\tif (stack.length === 0) return;\n\t\t\tconst next = stack.pop() as VectorSceneItem[];\n\t\t\tconst current = itemsRef.current.map((i) => structuredClone(i));\n\t\t\tundoStackRef.current.push(current);\n\t\t\tsetCanUndo(true);\n\t\t\tsetCanRedo(stack.length > 0);\n\t\t\tisUndoingRef.current = true;\n\t\t\tonItemsChangeRef.current?.(next);\n\t\t}, []);\n\t\tconst [contextMenu, setContextMenu] = useState<{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\titemIds: string[];\n\t\t} | null>(null);\n\n\t\tconst [uncontrolledSel, setUncontrolledSel] = useState<string[]>([]);\n\t\tconst isSelectionControlled = onSelectionChange !== undefined;\n\t\t/**\n\t\t * Stable when only `items` changes: controlled branch keys off serialized ids so parents\n\t\t * that pass a new `selectedIds` array reference each render with the same contents do not\n\t\t * invalidate this memo every frame (avoids orphan-selection effect + update-depth issues).\n\t\t */\n\t\tconst controlledSelectedKey = JSON.stringify(selectedIdsProp ?? []);\n\t\tconst effectiveSelectedIds = useMemo((): string[] => {\n\t\t\tif (isSelectionControlled) {\n\t\t\t\treturn [...(JSON.parse(controlledSelectedKey) as string[])];\n\t\t\t}\n\t\t\treturn uncontrolledSel;\n\t\t}, [isSelectionControlled, controlledSelectedKey, uncontrolledSel]);\n\n\t\tconst effectiveSelectedIdsRef = useRef<string[]>([]);\n\t\teffectiveSelectedIdsRef.current = effectiveSelectedIds;\n\n\t\tconst setEffectiveSelectedIds = useCallback(\n\t\t\t(ids: readonly string[]) => {\n\t\t\t\tconst next = [...ids];\n\t\t\t\tif (isSelectionControlled) {\n\t\t\t\t\tonSelectionChange?.(next);\n\t\t\t\t} else {\n\t\t\t\t\tsetUncontrolledSel(next);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[isSelectionControlled, onSelectionChange],\n\t\t);\n\n\t\tconst setEffectiveSelectedIdsRef = useRef(setEffectiveSelectedIds);\n\t\tsetEffectiveSelectedIdsRef.current = setEffectiveSelectedIds;\n\n\t\ttoolIdRef.current = toolId;\n\t\tinteractiveRef.current = interactive;\n\t\titemsRef.current = items;\n\t\tonWorldPointerDownRef.current = onWorldPointerDown;\n\t\tconst originalOnItemsChangeRef = useRef(onItemsChange);\n\t\toriginalOnItemsChangeRef.current = onItemsChange;\n\t\tconst changeItems = useCallback(\n\t\t\t(items: VectorSceneItem[]) => {\n\t\t\t\tif (!isUndoingRef.current) {\n\t\t\t\t\tpushUndo();\n\t\t\t\t}\n\t\t\t\tisUndoingRef.current = false;\n\t\t\t\toriginalOnItemsChangeRef.current?.(items);\n\t\t\t},\n\t\t\t[pushUndo],\n\t\t);\n\t\tonItemsChangeRef.current = changeItems;\n\t\tconst toolLockedRef = useRef(toolLocked);\n\t\ttoolLockedRef.current = toolLocked;\n\t\tconst autoResetToolToRef = useRef(autoResetToolTo);\n\t\tautoResetToolToRef.current = autoResetToolTo;\n\t\tconst onToolChangeRequestRef = useRef(onToolChangeRequest);\n\t\tonToolChangeRequestRef.current = onToolChangeRequest;\n\n\t\tconst resolvedItems = useMemo(() => resolveArrowBindingsInScene(items), [items]);\n\t\tconst resolvedItemsRef = useRef(resolvedItems);\n\t\tresolvedItemsRef.current = resolvedItems;\n\n\t\tconst liveId = useId();\n\t\tconst reducedMotion = usePrefersReducedMotion();\n\t\treducedMotionRef.current = reducedMotion;\n\t\tconst [zoomPercent, setZoomPercent] = useState(100);\n\t\tconst [cameraTick, setCameraTick] = useState(0);\n\t\tconst [placementPreview, setPlacementPreview] =\n\t\t\tuseState<PlacementPreview | null>(null);\n\t\tconst [eraserTrail, setEraserTrail] = useState<\n\t\t\t{ x: number; y: number; t: number }[]\n\t\t>([]);\n\t\tconst [laserTrail, setLaserTrail] = useState<\n\t\t\t{ x: number; y: number; t: number }[]\n\t\t>([]);\n\t\tconst [eraserPreviewIds, setEraserPreviewIds] = useState<string[]>([]);\n\t\tconst eraserPreviewIdsRef = useRef<Set<string>>(new Set());\n\t\t/** Items the active marquee currently covers — live preview of what\n\t\t * releasing will select. Kept in sync with the same hit-test pointer-up\n\t\t * uses, so the preview never disagrees with the committed selection. */\n\t\tconst [marqueeCandidateIds, setMarqueeCandidateIds] = useState<string[]>([]);\n\t\tconst marqueeCandidateIdsRef = useRef<string[]>([]);\n\t\tmarqueeCandidateIdsRef.current = marqueeCandidateIds;\n\t\tconst resolvedSceneItems = useMemo(() => {\n\t\t\tif (eraserPreviewIds.length === 0) return resolvedItems;\n\t\t\tconst hiddenIds = new Set(eraserPreviewIds);\n\t\t\treturn resolvedItems.filter((it) => !hiddenIds.has(it.id));\n\t\t}, [eraserPreviewIds, resolvedItems]);\n\t\tconst livePenStrokeItemRef = useRef<VectorSceneItem | null>(null);\n\t\tconst [eraserActive, setEraserActive] = useState(false);\n\t\tconst [editingTextId, setEditingTextId] = useState<string | null>(null);\n\t\tconst [draftText, setDraftText] = useState(\"\");\n\t\tconst draftTextRef = useRef(\"\");\n\t\tdraftTextRef.current = draftText;\n\t\tconst [loadingSkeletons, setLoadingSkeletons] = useState<\n\t\t\t{ id: string; x: number; y: number; width: number; height: number }[]\n\t\t>([]);\n\t\tconst skeletonSeqRef = useRef(0);\n\t\t/** Snapshot when inline edit starts; used to restore on Escape if draft changed. */\n\t\tconst editingTextSnapshotRef = useRef<VectorSceneItem | null>(null);\n\t\tconst editingTextIdRef = useRef<string | null>(null);\n\t\teditingTextIdRef.current = editingTextId;\n\t\tconst pendingImagePlacementRef = useRef<{\n\t\t\tworldX: number;\n\t\t\tworldY: number;\n\t\t} | null>(null);\n\t\tconst lastToolIdRef = useRef(toolId);\n\t\tconst imageInputRef = useRef<HTMLInputElement>(null);\n\t\tconst imageStoreRef = useRef<IndexedDbImageStore | null>(null);\n\t\tif (typeof indexedDB !== \"undefined\" && !imageStoreRef.current) {\n\t\t\timageStoreRef.current = new IndexedDbImageStore();\n\t\t}\n\t\tconst rememberedImageBlobHrefsRef = useRef<Set<string>>(new Set());\n\t\tconst strokeStyleRef = useRef<ActiveToolStyleState>({\n\t\t\t...DEFAULT_STROKE_STYLE,\n\t\t\ttextFontSize: DEFAULT_TEXT_TOOL_FONT_SIZE,\n\t\t});\n\t\tconst [strokeStyleState, setStrokeStyleState] = useState<ActiveToolStyleState>({\n\t\t\t...DEFAULT_STROKE_STYLE,\n\t\t\ttextFontSize: DEFAULT_TEXT_TOOL_FONT_SIZE,\n\t\t});\n\t\tconst setCurrentStrokeStyle = useCallback((next: ActiveToolStyleState) => {\n\t\t\tstrokeStyleRef.current = next;\n\t\t\tsetStrokeStyleState(next);\n\t\t}, []);\n\t\tconst patchCurrentStrokeStyle = useCallback(\n\t\t\t(patch: Partial<ActiveToolStyleState>) => {\n\t\t\t\tconst merged: ActiveToolStyleState = { ...strokeStyleRef.current };\n\t\t\t\tfor (const key of Object.keys(patch) as (keyof ActiveToolStyleState)[]) {\n\t\t\t\t\tconst v = patch[key];\n\t\t\t\t\tif (v !== undefined) {\n\t\t\t\t\t\t(merged as Record<string, unknown>)[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstrokeStyleRef.current = merged;\n\t\t\t\tsetStrokeStyleState(merged);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\t/* ── Progressive image loading (thumbnail → full-res) ── */\n\t\tconst progressiveQueueRef = useRef<Set<string>>(new Set());\n\t\tuseEffect(() => {\n\t\t\tconst store = imageStoreRef.current;\n\t\t\tif (!store) return;\n\t\t\tlet cancelled = false;\n\t\t\tconst timer = setTimeout(async () => {\n\t\t\t\tfor (const item of items) {\n\t\t\t\t\tif (\n\t\t\t\t\t\titem.toolKind === \"image\" &&\n\t\t\t\t\t\titem.imageBlobId &&\n\t\t\t\t\t\ttypeof item.imageRasterHref === \"string\" &&\n\t\t\t\t\t\titem.imageRasterHref.startsWith(\"blob:\") &&\n\t\t\t\t\t\titem.imageThumbnailHref &&\n\t\t\t\t\t\t!progressiveQueueRef.current.has(item.id)\n\t\t\t\t\t) {\n\t\t\t\t\t\tprogressiveQueueRef.current.add(item.id);\n\t\t\t\t\t\tconst fullUrl = item.imageRasterHref;\n\t\t\t\t\t\t// Pre-decode the full-res image\n\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\tconst img = new Image();\n\t\t\t\t\t\t\timg.onload = () => resolve();\n\t\t\t\t\t\t\timg.onerror = () => reject();\n\t\t\t\t\t\t\timg.src = fullUrl;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\t// Swap childrenSvg to use full-res\n\t\t\t\t\t\tconst { buildRasterImageChildrenSvg } = await import(\n\t\t\t\t\t\t\t\"../scene/shape-builders\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\t\tif (!change) return;\n\t\t\t\t\t\tconst list = itemsRef.current;\n\t\t\t\t\t\tconst existing = list.find((i) => i.id === item.id);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!existing ||\n\t\t\t\t\t\t\texisting.toolKind !== \"image\" ||\n\t\t\t\t\t\t\t!existing.imageIntrinsicSize\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tconst { imageIntrinsicSize: isize } = existing;\n\t\t\t\t\t\tconst rebuilt = {\n\t\t\t\t\t\t\t...existing,\n\t\t\t\t\t\t\timageThumbnailHref: undefined,\n\t\t\t\t\t\t\tchildrenSvg: buildRasterImageChildrenSvg(\n\t\t\t\t\t\t\t\tfullUrl,\n\t\t\t\t\t\t\t\tisize,\n\t\t\t\t\t\t\t\texisting.bounds,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t} as VectorSceneItem;\n\t\t\t\t\t\tchange(list.map((i) => (i.id === item.id ? rebuilt : i)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t\treturn () => {\n\t\t\t\tcancelled = true;\n\t\t\t\tclearTimeout(timer);\n\t\t\t};\n\t\t}, [items]);\n\t\tconst onCameraChangeRef = useRef(onCameraChange);\n\t\tonCameraChangeRef.current = onCameraChange;\n\t\tconst onWorldPointerMoveRef = useRef(onWorldPointerMove);\n\t\tonWorldPointerMoveRef.current = onWorldPointerMove;\n\t\tconst onWorldPointerLeaveRef = useRef(onWorldPointerLeave);\n\t\tonWorldPointerLeaveRef.current = onWorldPointerLeave;\n\t\tconst onPlacementPreviewChangeRef = useRef(onPlacementPreviewChange);\n\t\tonPlacementPreviewChangeRef.current = onPlacementPreviewChange;\n\t\tconst directRemoteStrokePreviewRef = useRef(false);\n\t\tconst remoteStrokePreviewFrameRef = useRef<number | null>(null);\n\t\tconst remoteStrokePreviewClearTimerRef = useRef<number | null>(null);\n\t\tconst pendingRemoteStrokePreviewRef = useRef<{\n\t\t\ttool: Extract<DragState, { kind: \"stroke\" }>[\"tool\"];\n\t\t\tpoints: VectorPathPoint[];\n\t\t} | null>(null);\n\n\t\tconst cancelPendingRemoteStrokePreviewClear = useCallback(() => {\n\t\t\tif (remoteStrokePreviewClearTimerRef.current != null) {\n\t\t\t\tclearTimeout(remoteStrokePreviewClearTimerRef.current);\n\t\t\t\tremoteStrokePreviewClearTimerRef.current = null;\n\t\t\t}\n\t\t}, []);\n\n\t\tconst flushRemoteStrokePreviewWithStyle = useCallback(() => {\n\t\t\tremoteStrokePreviewFrameRef.current = null;\n\t\t\tconst pending = pendingRemoteStrokePreviewRef.current;\n\t\t\tif (!pending) return;\n\t\t\tonPlacementPreviewChangeRef.current?.({\n\t\t\t\tkind: \"stroke\",\n\t\t\t\ttool: pending.tool,\n\t\t\t\tpoints: pending.points,\n\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t});\n\t\t}, []);\n\n\t\tconst emitRemoteStrokePreview = useCallback(\n\t\t\t(\n\t\t\t\ttool: Extract<DragState, { kind: \"stroke\" }>[\"tool\"],\n\t\t\t\tpoints: VectorPathPoint[],\n\t\t\t) => {\n\t\t\t\tif (tool === \"laser\") return;\n\t\t\t\tcancelPendingRemoteStrokePreviewClear();\n\t\t\t\tdirectRemoteStrokePreviewRef.current = true;\n\t\t\t\tpendingRemoteStrokePreviewRef.current = { tool, points };\n\t\t\t\tif (remoteStrokePreviewFrameRef.current != null) return;\n\t\t\t\tremoteStrokePreviewFrameRef.current = requestAnimationFrame(\n\t\t\t\t\tflushRemoteStrokePreviewWithStyle,\n\t\t\t\t);\n\t\t\t},\n\t\t\t[cancelPendingRemoteStrokePreviewClear, flushRemoteStrokePreviewWithStyle],\n\t\t);\n\n\t\t/** Latency between local commit and the committed item reaching peers via\n\t\t * `document:update` (debounce + websocket RTT). Keep the markup preview\n\t\t * alive a bit longer so peers don't see a blank frame between preview clear\n\t\t * and the rendered committed item. */\n\t\tconst REMOTE_STROKE_PREVIEW_HOLD_MS = 350;\n\n\t\tconst emitRemoteStrokePreviewClear = useCallback(() => {\n\t\t\tif (remoteStrokePreviewFrameRef.current != null) {\n\t\t\t\tcancelAnimationFrame(remoteStrokePreviewFrameRef.current);\n\t\t\t\tremoteStrokePreviewFrameRef.current = null;\n\t\t\t}\n\t\t\tcancelPendingRemoteStrokePreviewClear();\n\t\t\tremoteStrokePreviewClearTimerRef.current = window.setTimeout(() => {\n\t\t\t\tremoteStrokePreviewClearTimerRef.current = null;\n\t\t\t\tpendingRemoteStrokePreviewRef.current = null;\n\t\t\t\tdirectRemoteStrokePreviewRef.current = false;\n\t\t\t\tonPlacementPreviewChangeRef.current?.(null);\n\t\t\t}, REMOTE_STROKE_PREVIEW_HOLD_MS);\n\t\t}, [cancelPendingRemoteStrokePreviewClear]);\n\t\t/** Re-render overlays when the camera moves — including non-interactive + `remotePresence`. */\n\t\tconst overlayCameraTickRef = useRef(false);\n\t\toverlayCameraTickRef.current =\n\t\t\tinteractive ||\n\t\t\t(remotePresence != null && remotePresence.length > 0) ||\n\t\t\tpresenceOverlay != null;\n\t\tconst pruneEraserTrail = useCallback(\n\t\t\t(points: { x: number; y: number; t: number }[]) => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst maxAgeMs = 150;\n\t\t\t\treturn points.filter((p) => now - p.t <= maxAgeMs);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\t\tconst pruneLaserTrail = useCallback(\n\t\t\t(points: { x: number; y: number; t: number }[]) => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst maxAgeMs = 650;\n\t\t\t\treturn points.filter((p) => now - p.t <= maxAgeMs);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\t\tconst requestAutoResetTool = useCallback((usedTool: string) => {\n\t\t\tif (toolLockedRef.current) return;\n\t\t\tif (usedTool === \"select\" || usedTool === \"hand\") return;\n\t\t\tonToolChangeRequestRef.current?.(autoResetToolToRef.current);\n\t\t}, []);\n\n\t\tconst shouldKeepToolForContinuousPenInput = useCallback(\n\t\t\t(tool: string, pointerType: string) =>\n\t\t\t\tpointerType === \"pen\" && (tool === \"draw\" || tool === \"marker\"),\n\t\t\t[],\n\t\t);\n\n\t\tconst commitCompletedStroke = useCallback(\n\t\t\t(args: {\n\t\t\t\ttool: Extract<DragState, { kind: \"stroke\" }>[\"tool\"];\n\t\t\t\tpointerType: string;\n\t\t\t\tpoints: VectorPathPoint[];\n\t\t\t\tstyle: StrokeStyle;\n\t\t\t\titemId?: string;\n\t\t\t}) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change) return;\n\t\t\t\tif (args.tool === \"laser\") {\n\t\t\t\t\tif (!shouldKeepToolForContinuousPenInput(args.tool, args.pointerType)) {\n\t\t\t\t\t\trequestAutoResetTool(args.tool);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst id = args.itemId ?? createShapeId();\n\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\tid,\n\t\t\t\t\targs.points,\n\t\t\t\t\targs.tool,\n\t\t\t\t\targs.style,\n\t\t\t\t);\n\t\t\t\tif (item) {\n\t\t\t\t\tconst exists = itemsRef.current.some((it) => it.id === id);\n\t\t\t\t\tchange(\n\t\t\t\t\t\texists\n\t\t\t\t\t\t\t? replaceItem(itemsRef.current, id, item)\n\t\t\t\t\t\t\t: [...itemsRef.current, item],\n\t\t\t\t\t);\n\t\t\t\t\tpatchCurrentStrokeStyle({\n\t\t\t\t\t\tstroke: item.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\t\t\t\t\tstrokeWidth: item.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\t\t\t\t\tstrokeOpacity: item.strokeOpacity,\n\t\t\t\t\t\tstrokeDash: item.strokeDash,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!shouldKeepToolForContinuousPenInput(args.tool, args.pointerType)) {\n\t\t\t\t\trequestAutoResetTool(args.tool);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tpatchCurrentStrokeStyle,\n\t\t\t\trequestAutoResetTool,\n\t\t\t\tshouldKeepToolForContinuousPenInput,\n\t\t\t],\n\t\t);\n\n\t\tconst captureInteractionPointer = useCallback(\n\t\t\t(\n\t\t\t\ttarget: HTMLDivElement,\n\t\t\t\tpointerId: number,\n\t\t\t\toptions?: { captureNativePointer?: boolean },\n\t\t\t) => {\n\t\t\t\tconst captureNativePointer = options?.captureNativePointer ?? true;\n\t\t\t\tdebugApplePencilPointer(\"capture\", { pointerId, captureNativePointer });\n\t\t\t\tactiveInteractionPointerIdRef.current = pointerId;\n\t\t\t\tactiveInteractionPointerTargetRef.current = captureNativePointer\n\t\t\t\t\t? target\n\t\t\t\t\t: null;\n\t\t\t\tif (captureNativePointer) {\n\t\t\t\t\ttryPointerCaptureOnTarget(target, pointerId);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst releaseInteractionPointer = useCallback(() => {\n\t\t\tconst pointerId = activeInteractionPointerIdRef.current;\n\t\t\tconst target = activeInteractionPointerTargetRef.current;\n\t\t\tdebugApplePencilPointer(\"release\", { pointerId });\n\t\t\tif (pointerId != null && target) {\n\t\t\t\ttry {\n\t\t\t\t\tif (target.hasPointerCapture(pointerId)) {\n\t\t\t\t\t\ttarget.releasePointerCapture(pointerId);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore Safari/iPad capture races */\n\t\t\t\t}\n\t\t\t}\n\t\t\tactiveInteractionPointerIdRef.current = null;\n\t\t\tactiveInteractionPointerTargetRef.current = null;\n\t\t\tactiveInteractionTouchIdRef.current = null;\n\t\t}, []);\n\n\t\tconst renderSceneWithLivePenStroke = useCallback(\n\t\t\t(item: VectorSceneItem | null) => {\n\t\t\t\tlivePenStrokeItemRef.current = item;\n\t\t\t\tconst renderer = rendererRef.current;\n\t\t\t\tif (!renderer) return;\n\t\t\t\trenderer.renderLiveItem(item);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst updateStrokePreviewPoints = useCallback(\n\t\t\t(strokeState: StrokeDragState, points: VectorPathPoint[]) => {\n\t\t\t\tstrokeState.points = points;\n\t\t\t\tif (strokeState.itemId && strokeState.tool !== \"laser\") {\n\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\tstrokeState.itemId,\n\t\t\t\t\t\tpoints,\n\t\t\t\t\t\tstrokeState.tool,\n\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t);\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t}\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\temitRemoteStrokePreview(strokeState.tool, points);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (strokeState.tool === \"laser\") return;\n\t\t\t\tsetPlacementPreview({\n\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\ttool: strokeState.tool,\n\t\t\t\t\tpoints,\n\t\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t\t});\n\t\t\t},\n\t\t\t[emitRemoteStrokePreview, renderSceneWithLivePenStroke],\n\t\t);\n\n\t\tconst setStraightStrokeEndpoint = useCallback(\n\t\t\t(strokeState: StrokeDragState, endpoint: VectorPathPoint) => {\n\t\t\t\tconst straightLine = strokeState.straightLine;\n\t\t\t\tif (!straightLine) return;\n\t\t\t\tstraightLine.active = true;\n\t\t\t\tupdateStrokePreviewPoints(strokeState, [straightLine.anchorPoint, endpoint]);\n\t\t\t},\n\t\t\t[updateStrokePreviewPoints],\n\t\t);\n\n\t\tconst startOrRestartStraightStrokeHoldTimer = useCallback(\n\t\t\t(strokeState: StrokeDragState) => {\n\t\t\t\tconst straightLine = strokeState.straightLine;\n\t\t\t\tif (!straightLine || strokeState.tool !== \"draw\") return;\n\t\t\t\tclearStraightStrokeHoldTimer(strokeState);\n\t\t\t\tstraightLine.holdTimer = window.setTimeout(() => {\n\t\t\t\t\tstraightLine.holdTimer = null;\n\t\t\t\t\tconst currentStrokeState = dragStateRef.current;\n\t\t\t\t\tif (\n\t\t\t\t\t\tcurrentStrokeState.kind !== \"stroke\" ||\n\t\t\t\t\t\tcurrentStrokeState !== strokeState\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst endpoint = lastStrokePoint(currentStrokeState.points);\n\t\t\t\t\tif (!endpoint) return;\n\t\t\t\t\tsetStraightStrokeEndpoint(currentStrokeState, endpoint);\n\t\t\t\t}, STRAIGHT_STROKE_HOLD_DURATION_MS);\n\t\t\t},\n\t\t\t[setStraightStrokeEndpoint],\n\t\t);\n\n\t\tconst updateStraightStrokeForMove = useCallback(\n\t\t\t(\n\t\t\t\tstrokeState: StrokeDragState,\n\t\t\t\tclientX: number,\n\t\t\t\tclientY: number,\n\t\t\t\tendpoint: VectorPathPoint,\n\t\t\t): boolean => {\n\t\t\t\tconst straightLine = strokeState.straightLine;\n\t\t\t\tif (!straightLine || strokeState.tool !== \"draw\") return false;\n\t\t\t\tif (straightLine.active) {\n\t\t\t\t\tsetStraightStrokeEndpoint(strokeState, endpoint);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tstraightLine.holdTimer &&\n\t\t\t\t\thasMovedPastStraightStrokeJitter(straightLine, clientX, clientY)\n\t\t\t\t) {\n\t\t\t\t\tstraightLine.holdScreen = { x: clientX, y: clientY };\n\t\t\t\t\tstartOrRestartStraightStrokeHoldTimer(strokeState);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\t[setStraightStrokeEndpoint, startOrRestartStraightStrokeHoldTimer],\n\t\t);\n\n\t\tconst finalizeStrokeDragState = useCallback(\n\t\t\t(strokeState: Extract<DragState, { kind: \"stroke\" }>) => {\n\t\t\t\tconst tool = strokeState.tool;\n\t\t\t\tconst pts = strokeState.points;\n\t\t\t\tconst pointerType = strokeState.pointerType;\n\t\t\t\tconst itemId = strokeState.itemId;\n\t\t\t\tconst style = { ...strokeStyleRef.current };\n\t\t\t\tdebugApplePencilPointer(\"finalize-stroke\", {\n\t\t\t\t\tpointerType,\n\t\t\t\t\ttool,\n\t\t\t\t\tpoints: pts.length,\n\t\t\t\t});\n\t\t\t\tclearStraightStrokeHoldTimer(strokeState);\n\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\treleaseInteractionPointer();\n\t\t\t\tif (itemId) {\n\t\t\t\t\trenderSceneWithLivePenStroke(null);\n\t\t\t\t}\n\t\t\t\temitRemoteStrokePreviewClear();\n\t\t\t\tsetPlacementPreview(null);\n\t\t\t\tcommitCompletedStroke({\n\t\t\t\t\ttool,\n\t\t\t\t\tpointerType,\n\t\t\t\t\tpoints: [...pts],\n\t\t\t\t\tstyle,\n\t\t\t\t\titemId,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[\n\t\t\t\tcommitCompletedStroke,\n\t\t\t\temitRemoteStrokePreviewClear,\n\t\t\t\treleaseInteractionPointer,\n\t\t\t\trenderSceneWithLivePenStroke,\n\t\t\t],\n\t\t);\n\n\t\tconst renderFrame = useCallback(() => {\n\t\t\tconst renderer = rendererRef.current;\n\t\t\tconst cam = cameraRef.current;\n\t\t\tif (!renderer || !cam) return;\n\t\t\trenderer.render();\n\t\t\tif (overlayCameraTickRef.current) {\n\t\t\t\tsetCameraTick((n) => n + 1);\n\t\t\t}\n\t\t\tif (!reducedMotionRef.current) {\n\t\t\t\tsetZoomPercent(Math.round(cam.zoom * 100));\n\t\t\t}\n\t\t\tonCameraChangeRef.current?.();\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tconst interactionEl = interactionRootRef.current;\n\t\t\tif (!el || !interactionEl) return;\n\n\t\t\tconst camera = new Camera2D({ minZoom: 0.1, maxZoom: 24 });\n\t\t\tcameraRef.current = camera;\n\t\t\tsetCameraForOverlay(camera);\n\n\t\t\tconst scene = new VectorScene();\n\t\t\tsceneRef.current = scene;\n\t\t\tscene.setItems(itemsRef.current);\n\n\t\t\tconst renderer = new SvgVectorRenderer({\n\t\t\t\tcontainer: el,\n\t\t\t\tscene,\n\t\t\t\tcamera,\n\t\t\t\tpointerEventsNone: interactiveRef.current,\n\t\t\t});\n\t\t\trendererRef.current = renderer;\n\t\t\trenderer.render();\n\t\t\tif (!reducedMotionRef.current) {\n\t\t\t\tsetZoomPercent(Math.round(camera.zoom * 100));\n\t\t\t}\n\n\t\t\tconst detachInput = attachViewportInput({\n\t\t\t\telement: interactionEl,\n\t\t\t\tcamera,\n\t\t\t\tonUpdate: renderFrame,\n\t\t\t\twheelElement: wrapperRef.current ?? undefined,\n\t\t\t\ttouchHandledElsewhere: applePencilNav,\n\t\t\t\tallowPrimaryPointerPan: () => {\n\t\t\t\t\tif (interactiveRef.current) {\n\t\t\t\t\t\treturn toolIdRef.current === \"hand\";\n\t\t\t\t\t}\n\t\t\t\t\tconst t = toolIdRef.current;\n\t\t\t\t\treturn t === \"hand\" || t === \"select\";\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlet detachPencil: (() => void) | undefined;\n\t\t\tif (applePencilNav) {\n\t\t\t\tdetachPencil = attachApplePencilNavigation({\n\t\t\t\t\telement: interactionEl,\n\t\t\t\t\tcamera,\n\t\t\t\t\tgetCurrentToolId: () => toolIdRef.current,\n\t\t\t\t\tonUpdate: renderFrame,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tdetachInput();\n\t\t\t\tdetachPencil?.();\n\t\t\t\trenderer.destroy();\n\t\t\t\trendererRef.current = null;\n\t\t\t\tsceneRef.current = null;\n\t\t\t\tcameraRef.current = null;\n\t\t\t\tsetCameraForOverlay(null);\n\t\t\t};\n\t\t}, [applePencilNav, renderFrame]);\n\n\t\tuseEffect(() => {\n\t\t\tconst r = rendererRef.current;\n\t\t\tif (!r) return;\n\t\t\tr.setPointerEventsNone(interactive);\n\t\t}, [interactive]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!eraserActive && laserTrail.length === 0) return;\n\t\t\tconst timer = window.setInterval(() => {\n\t\t\t\tsetEraserTrail((prev) => pruneEraserTrail(prev));\n\t\t\t\tsetLaserTrail((prev) => pruneLaserTrail(prev));\n\t\t\t}, 50);\n\t\t\treturn () => window.clearInterval(timer);\n\t\t}, [eraserActive, laserTrail.length, pruneEraserTrail, pruneLaserTrail]);\n\n\t\tuseEffect(() => {\n\t\t\tconst root = wrapperRef.current;\n\t\t\tif (!root || !onWorldPointerMove) return;\n\t\t\tlet lastEmit = 0;\n\t\t\tconst throttleMs = 33;\n\t\t\tconst move = (e: PointerEvent) => {\n\t\t\t\tconst now = performance.now();\n\t\t\t\tif (now - lastEmit < throttleMs) return;\n\t\t\t\tlastEmit = now;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tconst rect = sceneContainerRef.current?.getBoundingClientRect();\n\t\t\t\tif (!cam || !rect) return;\n\t\t\t\tconst { worldX, worldY } = cam.screenToWorld(\n\t\t\t\t\te.clientX - rect.left,\n\t\t\t\t\te.clientY - rect.top,\n\t\t\t\t);\n\t\t\t\tonWorldPointerMoveRef.current?.({ x: worldX, y: worldY });\n\t\t\t};\n\t\t\tconst leave = () => onWorldPointerLeaveRef.current?.();\n\t\t\troot.addEventListener(\"pointermove\", move, { passive: true });\n\t\t\troot.addEventListener(\"pointerleave\", leave);\n\t\t\treturn () => {\n\t\t\t\troot.removeEventListener(\"pointermove\", move);\n\t\t\t\troot.removeEventListener(\"pointerleave\", leave);\n\t\t\t};\n\t\t}, [onWorldPointerMove]);\n\n\t\t// Track the latest cursor screen position so pasted content can spawn\n\t\t// under the cursor, mirroring drag & drop placement.\n\t\tuseEffect(() => {\n\t\t\tconst root = wrapperRef.current;\n\t\t\tif (!root) return;\n\t\t\tconst record = (e: PointerEvent) => {\n\t\t\t\tlastPointerScreenRef.current = { x: e.clientX, y: e.clientY };\n\t\t\t};\n\t\t\tconst clear = () => {\n\t\t\t\tlastPointerScreenRef.current = null;\n\t\t\t};\n\t\t\troot.addEventListener(\"pointermove\", record, { passive: true });\n\t\t\troot.addEventListener(\"pointerdown\", record, { passive: true });\n\t\t\troot.addEventListener(\"pointerleave\", clear);\n\t\t\treturn () => {\n\t\t\t\troot.removeEventListener(\"pointermove\", record);\n\t\t\t\troot.removeEventListener(\"pointerdown\", record);\n\t\t\t\troot.removeEventListener(\"pointerleave\", clear);\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tif (directRemoteStrokePreviewRef.current && placementPreview === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonPlacementPreviewChangeRef.current?.(placementPreview);\n\t\t}, [placementPreview]);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (remoteStrokePreviewFrameRef.current != null) {\n\t\t\t\t\tcancelAnimationFrame(remoteStrokePreviewFrameRef.current);\n\t\t\t\t}\n\t\t\t\tif (remoteStrokePreviewClearTimerRef.current != null) {\n\t\t\t\t\tclearTimeout(remoteStrokePreviewClearTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst scene = sceneRef.current;\n\t\t\tconst renderer = rendererRef.current;\n\t\t\tif (scene) {\n\t\t\t\tconst live = livePenStrokeItemRef.current;\n\t\t\t\tif (live && resolvedSceneItems.some((it) => it.id === live.id)) {\n\t\t\t\t\tlivePenStrokeItemRef.current = null;\n\t\t\t\t}\n\t\t\t\tscene.setItems(resolvedSceneItems);\n\t\t\t\trenderFrame();\n\t\t\t\trenderer?.renderLiveItem(livePenStrokeItemRef.current);\n\t\t\t}\n\t\t}, [resolvedSceneItems, renderFrame]);\n\n\t\t/** Drop selection ids that no longer exist (e.g. erased item). */\n\t\tuseEffect(() => {\n\t\t\tconst ids = effectiveSelectedIds;\n\t\t\tconst valid = ids.filter((id) => items.some((i) => i.id === id));\n\t\t\tif (valid.length === ids.length) return;\n\t\t\tsetEffectiveSelectedIdsRef.current(valid);\n\t\t}, [items, effectiveSelectedIds]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!editingTextId) return;\n\t\t\tconst it = items.find((i) => i.id === editingTextId);\n\t\t\tif (!it || it.toolKind !== \"text\") {\n\t\t\t\tsetEditingTextId(null);\n\t\t\t}\n\t\t}, [items, editingTextId]);\n\n\t\tuseEffect(() => {\n\t\t\trememberImageBlobHrefs(items, rememberedImageBlobHrefsRef.current);\n\t\t}, [items]);\n\n\t\tconst blobRevokeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tuseEffect(() => {\n\t\t\tif (blobRevokeTimerRef.current !== null) {\n\t\t\t\tclearTimeout(blobRevokeTimerRef.current);\n\t\t\t\tblobRevokeTimerRef.current = null;\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tblobRevokeTimerRef.current = setTimeout(() => {\n\t\t\t\t\treleaseRememberedBlobHrefs(rememberedImageBlobHrefsRef.current, (href) =>\n\t\t\t\t\t\tURL.revokeObjectURL(href),\n\t\t\t\t\t);\n\t\t\t\t\tblobRevokeTimerRef.current = null;\n\t\t\t\t}, 100);\n\t\t\t};\n\t\t}, []);\n\n\t\tconst PASTE_OFFSET_WORLD = 24;\n\n\t\tconst copyIdsToInternalClipboard = useCallback((ids: readonly string[]) => {\n\t\t\tif (ids.length === 0) return;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst copies = ids\n\t\t\t\t.map((id) => list.find((i) => i.id === id))\n\t\t\t\t.filter((x): x is VectorSceneItem => x != null);\n\t\t\tclipboardRef.current = copies.map(\n\t\t\t\t(it) => JSON.parse(JSON.stringify(it)) as VectorSceneItem,\n\t\t\t);\n\t\t}, []);\n\n\t\tconst pasteFromInternalClipboard = useCallback(() => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tconst buf = clipboardRef.current;\n\t\t\tif (!change || !buf?.length) return;\n\t\t\tconst clones = cloneVectorSceneItemsWithNewIds(buf);\n\t\t\tconst moved = clones.map((it) =>\n\t\t\t\tmoveItemByDelta(it, PASTE_OFFSET_WORLD, PASTE_OFFSET_WORLD),\n\t\t\t);\n\t\t\tchange([...itemsRef.current, ...moved]);\n\t\t\tsetEffectiveSelectedIdsRef.current(moved.map((i) => i.id));\n\t\t}, []);\n\n\t\tconst duplicateIds = useCallback((ids: readonly string[]) => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change || ids.length === 0) return;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst selected = ids\n\t\t\t\t.map((id) => list.find((i) => i.id === id))\n\t\t\t\t.filter((x): x is VectorSceneItem => x != null);\n\t\t\tconst clones = cloneVectorSceneItemsWithNewIds(selected);\n\t\t\tconst moved = clones.map((it) =>\n\t\t\t\tmoveItemByDelta(it, PASTE_OFFSET_WORLD, PASTE_OFFSET_WORLD),\n\t\t\t);\n\t\t\tchange([...list, ...moved]);\n\t\t\tsetEffectiveSelectedIdsRef.current(moved.map((i) => i.id));\n\t\t}, []);\n\n\t\tconst deleteIds = useCallback((ids: readonly string[]) => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change || ids.length === 0) return;\n\t\t\tconst idSet = new Set(ids);\n\t\t\tchange(itemsRef.current.filter((i) => !idSet.has(i.id)));\n\t\t\tsetEffectiveSelectedIdsRef.current([]);\n\t\t}, []);\n\n\t\tconst cutIds = useCallback(\n\t\t\t(ids: readonly string[]) => {\n\t\t\t\tcopyIdsToInternalClipboard(ids);\n\t\t\t\tdeleteIds(ids);\n\t\t\t},\n\t\t\t[copyIdsToInternalClipboard, deleteIds],\n\t\t);\n\n\t\tconst setLockedOnIds = useCallback((ids: readonly string[], locked: boolean) => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change || ids.length === 0) return;\n\t\t\tconst idSet = new Set(ids);\n\t\t\tchange(\n\t\t\t\titemsRef.current.map((it) => (idSet.has(it.id) ? { ...it, locked } : it)),\n\t\t\t);\n\t\t}, []);\n\n\t\tconst reorderIds = useCallback(\n\t\t\t(ids: readonly string[], direction: ReorderDirection) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change || ids.length === 0) return;\n\t\t\t\tconst next = reorderItemsByIds(itemsRef.current, ids, direction);\n\t\t\t\tchange(next);\n\t\t\t\tsetEffectiveSelectedIdsRef.current([...ids]);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst onKeyDown = useCallback(\n\t\t\t(e: KeyboardEvent<HTMLDivElement>) => {\n\t\t\t\tconst t = e.target;\n\t\t\t\tif (\n\t\t\t\t\tt instanceof HTMLTextAreaElement ||\n\t\t\t\t\tt instanceof HTMLInputElement ||\n\t\t\t\t\t(t instanceof HTMLElement && t.isContentEditable)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (editingTextIdRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst camera = cameraRef.current;\n\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\tif (!camera || !el) return;\n\n\t\t\t\tif (interactive && onItemsChangeRef.current) {\n\t\t\t\t\tconst mod = e.ctrlKey || e.metaKey;\n\t\t\t\t\tif (mod && e.key === \"c\") {\n\t\t\t\t\t\tconst ids = effectiveSelectedIdsRef.current;\n\t\t\t\t\t\tif (ids.length > 0) {\n\t\t\t\t\t\t\tcopyIdsToInternalClipboard(ids);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (mod && e.key === \"v\") {\n\t\t\t\t\t\tif (clipboardRef.current?.length) {\n\t\t\t\t\t\t\tpasteFromInternalClipboard();\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (mod && e.key === \"z\") {\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tredo();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tundo();\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (mod && e.key === \"Z\") {\n\t\t\t\t\t\tredo();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.key === \"Delete\" || e.key === \"Backspace\") {\n\t\t\t\t\t\tconst ids = effectiveSelectedIdsRef.current;\n\t\t\t\t\t\tif (ids.length > 0) {\n\t\t\t\t\t\t\tdeleteIds(ids);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst step = 40 / camera.zoom;\n\t\t\t\tlet handled = false;\n\t\t\t\tif (e.key === \"ArrowLeft\") {\n\t\t\t\t\tcamera.x += step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\t\t\tcamera.x -= step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\t\t\tcamera.y += step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"ArrowDown\") {\n\t\t\t\t\tcamera.y -= step;\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"+\" || e.key === \"=\") {\n\t\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_IN_STEP, {\n\t\t\t\t\t\tx: rect.width / 2,\n\t\t\t\t\t\ty: rect.height / 2,\n\t\t\t\t\t});\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"-\" || e.key === \"_\") {\n\t\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_OUT_STEP, {\n\t\t\t\t\t\tx: rect.width / 2,\n\t\t\t\t\t\ty: rect.height / 2,\n\t\t\t\t\t});\n\t\t\t\t\thandled = true;\n\t\t\t\t} else if (e.key === \"0\" && (e.metaKey || e.ctrlKey)) {\n\t\t\t\t\tcamera.zoom = 1;\n\t\t\t\t\tcamera.x = 0;\n\t\t\t\t\tcamera.y = 0;\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\n\t\t\t\tif (handled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\trenderFrame();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\trenderFrame,\n\t\t\t\tinteractive,\n\t\t\t\tcopyIdsToInternalClipboard,\n\t\t\t\tpasteFromInternalClipboard,\n\t\t\t\tdeleteIds,\n\t\t\t\tundo,\n\t\t\t\tredo,\n\t\t\t],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst el = wrapperRef.current;\n\t\t\tif (!el) return;\n\t\t\tel.tabIndex = 0;\n\n\t\t\t// Inject skeleton animation keyframe once\n\t\t\tif (!document.getElementById(\"canvu-skeleton-keyframe\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"canvu-skeleton-keyframe\";\n\t\t\t\tstyle.textContent =\n\t\t\t\t\t\"@keyframes canvu-pulse { 0%,100% { opacity: 0.3 } 50% { opacity: 0.7 } }\";\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\t\t\tif (!document.getElementById(\"canvu-pen-active-ui-block\")) {\n\t\t\t\tconst style = document.createElement(\"style\");\n\t\t\t\tstyle.id = \"canvu-pen-active-ui-block\";\n\t\t\t\tstyle.textContent = CANVU_PEN_ACTIVE_UI_BLOCK_CSS;\n\t\t\t\tdocument.head.appendChild(style);\n\t\t\t}\n\n\t\t\tconst focusOnPointerDown = (e: PointerEvent) => {\n\t\t\t\tconst t = e.target;\n\t\t\t\tif (\n\t\t\t\t\tt instanceof HTMLTextAreaElement ||\n\t\t\t\t\tt instanceof HTMLInputElement ||\n\t\t\t\t\t(t instanceof HTMLElement && t.isContentEditable)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tel.focus({ preventScroll: true });\n\t\t\t};\n\t\t\tel.addEventListener(\"pointerdown\", focusOnPointerDown);\n\n\t\t\tconst ro = new ResizeObserver((entries) => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tconst { inlineSize, blockSize } = entry.borderBoxSize[0] ?? {};\n\t\t\t\t\tif (inlineSize && blockSize) {\n\t\t\t\t\t\tviewportSizeRef.current = {\n\t\t\t\t\t\t\twidth: inlineSize,\n\t\t\t\t\t\t\theight: blockSize,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tro.observe(el);\n\n\t\t\treturn () => {\n\t\t\t\tel.removeEventListener(\"pointerdown\", focusOnPointerDown);\n\t\t\t\tro.disconnect();\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst root = wrapperRef.current;\n\t\t\tif (!root) return;\n\t\t\tconst surface =\n\t\t\t\t(root.closest(\n\t\t\t\t\t'[data-slot=\"vector-canvas-viewport-surface\"]',\n\t\t\t\t) as HTMLElement | null) ?? root;\n\t\t\tconst activePenPointerIds = new Set<number>();\n\t\t\tconst isInteractiveUiTarget = (target: EventTarget | null): boolean => {\n\t\t\t\tif (!(target instanceof HTMLElement)) return false;\n\t\t\t\tif (target.closest('[data-slot=\"shape-context-menu\"]')) return true;\n\t\t\t\tconst ui = target.closest(\n\t\t\t\t\t[\n\t\t\t\t\t\t'[data-slot=\"vector-canvas-toolbar\"]',\n\t\t\t\t\t\t'[data-slot=\"canvu-plugin-layer\"]',\n\t\t\t\t\t\t'[data-slot=\"vector-selection-inspector\"]',\n\t\t\t\t\t\t'[data-slot=\"zoom-minimap-panel\"]',\n\t\t\t\t\t\t'[data-slot=\"text-edit-overlay\"]',\n\t\t\t\t\t\t\".vector-toolbar-overflow-panel\",\n\t\t\t\t\t].join(\", \"),\n\t\t\t\t);\n\t\t\t\tif (!ui) return false;\n\t\t\t\treturn surface.contains(ui);\n\t\t\t};\n\t\t\tconst syncPenActive = () => {\n\t\t\t\tconst active = activePenPointerIds.size > 0;\n\t\t\t\tsurface.toggleAttribute(\"data-canvu-pen-active\", active);\n\t\t\t\tdocument.body.toggleAttribute(\"data-canvu-pen-active\", active);\n\t\t\t};\n\t\t\tconst onPointerDownCapture = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"pen\") return;\n\t\t\t\tpenDetectedRef.current = true;\n\t\t\t\tlastPenPointerDownAtRef.current = performance.now();\n\t\t\t\t// Pen taps landing on UI controls (selection inspector, toolbar, etc.)\n\t\t\t\t// must not toggle pen-active — that CSS would immediately set\n\t\t\t\t// pointer-events:none on the target and break the very tap that\n\t\t\t\t// triggered it.\n\t\t\t\tif (isInteractiveUiTarget(e.target)) return;\n\t\t\t\tactivePenPointerIds.add(e.pointerId);\n\t\t\t\tsyncPenActive();\n\t\t\t};\n\t\t\tconst suppressTouchUiEvent = (e: Event) => {\n\t\t\t\t// Only suppress UI touches while a pen is actively touching the\n\t\t\t\t// surface (palm rejection during drawing). Once the pen lifts,\n\t\t\t\t// finger taps on UI should work normally.\n\t\t\t\tif (activePenPointerIds.size === 0) return;\n\t\t\t\tif (!isInteractiveUiTarget(e.target)) return;\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t};\n\t\t\tconst onTouchPointerCapture = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"touch\") return;\n\t\t\t\tsuppressTouchUiEvent(e);\n\t\t\t};\n\t\t\tconst onPointerEndCapture = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"pen\") return;\n\t\t\t\tactivePenPointerIds.delete(e.pointerId);\n\t\t\t\tsyncPenActive();\n\t\t\t};\n\t\t\tsurface.addEventListener(\"pointerdown\", onPointerDownCapture, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\tsurface.addEventListener(\"pointerup\", onPointerEndCapture, { capture: true });\n\t\t\tsurface.addEventListener(\"pointercancel\", onPointerEndCapture, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"pointerdown\", onTouchPointerCapture, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchstart\", suppressTouchUiEvent, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchmove\", suppressTouchUiEvent, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"selectstart\", suppressTouchUiEvent, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tsurface.removeEventListener(\"pointerdown\", onPointerDownCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tsurface.removeEventListener(\"pointerup\", onPointerEndCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tsurface.removeEventListener(\"pointercancel\", onPointerEndCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"pointerdown\", onTouchPointerCapture, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchstart\", suppressTouchUiEvent, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchmove\", suppressTouchUiEvent, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"selectstart\", suppressTouchUiEvent, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tsurface.removeAttribute(\"data-canvu-pen-active\");\n\t\t\t\tdocument.body.removeAttribute(\"data-canvu-pen-active\");\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tif (!el) return;\n\t\t\tif (interactive) return;\n\n\t\t\tconst onPointerDownForTools = (e: PointerEvent) => {\n\t\t\t\tif (e.button !== 0) return;\n\t\t\t\tif (toolIdRef.current === \"hand\") return;\n\t\t\t\tconst cb = onWorldPointerDownRef.current;\n\t\t\t\tif (!cb) return;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\tconst { worldX, worldY } = cam.screenToWorld(\n\t\t\t\t\te.clientX - rect.left,\n\t\t\t\t\te.clientY - rect.top,\n\t\t\t\t);\n\t\t\t\tcb({\n\t\t\t\t\tworldX,\n\t\t\t\t\tworldY,\n\t\t\t\t\ttoolId: toolIdRef.current,\n\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tel.addEventListener(\"pointerdown\", onPointerDownForTools);\n\t\t\treturn () => el.removeEventListener(\"pointerdown\", onPointerDownForTools);\n\t\t}, [interactive]);\n\n\t\tconst screenToWorld = useCallback((clientX: number, clientY: number) => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tconst cam = cameraRef.current;\n\t\t\tif (!el || !cam) return { worldX: 0, worldY: 0 };\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\treturn cam.screenToWorld(clientX - rect.left, clientY - rect.top);\n\t\t}, []);\n\n\t\tconst handleOverlayContextMenu = useCallback(\n\t\t\t(e: MouseEvent<HTMLDivElement>) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (toolIdRef.current !== \"select\") return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\t\t\t\tconst hit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {\n\t\t\t\t\tlineHitWorld,\n\t\t\t\t\tignoreLocked: true,\n\t\t\t\t});\n\t\t\t\tif (!hit) {\n\t\t\t\t\tsetContextMenu(null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cur = effectiveSelectedIdsRef.current;\n\t\t\t\tlet nextIds: string[];\n\t\t\t\tif (!cur.includes(hit.id)) {\n\t\t\t\t\tnextIds = e.shiftKey ? [...cur, hit.id] : [hit.id];\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current(nextIds);\n\t\t\t\t} else {\n\t\t\t\t\tnextIds = cur;\n\t\t\t\t}\n\t\t\t\tsetContextMenu({\n\t\t\t\t\tx: e.clientX,\n\t\t\t\t\ty: e.clientY,\n\t\t\t\t\titemIds: nextIds,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[screenToWorld],\n\t\t);\n\n\t\tconst viewportHandle = useMemo<VectorViewportHandle>(\n\t\t\t() => ({\n\t\t\t\tgetCamera: () => cameraRef.current,\n\t\t\t\trequestRender: () => {\n\t\t\t\t\trenderFrame();\n\t\t\t\t},\n\t\t\t\tgetViewportSize: () => {\n\t\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\t\tif (!el) {\n\t\t\t\t\t\treturn { width: 0, height: 0 };\n\t\t\t\t\t}\n\t\t\t\t\treturn { width: el.clientWidth, height: el.clientHeight };\n\t\t\t\t},\n\t\t\t\tfitWorldRect: (worldRect, options) => {\n\t\t\t\t\tconst camera = cameraRef.current;\n\t\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\t\tif (!camera || !el) return;\n\t\t\t\t\tconst w = el.clientWidth;\n\t\t\t\t\tconst h = el.clientHeight;\n\t\t\t\t\tfitCameraToWorldRect(camera, w, h, worldRect, options?.padding ?? 0.08);\n\t\t\t\t\trenderFrame();\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[renderFrame],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tpluginViewportRef.current = viewportHandle;\n\t\t\treturn () => {\n\t\t\t\tif (pluginViewportRef.current === viewportHandle) {\n\t\t\t\t\tpluginViewportRef.current = null;\n\t\t\t\t}\n\t\t\t};\n\t\t}, [viewportHandle]);\n\n\t\tuseImperativeHandle(ref, () => viewportHandle, [viewportHandle]);\n\n\t\tconst handleZoomInClick = useCallback(() => {\n\t\t\tconst camera = cameraRef.current;\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tif (!camera || !el) return;\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_IN_STEP, {\n\t\t\t\tx: rect.width / 2,\n\t\t\t\ty: rect.height / 2,\n\t\t\t});\n\t\t\trenderFrame();\n\t\t}, [renderFrame]);\n\n\t\tconst handleZoomOutClick = useCallback(() => {\n\t\t\tconst camera = cameraRef.current;\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tif (!camera || !el) return;\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tcamera.setZoom(camera.zoom * VIEWPORT_ZOOM_OUT_STEP, {\n\t\t\t\tx: rect.width / 2,\n\t\t\t\ty: rect.height / 2,\n\t\t\t});\n\t\t\trenderFrame();\n\t\t}, [renderFrame]);\n\n\t\tuseEffect(() => {\n\t\t\tconst current = strokeStyleRef.current;\n\t\t\tif (toolId === \"marker\") {\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\t...current,\n\t\t\t\t\t...MARKER_TOOL_STYLE,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t/* Leaving marker resets opacity (draw items would inherit 0.5 otherwise);\n\t\t\t strokeDash and textFontSize survive the reset so the user keeps their\n\t\t\t choices when switching back. */\n\t\t\tif (isDefaultMarkerToolStyle(current)) {\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\tstroke: DEFAULT_STROKE_STYLE.stroke,\n\t\t\t\t\tstrokeWidth: toolId === \"draw\" ? 10 : DEFAULT_STROKE_STYLE.strokeWidth,\n\t\t\t\t\tstrokeDash: current.strokeDash,\n\t\t\t\t\ttextFontSize: current.textFontSize,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentStrokeStyle({\n\t\t\t\tstroke: current.stroke,\n\t\t\t\tstrokeWidth: toolId === \"draw\" ? 10 : current.strokeWidth,\n\t\t\t\tstrokeDash: current.strokeDash,\n\t\t\t\ttextFontSize: current.textFontSize,\n\t\t\t});\n\t\t}, [setCurrentStrokeStyle, toolId]);\n\n\t\tuseEffect(() => {\n\t\t\tconst primaryId = effectiveSelectedIds[0];\n\t\t\tif (primaryId == null) return;\n\t\t\tconst it = items.find((i) => i.id === primaryId);\n\t\t\tif (!it || it.locked) return;\n\t\t\tif (it.toolKind === \"image\") return;\n\t\t\tpatchCurrentStrokeStyle({\n\t\t\t\tstroke: it.stroke ?? DEFAULT_STROKE_STYLE.stroke,\n\t\t\t\tstrokeWidth: it.strokeWidth ?? DEFAULT_STROKE_STYLE.strokeWidth,\n\t\t\t\tstrokeOpacity: it.strokeOpacity,\n\t\t\t\tstrokeDash: it.strokeDash,\n\t\t\t\t...(it.toolKind === \"text\" && it.textFontSize != null\n\t\t\t\t\t? { textFontSize: it.textFontSize }\n\t\t\t\t\t: {}),\n\t\t\t});\n\t\t}, [effectiveSelectedIds, items, patchCurrentStrokeStyle]);\n\n\t\tconst handleSelectionStyleChange = useCallback(\n\t\t\t(patch: {\n\t\t\t\tstroke: string;\n\t\t\t\tstrokeWidth: number;\n\t\t\t\tstrokeOpacity?: number;\n\t\t\t\tstrokeDash?: \"solid\" | \"dashed\";\n\t\t\t\ttextFontSize?: number;\n\t\t\t}) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change) return;\n\t\t\t\tconst ids = effectiveSelectedIdsRef.current;\n\t\t\t\tif (ids.length === 0) return;\n\t\t\t\tlet nextList: VectorSceneItem[] = [...itemsRef.current];\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tconst it = nextList.find((i) => i.id === id);\n\t\t\t\t\tif (!it || it.locked) continue;\n\t\t\t\t\tconst next = applyStrokeToItem(it, patch);\n\t\t\t\t\tconst out =\n\t\t\t\t\t\teditingTextIdRef.current === id && next.toolKind === \"text\"\n\t\t\t\t\t\t\t? applyTextDraftWhileEditing(next, draftTextRef.current)\n\t\t\t\t\t\t\t: next;\n\t\t\t\t\tnextList = replaceItem(nextList, id, out);\n\t\t\t\t}\n\t\t\t\tchange(nextList);\n\t\t\t\tpatchCurrentStrokeStyle(patch);\n\t\t\t},\n\t\t\t[patchCurrentStrokeStyle],\n\t\t);\n\n\t\tconst handleActiveToolStyleChange = useCallback(\n\t\t\t(patch: {\n\t\t\t\tstroke: string;\n\t\t\t\tstrokeWidth: number;\n\t\t\t\tstrokeOpacity?: number;\n\t\t\t\tstrokeDash?: \"solid\" | \"dashed\";\n\t\t\t\ttextFontSize?: number;\n\t\t\t}) => {\n\t\t\t\tpatchCurrentStrokeStyle(patch);\n\t\t\t},\n\t\t\t[patchCurrentStrokeStyle],\n\t\t);\n\n\t\tconst commitTextEdit = useCallback(() => {\n\t\t\tconst id = editingTextIdRef.current;\n\t\t\tif (!id) return;\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tif (!change) return;\n\t\t\tconst text = draftTextRef.current;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst it = list.find((i) => i.id === id);\n\t\t\tif (!it || it.toolKind !== \"text\") {\n\t\t\t\tsetEditingTextId(null);\n\t\t\t\teditingTextSnapshotRef.current = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst next = rebuildItemSvg({ ...it, text });\n\t\t\tchange(replaceItem(list, id, next));\n\t\t\teditingTextSnapshotRef.current = null;\n\t\t\tsetEditingTextId(null);\n\t\t}, []);\n\n\t\tconst handleDraftTextChange = useCallback((v: string) => {\n\t\t\tsetDraftText(v);\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tconst editId = editingTextIdRef.current;\n\t\t\tif (!change || !editId) return;\n\t\t\tconst list = itemsRef.current;\n\t\t\tconst it = list.find((i) => i.id === editId);\n\t\t\tif (!it || it.toolKind !== \"text\") return;\n\t\t\tchange(replaceItem(list, editId, applyTextDraftWhileEditing(it, v)));\n\t\t}, []);\n\n\t\t/** End inline text edit when switching to a tool that places on the canvas (draw, shapes…). */\n\t\tuseEffect(() => {\n\t\t\tif (!editingTextId) return;\n\t\t\tif (toolId === \"select\" || toolId === \"text\") return;\n\t\t\tcommitTextEdit();\n\t\t}, [toolId, editingTextId, commitTextEdit]);\n\n\t\tconst cancelTextEdit = useCallback(() => {\n\t\t\tconst change = onItemsChangeRef.current;\n\t\t\tconst id = editingTextIdRef.current;\n\t\t\tconst snap = editingTextSnapshotRef.current;\n\t\t\tif (change && id && snap) {\n\t\t\t\tchange(replaceItem(itemsRef.current, id, snap));\n\t\t\t}\n\t\t\teditingTextSnapshotRef.current = null;\n\t\t\tsetEditingTextId(null);\n\t\t}, []);\n\n\t\tconst placeImageFilesAtWorld = useCallback(\n\t\t\tasync (\n\t\t\t\tfiles: File[],\n\t\t\t\tworldX: number,\n\t\t\t\tworldY: number,\n\t\t\t\toptions?: { stackBelowExistingItems?: boolean },\n\t\t\t) => {\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change || files.length === 0) return;\n\t\t\t\tconst store = imageStoreRef.current;\n\t\t\t\tif (!store) return;\n\t\t\t\tconst stackBelowExistingItems = options?.stackBelowExistingItems ?? true;\n\t\t\t\ttry {\n\t\t\t\t\tconst pdfFiles = files.filter((file) => file.type === \"application/pdf\");\n\t\t\t\t\tif (pdfFiles.length > 0) {\n\t\t\t\t\t\tconst gapWorld = 16;\n\t\t\t\t\t\tconst estW = 1241;\n\t\t\t\t\t\tconst estH = 1754;\n\t\t\t\t\t\tconst estPages = 10;\n\t\t\t\t\t\tconst skels: {\n\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\tx: number;\n\t\t\t\t\t\t\ty: number;\n\t\t\t\t\t\t\twidth: number;\n\t\t\t\t\t\t\theight: number;\n\t\t\t\t\t\t}[] = [];\n\t\t\t\t\t\tfor (const [fileIndex] of pdfFiles.entries()) {\n\t\t\t\t\t\t\tfor (let pageIndex = 0; pageIndex < estPages; pageIndex++) {\n\t\t\t\t\t\t\t\tconst id = `skeleton-${skeletonSeqRef.current++}`;\n\t\t\t\t\t\t\t\tconst offsetIndex = fileIndex * estPages + pageIndex;\n\t\t\t\t\t\t\t\tskels.push({\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tx: worldX - estW / 2,\n\t\t\t\t\t\t\t\t\ty: worldY - estH / 2 + offsetIndex * (estH + gapWorld),\n\t\t\t\t\t\t\t\t\twidth: estW,\n\t\t\t\t\t\t\t\t\theight: estH,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetLoadingSkeletons(skels);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = await ingestAssetFilesToSceneItems({\n\t\t\t\t\t\tfiles,\n\t\t\t\t\t\texistingItems: stackBelowExistingItems ? itemsRef.current : [],\n\t\t\t\t\t\tworldCenter: {\n\t\t\t\t\t\t\tx: worldX,\n\t\t\t\t\t\t\ty: worldY,\n\t\t\t\t\t\t},\n\t\t\t\t\t\timageStore: store,\n\t\t\t\t\t\tassetStore: assetStoreRef.current ?? undefined,\n\t\t\t\t\t\tonItemsReady: (nextItems) => {\n\t\t\t\t\t\t\tif (nextItems.length === 0) return;\n\t\t\t\t\t\t\tsetLoadingSkeletons([]);\n\t\t\t\t\t\t\tchange([...itemsRef.current, ...nextItems]);\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(nextItems.map((item) => item.id));\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tif (result.errors.length > 0) {\n\t\t\t\t\t\tfor (const error of result.errors) {\n\t\t\t\t\t\t\tconsole.error(\"Failed to add file:\", error.error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (result.items.length === 0) return;\n\t\t\t\t} finally {\n\t\t\t\t\tsetLoadingSkeletons([]);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[],\n\t\t);\n\t\tconst handleImageFileChange = useCallback(\n\t\t\tasync (e: ChangeEvent<HTMLInputElement>) => {\n\t\t\t\tconst files = e.target.files ? Array.from(e.target.files) : [];\n\t\t\t\te.target.value = \"\";\n\t\t\t\tconst pending = pendingImagePlacementRef.current;\n\t\t\t\tpendingImagePlacementRef.current = null;\n\t\t\t\tif (files.length === 0 || !pending) return;\n\t\t\t\tawait placeImageFilesAtWorld(files, pending.worldX, pending.worldY);\n\t\t\t},\n\t\t\t[placeImageFilesAtWorld],\n\t\t);\n\t\tconst openImagePickerAtViewportCenter = useCallback(() => {\n\t\t\tconst el = sceneContainerRef.current;\n\t\t\tconst cam = cameraRef.current;\n\t\t\tconst input = imageInputRef.current;\n\t\t\tif (!el || !cam || !input) return;\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tconst center = cam.screenToWorld(rect.width / 2, rect.height / 2);\n\t\t\tpendingImagePlacementRef.current = {\n\t\t\t\tworldX: center.worldX,\n\t\t\t\tworldY: center.worldY,\n\t\t\t};\n\t\t\tif (typeof input.showPicker === \"function\") {\n\t\t\t\tinput.showPicker();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinput.click();\n\t\t}, []);\n\t\tuseEffect(() => {\n\t\t\tconst prevToolId = lastToolIdRef.current;\n\t\t\tif (\n\t\t\t\ttoolId !== \"image\" ||\n\t\t\t\tprevToolId === \"image\" ||\n\t\t\t\t!interactive ||\n\t\t\t\tonItemsChange == null\n\t\t\t) {\n\t\t\t\tlastToolIdRef.current = toolId;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\topenImagePickerAtViewportCenter();\n\t\t\trequestAutoResetTool(\"image\");\n\t\t\tlastToolIdRef.current = toolId;\n\t\t}, [\n\t\t\tinteractive,\n\t\t\tonItemsChange,\n\t\t\topenImagePickerAtViewportCenter,\n\t\t\trequestAutoResetTool,\n\t\t\ttoolId,\n\t\t]);\n\n\t\tconst handleWrapperDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\n\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\tif (!Array.from(e.dataTransfer.types).includes(\"Files\")) return;\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"copy\";\n\t\t}, []);\n\n\t\tconst handleWrapperDrop = useCallback(\n\t\t\tasync (e: DragEvent<HTMLDivElement>) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tconst fl = e.dataTransfer.files;\n\t\t\t\tif (!fl?.length) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst files = Array.from(fl).filter(\n\t\t\t\t\t(f) => f.type.startsWith(\"image/\") || f.type === \"application/pdf\",\n\t\t\t\t);\n\t\t\t\tif (files.length === 0) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tawait placeImageFilesAtWorld(files, worldX, worldY, {\n\t\t\t\t\tstackBelowExistingItems: false,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[screenToWorld, placeImageFilesAtWorld],\n\t\t);\n\n\t\tconst handleWrapperPaste = useCallback(\n\t\t\tasync (e: ClipboardEvent<HTMLDivElement>) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tconst t = e.target;\n\t\t\t\tif (\n\t\t\t\t\tt instanceof HTMLTextAreaElement ||\n\t\t\t\t\tt instanceof HTMLInputElement ||\n\t\t\t\t\t(t instanceof HTMLElement && t.isContentEditable)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (editingTextIdRef.current) return;\n\t\t\t\tconst dt = e.clipboardData;\n\t\t\t\tif (!dt) return;\n\t\t\t\tconst files: File[] = [];\n\t\t\t\tfor (const file of Array.from(dt.files)) {\n\t\t\t\t\tif (file.type.startsWith(\"image/\")) files.push(file);\n\t\t\t\t}\n\t\t\t\tif (files.length === 0) {\n\t\t\t\t\tfor (const item of Array.from(dt.items)) {\n\t\t\t\t\t\tif (item.kind === \"file\" && item.type.startsWith(\"image/\")) {\n\t\t\t\t\t\t\tconst file = item.getAsFile();\n\t\t\t\t\t\t\tif (file) files.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (files.length === 0) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst last = lastPointerScreenRef.current;\n\t\t\t\tlet target: { worldX: number; worldY: number };\n\t\t\t\tif (last) {\n\t\t\t\t\ttarget = screenToWorld(last.x, last.y);\n\t\t\t\t} else {\n\t\t\t\t\tconst el = sceneContainerRef.current;\n\t\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\t\tif (el && cam) {\n\t\t\t\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\t\t\t\ttarget = cam.screenToWorld(rect.width / 2, rect.height / 2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget = { worldX: 0, worldY: 0 };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait placeImageFilesAtWorld(files, target.worldX, target.worldY, {\n\t\t\t\t\tstackBelowExistingItems: false,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[screenToWorld, placeImageFilesAtWorld],\n\t\t);\n\n\t\tconst handleOverlayDoubleClick = useCallback(\n\t\t\t(e: MouseEvent<HTMLDivElement>) => {\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\n\t\t\t\tconst linkHit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {\n\t\t\t\t\tlineHitWorld,\n\t\t\t\t\tignoreLocked: false,\n\t\t\t\t});\n\t\t\t\tconst link = linkHit ? getLinkData(linkHit) : null;\n\t\t\t\tif (linkHit && link) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (onActivateLinkRef.current) {\n\t\t\t\t\t\tonActivateLinkRef.current({ link, item: linkHit });\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof window !== \"undefined\" &&\n\t\t\t\t\t\ttypeof window.open === \"function\"\n\t\t\t\t\t) {\n\t\t\t\t\t\twindow.open(link.href, \"_blank\", \"noopener,noreferrer\");\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (toolIdRef.current !== \"select\") return;\n\t\t\t\te.preventDefault();\n\t\t\t\tconst hit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {\n\t\t\t\t\tlineHitWorld,\n\t\t\t\t\tignoreLocked: true,\n\t\t\t\t});\n\t\t\t\tif (hit?.toolKind === \"text\") {\n\t\t\t\t\tconst draft = hit.text ?? \"\";\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tconst list = itemsRef.current;\n\t\t\t\t\tconst it = list.find((i) => i.id === hit.id);\n\t\t\t\t\teditingTextSnapshotRef.current =\n\t\t\t\t\t\tit != null\n\t\t\t\t\t\t\t? { ...it, bounds: { ...it.bounds } }\n\t\t\t\t\t\t\t: { ...hit, bounds: { ...hit.bounds } };\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current([hit.id]);\n\t\t\t\t\tsetDraftText(draft);\n\t\t\t\t\tsetEditingTextId(hit.id);\n\t\t\t\t\tif (change && it && it.toolKind === \"text\") {\n\t\t\t\t\t\tchange(replaceItem(list, hit.id, applyTextDraftWhileEditing(it, draft)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[screenToWorld],\n\t\t);\n\n\t\tconst handleOverlayPointerDown = useCallback(\n\t\t\t(e: ReactPointerEvent<HTMLDivElement>) => {\n\t\t\t\tlet currentDragState = dragStateRef.current;\n\t\t\t\tlet activePointerId = activeInteractionPointerIdRef.current;\n\t\t\t\tif (e.pointerType === \"pen\" || e.pointerType === \"touch\") {\n\t\t\t\t\tdebugApplePencilPointer(\"pointerdown\", {\n\t\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tpressure: e.pointerType === \"pen\" ? e.pressure : undefined,\n\t\t\t\t\t\tactivePointerId,\n\t\t\t\t\t\tdragKind: currentDragState.kind,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\te.pointerType === \"pen\" &&\n\t\t\t\t\tcurrentDragState.kind === \"stroke\" &&\n\t\t\t\t\tcurrentDragState.pointerType === \"pen\"\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"pen-reentry\", {\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tpreviousPointerId: activePointerId,\n\t\t\t\t\t\tpreviousPoints: currentDragState.points.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(currentDragState);\n\t\t\t\t\tcurrentDragState = dragStateRef.current;\n\t\t\t\t\tactivePointerId = activeInteractionPointerIdRef.current;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tcurrentDragState.kind !== \"idle\" &&\n\t\t\t\t\tactivePointerId != null &&\n\t\t\t\t\tactivePointerId !== e.pointerId\n\t\t\t\t) {\n\t\t\t\t\tif (dragStateRef.current.kind !== \"idle\") {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (currentDragState.kind !== \"idle\" && activePointerId == null) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (e.button !== 0) return;\n\t\t\t\tif (editingTextIdRef.current) return;\n\n\t\t\t\twrapperRef.current?.focus({ preventScroll: true });\n\t\t\t\tsetContextMenu(null);\n\n\t\t\t\tconst tool = toolIdRef.current;\n\t\t\t\tif (tool === \"hand\") return;\n\t\t\t\tif (\n\t\t\t\t\tapplePencilNav &&\n\t\t\t\t\te.pointerType === \"pen\" &&\n\t\t\t\t\tnavigator.maxTouchPoints > 0 &&\n\t\t\t\t\t(tool === \"draw\" || tool === \"marker\")\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\n\t\t\t\tconst { worldX, worldY } = screenToWorld(e.clientX, e.clientY);\n\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\t\t\t\tconst handleRadiusWorld = 6 / cam.zoom;\n\n\t\t\t\tconst canonical = itemsRef.current;\n\t\t\t\tconst resolved = resolvedItemsRef.current;\n\n\t\t\t\tconst bakedSnapshot = (id: string): VectorSceneItem | undefined => {\n\t\t\t\t\tconst raw = canonical.find((i) => i.id === id);\n\t\t\t\t\tif (!raw) return undefined;\n\t\t\t\t\treturn raw.toolKind === \"arrow\" && raw.arrowBind\n\t\t\t\t\t\t? bakeArrowItemToAbsolute(raw, canonical)\n\t\t\t\t\t\t: raw;\n\t\t\t\t};\n\n\t\t\t\tif (tool === \"eraser\") {\n\t\t\t\t\tdragStateRef.current = { kind: \"erase\" };\n\t\t\t\t\teraserPreviewIdsRef.current = new Set();\n\t\t\t\t\tsetEraserPreviewIds([]);\n\t\t\t\t\tsetEraserTrail([{ x: worldX, y: worldY, t: Date.now() }]);\n\t\t\t\t\tsetEraserActive(true);\n\t\t\t\t\tconst toErase = collectEraserTargetsAtWorldPoint(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tworldX,\n\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlineHitWorld,\n\t\t\t\t\t\t\tignoreLocked: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (toErase.length > 0) {\n\t\t\t\t\t\tfor (const id of toErase) {\n\t\t\t\t\t\t\teraserPreviewIdsRef.current.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetEraserPreviewIds(Array.from(eraserPreviewIdsRef.current));\n\t\t\t\t\t}\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current([]);\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tool === \"select\") {\n\t\t\t\t\tconst cur = effectiveSelectedIdsRef.current;\n\t\t\t\t\tconst primaryId = cur.length === 1 ? cur[0] : undefined;\n\t\t\t\t\tconst selected =\n\t\t\t\t\t\tprimaryId != null ? resolved.find((i) => i.id === primaryId) : undefined;\n\t\t\t\t\tconst showHandles =\n\t\t\t\t\t\tselected &&\n\t\t\t\t\t\tcur.length === 1 &&\n\t\t\t\t\t\t!selected.locked &&\n\t\t\t\t\t\tsupportsResizeHandles(selected) &&\n\t\t\t\t\t\ttool === \"select\";\n\n\t\t\t\t\tif (showHandles && selected) {\n\t\t\t\t\t\tconst rb = normalizeRect(selected.bounds);\n\t\t\t\t\t\tconst rot = selected.rotation ?? 0;\n\t\t\t\t\t\tconst rotateOffsetWorld = 24 / cam.zoom;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\thitTestRotateHandle(\n\t\t\t\t\t\t\t\trb,\n\t\t\t\t\t\t\t\trot,\n\t\t\t\t\t\t\t\tworldX,\n\t\t\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t\t\thandleRadiusWorld,\n\t\t\t\t\t\t\t\trotateOffsetWorld,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst snapSpin = bakedSnapshot(selected.id);\n\t\t\t\t\t\t\tif (!snapSpin) return;\n\t\t\t\t\t\t\tconst pivot = itemPivotWorld(selected);\n\t\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\t\tkind: \"rotate\",\n\t\t\t\t\t\t\t\tid: selected.id,\n\t\t\t\t\t\t\t\tsnapshot: snapSpin,\n\t\t\t\t\t\t\t\tpivotWorld: pivot,\n\t\t\t\t\t\t\t\tstartPointerAngleRad: Math.atan2(worldY - pivot.y, worldX - pivot.x),\n\t\t\t\t\t\t\t\tstartRotation: selected.rotation ?? 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst hb = hitTestResizeHandle(\n\t\t\t\t\t\t\trb,\n\t\t\t\t\t\t\tworldX,\n\t\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t\thandleRadiusWorld,\n\t\t\t\t\t\t\trot,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (hb) {\n\t\t\t\t\t\t\tconst snapRs = bakedSnapshot(selected.id);\n\t\t\t\t\t\t\tif (!snapRs) return;\n\t\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\t\tkind: \"resize\",\n\t\t\t\t\t\t\t\tid: selected.id,\n\t\t\t\t\t\t\t\thandle: hb,\n\t\t\t\t\t\t\t\tsnapshot: snapRs,\n\t\t\t\t\t\t\t\tstart: {\n\t\t\t\t\t\t\t\t\tbounds: snapRs.bounds,\n\t\t\t\t\t\t\t\t\tline: snapRs.line,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hit = hitTestWorldPoint(resolved, worldX, worldY, {\n\t\t\t\t\t\tlineHitWorld,\n\t\t\t\t\t\tignoreLocked: true,\n\t\t\t\t\t});\n\t\t\t\t\tif (hit) {\n\t\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t\tconst next = cur.includes(hit.id)\n\t\t\t\t\t\t\t\t? cur.filter((id) => id !== hit.id)\n\t\t\t\t\t\t\t\t: [...cur, hit.id];\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(next);\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet idsToMove: string[];\n\t\t\t\t\t\tif (!cur.includes(hit.id)) {\n\t\t\t\t\t\t\tidsToMove = [hit.id];\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(idsToMove);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tidsToMove = [...cur];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst snapshots: Record<string, VectorSceneItem> = {};\n\t\t\t\t\t\tfor (const id of idsToMove) {\n\t\t\t\t\t\t\tconst snap = bakedSnapshot(id);\n\t\t\t\t\t\t\tif (snap) {\n\t\t\t\t\t\t\t\tsnapshots[id] = snap;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\tkind: \"move\",\n\t\t\t\t\t\t\tids: idsToMove,\n\t\t\t\t\t\t\tsnapshots,\n\t\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!e.shiftKey && cur.length > 0) {\n\t\t\t\t\t\tconst selectedUnlockedItems = cur\n\t\t\t\t\t\t\t.map((id) => resolved.find((it) => it.id === id))\n\t\t\t\t\t\t\t.filter((it): it is VectorSceneItem => it != null && !it.locked);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tselectedUnlockedItems.some((it) =>\n\t\t\t\t\t\t\t\tpointInSelectedItemBounds(it, worldX, worldY),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst snapshots: Record<string, VectorSceneItem> = {};\n\t\t\t\t\t\t\tfor (const id of cur) {\n\t\t\t\t\t\t\t\tconst snap = bakedSnapshot(id);\n\t\t\t\t\t\t\t\tif (snap && !snap.locked) {\n\t\t\t\t\t\t\t\t\tsnapshots[id] = snap;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (Object.keys(snapshots).length > 0) {\n\t\t\t\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\t\t\t\tkind: \"move\",\n\t\t\t\t\t\t\t\t\tids: Object.keys(snapshots),\n\t\t\t\t\t\t\t\t\tsnapshots,\n\t\t\t\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\tkind: \"marquee\",\n\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\tstartScreen: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t\tshiftKey: e.shiftKey,\n\t\t\t\t\t\tselectionBefore: [...cur],\n\t\t\t\t\t};\n\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\tkind: \"marquee\",\n\t\t\t\t\t\trect: rectFromCorners(\n\t\t\t\t\t\t\t{ x: worldX, y: worldY },\n\t\t\t\t\t\t\t{ x: worldX, y: worldY },\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tool === \"draw\" || tool === \"marker\" || tool === \"laser\") {\n\t\t\t\t\tconst startPoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\te.clientX,\n\t\t\t\t\t\te.clientY,\n\t\t\t\t\t\te.pointerType === \"pen\" ? e.pressure : undefined,\n\t\t\t\t\t);\n\t\t\t\t\tconst straightLine =\n\t\t\t\t\t\ttool === \"draw\"\n\t\t\t\t\t\t\t? createStraightStrokeState(startPoint, e.clientX, e.clientY)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst directPenStroke =\n\t\t\t\t\t\te.pointerType === \"pen\" && (tool === \"draw\" || tool === \"marker\");\n\t\t\t\t\tlet itemId: string | undefined;\n\t\t\t\t\tif (directPenStroke) {\n\t\t\t\t\t\titemId = createShapeId();\n\t\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\t\titemId,\n\t\t\t\t\t\t\t[startPoint],\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst nextDragState: StrokeDragState = {\n\t\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\t\t...(itemId ? { itemId } : {}),\n\t\t\t\t\t\t...(straightLine ? { straightLine } : {}),\n\t\t\t\t\t};\n\t\t\t\t\tdragStateRef.current = nextDragState;\n\t\t\t\t\tstartOrRestartStraightStrokeHoldTimer(nextDragState);\n\t\t\t\t\tif (tool === \"laser\") {\n\t\t\t\t\t\tsetLaserTrail([{ x: worldX, y: worldY, t: Date.now() }]);\n\t\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\t} else if (directPenStroke) {\n\t\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\t\temitRemoteStrokePreview(tool, [startPoint]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tool === \"text\" || tool === \"image\") {\n\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\tkind: \"tap\",\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\tstartScreen: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t};\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst cp = customPlacementRef.current;\n\t\t\t\tif (\n\t\t\t\t\ttool === \"rect\" ||\n\t\t\t\t\ttool === \"ellipse\" ||\n\t\t\t\t\ttool === \"architectural-cloud\" ||\n\t\t\t\t\ttool === \"line\" ||\n\t\t\t\t\ttool === \"arrow\" ||\n\t\t\t\t\t(cp && tool === cp.toolId)\n\t\t\t\t) {\n\t\t\t\t\tdragStateRef.current = {\n\t\t\t\t\t\tkind: \"place\",\n\t\t\t\t\t\ttool,\n\t\t\t\t\t\tstartWorld: { x: worldX, y: worldY },\n\t\t\t\t\t\tstartScreen: { x: e.clientX, y: e.clientY },\n\t\t\t\t\t};\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tcaptureInteractionPointer(e.currentTarget, e.pointerId);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tapplePencilNav,\n\t\t\t\tcaptureInteractionPointer,\n\t\t\t\temitRemoteStrokePreview,\n\t\t\t\tfinalizeStrokeDragState,\n\t\t\t\trenderSceneWithLivePenStroke,\n\t\t\t\tscreenToWorld,\n\t\t\t\tstartOrRestartStraightStrokeHoldTimer,\n\t\t\t],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (!interactive) return;\n\t\t\tconst el = interactionRootRef.current;\n\t\t\tif (!el) return;\n\n\t\t\tconst onNativePenPointerDown = (e: PointerEvent) => {\n\t\t\t\tif (e.pointerType !== \"pen\") return;\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (e.button !== 0) return;\n\t\t\t\tif (editingTextIdRef.current) return;\n\n\t\t\t\tconst tool = toolIdRef.current;\n\t\t\t\tif (tool !== \"draw\" && tool !== \"marker\") return;\n\t\t\t\tif (applePencilNav && navigator.maxTouchPoints > 0) return;\n\n\t\t\t\tconst currentDragState = dragStateRef.current;\n\t\t\t\tif (\n\t\t\t\t\tcurrentDragState.kind === \"stroke\" &&\n\t\t\t\t\tcurrentDragState.pointerType === \"pen\"\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"native-pen-reentry\", {\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tpreviousPointerId: activeInteractionPointerIdRef.current,\n\t\t\t\t\t\tpreviousPoints: currentDragState.points.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(currentDragState);\n\t\t\t\t} else if (currentDragState.kind !== \"idle\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twrapperRef.current?.focus({ preventScroll: true });\n\t\t\t\tsetContextMenu(null);\n\t\t\t\tconst startPoint = pointerSampleToWorldPoint(\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t\te.clientX,\n\t\t\t\t\te.clientY,\n\t\t\t\t\te.pressure,\n\t\t\t\t);\n\t\t\t\tconst straightLine =\n\t\t\t\t\ttool === \"draw\"\n\t\t\t\t\t\t? createStraightStrokeState(startPoint, e.clientX, e.clientY)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst itemId = createShapeId();\n\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\titemId,\n\t\t\t\t\t[startPoint],\n\t\t\t\t\ttool,\n\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t);\n\t\t\t\tif (item) {\n\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t}\n\t\t\t\tconst nextDragState: StrokeDragState = {\n\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\ttool,\n\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\titemId,\n\t\t\t\t\t...(straightLine ? { straightLine } : {}),\n\t\t\t\t};\n\t\t\t\tdragStateRef.current = nextDragState;\n\t\t\t\tstartOrRestartStraightStrokeHoldTimer(nextDragState);\n\t\t\t\tactiveInteractionPointerIdRef.current = e.pointerId;\n\t\t\t\tactiveInteractionPointerTargetRef.current = null;\n\t\t\t\tsetPlacementPreview(null);\n\t\t\t\temitRemoteStrokePreview(tool, [startPoint]);\n\t\t\t\tdebugApplePencilPointer(\"native-pointerdown\", {\n\t\t\t\t\tpointerType: e.pointerType,\n\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\tpressure: e.pressure,\n\t\t\t\t\ttool,\n\t\t\t\t});\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopImmediatePropagation();\n\t\t\t};\n\n\t\t\tel.addEventListener(\"pointerdown\", onNativePenPointerDown, {\n\t\t\t\tcapture: true,\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tel.removeEventListener(\"pointerdown\", onNativePenPointerDown, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t};\n\t\t}, [\n\t\t\tapplePencilNav,\n\t\t\temitRemoteStrokePreview,\n\t\t\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\n\t\t\tstartOrRestartStraightStrokeHoldTimer,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!interactive) return;\n\t\t\tconst el = interactionRootRef.current;\n\t\t\tif (!el) return;\n\n\t\t\tconst findChangedTouch = (touches: TouchList): Touch | null => {\n\t\t\t\tconst activeTouchId = activeInteractionTouchIdRef.current;\n\t\t\t\tif (activeTouchId == null) return null;\n\t\t\t\tfor (let i = 0; i < touches.length; i += 1) {\n\t\t\t\t\tconst touch = touches.item(i);\n\t\t\t\t\tif (touch?.identifier === activeTouchId) return touch;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\tconst findStartTouch = (touches: TouchList): Touch | null => {\n\t\t\t\tfor (let i = 0; i < touches.length; i += 1) {\n\t\t\t\t\tconst touch = touches.item(i);\n\t\t\t\t\tif (!touch) continue;\n\t\t\t\t\tif (touchKind(touch) === \"direct\") continue;\n\t\t\t\t\tif (!applePencilNav || isLikelyStylusTouch(touch)) return touch;\n\t\t\t\t\tif (penDetectedRef.current && touchPressure(touch) != null) return touch;\n\t\t\t\t\tif (\n\t\t\t\t\t\tpenDetectedRef.current &&\n\t\t\t\t\t\tperformance.now() - lastPenPointerDownAtRef.current < 750\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn touch;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\tconst stopTouchEvent = (ev: TouchEvent) => {\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopImmediatePropagation();\n\t\t\t};\n\n\t\t\tconst onTouchStart = (ev: TouchEvent) => {\n\t\t\t\tif (!interactiveRef.current || !onItemsChangeRef.current) return;\n\t\t\t\tif (editingTextIdRef.current) return;\n\t\t\t\tconst tool = toolIdRef.current;\n\t\t\t\tif (tool !== \"draw\" && tool !== \"marker\") return;\n\n\t\t\t\tconst touch = findStartTouch(ev.changedTouches);\n\t\t\t\tif (!touch) return;\n\n\t\t\t\tconst currentDragState = dragStateRef.current;\n\t\t\t\tif (\n\t\t\t\t\tcurrentDragState.kind === \"stroke\" &&\n\t\t\t\t\tcurrentDragState.pointerType === \"pen\"\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"touch-pen-reentry\", {\n\t\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\t\tpreviousPoints: currentDragState.points.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(currentDragState);\n\t\t\t\t} else if (currentDragState.kind !== \"idle\") {\n\t\t\t\t\tstopTouchEvent(ev);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twrapperRef.current?.focus({ preventScroll: true });\n\t\t\t\tsetContextMenu(null);\n\t\t\t\tpenDetectedRef.current = true;\n\n\t\t\t\tconst startPoint = pointerSampleToWorldPoint(\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t\ttouch.clientX,\n\t\t\t\t\ttouch.clientY,\n\t\t\t\t\ttouchPressure(touch),\n\t\t\t\t);\n\t\t\t\tconst straightLine =\n\t\t\t\t\ttool === \"draw\"\n\t\t\t\t\t\t? createStraightStrokeState(startPoint, touch.clientX, touch.clientY)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst itemId = createShapeId();\n\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\titemId,\n\t\t\t\t\t[startPoint],\n\t\t\t\t\ttool,\n\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t);\n\t\t\t\tif (item) {\n\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t}\n\t\t\t\tconst nextDragState: StrokeDragState = {\n\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\ttool,\n\t\t\t\t\tpoints: [startPoint],\n\t\t\t\t\tpointerType: \"pen\",\n\t\t\t\t\titemId,\n\t\t\t\t\t...(straightLine ? { straightLine } : {}),\n\t\t\t\t};\n\t\t\t\tdragStateRef.current = nextDragState;\n\t\t\t\tstartOrRestartStraightStrokeHoldTimer(nextDragState);\n\t\t\t\tactiveInteractionPointerIdRef.current = null;\n\t\t\t\tactiveInteractionPointerTargetRef.current = null;\n\t\t\t\tactiveInteractionTouchIdRef.current = touch.identifier;\n\t\t\t\tsetPlacementPreview(null);\n\t\t\t\temitRemoteStrokePreview(tool, [startPoint]);\n\t\t\t\tdebugApplePencilPointer(\"touchstart-stroke\", {\n\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\ttouchType: touchKind(touch),\n\t\t\t\t\tforce: touchPressure(touch),\n\t\t\t\t\ttool,\n\t\t\t\t});\n\t\t\t\tstopTouchEvent(ev);\n\t\t\t};\n\n\t\t\tconst onTouchMove = (ev: TouchEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tif (st.kind !== \"stroke\") return;\n\t\t\t\tconst touch = findChangedTouch(ev.changedTouches);\n\t\t\t\tif (!touch) return;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) return;\n\n\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t\ttouch.clientX,\n\t\t\t\t\ttouch.clientY,\n\t\t\t\t\ttouchPressure(touch),\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tupdateStraightStrokeForMove(st, touch.clientX, touch.clientY, endpoint)\n\t\t\t\t) {\n\t\t\t\t\tdebugApplePencilPointer(\"touchmove-stroke\", {\n\t\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\t\tpoints: st.points.length,\n\t\t\t\t\t\tforce: touchPressure(touch),\n\t\t\t\t\t});\n\t\t\t\t\tstopTouchEvent(ev);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst interpolated = appendTouchToStrokePoints(\n\t\t\t\t\tst.points,\n\t\t\t\t\ttouch,\n\t\t\t\t\tcam.zoom,\n\t\t\t\t\tscreenToWorld,\n\t\t\t\t);\n\t\t\t\tst.points = interpolated;\n\t\t\t\tif (st.itemId && st.tool !== \"laser\") {\n\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\tst.itemId,\n\t\t\t\t\t\tinterpolated,\n\t\t\t\t\t\tst.tool,\n\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t);\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t}\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\temitRemoteStrokePreview(st.tool, interpolated);\n\t\t\t\t}\n\t\t\t\tdebugApplePencilPointer(\"touchmove-stroke\", {\n\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\tpoints: interpolated.length,\n\t\t\t\t\tforce: touchPressure(touch),\n\t\t\t\t});\n\t\t\t\tstopTouchEvent(ev);\n\t\t\t};\n\n\t\t\tconst onTouchEnd = (ev: TouchEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tif (st.kind !== \"stroke\") return;\n\t\t\t\tconst touch = findChangedTouch(ev.changedTouches);\n\t\t\t\tif (!touch) return;\n\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (cam) {\n\t\t\t\t\tif (st.straightLine?.active) {\n\t\t\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t\ttouch.clientX,\n\t\t\t\t\t\t\ttouch.clientY,\n\t\t\t\t\t\t\ttouchPressure(touch),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetStraightStrokeEndpoint(st, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst completedPoints = appendTouchToStrokePoints(\n\t\t\t\t\t\t\tst.points,\n\t\t\t\t\t\t\ttouch,\n\t\t\t\t\t\t\tcam.zoom,\n\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tst.points = completedPoints;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdebugApplePencilPointer(\"touchend-stroke\", {\n\t\t\t\t\ttouchId: touch.identifier,\n\t\t\t\t\tpoints: st.points.length,\n\t\t\t\t});\n\t\t\t\tfinalizeStrokeDragState(st);\n\t\t\t\tstopTouchEvent(ev);\n\t\t\t};\n\n\t\t\tel.addEventListener(\"touchstart\", onTouchStart, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchmove\", onTouchMove, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchend\", onTouchEnd, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\tdocument.addEventListener(\"touchcancel\", onTouchEnd, {\n\t\t\t\tcapture: true,\n\t\t\t\tpassive: false,\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tel.removeEventListener(\"touchstart\", onTouchStart, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchmove\", onTouchMove, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchend\", onTouchEnd, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t\tdocument.removeEventListener(\"touchcancel\", onTouchEnd, {\n\t\t\t\t\tcapture: true,\n\t\t\t\t});\n\t\t\t};\n\t\t}, [\n\t\t\tapplePencilNav,\n\t\t\temitRemoteStrokePreview,\n\t\t\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\n\t\t\tsetStraightStrokeEndpoint,\n\t\t\tstartOrRestartStraightStrokeHoldTimer,\n\t\t\tupdateStraightStrokeForMove,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!interactive) return;\n\n\t\t\tconst onMove = (ev: PointerEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam || st.kind === \"idle\") return;\n\t\t\t\tif (activeInteractionPointerIdRef.current !== ev.pointerId) return;\n\n\t\t\t\t/* Tap placement (draw/text/image): validate on pointerup only — early move\n\t\t\t\t * cancellation caused false negatives from tiny pointer jitter on trackpads. */\n\t\t\t\tif (st.kind === \"tap\") return;\n\n\t\t\t\tif (st.kind === \"marquee\") {\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst raw = rectFromCorners(st.startWorld, { x: worldX, y: worldY });\n\t\t\t\t\tsetPlacementPreview({ kind: \"marquee\", rect: raw });\n\t\t\t\t\tconst nextCand = collectItemIdsInRect(\n\t\t\t\t\t\tresolvedItemsRef.current,\n\t\t\t\t\t\tnormalizeRect(raw),\n\t\t\t\t\t);\n\t\t\t\t\tif (!shallowEqualStringArray(nextCand, marqueeCandidateIdsRef.current)) {\n\t\t\t\t\t\tmarqueeCandidateIdsRef.current = nextCand;\n\t\t\t\t\t\tsetMarqueeCandidateIds(nextCand);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"stroke\") {\n\t\t\t\t\tif (ev.pointerType === \"pen\" || ev.pointerType === \"touch\") {\n\t\t\t\t\t\tdebugApplePencilPointer(\"pointermove\", {\n\t\t\t\t\t\t\tpointerType: ev.pointerType,\n\t\t\t\t\t\t\tpointerId: ev.pointerId,\n\t\t\t\t\t\t\tpointsBefore: st.points.length,\n\t\t\t\t\t\t\tpressure: ev.pointerType === \"pen\" ? ev.pressure : undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\tev.clientX,\n\t\t\t\t\t\tev.clientY,\n\t\t\t\t\t\tev.pointerType === \"pen\" ? ev.pressure : undefined,\n\t\t\t\t\t);\n\t\t\t\t\tif (updateStraightStrokeForMove(st, ev.clientX, ev.clientY, endpoint)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst interpolated = appendPointerEventSamplesToStrokePoints(\n\t\t\t\t\t\tst.points,\n\t\t\t\t\t\tev,\n\t\t\t\t\t\tcam.zoom,\n\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t);\n\t\t\t\t\tst.points = interpolated;\n\t\t\t\t\tif (st.itemId && st.pointerType === \"pen\" && st.tool !== \"laser\") {\n\t\t\t\t\t\tconst item = createFreehandStrokeItem(\n\t\t\t\t\t\t\tst.itemId,\n\t\t\t\t\t\t\tinterpolated,\n\t\t\t\t\t\t\tst.tool,\n\t\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\trenderSceneWithLivePenStroke(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\t\temitRemoteStrokePreview(st.tool, interpolated);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (st.tool === \"laser\") {\n\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\tsetLaserTrail((prev) =>\n\t\t\t\t\t\t\tpruneLaserTrail([\n\t\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\t\t...interpolated\n\t\t\t\t\t\t\t\t\t.slice(Math.max(0, interpolated.length - 3))\n\t\t\t\t\t\t\t\t\t.map((p) => ({\n\t\t\t\t\t\t\t\t\t\tx: p.x,\n\t\t\t\t\t\t\t\t\t\ty: p.y,\n\t\t\t\t\t\t\t\t\t\tt: now,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"stroke\",\n\t\t\t\t\t\t\ttool: st.tool,\n\t\t\t\t\t\t\tpoints: interpolated,\n\t\t\t\t\t\t\tstyle: { ...strokeStyleRef.current },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"erase\") {\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst lineHitWorld = 10 / cam.zoom;\n\t\t\t\t\tsetEraserTrail((prev) =>\n\t\t\t\t\t\tpruneEraserTrail([...prev, { x: worldX, y: worldY, t: Date.now() }]),\n\t\t\t\t\t);\n\t\t\t\t\tconst toErase = collectEraserTargetsAtWorldPoint(\n\t\t\t\t\t\tresolvedItemsRef.current,\n\t\t\t\t\t\tworldX,\n\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlineHitWorld,\n\t\t\t\t\t\t\tignoreLocked: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (toErase.length > 0) {\n\t\t\t\t\t\tfor (const id of toErase) {\n\t\t\t\t\t\t\teraserPreviewIdsRef.current.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetEraserPreviewIds(Array.from(eraserPreviewIdsRef.current));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst list = itemsRef.current;\n\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\tif (!change) return;\n\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\n\t\t\t\tif (st.kind === \"move\") {\n\t\t\t\t\tconst dx = worldX - st.startWorld.x;\n\t\t\t\t\tconst dy = worldY - st.startWorld.y;\n\t\t\t\t\tlet nextList: VectorSceneItem[] = [...list];\n\t\t\t\t\tfor (const id of st.ids) {\n\t\t\t\t\t\tconst snap = st.snapshots[id];\n\t\t\t\t\t\tif (!snap) continue;\n\t\t\t\t\t\tconst next = moveItemByDelta(snap, dx, dy);\n\t\t\t\t\t\tnextList = replaceItem(nextList, id, next);\n\t\t\t\t\t}\n\t\t\t\t\tchange(nextList);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"rotate\") {\n\t\t\t\t\tconst p = st.pivotWorld;\n\t\t\t\t\tconst angle = Math.atan2(worldY - p.y, worldX - p.x);\n\t\t\t\t\tconst next = applyRotationFromPointer(\n\t\t\t\t\t\tst.snapshot,\n\t\t\t\t\t\tst.startRotation,\n\t\t\t\t\t\tst.startPointerAngleRad,\n\t\t\t\t\t\tangle,\n\t\t\t\t\t);\n\t\t\t\t\tchange(replaceItem(list, st.id, next));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"resize\") {\n\t\t\t\t\tconst next = resizeItemByHandle(st.snapshot, st.start, st.handle, {\n\t\t\t\t\t\tx: worldX,\n\t\t\t\t\t\ty: worldY,\n\t\t\t\t\t});\n\t\t\t\t\tchange(replaceItem(list, st.id, next));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"place\") {\n\t\t\t\t\tconst a = st.startWorld;\n\t\t\t\t\tconst b = { x: worldX, y: worldY };\n\t\t\t\t\tconst cp = customPlacementRef.current;\n\t\t\t\t\tif (st.tool === \"rect\") {\n\t\t\t\t\t\tsetPlacementPreview({ kind: \"rect\", rect: rectFromCorners(a, b) });\n\t\t\t\t\t} else if (st.tool === \"ellipse\") {\n\t\t\t\t\t\tsetPlacementPreview({ kind: \"ellipse\", rect: rectFromCorners(a, b) });\n\t\t\t\t\t} else if (st.tool === \"architectural-cloud\") {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"architectural-cloud\",\n\t\t\t\t\t\t\trect: rectFromCorners(a, b),\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (st.tool === \"line\") {\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"line\",\n\t\t\t\t\t\t\tstart: a,\n\t\t\t\t\t\t\tend: b,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (st.tool === \"arrow\") {\n\t\t\t\t\t\tconst maxDist = ARROW_BIND_SNAP_PX / cam.zoom;\n\t\t\t\t\t\tconst exclude = new Set<string>();\n\t\t\t\t\t\tconst snapA = snapArrowEndpointToShape(\n\t\t\t\t\t\t\ta.x,\n\t\t\t\t\t\t\ta.y,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst snapB = snapArrowEndpointToShape(\n\t\t\t\t\t\t\tworldX,\n\t\t\t\t\t\t\tworldY,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst startW = snapA ? snapA.world : a;\n\t\t\t\t\t\tconst endW = snapB ? snapB.world : { x: worldX, y: worldY };\n\t\t\t\t\t\tsetPlacementPreview({\n\t\t\t\t\t\t\tkind: \"arrow\",\n\t\t\t\t\t\t\tstart: startW,\n\t\t\t\t\t\t\tend: endW,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (cp && st.tool === cp.toolId) {\n\t\t\t\t\t\tsetPlacementPreview({ kind: \"rect\", rect: rectFromCorners(a, b) });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst onUp = (ev: PointerEvent) => {\n\t\t\t\tconst st = dragStateRef.current;\n\t\t\t\tif (ev.pointerType === \"pen\" || ev.pointerType === \"touch\") {\n\t\t\t\t\tdebugApplePencilPointer(\"pointerup\", {\n\t\t\t\t\t\tpointerType: ev.pointerType,\n\t\t\t\t\t\tpointerId: ev.pointerId,\n\t\t\t\t\t\tdragKind: st.kind,\n\t\t\t\t\t\tactivePointerId: activeInteractionPointerIdRef.current,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tst.kind !== \"idle\" &&\n\t\t\t\t\tactiveInteractionPointerIdRef.current !== ev.pointerId\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cam = cameraRef.current;\n\t\t\t\tif (!cam) {\n\t\t\t\t\tif (st.kind === \"stroke\") {\n\t\t\t\t\t\tclearStraightStrokeHoldTimer(st);\n\t\t\t\t\t\temitRemoteStrokePreviewClear();\n\t\t\t\t\t}\n\t\t\t\t\tif (st.kind === \"erase\") {\n\t\t\t\t\t\teraserPreviewIdsRef.current.clear();\n\t\t\t\t\t\tsetEraserPreviewIds([]);\n\t\t\t\t\t\tsetEraserTrail([]);\n\t\t\t\t\t\tsetEraserActive(false);\n\t\t\t\t\t}\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tmarqueeCandidateIdsRef.current = [];\n\t\t\t\t\tsetMarqueeCandidateIds([]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"move\" || st.kind === \"resize\" || st.kind === \"rotate\") {\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"marquee\") {\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tmarqueeCandidateIdsRef.current = [];\n\t\t\t\t\tsetMarqueeCandidateIds([]);\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst raw = rectFromCorners(st.startWorld, { x: worldX, y: worldY });\n\t\t\t\t\tconst br = normalizeRect(raw);\n\t\t\t\t\tconst screenDx = ev.clientX - st.startScreen.x;\n\t\t\t\t\tconst screenDy = ev.clientY - st.startScreen.y;\n\t\t\t\t\tconst tooSmall =\n\t\t\t\t\t\tMath.hypot(screenDx, screenDy) < TAP_PX ||\n\t\t\t\t\t\t(br.width < MIN_MARQUEE_WORLD && br.height < MIN_MARQUEE_WORLD);\n\t\t\t\t\tif (tooSmall) {\n\t\t\t\t\t\tif (!st.shiftKey) {\n\t\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst picked = collectItemIdsInRect(resolvedItemsRef.current, br);\n\t\t\t\t\tif (st.shiftKey) {\n\t\t\t\t\t\tconst seen = new Set(st.selectionBefore);\n\t\t\t\t\t\tconst merged = [...st.selectionBefore];\n\t\t\t\t\t\tfor (const id of picked) {\n\t\t\t\t\t\t\tif (!seen.has(id)) {\n\t\t\t\t\t\t\t\tseen.add(id);\n\t\t\t\t\t\t\t\tmerged.push(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(merged);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current(picked);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"stroke\") {\n\t\t\t\t\tconst completedPoints = (() => {\n\t\t\t\t\t\tif (st.straightLine?.active) {\n\t\t\t\t\t\t\tconst endpoint = pointerSampleToWorldPoint(\n\t\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t\t\tev.clientX,\n\t\t\t\t\t\t\t\tev.clientY,\n\t\t\t\t\t\t\t\tev.pointerType === \"pen\" ? ev.pressure : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tsetStraightStrokeEndpoint(st, endpoint);\n\t\t\t\t\t\t\treturn st.points;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst points = appendPointerEventSamplesToStrokePoints(\n\t\t\t\t\t\t\tst.points,\n\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\tcam.zoom,\n\t\t\t\t\t\t\tscreenToWorld,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tst.points = points;\n\t\t\t\t\t\treturn points;\n\t\t\t\t\t})();\n\t\t\t\t\tdebugApplePencilPointer(\"pointerup-stroke-points\", {\n\t\t\t\t\t\tpointerType: ev.pointerType,\n\t\t\t\t\t\tpointerId: ev.pointerId,\n\t\t\t\t\t\tpointsAfterUp: completedPoints.length,\n\t\t\t\t\t});\n\t\t\t\t\tfinalizeStrokeDragState(st);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"erase\") {\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tif (change && eraserPreviewIdsRef.current.size > 0) {\n\t\t\t\t\t\tconst idSet = new Set(eraserPreviewIdsRef.current);\n\t\t\t\t\t\tchange(itemsRef.current.filter((i) => !idSet.has(i.id)));\n\t\t\t\t\t}\n\t\t\t\t\teraserPreviewIdsRef.current.clear();\n\t\t\t\t\tsetEraserPreviewIds([]);\n\t\t\t\t\tsetEraserTrail([]);\n\t\t\t\t\tsetEraserActive(false);\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\trequestAutoResetTool(\"eraser\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"tap\") {\n\t\t\t\t\tconst dx = ev.clientX - st.startScreen.x;\n\t\t\t\t\tconst dy = ev.clientY - st.startScreen.y;\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tif (Math.hypot(dx, dy) > TAP_PX) return;\n\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tif (!change) return;\n\t\t\t\t\tconst id = createShapeId();\n\t\t\t\t\tconst { x: worldX, y: worldY } = st.startWorld;\n\t\t\t\t\tif (st.tool === \"text\") {\n\t\t\t\t\t\tconst fs = strokeStyleRef.current.textFontSize;\n\t\t\t\t\t\tconst baseline = textBaselineYFor(fs);\n\t\t\t\t\t\tconst lh = textLineHeightFor(fs);\n\t\t\t\t\t\tconst minH = Math.max(26, baseline + Math.max(4, lh * 0.2));\n\t\t\t\t\t\tconst newItem = createTextItem(\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tx: worldX - 4,\n\t\t\t\t\t\t\t\ty: worldY - baseline,\n\t\t\t\t\t\t\t\twidth: 160,\n\t\t\t\t\t\t\t\theight: minH,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\tstrokeStyleRef.current,\n\t\t\t\t\t\t\tfs,\n\t\t\t\t\t\t);\n\t\t\t\t\t\teditingTextSnapshotRef.current = {\n\t\t\t\t\t\t\t...newItem,\n\t\t\t\t\t\t\tbounds: { ...newItem.bounds },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst hidden = applyTextDraftWhileEditing(newItem, \"\");\n\t\t\t\t\t\tchange([...itemsRef.current, hidden]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t\tsetEditingTextId(id);\n\t\t\t\t\t\tsetDraftText(\"\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpendingImagePlacementRef.current = { worldX, worldY };\n\t\t\t\t\t\timageInputRef.current?.click();\n\t\t\t\t\t}\n\t\t\t\t\trequestAutoResetTool(st.tool);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (st.kind === \"place\") {\n\t\t\t\t\tconst { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);\n\t\t\t\t\tconst a = st.startWorld;\n\t\t\t\t\tconst b = { x: worldX, y: worldY };\n\t\t\t\t\tconst change = onItemsChangeRef.current;\n\t\t\t\t\tdragStateRef.current = { kind: \"idle\" };\n\t\t\t\t\treleaseInteractionPointer();\n\t\t\t\t\tsetPlacementPreview(null);\n\t\t\t\t\tif (!change) return;\n\n\t\t\t\t\tif (st.tool === \"arrow\") {\n\t\t\t\t\t\tconst screenDx = ev.clientX - st.startScreen.x;\n\t\t\t\t\t\tconst screenDy = ev.clientY - st.startScreen.y;\n\t\t\t\t\t\tif (Math.hypot(screenDx, screenDy) < MIN_ARROW_DRAG_PX) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst maxDist = ARROW_BIND_SNAP_PX / cam.zoom;\n\t\t\t\t\t\tconst exclude = new Set<string>();\n\t\t\t\t\t\tconst snapA = snapArrowEndpointToShape(\n\t\t\t\t\t\t\ta.x,\n\t\t\t\t\t\t\ta.y,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst snapB = snapArrowEndpointToShape(\n\t\t\t\t\t\t\tb.x,\n\t\t\t\t\t\t\tb.y,\n\t\t\t\t\t\t\titemsRef.current,\n\t\t\t\t\t\t\texclude,\n\t\t\t\t\t\t\tmaxDist,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst startW = snapA ? snapA.world : a;\n\t\t\t\t\t\tconst endW = snapB ? snapB.world : b;\n\t\t\t\t\t\tconst rawArrow = rectFromCorners(startW, endW);\n\t\t\t\t\t\tconst id = createShapeId();\n\t\t\t\t\t\tconst pen = strokeStyleRef.current;\n\t\t\t\t\t\tconst line = lineEndpointsToLocal(rawArrow, startW, endW);\n\t\t\t\t\t\tlet arrowBind: ArrowBindings | undefined;\n\t\t\t\t\t\tif (snapA || snapB) {\n\t\t\t\t\t\t\tarrowBind = {\n\t\t\t\t\t\t\t\t...(snapA ? { start: snapA.binding } : {}),\n\t\t\t\t\t\t\t\t...(snapB ? { end: snapB.binding } : {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchange([\n\t\t\t\t\t\t\t...itemsRef.current,\n\t\t\t\t\t\t\tcreateLineItem(id, rawArrow, line, \"arrow\", pen, arrowBind),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet raw = rectFromCorners(a, b);\n\t\t\t\t\tlet br = normalizeRect(raw);\n\t\t\t\t\tlet lineA = a;\n\t\t\t\t\tlet lineB = b;\n\n\t\t\t\t\tconst cpUp = customPlacementRef.current;\n\t\t\t\t\tif (br.width < MIN_PLACE_SIZE || br.height < MIN_PLACE_SIZE) {\n\t\t\t\t\t\tconst center = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n\t\t\t\t\t\tif (cpUp && st.tool === cpUp.toolId) {\n\t\t\t\t\t\t\traw = { x: center.x - 60, y: center.y - 40, width: 120, height: 80 };\n\t\t\t\t\t\t\tbr = normalizeRect(raw);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst def = defaultPlacementWorld(st.tool, center);\n\t\t\t\t\t\t\traw = def.raw;\n\t\t\t\t\t\t\tbr = normalizeRect(raw);\n\t\t\t\t\t\t\tif (def.lineWorld) {\n\t\t\t\t\t\t\t\tlineA = def.lineWorld[0];\n\t\t\t\t\t\t\t\tlineB = def.lineWorld[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst id = createShapeId();\n\t\t\t\t\tconst pen = strokeStyleRef.current;\n\t\t\t\t\tif (cpUp && st.tool === cpUp.toolId) {\n\t\t\t\t\t\tchange(itemsRef.current.concat(cpUp.createItem({ id, bounds: br })));\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (st.tool === \"rect\") {\n\t\t\t\t\t\tchange([...itemsRef.current, createRectangleItem(id, raw, pen)]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t} else if (st.tool === \"ellipse\") {\n\t\t\t\t\t\tchange([...itemsRef.current, createEllipseItem(id, raw, pen)]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t} else if (st.tool === \"architectural-cloud\") {\n\t\t\t\t\t\tchange([\n\t\t\t\t\t\t\t...itemsRef.current,\n\t\t\t\t\t\t\tcreateArchitecturalCloudItem(id, raw, pen),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t} else if (st.tool === \"line\" || st.tool === \"arrow\") {\n\t\t\t\t\t\tconst line = lineEndpointsToLocal(raw, lineA, lineB);\n\t\t\t\t\t\tchange([\n\t\t\t\t\t\t\t...itemsRef.current,\n\t\t\t\t\t\t\tcreateLineItem(\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\traw,\n\t\t\t\t\t\t\t\tline,\n\t\t\t\t\t\t\t\tst.tool === \"arrow\" ? \"arrow\" : \"line\",\n\t\t\t\t\t\t\t\tpen,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetEffectiveSelectedIdsRef.current([id]);\n\t\t\t\t\t}\n\t\t\t\t\trequestAutoResetTool(st.tool);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.addEventListener(\"pointermove\", onMove);\n\t\t\tdocument.addEventListener(\"pointerup\", onUp);\n\t\t\tdocument.addEventListener(\"pointercancel\", onUp);\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener(\"pointermove\", onMove);\n\t\t\t\tdocument.removeEventListener(\"pointerup\", onUp);\n\t\t\t\tdocument.removeEventListener(\"pointercancel\", onUp);\n\t\t\t};\n\t\t}, [\n\t\t\temitRemoteStrokePreview,\n\t\t\temitRemoteStrokePreviewClear,\n\t\t\tinteractive,\n\t\t\tpruneEraserTrail,\n\t\t\tpruneLaserTrail,\n\t\t\tfinalizeStrokeDragState,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\treleaseInteractionPointer,\n\t\t\trequestAutoResetTool,\n\t\t\tscreenToWorld,\n\t\t\tsetStraightStrokeEndpoint,\n\t\t\tupdateStraightStrokeForMove,\n\t\t]);\n\n\t\tconst selectedItemsForOverlay = useMemo(() => {\n\t\t\treturn effectiveSelectedIds\n\t\t\t\t.map((id) => resolvedItems.find((i) => i.id === id))\n\t\t\t\t.filter((i): i is VectorSceneItem => i != null);\n\t\t}, [effectiveSelectedIds, resolvedItems]);\n\t\tconst activeToolInspectorStyle = useMemo(() => {\n\t\t\tif (toolId === \"draw\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"draw\" as const,\n\t\t\t\t\tlabel: \"Caneta\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"marker\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"marker\" as const,\n\t\t\t\t\tlabel: \"Marcador\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"text\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"text\" as const,\n\t\t\t\t\tlabel: \"Texto\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"rect\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"rect\" as const,\n\t\t\t\t\tlabel: \"Retângulo\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"ellipse\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"ellipse\" as const,\n\t\t\t\t\tlabel: \"Elipse\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"architectural-cloud\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"architectural-cloud\" as const,\n\t\t\t\t\tlabel: \"Nuvem\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"line\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"line\" as const,\n\t\t\t\t\tlabel: \"Linha\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (toolId === \"arrow\") {\n\t\t\t\treturn {\n\t\t\t\t\ttoolKind: \"arrow\" as const,\n\t\t\t\t\tlabel: \"Seta\",\n\t\t\t\t\t...strokeStyleState,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}, [strokeStyleState, toolId]);\n\t\tconst eraserPreviewItemsForOverlay = useMemo(() => {\n\t\t\treturn eraserPreviewIds\n\t\t\t\t.map((id) => resolvedItems.find((i) => i.id === id))\n\t\t\t\t.filter((i): i is VectorSceneItem => i != null);\n\t\t}, [eraserPreviewIds, resolvedItems]);\n\t\tconst marqueeCandidateItemsForOverlay = useMemo(() => {\n\t\t\tif (marqueeCandidateIds.length === 0) return [];\n\t\t\t// Items already selected keep their solid selection box; only the\n\t\t\t// not-yet-selected ones get the dashed \"will be added\" highlight.\n\t\t\tconst selected = new Set(effectiveSelectedIds);\n\t\t\treturn marqueeCandidateIds\n\t\t\t\t.filter((id) => !selected.has(id))\n\t\t\t\t.map((id) => resolvedItems.find((i) => i.id === id))\n\t\t\t\t.filter((i): i is VectorSceneItem => i != null);\n\t\t}, [marqueeCandidateIds, effectiveSelectedIds, resolvedItems]);\n\n\t\tconst presenceLayer = useMemo(() => {\n\t\t\tif (!cameraForOverlay) return null;\n\t\t\tif (presenceOverlay) {\n\t\t\t\treturn presenceOverlay({\n\t\t\t\t\tcamera: cameraForOverlay,\n\t\t\t\t\tcameraVersion: cameraTick,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (remotePresence && remotePresence.length > 0) {\n\t\t\t\treturn (\n\t\t\t\t\t<PresenceRemoteLayer\n\t\t\t\t\t\tcamera={cameraForOverlay}\n\t\t\t\t\t\tcameraVersion={cameraTick}\n\t\t\t\t\t\tpeers={remotePresence}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn null;\n\t\t}, [cameraForOverlay, cameraTick, presenceOverlay, remotePresence]);\n\n\t\tconst primarySelected =\n\t\t\teffectiveSelectedIds.length === 1\n\t\t\t\t? (resolvedItems.find((i) => i.id === effectiveSelectedIds[0]) ?? null)\n\t\t\t\t: null;\n\n\t\tconst editingTextItem = editingTextId\n\t\t\t? (items.find((i) => i.id === editingTextId && i.toolKind === \"text\") ?? null)\n\t\t\t: null;\n\t\tconst showResizeHandles =\n\t\t\ttoolId === \"select\" &&\n\t\t\t!!primarySelected &&\n\t\t\t!primarySelected.locked &&\n\t\t\tsupportsResizeHandles(primarySelected);\n\n\t\tconst overlayPointerEvents: \"none\" | \"auto\" =\n\t\t\tinteractive && toolId !== \"hand\" ? \"auto\" : \"none\";\n\n\t\tconst viewportCursor =\n\t\t\tcustomPlacement?.toolId === toolId\n\t\t\t\t? \"crosshair\"\n\t\t\t\t: cursorForVectorToolId(toolId);\n\n\t\tconst rootStyle: CSSProperties = {\n\t\t\tposition: \"relative\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tminHeight: 0,\n\t\t\toutline: \"none\",\n\t\t\tcursor: viewportCursor,\n\t\t\tuserSelect: \"none\",\n\t\t\tWebkitUserSelect: \"none\",\n\t\t\tWebkitTouchCallout: \"none\",\n\t\t};\n\n\t\tconst canEditSelection = interactive && !!onItemsChange;\n\t\tconst chromeContextValue: CanvuChromeContextValue = {\n\t\t\tcamera: cameraForOverlay,\n\t\t\tviewportWidth: viewportSizeRef.current.width,\n\t\t\tviewportHeight: viewportSizeRef.current.height,\n\t\t\titems,\n\t\t\tselectedItems: selectedItemsForOverlay,\n\t\t\tinteractive,\n\t\t\tcanEditSelection,\n\t\t\tactiveToolStyle: activeToolInspectorStyle ?? null,\n\t\t\tonSelectionStyleChange: canEditSelection\n\t\t\t\t? activeToolInspectorStyle\n\t\t\t\t\t? handleActiveToolStyleChange\n\t\t\t\t\t: handleSelectionStyleChange\n\t\t\t\t: null,\n\t\t\tzoomPercent,\n\t\t\tonZoomIn: handleZoomInClick,\n\t\t\tonZoomOut: handleZoomOutClick,\n\t\t\tonUndo: undo,\n\t\t\tonRedo: redo,\n\t\t\tcanUndo,\n\t\t\tcanRedo,\n\t\t\tonRequestRender: renderFrame,\n\t\t};\n\n\t\tconst defaultSelectionInspector =\n\t\t\tcameraForOverlay && canEditSelection ? (\n\t\t\t\t<VectorSelectionInspector\n\t\t\t\t\tclassName={selectionInspectorProps?.className}\n\t\t\t\t\tstyle={selectionInspectorProps?.style}\n\t\t\t\t/>\n\t\t\t) : null;\n\t\tconst defaultNavMenu = cameraForOverlay ? <NavMenu /> : null;\n\n\t\tconst resolvedSelectionInspector =\n\t\t\tselectionInspector === undefined\n\t\t\t\t? defaultSelectionInspector\n\t\t\t\t: selectionInspector;\n\t\tconst resolvedNavMenu = navMenu === undefined ? defaultNavMenu : navMenu;\n\n\t\treturn (\n\t\t\t<CanvuPluginContext.Provider value={pluginContextValue}>\n\t\t\t\t<CanvuChromeContext.Provider value={chromeContextValue}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={wrapperRef}\n\t\t\t\t\t\tstyle={rootStyle}\n\t\t\t\t\t\trole=\"application\"\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-describedby={liveId}\n\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\tonPaste={handleWrapperPaste}\n\t\t\t\t\t\tonDragOver={handleWrapperDragOver}\n\t\t\t\t\t\tonDrop={handleWrapperDrop}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={interactionRootRef}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tzIndex: 0,\n\t\t\t\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tref={sceneContainerRef}\n\t\t\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\tzIndex: 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{loadingSkeletons.length > 0 && cameraForOverlay && (\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<g transform={formatCameraTransform(cameraForOverlay)}>\n\t\t\t\t\t\t\t\t\t\t{loadingSkeletons.map((sk) => (\n\t\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\t\tkey={sk.id}\n\t\t\t\t\t\t\t\t\t\t\t\tx={sk.x}\n\t\t\t\t\t\t\t\t\t\t\t\ty={sk.y}\n\t\t\t\t\t\t\t\t\t\t\t\twidth={sk.width}\n\t\t\t\t\t\t\t\t\t\t\t\theight={sk.height}\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"#f4f4f5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"#d4d4d8\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1 / cameraForOverlay.zoom}\n\t\t\t\t\t\t\t\t\t\t\t\trx={2 / cameraForOverlay.zoom}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimation: \"canvu-pulse 1.5s ease-in-out infinite\",\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{presenceLayer}\n\t\t\t\t\t\t\t{cameraForOverlay && interactive && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<InteractionOverlay\n\t\t\t\t\t\t\t\t\t\tcamera={cameraForOverlay}\n\t\t\t\t\t\t\t\t\t\tcameraVersion={cameraTick}\n\t\t\t\t\t\t\t\t\t\tselectedItems={selectedItemsForOverlay}\n\t\t\t\t\t\t\t\t\t\tshowResizeHandles={showResizeHandles}\n\t\t\t\t\t\t\t\t\t\tplacementPreview={placementPreview}\n\t\t\t\t\t\t\t\t\t\teraserTrail={eraserTrail}\n\t\t\t\t\t\t\t\t\t\tlaserTrail={laserTrail}\n\t\t\t\t\t\t\t\t\t\teraserPreviewItems={eraserPreviewItemsForOverlay}\n\t\t\t\t\t\t\t\t\t\tmarqueeCandidateItems={marqueeCandidateItemsForOverlay}\n\t\t\t\t\t\t\t\t\t\tpreviewStrokeStyle={strokeStyleRef.current}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\t\t\t\tzIndex: 12,\n\t\t\t\t\t\t\t\t\t\t\ttouchAction: \"none\",\n\t\t\t\t\t\t\t\t\t\t\tpointerEvents: overlayPointerEvents,\n\t\t\t\t\t\t\t\t\t\t\tcursor: viewportCursor,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonPointerDown={handleOverlayPointerDown}\n\t\t\t\t\t\t\t\t\t\tonContextMenu={handleOverlayContextMenu}\n\t\t\t\t\t\t\t\t\t\tonDoubleClick={handleOverlayDoubleClick}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref={imageInputRef}\n\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\taccept=\"image/*,application/pdf\"\n\t\t\t\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\t\t\t\taria-label=\"Select image or PDF to place on canvas\"\n\t\t\t\t\t\t\tonChange={handleImageFileChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{toolbar}\n\t\t\t\t\t\t{plugins.length > 0 ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tdata-slot=\"canvu-plugin-layer\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\tzIndex: 40,\n\t\t\t\t\t\t\t\t\tpointerEvents: \"none\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<VectorViewportPluginInstances\n\t\t\t\t\t\t\t\t\tplugins={plugins}\n\t\t\t\t\t\t\t\t\trenderContext={pluginRenderContext}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{cameraForOverlay && interactive && editingTextItem && (\n\t\t\t\t\t\t\t<TextEditOverlay\n\t\t\t\t\t\t\t\tcamera={cameraForOverlay}\n\t\t\t\t\t\t\t\tcameraVersion={cameraTick}\n\t\t\t\t\t\t\t\titem={editingTextItem}\n\t\t\t\t\t\t\t\tdraftText={draftText}\n\t\t\t\t\t\t\t\tonDraftChange={handleDraftTextChange}\n\t\t\t\t\t\t\t\tonCommit={commitTextEdit}\n\t\t\t\t\t\t\t\tonCancel={cancelTextEdit}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{resolvedSelectionInspector}\n\t\t\t\t\t\t{interactive && onItemsChange && contextMenu && (\n\t\t\t\t\t\t\t<ShapeContextMenu\n\t\t\t\t\t\t\t\tx={contextMenu.x}\n\t\t\t\t\t\t\t\ty={contextMenu.y}\n\t\t\t\t\t\t\t\tallSelectedLocked={\n\t\t\t\t\t\t\t\t\tcontextMenu.itemIds.length > 0 &&\n\t\t\t\t\t\t\t\t\tcontextMenu.itemIds.every(\n\t\t\t\t\t\t\t\t\t\t(id) => items.find((i) => i.id === id)?.locked,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClose={() => setContextMenu(null)}\n\t\t\t\t\t\t\t\tonToggleLock={() => {\n\t\t\t\t\t\t\t\t\tconst ids = contextMenu.itemIds;\n\t\t\t\t\t\t\t\t\tconst allLocked =\n\t\t\t\t\t\t\t\t\t\tids.length > 0 &&\n\t\t\t\t\t\t\t\t\t\tids.every((id) => items.find((i) => i.id === id)?.locked);\n\t\t\t\t\t\t\t\t\tsetLockedOnIds(ids, !allLocked);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonCut={() => cutIds(contextMenu.itemIds)}\n\t\t\t\t\t\t\t\tonCopy={() => copyIdsToInternalClipboard(contextMenu.itemIds)}\n\t\t\t\t\t\t\t\tonBringToFront={() => reorderIds(contextMenu.itemIds, \"front\")}\n\t\t\t\t\t\t\t\tonBringForward={() => reorderIds(contextMenu.itemIds, \"forward\")}\n\t\t\t\t\t\t\t\tonSendBackward={() => reorderIds(contextMenu.itemIds, \"backward\")}\n\t\t\t\t\t\t\t\tonSendToBack={() => reorderIds(contextMenu.itemIds, \"back\")}\n\t\t\t\t\t\t\t\tonDuplicate={() => duplicateIds(contextMenu.itemIds)}\n\t\t\t\t\t\t\t\tonDelete={() => deleteIds(contextMenu.itemIds)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{resolvedNavMenu}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={liveId}\n\t\t\t\t\t\t\tstyle={visuallyHidden}\n\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{`Zoom ${zoomPercent} percent.`}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</CanvuChromeContext.Provider>\n\t\t\t</CanvuPluginContext.Provider>\n\t\t);\n\t},\n);\n\nVectorViewport.displayName = \"VectorViewport\";\n\nexport { cursorForVectorToolId };\n","import type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect } from \"../math/rect\";\nimport { cullItemsByViewport } from \"../scene/cull\";\nimport type { VectorScene } from \"../scene/scene\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\n/**\n * Builds the SVG `transform` attribute for mapping world coordinates to viewport CSS pixels.\n */\nexport function formatCameraTransform(camera: Camera2D): string {\n\tconst z = camera.zoom;\n\treturn `matrix(${z}, 0, 0, ${z}, ${camera.x}, ${camera.y})`;\n}\n\n/**\n * Transform for item `<g>`: `translate(x,y)` plus optional rotation around the bounds center.\n * SVG `rotate` uses degrees.\n */\nexport function formatItemPlacementTransform(item: VectorSceneItem): string {\n\tconst r = normalizeRect(item.bounds);\n\tconst rot = item.rotation ?? 0;\n\tif (Math.abs(rot) < 1e-12) {\n\t\treturn `translate(${item.x}, ${item.y})`;\n\t}\n\tconst deg = (rot * 180) / Math.PI;\n\tconst cx = r.width / 2;\n\tconst cy = r.height / 2;\n\treturn `translate(${item.x}, ${item.y}) translate(${cx}, ${cy}) rotate(${deg}) translate(${-cx}, ${-cy})`;\n}\n\nexport type SvgVectorRendererOptions = {\n\t/** Root element (typically `position: relative` and fixed size). */\n\tcontainer: HTMLElement;\n\tscene: VectorScene;\n\tcamera: Camera2D;\n\t/**\n\t * When true, the scene SVG ignores pointer events so an overlay can own hit-testing\n\t * (interactive selection / resize / placement).\n\t */\n\tpointerEventsNone?: boolean;\n};\n\ntype CachedItemG = {\n\treadonly g: SVGGElement;\n\tlastChildrenSvg: string;\n\tlastTransform: string;\n};\n\n/**\n * Renders vector scene items into a single SVG: camera as an outer `<g>` transform,\n * so geometry stays sharp at any zoom (no fixed-resolution raster).\n *\n * Uses incremental DOM updates: keeps a stable `<g>` per visible item id, updates\n * `innerHTML` only when `childrenSvg` changes, and only adjusts the camera transform\n * when pan/zoom changes without content edits.\n */\nexport class SvgVectorRenderer {\n\tprivate readonly container: HTMLElement;\n\tprivate readonly scene: VectorScene;\n\tprivate readonly camera: Camera2D;\n\tprivate readonly svg: SVGSVGElement;\n\tprivate readonly rootG: SVGGElement;\n\tprivate readonly itemNodeCache = new Map<string, CachedItemG>();\n\tprivate liveOverlay: CachedItemG | null = null;\n\tprivate readonly resizeObserver: ResizeObserver;\n\n\tconstructor(options: SvgVectorRendererOptions) {\n\t\tthis.container = options.container;\n\t\tthis.scene = options.scene;\n\t\tthis.camera = options.camera;\n\n\t\tthis.svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tthis.svg.setAttribute(\"width\", \"100%\");\n\t\tthis.svg.setAttribute(\"height\", \"100%\");\n\t\tthis.svg.setAttribute(\"shape-rendering\", \"geometricPrecision\");\n\t\tthis.svg.style.display = \"block\";\n\t\tthis.svg.setAttribute(\"role\", \"presentation\");\n\t\tthis.svg.setAttribute(\"focusable\", \"false\");\n\t\tthis.setPointerEventsNone(options.pointerEventsNone ?? false);\n\n\t\tthis.rootG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tthis.svg.appendChild(this.rootG);\n\n\t\tthis.container.appendChild(this.svg);\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.render());\n\t\tthis.resizeObserver.observe(this.container);\n\t}\n\n\t/**\n\t * Reads container size, culls items, and updates the SVG (incrementally when possible).\n\t */\n\trender(): void {\n\t\tconst w = this.container.clientWidth;\n\t\tconst h = this.container.clientHeight;\n\t\tif (w <= 0 || h <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.svg.setAttribute(\"viewBox\", `0 0 ${w} ${h}`);\n\t\tthis.svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid slice\");\n\n\t\tconst visible = this.camera.getVisibleWorldRect(w, h);\n\t\tconst items = cullItemsByViewport(this.scene.getItems(), visible);\n\n\t\tthis.syncVisibleItems(items);\n\t\tthis.rootG.setAttribute(\"transform\", formatCameraTransform(this.camera));\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\t/**\n\t * Updates only the in-progress (live) stroke node without re-culling or\n\t * re-syncing the committed scene items. Drawing tools call this on every\n\t * pointer move, so it must stay O(1) regardless of how many items the\n\t * board already contains.\n\t *\n\t * Pass `null` to remove the live overlay (e.g. when the stroke is committed).\n\t */\n\trenderLiveItem(item: VectorSceneItem | null): void {\n\t\tif (!item) {\n\t\t\tif (this.liveOverlay) {\n\t\t\t\tthis.liveOverlay.g.remove();\n\t\t\t\tthis.liveOverlay = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.liveOverlay) {\n\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\tg.setAttribute(\"data-live-overlay\", \"true\");\n\t\t\tthis.liveOverlay = {\n\t\t\t\tg,\n\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\tlastTransform: \"\",\n\t\t\t};\n\t\t\tthis.rootG.appendChild(g);\n\t\t}\n\n\t\tconst cached = this.liveOverlay;\n\t\tconst t = formatItemPlacementTransform(item);\n\t\tif (cached.lastTransform !== t) {\n\t\t\tcached.g.setAttribute(\"transform\", t);\n\t\t\tcached.lastTransform = t;\n\t\t}\n\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\tcached.g.innerHTML = item.childrenSvg;\n\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t}\n\t\tthis.keepLiveOverlayOnTop();\n\t}\n\n\tprivate keepLiveOverlayOnTop(): void {\n\t\tif (this.liveOverlay && this.rootG.lastChild !== this.liveOverlay.g) {\n\t\t\tthis.rootG.appendChild(this.liveOverlay.g);\n\t\t}\n\t}\n\n\tprivate syncVisibleItems(items: readonly VectorSceneItem[]): void {\n\t\tconst visibleIds = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tvisibleIds.add(item.id);\n\t\t}\n\n\t\tfor (const [id, cached] of this.itemNodeCache) {\n\t\t\tif (!visibleIds.has(id)) {\n\t\t\t\tcached.g.remove();\n\t\t\t}\n\t\t}\n\n\t\tlet previousNode: ChildNode | null = null;\n\t\tfor (const item of items) {\n\t\t\tlet cached = this.itemNodeCache.get(item.id);\n\t\t\tif (!cached) {\n\t\t\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\t\tg.setAttribute(\"data-item-id\", item.id);\n\t\t\t\tcached = {\n\t\t\t\t\tg,\n\t\t\t\t\tlastChildrenSvg: \"\",\n\t\t\t\t\tlastTransform: \"\",\n\t\t\t\t};\n\t\t\t\tthis.itemNodeCache.set(item.id, cached);\n\t\t\t}\n\n\t\t\tconst { g } = cached;\n\t\t\tconst t = formatItemPlacementTransform(item);\n\t\t\tif (cached.lastTransform !== t) {\n\t\t\t\tg.setAttribute(\"transform\", t);\n\t\t\t\tcached.lastTransform = t;\n\t\t\t}\n\n\t\t\tif (cached.lastChildrenSvg !== item.childrenSvg) {\n\t\t\t\t// Trusted SVG fragments only — sanitize untrusted strings in your app.\n\t\t\t\tg.innerHTML = item.childrenSvg;\n\t\t\t\tcached.lastChildrenSvg = item.childrenSvg;\n\t\t\t}\n\n\t\t\tconst expectedPosition: ChildNode | null = previousNode\n\t\t\t\t? previousNode.nextSibling\n\t\t\t\t: this.rootG.firstChild;\n\t\t\tif (expectedPosition !== g) {\n\t\t\t\tthis.rootG.insertBefore(g, expectedPosition);\n\t\t\t}\n\t\t\tpreviousNode = g;\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.itemNodeCache.clear();\n\t\tthis.liveOverlay = null;\n\t\tthis.svg.remove();\n\t}\n\n\t/** Toggle whether the scene SVG receives pointer events (vs overlay handling them). */\n\tsetPointerEventsNone(value: boolean): void {\n\t\tthis.svg.style.pointerEvents = value ? \"none\" : \"auto\";\n\t}\n}\n","import { 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 { 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 type { Rect } from \"../math/rect\";\nimport { createCustomShapeItem } from \"./custom-shape\";\nimport type { VectorSceneItem } from \"./types\";\n\n/** Plugin key under which link metadata is stored on a link item's `pluginData`. */\nexport const LINK_PLUGIN_KEY = \"canvuLink\";\n\n/**\n * Metadata describing a clickable link/bookmark item.\n * `href` is required; the rest enrich the rendered card (unfurl result).\n */\nexport type CanvuLinkData = {\n\t/** Absolute URL the card points to. */\n\thref: string;\n\t/** Human readable title (falls back to the hostname). */\n\ttitle?: string;\n\t/** Short description shown under the title. */\n\tdescription?: string;\n\t/** Preview image URL (og:image). */\n\timage?: string;\n\t/** Favicon URL shown in the leading badge. */\n\tfavicon?: string;\n};\n\nconst DEFAULT_LINK_CARD_WIDTH = 360;\nconst DEFAULT_LINK_CARD_HEIGHT = 132;\nconst LINK_CARD_BORDER = \"#e2e8f0\";\nconst LINK_CARD_ACCENT = \"#2563eb\";\nconst LINK_CARD_TITLE_COLOR = \"#0f172a\";\nconst LINK_CARD_TEXT_COLOR = \"#475569\";\n\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.min(max, Math.max(min, value));\n\nconst formatNumber = (value: number): string => {\n\tconst rounded = Math.round(value * 100) / 100;\n\treturn Object.is(rounded, -0) ? \"0\" : String(rounded);\n};\n\nconst escapeXmlAttribute = (value: string): string =>\n\tvalue\n\t\t.replaceAll(\"&\", \"&\")\n\t\t.replaceAll(\"<\", \"<\")\n\t\t.replaceAll(\">\", \">\")\n\t\t.replaceAll('\"', \""\")\n\t\t.replaceAll(\"'\", \"'\");\n\nconst escapeHtmlText = (value: string): string =>\n\tvalue.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n\nconst getLinkHostname = (href: string): string => {\n\ttry {\n\t\treturn new URL(href).hostname.replace(/^www\\./, \"\");\n\t} catch {\n\t\treturn href;\n\t}\n};\n\ntype LinkTextBand = {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\ttext: string;\n\tfontSize: number;\n\tcolor: string;\n\tfontWeight?: number;\n\tclampLines?: number;\n};\n\nconst buildLinkTextBand = (band: LinkTextBand): string => {\n\tconst lineHeight = band.fontSize * 1.3;\n\tconst weight = band.fontWeight != null ? `font-weight:${band.fontWeight};` : \"\";\n\tconst lineClampStyle = band.clampLines\n\t\t? `display:-webkit-box;-webkit-line-clamp:${band.clampLines};-webkit-box-orient:vertical;`\n\t\t: \"\";\n\treturn `<foreignObject x=\"${formatNumber(band.x)}\" y=\"${formatNumber(band.y)}\" width=\"${formatNumber(Math.max(1, band.width))}\" height=\"${formatNumber(Math.max(1, band.height))}\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"box-sizing:border-box;width:100%;height:100%;margin:0;font-family:system-ui,sans-serif;font-size:${formatNumber(band.fontSize)}px;line-height:${formatNumber(lineHeight)}px;color:${band.color};overflow:hidden;word-break:break-word;${lineClampStyle}${weight}\">${escapeHtmlText(band.text)}</div></foreignObject>`;\n};\n\n/**\n * Builds the inner SVG (no outer `<svg>`) for a link/bookmark card at the given box size.\n * Uses fixed pixel bands so text never overlaps regardless of the card's aspect ratio.\n */\nexport function buildLinkCardSvg(\n\twidth: number,\n\theight: number,\n\tlink: CanvuLinkData,\n): string {\n\tconst cardWidth = Math.max(1, width);\n\tconst cardHeight = Math.max(1, height);\n\tconst padding = 14;\n\tconst badgeSize = clamp(Math.min(72, cardHeight - padding * 2), 28, 96);\n\tconst textX = padding + badgeSize + 14;\n\tconst textWidth = Math.max(1, cardWidth - textX - padding);\n\tconst hostname = getLinkHostname(link.href);\n\tconst title = link.title?.trim() || hostname || \"Link\";\n\tconst description = link.description?.trim() || link.href;\n\n\tconst titleY = padding;\n\tconst titleHeight = clamp(cardHeight * 0.22, 18, 28);\n\tconst hostY = titleY + titleHeight + 2;\n\tconst hostHeight = 16;\n\tconst descY = hostY + hostHeight + 4;\n\tconst descHeight = Math.max(1, cardHeight - descY - padding);\n\n\tconst badge = link.favicon\n\t\t? `<clipPath id=\"canvu-link-badge\"><rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" /></clipPath>\n\t\t<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"#f8fafc\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1\" />\n\t\t<image href=\"${escapeXmlAttribute(link.favicon)}\" x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" preserveAspectRatio=\"xMidYMid slice\" clip-path=\"url(#canvu-link-badge)\" />`\n\t\t: `<rect x=\"${formatNumber(padding)}\" y=\"${formatNumber(padding)}\" width=\"${formatNumber(badgeSize)}\" height=\"${formatNumber(badgeSize)}\" rx=\"12\" fill=\"${LINK_CARD_ACCENT}\" fill-opacity=\"0.1\" stroke=\"${LINK_CARD_ACCENT}\" stroke-opacity=\"0.3\" stroke-width=\"1\" />\n\t\t<g transform=\"translate(${formatNumber(padding + badgeSize / 2)},${formatNumber(padding + badgeSize / 2)})\" stroke=\"${LINK_CARD_ACCENT}\" stroke-width=\"2.4\" stroke-linecap=\"round\" fill=\"none\">\n\t\t\t<path d=\"M-9 3 a6 6 0 0 1 0 -8 l4 -4 a6 6 0 0 1 8 8 l-2 2\" />\n\t\t\t<path d=\"M9 -3 a6 6 0 0 1 0 8 l-4 4 a6 6 0 0 1 -8 -8 l2 -2\" />\n\t\t</g>`;\n\n\tconst externalIconX = cardWidth - padding - 16;\n\tconst externalIcon = `<g transform=\"translate(${formatNumber(externalIconX)},${formatNumber(padding)})\" stroke=\"${LINK_CARD_TEXT_COLOR}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n\t\t<path d=\"M6 1 H11 V6\" />\n\t\t<path d=\"M11 1 L4.5 7.5\" />\n\t\t<path d=\"M9 7 V10 a1 1 0 0 1 -1 1 H2 a1 1 0 0 1 -1 -1 V4 a1 1 0 0 1 1 -1 H5\" />\n\t</g>`;\n\n\treturn `\n\t\t<rect width=\"${formatNumber(cardWidth)}\" height=\"${formatNumber(cardHeight)}\" rx=\"16\" fill=\"#ffffff\" stroke=\"${LINK_CARD_BORDER}\" stroke-width=\"1.5\" />\n\t\t${badge}\n\t\t${externalIcon}\n\t\t${buildLinkTextBand({ x: textX, y: titleY, width: textWidth - 18, height: titleHeight, text: title, fontSize: 15, color: LINK_CARD_TITLE_COLOR, fontWeight: 700, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: hostY, width: textWidth, height: hostHeight, text: hostname, fontSize: 12, color: LINK_CARD_ACCENT, clampLines: 1 })}\n\t\t${buildLinkTextBand({ x: textX, y: descY, width: textWidth, height: descHeight, text: description, fontSize: 12, color: LINK_CARD_TEXT_COLOR, clampLines: 2 })}\n\t`;\n}\n\nconst isCanvuLinkData = (value: unknown): value is CanvuLinkData => {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst candidate = value as Record<string, unknown>;\n\treturn typeof candidate.href === \"string\" && candidate.href.length > 0;\n};\n\n/** Reads the link metadata from an item, or `null` when the item is not a link. */\nexport function getLinkData(item: VectorSceneItem): CanvuLinkData | null {\n\tconst entry = item.pluginData?.[LINK_PLUGIN_KEY];\n\treturn isCanvuLinkData(entry) ? entry : null;\n}\n\n/** True when the item carries link metadata (clickable card). */\nexport function isLinkItem(item: VectorSceneItem): boolean {\n\treturn getLinkData(item) != null;\n}\n\n/**\n * Creates a clickable link/bookmark card item ready to append to the scene.\n * The card resizes by scaling its authored SVG, like other custom shapes.\n */\nexport function createLinkItem(\n\tid: string,\n\tbounds: Rect,\n\tlink: CanvuLinkData,\n): VectorSceneItem {\n\tconst width = bounds.width || DEFAULT_LINK_CARD_WIDTH;\n\tconst height = bounds.height || DEFAULT_LINK_CARD_HEIGHT;\n\tconst item = createCustomShapeItem(\n\t\tid,\n\t\t{ ...bounds, width, height },\n\t\t{ render: (size) => buildLinkCardSvg(size.width, size.height, link) },\n\t);\n\treturn {\n\t\t...item,\n\t\tpluginData: {\n\t\t\t...(item.pluginData ?? {}),\n\t\t\t[LINK_PLUGIN_KEY]: link,\n\t\t},\n\t};\n}\n\n/** Default card size used when placing a new link without explicit bounds. */\nexport const DEFAULT_LINK_CARD_SIZE = {\n\twidth: DEFAULT_LINK_CARD_WIDTH,\n\theight: DEFAULT_LINK_CARD_HEIGHT,\n} as const;\n","import 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","import type { VectorSceneItem } from \"../scene/types\";\n\nconst SVG_BLOB_HREF_PATTERN = /\\b(?:href|xlink:href)=[\"'](blob:[^\"']+)[\"']/g;\n\nexport function collectImageBlobHrefs(\n\titems: readonly VectorSceneItem[],\n): Set<string> {\n\tconst hrefs = new Set<string>();\n\n\tfor (const item of items) {\n\t\tif (item.toolKind !== \"image\") continue;\n\n\t\tif (item.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\threfs.add(item.imageRasterHref);\n\t\t}\n\t\tif (item.imageThumbnailHref?.startsWith(\"blob:\")) {\n\t\t\threfs.add(item.imageThumbnailHref);\n\t\t}\n\n\t\tfor (const match of item.childrenSvg.matchAll(SVG_BLOB_HREF_PATTERN)) {\n\t\t\tconst href = match[1];\n\t\t\tif (href) {\n\t\t\t\threfs.add(href);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn hrefs;\n}\n\nexport function rememberImageBlobHrefs(\n\titems: readonly VectorSceneItem[],\n\trememberedHrefs: Set<string>,\n): void {\n\tfor (const href of collectImageBlobHrefs(items)) {\n\t\trememberedHrefs.add(href);\n\t}\n}\n\nexport function releaseRememberedBlobHrefs(\n\trememberedHrefs: Set<string>,\n\treleaseHref: (href: string) => void,\n): void {\n\tfor (const href of rememberedHrefs) {\n\t\treleaseHref(href);\n\t}\n\trememberedHrefs.clear();\n}\n","\"use client\";\n\nimport type { Camera2D } from \"../camera/camera\";\nimport {\n\tgetHandleWorldPositionRotated,\n\tgetRotationHandleWorldPosition,\n\ttype ResizeHandleId,\n} from \"../interaction/resize-handles\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tformatCameraTransform,\n\tformatItemPlacementTransform,\n} from \"../renderer/svg-vector-renderer\";\nimport { smoothFreehandPointsToPathD } from \"../scene/freehand-path\";\nimport {\n\tbuildArchitecturalCloudPathD,\n\tcomputeFreehandSvgPayload,\n\tcomputeStraightArrowGeometry,\n\ttype StrokeStyle,\n} from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nconst HANDLE_ORDER: ResizeHandleId[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\nconst ERASER_TINT = \"#cbd5e1\";\nconst ERASER_TINT_OPACITY = 0.95;\n/** Opacity applied to an item while it is queued for eraser deletion (real\n * geometry is shown dimmed instead of being redrawn as a gray skeleton). */\nconst ERASER_PREVIEW_OPACITY = 0.3;\n\nfunction pointsToSmoothPath(\n\tpoints: readonly { x: number; y: number }[],\n): string | null {\n\tif (points.length === 0) return null;\n\tconst d = smoothFreehandPointsToPathD(points);\n\treturn d || null;\n}\n\nexport type PlacementPreview =\n\t| { kind: \"rect\" | \"ellipse\" | \"architectural-cloud\"; rect: Rect }\n\t/** Multi-select drag (world rect), like image crop / rubber-band selection. */\n\t| { kind: \"marquee\"; rect: Rect }\n\t| {\n\t\t\tkind: \"line\" | \"arrow\";\n\t\t\tstart: { x: number; y: number };\n\t\t\tend: { x: number; y: number };\n\t }\n\t| {\n\t\t\tkind: \"stroke\";\n\t\t\ttool: \"draw\" | \"marker\" | \"laser\";\n\t\t\tpoints: { x: number; y: number }[];\n\t\t\t/** Mirrors the local stroke style so remote previews can match width/color/opacity. */\n\t\t\tstyle?: StrokeStyle;\n\t };\n\nexport type InteractionOverlayProps = {\n\tcamera: Camera2D;\n\t/** Bump when camera mutates so React redraws the overlay transform. */\n\tcameraVersion: number;\n\t/** Selected items (order preserved). Empty = no selection. */\n\tselectedItems: readonly VectorSceneItem[];\n\t/** When false, only the selection outline is shown (no resize handles). */\n\tshowResizeHandles: boolean;\n\tplacementPreview: PlacementPreview | null;\n\t/** Live eraser trail points in world space, newest at the end. */\n\teraserTrail?: readonly { x: number; y: number; t: number }[];\n\t/** Live laser trail points in world space, fades out after pointerup. */\n\tlaserTrail?: readonly { x: number; y: number; t: number }[];\n\t/** Shapes currently touched by eraser and queued to be removed on pointerup. */\n\teraserPreviewItems?: readonly VectorSceneItem[];\n\t/** Shapes the active marquee currently covers — a live preview of what\n\t * releasing will select (already-selected items are excluded). */\n\tmarqueeCandidateItems?: readonly VectorSceneItem[];\n\t/** Current stroke style used for local stroke previews (draw/marker). */\n\tpreviewStrokeStyle?: StrokeStyle;\n};\n\n/**\n * World-space decoration: selection bounds, resize handles, placement preview.\n * Renders above the scene SVG with `pointer-events: none` so a sibling HTML hit-layer\n * div can own all pointer capture for tools.\n */\nexport function InteractionOverlay({\n\tcamera,\n\tcameraVersion: _cameraVersion,\n\tselectedItems,\n\tshowResizeHandles,\n\tplacementPreview,\n\teraserTrail = [],\n\tlaserTrail = [],\n\teraserPreviewItems = [],\n\tmarqueeCandidateItems = [],\n\tpreviewStrokeStyle,\n}: InteractionOverlayProps) {\n\tvoid _cameraVersion;\n\tconst z = camera.zoom;\n\t/** World radius so handles stay ~5 CSS px after camera scale (see `formatCameraTransform`). */\n\tconst handleR = 5 / z;\n\t/**\n\t * Constant stroke in user units; `vectorEffect=\"non-scaling-stroke\"` keeps ~this many CSS px\n\t * regardless of zoom. Do not divide by `z` here — that doubled with non-scaling-stroke and made\n\t * borders/handles look overly thick when zoomed in.\n\t */\n\tconst overlayStrokePx = 1.25;\n\tconst dashPattern = \"4 4\";\n\tconst rotateHandleOffsetWorld = 24 / z;\n\t/** Screen-sized icon in world units (~16px at current zoom). */\n\tconst rotateIconWorld = 16 / z;\n\tconst rotateIconScale = rotateIconWorld / 24;\n\n\tconst rootTransform = formatCameraTransform(camera);\n\n\tlet selection: React.ReactNode = null;\n\tif (selectedItems.length > 0) {\n\t\tconst single = selectedItems.length === 1 ? selectedItems[0] : undefined;\n\t\tconst bSingle = single ? normalizeRect(single.bounds) : null;\n\t\tconst rotSingle = single?.rotation ?? 0;\n\t\tconst rotHandlePos =\n\t\t\tshowResizeHandles && bSingle && single\n\t\t\t\t? getRotationHandleWorldPosition(bSingle, rotSingle, rotateHandleOffsetWorld)\n\t\t\t\t: null;\n\t\tselection = (\n\t\t\t<g>\n\t\t\t\t{selectedItems.map((it) => {\n\t\t\t\t\tconst b = normalizeRect(it.bounds);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g key={it.id} transform={formatItemPlacementTransform(it)}>\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tx={0}\n\t\t\t\t\t\t\t\ty={0}\n\t\t\t\t\t\t\t\twidth={b.width}\n\t\t\t\t\t\t\t\theight={b.height}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{showResizeHandles && bSingle && single && rotHandlePos && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{HANDLE_ORDER.map((hid) => {\n\t\t\t\t\t\t\tconst p = getHandleWorldPositionRotated(bSingle, hid, rotSingle);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\tkey={hid}\n\t\t\t\t\t\t\t\t\tcx={p.x}\n\t\t\t\t\t\t\t\t\tcy={p.y}\n\t\t\t\t\t\t\t\t\tr={handleR}\n\t\t\t\t\t\t\t\t\tfill=\"#ffffff\"\n\t\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t\tdata-handle-id={hid}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<g\n\t\t\t\t\t\t\ttransform={`translate(${rotHandlePos.x}, ${rotHandlePos.y}) rotate(${(rotSingle * 180) / Math.PI})`}\n\t\t\t\t\t\t\tdata-rotate-handle=\"1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<g\n\t\t\t\t\t\t\t\ttransform={`translate(${-rotateIconWorld / 2}, ${-rotateIconWorld / 2}) scale(${rotateIconScale})`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Curved arrow (rotate) — Lucide-style arc + arrowhead */}\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M21 3v5h-5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</g>\n\t\t);\n\t}\n\n\tlet preview: React.ReactNode = null;\n\tif (placementPreview) {\n\t\tif (placementPreview.kind === \"marquee\") {\n\t\t\tconst r = normalizeRect(placementPreview.rect);\n\t\t\tpreview = (\n\t\t\t\t<rect\n\t\t\t\t\tx={r.x}\n\t\t\t\t\ty={r.y}\n\t\t\t\t\twidth={r.width}\n\t\t\t\t\theight={r.height}\n\t\t\t\t\tfill=\"rgba(59, 130, 246, 0.12)\"\n\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t/>\n\t\t\t);\n\t\t} else if (\n\t\t\tplacementPreview.kind === \"rect\" ||\n\t\t\tplacementPreview.kind === \"ellipse\" ||\n\t\t\tplacementPreview.kind === \"architectural-cloud\"\n\t\t) {\n\t\t\tconst r = normalizeRect(placementPreview.rect);\n\t\t\tconst shapeStroke = previewStrokeStyle?.stroke ?? \"#1d1d1d\";\n\t\t\tconst shapeWidth = previewStrokeStyle?.strokeWidth ?? 2;\n\t\t\tconst shapeOpacity = previewStrokeStyle?.strokeOpacity;\n\t\t\tpreview =\n\t\t\t\tplacementPreview.kind === \"rect\" ? (\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={r.x}\n\t\t\t\t\t\ty={r.y}\n\t\t\t\t\t\twidth={r.width}\n\t\t\t\t\t\theight={r.height}\n\t\t\t\t\t\trx={4}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t/>\n\t\t\t\t) : placementPreview.kind === \"ellipse\" ? (\n\t\t\t\t\t<ellipse\n\t\t\t\t\t\tcx={r.x + r.width / 2}\n\t\t\t\t\t\tcy={r.y + r.height / 2}\n\t\t\t\t\t\trx={r.width / 2}\n\t\t\t\t\t\try={r.height / 2}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<g transform={`translate(${r.x}, ${r.y})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={buildArchitecturalCloudPathD(r.width, r.height, shapeWidth)}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t);\n\t\t} else if (\n\t\t\tplacementPreview.kind === \"line\" ||\n\t\t\tplacementPreview.kind === \"arrow\"\n\t\t) {\n\t\t\tconst { start, end } = placementPreview;\n\t\t\tconst shapeStroke = previewStrokeStyle?.stroke ?? \"#1d1d1d\";\n\t\t\tconst shapeWidth = previewStrokeStyle?.strokeWidth ?? 2;\n\t\t\tconst shapeOpacity = previewStrokeStyle?.strokeOpacity;\n\t\t\tconst geometry =\n\t\t\t\tplacementPreview.kind === \"arrow\"\n\t\t\t\t\t? computeStraightArrowGeometry(\n\t\t\t\t\t\t\t{ x1: start.x, y1: start.y, x2: end.x, y2: end.y },\n\t\t\t\t\t\t\tshapeWidth,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null;\n\t\t\tpreview = (\n\t\t\t\t<>\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1={start.x}\n\t\t\t\t\t\ty1={start.y}\n\t\t\t\t\t\tx2={geometry?.shaftEndX ?? end.x}\n\t\t\t\t\t\ty2={geometry?.shaftEndY ?? end.y}\n\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t/>\n\t\t\t\t\t{placementPreview.kind === \"arrow\" && geometry ? (\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={`M ${geometry.headLeftX} ${geometry.headLeftY} L ${geometry.headTipX} ${geometry.headTipY} L ${geometry.headRightX} ${geometry.headRightY}`}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={shapeStroke}\n\t\t\t\t\t\t\tstrokeWidth={shapeWidth}\n\t\t\t\t\t\t\tstrokeOpacity={shapeOpacity}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t);\n\t\t} else if (placementPreview.kind === \"stroke\") {\n\t\t\tconst raw = placementPreview.points;\n\t\t\tconst tool = placementPreview.tool;\n\t\t\tif (raw.length >= 1) {\n\t\t\t\tconst isLaser = tool === \"laser\";\n\t\t\t\tconst previewStyle: StrokeStyle = {\n\t\t\t\t\tstroke: isLaser ? \"#f43f5e\" : (previewStrokeStyle?.stroke ?? \"#64748b\"),\n\t\t\t\t\tstrokeWidth: isLaser\n\t\t\t\t\t\t? 4\n\t\t\t\t\t\t: (previewStrokeStyle?.strokeWidth ?? (tool === \"marker\" ? 16 : 3)),\n\t\t\t\t\t...(previewStrokeStyle?.strokeOpacity != null && !isLaser\n\t\t\t\t\t\t? { strokeOpacity: previewStrokeStyle.strokeOpacity }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(previewStrokeStyle?.strokeDash != null && !isLaser\n\t\t\t\t\t\t? { strokeDash: previewStrokeStyle.strokeDash }\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\t\tconst payload = computeFreehandSvgPayload(\n\t\t\t\t\traw,\n\t\t\t\t\tpreviewStyle,\n\t\t\t\t\ttool === \"laser\" ? \"draw\" : tool,\n\t\t\t\t\traw.length === 2,\n\t\t\t\t);\n\t\t\t\tif (payload) {\n\t\t\t\t\tif (payload.kind === \"circle\") {\n\t\t\t\t\t\tpreview = (\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx={payload.cx}\n\t\t\t\t\t\t\t\tcy={payload.cy}\n\t\t\t\t\t\t\t\tr={payload.r}\n\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\tfillOpacity={payload.fillOpacity}\n\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (payload.kind === \"fillPath\") {\n\t\t\t\t\t\tpreview = (\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\tfillOpacity={payload.fillOpacity}\n\t\t\t\t\t\t\t\tfillRule=\"nonzero\"\n\t\t\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpreview = (\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={payload.stroke}\n\t\t\t\t\t\t\t\tstrokeWidth={payload.strokeWidth}\n\t\t\t\t\t\t\t\tstrokeOpacity={isLaser ? 0.85 : payload.strokeOpacity}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeDasharray={payload.strokeDasharray}\n\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlet eraserPreview: React.ReactNode = null;\n\tif (eraserPreviewItems.length > 0) {\n\t\t// Show the real item dimmed (not a redrawn gray skeleton) so the\n\t\t// deletion preview always matches the original geometry exactly.\n\t\t// Mirrors SvgVectorRenderer: same placement transform + childrenSvg.\n\t\teraserPreview = (\n\t\t\t<g>\n\t\t\t\t{eraserPreviewItems.map((it) => (\n\t\t\t\t\t<g\n\t\t\t\t\t\tkey={`erase-preview-${it.id}`}\n\t\t\t\t\t\ttransform={formatItemPlacementTransform(it)}\n\t\t\t\t\t\topacity={ERASER_PREVIEW_OPACITY}\n\t\t\t\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: trusted scene SVG fragment, same source as SvgVectorRenderer\n\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: it.childrenSvg }}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</g>\n\t\t);\n\t}\n\n\tlet marqueeCandidates: React.ReactNode = null;\n\tif (marqueeCandidateItems.length > 0) {\n\t\tmarqueeCandidates = (\n\t\t\t<g>\n\t\t\t\t{marqueeCandidateItems.map((it) => {\n\t\t\t\t\tconst b = normalizeRect(it.bounds);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g\n\t\t\t\t\t\t\tkey={`marquee-cand-${it.id}`}\n\t\t\t\t\t\t\ttransform={formatItemPlacementTransform(it)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tx={0}\n\t\t\t\t\t\t\t\ty={0}\n\t\t\t\t\t\t\t\twidth={b.width}\n\t\t\t\t\t\t\t\theight={b.height}\n\t\t\t\t\t\t\t\tfill=\"rgba(59, 130, 246, 0.10)\"\n\t\t\t\t\t\t\t\tstroke=\"#3b82f6\"\n\t\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</g>\n\t\t);\n\t}\n\n\tlet eraserTrailOverlay: React.ReactNode = null;\n\tif (eraserTrail.length >= 1) {\n\t\tconst now = Date.now();\n\t\tconst maxAgeMs = 150;\n\t\tconst alive = eraserTrail.filter((p) => now - p.t <= maxAgeMs);\n\t\tif (alive.length > 0) {\n\t\t\tconst d = pointsToSmoothPath(alive);\n\t\t\tconst newest = alive[alive.length - 1];\n\t\t\tconst newestAge = newest ? now - newest.t : maxAgeMs;\n\t\t\tconst headOpacity = Math.max(0, 1 - newestAge / maxAgeMs);\n\t\t\teraserTrailOverlay = (\n\t\t\t\t<g>\n\t\t\t\t\t{alive.length >= 2 && d ? (\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={ERASER_TINT}\n\t\t\t\t\t\t\tstrokeOpacity={ERASER_TINT_OPACITY}\n\t\t\t\t\t\t\tstrokeWidth={Math.max(3.5, overlayStrokePx)}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<circle\n\t\t\t\t\t\tcx={newest?.x ?? alive[0]?.x}\n\t\t\t\t\t\tcy={newest?.y ?? alive[0]?.y}\n\t\t\t\t\t\tr={Math.max(5 / z, 3)}\n\t\t\t\t\t\tfill={ERASER_TINT}\n\t\t\t\t\t\tfillOpacity={headOpacity}\n\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t}\n\n\tlet laserTrailOverlay: React.ReactNode = null;\n\tif (laserTrail.length >= 1) {\n\t\tconst now = Date.now();\n\t\tconst maxAgeMs = 650;\n\t\tconst alive = laserTrail.filter((p) => now - p.t <= maxAgeMs);\n\t\tif (alive.length > 0) {\n\t\t\tconst d = pointsToSmoothPath(alive);\n\t\t\tconst newest = alive[alive.length - 1];\n\t\t\tconst newestAge = newest ? now - newest.t : maxAgeMs;\n\t\t\tconst headOpacity = Math.max(0, 1 - newestAge / maxAgeMs);\n\t\t\tlaserTrailOverlay = (\n\t\t\t\t<g>\n\t\t\t\t\t{alive.length >= 2 && d ? (\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"#f43f5e\"\n\t\t\t\t\t\t\tstrokeOpacity={0.9}\n\t\t\t\t\t\t\tstrokeWidth={Math.max(4, overlayStrokePx)}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<circle\n\t\t\t\t\t\tcx={newest?.x ?? alive[0]?.x}\n\t\t\t\t\t\tcy={newest?.y ?? alive[0]?.y}\n\t\t\t\t\t\tr={Math.max(5 / z, 3)}\n\t\t\t\t\t\tfill=\"#f43f5e\"\n\t\t\t\t\t\tfillOpacity={headOpacity}\n\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\t<svg\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tzIndex: 11,\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\ttouchAction: \"none\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t}}\n\t\t\trole=\"presentation\"\n\t\t\taria-hidden\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t<g transform={rootTransform}>\n\t\t\t\t{marqueeCandidates}\n\t\t\t\t{preview}\n\t\t\t\t{laserTrailOverlay}\n\t\t\t\t{eraserTrailOverlay}\n\t\t\t\t{eraserPreview}\n\t\t\t\t{selection}\n\t\t\t</g>\n\t\t</svg>\n\t);\n}\n","/**\n * Freehand stroke helpers: dedupe noisy samples and build smooth SVG path `d` values\n * (quadratic Béziers) so strokes don't look jagged / \"pixelated\" from many short L segments.\n */\n\n/** Drop intermediate samples closer than `minDist` (local/world units) to reduce jitter. */\nexport function dedupeFreehandPoints<T extends { x: number; y: number }>(\n\tpoints: readonly T[],\n\tminDist: number,\n): T[] {\n\tif (points.length <= 2) {\n\t\treturn points.map((p) => ({ ...p }));\n\t}\n\tconst minSq = minDist * minDist;\n\tconst first = points[0];\n\tif (!first) return [];\n\tconst out: T[] = [{ ...first }];\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst p = points[i];\n\t\tconst last = out[out.length - 1];\n\t\tif (!p || !last) continue;\n\t\tconst dx = p.x - last.x;\n\t\tconst dy = p.y - last.y;\n\t\tif (dx * dx + dy * dy >= minSq) {\n\t\t\tout.push({ ...p });\n\t\t}\n\t}\n\tconst end = points[points.length - 1];\n\tconst lastKept = out[out.length - 1];\n\tif (!end || !lastKept) return out;\n\tif ((end.x - lastKept.x) ** 2 + (end.y - lastKept.y) ** 2 > 1e-12) {\n\t\tout.push({ ...end });\n\t}\n\treturn out;\n}\n\n/**\n * Smooth polyline → SVG path `d` using quadratic curves (canvas quadraticCurveTo midpoint pattern).\n * Avoids faceted \"broken\" lines from chaining many `L` commands.\n */\nexport function smoothFreehandPointsToPathD(\n\tpoints: readonly { x: number; y: number }[],\n): string {\n\tconst n = points.length;\n\tif (n === 0) return \"\";\n\tif (n === 1) {\n\t\tconst p = points[0];\n\t\tif (!p) return \"\";\n\t\treturn `M ${p.x} ${p.y}`;\n\t}\n\tif (n === 2) {\n\t\tconst a = points[0];\n\t\tconst b = points[1];\n\t\tif (!a || !b) return \"\";\n\t\treturn `M ${a.x} ${a.y} L ${b.x} ${b.y}`;\n\t}\n\tconst p0 = points[0];\n\tif (!p0) return \"\";\n\tlet d = `M ${p0.x} ${p0.y}`;\n\tlet i = 1;\n\tfor (; i < n - 2; i++) {\n\t\tconst pi = points[i];\n\t\tconst pi1 = points[i + 1];\n\t\tif (!pi || !pi1) continue;\n\t\tconst xc = (pi.x + pi1.x) / 2;\n\t\tconst yc = (pi.y + pi1.y) / 2;\n\t\td += ` Q ${pi.x} ${pi.y} ${xc} ${yc}`;\n\t}\n\tconst pLast = points[i];\n\tconst pEnd = points[i + 1];\n\tif (!pLast || !pEnd) return d;\n\td += ` Q ${pLast.x} ${pLast.y} ${pEnd.x} ${pEnd.y}`;\n\treturn d;\n}\n\n/**\n * Closed path from `perfect-freehand` outline → SVG `d` for fill.\n *\n * Uses the algorithm from the perfect-freehand README (`getSvgPathFromStroke`):\n * each outline point is a quadratic control point and the midpoint between\n * consecutive outline points is the curve endpoint. This produces\n * C1-continuous curves without the kinks that chained `T` or short `L` segments cause.\n */\nexport function outlineStrokeToClosedPathD(\n\toutline: readonly [number, number][],\n): string {\n\tconst len = outline.length;\n\tif (len === 0) return \"\";\n\tconst first = outline[0];\n\tif (!first) return \"\";\n\tif (len < 3) {\n\t\tlet d = `M ${first[0]} ${first[1]}`;\n\t\tfor (let i = 1; i < len; i++) {\n\t\t\tconst pt = outline[i];\n\t\t\tif (!pt) continue;\n\t\t\td += ` L ${pt[0]} ${pt[1]}`;\n\t\t}\n\t\treturn `${d} Z`;\n\t}\n\n\tlet d = `M ${first[0]} ${first[1]} Q`;\n\tfor (let i = 0; i < len; i++) {\n\t\tconst p0 = outline[i];\n\t\tconst p1 = outline[(i + 1) % len];\n\t\tif (!p0 || !p1) continue;\n\t\td += ` ${p0[0]} ${p0[1]} ${(p0[0] + p1[0]) / 2} ${(p0[1] + p1[1]) / 2}`;\n\t}\n\treturn `${d} Z`;\n}\n","\"use client\";\n\nimport { MousePointer2 } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { Camera2D } from \"../../camera/camera\";\nimport { formatCameraTransform } from \"../../renderer/svg-vector-renderer\";\nimport { smoothFreehandPointsToPathD } from \"../../scene/freehand-path\";\nimport {\n\tcomputeFreehandSvgPayload,\n\ttype StrokeStyle,\n} from \"../../scene/shape-builders\";\nimport { defaultPresenceColorForId } from \"./peer-color\";\nimport type { RemotePresenceMarkupStroke, RemotePresencePeer } from \"./types\";\n\nfunction strokePaint(\n\ttool: RemotePresenceMarkupStroke[\"tool\"],\n\tfallback: string,\n): { stroke: string; strokeOpacity: number; widthWorld: number } {\n\tswitch (tool) {\n\t\tcase \"laser\":\n\t\t\treturn { stroke: \"#f43f5e\", strokeOpacity: 0.92, widthWorld: 4 };\n\t\tcase \"marker\":\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.45, widthWorld: 14 };\n\t\tcase \"brush\":\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.85, widthWorld: 5 };\n\t\tcase \"pencil\":\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.9, widthWorld: 2.5 };\n\t\tdefault:\n\t\t\treturn { stroke: fallback, strokeOpacity: 0.95, widthWorld: 3.5 };\n\t}\n}\n\nfunction isFreehandTool(\n\ttool: RemotePresenceMarkupStroke[\"tool\"],\n): tool is \"draw\" | \"marker\" | \"pencil\" | \"brush\" {\n\treturn (\n\t\ttool === \"draw\" || tool === \"marker\" || tool === \"pencil\" || tool === \"brush\"\n\t);\n}\n\nexport type PresenceRemoteLayerProps = {\n\tcamera: Camera2D;\n\t/** Bump when camera changes (same as {@link InteractionOverlay}). */\n\tcameraVersion: number;\n\tpeers: readonly RemotePresencePeer[];\n};\n\n/**\n * World-space SVG overlay: remote cursors + in-progress markup strokes.\n * Usually passed via {@link VectorViewport} `remotePresence` or `presenceOverlay`.\n */\nexport function PresenceRemoteLayer({\n\tcamera,\n\tcameraVersion: _cameraVersion,\n\tpeers,\n}: PresenceRemoteLayerProps) {\n\tvoid _cameraVersion;\n\tconst z = camera.zoom;\n\tconst rootTransform = formatCameraTransform(camera);\n\tconst overlayStrokePx = 1.25;\n\t/** Lucide `MousePointer2` viewBox; tip ≈ this point in icon space (see lucide `mouse-pointer-2`). */\n\tconst LUCIDE_POINTER_VIEWBOX = 24;\n\tconst LUCIDE_POINTER_TIP_X = 4.037;\n\tconst LUCIDE_POINTER_TIP_Y = 4.688;\n\t/** Target on-screen size (~px); scale in world space so it stays constant when zooming. */\n\tconst remoteCursorScreenPx = 22;\n\tconst iconWorldScale = remoteCursorScreenPx / (LUCIDE_POINTER_VIEWBOX * z);\n\n\treturn (\n\t\t<svg\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tzIndex: 9,\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100%\",\n\t\t\t\ttouchAction: \"none\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t}}\n\t\t\trole=\"presentation\"\n\t\t\taria-hidden\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t<g transform={rootTransform}>\n\t\t\t\t{peers.map((peer) => {\n\t\t\t\t\tconst color = peer.color ?? defaultPresenceColorForId(peer.id);\n\t\t\t\t\tconst markup = peer.markupStroke;\n\t\t\t\t\tlet strokeNode: ReactNode = null;\n\t\t\t\t\tif (markup && markup.points.length > 0) {\n\t\t\t\t\t\tconst fallbackPaint = strokePaint(markup.tool, color);\n\t\t\t\t\t\tconst paint = {\n\t\t\t\t\t\t\tstroke: markup.stroke ?? fallbackPaint.stroke,\n\t\t\t\t\t\t\tstrokeOpacity: markup.strokeOpacity ?? fallbackPaint.strokeOpacity,\n\t\t\t\t\t\t\twidthWorld: markup.strokeWidth ?? fallbackPaint.widthWorld,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (markup.tool === \"laser\") {\n\t\t\t\t\t\t\tconst d =\n\t\t\t\t\t\t\t\tmarkup.points.length >= 2\n\t\t\t\t\t\t\t\t\t? smoothFreehandPointsToPathD([...markup.points])\n\t\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t\tif (d) {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke={paint.stroke}\n\t\t\t\t\t\t\t\t\t\tstrokeOpacity={paint.strokeOpacity}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={Math.max(paint.widthWorld / z, overlayStrokePx)}\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (isFreehandTool(markup.tool)) {\n\t\t\t\t\t\t\tconst style: StrokeStyle = {\n\t\t\t\t\t\t\t\tstroke: paint.stroke,\n\t\t\t\t\t\t\t\tstrokeWidth: paint.widthWorld,\n\t\t\t\t\t\t\t\t...(paint.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t? { strokeOpacity: paint.strokeOpacity }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst payload = computeFreehandSvgPayload(\n\t\t\t\t\t\t\t\tmarkup.points.map((p) => ({ x: p.x, y: p.y })),\n\t\t\t\t\t\t\t\tstyle,\n\t\t\t\t\t\t\t\tmarkup.tool,\n\t\t\t\t\t\t\t\tmarkup.points.length === 2,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (payload?.kind === \"circle\") {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\t\tcx={payload.cx}\n\t\t\t\t\t\t\t\t\t\tcy={payload.cy}\n\t\t\t\t\t\t\t\t\t\tr={payload.r}\n\t\t\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\t\t\t{...(payload.fillOpacity != null\n\t\t\t\t\t\t\t\t\t\t\t? { fillOpacity: payload.fillOpacity }\n\t\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (payload?.kind === \"fillPath\") {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\t\t\tfill={payload.fill}\n\t\t\t\t\t\t\t\t\t\tfillRule=\"nonzero\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\t\t\t\t\t{...(payload.fillOpacity != null\n\t\t\t\t\t\t\t\t\t\t\t? { fillOpacity: payload.fillOpacity }\n\t\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else if (payload?.kind === \"strokePath\") {\n\t\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\td={payload.d}\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke={payload.stroke}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={payload.strokeWidth}\n\t\t\t\t\t\t\t\t\t\t{...(payload.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t\t\t? { strokeOpacity: payload.strokeOpacity }\n\t\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\tshapeRendering=\"geometricPrecision\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cur = peer.cursor;\n\t\t\t\t\tlet cursorNode: ReactNode = null;\n\t\t\t\t\tif (cur) {\n\t\t\t\t\t\tconst displayName = peer.displayName;\n\t\t\t\t\t\tconst labelOffsetX = 14 / z;\n\t\t\t\t\t\tconst labelOffsetY = 14 / z;\n\t\t\t\t\t\tconst labelFont = 12 / z;\n\t\t\t\t\t\tcursorNode = (\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<g\n\t\t\t\t\t\t\t\t\ttransform={`translate(${cur.x}, ${cur.y}) scale(${iconWorldScale}) translate(${-LUCIDE_POINTER_TIP_X}, ${-LUCIDE_POINTER_TIP_Y})`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<MousePointer2\n\t\t\t\t\t\t\t\t\t\tsize={LUCIDE_POINTER_VIEWBOX}\n\t\t\t\t\t\t\t\t\t\tcolor={color}\n\t\t\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t{displayName ? (\n\t\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t\tx={cur.x + labelOffsetX}\n\t\t\t\t\t\t\t\t\t\ty={cur.y + labelOffsetY}\n\t\t\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tfontSize: labelFont,\n\t\t\t\t\t\t\t\t\t\t\tfontFamily: \"system-ui, sans-serif\",\n\t\t\t\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g key={peer.id}>\n\t\t\t\t\t\t\t{strokeNode}\n\t\t\t\t\t\t\t{cursorNode}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</g>\n\t\t</svg>\n\t);\n}\n","/**\n * Deterministic accent from a peer id when `color` is not provided.\n */\nexport function defaultPresenceColorForId(id: string): string {\n\tlet h = 2166136261;\n\tfor (let i = 0; i < id.length; i++) {\n\t\th ^= id.charCodeAt(i);\n\t\th = Math.imul(h, 16777619);\n\t}\n\tconst hue = (h >>> 0) % 360;\n\treturn `hsl(${hue} 72% 42%)`;\n}\n","/**\n * Helpers to avoid React update loops when selection is controlled (`selectedIds` + `onSelectionChange`).\n *\n * - Do not put `selectedIds.map(...)` or `[...selectedIds]` in `useEffect` deps every render — use\n * `useMemo` keyed on `selectedIds` (stable reference from parent state) or compare with\n * {@link shallowEqualStringArray}.\n * - When `useEffect` registers global listeners (document `pointermove`), do not list `setState`\n * callbacks in the dependency array if their identity can change with the parent — use a ref\n * (`setEffectiveSelectedIdsRef.current = fn`) and keep deps `[interactive]` + stable inputs only.\n */\n\n/**\n * `true` when both arrays have the same length and same strings in order (reference-safe).\n */\nexport function shallowEqualStringArray(\n\ta: readonly string[] | undefined,\n\tb: readonly string[] | undefined,\n): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return a === b;\n\tif (a.length !== b.length) return false;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\treturn true;\n}\n","\"use client\";\n\nimport { type KeyboardEvent, useLayoutEffect, useRef } from \"react\";\nimport type { Camera2D } from \"../camera/camera\";\nimport { normalizeRect } from \"../math/rect\";\nimport {\n\tDEFAULT_TEXT_FONT_SIZE,\n\tEDIT_TOP_PAD_RATIO,\n\tTEXT_FONT_FAMILY,\n} from \"../scene/text-svg\";\nimport type { VectorSceneItem } from \"../scene/types\";\n\nexport type TextEditOverlayProps = {\n\tcamera: Camera2D;\n\t/** Re-render when camera pans/zooms so the field stays aligned. */\n\tcameraVersion: number;\n\titem: VectorSceneItem;\n\tdraftText: string;\n\tonDraftChange: (value: string) => void;\n\tonCommit: () => void;\n\tonCancel: () => void;\n};\n\n/**\n * Screen-space textarea aligned to a text item’s world bounds (above hit layer).\n */\nexport function TextEditOverlay({\n\tcamera,\n\tcameraVersion: _cameraVersion,\n\titem,\n\tdraftText,\n\tonDraftChange,\n\tonCommit,\n\tonCancel,\n}: TextEditOverlayProps) {\n\tvoid _cameraVersion;\n\tconst taRef = useRef<HTMLTextAreaElement>(null);\n\tconst skipCommitRef = useRef(false);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: re-focus when switching to another text item\n\tuseLayoutEffect(() => {\n\t\tconst el = taRef.current;\n\t\tif (!el) return;\n\t\tel.focus();\n\t\tel.select();\n\t}, [item.id]);\n\n\tconst handleBlur = () => {\n\t\tif (skipCommitRef.current) {\n\t\t\tskipCommitRef.current = false;\n\t\t\treturn;\n\t\t}\n\t\tonCommit();\n\t};\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\te.preventDefault();\n\t\t\tskipCommitRef.current = true;\n\t\t\tonCancel();\n\t\t}\n\t};\n\n\tconst b = normalizeRect(item.bounds);\n\tconst z = camera.zoom;\n\tconst w = b.width * z;\n\tconst h = b.height * z;\n\tconst rot = item.rotation ?? 0;\n\tconst cx = b.x + b.width / 2;\n\tconst cy = b.y + b.height / 2;\n\tconst cScreen = camera.worldToScreen(cx, cy);\n\tconst fsWorld = item.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;\n\tconst fontSize = fsWorld * z;\n\tconst lineHeight = fsWorld * (22 / 18) * z;\n\tconst fixedBox = !!item.textFixedBounds;\n\t/**\n\t * Pad the textarea so its first-line baseline matches the SVG `<text y>` baseline\n\t * (see {@link FIRST_LINE_BASELINE_RATIO} in `text-svg.ts`). Horizontal padding\n\t * (4px local) matches the `<text x=\"4\">` offset in {@link buildTextSvg}.\n\t */\n\tconst padTop = EDIT_TOP_PAD_RATIO * fsWorld * z;\n\tconst padX = 4 * z;\n\tconst textColor = item.stroke ?? \"#1d1d1d\";\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"text-edit-overlay\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: cScreen.screenX - w / 2,\n\t\t\t\ttop: cScreen.screenY - h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h,\n\t\t\t\tzIndex: 20,\n\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\toverflow: \"visible\",\n\t\t\t\ttransform:\n\t\t\t\t\tMath.abs(rot) < 1e-12 ? undefined : `rotate(${(rot * 180) / Math.PI}deg)`,\n\t\t\t\ttransformOrigin: \"center center\",\n\t\t\t}}\n\t\t>\n\t\t\t<textarea\n\t\t\t\tref={taRef}\n\t\t\t\tvalue={draftText}\n\t\t\t\tonChange={(e) => onDraftChange(e.target.value)}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\taria-label=\"Edit text\"\n\t\t\t\tstyle={{\n\t\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\theight: \"100%\",\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: `${padTop}px ${padX}px 0px ${padX}px`,\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\tborderRadius: 0,\n\t\t\t\t\tresize: \"none\",\n\t\t\t\t\tfontFamily: TEXT_FONT_FAMILY,\n\t\t\t\t\tfontSize,\n\t\t\t\t\tlineHeight: `${lineHeight}px`,\n\t\t\t\t\tcolor: textColor,\n\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\tbackgroundColor: \"transparent\",\n\t\t\t\t\toutline: \"none\",\n\t\t\t\t\tboxShadow: \"none\",\n\t\t\t\t\tappearance: \"none\",\n\t\t\t\t\tWebkitAppearance: \"none\",\n\t\t\t\t\tWebkitTapHighlightColor: \"transparent\",\n\t\t\t\t\twhiteSpace: fixedBox ? \"pre-wrap\" : \"pre\",\n\t\t\t\t\toverflow: fixedBox ? \"auto\" : \"hidden\",\n\t\t\t\t\toverflowX: fixedBox ? \"hidden\" : \"hidden\",\n\t\t\t\t\twordWrap: fixedBox ? \"break-word\" : \"normal\",\n\t\t\t\t\twordBreak: fixedBox ? \"break-word\" : \"normal\",\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport type { Camera2D } from \"../camera/camera\";\nimport type { ResizeHandleId } from \"../interaction/resize-handles\";\nimport { rectFromCorners } from \"../interaction/resize-handles\";\nimport { boundsAabbForRotatedItem } from \"../math/item-transform\";\nimport type { Rect } from \"../math/rect\";\nimport { normalizeRect, rectsIntersect } from \"../math/rect\";\nimport type { VectorPathPoint, VectorSceneItem } from \"../scene/types\";\n\nexport function usePrefersReducedMotion(): boolean {\n\tconst [reduced, setReduced] = useState(false);\n\tuseEffect(() => {\n\t\tconst mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tsetReduced(mq.matches);\n\t\tconst listener = () => setReduced(mq.matches);\n\t\tmq.addEventListener(\"change\", listener);\n\t\treturn () => mq.removeEventListener(\"change\", listener);\n\t}, []);\n\treturn reduced;\n}\n\nexport const visuallyHidden: CSSProperties = {\n\tposition: \"absolute\",\n\twidth: 1,\n\theight: 1,\n\tpadding: 0,\n\tmargin: -1,\n\toverflow: \"hidden\",\n\tclip: \"rect(0, 0, 0, 0)\",\n\twhiteSpace: \"nowrap\",\n\tborder: 0,\n};\n\n/** Zoom in step factor. */\nexport const VIEWPORT_ZOOM_IN_STEP = 1.15;\n/** Zoom out step factor (reciprocal of zoom in to ensure equal sensitivity). */\nexport const VIEWPORT_ZOOM_OUT_STEP = 1 / 1.15;\n\nexport function replaceItem(\n\titems: readonly VectorSceneItem[],\n\tid: string,\n\tnext: VectorSceneItem,\n): VectorSceneItem[] {\n\treturn items.map((it) => (it.id === id ? next : it));\n}\n\nexport function supportsResizeHandles(\n\titem: VectorSceneItem | null | undefined,\n): item is VectorSceneItem & {\n\ttoolKind:\n\t\t| \"rect\"\n\t\t| \"ellipse\"\n\t\t| \"architectural-cloud\"\n\t\t| \"line\"\n\t\t| \"arrow\"\n\t\t| \"image\"\n\t\t| \"text\"\n\t\t| \"custom\"\n\t\t| \"draw\"\n\t\t| \"pencil\"\n\t\t| \"brush\"\n\t\t| \"marker\";\n} {\n\tconst k = item?.toolKind;\n\tif (\n\t\tk === \"rect\" ||\n\t\tk === \"ellipse\" ||\n\t\tk === \"architectural-cloud\" ||\n\t\tk === \"line\" ||\n\t\tk === \"arrow\" ||\n\t\tk === \"image\" ||\n\t\tk === \"text\"\n\t) {\n\t\treturn true;\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 true;\n\t}\n\treturn k === \"custom\" && !!item?.customIntrinsicSize && !!item?.customInnerSvg;\n}\n\nexport type DragState =\n\t| { kind: \"idle\" }\n\t| {\n\t\t\tkind: \"move\";\n\t\t\tids: string[];\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tsnapshots: Record<string, VectorSceneItem>;\n\t }\n\t| {\n\t\t\tkind: \"resize\";\n\t\t\tid: string;\n\t\t\thandle: ResizeHandleId;\n\t\t\tsnapshot: VectorSceneItem;\n\t\t\tstart: {\n\t\t\t\tbounds: Rect;\n\t\t\t\tline?: import(\"../scene/types\").LineEndpointsLocal;\n\t\t\t};\n\t }\n\t| {\n\t\t\tkind: \"rotate\";\n\t\t\tid: string;\n\t\t\tsnapshot: VectorSceneItem;\n\t\t\tpivotWorld: { x: number; y: number };\n\t\t\tstartPointerAngleRad: number;\n\t\t\tstartRotation: number;\n\t }\n\t| {\n\t\t\tkind: \"place\";\n\t\t\ttool: string;\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tstartScreen: { x: number; y: number };\n\t }\n\t| {\n\t\t\tkind: \"tap\";\n\t\t\ttool: \"text\" | \"image\";\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tstartScreen: { x: number; y: number };\n\t }\n\t| {\n\t\t\tkind: \"stroke\";\n\t\t\ttool: \"draw\" | \"marker\" | \"laser\";\n\t\t\tpoints: VectorPathPoint[];\n\t\t\tpointerType: string;\n\t\t\titemId?: string;\n\t\t\tstraightLine?: {\n\t\t\t\tactive: boolean;\n\t\t\t\tanchorPoint: VectorPathPoint;\n\t\t\t\tholdScreen: { x: number; y: number };\n\t\t\t\tholdTimer: number | null;\n\t\t\t};\n\t }\n\t| { kind: \"erase\" }\n\t| {\n\t\t\tkind: \"marquee\";\n\t\t\tstartWorld: { x: number; y: number };\n\t\t\tstartScreen: { x: number; y: number };\n\t\t\tshiftKey: boolean;\n\t\t\tselectionBefore: string[];\n\t };\n\nexport const MIN_PLACE_SIZE = 8;\n/** Screen px — arrow is created only by drag; a click or micro-move cancels (tldraw-style). */\nexport const MIN_ARROW_DRAG_PX = 8;\n/** World units — ignore accidental micro-drags when rubber-band selecting. */\nexport const MIN_MARQUEE_WORLD = 4;\n/** Screen px — small jitter on trackpads cancels the tap if too low. */\nexport const TAP_PX = 20;\n\nexport function collectItemIdsInRect(\n\titems: readonly VectorSceneItem[],\n\tmarqueeWorld: Rect,\n): string[] {\n\tconst m = normalizeRect(marqueeWorld);\n\tconst out: string[] = [];\n\tfor (const it of items) {\n\t\tif (it.locked) continue;\n\t\tif (rectsIntersect(normalizeRect(boundsAabbForRotatedItem(it)), m)) {\n\t\t\tout.push(it.id);\n\t\t}\n\t}\n\treturn out;\n}\n\n/** Fits {@link Camera2D} so `worldRect` is visible in a viewport of `viewportW` × `viewportH` CSS px. */\nexport function fitCameraToWorldRect(\n\tcamera: Camera2D,\n\tviewportW: number,\n\tviewportH: number,\n\tworldRect: Rect,\n\tpadding: number,\n): void {\n\tconst r = normalizeRect(worldRect);\n\tif (r.width <= 0 || r.height <= 0 || viewportW <= 0 || viewportH <= 0) {\n\t\treturn;\n\t}\n\tconst pad = Math.max(0, padding);\n\tconst neededW = r.width * (1 + 2 * pad);\n\tconst neededH = r.height * (1 + 2 * pad);\n\tconst zoomX = viewportW / neededW;\n\tconst zoomY = viewportH / neededH;\n\tlet z = Math.min(zoomX, zoomY);\n\tz = Math.min(camera.maxZoom, Math.max(camera.minZoom, z));\n\tconst cx = r.x + r.width / 2;\n\tconst cy = r.y + r.height / 2;\n\tcamera.zoom = z;\n\tcamera.x = viewportW / 2 - cx * z;\n\tcamera.y = viewportH / 2 - cy * z;\n}\n\nexport function tryPointerCaptureOnTarget(\n\ttarget: EventTarget | null,\n\tpointerId: number,\n): void {\n\tif (!target || !(target instanceof HTMLElement)) return;\n\ttry {\n\t\ttarget.setPointerCapture(pointerId);\n\t} catch {\n\t\t/* ignore */\n\t}\n}\n\nexport { cursorForVectorToolId } from \"./vector-tool-cursors\";\n\n/** When the user clicks (or barely drags), use centered default sizes instead of rejecting. */\nexport function defaultPlacementWorld(\n\ttool: string,\n\tcenter: { x: number; y: number },\n): {\n\traw: Rect;\n\tlineWorld?: [{ x: number; y: number }, { x: number; y: number }];\n} {\n\tconst cx = center.x;\n\tconst cy = center.y;\n\tif (tool === \"rect\") {\n\t\treturn { raw: { x: cx - 60, y: cy - 40, width: 120, height: 80 } };\n\t}\n\tif (tool === \"ellipse\") {\n\t\treturn { raw: { x: cx - 70, y: cy - 45, width: 140, height: 90 } };\n\t}\n\tif (tool === \"architectural-cloud\") {\n\t\treturn { raw: { x: cx - 90, y: cy - 50, width: 180, height: 100 } };\n\t}\n\tconst a = { x: cx - 50, y: cy };\n\tconst b = { x: cx + 50, y: cy };\n\treturn {\n\t\traw: rectFromCorners(a, b),\n\t\tlineWorld: [a, b],\n\t};\n}\n","\"use client\";\n\n/**\n * SVG paths for drawing tools match Lucide icons in {@link DEFAULT_VECTOR_TOOLS} (lucide-react v1.x).\n */\nconst NS = 'xmlns=\"http://www.w3.org/2000/svg\"';\nconst STROKE = \"#18181b\";\n\nfunction wrapSvg(inner: string): string {\n\treturn `<svg ${NS} width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${STROKE}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${inner}</svg>`;\n}\n\nfunction svgUrlCursor(\n\tinner: string,\n\thx: number,\n\thy: number,\n\tfallback: string,\n): string {\n\treturn `url(\"data:image/svg+xml,${encodeURIComponent(wrapSvg(inner))}\") ${hx} ${hy}, ${fallback}`;\n}\n\n/** Lucide `pen-line` */\nconst DRAW_INNER = `<path d=\"M13 21h8\"/><path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\"/>`;\n/** Lucide `highlighter` */\nconst MARKER_INNER = `<path d=\"m9 11-6 6v3h9l3-3\"/><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\"/>`;\n/** Lucide `eraser` */\nconst ERASER_INNER = `<path d=\"M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21\"/><path d=\"m5.082 11.09 8.828 8.828\"/>`;\n/**\n * CSS `cursor` for the active toolbar tool id (see default vector tools).\n * SVG cursors matching Lucide toolbar glyphs are used for freehand tools only.\n * Shape tools keep the old native crosshair cursor.\n */\nexport function cursorForVectorToolId(toolId: string): string {\n\tconst fb = \"crosshair\";\n\tswitch (toolId) {\n\t\tcase \"hand\":\n\t\t\treturn \"grab\";\n\t\tcase \"select\":\n\t\t\treturn \"default\";\n\t\tcase \"rect\":\n\t\tcase \"ellipse\":\n\t\tcase \"architectural-cloud\":\n\t\tcase \"line\":\n\t\tcase \"arrow\":\n\t\t\treturn \"crosshair\";\n\t\tcase \"draw\":\n\t\t\treturn svgUrlCursor(DRAW_INNER, 4, 18, fb);\n\t\tcase \"marker\":\n\t\t\treturn svgUrlCursor(MARKER_INNER, 11, 14, fb);\n\t\tcase \"laser\":\n\t\t\treturn \"crosshair\";\n\t\tcase \"eraser\":\n\t\t\treturn svgUrlCursor(ERASER_INNER, 12, 14, fb);\n\t\tcase \"text\":\n\t\t\treturn \"text\";\n\t\tcase \"image\":\n\t\t\treturn \"crosshair\";\n\t\tdefault:\n\t\t\treturn \"default\";\n\t}\n}\n"]}
|