@mocanvas/mocanvas 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shapes/spline-helpers.ts","../src/shapes/arrow-helpers.ts","../src/bindings/arrow-terminals.ts","../src/shapes/shape-theme.ts","../src/shapes/text-helpers.ts","../src/text/TextMeasure.ts","../src/text/TextEditor.tsx","../src/text/text-layout.ts","../src/shapes/elbow-helpers.ts","../src/shapes/prop-access.ts","../src/shapes/svg-path.ts","../src/shapes/ArrowShapeUtil.tsx","../src/shapes/BookmarkShapeUtil.tsx","../src/shapes/EmbedShapeUtil.tsx","../src/shapes/FrameShapeUtil.tsx","../src/shapes/geo-helpers.ts","../src/shapes/GeoShapeUtil.tsx","../src/shapes/NoteShapeUtil.tsx","../src/text/TextTexture.ts","../src/shapes/TextShapeUtil.tsx","../src/shapes/VideoShapeUtil.tsx","../src/export/svg-utils.ts","../src/export/text-svg.ts","../src/export/shape-svg.ts","../src/export/svg.ts","../src/export/image.ts","../src/install.ts","../src/shapes/draw-helpers.ts","../src/shapes/DrawShapeUtil.tsx","../src/shapes/ImageShapeUtil.tsx","../src/shapes/LineShapeUtil.tsx","../src/shapes/GroupShapeUtil.tsx","../src/shapes/index.ts","../src/bindings/ArrowBindingUtil.ts","../src/bindings/index.ts","../src/tools/ArrowTool.ts","../src/tools/DrawTool.ts","../src/tools/EraserTool.ts","../src/tools/FrameTool.ts","../src/tools/GeoTool.ts","../src/tools/HandTool.ts","../src/tools/LineTool.ts","../src/tools/NoteTool.ts","../src/tools/SelectTool.ts","../src/tools/TextTool.ts","../src/tools/index.ts","../src/ui/icons.tsx","../src/ui/overlays.tsx","../src/ui/StylePanel.tsx","../src/ui/useKeyboardShortcuts.ts","../src/ui/DefaultUi.tsx","../src/file.ts","../src/external/defaultExternalContentHandlers.ts","../src/external/useExternalContent.ts","../src/Mocanvas.tsx"],"names":["Vec","p","anchorFor","m","EPS","STROKE_SIZES","Group2d","jsx","Rectangle2d","jsxs","Fragment","BaseBoxShapeUtil","hexToRgba","r","CubicSpline2d","Polygon2d","points","Polyline2d","LABEL_PADDING","DefaultColorStyle","DefaultLabelColorStyle","DefaultFillStyle","DefaultDashStyle","DefaultSizeStyle","DefaultFontStyle","FONT_SIZES","DefaultHorizontalAlignStyle","DefaultVerticalAlignStyle","LABEL_KEYS","ShapeUtil","LIGHT_THEME","useRef","useEffect","PATH_OP","Box","Idle","StateNode","createShapeId","Pointing","GeoShapeGeoStyle","useState","useLayoutEffect","useCallback","GEO_SHAPE_KINDS","StylePanel","useEditor","titleCase","track","Toolbar","ZoomBar","DebugStats","isEditable"],"mappings":"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","file":"index.js","sourcesContent":["/** Curve construction shared by the line, arrow and geo shapes. */\nimport { Vec, type VecLike } from \"@mocanvas/editor\"\n\nexport interface CubicSegment {\n p0: VecLike\n c1: VecLike\n c2: VecLike\n p1: VecLike\n}\n\n/** A straight line expressed as a cubic (control points at 1/3 and 2/3). */\nexport function lineSegment(a: VecLike, b: VecLike): CubicSegment {\n return { p0: a, c1: Vec.Lrp(a, b, 1 / 3), c2: Vec.Lrp(a, b, 2 / 3), p1: b }\n}\n\n/**\n * Approximate a circular arc with `count` cubic béziers.\n * `sweep` is signed: positive sweeps toward increasing angle (clockwise in\n * screen space where +y points down).\n */\nexport function arcToCubicSegments(\n center: VecLike,\n radius: number,\n startAngle: number,\n sweep: number,\n count = 2,\n): CubicSegment[] {\n const n = Math.max(1, Math.floor(count))\n const step = sweep / n\n // Tangent handle length for a cubic approximating an arc of `step` radians.\n const k = (4 / 3) * Math.tan(step / 4) * radius\n const out: CubicSegment[] = []\n for (let i = 0; i < n; i++) {\n const a0 = startAngle + step * i\n const a1 = a0 + step\n const p0 = { x: center.x + radius * Math.cos(a0), y: center.y + radius * Math.sin(a0) }\n const p1 = { x: center.x + radius * Math.cos(a1), y: center.y + radius * Math.sin(a1) }\n out.push({\n p0,\n c1: { x: p0.x - k * Math.sin(a0), y: p0.y + k * Math.cos(a0) },\n c2: { x: p1.x + k * Math.sin(a1), y: p1.y - k * Math.cos(a1) },\n p1,\n })\n }\n return out\n}\n\n/**\n * Convert a polyline into a smooth cubic spline that passes through every\n * point (uniform Catmull-Rom, tension 0.5, converted to bézier handles).\n * Endpoints are clamped so the curve starts and ends exactly on the first and\n * last points.\n */\nexport function catmullRomToBezier(points: readonly VecLike[], closed = false): CubicSegment[] {\n const n = points.length\n if (n < 2) return []\n const at = (i: number): VecLike => {\n if (closed) return points[((i % n) + n) % n]!\n return points[Math.max(0, Math.min(n - 1, i))]!\n }\n const segCount = closed ? n : n - 1\n const out: CubicSegment[] = []\n for (let i = 0; i < segCount; i++) {\n const p0 = at(i - 1)\n const p1 = at(i)\n const p2 = at(i + 1)\n const p3 = at(i + 2)\n out.push({\n p0: p1,\n c1: { x: p1.x + (p2.x - p0.x) / 6, y: p1.y + (p2.y - p0.y) / 6 },\n c2: { x: p2.x - (p3.x - p1.x) / 6, y: p2.y - (p3.y - p1.y) / 6 },\n p1: p2,\n })\n }\n return out\n}\n\n/** Evaluate a cubic segment at `t`. */\nexport function pointOnCubic(s: CubicSegment, t: number): Vec {\n const u = 1 - t\n return new Vec(\n u * u * u * s.p0.x + 3 * u * u * t * s.c1.x + 3 * u * t * t * s.c2.x + t * t * t * s.p1.x,\n u * u * u * s.p0.y + 3 * u * u * t * s.c1.y + 3 * u * t * t * s.c2.y + t * t * t * s.p1.y,\n )\n}\n","/**\n * Arrow body and arrowhead math.\n *\n * A body is a straight run, an arc, or — for an elbow arrow — the polyline\n * routed by `elbow-helpers`. Everything below works on all three, so callers\n * ask for a point, a tangent or a length without caring which one they hold.\n *\n * Bend convention: `bend` is the signed perpendicular offset of the arc's\n * midpoint from the chord midpoint. The perpendicular is `Per(Uni(end-start))`\n * = (-dy, dx), so for a left-to-right arrow a positive bend bows the arc toward\n * +y (down in screen space).\n */\nimport { CubicSpline2d, Polygon2d, Polyline2d, Vec, type Geometry2d, type VecLike } from \"@mocanvas/editor\"\nimport { arcToCubicSegments } from \"./spline-helpers\"\n\nexport type ArrowheadKind = \"none\" | \"arrow\" | \"triangle\" | \"square\" | \"dot\" | \"diamond\" | \"inverted\" | \"bar\" | \"pipe\"\n\nexport interface StraightBody {\n kind: \"straight\"\n start: Vec\n end: Vec\n}\n\nexport interface ArcBody {\n kind: \"arc\"\n center: Vec\n radius: number\n startAngle: number\n /** Signed sweep in radians. */\n sweep: number\n}\n\n/**\n * A body made of straight runs: the elbow arrow's axis-aligned route with its\n * corners already rounded. Built by `getElbowBody` in `elbow-helpers`; every\n * body operation below treats it as a polyline parameterized by arc length.\n */\nexport interface ElbowBody {\n kind: \"elbow\"\n points: Vec[]\n}\n\nexport type ArrowBody = StraightBody | ArcBody | ElbowBody\n\nconst EPS = 1e-6\n\nfunction normalizeAngle(a: number): number {\n let r = a % (Math.PI * 2)\n if (r > Math.PI) r -= Math.PI * 2\n if (r <= -Math.PI) r += Math.PI * 2\n return r\n}\n\n/** Describe the body running from `start` to `end`, bowed by `bend`. */\nexport function getArrowBody(start: VecLike, end: VecLike, bend: number): ArrowBody {\n const s = Vec.From(start)\n const e = Vec.From(end)\n const chord = Vec.Sub(e, s)\n const halfChord = Vec.Len(chord) / 2\n if (Math.abs(bend) < EPS || halfChord < EPS) return { kind: \"straight\", start: s, end: e }\n\n const u = Vec.Uni(chord)\n const n = Vec.Per(u)\n const mid = Vec.Lrp(s, e, 0.5)\n const b = Math.abs(bend)\n const sign = Math.sign(bend)\n const radius = (halfChord * halfChord + b * b) / (2 * b)\n const center = Vec.Add(mid, Vec.Mul(n, bend - sign * radius))\n const arcMid = Vec.Add(mid, Vec.Mul(n, bend))\n\n const startAngle = Vec.Angle(center, s)\n const endAngle = Vec.Angle(center, e)\n let sweep = normalizeAngle(endAngle - startAngle)\n // Pick the direction whose midpoint lands on the requested arc midpoint.\n const midAngle = startAngle + sweep / 2\n const candidate = new Vec(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle))\n if (Vec.Dist(candidate, arcMid) > 1e-3 * Math.max(1, radius)) {\n sweep = sweep - Math.sign(sweep || 1) * Math.PI * 2\n }\n return { kind: \"arc\", center, radius, startAngle, sweep }\n}\n\n/** Cumulative length at each point of a polyline; `at(-1)` is its total length. */\nfunction cumulativeLengths(points: Vec[]): number[] {\n const out = [0]\n for (let i = 1; i < points.length; i++) out.push(out[i - 1]! + Vec.Dist(points[i - 1]!, points[i]!))\n return out\n}\n\n/** Index of the segment holding `distance`, as an index into `points`. */\nfunction segmentAt(lengths: number[], distance: number): number {\n for (let i = 1; i < lengths.length; i++) {\n if (distance <= lengths[i]! || i === lengths.length - 1) return i - 1\n }\n return 0\n}\n\n/** The point `distance` along a polyline, clamped to its ends. */\nfunction pointAtDistance(points: Vec[], lengths: number[], distance: number): Vec {\n if (points.length === 0) return new Vec()\n if (points.length === 1) return points[0]!.clone()\n const i = segmentAt(lengths, distance)\n const segment = lengths[i + 1]! - lengths[i]!\n const t = segment < EPS ? 0 : (distance - lengths[i]!) / segment\n return Vec.Lrp(points[i]!, points[i + 1]!, Math.max(0, Math.min(1, t)))\n}\n\nexport function getBodyLength(body: ArrowBody): number {\n if (body.kind === \"straight\") return Vec.Dist(body.start, body.end)\n if (body.kind === \"elbow\") return cumulativeLengths(body.points).at(-1) ?? 0\n return Math.abs(body.sweep) * body.radius\n}\n\n/** Point at parameter `t` in [0, 1] along the body. */\nexport function getPointOnBody(body: ArrowBody, t: number): Vec {\n if (body.kind === \"straight\") return Vec.Lrp(body.start, body.end, t)\n if (body.kind === \"elbow\") {\n const lengths = cumulativeLengths(body.points)\n return pointAtDistance(body.points, lengths, (lengths.at(-1) ?? 0) * t)\n }\n const a = body.startAngle + body.sweep * t\n return new Vec(body.center.x + body.radius * Math.cos(a), body.center.y + body.radius * Math.sin(a))\n}\n\n/**\n * Unit direction of travel at parameter `t`. On an elbow that is the direction\n * of the leg `t` falls on, so `t = 1` gives the direction of the final leg —\n * which is where the end arrowhead points.\n */\nexport function getTangentOnBody(body: ArrowBody, t: number): Vec {\n if (body.kind === \"straight\") return Vec.Uni(Vec.Sub(body.end, body.start))\n if (body.kind === \"elbow\") {\n const points = body.points\n if (points.length < 2) return new Vec(1, 0)\n const lengths = cumulativeLengths(points)\n const i = segmentAt(lengths, (lengths.at(-1) ?? 0) * Math.max(0, Math.min(1, t)))\n // Degenerate segments carry no direction; walk to the nearest one that does.\n for (let step = 0; step < points.length; step++) {\n for (const j of [i + step, i - step]) {\n if (j < 0 || j >= points.length - 1) continue\n const d = Vec.Sub(points[j + 1]!, points[j]!)\n if (Vec.Len(d) > EPS) return Vec.Uni(d)\n }\n }\n return new Vec(1, 0)\n }\n const a = body.startAngle + body.sweep * t\n const dir = Math.sign(body.sweep) || 1\n return new Vec(-Math.sin(a) * dir, Math.cos(a) * dir)\n}\n\n/** Trim `startBy` / `endBy` page units from either end of the body. */\nexport function shortenBody(body: ArrowBody, startBy: number, endBy: number): ArrowBody {\n const length = getBodyLength(body)\n if (length < EPS) return body\n // Never eat more than 90% of the body.\n const total = startBy + endBy\n const budget = length * 0.9\n const scale = total > budget ? budget / total : 1\n const s = startBy * scale\n const e = endBy * scale\n if (body.kind === \"straight\") {\n return { kind: \"straight\", start: getPointOnBody(body, s / length), end: getPointOnBody(body, 1 - e / length) }\n }\n if (body.kind === \"elbow\") {\n const lengths = cumulativeLengths(body.points)\n const from = s\n const to = length - e\n const points: Vec[] = [pointAtDistance(body.points, lengths, from)]\n for (let i = 1; i < body.points.length - 1; i++) {\n const at = lengths[i]!\n if (at > from + EPS && at < to - EPS) points.push(body.points[i]!.clone())\n }\n points.push(pointAtDistance(body.points, lengths, to))\n return { kind: \"elbow\", points }\n }\n const dir = Math.sign(body.sweep) || 1\n const dStart = (s / body.radius) * dir\n const dEnd = (e / body.radius) * dir\n return {\n kind: \"arc\",\n center: body.center,\n radius: body.radius,\n startAngle: body.startAngle + dStart,\n sweep: body.sweep - dStart - dEnd,\n }\n}\n\n/** Geometry for the body: a polyline (straight or elbow) or a cubic approximation of the arc. */\nexport function bodyToGeometry(body: ArrowBody): Geometry2d {\n if (body.kind === \"straight\") return new Polyline2d({ points: [body.start, body.end] })\n if (body.kind === \"elbow\") return new Polyline2d({ points: body.points })\n const count = Math.max(2, Math.ceil(Math.abs(body.sweep) / (Math.PI / 2)))\n return new CubicSpline2d({\n segments: arcToCubicSegments(body.center, body.radius, body.startAngle, body.sweep, count),\n isClosed: false,\n isFilled: false,\n })\n}\n\n/** Arrowhead length for a stroke width, capped so two heads never overlap. */\nexport function getArrowheadLength(strokeWidth: number, bodyLength: number): number {\n return Math.max(0, Math.min(Math.max(12, strokeWidth * 4), bodyLength / 2.5))\n}\n\n/** How far the body must retreat from the tip so it ends at the head's base. */\nexport function getArrowheadInset(kind: ArrowheadKind, length: number): number {\n switch (kind) {\n case \"triangle\":\n case \"inverted\":\n case \"diamond\":\n case \"square\":\n case \"dot\":\n return length\n case \"arrow\":\n case \"bar\":\n case \"pipe\":\n case \"none\":\n return 0\n }\n}\n\nconst CHEVRON_HALF_WIDTH = Math.tan(Math.PI / 6)\n\n/**\n * Arrowhead geometry with its tip at `tip`, pointing along unit `dir` (from\n * the body outward). Closed heads are filled; open ones are polylines.\n */\nexport function getArrowheadGeometry(kind: ArrowheadKind, tip: VecLike, dir: VecLike, length: number): Geometry2d | null {\n if (kind === \"none\" || length <= 0) return null\n const t = Vec.From(tip)\n const d = Vec.From(dir)\n const p = Vec.Per(d)\n const back = Vec.Sub(t, Vec.Mul(d, length))\n const wing = Vec.Mul(p, length * CHEVRON_HALF_WIDTH)\n switch (kind) {\n case \"arrow\":\n return new Polyline2d({ points: [Vec.Add(back, wing), t, Vec.Sub(back, wing)] })\n case \"triangle\":\n return new Polygon2d({ points: [t, Vec.Add(back, wing), Vec.Sub(back, wing)], isFilled: true })\n case \"inverted\":\n return new Polygon2d({ points: [back, Vec.Add(t, wing), Vec.Sub(t, wing)], isFilled: true })\n case \"square\": {\n const half = Vec.Mul(p, length / 2)\n return new Polygon2d({\n points: [Vec.Add(t, half), Vec.Sub(t, half), Vec.Sub(back, half), Vec.Add(back, half)],\n isFilled: true,\n })\n }\n case \"diamond\": {\n const mid = Vec.Lrp(t, back, 0.5)\n const half = Vec.Mul(p, length / 2)\n return new Polygon2d({ points: [t, Vec.Add(mid, half), back, Vec.Sub(mid, half)], isFilled: true })\n }\n case \"dot\": {\n const center = Vec.Lrp(t, back, 0.5)\n return new CubicSpline2d({\n segments: arcToCubicSegments(center, length / 2, 0, Math.PI * 2, 4),\n isClosed: true,\n isFilled: true,\n })\n }\n case \"bar\": {\n const half = Vec.Mul(p, length / 2)\n return new Polyline2d({ points: [Vec.Add(t, half), Vec.Sub(t, half)] })\n }\n case \"pipe\": {\n const half = Vec.Mul(p, length * 0.35)\n return new Polyline2d({ points: [Vec.Add(t, half), Vec.Sub(t, half)] })\n }\n }\n}\n\n/** Signed bend for a dragged midpoint handle at `point`. */\nexport function getBendFromPoint(start: VecLike, end: VecLike, point: VecLike): number {\n const chord = Vec.Sub(end, start)\n if (Vec.Len(chord) < EPS) return 0\n const n = Vec.Per(Vec.Uni(chord))\n const mid = Vec.Lrp(start, end, 0.5)\n const bend = Vec.Dot(Vec.Sub(point, mid), n)\n return Math.abs(bend) < 1 ? 0 : bend\n}\n","/**\n * Arrow terminal resolution.\n *\n * An arrow terminal is either static (`props.start` / `props.end`, in\n * arrow-local space) or bound to another shape through an `arrow` binding.\n * A bound terminal is derived from the bound shape every time it is read, so\n * the arrow follows the shape without anyone copying coordinates around.\n */\nimport {\n Box,\n Group2d,\n STROKE_SIZES,\n Vec,\n type DefaultSizeStyle,\n type Editor,\n type Geometry2d,\n type ShapeId,\n type UnknownShape,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowBody, getPointOnBody } from \"../shapes/arrow-helpers\"\nimport type { ArrowBinding, ArrowTerminal } from \"./ArrowBindingUtil\"\n\n/** Affine transform components as returned by `Editor.getShapePageTransform`. */\nexport interface TransformLike {\n a: number\n b: number\n c: number\n d: number\n e: number\n f: number\n}\n\nexport function applyTransform(m: TransformLike, p: VecLike): Vec {\n return new Vec(m.a * p.x + m.c * p.y + m.e, m.b * p.x + m.d * p.y + m.f)\n}\n\nexport interface ArrowBindings {\n start?: ArrowBinding\n end?: ArrowBinding\n}\n\n/** The arrow's terminal bindings, keyed by terminal. */\nexport function getArrowBindings(editor: Editor, arrow: ArrowShape): ArrowBindings {\n const out: ArrowBindings = {}\n for (const binding of editor.getBindingsFromShape<ArrowBinding>(arrow, \"arrow\")) {\n out[binding.props.terminal] = binding\n }\n return out\n}\n\n/** Map a normalized anchor `(0..1, 0..1)` into a shape's geometry bounds (shape-local space). */\nexport function getAnchorInShapeSpace(editor: Editor, shape: UnknownShape, normalizedAnchor: VecLike): Vec {\n const b = editor.getShapeGeometry(shape).bounds\n return new Vec(b.x + b.w * normalizedAnchor.x, b.y + b.h * normalizedAnchor.y)\n}\n\n/**\n * The topmost shape an arrow terminal dropped at `pagePoint` should bind to,\n * or `undefined`. Candidates must accept arrow bindings, may not be arrows,\n * the arrow itself, or one of the arrow's ancestors, and are hit inside their\n * outline (or within the hit-test margin of it) regardless of fill, so an arrow\n * can attach to a hollow rectangle by pointing into it.\n */\nexport function getArrowBindingTargetAtPoint(editor: Editor, arrow: UnknownShape, pagePoint: VecLike): UnknownShape | undefined {\n const margin = editor.options.hitTestMargin / editor.getZoomLevel()\n const ancestors = new Set<ShapeId>()\n for (let p = editor.getShapeParent(arrow); p; p = editor.getShapeParent(p)) ancestors.add(p.id)\n const shapes = editor.getCurrentPageShapesSorted()\n for (let i = shapes.length - 1; i >= 0; i--) {\n const shape = shapes[i]!\n if (shape.id === arrow.id || shape.type === \"arrow\" || shape.isLocked || ancestors.has(shape.id)) continue\n if (!editor.getShapeUtil(shape).canBind({ fromShapeType: \"arrow\", toShapeType: shape.type, bindingType: \"arrow\" })) continue\n const bounds = editor.getShapePageBounds(shape)\n if (!bounds || !Box.ContainsPoint(bounds, pagePoint, margin)) continue\n const local = editor.getPointInShapeSpace(shape, pagePoint)\n if (editor.getShapeGeometry(shape).hitTestPoint(local, margin, true)) return shape\n }\n return undefined\n}\n\n/** Normalize a page point into a shape's geometry bounds, clamped to `[0, 1]`. */\nexport function getNormalizedAnchor(editor: Editor, shape: UnknownShape, pagePoint: VecLike): Vec {\n const local = editor.getPointInShapeSpace(shape, pagePoint)\n const b = editor.getShapeGeometry(shape).bounds\n const clamp = (v: number): number => (Number.isFinite(v) ? Math.max(0, Math.min(1, v)) : 0.5)\n return new Vec(clamp(b.w === 0 ? 0.5 : (local.x - b.x) / b.w), clamp(b.h === 0 ? 0.5 : (local.y - b.y) / b.h))\n}\n\n/**\n * Flattened outline of a geometry as line segments, in the geometry's own\n * space. Groups are walked recursively; label geometry is skipped so arrows\n * end on the shape body rather than on its text box.\n */\nexport function getOutlineSegments(geometry: Geometry2d): [Vec, Vec][] {\n if (geometry.isLabel) return []\n if (geometry instanceof Group2d) return geometry.children.flatMap(getOutlineSegments)\n const v = geometry.vertices\n const out: [Vec, Vec][] = []\n if (v.length < 2) return out\n const n = geometry.isClosed ? v.length : v.length - 1\n for (let i = 0; i < n; i++) out.push([v[i]!, v[(i + 1) % v.length]!])\n return out\n}\n\n/**\n * Intersection point of segments `a1-a2` and `b1-b2`, or `null` when they do\n * not cross. Parallel and degenerate segments never intersect.\n */\nexport function intersectSegments(a1: VecLike, a2: VecLike, b1: VecLike, b2: VecLike): Vec | null {\n const rx = a2.x - a1.x\n const ry = a2.y - a1.y\n const sx = b2.x - b1.x\n const sy = b2.y - b1.y\n const denom = rx * sy - ry * sx\n if (Math.abs(denom) < 1e-12) return null\n const qx = b1.x - a1.x\n const qy = b1.y - a1.y\n const t = (qx * sy - qy * sx) / denom\n const u = (qx * ry - qy * rx) / denom\n if (t < 0 || t > 1 || u < 0 || u > 1) return null\n return new Vec(a1.x + rx * t, a1.y + ry * t)\n}\n\n/**\n * Walk a polyline from its first point and return the first place it crosses\n * any of `segments`, or `null`.\n */\nfunction firstCrossing(path: Vec[], segments: [Vec, Vec][]): Vec | null {\n for (let i = 0; i < path.length - 1; i++) {\n const p0 = path[i]!\n const p1 = path[i + 1]!\n let best: Vec | null = null\n let bestD = Infinity\n for (const [s0, s1] of segments) {\n const hit = intersectSegments(p0, p1, s0, s1)\n if (!hit) continue\n const d = Vec.Dist2(p0, hit)\n if (d < bestD) {\n bestD = d\n best = hit\n }\n }\n if (best) return best\n }\n return null\n}\n\n/**\n * Sample the arrow body from `from` to `to` (bowed by `bend`) as a polyline\n * starting at `from`. An elbow arrow is sampled the same way: where it meets\n * the bound shape is decided by the line of sight from the other terminal —\n * the route is built afterwards, from the terminals this returns.\n */\nfunction sampleBody(from: Vec, to: Vec, bend: number, reverse: boolean): Vec[] {\n // The body is always described start → end so the bend sign keeps its meaning.\n const body = reverse ? getArrowBody(to, from, bend) : getArrowBody(from, to, bend)\n if (body.kind !== \"arc\") return [from, to]\n const count = Math.max(8, Math.min(128, Math.ceil((Math.abs(body.sweep) * body.radius) / 4)))\n const pts: Vec[] = []\n for (let i = 0; i <= count; i++) {\n const t = reverse ? 1 - i / count : i / count\n pts.push(getPointOnBody(body, t))\n }\n return pts\n}\n\nexport interface ArrowTerminals {\n start: Vec\n end: Vec\n}\n\n/** Which axis an elbow arrow leaves a terminal on, when that terminal is bound. */\nexport interface ElbowTerminalAxes {\n start?: \"x\" | \"y\"\n end?: \"x\" | \"y\"\n}\n\n/**\n * For each bound terminal, the axis of the normal of the bound shape's nearest\n * edge: `\"x\"` on a left or right edge, `\"y\"` on a top or bottom one. An elbow\n * arrow routes its first and last leg along these, so it leaves and enters a\n * bound shape square-on instead of diagonally. A free terminal is absent from\n * the result and the router falls back to the dominant axis.\n *\n * The bound shape's bounds are measured in arrow space, so a rotated shape is\n * compared against the box it occupies from the arrow's point of view — which\n * is the frame the route itself is built in.\n */\nexport function getBoundElbowAxes(editor: Editor, arrow: ArrowShape, terminals: ArrowTerminals): ElbowTerminalAxes {\n const bindings = getArrowBindings(editor, arrow)\n const out: ElbowTerminalAxes = {}\n for (const terminal of [\"start\", \"end\"] as const) {\n const binding = bindings[terminal]\n const shape = binding ? editor.getShape(binding.toId) : undefined\n if (!shape) continue\n const m = editor.getShapePageTransform(shape)\n const corners = editor\n .getShapeGeometry(shape)\n .bounds.corners.map((p) => editor.getPointInShapeSpace(arrow, applyTransform(m, p)))\n const box = Box.FromPoints(corners)\n if (box.w < 1e-6 && box.h < 1e-6) continue\n const p = terminals[terminal]\n const dx = Math.min(Math.abs(p.x - box.minX), Math.abs(p.x - box.maxX))\n const dy = Math.min(Math.abs(p.y - box.minY), Math.abs(p.y - box.maxY))\n out[terminal] = dx <= dy ? \"x\" : \"y\"\n }\n return out\n}\n\n/**\n * How far a bound arrow stops short of the shape it points at, as a multiple\n * of its stroke width. An arrowhead resting on a shape's border reads as part\n * of that border; a small gap reads as pointing at it.\n */\nexport const ARROW_TERMINAL_GAP_STROKES = 2.7\n\n/** The gap in page units for an arrow of a given size style. */\nexport function getArrowTerminalGap(size: DefaultSizeStyle, scale = 1): number {\n return STROKE_SIZES[size] * scale * ARROW_TERMINAL_GAP_STROKES\n}\n\n/** Move `point` back along the line toward `from` by `distance`, never past `from`. */\nfunction pullBack(point: Vec, from: Vec, distance: number): Vec {\n const d = Vec.Dist(point, from)\n if (d <= 1e-6) return point\n return Vec.Lrp(point, from, Math.min(distance, d) / d)\n}\n\n/**\n * Resolve both terminals of an arrow in arrow-local space.\n *\n * Unbound terminals come straight from `props`. A bound terminal starts at\n * its anchor inside the bound shape's bounds; unless the binding is exact it\n * is then pulled back to where the arrow body first crosses the bound shape's\n * outline on its way from the opposite terminal. If the body never crosses\n * the outline (e.g. the other terminal is inside the shape) the anchor is used.\n */\nexport function getArrowTerminalsInArrowSpace(editor: Editor, arrow: ArrowShape): ArrowTerminals {\n const bindings = getArrowBindings(editor, arrow)\n const startShape = bindings.start ? editor.getShape(bindings.start.toId) : undefined\n const endShape = bindings.end ? editor.getShape(bindings.end.toId) : undefined\n\n const anchorFor = (terminal: ArrowTerminal, binding: ArrowBinding | undefined, shape: UnknownShape | undefined): Vec => {\n if (!binding || !shape) return Vec.From(arrow.props[terminal])\n const local = getAnchorInShapeSpace(editor, shape, binding.props.normalizedAnchor)\n const page = applyTransform(editor.getShapePageTransform(shape), local)\n return editor.getPointInShapeSpace(arrow, page)\n }\n\n const startAnchor = anchorFor(\"start\", bindings.start, startShape)\n const endAnchor = anchorFor(\"end\", bindings.end, endShape)\n\n const outlineInArrowSpace = (shape: UnknownShape): [Vec, Vec][] => {\n const m = editor.getShapePageTransform(shape)\n const toArrow = (p: Vec): Vec => editor.getPointInShapeSpace(arrow, applyTransform(m, p))\n return getOutlineSegments(editor.getShapeGeometry(shape)).map(([a, b]) => [toArrow(a), toArrow(b)])\n }\n\n const snap = (terminal: ArrowTerminal, binding: ArrowBinding | undefined, shape: UnknownShape | undefined, anchor: Vec, other: Vec): Vec => {\n if (!binding || !shape || binding.props.isExact) return anchor\n if (Vec.Dist2(anchor, other) < 1e-12) return anchor\n const path = sampleBody(other, anchor, arrow.props.bend, terminal === \"start\")\n const crossing = firstCrossing(path, outlineInArrowSpace(shape))\n if (!crossing) return anchor\n // Stop short of the outline rather than on it. `isExact` opts out above,\n // which is what an exact binding means.\n return pullBack(crossing, other, getArrowTerminalGap(arrow.props.size, arrow.props.scale))\n }\n\n return {\n start: snap(\"start\", bindings.start, startShape, startAnchor, endAnchor),\n end: snap(\"end\", bindings.end, endShape, endAnchor, startAnchor),\n }\n}\n","/**\n * Theme lookups shared by the default shapes. Everything resolves against the\n * light theme for now; a theme-aware variant can be threaded through later.\n */\nimport {\n hexToRgba,\n LIGHT_THEME,\n type DefaultColorStyle,\n type DefaultFillStyle,\n type DefaultFontStyle,\n} from \"@mocanvas/editor\"\n\n/** Engine RGBA for a shape's stroke. */\nexport function getStrokeRgba(color: DefaultColorStyle): number {\n return hexToRgba(LIGHT_THEME[color].solid)\n}\n\n/**\n * Engine RGBA for a shape's interior. `0` means \"no fill\".\n *\n * The fill *styles* and the palette *tokens* share names but are one step\n * apart, which is easy to get wrong: `semi` paints the paper colour with a\n * barely-there tint, `solid` paints the hue's pale tint (the `semi` token),\n * and only `fill` paints the hue at full strength (the `solid` token). Reading\n * the token whose name matches the style makes every filled shape a step too\n * saturated. The stroke always uses the full-strength colour, so a `solid`\n * fill reads as a pale body inside a saturated outline.\n */\nexport function getFillRgba(color: DefaultColorStyle, fill: DefaultFillStyle): number {\n const theme = LIGHT_THEME[color]\n switch (fill) {\n case \"none\":\n return 0\n case \"semi\":\n return hexToRgba(LIGHT_THEME.solid)\n case \"pattern\":\n return hexToRgba(theme.pattern)\n case \"solid\":\n return hexToRgba(theme.semi)\n case \"fill\":\n return hexToRgba(theme.fill)\n }\n}\n\n/** Engine RGBA for a sticky note's background. */\nexport function getNoteFillRgba(color: DefaultColorStyle): number {\n return hexToRgba(LIGHT_THEME[color].note.fill)\n}\n\n/** CSS color string for text drawn in the DOM overlay. */\nexport function getTextCssColor(color: DefaultColorStyle): string {\n return LIGHT_THEME[color].solid\n}\n\n/** CSS color string for text on a sticky note. */\nexport function getNoteTextCssColor(color: DefaultColorStyle): string {\n return LIGHT_THEME[color].note.text\n}\n\n/** Local-only font stacks; no web fonts are loaded. */\nexport function getFontFamily(font: DefaultFontStyle): string {\n switch (font) {\n case \"draw\":\n return '\"Comic Sans MS\", \"Segoe Print\", \"Bradley Hand\", \"Chalkboard SE\", cursive'\n case \"sans\":\n return 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n case \"serif\":\n return 'Georgia, \"Times New Roman\", Times, serif'\n case \"mono\":\n return 'ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace'\n }\n}\n\n/** Engine dash pattern id for a dash style (see `mocanvas-render::dash`). */\nexport function getDashId(dash: string): number {\n switch (dash) {\n case \"dashed\":\n return 1\n case \"dotted\":\n return 2\n case \"draw\":\n return 3\n default:\n return 0\n }\n}\n\n// ---- frame chrome ---------------------------------------------------------\n\n/** A frame's body. */\nexport const FRAME_FILL = \"#ffffff\"\n\n/**\n * A frame's border.\n *\n * Measured off a reference render: a neutral grey hairline, not the blue-grey\n * (`#9fa8b2`) this used to be. The difference reads as a colour cast along\n * every frame edge, so it is worth being exact about.\n */\nexport const FRAME_STROKE = \"#717171\"\n\n/** Width of that border, in page units. */\nexport const FRAME_STROKE_WIDTH = 1\n\n/**\n * The frame's name, drawn in the strip above it. A shade darker than the\n * border so the caption carries more weight than the hairline it labels.\n */\nexport const FRAME_NAME_COLOR = \"#5f5f5f\"\n\nexport const FRAME_NAME_FONT_SIZE = 12\n\n/** Height of the strip above the frame that the name is laid out in. */\nexport const FRAME_NAME_OFFSET = 24\n\n/**\n * Gap between the bottom of that strip and the frame's top edge. The name is\n * bottom-aligned in the strip, so this is what sets how far above the frame it\n * sits — measured two pixels higher than the four this used to be.\n */\nexport const FRAME_NAME_GAP = 6\n\n/** Box the frame name is laid out in: the strip above the frame, minus the gap. */\nexport const FRAME_NAME_HEIGHT = FRAME_NAME_OFFSET - FRAME_NAME_GAP\n\n// ---- sticky-note chrome ---------------------------------------------------\n\n/**\n * A note body is not flat. It runs from a slightly deeper tint at the top to\n * the palette's `note.fill` at the bottom — `#f7dc99` → `#fce19c` for the\n * default yellow, i.e. the fill scaled by this factor channel-wise, which is\n * the ratio measured off the reference render and holds for every hue.\n */\nexport const NOTE_GRADIENT_TOP_SCALE = 0.9785\n\n/**\n * The soft shadow that falls below a note. Chosen so the darkest pixel just\n * under the body composites to `#c0c4c5` over the `#f9fafb` page and fades out\n * about twelve pixels down, matching the reference.\n *\n * The shadow is decoration *outside* the body: it is drawn by the DOM overlay\n * (and by a filter in SVG export) and never enters the shape's geometry,\n * bounds or hit-testing.\n */\nexport const NOTE_SHADOW_COLOR = \"#152223\"\nexport const NOTE_SHADOW_OPACITY = 0.36\n/**\n * A note's shadow falls almost entirely *below* it. A wide blur with no spread\n * haloes the note on every side, which reads as a glow rather than as paper\n * lifted off the page; the negative spread pulls the shadow rect in so the\n * sides stay tight while the offset keeps the soft falloff underneath.\n */\nexport const NOTE_SHADOW_OFFSET_Y = 12\nexport const NOTE_SHADOW_BLUR = 13\nexport const NOTE_SHADOW_SPREAD = -9\n\n/** `#rrggbb` with every channel scaled by `factor`, clamped to the byte range. */\nfunction scaleHexColor(hex: string, factor: number): string {\n const n = Number.parseInt(hex.slice(1), 16)\n const ch = (shift: number): number => Math.max(0, Math.min(255, Math.round(((n >> shift) & 0xff) * factor)))\n return `#${(((ch(16) << 16) | (ch(8) << 8) | ch(0)) >>> 0).toString(16).padStart(6, \"0\")}`\n}\n\n/** `#rrggbb` as a CSS `rgba()` string at `alpha`. */\nexport function hexToCssRgba(hex: string, alpha: number): string {\n const n = Number.parseInt(hex.slice(1), 16)\n return `rgba(${(n >> 16) & 0xff}, ${(n >> 8) & 0xff}, ${n & 0xff}, ${alpha})`\n}\n\n/** CSS colour at the bottom of a note's body gradient (the palette's note fill). */\nexport function getNoteFillCssColor(color: DefaultColorStyle): string {\n return LIGHT_THEME[color].note.fill\n}\n\n/**\n * Top of a note's body gradient, derived from the colour at its bottom. Takes\n * a `#rrggbb`; anything else (an `#rrggbbaa`, a named colour) is returned\n * unchanged, so the gradient degrades to a flat body rather than to garbage.\n */\nexport function getNoteGradientTopFrom(fill: string): string {\n if (!/^#[0-9a-fA-F]{6}$/.test(fill)) return fill\n return scaleHexColor(fill, NOTE_GRADIENT_TOP_SCALE)\n}\n\n/** CSS colour at the top of a note's body gradient. */\nexport function getNoteGradientTopCssColor(color: DefaultColorStyle): string {\n return getNoteGradientTopFrom(getNoteFillCssColor(color))\n}\n\n/** CSS `background` for a note body: the vertical gradient, top to bottom. */\nexport function getNoteBodyGradientCss(color: DefaultColorStyle): string {\n return `linear-gradient(to bottom, ${getNoteGradientTopCssColor(color)} 0%, ${getNoteFillCssColor(color)} 100%)`\n}\n\n/** CSS `box-shadow` for a note body, in shape-local units at `scale`. */\nexport function getNoteShadowCss(scale = 1): string {\n const dy = NOTE_SHADOW_OFFSET_Y * scale\n const blur = NOTE_SHADOW_BLUR * scale\n const spread = NOTE_SHADOW_SPREAD * scale\n return `0 ${dy}px ${blur}px ${spread}px ${hexToCssRgba(NOTE_SHADOW_COLOR, NOTE_SHADOW_OPACITY)}`\n}\n\n/**\n * The note shadow's geometry for an SVG export, in shape-local units.\n * `feDropShadow` has no spread, so the exporter draws the shadow as its own\n * rect — the body inset by the spread and offset down — behind the body, and\n * blurs just that rect.\n */\nexport function getNoteShadowSvgRect(w: number, h: number, scale = 1): { x: number; y: number; w: number; h: number; stdDeviation: number } {\n const inset = -NOTE_SHADOW_SPREAD * scale\n return {\n x: inset,\n y: NOTE_SHADOW_OFFSET_Y * scale + inset,\n w: Math.max(0, w - inset * 2),\n h: Math.max(0, h - inset * 2),\n // CSS blur radius is twice the Gaussian standard deviation.\n stdDeviation: (NOTE_SHADOW_BLUR * scale) / 2,\n }\n}\n","/** Cheap text metrics used until real measurement lands (phase 2 text layout). */\n\nexport const LINE_HEIGHT = 1.3\n/** Average glyph advance as a fraction of the font size. */\nexport const AVG_CHAR_WIDTH = 0.6\n\nexport interface TextSizeEstimate {\n w: number\n h: number\n lines: number\n}\n\n/**\n * Estimate the box a run of text occupies at `fontSize`, wrapping each\n * paragraph at `maxWidth` using an average character width.\n */\nexport function estimateTextSize(text: string, fontSize: number, maxWidth = Infinity): TextSizeEstimate {\n const charW = fontSize * AVG_CHAR_WIDTH\n const charsPerLine = Number.isFinite(maxWidth) && charW > 0 ? Math.max(1, Math.floor(maxWidth / charW)) : Infinity\n let lines = 0\n let widest = 0\n for (const paragraph of text.split(\"\\n\")) {\n const n = paragraph.length\n lines += Math.max(1, Math.ceil(n / charsPerLine))\n widest = Math.max(widest, Math.min(n, charsPerLine) * charW)\n }\n return { w: widest, h: lines * fontSize * LINE_HEIGHT, lines }\n}\n","import { estimateTextSize } from \"../shapes/text-helpers\"\n\nexport interface TextMeasureOptions {\n fontFamily: string\n fontSize: number\n fontWeight?: string | number\n /** Unitless line height (multiplier of the font size). */\n lineHeight: number\n /** Wrap width in CSS px, including `padding`. Omit for a single unwrapped run per paragraph. */\n maxWidth?: number\n /** Padding applied on every side; included in the returned `w`/`h`. */\n padding?: number\n}\n\nexport interface TextMeasurement {\n w: number\n h: number\n lineCount: number\n}\n\nconst MAX_CACHE_ENTRIES = 2000\n\n/** Placeholder so an empty text (or a trailing newline) still occupies one line. */\nconst ZERO_WIDTH_SPACE = \"\\u200b\"\n\n/** Text exactly as the static label / measuring element must render it to occupy the right box. */\nexport function toDisplayText(text: string): string {\n if (text.length === 0) return ZERO_WIDTH_SPACE\n return text.endsWith(\"\\n\") ? text + ZERO_WIDTH_SPACE : text\n}\n\n/**\n * Measures runs of text with a hidden DOM element, mirroring the CSS the\n * `<TextLabel>` component uses (pre-wrap + break-word, border-box padding).\n * Falls back to `estimateTextSize` where no `document` exists (tests, SSR).\n */\nexport class TextMeasure {\n private element: HTMLDivElement | null = null\n private readonly cache = new Map<string, TextMeasurement>()\n\n measureText(text: string, opts: TextMeasureOptions): TextMeasurement {\n const key = cacheKey(text, opts)\n const hit = this.cache.get(key)\n if (hit) return hit\n const result = typeof document === \"undefined\" ? this.estimate(text, opts) : this.measureDom(text, opts)\n if (this.cache.size >= MAX_CACHE_ENTRIES) {\n const oldest = this.cache.keys().next().value\n if (oldest !== undefined) this.cache.delete(oldest)\n }\n this.cache.set(key, result)\n return result\n }\n\n /** Number of cached measurements (for tests and debugging). */\n get cacheSize(): number {\n return this.cache.size\n }\n\n clearCache(): void {\n this.cache.clear()\n }\n\n dispose(): void {\n this.cache.clear()\n this.element?.remove()\n this.element = null\n }\n\n private estimate(text: string, opts: TextMeasureOptions): TextMeasurement {\n const padding = opts.padding ?? 0\n const inner = opts.maxWidth === undefined ? Infinity : Math.max(1, opts.maxWidth - padding * 2)\n const est = estimateTextSize(text, opts.fontSize, inner)\n return {\n w: est.w + padding * 2,\n h: est.lines * opts.fontSize * opts.lineHeight + padding * 2,\n lineCount: est.lines,\n }\n }\n\n private measureDom(text: string, opts: TextMeasureOptions): TextMeasurement {\n const el = this.getElement()\n const padding = opts.padding ?? 0\n const s = el.style\n s.fontFamily = opts.fontFamily\n s.fontSize = `${opts.fontSize}px`\n s.fontWeight = opts.fontWeight === undefined ? \"normal\" : String(opts.fontWeight)\n s.lineHeight = String(opts.lineHeight)\n s.padding = `${padding}px`\n s.maxWidth = opts.maxWidth === undefined ? \"none\" : `${Math.max(1, opts.maxWidth)}px`\n el.textContent = toDisplayText(text)\n const rect = el.getBoundingClientRect()\n const lineHeightPx = opts.fontSize * opts.lineHeight\n const contentH = Math.max(0, rect.height - padding * 2)\n const lineCount = lineHeightPx > 0 ? Math.max(1, Math.round(contentH / lineHeightPx)) : 1\n // Round up so a label sized from the result never wraps differently than the probe.\n return { w: Math.ceil(rect.width * 100) / 100, h: Math.ceil(rect.height * 100) / 100, lineCount }\n }\n\n private getElement(): HTMLDivElement {\n if (this.element && this.element.isConnected) return this.element\n const el = document.createElement(\"div\")\n el.setAttribute(\"aria-hidden\", \"true\")\n el.className = \"mocanvas-text-measure\"\n Object.assign(el.style, {\n position: \"fixed\",\n top: \"-10000px\",\n left: \"-10000px\",\n visibility: \"hidden\",\n pointerEvents: \"none\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n wordBreak: \"normal\",\n width: \"max-content\",\n boxSizing: \"border-box\",\n margin: \"0\",\n border: \"0\",\n zIndex: \"-1\",\n } satisfies Partial<CSSStyleDeclaration>)\n document.body.appendChild(el)\n this.element = el\n return el\n }\n}\n\nfunction cacheKey(text: string, o: TextMeasureOptions): string {\n return `${o.fontFamily}|${o.fontSize}|${o.fontWeight ?? \"\"}|${o.lineHeight}|${o.maxWidth ?? \"\"}|${o.padding ?? 0}|${text}`\n}\n\nlet singleton: TextMeasure | null = null\n\n/** The shared measurer. */\nexport function getTextMeasure(): TextMeasure {\n if (!singleton) singleton = new TextMeasure()\n return singleton\n}\n","import { useEditor, type DefaultFontStyle, type DefaultHorizontalAlignStyle, type DefaultVerticalAlignStyle, type UnknownShape } from \"@mocanvas/editor\"\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from \"react\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { toDisplayText } from \"./TextMeasure\"\n\nexport interface TextLabelProps {\n shape: UnknownShape\n text: string\n isEditing: boolean\n font: DefaultFontStyle\n fontSize: number\n /** CSS color of the text. */\n color: string\n align: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n /** Soft-wrap at `width`. When false the label only breaks at explicit newlines. */\n wrap: boolean\n /** Box the label is laid out in, in shape-local px. Omit for an intrinsically sized label. */\n width?: number\n height?: number\n /** Padding on every side of the text, in px (default 0). */\n padding?: number\n /** Shown in place of an empty label when not editing. */\n placeholder?: string\n /** Single-line labels commit on Enter and never contain newlines (frame names). */\n singleLine?: boolean\n /** Called with the new text; at most once per animation frame while typing. */\n onChange(text: string): void\n}\n\nexport function alignToJustify(align: DefaultHorizontalAlignStyle): CSSProperties[\"justifyContent\"] {\n switch (align) {\n case \"start\":\n case \"start-legacy\":\n return \"flex-start\"\n case \"end\":\n case \"end-legacy\":\n return \"flex-end\"\n default:\n return \"center\"\n }\n}\n\nexport function alignToTextAlign(align: DefaultHorizontalAlignStyle): CSSProperties[\"textAlign\"] {\n switch (align) {\n case \"start\":\n case \"start-legacy\":\n return \"left\"\n case \"end\":\n case \"end-legacy\":\n return \"right\"\n default:\n return \"center\"\n }\n}\n\nexport function verticalAlignToAlignItems(align: DefaultVerticalAlignStyle): CSSProperties[\"alignItems\"] {\n switch (align) {\n case \"start\":\n return \"flex-start\"\n case \"end\":\n return \"flex-end\"\n default:\n return \"center\"\n }\n}\n\n/** Upper bound between a keystroke and its store write when animation frames are paused. */\nconst FLUSH_FALLBACK_MS = 32\n\nconst stop = (e: { stopPropagation(): void }) => {\n e.stopPropagation()\n}\n\n/**\n * A shape's text label. Static text when idle; while editing, a plain-text\n * `<textarea>` overlays an invisible copy of the text so the box keeps the\n * exact size the static label would have.\n */\nexport function TextLabel(props: TextLabelProps): ReactNode {\n const { text, isEditing, font, fontSize, color, align, verticalAlign, wrap, width, height, padding = 0, placeholder, singleLine } = props\n\n const textStyle: CSSProperties = {\n position: \"relative\",\n fontFamily: getFontFamily(font),\n fontSize,\n fontWeight: \"normal\",\n lineHeight: LINE_HEIGHT,\n color,\n textAlign: alignToTextAlign(align),\n whiteSpace: wrap ? \"pre-wrap\" : \"pre\",\n overflowWrap: wrap ? \"break-word\" : \"normal\",\n wordBreak: \"normal\",\n padding,\n boxSizing: \"border-box\",\n maxWidth: \"100%\",\n minWidth: isEditing ? fontSize + padding * 2 : undefined,\n width: wrap ? \"100%\" : undefined,\n margin: 0,\n }\n\n const outerStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: width ?? \"max-content\",\n height: height ?? \"auto\",\n display: \"flex\",\n justifyContent: alignToJustify(align),\n alignItems: verticalAlignToAlignItems(verticalAlign),\n pointerEvents: isEditing ? \"auto\" : \"none\",\n userSelect: isEditing ? \"text\" : \"none\",\n WebkitUserSelect: isEditing ? \"text\" : \"none\",\n }\n\n if (!isEditing) {\n const shown = text.length === 0 && placeholder ? placeholder : toDisplayText(text)\n return (\n <div className=\"mocanvas-text-label\" style={outerStyle}>\n <div style={{ ...textStyle, opacity: text.length === 0 && placeholder ? 0.5 : 1 }}>{shown}</div>\n </div>\n )\n }\n\n return (\n <div className=\"mocanvas-text-label mocanvas-text-label-editing\" style={outerStyle}>\n <TextEditor {...props} textStyle={textStyle} singleLine={singleLine ?? false} />\n </div>\n )\n}\n\ninterface TextEditorProps extends TextLabelProps {\n textStyle: CSSProperties\n singleLine: boolean\n}\n\nfunction TextEditor({ text, onChange, textStyle, singleLine, wrap, color }: TextEditorProps): ReactNode {\n const editor = useEditor()\n const ref = useRef<HTMLTextAreaElement>(null)\n const [value, setValue] = useState(text)\n const valueRef = useRef(text)\n const pendingRef = useRef<string | null>(null)\n const rafRef = useRef(0)\n const timerRef = useRef(0)\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const flush = useCallback(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = 0\n }\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n timerRef.current = 0\n }\n if (pendingRef.current !== null) {\n const next = pendingRef.current\n pendingRef.current = null\n onChangeRef.current(next)\n }\n }, [])\n\n const commit = useCallback(\n (next: string) => {\n valueRef.current = next\n setValue(next)\n pendingRef.current = next\n // One store write per frame; the timer covers hidden tabs where rAF is paused.\n if (!rafRef.current) rafRef.current = requestAnimationFrame(flush)\n if (!timerRef.current) timerRef.current = window.setTimeout(flush, FLUSH_FALLBACK_MS)\n },\n [flush],\n )\n\n // External changes (undo, collaboration) while nothing is pending.\n useEffect(() => {\n if (pendingRef.current === null && text !== valueRef.current) {\n valueRef.current = text\n setValue(text)\n }\n }, [text])\n\n // Focus with the caret at the end on mount; flush on unmount.\n useLayoutEffect(() => {\n const el = ref.current\n if (el) {\n el.focus({ preventScroll: true })\n const end = el.value.length\n el.setSelectionRange(end, end)\n }\n return () => flush()\n }, [flush])\n\n const finish = useCallback(() => {\n flush()\n editor.setEditingShape(null)\n editor.complete()\n }, [editor, flush])\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n e.stopPropagation()\n if (e.key === \"Escape\") {\n e.preventDefault()\n finish()\n return\n }\n if (e.key === \"Tab\") {\n e.preventDefault()\n return\n }\n if (e.key === \"Enter\" && singleLine && !e.shiftKey) {\n e.preventDefault()\n finish()\n }\n }\n\n const displayed = toDisplayText(value)\n\n return (\n <div style={textStyle} onPointerDown={stop} onPointerMove={stop} onPointerUp={stop}>\n {/* Invisible copy of the text keeps the box sized exactly like the static label. */}\n <div aria-hidden=\"true\" style={{ visibility: \"hidden\", pointerEvents: \"none\" }}>\n {displayed}\n </div>\n <textarea\n ref={ref}\n className=\"mocanvas-text-editor\"\n value={value}\n rows={1}\n wrap={wrap ? \"soft\" : \"off\"}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n data-gramm=\"false\"\n onChange={(e) => {\n const raw = e.currentTarget.value\n commit(singleLine ? raw.replace(/[\\r\\n]+/g, \"\") : raw)\n }}\n onBlur={flush}\n onKeyDown={onKeyDown}\n onKeyUp={stop}\n onPointerDown={stop}\n onPointerMove={stop}\n onPointerUp={stop}\n onContextMenu={stop}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n margin: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n resize: \"none\",\n overflow: \"hidden\",\n boxSizing: \"border-box\",\n padding: textStyle.padding,\n fontFamily: textStyle.fontFamily,\n fontSize: textStyle.fontSize,\n fontWeight: textStyle.fontWeight,\n lineHeight: textStyle.lineHeight,\n color,\n caretColor: color,\n textAlign: textStyle.textAlign,\n whiteSpace: textStyle.whiteSpace,\n overflowWrap: textStyle.overflowWrap,\n wordBreak: textStyle.wordBreak,\n letterSpacing: \"inherit\",\n userSelect: \"text\",\n WebkitUserSelect: \"text\",\n pointerEvents: \"auto\",\n cursor: \"text\",\n touchAction: \"auto\",\n }}\n />\n </div>\n )\n}\n","/** Pure text layout helpers shared by the label-bearing shapes. DOM-free so they are testable in Node. */\n\nimport type { DefaultFontStyle } from \"@mocanvas/editor\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { getTextMeasure, type TextMeasurement } from \"./TextMeasure\"\n\n/**\n * Extra height a box needs so its label fits: `labelHeight - boxHeight`,\n * never negative. `growY` is stored on the shape and added to `h`.\n */\nexport function computeGrowY(labelHeight: number, boxHeight: number): number {\n if (!Number.isFinite(labelHeight) || !Number.isFinite(boxHeight)) return 0\n return Math.max(0, labelHeight - boxHeight)\n}\n\n/** Trim whitespace at the end of a label (kept inside the run, e.g. indentation on later lines). */\nexport function trimTrailingWhitespace(text: string): string {\n return text.replace(/\\s+$/u, \"\")\n}\n\nexport interface LabelMeasureOptions {\n font: DefaultFontStyle\n fontSize: number\n /** Wrap width in px including padding; omit for no soft wrapping. */\n maxWidth?: number\n padding?: number\n}\n\n/** Measure a shape label with the shared measurer using the default label typography. */\nexport function measureLabel(text: string, opts: LabelMeasureOptions): TextMeasurement {\n return getTextMeasure().measureText(text, {\n fontFamily: getFontFamily(opts.font),\n fontSize: opts.fontSize,\n lineHeight: LINE_HEIGHT,\n ...(opts.maxWidth === undefined ? {} : { maxWidth: opts.maxWidth }),\n padding: opts.padding ?? 0,\n })\n}\n\n/** Minimum width of an auto-sized text shape so an empty one still shows a caret area. */\nexport const TEXT_SHAPE_MIN_WIDTH = 8\n\nexport interface TextShapeSizeInput {\n text: string\n font: DefaultFontStyle\n fontSize: number\n autoSize: boolean\n /** Current wrap width, used when `autoSize` is off. */\n w: number\n}\n\n/** Width and height of a text shape: measured (auto-size) or wrapped at `w`. */\nexport function getTextShapeSize(input: TextShapeSizeInput): { w: number; h: number; lineCount: number } {\n const { text, font, fontSize, autoSize, w } = input\n if (autoSize) {\n const m = measureLabel(text, { font, fontSize })\n return { w: Math.max(TEXT_SHAPE_MIN_WIDTH, m.w), h: m.h, lineCount: m.lineCount }\n }\n const width = Math.max(1, w)\n const m = measureLabel(text, { font, fontSize, maxWidth: width })\n return { w: width, h: m.h, lineCount: m.lineCount }\n}\n","/**\n * Elbow arrow routing.\n *\n * An elbow arrow runs from its start terminal to its end terminal along\n * axis-aligned legs instead of an arc. The route is decided by two axes — the\n * axis the body leaves the start on and the axis it arrives at the end on:\n *\n * - same axis on both ends: three legs (H-V-H or V-H-V), with the middle leg\n * placed at `midPoint` along that axis (0 hard against the start, 1 against\n * the end);\n * - different axes: two legs (an L, H-V or V-H).\n *\n * A free terminal uses the *dominant* axis — whichever of `|dx|` and `|dy|` is\n * larger — so a wide, short arrow leaves horizontally and a tall, narrow one\n * leaves vertically. A bound terminal uses the axis of the bound shape's\n * nearest edge normal (see `getBoundElbowAxes`), so the arrow leaves the shape\n * square-on rather than diagonally.\n *\n * Corners are then rounded with a quarter-turn whose radius is clamped to half\n * of each adjacent leg, so two corners sharing a leg can never overlap.\n */\nimport { Vec, type VecLike } from \"@mocanvas/editor\"\nimport type { ElbowBody } from \"./arrow-helpers\"\n\n/** Which coordinate a leg varies: `\"x\"` for a horizontal leg, `\"y\"` for a vertical one. */\nexport type ElbowAxis = \"x\" | \"y\"\n\nconst EPS = 1e-6\n\n/** Corner radius as a multiple of the stroke width. */\nexport const ELBOW_CORNER_STROKES = 2.5\n\n/** Line segments used to approximate one rounded corner. */\nconst CORNER_SEGMENTS = 4\n\nexport interface ElbowRouteOptions {\n /** Where the middle leg sits along the shared axis, clamped to `0..1`. */\n midPoint?: number\n /** Axis the body must leave the start on; defaults to the dominant axis. */\n startAxis?: ElbowAxis | undefined\n /** Axis the body must arrive at the end on; defaults to the dominant axis. */\n endAxis?: ElbowAxis | undefined\n /** Corner radius before per-corner clamping. */\n cornerRadius?: number\n}\n\nexport interface ElbowRoute {\n /** Corner points from start to end, before the corners are rounded. */\n corners: Vec[]\n /** The drawn polyline: `corners` with each corner replaced by a fillet. */\n points: Vec[]\n /** The middle leg, when the route has one; `null` for an L or a straight run. */\n midLeg: [Vec, Vec] | null\n /** The axis the middle leg slides along, `null` when there is no middle leg. */\n slideAxis: ElbowAxis | null\n}\n\nfunction clamp01(value: number): number {\n return value < 0 ? 0 : value > 1 ? 1 : value\n}\n\n/** The axis a free terminal leaves on: the one the terminals are further apart on. */\nexport function getDominantAxis(start: VecLike, end: VecLike): ElbowAxis {\n return Math.abs(end.x - start.x) >= Math.abs(end.y - start.y) ? \"x\" : \"y\"\n}\n\n/** Drop points that repeat, and points that sit on the straight line between their neighbours. */\nfunction simplify(points: Vec[]): Vec[] {\n const out: Vec[] = []\n for (const p of points) {\n const last = out.at(-1)\n if (last && Vec.Dist2(last, p) < EPS * EPS) continue\n out.push(p)\n }\n for (let i = out.length - 2; i > 0; i--) {\n const a = out[i - 1]!\n const b = out[i]!\n const c = out[i + 1]!\n const cross = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)\n if (Math.abs(cross) < EPS) out.splice(i, 1)\n }\n return out\n}\n\n/**\n * Round one corner at `p` between `a` and `b` into `CORNER_SEGMENTS` chords of\n * a quarter circle. The radius is clamped to half of each adjacent leg. Corners\n * that are not right angles (which an axis-aligned route never produces) are\n * left sharp.\n */\nfunction roundCorner(a: Vec, p: Vec, b: Vec, radius: number): Vec[] {\n const lenA = Vec.Dist(a, p)\n const lenB = Vec.Dist(b, p)\n const r = Math.min(radius, lenA / 2, lenB / 2)\n if (r < EPS) return [p]\n const da = Vec.Div(Vec.Sub(a, p), lenA)\n const db = Vec.Div(Vec.Sub(b, p), lenB)\n if (Math.abs(Vec.Dot(da, db)) > 1e-3) return [p]\n const from = Vec.Add(p, Vec.Mul(da, r))\n const to = Vec.Add(p, Vec.Mul(db, r))\n // Both legs are unit and perpendicular, so the arc's centre is one radius\n // along each of them.\n const center = Vec.Add(p, Vec.Mul(Vec.Add(da, db), r))\n const a0 = Math.atan2(from.y - center.y, from.x - center.x)\n const a1 = Math.atan2(to.y - center.y, to.x - center.x)\n let sweep = a1 - a0\n while (sweep > Math.PI) sweep -= Math.PI * 2\n while (sweep <= -Math.PI) sweep += Math.PI * 2\n const out: Vec[] = []\n for (let i = 0; i <= CORNER_SEGMENTS; i++) {\n const angle = a0 + (sweep * i) / CORNER_SEGMENTS\n out.push(new Vec(center.x + r * Math.cos(angle), center.y + r * Math.sin(angle)))\n }\n return out\n}\n\n/** `corners` with every interior corner replaced by a fillet of `radius`. */\nexport function roundElbowCorners(corners: Vec[], radius: number): Vec[] {\n if (corners.length < 3 || radius < EPS) return corners.map((p) => p.clone())\n const out: Vec[] = [corners[0]!.clone()]\n for (let i = 1; i < corners.length - 1; i++) {\n for (const p of roundCorner(corners[i - 1]!, corners[i]!, corners[i + 1]!, radius)) out.push(p)\n }\n out.push(corners.at(-1)!.clone())\n return simplify(out)\n}\n\n/**\n * Route an elbow from `start` to `end`. See the module comment for the rule.\n */\nexport function getElbowRoute(start: VecLike, end: VecLike, options: ElbowRouteOptions = {}): ElbowRoute {\n const s = Vec.From(start)\n const e = Vec.From(end)\n const dominant = getDominantAxis(s, e)\n const startAxis = options.startAxis ?? dominant\n const endAxis = options.endAxis ?? dominant\n const t = clamp01(options.midPoint ?? 0.5)\n\n let corners: Vec[]\n let midLeg: [Vec, Vec] | null = null\n let slideAxis: ElbowAxis | null = null\n\n if (startAxis === endAxis) {\n // Three legs: out along the shared axis, across, then in along it again.\n if (startAxis === \"x\") {\n const mx = s.x + (e.x - s.x) * t\n const a = new Vec(mx, s.y)\n const b = new Vec(mx, e.y)\n corners = [s, a, b, e]\n if (Math.abs(e.y - s.y) > EPS) {\n midLeg = [a, b]\n slideAxis = \"x\"\n }\n } else {\n const my = s.y + (e.y - s.y) * t\n const a = new Vec(s.x, my)\n const b = new Vec(e.x, my)\n corners = [s, a, b, e]\n if (Math.abs(e.x - s.x) > EPS) {\n midLeg = [a, b]\n slideAxis = \"y\"\n }\n }\n } else {\n // Two legs: one turn, at the corner the two axes meet in.\n corners = startAxis === \"x\" ? [s, new Vec(e.x, s.y), e] : [s, new Vec(s.x, e.y), e]\n }\n\n const simplified = simplify(corners)\n return {\n corners: simplified,\n points: roundElbowCorners(simplified, options.cornerRadius ?? 0),\n midLeg,\n slideAxis,\n }\n}\n\n/** The elbow body for an arrow: the rounded route as a polyline body. */\nexport function getElbowBody(start: VecLike, end: VecLike, options: ElbowRouteOptions = {}): ElbowBody {\n return { kind: \"elbow\", points: getElbowRoute(start, end, options).points }\n}\n\n/**\n * `elbowMidPoint` for a midpoint handle dragged to `point`: how far along\n * `axis` it sits between the terminals, clamped to `0..1`.\n */\nexport function getElbowMidPointFromPoint(start: VecLike, end: VecLike, point: VecLike, axis: ElbowAxis): number {\n const span = end[axis] - start[axis]\n if (Math.abs(span) < EPS) return 0.5\n return clamp01((point[axis] - start[axis]) / span)\n}\n","/**\n * Tolerant prop reads for the default shape utils.\n *\n * A shape can reach a util with props that do not match its declared shape:\n * a file written by another editor, a record hand-built by an integrator, a\n * partial update. Geometry and rendering must survive that, so the utils read\n * through these helpers rather than trusting the declared types (and rather\n * than sprinkling `?.` and `??` over every access).\n *\n * Each helper takes the shape's props object and returns a usable value of the\n * expected kind, falling back to the util's default when the stored value is\n * missing or of the wrong type.\n */\n\nimport { richTextToPlainText, type EnumStyleProp } from \"@mocanvas/editor\"\n\ntype Props = Record<string, unknown>\n\n/** A shape's props as a bag of unknowns, tolerating a missing or non-object `props`. */\nexport function propsOf(shape: { props?: unknown }): Props {\n const props = shape.props\n return typeof props === \"object\" && props !== null && !Array.isArray(props) ? (props as Props) : {}\n}\n\nexport function readString(props: unknown, key: string, fallback: string): string {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"string\" ? value : fallback\n}\n\n/** A string prop constrained to a known set; anything else falls back. */\nexport function readEnum<T extends string>(props: unknown, key: string, allowed: readonly T[], fallback: T): T {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"string\" && (allowed as readonly string[]).includes(value) ? (value as T) : fallback\n}\n\n/** A style prop's value, validated against the style's own set of values. */\nexport function readStyle<T extends string>(props: unknown, key: string, style: EnumStyleProp<T>, fallback: T = style.defaultValue): T {\n return readEnum(props, key, style.values, fallback)\n}\n\nexport function readNumber(props: unknown, key: string, fallback: number): number {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback\n}\n\nexport function readBoolean(props: unknown, key: string, fallback: boolean): boolean {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"boolean\" ? value : fallback\n}\n\n/**\n * A shape's label. Prefers `props.text`; a record that still carries a\n * rich-text document (one that skipped the load-time normalization) is\n * flattened here so it renders rather than throwing.\n */\nexport function readText(props: unknown, key = \"text\"): string {\n const bag = props as Props | undefined\n const value = bag?.[key]\n if (typeof value === \"string\") return value\n const rich = bag?.[\"richText\"]\n return rich === undefined || rich === null ? \"\" : richTextToPlainText(rich)\n}\n\n/** A `{ x, y }` prop, with each coordinate falling back independently. */\nexport function readPoint(props: unknown, key: string, fallback: { x: number; y: number }): { x: number; y: number } {\n const value = (props as Props | undefined)?.[key]\n if (typeof value !== \"object\" || value === null) return fallback\n return { x: readNumber(value, \"x\", fallback.x), y: readNumber(value, \"y\", fallback.y) }\n}\n\n/** An array prop; a missing or non-array value reads as empty. */\nexport function readArray(props: unknown, key: string): unknown[] {\n const value = (props as Props | undefined)?.[key]\n return Array.isArray(value) ? value : []\n}\n\n/** A record-of-objects prop (a line's points, say); anything else reads as empty. */\nexport function readRecord(props: unknown, key: string): Record<string, unknown> {\n const value = (props as Props | undefined)?.[key]\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : {}\n}\n","import { PATH_OP } from \"@mocanvas/editor\"\n\nfunction num(v: number | undefined): string {\n const n = v ?? 0\n return String(Math.round(n * 100) / 100)\n}\n\n/** Convert the engine's flat path encoding to an SVG `d` attribute (for indicators). */\nexport function pathWordsToSvgD(words: readonly number[]): string {\n const parts: string[] = []\n let i = 0\n while (i < words.length) {\n const op = words[i]\n switch (op) {\n case PATH_OP.MOVE:\n parts.push(`M${num(words[i + 1])} ${num(words[i + 2])}`)\n i += 3\n break\n case PATH_OP.LINE:\n parts.push(`L${num(words[i + 1])} ${num(words[i + 2])}`)\n i += 3\n break\n case PATH_OP.QUAD:\n parts.push(`Q${num(words[i + 1])} ${num(words[i + 2])} ${num(words[i + 3])} ${num(words[i + 4])}`)\n i += 5\n break\n case PATH_OP.CUBIC:\n parts.push(\n `C${num(words[i + 1])} ${num(words[i + 2])} ${num(words[i + 3])} ${num(words[i + 4])} ${num(words[i + 5])} ${num(words[i + 6])}`,\n )\n i += 7\n break\n case PATH_OP.CLOSE:\n parts.push(\"Z\")\n i += 1\n break\n default:\n // Malformed stream: stop rather than emit garbage.\n return parts.join(\" \")\n }\n }\n return parts.join(\" \")\n}\n","import {\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n ShapeUtil,\n STROKE_SIZES,\n Vec,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n type ShapeHandle,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport {\n applyTransform,\n getArrowBindings,\n getArrowBindingTargetAtPoint,\n getArrowTerminalsInArrowSpace,\n getBoundElbowAxes,\n getNormalizedAnchor,\n type ArrowTerminals,\n} from \"../bindings/arrow-terminals\"\nimport type { ArrowBinding, ArrowTerminal } from \"../bindings/ArrowBindingUtil\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport {\n bodyToGeometry,\n getArrowBody,\n getArrowheadGeometry,\n getArrowheadInset,\n getArrowheadLength,\n getBendFromPoint,\n getBodyLength,\n getPointOnBody,\n getTangentOnBody,\n shortenBody,\n type ArrowBody,\n type ArrowheadKind,\n} from \"./arrow-helpers\"\nimport { ELBOW_CORNER_STROKES, getElbowMidPointFromPoint, getElbowRoute, type ElbowRoute } from \"./elbow-helpers\"\nimport { propsOf, readEnum, readNumber, readPoint, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getStrokeRgba, getTextCssColor } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\n\nexport type { ArrowheadKind } from \"./arrow-helpers\"\n\nexport interface ArrowShapeProps {\n /**\n * How the body is routed: `\"arc\"` bows from start to end by `bend`,\n * `\"elbow\"` runs in axis-aligned legs (and ignores `bend`).\n */\n kind: ArrowKind\n /** Static start terminal in arrow-local space; ignored while the terminal is bound. */\n start: { x: number; y: number }\n /** Static end terminal in arrow-local space; ignored while the terminal is bound. */\n end: { x: number; y: number }\n bend: number\n /** Where an elbow's middle leg sits along the routing axis, `0..1`; unused by `\"arc\"`. */\n elbowMidPoint: number\n color: DefaultColorStyle\n labelColor: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n arrowheadStart: ArrowheadKind\n arrowheadEnd: ArrowheadKind\n font: DefaultFontStyle\n text: string\n labelPosition: number\n scale: number\n}\n\nexport type ArrowShape = BaseShape<\"arrow\", ArrowShapeProps>\n\nexport const ARROW_LABEL_PADDING = 8\nconst LABEL_PADDING = ARROW_LABEL_PADDING\n\nconst ARROWHEADS = [\"none\", \"arrow\", \"triangle\", \"square\", \"dot\", \"diamond\", \"inverted\", \"bar\", \"pipe\"] as const\n\n/** Routing kinds an arrow can have. */\nexport const ARROW_KINDS = [\"arc\", \"elbow\"] as const\nexport type ArrowKind = (typeof ARROW_KINDS)[number]\n\n/**\n * The shape with every declared prop present and of the declared type. Terminal\n * resolution and binding code read the arrow as a whole, so the normalized copy\n * is a whole shape rather than a loose props bag.\n */\nexport function readArrowShape(shape: ArrowShape): ArrowShape {\n return { ...shape, props: readArrowProps(shape) }\n}\n\n/**\n * `shape.props` with every declared prop present and of the declared type, so\n * geometry and rendering survive a record that arrived without one.\n */\nexport function readArrowProps(shape: { props?: unknown }): ArrowShapeProps {\n const p = propsOf(shape)\n return {\n kind: readEnum(p, \"kind\", ARROW_KINDS, \"arc\"),\n start: readPoint(p, \"start\", { x: 0, y: 0 }),\n end: readPoint(p, \"end\", { x: 2, y: 0 }),\n bend: readNumber(p, \"bend\", 0),\n elbowMidPoint: readNumber(p, \"elbowMidPoint\", 0.5),\n color: readStyle(p, \"color\", DefaultColorStyle),\n labelColor: readStyle(p, \"labelColor\", DefaultLabelColorStyle),\n fill: readStyle(p, \"fill\", DefaultFillStyle),\n dash: readStyle(p, \"dash\", DefaultDashStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n arrowheadStart: readEnum(p, \"arrowheadStart\", ARROWHEADS, \"none\"),\n arrowheadEnd: readEnum(p, \"arrowheadEnd\", ARROWHEADS, \"arrow\"),\n font: readStyle(p, \"font\", DefaultFontStyle),\n text: readText(p),\n labelPosition: readNumber(p, \"labelPosition\", 0.5),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\nexport class ArrowShapeUtil extends ShapeUtil<ArrowShape> {\n static override type = \"arrow\" as const\n /**\n * `kind` is deliberately not among these. A style is shared across shape\n * types, remembered for the next shape and applied to a whole selection at\n * once; arc-versus-elbow is routing that belongs to the one arrow, and\n * declaring it a style would put it in every mixed selection's shared styles\n * (and in the style panel) with nothing else to share it with.\n */\n static override props = {\n color: DefaultColorStyle,\n labelColor: DefaultLabelColorStyle,\n fill: DefaultFillStyle,\n dash: DefaultDashStyle,\n size: DefaultSizeStyle,\n font: DefaultFontStyle,\n }\n\n getDefaultProps(): ArrowShapeProps {\n return {\n kind: \"arc\",\n start: { x: 0, y: 0 },\n end: { x: 2, y: 0 },\n bend: 0,\n elbowMidPoint: 0.5,\n color: \"black\",\n labelColor: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n arrowheadStart: \"none\",\n arrowheadEnd: \"arrow\",\n font: \"draw\",\n text: \"\",\n labelPosition: 0.5,\n scale: 1,\n }\n }\n\n /**\n * The arrow's terminals and the body running between them, in arrow-local\n * space. `\"arc\"` bows by `bend`; `\"elbow\"` routes axis-aligned legs, leaving\n * a bound shape along its nearest edge's normal, with corners rounded in\n * proportion to the stroke. The elbow's route is handed back as well, for the\n * midpoint handle.\n */\n private resolveBody(shape: ArrowShape): { props: ArrowShapeProps; terminals: ArrowTerminals; body: ArrowBody; route: ElbowRoute | null } {\n const normalized = readArrowShape(shape)\n const props = normalized.props\n const terminals = getArrowTerminalsInArrowSpace(this.editor, normalized)\n if (props.kind !== \"elbow\") {\n return { props, terminals, body: getArrowBody(terminals.start, terminals.end, props.bend), route: null }\n }\n const axes = getBoundElbowAxes(this.editor, normalized, terminals)\n const route = getElbowRoute(terminals.start, terminals.end, {\n midPoint: props.elbowMidPoint,\n startAxis: axes.start,\n endAxis: axes.end,\n cornerRadius: STROKE_SIZES[props.size] * props.scale * ELBOW_CORNER_STROKES,\n })\n return { props, terminals, body: { kind: \"elbow\", points: route.points }, route }\n }\n\n getGeometry(shape: ArrowShape): Geometry2d {\n const { props, terminals, body: full } = this.resolveBody(shape)\n const { arrowheadStart, arrowheadEnd, size, scale, text, labelPosition, font } = props\n const { start, end } = terminals\n const strokeWidth = STROKE_SIZES[size] * scale\n const length = getBodyLength(full)\n const headLength = getArrowheadLength(strokeWidth, length)\n const body = shortenBody(full, getArrowheadInset(arrowheadStart, headLength), getArrowheadInset(arrowheadEnd, headLength))\n\n const children: Geometry2d[] = [bodyToGeometry(body)]\n const startHead = getArrowheadGeometry(arrowheadStart, start, Vec.Mul(getTangentOnBody(full, 0), -1), headLength)\n if (startHead) children.push(startHead)\n const endHead = getArrowheadGeometry(arrowheadEnd, end, getTangentOnBody(full, 1), headLength)\n if (endHead) children.push(endHead)\n\n if (text) {\n const m = measureLabel(text, { font, fontSize: FONT_SIZES[size] * scale, padding: LABEL_PADDING * scale })\n const c = getPointOnBody(full, Math.max(0, Math.min(1, labelPosition)))\n children.push(new Rectangle2d({ x: c.x - m.w / 2, y: c.y - m.h / 2, width: m.w, height: m.h, isFilled: false, isLabel: true }))\n }\n return new Group2d({ children })\n }\n\n override getRenderStyle(shape: ArrowShape): StyleWords {\n const { color, dash, size, scale } = readArrowProps(shape)\n const stroke = getStrokeRgba(color)\n // The body is open so it never fills; closed arrowheads fill with the stroke color.\n return { stroke, strokeWidth: STROKE_SIZES[size] * scale, fill: stroke, dash: getDashId(dash), opacity: 1 }\n }\n\n component(shape: ArrowShape): ReactNode {\n const { text, font, size, scale, labelColor, labelPosition } = readArrowProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n const c = getPointOnBody(this.resolveBody(shape).body, Math.max(0, Math.min(1, labelPosition)))\n return (\n <div\n style={{\n position: \"absolute\",\n left: c.x,\n top: c.y,\n transform: \"translate(-50%, -50%)\",\n width: \"max-content\",\n pointerEvents: \"none\",\n }}\n >\n <div style={{ position: \"relative\", width: \"max-content\" }}>\n <TextLabel\n shape={shape}\n text={text}\n isEditing={isEditing}\n font={font}\n fontSize={FONT_SIZES[size] * scale}\n color={getTextCssColor(labelColor)}\n align=\"middle\"\n verticalAlign=\"middle\"\n wrap={false}\n padding={LABEL_PADDING * scale}\n onChange={(next) => this.editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { text: next } })}\n />\n </div>\n </div>\n )\n }\n\n indicator(shape: ArrowShape): ReactNode {\n return <path d={pathWordsToSvgD(this.getGeometry(shape).toPathWords())} />\n }\n\n /** The GPU keeps drawing the arrow while its label is edited. */\n override needsOverlay(_shape: ArrowShape): boolean {\n return false\n }\n\n override hasOverlayLabel(shape: ArrowShape): boolean {\n return readText(shape.props).trim().length > 0 || this.editor.getEditingShapeId() === shape.id\n }\n\n override canEdit(_shape: ArrowShape): boolean {\n return true\n }\n\n /** Nothing binds to an arrow (no arrow-to-arrow bindings). */\n override canBind(_opts: { fromShapeType: string; toShapeType: string; bindingType: string }): boolean {\n return false\n }\n\n /** A selected arrow shows its handles instead of a selection box. */\n override hideSelectionBoundsBg(_shape: ArrowShape): boolean {\n return true\n }\n\n override hideSelectionBoundsFg(_shape: ArrowShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: ArrowShape): boolean {\n return true\n }\n\n override getText(shape: ArrowShape): string {\n return readText(shape.props)\n }\n\n override onEditEnd(shape: ArrowShape): void {\n const text = readText(shape.props)\n const trimmed = trimTrailingWhitespace(text)\n if (trimmed !== text) this.editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { text: trimmed } })\n }\n\n /**\n * Start and end handles move (and bind) the terminals. Between them sits one\n * virtual handle: an arc's `bend` handle rides the middle of the curve, while\n * an elbow's `midpoint` handle sits on its middle leg and slides that leg.\n * An elbow with no middle leg (an L route, or a straight run) has neither.\n */\n override getHandles(shape: ArrowShape): ShapeHandle[] {\n const { terminals, body, route } = this.resolveBody(shape)\n const { start, end } = terminals\n const handles: ShapeHandle[] = [{ id: \"start\", type: \"vertex\", index: \"a1\", x: start.x, y: start.y }]\n if (route) {\n if (route.midLeg) {\n const mid = Vec.Lrp(route.midLeg[0], route.midLeg[1], 0.5)\n handles.push({ id: \"midpoint\", type: \"virtual\", index: \"a2\", x: mid.x, y: mid.y })\n }\n } else {\n const mid = getPointOnBody(body, 0.5)\n handles.push({ id: \"bend\", type: \"virtual\", index: \"a2\", x: mid.x, y: mid.y })\n }\n handles.push({ id: \"end\", type: \"vertex\", index: \"a3\", x: end.x, y: end.y })\n return handles\n }\n\n override onHandleDrag(shape: ArrowShape, info: { handle: ShapeHandle; isPrecise: boolean; initial?: ArrowShape }): Partial<ArrowShape> | void {\n const { handle } = info\n switch (handle.id) {\n case \"start\":\n case \"end\":\n return this.dragTerminal(shape, handle.id, handle, info.isPrecise)\n case \"bend\": {\n const { start, end } = getArrowTerminalsInArrowSpace(this.editor, readArrowShape(shape))\n return { props: { ...shape.props, bend: getBendFromPoint(start, end, handle) } }\n }\n case \"midpoint\": {\n const { terminals, route } = this.resolveBody(shape)\n if (!route?.slideAxis) return\n const elbowMidPoint = getElbowMidPointFromPoint(terminals.start, terminals.end, handle, route.slideAxis)\n return { props: { ...shape.props, elbowMidPoint } }\n }\n default:\n return\n }\n }\n\n /**\n * Move a terminal handle. When the handle lands on a bindable shape the\n * terminal is bound to it (centered, or at the precise point under the\n * pointer); otherwise any existing binding is dropped. The static point is\n * always written so the arrow renders sensibly if the binding goes away.\n * Holding Ctrl suppresses binding. Targets are found by hit-testing shape\n * geometry directly (not `editor.getShapeAtPoint`) because the engine treats\n * unfilled shapes as hollow, and arrows must bind into hollow shapes too.\n */\n private dragTerminal(shape: ArrowShape, terminal: ArrowTerminal, point: { x: number; y: number }, isPrecise: boolean): Partial<ArrowShape> {\n const editor = this.editor\n const local = { x: point.x, y: point.y }\n const pagePoint = applyTransform(editor.getShapePageTransform(shape), local)\n const existing = getArrowBindings(editor, shape)[terminal]\n\n const target = editor.inputs.ctrlKey ? undefined : getArrowBindingTargetAtPoint(editor, shape, pagePoint)\n\n if (target) {\n const bindingProps: ArrowBinding[\"props\"] = {\n terminal,\n normalizedAnchor: isPrecise ? getNormalizedAnchor(editor, target, pagePoint).toJson() : { x: 0.5, y: 0.5 },\n isPrecise,\n isExact: false,\n }\n if (existing && existing.toId === target.id) {\n editor.updateBinding<ArrowBinding>({ id: existing.id, type: \"arrow\", props: bindingProps })\n } else {\n if (existing) editor.deleteBinding(existing.id)\n editor.createBinding<ArrowBinding>({ type: \"arrow\", fromId: shape.id, toId: target.id, props: bindingProps })\n }\n } else if (existing) {\n editor.deleteBinding(existing.id)\n }\n\n return { props: { ...shape.props, [terminal]: local } }\n }\n\n /**\n * Dragging the arrow on its own detaches it: bindings to shapes that are not\n * part of the selection are dropped and their terminals frozen in place.\n * Bindings to shapes moving along with the arrow are kept.\n */\n override onTranslateStart(shape: ArrowShape): void {\n const editor = this.editor\n const selected = new Set(editor.getSelectedShapeIds())\n const stale = editor.getBindingsFromShape<ArrowBinding>(shape, \"arrow\").filter((b) => !selected.has(b.toId))\n if (stale.length) editor.deleteBindings(stale, { isolateShapes: true })\n }\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type BookmarkAsset,\n type Editor,\n type Geometry2d,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readNumber, readString } from \"./prop-access\"\n\nexport interface BookmarkShapeProps {\n w: number\n h: number\n /** The `bookmark` asset holding the scraped preview; `null` when nothing was scraped. */\n assetId: AssetId | null\n /** The page the card points at. Kept on the shape so a card survives a missing asset. */\n url: string\n}\n\nexport type BookmarkShape = BaseShape<\"bookmark\", BookmarkShapeProps>\n\nexport const BOOKMARK_WIDTH = 300\nexport const BOOKMARK_HEIGHT = 320\n\n// ---- card chrome ----------------------------------------------------------\n\nexport const BOOKMARK_FILL = \"#ffffff\"\nexport const BOOKMARK_STROKE = \"#e8e9ea\"\nexport const BOOKMARK_STROKE_WIDTH = 1\nexport const BOOKMARK_RADIUS = 8\n/** The banner strip behind the asset's preview image (and its colour when there is none). */\nexport const BOOKMARK_BANNER_HEIGHT = 160\nexport const BOOKMARK_BANNER_FILL = \"#eceff3\"\nexport const BOOKMARK_PADDING = 12\nexport const BOOKMARK_GAP = 6\nexport const BOOKMARK_TITLE_HEIGHT = 38\nexport const BOOKMARK_META_HEIGHT = 16\nexport const BOOKMARK_FAVICON_SIZE = 14\nexport const BOOKMARK_TITLE_FONT_SIZE = 14\nexport const BOOKMARK_TEXT_FONT_SIZE = 12\nexport const BOOKMARK_META_FONT_SIZE = 11\nexport const BOOKMARK_TITLE_COLOR = \"#1d1d1d\"\nexport const BOOKMARK_TEXT_COLOR = \"#666666\"\nexport const BOOKMARK_META_COLOR = \"#8f8f8f\"\n/** Body left under the banner even on a short card, so the text never disappears. */\nexport const BOOKMARK_MIN_BODY_HEIGHT = 80\n\n/** A rectangle in shape-local space. */\nexport interface BookmarkRect {\n x: number\n y: number\n w: number\n h: number\n}\n\n/** Where each part of the card sits, in shape-local space. Shared by the overlay and the SVG export. */\nexport interface BookmarkLayout {\n banner: BookmarkRect\n title: BookmarkRect\n description: BookmarkRect\n favicon: BookmarkRect\n hostname: BookmarkRect\n}\n\nexport function getBookmarkLayout(w: number, h: number): BookmarkLayout {\n const pad = BOOKMARK_PADDING\n const innerW = Math.max(0, w - pad * 2)\n const bannerH = Math.max(0, Math.min(BOOKMARK_BANNER_HEIGHT, h - BOOKMARK_MIN_BODY_HEIGHT))\n // The host line is placed from the bottom up and the title is what gives way\n // when the card is short, so a resized card loses its description first and\n // still reads as a link to somewhere.\n const metaY = Math.max(bannerH, h - pad - BOOKMARK_META_HEIGHT)\n const titleY = bannerH + pad\n const titleH = Math.max(0, Math.min(BOOKMARK_TITLE_HEIGHT, metaY - BOOKMARK_GAP - titleY))\n const descY = titleY + titleH + BOOKMARK_GAP\n const clamp = (r: BookmarkRect): BookmarkRect => {\n const x = Math.max(0, Math.min(r.x, w))\n const y = Math.max(0, Math.min(r.y, h))\n return { x, y, w: Math.max(0, Math.min(r.w, w - x)), h: Math.max(0, Math.min(r.h, h - y)) }\n }\n return {\n banner: clamp({ x: 0, y: 0, w, h: bannerH }),\n title: clamp({ x: pad, y: titleY, w: innerW, h: titleH }),\n description: clamp({ x: pad, y: descY, w: innerW, h: metaY - BOOKMARK_GAP - descY }),\n favicon: clamp({\n x: pad,\n y: metaY + (BOOKMARK_META_HEIGHT - BOOKMARK_FAVICON_SIZE) / 2,\n w: BOOKMARK_FAVICON_SIZE,\n h: BOOKMARK_FAVICON_SIZE,\n }),\n hostname: clamp({\n x: pad + BOOKMARK_FAVICON_SIZE + BOOKMARK_GAP,\n y: metaY,\n w: innerW - BOOKMARK_FAVICON_SIZE - BOOKMARK_GAP,\n h: BOOKMARK_META_HEIGHT,\n }),\n }\n}\n\n/**\n * The host a bookmark points at, without a `www.` prefix — the one line of a\n * link card that is always available, since it comes from the shape's own url\n * rather than from a scrape. An unparseable url reads as `\"\"`.\n */\nexport function getBookmarkHostname(url: string): string {\n if (!url) return \"\"\n try {\n const host = new URL(url).hostname.toLowerCase()\n return host.startsWith(\"www.\") ? host.slice(4) : host\n } catch {\n return \"\"\n }\n}\n\n/** The shape's `bookmark` asset, or `null` when it has none (or one of another type). */\nexport function getBookmarkAsset(editor: Editor, shape: BookmarkShape): BookmarkAsset | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<BookmarkAsset>(assetId)\n return asset && asset.type === \"bookmark\" ? asset : null\n}\n\n/** Everything the card draws, with each field falling back to something renderable. */\nexport interface BookmarkCard {\n title: string\n description: string\n image: string\n favicon: string\n hostname: string\n url: string\n /** Whether the card has a scraped asset behind it; `false` renders the placeholder. */\n hasAsset: boolean\n}\n\nexport function getBookmarkCard(editor: Editor, shape: BookmarkShape): BookmarkCard {\n const url = readString(propsOf(shape), \"url\", \"\")\n const asset = getBookmarkAsset(editor, shape)\n const props = asset ? (asset.props as Partial<BookmarkAsset[\"props\"]>) : undefined\n return {\n title: readString(props, \"title\", \"\"),\n description: readString(props, \"description\", \"\"),\n image: readString(props, \"image\", \"\"),\n favicon: readString(props, \"favicon\", \"\"),\n hostname: getBookmarkHostname(url) || getBookmarkHostname(readString(props, \"src\", \"\") ?? \"\"),\n url,\n hasAsset: asset !== null,\n }\n}\n\nfunction readBookmarkBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", BOOKMARK_WIDTH), h: readNumber(p, \"h\", BOOKMARK_HEIGHT) }\n}\n\nconst ELLIPSIS: CSSProperties = { overflow: \"hidden\", textOverflow: \"ellipsis\" }\n\nexport class BookmarkShapeUtil extends BaseBoxShapeUtil<BookmarkShape> {\n static override type = \"bookmark\" as const\n\n getDefaultProps(): BookmarkShapeProps {\n return { w: BOOKMARK_WIDTH, h: BOOKMARK_HEIGHT, assetId: null, url: \"\" }\n }\n\n getGeometry(shape: BookmarkShape): Geometry2d {\n const { w, h } = readBookmarkBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /**\n * The card is html — a banner image over wrapped, ellipsised text — which no\n * single textured quad can stand in for, so the shape always renders through\n * the DOM overlay.\n */\n override getRenderStyle(_shape: BookmarkShape): StyleWords | null {\n return null\n }\n\n component(shape: BookmarkShape): ReactNode {\n const { w, h } = readBookmarkBox(shape)\n const card = getBookmarkCard(this.editor, shape)\n const layout = getBookmarkLayout(w, h)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n const frame: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n borderRadius: BOOKMARK_RADIUS,\n background: BOOKMARK_FILL,\n border: `${BOOKMARK_STROKE_WIDTH}px solid ${BOOKMARK_STROKE}`,\n fontFamily: 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n /*\n * The canvas owns the pointer: a card is a shape you drag and select,\n * not a link you click. The url is still in the DOM as an `<a>` so\n * assistive tech can read and follow it, but it only takes the pointer\n * while the shape is being edited.\n */\n pointerEvents: isEditing ? \"auto\" : \"none\",\n userSelect: \"none\",\n }\n return (\n <a\n href={card.url || undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n draggable={false}\n aria-label={card.title || card.hostname || card.url || \"bookmark\"}\n tabIndex={isEditing ? 0 : -1}\n style={{ ...frame, display: \"block\", color: \"inherit\", textDecoration: \"none\" }}\n >\n {card.hasAsset ? this.renderCard(card, layout) : this.renderPlaceholder(card, layout)}\n </a>\n )\n }\n\n /** The scraped card: banner, title, description, favicon and host. */\n private renderCard(card: BookmarkCard, layout: BookmarkLayout): ReactNode {\n return (\n <>\n <div style={{ position: \"absolute\", ...layout.banner, background: BOOKMARK_BANNER_FILL, overflow: \"hidden\" }}>\n {card.image ? (\n <img\n src={card.image}\n alt=\"\"\n draggable={false}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\", pointerEvents: \"none\" }}\n />\n ) : null}\n </div>\n <div\n style={{\n position: \"absolute\",\n ...layout.title,\n ...ELLIPSIS,\n fontSize: BOOKMARK_TITLE_FONT_SIZE,\n fontWeight: 600,\n lineHeight: 1.3,\n color: BOOKMARK_TITLE_COLOR,\n }}\n >\n {card.title}\n </div>\n <div\n style={{\n position: \"absolute\",\n ...layout.description,\n ...ELLIPSIS,\n fontSize: BOOKMARK_TEXT_FONT_SIZE,\n lineHeight: 1.4,\n color: BOOKMARK_TEXT_COLOR,\n }}\n >\n {card.description}\n </div>\n {card.favicon ? (\n <img\n src={card.favicon}\n alt=\"\"\n draggable={false}\n style={{ position: \"absolute\", ...layout.favicon, objectFit: \"contain\", pointerEvents: \"none\" }}\n />\n ) : null}\n <div\n style={{\n position: \"absolute\",\n ...layout.hostname,\n ...ELLIPSIS,\n whiteSpace: \"nowrap\",\n fontSize: BOOKMARK_META_FONT_SIZE,\n lineHeight: `${BOOKMARK_META_HEIGHT}px`,\n color: BOOKMARK_META_COLOR,\n }}\n >\n {card.hostname}\n </div>\n </>\n )\n }\n\n /** No asset: an empty banner and the host, so the shape still reads as a link to somewhere. */\n private renderPlaceholder(card: BookmarkCard, layout: BookmarkLayout): ReactNode {\n return (\n <>\n <div style={{ position: \"absolute\", ...layout.banner, background: BOOKMARK_BANNER_FILL }} />\n <div\n style={{\n position: \"absolute\",\n ...layout.title,\n ...ELLIPSIS,\n fontSize: BOOKMARK_TITLE_FONT_SIZE,\n lineHeight: 1.3,\n color: BOOKMARK_META_COLOR,\n }}\n >\n {card.hostname || card.url}\n </div>\n </>\n )\n }\n\n indicator(shape: BookmarkShape): ReactNode {\n const { w, h } = readBookmarkBox(shape)\n return <rect width={w} height={h} rx={BOOKMARK_RADIUS} />\n }\n}\n","import { BaseBoxShapeUtil, Rectangle2d, type BaseShape, type Geometry2d, type StyleWords } from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readNumber, readString } from \"./prop-access\"\n\nexport interface EmbedShapeProps {\n w: number\n h: number\n /** The page being embedded, as the document stored it (not the iframe's src). */\n url: string\n}\n\nexport type EmbedShape = BaseShape<\"embed\", EmbedShapeProps>\n\nexport const EMBED_WIDTH = 720\nexport const EMBED_HEIGHT = 500\n\nexport const EMBED_PLACEHOLDER_FILL = \"#f5f6f8\"\nexport const EMBED_PLACEHOLDER_STROKE = \"#9fa8b2\"\nexport const EMBED_PLACEHOLDER_TEXT = \"#5f6670\"\nexport const EMBED_PLACEHOLDER_FONT_SIZE = 13\nexport const EMBED_PLACEHOLDER_PADDING = 16\nexport const EMBED_RADIUS = 6\n\n/**\n * The sandbox an embedded page runs in. Scripts and same-origin are what makes\n * a player work at all; popups let a \"watch on the site\" button escape. Nothing\n * else is granted — no forms, no top-level navigation, no pointer lock.\n */\nexport const EMBED_SANDBOX = \"allow-scripts allow-same-origin allow-popups\"\n\n// ---- the permit list ------------------------------------------------------\n\n/**\n * One embeddable service: the exact hosts it is recognised by, and how one of\n * its page urls becomes an embeddable one.\n *\n * `hostnames` are matched exactly (case-insensitively, with a leading `www.`\n * ignored), never as a suffix — `youtube.com.evil.test` is a different host and\n * is not on the list. `toEmbedUrl` receives the parsed url and returns an\n * absolute `https:` url, or `null` when this particular page of the service is\n * not embeddable (a channel page rather than a video, say).\n */\nexport interface EmbedDefinition {\n /** Stable id for the service, e.g. `\"youtube\"`. */\n type: string\n /** Human-readable name, shown on the placeholder card. */\n title: string\n hostnames: readonly string[]\n toEmbedUrl(url: URL): string | null\n}\n\n/** A url that matched the permit list. */\nexport interface EmbedMatch {\n definition: EmbedDefinition\n /** Absolute `https:` url for the iframe's `src`. */\n embedUrl: string\n}\n\n/** `https://` + host + path + query + hash of an already-permitted url, forcing the scheme. */\nfunction httpsUrl(host: string, url: URL, opts: { hash?: boolean } = {}): string {\n return `https://${host}${url.pathname}${url.search}${opts.hash ? url.hash : \"\"}`\n}\n\n/** A youtube video id: the opaque token youtube itself uses, nothing path-like. */\nfunction youTubeId(candidate: string | undefined | null): string | null {\n return candidate && /^[A-Za-z0-9_-]{6,20}$/.test(candidate) ? candidate : null\n}\n\nconst youtube: EmbedDefinition = {\n type: \"youtube\",\n title: \"YouTube\",\n hostnames: [\"youtube.com\", \"m.youtube.com\", \"youtube-nocookie.com\", \"youtu.be\"],\n toEmbedUrl(url) {\n const segments = url.pathname.split(\"/\").filter(Boolean)\n const host = url.hostname.toLowerCase().replace(/^www\\./, \"\")\n const id =\n host === \"youtu.be\"\n ? youTubeId(segments[0])\n : youTubeId(url.searchParams.get(\"v\")) ??\n (segments[0] === \"embed\" || segments[0] === \"shorts\" || segments[0] === \"live\" ? youTubeId(segments[1]) : null)\n // The no-cookie host is the same player without the tracking cookie.\n return id ? `https://www.youtube-nocookie.com/embed/${id}` : null\n },\n}\n\nconst vimeo: EmbedDefinition = {\n type: \"vimeo\",\n title: \"Vimeo\",\n hostnames: [\"vimeo.com\", \"player.vimeo.com\"],\n toEmbedUrl(url) {\n const id = url.pathname.split(\"/\").filter(Boolean).find((s) => /^\\d{6,12}$/.test(s))\n return id ? `https://player.vimeo.com/video/${id}` : null\n },\n}\n\nconst codesandbox: EmbedDefinition = {\n type: \"codesandbox\",\n title: \"CodeSandbox\",\n hostnames: [\"codesandbox.io\"],\n toEmbedUrl(url) {\n const segments = url.pathname.split(\"/\").filter(Boolean)\n // `/s/<id>`, `/embed/<id>` and `/p/sandbox/<id>` all name the same sandbox.\n const id = segments[0] === \"p\" && segments[1] === \"sandbox\" ? segments[2] : segments[0] === \"s\" || segments[0] === \"embed\" ? segments[1] : null\n return id && /^[A-Za-z0-9_-]{3,64}$/.test(id) ? `https://codesandbox.io/embed/${id}` : null\n },\n}\n\nconst figma: EmbedDefinition = {\n type: \"figma\",\n title: \"Figma\",\n hostnames: [\"figma.com\"],\n toEmbedUrl(url) {\n // Figma's viewer takes the file url as a parameter rather than a path.\n const target = `https://www.figma.com${url.pathname}${url.search}`\n return `https://www.figma.com/embed?embed_host=mocanvas&url=${encodeURIComponent(target)}`\n },\n}\n\nconst googleMaps: EmbedDefinition = {\n type: \"google-maps\",\n title: \"Google Maps\",\n hostnames: [\"google.com\", \"maps.google.com\"],\n toEmbedUrl(url) {\n if (!url.pathname.startsWith(\"/maps\")) return null\n if (url.pathname.startsWith(\"/maps/embed\")) return httpsUrl(\"www.google.com\", url)\n const params = new URLSearchParams(url.search)\n params.set(\"output\", \"embed\")\n return `https://www.google.com/maps?${params.toString()}`\n },\n}\n\nconst excalidraw: EmbedDefinition = {\n type: \"excalidraw\",\n title: \"Excalidraw\",\n hostnames: [\"excalidraw.com\"],\n // The scene lives in the fragment (`#json=`, `#room=`), so it has to survive.\n toEmbedUrl: (url) => httpsUrl(\"excalidraw.com\", url, { hash: true }),\n}\n\n/** The services recognised out of the box. */\nexport const DEFAULT_EMBED_DEFINITIONS: readonly EmbedDefinition[] = [youtube, vimeo, codesandbox, figma, googleMaps, excalidraw]\n\n/**\n * The permit list `getEmbedDefinition` consults. It starts as the defaults and\n * is meant to be extended by the app:\n *\n * ```ts\n * embedDefinitions.push({\n * type: \"intranet\",\n * title: \"Intranet\",\n * hostnames: [\"wiki.example.com\"],\n * toEmbedUrl: (url) => `https://wiki.example.com${url.pathname}?embed=1`,\n * })\n * ```\n *\n * Nothing outside the list is ever put in an iframe.\n */\nexport const embedDefinitions: EmbedDefinition[] = [...DEFAULT_EMBED_DEFINITIONS]\n\n/** Hosts are compared case-insensitively, and a leading `www.` never distinguishes one. */\nfunction normalizeHost(hostname: string): string {\n const host = hostname.toLowerCase()\n return host.startsWith(\"www.\") ? host.slice(4) : host\n}\n\n/**\n * The permit-list entry for `url`, with the url to actually put in the iframe,\n * or `null` when the url is not one we embed.\n *\n * Rejects anything that is not `http(s)` (a `javascript:` or `data:` url never\n * reaches an iframe), and matches hosts exactly, so a lookalike host that\n * merely *contains* a permitted one is not embedded.\n */\nexport function getEmbedDefinition(url: string, definitions: readonly EmbedDefinition[] = embedDefinitions): EmbedMatch | null {\n if (typeof url !== \"string\" || url.length === 0) return null\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n return null\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") return null\n const host = normalizeHost(parsed.hostname)\n for (const definition of definitions) {\n if (!definition.hostnames.some((h) => normalizeHost(h) === host)) continue\n const embedUrl = definition.toEmbedUrl(parsed)\n // A permitted host with an unembeddable page falls through to the placeholder.\n if (embedUrl && embedUrl.startsWith(\"https://\")) return { definition, embedUrl }\n return null\n }\n return null\n}\n\nfunction readEmbedBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", EMBED_WIDTH), h: readNumber(p, \"h\", EMBED_HEIGHT) }\n}\n\nexport class EmbedShapeUtil extends BaseBoxShapeUtil<EmbedShape> {\n static override type = \"embed\" as const\n\n getDefaultProps(): EmbedShapeProps {\n return { w: EMBED_WIDTH, h: EMBED_HEIGHT, url: \"\" }\n }\n\n getGeometry(shape: EmbedShape): Geometry2d {\n const { w, h } = readEmbedBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** An iframe is not a quad: embeds always render through the DOM overlay. */\n override getRenderStyle(_shape: EmbedShape): StyleWords | null {\n return null\n }\n\n component(shape: EmbedShape): ReactNode {\n const { w, h } = readEmbedBox(shape)\n const url = readString(propsOf(shape), \"url\", \"\")\n const match = getEmbedDefinition(url)\n const box: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n borderRadius: EMBED_RADIUS,\n }\n if (!match) {\n return (\n <div\n style={{\n ...box,\n background: EMBED_PLACEHOLDER_FILL,\n border: `1px dashed ${EMBED_PLACEHOLDER_STROKE}`,\n padding: EMBED_PLACEHOLDER_PADDING,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n fontFamily: 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n fontSize: EMBED_PLACEHOLDER_FONT_SIZE,\n color: EMBED_PLACEHOLDER_TEXT,\n wordBreak: \"break-all\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n aria-label={url ? `embed: ${url}` : \"embed\"}\n >\n {url || \"No embed url\"}\n </div>\n )\n }\n /*\n * An iframe that takes the pointer swallows the gesture that was meant to\n * pan or select the canvas — the wheel and the drag never reach us. So the\n * frame is inert until the shape is being edited, and the canvas keeps its\n * own gestures the rest of the time.\n */\n const isEditing = this.editor.getEditingShapeId() === shape.id\n return (\n <div style={box}>\n <iframe\n src={match.embedUrl}\n title={`${match.definition.title} embed`}\n width={w}\n height={h}\n sandbox={EMBED_SANDBOX}\n referrerPolicy=\"no-referrer\"\n loading=\"lazy\"\n allowFullScreen\n style={{ display: \"block\", width: \"100%\", height: \"100%\", border: 0, pointerEvents: isEditing ? \"auto\" : \"none\" }}\n />\n </div>\n )\n }\n\n indicator(shape: EmbedShape): ReactNode {\n const { w, h } = readEmbedBox(shape)\n return <rect width={w} height={h} rx={EMBED_RADIUS} />\n }\n\n /** There is nothing to type into an embed; the shape has no text of its own. */\n override canEdit(_shape: EmbedShape): boolean {\n return false\n }\n}\n","import {\n BaseBoxShapeUtil,\n hexToRgba,\n Rectangle2d,\n type BaseShape,\n type DefaultColorStyle,\n type Geometry2d,\n type StyleWords,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { propsOf, readNumber, readString } from \"./prop-access\"\nimport {\n FRAME_FILL,\n FRAME_NAME_COLOR,\n FRAME_NAME_FONT_SIZE,\n FRAME_NAME_HEIGHT,\n FRAME_NAME_OFFSET,\n FRAME_STROKE,\n FRAME_STROKE_WIDTH,\n} from \"./shape-theme\"\n\nexport interface FrameShapeProps {\n w: number\n h: number\n name: string\n color?: DefaultColorStyle\n}\n\nexport type FrameShape = BaseShape<\"frame\", FrameShapeProps>\n\nexport class FrameShapeUtil extends BaseBoxShapeUtil<FrameShape> {\n static override type = \"frame\" as const\n\n getDefaultProps(): FrameShapeProps {\n return { w: 160, h: 90, name: \"\" }\n }\n\n getGeometry(shape: FrameShape): Geometry2d {\n const p = propsOf(shape)\n return new Rectangle2d({ width: readNumber(p, \"w\", 160), height: readNumber(p, \"h\", 90), isFilled: true })\n }\n\n override getRenderStyle(_shape: FrameShape): StyleWords {\n return { fill: hexToRgba(FRAME_FILL), stroke: hexToRgba(FRAME_STROKE), strokeWidth: FRAME_STROKE_WIDTH, dash: 0, opacity: 1 }\n }\n\n component(shape: FrameShape): ReactNode {\n const p = propsOf(shape)\n const name = readString(p, \"name\", \"\")\n const w = readNumber(p, \"w\", 160)\n return (\n <div\n style={{\n position: \"absolute\",\n top: -FRAME_NAME_OFFSET,\n left: 0,\n width: w,\n height: FRAME_NAME_HEIGHT,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n pointerEvents: \"none\",\n }}\n >\n <TextLabel\n shape={shape}\n text={name}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n font=\"sans\"\n fontSize={FRAME_NAME_FONT_SIZE}\n color={FRAME_NAME_COLOR}\n align=\"start\"\n verticalAlign=\"end\"\n wrap={false}\n width={w}\n height={FRAME_NAME_HEIGHT}\n placeholder=\"Frame\"\n singleLine\n onChange={(next) => this.editor.updateShape<FrameShape>({ id: shape.id, type: \"frame\", props: { name: next } })}\n />\n </div>\n )\n }\n\n indicator(shape: FrameShape): ReactNode {\n const p = propsOf(shape)\n return <rect width={readNumber(p, \"w\", 160)} height={readNumber(p, \"h\", 90)} />\n }\n\n /** The GPU draws the frame body while its name is edited. */\n override needsOverlay(_shape: FrameShape): boolean {\n return false\n }\n\n override hasOverlayLabel(_shape: FrameShape): boolean {\n return true\n }\n\n /** Descendants are clipped to the frame's bounds, on the GPU and in the overlay. */\n override isClipShape(_shape: FrameShape): boolean {\n return true\n }\n\n override canEdit(_shape: FrameShape): boolean {\n return true\n }\n\n override canReceiveNewChildrenOfType(_shape: FrameShape, _type: string): boolean {\n return true\n }\n\n override canDropShapes(_shape: FrameShape, _shapes: UnknownShape[]): boolean {\n return true\n }\n\n override getText(shape: FrameShape): string {\n return readString(propsOf(shape), \"name\", \"\")\n }\n\n override onEditEnd(shape: FrameShape): void {\n const name = readString(propsOf(shape), \"name\", \"\")\n const trimmed = name.trim()\n if (trimmed !== name) this.editor.updateShape<FrameShape>({ id: shape.id, type: \"frame\", props: { name: trimmed } })\n }\n}\n","/**\n * Outline math for the `geo` shape. Every polygon is inscribed in the w×h box\n * so that its bounds are exactly the shape's bounds.\n */\nimport {\n CubicSpline2d,\n Ellipse2d,\n Group2d,\n Polygon2d,\n Polyline2d,\n Vec,\n type GeoShapeKind,\n type Geometry2d,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport { arcToCubicSegments, lineSegment, type CubicSegment } from \"./spline-helpers\"\n\nconst TAU = Math.PI * 2\n\n/**\n * Inner radius of the five-pointed star, as a fraction of the outer radius.\n * Measured off a reference render (interior-IoU and outline least-squares fits\n * of the same star both put it at 0.51 ± 0.02, calibrated against a render of\n * known ratio); a plain half reads the same to well under a pixel at any\n * sensible size. A smaller ratio makes the arms too thin.\n */\nexport const STAR_INNER_RATIO = 0.5\n\n/**\n * Angle of the hexagon's first vertex. A vertex sits at the top and one at the\n * bottom, which leaves the left and right sides vertical and running the full\n * width of the box — that is the orientation the reference draws, and it is\n * what `HEXAGON_FLAT_SIDE_SPAN` describes.\n */\nconst HEXAGON_START_ANGLE = -Math.PI / 2\n\n/**\n * Fraction of the box height spanned by the hexagon's two vertical sides. They\n * are centred, so they run from `(1 - span) / 2` to `(1 + span) / 2` of the\n * height, and the distance across them is the full box width.\n */\nexport const HEXAGON_FLAT_SIDE_SPAN = 0.5\n\n/** Affinely stretch points so their bounding box becomes exactly [0,w]×[0,h]. */\nexport function fitPointsToBox(points: readonly VecLike[], w: number, h: number): VecLike[] {\n if (points.length === 0) return []\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const p of points) {\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n const sx = maxX - minX > 0 ? w / (maxX - minX) : 0\n const sy = maxY - minY > 0 ? h / (maxY - minY) : 0\n return points.map((p) => ({ x: (p.x - minX) * sx, y: (p.y - minY) * sy }))\n}\n\n/**\n * Regular polygon (or star when `innerRatio` is given) with `sides` outer\n * vertices, first vertex at `startAngle`, stretched to fill the box.\n */\nfunction regularPolygon(sides: number, startAngle: number, w: number, h: number, innerRatio?: number): VecLike[] {\n const count = innerRatio === undefined ? sides : sides * 2\n const raw: VecLike[] = []\n for (let i = 0; i < count; i++) {\n const a = startAngle + (i / count) * TAU\n const r = innerRatio !== undefined && i % 2 === 1 ? innerRatio : 1\n raw.push({ x: Math.cos(a) * r, y: Math.sin(a) * r })\n }\n return fitPointsToBox(raw, w, h)\n}\n\n/** Block arrow pointing +x inside a w×h box (7 vertices). */\nfunction blockArrowRight(w: number, h: number): VecLike[] {\n const headLen = Math.min(w / 2, h / 2)\n const shaftTop = h / 4\n const shaftBottom = (3 * h) / 4\n return [\n { x: 0, y: shaftTop },\n { x: w - headLen, y: shaftTop },\n { x: w - headLen, y: 0 },\n { x: w, y: h / 2 },\n { x: w - headLen, y: h },\n { x: w - headLen, y: shaftBottom },\n { x: 0, y: shaftBottom },\n ]\n}\n\n/**\n * Polygon vertices for the polygonal geo kinds, or `null` for the curved kinds\n * (ellipse, oval, cloud, heart). `x-box` and `check-box` return their frame;\n * see `getGeoDecorations` for the marks inside.\n */\nexport function getGeoPolygonPoints(kind: GeoShapeKind, w: number, h: number): VecLike[] | null {\n switch (kind) {\n case \"rectangle\":\n case \"x-box\":\n case \"check-box\":\n return [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: h },\n { x: 0, y: h },\n ]\n case \"triangle\":\n return [\n { x: w / 2, y: 0 },\n { x: w, y: h },\n { x: 0, y: h },\n ]\n case \"diamond\":\n return [\n { x: w / 2, y: 0 },\n { x: w, y: h / 2 },\n { x: w / 2, y: h },\n { x: 0, y: h / 2 },\n ]\n case \"pentagon\":\n return regularPolygon(5, -Math.PI / 2, w, h)\n case \"hexagon\":\n return regularPolygon(6, HEXAGON_START_ANGLE, w, h)\n case \"octagon\":\n return regularPolygon(8, Math.PI / 8, w, h)\n case \"star\":\n return regularPolygon(5, -Math.PI / 2, w, h, STAR_INNER_RATIO)\n case \"rhombus\": {\n const off = Math.min(w / 3, h)\n return [\n { x: off, y: 0 },\n { x: w, y: 0 },\n { x: w - off, y: h },\n { x: 0, y: h },\n ]\n }\n case \"rhombus-2\": {\n const off = Math.min(w / 3, h)\n return [\n { x: 0, y: 0 },\n { x: w - off, y: 0 },\n { x: w, y: h },\n { x: off, y: h },\n ]\n }\n case \"trapezoid\": {\n const off = Math.min(w / 4, h / 2)\n return [\n { x: off, y: 0 },\n { x: w - off, y: 0 },\n { x: w, y: h },\n { x: 0, y: h },\n ]\n }\n case \"arrow-right\":\n return blockArrowRight(w, h)\n case \"arrow-left\":\n return blockArrowRight(w, h).map((p) => ({ x: w - p.x, y: p.y }))\n case \"arrow-down\":\n return blockArrowRight(h, w).map((p) => ({ x: p.y, y: p.x }))\n case \"arrow-up\":\n return blockArrowRight(h, w).map((p) => ({ x: p.y, y: h - p.x }))\n case \"ellipse\":\n case \"oval\":\n case \"cloud\":\n case \"heart\":\n return null\n }\n}\n\n/** Open polylines drawn inside the outline (the X of an x-box, the tick of a check-box). */\nexport function getGeoDecorations(kind: GeoShapeKind, w: number, h: number): VecLike[][] {\n switch (kind) {\n case \"x-box\":\n return [\n [\n { x: 0, y: 0 },\n { x: w, y: h },\n ],\n [\n { x: w, y: 0 },\n { x: 0, y: h },\n ],\n ]\n case \"check-box\":\n return [\n [\n { x: w * 0.25, y: h * 0.52 },\n { x: w * 0.43, y: h * 0.72 },\n { x: w * 0.76, y: h * 0.3 },\n ],\n ]\n default:\n return []\n }\n}\n\n/** Stadium / capsule: two semicircles joined by straight sides. */\nexport function getStadiumSegments(w: number, h: number): CubicSegment[] {\n if (w >= h) {\n const r = h / 2\n return [\n lineSegment({ x: r, y: 0 }, { x: w - r, y: 0 }),\n ...arcToCubicSegments({ x: w - r, y: r }, r, -Math.PI / 2, Math.PI, 2),\n lineSegment({ x: w - r, y: h }, { x: r, y: h }),\n ...arcToCubicSegments({ x: r, y: r }, r, Math.PI / 2, Math.PI, 2),\n ]\n }\n const r = w / 2\n return [\n ...arcToCubicSegments({ x: r, y: r }, r, Math.PI, Math.PI, 2),\n lineSegment({ x: w, y: r }, { x: w, y: h - r }),\n ...arcToCubicSegments({ x: r, y: h - r }, r, 0, Math.PI, 2),\n lineSegment({ x: 0, y: h - r }, { x: 0, y: r }),\n ]\n}\n\n/** Stretch closed spline control points so the sampled outline fills [0,w]×[0,h]. */\nfunction fitSegmentsToBox(segments: CubicSegment[], w: number, h: number): CubicSegment[] {\n const b = new CubicSpline2d({ segments, isClosed: true }).bounds\n const sx = b.w > 0 ? w / b.w : 0\n const sy = b.h > 0 ? h / b.h : 0\n const map = (p: VecLike): VecLike => ({ x: (p.x - b.x) * sx, y: (p.y - b.y) * sy })\n return segments.map((s) => ({ p0: map(s.p0), c1: map(s.c1), c2: map(s.c2), p1: map(s.p1) }))\n}\n\n/** A ring of round bumps around an inner ellipse, fitted to the box. */\nexport function getCloudSegments(w: number, h: number): CubicSegment[] {\n const bumps = Math.max(5, Math.min(12, Math.round((w + h) / 40)))\n const center = { x: w / 2, y: h / 2 }\n const rx = (w / 2) * 0.75\n const ry = (h / 2) * 0.7\n const anchors: VecLike[] = []\n for (let i = 0; i < bumps; i++) {\n const a = -Math.PI / 2 + (i / bumps) * TAU\n anchors.push({ x: center.x + rx * Math.cos(a), y: center.y + ry * Math.sin(a) })\n }\n const segments: CubicSegment[] = []\n for (let i = 0; i < bumps; i++) {\n const a = anchors[i]!\n const b = anchors[(i + 1) % bumps]!\n const chord = Vec.Sub(b, a)\n const len = Vec.Len(chord)\n const mid = Vec.Lrp(a, b, 0.5)\n let outward = Vec.Per(Vec.Uni(chord))\n if (Vec.Dot(outward, Vec.Sub(mid, center)) < 0) outward = Vec.Mul(outward, -1)\n const k = len * 0.55\n segments.push({\n p0: a,\n c1: Vec.Add(a, Vec.Mul(outward, k)),\n c2: Vec.Add(b, Vec.Mul(outward, k)),\n p1: b,\n })\n }\n return fitSegmentsToBox(segments, w, h)\n}\n\n/** Classic two-lobed heart, six cubics, bounds exactly w×h. */\nexport function getHeartSegments(w: number, h: number): CubicSegment[] {\n const P = (x: number, y: number): VecLike => ({ x: x * w, y: y * h })\n return [\n { p0: P(0.5, 0.25), c1: P(0.5, 0.1), c2: P(0.35, 0), p1: P(0.25, 0) },\n { p0: P(0.25, 0), c1: P(0.1, 0), c2: P(0, 0.15), p1: P(0, 0.3) },\n { p0: P(0, 0.3), c1: P(0, 0.55), c2: P(0.25, 0.75), p1: P(0.5, 1) },\n { p0: P(0.5, 1), c1: P(0.75, 0.75), c2: P(1, 0.55), p1: P(1, 0.3) },\n { p0: P(1, 0.3), c1: P(1, 0.15), c2: P(0.9, 0), p1: P(0.75, 0) },\n { p0: P(0.75, 0), c1: P(0.65, 0), c2: P(0.5, 0.1), p1: P(0.5, 0.25) },\n ]\n}\n\n/** Build the outline geometry for a geo kind inside a w×h box. */\nexport function getGeoGeometry(kind: GeoShapeKind, w: number, h: number, isFilled: boolean): Geometry2d {\n switch (kind) {\n case \"ellipse\":\n return new Ellipse2d({ width: w, height: h, isFilled })\n case \"oval\":\n return new CubicSpline2d({ segments: getStadiumSegments(w, h), isClosed: true, isFilled })\n case \"cloud\":\n return new CubicSpline2d({ segments: getCloudSegments(w, h), isClosed: true, isFilled })\n case \"heart\":\n return new CubicSpline2d({ segments: getHeartSegments(w, h), isClosed: true, isFilled })\n default: {\n const points = getGeoPolygonPoints(kind, w, h) ?? []\n const body = new Polygon2d({ points, isFilled })\n const decorations = getGeoDecorations(kind, w, h)\n if (decorations.length === 0) return body\n return new Group2d({ children: [body, ...decorations.map((points) => new Polyline2d({ points }))] })\n }\n }\n}\n","import {\n BaseBoxShapeUtil,\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GeoShapeGeoStyle,\n type BaseShape,\n type GeoShapeKind,\n type Geometry2d,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { alignToJustify, alignToTextAlign, TextLabel, verticalAlignToAlignItems } from \"../text/TextEditor\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { getGeoGeometry } from \"./geo-helpers\"\nimport { propsOf, readNumber, readString, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getFillRgba, getStrokeRgba, getTextCssColor } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\n\nexport interface GeoShapeProps {\n geo: GeoShapeKind\n w: number\n h: number\n color: DefaultColorStyle\n labelColor: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n align: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n growY: number\n url: string\n text: string\n scale: number\n}\n\nexport type GeoShape = BaseShape<\"geo\", GeoShapeProps>\n\nexport const GEO_LABEL_PADDING = 16\nconst LABEL_PADDING = GEO_LABEL_PADDING\n\nexport function horizontalAlignToFlex(align: DefaultHorizontalAlignStyle): CSSProperties[\"justifyContent\"] {\n return alignToJustify(align)\n}\n\nexport function horizontalAlignToTextAlign(align: DefaultHorizontalAlignStyle): CSSProperties[\"textAlign\"] {\n return alignToTextAlign(align)\n}\n\nexport function verticalAlignToFlex(align: DefaultVerticalAlignStyle): CSSProperties[\"alignItems\"] {\n return verticalAlignToAlignItems(align)\n}\n\n/**\n * `shape.props` with every declared prop present and of the declared type.\n * Geometry and rendering read through this so a record that arrived without a\n * prop (or with a value from another editor's vocabulary) still draws.\n */\nexport function readGeoProps(shape: { props?: unknown }): GeoShapeProps {\n const p = propsOf(shape)\n return {\n geo: readStyle(p, \"geo\", GeoShapeGeoStyle),\n w: readNumber(p, \"w\", 100),\n h: readNumber(p, \"h\", 100),\n color: readStyle(p, \"color\", DefaultColorStyle),\n labelColor: readStyle(p, \"labelColor\", DefaultLabelColorStyle),\n fill: readStyle(p, \"fill\", DefaultFillStyle),\n dash: readStyle(p, \"dash\", DefaultDashStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n font: readStyle(p, \"font\", DefaultFontStyle),\n align: readStyle(p, \"align\", DefaultHorizontalAlignStyle),\n verticalAlign: readStyle(p, \"verticalAlign\", DefaultVerticalAlignStyle),\n growY: readNumber(p, \"growY\", 0),\n url: readString(p, \"url\", \"\"),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\n/** Measured size of a geo label (padding included), wrapped at the shape width. */\nexport function measureGeoLabel(props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\">) {\n const text = readText(props)\n const font = readStyle(props, \"font\", DefaultFontStyle)\n const size = readStyle(props, \"size\", DefaultSizeStyle)\n const scale = readNumber(props, \"scale\", 1)\n const w = readNumber(props, \"w\", 100)\n return measureLabel(text, { font, fontSize: FONT_SIZES[size] * scale, maxWidth: Math.max(1, w), padding: LABEL_PADDING * scale })\n}\n\n/** `growY` a geo shape needs so its label fits inside `h`. Empty labels never grow the shape. */\nexport function getGeoGrowY(props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\" | \"h\">): number {\n if (!readText(props)) return 0\n return computeGrowY(measureGeoLabel(props).h, readNumber(props, \"h\", 100))\n}\n\nconst LABEL_KEYS: readonly (keyof GeoShapeProps)[] = [\"text\", \"font\", \"size\", \"scale\", \"w\", \"h\"]\n\nexport class GeoShapeUtil extends BaseBoxShapeUtil<GeoShape> {\n static override type = \"geo\" as const\n static override props = {\n geo: GeoShapeGeoStyle,\n color: DefaultColorStyle,\n labelColor: DefaultLabelColorStyle,\n fill: DefaultFillStyle,\n dash: DefaultDashStyle,\n size: DefaultSizeStyle,\n font: DefaultFontStyle,\n align: DefaultHorizontalAlignStyle,\n verticalAlign: DefaultVerticalAlignStyle,\n }\n\n getDefaultProps(): GeoShapeProps {\n return {\n geo: \"rectangle\",\n w: 100,\n h: 100,\n color: \"black\",\n labelColor: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n font: \"draw\",\n align: \"middle\",\n verticalAlign: \"middle\",\n growY: 0,\n url: \"\",\n text: \"\",\n scale: 1,\n }\n }\n\n getGeometry(shape: GeoShape): Geometry2d {\n const props = readGeoProps(shape)\n const { geo, w, h, growY, fill, text } = props\n const height = h + growY\n const body = getGeoGeometry(geo, w, height, fill !== \"none\")\n if (!text) return body\n return new Group2d({ children: [body, this.getLabelRect(props)] })\n }\n\n /** Where the text label sits inside the body, in shape-local space. */\n private getLabelRect(props: GeoShapeProps): Rectangle2d {\n const { w, h, growY, align, verticalAlign } = props\n const height = h + growY\n const m = measureGeoLabel(props)\n const lw = Math.min(w, m.w)\n const lh = Math.min(height, m.h)\n const x = align === \"start\" || align === \"start-legacy\" ? 0 : align === \"end\" || align === \"end-legacy\" ? w - lw : (w - lw) / 2\n const y = verticalAlign === \"start\" ? 0 : verticalAlign === \"end\" ? height - lh : (height - lh) / 2\n return new Rectangle2d({ x, y, width: lw, height: lh, isFilled: false, isLabel: true })\n }\n\n override getRenderStyle(shape: GeoShape): StyleWords {\n const { color, fill, dash, size, scale } = readGeoProps(shape)\n return {\n stroke: getStrokeRgba(color),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: getFillRgba(color, fill),\n dash: getDashId(dash),\n opacity: 1,\n }\n }\n\n component(shape: GeoShape): ReactNode {\n const { text, font, size, scale, labelColor, align, verticalAlign, w, h, growY } = readGeoProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n return (\n <TextLabel\n shape={shape}\n text={text}\n isEditing={isEditing}\n font={font}\n fontSize={FONT_SIZES[size] * scale}\n color={getTextCssColor(labelColor)}\n align={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h + growY}\n padding={LABEL_PADDING * scale}\n onChange={(next) => this.editor.updateShape<GeoShape>({ id: shape.id, type: \"geo\", props: { text: next } })}\n />\n )\n }\n\n indicator(shape: GeoShape): ReactNode {\n return <path d={pathWordsToSvgD(this.getGeometry(shape).toPathWords())} />\n }\n\n /** The GPU keeps drawing the body while editing; only the label lives in the DOM. */\n override needsOverlay(_shape: GeoShape): boolean {\n return false\n }\n\n override hasOverlayLabel(shape: GeoShape): boolean {\n return readText(shape.props).trim().length > 0 || this.editor.getEditingShapeId() === shape.id\n }\n\n override canEdit(_shape: GeoShape): boolean {\n return true\n }\n\n override getText(shape: GeoShape): string {\n return readText(shape.props)\n }\n\n override onBeforeCreate(next: GeoShape): GeoShape | void {\n const growY = getGeoGrowY(next.props)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onBeforeUpdate(prev: GeoShape, next: GeoShape): GeoShape | void {\n if (!LABEL_KEYS.some((k) => propsOf(prev)[k] !== propsOf(next)[k])) return\n const growY = getGeoGrowY(next.props)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onEditEnd(shape: GeoShape): void {\n const text = readText(shape.props)\n const trimmed = trimTrailingWhitespace(text)\n if (trimmed !== text) this.editor.updateShape<GeoShape>({ id: shape.id, type: \"geo\", props: { text: trimmed } })\n }\n}\n","import {\n FONT_SIZES,\n Rectangle2d,\n ShapeUtil,\n LIGHT_THEME,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n type BaseShape,\n type Geometry2d,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { propsOf, readNumber, readString, readStyle, readText } from \"./prop-access\"\nimport { getNoteBodyGradientCss, getNoteFillRgba, getNoteShadowCss, getNoteTextCssColor } from \"./shape-theme\"\n\nexport interface NoteShapeProps {\n color: DefaultColorStyle\n labelColor: DefaultColorStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n fontSizeAdjustment: number\n align: DefaultHorizontalAlignStyle\n verticalAlign: DefaultVerticalAlignStyle\n growY: number\n url: string\n text: string\n scale: number\n}\n\nexport type NoteShape = BaseShape<\"note\", NoteShapeProps>\n\nexport const NOTE_SIZE = 200\nexport const NOTE_PADDING = 16\n\n/**\n * `shape.props` with every declared prop present and of the declared type, so\n * geometry and rendering survive a record that arrived without one.\n */\nexport function readNoteProps(shape: { props?: unknown }): NoteShapeProps {\n const p = propsOf(shape)\n return {\n color: readStyle(p, \"color\", DefaultColorStyle),\n labelColor: readStyle(p, \"labelColor\", DefaultLabelColorStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n font: readStyle(p, \"font\", DefaultFontStyle),\n fontSizeAdjustment: readNumber(p, \"fontSizeAdjustment\", 0),\n align: readStyle(p, \"align\", DefaultHorizontalAlignStyle),\n verticalAlign: readStyle(p, \"verticalAlign\", DefaultVerticalAlignStyle),\n growY: readNumber(p, \"growY\", 0),\n url: readString(p, \"url\", \"\"),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\n/** Below this, a stored `fontSizeAdjustment` is not a font size anyone meant. */\nconst MIN_NOTE_FONT_SIZE = 4\n\n/**\n * Effective font size: an explicit adjustment (auto-shrunk text) wins over the\n * size style.\n *\n * `fontSizeAdjustment` is an absolute size in px, written when a label had to\n * shrink to fit; `0` means \"unset\". Files exist that write a small placeholder\n * there instead (a `1` on a note that was never shrunk), which would render the\n * label at one pixel, so anything too small to be a font size is also read as\n * unset and the size style takes over.\n */\nexport function getNoteFontSize(shape: NoteShape): number {\n const { size, scale, fontSizeAdjustment } = readNoteProps(shape)\n return (fontSizeAdjustment >= MIN_NOTE_FONT_SIZE ? fontSizeAdjustment : FONT_SIZES[size]) * scale\n}\n\n/** `growY` a note needs so its (centered) text fits; the note keeps its square width. */\nexport function getNoteGrowY(shape: NoteShape): number {\n const { text, font, scale } = readNoteProps(shape)\n if (!text) return 0\n const side = NOTE_SIZE * scale\n const m = measureLabel(text, { font, fontSize: getNoteFontSize(shape), maxWidth: side, padding: NOTE_PADDING * scale })\n return computeGrowY(m.h, side)\n}\n\nconst LABEL_KEYS: readonly (keyof NoteShapeProps)[] = [\"text\", \"font\", \"size\", \"scale\", \"fontSizeAdjustment\"]\n\nexport class NoteShapeUtil extends ShapeUtil<NoteShape> {\n static override type = \"note\" as const\n static override props = {\n color: DefaultColorStyle,\n labelColor: DefaultLabelColorStyle,\n size: DefaultSizeStyle,\n font: DefaultFontStyle,\n align: DefaultHorizontalAlignStyle,\n verticalAlign: DefaultVerticalAlignStyle,\n }\n\n getDefaultProps(): NoteShapeProps {\n return {\n color: \"black\",\n labelColor: \"black\",\n size: \"m\",\n font: \"draw\",\n fontSizeAdjustment: 0,\n align: \"middle\",\n verticalAlign: \"middle\",\n growY: 0,\n url: \"\",\n text: \"\",\n scale: 1,\n }\n }\n\n getGeometry(shape: NoteShape): Geometry2d {\n const { scale, growY } = readNoteProps(shape)\n return new Rectangle2d({ width: NOTE_SIZE * scale, height: NOTE_SIZE * scale + growY, isFilled: true })\n }\n\n override getRenderStyle(shape: NoteShape): StyleWords {\n return { fill: getNoteFillRgba(readNoteProps(shape).color), stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n component(shape: NoteShape): ReactNode {\n const { text, font, color, labelColor, align, verticalAlign, scale, growY } = readNoteProps(shape)\n const textColor = labelColor === \"black\" ? getNoteTextCssColor(color) : LIGHT_THEME[labelColor].solid\n const w = NOTE_SIZE * scale\n const h = NOTE_SIZE * scale + growY\n return (\n <>\n {/*\n The note's trim: a vertical gradient over the body and a soft shadow\n under it. The GPU quad below this covers exactly the shape's bounds\n and can carry neither, so both are drawn here, beneath the label. The\n shadow falls outside the body and is decoration only — the geometry,\n bounds and hit-testing are the flat rectangle either way.\n */}\n <div\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n background: getNoteBodyGradientCss(color),\n boxShadow: getNoteShadowCss(scale),\n pointerEvents: \"none\",\n }}\n />\n <TextLabel\n shape={shape}\n text={text}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n font={font}\n fontSize={getNoteFontSize(shape)}\n color={textColor}\n align={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h}\n padding={NOTE_PADDING * scale}\n onChange={(next) => this.editor.updateShape<NoteShape>({ id: shape.id, type: \"note\", props: { text: next } })}\n />\n </>\n )\n }\n\n indicator(shape: NoteShape): ReactNode {\n const { scale, growY } = readNoteProps(shape)\n return <rect width={NOTE_SIZE * scale} height={NOTE_SIZE * scale + growY} />\n }\n\n /**\n * The GPU draws the sticky background even while editing; the overlay adds\n * the gradient and the shadow over it (see `component`).\n */\n override needsOverlay(_shape: NoteShape): boolean {\n return false\n }\n\n override hasOverlayLabel(_shape: NoteShape): boolean {\n return true\n }\n\n override canEdit(_shape: NoteShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: NoteShape): boolean {\n return true\n }\n\n override getText(shape: NoteShape): string {\n return readText(shape.props)\n }\n\n override onBeforeCreate(next: NoteShape): NoteShape | void {\n const growY = getNoteGrowY(next)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onBeforeUpdate(prev: NoteShape, next: NoteShape): NoteShape | void {\n if (!LABEL_KEYS.some((k) => propsOf(prev)[k] !== propsOf(next)[k])) return\n const growY = getNoteGrowY(next)\n if (growY !== next.props.growY) return { ...next, props: { ...next.props, growY } }\n }\n\n override onEditEnd(shape: NoteShape): void {\n const text = readText(shape.props)\n const trimmed = trimTrailingWhitespace(text)\n if (trimmed !== text) this.editor.updateShape<NoteShape>({ id: shape.id, type: \"note\", props: { text: trimmed } })\n }\n}\n","/**\n * Rasterizes a text label to an offscreen canvas so the engine can draw it as a\n * textured quad instead of a DOM node.\n *\n * This is the pragmatic version of the phase-3 glyph atlas: one texture per\n * distinct label instead of one atlas of glyphs. Line breaking goes through the\n * shared `TextMeasure`, so a rasterized label wraps exactly where the DOM label\n * it replaces would.\n */\nimport { getTextMeasure } from \"./TextMeasure\"\n\nexport type TextTextureAlign = \"start\" | \"middle\" | \"end\"\n\nexport interface TextTextureSpec {\n text: string\n fontFamily: string\n fontSize: number\n /** Any CSS color string. */\n color: string\n align: TextTextureAlign\n verticalAlign: TextTextureAlign\n /** Unitless line-height multiplier. */\n lineHeight: number\n /** The box the texture covers, in page units — the shape's local geometry bounds. */\n width: number\n height: number\n /** Soft-wrap width in page units. Omit for no wrapping (one line per paragraph). */\n maxWidth?: number\n /**\n * Device pixels per page unit the canvas is rasterized at, i.e.\n * `dpr × min(4, zoom)`. Callers bucket it to a power of two\n * (`bucketTextureResolution` / `editor.getTextureResolution()`) so zooming\n * does not re-rasterize every frame.\n */\n resolution: number\n /** Padding inside the box, in page units. */\n padding?: number\n}\n\n/** Hard cap on either canvas dimension, so a huge label cannot blow up the GPU. */\nexport const MAX_TEXT_TEXTURE_PX = 4096\n\n/**\n * Cache key for a spec. Stable for equal specs and different for every field\n * that changes the pixels — the resolution bucket included.\n */\nexport function getTextTextureKey(spec: TextTextureSpec): string {\n return [\n \"text\",\n spec.fontFamily,\n spec.fontSize,\n spec.lineHeight,\n spec.color,\n spec.align,\n spec.verticalAlign,\n round(spec.width),\n round(spec.height),\n spec.maxWidth === undefined ? \"\" : round(spec.maxWidth),\n spec.padding ?? 0,\n spec.resolution,\n spec.text,\n ].join(\"|\")\n}\n\n/** Width of one unwrapped run, through the shared measurer (cached). */\nfunction runWidth(text: string, spec: TextTextureSpec): number {\n if (text.length === 0) return 0\n return getTextMeasure().measureText(text, {\n fontFamily: spec.fontFamily,\n fontSize: spec.fontSize,\n lineHeight: spec.lineHeight,\n }).w\n}\n\n/**\n * Break `spec.text` into the lines the label renders as: hard newlines always,\n * plus greedy word wrapping at `maxWidth` (breaking inside a word only when a\n * single word does not fit), mirroring `overflow-wrap: break-word`. Unlike the\n * SVG exporter's `wrapTextLines`, widths come from the shared `TextMeasure`, so\n * the raster matches the DOM label it replaces.\n */\nexport function wrapTextTextureLines(spec: TextTextureSpec): string[] {\n const padding = spec.padding ?? 0\n const max = spec.maxWidth === undefined ? undefined : Math.max(1, spec.maxWidth - padding * 2)\n const out: string[] = []\n for (const paragraph of spec.text.split(\"\\n\")) {\n if (max === undefined || paragraph.length === 0) {\n out.push(paragraph)\n continue\n }\n let line = \"\"\n for (const word of paragraph.split(\" \")) {\n const candidate = line.length === 0 ? word : `${line} ${word}`\n if (runWidth(candidate, spec) <= max || line.length === 0) {\n line = candidate\n // A single word wider than the box is split by characters.\n if (line.length > 0 && runWidth(line, spec) > max) {\n const parts = breakLongWord(line, spec, max)\n out.push(...parts.slice(0, -1))\n line = parts[parts.length - 1] ?? \"\"\n }\n continue\n }\n out.push(line)\n line = word\n }\n out.push(line)\n }\n return out\n}\n\nfunction breakLongWord(word: string, spec: TextTextureSpec, max: number): string[] {\n const parts: string[] = []\n let current = \"\"\n for (const char of word) {\n const next = current + char\n if (current.length > 0 && runWidth(next, spec) > max) {\n parts.push(current)\n current = char\n } else {\n current = next\n }\n }\n parts.push(current)\n return parts\n}\n\n/** Effective resolution after clamping the canvas to `MAX_TEXT_TEXTURE_PX`. */\nexport function getTextTextureScale(spec: TextTextureSpec): number {\n const longest = Math.max(1, spec.width, spec.height)\n return Math.max(0.05, Math.min(spec.resolution, MAX_TEXT_TEXTURE_PX / longest))\n}\n\n/**\n * Draw the label onto a canvas covering the whole `width × height` box, so the\n * engine's uv `0..1` quad over the shape's local bounds lands pixel-for-pixel.\n * Throws where there is no `document` (Node, SSR) — callers keep the DOM path.\n */\nexport function renderTextToCanvas(spec: TextTextureSpec): HTMLCanvasElement {\n if (typeof document === \"undefined\") throw new Error(\"mocanvas: no document to rasterize text with\")\n const scale = getTextTextureScale(spec)\n const canvas = document.createElement(\"canvas\")\n canvas.width = Math.max(1, Math.ceil(spec.width * scale))\n canvas.height = Math.max(1, Math.ceil(spec.height * scale))\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) throw new Error(\"mocanvas: no 2d context to rasterize text with\")\n\n const padding = spec.padding ?? 0\n const lines = wrapTextTextureLines(spec)\n const lineHeightPx = spec.fontSize * spec.lineHeight\n const blockHeight = lines.length * lineHeightPx\n\n ctx.scale(scale, scale)\n ctx.font = `${spec.fontSize}px ${spec.fontFamily}`\n ctx.fillStyle = spec.color\n ctx.textBaseline = \"middle\"\n ctx.textAlign = spec.align === \"start\" ? \"left\" : spec.align === \"end\" ? \"right\" : \"center\"\n\n const innerH = Math.max(0, spec.height - padding * 2)\n const x = spec.align === \"start\" ? padding : spec.align === \"end\" ? spec.width - padding : spec.width / 2\n const top = padding + (spec.verticalAlign === \"start\" ? 0 : spec.verticalAlign === \"end\" ? innerH - blockHeight : (innerH - blockHeight) / 2)\n\n for (let i = 0; i < lines.length; i++) {\n // CSS centres a run inside its line box; the canvas baseline does the same.\n ctx.fillText(lines[i]!, x, top + i * lineHeightPx + lineHeightPx / 2)\n }\n return canvas\n}\n\nfunction round(v: number): number {\n return Math.round(v * 100) / 100\n}\n","import {\n FONT_SIZES,\n Rectangle2d,\n ShapeUtil,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type ResizeInfo,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { getTextShapeSize } from \"../text/text-layout\"\nimport { getTextTextureKey, renderTextToCanvas, type TextTextureSpec } from \"../text/TextTexture\"\nimport { LINE_HEIGHT } from \"./text-helpers\"\nimport { propsOf, readBoolean, readEnum, readNumber, readStyle, readText } from \"./prop-access\"\nimport { getFontFamily, getStrokeRgba, getTextCssColor } from \"./shape-theme\"\n\nexport interface TextShapeProps {\n color: DefaultColorStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n textAlign: \"start\" | \"middle\" | \"end\"\n w: number\n text: string\n scale: number\n autoSize: boolean\n}\n\nexport type TextShape = BaseShape<\"text\", TextShapeProps>\n\nconst TEXT_ALIGNS = [\"start\", \"middle\", \"end\"] as const\n\n/**\n * `shape.props` with every declared prop present and of the declared type, so\n * measuring and rendering survive a record that arrived without one.\n */\nexport function readTextProps(shape: { props?: unknown }): TextShapeProps {\n const p = propsOf(shape)\n return {\n color: readStyle(p, \"color\", DefaultColorStyle),\n size: readStyle(p, \"size\", DefaultSizeStyle),\n font: readStyle(p, \"font\", DefaultFontStyle),\n textAlign: readEnum(p, \"textAlign\", TEXT_ALIGNS, \"start\"),\n w: readNumber(p, \"w\", 100),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n autoSize: readBoolean(p, \"autoSize\", true),\n }\n}\n\n/** Measured size of a text shape: intrinsic when `autoSize`, else wrapped at `w`. */\nexport function getTextShapeSizeFor(shape: TextShape): { w: number; h: number; lineCount: number } {\n const { text, size, scale, w, font, autoSize } = readTextProps(shape)\n return getTextShapeSize({ text, font, fontSize: FONT_SIZES[size] * scale, autoSize, w })\n}\n\n/** Height of the text block at its current width. */\nexport function getTextShapeHeight(shape: TextShape): number {\n return getTextShapeSizeFor(shape).h\n}\n\n/** The box `getGeometry` produces: what a texture for this shape must cover. */\nexport function getTextShapeBox(shape: TextShape): { w: number; h: number } {\n const { w, h } = getTextShapeSizeFor(shape)\n const props = readTextProps(shape)\n return { w: Math.max(1, props.autoSize ? Math.max(w, props.w) : props.w), h }\n}\n\n/** The rasterization spec for a text shape at the editor's current resolution bucket. */\nexport function getTextShapeTextureSpec(editor: Editor, shape: TextShape): TextTextureSpec {\n const { text, font, size, scale, color, textAlign, autoSize } = readTextProps(shape)\n const box = getTextShapeBox(shape)\n return {\n text,\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(color),\n align: textAlign,\n verticalAlign: \"start\",\n lineHeight: LINE_HEIGHT,\n width: box.w,\n height: box.h,\n ...(autoSize ? {} : { maxWidth: box.w }),\n resolution: editor.getTextureResolution(),\n }\n}\n\n/** Whether this environment can rasterize text at all (no `document` in Node/SSR). */\nfunction canRasterizeText(): boolean {\n return typeof document !== \"undefined\"\n}\n\nconst SIZE_KEYS: readonly (keyof TextShapeProps)[] = [\"text\", \"font\", \"size\", \"scale\", \"autoSize\"]\n\nexport class TextShapeUtil extends ShapeUtil<TextShape> {\n static override type = \"text\" as const\n static override props = { color: DefaultColorStyle, size: DefaultSizeStyle, font: DefaultFontStyle, textAlign: DefaultHorizontalAlignStyle }\n\n getDefaultProps(): TextShapeProps {\n return { color: \"black\", size: \"m\", font: \"draw\", textAlign: \"start\", w: 100, text: \"\", scale: 1, autoSize: true }\n }\n\n getGeometry(shape: TextShape): Geometry2d {\n const box = getTextShapeBox(shape)\n return new Rectangle2d({ width: box.w, height: box.h, isFilled: true })\n }\n\n /**\n * A texture of the rasterized label, so the GPU draws the text instead of the\n * DOM. The shape being edited (and any environment without a canvas) keeps\n * the DOM path; `fill` is the text colour so the level-of-detail quad the\n * engine draws below a few pixels still looks right.\n */\n override getRenderStyle(shape: TextShape): StyleWords | null {\n const key = this.getTextureKey(shape)\n if (!key) return null\n const texture = this.editor.textures.acquire(key.key, async () => renderTextToCanvas(key.spec))\n if (!texture) return null\n return { fill: getStrokeRgba(readTextProps(shape).color), stroke: 0, strokeWidth: 0, dash: 0, opacity: 1, texture }\n }\n\n /** The DOM label stands in while editing and until the texture is ready. */\n override needsOverlay(shape: TextShape): boolean {\n const key = this.getTextureKey(shape)\n return key === null || !this.editor.textures.isReady(key.key)\n }\n\n private getTextureKey(shape: TextShape): { key: string; spec: TextTextureSpec } | null {\n if (this.editor.getEditingShapeId() === shape.id) return null\n if (readText(shape.props).length === 0) return null\n if (!canRasterizeText()) return null\n const spec = getTextShapeTextureSpec(this.editor, shape)\n return { key: getTextTextureKey(spec), spec }\n }\n\n component(shape: TextShape): ReactNode {\n const { text, font, size, scale, color, textAlign, w, autoSize } = readTextProps(shape)\n return (\n <TextLabel\n shape={shape}\n text={text}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n font={font}\n fontSize={FONT_SIZES[size] * scale}\n color={getTextCssColor(color)}\n align={textAlign}\n verticalAlign=\"start\"\n wrap={!autoSize}\n width={Math.max(1, w)}\n onChange={(next) => this.editor.updateShape<TextShape>({ id: shape.id, type: \"text\", props: { text: next } })}\n />\n )\n }\n\n indicator(shape: TextShape): ReactNode {\n const b = this.getGeometry(shape).bounds\n return <rect width={b.w} height={b.h} />\n }\n\n override canEdit(_shape: TextShape): boolean {\n return true\n }\n\n override isAspectRatioLocked(_shape: TextShape): boolean {\n return false\n }\n\n override getText(shape: TextShape): string {\n return readText(shape.props)\n }\n\n /** Auto-sized text keeps `w` in sync with its measured width. */\n override onBeforeCreate(next: TextShape): TextShape | void {\n return this.fitWidth(next)\n }\n\n override onBeforeUpdate(prev: TextShape, next: TextShape): TextShape | void {\n if (!readTextProps(next).autoSize) return\n if (!SIZE_KEYS.some((k) => propsOf(prev)[k] !== propsOf(next)[k])) return\n return this.fitWidth(next)\n }\n\n private fitWidth(shape: TextShape): TextShape | void {\n const props = readTextProps(shape)\n if (!props.autoSize) return\n const { w } = getTextShapeSizeFor(shape)\n if (w !== props.w) return { ...shape, props: { ...shape.props, w } }\n }\n\n /** A text shape left empty after editing is removed. */\n override onEditEnd(shape: TextShape): void {\n if (readText(shape.props).trim().length === 0) this.editor.deleteShapes([shape.id])\n }\n\n /** Resizing a text shape changes its wrap width and turns auto-size off. */\n override onResize(shape: TextShape, info: ResizeInfo<TextShape>): Partial<TextShape> {\n const { scaleX, initialShape, newPoint } = info\n const w = Math.max(1, Math.abs(readTextProps(initialShape).w * scaleX))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, w, autoSize: false } }\n }\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type StyleWords,\n type VideoAsset,\n} from \"@mocanvas/editor\"\nimport { useEffect, useRef, type CSSProperties, type ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\n\nexport interface VideoShapeProps {\n w: number\n h: number\n /** The `video` asset holding the file; `null` while nothing is attached. */\n assetId: AssetId | null\n /** Playhead position, in seconds. */\n time: number\n playing: boolean\n /** A hyperlink attached to the shape (not the video source). */\n url: string\n altText: string\n}\n\nexport type VideoShape = BaseShape<\"video\", VideoShapeProps>\n\nexport const VIDEO_WIDTH = 640\nexport const VIDEO_HEIGHT = 360\n\nexport const VIDEO_PLACEHOLDER_FILL = \"#eceff3\"\nexport const VIDEO_PLACEHOLDER_STROKE = \"#9fa8b2\"\n/** The play triangle drawn on the placeholder (and in an SVG export). */\nexport const VIDEO_PLAY_COLOR = \"#5f6670\"\nexport const VIDEO_PLAY_SIZE = 48\n\n/** Seeking to within this many seconds of the stored time is treated as already there. */\nexport const VIDEO_TIME_EPSILON = 0.1\n\n/**\n * The file the shape plays: the asset's `src`, or `null` when there is no\n * asset yet, the asset is still uploading, or it is not a video.\n */\nexport function getVideoSource(editor: Editor, shape: VideoShape): string | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<VideoAsset>(assetId)\n if (!asset || asset.type !== \"video\") return null\n return asset.props.src ?? null\n}\n\nfunction readVideoBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", VIDEO_WIDTH), h: readNumber(p, \"h\", VIDEO_HEIGHT) }\n}\n\n/** The play triangle's points, centred in a `w`×`h` box. */\nexport function getVideoPlayTriangle(w: number, h: number, size = VIDEO_PLAY_SIZE): { x: number; y: number }[] {\n const s = Math.max(0, Math.min(size, w * 0.6, h * 0.6))\n const cx = w / 2\n const cy = h / 2\n // An equilateral-ish triangle pointing right, centred on its own area.\n const half = s / 2\n return [\n { x: cx - half * 0.6, y: cy - half },\n { x: cx - half * 0.6, y: cy + half },\n { x: cx + half * 0.9, y: cy },\n ]\n}\n\ninterface VideoPlayerProps {\n src: string\n time: number\n playing: boolean\n controls: boolean\n altText: string\n}\n\n/**\n * The `<video>` element, kept in step with the shape's `time` and `playing`\n * props. The props are the source of truth: the element is seeked and\n * played/paused from them, never the other way round, so two views of the same\n * document stay together.\n */\nfunction VideoPlayer({ src, time, playing, controls, altText }: VideoPlayerProps): ReactNode {\n const ref = useRef<HTMLVideoElement | null>(null)\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n // Seeking before metadata arrives is refused by some browsers, so it is\n // retried once the duration is known.\n const seek = (): void => {\n if (Math.abs(el.currentTime - time) <= VIDEO_TIME_EPSILON) return\n try {\n el.currentTime = time\n } catch {\n /* not seekable yet; `loadedmetadata` retries */\n }\n }\n seek()\n el.addEventListener(\"loadedmetadata\", seek)\n return () => el.removeEventListener(\"loadedmetadata\", seek)\n }, [time, src])\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n // Autoplay may be refused (a policy, a decode error); the shape stays put.\n if (playing) void el.play().catch(() => {})\n else el.pause()\n }, [playing, src])\n\n return (\n <video\n ref={ref}\n src={src}\n controls={controls}\n playsInline\n muted\n loop\n preload=\"metadata\"\n aria-label={altText || undefined}\n draggable={false}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n // Controls are only reachable while editing; otherwise the canvas\n // keeps the pointer so a drag over a video still pans.\n pointerEvents: controls ? \"auto\" : \"none\",\n userSelect: \"none\",\n }}\n />\n )\n}\n\nexport class VideoShapeUtil extends BaseBoxShapeUtil<VideoShape> {\n static override type = \"video\" as const\n\n getDefaultProps(): VideoShapeProps {\n return { w: VIDEO_WIDTH, h: VIDEO_HEIGHT, assetId: null, time: 0, playing: true, url: \"\", altText: \"\" }\n }\n\n getGeometry(shape: VideoShape): Geometry2d {\n const { w, h } = readVideoBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** A moving picture is not a texture the engine owns: video renders in the DOM overlay. */\n override getRenderStyle(_shape: VideoShape): StyleWords | null {\n return null\n }\n\n component(shape: VideoShape): ReactNode {\n const { w, h } = readVideoBox(shape)\n const p = propsOf(shape)\n const altText = readString(p, \"altText\", \"\")\n const src = getVideoSource(this.editor, shape)\n const box: CSSProperties = { position: \"absolute\", left: 0, top: 0, width: w, height: h, overflow: \"hidden\", boxSizing: \"border-box\" }\n if (!src) {\n const [a, b, c] = getVideoPlayTriangle(w, h)\n return (\n <div\n style={{ ...box, background: VIDEO_PLACEHOLDER_FILL, border: `1px dashed ${VIDEO_PLACEHOLDER_STROKE}`, pointerEvents: \"none\" }}\n aria-label={altText || \"video\"}\n >\n <svg width={w} height={h} viewBox={`0 0 ${Math.max(1, w)} ${Math.max(1, h)}`} style={{ display: \"block\" }} aria-hidden=\"true\">\n <polygon points={`${a!.x},${a!.y} ${b!.x},${b!.y} ${c!.x},${c!.y}`} fill={VIDEO_PLAY_COLOR} />\n </svg>\n </div>\n )\n }\n return (\n <div style={box}>\n <VideoPlayer\n src={src}\n time={readNumber(p, \"time\", 0)}\n playing={readBoolean(p, \"playing\", true)}\n controls={this.editor.getEditingShapeId() === shape.id}\n altText={altText}\n />\n </div>\n )\n }\n\n indicator(shape: VideoShape): ReactNode {\n const { w, h } = readVideoBox(shape)\n return <rect width={w} height={h} />\n }\n\n /** Editing a video means taking its controls, not typing into it. */\n override canEdit(_shape: VideoShape): boolean {\n return true\n }\n\n override isAspectRatioLocked(_shape: VideoShape): boolean {\n return true\n }\n}\n","/**\n * Small, DOM-free helpers shared by the SVG exporter: number formatting,\n * colour conversion from the engine's `0xRRGGBBAA` words, XML escaping and\n * dash patterns.\n */\nimport { PATH_OP, type Geometry2d, type Group2d, type StyleWords } from \"@mocanvas/editor\"\nimport { pathWordsToSvgD } from \"../shapes/svg-path\"\n\n/** Affine transform components as returned by `Editor.getShapePageTransform`. */\nexport interface SvgTransform {\n a: number\n b: number\n c: number\n d: number\n e: number\n f: number\n}\n\n/** Format a number for an SVG attribute: at most two decimals, no `-0`. */\nexport function svgNum(v: number): string {\n if (!Number.isFinite(v)) return \"0\"\n const r = Math.round(v * 100) / 100\n return String(r === 0 ? 0 : r)\n}\n\n/** Escape text for use inside an element or a double-quoted attribute. */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\n/** Alpha channel (0..255) of an engine colour word. */\nexport function rgbaAlpha(word: number): number {\n return (word >>> 0) & 0xff\n}\n\n/**\n * Convert an engine `0xRRGGBBAA` word to `#rrggbb` (opaque) or `#rrggbbaa`.\n * Returns `undefined` when the colour is fully transparent (\"none\").\n */\nexport function rgbaToHex(word: number): string | undefined {\n const w = word >>> 0\n const a = w & 0xff\n if (a === 0) return undefined\n const r = (w >>> 24) & 0xff\n const g = (w >>> 16) & 0xff\n const b = (w >>> 8) & 0xff\n const hex = (n: number): string => n.toString(16).padStart(2, \"0\")\n return a === 0xff ? `#${hex(r)}${hex(g)}${hex(b)}` : `#${hex(r)}${hex(g)}${hex(b)}${hex(a)}`\n}\n\n/** `matrix(a b c d e f)` for a `transform` attribute. */\nexport function matrixAttr(m: SvgTransform): string {\n return `matrix(${svgNum(m.a)} ${svgNum(m.b)} ${svgNum(m.c)} ${svgNum(m.d)} ${svgNum(m.e)} ${svgNum(m.f)})`\n}\n\n/**\n * `stroke-dasharray` for an engine dash id (0 solid, 1 dashed, 2 dotted,\n * 3 draw). Solid and draw strokes have no dash array.\n */\nexport function dashArray(dash: number, strokeWidth: number): string | undefined {\n const sw = Math.max(0.5, strokeWidth)\n switch (dash) {\n case 1:\n return `${svgNum(sw * 2)} ${svgNum(sw * 2)}`\n case 2:\n // Zero-length dashes with round caps read as dots.\n return `0.1 ${svgNum(sw * 2)}`\n default:\n return undefined\n }\n}\n\n/** Build an attribute string from a record, skipping `undefined` values. */\nexport function attrs(values: Record<string, string | number | undefined>): string {\n const parts: string[] = []\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined) continue\n parts.push(`${k}=\"${typeof v === \"number\" ? svgNum(v) : escapeXml(v)}\"`)\n }\n return parts.join(\" \")\n}\n\n/** Stroke presentation attributes shared by every stroked path. */\nexport function strokeAttrs(style: StyleWords): Record<string, string | number | undefined> {\n const stroke = rgbaToHex(style.stroke)\n if (!stroke || style.strokeWidth <= 0) return { stroke: \"none\" }\n return {\n stroke,\n \"stroke-width\": style.strokeWidth,\n \"stroke-linejoin\": \"round\",\n \"stroke-linecap\": \"round\",\n \"stroke-dasharray\": dashArray(style.dash, style.strokeWidth),\n }\n}\n\nfunction isGroup(g: Geometry2d): g is Group2d {\n return Array.isArray((g as Group2d).children)\n}\n\n/** Leaf geometries of a (possibly nested) group, label rectangles excluded. */\nexport function geometryLeaves(geometry: Geometry2d): Geometry2d[] {\n if (!isGroup(geometry)) return geometry.isLabel ? [] : [geometry]\n return geometry.children.flatMap((c) => geometryLeaves(c))\n}\n\n/** Label rectangles of a geometry (the boxes text labels occupy), in shape-local space. */\nexport function geometryLabels(geometry: Geometry2d): Geometry2d[] {\n if (!isGroup(geometry)) return geometry.isLabel ? [geometry] : []\n return geometry.children.flatMap((c) => geometryLabels(c))\n}\n\n/** Whether a flat path has at least one drawable command. */\nexport function hasPathWords(words: readonly number[]): boolean {\n return words.length > 0 && words[0] === PATH_OP.MOVE\n}\n\n/**\n * One `<path>` per leaf geometry, filled only where the leaf is a closed,\n * filled outline and stroked with the shape's stroke. Empty leaves are skipped.\n */\nexport function geometryToSvgPaths(geometry: Geometry2d, style: StyleWords): string {\n const fill = rgbaToHex(style.fill)\n const stroke = strokeAttrs(style)\n const out: string[] = []\n for (const leaf of geometryLeaves(geometry)) {\n const words = leaf.toPathWords()\n if (!hasPathWords(words)) continue\n const filled = fill !== undefined && leaf.isClosed && leaf.isFilled\n out.push(`<path ${attrs({ d: pathWordsToSvgD(words), fill: filled ? fill : \"none\", ...stroke })}/>`)\n }\n return out.join(\"\")\n}\n","/**\n * Text labels as `<text>` elements. Layout mirrors the DOM label: paragraphs\n * split on newlines, soft-wrapped at an average glyph advance (the same\n * estimate the Node-side text measurer uses), one `<tspan>` per line.\n */\nimport type { DefaultHorizontalAlignStyle, DefaultVerticalAlignStyle } from \"@mocanvas/editor\"\nimport { AVG_CHAR_WIDTH, LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { attrs, escapeXml, svgNum } from \"./svg-utils\"\n\nexport interface SvgTextBox {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface SvgTextOptions {\n fontFamily: string\n fontSize: number\n /** CSS colour for the glyphs. */\n color: string\n align: DefaultHorizontalAlignStyle | \"start\" | \"middle\" | \"end\"\n verticalAlign: DefaultVerticalAlignStyle\n /** Inset from the box edges on every side. */\n padding?: number\n /** Soft-wrap paragraphs at the box width (minus padding). */\n wrap?: boolean\n fontWeight?: string | number\n}\n\n/** Split `text` into rendered lines: hard breaks on `\\n`, soft wraps at `maxWidth` when given. */\nexport function wrapTextLines(text: string, fontSize: number, maxWidth = Infinity): string[] {\n const charW = fontSize * AVG_CHAR_WIDTH\n const limit = Number.isFinite(maxWidth) && charW > 0 ? Math.max(1, Math.floor(maxWidth / charW)) : Infinity\n const lines: string[] = []\n for (const paragraph of text.split(\"\\n\")) {\n if (paragraph.length <= limit) {\n lines.push(paragraph)\n continue\n }\n let current = \"\"\n for (const word of paragraph.split(\" \")) {\n const candidate = current.length === 0 ? word : `${current} ${word}`\n if (candidate.length <= limit) {\n current = candidate\n continue\n }\n if (current.length > 0) lines.push(current)\n // A single word longer than the line breaks mid-word, like `overflow-wrap: break-word`.\n let rest = word\n while (rest.length > limit) {\n lines.push(rest.slice(0, limit))\n rest = rest.slice(limit)\n }\n current = rest\n }\n lines.push(current)\n }\n return lines\n}\n\nfunction anchorFor(align: SvgTextOptions[\"align\"]): \"start\" | \"middle\" | \"end\" {\n switch (align) {\n case \"start\":\n case \"start-legacy\":\n return \"start\"\n case \"end\":\n case \"end-legacy\":\n return \"end\"\n default:\n return \"middle\"\n }\n}\n\n/**\n * Render `text` inside `box`. Returns an empty string for empty text. Lines\n * are positioned with `dominant-baseline=\"central\"` so vertical centring does\n * not depend on font metrics.\n */\nexport function textToSvg(text: string, box: SvgTextBox, opts: SvgTextOptions): string {\n if (text.length === 0) return \"\"\n const padding = opts.padding ?? 0\n const innerX = box.x + padding\n const innerY = box.y + padding\n const innerW = Math.max(0, box.w - padding * 2)\n const innerH = Math.max(0, box.h - padding * 2)\n const lines = wrapTextLines(text, opts.fontSize, opts.wrap ? innerW : Infinity)\n const lineH = opts.fontSize * LINE_HEIGHT\n const blockH = lines.length * lineH\n\n const anchor = anchorFor(opts.align)\n const x = anchor === \"start\" ? innerX : anchor === \"end\" ? innerX + innerW : innerX + innerW / 2\n const top = opts.verticalAlign === \"start\" ? innerY : opts.verticalAlign === \"end\" ? innerY + innerH - blockH : innerY + (innerH - blockH) / 2\n\n const spans = lines\n .map((line, i) => {\n const y = top + lineH * i + lineH / 2\n // Preserve runs of spaces and keep empty lines from collapsing.\n const content = line.length === 0 ? \"​\" : escapeXml(line)\n return `<tspan x=\"${svgNum(x)}\" y=\"${svgNum(y)}\">${content}</tspan>`\n })\n .join(\"\")\n\n const a = attrs({\n \"font-family\": opts.fontFamily,\n \"font-size\": opts.fontSize,\n \"font-weight\": opts.fontWeight === undefined ? undefined : String(opts.fontWeight),\n fill: opts.color,\n \"text-anchor\": anchor,\n \"dominant-baseline\": \"central\",\n \"xml:space\": \"preserve\",\n })\n return `<text ${a}>${spans}</text>`\n}\n","/**\n * Per-type SVG renderers for the built-in shapes, keyed by shape type. Every\n * renderer returns markup in shape-local space; the exporter wraps it in a\n * `<g transform>` carrying the page transform.\n *\n * The registry is the middle rung of `shapeToSvg`'s precedence: a util's own\n * `toSvg` outranks it, and a type with neither falls back to its geometry\n * outline drawn with its render style.\n */\nimport type { ReactElement } from \"react\"\nimport { renderToStaticMarkup } from \"react-dom/server\"\nimport {\n FONT_SIZES,\n LIGHT_THEME,\n hexToRgba,\n type Editor,\n type ShapeSvgContext,\n type ShapeSvgResult,\n type StyleWords,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport { ARROW_LABEL_PADDING, type ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport {\n BOOKMARK_BANNER_FILL,\n BOOKMARK_FILL,\n BOOKMARK_META_COLOR,\n BOOKMARK_META_FONT_SIZE,\n BOOKMARK_RADIUS,\n BOOKMARK_STROKE,\n BOOKMARK_STROKE_WIDTH,\n BOOKMARK_TEXT_COLOR,\n BOOKMARK_TEXT_FONT_SIZE,\n BOOKMARK_TITLE_COLOR,\n BOOKMARK_TITLE_FONT_SIZE,\n getBookmarkCard,\n getBookmarkLayout,\n type BookmarkShape,\n} from \"../shapes/BookmarkShapeUtil\"\nimport {\n EMBED_PLACEHOLDER_FILL,\n EMBED_PLACEHOLDER_FONT_SIZE,\n EMBED_PLACEHOLDER_PADDING,\n EMBED_PLACEHOLDER_STROKE,\n EMBED_PLACEHOLDER_TEXT,\n EMBED_RADIUS,\n getEmbedDefinition,\n type EmbedShape,\n} from \"../shapes/EmbedShapeUtil\"\nimport { type FrameShape } from \"../shapes/FrameShapeUtil\"\nimport { GEO_LABEL_PADDING, type GeoShape } from \"../shapes/GeoShapeUtil\"\nimport { getNoteFontSize, NOTE_PADDING, NOTE_SIZE, type NoteShape } from \"../shapes/NoteShapeUtil\"\nimport {\n FRAME_FILL,\n FRAME_NAME_COLOR,\n FRAME_NAME_FONT_SIZE,\n FRAME_NAME_HEIGHT,\n FRAME_NAME_OFFSET,\n FRAME_STROKE,\n FRAME_STROKE_WIDTH,\n NOTE_SHADOW_COLOR,\n NOTE_SHADOW_OPACITY,\n getFontFamily,\n getNoteFillCssColor,\n getNoteGradientTopFrom,\n getNoteShadowSvgRect,\n getNoteTextCssColor,\n getTextCssColor,\n} from \"../shapes/shape-theme\"\nimport { type TextShape } from \"../shapes/TextShapeUtil\"\nimport {\n getVideoPlayTriangle,\n getVideoSource,\n VIDEO_PLACEHOLDER_FILL,\n VIDEO_PLACEHOLDER_STROKE,\n VIDEO_PLAY_COLOR,\n type VideoShape,\n} from \"../shapes/VideoShapeUtil\"\nimport { attrs, escapeXml, geometryLabels, geometryToSvgPaths, rgbaToHex, svgNum } from \"./svg-utils\"\nimport { textToSvg } from \"./text-svg\"\n\n/**\n * Export-wide settings a renderer may consult. Same shape as the context a\n * `ShapeUtil.toSvg` receives, so the two paths cannot drift apart.\n */\nexport interface SvgExportContext extends ShapeSvgContext {}\n\n/** Renders one shape to SVG markup in shape-local coordinates. */\nexport type ShapeSvgRenderer<T extends UnknownShape = UnknownShape> = (editor: Editor, shape: T, ctx: SvgExportContext) => string\n\n/** Outline drawn with the render style, or a hairline in the theme text colour when the shape has none. */\nexport function geometryFallbackSvg(editor: Editor, shape: UnknownShape): string {\n const geometry = editor.getShapeGeometry(shape)\n const style: StyleWords = editor.getShapeUtil(shape).getRenderStyle(shape) ?? {\n fill: 0,\n stroke: hexToRgba(LIGHT_THEME.text),\n strokeWidth: 1,\n dash: 0,\n opacity: 1,\n }\n return geometryToSvgPaths(geometry, style)\n}\n\n/** Fallback renderer applied to shape types without a registry entry. */\nexport const defaultShapeSvgRenderer: ShapeSvgRenderer = (editor, shape) => geometryFallbackSvg(editor, shape)\n\n/** A shape id reduced to characters that are safe inside an SVG `id`. */\nfunction svgId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]/g, \"-\")\n}\n\nfunction labelBox(editor: Editor, shape: UnknownShape): { x: number; y: number; w: number; h: number } | undefined {\n const label = geometryLabels(editor.getShapeGeometry(shape))[0]\n if (!label) return undefined\n const b = label.bounds\n return { x: b.x, y: b.y, w: b.w, h: b.h }\n}\n\nconst geoSvg: ShapeSvgRenderer<GeoShape> = (editor, shape) => {\n const { text, font, size, scale, labelColor, align, verticalAlign } = shape.props\n let out = geometryFallbackSvg(editor, shape)\n if (!text) return out\n const box = labelBox(editor, shape)\n if (!box) return out\n out += textToSvg(text, box, {\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(labelColor),\n align,\n verticalAlign,\n padding: GEO_LABEL_PADDING * scale,\n wrap: true,\n })\n return out\n}\n\nconst drawSvg: ShapeSvgRenderer = (editor, shape) => geometryFallbackSvg(editor, shape)\nconst lineSvg: ShapeSvgRenderer = (editor, shape) => geometryFallbackSvg(editor, shape)\n\nconst arrowSvg: ShapeSvgRenderer<ArrowShape> = (editor, shape, ctx) => {\n const { text, font, size, scale, labelColor } = shape.props\n let out = geometryFallbackSvg(editor, shape)\n if (!text) return out\n const box = labelBox(editor, shape)\n if (!box) return out\n // Knock the line out behind the label so the text stays legible.\n out += `<rect ${attrs({ x: box.x, y: box.y, width: box.w, height: box.h, rx: 4, fill: ctx.background })}/>`\n out += textToSvg(text, box, {\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(labelColor),\n align: \"middle\",\n verticalAlign: \"middle\",\n padding: ARROW_LABEL_PADDING * scale,\n wrap: false,\n })\n return out\n}\n\nconst textSvg: ShapeSvgRenderer<TextShape> = (editor, shape) => {\n const { text, font, size, scale, color, textAlign, autoSize } = shape.props\n const b = editor.getShapeGeometry(shape).bounds\n return textToSvg(text, { x: b.x, y: b.y, w: b.w, h: b.h }, {\n fontFamily: getFontFamily(font),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(color),\n align: textAlign,\n verticalAlign: \"start\",\n wrap: !autoSize,\n })\n}\n\n/**\n * A note's trim as SVG: a `<linearGradient>` for the body and an\n * `feDropShadow` under it, so an export carries the same trim the DOM overlay\n * paints over the GPU quad. Ids are namespaced by the shape id so several\n * notes in one document do not collide.\n */\nfunction noteTrimDefs(shape: NoteShape, bottom: string, ids: { gradient: string; shadow: string }): string {\n const scale = shape.props.scale\n const gradient =\n `<linearGradient ${attrs({ id: ids.gradient, x1: 0, y1: 0, x2: 0, y2: 1 })}>` +\n `<stop ${attrs({ offset: 0, \"stop-color\": getNoteGradientTopFrom(bottom) })}/>` +\n `<stop ${attrs({ offset: 1, \"stop-color\": bottom })}/>` +\n `</linearGradient>`\n // A generous filter region: the default -10%/120% box clips a soft shadow.\n // `feDropShadow` has no spread, so the shadow is its own inset, offset rect\n // (see `getNoteShadowSvgRect`) and the filter only blurs it.\n const filter =\n `<filter ${attrs({ id: ids.shadow, x: \"-50%\", y: \"-50%\", width: \"200%\", height: \"200%\" })}>` +\n `<feGaussianBlur ${attrs({ stdDeviation: getNoteShadowSvgRect(0, 0, scale).stdDeviation })}/>` +\n `</filter>`\n return `<defs>${gradient}${filter}</defs>`\n}\n\nconst noteSvg: ShapeSvgRenderer<NoteShape> = (editor, shape) => {\n const { text, font, color, labelColor, align, verticalAlign, scale, growY } = shape.props\n const w = NOTE_SIZE * scale\n const h = NOTE_SIZE * scale + growY\n const style = editor.getShapeUtil(shape).getRenderStyle(shape)\n // The engine's flat quad is the gradient's *bottom* colour; the top stop is\n // derived from it, so a custom fill still gradates.\n const bottom = (style && rgbaToHex(style.fill)) ?? getNoteFillCssColor(color)\n const suffix = svgId(shape.id)\n const ids = { gradient: `mc-note-fill-${suffix}`, shadow: `mc-note-shadow-${suffix}` }\n let out = noteTrimDefs(shape, bottom, ids)\n // The shadow first, as its own blurred rect behind the body: the body inset\n // by the spread and pushed down, which is what CSS `box-shadow` draws.\n const sh = getNoteShadowSvgRect(w, h, scale)\n if (sh.w > 0 && sh.h > 0) {\n out += `<rect ${attrs({\n x: sh.x,\n y: sh.y,\n width: sh.w,\n height: sh.h,\n fill: NOTE_SHADOW_COLOR,\n \"fill-opacity\": NOTE_SHADOW_OPACITY,\n filter: `url(#${ids.shadow})`,\n })}/>`\n }\n out += `<rect ${attrs({ x: 0, y: 0, width: w, height: h, fill: `url(#${ids.gradient})` })}/>`\n if (!text) return out\n const textColor = labelColor === \"black\" ? getNoteTextCssColor(color) : LIGHT_THEME[labelColor].solid\n out += textToSvg(text, { x: 0, y: 0, w, h }, {\n fontFamily: getFontFamily(font),\n fontSize: getNoteFontSize(shape),\n color: textColor,\n align,\n verticalAlign,\n padding: NOTE_PADDING * scale,\n wrap: true,\n })\n return out\n}\n\nconst frameSvg: ShapeSvgRenderer<FrameShape> = (_editor, shape) => {\n const { w, h, name } = shape.props\n let out = `<rect ${attrs({ x: 0, y: 0, width: w, height: h, fill: FRAME_FILL, stroke: FRAME_STROKE, \"stroke-width\": FRAME_STROKE_WIDTH })}/>`\n if (name) {\n // The single-line name sits in a strip just above the frame, like the DOM label.\n const [firstLine = \"\"] = name.split(\"\\n\")\n out += textToSvg(firstLine, { x: 0, y: -FRAME_NAME_OFFSET, w, h: FRAME_NAME_HEIGHT }, {\n fontFamily: getFontFamily(\"sans\"),\n fontSize: FRAME_NAME_FONT_SIZE,\n color: FRAME_NAME_COLOR,\n align: \"start\",\n verticalAlign: \"end\",\n wrap: false,\n })\n }\n return out\n}\n\n/**\n * A bookmark's card, drawn with rects and text. The banner is a plain block\n * rather than the scraped image: an export has to stand on its own, and a\n * remote `<image href>` would either fail to load or leak a request when the\n * file is opened somewhere else.\n */\nconst bookmarkSvg: ShapeSvgRenderer<BookmarkShape> = (editor, shape) => {\n const { w, h } = shape.props\n const card = getBookmarkCard(editor, shape)\n const layout = getBookmarkLayout(w, h)\n const sans = getFontFamily(\"sans\")\n let out = `<rect ${attrs({\n x: 0,\n y: 0,\n width: w,\n height: h,\n rx: BOOKMARK_RADIUS,\n fill: BOOKMARK_FILL,\n stroke: BOOKMARK_STROKE,\n \"stroke-width\": BOOKMARK_STROKE_WIDTH,\n })}/>`\n if (layout.banner.h > 0) {\n out += `<rect ${attrs({ x: 0, y: 0, width: layout.banner.w, height: layout.banner.h, fill: BOOKMARK_BANNER_FILL })}/>`\n }\n const title = card.hasAsset ? card.title : card.hostname || card.url\n out += textToSvg(title, layout.title, {\n fontFamily: sans,\n fontSize: BOOKMARK_TITLE_FONT_SIZE,\n color: card.hasAsset ? BOOKMARK_TITLE_COLOR : BOOKMARK_META_COLOR,\n align: \"start\",\n verticalAlign: \"start\",\n ...(card.hasAsset ? { fontWeight: 600 } : {}),\n wrap: true,\n })\n if (!card.hasAsset) return out\n out += textToSvg(card.description, layout.description, {\n fontFamily: sans,\n fontSize: BOOKMARK_TEXT_FONT_SIZE,\n color: BOOKMARK_TEXT_COLOR,\n align: \"start\",\n verticalAlign: \"start\",\n wrap: true,\n })\n if (card.favicon) {\n // The favicon's block, for the same reason the banner is one.\n out += `<rect ${attrs({ ...boxAttrs(layout.favicon), rx: 2, fill: BOOKMARK_BANNER_FILL })}/>`\n }\n out += textToSvg(card.hostname, layout.hostname, {\n fontFamily: sans,\n fontSize: BOOKMARK_META_FONT_SIZE,\n color: BOOKMARK_META_COLOR,\n align: \"start\",\n verticalAlign: \"middle\",\n wrap: false,\n })\n return out\n}\n\n/** `x`/`y`/`width`/`height` attributes for a shape-local rect. */\nfunction boxAttrs(box: { x: number; y: number; w: number; h: number }): Record<string, number> {\n return { x: box.x, y: box.y, width: box.w, height: box.h }\n}\n\n/**\n * An embed as a placeholder card: an `<iframe>` cannot go in an SVG, so the\n * export carries the frame and the url it pointed at.\n */\nconst embedSvg: ShapeSvgRenderer<EmbedShape> = (_editor, shape) => {\n const { w, h, url } = shape.props\n const match = getEmbedDefinition(url)\n const label = match ? `${match.definition.title}\\n${url}` : url\n let out = `<rect ${attrs({\n x: 0,\n y: 0,\n width: w,\n height: h,\n rx: EMBED_RADIUS,\n fill: EMBED_PLACEHOLDER_FILL,\n stroke: EMBED_PLACEHOLDER_STROKE,\n \"stroke-width\": 1,\n \"stroke-dasharray\": \"4 4\",\n })}/>`\n out += textToSvg(label, { x: 0, y: 0, w, h }, {\n fontFamily: getFontFamily(\"sans\"),\n fontSize: EMBED_PLACEHOLDER_FONT_SIZE,\n color: EMBED_PLACEHOLDER_TEXT,\n align: \"middle\",\n verticalAlign: \"middle\",\n padding: EMBED_PLACEHOLDER_PADDING,\n wrap: true,\n })\n return out\n}\n\n/** A video as its poster frame's stand-in: the box and a play triangle. */\nconst videoSvg: ShapeSvgRenderer<VideoShape> = (editor, shape) => {\n const { w, h, altText } = shape.props\n const hasSource = getVideoSource(editor, shape) !== null\n let out = `<rect ${attrs({\n x: 0,\n y: 0,\n width: w,\n height: h,\n fill: VIDEO_PLACEHOLDER_FILL,\n stroke: VIDEO_PLACEHOLDER_STROKE,\n \"stroke-width\": 1,\n \"stroke-dasharray\": hasSource ? undefined : \"4 4\",\n })}/>`\n const points = getVideoPlayTriangle(w, h)\n .map((p) => `${svgNum(p.x)},${svgNum(p.y)}`)\n .join(\" \")\n out += `<polygon ${attrs({ points, fill: VIDEO_PLAY_COLOR })}/>`\n if (altText) {\n out += `<title>${escapeXml(altText)}</title>`\n }\n return out\n}\n\n/**\n * Registry of per-type renderers. Custom shapes can register their own entry;\n * anything missing falls back to `defaultShapeSvgRenderer`.\n */\nexport const shapeSvgRenderers = new Map<string, ShapeSvgRenderer>([\n [\"geo\", geoSvg as ShapeSvgRenderer],\n [\"draw\", drawSvg],\n [\"line\", lineSvg],\n [\"arrow\", arrowSvg as ShapeSvgRenderer],\n [\"text\", textSvg as ShapeSvgRenderer],\n [\"note\", noteSvg as ShapeSvgRenderer],\n [\"frame\", frameSvg as ShapeSvgRenderer],\n [\"bookmark\", bookmarkSvg as ShapeSvgRenderer],\n [\"embed\", embedSvg as ShapeSvgRenderer],\n [\"video\", videoSvg as ShapeSvgRenderer],\n])\n\n/** Register (or replace) the SVG renderer for a shape type. */\nexport function registerShapeSvgRenderer<T extends UnknownShape>(type: T[\"type\"], renderer: ShapeSvgRenderer<T>): void {\n shapeSvgRenderers.set(type, renderer as ShapeSvgRenderer)\n}\n\n/**\n * Markup for a value returned by `toSvg` / `toBackgroundSvg`: a string is used\n * verbatim, a React node is serialized, and React's empty values become\n * `undefined` so the caller can fall through to the next renderer.\n */\nexport function svgResultToMarkup(value: ShapeSvgResult): string | undefined {\n if (value === undefined || value === null || typeof value === \"boolean\") return undefined\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value)\n return renderToStaticMarkup(value as ReactElement)\n}\n\n/**\n * Render a shape to SVG markup in shape-local space.\n *\n * Precedence, highest first:\n *\n * 1. `ShapeUtil.toSvg` — the shape's own opinion about itself. A custom shape\n * is exportable by implementing one method, with nothing to register.\n * 2. `shapeSvgRenderers` — the registry, which carries the built-in shapes and\n * lets an app override a type whose util it does not own (see\n * `registerShapeSvgRenderer`).\n * 3. The shape's geometry stroked with its render style — the last resort, so\n * an unknown type still exports as something rather than as nothing.\n */\nexport function shapeToSvg(editor: Editor, shape: UnknownShape, ctx: SvgExportContext): string {\n const util = editor.getShapeUtil(shape)\n const own = svgResultToMarkup(util.toSvg?.(shape, ctx))\n if (own !== undefined) return own\n const renderer = shapeSvgRenderers.get(shape.type) ?? defaultShapeSvgRenderer\n return renderer(editor, shape, ctx)\n}\n\n/**\n * A shape's backdrop in shape-local space, drawn behind *every* exported\n * shape. Only `ShapeUtil.toBackgroundSvg` produces one; there is no registry\n * behind it and no geometry fallback, because a shape that says nothing here\n * wants nothing drawn.\n */\nexport function shapeToBackgroundSvg(editor: Editor, shape: UnknownShape, ctx: SvgExportContext): string | undefined {\n return svgResultToMarkup(editor.getShapeUtil(shape).toBackgroundSvg?.(shape, ctx))\n}\n","/**\n * Export shapes to a standalone SVG document string.\n */\nimport { Box, type Editor, type ShapeId, type UnknownShape } from \"@mocanvas/editor\"\nimport { shapeToBackgroundSvg, shapeToSvg, type SvgExportContext } from \"./shape-svg\"\nimport { attrs, matrixAttr, svgNum } from \"./svg-utils\"\n\nexport interface SvgExportOptions {\n /** Page units added around the shapes' bounds. Default 32. */\n padding?: number\n /** Paint a full-size background rectangle. Default false. */\n background?: boolean\n /** Multiplier applied to the output `width`/`height`. Default 1. */\n scale?: number\n /** Use the dark background colour. Default false. */\n darkMode?: boolean\n}\n\nexport interface SvgExportResult {\n svg: string\n /** Output size in CSS pixels (bounds × scale). */\n width: number\n height: number\n}\n\nexport const SVG_EXPORT_DEFAULT_PADDING = 32\nexport const SVG_LIGHT_BACKGROUND = \"#f9fafb\"\nexport const SVG_DARK_BACKGROUND = \"#101011\"\n\n/**\n * The shapes an export covers: the given ids (or the selection, or the whole\n * page when nothing is selected) together with all of their descendants, in\n * page draw order.\n */\nexport function getExportShapes(editor: Editor, ids?: readonly ShapeId[]): UnknownShape[] {\n const sorted = editor.getCurrentPageShapesSorted()\n let roots: readonly ShapeId[] | undefined = ids\n if (!roots) {\n const selected = editor.getSelectedShapeIds()\n if (selected.length === 0) return sorted\n roots = selected\n }\n const included = new Set<ShapeId>()\n const visit = (id: ShapeId): void => {\n if (included.has(id)) return\n included.add(id)\n for (const child of editor.getSortedChildIdsForParent(id)) visit(child)\n }\n for (const id of roots) if (editor.getShape(id)) visit(id)\n return sorted.filter((s) => included.has(s.id))\n}\n\n/** Common page bounds of the shapes, or `undefined` when there are none. */\nexport function getExportBounds(editor: Editor, shapes: readonly UnknownShape[]): Box | undefined {\n const boxes: Box[] = []\n for (const shape of shapes) {\n const b = editor.getShapePageBounds(shape)\n if (b) boxes.push(b)\n }\n return boxes.length === 0 ? undefined : Box.Common(boxes)\n}\n\nlet clipCounter = 0\n\n/**\n * Serialize shapes to an SVG string. Returns `undefined` when there is\n * nothing to export.\n */\nexport function getSvgString(editor: Editor, ids?: readonly ShapeId[], opts: SvgExportOptions = {}): SvgExportResult | undefined {\n const padding = opts.padding ?? SVG_EXPORT_DEFAULT_PADDING\n const scale = opts.scale ?? 1\n const darkMode = opts.darkMode ?? false\n\n const shapes = getExportShapes(editor, ids)\n if (shapes.length === 0) return undefined\n const bounds = getExportBounds(editor, shapes)\n if (!bounds) return undefined\n\n const view = Box.Expand(bounds, padding)\n const width = Math.max(1, Math.ceil(view.w * scale))\n const height = Math.max(1, Math.ceil(view.h * scale))\n const background = darkMode ? SVG_DARK_BACKGROUND : SVG_LIGHT_BACKGROUND\n const ctx: SvgExportContext = { darkMode, background }\n\n const included = new Set(shapes.map((s) => s.id))\n const defs: string[] = []\n // `ShapeUtil.toBackgroundSvg` output, collected separately and emitted before\n // every shape so a backdrop stays behind the whole drawing rather than only\n // behind its own shape. It is not clipped by an ancestor frame.\n const backdrop: string[] = []\n const body: string[] = []\n const prefix = `mc${(clipCounter++).toString(36)}`\n\n const emit = (shape: UnknownShape): void => {\n const transform = editor.getShapePageTransform(shape)\n const g = attrs({\n transform: matrixAttr(transform),\n opacity: shape.opacity < 1 ? shape.opacity : undefined,\n \"data-shape-type\": shape.type,\n })\n const behind = shapeToBackgroundSvg(editor, shape, ctx)\n if (behind !== undefined) backdrop.push(`<g ${g} data-shape-background=\"true\">${behind}</g>`)\n const inner = shapeToSvg(editor, shape, ctx)\n body.push(`<g ${g}>${inner}</g>`)\n\n const children = editor.getSortedChildIdsForParent(shape.id).filter((id) => included.has(id))\n if (children.length === 0) return\n if (shape.type === \"frame\") {\n const b = editor.getShapeGeometry(shape).bounds\n const clipId = `${prefix}-clip-${defs.length}`\n defs.push(\n `<clipPath id=\"${clipId}\"><rect ${attrs({ transform: matrixAttr(transform), x: b.x, y: b.y, width: b.w, height: b.h })}/></clipPath>`,\n )\n body.push(`<g clip-path=\"url(#${clipId})\">`)\n for (const id of children) {\n const child = editor.getShape(id)\n if (child) emit(child)\n }\n body.push(`</g>`)\n return\n }\n for (const id of children) {\n const child = editor.getShape(id)\n if (child) emit(child)\n }\n }\n\n for (const shape of shapes) {\n // Descendants are emitted by their ancestors; only roots start here.\n const parentIncluded = included.has(shape.parentId as ShapeId)\n if (!parentIncluded) emit(shape)\n }\n\n const viewBox = `${svgNum(view.x)} ${svgNum(view.y)} ${svgNum(view.w)} ${svgNum(view.h)}`\n const parts: string[] = []\n parts.push(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"${viewBox}\">`)\n if (defs.length > 0) parts.push(`<defs>${defs.join(\"\")}</defs>`)\n if (opts.background) {\n parts.push(`<rect ${attrs({ x: view.x, y: view.y, width: view.w, height: view.h, fill: background })}/>`)\n }\n parts.push(...backdrop)\n parts.push(...body)\n parts.push(`</svg>`)\n return { svg: parts.join(\"\"), width, height }\n}\n","/**\n * Export shapes to a `Blob` (SVG or raster), plus small browser helpers to\n * download or copy the result. Raster export needs a DOM; the functions guard\n * for Node and fail with a clear error instead of a reference error.\n */\nimport type { Editor, ShapeId } from \"@mocanvas/editor\"\nimport { getSvgString, type SvgExportOptions } from \"./svg\"\n\nexport type ExportFormat = \"svg\" | \"png\" | \"jpeg\" | \"webp\"\n\nexport interface ExportToBlobOptions extends SvgExportOptions {\n ids?: readonly ShapeId[]\n format: ExportFormat\n /** Encoder quality for lossy formats (0..1). */\n quality?: number\n /** Device pixel ratio multiplier for raster output. Defaults to `window.devicePixelRatio`. */\n pixelRatio?: number\n}\n\nconst MIME: Record<ExportFormat, string> = {\n svg: \"image/svg+xml\",\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n}\n\nfunction hasDom(): boolean {\n return typeof document !== \"undefined\" && typeof window !== \"undefined\"\n}\n\n/** Render the export to a `Blob`. SVG works anywhere; raster formats need a browser. */\nexport async function exportToBlob(editor: Editor, opts: ExportToBlobOptions): Promise<Blob> {\n const { ids, format, quality, pixelRatio, ...svgOpts } = opts\n const result = getSvgString(editor, ids, svgOpts)\n if (!result) throw new Error(\"Nothing to export\")\n const svgBlob = new Blob([result.svg], { type: MIME.svg })\n if (format === \"svg\") return svgBlob\n\n if (!hasDom()) {\n throw new Error(`Raster export (\"${format}\") needs a browser environment; only \"svg\" is available here`)\n }\n\n const ratio = pixelRatio ?? (window.devicePixelRatio || 1)\n const url = URL.createObjectURL(svgBlob)\n try {\n const image = await loadImage(url)\n const canvas = document.createElement(\"canvas\")\n canvas.width = Math.max(1, Math.round(result.width * ratio))\n canvas.height = Math.max(1, Math.round(result.height * ratio))\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) throw new Error(\"Could not create a 2D canvas context\")\n if (format === \"jpeg\" && !svgOpts.background) {\n // JPEG has no alpha; paint the page colour so transparent areas do not turn black.\n ctx.fillStyle = svgOpts.darkMode ? \"#101011\" : \"#f9fafb\"\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n }\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height)\n return await canvasToBlob(canvas, MIME[format], quality)\n } finally {\n URL.revokeObjectURL(url)\n }\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.decoding = \"sync\"\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error(\"Could not rasterize the SVG\"))\n image.src = url\n })\n}\n\nfunction canvasToBlob(canvas: HTMLCanvasElement, type: string, quality?: number): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob)\n else reject(new Error(`Canvas could not encode \"${type}\"`))\n },\n type,\n quality,\n )\n })\n}\n\n/** Trigger a download of `blob` as `filename`. No-op outside a browser. */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (!hasDom()) return\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement(\"a\")\n anchor.href = url\n anchor.download = filename\n anchor.rel = \"noopener\"\n anchor.style.display = \"none\"\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n // Give the browser a tick to start the download before the URL goes away.\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/**\n * Copy `blob` to the system clipboard. Images go through `ClipboardItem`;\n * SVG (which clipboards do not accept as an image) is copied as text.\n */\nexport async function copyBlobToClipboard(blob: Blob): Promise<void> {\n const clipboard = typeof navigator === \"undefined\" ? undefined : navigator.clipboard\n if (!clipboard) throw new Error(\"Clipboard API is not available\")\n if (blob.type === MIME.svg || !(\"write\" in clipboard) || typeof ClipboardItem === \"undefined\") {\n if (blob.type !== MIME.svg && !(\"writeText\" in clipboard)) throw new Error(\"Clipboard does not accept images\")\n await clipboard.writeText(await blob.text())\n return\n }\n await clipboard.write([new ClipboardItem({ [blob.type]: blob })])\n}\n","import {\n registerExportImplementation,\n registerTextMeasureImplementation,\n type Editor,\n type ShapeId,\n} from \"@mocanvas/editor\"\nimport { exportToBlob, getSvgString } from \"./export\"\nimport { getTextMeasure } from \"./text\"\n\n/**\n * `@mocanvas/editor` declares `Editor.getSvgString`, `Editor.toImage` and\n * `Editor.textMeasure` but cannot implement them: exporting needs the default\n * shapes' SVG renderers and measuring text needs the DOM, both of which live\n * here, and this package depends on the editor rather than the other way round.\n *\n * Importing `mocanvas` runs this module and fills those three in. An app that\n * builds on `@mocanvas/editor` alone either imports this package or registers\n * its own through the same seam.\n */\nregisterExportImplementation({\n getSvgString,\n async toImage(editor: Editor, ids?: readonly ShapeId[], opts = {}) {\n const { format = \"png\", ...rest } = opts\n // Measure from the SVG so the caller learns the size without decoding the blob.\n const measured = getSvgString(editor, ids, rest)\n if (!measured) throw new Error(\"Nothing to export: the page has no shapes, and none were named.\")\n const blob = await exportToBlob(editor, { ...rest, ...(ids === undefined ? {} : { ids }), format })\n return { blob, width: measured.width, height: measured.height }\n },\n})\n\nregisterTextMeasureImplementation(getTextMeasure)\n","import type { VecLike } from \"@mocanvas/editor\"\n\n/**\n * One pass of a light 1-2-1 moving average over a freehand stroke. Endpoints\n * are kept fixed so the stroke still starts and ends where the pen did.\n * Extra properties on each point (e.g. pressure `z`) are preserved.\n */\nexport function smoothPoints<P extends VecLike>(points: readonly P[]): P[] {\n const n = points.length\n if (n < 4) return points.slice()\n const out: P[] = [points[0]!]\n for (let i = 1; i < n - 1; i++) {\n const prev = points[i - 1]!\n const p = points[i]!\n const next = points[i + 1]!\n out.push({ ...p, x: (prev.x + 2 * p.x + next.x) / 4, y: (prev.y + 2 * p.y + next.y) / 4 })\n }\n out.push(points[n - 1]!)\n return out\n}\n","import {\n Polygon2d,\n Polyline2d,\n ShapeUtil,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n type ResizeInfo,\n type StyleWords,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { smoothPoints } from \"./draw-helpers\"\nimport { propsOf, readArray, readBoolean, readEnum, readNumber, readStyle } from \"./prop-access\"\nimport { getFillRgba, getStrokeRgba, getDashId } from \"./shape-theme\"\n\nexport interface DrawPoint {\n x: number\n y: number\n z?: number\n}\n\nexport interface DrawSegment {\n type: \"free\" | \"straight\"\n points: DrawPoint[]\n}\n\nexport interface DrawShapeProps {\n segments: DrawSegment[]\n color: DefaultColorStyle\n fill: DefaultFillStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n isComplete: boolean\n isClosed: boolean\n isPen: boolean\n scale: number\n}\n\nexport type DrawShape = BaseShape<\"draw\", DrawShapeProps>\n\nconst SEGMENT_TYPES = [\"free\", \"straight\"] as const\n\n/**\n * The shape's segments in a usable form. A segment that carries no decoded\n * `points` array — an encoding the load path could not read, say — reads as an\n * empty run and contributes nothing, rather than throwing.\n */\nexport function readDrawSegments(shape: { props?: unknown }): DrawSegment[] {\n const out: DrawSegment[] = []\n for (const seg of readArray(propsOf(shape), \"segments\")) {\n const points: DrawPoint[] = readArray(seg, \"points\").map((p) => {\n const point: DrawPoint = { x: readNumber(p, \"x\", 0), y: readNumber(p, \"y\", 0) }\n // Pressure stays absent when the stored point has none, so a round trip\n // through here does not invent one.\n const z = (p as { z?: unknown } | null)?.z\n if (typeof z === \"number\" && Number.isFinite(z)) point.z = z\n return point\n })\n out.push({ type: readEnum(seg, \"type\", SEGMENT_TYPES, \"free\"), points })\n }\n return out\n}\n\n/** Flatten a draw shape's segments to one outline, smoothing freehand runs. */\nexport function getDrawOutlinePoints(shape: DrawShape): VecLike[] {\n const out: VecLike[] = []\n for (const seg of readDrawSegments(shape)) {\n const pts = seg.type === \"free\" && seg.points.length >= 4 ? smoothPoints(seg.points) : seg.points\n for (const p of pts) out.push({ x: p.x, y: p.y })\n }\n return out\n}\n\nexport class DrawShapeUtil extends ShapeUtil<DrawShape> {\n static override type = \"draw\" as const\n static override props = { color: DefaultColorStyle, fill: DefaultFillStyle, dash: DefaultDashStyle, size: DefaultSizeStyle }\n\n getDefaultProps(): DrawShapeProps {\n return {\n segments: [],\n color: \"black\",\n fill: \"none\",\n dash: \"draw\",\n size: \"m\",\n isComplete: false,\n isClosed: false,\n isPen: false,\n scale: 1,\n }\n }\n\n getGeometry(shape: DrawShape): Geometry2d {\n const points = getDrawOutlinePoints(shape)\n const p = propsOf(shape)\n if (readBoolean(p, \"isClosed\", false) && points.length > 2) {\n return new Polygon2d({ points, isFilled: readStyle(p, \"fill\", DefaultFillStyle) !== \"none\" })\n }\n return new Polyline2d({ points: points.length === 0 ? [{ x: 0, y: 0 }] : points })\n }\n\n override getRenderStyle(shape: DrawShape): StyleWords {\n const p = propsOf(shape)\n const color = readStyle(p, \"color\", DefaultColorStyle)\n const fill = readStyle(p, \"fill\", DefaultFillStyle)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n const scale = readNumber(p, \"scale\", 1)\n const isClosed = readBoolean(p, \"isClosed\", false)\n const dash = readStyle(p, \"dash\", DefaultDashStyle)\n return {\n stroke: getStrokeRgba(color),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: isClosed && fill !== \"none\" ? getFillRgba(color, fill) : 0,\n // `draw` asks the engine to replace an outline with a hand-drawn version of\n // it. A draw shape's points *are* a hand-drawn version already — a recorded\n // pen movement, smoothed — so putting them through it a second time only\n // adds bulges the hand never made. Ask for the solid stroke instead. The\n // record keeps `props.dash` exactly as it was, so the style panel still\n // shows \"draw\", a `.tldr` round trip is unaffected, and `dashed`/`dotted`\n // reach the engine untouched.\n dash: getDashId(dash === \"draw\" ? \"solid\" : dash),\n opacity: 1,\n }\n }\n\n component(_shape: DrawShape): ReactNode {\n return null\n }\n\n indicator(shape: DrawShape): ReactNode {\n const points = getDrawOutlinePoints(shape)\n if (readBoolean(propsOf(shape), \"isClosed\", false) && points.length > 2) points.push(points[0]!)\n const d = points.map((p) => `${Math.round(p.x * 100) / 100},${Math.round(p.y * 100) / 100}`).join(\" \")\n return <polyline points={d} fill=\"none\" />\n }\n\n override canResize(_shape: DrawShape): boolean {\n return true\n }\n\n override hideResizeHandles(_shape: DrawShape): boolean {\n return false\n }\n\n override onResize(shape: DrawShape, info: ResizeInfo<DrawShape>): Partial<DrawShape> {\n const { scaleX, scaleY, initialShape, newPoint } = info\n const segments = readDrawSegments(initialShape).map((seg) => ({\n ...seg,\n points: seg.points.map((p) => ({ ...p, x: p.x * scaleX, y: p.y * scaleY })),\n }))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, segments } }\n }\n}\n","import {\n BaseBoxShapeUtil,\n Rectangle2d,\n type AssetId,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type ImageAsset,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\n\n/** Normalized crop window: both corners in [0, 1] of the source image. */\nexport interface ImageCrop {\n topLeft: { x: number; y: number }\n bottomRight: { x: number; y: number }\n isCircle?: boolean\n}\n\nexport interface ImageShapeProps {\n w: number\n h: number\n /** The image asset holding the pixels; `null` while nothing is attached. */\n assetId: AssetId | null\n /** Whether an animated image plays. */\n playing: boolean\n /** A hyperlink attached to the shape (not the image source). */\n url: string\n crop: ImageCrop | null\n flipX: boolean\n flipY: boolean\n altText: string\n}\n\nexport type ImageShape = BaseShape<\"image\", ImageShapeProps>\n\nexport const IMAGE_PLACEHOLDER_FILL = \"#eceff3\"\nexport const IMAGE_PLACEHOLDER_STROKE = \"#9fa8b2\"\n\n/**\n * The source the shape's pixels come from: the asset's `src` (a URL or data URL),\n * or `null` when the shape has no asset yet or the asset is still uploading.\n * `getImageTextureKey` turns it into a GPU texture; `component` draws the same\n * source in the DOM overlay while that texture loads (and for crops/flips).\n */\nexport function getImageTextureSource(editor: Editor, shape: ImageShape): string | null {\n const assetId = readString(propsOf(shape), \"assetId\", \"\") as AssetId | \"\"\n if (!assetId) return null\n const asset = editor.getAsset<ImageAsset>(assetId)\n if (!asset || asset.type !== \"image\") return null\n return asset.props.src ?? null\n}\n\n/**\n * Texture cache key for the shape's pixels, or `null` when it must stay on the\n * DOM overlay.\n *\n * The GPU path only covers the plain case. The engine maps uv `0..1` over the\n * shape's local geometry bounds, so a crop window or a flip would need the quad\n * to carry its own uvs; until the bridge does, cropped and flipped images (and\n * anything without a decoded source) are drawn by `component`.\n *\n * Assets are treated as immutable, so the key is the asset id: replacing an\n * asset's `src` in place keeps the cached texture.\n */\nexport function getImageTextureKey(editor: Editor, shape: ImageShape): string | null {\n const p = propsOf(shape)\n const assetId = readString(p, \"assetId\", \"\")\n if (!assetId || p[\"crop\"] || readBoolean(p, \"flipX\", false) || readBoolean(p, \"flipY\", false)) return null\n if (!canUploadImageTextures()) return null\n return getImageTextureSource(editor, shape) === null ? null : `asset:${assetId}`\n}\n\n/** Whether this environment can decode an image into a texture source at all. */\nexport function canUploadImageTextures(): boolean {\n return typeof createImageBitmap === \"function\" || typeof Image === \"function\"\n}\n\n/** Decode an image `src` (URL or data URL) into something the GPU can sample. */\nexport async function loadImageTextureSource(src: string): Promise<TexImageSource> {\n const isData = src.startsWith(\"data:\")\n if (!isData && typeof createImageBitmap === \"function\" && typeof fetch === \"function\") {\n const res = await fetch(src)\n if (!res.ok) throw new Error(`mocanvas: image asset request failed (${res.status})`)\n return await createImageBitmap(await res.blob())\n }\n return await loadHtmlImage(src, isData)\n}\n\nfunction loadHtmlImage(src: string, isData: boolean): Promise<HTMLImageElement> {\n if (typeof Image !== \"function\") return Promise.reject(new Error(\"mocanvas: no image decoder available\"))\n return new Promise((resolve, reject) => {\n const img = new Image()\n if (!isData) img.crossOrigin = \"anonymous\"\n img.onload = () => resolve(img)\n img.onerror = () => reject(new Error(\"mocanvas: image asset failed to decode\"))\n img.src = src\n })\n}\n\n/** CSS for the `<img>` so the crop window fills the shape's box; `null` crop shows the whole image. */\nexport function getImageCropStyle(shape: ImageShape): CSSProperties {\n const { w, h } = readImageBox(shape)\n const p = propsOf(shape)\n const crop = readImageCrop(shape)\n const flipX = readBoolean(p, \"flipX\", false)\n const flipY = readBoolean(p, \"flipY\", false)\n const transform = flipX || flipY ? `scale(${flipX ? -1 : 1}, ${flipY ? -1 : 1})` : undefined\n if (!crop) {\n return { position: \"absolute\", left: 0, top: 0, width: w, height: h, ...(transform ? { transform } : {}) }\n }\n const cw = Math.max(1e-6, crop.bottomRight.x - crop.topLeft.x)\n const ch = Math.max(1e-6, crop.bottomRight.y - crop.topLeft.y)\n const fullW = w / cw\n const fullH = h / ch\n return {\n position: \"absolute\",\n left: -crop.topLeft.x * fullW,\n top: -crop.topLeft.y * fullH,\n width: fullW,\n height: fullH,\n ...(transform ? { transform } : {}),\n }\n}\n\n/** The shape's box, with each side falling back to the util's default. */\nfunction readImageBox(shape: { props?: unknown }): { w: number; h: number } {\n const p = propsOf(shape)\n return { w: readNumber(p, \"w\", 100), h: readNumber(p, \"h\", 100) }\n}\n\n/** The crop window, or `null` when there is none or it is not shaped like one. */\nfunction readImageCrop(shape: { props?: unknown }): ImageCrop | null {\n const crop = propsOf(shape)[\"crop\"]\n if (typeof crop !== \"object\" || crop === null) return null\n const corners = crop as { topLeft?: unknown; bottomRight?: unknown }\n if (typeof corners.topLeft !== \"object\" || typeof corners.bottomRight !== \"object\") return null\n return {\n topLeft: { x: readNumber(corners.topLeft, \"x\", 0), y: readNumber(corners.topLeft, \"y\", 0) },\n bottomRight: { x: readNumber(corners.bottomRight, \"x\", 1), y: readNumber(corners.bottomRight, \"y\", 1) },\n isCircle: readBoolean(crop, \"isCircle\", false),\n }\n}\n\nexport class ImageShapeUtil extends BaseBoxShapeUtil<ImageShape> {\n static override type = \"image\" as const\n\n getDefaultProps(): ImageShapeProps {\n return { w: 100, h: 100, assetId: null, playing: true, url: \"\", crop: null, flipX: false, flipY: false, altText: \"\" }\n }\n\n getGeometry(shape: ImageShape): Geometry2d {\n const { w, h } = readImageBox(shape)\n return new Rectangle2d({ width: Math.max(1, w), height: Math.max(1, h), isFilled: true })\n }\n\n /** A white textured quad over the shape's bounds, or `null` for the DOM overlay path. */\n override getRenderStyle(shape: ImageShape): StyleWords | null {\n const key = getImageTextureKey(this.editor, shape)\n if (!key) return null\n const src = getImageTextureSource(this.editor, shape)\n if (!src) return null\n const texture = this.editor.textures.acquire(key, () => loadImageTextureSource(src))\n if (!texture) return null\n return { fill: 0xffffffff, stroke: 0, strokeWidth: 0, dash: 0, opacity: 1, texture }\n }\n\n /** The DOM overlay draws the image until (and unless) its texture is ready. */\n override needsOverlay(shape: ImageShape): boolean {\n if (super.needsOverlay(shape)) return true\n const key = getImageTextureKey(this.editor, shape)\n return key === null || !this.editor.textures.isReady(key)\n }\n\n component(shape: ImageShape): ReactNode {\n const { w, h } = readImageBox(shape)\n const crop = readImageCrop(shape)\n const altText = readString(propsOf(shape), \"altText\", \"\")\n const src = getImageTextureSource(this.editor, shape)\n const clip: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: w,\n height: h,\n overflow: \"hidden\",\n ...(crop?.isCircle ? { borderRadius: \"50%\" } : {}),\n }\n if (!src) {\n return (\n <div\n style={{\n ...clip,\n boxSizing: \"border-box\",\n background: IMAGE_PLACEHOLDER_FILL,\n border: `1px dashed ${IMAGE_PLACEHOLDER_STROKE}`,\n }}\n aria-label={altText || \"image\"}\n />\n )\n }\n return (\n <div style={clip}>\n <img src={src} alt={altText} draggable={false} style={{ ...getImageCropStyle(shape), pointerEvents: \"none\", userSelect: \"none\" }} />\n </div>\n )\n }\n\n indicator(shape: ImageShape): ReactNode {\n const { w, h } = readImageBox(shape)\n return <rect width={w} height={h} />\n }\n\n override isAspectRatioLocked(_shape: ImageShape): boolean {\n return true\n }\n}\n","import {\n CubicSpline2d,\n Polyline2d,\n ShapeUtil,\n STROKE_SIZES,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultSizeStyle,\n type BaseShape,\n type Geometry2d,\n type ShapeHandle,\n type StyleWords,\n} from \"@mocanvas/editor\"\nimport { getIndexBetween, sortByIndex, type IndexKey } from \"@mocanvas/store\"\nimport type { ReactNode } from \"react\"\nimport { propsOf, readEnum, readNumber, readString, readStyle } from \"./prop-access\"\nimport { getStrokeRgba, getDashId } from \"./shape-theme\"\nimport { catmullRomToBezier } from \"./spline-helpers\"\nimport { pathWordsToSvgD } from \"./svg-path\"\n\nexport interface LinePoint {\n id: string\n index: string\n x: number\n y: number\n}\n\nexport interface LineShapeProps {\n color: DefaultColorStyle\n dash: DefaultDashStyle\n size: DefaultSizeStyle\n spline: \"line\" | \"cubic\"\n points: Record<string, LinePoint>\n scale: number\n}\n\nexport type LineShape = BaseShape<\"line\", LineShapeProps>\n\nconst SPLINES = [\"line\", \"cubic\"] as const\n\n/** The line's points in drawing order, skipping any entry that is not a point. */\nexport function getLinePoints(shape: { props?: unknown }): LinePoint[] {\n const stored = propsOf(shape)[\"points\"]\n if (typeof stored !== \"object\" || stored === null) return []\n const points: (LinePoint & { index: IndexKey })[] = []\n for (const [id, value] of Object.entries(stored as Record<string, unknown>)) {\n if (typeof value !== \"object\" || value === null) continue\n points.push({\n id: readString(value, \"id\", id),\n index: readString(value, \"index\", \"a1\") as IndexKey,\n x: readNumber(value, \"x\", 0),\n y: readNumber(value, \"y\", 0),\n })\n }\n return sortByIndex(points)\n}\n\nfunction midIndex(a: string, b: string): string {\n try {\n return getIndexBetween(a as IndexKey, b as IndexKey)\n } catch {\n return `${a}V`\n }\n}\n\nexport class LineShapeUtil extends ShapeUtil<LineShape> {\n static override type = \"line\" as const\n static override props = { color: DefaultColorStyle, dash: DefaultDashStyle, size: DefaultSizeStyle }\n\n getDefaultProps(): LineShapeProps {\n return {\n color: \"black\",\n dash: \"draw\",\n size: \"m\",\n spline: \"line\",\n points: {\n a1: { id: \"a1\", index: \"a1\", x: 0, y: 0 },\n a2: { id: \"a2\", index: \"a2\", x: 100, y: 100 },\n },\n scale: 1,\n }\n }\n\n getGeometry(shape: LineShape): Geometry2d {\n const points = getLinePoints(shape)\n if (points.length === 0) return new Polyline2d({ points: [{ x: 0, y: 0 }] })\n if (readEnum(propsOf(shape), \"spline\", SPLINES, \"line\") === \"cubic\" && points.length > 2) {\n return new CubicSpline2d({ segments: catmullRomToBezier(points), isClosed: false, isFilled: false })\n }\n return new Polyline2d({ points })\n }\n\n override getRenderStyle(shape: LineShape): StyleWords {\n const p = propsOf(shape)\n const color = readStyle(p, \"color\", DefaultColorStyle)\n const size = readStyle(p, \"size\", DefaultSizeStyle)\n return {\n stroke: getStrokeRgba(color),\n strokeWidth: STROKE_SIZES[size] * readNumber(p, \"scale\", 1),\n fill: 0,\n dash: getDashId(readStyle(p, \"dash\", DefaultDashStyle)),\n opacity: 1,\n }\n }\n\n component(_shape: LineShape): ReactNode {\n return null\n }\n\n indicator(shape: LineShape): ReactNode {\n return <path d={pathWordsToSvgD(this.getGeometry(shape).toPathWords())} />\n }\n\n override getHandles(shape: LineShape): ShapeHandle[] {\n const points = getLinePoints(shape)\n const handles: ShapeHandle[] = []\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!\n handles.push({ id: p.id, type: \"vertex\", index: p.index, x: p.x, y: p.y })\n const next = points[i + 1]\n if (next) {\n handles.push({\n id: `mid:${p.id}:${next.id}`,\n type: \"virtual\",\n index: midIndex(p.index, next.index),\n x: (p.x + next.x) / 2,\n y: (p.y + next.y) / 2,\n })\n }\n }\n return handles\n }\n\n override onHandleDrag(shape: LineShape, info: { handle: ShapeHandle }): Partial<LineShape> {\n const { handle } = info\n const points: Record<string, LinePoint> = {}\n for (const p of getLinePoints(shape)) points[p.id] = p\n const existing = points[handle.id]\n if (existing) {\n points[handle.id] = { ...existing, x: handle.x, y: handle.y }\n } else {\n // Dragging a virtual midpoint promotes it to a real point.\n points[handle.id] = { id: handle.id, index: handle.index, x: handle.x, y: handle.y }\n }\n return { props: { ...shape.props, points } }\n }\n}\n","import { Rectangle2d, ShapeUtil, type BaseShape, type Geometry2d, type StyleWords } from \"@mocanvas/editor\"\n\nexport type GroupShape = BaseShape<\"group\", Record<string, never>>\n\n/** A container with no visuals of its own; its bounds are the union of its children. */\nexport class GroupShapeUtil extends ShapeUtil<GroupShape> {\n static override type = \"group\" as const\n\n getDefaultProps(): GroupShape[\"props\"] {\n return {}\n }\n\n getGeometry(shape: GroupShape): Geometry2d {\n const editor = this.editor\n const children = editor.getSortedChildIdsForParent(shape.id)\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const id of children) {\n const child = editor.getShape(id)\n if (!child) continue\n const b = editor.getShapeGeometryBounds(child)\n if (!b) continue\n // child bounds in group space\n for (const c of b.corners) {\n const r = child.rotation\n const x = child.x + c.x * Math.cos(r) - c.y * Math.sin(r)\n const y = child.y + c.x * Math.sin(r) + c.y * Math.cos(r)\n if (x < minX) minX = x\n if (y < minY) minY = y\n if (x > maxX) maxX = x\n if (y > maxY) maxY = y\n }\n }\n if (!Number.isFinite(minX)) return new Rectangle2d({ width: 1, height: 1, isFilled: false })\n return new Rectangle2d({ x: minX, y: minY, width: Math.max(1, maxX - minX), height: Math.max(1, maxY - minY), isFilled: false })\n }\n\n override getRenderStyle(_shape: GroupShape): StyleWords {\n // Invisible on the GPU; hit-testing goes through children.\n return { fill: 0, stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n override canResize(): boolean {\n return false\n }\n override hideResizeHandles(): boolean {\n return true\n }\n override hideSelectionBoundsBg(): boolean {\n return true\n }\n override canReceiveNewChildrenOfType(): boolean {\n return true\n }\n\n component() {\n return null\n }\n\n indicator(shape: GroupShape) {\n const b = this.getGeometry(shape).bounds\n return <rect x={b.x} y={b.y} width={b.w} height={b.h} fill=\"none\" strokeDasharray=\"4 4\" />\n }\n}\n","import type { ShapeUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowShapeUtil } from \"./ArrowShapeUtil\"\nimport { BookmarkShapeUtil } from \"./BookmarkShapeUtil\"\nimport { DrawShapeUtil } from \"./DrawShapeUtil\"\nimport { EmbedShapeUtil } from \"./EmbedShapeUtil\"\nimport { FrameShapeUtil } from \"./FrameShapeUtil\"\nimport { GeoShapeUtil } from \"./GeoShapeUtil\"\nimport { ImageShapeUtil } from \"./ImageShapeUtil\"\nimport { LineShapeUtil } from \"./LineShapeUtil\"\nimport { NoteShapeUtil } from \"./NoteShapeUtil\"\nimport { TextShapeUtil } from \"./TextShapeUtil\"\nimport { VideoShapeUtil } from \"./VideoShapeUtil\"\n\nexport * from \"./GeoShapeUtil\"\nexport * from \"./DrawShapeUtil\"\nexport * from \"./LineShapeUtil\"\nexport * from \"./ArrowShapeUtil\"\nexport * from \"./TextShapeUtil\"\nexport * from \"./NoteShapeUtil\"\nexport * from \"./FrameShapeUtil\"\nexport * from \"./ImageShapeUtil\"\nexport * from \"./BookmarkShapeUtil\"\nexport * from \"./EmbedShapeUtil\"\nexport * from \"./VideoShapeUtil\"\nexport * from \"./shape-theme\"\nexport * from \"./geo-helpers\"\nexport * from \"./arrow-helpers\"\nexport * from \"./spline-helpers\"\nexport * from \"./draw-helpers\"\nexport * from \"./text-helpers\"\nexport * from \"./prop-access\"\nexport { pathWordsToSvgD } from \"./svg-path\"\n\n/** The built-in shape utils, in the order they are registered. */\nexport { GroupShapeUtil, type GroupShape } from \"./GroupShapeUtil\"\nimport { GroupShapeUtil } from \"./GroupShapeUtil\"\n\nexport const defaultShapeUtils: ShapeUtilConstructor[] = [\n GroupShapeUtil,\n GeoShapeUtil,\n DrawShapeUtil,\n LineShapeUtil,\n ArrowShapeUtil,\n TextShapeUtil,\n NoteShapeUtil,\n FrameShapeUtil,\n ImageShapeUtil,\n BookmarkShapeUtil,\n EmbedShapeUtil,\n VideoShapeUtil,\n]\nexport * from \"./elbow-helpers\"\n","import {\n BindingUtil,\n Vec,\n type BaseBinding,\n type BindingOnShapeChangeOptions,\n type BindingOnShapeDeleteOptions,\n type BindingOnShapeIsolateOptions,\n type VecLike,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes/ArrowShapeUtil\"\nimport { getArrowTerminalsInArrowSpace } from \"./arrow-terminals\"\n\nexport type ArrowTerminal = \"start\" | \"end\"\n\n/**\n * Props of an `arrow` binding. The record layout matches what `.tldr` files\n * store for arrow bindings so documents round-trip.\n */\nexport interface ArrowBindingProps {\n /** Which end of the arrow (`fromId`) is attached to the bound shape (`toId`). */\n terminal: ArrowTerminal\n /** Anchor inside the bound shape's geometry bounds, normalized to `[0, 1]`. */\n normalizedAnchor: { x: number; y: number }\n /** When true the terminal sits exactly on the anchor instead of on the shape's outline. */\n isExact: boolean\n /** When true the anchor was placed deliberately (Alt or a lingering drag) rather than snapped to the center. */\n isPrecise: boolean\n}\n\nexport type ArrowBinding = BaseBinding<\"arrow\", ArrowBindingProps>\n\nconst EPS = 1e-6\n\nfunction samePoint(a: VecLike, b: VecLike): boolean {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS\n}\n\n/**\n * Keeps arrows attached to the shapes their terminals are bound to.\n *\n * - When the bound shape changes, the arrow is rewritten so its geometry is\n * re-derived (and its static fallback stays current).\n * - When the bound shape goes away, or the binding is deleted with\n * `isolateShapes`, the terminal is frozen at its current page position.\n */\nexport class ArrowBindingUtil extends BindingUtil<ArrowBinding> {\n static override type = \"arrow\" as const\n\n getDefaultProps(): ArrowBindingProps {\n return { terminal: \"end\", normalizedAnchor: { x: 0.5, y: 0.5 }, isExact: false, isPrecise: false }\n }\n\n override onAfterChangeToShape({ binding }: BindingOnShapeChangeOptions<ArrowBinding>): void {\n this.refreshArrow(binding)\n }\n\n override onAfterChangeFromShape({ binding, shapeBefore, shapeAfter }: BindingOnShapeChangeOptions<ArrowBinding>): void {\n // Moving the arrow itself does not change where its bound terminal resolves\n // to in page space; only a re-parent changes the arrow's local frame.\n if (shapeBefore.parentId !== shapeAfter.parentId) this.refreshArrow(binding)\n }\n\n override onBeforeDeleteToShape({ binding }: BindingOnShapeDeleteOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n override onBeforeIsolateFromShape({ binding }: BindingOnShapeIsolateOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n override onBeforeIsolateToShape({ binding }: BindingOnShapeIsolateOptions<ArrowBinding>): void {\n this.freezeTerminal(binding)\n }\n\n /** Write the resolved terminals into the arrow so its geometry is rebuilt. */\n private refreshArrow(binding: ArrowBinding): void {\n const arrow = this.editor.getShape<ArrowShape>(binding.fromId)\n if (!arrow || arrow.type !== \"arrow\") return\n const { start, end } = getArrowTerminalsInArrowSpace(this.editor, arrow)\n if (samePoint(start, arrow.props.start) && samePoint(end, arrow.props.end)) return\n this.editor.updateShape<ArrowShape>({ id: arrow.id, type: \"arrow\", props: { start: start.toJson(), end: end.toJson() } })\n }\n\n /**\n * Convert the bound terminal into a static point at its current resolved\n * position. Idempotent: calling it twice for the same binding is a no-op the\n * second time.\n */\n private freezeTerminal(binding: ArrowBinding): void {\n const arrow = this.editor.getShape<ArrowShape>(binding.fromId)\n if (!arrow || arrow.type !== \"arrow\") return\n if (!this.editor.getShape(binding.toId)) return\n const terminal = binding.props.terminal\n const resolved = getArrowTerminalsInArrowSpace(this.editor, arrow)[terminal]\n if (samePoint(resolved, arrow.props[terminal])) return\n this.editor.updateShape<ArrowShape>({ id: arrow.id, type: \"arrow\", props: { [terminal]: Vec.From(resolved).toJson() } })\n }\n}\n","import type { BindingUtilConstructor } from \"@mocanvas/editor\"\nimport { ArrowBindingUtil } from \"./ArrowBindingUtil\"\n\nexport * from \"./ArrowBindingUtil\"\nexport * from \"./arrow-terminals\"\n\n/** The built-in binding utils, in the order they are registered. */\nexport const defaultBindingUtils: BindingUtilConstructor[] = [ArrowBindingUtil]\n","import {\n createShapeId,\n StateNode,\n Vec,\n type PointerEventInfo,\n type ShapeHandle,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport type { ArrowShape } from \"../shapes\"\n\n/** Length of the arrow created by a click without a drag, in page units. */\nconst DEFAULT_ARROW_LENGTH = 100\n/** Arrows shorter than this are discarded on pointer up. */\nconst MIN_ARROW_LENGTH = 4\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n /** Set once the pointer travelled far enough to count as a drag. */\n private dragged = false\n\n override onEnter(): void {\n const editor = this.editor\n this.dragged = false\n this.markId = editor.markHistoryStoppingPoint(\"create arrow\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape<ArrowShape>({\n id,\n type: \"arrow\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { start: { x: 0, y: 0 }, end: { x: 1, y: 0 } },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n this.dragged = true\n this.updateEnd()\n }\n\n override onPointerUp(): void {\n // `inputs.isDragging` is already cleared by the time a pointer up arrives.\n if (this.dragged) this.updateEnd()\n else this.setDefaultEnd()\n this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n /**\n * Move the end terminal to the pointer, offering a binding the same way the\n * select tool's handle drag does: the shape util decides whether the point\n * lands on a bindable shape and returns the props to apply.\n */\n private updateEnd(): void {\n const editor = this.editor\n const shape = editor.getShape<ArrowShape>(this.shapeId!)\n if (!shape) return\n const local = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)\n const handle: ShapeHandle = { id: \"end\", type: \"vertex\", index: \"a3\", x: local.x, y: local.y }\n const change = editor.getShapeUtil<ArrowShape>(shape).onHandleDrag?.(shape, { handle, isPrecise: editor.inputs.altKey, initial: shape })\n if (change) editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", ...change })\n else editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { end: { x: local.x, y: local.y } } })\n }\n\n /** A click without a drag makes a default arrow pointing to the right. */\n private setDefaultEnd(): void {\n const editor = this.editor\n const shape = editor.getShape<ArrowShape>(this.shapeId!)\n if (!shape) return\n editor.updateShape<ArrowShape>({ id: shape.id, type: \"arrow\", props: { end: { x: DEFAULT_ARROW_LENGTH, y: 0 } } })\n }\n\n private finish(): void {\n const editor = this.editor\n const shape = this.shapeId ? editor.getShape<ArrowShape>(this.shapeId) : undefined\n if (shape) {\n const { start, end } = shape.props\n // No zero-length arrows: undo the whole creation, bindings included.\n if (Vec.Dist(start, end) < MIN_ARROW_LENGTH) editor.bailToMark(this.markId)\n }\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Drag to draw an arrow; dropping the end on a shape binds it to that shape. */\nexport class ArrowTool extends StateNode {\n static override id = \"arrow\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import { createShapeId, StateNode, Vec, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\n\ninterface DrawProps {\n segments: { type: \"free\" | \"straight\"; points: { x: number; y: number; z?: number }[] }[]\n isComplete: boolean\n isClosed: boolean\n isPen: boolean\n}\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"drawing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Drawing extends StateNode {\n static override id = \"drawing\"\n private shapeId: ShapeId | null = null\n private origin = new Vec()\n private points: { x: number; y: number; z: number }[] = []\n private markId = \"\"\n private lastFlush = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n const isPen = (info as { isPen?: boolean }).isPen ?? false\n this.markId = editor.markHistoryStoppingPoint(\"draw\")\n this.origin = editor.inputs.originPagePoint.clone()\n this.points = [{ x: 0, y: 0, z: 0.5 }]\n const id = createShapeId()\n this.shapeId = id\n editor.createShape({\n id,\n type: \"draw\",\n x: this.origin.x,\n y: this.origin.y,\n props: {\n segments: [{ type: \"free\", points: this.points.slice() }],\n isComplete: false,\n isClosed: false,\n isPen,\n },\n })\n editor.selectNone()\n }\n\n override onPointerMove(): void {\n const editor = this.editor\n const { currentPagePoint } = editor.inputs\n const p = Vec.Sub(currentPagePoint, this.origin)\n const last = this.points.at(-1)!\n if (Vec.Dist2(last, p) < 0.25) return\n this.points.push({ x: p.x, y: p.y, z: 0.5 })\n const now = performance.now()\n // Throttle store writes to ~120 Hz; the pointer may report far faster.\n if (now - this.lastFlush > 8) {\n this.lastFlush = now\n this.flush(false)\n }\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private flush(complete: boolean): void {\n const editor = this.editor\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const props = shape.props as DrawProps\n const first = this.points[0]!\n const last = this.points.at(-1)!\n const isClosed = complete && this.points.length > 3 && Vec.Dist(first, last) < 12 / editor.getZoomLevel()\n editor.updateShape({\n id: shape.id,\n type: \"draw\",\n props: {\n segments: [{ type: props.segments[0]?.type ?? \"free\", points: this.points.slice() }],\n isComplete: complete,\n isClosed,\n },\n })\n }\n\n private complete(): void {\n this.flush(true)\n const editor = this.editor\n this.parent!.transition(\"idle\")\n if (!editor.getInstanceState().isToolLocked && !editor.inputs.isPen) {\n // Stay in the draw tool: freehand drawing is usually repeated.\n }\n }\n}\n\n/** Freehand drawing. */\nexport class DrawTool extends StateNode {\n static override id = \"draw\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Drawing]\n}\n","import { StateNode, type PointerEventInfo, type ShapeId, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"erasing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Erasing extends StateNode {\n static override id = \"erasing\"\n private erasing = new Set<ShapeId>()\n private markId = \"\"\n\n override onEnter(): void {\n this.erasing.clear()\n this.markId = this.editor.markHistoryStoppingPoint(\"erase\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.setErasingShapes([])\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n const { currentPagePoint, previousPagePoint } = editor.inputs\n const minX = Math.min(currentPagePoint.x, previousPagePoint.x)\n const minY = Math.min(currentPagePoint.y, previousPagePoint.y)\n const box = {\n x: minX,\n y: minY,\n w: Math.abs(currentPagePoint.x - previousPagePoint.x),\n h: Math.abs(currentPagePoint.y - previousPagePoint.y),\n }\n const margin = 8 / editor.getZoomLevel()\n const hits = editor.getShapesIntersectingBounds({ x: box.x - margin, y: box.y - margin, w: box.w + 2 * margin, h: box.h + 2 * margin })\n let changed = false\n for (const s of hits) {\n if (s.isLocked || this.erasing.has(s.id)) continue\n this.erasing.add(s.id)\n changed = true\n }\n if (changed) editor.setErasingShapes([...this.erasing])\n }\n\n private complete(): void {\n const editor = this.editor\n const ids = [...this.erasing]\n editor.setErasingShapes([])\n if (ids.length) editor.deleteShapes(ids)\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Delete shapes by dragging over them. */\nexport class EraserTool extends StateNode {\n static override id = \"eraser\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Erasing]\n}\n","import {\n createShapeId,\n StateNode,\n type Editor,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n type UnknownShape,\n} from \"@mocanvas/editor\"\nimport type { FrameShape } from \"../shapes\"\n\n/** Size of the frame created by a click without a drag. */\nconst DEFAULT_FRAME_SIZE = { w: 640, h: 480 }\n/** Smallest frame a drag can produce. */\nconst MIN_FRAME_SIZE = 32\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n\n override onEnter(): void {\n this.shapeId = null\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n if (!this.shapeId) this.create()\n this.resize()\n }\n\n override onPointerUp(): void {\n if (!this.shapeId) {\n // Click without a drag: a default-sized frame centred on the point.\n this.create()\n const { originPagePoint } = this.editor.inputs\n this.editor.updateShape<FrameShape>({\n id: this.shapeId!,\n type: \"frame\",\n x: originPagePoint.x - DEFAULT_FRAME_SIZE.w / 2,\n y: originPagePoint.y - DEFAULT_FRAME_SIZE.h / 2,\n props: { ...DEFAULT_FRAME_SIZE },\n })\n }\n this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n private create(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"create frame\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape<FrameShape>({\n id,\n type: \"frame\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { w: MIN_FRAME_SIZE, h: MIN_FRAME_SIZE, name: nextFrameName(editor) },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n private resize(): void {\n const editor = this.editor\n const shape = editor.getShape<FrameShape>(this.shapeId!)\n if (!shape) return\n const { originPagePoint, currentPagePoint, shiftKey } = editor.inputs\n let w = currentPagePoint.x - originPagePoint.x\n let h = currentPagePoint.y - originPagePoint.y\n if (shiftKey) {\n const m = Math.max(Math.abs(w), Math.abs(h))\n w = Math.sign(w || 1) * m\n h = Math.sign(h || 1) * m\n }\n let x = originPagePoint.x\n let y = originPagePoint.y\n if (w < 0) x += w\n if (h < 0) y += h\n editor.updateShape<FrameShape>({\n id: shape.id,\n type: \"frame\",\n x,\n y,\n props: { w: Math.max(MIN_FRAME_SIZE, Math.abs(w)), h: Math.max(MIN_FRAME_SIZE, Math.abs(h)) },\n })\n }\n\n private finish(): void {\n const editor = this.editor\n if (this.shapeId) adoptShapesInside(editor, this.shapeId)\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** `Frame 1`, `Frame 2`, ... counting the frames already on the page. */\nfunction nextFrameName(editor: Editor): string {\n const count = editor.getCurrentPageShapes().filter((s) => s.type === \"frame\").length\n return `Frame ${count + 1}`\n}\n\n/** Move shapes that sit entirely inside a fresh frame into it. */\nfunction adoptShapesInside(editor: Editor, frameId: ShapeId): void {\n const bounds = editor.getShapePageBounds(frameId)\n if (!bounds) return\n const pageId = editor.getCurrentPageId()\n const inside = editor\n .getShapesInsideBounds(bounds)\n .filter((s: UnknownShape) => s.id !== frameId && s.type !== \"frame\" && !s.isLocked && s.parentId === pageId)\n if (inside.length) editor.reparentShapes(inside.map((s) => s.id), frameId)\n}\n\n/** Drag out a frame, or click to place a default-sized one. */\nexport class FrameTool extends StateNode {\n static override id = \"frame\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import {\n createShapeId,\n GeoShapeGeoStyle,\n StateNode,\n type GeoShapeKind,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n\n override onEnter(): void {\n this.shapeId = null\n }\n\n override onPointerMove(): void {\n if (!this.editor.inputs.isDragging) return\n if (!this.shapeId) this.create()\n this.resize()\n }\n\n override onPointerUp(): void {\n if (!this.shapeId) {\n // click without drag: create a default-sized shape centered on the point\n this.create()\n const shape = this.editor.getShape(this.shapeId!)!\n const { w, h } = shape.props as { w: number; h: number }\n const { originPagePoint } = this.editor.inputs\n this.editor.updateShape({ id: shape.id, type: shape.type, x: originPagePoint.x - w / 2, y: originPagePoint.y - h / 2 })\n }\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n private create(): void {\n const editor = this.editor\n const geo = (this.parent as GeoTool).geo\n this.markId = editor.markHistoryStoppingPoint(\"create geo\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n editor.createShape({\n id,\n type: \"geo\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { geo, w: 100, h: 100 },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n private resize(): void {\n const editor = this.editor\n const shape = editor.getShape(this.shapeId!)\n if (!shape) return\n const { originPagePoint, currentPagePoint, shiftKey, altKey } = editor.inputs\n let w = currentPagePoint.x - originPagePoint.x\n let h = currentPagePoint.y - originPagePoint.y\n if (shiftKey) {\n const m = Math.max(Math.abs(w), Math.abs(h))\n w = Math.sign(w || 1) * m\n h = Math.sign(h || 1) * m\n }\n let x = originPagePoint.x\n let y = originPagePoint.y\n if (altKey) {\n x -= Math.abs(w)\n y -= Math.abs(h)\n w = Math.abs(w) * 2\n h = Math.abs(h) * 2\n } else {\n if (w < 0) x += w\n if (h < 0) y += h\n }\n editor.updateShape({ id: shape.id, type: \"geo\", x, y, props: { w: Math.max(1, Math.abs(w)), h: Math.max(1, Math.abs(h)) } })\n }\n\n private finish(): void {\n const editor = this.editor\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Draw a geo shape (rectangle, ellipse, ...) by dragging. Pick the kind with `editor.setCurrentTool('geo', { geo })`. */\nexport class GeoTool extends StateNode {\n static override id = \"geo\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n geo: GeoShapeKind = \"rectangle\"\n\n override onEnter(info: Record<string, unknown>): void {\n const geo = info[\"geo\"]\n if (typeof geo === \"string\") this.geo = geo as GeoShapeKind\n else this.geo = this.editor.getStyleForNextShape(GeoShapeGeoStyle)\n }\n}\n","import { StateNode, Vec, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"grab\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n}\n\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"grabbing\", rotation: 0 } })\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"dragging\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Dragging extends StateNode {\n static override id = \"dragging\"\n override onPointerMove(): void {\n const { currentScreenPoint, previousScreenPoint } = this.editor.inputs\n this.editor.pan(Vec.Sub(currentScreenPoint, previousScreenPoint))\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\n/** Pan the camera by dragging. */\nexport class HandTool extends StateNode {\n static override id = \"hand\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing, Dragging]\n}\n","import {\n createShapeId,\n StateNode,\n Vec,\n type ClickEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type ShapeId,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport { getIndexAbove, type IndexKey } from \"@mocanvas/store\"\nimport { getLinePoints, type LinePoint, type LineShape } from \"../shapes\"\n\n/** Segments shorter than this are treated as a repeated click, not a new point. */\nconst MIN_SEGMENT_LENGTH = 4\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button === 0) this.parent!.transition(\"pointing\", info)\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/**\n * Draws a line. A drag makes a straight two-point line; a click starts a\n * multi-segment line where every further click commits another point and the\n * last point follows the pointer. Enter or a double click finishes it.\n */\nclass Pointing extends StateNode {\n static override id = \"pointing\"\n private shapeId: ShapeId | null = null\n private markId = \"\"\n /** Id of the point that follows the pointer. */\n private draftId = \"a2\"\n /** Set once the pointer travelled far enough to count as a drag. */\n private dragged = false\n\n override onEnter(): void {\n const editor = this.editor\n this.dragged = false\n this.markId = editor.markHistoryStoppingPoint(\"create line\")\n const id = createShapeId()\n const { originPagePoint } = editor.inputs\n this.draftId = \"a2\"\n editor.createShape<LineShape>({\n id,\n type: \"line\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: {\n points: {\n a1: { id: \"a1\", index: \"a1\", x: 0, y: 0 },\n a2: { id: \"a2\", index: \"a2\", x: 0, y: 0 },\n },\n },\n })\n editor.select(id)\n this.shapeId = id\n }\n\n /** A further click commits the draft point and starts a new one. */\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const shape = this.getShape()\n if (!shape) return\n this.dragged = false\n this.moveDraftToPointer()\n this.addPoint()\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.dragged = true\n this.moveDraftToPointer()\n }\n\n override onPointerUp(): void {\n // A drag finishes the line right away; a click keeps the tool going so the\n // next click adds another segment. `inputs.isDragging` is already cleared\n // by the time a pointer up arrives, hence the flag.\n if (this.dragged) this.finish()\n }\n\n override onDoubleClick(_info: ClickEventInfo): void {\n this.finish()\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Enter\") this.finish()\n }\n\n override onComplete(): void {\n this.finish()\n }\n\n override onCancel(): void {\n if (this.markId) this.editor.bailToMark(this.markId)\n this.shapeId = null\n this.parent!.transition(\"idle\")\n }\n\n private getShape(): LineShape | undefined {\n return this.shapeId ? this.editor.getShape<LineShape>(this.shapeId) : undefined\n }\n\n private moveDraftToPointer(): void {\n const editor = this.editor\n const shape = this.getShape()\n if (!shape) return\n const local = editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint)\n const draft = shape.props.points[this.draftId]\n if (!draft) return\n const points: Record<string, LinePoint> = { ...shape.props.points, [this.draftId]: { ...draft, x: local.x, y: local.y } }\n editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n }\n\n private addPoint(): void {\n const shape = this.getShape()\n if (!shape) return\n const ordered = getLinePoints(shape)\n const last = ordered.at(-1)\n const prev = ordered.at(-2)\n if (!last) return\n // Clicking the same spot twice would add a degenerate segment; finish instead.\n if (prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n this.finish()\n return\n }\n const index = getIndexAbove(last.index as IndexKey)\n const points: Record<string, LinePoint> = { ...shape.props.points, [index]: { id: index, index, x: last.x, y: last.y } }\n this.draftId = index\n this.editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n }\n\n private finish(): void {\n const editor = this.editor\n const shape = this.getShape()\n if (shape) {\n const ordered = getLinePoints(shape)\n const last = ordered.at(-1)\n const prev = ordered.at(-2)\n if (ordered.length > 2 && last && prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n // Drop the trailing draft point left over from the finishing click.\n const points = { ...shape.props.points }\n delete points[last.id]\n editor.updateShape<LineShape>({ id: shape.id, type: \"line\", props: { points } })\n } else if (ordered.length <= 2 && last && prev && Vec.Dist(prev, last) < MIN_SEGMENT_LENGTH) {\n // A line of no length at all: undo the whole creation.\n editor.bailToMark(this.markId)\n }\n }\n this.shapeId = null\n const locked = editor.getInstanceState().isToolLocked\n this.parent!.transition(\"idle\")\n if (!locked) editor.setCurrentTool(\"select\")\n }\n}\n\n/** Drag for a straight line, or click repeatedly for a multi-segment one. */\nexport class LineTool extends StateNode {\n static override id = \"line\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle, Pointing]\n}\n","import { createShapeId, StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const editor = this.editor\n const { originPagePoint } = editor.inputs\n editor.markHistoryStoppingPoint(\"create note\")\n const id = createShapeId()\n editor.createShape({\n id,\n type: \"note\",\n x: originPagePoint.x - 100,\n y: originPagePoint.y - 100,\n })\n editor.select(id)\n editor.setEditingShape(id)\n if (!editor.getInstanceState().isToolLocked) editor.setCurrentTool(\"select\")\n }\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/** Click to place a sticky note. */\nexport class NoteTool extends StateNode {\n static override id = \"note\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle]\n}\n","import {\n Box,\n StateNode,\n Vec,\n type ClickEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type SelectionHandle,\n type ShapeHandle,\n type ShapeId,\n type ShapePartial,\n type StateNodeConstructor,\n type UnknownShape,\n} from \"@mocanvas/editor\"\n\nconst RESIZE_CURSORS: Partial<Record<SelectionHandle, string>> = {\n top: \"ns-resize\",\n bottom: \"ns-resize\",\n left: \"ew-resize\",\n right: \"ew-resize\",\n top_left: \"nwse-resize\",\n bottom_right: \"nwse-resize\",\n top_right: \"nesw-resize\",\n bottom_left: \"nesw-resize\",\n rotate: \"grab\",\n}\n\nfunction setCursor(editor: { updateInstanceState(p: { cursor: { type: string; rotation: number } }): unknown }, type: string): void {\n editor.updateInstanceState({ cursor: { type, rotation: 0 } })\n}\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"default\", rotation: 0 } })\n }\n\n override onPointerMove(info: PointerEventInfo): void {\n const hovered = info.target === \"shape\" ? info.shape : undefined\n this.editor.setHoveredShape(hovered && !this.editor.isShapeOrAncestorLocked(hovered) ? hovered.id : null)\n if (info.target === \"selection\" && info.handle) setCursor(this.editor, RESIZE_CURSORS[info.handle] ?? \"default\")\n else if (info.target === \"handle\") setCursor(this.editor, \"pointer\")\n else setCursor(this.editor, \"default\")\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n switch (info.target) {\n case \"canvas\": {\n this.parent!.transition(\"pointing_canvas\", info)\n break\n }\n case \"selection\": {\n if (info.handle === \"rotate\") this.parent!.transition(\"pointing_rotate_handle\", info)\n else if (info.handle) this.parent!.transition(\"pointing_resize_handle\", info)\n else this.parent!.transition(\"pointing_selection\", info)\n break\n }\n case \"handle\": {\n this.parent!.transition(\"pointing_handle\", info)\n break\n }\n case \"shape\": {\n if (this.editor.isShapeOrAncestorLocked(info.shape)) {\n this.parent!.transition(\"pointing_canvas\", info)\n return\n }\n const outer = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n this.parent!.transition(\"pointing_shape\", { ...info, shape: outer })\n break\n }\n default:\n break\n }\n }\n\n override onDoubleClick(info: ClickEventInfo): void {\n if (info.target !== \"shape\") return\n const outer = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n if (outer.type === \"group\" && outer.id !== info.shape.id) {\n // Focus into the group so its children become selectable.\n this.editor.updateCurrentPageState({ focusedGroupId: outer.id })\n const inner = this.editor.getOutermostSelectableShape(info.shape) ?? info.shape\n this.editor.select(inner.id)\n return\n }\n const shape = info.shape\n const util = this.editor.getShapeUtil(shape)\n if (util.canEdit(shape) && !this.editor.isShapeOrAncestorLocked(shape)) {\n this.editor.select(shape.id)\n this.editor.setEditingShape(shape.id)\n } else {\n const change = util.onDoubleClick?.(shape)\n if (change) this.editor.updateShape({ id: shape.id, type: shape.type, ...change })\n }\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n const editor = this.editor\n switch (info.key) {\n case \"Delete\":\n case \"Backspace\": {\n const ids = editor.getSelectedShapeIds()\n if (ids.length) {\n editor.markHistoryStoppingPoint(\"delete\")\n editor.deleteShapes(ids)\n }\n break\n }\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n const step = info.shiftKey ? 10 : 1\n const d = new Vec(\n info.key === \"ArrowLeft\" ? -step : info.key === \"ArrowRight\" ? step : 0,\n info.key === \"ArrowUp\" ? -step : info.key === \"ArrowDown\" ? step : 0,\n )\n editor.markHistoryStoppingPoint(\"nudge\")\n editor.updateShapes(\n ids.map((id) => {\n const s = editor.getShape(id)!\n return { id, type: s.type, x: s.x + d.x, y: s.y + d.y }\n }),\n )\n break\n }\n case \"Escape\": {\n if (editor.getEditingShapeId()) editor.setEditingShape(null)\n else if (editor.getCurrentPageState().focusedGroupId) {\n const g = editor.getCurrentPageState().focusedGroupId!\n editor.updateCurrentPageState({ focusedGroupId: null })\n editor.select(g)\n } else editor.selectNone()\n break\n }\n default:\n break\n }\n }\n\n override onCancel(): void {\n if (this.editor.getEditingShapeId()) this.editor.setEditingShape(null)\n else this.editor.selectNone()\n }\n}\n\nclass PointingCanvas extends StateNode {\n static override id = \"pointing_canvas\"\n\n override onEnter(): void {\n if (!this.editor.inputs.shiftKey) {\n if (this.editor.getEditingShapeId()) this.editor.setEditingShape(null)\n if (this.editor.getCurrentPageState().focusedGroupId) this.editor.updateCurrentPageState({ focusedGroupId: null })\n this.editor.selectNone()\n }\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"brushing\")\n }\n\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Brushing extends StateNode {\n static override id = \"brushing\"\n private initialSelection: ShapeId[] = []\n\n override onEnter(): void {\n this.initialSelection = this.editor.inputs.shiftKey ? this.editor.getSelectedShapeIds() : []\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.finish()\n }\n\n override onCancel(): void {\n this.editor.setSelectedShapes(this.initialSelection)\n this.finish()\n }\n\n override onExit(): void {\n this.editor.updateInstanceState({ brush: null })\n }\n\n private update(): void {\n const { originPagePoint, currentPagePoint, ctrlKey } = this.editor.inputs\n const box = Box.FromPoints([originPagePoint, currentPagePoint])\n this.editor.updateInstanceState({ brush: box.toJson() })\n const hits = ctrlKey ? this.editor.getShapesInsideBounds(box) : this.editor.getShapesIntersectingBounds(box)\n const pageId = this.editor.getCurrentPageId()\n const ids = new Set<ShapeId>(this.initialSelection)\n for (const s of hits) {\n if (s.isLocked) continue\n // select top-level ancestors only\n let top: UnknownShape = s\n while (top.parentId !== pageId) {\n const p = this.editor.getShape(top.parentId as ShapeId)\n if (!p) break\n top = p\n }\n ids.add(top.id)\n }\n this.editor.setSelectedShapes([...ids])\n }\n\n private finish(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingShape extends StateNode {\n static override id = \"pointing_shape\"\n private hitShape: UnknownShape | undefined\n private wasSelected = false\n\n override onEnter(info: Record<string, unknown>): void {\n const shape = (info as { shape?: UnknownShape }).shape\n this.hitShape = shape\n if (!shape) return\n const editor = this.editor\n const selected = editor.getSelectedShapeIds()\n this.wasSelected = selected.includes(shape.id)\n if (editor.inputs.shiftKey) {\n if (!this.wasSelected) editor.setSelectedShapes([...selected, shape.id])\n } else if (!this.wasSelected) {\n editor.setSelectedShapes([shape.id])\n }\n }\n\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) {\n this.parent!.transition(\"translating\")\n }\n }\n\n override onPointerUp(): void {\n const editor = this.editor\n if (editor.inputs.shiftKey && this.wasSelected && this.hitShape) {\n editor.setSelectedShapes(editor.getSelectedShapeIds().filter((id) => id !== this.hitShape!.id))\n }\n this.parent!.transition(\"idle\")\n }\n\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Translating extends StateNode {\n static override id = \"translating\"\n private initialShapes = new Map<ShapeId, UnknownShape>()\n private markId = \"\"\n\n override onEnter(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"translate\")\n this.initialShapes.clear()\n for (const s of editor.getSelectedShapes()) {\n this.initialShapes.set(s.id, s)\n editor.getShapeUtil(s).onTranslateStart?.(s)\n }\n editor.updateInstanceState({ cursor: { type: \"move\", rotation: 0 } })\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n\n override onPointerUp(): void {\n this.complete()\n }\n\n override onComplete(): void {\n this.complete()\n }\n\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Shift\" || info.key === \"Alt\") this.update()\n }\n\n override onKeyUp(info: KeyboardEventInfo): void {\n if (info.key === \"Shift\" || info.key === \"Alt\") this.update()\n }\n\n private initialBounds: Box | undefined\n\n private update(): void {\n const editor = this.editor\n const { originPagePoint, currentPagePoint, shiftKey, ctrlKey } = editor.inputs\n let delta = Vec.Sub(currentPagePoint, originPagePoint)\n let lockX = false\n let lockY = false\n if (shiftKey) {\n // lock to the dominant axis\n if (Math.abs(delta.x) > Math.abs(delta.y)) {\n delta = new Vec(delta.x, 0)\n lockY = true\n } else {\n delta = new Vec(0, delta.y)\n lockX = true\n }\n }\n if (!ctrlKey && editor.inputs.isDragging) {\n this.initialBounds ??= Box.Common(\n [...this.initialShapes.values()].map((s) => editor.getShapePageBounds(s)).filter((b): b is Box => !!b),\n )\n if (this.initialBounds) {\n const moving = new Box(this.initialBounds.x + delta.x, this.initialBounds.y + delta.y, this.initialBounds.w, this.initialBounds.h)\n const { nudge } = editor.snaps.snapTranslate(moving, new Set(this.initialShapes.keys()), { lockX, lockY })\n delta = Vec.Add(delta, nudge)\n }\n } else {\n editor.snaps.clearLines()\n }\n const updates: ShapePartial[] = []\n for (const [id, initial] of this.initialShapes) {\n // delta is in page space; convert to parent space for nested shapes\n const parent = editor.getShapeParent(initial)\n let d = delta\n if (parent) {\n const m = editor.getShapePageTransform(parent)\n const det = m.a * m.d - m.b * m.c || 1\n d = new Vec((m.d * delta.x - m.c * delta.y) / det, (-m.b * delta.x + m.a * delta.y) / det)\n }\n const next = { ...initial, x: initial.x + d.x, y: initial.y + d.y }\n const change = editor.getShapeUtil(initial).onTranslate?.(initial, next)\n updates.push({ id, type: initial.type, x: next.x, y: next.y, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const [id, initial] of this.initialShapes) {\n const current = editor.getShape(id)\n if (current) {\n const change = editor.getShapeUtil(initial).onTranslateEnd?.(initial, current)\n if (change) editor.updateShape({ id, type: initial.type, ...change })\n }\n }\n this.parent!.transition(\"idle\")\n }\n\n override onExit(): void {\n this.editor.snaps.clearLines()\n this.initialBounds = undefined\n }\n}\n\nclass PointingSelection extends StateNode {\n static override id = \"pointing_selection\"\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"translating\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingResizeHandle extends StateNode {\n static override id = \"pointing_resize_handle\"\n private handle: SelectionHandle = \"bottom_right\"\n override onEnter(info: Record<string, unknown>): void {\n this.handle = (info as { handle?: SelectionHandle }).handle ?? \"bottom_right\"\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"resizing\", { handle: this.handle })\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingRotateHandle extends StateNode {\n static override id = \"pointing_rotate_handle\"\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging) this.parent!.transition(\"rotating\")\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\nclass PointingHandle extends StateNode {\n static override id = \"pointing_handle\"\n private info: { shape: UnknownShape; handle: ShapeHandle } | null = null\n override onEnter(info: Record<string, unknown>): void {\n const i = info as { shape?: UnknownShape; handle?: ShapeHandle }\n this.info = i.shape && i.handle ? { shape: i.shape, handle: i.handle } : null\n }\n override onPointerMove(): void {\n if (this.editor.inputs.isDragging && this.info) this.parent!.transition(\"dragging_handle\", this.info)\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.parent!.transition(\"idle\")\n }\n}\n\ninterface ResizeSnapshot {\n shape: UnknownShape\n /** Shape-local geometry bounds. */\n bounds: Box\n /** Page position of the shape origin. */\n pagePos: Vec\n}\n\nclass Resizing extends StateNode {\n static override id = \"resizing\"\n private handle: SelectionHandle = \"bottom_right\"\n private markId = \"\"\n private snapshots: ResizeSnapshot[] = []\n private initialSelectionBounds = new Box()\n private single: UnknownShape | undefined\n private singleRotation = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const editor = this.editor\n this.handle = (info as { handle?: SelectionHandle }).handle ?? \"bottom_right\"\n this.markId = editor.markHistoryStoppingPoint(\"resize\")\n const selected = editor.getSelectedShapes()\n this.snapshots = selected.map((shape) => {\n const m = editor.getShapePageTransform(shape)\n return { shape, bounds: editor.getShapeGeometryBounds(shape)!.clone(), pagePos: new Vec(m.e, m.f) }\n })\n this.single = selected.length === 1 ? selected[0] : undefined\n this.singleRotation = this.single ? editor.getSelectionRotation() : 0\n this.initialSelectionBounds = this.single ? this.snapshots[0]!.bounds.clone() : editor.getSelectionPageBounds()!.clone()\n for (const s of this.snapshots) editor.getShapeUtil(s.shape).onResizeStart?.(s.shape)\n setCursor(editor, RESIZE_CURSORS[this.handle] ?? \"default\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.complete()\n }\n override onComplete(): void {\n this.complete()\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n /** Pointer position in the resize frame (shape-local for a single shape, page for many). */\n private framePoint(pagePoint: Vec): Vec {\n if (!this.single) return pagePoint\n const s = this.snapshots[0]!\n // inverse of the initial page transform (rotation + translation only)\n const d = Vec.Sub(pagePoint, s.pagePos)\n return Vec.Rot(d, -this.singleRotation)\n }\n\n private update(): void {\n const editor = this.editor\n const { currentPagePoint, originPagePoint, shiftKey, altKey } = editor.inputs\n const b0 = this.initialSelectionBounds\n const p = this.framePoint(currentPagePoint)\n const p0 = this.framePoint(originPagePoint)\n const delta = Vec.Sub(p, p0)\n const h = this.handle\n\n // New frame bounds from the dragged handle.\n let minX = b0.x\n let minY = b0.y\n let maxX = b0.maxX\n let maxY = b0.maxY\n if (h.includes(\"left\")) minX += delta.x\n if (h.includes(\"right\")) maxX += delta.x\n if (h.includes(\"top\")) minY += delta.y\n if (h.includes(\"bottom\")) maxY += delta.y\n if (altKey) {\n // symmetric about the center\n if (h.includes(\"left\")) maxX -= delta.x\n if (h.includes(\"right\")) minX -= delta.x\n if (h.includes(\"top\")) maxY -= delta.y\n if (h.includes(\"bottom\")) minY -= delta.y\n }\n let scaleX = b0.w === 0 ? 1 : (maxX - minX) / b0.w\n let scaleY = b0.h === 0 ? 1 : (maxY - minY) / b0.h\n const lockAspect = shiftKey || (this.single ? editor.getShapeUtil(this.single).isAspectRatioLocked(this.single) : false)\n if (lockAspect && h.includes(\"_\")) {\n const s = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n scaleX = Math.sign(scaleX || 1) * s\n scaleY = Math.sign(scaleY || 1) * s\n // recompute the moving edges from the anchored ones\n if (h.includes(\"left\")) minX = maxX - b0.w * scaleX\n else maxX = minX + b0.w * scaleX\n if (h.includes(\"top\")) minY = maxY - b0.h * scaleY\n else maxY = minY + b0.h * scaleY\n }\n // Flipping is not supported yet: clamp to a minimum size.\n const MIN = 1\n if (maxX - minX < MIN) {\n if (h.includes(\"left\")) minX = maxX - MIN\n else maxX = minX + MIN\n scaleX = MIN / (b0.w || MIN)\n }\n if (maxY - minY < MIN) {\n if (h.includes(\"top\")) minY = maxY - MIN\n else maxY = minY + MIN\n scaleY = MIN / (b0.h || MIN)\n }\n const anchorX = minX - b0.x * scaleX\n const anchorY = minY - b0.y * scaleY\n\n const updates: ShapePartial[] = []\n for (const snap of this.snapshots) {\n const { shape, bounds } = snap\n const util = editor.getShapeUtil(shape)\n if (!util.canResize(shape)) continue\n let newOriginFrame: Vec\n if (this.single) {\n // frame == shape local space; local origin (0,0) maps to (anchorX, anchorY)\n newOriginFrame = new Vec(anchorX, anchorY)\n } else {\n const rel = Vec.Sub(snap.pagePos, new Vec(b0.x, b0.y))\n newOriginFrame = new Vec(minX + rel.x * scaleX, minY + rel.y * scaleY)\n }\n // frame → page → parent\n const pagePoint = this.single ? Vec.Add(Vec.Rot(newOriginFrame, this.singleRotation), snap.pagePos) : newOriginFrame\n const parentPoint = editor.getPointInParentSpace(shape, pagePoint)\n const change = util.onResize?.(shape, {\n newPoint: parentPoint,\n handle: h,\n mode: \"scale_shape\",\n scaleX,\n scaleY,\n initialBounds: bounds.toJson(),\n initialShape: shape,\n })\n updates.push({ id: shape.id, type: shape.type, x: parentPoint.x, y: parentPoint.y, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const snap of this.snapshots) {\n const current = editor.getShape(snap.shape.id)\n if (current) editor.getShapeUtil(snap.shape).onResizeEnd?.(snap.shape, current)\n }\n this.parent!.transition(\"idle\")\n }\n}\n\nclass Rotating extends StateNode {\n static override id = \"rotating\"\n private markId = \"\"\n private center = new Vec()\n private startAngle = 0\n private initialShapes: { shape: UnknownShape; pagePos: Vec; pageRotation: number }[] = []\n\n override onEnter(): void {\n const editor = this.editor\n this.markId = editor.markHistoryStoppingPoint(\"rotate\")\n this.center = editor.getSelectionPageBounds()!.center\n this.startAngle = Vec.Angle(this.center, editor.inputs.originPagePoint)\n this.initialShapes = editor.getSelectedShapes().map((shape) => {\n const m = editor.getShapePageTransform(shape)\n return { shape, pagePos: new Vec(m.e, m.f), pageRotation: Math.atan2(m.b, m.a) }\n })\n for (const i of this.initialShapes) editor.getShapeUtil(i.shape).onRotateStart?.(i.shape)\n setCursor(editor, \"grabbing\")\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.complete()\n }\n override onComplete(): void {\n this.complete()\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n let delta = Vec.Angle(this.center, editor.inputs.currentPagePoint) - this.startAngle\n if (editor.inputs.shiftKey) {\n const step = Math.PI / 12\n // snap the resulting page rotation of the first shape to 15° steps\n const base = this.initialShapes[0]?.pageRotation ?? 0\n delta = Math.round((base + delta) / step) * step - base\n }\n const updates: ShapePartial[] = []\n for (const i of this.initialShapes) {\n const newPagePos = Vec.RotWith(i.pagePos, this.center, delta)\n const parentPoint = editor.getPointInParentSpace(i.shape, newPagePos)\n const next = { ...i.shape, x: parentPoint.x, y: parentPoint.y, rotation: i.shape.rotation + delta }\n const change = editor.getShapeUtil(i.shape).onRotate?.(i.shape, next)\n updates.push({ id: i.shape.id, type: i.shape.type, x: next.x, y: next.y, rotation: next.rotation, ...(change ?? {}) })\n }\n editor.updateShapes(updates)\n }\n\n private complete(): void {\n const editor = this.editor\n for (const i of this.initialShapes) {\n const current = editor.getShape(i.shape.id)\n if (current) editor.getShapeUtil(i.shape).onRotateEnd?.(i.shape, current)\n }\n this.parent!.transition(\"idle\")\n }\n}\n\nclass DraggingHandle extends StateNode {\n static override id = \"dragging_handle\"\n private markId = \"\"\n private shape!: UnknownShape\n private handle!: ShapeHandle\n private startedAt = 0\n\n override onEnter(info: Record<string, unknown>): void {\n const i = info as { shape: UnknownShape; handle: ShapeHandle }\n this.shape = this.editor.getShape(i.shape.id) ?? i.shape\n this.handle = i.handle\n this.startedAt = performance.now()\n this.markId = this.editor.markHistoryStoppingPoint(\"drag handle\")\n setCursor(this.editor, \"grabbing\")\n this.update()\n }\n\n override onPointerMove(): void {\n this.update()\n }\n override onKeyDown(): void {\n this.update()\n }\n override onKeyUp(): void {\n this.update()\n }\n override onPointerUp(): void {\n this.parent!.transition(\"idle\")\n }\n override onComplete(): void {\n this.parent!.transition(\"idle\")\n }\n override onCancel(): void {\n this.editor.bailToMark(this.markId)\n this.parent!.transition(\"idle\")\n }\n\n private update(): void {\n const editor = this.editor\n const current = editor.getShape(this.shape.id)\n if (!current) return\n const local = editor.getPointInShapeSpace(current, editor.inputs.currentPagePoint)\n const handle: ShapeHandle = { ...this.handle, x: local.x, y: local.y }\n const isPrecise = editor.inputs.altKey || performance.now() - this.startedAt > 1200\n const change = editor.getShapeUtil(current).onHandleDrag?.(current, { handle, isPrecise, initial: this.shape })\n if (change) editor.updateShape({ id: current.id, type: current.type, ...change })\n }\n}\n\n/** Selection, brush select, drag-to-move, resize, rotate, and shape handle dragging. */\nexport class SelectTool extends StateNode {\n static override id = \"select\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [\n Idle,\n PointingCanvas,\n Brushing,\n PointingShape,\n PointingSelection,\n PointingResizeHandle,\n PointingRotateHandle,\n PointingHandle,\n Translating,\n Resizing,\n Rotating,\n DraggingHandle,\n ]\n}\n","import { createShapeId, StateNode, type PointerEventInfo, type StateNodeConstructor } from \"@mocanvas/editor\"\n\nclass Idle extends StateNode {\n static override id = \"idle\"\n\n override onEnter(): void {\n this.editor.updateInstanceState({ cursor: { type: \"cross\", rotation: 0 } })\n }\n\n override onPointerDown(info: PointerEventInfo): void {\n if (info.button !== 0) return\n const editor = this.editor\n const { originPagePoint } = editor.inputs\n editor.markHistoryStoppingPoint(\"create text\")\n const id = createShapeId()\n editor.createShape({\n id,\n type: \"text\",\n x: originPagePoint.x,\n y: originPagePoint.y,\n props: { text: \"\", autoSize: true },\n })\n editor.select(id)\n editor.setEditingShape(id)\n if (!editor.getInstanceState().isToolLocked) editor.setCurrentTool(\"select\")\n }\n\n override onCancel(): void {\n this.editor.setCurrentTool(\"select\")\n }\n}\n\n/** Click to place a text shape and start typing. */\nexport class TextTool extends StateNode {\n static override id = \"text\"\n static override initial = \"idle\"\n static override children = (): StateNodeConstructor[] => [Idle]\n}\n","import type { StateNodeConstructor } from \"@mocanvas/editor\"\nimport { ArrowTool } from \"./ArrowTool\"\nimport { DrawTool } from \"./DrawTool\"\nimport { EraserTool } from \"./EraserTool\"\nimport { FrameTool } from \"./FrameTool\"\nimport { GeoTool } from \"./GeoTool\"\nimport { HandTool } from \"./HandTool\"\nimport { LineTool } from \"./LineTool\"\nimport { NoteTool } from \"./NoteTool\"\nimport { SelectTool } from \"./SelectTool\"\nimport { TextTool } from \"./TextTool\"\n\nexport { ArrowTool, DrawTool, EraserTool, FrameTool, GeoTool, HandTool, LineTool, NoteTool, SelectTool, TextTool }\n\nexport const defaultTools: StateNodeConstructor[] = [\n SelectTool,\n HandTool,\n GeoTool,\n DrawTool,\n EraserTool,\n NoteTool,\n TextTool,\n ArrowTool,\n LineTool,\n FrameTool,\n]\n","/**\n * The default UI icon set: original artwork drawn on a 24×24 grid with a\n * 1.75px stroke, round caps and joins, painted with `currentColor` so buttons\n * control their own colour.\n *\n * Grid rules, enforced by `icons.test.tsx` where they are checkable statically\n * and by the gallery pass otherwise:\n *\n * - the artwork lives on a 24×24 viewBox; ink (stroke included) stays inside it\n * - ink is optically centred on (12, 12) and spans about 17.75 units at its\n * widest, so no icon reads heavier than its neighbour in the same row\n * - stroke is 1.75 with round caps and joins; only texture marks (hatching,\n * dotted rules, the mono rails) deviate, and they say so at the call site\n * - deliberate asymmetry is allowed only when it carries meaning, e.g. the\n * vertical-align icons sit high or low on purpose\n *\n * Geo icons are generated from the same geometry the canvas draws, so a toolbar\n * button matches the shape it creates.\n */\nimport { GEO_SHAPE_KINDS, type GeoShapeKind } from \"@mocanvas/editor\"\nimport type { ReactElement } from \"react\"\nimport { getGeoGeometry } from \"../shapes/geo-helpers\"\nimport { pathWordsToSvgD } from \"../shapes/svg-path\"\n\n/** Side of the drawing grid. */\nexport const ICON_GRID = 24\n/** Longest side of the box a geo outline is fitted into, centred in the grid. */\nexport const GEO_BOX = 16\n\nconst solid = { fill: \"currentColor\", stroke: \"none\" } as const\n\n// ---------------------------------------------------------------------------\n// Tools\n// ---------------------------------------------------------------------------\n\nconst TOOL_ICONS = {\n select: <path d=\"M6.65 4.05v13.95l3.54-3.35 2.41 5.3 2.33-1.02-2.42-5.21 4.84-.19z\" />,\n hand: (\n <path d=\"M8.35 14.6V9.5a1.3 1.3 0 0 1 2.6 0V5.3a1.3 1.3 0 0 1 2.6 0v.5a1.3 1.3 0 0 1 2.6 0v1.9a1.3 1.3 0 0 1 2.6 0v6.75c0 3.15-2.55 5.7-5.7 5.7h-.6c-1.9 0-3.68-.96-4.72-2.55l-1.75-2.65a1.3 1.3 0 0 1 2.17-1.42z\" />\n ),\n draw: (\n <>\n <path d=\"M4.4 19.6l1.05-3.8L15.5 5.75a2 2 0 0 1 2.83 2.83L8.2 18.55z\" />\n <path d=\"M13.55 7.7l2.83 2.83\" />\n </>\n ),\n eraser: (\n <>\n <g transform=\"translate(12 10.5) rotate(-45)\">\n <rect x=\"-5.75\" y=\"-3.5\" width=\"11.5\" height=\"7\" rx=\"1.6\" />\n <path d=\"M0 -3.5V3.5\" />\n </g>\n <path d=\"M7 19.4h10.5\" />\n </>\n ),\n text: (\n <>\n <path d=\"M5 6.25V4.5h14v1.75\" />\n <path d=\"M12 4.5v15\" />\n <path d=\"M8.75 19.5h6.5\" />\n </>\n ),\n note: (\n <>\n <path d=\"M4.5 5.75A1.75 1.75 0 0 1 6.25 4h11.5a1.75 1.75 0 0 1 1.75 1.75v8L13.5 20H6.25A1.75 1.75 0 0 1 4.5 18.25z\" />\n <path d=\"M19.5 13.75h-4.25a1.75 1.75 0 0 0-1.75 1.75V20\" />\n </>\n ),\n frame: (\n <>\n <path d=\"M8 4.5v15M16 4.5v15\" />\n <path d=\"M4.5 8h15M4.5 16h15\" />\n </>\n ),\n arrow: (\n <>\n <path d=\"M5.15 18.85L18.85 5.15\" />\n <path d=\"M12 5.15h6.85V12\" />\n </>\n ),\n line: (\n <>\n <path d=\"M7.6 16.4L16.4 7.6\" />\n <circle cx=\"5.85\" cy=\"18.15\" r=\"1.85\" />\n <circle cx=\"18.15\" cy=\"5.85\" r=\"1.85\" />\n </>\n ),\n image: (\n <>\n <rect x=\"3.9\" y=\"5.25\" width=\"16.2\" height=\"13.5\" rx=\"2.25\" />\n <circle cx=\"8.9\" cy=\"10\" r=\"1.55\" />\n <path d=\"M4 16.2l4.75-4.2 3.75 3.25 3-2.5 4.6 4.05\" />\n </>\n ),\n} as const\n\n// ---------------------------------------------------------------------------\n// View, history and object actions\n// ---------------------------------------------------------------------------\n\nconst ACTION_ICONS = {\n \"zoom-in\": (\n <>\n <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\" />\n <path d=\"M15.4 15.4l5.1 5.1\" />\n <path d=\"M8 10.75h5.5M10.75 8v5.5\" />\n </>\n ),\n \"zoom-out\": (\n <>\n <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\" />\n <path d=\"M15.4 15.4l5.1 5.1\" />\n <path d=\"M8 10.75h5.5\" />\n </>\n ),\n \"zoom-fit\": (\n <path d=\"M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15\" />\n ),\n undo: (\n <>\n <path d=\"M4.25 8.75h10.25a5.25 5.25 0 0 1 0 10.5H10\" />\n <path d=\"M8.25 4.75L4.25 8.75l4 4\" />\n </>\n ),\n redo: (\n <>\n <path d=\"M19.75 8.75H9.5a5.25 5.25 0 0 0 0 10.5H14\" />\n <path d=\"M15.75 4.75l4 4-4 4\" />\n </>\n ),\n lock: (\n <>\n <rect x=\"4.75\" y=\"10.5\" width=\"14.5\" height=\"9.5\" rx=\"2.25\" />\n <path d=\"M8.25 10.5V7.75a3.75 3.75 0 0 1 7.5 0v2.75\" />\n </>\n ),\n unlock: (\n <>\n <rect x=\"4.75\" y=\"10.5\" width=\"14.5\" height=\"9.5\" rx=\"2.25\" />\n <path d=\"M8.25 10.5V7.75a3.75 3.75 0 0 1 7.15-1.5\" />\n </>\n ),\n duplicate: (\n <>\n <rect x=\"8.5\" y=\"8.5\" width=\"11.5\" height=\"11.5\" rx=\"2.25\" />\n <path d=\"M15.5 4H6.25A2.25 2.25 0 0 0 4 6.25V15.5\" />\n </>\n ),\n trash: (\n <>\n <path d=\"M4.5 7h15\" />\n <path d=\"M9.5 7V5.75A1.5 1.5 0 0 1 11 4.25h2a1.5 1.5 0 0 1 1.5 1.5V7\" />\n <path d=\"M6.75 7l.75 11.5A1.5 1.5 0 0 0 9 20h6a1.5 1.5 0 0 0 1.5-1.5L17.25 7\" />\n <path d=\"M10.25 10.5v6M13.75 10.5v6\" />\n </>\n ),\n group: (\n <>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect x=\"7\" y=\"7\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"12.5\" y=\"12.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </>\n ),\n ungroup: (\n <>\n <path d=\"M4 8V5.25A1.25 1.25 0 0 1 5.25 4H8M16 4h2.75A1.25 1.25 0 0 1 20 5.25V8M20 16v2.75A1.25 1.25 0 0 1 18.75 20H16M8 20H5.25A1.25 1.25 0 0 1 4 18.75V16\" />\n <rect x=\"7\" y=\"7\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"12.5\" y=\"12.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </>\n ),\n \"bring-forward\": (\n <>\n <rect x=\"4.75\" y=\"11.25\" width=\"14.5\" height=\"8.75\" rx=\"2.25\" />\n <path d=\"M12 9V4M8.75 7.25L12 4l3.25 3.25\" />\n </>\n ),\n \"send-backward\": (\n <>\n <rect x=\"4.75\" y=\"4\" width=\"14.5\" height=\"8.75\" rx=\"2.25\" />\n <path d=\"M12 15v5M8.75 16.75L12 20l3.25-3.25\" />\n </>\n ),\n \"chevron-down\": <path d=\"M6.75 9.75L12 15l5.25-5.25\" />,\n \"chevron-up\": <path d=\"M6.75 14.25L12 9l5.25 5.25\" />,\n check: <path d=\"M5 12.5l4.9 4.9L19 6.75\" />,\n close: <path d=\"M6.5 6.5l11 11M17.5 6.5l-11 11\" />,\n mixed: <circle cx=\"12\" cy=\"12\" r=\"7.25\" strokeDasharray=\"2.6 2.8\" />,\n} as const\n\n// ---------------------------------------------------------------------------\n// Style properties\n// ---------------------------------------------------------------------------\n\nconst FILL_BOX = { x: 4.25, y: 4.25, width: 15.5, height: 15.5, rx: 3 } as const\n\nconst STYLE_ICONS = {\n \"fill-none\": <rect {...FILL_BOX} />,\n \"fill-semi\": (\n <>\n <rect {...FILL_BOX} fill=\"currentColor\" fillOpacity={0.22} />\n </>\n ),\n \"fill-solid\": <rect {...FILL_BOX} fill=\"currentColor\" />,\n // Hatching is texture, not outline: a lighter stroke keeps the block's weight\n // level with the other three fill icons.\n \"fill-pattern\": (\n <>\n <rect {...FILL_BOX} />\n <path d=\"M6.2 12.6l6.4-6.4M6.2 17.1l10.9-10.9M9.4 18.3l8.9-8.9M14.6 18.4l3.7-3.7\" strokeWidth={1.25} />\n </>\n ),\n \"dash-draw\": <path d=\"M4 14.9c1.6-3.4 3.2-4.9 4.9-4.4 1.7.4 2.4 4 4.2 4.4 1.9.4 3.9-1.9 6.9-5.9\" />,\n \"dash-solid\": <path d=\"M4.25 12h15.5\" />,\n \"dash-dashed\": <path d=\"M4.5 12h15\" strokeDasharray=\"3.1 2.8\" />,\n // Round caps on a zero-length dash draw the dots; the wider stroke is the dot.\n \"dash-dotted\": <path d=\"M5 12h14\" strokeDasharray=\"0.01 4.35\" strokeWidth={2.6} />,\n \"size-s\": <circle cx=\"12\" cy=\"12\" r=\"2\" {...solid} />,\n \"size-m\": <circle cx=\"12\" cy=\"12\" r=\"3.4\" {...solid} />,\n \"size-l\": <circle cx=\"12\" cy=\"12\" r=\"4.9\" {...solid} />,\n \"size-xl\": <circle cx=\"12\" cy=\"12\" r=\"6.6\" {...solid} />,\n \"align-left\": <path d=\"M4.5 6.5h15M4.5 12h7.5M4.5 17.5h11.5\" />,\n \"align-center\": <path d=\"M4.5 6.5h15M8.25 12h7.5M6.25 17.5h11.5\" />,\n \"align-right\": <path d=\"M4.5 6.5h15M12 12h7.5M8 17.5h11.5\" />,\n \"valign-top\": (\n <>\n <path d=\"M4.5 4.5h15\" />\n <rect x=\"7.5\" y=\"7.75\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n \"valign-middle\": (\n <>\n <path d=\"M4.5 12h15\" />\n <rect x=\"7.5\" y=\"8.9\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n \"valign-bottom\": (\n <>\n <path d=\"M4.5 19.5h15\" />\n <rect x=\"7.5\" y=\"10\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n // A single-storey script \"a\": the other three fonts share the capital-A\n // silhouette, so the handwriting option needs a different letter to stay\n // legible at 20px.\n \"font-draw\": (\n <>\n <circle cx=\"10.6\" cy=\"12.6\" r=\"4.4\" />\n <path d=\"M15 6.3v8.9c0 1.5 1 2.5 2.5 2.5\" />\n </>\n ),\n \"font-sans\": (\n <>\n <path d=\"M5.5 19L12 5l6.5 14\" />\n <path d=\"M8 14.5h8\" />\n </>\n ),\n \"font-serif\": (\n <>\n <path d=\"M6.75 19L12 5l5.25 14\" />\n <path d=\"M8.7 14.5h6.6\" />\n <path d=\"M4.9 19h3.6M15.5 19h3.6\" />\n </>\n ),\n \"font-mono\": (\n <>\n <path d=\"M8 19l4-13 4 13\" />\n <path d=\"M9.6 14.9h4.8\" />\n {/* The rails are a frame, not a letter stroke: keep them lighter. */}\n <path d=\"M4.75 5.75v12.5M19.25 5.75v12.5\" strokeWidth={1.4} />\n </>\n ),\n} as const\n\n// ---------------------------------------------------------------------------\n// Geo kinds, derived from the canvas geometry\n// ---------------------------------------------------------------------------\n\n/**\n * Box each geo outline is fitted into. Square by default; kinds whose name\n * implies a proportion get one, so that e.g. \"oval\" does not draw the same\n * circle as \"ellipse\". The longest side is always `GEO_BOX`, which keeps every\n * geo icon at the same optical weight as the rest of the set.\n */\nconst GEO_ICON_BOX: Partial<Record<GeoShapeKind, readonly [number, number]>> = {\n rectangle: [GEO_BOX, 12],\n oval: [GEO_BOX, 10.5],\n \"arrow-left\": [GEO_BOX, 13],\n \"arrow-right\": [GEO_BOX, 13],\n \"arrow-up\": [13, GEO_BOX],\n \"arrow-down\": [13, GEO_BOX],\n}\n\n/** The box a geo icon's outline is fitted into, in grid units. */\nexport function getGeoIconBox(kind: GeoShapeKind): readonly [number, number] {\n return GEO_ICON_BOX[kind] ?? [GEO_BOX, GEO_BOX]\n}\n\n/** `d` attribute for each geo kind, fitted to its icon box. */\nexport const GEO_ICON_PATHS: Record<GeoShapeKind, string> = Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind) => {\n const [w, h] = getGeoIconBox(kind)\n return [kind, pathWordsToSvgD(getGeoGeometry(kind, w, h, false).toPathWords())]\n }),\n) as Record<GeoShapeKind, string>\n\ntype GeoIconName = `geo-${GeoShapeKind}`\n\nconst GEO_ICONS = Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind) => {\n const [w, h] = getGeoIconBox(kind)\n return [\n `geo-${kind}`,\n <g transform={`translate(${(ICON_GRID - w) / 2} ${(ICON_GRID - h) / 2})`}>\n <path d={GEO_ICON_PATHS[kind]} />\n </g>,\n ]\n }),\n) as Record<GeoIconName, ReactElement>\n\n/** Every icon in the set, keyed by name. */\nexport const ICONS = { ...TOOL_ICONS, ...ACTION_ICONS, ...STYLE_ICONS, ...GEO_ICONS }\n\nexport type IconName = keyof typeof ICONS\n\n/** All icon names, sorted — handy for tests and galleries. */\nexport const ICON_NAMES = Object.keys(ICONS).sort() as IconName[]\n\nexport interface IconProps {\n name: IconName\n /** Rendered size in px; the artwork is scaled from the 24×24 grid. */\n size?: number\n className?: string\n}\n\n/** Renders one icon from the set. Decorative by default: label the button instead. */\nexport function Icon({ name, size = 20, className }: IconProps) {\n return (\n <svg\n className={className ? `mocanvas-icon ${className}` : \"mocanvas-icon\"}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {ICONS[name]}\n </svg>\n )\n}\n","/**\n * Floating layers shared by the default UI: the tooltip and the popover.\n *\n * Both are `position: fixed` and clamped to the viewport. Absolutely positioned\n * versions cannot do either job: a tooltip on the leftmost zoom button runs off\n * the left edge of the window, and anything anchored inside the style panel is\n * clipped by that panel's own scroll container.\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from \"react\"\n\n/** Gap between an anchor and the layer floating beside it. */\nconst GAP = 8\n/** Smallest distance a floating layer keeps from the viewport edge. */\nconst EDGE = 8\n\nexport interface Placement {\n left: number\n top: number\n}\n\n/**\n * Centre `box` on `anchor`, on the preferred side if it fits there and on the\n * other side if it does not, then clamp the result inside the viewport.\n */\nexport function placeNear(anchor: DOMRect, box: { width: number; height: number }, prefer: \"above\" | \"below\", vw: number, vh: number): Placement {\n const above = anchor.top - box.height - GAP\n const below = anchor.bottom + GAP\n let top = prefer === \"above\" ? above : below\n if (prefer === \"above\" && above < EDGE && below + box.height <= vh - EDGE) top = below\n if (prefer === \"below\" && below + box.height > vh - EDGE && above >= EDGE) top = above\n top = Math.min(Math.max(top, EDGE), Math.max(EDGE, vh - box.height - EDGE))\n let left = anchor.left + anchor.width / 2 - box.width / 2\n left = Math.min(Math.max(left, EDGE), Math.max(EDGE, vw - box.width - EDGE))\n return { left, top }\n}\n\nfunction useClamped(getAnchor: () => DOMRect | null, prefer: \"above\" | \"below\", deps: unknown[]): [RefObject<HTMLDivElement | null>, Placement | null] {\n const ref = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<Placement | null>(null)\n useLayoutEffect(() => {\n const el = ref.current\n const anchor = getAnchor()\n if (!el || !anchor) {\n setPos(null)\n return\n }\n const box = el.getBoundingClientRect()\n setPos(placeNear(anchor, box, prefer, window.innerWidth, window.innerHeight))\n // getAnchor is recreated per render on purpose; the caller's deps drive this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n return [ref, pos]\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TipState {\n label: string\n shortcut: string | null\n anchor: DOMRect\n}\n\n/** How long the pointer must rest on a control before its tooltip appears. */\nconst HOVER_DELAY = 500\n\n/**\n * The single tooltip for the whole UI. Mount it once; it labels any element\n * carrying `data-tooltip` (and, optionally, `data-shortcut`) by delegation, so\n * buttons stay plain buttons.\n */\nexport function UiTooltip() {\n const [tip, setTip] = useState<TipState | null>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const clear = useCallback(() => {\n clearTimeout(timer.current)\n setTip(null)\n }, [])\n\n useEffect(() => {\n const read = (el: HTMLElement): TipState | null => {\n const label = el.dataset[\"tooltip\"]\n if (!label) return null\n return { label, shortcut: el.dataset[\"shortcut\"] ?? null, anchor: el.getBoundingClientRect() }\n }\n const target = (e: Event): HTMLElement | null => {\n const el = (e.target as HTMLElement | null)?.closest?.<HTMLElement>(\"[data-tooltip]\")\n if (!el || el.matches(\":disabled\") || el.getAttribute(\"aria-disabled\") === \"true\") return null\n return el\n }\n const onOver = (e: PointerEvent) => {\n const el = target(e)\n clearTimeout(timer.current)\n if (!el) {\n setTip(null)\n return\n }\n timer.current = setTimeout(() => setTip(read(el)), HOVER_DELAY)\n }\n // Keyboard focus is deliberate, so it skips the hover delay.\n const onFocus = (e: FocusEvent) => {\n const el = target(e)\n clearTimeout(timer.current)\n setTip(el && el.matches(\":focus-visible\") ? read(el) : null)\n }\n document.addEventListener(\"pointerover\", onOver, true)\n document.addEventListener(\"pointerdown\", clear, true)\n document.addEventListener(\"focusin\", onFocus, true)\n document.addEventListener(\"focusout\", clear, true)\n window.addEventListener(\"scroll\", clear, true)\n return () => {\n clearTimeout(timer.current)\n document.removeEventListener(\"pointerover\", onOver, true)\n document.removeEventListener(\"pointerdown\", clear, true)\n document.removeEventListener(\"focusin\", onFocus, true)\n document.removeEventListener(\"focusout\", clear, true)\n window.removeEventListener(\"scroll\", clear, true)\n }\n }, [clear])\n\n // Above the control by default, so the tooltip never covers what it names.\n const [ref, pos] = useClamped(() => tip?.anchor ?? null, \"above\", [tip])\n if (!tip) return null\n return (\n <div\n ref={ref}\n className=\"mocanvas-tooltip mocanvas-layer\"\n role=\"tooltip\"\n style={pos ? { left: pos.left, top: pos.top } : { left: 0, top: 0, visibility: \"hidden\" }}\n >\n {tip.label}\n {tip.shortcut ? <kbd>{tip.shortcut}</kbd> : null}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Popover\n// ---------------------------------------------------------------------------\n\nexport interface PopoverProps {\n /** The control the popover belongs to; also the click target that keeps it open. */\n anchorRef: RefObject<HTMLElement | null>\n open: boolean\n onClose: () => void\n label: string\n /** Columns in the popover grid. */\n cols?: number\n prefer?: \"above\" | \"below\"\n children: ReactNode\n}\n\n/** A dismissable floating grid anchored to a button. */\nexport function Popover({ anchorRef, open, onClose, label, cols = 5, prefer = \"above\", children }: PopoverProps) {\n const [ref, pos] = useClamped(() => anchorRef.current?.getBoundingClientRect() ?? null, prefer, [open, anchorRef])\n\n useEffect(() => {\n if (!open) return\n const onDown = (e: PointerEvent) => {\n const t = e.target as Node\n if (ref.current?.contains(t) || anchorRef.current?.contains(t)) return\n onClose()\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation()\n onClose()\n anchorRef.current?.focus()\n }\n }\n document.addEventListener(\"pointerdown\", onDown, true)\n document.addEventListener(\"keydown\", onKey, true)\n return () => {\n document.removeEventListener(\"pointerdown\", onDown, true)\n document.removeEventListener(\"keydown\", onKey, true)\n }\n }, [open, onClose, anchorRef, ref])\n\n if (!open) return null\n return (\n <div\n ref={ref}\n className=\"mocanvas-popover mocanvas-layer\"\n role=\"menu\"\n aria-label={label}\n style={{\n [\"--mocanvas-popover-cols\" as string]: cols,\n ...(pos ? { left: pos.left, top: pos.top } : { left: 0, top: 0, visibility: \"hidden\" as const }),\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n )\n}\n","import {\n DEFAULT_COLORS,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GEO_SHAPE_KINDS,\n GeoShapeGeoStyle,\n LIGHT_THEME,\n track,\n useEditor,\n type DefaultColorStyle as ColorValue,\n type DefaultDashStyle as DashValue,\n type DefaultFillStyle as FillValue,\n type DefaultFontStyle as FontValue,\n type DefaultHorizontalAlignStyle as HAlignValue,\n type DefaultSizeStyle as SizeValue,\n type DefaultVerticalAlignStyle as VAlignValue,\n type Editor,\n type GeoShapeKind,\n type SharedStyle,\n type StyleProp,\n} from \"@mocanvas/editor\"\nimport { useRef, useState, type ReactNode } from \"react\"\nimport { Icon, type IconName } from \"./icons\"\nimport { Popover } from \"./overlays\"\n\n/** Tools whose id doubles as the type of the shape they create. */\nconst CREATING_TOOLS = new Set([\"geo\", \"draw\", \"note\", \"text\", \"arrow\", \"line\"])\n\nconst SWATCH_COLORS = DEFAULT_COLORS.filter((c) => c !== \"white\")\nconst FILLS: FillValue[] = [\"none\", \"semi\", \"solid\", \"pattern\"]\nconst DASHES: DashValue[] = [\"draw\", \"solid\", \"dashed\", \"dotted\"]\nconst SIZES: SizeValue[] = [\"s\", \"m\", \"l\", \"xl\"]\nconst FONTS: FontValue[] = [\"draw\", \"sans\", \"serif\", \"mono\"]\nconst H_ALIGNS: HAlignValue[] = [\"start\", \"middle\", \"end\"]\nconst V_ALIGNS: VAlignValue[] = [\"start\", \"middle\", \"end\"]\n\nconst FILL_ICON: Record<string, IconName> = { none: \"fill-none\", semi: \"fill-semi\", solid: \"fill-solid\", pattern: \"fill-pattern\" }\nconst H_ALIGN_ICON: Record<string, IconName> = { start: \"align-left\", middle: \"align-center\", end: \"align-right\" }\nconst V_ALIGN_ICON: Record<string, IconName> = { start: \"valign-top\", middle: \"valign-middle\", end: \"valign-bottom\" }\nconst H_ALIGN_LABEL: Record<string, string> = { start: \"Align left\", middle: \"Align centre\", end: \"Align right\" }\nconst V_ALIGN_LABEL: Record<string, string> = { start: \"Align top\", middle: \"Align middle\", end: \"Align bottom\" }\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n// ---------------------------------------------------------------------------\n// Which rows the panel shows\n// ---------------------------------------------------------------------------\n\n/**\n * The style rows the panel renders, in order, grouped as the panel groups them.\n *\n * With a selection this is exactly what the selected shapes declare, so a line\n * (colour, dash, size) never offers Font or Align; with nothing selected it is\n * what the active drawing tool is about to create. Exported so the rule can be\n * tested without a DOM.\n */\nexport interface StylePanelSections {\n /** The geo picker. */\n shape: boolean\n /** Colour swatch grids. */\n color: boolean\n labelColor: boolean\n /** Stroke and fill. */\n fill: boolean\n dash: boolean\n size: boolean\n /** Text. */\n font: boolean\n align: boolean\n verticalAlign: boolean\n /** Shape-level, not a style: only with a selection. */\n opacity: boolean\n}\n\nconst NOTHING: StylePanelSections = {\n shape: false,\n color: false,\n labelColor: false,\n fill: false,\n dash: false,\n size: false,\n font: false,\n align: false,\n verticalAlign: false,\n opacity: false,\n}\n\n/** Decide which rows the style panel shows for the editor's current state. */\nexport function getStylePanelSections(editor: Editor): StylePanelSections {\n const hasSelection = editor.getSelectedShapeIds().length > 0\n const toolId = editor.getCurrentToolId()\n // With a selection the selection decides, full stop: falling back to the\n // active tool's styles would offer rows the selected shapes cannot carry.\n const visible: Set<StyleProp<unknown>> = hasSelection\n ? new Set(editor.getSharedStyles().keys())\n : CREATING_TOOLS.has(toolId)\n ? new Set(editor.getStylePropsForType(toolId).values())\n : new Set()\n if (visible.size === 0 && !hasSelection) return NOTHING\n return {\n shape: visible.has(GeoShapeGeoStyle),\n color: visible.has(DefaultColorStyle),\n labelColor: visible.has(DefaultLabelColorStyle),\n fill: visible.has(DefaultFillStyle),\n dash: visible.has(DefaultDashStyle),\n size: visible.has(DefaultSizeStyle),\n font: visible.has(DefaultFontStyle),\n align: visible.has(DefaultHorizontalAlignStyle),\n verticalAlign: visible.has(DefaultVerticalAlignStyle),\n opacity: hasSelection,\n }\n}\n\n/** Whether any row at all is on. */\nexport function hasAnyStyleSection(s: StylePanelSections): boolean {\n return Object.values(s).some(Boolean)\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\n/** The dashed ring shown beside a row whose selection has differing values. */\nfunction MixedRing() {\n return (\n <span className=\"mocanvas-mixed\">\n <Icon name=\"mixed\" size={11} />\n mixed\n </span>\n )\n}\n\nfunction Row({ label, mixed, children }: { label: string; mixed: boolean; children: ReactNode }) {\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>{label}</span>\n {mixed ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label={label}>\n {children}\n </div>\n </div>\n )\n}\n\n/** A titled band of related rows, separated from its neighbours by a hairline. */\nfunction Group({ children }: { children: ReactNode }) {\n return <div className=\"mocanvas-group\">{children}</div>\n}\n\ninterface ChoiceProps<T> {\n value: T\n current: SharedStyle<T> | undefined\n label: string\n onPick: (value: T) => void\n children: ReactNode\n}\n\nfunction Choice<T>({ value, current, label, onPick, children }: ChoiceProps<T>) {\n const active = current?.type === \"shared\" && current.value === value\n return (\n <button type=\"button\" role=\"radio\" className=\"mocanvas-btn\" aria-label={label} aria-checked={active} data-tooltip={label} onClick={() => onPick(value)}>\n {children}\n </button>\n )\n}\n\nfunction ColorRow({ label, current, onPick }: { label: string; current: SharedStyle<ColorValue> | undefined; onPick: (c: ColorValue) => void }) {\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>{label}</span>\n {current?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-swatches\" role=\"radiogroup\" aria-label={label}>\n {SWATCH_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n role=\"radio\"\n className=\"mocanvas-swatch\"\n aria-label={titleCase(c)}\n aria-checked={current?.type === \"shared\" && current.value === c}\n data-tooltip={titleCase(c)}\n onClick={() => onPick(c)}\n >\n <span style={{ [\"--mocanvas-swatch-color\" as string]: LIGHT_THEME[c].solid }} />\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * The geo kind, as one button that opens a grid. Twenty always-visible cells\n * cost more vertical space than the rest of the panel put together, and the\n * kind rarely changes once a shape exists.\n */\nfunction ShapePicker({ current, onPick }: { current: SharedStyle<GeoShapeKind> | undefined; onPick: (geo: GeoShapeKind) => void }) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLButtonElement>(null)\n const value = current?.type === \"shared\" ? current.value : null\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Shape</span>\n {current?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <button\n ref={ref}\n type=\"button\"\n className=\"mocanvas-picker\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={value ? `Shape: ${titleCase(value)}` : \"Shape\"}\n onClick={() => setOpen((v) => !v)}\n >\n <span>\n {value ? <Icon name={`geo-${value}`} /> : <Icon name=\"mixed\" />}\n {value ? titleCase(value) : \"Mixed\"}\n </span>\n <Icon name={open ? \"chevron-up\" : \"chevron-down\"} size={16} />\n </button>\n <Popover anchorRef={ref} open={open} onClose={() => setOpen(false)} label=\"Shape\" prefer=\"below\">\n {GEO_SHAPE_KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"menuitemradio\"\n className=\"mocanvas-btn\"\n aria-label={titleCase(kind)}\n aria-checked={value === kind}\n data-tooltip={titleCase(kind)}\n onClick={() => {\n onPick(kind)\n setOpen(false)\n }}\n >\n <Icon name={`geo-${kind}`} />\n </button>\n ))}\n </Popover>\n </div>\n )\n}\n\nfunction OpacityRow({ editor }: { editor: Editor }) {\n const shapes = editor.getSelectedShapes()\n if (shapes.length === 0) return null\n const first = shapes[0]!.opacity\n const mixed = shapes.some((s) => s.opacity !== first)\n const value = mixed ? 1 : first\n return (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Opacity</span>\n {mixed ? <MixedRing /> : <span>{Math.round(value * 100)}%</span>}\n </div>\n <input\n type=\"range\"\n className=\"mocanvas-slider\"\n min={0.1}\n max={1}\n step={0.05}\n value={value}\n aria-label=\"Opacity\"\n onPointerDown={() => editor.markHistoryStoppingPoint(\"opacity\")}\n onChange={(e) => {\n const opacity = Number(e.currentTarget.value)\n editor.updateShapes(editor.getSelectedShapes().map((s) => ({ id: s.id, type: s.type, opacity })))\n }}\n />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Panel\n// ---------------------------------------------------------------------------\n\n/**\n * Style controls for the selection (or, with nothing selected, for the next\n * shape the active drawing tool creates). Sits in the top-right corner.\n *\n * Rows are grouped — shape, colour, stroke and fill, text, opacity — and every\n * group is omitted when the selection cannot carry it.\n */\nexport const StylePanel = track(function StylePanel() {\n const editor = useEditor()\n const sections = getStylePanelSections(editor)\n const styles = editor.getSharedStyles()\n if (!hasAnyStyleSection(sections)) return null\n\n const setStyle = <T,>(style: StyleProp<T>, value: T) => {\n editor.markHistoryStoppingPoint(\"style\")\n editor.setStyleForSelectedShapes(style, value)\n editor.setStyleForNextShapes(style, value)\n }\n const pickGeo = (geo: GeoShapeKind) => {\n setStyle(GeoShapeGeoStyle, geo)\n // The geo tool reads its kind on enter; re-enter so the change takes effect immediately.\n if (editor.getCurrentToolId() === \"geo\") editor.setCurrentTool(\"geo\", { geo, force: true })\n }\n\n const strokeGroup = sections.fill || sections.dash || sections.size\n const textGroup = sections.font || sections.align || sections.verticalAlign\n\n return (\n <div className=\"mocanvas-panel mocanvas-stylepanel\" aria-label=\"Style\" onPointerDown={(e) => e.stopPropagation()}>\n {sections.shape ? (\n <Group>\n <ShapePicker current={styles.get(GeoShapeGeoStyle)} onPick={pickGeo} />\n </Group>\n ) : null}\n\n {sections.color || sections.labelColor ? (\n <Group>\n {sections.color ? <ColorRow label=\"Color\" current={styles.get(DefaultColorStyle)} onPick={(c) => setStyle(DefaultColorStyle, c)} /> : null}\n {sections.labelColor ? <ColorRow label=\"Label\" current={styles.get(DefaultLabelColorStyle)} onPick={(c) => setStyle(DefaultLabelColorStyle, c)} /> : null}\n </Group>\n ) : null}\n\n {strokeGroup ? (\n <Group>\n {sections.fill ? (\n <Row label=\"Fill\" mixed={styles.get(DefaultFillStyle)?.type === \"mixed\"}>\n {FILLS.map((f) => (\n <Choice key={f} value={f} current={styles.get(DefaultFillStyle)} label={`${titleCase(f)} fill`} onPick={(v) => setStyle(DefaultFillStyle, v)}>\n <Icon name={FILL_ICON[f]!} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {sections.dash ? (\n <Row label=\"Dash\" mixed={styles.get(DefaultDashStyle)?.type === \"mixed\"}>\n {DASHES.map((d) => (\n <Choice key={d} value={d} current={styles.get(DefaultDashStyle)} label={`${titleCase(d)} line`} onPick={(v) => setStyle(DefaultDashStyle, v)}>\n <Icon name={`dash-${d}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {sections.size ? (\n <Row label=\"Size\" mixed={styles.get(DefaultSizeStyle)?.type === \"mixed\"}>\n {SIZES.map((s) => (\n <Choice key={s} value={s} current={styles.get(DefaultSizeStyle)} label={`Size ${s.toUpperCase()}`} onPick={(v) => setStyle(DefaultSizeStyle, v)}>\n <Icon name={`size-${s}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n </Group>\n ) : null}\n\n {textGroup ? (\n <Group>\n {sections.font ? (\n <Row label=\"Font\" mixed={styles.get(DefaultFontStyle)?.type === \"mixed\"}>\n {FONTS.map((f) => (\n <Choice key={f} value={f} current={styles.get(DefaultFontStyle)} label={`${titleCase(f)} font`} onPick={(v) => setStyle(DefaultFontStyle, v)}>\n <Icon name={`font-${f}`} />\n </Choice>\n ))}\n </Row>\n ) : null}\n {/* The two alignments are one idea and three buttons each, so they\n share a row rather than costing two labels' worth of height. */}\n {sections.align || sections.verticalAlign ? (\n <div>\n <div className=\"mocanvas-row-label\">\n <span>Align</span>\n {styles.get(DefaultHorizontalAlignStyle)?.type === \"mixed\" || styles.get(DefaultVerticalAlignStyle)?.type === \"mixed\" ? <MixedRing /> : null}\n </div>\n <div className=\"mocanvas-seg mocanvas-seg--split\">\n {sections.align ? (\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label=\"Horizontal align\">\n {H_ALIGNS.map((a) => (\n <Choice key={a} value={a} current={styles.get(DefaultHorizontalAlignStyle)} label={H_ALIGN_LABEL[a]!} onPick={(v) => setStyle(DefaultHorizontalAlignStyle, v)}>\n <Icon name={H_ALIGN_ICON[a]!} />\n </Choice>\n ))}\n </div>\n ) : null}\n {sections.verticalAlign ? (\n <div className=\"mocanvas-seg\" role=\"radiogroup\" aria-label=\"Vertical align\">\n {V_ALIGNS.map((a) => (\n <Choice key={a} value={a} current={styles.get(DefaultVerticalAlignStyle)} label={V_ALIGN_LABEL[a]!} onPick={(v) => setStyle(DefaultVerticalAlignStyle, v)}>\n <Icon name={V_ALIGN_ICON[a]!} />\n </Choice>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n </Group>\n ) : null}\n\n {sections.opacity ? (\n <Group>\n <OpacityRow editor={editor} />\n </Group>\n ) : null}\n </div>\n )\n})\n","import { useEffect } from \"react\"\nimport { atom } from \"@mocanvas/state\"\nimport type { Editor } from \"@mocanvas/editor\"\n\n/** Whether the frame-statistics chip is visible. Toggled with ⌥D. */\nexport const debugStatsOpen = atom(\"debugStatsOpen\", false)\n\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\nlet clipboardFallback = \"\"\n\n/** Default keyboard shortcuts: tool switching, undo/redo, select all, zoom, clipboard. */\nexport function useKeyboardShortcuts(editor: Editor | null): void {\n useEffect(() => {\n if (!editor) return\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n const onKeyDown = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return\n if (editor.getEditingShapeId()) return\n const accel = isMac ? e.metaKey : e.ctrlKey\n const key = e.key.toLowerCase()\n if (accel) {\n switch (key) {\n case \"z\":\n e.preventDefault()\n if (e.shiftKey) editor.redo()\n else editor.undo()\n return\n case \"y\":\n e.preventDefault()\n editor.redo()\n return\n case \"a\":\n e.preventDefault()\n editor.selectAll()\n return\n case \"g\": {\n e.preventDefault()\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n editor.markHistoryStoppingPoint(e.shiftKey ? \"ungroup\" : \"group\")\n if (e.shiftKey) editor.ungroupShapes(ids)\n else editor.groupShapes(ids)\n return\n }\n case \"l\": {\n e.preventDefault()\n if (e.shiftKey) {\n editor.markHistoryStoppingPoint(\"lock\")\n editor.toggleLock()\n }\n return\n }\n case \"d\": {\n e.preventDefault()\n const ids = editor.getSelectedShapeIds()\n if (ids.length) {\n editor.markHistoryStoppingPoint(\"duplicate\")\n const copies = editor.duplicateShapes(ids)\n editor.setSelectedShapes(copies)\n }\n return\n }\n case \"c\":\n case \"x\": {\n const ids = editor.getSelectedShapeIds()\n if (!ids.length) return\n e.preventDefault()\n const content = editor.getContentFromCurrentPage(ids)\n if (content) {\n const text = JSON.stringify({ type: \"application/mocanvas\", ...content })\n navigator.clipboard?.writeText(text).catch(() => {})\n clipboardFallback = text\n }\n if (key === \"x\") {\n editor.markHistoryStoppingPoint(\"cut\")\n editor.deleteShapes(ids)\n }\n return\n }\n case \"v\": {\n e.preventDefault()\n const paste = (text: string) => {\n try {\n const data = JSON.parse(text) as { type?: string; shapes?: unknown[]; bindings?: unknown[] }\n if (data.type !== \"application/mocanvas\" || !Array.isArray(data.shapes)) return\n editor.markHistoryStoppingPoint(\"paste\")\n editor.putContentOntoCurrentPage(data as never, { point: editor.getViewportPageCenter() })\n } catch {\n // not our content\n }\n }\n if (navigator.clipboard?.readText) navigator.clipboard.readText().then(paste, () => clipboardFallback && paste(clipboardFallback))\n else if (clipboardFallback) paste(clipboardFallback)\n return\n }\n case \"=\":\n case \"+\":\n e.preventDefault()\n editor.zoomIn()\n return\n case \"-\":\n e.preventDefault()\n editor.zoomOut()\n return\n case \"0\":\n e.preventDefault()\n editor.resetZoom()\n return\n case \"1\":\n e.preventDefault()\n editor.zoomToFit()\n return\n case \"2\":\n e.preventDefault()\n editor.zoomToSelection()\n return\n case \"]\":\n e.preventDefault()\n if (e.altKey) editor.bringToFront()\n else editor.bringForward()\n return\n case \"[\":\n e.preventDefault()\n if (e.altKey) editor.sendToBack()\n else editor.sendBackward()\n return\n default:\n return\n }\n }\n if (e.altKey) {\n // ⌥D toggles the debug stats chip. On macOS Alt+D types \"∂\", so match the physical key too.\n if (e.code === \"KeyD\" || key === \"d\" || key === \"\\u2202\") {\n e.preventDefault()\n debugStatsOpen.set(!debugStatsOpen.get())\n }\n return\n }\n switch (key) {\n case \"v\":\n editor.setCurrentTool(\"select\")\n break\n case \"h\":\n editor.setCurrentTool(\"hand\")\n break\n case \"r\":\n editor.setCurrentTool(\"geo\", { geo: \"rectangle\" })\n break\n case \"o\":\n editor.setCurrentTool(\"geo\", { geo: \"ellipse\" })\n break\n case \"d\":\n case \"p\":\n case \"b\":\n editor.setCurrentTool(\"draw\")\n break\n case \"e\":\n editor.setCurrentTool(\"eraser\")\n break\n case \"n\":\n editor.setCurrentTool(\"note\")\n break\n case \"t\":\n editor.setCurrentTool(\"text\")\n break\n // arrow/line/frame are optional tools: apps may register a smaller set.\n case \"a\":\n if (editor.root.children?.[\"arrow\"]) editor.setCurrentTool(\"arrow\")\n break\n case \"l\":\n if (editor.root.children?.[\"line\"]) editor.setCurrentTool(\"line\")\n break\n case \"f\":\n if (editor.root.children?.[\"frame\"]) editor.setCurrentTool(\"frame\")\n break\n case \"q\":\n editor.updateInstanceState({ isToolLocked: !editor.getInstanceState().isToolLocked })\n break\n default:\n break\n }\n }\n window.addEventListener(\"keydown\", onKeyDown)\n return () => window.removeEventListener(\"keydown\", onKeyDown)\n }, [editor])\n}\n","import { GeoShapeGeoStyle, GEO_SHAPE_KINDS, track, useEditor, useValue, type Editor, type GeoShapeKind } from \"@mocanvas/editor\"\nimport { Fragment, useEffect, useRef, useState, type Ref } from \"react\"\nimport { Icon, type IconName } from \"./icons\"\nimport { Popover, UiTooltip } from \"./overlays\"\nimport { StylePanel } from \"./StylePanel\"\nimport { debugStatsOpen } from \"./useKeyboardShortcuts\"\nimport \"./ui.css\"\n\nconst IS_MAC = typeof navigator !== \"undefined\" && /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent || \"\")\n/** Accelerator prefix for tooltips: `⌘` on Apple platforms, `Ctrl+` elsewhere. */\nexport const MOD_KEY = IS_MAC ? \"⌘\" : \"Ctrl+\"\n\nconst stopPointer = (e: { stopPropagation: () => void }) => e.stopPropagation()\n\nfunction titleCase(s: string): string {\n return s.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar configuration\n// ---------------------------------------------------------------------------\n\nexport interface ToolbarItem {\n /** Unique key; also the geo kind for geo entries. */\n id: string\n /** Tool id that must be registered for this entry to appear. */\n tool: string\n icon: IconName\n label: string\n /** Displayed in the tooltip, next to the label. */\n shortcut?: string\n /** Geo kind the entry selects, for entries driving the `geo` tool. */\n geo?: GeoShapeKind\n /** Tools outside the default set: shown only when the app registers them. */\n optional?: boolean\n}\n\n/** Toolbar entries, grouped; groups are separated by a divider. */\nexport const TOOLBAR_GROUPS: readonly (readonly ToolbarItem[])[] = [\n [\n { id: \"select\", tool: \"select\", icon: \"select\", label: \"Select\", shortcut: \"V\" },\n { id: \"hand\", tool: \"hand\", icon: \"hand\", label: \"Hand\", shortcut: \"H\" },\n ],\n [\n { id: \"draw\", tool: \"draw\", icon: \"draw\", label: \"Draw\", shortcut: \"D\" },\n { id: \"eraser\", tool: \"eraser\", icon: \"eraser\", label: \"Eraser\", shortcut: \"E\" },\n ],\n [\n { id: \"rectangle\", tool: \"geo\", icon: \"geo-rectangle\", label: \"Rectangle\", shortcut: \"R\", geo: \"rectangle\" },\n { id: \"ellipse\", tool: \"geo\", icon: \"geo-ellipse\", label: \"Ellipse\", shortcut: \"O\", geo: \"ellipse\" },\n { id: \"triangle\", tool: \"geo\", icon: \"geo-triangle\", label: \"Triangle\", geo: \"triangle\" },\n { id: \"diamond\", tool: \"geo\", icon: \"geo-diamond\", label: \"Diamond\", geo: \"diamond\" },\n { id: \"star\", tool: \"geo\", icon: \"geo-star\", label: \"Star\", geo: \"star\" },\n ],\n [\n { id: \"text\", tool: \"text\", icon: \"text\", label: \"Text\", shortcut: \"T\" },\n { id: \"note\", tool: \"note\", icon: \"note\", label: \"Note\", shortcut: \"N\" },\n { id: \"arrow\", tool: \"arrow\", icon: \"arrow\", label: \"Arrow\", shortcut: \"A\", optional: true },\n { id: \"line\", tool: \"line\", icon: \"line\", label: \"Line\", shortcut: \"L\", optional: true },\n { id: \"frame\", tool: \"frame\", icon: \"frame\", label: \"Frame\", shortcut: \"F\", optional: true },\n ],\n]\n\n/** Geo kinds that live behind the \"more shapes\" popover. */\nexport const PRIMARY_GEO_KINDS: readonly GeoShapeKind[] = TOOLBAR_GROUPS.flat()\n .map((t) => t.geo)\n .filter((g): g is GeoShapeKind => g !== undefined)\n\nexport const MORE_GEO_KINDS: readonly GeoShapeKind[] = GEO_SHAPE_KINDS.filter((k) => !PRIMARY_GEO_KINDS.includes(k))\n\n/** Tool ids the editor currently has registered. */\nfunction registeredTools(editor: Editor): Set<string> {\n return new Set(Object.keys(editor.root.children ?? {}))\n}\n\n// ---------------------------------------------------------------------------\n// Shared button\n// ---------------------------------------------------------------------------\n\ninterface UiButtonProps {\n icon: IconName\n label: string\n shortcut?: string\n pressed?: boolean\n expanded?: boolean\n disabled?: boolean\n className?: string\n ref?: Ref<HTMLButtonElement>\n onClick: () => void\n}\n\nfunction UiButton({ icon, label, shortcut, pressed, expanded, disabled, className, ref, onClick }: UiButtonProps) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={className ? `mocanvas-btn ${className}` : \"mocanvas-btn\"}\n aria-label={label}\n data-tooltip={label}\n {...(shortcut ? { \"data-shortcut\": shortcut } : {})}\n {...(pressed === undefined ? {} : { \"aria-pressed\": pressed })}\n {...(expanded === undefined ? {} : { \"aria-expanded\": expanded })}\n {...(disabled ? { disabled: true } : {})}\n onClick={onClick}\n >\n <Icon name={icon} />\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar\n// ---------------------------------------------------------------------------\n\n/** Bottom toolbar: tools, grouped, plus a popover with the rest of the shapes. */\nexport const Toolbar = track(function Toolbar() {\n const editor = useEditor()\n const [moreOpen, setMoreOpen] = useState(false)\n const moreRef = useRef<HTMLButtonElement>(null)\n\n const available = registeredTools(editor)\n const toolId = editor.getCurrentToolId()\n const geo = toolId === \"geo\" ? ((editor.getStateDescendant(\"geo\") as { geo?: GeoShapeKind } | undefined)?.geo ?? \"rectangle\") : null\n\n const pickGeo = (kind: GeoShapeKind) => {\n editor.setStyleForNextShapes(GeoShapeGeoStyle, kind)\n editor.setCurrentTool(\"geo\", { geo: kind, force: true })\n }\n\n const groups = TOOLBAR_GROUPS.map((group) => group.filter((item) => available.has(item.tool))).filter((group) => group.length > 0)\n const hasGeo = available.has(\"geo\") && MORE_GEO_KINDS.length > 0\n const moreActive = toolId === \"geo\" && geo !== null && !PRIMARY_GEO_KINDS.includes(geo)\n\n return (\n <div className=\"mocanvas-panel mocanvas-toolbar\" role=\"toolbar\" aria-label=\"Tools\" onPointerDown={stopPointer}>\n {groups.map((group, i) => (\n <Fragment key={group[0]!.id}>\n {i > 0 ? <span className=\"mocanvas-divider\" aria-hidden=\"true\" /> : null}\n {group.map((item) => (\n <UiButton\n key={item.id}\n icon={item.icon}\n label={item.label}\n {...(item.shortcut ? { shortcut: item.shortcut } : {})}\n pressed={item.tool === toolId && (item.geo === undefined || item.geo === geo)}\n onClick={() => (item.geo ? pickGeo(item.geo) : editor.setCurrentTool(item.tool))}\n />\n ))}\n {hasGeo && group.some((item) => item.geo) ? (\n <span className=\"mocanvas-more\">\n <UiButton\n ref={moreRef}\n icon=\"chevron-down\"\n label=\"More shapes\"\n pressed={moreActive}\n expanded={moreOpen}\n onClick={() => setMoreOpen((v) => !v)}\n />\n <Popover anchorRef={moreRef} open={moreOpen} onClose={() => setMoreOpen(false)} label=\"More shapes\" prefer=\"above\">\n {MORE_GEO_KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"menuitemradio\"\n className=\"mocanvas-btn\"\n aria-label={titleCase(kind)}\n aria-checked={geo === kind}\n data-tooltip={titleCase(kind)}\n onClick={() => {\n pickGeo(kind)\n setMoreOpen(false)\n }}\n >\n <Icon name={`geo-${kind}`} />\n </button>\n ))}\n </Popover>\n </span>\n ) : null}\n </Fragment>\n ))}\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Zoom bar\n// ---------------------------------------------------------------------------\n\n/** Zoom controls and undo/redo. */\nexport const ZoomBar = track(function ZoomBar() {\n const editor = useEditor()\n const zoom = Math.round(editor.getZoomLevel() * 100)\n return (\n <div className=\"mocanvas-panel mocanvas-zoombar\" role=\"toolbar\" aria-label=\"View\" onPointerDown={stopPointer}>\n <UiButton icon=\"zoom-out\" label=\"Zoom out\" shortcut={`${MOD_KEY}−`} onClick={() => editor.zoomOut()} />\n <button\n type=\"button\"\n className=\"mocanvas-btn mocanvas-btn--wide\"\n aria-label={`Reset zoom, currently ${zoom}%`}\n data-tooltip=\"Reset zoom\"\n data-shortcut={`${MOD_KEY}0`}\n onClick={() => editor.resetZoom()}\n >\n {zoom}%\n </button>\n <UiButton icon=\"zoom-in\" label=\"Zoom in\" shortcut={`${MOD_KEY}+`} onClick={() => editor.zoomIn()} />\n <UiButton icon=\"zoom-fit\" label=\"Zoom to fit\" shortcut={`${MOD_KEY}1`} onClick={() => editor.zoomToFit()} />\n <span className=\"mocanvas-divider\" aria-hidden=\"true\" />\n <UiButton icon=\"undo\" label=\"Undo\" shortcut={`${MOD_KEY}Z`} disabled={!editor.getCanUndo()} onClick={() => editor.undo()} />\n <UiButton icon=\"redo\" label=\"Redo\" shortcut={`${MOD_KEY}⇧Z`} disabled={!editor.getCanRedo()} onClick={() => editor.redo()} />\n </div>\n )\n})\n\n// ---------------------------------------------------------------------------\n// Debug stats\n// ---------------------------------------------------------------------------\n\n/** Compact frame-statistics chip. Toggled with ⌥D. */\nexport const DebugStats = track(function DebugStats({ editor }: { editor: Editor }) {\n const stats = editor.getLastFrameStats()\n const count = editor.getCurrentPageShapeIds().size\n return (\n <div className=\"mocanvas-panel mocanvas-stats\" role=\"status\" aria-label=\"Frame statistics\" onPointerDown={stopPointer}>\n <span>\n <b>{count}</b> shapes · <b>{editor.engine.shapeCount}</b> engine\n </span>\n <span>\n <b>{stats.drawn}</b> drawn · <b>{stats.culled}</b> culled\n </span>\n <span>\n <b>{stats.ms.toFixed(2)}</b> ms/frame\n </span>\n </div>\n )\n})\n\nexport function DefaultUi({ editor, showStats = true }: { editor: Editor; showStats?: boolean }) {\n const statsOpen = useValue(debugStatsOpen)\n useEffect(() => {\n debugStatsOpen.set(showStats)\n }, [showStats])\n return (\n <>\n <Toolbar />\n <ZoomBar />\n <StylePanel />\n {statsOpen ? <DebugStats editor={editor} /> : null}\n <UiTooltip />\n </>\n )\n}\n","import { normalizeLoadedRecords, type Editor } from \"@mocanvas/editor\"\nimport { parseTldrFile, serializeTldrFile, type ParseTldrFileResult } from \"@mocanvas/store\"\n\n/** Serialize the editor's document to `.tldr` JSON text. */\nexport function serializeMocanvasFile(editor: Editor): string {\n const snapshot = editor.store.getStoreSnapshot(\"document\")\n return serializeTldrFile(snapshot.schema, Object.values(snapshot.store))\n}\n\n/**\n * The parse result plus whatever the load could not read cleanly.\n *\n * `warnings` is always present (empty when the file needed nothing unusual)\n * and is worth surfacing: it names shapes whose props were repaired, segments\n * that had to be dropped, and shape types with no registered util.\n */\nexport type LoadMocanvasFileResult = ParseTldrFileResult & { warnings: string[] }\n\n/**\n * Load a `.tldr` file (text or parsed JSON) into the editor, replacing the\n * document.\n *\n * Records are normalized before they reach the store, so shapes written by\n * another generation of the format — a rich-text label, a packed freehand\n * path, a prop this build did not exist for — arrive in the form the shape\n * utils expect. `records` in the result are the normalized ones.\n */\nexport function loadMocanvasFile(editor: Editor, json: unknown): LoadMocanvasFileResult {\n const parsed = parseTldrFile(json)\n if (!parsed.ok) return { ...parsed, warnings: [] }\n const { records, warnings } = normalizeLoadedRecords(parsed.records, { shapeUtils: editor.shapeUtils })\n const store: Record<string, unknown> = {}\n for (const r of records) store[r.id] = r\n editor.run(\n () => {\n editor.store.loadStoreSnapshot({ schema: parsed.schema, store: store as never })\n },\n { history: \"ignore\" },\n )\n editor.history.clear()\n // The instance record may point at a page that no longer exists.\n const pages = editor.getPages()\n const current = editor.getCurrentPageId()\n if (pages.length && !pages.some((p) => p.id === current)) editor.setCurrentPage(pages[0]!.id)\n else editor.setCurrentPage(editor.getCurrentPageId())\n editor.zoomToFit()\n for (const warning of warnings) console.warn(`mocanvas: ${warning}`)\n return { ...parsed, records, warnings }\n}\n","import { AssetRecordType, createShapeId, type Editor, type ExternalContent, type ImageAsset, type ShapeId, type VecLike } from \"@mocanvas/editor\"\nimport type { ImageShape } from \"../shapes/ImageShapeUtil\"\nimport type { TextShape } from \"../shapes/TextShapeUtil\"\n\nexport interface ImageSize {\n w: number\n h: number\n}\n\n/** Resolves an image's pixel size from its source; injectable so tests can run without a DOM. */\nexport type ImageSizeLoader = (src: string, file?: File) => Promise<ImageSize>\n\nexport interface ExternalContentOptions {\n /** Longest side an inserted image may have, in page units. */\n maxImageDimension?: number\n /** Fallback size when an image's dimensions cannot be read. */\n fallbackImageSize?: ImageSize\n loadImageSize?: ImageSizeLoader\n readFileAsDataUrl?: (file: File) => Promise<string>\n /** Offset between shapes when several are inserted at the same point. */\n stackOffset?: number\n}\n\nexport const DEFAULT_MAX_IMAGE_DIMENSION = 1000\nconst DEFAULT_FALLBACK_IMAGE_SIZE: ImageSize = { w: 100, h: 100 }\nconst DEFAULT_STACK_OFFSET = 20\n\n/** Scale `size` down (never up) so both sides fit within `max`, keeping the aspect ratio. */\nexport function fitImageSize(size: ImageSize, max = DEFAULT_MAX_IMAGE_DIMENSION): ImageSize {\n const w = Math.max(1, size.w)\n const h = Math.max(1, size.h)\n const scale = Math.min(1, max / Math.max(w, h))\n return { w: Math.round(w * scale), h: Math.round(h * scale) }\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\")\n}\n\nexport function isSvgFile(file: File): boolean {\n return file.type === \"image/svg+xml\" || /\\.svg$/i.test(file.name)\n}\n\nexport function isAnimatedImageType(mimeType: string): boolean {\n return mimeType === \"image/gif\" || mimeType === \"image/apng\" || mimeType === \"image/webp\"\n}\n\nconst URL_RE = /^(https?:\\/\\/|mailto:)\\S+$/i\n\nexport function looksLikeUrl(text: string): boolean {\n return URL_RE.test(text.trim())\n}\n\nexport function looksLikeSvg(text: string): boolean {\n return /^\\s*(<\\?xml[^>]*>\\s*)?(<!DOCTYPE[^>]*>\\s*)?<svg[\\s>]/i.test(text)\n}\n\n/** Read a file into a `data:` URL, via `FileReader` where present and `arrayBuffer()` elsewhere. */\nexport async function readFileAsDataUrl(file: File): Promise<string> {\n if (typeof FileReader !== \"undefined\") {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error(\"Could not read file\"))\n reader.readAsDataURL(file)\n })\n }\n const bytes = new Uint8Array(await file.arrayBuffer())\n let binary = \"\"\n const chunk = 0x8000\n for (let i = 0; i < bytes.length; i += chunk) binary += String.fromCharCode(...bytes.subarray(i, i + chunk))\n return `data:${file.type || \"application/octet-stream\"};base64,${btoa(binary)}`\n}\n\n/** A `data:` URL for an SVG document string. */\nexport function svgTextToDataUrl(text: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(text)}`\n}\n\n/** Pixel size declared by an SVG's root `width`/`height` or `viewBox`, or `null` when neither is usable. */\nexport function getSvgTextSize(text: string): ImageSize | null {\n const root = /<svg\\b[^>]*>/i.exec(text)?.[0]\n if (!root) return null\n const attr = (name: string) => new RegExp(`\\\\s${name}\\\\s*=\\\\s*[\"']([^\"']+)[\"']`, \"i\").exec(root)?.[1]\n const px = (v: string | undefined) => {\n if (!v || /%$/.test(v)) return undefined\n const n = parseFloat(v)\n return Number.isFinite(n) && n > 0 ? n : undefined\n }\n const w = px(attr(\"width\"))\n const h = px(attr(\"height\"))\n if (w && h) return { w, h }\n const viewBox = attr(\"viewBox\")\n ?.split(/[\\s,]+/)\n .map(Number)\n if (viewBox && viewBox.length === 4 && viewBox[2]! > 0 && viewBox[3]! > 0) return { w: viewBox[2]!, h: viewBox[3]! }\n return null\n}\n\n/** Default size loader: `createImageBitmap` when available, else an `Image` element. */\nexport const loadImageSizeInBrowser: ImageSizeLoader = async (src, file) => {\n if (file && typeof createImageBitmap === \"function\" && !isSvgFile(file)) {\n try {\n const bitmap = await createImageBitmap(file)\n const size = { w: bitmap.width, h: bitmap.height }\n bitmap.close()\n return size\n } catch {\n // fall through to the Image element (e.g. unsupported type)\n }\n }\n if (typeof Image === \"undefined\") throw new Error(\"No image decoder available\")\n return new Promise<ImageSize>((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve({ w: img.naturalWidth, h: img.naturalHeight })\n img.onerror = () => reject(new Error(\"Could not decode image\"))\n img.src = src\n })\n}\n\ntype ResolvedOptions = Required<ExternalContentOptions>\n\nfunction resolveOptions(opts: ExternalContentOptions): ResolvedOptions {\n return {\n maxImageDimension: opts.maxImageDimension ?? DEFAULT_MAX_IMAGE_DIMENSION,\n fallbackImageSize: opts.fallbackImageSize ?? DEFAULT_FALLBACK_IMAGE_SIZE,\n loadImageSize: opts.loadImageSize ?? loadImageSizeInBrowser,\n readFileAsDataUrl: opts.readFileAsDataUrl ?? readFileAsDataUrl,\n stackOffset: opts.stackOffset ?? DEFAULT_STACK_OFFSET,\n }\n}\n\n/** Build (without storing) an image asset for a file; `undefined` for non-image files. */\nexport async function createImageAssetFromFile(file: File, opts: ExternalContentOptions = {}): Promise<ImageAsset | undefined> {\n if (!isImageFile(file) && !isSvgFile(file)) return undefined\n const o = resolveOptions(opts)\n const src = await o.readFileAsDataUrl(file)\n let size: ImageSize\n try {\n size = await o.loadImageSize(src, file)\n } catch {\n size = o.fallbackImageSize\n }\n const mimeType = file.type || (isSvgFile(file) ? \"image/svg+xml\" : null)\n return {\n id: AssetRecordType.createId(),\n typeName: \"asset\",\n type: \"image\",\n props: {\n ...fitImageSize(size, o.maxImageDimension),\n name: file.name,\n isAnimated: mimeType ? isAnimatedImageType(mimeType) : false,\n mimeType,\n src,\n fileSize: file.size,\n },\n meta: {},\n }\n}\n\n/** Build (without storing) an image asset from SVG markup. */\nexport function createImageAssetFromSvgText(text: string, opts: ExternalContentOptions = {}): ImageAsset {\n const o = resolveOptions(opts)\n const size = getSvgTextSize(text) ?? o.fallbackImageSize\n return {\n id: AssetRecordType.createId(),\n typeName: \"asset\",\n type: \"image\",\n props: { ...fitImageSize(size, o.maxImageDimension), name: \"image.svg\", isAnimated: false, mimeType: \"image/svg+xml\", src: svgTextToDataUrl(text) },\n meta: {},\n }\n}\n\nfunction pointOrCenter(editor: Editor, point: VecLike | undefined): VecLike {\n return point ?? editor.getViewportPageCenter()\n}\n\n/** Store `assets` and create one image shape per asset, centered on `point` and stacked by `stackOffset`. */\nexport function createImageShapesForAssets(editor: Editor, assets: readonly ImageAsset[], point: VecLike | undefined, stackOffset = DEFAULT_STACK_OFFSET): ShapeId[] {\n if (assets.length === 0) return []\n const p = pointOrCenter(editor, point)\n const ids: ShapeId[] = []\n editor.run(() => {\n editor.createAssets(assets.map((a) => ({ id: a.id, type: a.type, props: a.props, meta: a.meta })))\n editor.createShapes<ImageShape>(\n assets.map((asset, i) => {\n const id = createShapeId()\n ids.push(id)\n const { w, h } = asset.props\n return {\n id,\n type: \"image\",\n x: p.x - w / 2 + i * stackOffset,\n y: p.y - h / 2 + i * stackOffset,\n props: { w, h, assetId: asset.id },\n }\n }),\n )\n editor.setSelectedShapes(ids)\n })\n return ids\n}\n\n/** Create a text shape whose bounds are centered on `point`. */\nexport function createTextShapeAt(editor: Editor, text: string, point: VecLike | undefined): ShapeId {\n const p = pointOrCenter(editor, point)\n const id = createShapeId()\n editor.run(() => {\n editor.createShape<TextShape>({ id, type: \"text\", x: p.x, y: p.y, props: { text } })\n const shape = editor.getShape<TextShape>(id)\n const bounds = shape ? editor.getShapeGeometry(shape).bounds : undefined\n if (bounds) editor.updateShape<TextShape>({ id, type: \"text\", x: p.x - bounds.w / 2, y: p.y - bounds.h / 2 })\n editor.setSelectedShapes([id])\n })\n return id\n}\n\n/**\n * Install the default drop/paste behaviour: image files become image assets +\n * image shapes, SVG markup becomes an image asset, text and urls become text\n * shapes. Types that already have a handler are left alone. Returns a function\n * that removes the handlers this call installed.\n */\nexport function registerDefaultExternalContentHandlers(editor: Editor, opts: ExternalContentOptions = {}): () => void {\n const o = resolveOptions(opts)\n const disposers: (() => void)[] = []\n\n if (!editor.hasExternalAssetHandler(\"file\")) {\n disposers.push(editor.registerExternalAssetHandler(\"file\", ({ file }) => createImageAssetFromFile(file, o)))\n }\n\n if (!editor.hasExternalContentHandler(\"files\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"files\", async ({ files, point }) => {\n const assets: ImageAsset[] = []\n for (const file of files) {\n const asset = await editor.getAssetForExternalContent({ type: \"file\", file })\n if (asset?.type === \"image\") assets.push(asset)\n }\n if (assets.length === 0) return\n editor.markHistoryStoppingPoint(\"insert images\")\n createImageShapesForAssets(editor, assets, point, o.stackOffset)\n }),\n )\n }\n\n if (!editor.hasExternalContentHandler(\"text\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"text\", ({ text, point }) => {\n const trimmed = text.trim()\n if (!trimmed) return\n editor.markHistoryStoppingPoint(\"insert text\")\n createTextShapeAt(editor, trimmed, point)\n }),\n )\n }\n\n if (!editor.hasExternalContentHandler(\"url\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"url\", ({ url, point }) => {\n editor.markHistoryStoppingPoint(\"insert url\")\n createTextShapeAt(editor, url.trim(), point)\n }),\n )\n }\n\n if (!editor.hasExternalContentHandler(\"svg-text\")) {\n disposers.push(\n editor.registerExternalContentHandler(\"svg-text\", ({ text, point }) => {\n editor.markHistoryStoppingPoint(\"insert svg\")\n createImageShapesForAssets(editor, [createImageAssetFromSvgText(text, o)], point, o.stackOffset)\n }),\n )\n }\n\n return () => {\n for (const dispose of disposers) dispose()\n }\n}\n\n/** Classify pasted or dropped plain text as our own clipboard JSON (`null`), a url, svg markup, or text. */\nexport function classifyExternalText(text: string, point?: VecLike): ExternalContent | null {\n if (!text.trim()) return null\n if (text.trimStart().startsWith(\"{\")) {\n try {\n const data = JSON.parse(text) as { type?: unknown }\n if (data && data.type === \"application/mocanvas\") return null\n } catch {\n // ordinary text that happens to start with a brace\n }\n }\n const at = point ? { point } : {}\n if (looksLikeSvg(text)) return { type: \"svg-text\", text, ...at }\n if (looksLikeUrl(text)) return { type: \"url\", url: text.trim(), ...at }\n return { type: \"text\", text, ...at }\n}\n","import type { Editor } from \"@mocanvas/editor\"\nimport { useEffect, type RefObject } from \"react\"\nimport { classifyExternalText, registerDefaultExternalContentHandlers, type ExternalContentOptions } from \"./defaultExternalContentHandlers\"\n\nfunction isEditable(t: EventTarget | null): boolean {\n return t instanceof HTMLElement && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)\n}\n\n/**\n * Drop and paste support for the canvas container: files, images, svg markup,\n * urls and plain text are routed to `editor.putExternalContent`. Plain text is\n * only taken when nothing is being edited and it is not our own\n * `application/mocanvas` clipboard JSON (the keyboard shortcuts handle that).\n * Also installs the default handlers for any content type without one.\n */\nexport function useExternalContent(editor: Editor | null, containerRef: RefObject<HTMLElement | null>, options?: ExternalContentOptions): void {\n useEffect(() => {\n if (!editor) return\n const unregister = registerDefaultExternalContentHandlers(editor, options ?? {})\n return unregister\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor])\n\n useEffect(() => {\n const el = containerRef.current\n if (!editor || !el) return\n\n const pagePoint = (e: MouseEvent) => editor.screenToPage({ x: e.clientX, y: e.clientY })\n\n const handleText = (text: string | undefined, point?: { x: number; y: number }) => {\n if (!text || isEditableContext()) return false\n const info = classifyExternalText(text, point)\n if (!info) return false\n void editor.putExternalContent(info)\n return true\n }\n\n const isEditableContext = () => !!editor.getEditingShapeId() || isEditable(document.activeElement)\n\n const onDragOver = (e: DragEvent) => {\n if (!e.dataTransfer) return\n e.preventDefault()\n e.dataTransfer.dropEffect = \"copy\"\n }\n\n const onDrop = (e: DragEvent) => {\n const dt = e.dataTransfer\n if (!dt) return\n e.preventDefault()\n const point = pagePoint(e)\n const files = Array.from(dt.files)\n if (files.length) {\n void editor.putExternalContent({ type: \"files\", files, point })\n return\n }\n const url = dt.getData(\"text/uri-list\").split(/\\r?\\n/).find((l) => l && !l.startsWith(\"#\"))\n if (url) {\n void editor.putExternalContent({ type: \"url\", url, point })\n return\n }\n handleText(dt.getData(\"text/plain\"), point)\n }\n\n const onPaste = (e: ClipboardEvent) => {\n if (isEditable(e.target) || isEditableContext()) return\n const cd = e.clipboardData\n if (!cd) return\n const files = Array.from(cd.files)\n if (files.length) {\n e.preventDefault()\n void editor.putExternalContent({ type: \"files\", files })\n return\n }\n if (handleText(cd.getData(\"text/plain\"))) e.preventDefault()\n }\n\n // The default shortcuts call preventDefault on ⌘V (to paste our own JSON),\n // which suppresses the `paste` event. When that happened, read the clipboard\n // through the async API instead; images are the main thing gained here.\n const onKeyDown = (e: KeyboardEvent) => {\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n const accel = isMac ? e.metaKey : e.ctrlKey\n if (!accel || e.key.toLowerCase() !== \"v\" || isEditable(e.target) || isEditableContext()) return\n setTimeout(() => {\n if (!e.defaultPrevented || !navigator.clipboard?.read) return\n navigator.clipboard.read().then(\n async (items) => {\n const files: File[] = []\n let text: string | undefined\n for (const item of items) {\n const imageType = item.types.find((t) => t.startsWith(\"image/\"))\n if (imageType) {\n const blob = await item.getType(imageType)\n files.push(new File([blob], `pasted.${imageType.split(\"/\")[1] ?? \"png\"}`, { type: imageType }))\n } else if (item.types.includes(\"text/plain\") && text === undefined) {\n text = await (await item.getType(\"text/plain\")).text()\n }\n }\n if (files.length) void editor.putExternalContent({ type: \"files\", files })\n else handleText(text)\n },\n () => {\n // clipboard permission denied or unsupported; nothing to paste\n },\n )\n }, 0)\n }\n\n el.addEventListener(\"dragover\", onDragOver)\n el.addEventListener(\"drop\", onDrop)\n window.addEventListener(\"paste\", onPaste)\n window.addEventListener(\"keydown\", onKeyDown, { capture: true })\n return () => {\n el.removeEventListener(\"dragover\", onDragOver)\n el.removeEventListener(\"drop\", onDrop)\n window.removeEventListener(\"paste\", onPaste)\n window.removeEventListener(\"keydown\", onKeyDown, { capture: true })\n }\n }, [editor, containerRef])\n}\n","import {\n Canvas,\n createStore,\n Editor,\n loadEngine,\n type CanvasProps,\n type BindingUtilConstructor,\n type EditorStore,\n type ShapeUtilConstructor,\n type StateNodeConstructor,\n} from \"@mocanvas/editor\"\nimport { useEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\"\nimport { defaultBindingUtils } from \"./bindings\"\nimport { defaultShapeUtils } from \"./shapes\"\nimport { defaultTools } from \"./tools\"\nimport { DefaultUi } from \"./ui/DefaultUi\"\nimport { useKeyboardShortcuts } from \"./ui/useKeyboardShortcuts\"\nimport { useExternalContent } from \"./external/useExternalContent\"\n\nexport interface MocanvasProps {\n /** Reuse a store (e.g. for persistence or collaboration). */\n store?: EditorStore\n /** Extra shape utils beyond the defaults. */\n shapeUtils?: readonly ShapeUtilConstructor[]\n /** Extra binding utils beyond the defaults. */\n bindingUtils?: readonly BindingUtilConstructor[]\n /** Extra tools beyond the defaults. */\n tools?: readonly StateNodeConstructor[]\n initialState?: string\n onMount?: (editor: Editor) => void | (() => void)\n /** Hide the default toolbar and zoom bar. */\n hideUi?: boolean\n showStats?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n components?: CanvasProps[\"components\"]\n /** Editor config overrides. */\n options?: ConstructorParameters<typeof Editor>[0][\"options\"]\n}\n\n/** Batteries-included canvas: default shapes, tools, shortcuts and UI. */\nexport function Mocanvas(props: MocanvasProps) {\n const { store, shapeUtils, bindingUtils, tools, initialState, onMount, hideUi, showStats, className, style, children, components, options } = props\n const containerRef = useRef<HTMLDivElement>(null)\n const [editor, setEditor] = useState<Editor | null>(null)\n\n useEffect(() => {\n let disposed = false\n let ed: Editor | null = null\n let cleanup: void | (() => void)\n loadEngine().then((engine) => {\n if (disposed) {\n engine.dispose()\n return\n }\n ed = new Editor({\n store: store ?? createStore(),\n shapeUtils: [...defaultShapeUtils, ...(shapeUtils ?? [])],\n bindingUtils: [...defaultBindingUtils, ...(bindingUtils ?? [])],\n tools: [...defaultTools, ...(tools ?? [])],\n engine,\n ...(initialState ? { initialState } : {}),\n getContainer: () => containerRef.current!,\n ...(options ? { options } : {}),\n })\n setEditor(ed)\n cleanup = onMount?.(ed)\n ed.emit(\"mount\")\n })\n return () => {\n disposed = true\n cleanup?.()\n ed?.dispose()\n setEditor(null)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store])\n\n useKeyboardShortcuts(editor)\n useExternalContent(editor, containerRef)\n\n return (\n <div ref={containerRef} className={className} style={{ position: \"relative\", width: \"100%\", height: \"100%\", ...style }}>\n {editor ? (\n <Canvas editor={editor} {...(components ? { components } : {})}>\n {hideUi ? null : <DefaultUi editor={editor} showStats={showStats ?? true} />}\n {children}\n </Canvas>\n ) : (\n <div style={{ position: \"absolute\", inset: 0, display: \"grid\", placeItems: \"center\", color: \"#9ca3af\", fontFamily: \"system-ui\" }}>loading engine…</div>\n )}\n </div>\n )\n}\n"]}