canvu-react 0.3.12 → 0.3.14

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.
@@ -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/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/react/NavMenu.tsx","../src/react/VectorSelectionInspector.tsx","../src/react/VectorCanvasLayout.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/VectorToolbar.tsx","../src/camera/camera.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/clone-item.ts","../src/scene/scene.ts","../src/react/InteractionOverlay.tsx","../src/scene/freehand-path.ts","../src/react/presence/peer-color.ts","../src/react/presence/PresenceRemoteLayer.tsx","../src/react/stable-selection.ts","../src/react/TextEditOverlay.tsx","../src/react/vector-viewport-support.ts","../src/react/vector-tool-cursors.ts","../src/react/ViewportZoomControls.tsx"],"names":["base","getStroke","op","b","s","canvasToBlob","uploadResult","fullUrl","naturalTopY","bounds","itemContext","item","createContext","useContext","stroke","strokeWidth","hex","showMarkerOpacity","opacityPct","jsxs","jsx","labelStyle","useState","useRef","useCallback","Undo2","Redo2","Fragment","useMemo","useEffect","useLayoutEffect","createPortal","Hand","MousePointer2","Square","Circle","Minus","ArrowUpRight","PenLine","Highlighter","Eraser","Type","Image","Lock","LockOpen","useId","Shapes","ChevronDown","g","forwardRef","VectorViewport","items","buildRasterImageChildrenSvg","useImperativeHandle","worldX","worldY","id","pen","rootStyle","btnStyle"],"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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\n/** Escape for plain text inside HTML `foreignObject` body (not attribute). */\nfunction escapeHtmlText(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\n/** Default body font size for vector text (local SVG units). */\nexport const DEFAULT_TEXT_FONT_SIZE = 18;\nconst LINE_HEIGHT_RATIO = 22 / 18;\nconst FIRST_LINE_BASELINE_RATIO = 24 / 18;\nconst PLACEHOLDER = \"Tap to type\";\n\nconst MIN_TEXT_BOX_W = 40;\nconst MIN_TEXT_BOX_H = 36;\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/**\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 system-ui, sans-serif`;\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(8, fontSize * 0.35),\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 = \"#2563eb\",\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=\"system-ui,sans-serif\" 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=\"system-ui,sans-serif\" 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=\"system-ui,sans-serif\" 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 = \"#2563eb\",\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\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:2px 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:system-ui,sans-serif;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:2px 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:system-ui,sans-serif;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/** Resolved stroke for SVG generation. */\nexport type StrokeStyle = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n};\n\nexport const DEFAULT_STROKE_STYLE: StrokeStyle = {\n\tstroke: \"#2563eb\",\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};\n}\n\nfunction strokeOpacityAttr(style: StrokeStyle): string {\n\treturn style.strokeOpacity != null\n\t\t? ` stroke-opacity=\"${style.strokeOpacity}\"`\n\t\t: \"\";\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\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 };\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\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\treturn `<path d=\"${payload.d}\" fill=\"none\" stroke=\"${payload.stroke}\" stroke-width=\"${payload.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op} />`;\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 === \"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<Pick<VectorSceneItem, \"stroke\" | \"strokeWidth\" | \"strokeOpacity\">>,\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/** 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): 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\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\tpathPointsLocal,\n\t\tchildrenSvg: \"\",\n\t});\n}\n\nfunction escapeSvgAttr(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\");\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","const 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 new Promise((resolve, reject) => {\n\t\tcanvas.toBlob(\n\t\t\t(blob) => {\n\t\t\t\tif (!blob) {\n\t\t\t\t\treject(new Error(\"Could not encode blob\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve(blob);\n\t\t\t},\n\t\t\tmime,\n\t\t\tquality,\n\t\t);\n\t});\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 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\nfunction canvasToBlob(\n\tcanvas: HTMLCanvasElement,\n\tmime: string,\n\tquality?: number,\n): Promise<Blob> {\n\treturn new Promise((resolve, reject) => {\n\t\tcanvas.toBlob(\n\t\t\t(blob) => {\n\t\t\t\tif (!blob) {\n\t\t\t\t\treject(new Error(\"Could not encode blob\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve(blob);\n\t\t\t},\n\t\t\tmime,\n\t\t\tquality,\n\t\t);\n\t});\n}\n\ntype PdfPageResult = StoredImageResult & { pageNumber: number };\n\ntype LoadPdfToStoreOptions = {\n\tscale?: number;\n\tpageNumbers?: readonly number[];\n\tpageConcurrency?: number;\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 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\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 canvasToBlob(canvas, mime);\n\t\t\tconst blobId = await store.storeOriginal(pageBlob);\n\n\t\t\tconst thumbScale = Math.min(1, 256 / Math.max(width, height));\n\t\t\tconst tw = Math.max(1, Math.round(width * thumbScale));\n\t\t\tconst th = Math.max(1, Math.round(height * thumbScale));\n\t\t\tconst thumbCanvas = document.createElement(\"canvas\");\n\t\t\tthumbCanvas.width = tw;\n\t\t\tthumbCanvas.height = th;\n\t\t\tconst tCtx = thumbCanvas.getContext(\"2d\");\n\t\t\tif (tCtx) {\n\t\t\t\ttCtx.imageSmoothingEnabled = true;\n\t\t\t\ttCtx.imageSmoothingQuality = \"high\";\n\t\t\t\ttCtx.drawImage(canvas, 0, 0, tw, th);\n\t\t\t}\n\t\t\tconst thumbBlob = await canvasToBlob(thumbCanvas, mime);\n\t\t\tconst thumbnailBlobId = await store.storeThumbnail(thumbBlob);\n\t\t\treturn {\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},\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 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 hydrationBlobPromises = 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 getHydrationBlob(\n\tkey: string,\n\tpreferCachedRasters: boolean,\n\tloader: () => Promise<Blob | null>,\n): Promise<Blob | null> {\n\tconst cached = preferCachedRasters ? await readCachedHydrationBlob(key) : null;\n\tif (cached) return cached;\n\tconst inFlight = hydrationBlobPromises.get(key);\n\tif (inFlight) return await inFlight;\n\tconst nextPromise = (async () => {\n\t\tconst blob = await loader();\n\t\tif (blob) {\n\t\t\tawait writeCachedHydrationBlob(key, blob);\n\t\t}\n\t\treturn blob;\n\t})();\n\thydrationBlobPromises.set(key, nextPromise);\n\ttry {\n\t\treturn await nextPromise;\n\t} finally {\n\t\thydrationBlobPromises.delete(key);\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 blob = await getHydrationBlob(\n\t\t\t\tbuildImageHydrationKey(assetId),\n\t\t\t\tpreferCachedRasters,\n\t\t\t\tasync () => await fetchBlob(resolvedAsset.url),\n\t\t\t);\n\t\t\tif (!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, 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 missingPages: number[] = [];\n\t\tfor (const pageNumber of group.pageNumbers) {\n\t\t\tconst cacheKey = buildPdfHydrationKey(group.assetId, pageNumber, group.scale);\n\t\t\tconst cachedBlob = await readCachedHydrationBlob(cacheKey);\n\t\t\tif (!cachedBlob) {\n\t\t\t\tmissingPages.push(pageNumber);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thydratedPages.set(cacheKey, {\n\t\t\t\thref: registerObjectUrl(objectUrls, cachedBlob),\n\t\t\t});\n\t\t}\n\n\t\tif (missingPages.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst pdfBlob = await fetchBlob(resolvedAsset.url);\n\t\tif (!pdfBlob) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst renderedPages = await loadPdfToStore(pdfBlob, options.imageStore, {\n\t\t\tscale: group.scale,\n\t\t\tpageNumbers: missingPages,\n\t\t\tpageConcurrency: options.pdfPageConcurrency,\n\t\t});\n\n\t\tfor (const renderedPage of renderedPages) {\n\t\t\tconst cacheKey = buildPdfHydrationKey(\n\t\t\t\tgroup.assetId,\n\t\t\t\trenderedPage.pageNumber,\n\t\t\t\tgroup.scale,\n\t\t\t);\n\t\t\tconst pageBlob = await options.imageStore.getOriginal(renderedPage.blobId);\n\t\t\tif (!pageBlob) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait writeCachedHydrationBlob(cacheKey, pageBlob);\n\t\t\thydratedPages.set(cacheKey, {\n\t\t\t\thref: registerObjectUrl(objectUrls, pageBlob),\n\t\t\t\twidth: renderedPage.width,\n\t\t\t\theight: renderedPage.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\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.5` for crisp zoom while keeping payloads reasonable.\n\t */\n\tpdfScale?: number;\n\tpdfPageConcurrency?: number;\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\tworldCenter,\n\t\tassetStore,\n\t\timageStore = new IndexedDbImageStore(),\n\t\tcreateId = createShapeId,\n\t\tgapWorld = 16,\n\t\tstepWorld = 48,\n\t\tpdfScale = 1.5,\n\t\tpdfPageConcurrency = 2,\n\t\tdecorateItem,\n\t\tonError,\n\t} = options;\n\n\tconst items: VectorSceneItem[] = [];\n\tconst errors: IngestAssetFileError[] = [];\n\tlet imagePlacementIndex = 0;\n\tlet occupiedBottomY: number | null = null;\n\tlet imageYOffsetAdjustment = 0;\n\tlet hasImagePlacementBase = false;\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 [uploadResult, pages] = await Promise.all([\n\t\t\t\t\tuploadAssetIfNeeded(assetStore, file, kind),\n\t\t\t\t\tloadPdfToStore(file, imageStore, {\n\t\t\t\t\t\tscale: pdfScale,\n\t\t\t\t\t\tpageConcurrency: pdfPageConcurrency,\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t\tfor (const page of pages) {\n\t\t\t\t\tconst fullUrl = await createBlobUrlFromStore(imageStore, page.blobId);\n\t\t\t\t\tconst naturalTopY = worldCenter.y - page.height / 2;\n\t\t\t\t\tconst stackedTopY: number =\n\t\t\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\t\t\tconst bounds: {\n\t\t\t\t\t\tx: number;\n\t\t\t\t\t\ty: number;\n\t\t\t\t\t\twidth: number;\n\t\t\t\t\t\theight: number;\n\t\t\t\t\t} = {\n\t\t\t\t\t\tx: worldCenter.x - page.width / 2,\n\t\t\t\t\t\ty: Math.max(naturalTopY, stackedTopY),\n\t\t\t\t\t\twidth: page.width,\n\t\t\t\t\t\theight: page.height,\n\t\t\t\t\t};\n\t\t\t\t\tconst itemContext = {\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\titemIndex: items.length,\n\t\t\t\t\t\tpageNumber: page.pageNumber,\n\t\t\t\t\t} satisfies IngestedAssetItemContext;\n\t\t\t\t\tconst item = finalizeIngestedItem(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: createId(),\n\t\t\t\t\t\t\tx: bounds.x,\n\t\t\t\t\t\t\ty: bounds.y,\n\t\t\t\t\t\t\tbounds: { ...bounds },\n\t\t\t\t\t\t\ttoolKind: \"image\",\n\t\t\t\t\t\t\timageBlobId: page.blobId,\n\t\t\t\t\t\t\timageRasterHref: fullUrl ?? undefined,\n\t\t\t\t\t\t\timageIntrinsicSize: {\n\t\t\t\t\t\t\t\twidth: page.width,\n\t\t\t\t\t\t\t\theight: page.height,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchildrenSvg: fullUrl\n\t\t\t\t\t\t\t\t? buildRasterImageChildrenSvg(\n\t\t\t\t\t\t\t\t\t\tfullUrl,\n\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\tbounds,\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} as VectorSceneItem,\n\t\t\t\t\t\titemContext,\n\t\t\t\t\t\tuploadResult,\n\t\t\t\t\t\tdecorateItem,\n\t\t\t\t\t);\n\t\t\t\t\titems.push(item);\n\t\t\t\t\toccupiedBottomY = bounds.y + page.height;\n\t\t\t\t}\n\t\t\t\thasImagePlacementBase = false;\n\t\t\t\timagePlacementIndex = 0;\n\t\t\t\timageYOffsetAdjustment = 0;\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 ox = (imagePlacementIndex % 8) * stepWorld;\n\t\t\tconst oy = Math.floor(imagePlacementIndex / 8) * stepWorld;\n\t\t\tconst naturalTopY = worldCenter.y - height / 2 + oy;\n\t\t\tif (!hasImagePlacementBase) {\n\t\t\t\tconst minimumTopY =\n\t\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\t\timageYOffsetAdjustment = Math.max(0, minimumTopY - naturalTopY);\n\t\t\t\thasImagePlacementBase = true;\n\t\t\t}\n\t\t\tconst bounds = {\n\t\t\t\tx: worldCenter.x - width / 2 + ox,\n\t\t\t\ty: naturalTopY + imageYOffsetAdjustment,\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\timagePlacementIndex++;\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: \"draw\" | \"marker\";\n\tlabel?: string;\n};\n\nexport type CanvuChromeSelectionStyleChange = (patch: {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: 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","\"use client\";\n\nimport { Redo2, Undo2 } from \"lucide-react\";\nimport { type CSSProperties, useCallback, useRef, useState } from \"react\";\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\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./VectorCanvasLayout\";\n\n/**\n * Floating bottom-bar combining zoom controls, undo/redo, and an expandable minimap.\n * When rendered inside `VectorViewport` (e.g. via the `navMenu` slot), data props default\n * to values from {@link CanvuChromeContext}; pass any prop to override.\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};\n\nconst MINIMAP_W = 180;\nconst MINIMAP_H = 120;\nconst PADDING = 12;\nconst BORDER_RADIUS = 8;\nconst BG = \"#ffffff\";\nconst BORDER_COLOR = \"rgba(0,0,0,0.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\nconst btnStyle: React.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\nconst chevronBtnStyle: React.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\nconst undoBtnStyle: React.CSSProperties = {\n\t...chevronBtnStyle,\n\twidth: 30,\n\topacity: 1,\n\tcolor: \"#18181b\",\n};\n\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 10,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\ttextAlign: \"center\",\n\tuserSelect: \"none\",\n\tpadding: \"2px 0\",\n};\n\nconst panelLayoutStyle: React.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\nconst innerStyle: React.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\nexport function NavMenu({\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}: NavMenuProps) {\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 zoomPercent = zoomPercentProp ?? ctx?.zoomPercent ?? 100;\n\tconst onZoomIn = onZoomInProp ?? ctx?.onZoomIn ?? noop;\n\tconst onZoomOut = onZoomOutProp ?? ctx?.onZoomOut ?? noop;\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\tconst onRequestRender = onRequestRenderProp ?? ctx?.onRequestRender ?? noop;\n\n\tconst [expanded, setExpanded] = useState(false);\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\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<div style={innerStyle}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={btnStyle}\n\t\t\t\t\taria-label=\"Zoom out\"\n\t\t\t\t\ttitle=\"Zoom out\"\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onZoomOut}\n\t\t\t\t>\n\t\t\t\t\t−\n\t\t\t\t</button>\n\t\t\t\t<span style={labelStyle} aria-hidden>\n\t\t\t\t\t{zoomPercent}%\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={btnStyle}\n\t\t\t\t\taria-label=\"Zoom in\"\n\t\t\t\t\ttitle=\"Zoom in\"\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onZoomIn}\n\t\t\t\t>\n\t\t\t\t\t+\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\t\taria-label=\"Undo\"\n\t\t\t\t\ttitle=\"Undo\"\n\t\t\t\t\tdisabled={!canUndo}\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onUndo}\n\t\t\t\t>\n\t\t\t\t\t<Undo2 size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\t\taria-label=\"Redo\"\n\t\t\t\t\ttitle=\"Redo\"\n\t\t\t\t\tdisabled={!canRedo}\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onRedo}\n\t\t\t\t>\n\t\t\t\t\t<Redo2 size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={chevronBtnStyle}\n\t\t\t\t\taria-label={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\t\ttitle={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={toggleExpanded}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"12\"\n\t\t\t\t\t\theight=\"12\"\n\t\t\t\t\t\tviewBox=\"0 0 12 12\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\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\taria-hidden\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td=\"M2 4 L6 8 L10 4\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\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</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{expanded && (\n\t\t\t\t<nav aria-label=\"Minimap\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\tref={svgRef}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: MINIMAP_W,\n\t\t\t\t\t\t\theight: MINIMAP_H,\n\t\t\t\t\t\t\tborderRadius: BORDER_RADIUS,\n\t\t\t\t\t\t\tborder: `1px solid ${BORDER_COLOR}`,\n\t\t\t\t\t\t\tbackground: BG,\n\t\t\t\t\t\t\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\t\t\t\t\t\t\tcursor: isEmpty ? \"default\" : dragging ? \"grabbing\" : \"grab\",\n\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\t\tonPointerMove={handlePointerMove}\n\t\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\t\tonPointerCancel={handlePointerUp}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isEmpty ? null : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{items.map((it) => {\n\t\t\t\t\t\t\t\t\tconst b = normalizeRect(boundsAabbForRotatedItem(it));\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\tkey={it.id}\n\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\ty={toMinimapY(b.y)}\n\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\theight={toMinimapH(b.height)}\n\t\t\t\t\t\t\t\t\t\t\tfill={ITEM_FILL}\n\t\t\t\t\t\t\t\t\t\t\tstroke={ITEM_STROKE}\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={0.5}\n\t\t\t\t\t\t\t\t\t\t\trx={1}\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\t<rect\n\t\t\t\t\t\t\t\t\tx={vpMinimap.x}\n\t\t\t\t\t\t\t\t\ty={vpMinimap.y}\n\t\t\t\t\t\t\t\t\twidth={vpMinimap.width}\n\t\t\t\t\t\t\t\t\theight={vpMinimap.height}\n\t\t\t\t\t\t\t\t\tfill={VIEWPORT_FILL}\n\t\t\t\t\t\t\t\t\tstroke={VIEWPORT_STROKE}\n\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\trx={2}\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</svg>\n\t\t\t\t</nav>\n\t\t\t)}\n\t\t</fieldset>\n\t);\n}\n\nfunction noop() {}\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","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\ttype CanvuChromeSelectionStyleChange,\n\tuseCanvuChromeContext,\n} from \"./chrome-context\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./VectorCanvasLayout\";\n\ntype ActiveToolStyle = StrokeStyle & {\n\ttoolKind: \"draw\" | \"marker\";\n\tlabel?: string;\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 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: 8,\n\tminWidth: 160,\n\tpadding: \"10px 12px\",\n\tborderRadius: 8,\n\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\tbackground: \"rgba(255,255,255,0.96)\",\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tpointerEvents: \"auto\",\n};\n\nconst labelStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 4,\n\tfontSize: 11,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n};\n\nfunction normalizeHex(stroke: string): string {\n\tif (/^#[0-9A-Fa-f]{6}$/.test(stroke)) return stroke;\n\treturn \"#2563eb\";\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 === \"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\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\tconst shell: CSSProperties = {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\t...shellLook,\n\t\t...style,\n\t};\n\tif (activeToolStyle) {\n\t\tconst stroke = activeToolStyle.stroke;\n\t\tconst strokeWidth = activeToolStyle.strokeWidth;\n\t\tconst hex = normalizeHex(stroke);\n\t\tconst showMarkerOpacity = activeToolStyle.toolKind === \"marker\";\n\t\tconst opacityPct = Math.round((activeToolStyle.strokeOpacity ?? 1) * 100);\n\n\t\treturn (\n\t\t\t<section\n\t\t\t\tdata-slot=\"vector-selection-inspector\"\n\t\t\t\tdata-position={position}\n\t\t\t\tclassName={className}\n\t\t\t\taria-label={activeToolStyle.label ?? \"Estilo da ferramenta\"}\n\t\t\t\tstyle={shell}\n\t\t\t>\n\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\tCor\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\tvalue={hex}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\tstroke: e.target.value,\n\t\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t\t\t...(activeToolStyle.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t? { strokeOpacity: activeToolStyle.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}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\tpadding: 0,\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\tbackground: \"transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\tGrossura\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={strokeWidth}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\t\tstrokeWidth: Number(e.target.value),\n\t\t\t\t\t\t\t\t...(activeToolStyle.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t? { strokeOpacity: activeToolStyle.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}\n\t\t\t\t\t/>\n\t\t\t\t\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{strokeWidth}px</span>\n\t\t\t\t</label>\n\t\t\t\t{showMarkerOpacity && (\n\t\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\t\tOpacidade (marcador)\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\t\tvalue={opacityPct}\n\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\tconst v = Number(e.target.value) / 100;\n\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t\t\t\tstrokeOpacity: v,\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<span style={{ fontWeight: 500, color: \"#71717a\" }}>{opacityPct}%</span>\n\t\t\t\t\t</label>\n\t\t\t\t)}\n\t\t\t</section>\n\t\t);\n\t}\n\n\tconst stylable = items.filter(\n\t\t(it) => !it.locked && it.toolKind && isStylableKind(it.toolKind),\n\t);\n\tif (stylable.length === 0) return null;\n\n\tconst first = stylable[0];\n\tif (!first) return null;\n\tconst allSameStroke = stylable.every(\n\t\t(it) => (it.stroke ?? \"#2563eb\") === (first.stroke ?? \"#2563eb\"),\n\t);\n\tconst allSameWidth = stylable.every(\n\t\t(it) => (it.strokeWidth ?? 2) === (first.strokeWidth ?? 2),\n\t);\n\tconst stroke = first.stroke ?? \"#2563eb\";\n\tconst strokeWidth = first.strokeWidth ?? 2;\n\tconst hex = normalizeHex(stroke);\n\n\tconst markers = stylable.filter((it) => it.toolKind === \"marker\");\n\tconst showMarkerOpacity = markers.length > 0;\n\tconst firstMarker = markers[0];\n\tconst allSameMarkerOpacity =\n\t\tmarkers.length > 0 &&\n\t\tmarkers.every(\n\t\t\t(it) => (it.strokeOpacity ?? 1) === (firstMarker?.strokeOpacity ?? 1),\n\t\t);\n\tconst opacityPct = firstMarker\n\t\t? Math.round((firstMarker.strokeOpacity ?? 1) * 100)\n\t\t: 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=\"Estilo da seleção\"\n\t\t\tstyle={shell}\n\t\t>\n\t\t\t{stylable.length > 1 && (\n\t\t\t\t<p style={{ margin: 0, fontSize: 11, color: \"#71717a\" }}>\n\t\t\t\t\t{stylable.length} objetos selecionados\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<label style={labelStyle}>\n\t\t\t\tCor\n\t\t\t\t{!allSameStroke && (\n\t\t\t\t\t<span style={{ fontWeight: 400, color: \"#a1a1aa\" }}>\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t(valores misturados — novo valor aplica a todos)\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"color\"\n\t\t\t\t\tvalue={hex}\n\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\tstroke: e.target.value,\n\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</label>\n\t\t\t<label style={labelStyle}>\n\t\t\t\tGrossura\n\t\t\t\t{!allSameWidth && (\n\t\t\t\t\t<span style={{ fontWeight: 400, color: \"#a1a1aa\" }}> (misturado)</span>\n\t\t\t\t)}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\tmin={1}\n\t\t\t\t\tmax={48}\n\t\t\t\t\tvalue={strokeWidth}\n\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\tstrokeWidth: Number(e.target.value),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{strokeWidth}px</span>\n\t\t\t</label>\n\t\t\t{showMarkerOpacity && firstMarker && (\n\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\tOpacidade (marcador)\n\t\t\t\t\t{!allSameMarkerOpacity && markers.length > 1 && (\n\t\t\t\t\t\t<span style={{ fontWeight: 400, color: \"#a1a1aa\" }}> (misturado)</span>\n\t\t\t\t\t)}\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) => {\n\t\t\t\t\t\t\tconst v = Number(e.target.value) / 100;\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t\t\tstrokeOpacity: v,\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\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{opacityPct}%</span>\n\t\t\t\t</label>\n\t\t\t)}\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { NavMenu } from \"./NavMenu\";\nimport { VectorSelectionInspector } from \"./VectorSelectionInspector\";\n\nexport type VectorCanvasSlotProps = {\n\tchildren?: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\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\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","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/** Revoke all blob URLs on items and optionally clean stale blobs. */\n\tconst revokedHrefs = new Set<string>();\n\n\tfunction revokeItemBlob(item: VectorSceneItem): VectorSceneItem {\n\t\tif (item.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\trevokedHrefs.add(item.imageRasterHref);\n\t\t}\n\t\tif (item.imageThumbnailHref?.startsWith(\"blob:\")) {\n\t\t\trevokedHrefs.add(item.imageThumbnailHref);\n\t\t}\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\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// Revoke previous blob URLs\n\t\t\tfor (const href of revokedHrefs) {\n\t\t\t\tURL.revokeObjectURL(href);\n\t\t\t}\n\t\t\trevokedHrefs.clear();\n\n\t\t\t// Strip blob URLs from items before persisting\n\t\t\tconst cleanItems = snapshot.items.map(revokeItemBlob);\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 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 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 { 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\"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: \"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 { ChevronDown, Lock, LockOpen, Shapes } from \"lucide-react\";\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\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}. */\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 */\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. */\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 * Full control: render your own toolbar using the same tool list and selection API.\n\t * When set, default buttons are not rendered.\n\t */\n\tchildren?: (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\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`;\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.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\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\nconst icOverflow = { size: 18, strokeWidth: 2 } as const;\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\nfunction ToolbarOverflowMenu({\n\ttools,\n\tselectedId,\n\tonSelect,\n\tdensity,\n\tbuttonClassName,\n\tactiveButtonClassName,\n\trenderToolButton,\n\tmenuAriaLabel,\n}: OverflowMenuProps) {\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 activeInOverflow = tools.some((t) => t.id === selectedId);\n\tconst activeTool = tools.find((t) => t.id === selectedId);\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\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\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tbackground: \"rgba(24,24,27,0.1)\",\n\t\t\t\t\t\t\t\t\tborderColor: \"rgba(24,24,27,0.28)\",\n\t\t\t\t\t\t\t\t\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\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\tborderColor: \"transparent\",\n\t\t\t\t\t\t\t\t\tboxShadow: \"none\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={(ev) => {\n\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\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\tconst selected = tool.id === selectedId;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={tool.id}\n\t\t\t\t\t\t\t\tclassName=\"vector-toolbar-overflow-cell\"\n\t\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renderToolButton({\n\t\t\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\t\t\tselected,\n\t\t\t\t\t\t\t\t\tonSelect: () => {\n\t\t\t\t\t\t\t\t\t\tonSelect(tool.id);\n\t\t\t\t\t\t\t\t\t\tclose();\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</div>\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\tconst selected = tool.id === selectedId;\n\t\t\t\t\t\tconst label = tool.ariaLabel ?? tool.label;\n\t\t\t\t\t\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={tool.id} className=\"vector-toolbar-overflow-cell\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\trole=\"menuitemradio\"\n\t\t\t\t\t\t\t\t\taria-checked={selected}\n\t\t\t\t\t\t\t\t\ttabIndex={index === 0 ? 0 : -1}\n\t\t\t\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\tstyle={overflowGridCellButtonStyle}\n\t\t\t\t\t\t\t\t\tonPointerDown={(ev) => {\n\t\t\t\t\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\t\t\t\t\tev.preventDefault();\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\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tonSelect(tool.id);\n\t\t\t\t\t\t\t\t\t\tclose();\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<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tlineHeight: 0,\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\t\t{tool.icon ?? (\n\t\t\t\t\t\t\t\t\t\t\t<span\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\tfontSize: \"11px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1.1,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"34px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\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\t\t{tool.label.slice(0, 3)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<span className=\"vector-toolbar-overflow-tip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<span>{tooltipName}</span>\n\t\t\t\t\t\t\t\t\t{tool.shortcutHint !== undefined ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"vector-toolbar-overflow-tip-shortcut\">\n\t\t\t\t\t\t\t\t\t\t\t{tool.shortcutHint}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\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 * Supply your own `tools` array or `children` render prop for full customization.\n *\n * @example\n * ```tsx\n * const [tool, setTool] = useState(\"hand\");\n * <VectorToolbar value={tool} onChange={setTool} aria-label=\"Canvas tools\" />\n * ```\n */\nexport function VectorToolbar({\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\tconst ctx: VectorToolbarRenderContext = {\n\t\ttools: resolvedTools,\n\t\tselectedId: value,\n\t\tselectTool: onChange,\n\t\ttoolLocked,\n\t\tsetToolLocked: (locked: boolean) => onToolLockedChange?.(locked),\n\t};\n\n\tif (children) {\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 { primary: primaryTools, overflow: overflowTools } = splitToolbarTools(\n\t\tresolvedTools,\n\t\toverflowToolIds,\n\t);\n\n\tconst flexDir = orientation === \"vertical\" ? \"column\" : \"row\";\n\tconst showOverflowMenu = overflowTools.length > 0;\n\n\tconst toolbarClass =\n\t\tclassName.trim() === \"\"\n\t\t\t? \"vector-toolbar\"\n\t\t\t: `vector-toolbar ${className.trim()}`;\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\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: \"rgba(24,24,27,0.1)\",\n\t\t\t\t\t\t\t\t\t\t\t\tborderColor: \"rgba(24,24,27,0.28)\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\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\t\tborderColor: \"transparent\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"none\",\n\t\t\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\tonPointerDown={(ev) => {\n\t\t\t\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\t\t\t\tev.preventDefault();\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\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) => {\n\t\t\t\t\tconst selected = tool.id === value;\n\t\t\t\t\tconst label = tool.ariaLabel ?? tool.label;\n\n\t\t\t\t\tif (renderToolButton) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={tool.id}>\n\t\t\t\t\t\t\t\t{renderToolButton({\n\t\t\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\t\t\tselected,\n\t\t\t\t\t\t\t\t\tonSelect: () => onChange(tool.id),\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);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\t\t\t\t\tconst tooltipText =\n\t\t\t\t\t\ttool.shortcutHint !== undefined\n\t\t\t\t\t\t\t? `${tooltipName} · ${tool.shortcutHint}`\n\t\t\t\t\t\t\t: tooltipName;\n\n\t\t\t\t\tconst labelOnly = tool.icon == null;\n\t\t\t\t\tconst labelTextStyle: CSSProperties = labelOnly\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tfontSize: \"12px\",\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\n\t\t\t\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\t\t\t\tWebkitFontSmoothing: \"antialiased\",\n\t\t\t\t\t\t\t\tMozOsxFontSmoothing: \"grayscale\",\n\t\t\t\t\t\t\t\ttextRendering: \"geometricPrecision\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {};\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span key={tool.id} 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={selected}\n\t\t\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\tclassName={`${buttonClassName} ${selected ? 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: labelOnly ? \"52px\" : \"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...(selected\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: \"rgba(24,24,27,0.1)\",\n\t\t\t\t\t\t\t\t\t\t\t\tborderColor: \"rgba(24,24,27,0.28)\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\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\t\tborderColor: \"transparent\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"none\",\n\t\t\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\tonPointerDown={(ev) => {\n\t\t\t\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\t\t\t\tev.preventDefault();\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\tonClick={() => onChange(tool.id)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\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{tool.icon ?? <span style={labelTextStyle}>{tool.label}</span>}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{density === \"comfortable\" && tool.icon ? (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"56px\",\n\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\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\t\t{tool.label}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : null}\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{tooltipText}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t);\n\t\t\t\t})}\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{showOverflowMenu ? (\n\t\t\t\t\t<ToolbarOverflowMenu\n\t\t\t\t\t\ttools={overflowTools}\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","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 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\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\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\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} 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\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\tmode = \"idle\";\n\t\t\tpanLast = null;\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}\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\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\";\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 wheelDeltaYPixels(e: WheelEvent): number {\n\tswitch (e.deltaMode) {\n\t\tcase WheelEvent.DOM_DELTA_LINE:\n\t\t\treturn e.deltaY * 16;\n\t\tcase WheelEvent.DOM_DELTA_PAGE:\n\t\t\treturn e.deltaY * 400;\n\t\tdefault:\n\t\t\treturn e.deltaY;\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\n\tconst onWheel = (e: WheelEvent) => {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tconst dy = wheelDeltaYPixels(e);\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) < 20 ? 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\tcamera.x -= (e.deltaX * wheelPanSensitivity) / camera.zoom;\n\t\tcamera.y -= (e.deltaY * 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\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\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\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\tmode = \"idle\";\n\t\t\tpanLast = null;\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}\n\t};\n\n\tconst onPointerCancel = (e: PointerEvent) => {\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\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 === \"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\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 === \"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 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 { VectorScene } from \"../scene/scene\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport {\n\tapplyStrokeToItem,\n\tapplyTextDraftWhileEditing,\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 type {\n\tArrowBindings,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"../scene/types\";\nimport { ingestAssetFilesToSceneItems } from \"./asset-ingestion\";\nimport type { VectorViewportAssetStore } from \"./asset-store\";\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 = true;\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 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\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\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 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 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 resolvedSceneItemsRef =\n\t\t\tuseRef<readonly VectorSceneItem[]>(resolvedSceneItems);\n\t\tresolvedSceneItemsRef.current = resolvedSceneItems;\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 strokeStyleRef = useRef<StrokeStyle>({ ...DEFAULT_STROKE_STYLE });\n\t\tconst [strokeStyleState, setStrokeStyleState] = useState<StrokeStyle>({\n\t\t\t...DEFAULT_STROKE_STYLE,\n\t\t});\n\t\tconst setCurrentStrokeStyle = useCallback((next: StrokeStyle) => {\n\t\t\tstrokeStyleRef.current = next;\n\t\t\tsetStrokeStyleState(next);\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, imageThumbnailHref } = existing;\n\t\t\t\t\t\t// Only swap if thumbnail is still the one showing\n\t\t\t\t\t\tconst needsSwap = imageThumbnailHref?.startsWith(\"blob:\");\n\t\t\t\t\t\tif (needsSwap && imageThumbnailHref) {\n\t\t\t\t\t\t\tURL.revokeObjectURL(imageThumbnailHref);\n\t\t\t\t\t\t}\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\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\tsetCurrentStrokeStyle({\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\t...(item.strokeOpacity != null\n\t\t\t\t\t\t\t? { strokeOpacity: item.strokeOpacity }\n\t\t\t\t\t\t\t: {}),\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\trequestAutoResetTool,\n\t\t\t\tsetCurrentStrokeStyle,\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 scene = sceneRef.current;\n\t\t\t\tconst renderer = rendererRef.current;\n\t\t\t\tif (!scene || !renderer) return;\n\t\t\t\tconst base = resolvedSceneItemsRef.current;\n\t\t\t\tscene.setItems(item ? [...base, item] : base);\n\t\t\t\trenderer.render();\n\t\t\t},\n\t\t\t[],\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\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\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\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\tuseEffect(() => {\n\t\t\tonPlacementPreviewChangeRef.current?.(placementPreview);\n\t\t}, [placementPreview]);\n\n\t\tuseEffect(() => {\n\t\t\tconst scene = sceneRef.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\tconst currentLive = livePenStrokeItemRef.current;\n\t\t\t\tscene.setItems(\n\t\t\t\t\tcurrentLive ? [...resolvedSceneItems, currentLive] : resolvedSceneItems,\n\t\t\t\t);\n\t\t\t\trenderFrame();\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\tconst itemsSnapshotForBlobRef = useRef<readonly VectorSceneItem[]>([]);\n\t\tuseEffect(() => {\n\t\t\tconst prev = itemsSnapshotForBlobRef.current;\n\t\t\titemsSnapshotForBlobRef.current = items;\n\t\t\tconst blobHrefs = (list: readonly VectorSceneItem[]) => {\n\t\t\t\tconst s = new Set<string>();\n\t\t\t\tfor (const it of list) {\n\t\t\t\t\tif (it.toolKind === \"image\" && it.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\t\t\t\ts.add(it.imageRasterHref);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn s;\n\t\t\t};\n\t\t\tconst before = blobHrefs(prev);\n\t\t\tconst after = blobHrefs(items);\n\t\t\tfor (const href of before) {\n\t\t\t\tif (!after.has(href)) {\n\t\t\t\t\tURL.revokeObjectURL(href);\n\t\t\t\t}\n\t\t\t}\n\t\t}, [items]);\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\tactivePenPointerIds.add(e.pointerId);\n\t\t\t\tsyncPenActive();\n\t\t\t};\n\t\t\tconst suppressTouchUiEvent = (e: Event) => {\n\t\t\t\tif (!penDetectedRef.current) 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\tif (toolId === \"marker\") {\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\t...strokeStyleRef.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\tconst current = strokeStyleRef.current;\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});\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});\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\tconst next: StrokeStyle = {\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};\n\t\t\tif (it.strokeOpacity != null) {\n\t\t\t\tnext.strokeOpacity = it.strokeOpacity;\n\t\t\t}\n\t\t\tsetCurrentStrokeStyle(next);\n\t\t}, [effectiveSelectedIds, items, setCurrentStrokeStyle]);\n\n\t\tconst handleSelectionStyleChange = useCallback(\n\t\t\t(patch: { stroke: string; strokeWidth: number; strokeOpacity?: number }) => {\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\tsetCurrentStrokeStyle({\n\t\t\t\t\t...strokeStyleRef.current,\n\t\t\t\t\tstroke: patch.stroke,\n\t\t\t\t\tstrokeWidth: patch.strokeWidth,\n\t\t\t\t\t...(patch.strokeOpacity != null\n\t\t\t\t\t\t? { strokeOpacity: patch.strokeOpacity }\n\t\t\t\t\t\t: {}),\n\t\t\t\t});\n\t\t\t},\n\t\t\t[setCurrentStrokeStyle],\n\t\t);\n\n\t\tconst handleActiveToolStyleChange = useCallback(\n\t\t\t(patch: { stroke: string; strokeWidth: number; strokeOpacity?: number }) => {\n\t\t\t\tconst current = strokeStyleRef.current;\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\tstroke: patch.stroke,\n\t\t\t\t\tstrokeWidth: patch.strokeWidth,\n\t\t\t\t\t...(patch.strokeOpacity != null\n\t\t\t\t\t\t? { strokeOpacity: patch.strokeOpacity }\n\t\t\t\t\t\t: current.strokeOpacity != null\n\t\t\t\t\t\t\t? { strokeOpacity: current.strokeOpacity }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t});\n\t\t\t},\n\t\t\t[setCurrentStrokeStyle],\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 (files: File[], worldX: number, worldY: number) => {\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\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\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});\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\tchange([...itemsRef.current, ...result.items]);\n\t\t\t\t\tsetEffectiveSelectedIdsRef.current(result.items.map((item) => item.id));\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 file = e.target.files?.[0];\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 (!file || !pending) return;\n\t\t\t\tawait placeImageFilesAtWorld([file], 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},\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\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?.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 selectedArrowOrLine = 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(\n\t\t\t\t\t\t\t\t(it): it is VectorSceneItem =>\n\t\t\t\t\t\t\t\t\tit != null &&\n\t\t\t\t\t\t\t\t\t!it.locked &&\n\t\t\t\t\t\t\t\t\t(it.toolKind === \"line\" || it.toolKind === \"arrow\"),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tselectedArrowOrLine.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 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\tdragStateRef.current = {\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};\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} 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});\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 === \"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\tfinalizeStrokeDragState,\n\t\t\t\trenderSceneWithLivePenStroke,\n\t\t\t\tscreenToWorld,\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 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\tdragStateRef.current = {\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};\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\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\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\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 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\tdragStateRef.current = {\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};\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\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 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}\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\tconst completedPoints = appendTouchToStrokePoints(\n\t\t\t\t\t\tst.points,\n\t\t\t\t\t\ttouch,\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 = completedPoints;\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\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\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 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\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});\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 === \"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 === \"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 = 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 = completedPoints;\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 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 - 24,\n\t\t\t\t\t\t\t\twidth: 160,\n\t\t\t\t\t\t\t\theight: 36,\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);\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 === \"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\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]);\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\") return undefined;\n\t\t\treturn {\n\t\t\t\ttoolKind: \"draw\" as const,\n\t\t\t\tlabel: \"Estilo da ferramenta\",\n\t\t\t\t...strokeStyleState,\n\t\t\t};\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\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\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 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}\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.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 {\n\tbuildArrowSvg,\n\tcreateShapeId,\n\trebuildItemSvg,\n\tresolveStrokeStyle,\n} from \"./shape-builders\";\nimport type { VectorSceneItem } from \"./types\";\n\n/**\n * Deep-clones an item with a new id. Rebuilds SVG where the id is embedded (arrow, text, custom).\n */\nexport function cloneVectorSceneItemWithNewId(\n\titem: VectorSceneItem,\n): VectorSceneItem {\n\tconst id = createShapeId();\n\tconst copy = JSON.parse(JSON.stringify(item)) as VectorSceneItem;\n\tlet next: VectorSceneItem = { ...copy, id };\n\tif (next.toolKind === \"arrow\" && next.line) {\n\t\tnext = {\n\t\t\t...next,\n\t\t\tchildrenSvg: buildArrowSvg(id, next.line, resolveStrokeStyle(next)),\n\t\t};\n\t}\n\tif (next.toolKind === \"text\" && next.text !== undefined) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\tif (\n\t\tnext.toolKind === \"custom\" &&\n\t\tnext.customInnerSvg &&\n\t\tnext.customIntrinsicSize\n\t) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\treturn next;\n}\n\nexport function cloneVectorSceneItemsWithNewIds(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\treturn items.map(cloneVectorSceneItemWithNewId);\n}\n","import type { 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","\"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\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\"; 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 };\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) {\n\t\t\tconst r = normalizeRect(placementPreview.rect);\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\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"#64748b\"\n\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\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=\"#64748b\"\n\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\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 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\toverlayStrokePx,\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=\"#64748b\"\n\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\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=\"#64748b\"\n\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\tstrokeOpacity={0.9}\n\t\t\t\t\t\t\tstrokeDasharray={dashPattern}\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};\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\tfalse,\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\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","/**\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","\"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 { 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\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 paint = strokePaint(markup.tool, color);\n\t\t\t\t\t\tconst d =\n\t\t\t\t\t\t\tmarkup.points.length >= 2\n\t\t\t\t\t\t\t\t? smoothFreehandPointsToPathD([...markup.points])\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\tif (d) {\n\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={paint.stroke}\n\t\t\t\t\t\t\t\t\tstrokeOpacity={paint.strokeOpacity}\n\t\t\t\t\t\t\t\t\tstrokeWidth={Math.max(paint.widthWorld / z, 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\tshapeRendering=\"geometricPrecision\"\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);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst p0 = markup.points[0];\n\t\t\t\t\t\t\tif (p0) {\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={p0.x}\n\t\t\t\t\t\t\t\t\t\tcy={p0.y}\n\t\t\t\t\t\t\t\t\t\tr={Math.max(3 / z, 2)}\n\t\t\t\t\t\t\t\t\t\tfill={paint.stroke}\n\t\t\t\t\t\t\t\t\t\tfillOpacity={paint.strokeOpacity}\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}\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=\"#ffffff\"\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.25}\n\t\t\t\t\t\t\t\t\t\tabsoluteStrokeWidth\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\tstroke=\"#ffffff\"\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={2.5 / z}\n\t\t\t\t\t\t\t\t\t\tpaintOrder=\"stroke\"\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 * 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 { DEFAULT_TEXT_FONT_SIZE } 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\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: 2,\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: \"system-ui, sans-serif\",\n\t\t\t\t\tfontSize,\n\t\t\t\t\tlineHeight: `${lineHeight}px`,\n\t\t\t\t\tcolor: \"#0f172a\",\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\t/* Auto-sized text: no soft wrap / scrollbar; fixed box: wrap like the SVG. */\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| \"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 === \"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 }\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\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 \"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","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./VectorCanvasLayout\";\n\nexport type ViewportZoomControlsProps = {\n\t/** Current zoom for display, e.g. from `Math.round(camera.zoom * 100)`. */\n\tzoomPercent: number;\n\tonZoomIn: () => void;\n\tonZoomOut: () => void;\n\tclassName?: string;\n\t/** Anchor preset. Pass to relocate the floating control. */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from anchored edges. @default 12 */\n\tinset?: number;\n\t/** @default 22 */\n\tzIndex?: number;\n\t/** Merged on top of position-derived styles for custom tweaks. */\n\tstyle?: CSSProperties;\n};\n\n/** Default anchor — sits above the {@link NavMenu}/{@link VectorMinimap} on the bottom-left. */\nconst DEFAULT_SHELL_STYLE: CSSProperties = {\n\tposition: \"absolute\",\n\tleft: 12,\n\tbottom: 140,\n\tzIndex: 22,\n};\n\nconst layoutStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 4,\n\t/* Let clicks pass through the flex gaps; buttons opt in below. */\n\tpointerEvents: \"none\",\n};\n\nconst btnStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\twidth: 36,\n\theight: 36,\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tborderRadius: 8,\n\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\tbackground: \"rgba(255,255,255,0.96)\",\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tcursor: \"pointer\",\n\tfontSize: 18,\n\tlineHeight: 1,\n\tfontWeight: 600,\n\tcolor: \"#18181b\",\n\tpadding: 0,\n\toutline: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\nconst labelStyle: CSSProperties = {\n\tpointerEvents: \"none\",\n\tfontSize: 10,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\ttextAlign: \"center\",\n\tuserSelect: \"none\",\n\tpadding: \"2px 0\",\n};\n\n/** Reset default fieldset chrome so layout matches the previous `div` shell. */\nconst fieldsetReset: CSSProperties = {\n\tborder: \"none\",\n\tmargin: 0,\n\tpadding: 0,\n\tminWidth: 0,\n};\n\n/**\n * Floating zoom +/- controls. Defaults to the bottom-left, above the minimap.\n * Place inside the viewport root (position relative). Pass `position` for any of the\n * {@link BoardComponentPosition} presets, or `className`/`style` to fully customize.\n */\nexport function ViewportZoomControls({\n\tzoomPercent,\n\tonZoomIn,\n\tonZoomOut,\n\tclassName = \"\",\n\tposition,\n\tinset = 12,\n\tzIndex = 22,\n\tstyle,\n}: ViewportZoomControlsProps) {\n\tconst anchorStyle: CSSProperties =\n\t\tposition !== undefined\n\t\t\t? getBoardPositionStyle(position, inset, zIndex)\n\t\t\t: DEFAULT_SHELL_STYLE;\n\treturn (\n\t\t<fieldset\n\t\t\tclassName={className}\n\t\t\tdata-position={position ?? \"default\"}\n\t\t\taria-label=\"Zoom controls\"\n\t\t\tstyle={{ ...anchorStyle, ...layoutStyle, ...fieldsetReset, ...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 in\"\n\t\t\t\ttitle=\"Zoom in\"\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\tonClick={onZoomIn}\n\t\t\t>\n\t\t\t\t+\n\t\t\t</button>\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={(e) => {\n\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t}}\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</fieldset>\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/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/react/NavMenu.tsx","../src/react/VectorSelectionInspector.tsx","../src/react/VectorCanvasLayout.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/VectorToolbar.tsx","../src/camera/camera.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/clone-item.ts","../src/scene/scene.ts","../src/react/InteractionOverlay.tsx","../src/scene/freehand-path.ts","../src/react/presence/peer-color.ts","../src/react/presence/PresenceRemoteLayer.tsx","../src/react/stable-selection.ts","../src/react/TextEditOverlay.tsx","../src/react/vector-viewport-support.ts","../src/react/vector-tool-cursors.ts","../src/react/ViewportZoomControls.tsx"],"names":["base","getStroke","op","b","s","canvasToBlob","uploadResult","fullUrl","naturalTopY","bounds","itemContext","item","createContext","useContext","stroke","strokeWidth","hex","showMarkerOpacity","opacityPct","jsxs","jsx","labelStyle","useState","useRef","useCallback","Undo2","Redo2","Fragment","useMemo","useEffect","useLayoutEffect","createPortal","Hand","MousePointer2","Square","Circle","Minus","ArrowUpRight","PenLine","Highlighter","Eraser","Type","Image","Lock","LockOpen","useId","Shapes","ChevronDown","g","forwardRef","VectorViewport","items","buildRasterImageChildrenSvg","useImperativeHandle","worldX","worldY","id","pen","rootStyle","btnStyle"],"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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\n/** Escape for plain text inside HTML `foreignObject` body (not attribute). */\nfunction escapeHtmlText(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\n/** Default body font size for vector text (local SVG units). */\nexport const DEFAULT_TEXT_FONT_SIZE = 18;\nconst LINE_HEIGHT_RATIO = 22 / 18;\nconst FIRST_LINE_BASELINE_RATIO = 24 / 18;\nconst PLACEHOLDER = \"Tap to type\";\n\nconst MIN_TEXT_BOX_W = 40;\nconst MIN_TEXT_BOX_H = 36;\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/**\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 system-ui, sans-serif`;\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(8, fontSize * 0.35),\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 = \"#2563eb\",\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=\"system-ui,sans-serif\" 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=\"system-ui,sans-serif\" 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=\"system-ui,sans-serif\" 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 = \"#2563eb\",\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\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:2px 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:system-ui,sans-serif;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:2px 4px;font-size:${fontSize}px;line-height:${lh}px;font-family:system-ui,sans-serif;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/** Resolved stroke for SVG generation. */\nexport type StrokeStyle = {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: number;\n};\n\nexport const DEFAULT_STROKE_STYLE: StrokeStyle = {\n\tstroke: \"#2563eb\",\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};\n}\n\nfunction strokeOpacityAttr(style: StrokeStyle): string {\n\treturn style.strokeOpacity != null\n\t\t? ` stroke-opacity=\"${style.strokeOpacity}\"`\n\t\t: \"\";\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\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 };\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\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\treturn `<path d=\"${payload.d}\" fill=\"none\" stroke=\"${payload.stroke}\" stroke-width=\"${payload.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" shape-rendering=\"geometricPrecision\"${op} />`;\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 === \"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<Pick<VectorSceneItem, \"stroke\" | \"strokeWidth\" | \"strokeOpacity\">>,\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/** 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): 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\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\tpathPointsLocal,\n\t\tchildrenSvg: \"\",\n\t});\n}\n\nfunction escapeSvgAttr(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\");\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","const 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 new Promise((resolve, reject) => {\n\t\tcanvas.toBlob(\n\t\t\t(blob) => {\n\t\t\t\tif (!blob) {\n\t\t\t\t\treject(new Error(\"Could not encode blob\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve(blob);\n\t\t\t},\n\t\t\tmime,\n\t\t\tquality,\n\t\t);\n\t});\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 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\nfunction canvasToBlob(\n\tcanvas: HTMLCanvasElement,\n\tmime: string,\n\tquality?: number,\n): Promise<Blob> {\n\treturn new Promise((resolve, reject) => {\n\t\tcanvas.toBlob(\n\t\t\t(blob) => {\n\t\t\t\tif (!blob) {\n\t\t\t\t\treject(new Error(\"Could not encode blob\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve(blob);\n\t\t\t},\n\t\t\tmime,\n\t\t\tquality,\n\t\t);\n\t});\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 canvasToBlob(canvas, 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 canvasToBlob(thumbCanvas, mime);\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\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\tworldCenter,\n\t\tassetStore,\n\t\timageStore = new IndexedDbImageStore(),\n\t\tcreateId = createShapeId,\n\t\tgapWorld = 16,\n\t\tstepWorld = 48,\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 imagePlacementIndex = 0;\n\tlet occupiedBottomY: number | null = null;\n\tlet imageYOffsetAdjustment = 0;\n\tlet hasImagePlacementBase = false;\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\thasImagePlacementBase = false;\n\t\t\t\timagePlacementIndex = 0;\n\t\t\t\timageYOffsetAdjustment = 0;\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 ox = (imagePlacementIndex % 8) * stepWorld;\n\t\t\tconst oy = Math.floor(imagePlacementIndex / 8) * stepWorld;\n\t\t\tconst naturalTopY = worldCenter.y - height / 2 + oy;\n\t\t\tif (!hasImagePlacementBase) {\n\t\t\t\tconst minimumTopY =\n\t\t\t\t\toccupiedBottomY == null ? naturalTopY : occupiedBottomY + gapWorld;\n\t\t\t\timageYOffsetAdjustment = Math.max(0, minimumTopY - naturalTopY);\n\t\t\t\thasImagePlacementBase = true;\n\t\t\t}\n\t\t\tconst bounds = {\n\t\t\t\tx: worldCenter.x - width / 2 + ox,\n\t\t\t\ty: naturalTopY + imageYOffsetAdjustment,\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\timagePlacementIndex++;\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: \"draw\" | \"marker\";\n\tlabel?: string;\n};\n\nexport type CanvuChromeSelectionStyleChange = (patch: {\n\tstroke: string;\n\tstrokeWidth: number;\n\tstrokeOpacity?: 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","\"use client\";\n\nimport { Redo2, Undo2 } from \"lucide-react\";\nimport { type CSSProperties, useCallback, useRef, useState } from \"react\";\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\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./VectorCanvasLayout\";\n\n/**\n * Floating bottom-bar combining zoom controls, undo/redo, and an expandable minimap.\n * When rendered inside `VectorViewport` (e.g. via the `navMenu` slot), data props default\n * to values from {@link CanvuChromeContext}; pass any prop to override.\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};\n\nconst MINIMAP_W = 180;\nconst MINIMAP_H = 120;\nconst PADDING = 12;\nconst BORDER_RADIUS = 8;\nconst BG = \"#ffffff\";\nconst BORDER_COLOR = \"rgba(0,0,0,0.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\nconst btnStyle: React.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\nconst chevronBtnStyle: React.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\nconst undoBtnStyle: React.CSSProperties = {\n\t...chevronBtnStyle,\n\twidth: 30,\n\topacity: 1,\n\tcolor: \"#18181b\",\n};\n\nconst labelStyle: React.CSSProperties = {\n\tfontSize: 10,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\ttextAlign: \"center\",\n\tuserSelect: \"none\",\n\tpadding: \"2px 0\",\n};\n\nconst panelLayoutStyle: React.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\nconst innerStyle: React.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\nexport function NavMenu({\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}: NavMenuProps) {\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 zoomPercent = zoomPercentProp ?? ctx?.zoomPercent ?? 100;\n\tconst onZoomIn = onZoomInProp ?? ctx?.onZoomIn ?? noop;\n\tconst onZoomOut = onZoomOutProp ?? ctx?.onZoomOut ?? noop;\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\tconst onRequestRender = onRequestRenderProp ?? ctx?.onRequestRender ?? noop;\n\n\tconst [expanded, setExpanded] = useState(false);\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\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<div style={innerStyle}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={btnStyle}\n\t\t\t\t\taria-label=\"Zoom out\"\n\t\t\t\t\ttitle=\"Zoom out\"\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onZoomOut}\n\t\t\t\t>\n\t\t\t\t\t−\n\t\t\t\t</button>\n\t\t\t\t<span style={labelStyle} aria-hidden>\n\t\t\t\t\t{zoomPercent}%\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={btnStyle}\n\t\t\t\t\taria-label=\"Zoom in\"\n\t\t\t\t\ttitle=\"Zoom in\"\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onZoomIn}\n\t\t\t\t>\n\t\t\t\t\t+\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\t\taria-label=\"Undo\"\n\t\t\t\t\ttitle=\"Undo\"\n\t\t\t\t\tdisabled={!canUndo}\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onUndo}\n\t\t\t\t>\n\t\t\t\t\t<Undo2 size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={undoBtnStyle}\n\t\t\t\t\taria-label=\"Redo\"\n\t\t\t\t\ttitle=\"Redo\"\n\t\t\t\t\tdisabled={!canRedo}\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={onRedo}\n\t\t\t\t>\n\t\t\t\t\t<Redo2 size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={chevronBtnStyle}\n\t\t\t\t\taria-label={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\t\ttitle={expanded ? \"Hide minimap\" : \"Show minimap\"}\n\t\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={toggleExpanded}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"12\"\n\t\t\t\t\t\theight=\"12\"\n\t\t\t\t\t\tviewBox=\"0 0 12 12\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: expanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\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\taria-hidden\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td=\"M2 4 L6 8 L10 4\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\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</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{expanded && (\n\t\t\t\t<nav aria-label=\"Minimap\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\tref={svgRef}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: MINIMAP_W,\n\t\t\t\t\t\t\theight: MINIMAP_H,\n\t\t\t\t\t\t\tborderRadius: BORDER_RADIUS,\n\t\t\t\t\t\t\tborder: `1px solid ${BORDER_COLOR}`,\n\t\t\t\t\t\t\tbackground: BG,\n\t\t\t\t\t\t\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\t\t\t\t\t\t\tcursor: isEmpty ? \"default\" : dragging ? \"grabbing\" : \"grab\",\n\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\tpointerEvents: \"auto\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\t\tonPointerMove={handlePointerMove}\n\t\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\t\tonPointerCancel={handlePointerUp}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isEmpty ? null : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{items.map((it) => {\n\t\t\t\t\t\t\t\t\tconst b = normalizeRect(boundsAabbForRotatedItem(it));\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\tkey={it.id}\n\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\ty={toMinimapY(b.y)}\n\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\theight={toMinimapH(b.height)}\n\t\t\t\t\t\t\t\t\t\t\tfill={ITEM_FILL}\n\t\t\t\t\t\t\t\t\t\t\tstroke={ITEM_STROKE}\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={0.5}\n\t\t\t\t\t\t\t\t\t\t\trx={1}\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\t<rect\n\t\t\t\t\t\t\t\t\tx={vpMinimap.x}\n\t\t\t\t\t\t\t\t\ty={vpMinimap.y}\n\t\t\t\t\t\t\t\t\twidth={vpMinimap.width}\n\t\t\t\t\t\t\t\t\theight={vpMinimap.height}\n\t\t\t\t\t\t\t\t\tfill={VIEWPORT_FILL}\n\t\t\t\t\t\t\t\t\tstroke={VIEWPORT_STROKE}\n\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\trx={2}\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</svg>\n\t\t\t\t</nav>\n\t\t\t)}\n\t\t</fieldset>\n\t);\n}\n\nfunction noop() {}\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","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport type { VectorSceneItem } from \"../scene/types\";\nimport {\n\ttype CanvuChromeSelectionStyleChange,\n\tuseCanvuChromeContext,\n} from \"./chrome-context\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./VectorCanvasLayout\";\n\ntype ActiveToolStyle = StrokeStyle & {\n\ttoolKind: \"draw\" | \"marker\";\n\tlabel?: string;\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 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: 8,\n\tminWidth: 160,\n\tpadding: \"10px 12px\",\n\tborderRadius: 8,\n\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\tbackground: \"rgba(255,255,255,0.96)\",\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tpointerEvents: \"auto\",\n};\n\nconst labelStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 4,\n\tfontSize: 11,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n};\n\nfunction normalizeHex(stroke: string): string {\n\tif (/^#[0-9A-Fa-f]{6}$/.test(stroke)) return stroke;\n\treturn \"#2563eb\";\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 === \"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\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\tconst shell: CSSProperties = {\n\t\t...getBoardPositionStyle(position, inset, zIndex),\n\t\t...shellLook,\n\t\t...style,\n\t};\n\tif (activeToolStyle) {\n\t\tconst stroke = activeToolStyle.stroke;\n\t\tconst strokeWidth = activeToolStyle.strokeWidth;\n\t\tconst hex = normalizeHex(stroke);\n\t\tconst showMarkerOpacity = activeToolStyle.toolKind === \"marker\";\n\t\tconst opacityPct = Math.round((activeToolStyle.strokeOpacity ?? 1) * 100);\n\n\t\treturn (\n\t\t\t<section\n\t\t\t\tdata-slot=\"vector-selection-inspector\"\n\t\t\t\tdata-position={position}\n\t\t\t\tclassName={className}\n\t\t\t\taria-label={activeToolStyle.label ?? \"Estilo da ferramenta\"}\n\t\t\t\tstyle={shell}\n\t\t\t>\n\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\tCor\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\tvalue={hex}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\tstroke: e.target.value,\n\t\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t\t\t...(activeToolStyle.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t? { strokeOpacity: activeToolStyle.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}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\tpadding: 0,\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\tbackground: \"transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\tGrossura\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={strokeWidth}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\t\tstrokeWidth: Number(e.target.value),\n\t\t\t\t\t\t\t\t...(activeToolStyle.strokeOpacity != null\n\t\t\t\t\t\t\t\t\t? { strokeOpacity: activeToolStyle.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}\n\t\t\t\t\t/>\n\t\t\t\t\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{strokeWidth}px</span>\n\t\t\t\t</label>\n\t\t\t\t{showMarkerOpacity && (\n\t\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\t\tOpacidade (marcador)\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\t\tvalue={opacityPct}\n\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\tconst v = Number(e.target.value) / 100;\n\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t\t\t\tstrokeOpacity: v,\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<span style={{ fontWeight: 500, color: \"#71717a\" }}>{opacityPct}%</span>\n\t\t\t\t\t</label>\n\t\t\t\t)}\n\t\t\t</section>\n\t\t);\n\t}\n\n\tconst stylable = items.filter(\n\t\t(it) => !it.locked && it.toolKind && isStylableKind(it.toolKind),\n\t);\n\tif (stylable.length === 0) return null;\n\n\tconst first = stylable[0];\n\tif (!first) return null;\n\tconst allSameStroke = stylable.every(\n\t\t(it) => (it.stroke ?? \"#2563eb\") === (first.stroke ?? \"#2563eb\"),\n\t);\n\tconst allSameWidth = stylable.every(\n\t\t(it) => (it.strokeWidth ?? 2) === (first.strokeWidth ?? 2),\n\t);\n\tconst stroke = first.stroke ?? \"#2563eb\";\n\tconst strokeWidth = first.strokeWidth ?? 2;\n\tconst hex = normalizeHex(stroke);\n\n\tconst markers = stylable.filter((it) => it.toolKind === \"marker\");\n\tconst showMarkerOpacity = markers.length > 0;\n\tconst firstMarker = markers[0];\n\tconst allSameMarkerOpacity =\n\t\tmarkers.length > 0 &&\n\t\tmarkers.every(\n\t\t\t(it) => (it.strokeOpacity ?? 1) === (firstMarker?.strokeOpacity ?? 1),\n\t\t);\n\tconst opacityPct = firstMarker\n\t\t? Math.round((firstMarker.strokeOpacity ?? 1) * 100)\n\t\t: 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=\"Estilo da seleção\"\n\t\t\tstyle={shell}\n\t\t>\n\t\t\t{stylable.length > 1 && (\n\t\t\t\t<p style={{ margin: 0, fontSize: 11, color: \"#71717a\" }}>\n\t\t\t\t\t{stylable.length} objetos selecionados\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<label style={labelStyle}>\n\t\t\t\tCor\n\t\t\t\t{!allSameStroke && (\n\t\t\t\t\t<span style={{ fontWeight: 400, color: \"#a1a1aa\" }}>\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t(valores misturados — novo valor aplica a todos)\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"color\"\n\t\t\t\t\tvalue={hex}\n\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\tstroke: e.target.value,\n\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</label>\n\t\t\t<label style={labelStyle}>\n\t\t\t\tGrossura\n\t\t\t\t{!allSameWidth && (\n\t\t\t\t\t<span style={{ fontWeight: 400, color: \"#a1a1aa\" }}> (misturado)</span>\n\t\t\t\t)}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\tmin={1}\n\t\t\t\t\tmax={48}\n\t\t\t\t\tvalue={strokeWidth}\n\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\tstrokeWidth: Number(e.target.value),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{strokeWidth}px</span>\n\t\t\t</label>\n\t\t\t{showMarkerOpacity && firstMarker && (\n\t\t\t\t<label style={labelStyle}>\n\t\t\t\t\tOpacidade (marcador)\n\t\t\t\t\t{!allSameMarkerOpacity && markers.length > 1 && (\n\t\t\t\t\t\t<span style={{ fontWeight: 400, color: \"#a1a1aa\" }}> (misturado)</span>\n\t\t\t\t\t)}\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) => {\n\t\t\t\t\t\t\tconst v = Number(e.target.value) / 100;\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\tstroke: hex,\n\t\t\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\t\t\tstrokeOpacity: v,\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\t<span style={{ fontWeight: 500, color: \"#71717a\" }}>{opacityPct}%</span>\n\t\t\t\t</label>\n\t\t\t)}\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { NavMenu } from \"./NavMenu\";\nimport { VectorSelectionInspector } from \"./VectorSelectionInspector\";\n\nexport type VectorCanvasSlotProps = {\n\tchildren?: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\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\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","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/** Revoke all blob URLs on items and optionally clean stale blobs. */\n\tconst revokedHrefs = new Set<string>();\n\n\tfunction revokeItemBlob(item: VectorSceneItem): VectorSceneItem {\n\t\tif (item.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\trevokedHrefs.add(item.imageRasterHref);\n\t\t}\n\t\tif (item.imageThumbnailHref?.startsWith(\"blob:\")) {\n\t\t\trevokedHrefs.add(item.imageThumbnailHref);\n\t\t}\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\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// Revoke previous blob URLs\n\t\t\tfor (const href of revokedHrefs) {\n\t\t\t\tURL.revokeObjectURL(href);\n\t\t\t}\n\t\t\trevokedHrefs.clear();\n\n\t\t\t// Strip blob URLs from items before persisting\n\t\t\tconst cleanItems = snapshot.items.map(revokeItemBlob);\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 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 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 { 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\"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: \"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 { ChevronDown, Lock, LockOpen, Shapes } from \"lucide-react\";\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\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}. */\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 */\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. */\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 * Full control: render your own toolbar using the same tool list and selection API.\n\t * When set, default buttons are not rendered.\n\t */\n\tchildren?: (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\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`;\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.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\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\nconst icOverflow = { size: 18, strokeWidth: 2 } as const;\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\nfunction ToolbarOverflowMenu({\n\ttools,\n\tselectedId,\n\tonSelect,\n\tdensity,\n\tbuttonClassName,\n\tactiveButtonClassName,\n\trenderToolButton,\n\tmenuAriaLabel,\n}: OverflowMenuProps) {\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 activeInOverflow = tools.some((t) => t.id === selectedId);\n\tconst activeTool = tools.find((t) => t.id === selectedId);\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\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\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tbackground: \"rgba(24,24,27,0.1)\",\n\t\t\t\t\t\t\t\t\tborderColor: \"rgba(24,24,27,0.28)\",\n\t\t\t\t\t\t\t\t\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\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\tborderColor: \"transparent\",\n\t\t\t\t\t\t\t\t\tboxShadow: \"none\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t}}\n\t\t\t\t\tonPointerDown={(ev) => {\n\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\tev.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\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\tconst selected = tool.id === selectedId;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={tool.id}\n\t\t\t\t\t\t\t\tclassName=\"vector-toolbar-overflow-cell\"\n\t\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renderToolButton({\n\t\t\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\t\t\tselected,\n\t\t\t\t\t\t\t\t\tonSelect: () => {\n\t\t\t\t\t\t\t\t\t\tonSelect(tool.id);\n\t\t\t\t\t\t\t\t\t\tclose();\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</div>\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\tconst selected = tool.id === selectedId;\n\t\t\t\t\t\tconst label = tool.ariaLabel ?? tool.label;\n\t\t\t\t\t\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={tool.id} className=\"vector-toolbar-overflow-cell\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\trole=\"menuitemradio\"\n\t\t\t\t\t\t\t\t\taria-checked={selected}\n\t\t\t\t\t\t\t\t\ttabIndex={index === 0 ? 0 : -1}\n\t\t\t\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\t\tstyle={overflowGridCellButtonStyle}\n\t\t\t\t\t\t\t\t\tonPointerDown={(ev) => {\n\t\t\t\t\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\t\t\t\t\tev.preventDefault();\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\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tonSelect(tool.id);\n\t\t\t\t\t\t\t\t\t\tclose();\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<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\t\t\t\t\tlineHeight: 0,\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\t\t{tool.icon ?? (\n\t\t\t\t\t\t\t\t\t\t\t<span\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\tfontSize: \"11px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1.1,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"34px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\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\t\t{tool.label.slice(0, 3)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<span className=\"vector-toolbar-overflow-tip\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<span>{tooltipName}</span>\n\t\t\t\t\t\t\t\t\t{tool.shortcutHint !== undefined ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"vector-toolbar-overflow-tip-shortcut\">\n\t\t\t\t\t\t\t\t\t\t\t{tool.shortcutHint}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\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 * Supply your own `tools` array or `children` render prop for full customization.\n *\n * @example\n * ```tsx\n * const [tool, setTool] = useState(\"hand\");\n * <VectorToolbar value={tool} onChange={setTool} aria-label=\"Canvas tools\" />\n * ```\n */\nexport function VectorToolbar({\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\tconst ctx: VectorToolbarRenderContext = {\n\t\ttools: resolvedTools,\n\t\tselectedId: value,\n\t\tselectTool: onChange,\n\t\ttoolLocked,\n\t\tsetToolLocked: (locked: boolean) => onToolLockedChange?.(locked),\n\t};\n\n\tif (children) {\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 { primary: primaryTools, overflow: overflowTools } = splitToolbarTools(\n\t\tresolvedTools,\n\t\toverflowToolIds,\n\t);\n\n\tconst flexDir = orientation === \"vertical\" ? \"column\" : \"row\";\n\tconst showOverflowMenu = overflowTools.length > 0;\n\n\tconst toolbarClass =\n\t\tclassName.trim() === \"\"\n\t\t\t? \"vector-toolbar\"\n\t\t\t: `vector-toolbar ${className.trim()}`;\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\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: \"rgba(24,24,27,0.1)\",\n\t\t\t\t\t\t\t\t\t\t\t\tborderColor: \"rgba(24,24,27,0.28)\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\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\t\tborderColor: \"transparent\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"none\",\n\t\t\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\tonPointerDown={(ev) => {\n\t\t\t\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\t\t\t\tev.preventDefault();\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\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) => {\n\t\t\t\t\tconst selected = tool.id === value;\n\t\t\t\t\tconst label = tool.ariaLabel ?? tool.label;\n\n\t\t\t\t\tif (renderToolButton) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={tool.id}>\n\t\t\t\t\t\t\t\t{renderToolButton({\n\t\t\t\t\t\t\t\t\ttool,\n\t\t\t\t\t\t\t\t\tselected,\n\t\t\t\t\t\t\t\t\tonSelect: () => onChange(tool.id),\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);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst tooltipName = tool.tooltipLabel ?? tool.label;\n\t\t\t\t\tconst tooltipText =\n\t\t\t\t\t\ttool.shortcutHint !== undefined\n\t\t\t\t\t\t\t? `${tooltipName} · ${tool.shortcutHint}`\n\t\t\t\t\t\t\t: tooltipName;\n\n\t\t\t\t\tconst labelOnly = tool.icon == null;\n\t\t\t\t\tconst labelTextStyle: CSSProperties = labelOnly\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tfontSize: \"12px\",\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\n\t\t\t\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\t\t\t\tWebkitFontSmoothing: \"antialiased\",\n\t\t\t\t\t\t\t\tMozOsxFontSmoothing: \"grayscale\",\n\t\t\t\t\t\t\t\ttextRendering: \"geometricPrecision\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {};\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span key={tool.id} 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={selected}\n\t\t\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\t\t\t{...(tool.shortcutHint !== undefined\n\t\t\t\t\t\t\t\t\t? { \"aria-keyshortcuts\": tool.shortcutHint }\n\t\t\t\t\t\t\t\t\t: {})}\n\t\t\t\t\t\t\t\tclassName={`${buttonClassName} ${selected ? 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: labelOnly ? \"52px\" : \"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...(selected\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: \"rgba(24,24,27,0.1)\",\n\t\t\t\t\t\t\t\t\t\t\t\tborderColor: \"rgba(24,24,27,0.28)\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"inset 0 0 0 1px rgba(24,24,27,0.08)\",\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\t\tborderColor: \"transparent\",\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"none\",\n\t\t\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\tonPointerDown={(ev) => {\n\t\t\t\t\t\t\t\t\tif (ev.pointerType === \"mouse\") {\n\t\t\t\t\t\t\t\t\t\tev.preventDefault();\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\tonClick={() => onChange(tool.id)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\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{tool.icon ?? <span style={labelTextStyle}>{tool.label}</span>}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{density === \"comfortable\" && tool.icon ? (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"56px\",\n\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\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\t\t{tool.label}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : null}\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{tooltipText}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t);\n\t\t\t\t})}\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{showOverflowMenu ? (\n\t\t\t\t\t<ToolbarOverflowMenu\n\t\t\t\t\t\ttools={overflowTools}\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","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 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\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\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\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} 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\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\tmode = \"idle\";\n\t\t\tpanLast = null;\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}\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\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\";\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 wheelDeltaYPixels(e: WheelEvent): number {\n\tswitch (e.deltaMode) {\n\t\tcase WheelEvent.DOM_DELTA_LINE:\n\t\t\treturn e.deltaY * 16;\n\t\tcase WheelEvent.DOM_DELTA_PAGE:\n\t\t\treturn e.deltaY * 400;\n\t\tdefault:\n\t\t\treturn e.deltaY;\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\n\tconst onWheel = (e: WheelEvent) => {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\te.preventDefault();\n\t\t\tconst dy = wheelDeltaYPixels(e);\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) < 20 ? 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\tcamera.x -= (e.deltaX * wheelPanSensitivity) / camera.zoom;\n\t\tcamera.y -= (e.deltaY * 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\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\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\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\tmode = \"idle\";\n\t\t\tpanLast = null;\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}\n\t};\n\n\tconst onPointerCancel = (e: PointerEvent) => {\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\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 === \"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\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 === \"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 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 { VectorScene } from \"../scene/scene\";\nimport type { StrokeStyle } from \"../scene/shape-builders\";\nimport {\n\tapplyStrokeToItem,\n\tapplyTextDraftWhileEditing,\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 type {\n\tArrowBindings,\n\tVectorPathPoint,\n\tVectorSceneItem,\n} from \"../scene/types\";\nimport { ingestAssetFilesToSceneItems } from \"./asset-ingestion\";\nimport type { VectorViewportAssetStore } from \"./asset-store\";\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 = true;\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 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\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\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 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 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 resolvedSceneItemsRef =\n\t\t\tuseRef<readonly VectorSceneItem[]>(resolvedSceneItems);\n\t\tresolvedSceneItemsRef.current = resolvedSceneItems;\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 strokeStyleRef = useRef<StrokeStyle>({ ...DEFAULT_STROKE_STYLE });\n\t\tconst [strokeStyleState, setStrokeStyleState] = useState<StrokeStyle>({\n\t\t\t...DEFAULT_STROKE_STYLE,\n\t\t});\n\t\tconst setCurrentStrokeStyle = useCallback((next: StrokeStyle) => {\n\t\t\tstrokeStyleRef.current = next;\n\t\t\tsetStrokeStyleState(next);\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, imageThumbnailHref } = existing;\n\t\t\t\t\t\t// Only swap if thumbnail is still the one showing\n\t\t\t\t\t\tconst needsSwap = imageThumbnailHref?.startsWith(\"blob:\");\n\t\t\t\t\t\tif (needsSwap && imageThumbnailHref) {\n\t\t\t\t\t\t\tURL.revokeObjectURL(imageThumbnailHref);\n\t\t\t\t\t\t}\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\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\tsetCurrentStrokeStyle({\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\t...(item.strokeOpacity != null\n\t\t\t\t\t\t\t? { strokeOpacity: item.strokeOpacity }\n\t\t\t\t\t\t\t: {}),\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\trequestAutoResetTool,\n\t\t\t\tsetCurrentStrokeStyle,\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 scene = sceneRef.current;\n\t\t\t\tconst renderer = rendererRef.current;\n\t\t\t\tif (!scene || !renderer) return;\n\t\t\t\tconst base = resolvedSceneItemsRef.current;\n\t\t\t\tscene.setItems(item ? [...base, item] : base);\n\t\t\t\trenderer.render();\n\t\t\t},\n\t\t\t[],\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\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\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\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\tuseEffect(() => {\n\t\t\tonPlacementPreviewChangeRef.current?.(placementPreview);\n\t\t}, [placementPreview]);\n\n\t\tuseEffect(() => {\n\t\t\tconst scene = sceneRef.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\tconst currentLive = livePenStrokeItemRef.current;\n\t\t\t\tscene.setItems(\n\t\t\t\t\tcurrentLive ? [...resolvedSceneItems, currentLive] : resolvedSceneItems,\n\t\t\t\t);\n\t\t\t\trenderFrame();\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\tconst itemsSnapshotForBlobRef = useRef<readonly VectorSceneItem[]>([]);\n\t\tuseEffect(() => {\n\t\t\tconst prev = itemsSnapshotForBlobRef.current;\n\t\t\titemsSnapshotForBlobRef.current = items;\n\t\t\tconst blobHrefs = (list: readonly VectorSceneItem[]) => {\n\t\t\t\tconst s = new Set<string>();\n\t\t\t\tfor (const it of list) {\n\t\t\t\t\tif (it.toolKind === \"image\" && it.imageRasterHref?.startsWith(\"blob:\")) {\n\t\t\t\t\t\ts.add(it.imageRasterHref);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn s;\n\t\t\t};\n\t\t\tconst before = blobHrefs(prev);\n\t\t\tconst after = blobHrefs(items);\n\t\t\tfor (const href of before) {\n\t\t\t\tif (!after.has(href)) {\n\t\t\t\t\tURL.revokeObjectURL(href);\n\t\t\t\t}\n\t\t\t}\n\t\t}, [items]);\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\tactivePenPointerIds.add(e.pointerId);\n\t\t\t\tsyncPenActive();\n\t\t\t};\n\t\t\tconst suppressTouchUiEvent = (e: Event) => {\n\t\t\t\tif (!penDetectedRef.current) 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\tif (toolId === \"marker\") {\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\t...strokeStyleRef.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\tconst current = strokeStyleRef.current;\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});\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});\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\tconst next: StrokeStyle = {\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};\n\t\t\tif (it.strokeOpacity != null) {\n\t\t\t\tnext.strokeOpacity = it.strokeOpacity;\n\t\t\t}\n\t\t\tsetCurrentStrokeStyle(next);\n\t\t}, [effectiveSelectedIds, items, setCurrentStrokeStyle]);\n\n\t\tconst handleSelectionStyleChange = useCallback(\n\t\t\t(patch: { stroke: string; strokeWidth: number; strokeOpacity?: number }) => {\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\tsetCurrentStrokeStyle({\n\t\t\t\t\t...strokeStyleRef.current,\n\t\t\t\t\tstroke: patch.stroke,\n\t\t\t\t\tstrokeWidth: patch.strokeWidth,\n\t\t\t\t\t...(patch.strokeOpacity != null\n\t\t\t\t\t\t? { strokeOpacity: patch.strokeOpacity }\n\t\t\t\t\t\t: {}),\n\t\t\t\t});\n\t\t\t},\n\t\t\t[setCurrentStrokeStyle],\n\t\t);\n\n\t\tconst handleActiveToolStyleChange = useCallback(\n\t\t\t(patch: { stroke: string; strokeWidth: number; strokeOpacity?: number }) => {\n\t\t\t\tconst current = strokeStyleRef.current;\n\t\t\t\tsetCurrentStrokeStyle({\n\t\t\t\t\tstroke: patch.stroke,\n\t\t\t\t\tstrokeWidth: patch.strokeWidth,\n\t\t\t\t\t...(patch.strokeOpacity != null\n\t\t\t\t\t\t? { strokeOpacity: patch.strokeOpacity }\n\t\t\t\t\t\t: current.strokeOpacity != null\n\t\t\t\t\t\t\t? { strokeOpacity: current.strokeOpacity }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t});\n\t\t\t},\n\t\t\t[setCurrentStrokeStyle],\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 (files: File[], worldX: number, worldY: number) => {\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\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\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 file = e.target.files?.[0];\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 (!file || !pending) return;\n\t\t\t\tawait placeImageFilesAtWorld([file], 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},\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\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?.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 selectedArrowOrLine = 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(\n\t\t\t\t\t\t\t\t(it): it is VectorSceneItem =>\n\t\t\t\t\t\t\t\t\tit != null &&\n\t\t\t\t\t\t\t\t\t!it.locked &&\n\t\t\t\t\t\t\t\t\t(it.toolKind === \"line\" || it.toolKind === \"arrow\"),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tselectedArrowOrLine.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 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\tdragStateRef.current = {\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};\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} 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});\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 === \"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\tfinalizeStrokeDragState,\n\t\t\t\trenderSceneWithLivePenStroke,\n\t\t\t\tscreenToWorld,\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 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\tdragStateRef.current = {\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};\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\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\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\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 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\tdragStateRef.current = {\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};\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\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 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}\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\tconst completedPoints = appendTouchToStrokePoints(\n\t\t\t\t\t\tst.points,\n\t\t\t\t\t\ttouch,\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 = completedPoints;\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\tfinalizeStrokeDragState,\n\t\t\tinteractive,\n\t\t\trenderSceneWithLivePenStroke,\n\t\t\tscreenToWorld,\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 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\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});\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 === \"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 === \"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 = 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 = completedPoints;\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 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 - 24,\n\t\t\t\t\t\t\t\twidth: 160,\n\t\t\t\t\t\t\t\theight: 36,\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);\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 === \"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\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]);\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\") return undefined;\n\t\t\treturn {\n\t\t\t\ttoolKind: \"draw\" as const,\n\t\t\t\tlabel: \"Estilo da ferramenta\",\n\t\t\t\t...strokeStyleState,\n\t\t\t};\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\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\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 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}\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.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 {\n\tbuildArrowSvg,\n\tcreateShapeId,\n\trebuildItemSvg,\n\tresolveStrokeStyle,\n} from \"./shape-builders\";\nimport type { VectorSceneItem } from \"./types\";\n\n/**\n * Deep-clones an item with a new id. Rebuilds SVG where the id is embedded (arrow, text, custom).\n */\nexport function cloneVectorSceneItemWithNewId(\n\titem: VectorSceneItem,\n): VectorSceneItem {\n\tconst id = createShapeId();\n\tconst copy = JSON.parse(JSON.stringify(item)) as VectorSceneItem;\n\tlet next: VectorSceneItem = { ...copy, id };\n\tif (next.toolKind === \"arrow\" && next.line) {\n\t\tnext = {\n\t\t\t...next,\n\t\t\tchildrenSvg: buildArrowSvg(id, next.line, resolveStrokeStyle(next)),\n\t\t};\n\t}\n\tif (next.toolKind === \"text\" && next.text !== undefined) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\tif (\n\t\tnext.toolKind === \"custom\" &&\n\t\tnext.customInnerSvg &&\n\t\tnext.customIntrinsicSize\n\t) {\n\t\treturn rebuildItemSvg(next);\n\t}\n\treturn next;\n}\n\nexport function cloneVectorSceneItemsWithNewIds(\n\titems: readonly VectorSceneItem[],\n): VectorSceneItem[] {\n\treturn items.map(cloneVectorSceneItemWithNewId);\n}\n","import type { 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","\"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\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\"; 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 };\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) {\n\t\t\tconst r = normalizeRect(placementPreview.rect);\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\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"#64748b\"\n\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\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=\"#64748b\"\n\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t\t/>\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 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\toverlayStrokePx,\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=\"#64748b\"\n\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\tstrokeDasharray={dashPattern}\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\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=\"#64748b\"\n\t\t\t\t\t\t\tstrokeWidth={overlayStrokePx}\n\t\t\t\t\t\t\tstrokeOpacity={0.9}\n\t\t\t\t\t\t\tstrokeDasharray={dashPattern}\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};\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\tfalse,\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\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","/**\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","\"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 { 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\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 paint = strokePaint(markup.tool, color);\n\t\t\t\t\t\tconst d =\n\t\t\t\t\t\t\tmarkup.points.length >= 2\n\t\t\t\t\t\t\t\t? smoothFreehandPointsToPathD([...markup.points])\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\tif (d) {\n\t\t\t\t\t\t\tstrokeNode = (\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td={d}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={paint.stroke}\n\t\t\t\t\t\t\t\t\tstrokeOpacity={paint.strokeOpacity}\n\t\t\t\t\t\t\t\t\tstrokeWidth={Math.max(paint.widthWorld / z, 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\tshapeRendering=\"geometricPrecision\"\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);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst p0 = markup.points[0];\n\t\t\t\t\t\t\tif (p0) {\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={p0.x}\n\t\t\t\t\t\t\t\t\t\tcy={p0.y}\n\t\t\t\t\t\t\t\t\t\tr={Math.max(3 / z, 2)}\n\t\t\t\t\t\t\t\t\t\tfill={paint.stroke}\n\t\t\t\t\t\t\t\t\t\tfillOpacity={paint.strokeOpacity}\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}\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=\"#ffffff\"\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.25}\n\t\t\t\t\t\t\t\t\t\tabsoluteStrokeWidth\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\tstroke=\"#ffffff\"\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={2.5 / z}\n\t\t\t\t\t\t\t\t\t\tpaintOrder=\"stroke\"\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 * 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 { DEFAULT_TEXT_FONT_SIZE } 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\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: 2,\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: \"system-ui, sans-serif\",\n\t\t\t\t\tfontSize,\n\t\t\t\t\tlineHeight: `${lineHeight}px`,\n\t\t\t\t\tcolor: \"#0f172a\",\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\t/* Auto-sized text: no soft wrap / scrollbar; fixed box: wrap like the SVG. */\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| \"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 === \"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 }\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\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 \"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","\"use client\";\n\nimport type { CSSProperties } from \"react\";\nimport {\n\ttype BoardComponentPosition,\n\tgetBoardPositionStyle,\n} from \"./VectorCanvasLayout\";\n\nexport type ViewportZoomControlsProps = {\n\t/** Current zoom for display, e.g. from `Math.round(camera.zoom * 100)`. */\n\tzoomPercent: number;\n\tonZoomIn: () => void;\n\tonZoomOut: () => void;\n\tclassName?: string;\n\t/** Anchor preset. Pass to relocate the floating control. */\n\tposition?: BoardComponentPosition;\n\t/** Distance (px) from anchored edges. @default 12 */\n\tinset?: number;\n\t/** @default 22 */\n\tzIndex?: number;\n\t/** Merged on top of position-derived styles for custom tweaks. */\n\tstyle?: CSSProperties;\n};\n\n/** Default anchor — sits above the {@link NavMenu}/{@link VectorMinimap} on the bottom-left. */\nconst DEFAULT_SHELL_STYLE: CSSProperties = {\n\tposition: \"absolute\",\n\tleft: 12,\n\tbottom: 140,\n\tzIndex: 22,\n};\n\nconst layoutStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 4,\n\t/* Let clicks pass through the flex gaps; buttons opt in below. */\n\tpointerEvents: \"none\",\n};\n\nconst btnStyle: CSSProperties = {\n\tpointerEvents: \"auto\",\n\twidth: 36,\n\theight: 36,\n\tdisplay: \"inline-flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\tborderRadius: 8,\n\tborder: \"1px solid rgba(0,0,0,0.12)\",\n\tbackground: \"rgba(255,255,255,0.96)\",\n\tboxShadow: \"0 1px 3px rgba(0,0,0,0.08)\",\n\tcursor: \"pointer\",\n\tfontSize: 18,\n\tlineHeight: 1,\n\tfontWeight: 600,\n\tcolor: \"#18181b\",\n\tpadding: 0,\n\toutline: \"none\",\n\tWebkitTapHighlightColor: \"transparent\",\n};\n\nconst labelStyle: CSSProperties = {\n\tpointerEvents: \"none\",\n\tfontSize: 10,\n\tfontWeight: 600,\n\tcolor: \"#52525b\",\n\ttextAlign: \"center\",\n\tuserSelect: \"none\",\n\tpadding: \"2px 0\",\n};\n\n/** Reset default fieldset chrome so layout matches the previous `div` shell. */\nconst fieldsetReset: CSSProperties = {\n\tborder: \"none\",\n\tmargin: 0,\n\tpadding: 0,\n\tminWidth: 0,\n};\n\n/**\n * Floating zoom +/- controls. Defaults to the bottom-left, above the minimap.\n * Place inside the viewport root (position relative). Pass `position` for any of the\n * {@link BoardComponentPosition} presets, or `className`/`style` to fully customize.\n */\nexport function ViewportZoomControls({\n\tzoomPercent,\n\tonZoomIn,\n\tonZoomOut,\n\tclassName = \"\",\n\tposition,\n\tinset = 12,\n\tzIndex = 22,\n\tstyle,\n}: ViewportZoomControlsProps) {\n\tconst anchorStyle: CSSProperties =\n\t\tposition !== undefined\n\t\t\t? getBoardPositionStyle(position, inset, zIndex)\n\t\t\t: DEFAULT_SHELL_STYLE;\n\treturn (\n\t\t<fieldset\n\t\t\tclassName={className}\n\t\t\tdata-position={position ?? \"default\"}\n\t\t\taria-label=\"Zoom controls\"\n\t\t\tstyle={{ ...anchorStyle, ...layoutStyle, ...fieldsetReset, ...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 in\"\n\t\t\t\ttitle=\"Zoom in\"\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\tonClick={onZoomIn}\n\t\t\t>\n\t\t\t\t+\n\t\t\t</button>\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={(e) => {\n\t\t\t\t\tif (e.pointerType === \"mouse\") e.preventDefault();\n\t\t\t\t}}\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</fieldset>\n\t);\n}\n"]}