@mocanvas/mocanvas 4.0.2 → 4.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/measure-html.ts","../src/text/TextEditor.tsx","../src/text/text-layout.ts","../src/shapes/elbow-helpers.ts","../src/shapes/ArrowShapeUtil.tsx","../src/shapes/FrameShapeUtil.tsx","../src/shapes/geo-types.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"],"names":["Vec","p","anchorFor","m","EPS","STROKE_SIZES","Group2d","jsx","getDefaultDisplayValues","Rectangle2d","hexToRgba","LABEL_PADDING","DefaultColorStyle","DefaultLabelColorStyle","DefaultFillStyle","DefaultDashStyle","DefaultSizeStyle","DefaultFontStyle","FONT_SIZES","getDisplayValues","DefaultHorizontalAlignStyle","DefaultVerticalAlignStyle","DEFAULT_THEME","getColorValue","LABEL_KEYS","ShapeUtil","jsxs","useRef","useEffect","BaseBoxShapeUtil","a","Box"],"mappings":"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","file":"chunk-DMCI6V5Y.js","sourcesContent":["/**\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 ArrowShapeArrowheadKind, type Geometry2d, type VecLike } from \"@mocanvas/editor\"\nimport { arcToCubicSegments } from \"./spline-helpers\"\n\n/**\n * How an arrow's terminal is drawn.\n *\n * The vocabulary itself lives with the other style vocabularies in the editor\n * (`ARROWHEAD_KINDS`), so the style prop and the geometry cannot drift apart;\n * this is the name the arrow code has always used for it.\n */\nexport type ArrowheadKind = ArrowShapeArrowheadKind\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/**\n * The stretch of `body`, as a parameter range, that runs inside `box` — the gap\n * the *selection outline* leaves around a label.\n *\n * Only the outline needs it. The arrow itself is drawn end to end and the label's\n * opaque box covers the stretch under the text, which is what keeps the stroke\n * there to be clicked. The indicator is painted on top of the label, though, so\n * without this it draws a line straight through the words.\n *\n * Sampled rather than solved: the three body kinds are a segment, an arc and a\n * polyline, and an exact intersection for each is three separate cases to get\n * wrong for an answer that is then rounded to a pixel anyway. The range runs from\n * the first sample inside the box to the last, so a body that enters twice — a\n * tight arc passing its own label on the way out and back — is cut once, across\n * the whole excursion.\n *\n * `null` when the body never enters the box, or when the gap would swallow it\n * whole: a label wider than its own arrow leaves the outline alone.\n */\nexport function labelGapOnBody(body: ArrowBody, box: { x: number; y: number; w: number; h: number }): { from: number; to: number } | null {\n const SAMPLES = 192\n const minX = box.x\n const maxX = box.x + box.w\n const minY = box.y\n const maxY = box.y + box.h\n let from = -1\n let to = -1\n for (let i = 0; i <= SAMPLES; i++) {\n const t = i / SAMPLES\n const p = getPointOnBody(body, t)\n if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) continue\n if (from < 0) from = t\n to = t\n }\n if (from < 0) return null\n const half = 0.5 / SAMPLES\n const gap = { from: Math.max(0, from - half), to: Math.min(1, to + half) }\n if (gap.to - gap.from > 0.9) return null\n return gap\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({ fromShape: arrow, toShape: shape, 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.\n *\n * Everything here resolves against a *ramp* — `theme.colors[colorMode]` — never\n * against a hardcoded palette. A util passes the ramp its editor is currently\n * painting with, which is what makes the built-in shapes follow the theme and\n * the colour mode; a caller with no editor to ask (an exporter rendering a\n * detached snapshot, a preview swatch) omits it and gets the built-in light\n * ramp, which is exactly what these functions used to return unconditionally.\n *\n * The *shape-level* resolution — which colour a shape's `color` prop means,\n * how wide its stroke is, what font size its label uses — belongs to\n * `getDisplayValues(util, shape)` and is not restated here. What is left is the\n * chrome no style prop describes: a note's gradient and shadow, a frame's\n * border and heading strip.\n */\nimport {\n DEFAULT_FILL_TOKENS,\n DEFAULT_THEME,\n DefaultFontFaces,\n getColorValue,\n hexToRgba,\n type DefaultColorStyle,\n type DefaultFillStyle,\n type DefaultFontStyle,\n type TLColorMode,\n type TLFontFace,\n type TLTheme,\n type TLThemeColors,\n} from \"@mocanvas/editor\"\n\n/**\n * The ramp a caller that has no editor resolves against: the built-in theme's\n * light half. Named rather than inlined so it is obvious that every default\n * below is one decision, not eight.\n */\nexport const FALLBACK_THEME_COLORS: TLThemeColors = DEFAULT_THEME.colors.light\n\n/** What a ramp can be read off: the editor, or anything else theme-shaped. */\nexport interface ThemeSource {\n getCurrentTheme?(): TLTheme\n getColorMode?(): TLColorMode\n}\n\n/**\n * The theme `source` is currently painting with, or the built-in one.\n *\n * Tolerant on purpose: a util's `editor` is typed but a test double, a\n * half-constructed editor or a detached exporter may not implement either\n * method, and a missing theme must degrade to the default rather than throw\n * inside a render.\n */\nexport function getTheme(source: ThemeSource | null | undefined): TLTheme {\n return source?.getCurrentTheme?.() ?? DEFAULT_THEME\n}\n\n/** The ramp `source` is currently painting with; see {@link getTheme}. */\nexport function getThemeColors(source: ThemeSource | null | undefined): TLThemeColors {\n const theme = getTheme(source)\n const mode = source?.getColorMode?.() ?? \"light\"\n return theme.colors[mode] ?? theme.colors.light\n}\n\n/** Engine RGBA for a shape's stroke. */\nexport function getStrokeRgba(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): number {\n return hexToRgba(getColorValue(colors, 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). That\n * table is stated once, in `DEFAULT_FILL_TOKENS`, and read here rather than\n * restated — 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(\n color: DefaultColorStyle,\n fill: DefaultFillStyle,\n colors: TLThemeColors = FALLBACK_THEME_COLORS,\n): number {\n const token = DEFAULT_FILL_TOKENS[fill] ?? \"none\"\n if (token === \"none\") return 0\n if (token === \"paper\") return hexToRgba(colors.solid)\n return hexToRgba(getColorValue(colors, color, token))\n}\n\n/** Engine RGBA for a sticky note's background. */\nexport function getNoteFillRgba(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): number {\n return hexToRgba(getColorValue(colors, color, \"noteFill\"))\n}\n\n/** CSS color string for text drawn in the DOM overlay. */\nexport function getTextCssColor(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getColorValue(colors, color, \"solid\")\n}\n\n/** CSS color string for text on a sticky note. */\nexport function getNoteTextCssColor(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getColorValue(colors, color, \"noteText\")\n}\n\n/** The CSS font stack a font style resolves to, in `theme`. */\nexport function getFontFamily(font: DefaultFontStyle, theme: TLTheme = DEFAULT_THEME): string {\n return theme.fonts[font] ?? theme.fonts.draw\n}\n\n// SEMANTICS-ASSUMED: a label needs all four faces of its family, not just the\n// upright regular one. Rich text can turn any run bold or italic without\n// changing the shape's `font` prop, so loading one face would leave a bold run\n// synthesised (and mis-measured) until something else happened to pull the real\n// one in. The built-in faces are local families, so asking for four costs\n// nothing; a theme that swaps in webfonts pays four requests per family used.\n/**\n * The typefaces a label in `font` needs: the four `[style][weight]` faces of\n * that family.\n *\n * This is what a text-bearing `ShapeUtil.getFontFaces` answers. Only the\n * *built-in* face registry is consulted — a theme that names its own families\n * registers their faces with the font manager itself, because a CSS stack says\n * which families to try, not where to fetch them.\n */\nexport function getLabelFontFaces(font: DefaultFontStyle): TLFontFace[] {\n const set = DefaultFontFaces[`tldraw_${font}`]\n if (set === undefined) return []\n const faces: TLFontFace[] = []\n for (const byWeight of Object.values(set)) {\n for (const face of Object.values(byWeight)) faces.push(face)\n }\n return faces\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, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getColorValue(colors, color, \"noteFill\")\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, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getNoteGradientTopFrom(getNoteFillCssColor(color, colors))\n}\n\n/** CSS `background` for a note body: the vertical gradient, top to bottom. */\nexport function getNoteBodyGradientCss(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return `linear-gradient(to bottom, ${getNoteGradientTopCssColor(color, colors)} 0%, ${getNoteFillCssColor(color, colors)} 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\nexport interface TextMeasureHtmlOptions {\n fontFamily: string\n fontSize: number\n fontWeight?: string | number\n /** CSS `font-style`, e.g. `\"italic\"`. */\n fontStyle?: string\n /** Unitless line height (multiplier of the font size). */\n lineHeight: number\n /** Wrap width in CSS px, including `padding`. Omit (or `null`) for no wrapping. */\n maxWidth?: number | null\n /** CSS padding, as a number of px or any padding shorthand (`\"0px\"`, `\"4px 8px\"`). */\n padding?: number | string\n /**\n * Also report `scrollWidth`: the width the content wants before wrapping, so a\n * shrink-to-fit pass can tell \"wraps\" from \"overflows\".\n */\n measureScrollWidth?: boolean\n /** Extra CSS declarations applied to the probe, e.g. `{ \"font-variant\": \"small-caps\" }`. */\n otherStyles?: Record<string, string>\n}\n\nexport interface TextHtmlMeasurement extends TextMeasurement {\n /** Width the content wants before wrapping. Equals `w` unless `measureScrollWidth` was set. */\n scrollWidth: 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 *\n * `measureHtml` measures a rich-text label the same way, from the HTML\n * `renderHtmlFromRichTextForMeasurement` produces. Both paths share the cache\n * and the probe element, so a rich-text label and the plain-text label it\n * flattens to are measured by the same code.\n */\nexport class TextMeasure {\n private element: HTMLDivElement | null = null\n private htmlElement: HTMLDivElement | null = null\n private readonly cache = new Map<string, TextMeasurement>()\n private readonly htmlCache = new Map<string, TextHtmlMeasurement>()\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 /**\n * Measure a run of HTML — a rich-text label — laid out the way the DOM\n * overlay renders it.\n *\n * Only pass HTML this package generated (`richTextToHtml` escapes text and\n * scheme-checks link hrefs); the probe is inert but it is still a live DOM\n * subtree.\n */\n measureHtml(html: string, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n const key = htmlCacheKey(html, opts)\n const hit = this.htmlCache.get(key)\n if (hit) return hit\n const result = typeof document === \"undefined\" ? this.estimateHtml(html, opts) : this.measureHtmlDom(html, opts)\n if (this.htmlCache.size >= MAX_CACHE_ENTRIES) {\n const oldest = this.htmlCache.keys().next().value\n if (oldest !== undefined) this.htmlCache.delete(oldest)\n }\n this.htmlCache.set(key, result)\n return result\n }\n\n /**\n * Measure several HTML runs against one probe. Nothing is shared between the\n * items beyond the element itself; the win is one style write and one layout\n * flush per item instead of one per call site.\n */\n measureHtmlBatch(items: readonly { html: string; opts: TextMeasureHtmlOptions }[]): TextHtmlMeasurement[] {\n return items.map((item) => this.measureHtml(item.html, item.opts))\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 this.htmlCache.clear()\n }\n\n dispose(): void {\n this.cache.clear()\n this.htmlCache.clear()\n this.element?.remove()\n this.element = null\n this.htmlElement?.remove()\n this.htmlElement = 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 estimateHtml(html: string, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n const text = htmlToProbeText(html)\n const padding = paddingPx(opts.padding)\n const base = this.estimate(text, {\n fontFamily: opts.fontFamily,\n fontSize: opts.fontSize,\n lineHeight: opts.lineHeight,\n ...(opts.fontWeight === undefined ? {} : { fontWeight: opts.fontWeight }),\n ...(opts.maxWidth === undefined || opts.maxWidth === null ? {} : { maxWidth: opts.maxWidth }),\n padding,\n })\n // Unwrapped, the widest paragraph is what the content wants.\n const unwrapped = this.estimate(text, { fontFamily: opts.fontFamily, fontSize: opts.fontSize, lineHeight: opts.lineHeight, padding })\n return { ...base, scrollWidth: opts.measureScrollWidth ? unwrapped.w : base.w }\n }\n\n private measureHtmlDom(html: string, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n const el = this.getHtmlElement()\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.fontStyle = opts.fontStyle ?? \"normal\"\n s.lineHeight = String(opts.lineHeight)\n s.padding = typeof opts.padding === \"number\" ? `${opts.padding}px` : (opts.padding ?? \"0px\")\n s.maxWidth = opts.maxWidth === undefined || opts.maxWidth === null ? \"none\" : `${Math.max(1, opts.maxWidth)}px`\n // `removeProperty` first, so a probe reused with fewer styles is not measured with the last call's.\n for (const name of readCustomStyleNames(el)) s.removeProperty(name)\n for (const [name, value] of Object.entries(opts.otherStyles ?? {})) s.setProperty(name, value)\n writeCustomStyleNames(el, Object.keys(opts.otherStyles ?? {}))\n el.innerHTML = html\n\n const rect = el.getBoundingClientRect()\n const padding = paddingPx(opts.padding)\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 let scrollWidth = rect.width\n if (opts.measureScrollWidth) {\n // `scrollWidth` is an integer and never smaller than the client width, so\n // an unwrapped re-measure is the only way to learn the wanted width.\n const previousMax = s.maxWidth\n s.maxWidth = \"none\"\n scrollWidth = el.getBoundingClientRect().width\n s.maxWidth = previousMax\n }\n return {\n w: Math.ceil(rect.width * 100) / 100,\n h: Math.ceil(rect.height * 100) / 100,\n lineCount,\n scrollWidth: Math.ceil(scrollWidth * 100) / 100,\n }\n }\n\n private getHtmlElement(): HTMLDivElement {\n if (this.htmlElement && this.htmlElement.isConnected) return this.htmlElement\n installHtmlProbeStyles()\n const el = document.createElement(\"div\")\n el.setAttribute(\"aria-hidden\", \"true\")\n el.className = \"mocanvas-text-measure-html\"\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.htmlElement = el\n return el\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\nfunction htmlCacheKey(html: string, o: TextMeasureHtmlOptions): string {\n const other = Object.entries(o.otherStyles ?? {})\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\")\n return `${o.fontFamily}|${o.fontSize}|${o.fontWeight ?? \"\"}|${o.fontStyle ?? \"\"}|${o.lineHeight}|${o.maxWidth ?? \"\"}|${o.padding ?? 0}|${o.measureScrollWidth ? 1 : 0}|${other}|${html}`\n}\n\n/** Padding as a single number of px; a shorthand contributes its first value. */\nfunction paddingPx(padding: number | string | undefined): number {\n if (typeof padding === \"number\") return Number.isFinite(padding) ? padding : 0\n if (typeof padding !== \"string\") return 0\n const first = padding.trim().split(/\\s+/)[0] ?? \"\"\n const value = Number.parseFloat(first)\n return Number.isFinite(value) ? value : 0\n}\n\n/** Block-level tags whose boundaries read as a line break when HTML is flattened for the estimate. */\nconst BLOCK_TAG = /<\\/?(?:p|div|li|ul|ol|h[1-6]|blockquote|pre|tr|br|hr)\\b[^>]*>/gi\n\n/** The text an HTML run lays out as, for the `document`-less estimate. */\nfunction htmlToProbeText(html: string): string {\n return html\n .replace(BLOCK_TAG, \"\\n\")\n .replace(/<[^>]*>/g, \"\")\n .replace(/&nbsp;/g, \" \")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/\\n{2,}/g, \"\\n\")\n .replace(/^\\n|\\n$/g, \"\")\n}\n\n/** Custom property names set on the probe by the previous call, so they can be cleared. */\nfunction readCustomStyleNames(el: HTMLElement): string[] {\n const raw = el.dataset[\"mocanvasOtherStyles\"]\n return raw === undefined || raw.length === 0 ? [] : raw.split(\",\")\n}\n\nfunction writeCustomStyleNames(el: HTMLElement, names: readonly string[]): void {\n if (names.length === 0) delete el.dataset[\"mocanvasOtherStyles\"]\n else el.dataset[\"mocanvasOtherStyles\"] = names.join(\",\")\n}\n\nlet htmlProbeStylesInstalled = false\n\n/**\n * Zero the browser's default block margins inside the HTML probe. A `<p>`'s\n * 1em margin would otherwise measure as extra height that the label — which\n * renders with the same rules — never has.\n */\nfunction installHtmlProbeStyles(): void {\n if (htmlProbeStylesInstalled || typeof document === \"undefined\") return\n htmlProbeStylesInstalled = true\n const style = document.createElement(\"style\")\n style.setAttribute(\"data-mocanvas\", \"text-measure\")\n style.textContent = RICH_TEXT_BLOCK_CSS.replace(/__SCOPE__/g, \".mocanvas-text-measure-html\")\n document.head.appendChild(style)\n}\n\n/**\n * The CSS a rich-text label lays out under, in both the measuring probe and the\n * DOM overlay. `__SCOPE__` is replaced with the selector of the container.\n *\n * Exported so the overlay renders under exactly the rules the measurer used —\n * one copy of the numbers, not two.\n */\nexport const RICH_TEXT_BLOCK_CSS = [\n \"__SCOPE__ p,__SCOPE__ h1,__SCOPE__ h2,__SCOPE__ h3,__SCOPE__ h4,__SCOPE__ h5,__SCOPE__ h6,__SCOPE__ blockquote,__SCOPE__ pre,__SCOPE__ ul,__SCOPE__ ol{margin:0;padding:0;font-size:inherit;font-weight:inherit;line-height:inherit;}\",\n \"__SCOPE__ ul,__SCOPE__ ol{padding-inline-start:1.4em;}\",\n \"__SCOPE__ li{margin:0;}\",\n \"__SCOPE__ pre,__SCOPE__ code{font-family:inherit;white-space:pre-wrap;}\",\n \"__SCOPE__ hr{margin:0;border:0;border-top:1px solid currentColor;}\",\n \"__SCOPE__ a{color:inherit;}\",\n].join(\"\")\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","/**\n * The bridge between a rich-text document and the text measurer: HTML in, a box\n * out.\n *\n * `renderHtmlFromRichTextForMeasurement` produces the markup, and the measurer\n * installed through `registerTextMeasureImplementation` (see the \"Installing\n * the editor's optional members\" section of `docs/COMPAT.md`) turns it into a\n * size via `editor.textMeasure.measureHtml`. There is one measurer and one\n * probe element for both the plain and the rich path, so a rich-text label and\n * the plain-text label it flattens to never disagree about their size.\n */\n\nimport type { Editor } from \"@mocanvas/editor\"\nimport { richTextToHtml, type RichTextSource } from \"./rich-text\"\nimport { getTextMeasure, type TextHtmlMeasurement, type TextMeasureHtmlOptions } from \"./TextMeasure\"\nimport { tipTapDefaultExtensions, type RichTextExtension } from \"./tiptap-extensions\"\n\n/** The editor members this module reads, none of which it requires to exist. */\ninterface EditorWithTextOptions {\n options?: { text?: { tipTapConfig?: { extensions?: readonly RichTextExtension[] } } }\n /** The pre-consolidation spelling; v5 moved `textOptions` under `options.text`. */\n textOptions?: { tipTapConfig?: { extensions?: readonly RichTextExtension[] } }\n}\n\n/**\n * The rich-text extension list an editor is configured with, or the default set.\n *\n * Reads both the v5 `options.text.tipTapConfig` location and the older\n * top-level `textOptions`, and tolerates an editor that carries neither — an\n * editor built before the text options landed still measures rich text.\n */\nexport function getRichTextExtensions(editor: Editor | null | undefined): readonly RichTextExtension[] {\n const host = editor as EditorWithTextOptions | null | undefined\n const configured = host?.options?.text?.tipTapConfig?.extensions ?? host?.textOptions?.tipTapConfig?.extensions\n return configured && configured.length > 0 ? configured : tipTapDefaultExtensions\n}\n\n/**\n * Render a rich-text value to the HTML the text measurer sizes.\n *\n * The markup is generated from the document JSON with the editor's configured\n * extensions: text is escaped, link hrefs are scheme-checked, and no whitespace\n * is emitted between tags (the probe lays out with `white-space: pre-wrap`,\n * where an indenting newline would measure as a space). A plain string is\n * accepted too and renders as the paragraphs it splits into, so a caller does\n * not have to know which of `props.richText` and `props.text` the store holds.\n *\n * The result is only meant for measurement and for mocanvas's own label\n * rendering. It is not a general-purpose export format — use\n * `richTextToSvg` for SVG.\n */\nexport function renderHtmlFromRichTextForMeasurement(editor: Editor | null | undefined, richText: RichTextSource): string {\n return richTextToHtml(richText, { extensions: getRichTextExtensions(editor) })\n}\n\n/**\n * Render a rich-text value to HTML with an **explicit** extension list.\n *\n * The sibling of {@link renderHtmlFromRichTextForMeasurement} for callers that\n * have no editor to read the extensions off: a server rendering a board's text\n * into a page, a search indexer, a test. Because the extension list is the\n * argument rather than something looked up, the same document renders the same\n * way outside the editor as inside it — which is the point of exporting it.\n *\n * Pass `tipTapDefaultExtensions` for the set mocanvas itself uses.\n */\nexport function renderHtmlFromRichTextWithExtensions(richText: RichTextSource, extensions: readonly RichTextExtension[]): string {\n return richTextToHtml(richText, { extensions })\n}\n\n/**\n * Measure a rich-text value directly: render it, then hand it to the shared\n * measurer. The convenience form of the two calls above.\n */\nexport function measureRichText(editor: Editor | null | undefined, richText: RichTextSource, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n return getTextMeasure().measureHtml(renderHtmlFromRichTextForMeasurement(editor, richText), opts)\n}\n","import { useEditor, type DefaultFontStyle, type DefaultHorizontalAlignStyle, type DefaultVerticalAlignStyle, type UnknownShape } from \"@mocanvas/editor\"\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from \"react\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { getRichTextExtensions, renderHtmlFromRichTextForMeasurement } from \"./measure-html\"\nimport { applyPlainTextToRichText, isRichText, richTextToText, type RichText, type RichTextSource } from \"./rich-text\"\nimport { RICH_TEXT_BLOCK_CSS, toDisplayText } from \"./TextMeasure\"\nimport { getRichTextEditorFactory, type RichTextEditorFactory } from \"./tiptap-extensions\"\n\nexport interface TextLabelProps {\n shape: UnknownShape\n /**\n * The label as plain text. Ignored for rendering when\n * {@link TextLabelProps.richText} is set; still the value the plain-text\n * editing fallback starts from.\n */\n text: string\n /**\n * The label as a rich-text document, when the store holds one. A shape may\n * carry either `props.text` or `props.richText`; both render here.\n */\n richText?: RichTextSource\n isEditing: boolean\n /**\n * The label's font style token. Named `font` before v5; `font` is still\n * accepted and means the same thing.\n */\n fontFamily?: DefaultFontStyle\n /** @deprecated v5 renamed this to `fontFamily`. */\n font?: DefaultFontStyle\n fontSize: number\n /** CSS color of the text. */\n color: string\n /** Horizontal alignment. Named `align` before v5; `align` is still accepted. */\n textAlign?: DefaultHorizontalAlignStyle\n /** @deprecated v5 renamed this to `textAlign`. */\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 * Called with the new rich-text document, at the same rate as `onChange`.\n * A shape whose store prop is `richText` passes this; without it the label\n * still edits, and only the plain text is written back.\n */\n onChangeRichText?(value: RichText): void\n}\n\n/** The label's font style token, from either spelling. */\nexport function labelFontFamily(props: Pick<TextLabelProps, \"font\" | \"fontFamily\">): DefaultFontStyle {\n return props.fontFamily ?? props.font ?? \"draw\"\n}\n\n/** The label's horizontal alignment, from either spelling. */\nexport function labelTextAlign(props: Pick<TextLabelProps, \"align\" | \"textAlign\">): DefaultHorizontalAlignStyle {\n return props.textAlign ?? props.align ?? \"middle\"\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, richText, isEditing, fontSize, color, verticalAlign, wrap, width, height, padding = 0, placeholder, singleLine } = props\n const align = labelTextAlign(props)\n const font = labelFontFamily(props)\n const editor = useEditor()\n // The document is what renders when there is one; `text` is the fallback.\n const rich = isRichText(richText) ? richText : null\n const plain = rich ? richTextToText(rich) : text\n const html = useMemo(() => (rich ? renderHtmlFromRichTextForMeasurement(editor, rich) : null), [editor, rich])\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 empty = plain.length === 0\n if (rich && !(empty && placeholder)) {\n return (\n <div className=\"mocanvas-text-label\" style={outerStyle}>\n <RichTextBlockStyles />\n {/* The HTML is generated by `richTextToHtml` from a known node and\n mark table: text is escaped and link hrefs are scheme-checked, so\n nothing a document carries reaches the DOM as markup. */}\n <div className=\"mocanvas-rich-text\" style={textStyle} dangerouslySetInnerHTML={{ __html: html ?? \"\" }} />\n </div>\n )\n }\n const shown = empty && placeholder ? placeholder : toDisplayText(plain)\n return (\n <div className=\"mocanvas-text-label\" style={outerStyle}>\n <div style={{ ...textStyle, opacity: empty && placeholder ? 0.5 : 1 }}>{shown}</div>\n </div>\n )\n }\n\n // A host that installed a rich-text editor (a TipTap one, in practice) gets\n // the full surface for a rich-text label; everything else edits the plain text.\n const factory = getRichTextEditorFactory()\n const useRichSurface = factory !== null && props.onChangeRichText !== undefined && rich !== null\n return (\n <div className=\"mocanvas-text-label mocanvas-text-label-editing\" style={outerStyle}>\n {useRichSurface ? (\n <RichTextEditorSurface {...props} richText={rich!} onChangeRichText={props.onChangeRichText!} factory={factory!} textStyle={textStyle} singleLine={singleLine ?? false} />\n ) : (\n <TextEditor {...props} text={plain} textStyle={textStyle} singleLine={singleLine ?? false} />\n )}\n </div>\n )\n}\n\n/**\n * The block rules a rich-text label lays out under — the same ones the\n * measuring probe uses, so the rendered label is the size that was measured.\n * Rendered once per label; the browser deduplicates identical rules and the\n * cost of a repeated `<style>` is far below that of a stylesheet the host has\n * to remember to import.\n */\nfunction RichTextBlockStyles(): ReactNode {\n return <style>{RICH_TEXT_BLOCK_CSS.replace(/__SCOPE__/g, \".mocanvas-rich-text\")}</style>\n}\n\ninterface TextEditorProps extends TextLabelProps {\n textStyle: CSSProperties\n singleLine: boolean\n}\n\nfunction TextEditor(props: TextEditorProps): ReactNode {\n const { text, onChange, onChangeRichText, richText, textStyle, singleLine, wrap, color } = props\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 richRef = useRef(richText)\n richRef.current = richText\n const onChangeRef = useRef<(next: string) => void>(() => {})\n onChangeRef.current = (next: string) => {\n onChange(next)\n // A store that holds `richText` gets the document too. Formatting the\n // plain-text surface cannot express survives an edit that did not change\n // the text; see `applyPlainTextToRichText`.\n onChangeRichText?.(applyPlainTextToRichText(richRef.current, next))\n }\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\ninterface RichTextEditorSurfaceProps extends TextEditorProps {\n richText: RichText\n onChangeRichText(value: RichText): void\n factory: RichTextEditorFactory\n}\n\n/**\n * The WYSIWYG editing surface, mounted by whatever factory the host registered\n * with `registerRichTextEditorFactory` — a TipTap editor, for an app that has\n * the optional peer dependency.\n *\n * mocanvas only owns the box: the factory builds the editor into `container`,\n * reports documents back through `onChange`, and tears everything down in\n * `destroy`. Nothing about TipTap is imported here, so a build without it never\n * reaches this component.\n */\nfunction RichTextEditorSurface({ richText, onChangeRichText, factory, textStyle, singleLine }: RichTextEditorSurfaceProps): ReactNode {\n const editor = useEditor()\n const ref = useRef<HTMLDivElement>(null)\n const onChangeRef = useRef(onChangeRichText)\n onChangeRef.current = onChangeRichText\n const initial = useRef(richText)\n\n useLayoutEffect(() => {\n const container = ref.current\n if (!container) return\n const handle = factory({\n container,\n initialValue: initial.current,\n extensions: getRichTextExtensions(editor),\n singleLine,\n onChange: (value) => onChangeRef.current(value as RichText),\n onFinish: () => {\n editor.setEditingShape(null)\n editor.complete()\n },\n })\n handle.focus()\n return () => handle.destroy()\n }, [editor, factory, singleLine])\n\n return (\n <div\n ref={ref}\n className=\"mocanvas-rich-text mocanvas-rich-text-editor\"\n style={{ ...textStyle, userSelect: \"text\", WebkitUserSelect: \"text\", pointerEvents: \"auto\", cursor: \"text\" }}\n onPointerDown={stop}\n onPointerMove={stop}\n onPointerUp={stop}\n onKeyDown={stop}\n onKeyUp={stop}\n onContextMenu={stop}\n />\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, Editor } from \"@mocanvas/editor\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { renderHtmlFromRichTextForMeasurement } from \"./measure-html\"\nimport { isRichText, richTextToText, type RichTextSource } from \"./rich-text\"\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 /**\n * The label's font style token. Named `font` before v5; `font` is still\n * accepted and means the same thing.\n */\n fontFamily?: DefaultFontStyle\n /** @deprecated v5 renamed this to `fontFamily`. */\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 * The editor the label belongs to, used to pick up its configured rich-text\n * extensions. Optional: without one the default extension set is used.\n */\n editor?: Editor | null\n}\n\n/** The label's font style token, from either spelling, defaulting to `draw`. */\nexport function labelFontStyle(opts: Pick<LabelMeasureOptions, \"font\" | \"fontFamily\">): DefaultFontStyle {\n return opts.fontFamily ?? opts.font ?? \"draw\"\n}\n\n/**\n * Measure a shape label with the shared measurer using the default label\n * typography.\n *\n * Takes either spelling of a label: a plain string, or the rich-text document\n * the store may hold in `props.richText`. Rich text goes through the HTML path\n * so its marks (a bold run is wider than the plain one) are part of the\n * measurement; plain text goes through the cheaper text path. Both use the same\n * measurer, probe element and cache.\n */\nexport function measureLabel(source: RichTextSource, opts: LabelMeasureOptions): TextMeasurement {\n const fontFamily = getFontFamily(labelFontStyle(opts))\n if (isRichText(source)) {\n const html = renderHtmlFromRichTextForMeasurement(opts.editor ?? null, source)\n return getTextMeasure().measureHtml(html, {\n fontFamily,\n fontSize: opts.fontSize,\n lineHeight: LINE_HEIGHT,\n ...(opts.maxWidth === undefined ? {} : { maxWidth: opts.maxWidth }),\n padding: opts.padding ?? 0,\n })\n }\n return getTextMeasure().measureText(richTextToText(source), {\n fontFamily,\n fontSize: opts.fontSize,\n lineHeight: LINE_HEIGHT,\n ...(opts.maxWidth === undefined ? {} : { maxWidth: opts.maxWidth }),\n padding: opts.padding ?? 0,\n })\n}\n\n/**\n * How far to lift a label so it reads as centred, as a fraction of the font size.\n *\n * Centring the *line box* is geometrically right and optically wrong: a line box\n * reserves room for descenders whether or not the text has any, so the ink of a\n * typical word sits in its lower half and the word looks like it has sunk. What\n * the eye centres on is the letters themselves — somewhere between the middle of\n * the capitals and the middle of the x-height, depending on the word — so that is\n * what gets put on the centre line instead.\n *\n * Measured from the font rather than assumed: a face with a tall x-height needs a\n * different correction from one with a small one, and the value is only stable\n * per family, not across the stack. Cached per family, since it scales with the\n * em and so does not depend on the size.\n */\nconst OPTICAL_LIFT_CACHE = new Map<string, number>()\n\n/** The lift in px for a label, given the same options `measureLabel` takes. */\nexport function getLabelOpticalLift(opts: Pick<LabelMeasureOptions, \"font\" | \"fontFamily\"> & { fontSize: number }): number {\n return getOpticalCentreLift(getFontFamily(labelFontStyle(opts))) * opts.fontSize\n}\n\nfunction getOpticalCentreLift(fontFamily: string): number {\n const cached = OPTICAL_LIFT_CACHE.get(fontFamily)\n if (cached !== undefined) return cached\n let lift = 0\n try {\n const ctx = document.createElement(\"canvas\").getContext(\"2d\")\n if (ctx) {\n const em = 100\n ctx.font = `${em}px ${fontFamily}`\n const caps = ctx.measureText(\"H\")\n const ex = ctx.measureText(\"x\")\n const capHeight = caps.actualBoundingBoxAscent\n const xHeight = ex.actualBoundingBoxAscent\n const ascent = caps.fontBoundingBoxAscent\n const descent = caps.fontBoundingBoxDescent\n if (capHeight > 0 && xHeight > 0 && ascent > 0) {\n const lineHeight = LINE_HEIGHT * em\n const baseline = (lineHeight - (ascent + descent)) / 2 + ascent\n // Halfway between the capitals' midpoint and the x-height's midpoint.\n const optical = baseline - (capHeight + xHeight) / 4\n lift = (optical - lineHeight / 2) / em\n }\n }\n } catch {\n // No canvas (SSR, a test environment): centring the line box is the fallback,\n // which is what every label did before this existed.\n }\n // A correction this large is a measurement gone wrong, not a font.\n if (!Number.isFinite(lift) || lift < 0 || lift > 0.25) lift = 0\n OPTICAL_LIFT_CACHE.set(fontFamily, lift)\n return lift\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 /** The label, in either spelling: a plain string or a rich-text document. */\n text: RichTextSource\n /** @deprecated v5 renamed this to `fontFamily`. */\n font?: DefaultFontStyle\n fontFamily?: DefaultFontStyle\n fontSize: number\n autoSize: boolean\n /** Current wrap width, used when `autoSize` is off. */\n w: number\n /** The editor whose rich-text extensions apply, when there is one. */\n editor?: Editor | null\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, fontSize, autoSize, w, editor } = input\n const fontFamily = labelFontStyle(input)\n if (autoSize) {\n const m = measureLabel(text, { fontFamily, fontSize, editor: editor ?? null })\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, { fontFamily, fontSize, maxWidth: width, editor: editor ?? null })\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","import {\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n ShapeUtil,\n STROKE_SIZES,\n Vec,\n getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n ARROWHEAD_KINDS,\n ARROW_SHAPE_KINDS,\n type ArrowShapeKind,\n type BaseShape,\n type BindingCanBindOptions,\n type Geometry2d,\n type ShapeHandle,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLFontFace,\n type TLStyledShape,\n type TLTheme,\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 { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\nimport { getLabelOpticalLift, 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 labelGapOnBody,\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, readRichText, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getLabelFontFaces, getStrokeRgba, getThemeColors } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\nimport { svgPath } from \"./indicator-paths\"\nimport { arrowShapeProps } from \"./shape-props\"\nimport { arrowShapeMigrations } from \"./shape-migrations\"\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 /** The label as a rich-text document; see `NoteShapeProps.richText`. */\n richText: RichText\n /** The label as plain text — optional and derived; see `NoteShapeProps.text`. */\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\n/**\n * Routing kinds an arrow can have.\n *\n * The list itself lives with the other style vocabularies in the editor, so\n * that `ArrowShapeKindStyle` and this cannot drift apart; these are the names\n * the shape has always exported for it.\n */\nexport const ARROW_KINDS = ARROW_SHAPE_KINDS\nexport type ArrowKind = ArrowShapeKind\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 */\n/**\n * {@link ArrowShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readArrowProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedArrowProps = ArrowShapeProps & { text: string; richText: RichText }\n\nexport function readArrowProps(shape: { props?: unknown }): ResolvedArrowProps {\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\", ARROWHEAD_KINDS, \"none\"),\n arrowheadEnd: readEnum(p, \"arrowheadEnd\", ARROWHEAD_KINDS, \"arrow\"),\n font: readStyle(p, \"font\", DefaultFontStyle),\n richText: readRichText(p),\n text: readText(p),\n labelPosition: readNumber(p, \"labelPosition\", 0.5),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\n/**\n * What an arrow paints with.\n *\n * An arrow is a body, two terminals and a label, and all four are sized by the\n * shape's own `scale`, which the shared set knows nothing about. The label's\n * padding is here for the same reason a geo shape's is: anything measuring the\n * label has to agree with what draws it.\n */\nexport interface ArrowShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The body's width in page units, `scale` applied. */\n scaledStrokeWidth: number\n /** The label's font size in page units, `scale` applied. */\n labelFontSize: number\n /** Padding between the body and its label, in page units. */\n labelPadding: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n}\n\n/** `ArrowShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface ArrowShapeOptions extends ShapeUtilOptions<ArrowShape, ArrowShapeUtilDisplayValues> {}\n\n/** Resolve an arrow's display values; see {@link ArrowShapeUtilDisplayValues}. */\nexport function getArrowDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): ArrowShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const scale = readNumber(propsOf(shape), \"scale\", 1)\n return {\n ...base,\n scaledStrokeWidth: base.strokeWidth * scale,\n labelFontSize: base.fontSize * scale,\n labelPadding: ARROW_LABEL_PADDING * scale,\n labelFontFamily: base.fontFamily,\n }\n}\n\nexport class ArrowShapeUtil extends ShapeUtil<ArrowShape, ArrowShapeUtilDisplayValues> {\n static override type = \"arrow\" as const\n static override migrations = arrowShapeMigrations\n static override options: ArrowShapeOptions = { getDefaultDisplayValues: getArrowDisplayValues }\n declare readonly options: ArrowShapeOptions\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 = arrowShapeProps\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 richText: toRichText(\"\"),\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 /**\n * The label's box in shape space, or `null` when there is no label.\n *\n * Three things need it and they must agree: the geometry (which is what gets\n * hit-tested), the DOM element that paints the text, and the indicator that\n * outlines it on selection. They were computing it separately.\n */\n private labelBox(shape: ArrowShape): { x: number; y: number; w: number; h: number } | null {\n const { text, labelPosition, font, size, scale } = readArrowProps(shape)\n if (!text) return null\n const m = measureLabel(readRichText(shape.props), {\n fontFamily: font,\n fontSize: FONT_SIZES[size] * scale,\n padding: LABEL_PADDING * scale,\n editor: this.editor,\n })\n const c = getPointOnBody(this.resolveBody(shape).body, Math.max(0, Math.min(1, labelPosition)))\n return { x: c.x - m.w / 2, y: c.y - m.h / 2, w: m.w, h: m.h }\n }\n\n /**\n * `gapAtLabel` splits the body around the label's box. Only the selection\n * outline asks for it; the geometry the editor hit-tests keeps the body whole,\n * so the stroke the label covers is still there to be clicked.\n */\n getGeometry(shape: ArrowShape, opts?: { gapAtLabel: { x: number; y: number; w: number; h: number } }): 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 // The body is drawn whole, label or no label. The label is an opaque box laid\n // over it in `component`, which is both simpler than cutting the line and the\n // only version that stays clickable: cut the stroke out from under the label\n // and there is nothing left there to hit, since hit-testing runs on this\n // geometry and the label's own rectangle is excluded from it.\n const children: Geometry2d[] = []\n const gap = opts?.gapAtLabel ? labelGapOnBody(body, opts.gapAtLabel) : null\n if (gap) {\n const len = getBodyLength(body)\n if (gap.from > 0) children.push(bodyToGeometry(shortenBody(body, 0, len * (1 - gap.from))))\n if (gap.to < 1) children.push(bodyToGeometry(shortenBody(body, len * gap.to, 0)))\n } else {\n children.push(bodyToGeometry(body))\n }\n\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 const label = this.labelBox(shape)\n if (label) {\n children.push(new Rectangle2d({ x: label.x, y: label.y, width: label.w, height: label.h, isFilled: false, isLabel: true }))\n }\n return new Group2d({ children })\n }\n\n /** An arrow needs its family's faces only while it carries a label. */\n override getFontFaces(shape: ArrowShape): TLFontFace[] {\n return readText(shape.props) ? getLabelFontFaces(readArrowProps(shape).font) : []\n }\n\n override getRenderStyle(shape: ArrowShape): StyleWords {\n const { color, dash, size, scale } = readArrowProps(shape)\n const stroke = getStrokeRgba(color, getThemeColors(this.editor))\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 { richText, text, font, size, scale, labelPosition } = readArrowProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n const display = getDisplayValues<ArrowShape, ArrowShapeUtilDisplayValues>(this, shape)\n // Positioned from the measured box, not by `translate(-50%, -50%)`: the label\n // inside is absolutely positioned, so this wrapper has no size of its own and\n // a percentage translate resolves against zero — the label hung off the body\n // point by its own width and height instead of sitting on it.\n //\n // Opaque, in the page colour, and laid straight over the line. The arrow does\n // not know or care that a label is on it — it is drawn end to end and this\n // covers the stretch under the text. Painting over rather than cutting a gap\n // is also what keeps the label clickable: the stroke is still there\n // underneath, so a click near the text lands on the arrow's own geometry.\n const box = this.labelBox(shape) ?? { x: 0, y: 0, w: 0, h: 0 }\n const background = getThemeColors(this.editor).background\n return (\n <div\n style={{\n position: \"absolute\",\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n background,\n borderRadius: LABEL_PADDING * scale * 0.5,\n pointerEvents: \"none\",\n }}\n >\n {/* The box stays where the geometry puts it — centred on the line — and only\n the letters move, by the amount that face needs to *look* centred. */}\n <div\n style={{\n position: \"relative\",\n width: \"max-content\",\n transform: `translateY(${-getLabelOpticalLift({ fontFamily: font, fontSize: FONT_SIZES[size] * scale })}px)`,\n }}\n >\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={isEditing}\n fontFamily={font}\n fontSize={FONT_SIZES[size] * scale}\n color={display.labelColor}\n textAlign=\"middle\"\n verticalAlign=\"middle\"\n wrap={false}\n padding={LABEL_PADDING * scale}\n onChange={(next) =>\n this.editor.updateShape<ArrowShape>({\n id: shape.id,\n type: \"arrow\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<ArrowShape>({\n id: shape.id,\n type: \"arrow\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n </div>\n </div>\n )\n }\n\n override getIndicatorPath(shape: ArrowShape): Path2D {\n const label = this.labelBox(shape)\n const labelRadius = () => Math.min(LABEL_PADDING * readArrowProps(shape).scale * 0.5, label!.w / 2, label!.h / 2)\n\n // While the label is being edited it is the only thing indicated. The arrow is\n // not what is being worked on, and outlining it as well reads as \"both are\n // selected\" when only the text box takes input.\n if (label && this.editor.getEditingShapeId() === shape.id) {\n const p = new Path2D()\n p.roundRect(label.x, label.y, label.w, label.h, labelRadius())\n return p\n }\n\n // The outline stops at the label and picks up on the far side. The arrow's own\n // geometry runs straight through — that stroke is what a click under the text\n // lands on — but the outline is drawn over the label, and a line ruled across\n // the words is exactly what it should not be.\n const words = label ? this.getGeometry(shape, { gapAtLabel: label }).toPathWords() : this.getGeometry(shape).toPathWords()\n const p = svgPath(pathWordsToSvgD(words))\n // The one box a selected arrow does draw. Everything else about the selection\n // is the curve and its three handles — but the label is a box the pointer can\n // grab, so it says so.\n if (label) p.roundRect(label.x, label.y, label.w, label.h, labelRadius())\n return p\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: BindingCanBindOptions): 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 /**\n * …but the arrow's *own* outline is drawn. This flag suppresses a lone selected\n * shape's indicator, and the arrow used to set it because the selection frame\n * was the cue instead. With the frame gone there was no cue at all — a selected\n * arrow showed nothing. Its indicator is the curve and the label's box, which\n * is the cue worth having.\n */\n override hideSelectionBoundsFg(_shape: ArrowShape): boolean {\n return false\n }\n\n override hideResizeHandles(_shape: ArrowShape): boolean {\n return true\n }\n\n /**\n * …and no rotate handle either, which is what actually suppresses the box.\n * `selectionHandles` only drops the frame when resize *and* rotate are both\n * hidden, so hiding one of the two left a selected arrow wrapped in a\n * rectangle with a lone rotate dot above it. An arrow has nothing to rotate\n * about: its ends are the two handles, and turning it means moving them.\n */\n override hideRotateHandle(_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) return\n this.editor.updateShape<ArrowShape>({\n id: shape.id,\n type: \"arrow\",\n props: { text: trimmed, richText: applyPlainTextToRichText(readRichText(shape.props), trimmed) },\n })\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: \"vertex\", index: \"a2\", x: mid.x, y: mid.y })\n }\n } else {\n const mid = getPointOnBody(body, 0.5)\n // A vertex, not a \"virtual\" handle: virtual means the faint dot that *becomes*\n // a point when dragged, which is what a line's midpoints are. An arrow's bend\n // is a permanent handle, and drawing it as the faint kind made it read as an\n // afterthought next to its own two ends.\n handles.push({ id: \"bend\", type: \"vertex\", 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 BaseFrameLikeShapeUtil,\n hexToRgba,\n Rectangle2d,\n type BaseShape,\n type DefaultColorStyle,\n getDefaultDisplayValues,\n type Geometry2d,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLFontFace,\n type TLStyledShape,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { frameShapeProps } from \"./shape-props\"\nimport { frameShapeMigrations } from \"./shape-migrations\"\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 getLabelFontFaces,\n} from \"./shape-theme\"\nimport { rectPath } from \"./indicator-paths\"\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\n/**\n * The artboard: a container that both groups and **crops**.\n *\n * Everything that makes it a container — adoption on drag-in, release on\n * drag-out, the lock gates, the ancestor-cycle guard — comes from\n * {@link BaseFrameLikeShapeUtil}; the frame itself only adds its chrome (the\n * body fill, the editable name strip) and keeps the base's clipping box.\n */\n/**\n * What a frame paints with.\n *\n * A frame is a container, so almost nothing it draws comes from the shared\n * style set: its body and border are fixed chrome, and the only text it has is\n * the name in its header. Those are what it adds.\n */\nexport interface FrameShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The frame body's fill. */\n frameFill: string\n /** The frame border's colour. */\n frameStroke: string\n /** The frame border's width, in page units. */\n frameStrokeWidth: number\n /** The header's font size, in page units. */\n nameFontSize: number\n /** The header's ink. */\n nameColor: string\n /** The header's height, in page units — how far above the body it sits. */\n nameHeight: number\n}\n\n/** `FrameShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface FrameShapeOptions extends ShapeUtilOptions<FrameShape, FrameShapeUtilDisplayValues> {\n /** The width a new frame is created at, in page units. */\n defaultWidth?: number\n /** The height a new frame is created at, in page units. */\n defaultHeight?: number\n}\n\n/** Resolve a frame's display values; see {@link FrameShapeUtilDisplayValues}. */\nexport function getFrameDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): FrameShapeUtilDisplayValues {\n return {\n ...getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode),\n frameFill: FRAME_FILL,\n frameStroke: FRAME_STROKE,\n frameStrokeWidth: FRAME_STROKE_WIDTH,\n nameFontSize: FRAME_NAME_FONT_SIZE,\n nameColor: FRAME_NAME_COLOR,\n nameHeight: FRAME_NAME_HEIGHT,\n }\n}\n\nexport class FrameShapeUtil extends BaseFrameLikeShapeUtil<FrameShape> {\n static override type = \"frame\" as const\n static override props = frameShapeProps\n static override migrations = frameShapeMigrations\n static override options: FrameShapeOptions = { getDefaultDisplayValues: getFrameDisplayValues }\n declare readonly options: FrameShapeOptions\n\n getDefaultProps(): FrameShapeProps {\n return { w: 160, h: 90, name: \"\" }\n }\n\n override 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 fontFamily=\"sans\"\n fontSize={FRAME_NAME_FONT_SIZE}\n color={FRAME_NAME_COLOR}\n textAlign=\"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 override getIndicatorPath(shape: FrameShape): Path2D {\n const p = propsOf(shape)\n return rectPath(readNumber(p, \"w\", 160), 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 /** A frame draws its name in the sans family, whatever its children use. */\n override getFontFaces(_shape: FrameShape): TLFontFace[] {\n return getLabelFontFaces(\"sans\")\n }\n\n override canEdit(_shape: FrameShape): 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 * The geo shape's *type table*: one entry per silhouette the `geo` shape can\n * take, and the seam an app extends it through.\n *\n * Before v5 the set of geo silhouettes was closed — a `switch` over a string\n * union in the util. It is now a table an app can add to\n * (`GeoShapeUtil.configure({ customGeoTypes })`), which is what lets a product\n * ship its own \"cog\" or \"callout\" as a `geo` shape rather than as a whole new\n * shape type with its own migrations, tool and style props.\n *\n * A definition answers three questions and no more: what outline to draw, how\n * to snap to it, and what to put on the toolbar button.\n */\n\nimport { GEO_SHAPE_KINDS, type GeoShapeKind, type Geometry2d } from \"@mocanvas/editor\"\nimport { getGeoGeometry } from \"./geo-helpers\"\n\n/**\n * How other shapes snap to this silhouette.\n *\n * `\"polygon\"` snaps to the outline's own vertices and edge midpoints — right\n * for anything with corners. `\"blobby\"` ignores the outline and snaps to the\n * bounding box, which is what a cloud or a heart wants: its vertices are\n * artefacts of the curve fit and mean nothing to the person drawing.\n */\nexport type GeoSnapType = \"polygon\" | \"blobby\"\n\n/** The kinds whose outline is curved, and therefore snap as blobs. */\nconst BLOBBY_KINDS: ReadonlySet<string> = new Set([\"ellipse\", \"oval\", \"cloud\", \"heart\"])\n\n/** Options {@link GeoTypeDefinition.getPath} is given beyond the box. */\nexport interface GeoPathOptions {\n /** Whether the interior is painted, and so whether it is hit-testable. */\n isFilled?: boolean\n /**\n * The width the outline will be stroked at, when the type needs it.\n *\n * Only a mark that *ends on* the outline does: a stroke is centred on its\n * path and its round cap reaches half a width past the last point, so a line\n * drawn corner to corner of the box pokes out beyond the very outline it is\n * supposed to sit inside. The x-box's diagonals are the case. A type whose\n * marks stay clear of the edge can ignore it.\n */\n strokeWidth?: number\n /**\n * Mirror the silhouette left-to-right inside its own box. The box, the\n * bounds and the label do not move; only the outline turns over.\n *\n * A custom geo type that ignores these draws unflipped, which is the right\n * failure for a silhouette that is symmetric anyway.\n */\n flipX?: boolean | undefined\n /** Mirror the silhouette top-to-bottom; see {@link GeoPathOptions.flipX}. */\n flipY?: boolean | undefined\n}\n\n/**\n * One geo silhouette.\n *\n * The `id` is what lands in `shape.props.geo`, so it is part of the file\n * format: choose it once and do not rename it.\n */\nexport interface GeoTypeDefinition {\n /** The value stored in `props.geo`. */\n id: string\n /**\n * The outline in a `w × h` box, in shape-local coordinates.\n *\n * Returning a {@link Geometry2d} rather than a path string is what makes a\n * custom geo type a first-class shape: the same object drives hit-testing,\n * bounds, snapping and the indicator, so none of them can disagree.\n */\n getPath(w: number, h: number, opts?: GeoPathOptions): Geometry2d\n /** How other shapes snap to it; see {@link GeoSnapType}. */\n snapType: GeoSnapType\n /** Name of the toolbar / style-panel icon for this silhouette. */\n icon: string\n /**\n * The size a click (rather than a drag) places this silhouette at. Omitted\n * means \"use the geo shape's own default box\".\n */\n defaultSize?: { w: number; h: number }\n /**\n * What a double click on the shape does, when it should do something other\n * than start editing the label. Return a props patch, or nothing.\n */\n onDoubleClick?(shape: { id: string; props: { geo: string; w: number; h: number } }): { w?: number; h?: number } | void\n}\n\n/** The built-in table: one entry per {@link GeoShapeKind}. */\nexport const DEFAULT_GEO_TYPE_DEFINITIONS: Readonly<Record<GeoShapeKind, GeoTypeDefinition>> = Object.freeze(\n Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind): [GeoShapeKind, GeoTypeDefinition] => [\n kind,\n {\n id: kind,\n getPath: (w, h, opts) => getGeoGeometry(kind, w, h, opts?.isFilled ?? false, { flipX: opts?.flipX, flipY: opts?.flipY }, opts?.strokeWidth ?? 0),\n snapType: BLOBBY_KINDS.has(kind) ? \"blobby\" : \"polygon\",\n // The icon set names its geo icons after the kind itself.\n icon: `geo-${kind}`,\n },\n ]),\n ) as Record<GeoShapeKind, GeoTypeDefinition>,\n)\n\n/**\n * The definition for a geo type, or `undefined` when nothing defines it.\n *\n * `customGeoTypes` wins over the built-in table, so an app may replace a\n * built-in silhouette as well as add to it — the same override order\n * `GeoShapeUtil` itself uses when it draws.\n */\nexport function getGeoTypeDefinition(\n geo: string,\n customGeoTypes?: Readonly<Record<string, GeoTypeDefinition>> | undefined,\n): GeoTypeDefinition | undefined {\n if (typeof geo !== \"string\" || geo.length === 0) return undefined\n const custom = customGeoTypes?.[geo]\n if (custom !== undefined) return custom\n return (DEFAULT_GEO_TYPE_DEFINITIONS as Record<string, GeoTypeDefinition>)[geo]\n}\n","import {\n BaseBoxShapeUtil,\n GEO_KIND,\n createBuiltInShapePropsMigrationIds,\n createShapePropsMigrationSequence,\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n STROKE_SIZES,\n getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GeoShapeGeoStyle,\n type BaseShape,\n type EngineGeometry,\n type GeoShapeKind,\n type Geometry2d,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type TLFontFace,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { alignToJustify, alignToTextAlign, TextLabel, verticalAlignToAlignItems } from \"../text/TextEditor\"\nimport { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { getGeoGeometry } from \"./geo-helpers\"\nimport { getGeoTypeDefinition, type GeoTypeDefinition } from \"./geo-types\"\nimport { geoShapeProps } from \"./shape-props\"\nimport { propsOf, readBoolean, readNumber, readRichText, readString, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getFillRgba, getLabelFontFaces, getStrokeRgba, getThemeColors } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\nimport { svgPath } from \"./indicator-paths\"\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 /** The label as a rich-text document; see `NoteShapeProps.richText`. */\n richText: RichText\n /** The label as plain text — optional and derived; see `NoteShapeProps.text`. */\n text?: string\n scale: number\n /**\n * Mirror the silhouette left-to-right inside the shape's own box.\n *\n * Not a transform: `x`, `y`, `w`, `h` and the label are untouched, so a\n * flipped shape covers exactly the same bounds and still reads right way up.\n * Symmetric silhouettes (a rectangle, an ellipse) are unchanged by it.\n */\n flipX: boolean\n /** Mirror the silhouette top-to-bottom; see {@link GeoShapeProps.flipX}. */\n flipY: boolean\n}\n\nexport type GeoShape = BaseShape<\"geo\", GeoShapeProps>\n\n/** The box a click (rather than a drag) places a geo shape at. */\nexport const GEO_DEFAULT_SIZE = { w: 100, h: 100 } as const\n\n/**\n * `GeoShapeUtil`'s settings.\n *\n * `customGeoTypes` is the extension seam described in {@link GeoTypeDefinition}:\n *\n * ```ts\n * const utils = [GeoShapeUtil.configure({ customGeoTypes: { cog } })]\n * ```\n *\n * A key that matches a built-in silhouette replaces it.\n */\nexport interface GeoShapeOptions extends ShapeUtilOptions<GeoShape, GeoShapeUtilDisplayValues> {\n /** Extra (or replacement) geo silhouettes, keyed by the value stored in `props.geo`. */\n customGeoTypes?: Readonly<Record<string, GeoTypeDefinition>>\n}\n\n/**\n * What a geo shape paints with.\n *\n * A geo shape is an outline *and* a label, and the label has a size and a\n * padding of its own that anything measuring the shape has to agree with —\n * which is why they are reported rather than recomputed at each call site. All\n * three have the shape's `scale` applied, unlike the shared set's `fontSize`.\n */\nexport interface GeoShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The label's font size in page units, `scale` applied. */\n labelFontSize: number\n /** Padding between the outline and its label, in page units. */\n labelPadding: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n /** The outline's width in page units, `scale` applied. */\n scaledStrokeWidth: number\n}\n\n/** Resolve a geo shape's display values; see {@link GeoShapeUtilDisplayValues}. */\nexport function getGeoDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): GeoShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const scale = readNumber(propsOf(shape), \"scale\", 1)\n return {\n ...base,\n labelFontSize: base.fontSize * scale,\n labelPadding: GEO_LABEL_PADDING * scale,\n labelFontFamily: base.fontFamily,\n scaledStrokeWidth: base.strokeWidth * scale,\n }\n}\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 */\n/**\n * {@link GeoShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readGeoProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedGeoProps = GeoShapeProps & { text: string; richText: RichText }\n\nexport function readGeoProps(shape: { props?: unknown }): ResolvedGeoProps {\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 richText: readRichText(p),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n flipX: readBoolean(p, \"flipX\", false),\n flipY: readBoolean(p, \"flipY\", false),\n }\n}\n\n/** Measured size of a geo label (padding included), wrapped at the shape width. */\nexport function measureGeoLabel(\n props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\"> & { richText?: unknown },\n editor?: { getCurrentTheme?(): unknown } | null,\n) {\n const richText = readRichText(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(richText, {\n fontFamily: font,\n fontSize: FONT_SIZES[size] * scale,\n maxWidth: Math.max(1, w),\n padding: LABEL_PADDING * scale,\n editor: (editor ?? null) as never,\n })\n}\n\n/** `growY` a geo shape needs so its label fits inside `h`. Empty labels never grow the shape. */\nexport function getGeoGrowY(\n props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\" | \"h\"> & { richText?: unknown },\n editor?: { getCurrentTheme?(): unknown } | null,\n): number {\n if (!readText(props)) return 0\n return computeGrowY(measureGeoLabel(props, editor).h, readNumber(props, \"h\", 100))\n}\n\nconst LABEL_KEYS: readonly (keyof GeoShapeProps)[] = [\"richText\", \"text\", \"font\", \"size\", \"scale\", \"w\", \"h\"]\n\n/** Named versions of the geo shape's props, for {@link geoShapeMigrations}. */\nexport const geoShapeVersions = createBuiltInShapePropsMigrationIds(\"geo\", {\n AddFlipProps: 1,\n})\n\n/**\n * The geo shape's props migrations.\n *\n * Boards saved before `flipX`/`flipY` existed have neither prop, and the\n * validator would otherwise refuse them on load; the migration backfills both\n * as `false`, which is the \"not flipped\" the old renderer implied. `down`\n * removes them again so an older client can still read a newer document.\n */\nexport const geoShapeMigrations = createShapePropsMigrationSequence({\n sequence: [\n {\n id: geoShapeVersions.AddFlipProps,\n up(props) {\n props[\"flipX\"] ??= false\n props[\"flipY\"] ??= false\n },\n down(props) {\n delete props[\"flipX\"]\n delete props[\"flipY\"]\n },\n },\n ],\n})\n\nexport class GeoShapeUtil extends BaseBoxShapeUtil<GeoShape> {\n static override type = \"geo\" as const\n static override migrations = geoShapeMigrations\n static override options: GeoShapeOptions = { getDefaultDisplayValues: getGeoDisplayValues }\n declare readonly options: GeoShapeOptions\n static override props = geoShapeProps\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 richText: toRichText(\"\"),\n text: \"\",\n scale: 1,\n flipX: false,\n flipY: false,\n }\n }\n\n /**\n * The silhouette for `geo`, taking this util's `customGeoTypes` into account.\n * Falls back to the rectangle so an unknown value still draws something.\n */\n getGeoTypeDefinition(geo: string): GeoTypeDefinition {\n return (\n getGeoTypeDefinition(geo, this.options.customGeoTypes) ??\n getGeoTypeDefinition(\"rectangle\", this.options.customGeoTypes)!\n )\n }\n\n /**\n * The `geo` value this util will actually draw.\n *\n * `props.geo` is a *style* prop, and its validator only knows the built-in\n * silhouettes — so reading it through the style would turn every custom geo\n * type back into a rectangle before it ever reached the table. A stored value\n * this util has a definition for is therefore kept as it is; anything else\n * falls back to the validated style, which is what keeps a value from another\n * editor's vocabulary drawing something rather than nothing.\n */\n getGeoValue(shape: { props?: unknown }): string {\n const p = propsOf(shape)\n const raw = readString(p, \"geo\", \"\")\n if (raw !== \"\" && getGeoTypeDefinition(raw, this.options.customGeoTypes) !== undefined) return raw\n return readStyle(p, \"geo\", GeoShapeGeoStyle)\n }\n\n /**\n * The engine has a generator for every built-in geo kind, so a built-in\n * travels as `(kind, w, h, flips)` rather than as its vertices. A custom geo\n * type returns `undefined` and keeps uploading whatever its `getPath` builds.\n */\n override getEngineGeometry(shape: GeoShape): EngineGeometry | undefined {\n const geo = this.getGeoValue(shape)\n if (this.options.customGeoTypes?.[geo]) return undefined\n const kind = GEO_KIND[geo]\n if (kind === undefined) return undefined\n const { w, h, growY, fill, flipX, flipY, size, scale } = readGeoProps(shape)\n // The label rect is always clamped inside the body box, so the group's\n // bounds stay exactly `w x (h + growY)` whether or not there is text.\n return {\n type: \"geo\",\n kind,\n w,\n h: h + growY,\n isClosed: true,\n isFilled: fill !== \"none\",\n flipX,\n flipY,\n // Only the marks inside an outline use it — the X of an x-box, whose ends\n // sit on the corners. `getGeometry` has always shortened them by this; the\n // engine draws its own copy of the path and needs to be told the same.\n strokeWidth: STROKE_SIZES[size] * scale,\n }\n }\n\n override getGeometry(shape: GeoShape): Geometry2d {\n const props = readGeoProps(shape)\n const { w, h, growY, fill, text, flipX, flipY, size, scale } = props\n const height = h + growY\n const body = this.getGeoTypeDefinition(this.getGeoValue(shape)).getPath(w, height, {\n isFilled: fill !== \"none\",\n flipX,\n flipY,\n strokeWidth: STROKE_SIZES[size] * scale,\n })\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 const colors = getThemeColors(this.editor)\n return {\n stroke: getStrokeRgba(color, colors),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: getFillRgba(color, fill, colors),\n dash: getDashId(dash),\n opacity: 1,\n }\n }\n\n /** A geo shape needs its family's faces only while it carries a label. */\n override getFontFaces(shape: GeoShape): TLFontFace[] {\n return readText(shape.props) ? getLabelFontFaces(readGeoProps(shape).font) : []\n }\n\n component(shape: GeoShape): ReactNode {\n const { richText, text, font, size, scale, align, verticalAlign, w, h, growY } = readGeoProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n const display = getDisplayValues<GeoShape, GeoShapeUtilDisplayValues>(this, shape)\n return (\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={isEditing}\n fontFamily={font}\n fontSize={FONT_SIZES[size] * scale}\n color={display.labelColor}\n textAlign={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h + growY}\n padding={LABEL_PADDING * scale}\n onChange={(next) =>\n this.editor.updateShape<GeoShape>({\n id: shape.id,\n type: \"geo\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<GeoShape>({\n id: shape.id,\n type: \"geo\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n )\n }\n\n override getIndicatorPath(shape: GeoShape): Path2D {\n return svgPath(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, this.editor)\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, this.editor)\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) return\n this.editor.updateShape<GeoShape>({\n id: shape.id,\n type: \"geo\",\n props: { text: trimmed, richText: applyPlainTextToRichText(readRichText(shape.props), trimmed) },\n })\n }\n}\n","import {\n DEFAULT_THEME,\n Rectangle2d,\n ShapeUtil,\n getColorValue,\n getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n type BaseShape,\n type Geometry2d,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLFontFace,\n type TLStyledShape,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { noteShapeProps } from \"./shape-props\"\nimport { noteShapeMigrations } from \"./shape-migrations\"\nimport { propsOf, readNumber, readRichText, readString, readStyle, readText } from \"./prop-access\"\nimport {\n getLabelFontFaces,\n getNoteBodyGradientCss,\n getNoteFillRgba,\n getNoteShadowCss,\n getThemeColors,\n} from \"./shape-theme\"\nimport { rectPath } from \"./indicator-paths\"\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 /**\n * The label as a rich-text document — the v5 spelling, and the one the store\n * keeps. {@link NoteShapeProps.text} stays alongside it as the flattened\n * form, derived on load, so plain-text consumers need no conversion.\n */\n richText: RichText\n /**\n * The label as plain text.\n *\n * Optional, and *derived*: v5 replaced it with\n * {@link NoteShapeProps.richText}, and a record written by a v5 client has no\n * `text` at all. mocanvas keeps deriving it on load, because a plain-text\n * consumer (search, export, an agent reading the board) should not have to\n * walk a document — but nothing may require it to be present, and\n * `readRichText` is what reconciles the two when they disagree.\n */\n text?: string\n /**\n * Who first edited the label by hand, or `null` while nobody has.\n *\n * The seam attribution hangs off: a note whose text is still exactly what a\n * generator wrote can be regenerated freely, and one a person has touched\n * cannot. mocanvas stores and round-trips it; it never writes it itself,\n * because only the host knows who \"a person\" is.\n */\n textFirstEditedBy?: string | null | undefined\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 */\n/**\n * {@link NoteShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readNoteProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedNoteProps = NoteShapeProps & { text: string; richText: RichText }\n\nexport function readNoteProps(shape: { props?: unknown }): ResolvedNoteProps {\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 richText: readRichText(p),\n text: readText(p),\n textFirstEditedBy: readString(p, \"textFirstEditedBy\", \"\") || null,\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: { props?: unknown }, theme: TLTheme = DEFAULT_THEME): number {\n const { size, scale, fontSizeAdjustment } = readNoteProps(shape)\n const styled = theme.fontSize[size] ?? DEFAULT_THEME.fontSize[size]\n return (fontSizeAdjustment >= MIN_NOTE_FONT_SIZE ? fontSizeAdjustment : styled) * scale\n}\n\n/**\n * What a note paints with, once its style props have been resolved.\n *\n * Wider than the shared set because a note is not a filled rectangle with a\n * label on it: its body colour comes from the palette's *note* tokens rather\n * than from a fill style, and its label has a padding and a typography of its\n * own that anything measuring the note has to agree with. Callers read them\n * through `getDisplayValues(util, note)`, which is the only place the live\n * theme and colour mode are consulted.\n *\n * `noteWidth` and `noteHeight` are the note's **logical square**, before\n * `growY`. That is deliberate: the square is the note's identity, and a caller\n * fitting text into it wants the box the text has to fit, not the box the text\n * already grew.\n */\nexport interface NoteShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The body's width in page units, `scale` applied. */\n noteWidth: number\n /** The body's height in page units before `growY`; equal to `noteWidth`. */\n noteHeight: number\n /** Padding on every side between the body edge and its label, in page units. */\n labelPadding: number\n /** The label's font size in page units, after any `fontSizeAdjustment`. */\n labelFontSize: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n /** The label's CSS `font-style`. */\n labelFontStyle: string\n /** The label's CSS `font-weight`. */\n labelFontWeight: string\n /** The label's CSS `font-variant`. */\n labelFontVariant: string\n /** The label's CSS `line-height`, as a unitless multiple of the font size. */\n labelLineHeight: number\n}\n\n/** `NoteShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface NoteShapeOptions extends ShapeUtilOptions<NoteShape, NoteShapeUtilDisplayValues> {\n /** The note's logical square side in page units, before `scale`. */\n noteSize?: number\n /** Padding between the body edge and its label, before `scale`. */\n labelPadding?: number\n}\n\n/**\n * Resolve a note's display values against a theme.\n *\n * Tolerant of a bare `{ props }` bag rather than a whole record: a placement\n * ghost asks what a note the user has not created yet would look like, and it\n * has only the util's default props to ask with.\n */\nexport function getNoteDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n options: NoteShapeOptions = {},\n): NoteShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const props = readNoteProps(shape)\n const colors = theme.colors[colorMode] ?? theme.colors.light\n const side = (options.noteSize ?? NOTE_SIZE) * props.scale\n const fontSize = getNoteFontSize(shape, theme)\n // A note's ink is the palette's note text unless the label carries a colour\n // of its own; `black` is the \"unset\" value the style panel writes.\n const labelColor =\n props.labelColor === \"black\"\n ? getColorValue(colors, props.color, \"noteText\")\n : getColorValue(colors, props.labelColor, \"solid\")\n return {\n ...base,\n labelColor,\n fill: getColorValue(colors, props.color, \"noteFill\"),\n fontSize,\n lineHeight: fontSize * theme.lineHeight,\n noteWidth: side,\n noteHeight: side,\n labelPadding: (options.labelPadding ?? NOTE_PADDING) * props.scale,\n labelFontSize: fontSize,\n labelFontFamily: theme.fonts[props.font] ?? theme.fonts.draw,\n // SEMANTICS-ASSUMED: a note's label is upright, regular and unshaped. Rich\n // text carries its own bold/italic runs as marks, so the shape-level\n // typography is the base every run is measured relative to.\n labelFontStyle: \"normal\",\n labelFontWeight: \"normal\",\n labelFontVariant: \"normal\",\n labelLineHeight: theme.lineHeight,\n }\n}\n\n/** `growY` a note needs so its (centered) text fits; the note keeps its square width. */\nexport function getNoteGrowY(shape: NoteShape, editor?: { getCurrentTheme?(): TLTheme } | null): number {\n const { richText, text, font, scale } = readNoteProps(shape)\n if (!text) return 0\n const side = NOTE_SIZE * scale\n const m = measureLabel(richText, {\n fontFamily: font,\n fontSize: getNoteFontSize(shape),\n maxWidth: side,\n padding: NOTE_PADDING * scale,\n editor: (editor ?? null) as never,\n })\n return computeGrowY(m.h, side)\n}\n\nconst LABEL_KEYS: readonly (keyof NoteShapeProps)[] = [\"richText\", \"text\", \"font\", \"size\", \"scale\", \"fontSizeAdjustment\"]\n\nexport class NoteShapeUtil extends ShapeUtil<NoteShape, NoteShapeUtilDisplayValues> {\n static override type = \"note\" as const\n // A method, not an arrow: `getDisplayValues` calls it on the options bag, so\n // `this` is the bag a `configure()` copy actually carries. Closing over\n // `NoteShapeUtil.options` instead would make every configured copy resolve\n // against the unconfigured defaults.\n static override options: NoteShapeOptions = {\n getDefaultDisplayValues(editor, shape, theme, colorMode) {\n return getNoteDisplayValues(editor, shape, theme, colorMode, this)\n },\n }\n declare readonly options: NoteShapeOptions\n static override props = noteShapeProps\n static override migrations = noteShapeMigrations\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 richText: toRichText(\"\"),\n text: \"\",\n // Deliberately absent: `textFirstEditedBy` is read and round-tripped but\n // never written by mocanvas (only the host knows who \"a person\" is), and\n // defaulting it would make every file that predates attribution warn on\n // load about a prop nothing here ever sets.\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 const colors = getThemeColors(this.editor)\n return { fill: getNoteFillRgba(readNoteProps(shape).color, colors), stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n /** A note is nothing but a label, so it needs its family's faces. */\n override getFontFaces(shape: NoteShape): TLFontFace[] {\n return getLabelFontFaces(readNoteProps(shape).font)\n }\n\n component(shape: NoteShape): ReactNode {\n const { richText, text, font, color, align, verticalAlign, scale, growY } = readNoteProps(shape)\n const display = getDisplayValues<NoteShape, NoteShapeUtilDisplayValues>(this, shape)\n const colors = getThemeColors(this.editor)\n const textColor = display.labelColor\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, colors),\n boxShadow: getNoteShadowCss(scale),\n pointerEvents: \"none\",\n }}\n />\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n fontFamily={font}\n fontSize={display.labelFontSize}\n color={textColor}\n textAlign={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h}\n padding={display.labelPadding}\n onChange={(next) =>\n this.editor.updateShape<NoteShape>({\n id: shape.id,\n type: \"note\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<NoteShape>({\n id: shape.id,\n type: \"note\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n </>\n )\n }\n\n override getIndicatorPath(shape: NoteShape): Path2D {\n const { scale, growY } = readNoteProps(shape)\n return rectPath(NOTE_SIZE * scale, 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, this.editor)\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, this.editor)\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) return\n this.editor.updateShape<NoteShape>({\n id: shape.id,\n type: \"note\",\n props: { text: trimmed, richText: applyPlainTextToRichText(readRichText(shape.props), trimmed) },\n })\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 { richTextToBlocks, richTextToText, type RichTextRun, type RichTextRunStyle, type RichTextSource } from \"./rich-text\"\nimport { getTextMeasure } from \"./TextMeasure\"\n\nexport type TextTextureAlign = \"start\" | \"middle\" | \"end\"\n\nexport interface TextTextureSpec {\n /**\n * The label as plain text. Ignored when {@link TextTextureSpec.richText} is\n * set; derived from it when only `richText` is given.\n */\n text: string\n /**\n * The label as a rich-text document. When present the raster is drawn run by\n * run, so bold, italic, underlined and struck-through spans keep their\n * formatting on the GPU path rather than only in the DOM overlay.\n */\n richText?: RichTextSource\n fontFamily: string\n fontSize: number\n /** Any CSS color string. */\n color: string\n /** Horizontal alignment. Named `align` before v5; `align` is still accepted. */\n textAlign?: TextTextureAlign\n /** @deprecated v5 renamed this to `textAlign`. */\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/** Horizontal alignment of a spec, from either spelling. */\nexport function textTextureAlign(spec: TextTextureSpec): TextTextureAlign {\n return spec.textAlign ?? spec.align ?? \"start\"\n}\n\n/** The plain text of a spec: the document's text when it has one, else `text`. */\nexport function textTextureText(spec: TextTextureSpec): string {\n return spec.richText === undefined || spec.richText === null ? spec.text : richTextToText(spec.richText)\n}\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 and the rich-text document\n * 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 textTextureAlign(spec),\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.richText === undefined || spec.richText === null ? spec.text : JSON.stringify(spec.richText),\n ].join(\"|\")\n}\n\n/** Width of one unwrapped run, through the shared measurer (cached). */\nfunction runWidth(text: string, spec: TextTextureSpec, style?: RichTextRunStyle): 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 ...(style?.bold ? { fontWeight: \"bold\" } : {}),\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 textTextureText(spec).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/** One rendered line of a rich-text raster: the styled runs it is made of, and their total width. */\nexport interface TextTextureLine {\n runs: RichTextRun[]\n width: number\n}\n\nfunction sameStyle(a: RichTextRunStyle, b: RichTextRunStyle): boolean {\n return a.bold === b.bold && a.italic === b.italic && a.underline === b.underline && a.strike === b.strike && a.code === b.code && a.href === b.href\n}\n\n/**\n * Break a spec's label into the lines the raster draws, keeping each run's\n * formatting.\n *\n * Same greedy word wrapping as {@link wrapTextTextureLines} — hard newlines\n * (here: block boundaries and `hardBreak` nodes) always break, a word that does\n * not fit is split by characters — but a line is a list of styled runs rather\n * than a string, so a bold word inside a sentence is measured and drawn bold.\n * A spec with no `richText` yields one unstyled run per line, so the two\n * functions agree line for line.\n */\nexport function wrapTextTextureRuns(spec: TextTextureSpec): TextTextureLine[] {\n const padding = spec.padding ?? 0\n const max = spec.maxWidth === undefined ? undefined : Math.max(1, spec.maxWidth - padding * 2)\n const source: RichTextSource = spec.richText === undefined || spec.richText === null ? spec.text : spec.richText\n const out: TextTextureLine[] = []\n\n for (const block of richTextToBlocks(source)) {\n let line: RichTextRun[] = []\n let width = 0\n const push = (): void => {\n // A line never keeps the space it broke at, so it aligns like the DOM\n // label and like `wrapTextTextureLines`.\n while (line.length > 0 && /^\\s+$/u.test(line[line.length - 1]!.text)) {\n const dropped = line.pop()!\n width -= runWidth(dropped.text, spec, dropped)\n }\n out.push({ runs: mergeRuns(line), width: Math.max(0, width) })\n line = []\n width = 0\n }\n for (const run of block.runs) {\n // Keep the separators so a wrapped line does not lose or gain a space.\n for (const token of run.text.split(/(\\s+)/u).filter((t) => t.length > 0)) {\n const isSpace = /^\\s+$/u.test(token)\n const tokenWidth = runWidth(token, spec, run)\n if (max !== undefined && !isSpace && line.length > 0 && width + tokenWidth > max) {\n push()\n }\n // A leading space on a freshly wrapped line is dropped, as CSS does.\n if (isSpace && line.length === 0) continue\n if (max !== undefined && !isSpace && tokenWidth > max) {\n for (const piece of breakLongToken(token, spec, run, max, width, line.length > 0)) {\n if (piece === null) push()\n else {\n line.push({ ...run, text: piece })\n width += runWidth(piece, spec, run)\n }\n }\n continue\n }\n line.push({ ...run, text: token })\n width += tokenWidth\n }\n }\n push()\n }\n return out\n}\n\n/**\n * Split a token wider than the line into pieces, emitting `null` where the\n * caller must start a new line first.\n */\nfunction breakLongToken(token: string, spec: TextTextureSpec, style: RichTextRunStyle, max: number, startWidth: number, canBreakFirst: boolean): (string | null)[] {\n const out: (string | null)[] = []\n if (canBreakFirst && startWidth > 0) out.push(null)\n let current = \"\"\n for (const char of token) {\n const next = current + char\n if (current.length > 0 && runWidth(next, spec, style) > max) {\n out.push(current, null)\n current = char\n } else {\n current = next\n }\n }\n if (current.length > 0) out.push(current)\n return out\n}\n\n/** Collapse neighbouring runs that share a style, so the renderer draws one `fillText` per style change. */\nfunction mergeRuns(runs: readonly RichTextRun[]): RichTextRun[] {\n const out: RichTextRun[] = []\n for (const run of runs) {\n const last = out[out.length - 1]\n if (last && sameStyle(last, run)) last.text += run.text\n else out.push({ ...run })\n }\n return out\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 = wrapTextTextureRuns(spec)\n const lineHeightPx = spec.fontSize * spec.lineHeight\n const blockHeight = lines.length * lineHeightPx\n const align = textTextureAlign(spec)\n\n ctx.scale(scale, scale)\n ctx.fillStyle = spec.color\n ctx.textBaseline = \"middle\"\n // Runs are placed left to right by hand, so the context always draws from the\n // run's own left edge; the line's alignment is in `lineLeft` below.\n ctx.textAlign = \"left\"\n\n const innerH = Math.max(0, spec.height - padding * 2)\n const innerW = Math.max(0, spec.width - padding * 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 const line = lines[i]!\n // CSS centres a run inside its line box; the canvas baseline does the same.\n const baseline = top + i * lineHeightPx + lineHeightPx / 2\n let x = padding + (align === \"start\" ? 0 : align === \"end\" ? innerW - line.width : (innerW - line.width) / 2)\n for (const run of line.runs) {\n ctx.font = runFont(run, spec)\n ctx.fillText(run.text, x, baseline)\n const width = runWidth(run.text, spec, run)\n if (run.underline || run.strike) {\n const thickness = Math.max(1, spec.fontSize / 14)\n const y = run.underline ? baseline + spec.fontSize * 0.4 : baseline\n ctx.fillRect(x, y - thickness / 2, width, thickness)\n }\n x += width\n }\n }\n return canvas\n}\n\n/** The `ctx.font` shorthand a run draws with. */\nfunction runFont(style: RichTextRunStyle, spec: TextTextureSpec): string {\n const parts: string[] = []\n if (style.italic) parts.push(\"italic\")\n if (style.bold) parts.push(\"bold\")\n parts.push(`${spec.fontSize}px`, spec.fontFamily)\n return parts.join(\" \")\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 getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n type DefaultTextAlignStyle,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n DefaultSizeStyle,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type ResizeInfo,\n type ShapeUtilOptions,\n type StyleWords,\n type TLFontFace,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\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, readRichText, readStyle, readText } from \"./prop-access\"\nimport { getFontFamily, getLabelFontFaces, getStrokeRgba, getTheme, getThemeColors, getTextCssColor } from \"./shape-theme\"\nimport { rectPath } from \"./indicator-paths\"\nimport { textShapeProps } from \"./shape-props\"\nimport { textShapeMigrations } from \"./shape-migrations\"\n\nexport interface TextShapeProps {\n color: DefaultColorStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n /**\n * How the paragraphs are aligned inside the shape's own width.\n *\n * Typed as the whole horizontal-align set because that is the style the\n * shape declares, and a record written by an older client may hold one of\n * its `-legacy` values. `readTextProps` narrows every one of them to\n * `start` / `middle` / `end`, so nothing downstream has to know they exist.\n */\n textAlign: DefaultHorizontalAlignStyle\n w: number\n /** The label as a rich-text document; see `NoteShapeProps.richText`. */\n richText: RichText\n /** The label as plain text — optional and derived; see `NoteShapeProps.text`. */\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 */\n/**\n * {@link TextShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readTextProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedTextProps = Omit<TextShapeProps, \"textAlign\"> & {\n text: string\n richText: RichText\n /**\n * Narrowed to the three alignments that mean something for a paragraph: a\n * stored `-legacy` value reads as `start`, which is what those spellings\n * aligned a label box to.\n */\n textAlign: DefaultTextAlignStyle\n}\n\nexport function readTextProps(shape: { props?: unknown }): ResolvedTextProps {\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 richText: readRichText(p),\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(\n shape: { props?: unknown },\n editor?: Editor | null,\n): { w: number; h: number; lineCount: number } {\n const { richText, size, scale, w, font, autoSize } = readTextProps(shape)\n return getTextShapeSize({\n text: richText,\n fontFamily: font,\n fontSize: FONT_SIZES[size] * scale,\n autoSize,\n w,\n editor: editor ?? null,\n })\n}\n\n/** Height of the text block at its current width. */\nexport function getTextShapeHeight(shape: TextShape, editor?: Editor | null): number {\n return getTextShapeSizeFor(shape, editor).h\n}\n\n/** The box `getGeometry` produces: what a texture for this shape must cover. */\nexport function getTextShapeBox(shape: TextShape, editor?: Editor | null): { w: number; h: number } {\n const { w, h } = getTextShapeSizeFor(shape, editor)\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, editor)\n return {\n text,\n fontFamily: getFontFamily(font, getTheme(editor)),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(color, getThemeColors(editor)),\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)[] = [\"richText\", \"text\", \"font\", \"size\", \"scale\", \"autoSize\"]\n\n/** `TextShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\n/**\n * What a text shape paints with.\n *\n * A text shape is nothing but a label, and its label carries a `scale` the\n * shared set knows nothing about — so the sizes it actually draws at are\n * reported separately from the ones the style asks for.\n */\nexport interface TextShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The font size actually drawn, in page units: `fontSize` with `scale` applied. */\n labelFontSize: number\n /** The line height actually drawn, in page units. */\n labelLineHeight: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n}\n\n/** `TextShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface TextShapeOptions extends ShapeUtilOptions<TextShape, TextShapeUtilDisplayValues> {}\n\n/** Resolve a text shape's display values; see {@link TextShapeUtilDisplayValues}. */\nexport function getTextDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): TextShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const scale = readNumber(propsOf(shape), \"scale\", 1)\n return {\n ...base,\n labelFontSize: base.fontSize * scale,\n labelLineHeight: base.fontSize * scale * LINE_HEIGHT,\n labelFontFamily: base.fontFamily,\n }\n}\n\nexport class TextShapeUtil extends ShapeUtil<TextShape, TextShapeUtilDisplayValues> {\n static override type = \"text\" as const\n static override props = textShapeProps\n static override migrations = textShapeMigrations\n static override options: TextShapeOptions = { getDefaultDisplayValues: getTextDisplayValues }\n declare readonly options: TextShapeOptions\n\n getDefaultProps(): TextShapeProps {\n return {\n color: \"black\",\n size: \"m\",\n font: \"draw\",\n textAlign: \"start\",\n w: 100,\n richText: toRichText(\"\"),\n text: \"\",\n scale: 1,\n autoSize: true,\n }\n }\n\n getGeometry(shape: TextShape): Geometry2d {\n const box = getTextShapeBox(shape, this.editor)\n return new Rectangle2d({ width: box.w, height: box.h, isFilled: true })\n }\n\n /** A text shape is nothing but a label, so it always needs its family's faces. */\n override getFontFaces(shape: TextShape): TLFontFace[] {\n return getLabelFontFaces(readTextProps(shape).font)\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 {\n fill: getStrokeRgba(readTextProps(shape).color, getThemeColors(this.editor)),\n stroke: 0,\n strokeWidth: 0,\n dash: 0,\n opacity: 1,\n texture,\n }\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 { richText, text, font, size, scale, textAlign, w, autoSize } = readTextProps(shape)\n const display = getDisplayValues<TextShape>(this, shape)\n return (\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n fontFamily={font}\n fontSize={FONT_SIZES[size] * scale}\n color={display.color}\n textAlign={textAlign}\n verticalAlign=\"start\"\n wrap={!autoSize}\n width={Math.max(1, w)}\n onChange={(next) =>\n this.editor.updateShape<TextShape>({\n id: shape.id,\n type: \"text\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<TextShape>({\n id: shape.id,\n type: \"text\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n )\n }\n\n override getIndicatorPath(shape: TextShape): Path2D {\n const b = this.getGeometry(shape).bounds\n return rectPath(b.w, 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, this.editor)\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 getDefaultDisplayValues,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type VideoAsset,\n} from \"@mocanvas/editor\"\nimport { videoShapeProps } from \"./shape-props\"\nimport { videoShapeMigrations } from \"./shape-migrations\"\nimport { useEffect, useRef, type CSSProperties, type ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\nimport { rectPath } from \"./indicator-paths\"\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 editor members this module reads, none of which it requires to exist.\n *\n * `allowVideoAutoplay` is an editor *option*, so its declaration belongs on\n * `EditorConfig` in the editor package; it is read structurally here so that a\n * host which already sets it is honoured whether or not the field has been\n * declared yet.\n */\ninterface EditorWithVideoOptions {\n options?: { allowVideoAutoplay?: boolean }\n}\n\n/**\n * Whether a video may start itself.\n *\n * Defaults to `true` — the historical behaviour, where a shape carrying\n * `props.playing` starts as soon as it is on screen. An app that sets\n * `options.allowVideoAutoplay: false` gets the opposite: no video ever starts\n * on its own, and one only plays once someone presses play in its controls.\n * The shape's `playing` prop is left alone either way, so the setting is a\n * property of this editor rather than an edit to the document.\n */\nexport function isVideoAutoplayAllowed(editor: Editor | null | undefined): boolean {\n return (editor as EditorWithVideoOptions | null | undefined)?.options?.allowVideoAutoplay !== false\n}\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\n/**\n * What a video shape paints with: the placeholder frame and the play glyph\n * drawn over it. Like an image, a video carries no styles of its own.\n */\nexport interface VideoShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** Fill of the frame drawn before the video can be shown. */\n placeholderFill: string\n /** Border of that placeholder. */\n placeholderStroke: string\n /** Ink of the play glyph. */\n playColor: string\n /** The play glyph's side, in page units. */\n playSize: number\n}\n\n/** `VideoShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface VideoShapeOptions extends ShapeUtilOptions<VideoShape, VideoShapeUtilDisplayValues> {\n /** The width a new video shape is created at, in page units. */\n defaultWidth?: number\n /** The height a new video shape is created at, in page units. */\n defaultHeight?: number\n}\n\n/** Resolve a video shape's display values; see {@link VideoShapeUtilDisplayValues}. */\nexport function getVideoDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): VideoShapeUtilDisplayValues {\n return {\n ...getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode),\n placeholderFill: VIDEO_PLACEHOLDER_FILL,\n placeholderStroke: VIDEO_PLACEHOLDER_STROKE,\n playColor: VIDEO_PLAY_COLOR,\n playSize: VIDEO_PLAY_SIZE,\n }\n}\n\nexport class VideoShapeUtil extends BaseBoxShapeUtil<VideoShape> {\n static override type = \"video\" as const\n static override props = videoShapeProps\n static override migrations = videoShapeMigrations\n static override options: VideoShapeOptions = { getDefaultDisplayValues: getVideoDisplayValues }\n declare readonly options: VideoShapeOptions\n\n getDefaultProps(): VideoShapeProps {\n return { w: VIDEO_WIDTH, h: VIDEO_HEIGHT, assetId: null, time: 0, playing: true, url: \"\", altText: \"\" }\n }\n\n override 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) && isVideoAutoplayAllowed(this.editor)}\n controls={this.editor.getEditingShapeId() === shape.id}\n altText={altText}\n />\n </div>\n )\n }\n\n override getIndicatorPath(shape: VideoShape): Path2D {\n const { w, h } = readVideoBox(shape)\n return rectPath(w, 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 { isRichText, richTextToBlocks, richTextToText, safeHref, type RichTextRun, type RichTextSource } from \"../text/rich-text\"\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 /** Horizontal alignment. Named `align` before v5; `align` is still accepted. */\n textAlign?: DefaultHorizontalAlignStyle | \"start\" | \"middle\" | \"end\"\n /** @deprecated v5 renamed this to `textAlign`. */\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/** The horizontal alignment of a text options bag, from either spelling. */\nfunction alignOf(opts: SvgTextOptions): DefaultHorizontalAlignStyle | \"start\" | \"middle\" | \"end\" {\n return opts.textAlign ?? opts.align ?? \"middle\"\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: NonNullable<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 * Split a rich-text document into the rendered lines, each a list of styled\n * runs.\n *\n * Wrapping is by the same average-glyph-advance estimate {@link wrapTextLines}\n * uses, over the concatenated text of the line, so a document and the plain\n * string it flattens to break in the same places. That keeps a rich-text export\n * and a plain-text export of the same label the same height.\n */\nexport function wrapRichTextLines(source: RichTextSource, fontSize: number, maxWidth = Infinity): RichTextRun[][] {\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: RichTextRun[][] = []\n\n for (const block of richTextToBlocks(source)) {\n let line: RichTextRun[] = []\n let length = 0\n const push = (): void => {\n // A line never keeps the space it broke at, exactly as `wrapTextLines`\n // (which joins words) never produces one.\n while (line.length > 0 && /^\\s+$/u.test(line[line.length - 1]!.text)) line.pop()\n lines.push(mergeSvgRuns(line))\n line = []\n length = 0\n }\n for (const run of block.runs) {\n for (const token of run.text.split(/(\\s+)/u).filter((t) => t.length > 0)) {\n const isSpace = /^\\s+$/u.test(token)\n if (!isSpace && length > 0 && length + token.length > limit) push()\n if (isSpace && length === 0) continue\n if (!isSpace && token.length > limit) {\n // A single word longer than the line breaks mid-word, like `overflow-wrap: break-word`.\n let rest = token\n while (rest.length > limit) {\n if (length > 0) push()\n line.push({ ...run, text: rest.slice(0, limit) })\n length = limit\n rest = rest.slice(limit)\n push()\n }\n if (rest.length > 0) {\n line.push({ ...run, text: rest })\n length += rest.length\n }\n continue\n }\n line.push({ ...run, text: token })\n length += token.length\n }\n }\n push()\n }\n return lines\n}\n\n/** Collapse neighbouring runs that share a style, so one word is one `<tspan>`. */\nfunction mergeSvgRuns(runs: readonly RichTextRun[]): RichTextRun[] {\n const out: RichTextRun[] = []\n for (const run of runs) {\n const last = out[out.length - 1]\n if (last && last.bold === run.bold && last.italic === run.italic && last.underline === run.underline && last.strike === run.strike && last.code === run.code && last.href === run.href) last.text += run.text\n else out.push({ ...run })\n }\n return out\n}\n\n/** The `<tspan>` attributes a run's marks translate to. */\nfunction runAttrs(run: RichTextRun, opts: SvgTextOptions): Record<string, string | number | undefined> {\n const decorations: string[] = []\n if (run.underline) decorations.push(\"underline\")\n if (run.strike) decorations.push(\"line-through\")\n return {\n \"font-weight\": run.bold ? \"bold\" : opts.fontWeight === undefined ? undefined : String(opts.fontWeight),\n \"font-style\": run.italic ? \"italic\" : undefined,\n \"text-decoration\": decorations.length === 0 ? undefined : decorations.join(\" \"),\n }\n}\n\n/**\n * Render `source` inside `box`. Returns an empty string for an empty label.\n * Lines are positioned with `dominant-baseline=\"central\"` so vertical centring\n * does not depend on font metrics.\n *\n * Accepts either spelling of a label: a plain string, or the rich-text document\n * the store may hold in `props.richText`. A document is exported run by run —\n * bold, italic, underlined and struck-through spans and links survive into the\n * SVG — while a plain string takes the single-`<tspan>`-per-line path it always\n * did.\n */\nexport function textToSvg(source: RichTextSource, box: SvgTextBox, opts: SvgTextOptions): string {\n const rich = isRichText(source)\n const plain = richTextToText(source)\n if (plain.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 wrapWidth = opts.wrap ? innerW : Infinity\n const lineCount = rich ? wrapRichTextLines(source, opts.fontSize, wrapWidth).length : wrapTextLines(plain, opts.fontSize, wrapWidth).length\n const lineH = opts.fontSize * LINE_HEIGHT\n const blockH = lineCount * lineH\n\n const anchor = anchorFor(alignOf(opts))\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 const lineY = (i: number): number => top + lineH * i + lineH / 2\n\n const spans = rich\n ? wrapRichTextLines(source, opts.fontSize, wrapWidth)\n .map((runs, i) => {\n // Preserve runs of spaces and keep empty lines from collapsing.\n const content =\n runs.length === 0\n ? \"​\"\n : runs\n .map((run) => {\n const a = attrs(runAttrs(run, opts))\n const inner = `<tspan${a.length === 0 ? \"\" : ` ${a}`}>${escapeXml(run.text)}</tspan>`\n const href = safeHref(run.href)\n return href === null ? inner : `<a ${attrs({ href })}>${inner}</a>`\n })\n .join(\"\")\n return `<tspan x=\"${svgNum(x)}\" y=\"${svgNum(lineY(i))}\">${content}</tspan>`\n })\n .join(\"\")\n : wrapTextLines(plain, opts.fontSize, wrapWidth)\n .map((line, i) => `<tspan x=\"${svgNum(x)}\" y=\"${svgNum(lineY(i))}\">${line.length === 0 ? \"​\" : escapeXml(line)}</tspan>`)\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 /**\n * Page units added around the shapes' bounds. Default 32.\n *\n * `\"auto\"` means \"whatever frames the drawing sensibly\", which for mocanvas\n * is the default padding: the export bounds already come from geometry\n * rather than from the culling pad, so there is no slack left to trim back.\n */\n padding?: number | \"auto\"\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 = typeof opts.padding === \"number\" ? 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"]}
1
+ {"version":3,"sources":["../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/measure-html.ts","../src/text/TextEditor.tsx","../src/text/text-layout.ts","../src/shapes/elbow-helpers.ts","../src/shapes/ArrowShapeUtil.tsx","../src/shapes/FrameShapeUtil.tsx","../src/shapes/geo-types.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"],"names":["Vec","p","anchorFor","m","EPS","STROKE_SIZES","Group2d","jsx","getDefaultDisplayValues","Rectangle2d","hexToRgba","LABEL_PADDING","DefaultColorStyle","DefaultLabelColorStyle","DefaultFillStyle","DefaultDashStyle","DefaultSizeStyle","DefaultFontStyle","FONT_SIZES","getDisplayValues","DefaultHorizontalAlignStyle","DefaultVerticalAlignStyle","DEFAULT_THEME","getColorValue","LABEL_KEYS","ShapeUtil","jsxs","useRef","useEffect","BaseBoxShapeUtil","a","Box"],"mappings":"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","file":"chunk-HRUFJLK5.js","sourcesContent":["/**\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 ArrowShapeArrowheadKind, type Geometry2d, type VecLike } from \"@mocanvas/editor\"\nimport { arcToCubicSegments } from \"./spline-helpers\"\n\n/**\n * How an arrow's terminal is drawn.\n *\n * The vocabulary itself lives with the other style vocabularies in the editor\n * (`ARROWHEAD_KINDS`), so the style prop and the geometry cannot drift apart;\n * this is the name the arrow code has always used for it.\n */\nexport type ArrowheadKind = ArrowShapeArrowheadKind\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/**\n * The stretch of `body`, as a parameter range, that runs inside `box` — the gap\n * the *selection outline* leaves around a label.\n *\n * Only the outline needs it. The arrow itself is drawn end to end and the label's\n * opaque box covers the stretch under the text, which is what keeps the stroke\n * there to be clicked. The indicator is painted on top of the label, though, so\n * without this it draws a line straight through the words.\n *\n * Sampled rather than solved: the three body kinds are a segment, an arc and a\n * polyline, and an exact intersection for each is three separate cases to get\n * wrong for an answer that is then rounded to a pixel anyway. The range runs from\n * the first sample inside the box to the last, so a body that enters twice — a\n * tight arc passing its own label on the way out and back — is cut once, across\n * the whole excursion.\n *\n * `null` when the body never enters the box, or when the gap would swallow it\n * whole: a label wider than its own arrow leaves the outline alone.\n */\nexport function labelGapOnBody(body: ArrowBody, box: { x: number; y: number; w: number; h: number }): { from: number; to: number } | null {\n const SAMPLES = 192\n const minX = box.x\n const maxX = box.x + box.w\n const minY = box.y\n const maxY = box.y + box.h\n let from = -1\n let to = -1\n for (let i = 0; i <= SAMPLES; i++) {\n const t = i / SAMPLES\n const p = getPointOnBody(body, t)\n if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) continue\n if (from < 0) from = t\n to = t\n }\n if (from < 0) return null\n const half = 0.5 / SAMPLES\n const gap = { from: Math.max(0, from - half), to: Math.min(1, to + half) }\n if (gap.to - gap.from > 0.9) return null\n return gap\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({ fromShape: arrow, toShape: shape, 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.\n *\n * Everything here resolves against a *ramp* — `theme.colors[colorMode]` — never\n * against a hardcoded palette. A util passes the ramp its editor is currently\n * painting with, which is what makes the built-in shapes follow the theme and\n * the colour mode; a caller with no editor to ask (an exporter rendering a\n * detached snapshot, a preview swatch) omits it and gets the built-in light\n * ramp, which is exactly what these functions used to return unconditionally.\n *\n * The *shape-level* resolution — which colour a shape's `color` prop means,\n * how wide its stroke is, what font size its label uses — belongs to\n * `getDisplayValues(util, shape)` and is not restated here. What is left is the\n * chrome no style prop describes: a note's gradient and shadow, a frame's\n * border and heading strip.\n */\nimport {\n DEFAULT_FILL_TOKENS,\n DEFAULT_THEME,\n DefaultFontFaces,\n getColorValue,\n hexToRgba,\n type DefaultColorStyle,\n type DefaultFillStyle,\n type DefaultFontStyle,\n type TLColorMode,\n type TLFontFace,\n type TLTheme,\n type TLThemeColors,\n} from \"@mocanvas/editor\"\n\n/**\n * The ramp a caller that has no editor resolves against: the built-in theme's\n * light half. Named rather than inlined so it is obvious that every default\n * below is one decision, not eight.\n */\nexport const FALLBACK_THEME_COLORS: TLThemeColors = DEFAULT_THEME.colors.light\n\n/** What a ramp can be read off: the editor, or anything else theme-shaped. */\nexport interface ThemeSource {\n getCurrentTheme?(): TLTheme\n getColorMode?(): TLColorMode\n}\n\n/**\n * The theme `source` is currently painting with, or the built-in one.\n *\n * Tolerant on purpose: a util's `editor` is typed but a test double, a\n * half-constructed editor or a detached exporter may not implement either\n * method, and a missing theme must degrade to the default rather than throw\n * inside a render.\n */\nexport function getTheme(source: ThemeSource | null | undefined): TLTheme {\n return source?.getCurrentTheme?.() ?? DEFAULT_THEME\n}\n\n/** The ramp `source` is currently painting with; see {@link getTheme}. */\nexport function getThemeColors(source: ThemeSource | null | undefined): TLThemeColors {\n const theme = getTheme(source)\n const mode = source?.getColorMode?.() ?? \"light\"\n return theme.colors[mode] ?? theme.colors.light\n}\n\n/** Engine RGBA for a shape's stroke. */\nexport function getStrokeRgba(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): number {\n return hexToRgba(getColorValue(colors, 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). That\n * table is stated once, in `DEFAULT_FILL_TOKENS`, and read here rather than\n * restated — 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(\n color: DefaultColorStyle,\n fill: DefaultFillStyle,\n colors: TLThemeColors = FALLBACK_THEME_COLORS,\n): number {\n const token = DEFAULT_FILL_TOKENS[fill] ?? \"none\"\n if (token === \"none\") return 0\n if (token === \"paper\") return hexToRgba(colors.solid)\n return hexToRgba(getColorValue(colors, color, token))\n}\n\n/** Engine RGBA for a sticky note's background. */\nexport function getNoteFillRgba(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): number {\n return hexToRgba(getColorValue(colors, color, \"noteFill\"))\n}\n\n/** CSS color string for text drawn in the DOM overlay. */\nexport function getTextCssColor(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getColorValue(colors, color, \"solid\")\n}\n\n/** CSS color string for text on a sticky note. */\nexport function getNoteTextCssColor(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getColorValue(colors, color, \"noteText\")\n}\n\n/** The CSS font stack a font style resolves to, in `theme`. */\nexport function getFontFamily(font: DefaultFontStyle, theme: TLTheme = DEFAULT_THEME): string {\n return theme.fonts[font] ?? theme.fonts.draw\n}\n\n// SEMANTICS-ASSUMED: a label needs all four faces of its family, not just the\n// upright regular one. Rich text can turn any run bold or italic without\n// changing the shape's `font` prop, so loading one face would leave a bold run\n// synthesised (and mis-measured) until something else happened to pull the real\n// one in. The built-in faces are local families, so asking for four costs\n// nothing; a theme that swaps in webfonts pays four requests per family used.\n/**\n * The typefaces a label in `font` needs: the four `[style][weight]` faces of\n * that family.\n *\n * This is what a text-bearing `ShapeUtil.getFontFaces` answers. Only the\n * *built-in* face registry is consulted — a theme that names its own families\n * registers their faces with the font manager itself, because a CSS stack says\n * which families to try, not where to fetch them.\n */\nexport function getLabelFontFaces(font: DefaultFontStyle): TLFontFace[] {\n const set = DefaultFontFaces[`tldraw_${font}`]\n if (set === undefined) return []\n const faces: TLFontFace[] = []\n for (const byWeight of Object.values(set)) {\n for (const face of Object.values(byWeight)) faces.push(face)\n }\n return faces\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, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getColorValue(colors, color, \"noteFill\")\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, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return getNoteGradientTopFrom(getNoteFillCssColor(color, colors))\n}\n\n/** CSS `background` for a note body: the vertical gradient, top to bottom. */\nexport function getNoteBodyGradientCss(color: DefaultColorStyle, colors: TLThemeColors = FALLBACK_THEME_COLORS): string {\n return `linear-gradient(to bottom, ${getNoteGradientTopCssColor(color, colors)} 0%, ${getNoteFillCssColor(color, colors)} 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\nexport interface TextMeasureHtmlOptions {\n fontFamily: string\n fontSize: number\n fontWeight?: string | number\n /** CSS `font-style`, e.g. `\"italic\"`. */\n fontStyle?: string\n /** Unitless line height (multiplier of the font size). */\n lineHeight: number\n /** Wrap width in CSS px, including `padding`. Omit (or `null`) for no wrapping. */\n maxWidth?: number | null\n /** CSS padding, as a number of px or any padding shorthand (`\"0px\"`, `\"4px 8px\"`). */\n padding?: number | string\n /**\n * Also report `scrollWidth`: the width the content wants before wrapping, so a\n * shrink-to-fit pass can tell \"wraps\" from \"overflows\".\n */\n measureScrollWidth?: boolean\n /** Extra CSS declarations applied to the probe, e.g. `{ \"font-variant\": \"small-caps\" }`. */\n otherStyles?: Record<string, string>\n}\n\nexport interface TextHtmlMeasurement extends TextMeasurement {\n /** Width the content wants before wrapping. Equals `w` unless `measureScrollWidth` was set. */\n scrollWidth: 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 *\n * `measureHtml` measures a rich-text label the same way, from the HTML\n * `renderHtmlFromRichTextForMeasurement` produces. Both paths share the cache\n * and the probe element, so a rich-text label and the plain-text label it\n * flattens to are measured by the same code.\n */\nexport class TextMeasure {\n private element: HTMLDivElement | null = null\n private htmlElement: HTMLDivElement | null = null\n private readonly cache = new Map<string, TextMeasurement>()\n private readonly htmlCache = new Map<string, TextHtmlMeasurement>()\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 /**\n * Measure a run of HTML — a rich-text label — laid out the way the DOM\n * overlay renders it.\n *\n * Only pass HTML this package generated (`richTextToHtml` escapes text and\n * scheme-checks link hrefs); the probe is inert but it is still a live DOM\n * subtree.\n */\n measureHtml(html: string, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n const key = htmlCacheKey(html, opts)\n const hit = this.htmlCache.get(key)\n if (hit) return hit\n const result = typeof document === \"undefined\" ? this.estimateHtml(html, opts) : this.measureHtmlDom(html, opts)\n if (this.htmlCache.size >= MAX_CACHE_ENTRIES) {\n const oldest = this.htmlCache.keys().next().value\n if (oldest !== undefined) this.htmlCache.delete(oldest)\n }\n this.htmlCache.set(key, result)\n return result\n }\n\n /**\n * Measure several HTML runs against one probe. Nothing is shared between the\n * items beyond the element itself; the win is one style write and one layout\n * flush per item instead of one per call site.\n */\n measureHtmlBatch(items: readonly { html: string; opts: TextMeasureHtmlOptions }[]): TextHtmlMeasurement[] {\n return items.map((item) => this.measureHtml(item.html, item.opts))\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 this.htmlCache.clear()\n }\n\n dispose(): void {\n this.cache.clear()\n this.htmlCache.clear()\n this.element?.remove()\n this.element = null\n this.htmlElement?.remove()\n this.htmlElement = 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 estimateHtml(html: string, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n const text = htmlToProbeText(html)\n const padding = paddingPx(opts.padding)\n const base = this.estimate(text, {\n fontFamily: opts.fontFamily,\n fontSize: opts.fontSize,\n lineHeight: opts.lineHeight,\n ...(opts.fontWeight === undefined ? {} : { fontWeight: opts.fontWeight }),\n ...(opts.maxWidth === undefined || opts.maxWidth === null ? {} : { maxWidth: opts.maxWidth }),\n padding,\n })\n // Unwrapped, the widest paragraph is what the content wants.\n const unwrapped = this.estimate(text, { fontFamily: opts.fontFamily, fontSize: opts.fontSize, lineHeight: opts.lineHeight, padding })\n return { ...base, scrollWidth: opts.measureScrollWidth ? unwrapped.w : base.w }\n }\n\n private measureHtmlDom(html: string, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n const el = this.getHtmlElement()\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.fontStyle = opts.fontStyle ?? \"normal\"\n s.lineHeight = String(opts.lineHeight)\n s.padding = typeof opts.padding === \"number\" ? `${opts.padding}px` : (opts.padding ?? \"0px\")\n s.maxWidth = opts.maxWidth === undefined || opts.maxWidth === null ? \"none\" : `${Math.max(1, opts.maxWidth)}px`\n // `removeProperty` first, so a probe reused with fewer styles is not measured with the last call's.\n for (const name of readCustomStyleNames(el)) s.removeProperty(name)\n for (const [name, value] of Object.entries(opts.otherStyles ?? {})) s.setProperty(name, value)\n writeCustomStyleNames(el, Object.keys(opts.otherStyles ?? {}))\n el.innerHTML = html\n\n const rect = el.getBoundingClientRect()\n const padding = paddingPx(opts.padding)\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 let scrollWidth = rect.width\n if (opts.measureScrollWidth) {\n // `scrollWidth` is an integer and never smaller than the client width, so\n // an unwrapped re-measure is the only way to learn the wanted width.\n const previousMax = s.maxWidth\n s.maxWidth = \"none\"\n scrollWidth = el.getBoundingClientRect().width\n s.maxWidth = previousMax\n }\n return {\n w: Math.ceil(rect.width * 100) / 100,\n h: Math.ceil(rect.height * 100) / 100,\n lineCount,\n scrollWidth: Math.ceil(scrollWidth * 100) / 100,\n }\n }\n\n private getHtmlElement(): HTMLDivElement {\n if (this.htmlElement && this.htmlElement.isConnected) return this.htmlElement\n installHtmlProbeStyles()\n const el = document.createElement(\"div\")\n el.setAttribute(\"aria-hidden\", \"true\")\n el.className = \"mocanvas-text-measure-html\"\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.htmlElement = el\n return el\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\nfunction htmlCacheKey(html: string, o: TextMeasureHtmlOptions): string {\n const other = Object.entries(o.otherStyles ?? {})\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\")\n return `${o.fontFamily}|${o.fontSize}|${o.fontWeight ?? \"\"}|${o.fontStyle ?? \"\"}|${o.lineHeight}|${o.maxWidth ?? \"\"}|${o.padding ?? 0}|${o.measureScrollWidth ? 1 : 0}|${other}|${html}`\n}\n\n/** Padding as a single number of px; a shorthand contributes its first value. */\nfunction paddingPx(padding: number | string | undefined): number {\n if (typeof padding === \"number\") return Number.isFinite(padding) ? padding : 0\n if (typeof padding !== \"string\") return 0\n const first = padding.trim().split(/\\s+/)[0] ?? \"\"\n const value = Number.parseFloat(first)\n return Number.isFinite(value) ? value : 0\n}\n\n/** Block-level tags whose boundaries read as a line break when HTML is flattened for the estimate. */\nconst BLOCK_TAG = /<\\/?(?:p|div|li|ul|ol|h[1-6]|blockquote|pre|tr|br|hr)\\b[^>]*>/gi\n\n/** The text an HTML run lays out as, for the `document`-less estimate. */\nfunction htmlToProbeText(html: string): string {\n return html\n .replace(BLOCK_TAG, \"\\n\")\n .replace(/<[^>]*>/g, \"\")\n .replace(/&nbsp;/g, \" \")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/\\n{2,}/g, \"\\n\")\n .replace(/^\\n|\\n$/g, \"\")\n}\n\n/** Custom property names set on the probe by the previous call, so they can be cleared. */\nfunction readCustomStyleNames(el: HTMLElement): string[] {\n const raw = el.dataset[\"mocanvasOtherStyles\"]\n return raw === undefined || raw.length === 0 ? [] : raw.split(\",\")\n}\n\nfunction writeCustomStyleNames(el: HTMLElement, names: readonly string[]): void {\n if (names.length === 0) delete el.dataset[\"mocanvasOtherStyles\"]\n else el.dataset[\"mocanvasOtherStyles\"] = names.join(\",\")\n}\n\nlet htmlProbeStylesInstalled = false\n\n/**\n * Zero the browser's default block margins inside the HTML probe. A `<p>`'s\n * 1em margin would otherwise measure as extra height that the label — which\n * renders with the same rules — never has.\n */\nfunction installHtmlProbeStyles(): void {\n if (htmlProbeStylesInstalled || typeof document === \"undefined\") return\n htmlProbeStylesInstalled = true\n const style = document.createElement(\"style\")\n style.setAttribute(\"data-mocanvas\", \"text-measure\")\n style.textContent = RICH_TEXT_BLOCK_CSS.replace(/__SCOPE__/g, \".mocanvas-text-measure-html\")\n document.head.appendChild(style)\n}\n\n/**\n * The CSS a rich-text label lays out under, in both the measuring probe and the\n * DOM overlay. `__SCOPE__` is replaced with the selector of the container.\n *\n * Exported so the overlay renders under exactly the rules the measurer used —\n * one copy of the numbers, not two.\n */\nexport const RICH_TEXT_BLOCK_CSS = [\n \"__SCOPE__ p,__SCOPE__ h1,__SCOPE__ h2,__SCOPE__ h3,__SCOPE__ h4,__SCOPE__ h5,__SCOPE__ h6,__SCOPE__ blockquote,__SCOPE__ pre,__SCOPE__ ul,__SCOPE__ ol{margin:0;padding:0;font-size:inherit;font-weight:inherit;line-height:inherit;}\",\n \"__SCOPE__ ul,__SCOPE__ ol{padding-inline-start:1.4em;}\",\n \"__SCOPE__ li{margin:0;}\",\n \"__SCOPE__ pre,__SCOPE__ code{font-family:inherit;white-space:pre-wrap;}\",\n \"__SCOPE__ hr{margin:0;border:0;border-top:1px solid currentColor;}\",\n \"__SCOPE__ a{color:inherit;}\",\n].join(\"\")\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","/**\n * The bridge between a rich-text document and the text measurer: HTML in, a box\n * out.\n *\n * `renderHtmlFromRichTextForMeasurement` produces the markup, and the measurer\n * installed through `registerTextMeasureImplementation` (see the \"Installing\n * the editor's optional members\" section of `docs/COMPAT.md`) turns it into a\n * size via `editor.textMeasure.measureHtml`. There is one measurer and one\n * probe element for both the plain and the rich path, so a rich-text label and\n * the plain-text label it flattens to never disagree about their size.\n */\n\nimport type { Editor } from \"@mocanvas/editor\"\nimport { richTextToHtml, type RichTextSource } from \"./rich-text\"\nimport { getTextMeasure, type TextHtmlMeasurement, type TextMeasureHtmlOptions } from \"./TextMeasure\"\nimport { tipTapDefaultExtensions, type RichTextExtension } from \"./tiptap-extensions\"\n\n/** The editor members this module reads, none of which it requires to exist. */\ninterface EditorWithTextOptions {\n options?: { text?: { tipTapConfig?: { extensions?: readonly RichTextExtension[] } } }\n /** The pre-consolidation spelling; v5 moved `textOptions` under `options.text`. */\n textOptions?: { tipTapConfig?: { extensions?: readonly RichTextExtension[] } }\n}\n\n/**\n * The rich-text extension list an editor is configured with, or the default set.\n *\n * Reads both the v5 `options.text.tipTapConfig` location and the older\n * top-level `textOptions`, and tolerates an editor that carries neither — an\n * editor built before the text options landed still measures rich text.\n */\nexport function getRichTextExtensions(editor: Editor | null | undefined): readonly RichTextExtension[] {\n const host = editor as EditorWithTextOptions | null | undefined\n const configured = host?.options?.text?.tipTapConfig?.extensions ?? host?.textOptions?.tipTapConfig?.extensions\n return configured && configured.length > 0 ? configured : tipTapDefaultExtensions\n}\n\n/**\n * Render a rich-text value to the HTML the text measurer sizes.\n *\n * The markup is generated from the document JSON with the editor's configured\n * extensions: text is escaped, link hrefs are scheme-checked, and no whitespace\n * is emitted between tags (the probe lays out with `white-space: pre-wrap`,\n * where an indenting newline would measure as a space). A plain string is\n * accepted too and renders as the paragraphs it splits into, so a caller does\n * not have to know which of `props.richText` and `props.text` the store holds.\n *\n * The result is only meant for measurement and for mocanvas's own label\n * rendering. It is not a general-purpose export format — use\n * `richTextToSvg` for SVG.\n */\nexport function renderHtmlFromRichTextForMeasurement(editor: Editor | null | undefined, richText: RichTextSource): string {\n return richTextToHtml(richText, { extensions: getRichTextExtensions(editor) })\n}\n\n/**\n * Render a rich-text value to HTML with an **explicit** extension list.\n *\n * The sibling of {@link renderHtmlFromRichTextForMeasurement} for callers that\n * have no editor to read the extensions off: a server rendering a board's text\n * into a page, a search indexer, a test. Because the extension list is the\n * argument rather than something looked up, the same document renders the same\n * way outside the editor as inside it — which is the point of exporting it.\n *\n * Pass `tipTapDefaultExtensions` for the set mocanvas itself uses.\n */\nexport function renderHtmlFromRichTextWithExtensions(richText: RichTextSource, extensions: readonly RichTextExtension[]): string {\n return richTextToHtml(richText, { extensions })\n}\n\n/**\n * Measure a rich-text value directly: render it, then hand it to the shared\n * measurer. The convenience form of the two calls above.\n */\nexport function measureRichText(editor: Editor | null | undefined, richText: RichTextSource, opts: TextMeasureHtmlOptions): TextHtmlMeasurement {\n return getTextMeasure().measureHtml(renderHtmlFromRichTextForMeasurement(editor, richText), opts)\n}\n","import { useEditor, type DefaultFontStyle, type DefaultHorizontalAlignStyle, type DefaultVerticalAlignStyle, type UnknownShape } from \"@mocanvas/editor\"\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from \"react\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { getRichTextExtensions, renderHtmlFromRichTextForMeasurement } from \"./measure-html\"\nimport { applyPlainTextToRichText, isRichText, richTextToText, type RichText, type RichTextSource } from \"./rich-text\"\nimport { RICH_TEXT_BLOCK_CSS, toDisplayText } from \"./TextMeasure\"\nimport { getRichTextEditorFactory, type RichTextEditorFactory } from \"./tiptap-extensions\"\n\nexport interface TextLabelProps {\n shape: UnknownShape\n /**\n * The label as plain text. Ignored for rendering when\n * {@link TextLabelProps.richText} is set; still the value the plain-text\n * editing fallback starts from.\n */\n text: string\n /**\n * The label as a rich-text document, when the store holds one. A shape may\n * carry either `props.text` or `props.richText`; both render here.\n */\n richText?: RichTextSource\n isEditing: boolean\n /**\n * The label's font style token. Named `font` before v5; `font` is still\n * accepted and means the same thing.\n */\n fontFamily?: DefaultFontStyle\n /** @deprecated v5 renamed this to `fontFamily`. */\n font?: DefaultFontStyle\n fontSize: number\n /** CSS color of the text. */\n color: string\n /** Horizontal alignment. Named `align` before v5; `align` is still accepted. */\n textAlign?: DefaultHorizontalAlignStyle\n /** @deprecated v5 renamed this to `textAlign`. */\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 * Called with the new rich-text document, at the same rate as `onChange`.\n * A shape whose store prop is `richText` passes this; without it the label\n * still edits, and only the plain text is written back.\n */\n onChangeRichText?(value: RichText): void\n}\n\n/** The label's font style token, from either spelling. */\nexport function labelFontFamily(props: Pick<TextLabelProps, \"font\" | \"fontFamily\">): DefaultFontStyle {\n return props.fontFamily ?? props.font ?? \"draw\"\n}\n\n/** The label's horizontal alignment, from either spelling. */\nexport function labelTextAlign(props: Pick<TextLabelProps, \"align\" | \"textAlign\">): DefaultHorizontalAlignStyle {\n return props.textAlign ?? props.align ?? \"middle\"\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, richText, isEditing, fontSize, color, verticalAlign, wrap, width, height, padding = 0, placeholder, singleLine } = props\n const align = labelTextAlign(props)\n const font = labelFontFamily(props)\n const editor = useEditor()\n // The document is what renders when there is one; `text` is the fallback.\n const rich = isRichText(richText) ? richText : null\n const plain = rich ? richTextToText(rich) : text\n const html = useMemo(() => (rich ? renderHtmlFromRichTextForMeasurement(editor, rich) : null), [editor, rich])\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 empty = plain.length === 0\n if (rich && !(empty && placeholder)) {\n return (\n <div className=\"mocanvas-text-label\" style={outerStyle}>\n <RichTextBlockStyles />\n {/* The HTML is generated by `richTextToHtml` from a known node and\n mark table: text is escaped and link hrefs are scheme-checked, so\n nothing a document carries reaches the DOM as markup. */}\n <div className=\"mocanvas-rich-text\" style={textStyle} dangerouslySetInnerHTML={{ __html: html ?? \"\" }} />\n </div>\n )\n }\n const shown = empty && placeholder ? placeholder : toDisplayText(plain)\n return (\n <div className=\"mocanvas-text-label\" style={outerStyle}>\n <div style={{ ...textStyle, opacity: empty && placeholder ? 0.5 : 1 }}>{shown}</div>\n </div>\n )\n }\n\n // A host that installed a rich-text editor (a TipTap one, in practice) gets\n // the full surface for a rich-text label; everything else edits the plain text.\n const factory = getRichTextEditorFactory()\n const useRichSurface = factory !== null && props.onChangeRichText !== undefined && rich !== null\n return (\n <div className=\"mocanvas-text-label mocanvas-text-label-editing\" style={outerStyle}>\n {useRichSurface ? (\n <RichTextEditorSurface {...props} richText={rich!} onChangeRichText={props.onChangeRichText!} factory={factory!} textStyle={textStyle} singleLine={singleLine ?? false} />\n ) : (\n <TextEditor {...props} text={plain} textStyle={textStyle} singleLine={singleLine ?? false} />\n )}\n </div>\n )\n}\n\n/**\n * The block rules a rich-text label lays out under — the same ones the\n * measuring probe uses, so the rendered label is the size that was measured.\n * Rendered once per label; the browser deduplicates identical rules and the\n * cost of a repeated `<style>` is far below that of a stylesheet the host has\n * to remember to import.\n */\nfunction RichTextBlockStyles(): ReactNode {\n return <style>{RICH_TEXT_BLOCK_CSS.replace(/__SCOPE__/g, \".mocanvas-rich-text\")}</style>\n}\n\ninterface TextEditorProps extends TextLabelProps {\n textStyle: CSSProperties\n singleLine: boolean\n}\n\nfunction TextEditor(props: TextEditorProps): ReactNode {\n const { text, onChange, onChangeRichText, richText, textStyle, singleLine, wrap, color } = props\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 richRef = useRef(richText)\n richRef.current = richText\n const onChangeRef = useRef<(next: string) => void>(() => {})\n onChangeRef.current = (next: string) => {\n onChange(next)\n // A store that holds `richText` gets the document too. Formatting the\n // plain-text surface cannot express survives an edit that did not change\n // the text; see `applyPlainTextToRichText`.\n onChangeRichText?.(applyPlainTextToRichText(richRef.current, next))\n }\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\ninterface RichTextEditorSurfaceProps extends TextEditorProps {\n richText: RichText\n onChangeRichText(value: RichText): void\n factory: RichTextEditorFactory\n}\n\n/**\n * The WYSIWYG editing surface, mounted by whatever factory the host registered\n * with `registerRichTextEditorFactory` — a TipTap editor, for an app that has\n * the optional peer dependency.\n *\n * mocanvas only owns the box: the factory builds the editor into `container`,\n * reports documents back through `onChange`, and tears everything down in\n * `destroy`. Nothing about TipTap is imported here, so a build without it never\n * reaches this component.\n */\nfunction RichTextEditorSurface({ richText, onChangeRichText, factory, textStyle, singleLine }: RichTextEditorSurfaceProps): ReactNode {\n const editor = useEditor()\n const ref = useRef<HTMLDivElement>(null)\n const onChangeRef = useRef(onChangeRichText)\n onChangeRef.current = onChangeRichText\n const initial = useRef(richText)\n\n useLayoutEffect(() => {\n const container = ref.current\n if (!container) return\n const handle = factory({\n container,\n initialValue: initial.current,\n extensions: getRichTextExtensions(editor),\n singleLine,\n onChange: (value) => onChangeRef.current(value as RichText),\n onFinish: () => {\n editor.setEditingShape(null)\n editor.complete()\n },\n })\n handle.focus()\n return () => handle.destroy()\n }, [editor, factory, singleLine])\n\n return (\n <div\n ref={ref}\n className=\"mocanvas-rich-text mocanvas-rich-text-editor\"\n style={{ ...textStyle, userSelect: \"text\", WebkitUserSelect: \"text\", pointerEvents: \"auto\", cursor: \"text\" }}\n onPointerDown={stop}\n onPointerMove={stop}\n onPointerUp={stop}\n onKeyDown={stop}\n onKeyUp={stop}\n onContextMenu={stop}\n />\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, Editor } from \"@mocanvas/editor\"\nimport { getFontFamily } from \"../shapes/shape-theme\"\nimport { LINE_HEIGHT } from \"../shapes/text-helpers\"\nimport { renderHtmlFromRichTextForMeasurement } from \"./measure-html\"\nimport { isRichText, richTextToText, type RichTextSource } from \"./rich-text\"\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 /**\n * The label's font style token. Named `font` before v5; `font` is still\n * accepted and means the same thing.\n */\n fontFamily?: DefaultFontStyle\n /** @deprecated v5 renamed this to `fontFamily`. */\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 * The editor the label belongs to, used to pick up its configured rich-text\n * extensions. Optional: without one the default extension set is used.\n */\n editor?: Editor | null\n}\n\n/** The label's font style token, from either spelling, defaulting to `draw`. */\nexport function labelFontStyle(opts: Pick<LabelMeasureOptions, \"font\" | \"fontFamily\">): DefaultFontStyle {\n return opts.fontFamily ?? opts.font ?? \"draw\"\n}\n\n/**\n * Measure a shape label with the shared measurer using the default label\n * typography.\n *\n * Takes either spelling of a label: a plain string, or the rich-text document\n * the store may hold in `props.richText`. Rich text goes through the HTML path\n * so its marks (a bold run is wider than the plain one) are part of the\n * measurement; plain text goes through the cheaper text path. Both use the same\n * measurer, probe element and cache.\n */\nexport function measureLabel(source: RichTextSource, opts: LabelMeasureOptions): TextMeasurement {\n const fontFamily = getFontFamily(labelFontStyle(opts))\n if (isRichText(source)) {\n const html = renderHtmlFromRichTextForMeasurement(opts.editor ?? null, source)\n return getTextMeasure().measureHtml(html, {\n fontFamily,\n fontSize: opts.fontSize,\n lineHeight: LINE_HEIGHT,\n ...(opts.maxWidth === undefined ? {} : { maxWidth: opts.maxWidth }),\n padding: opts.padding ?? 0,\n })\n }\n return getTextMeasure().measureText(richTextToText(source), {\n fontFamily,\n fontSize: opts.fontSize,\n lineHeight: LINE_HEIGHT,\n ...(opts.maxWidth === undefined ? {} : { maxWidth: opts.maxWidth }),\n padding: opts.padding ?? 0,\n })\n}\n\n/**\n * How far to lift a label so it reads as centred, as a fraction of the font size.\n *\n * Centring the *line box* is geometrically right and optically wrong: a line box\n * reserves room for descenders whether or not the text has any, so the ink of a\n * typical word sits in its lower half and the word looks like it has sunk. What\n * the eye centres on is the letters themselves — somewhere between the middle of\n * the capitals and the middle of the x-height, depending on the word — so that is\n * what gets put on the centre line instead.\n *\n * Measured from the font rather than assumed: a face with a tall x-height needs a\n * different correction from one with a small one, and the value is only stable\n * per family, not across the stack. Cached per family, since it scales with the\n * em and so does not depend on the size.\n */\nconst OPTICAL_LIFT_CACHE = new Map<string, number>()\n\n/** The lift in px for a label, given the same options `measureLabel` takes. */\nexport function getLabelOpticalLift(opts: Pick<LabelMeasureOptions, \"font\" | \"fontFamily\"> & { fontSize: number }): number {\n return getOpticalCentreLift(getFontFamily(labelFontStyle(opts))) * opts.fontSize\n}\n\nfunction getOpticalCentreLift(fontFamily: string): number {\n const cached = OPTICAL_LIFT_CACHE.get(fontFamily)\n if (cached !== undefined) return cached\n let lift = 0\n try {\n const ctx = document.createElement(\"canvas\").getContext(\"2d\")\n if (ctx) {\n const em = 100\n ctx.font = `${em}px ${fontFamily}`\n const caps = ctx.measureText(\"H\")\n const ex = ctx.measureText(\"x\")\n const capHeight = caps.actualBoundingBoxAscent\n const xHeight = ex.actualBoundingBoxAscent\n const ascent = caps.fontBoundingBoxAscent\n const descent = caps.fontBoundingBoxDescent\n if (capHeight > 0 && xHeight > 0 && ascent > 0) {\n const lineHeight = LINE_HEIGHT * em\n const baseline = (lineHeight - (ascent + descent)) / 2 + ascent\n // Halfway between the capitals' midpoint and the x-height's midpoint.\n const optical = baseline - (capHeight + xHeight) / 4\n lift = (optical - lineHeight / 2) / em\n }\n }\n } catch {\n // No canvas (SSR, a test environment): centring the line box is the fallback,\n // which is what every label did before this existed.\n }\n // A correction this large is a measurement gone wrong, not a font.\n if (!Number.isFinite(lift) || lift < 0 || lift > 0.25) lift = 0\n OPTICAL_LIFT_CACHE.set(fontFamily, lift)\n return lift\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 /** The label, in either spelling: a plain string or a rich-text document. */\n text: RichTextSource\n /** @deprecated v5 renamed this to `fontFamily`. */\n font?: DefaultFontStyle\n fontFamily?: DefaultFontStyle\n fontSize: number\n autoSize: boolean\n /** Current wrap width, used when `autoSize` is off. */\n w: number\n /** The editor whose rich-text extensions apply, when there is one. */\n editor?: Editor | null\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, fontSize, autoSize, w, editor } = input\n const fontFamily = labelFontStyle(input)\n if (autoSize) {\n const m = measureLabel(text, { fontFamily, fontSize, editor: editor ?? null })\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, { fontFamily, fontSize, maxWidth: width, editor: editor ?? null })\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","import {\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n ShapeUtil,\n STROKE_SIZES,\n Vec,\n getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n ARROWHEAD_KINDS,\n ARROW_SHAPE_KINDS,\n type ArrowShapeKind,\n type BaseShape,\n type BindingCanBindOptions,\n type Geometry2d,\n type ShapeHandle,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLFontFace,\n type TLStyledShape,\n type TLTheme,\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 { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\nimport { getLabelOpticalLift, 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 labelGapOnBody,\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, readRichText, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getLabelFontFaces, getStrokeRgba, getThemeColors } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\nimport { svgPath } from \"./indicator-paths\"\nimport { arrowShapeProps } from \"./shape-props\"\nimport { arrowShapeMigrations } from \"./shape-migrations\"\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 /** The label as a rich-text document; see `NoteShapeProps.richText`. */\n richText: RichText\n /** The label as plain text — optional and derived; see `NoteShapeProps.text`. */\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\n/**\n * Routing kinds an arrow can have.\n *\n * The list itself lives with the other style vocabularies in the editor, so\n * that `ArrowShapeKindStyle` and this cannot drift apart; these are the names\n * the shape has always exported for it.\n */\nexport const ARROW_KINDS = ARROW_SHAPE_KINDS\nexport type ArrowKind = ArrowShapeKind\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 */\n/**\n * {@link ArrowShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readArrowProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedArrowProps = ArrowShapeProps & { text: string; richText: RichText }\n\nexport function readArrowProps(shape: { props?: unknown }): ResolvedArrowProps {\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\", ARROWHEAD_KINDS, \"none\"),\n arrowheadEnd: readEnum(p, \"arrowheadEnd\", ARROWHEAD_KINDS, \"arrow\"),\n font: readStyle(p, \"font\", DefaultFontStyle),\n richText: readRichText(p),\n text: readText(p),\n labelPosition: readNumber(p, \"labelPosition\", 0.5),\n scale: readNumber(p, \"scale\", 1),\n }\n}\n\n/**\n * What an arrow paints with.\n *\n * An arrow is a body, two terminals and a label, and all four are sized by the\n * shape's own `scale`, which the shared set knows nothing about. The label's\n * padding is here for the same reason a geo shape's is: anything measuring the\n * label has to agree with what draws it.\n */\nexport interface ArrowShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The body's width in page units, `scale` applied. */\n scaledStrokeWidth: number\n /** The label's font size in page units, `scale` applied. */\n labelFontSize: number\n /** Padding between the body and its label, in page units. */\n labelPadding: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n}\n\n/** `ArrowShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface ArrowShapeOptions extends ShapeUtilOptions<ArrowShape, ArrowShapeUtilDisplayValues> {}\n\n/** Resolve an arrow's display values; see {@link ArrowShapeUtilDisplayValues}. */\nexport function getArrowDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): ArrowShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const scale = readNumber(propsOf(shape), \"scale\", 1)\n return {\n ...base,\n scaledStrokeWidth: base.strokeWidth * scale,\n labelFontSize: base.fontSize * scale,\n labelPadding: ARROW_LABEL_PADDING * scale,\n labelFontFamily: base.fontFamily,\n }\n}\n\nexport class ArrowShapeUtil extends ShapeUtil<ArrowShape, ArrowShapeUtilDisplayValues> {\n static override type = \"arrow\" as const\n static override migrations = arrowShapeMigrations\n static override options: ArrowShapeOptions = { getDefaultDisplayValues: getArrowDisplayValues }\n declare readonly options: ArrowShapeOptions\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 = arrowShapeProps\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 richText: toRichText(\"\"),\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 /**\n * The label's box in shape space, or `null` when there is no label.\n *\n * Three things need it and they must agree: the geometry (which is what gets\n * hit-tested), the DOM element that paints the text, and the indicator that\n * outlines it on selection. They were computing it separately.\n */\n private labelBox(shape: ArrowShape): { x: number; y: number; w: number; h: number } | null {\n const { text, labelPosition, font, size, scale } = readArrowProps(shape)\n if (!text) return null\n const m = measureLabel(readRichText(shape.props), {\n fontFamily: font,\n fontSize: FONT_SIZES[size] * scale,\n padding: LABEL_PADDING * scale,\n editor: this.editor,\n })\n const c = getPointOnBody(this.resolveBody(shape).body, Math.max(0, Math.min(1, labelPosition)))\n return { x: c.x - m.w / 2, y: c.y - m.h / 2, w: m.w, h: m.h }\n }\n\n /**\n * `gapAtLabel` splits the body around the label's box. Only the selection\n * outline asks for it; the geometry the editor hit-tests keeps the body whole,\n * so the stroke the label covers is still there to be clicked.\n */\n getGeometry(shape: ArrowShape, opts?: { gapAtLabel: { x: number; y: number; w: number; h: number } }): 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 // The body is drawn whole, label or no label. The label is an opaque box laid\n // over it in `component`, which is both simpler than cutting the line and the\n // only version that stays clickable: cut the stroke out from under the label\n // and there is nothing left there to hit, since hit-testing runs on this\n // geometry and the label's own rectangle is excluded from it.\n const children: Geometry2d[] = []\n const gap = opts?.gapAtLabel ? labelGapOnBody(body, opts.gapAtLabel) : null\n if (gap) {\n const len = getBodyLength(body)\n if (gap.from > 0) children.push(bodyToGeometry(shortenBody(body, 0, len * (1 - gap.from))))\n if (gap.to < 1) children.push(bodyToGeometry(shortenBody(body, len * gap.to, 0)))\n } else {\n children.push(bodyToGeometry(body))\n }\n\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 const label = this.labelBox(shape)\n if (label) {\n children.push(new Rectangle2d({ x: label.x, y: label.y, width: label.w, height: label.h, isFilled: false, isLabel: true }))\n }\n return new Group2d({ children })\n }\n\n /** An arrow needs its family's faces only while it carries a label. */\n override getFontFaces(shape: ArrowShape): TLFontFace[] {\n return readText(shape.props) ? getLabelFontFaces(readArrowProps(shape).font) : []\n }\n\n override getRenderStyle(shape: ArrowShape): StyleWords {\n const { color, dash, size, scale } = readArrowProps(shape)\n const stroke = getStrokeRgba(color, getThemeColors(this.editor))\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 { richText, text, font, size, scale, labelPosition } = readArrowProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n const display = getDisplayValues<ArrowShape, ArrowShapeUtilDisplayValues>(this, shape)\n // Positioned from the measured box, not by `translate(-50%, -50%)`: the label\n // inside is absolutely positioned, so this wrapper has no size of its own and\n // a percentage translate resolves against zero — the label hung off the body\n // point by its own width and height instead of sitting on it.\n //\n // Opaque, in the page colour, and laid straight over the line. The arrow does\n // not know or care that a label is on it — it is drawn end to end and this\n // covers the stretch under the text. Painting over rather than cutting a gap\n // is also what keeps the label clickable: the stroke is still there\n // underneath, so a click near the text lands on the arrow's own geometry.\n const box = this.labelBox(shape) ?? { x: 0, y: 0, w: 0, h: 0 }\n const background = getThemeColors(this.editor).background\n return (\n <div\n style={{\n position: \"absolute\",\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n background,\n borderRadius: LABEL_PADDING * scale * 0.5,\n pointerEvents: \"none\",\n }}\n >\n {/* The box stays where the geometry puts it — centred on the line — and only\n the letters move, by the amount that face needs to *look* centred. */}\n <div\n style={{\n position: \"relative\",\n width: \"max-content\",\n transform: `translateY(${-getLabelOpticalLift({ fontFamily: font, fontSize: FONT_SIZES[size] * scale })}px)`,\n }}\n >\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={isEditing}\n fontFamily={font}\n fontSize={FONT_SIZES[size] * scale}\n color={display.labelColor}\n textAlign=\"middle\"\n verticalAlign=\"middle\"\n wrap={false}\n padding={LABEL_PADDING * scale}\n onChange={(next) =>\n this.editor.updateShape<ArrowShape>({\n id: shape.id,\n type: \"arrow\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<ArrowShape>({\n id: shape.id,\n type: \"arrow\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n </div>\n </div>\n )\n }\n\n override getIndicatorPath(shape: ArrowShape): Path2D {\n const label = this.labelBox(shape)\n const labelRadius = () => Math.min(LABEL_PADDING * readArrowProps(shape).scale * 0.5, label!.w / 2, label!.h / 2)\n\n // While the label is being edited it is the only thing indicated. The arrow is\n // not what is being worked on, and outlining it as well reads as \"both are\n // selected\" when only the text box takes input.\n if (label && this.editor.getEditingShapeId() === shape.id) {\n const p = new Path2D()\n p.roundRect(label.x, label.y, label.w, label.h, labelRadius())\n return p\n }\n\n // The outline stops at the label and picks up on the far side. The arrow's own\n // geometry runs straight through — that stroke is what a click under the text\n // lands on — but the outline is drawn over the label, and a line ruled across\n // the words is exactly what it should not be.\n const words = label ? this.getGeometry(shape, { gapAtLabel: label }).toPathWords() : this.getGeometry(shape).toPathWords()\n const p = svgPath(pathWordsToSvgD(words))\n // The one box a selected arrow does draw. Everything else about the selection\n // is the curve and its three handles — but the label is a box the pointer can\n // grab, so it says so.\n if (label) p.roundRect(label.x, label.y, label.w, label.h, labelRadius())\n return p\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: BindingCanBindOptions): 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 /**\n * …but the arrow's *own* outline is drawn. This flag suppresses a lone selected\n * shape's indicator, and the arrow used to set it because the selection frame\n * was the cue instead. With the frame gone there was no cue at all — a selected\n * arrow showed nothing. Its indicator is the curve and the label's box, which\n * is the cue worth having.\n */\n override hideSelectionBoundsFg(_shape: ArrowShape): boolean {\n return false\n }\n\n override hideResizeHandles(_shape: ArrowShape): boolean {\n return true\n }\n\n /**\n * …and no rotate handle either, which is what actually suppresses the box.\n * `selectionHandles` only drops the frame when resize *and* rotate are both\n * hidden, so hiding one of the two left a selected arrow wrapped in a\n * rectangle with a lone rotate dot above it. An arrow has nothing to rotate\n * about: its ends are the two handles, and turning it means moving them.\n */\n override hideRotateHandle(_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) return\n this.editor.updateShape<ArrowShape>({\n id: shape.id,\n type: \"arrow\",\n props: { text: trimmed, richText: applyPlainTextToRichText(readRichText(shape.props), trimmed) },\n })\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: \"vertex\", index: \"a2\", x: mid.x, y: mid.y })\n }\n } else {\n const mid = getPointOnBody(body, 0.5)\n // A vertex, not a \"virtual\" handle: virtual means the faint dot that *becomes*\n // a point when dragged, which is what a line's midpoints are. An arrow's bend\n // is a permanent handle, and drawing it as the faint kind made it read as an\n // afterthought next to its own two ends.\n handles.push({ id: \"bend\", type: \"vertex\", 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 BaseFrameLikeShapeUtil,\n hexToRgba,\n Rectangle2d,\n type BaseShape,\n type DefaultColorStyle,\n getDefaultDisplayValues,\n type Geometry2d,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLFontFace,\n type TLStyledShape,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport { frameShapeProps } from \"./shape-props\"\nimport { frameShapeMigrations } from \"./shape-migrations\"\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 getLabelFontFaces,\n} from \"./shape-theme\"\nimport { rectPath } from \"./indicator-paths\"\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\n/**\n * The artboard: a container that both groups and **crops**.\n *\n * Everything that makes it a container — adoption on drag-in, release on\n * drag-out, the lock gates, the ancestor-cycle guard — comes from\n * {@link BaseFrameLikeShapeUtil}; the frame itself only adds its chrome (the\n * body fill, the editable name strip) and keeps the base's clipping box.\n */\n/**\n * What a frame paints with.\n *\n * A frame is a container, so almost nothing it draws comes from the shared\n * style set: its body and border are fixed chrome, and the only text it has is\n * the name in its header. Those are what it adds.\n */\nexport interface FrameShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The frame body's fill. */\n frameFill: string\n /** The frame border's colour. */\n frameStroke: string\n /** The frame border's width, in page units. */\n frameStrokeWidth: number\n /** The header's font size, in page units. */\n nameFontSize: number\n /** The header's ink. */\n nameColor: string\n /** The header's height, in page units — how far above the body it sits. */\n nameHeight: number\n}\n\n/** `FrameShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface FrameShapeOptions extends ShapeUtilOptions<FrameShape, FrameShapeUtilDisplayValues> {\n /** The width a new frame is created at, in page units. */\n defaultWidth?: number\n /** The height a new frame is created at, in page units. */\n defaultHeight?: number\n}\n\n/** Resolve a frame's display values; see {@link FrameShapeUtilDisplayValues}. */\nexport function getFrameDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): FrameShapeUtilDisplayValues {\n return {\n ...getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode),\n frameFill: FRAME_FILL,\n frameStroke: FRAME_STROKE,\n frameStrokeWidth: FRAME_STROKE_WIDTH,\n nameFontSize: FRAME_NAME_FONT_SIZE,\n nameColor: FRAME_NAME_COLOR,\n nameHeight: FRAME_NAME_HEIGHT,\n }\n}\n\nexport class FrameShapeUtil extends BaseFrameLikeShapeUtil<FrameShape> {\n static override type = \"frame\" as const\n static override props = frameShapeProps\n static override migrations = frameShapeMigrations\n static override options: FrameShapeOptions = { getDefaultDisplayValues: getFrameDisplayValues }\n declare readonly options: FrameShapeOptions\n\n getDefaultProps(): FrameShapeProps {\n return { w: 160, h: 90, name: \"\" }\n }\n\n override 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 fontFamily=\"sans\"\n fontSize={FRAME_NAME_FONT_SIZE}\n color={FRAME_NAME_COLOR}\n textAlign=\"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 override getIndicatorPath(shape: FrameShape): Path2D {\n const p = propsOf(shape)\n return rectPath(readNumber(p, \"w\", 160), 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 /** A frame draws its name in the sans family, whatever its children use. */\n override getFontFaces(_shape: FrameShape): TLFontFace[] {\n return getLabelFontFaces(\"sans\")\n }\n\n override canEdit(_shape: FrameShape): 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 * The geo shape's *type table*: one entry per silhouette the `geo` shape can\n * take, and the seam an app extends it through.\n *\n * Before v5 the set of geo silhouettes was closed — a `switch` over a string\n * union in the util. It is now a table an app can add to\n * (`GeoShapeUtil.configure({ customGeoTypes })`), which is what lets a product\n * ship its own \"cog\" or \"callout\" as a `geo` shape rather than as a whole new\n * shape type with its own migrations, tool and style props.\n *\n * A definition answers three questions and no more: what outline to draw, how\n * to snap to it, and what to put on the toolbar button.\n */\n\nimport { GEO_SHAPE_KINDS, type GeoShapeKind, type Geometry2d } from \"@mocanvas/editor\"\nimport { getGeoGeometry } from \"./geo-helpers\"\n\n/**\n * How other shapes snap to this silhouette.\n *\n * `\"polygon\"` snaps to the outline's own vertices and edge midpoints — right\n * for anything with corners. `\"blobby\"` ignores the outline and snaps to the\n * bounding box, which is what a cloud or a heart wants: its vertices are\n * artefacts of the curve fit and mean nothing to the person drawing.\n */\nexport type GeoSnapType = \"polygon\" | \"blobby\"\n\n/** The kinds whose outline is curved, and therefore snap as blobs. */\nconst BLOBBY_KINDS: ReadonlySet<string> = new Set([\"ellipse\", \"oval\", \"cloud\", \"heart\"])\n\n/** Options {@link GeoTypeDefinition.getPath} is given beyond the box. */\nexport interface GeoPathOptions {\n /** Whether the interior is painted, and so whether it is hit-testable. */\n isFilled?: boolean\n /**\n * The width the outline will be stroked at, when the type needs it.\n *\n * Only a mark that *ends on* the outline does: a stroke is centred on its\n * path and its round cap reaches half a width past the last point, so a line\n * drawn corner to corner of the box pokes out beyond the very outline it is\n * supposed to sit inside. The x-box's diagonals are the case. A type whose\n * marks stay clear of the edge can ignore it.\n */\n strokeWidth?: number\n /**\n * Mirror the silhouette left-to-right inside its own box. The box, the\n * bounds and the label do not move; only the outline turns over.\n *\n * A custom geo type that ignores these draws unflipped, which is the right\n * failure for a silhouette that is symmetric anyway.\n */\n flipX?: boolean | undefined\n /** Mirror the silhouette top-to-bottom; see {@link GeoPathOptions.flipX}. */\n flipY?: boolean | undefined\n}\n\n/**\n * One geo silhouette.\n *\n * The `id` is what lands in `shape.props.geo`, so it is part of the file\n * format: choose it once and do not rename it.\n */\nexport interface GeoTypeDefinition {\n /** The value stored in `props.geo`. */\n id: string\n /**\n * The outline in a `w × h` box, in shape-local coordinates.\n *\n * Returning a {@link Geometry2d} rather than a path string is what makes a\n * custom geo type a first-class shape: the same object drives hit-testing,\n * bounds, snapping and the indicator, so none of them can disagree.\n */\n getPath(w: number, h: number, opts?: GeoPathOptions): Geometry2d\n /** How other shapes snap to it; see {@link GeoSnapType}. */\n snapType: GeoSnapType\n /** Name of the toolbar / style-panel icon for this silhouette. */\n icon: string\n /**\n * The size a click (rather than a drag) places this silhouette at. Omitted\n * means \"use the geo shape's own default box\".\n */\n defaultSize?: { w: number; h: number }\n /**\n * What a double click on the shape does, when it should do something other\n * than start editing the label. Return a props patch, or nothing.\n */\n onDoubleClick?(shape: { id: string; props: { geo: string; w: number; h: number } }): { w?: number; h?: number } | void\n}\n\n/** The built-in table: one entry per {@link GeoShapeKind}. */\nexport const DEFAULT_GEO_TYPE_DEFINITIONS: Readonly<Record<GeoShapeKind, GeoTypeDefinition>> = Object.freeze(\n Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind): [GeoShapeKind, GeoTypeDefinition] => [\n kind,\n {\n id: kind,\n getPath: (w, h, opts) => getGeoGeometry(kind, w, h, opts?.isFilled ?? false, { flipX: opts?.flipX, flipY: opts?.flipY }, opts?.strokeWidth ?? 0),\n snapType: BLOBBY_KINDS.has(kind) ? \"blobby\" : \"polygon\",\n // The icon set names its geo icons after the kind itself.\n icon: `geo-${kind}`,\n },\n ]),\n ) as Record<GeoShapeKind, GeoTypeDefinition>,\n)\n\n/**\n * The definition for a geo type, or `undefined` when nothing defines it.\n *\n * `customGeoTypes` wins over the built-in table, so an app may replace a\n * built-in silhouette as well as add to it — the same override order\n * `GeoShapeUtil` itself uses when it draws.\n */\nexport function getGeoTypeDefinition(\n geo: string,\n customGeoTypes?: Readonly<Record<string, GeoTypeDefinition>> | undefined,\n): GeoTypeDefinition | undefined {\n if (typeof geo !== \"string\" || geo.length === 0) return undefined\n const custom = customGeoTypes?.[geo]\n if (custom !== undefined) return custom\n return (DEFAULT_GEO_TYPE_DEFINITIONS as Record<string, GeoTypeDefinition>)[geo]\n}\n","import {\n BaseBoxShapeUtil,\n GEO_KIND,\n createBuiltInShapePropsMigrationIds,\n createShapePropsMigrationSequence,\n FONT_SIZES,\n Group2d,\n Rectangle2d,\n STROKE_SIZES,\n getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultDashStyle,\n DefaultFillStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n GeoShapeGeoStyle,\n type BaseShape,\n type EngineGeometry,\n type GeoShapeKind,\n type Geometry2d,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type TLFontFace,\n} from \"@mocanvas/editor\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport { alignToJustify, alignToTextAlign, TextLabel, verticalAlignToAlignItems } from \"../text/TextEditor\"\nimport { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { getGeoGeometry } from \"./geo-helpers\"\nimport { getGeoTypeDefinition, type GeoTypeDefinition } from \"./geo-types\"\nimport { geoShapeProps } from \"./shape-props\"\nimport { propsOf, readBoolean, readNumber, readRichText, readString, readStyle, readText } from \"./prop-access\"\nimport { getDashId, getFillRgba, getLabelFontFaces, getStrokeRgba, getThemeColors } from \"./shape-theme\"\nimport { pathWordsToSvgD } from \"./svg-path\"\nimport { svgPath } from \"./indicator-paths\"\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 /** The label as a rich-text document; see `NoteShapeProps.richText`. */\n richText: RichText\n /** The label as plain text — optional and derived; see `NoteShapeProps.text`. */\n text?: string\n scale: number\n /**\n * Mirror the silhouette left-to-right inside the shape's own box.\n *\n * Not a transform: `x`, `y`, `w`, `h` and the label are untouched, so a\n * flipped shape covers exactly the same bounds and still reads right way up.\n * Symmetric silhouettes (a rectangle, an ellipse) are unchanged by it.\n */\n flipX: boolean\n /** Mirror the silhouette top-to-bottom; see {@link GeoShapeProps.flipX}. */\n flipY: boolean\n}\n\nexport type GeoShape = BaseShape<\"geo\", GeoShapeProps>\n\n/** The box a click (rather than a drag) places a geo shape at. */\nexport const GEO_DEFAULT_SIZE = { w: 100, h: 100 } as const\n\n/**\n * `GeoShapeUtil`'s settings.\n *\n * `customGeoTypes` is the extension seam described in {@link GeoTypeDefinition}:\n *\n * ```ts\n * const utils = [GeoShapeUtil.configure({ customGeoTypes: { cog } })]\n * ```\n *\n * A key that matches a built-in silhouette replaces it.\n */\nexport interface GeoShapeOptions extends ShapeUtilOptions<GeoShape, GeoShapeUtilDisplayValues> {\n /** Extra (or replacement) geo silhouettes, keyed by the value stored in `props.geo`. */\n customGeoTypes?: Readonly<Record<string, GeoTypeDefinition>>\n}\n\n/**\n * What a geo shape paints with.\n *\n * A geo shape is an outline *and* a label, and the label has a size and a\n * padding of its own that anything measuring the shape has to agree with —\n * which is why they are reported rather than recomputed at each call site. All\n * three have the shape's `scale` applied, unlike the shared set's `fontSize`.\n */\nexport interface GeoShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The label's font size in page units, `scale` applied. */\n labelFontSize: number\n /** Padding between the outline and its label, in page units. */\n labelPadding: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n /** The outline's width in page units, `scale` applied. */\n scaledStrokeWidth: number\n}\n\n/** Resolve a geo shape's display values; see {@link GeoShapeUtilDisplayValues}. */\nexport function getGeoDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): GeoShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const scale = readNumber(propsOf(shape), \"scale\", 1)\n return {\n ...base,\n labelFontSize: base.fontSize * scale,\n labelPadding: GEO_LABEL_PADDING * scale,\n labelFontFamily: base.fontFamily,\n scaledStrokeWidth: base.strokeWidth * scale,\n }\n}\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 */\n/**\n * {@link GeoShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readGeoProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedGeoProps = GeoShapeProps & { text: string; richText: RichText }\n\nexport function readGeoProps(shape: { props?: unknown }): ResolvedGeoProps {\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 richText: readRichText(p),\n text: readText(p),\n scale: readNumber(p, \"scale\", 1),\n flipX: readBoolean(p, \"flipX\", false),\n flipY: readBoolean(p, \"flipY\", false),\n }\n}\n\n/** Measured size of a geo label (padding included), wrapped at the shape width. */\nexport function measureGeoLabel(\n props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\"> & { richText?: unknown },\n editor?: { getCurrentTheme?(): unknown } | null,\n) {\n const richText = readRichText(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(richText, {\n fontFamily: font,\n fontSize: FONT_SIZES[size] * scale,\n maxWidth: Math.max(1, w),\n padding: LABEL_PADDING * scale,\n editor: (editor ?? null) as never,\n })\n}\n\n/** `growY` a geo shape needs so its label fits inside `h`. Empty labels never grow the shape. */\nexport function getGeoGrowY(\n props: Pick<GeoShapeProps, \"text\" | \"font\" | \"size\" | \"scale\" | \"w\" | \"h\"> & { richText?: unknown },\n editor?: { getCurrentTheme?(): unknown } | null,\n): number {\n if (!readText(props)) return 0\n return computeGrowY(measureGeoLabel(props, editor).h, readNumber(props, \"h\", 100))\n}\n\nconst LABEL_KEYS: readonly (keyof GeoShapeProps)[] = [\"richText\", \"text\", \"font\", \"size\", \"scale\", \"w\", \"h\"]\n\n/** Named versions of the geo shape's props, for {@link geoShapeMigrations}. */\nexport const geoShapeVersions = createBuiltInShapePropsMigrationIds(\"geo\", {\n AddFlipProps: 1,\n})\n\n/**\n * The geo shape's props migrations.\n *\n * Boards saved before `flipX`/`flipY` existed have neither prop, and the\n * validator would otherwise refuse them on load; the migration backfills both\n * as `false`, which is the \"not flipped\" the old renderer implied. `down`\n * removes them again so an older client can still read a newer document.\n */\nexport const geoShapeMigrations = createShapePropsMigrationSequence({\n sequence: [\n {\n id: geoShapeVersions.AddFlipProps,\n up(props) {\n props[\"flipX\"] ??= false\n props[\"flipY\"] ??= false\n },\n down(props) {\n delete props[\"flipX\"]\n delete props[\"flipY\"]\n },\n },\n ],\n})\n\nexport class GeoShapeUtil extends BaseBoxShapeUtil<GeoShape> {\n static override type = \"geo\" as const\n static override migrations = geoShapeMigrations\n static override options: GeoShapeOptions = { getDefaultDisplayValues: getGeoDisplayValues }\n declare readonly options: GeoShapeOptions\n static override props = geoShapeProps\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 richText: toRichText(\"\"),\n text: \"\",\n scale: 1,\n flipX: false,\n flipY: false,\n }\n }\n\n /**\n * The silhouette for `geo`, taking this util's `customGeoTypes` into account.\n * Falls back to the rectangle so an unknown value still draws something.\n */\n getGeoTypeDefinition(geo: string): GeoTypeDefinition {\n return (\n getGeoTypeDefinition(geo, this.options.customGeoTypes) ??\n getGeoTypeDefinition(\"rectangle\", this.options.customGeoTypes)!\n )\n }\n\n /**\n * The `geo` value this util will actually draw.\n *\n * `props.geo` is a *style* prop, and its validator only knows the built-in\n * silhouettes — so reading it through the style would turn every custom geo\n * type back into a rectangle before it ever reached the table. A stored value\n * this util has a definition for is therefore kept as it is; anything else\n * falls back to the validated style, which is what keeps a value from another\n * editor's vocabulary drawing something rather than nothing.\n */\n getGeoValue(shape: { props?: unknown }): string {\n const p = propsOf(shape)\n const raw = readString(p, \"geo\", \"\")\n if (raw !== \"\" && getGeoTypeDefinition(raw, this.options.customGeoTypes) !== undefined) return raw\n return readStyle(p, \"geo\", GeoShapeGeoStyle)\n }\n\n /**\n * The engine has a generator for every built-in geo kind, so a built-in\n * travels as `(kind, w, h, flips)` rather than as its vertices. A custom geo\n * type returns `undefined` and keeps uploading whatever its `getPath` builds.\n */\n override getEngineGeometry(shape: GeoShape): EngineGeometry | undefined {\n const geo = this.getGeoValue(shape)\n if (this.options.customGeoTypes?.[geo]) return undefined\n const kind = GEO_KIND[geo]\n if (kind === undefined) return undefined\n const { w, h, growY, fill, flipX, flipY, size, scale } = readGeoProps(shape)\n // The label rect is always clamped inside the body box, so the group's\n // bounds stay exactly `w x (h + growY)` whether or not there is text.\n return {\n type: \"geo\",\n kind,\n w,\n h: h + growY,\n isClosed: true,\n isFilled: fill !== \"none\",\n flipX,\n flipY,\n // Only the marks inside an outline use it — the X of an x-box, whose ends\n // sit on the corners. `getGeometry` has always shortened them by this; the\n // engine draws its own copy of the path and needs to be told the same.\n strokeWidth: STROKE_SIZES[size] * scale,\n }\n }\n\n override getGeometry(shape: GeoShape): Geometry2d {\n const props = readGeoProps(shape)\n const { w, h, growY, fill, text, flipX, flipY, size, scale } = props\n const height = h + growY\n const body = this.getGeoTypeDefinition(this.getGeoValue(shape)).getPath(w, height, {\n isFilled: fill !== \"none\",\n flipX,\n flipY,\n strokeWidth: STROKE_SIZES[size] * scale,\n })\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 const colors = getThemeColors(this.editor)\n return {\n stroke: getStrokeRgba(color, colors),\n strokeWidth: STROKE_SIZES[size] * scale,\n fill: getFillRgba(color, fill, colors),\n dash: getDashId(dash),\n opacity: 1,\n }\n }\n\n /** A geo shape needs its family's faces only while it carries a label. */\n override getFontFaces(shape: GeoShape): TLFontFace[] {\n return readText(shape.props) ? getLabelFontFaces(readGeoProps(shape).font) : []\n }\n\n component(shape: GeoShape): ReactNode {\n const { richText, text, font, size, scale, align, verticalAlign, w, h, growY } = readGeoProps(shape)\n const isEditing = this.editor.getEditingShapeId() === shape.id\n if (!text && !isEditing) return null\n const display = getDisplayValues<GeoShape, GeoShapeUtilDisplayValues>(this, shape)\n return (\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={isEditing}\n fontFamily={font}\n fontSize={FONT_SIZES[size] * scale}\n color={display.labelColor}\n textAlign={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h + growY}\n padding={LABEL_PADDING * scale}\n onChange={(next) =>\n this.editor.updateShape<GeoShape>({\n id: shape.id,\n type: \"geo\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<GeoShape>({\n id: shape.id,\n type: \"geo\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n )\n }\n\n override getIndicatorPath(shape: GeoShape): Path2D {\n return svgPath(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, this.editor)\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, this.editor)\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) return\n this.editor.updateShape<GeoShape>({\n id: shape.id,\n type: \"geo\",\n props: { text: trimmed, richText: applyPlainTextToRichText(readRichText(shape.props), trimmed) },\n })\n }\n}\n","import {\n DEFAULT_THEME,\n Rectangle2d,\n ShapeUtil,\n getColorValue,\n getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n DefaultLabelColorStyle,\n DefaultSizeStyle,\n DefaultVerticalAlignStyle,\n type BaseShape,\n type Geometry2d,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLFontFace,\n type TLStyledShape,\n type TLTheme,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\nimport { computeGrowY, measureLabel, trimTrailingWhitespace } from \"../text/text-layout\"\nimport { noteShapeProps } from \"./shape-props\"\nimport { noteShapeMigrations } from \"./shape-migrations\"\nimport { propsOf, readNumber, readRichText, readString, readStyle, readText } from \"./prop-access\"\nimport {\n getLabelFontFaces,\n getNoteBodyGradientCss,\n getNoteFillRgba,\n getNoteShadowCss,\n getThemeColors,\n} from \"./shape-theme\"\nimport { rectPath } from \"./indicator-paths\"\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 /**\n * The label as a rich-text document — the v5 spelling, and the one the store\n * keeps. {@link NoteShapeProps.text} stays alongside it as the flattened\n * form, derived on load, so plain-text consumers need no conversion.\n */\n richText: RichText\n /**\n * The label as plain text.\n *\n * Optional, and *derived*: v5 replaced it with\n * {@link NoteShapeProps.richText}, and a record written by a v5 client has no\n * `text` at all. mocanvas keeps deriving it on load, because a plain-text\n * consumer (search, export, an agent reading the board) should not have to\n * walk a document — but nothing may require it to be present, and\n * `readRichText` is what reconciles the two when they disagree.\n */\n text?: string\n /**\n * Who first edited the label by hand, or `null` while nobody has.\n *\n * The seam attribution hangs off: a note whose text is still exactly what a\n * generator wrote can be regenerated freely, and one a person has touched\n * cannot. mocanvas stores and round-trips it; it never writes it itself,\n * because only the host knows who \"a person\" is.\n */\n textFirstEditedBy?: string | null | undefined\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 */\n/**\n * {@link NoteShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readNoteProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedNoteProps = NoteShapeProps & { text: string; richText: RichText }\n\nexport function readNoteProps(shape: { props?: unknown }): ResolvedNoteProps {\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 richText: readRichText(p),\n text: readText(p),\n textFirstEditedBy: readString(p, \"textFirstEditedBy\", \"\") || null,\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: { props?: unknown }, theme: TLTheme = DEFAULT_THEME): number {\n const { size, scale, fontSizeAdjustment } = readNoteProps(shape)\n const styled = theme.fontSize[size] ?? DEFAULT_THEME.fontSize[size]\n return (fontSizeAdjustment >= MIN_NOTE_FONT_SIZE ? fontSizeAdjustment : styled) * scale\n}\n\n/**\n * What a note paints with, once its style props have been resolved.\n *\n * Wider than the shared set because a note is not a filled rectangle with a\n * label on it: its body colour comes from the palette's *note* tokens rather\n * than from a fill style, and its label has a padding and a typography of its\n * own that anything measuring the note has to agree with. Callers read them\n * through `getDisplayValues(util, note)`, which is the only place the live\n * theme and colour mode are consulted.\n *\n * `noteWidth` and `noteHeight` are the note's **logical square**, before\n * `growY`. That is deliberate: the square is the note's identity, and a caller\n * fitting text into it wants the box the text has to fit, not the box the text\n * already grew.\n */\nexport interface NoteShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The body's width in page units, `scale` applied. */\n noteWidth: number\n /** The body's height in page units before `growY`; equal to `noteWidth`. */\n noteHeight: number\n /** Padding on every side between the body edge and its label, in page units. */\n labelPadding: number\n /** The label's font size in page units, after any `fontSizeAdjustment`. */\n labelFontSize: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n /** The label's CSS `font-style`. */\n labelFontStyle: string\n /** The label's CSS `font-weight`. */\n labelFontWeight: string\n /** The label's CSS `font-variant`. */\n labelFontVariant: string\n /** The label's CSS `line-height`, as a unitless multiple of the font size. */\n labelLineHeight: number\n}\n\n/** `NoteShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface NoteShapeOptions extends ShapeUtilOptions<NoteShape, NoteShapeUtilDisplayValues> {\n /** The note's logical square side in page units, before `scale`. */\n noteSize?: number\n /** Padding between the body edge and its label, before `scale`. */\n labelPadding?: number\n}\n\n/**\n * Resolve a note's display values against a theme.\n *\n * Tolerant of a bare `{ props }` bag rather than a whole record: a placement\n * ghost asks what a note the user has not created yet would look like, and it\n * has only the util's default props to ask with.\n */\nexport function getNoteDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n options: NoteShapeOptions = {},\n): NoteShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const props = readNoteProps(shape)\n const colors = theme.colors[colorMode] ?? theme.colors.light\n const side = (options.noteSize ?? NOTE_SIZE) * props.scale\n const fontSize = getNoteFontSize(shape, theme)\n // A note's ink is the palette's note text unless the label carries a colour\n // of its own; `black` is the \"unset\" value the style panel writes.\n const labelColor =\n props.labelColor === \"black\"\n ? getColorValue(colors, props.color, \"noteText\")\n : getColorValue(colors, props.labelColor, \"solid\")\n return {\n ...base,\n labelColor,\n fill: getColorValue(colors, props.color, \"noteFill\"),\n fontSize,\n lineHeight: fontSize * theme.lineHeight,\n noteWidth: side,\n noteHeight: side,\n labelPadding: (options.labelPadding ?? NOTE_PADDING) * props.scale,\n labelFontSize: fontSize,\n labelFontFamily: theme.fonts[props.font] ?? theme.fonts.draw,\n // SEMANTICS-ASSUMED: a note's label is upright, regular and unshaped. Rich\n // text carries its own bold/italic runs as marks, so the shape-level\n // typography is the base every run is measured relative to.\n labelFontStyle: \"normal\",\n labelFontWeight: \"normal\",\n labelFontVariant: \"normal\",\n labelLineHeight: theme.lineHeight,\n }\n}\n\n/** `growY` a note needs so its (centered) text fits; the note keeps its square width. */\nexport function getNoteGrowY(shape: NoteShape, editor?: { getCurrentTheme?(): TLTheme } | null): number {\n const { richText, text, font, scale } = readNoteProps(shape)\n if (!text) return 0\n const side = NOTE_SIZE * scale\n const m = measureLabel(richText, {\n fontFamily: font,\n fontSize: getNoteFontSize(shape),\n maxWidth: side,\n padding: NOTE_PADDING * scale,\n editor: (editor ?? null) as never,\n })\n return computeGrowY(m.h, side)\n}\n\nconst LABEL_KEYS: readonly (keyof NoteShapeProps)[] = [\"richText\", \"text\", \"font\", \"size\", \"scale\", \"fontSizeAdjustment\"]\n\nexport class NoteShapeUtil extends ShapeUtil<NoteShape, NoteShapeUtilDisplayValues> {\n static override type = \"note\" as const\n // A method, not an arrow: `getDisplayValues` calls it on the options bag, so\n // `this` is the bag a `configure()` copy actually carries. Closing over\n // `NoteShapeUtil.options` instead would make every configured copy resolve\n // against the unconfigured defaults.\n static override options: NoteShapeOptions = {\n getDefaultDisplayValues(editor, shape, theme, colorMode) {\n return getNoteDisplayValues(editor, shape, theme, colorMode, this)\n },\n }\n declare readonly options: NoteShapeOptions\n static override props = noteShapeProps\n static override migrations = noteShapeMigrations\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 richText: toRichText(\"\"),\n text: \"\",\n // Deliberately absent: `textFirstEditedBy` is read and round-tripped but\n // never written by mocanvas (only the host knows who \"a person\" is), and\n // defaulting it would make every file that predates attribution warn on\n // load about a prop nothing here ever sets.\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 const colors = getThemeColors(this.editor)\n return { fill: getNoteFillRgba(readNoteProps(shape).color, colors), stroke: 0, strokeWidth: 0, dash: 0, opacity: 1 }\n }\n\n /** A note is nothing but a label, so it needs its family's faces. */\n override getFontFaces(shape: NoteShape): TLFontFace[] {\n return getLabelFontFaces(readNoteProps(shape).font)\n }\n\n component(shape: NoteShape): ReactNode {\n const { richText, text, font, color, align, verticalAlign, scale, growY } = readNoteProps(shape)\n const display = getDisplayValues<NoteShape, NoteShapeUtilDisplayValues>(this, shape)\n const colors = getThemeColors(this.editor)\n const textColor = display.labelColor\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, colors),\n boxShadow: getNoteShadowCss(scale),\n pointerEvents: \"none\",\n }}\n />\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n fontFamily={font}\n fontSize={display.labelFontSize}\n color={textColor}\n textAlign={align}\n verticalAlign={verticalAlign}\n wrap\n width={w}\n height={h}\n padding={display.labelPadding}\n onChange={(next) =>\n this.editor.updateShape<NoteShape>({\n id: shape.id,\n type: \"note\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<NoteShape>({\n id: shape.id,\n type: \"note\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n </>\n )\n }\n\n override getIndicatorPath(shape: NoteShape): Path2D {\n const { scale, growY } = readNoteProps(shape)\n return rectPath(NOTE_SIZE * scale, 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, this.editor)\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, this.editor)\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) return\n this.editor.updateShape<NoteShape>({\n id: shape.id,\n type: \"note\",\n props: { text: trimmed, richText: applyPlainTextToRichText(readRichText(shape.props), trimmed) },\n })\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 { richTextToBlocks, richTextToText, type RichTextRun, type RichTextRunStyle, type RichTextSource } from \"./rich-text\"\nimport { getTextMeasure } from \"./TextMeasure\"\n\nexport type TextTextureAlign = \"start\" | \"middle\" | \"end\"\n\nexport interface TextTextureSpec {\n /**\n * The label as plain text. Ignored when {@link TextTextureSpec.richText} is\n * set; derived from it when only `richText` is given.\n */\n text: string\n /**\n * The label as a rich-text document. When present the raster is drawn run by\n * run, so bold, italic, underlined and struck-through spans keep their\n * formatting on the GPU path rather than only in the DOM overlay.\n */\n richText?: RichTextSource\n fontFamily: string\n fontSize: number\n /** Any CSS color string. */\n color: string\n /** Horizontal alignment. Named `align` before v5; `align` is still accepted. */\n textAlign?: TextTextureAlign\n /** @deprecated v5 renamed this to `textAlign`. */\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/** Horizontal alignment of a spec, from either spelling. */\nexport function textTextureAlign(spec: TextTextureSpec): TextTextureAlign {\n return spec.textAlign ?? spec.align ?? \"start\"\n}\n\n/** The plain text of a spec: the document's text when it has one, else `text`. */\nexport function textTextureText(spec: TextTextureSpec): string {\n return spec.richText === undefined || spec.richText === null ? spec.text : richTextToText(spec.richText)\n}\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 and the rich-text document\n * 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 textTextureAlign(spec),\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.richText === undefined || spec.richText === null ? spec.text : JSON.stringify(spec.richText),\n ].join(\"|\")\n}\n\n/** Width of one unwrapped run, through the shared measurer (cached). */\nfunction runWidth(text: string, spec: TextTextureSpec, style?: RichTextRunStyle): 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 ...(style?.bold ? { fontWeight: \"bold\" } : {}),\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 textTextureText(spec).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/** One rendered line of a rich-text raster: the styled runs it is made of, and their total width. */\nexport interface TextTextureLine {\n runs: RichTextRun[]\n width: number\n}\n\nfunction sameStyle(a: RichTextRunStyle, b: RichTextRunStyle): boolean {\n return a.bold === b.bold && a.italic === b.italic && a.underline === b.underline && a.strike === b.strike && a.code === b.code && a.href === b.href\n}\n\n/**\n * Break a spec's label into the lines the raster draws, keeping each run's\n * formatting.\n *\n * Same greedy word wrapping as {@link wrapTextTextureLines} — hard newlines\n * (here: block boundaries and `hardBreak` nodes) always break, a word that does\n * not fit is split by characters — but a line is a list of styled runs rather\n * than a string, so a bold word inside a sentence is measured and drawn bold.\n * A spec with no `richText` yields one unstyled run per line, so the two\n * functions agree line for line.\n */\nexport function wrapTextTextureRuns(spec: TextTextureSpec): TextTextureLine[] {\n const padding = spec.padding ?? 0\n const max = spec.maxWidth === undefined ? undefined : Math.max(1, spec.maxWidth - padding * 2)\n const source: RichTextSource = spec.richText === undefined || spec.richText === null ? spec.text : spec.richText\n const out: TextTextureLine[] = []\n\n for (const block of richTextToBlocks(source)) {\n let line: RichTextRun[] = []\n let width = 0\n const push = (): void => {\n // A line never keeps the space it broke at, so it aligns like the DOM\n // label and like `wrapTextTextureLines`.\n while (line.length > 0 && /^\\s+$/u.test(line[line.length - 1]!.text)) {\n const dropped = line.pop()!\n width -= runWidth(dropped.text, spec, dropped)\n }\n out.push({ runs: mergeRuns(line), width: Math.max(0, width) })\n line = []\n width = 0\n }\n for (const run of block.runs) {\n // Keep the separators so a wrapped line does not lose or gain a space.\n for (const token of run.text.split(/(\\s+)/u).filter((t) => t.length > 0)) {\n const isSpace = /^\\s+$/u.test(token)\n const tokenWidth = runWidth(token, spec, run)\n if (max !== undefined && !isSpace && line.length > 0 && width + tokenWidth > max) {\n push()\n }\n // A leading space on a freshly wrapped line is dropped, as CSS does.\n if (isSpace && line.length === 0) continue\n if (max !== undefined && !isSpace && tokenWidth > max) {\n for (const piece of breakLongToken(token, spec, run, max, width, line.length > 0)) {\n if (piece === null) push()\n else {\n line.push({ ...run, text: piece })\n width += runWidth(piece, spec, run)\n }\n }\n continue\n }\n line.push({ ...run, text: token })\n width += tokenWidth\n }\n }\n push()\n }\n return out\n}\n\n/**\n * Split a token wider than the line into pieces, emitting `null` where the\n * caller must start a new line first.\n */\nfunction breakLongToken(token: string, spec: TextTextureSpec, style: RichTextRunStyle, max: number, startWidth: number, canBreakFirst: boolean): (string | null)[] {\n const out: (string | null)[] = []\n if (canBreakFirst && startWidth > 0) out.push(null)\n let current = \"\"\n for (const char of token) {\n const next = current + char\n if (current.length > 0 && runWidth(next, spec, style) > max) {\n out.push(current, null)\n current = char\n } else {\n current = next\n }\n }\n if (current.length > 0) out.push(current)\n return out\n}\n\n/** Collapse neighbouring runs that share a style, so the renderer draws one `fillText` per style change. */\nfunction mergeRuns(runs: readonly RichTextRun[]): RichTextRun[] {\n const out: RichTextRun[] = []\n for (const run of runs) {\n const last = out[out.length - 1]\n if (last && sameStyle(last, run)) last.text += run.text\n else out.push({ ...run })\n }\n return out\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 = wrapTextTextureRuns(spec)\n const lineHeightPx = spec.fontSize * spec.lineHeight\n const blockHeight = lines.length * lineHeightPx\n const align = textTextureAlign(spec)\n\n ctx.scale(scale, scale)\n ctx.fillStyle = spec.color\n ctx.textBaseline = \"middle\"\n // Runs are placed left to right by hand, so the context always draws from the\n // run's own left edge; the line's alignment is in `lineLeft` below.\n ctx.textAlign = \"left\"\n\n const innerH = Math.max(0, spec.height - padding * 2)\n const innerW = Math.max(0, spec.width - padding * 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 const line = lines[i]!\n // CSS centres a run inside its line box; the canvas baseline does the same.\n const baseline = top + i * lineHeightPx + lineHeightPx / 2\n let x = padding + (align === \"start\" ? 0 : align === \"end\" ? innerW - line.width : (innerW - line.width) / 2)\n for (const run of line.runs) {\n ctx.font = runFont(run, spec)\n ctx.fillText(run.text, x, baseline)\n const width = runWidth(run.text, spec, run)\n if (run.underline || run.strike) {\n const thickness = Math.max(1, spec.fontSize / 14)\n const y = run.underline ? baseline + spec.fontSize * 0.4 : baseline\n ctx.fillRect(x, y - thickness / 2, width, thickness)\n }\n x += width\n }\n }\n return canvas\n}\n\n/** The `ctx.font` shorthand a run draws with. */\nfunction runFont(style: RichTextRunStyle, spec: TextTextureSpec): string {\n const parts: string[] = []\n if (style.italic) parts.push(\"italic\")\n if (style.bold) parts.push(\"bold\")\n parts.push(`${spec.fontSize}px`, spec.fontFamily)\n return parts.join(\" \")\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 getDefaultDisplayValues,\n getDisplayValues,\n DefaultColorStyle,\n DefaultFontStyle,\n DefaultHorizontalAlignStyle,\n type DefaultTextAlignStyle,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n DefaultSizeStyle,\n type BaseShape,\n type Editor,\n type Geometry2d,\n type ResizeInfo,\n type ShapeUtilOptions,\n type StyleWords,\n type TLFontFace,\n} from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TextLabel } from \"../text/TextEditor\"\nimport { applyPlainTextToRichText, richTextToText, toRichText, type RichText } from \"../text/rich-text\"\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, readRichText, readStyle, readText } from \"./prop-access\"\nimport { getFontFamily, getLabelFontFaces, getStrokeRgba, getTheme, getThemeColors, getTextCssColor } from \"./shape-theme\"\nimport { rectPath } from \"./indicator-paths\"\nimport { textShapeProps } from \"./shape-props\"\nimport { textShapeMigrations } from \"./shape-migrations\"\n\nexport interface TextShapeProps {\n color: DefaultColorStyle\n size: DefaultSizeStyle\n font: DefaultFontStyle\n /**\n * How the paragraphs are aligned inside the shape's own width.\n *\n * Typed as the whole horizontal-align set because that is the style the\n * shape declares, and a record written by an older client may hold one of\n * its `-legacy` values. `readTextProps` narrows every one of them to\n * `start` / `middle` / `end`, so nothing downstream has to know they exist.\n */\n textAlign: DefaultHorizontalAlignStyle\n w: number\n /** The label as a rich-text document; see `NoteShapeProps.richText`. */\n richText: RichText\n /** The label as plain text — optional and derived; see `NoteShapeProps.text`. */\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 */\n/**\n * {@link TextShapeProps} with the *derived* label filled in as well.\n *\n * `props.text` is optional on the record — a v5 writer only sets `richText` —\n * but a util that has run it through {@link readTextProps} always has both, so\n * everything downstream can take a plain `string`.\n */\nexport type ResolvedTextProps = Omit<TextShapeProps, \"textAlign\"> & {\n text: string\n richText: RichText\n /**\n * Narrowed to the three alignments that mean something for a paragraph: a\n * stored `-legacy` value reads as `start`, which is what those spellings\n * aligned a label box to.\n */\n textAlign: DefaultTextAlignStyle\n}\n\nexport function readTextProps(shape: { props?: unknown }): ResolvedTextProps {\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 richText: readRichText(p),\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(\n shape: { props?: unknown },\n editor?: Editor | null,\n): { w: number; h: number; lineCount: number } {\n const { richText, size, scale, w, font, autoSize } = readTextProps(shape)\n return getTextShapeSize({\n text: richText,\n fontFamily: font,\n fontSize: FONT_SIZES[size] * scale,\n autoSize,\n w,\n editor: editor ?? null,\n })\n}\n\n/** Height of the text block at its current width. */\nexport function getTextShapeHeight(shape: TextShape, editor?: Editor | null): number {\n return getTextShapeSizeFor(shape, editor).h\n}\n\n/** The box `getGeometry` produces: what a texture for this shape must cover. */\nexport function getTextShapeBox(shape: TextShape, editor?: Editor | null): { w: number; h: number } {\n const { w, h } = getTextShapeSizeFor(shape, editor)\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, editor)\n return {\n text,\n fontFamily: getFontFamily(font, getTheme(editor)),\n fontSize: FONT_SIZES[size] * scale,\n color: getTextCssColor(color, getThemeColors(editor)),\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)[] = [\"richText\", \"text\", \"font\", \"size\", \"scale\", \"autoSize\"]\n\n/** `TextShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\n/**\n * What a text shape paints with.\n *\n * A text shape is nothing but a label, and its label carries a `scale` the\n * shared set knows nothing about — so the sizes it actually draws at are\n * reported separately from the ones the style asks for.\n */\nexport interface TextShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** The font size actually drawn, in page units: `fontSize` with `scale` applied. */\n labelFontSize: number\n /** The line height actually drawn, in page units. */\n labelLineHeight: number\n /** The label's CSS font stack. */\n labelFontFamily: string\n}\n\n/** `TextShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface TextShapeOptions extends ShapeUtilOptions<TextShape, TextShapeUtilDisplayValues> {}\n\n/** Resolve a text shape's display values; see {@link TextShapeUtilDisplayValues}. */\nexport function getTextDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): TextShapeUtilDisplayValues {\n const base = getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode)\n const scale = readNumber(propsOf(shape), \"scale\", 1)\n return {\n ...base,\n labelFontSize: base.fontSize * scale,\n labelLineHeight: base.fontSize * scale * LINE_HEIGHT,\n labelFontFamily: base.fontFamily,\n }\n}\n\nexport class TextShapeUtil extends ShapeUtil<TextShape, TextShapeUtilDisplayValues> {\n static override type = \"text\" as const\n static override props = textShapeProps\n static override migrations = textShapeMigrations\n static override options: TextShapeOptions = { getDefaultDisplayValues: getTextDisplayValues }\n declare readonly options: TextShapeOptions\n\n getDefaultProps(): TextShapeProps {\n return {\n color: \"black\",\n size: \"m\",\n font: \"draw\",\n textAlign: \"start\",\n w: 100,\n richText: toRichText(\"\"),\n text: \"\",\n scale: 1,\n autoSize: true,\n }\n }\n\n getGeometry(shape: TextShape): Geometry2d {\n const box = getTextShapeBox(shape, this.editor)\n return new Rectangle2d({ width: box.w, height: box.h, isFilled: true })\n }\n\n /** A text shape is nothing but a label, so it always needs its family's faces. */\n override getFontFaces(shape: TextShape): TLFontFace[] {\n return getLabelFontFaces(readTextProps(shape).font)\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 {\n fill: getStrokeRgba(readTextProps(shape).color, getThemeColors(this.editor)),\n stroke: 0,\n strokeWidth: 0,\n dash: 0,\n opacity: 1,\n texture,\n }\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 { richText, text, font, size, scale, textAlign, w, autoSize } = readTextProps(shape)\n const display = getDisplayValues<TextShape>(this, shape)\n return (\n <TextLabel\n shape={shape}\n text={text}\n richText={richText}\n isEditing={this.editor.getEditingShapeId() === shape.id}\n fontFamily={font}\n fontSize={FONT_SIZES[size] * scale}\n color={display.color}\n textAlign={textAlign}\n verticalAlign=\"start\"\n wrap={!autoSize}\n width={Math.max(1, w)}\n onChange={(next) =>\n this.editor.updateShape<TextShape>({\n id: shape.id,\n type: \"text\",\n props: { text: next, richText: applyPlainTextToRichText(richText, next) },\n })\n }\n onChangeRichText={(next) =>\n this.editor.updateShape<TextShape>({\n id: shape.id,\n type: \"text\",\n props: { richText: next, text: richTextToText(next) },\n })\n }\n />\n )\n }\n\n override getIndicatorPath(shape: TextShape): Path2D {\n const b = this.getGeometry(shape).bounds\n return rectPath(b.w, 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, this.editor)\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 getDefaultDisplayValues,\n type ShapeUtilOptions,\n type StyleWords,\n type TLColorMode,\n type TLDefaultDisplayValues,\n type TLStyledShape,\n type TLTheme,\n type VideoAsset,\n} from \"@mocanvas/editor\"\nimport { videoShapeProps } from \"./shape-props\"\nimport { videoShapeMigrations } from \"./shape-migrations\"\nimport { useEffect, useRef, type CSSProperties, type ReactNode } from \"react\"\nimport { propsOf, readBoolean, readNumber, readString } from \"./prop-access\"\nimport { rectPath } from \"./indicator-paths\"\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 editor members this module reads, none of which it requires to exist.\n *\n * `allowVideoAutoplay` is an editor *option*, so its declaration belongs on\n * `EditorConfig` in the editor package; it is read structurally here so that a\n * host which already sets it is honoured whether or not the field has been\n * declared yet.\n */\ninterface EditorWithVideoOptions {\n options?: { allowVideoAutoplay?: boolean }\n}\n\n/**\n * Whether a video may start itself.\n *\n * Defaults to `true` — the historical behaviour, where a shape carrying\n * `props.playing` starts as soon as it is on screen. An app that sets\n * `options.allowVideoAutoplay: false` gets the opposite: no video ever starts\n * on its own, and one only plays once someone presses play in its controls.\n * The shape's `playing` prop is left alone either way, so the setting is a\n * property of this editor rather than an edit to the document.\n */\nexport function isVideoAutoplayAllowed(editor: Editor | null | undefined): boolean {\n return (editor as EditorWithVideoOptions | null | undefined)?.options?.allowVideoAutoplay !== false\n}\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\n/**\n * What a video shape paints with: the placeholder frame and the play glyph\n * drawn over it. Like an image, a video carries no styles of its own.\n */\nexport interface VideoShapeUtilDisplayValues extends TLDefaultDisplayValues {\n /** Fill of the frame drawn before the video can be shown. */\n placeholderFill: string\n /** Border of that placeholder. */\n placeholderStroke: string\n /** Ink of the play glyph. */\n playColor: string\n /** The play glyph's side, in page units. */\n playSize: number\n}\n\n/** `VideoShapeUtil`'s settings; see {@link ShapeUtil.configure}. */\nexport interface VideoShapeOptions extends ShapeUtilOptions<VideoShape, VideoShapeUtilDisplayValues> {\n /** The width a new video shape is created at, in page units. */\n defaultWidth?: number\n /** The height a new video shape is created at, in page units. */\n defaultHeight?: number\n}\n\n/** Resolve a video shape's display values; see {@link VideoShapeUtilDisplayValues}. */\nexport function getVideoDisplayValues(\n editor: unknown,\n shape: { props?: unknown },\n theme: TLTheme,\n colorMode: TLColorMode,\n): VideoShapeUtilDisplayValues {\n return {\n ...getDefaultDisplayValues(editor, shape as TLStyledShape, theme, colorMode),\n placeholderFill: VIDEO_PLACEHOLDER_FILL,\n placeholderStroke: VIDEO_PLACEHOLDER_STROKE,\n playColor: VIDEO_PLAY_COLOR,\n playSize: VIDEO_PLAY_SIZE,\n }\n}\n\nexport class VideoShapeUtil extends BaseBoxShapeUtil<VideoShape> {\n static override type = \"video\" as const\n static override props = videoShapeProps\n static override migrations = videoShapeMigrations\n static override options: VideoShapeOptions = { getDefaultDisplayValues: getVideoDisplayValues }\n declare readonly options: VideoShapeOptions\n\n getDefaultProps(): VideoShapeProps {\n return { w: VIDEO_WIDTH, h: VIDEO_HEIGHT, assetId: null, time: 0, playing: true, url: \"\", altText: \"\" }\n }\n\n override 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) && isVideoAutoplayAllowed(this.editor)}\n controls={this.editor.getEditingShapeId() === shape.id}\n altText={altText}\n />\n </div>\n )\n }\n\n override getIndicatorPath(shape: VideoShape): Path2D {\n const { w, h } = readVideoBox(shape)\n return rectPath(w, 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 { isRichText, richTextToBlocks, richTextToText, safeHref, type RichTextRun, type RichTextSource } from \"../text/rich-text\"\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 /** Horizontal alignment. Named `align` before v5; `align` is still accepted. */\n textAlign?: DefaultHorizontalAlignStyle | \"start\" | \"middle\" | \"end\"\n /** @deprecated v5 renamed this to `textAlign`. */\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/** The horizontal alignment of a text options bag, from either spelling. */\nfunction alignOf(opts: SvgTextOptions): DefaultHorizontalAlignStyle | \"start\" | \"middle\" | \"end\" {\n return opts.textAlign ?? opts.align ?? \"middle\"\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: NonNullable<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 * Split a rich-text document into the rendered lines, each a list of styled\n * runs.\n *\n * Wrapping is by the same average-glyph-advance estimate {@link wrapTextLines}\n * uses, over the concatenated text of the line, so a document and the plain\n * string it flattens to break in the same places. That keeps a rich-text export\n * and a plain-text export of the same label the same height.\n */\nexport function wrapRichTextLines(source: RichTextSource, fontSize: number, maxWidth = Infinity): RichTextRun[][] {\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: RichTextRun[][] = []\n\n for (const block of richTextToBlocks(source)) {\n let line: RichTextRun[] = []\n let length = 0\n const push = (): void => {\n // A line never keeps the space it broke at, exactly as `wrapTextLines`\n // (which joins words) never produces one.\n while (line.length > 0 && /^\\s+$/u.test(line[line.length - 1]!.text)) line.pop()\n lines.push(mergeSvgRuns(line))\n line = []\n length = 0\n }\n for (const run of block.runs) {\n for (const token of run.text.split(/(\\s+)/u).filter((t) => t.length > 0)) {\n const isSpace = /^\\s+$/u.test(token)\n if (!isSpace && length > 0 && length + token.length > limit) push()\n if (isSpace && length === 0) continue\n if (!isSpace && token.length > limit) {\n // A single word longer than the line breaks mid-word, like `overflow-wrap: break-word`.\n let rest = token\n while (rest.length > limit) {\n if (length > 0) push()\n line.push({ ...run, text: rest.slice(0, limit) })\n length = limit\n rest = rest.slice(limit)\n push()\n }\n if (rest.length > 0) {\n line.push({ ...run, text: rest })\n length += rest.length\n }\n continue\n }\n line.push({ ...run, text: token })\n length += token.length\n }\n }\n push()\n }\n return lines\n}\n\n/** Collapse neighbouring runs that share a style, so one word is one `<tspan>`. */\nfunction mergeSvgRuns(runs: readonly RichTextRun[]): RichTextRun[] {\n const out: RichTextRun[] = []\n for (const run of runs) {\n const last = out[out.length - 1]\n if (last && last.bold === run.bold && last.italic === run.italic && last.underline === run.underline && last.strike === run.strike && last.code === run.code && last.href === run.href) last.text += run.text\n else out.push({ ...run })\n }\n return out\n}\n\n/** The `<tspan>` attributes a run's marks translate to. */\nfunction runAttrs(run: RichTextRun, opts: SvgTextOptions): Record<string, string | number | undefined> {\n const decorations: string[] = []\n if (run.underline) decorations.push(\"underline\")\n if (run.strike) decorations.push(\"line-through\")\n return {\n \"font-weight\": run.bold ? \"bold\" : opts.fontWeight === undefined ? undefined : String(opts.fontWeight),\n \"font-style\": run.italic ? \"italic\" : undefined,\n \"text-decoration\": decorations.length === 0 ? undefined : decorations.join(\" \"),\n }\n}\n\n/**\n * Render `source` inside `box`. Returns an empty string for an empty label.\n * Lines are positioned with `dominant-baseline=\"central\"` so vertical centring\n * does not depend on font metrics.\n *\n * Accepts either spelling of a label: a plain string, or the rich-text document\n * the store may hold in `props.richText`. A document is exported run by run —\n * bold, italic, underlined and struck-through spans and links survive into the\n * SVG — while a plain string takes the single-`<tspan>`-per-line path it always\n * did.\n */\nexport function textToSvg(source: RichTextSource, box: SvgTextBox, opts: SvgTextOptions): string {\n const rich = isRichText(source)\n const plain = richTextToText(source)\n if (plain.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 wrapWidth = opts.wrap ? innerW : Infinity\n const lineCount = rich ? wrapRichTextLines(source, opts.fontSize, wrapWidth).length : wrapTextLines(plain, opts.fontSize, wrapWidth).length\n const lineH = opts.fontSize * LINE_HEIGHT\n const blockH = lineCount * lineH\n\n const anchor = anchorFor(alignOf(opts))\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 const lineY = (i: number): number => top + lineH * i + lineH / 2\n\n const spans = rich\n ? wrapRichTextLines(source, opts.fontSize, wrapWidth)\n .map((runs, i) => {\n // Preserve runs of spaces and keep empty lines from collapsing.\n const content =\n runs.length === 0\n ? \"​\"\n : runs\n .map((run) => {\n const a = attrs(runAttrs(run, opts))\n const inner = `<tspan${a.length === 0 ? \"\" : ` ${a}`}>${escapeXml(run.text)}</tspan>`\n const href = safeHref(run.href)\n return href === null ? inner : `<a ${attrs({ href })}>${inner}</a>`\n })\n .join(\"\")\n return `<tspan x=\"${svgNum(x)}\" y=\"${svgNum(lineY(i))}\">${content}</tspan>`\n })\n .join(\"\")\n : wrapTextLines(plain, opts.fontSize, wrapWidth)\n .map((line, i) => `<tspan x=\"${svgNum(x)}\" y=\"${svgNum(lineY(i))}\">${line.length === 0 ? \"​\" : escapeXml(line)}</tspan>`)\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 /**\n * Page units added around the shapes' bounds. Default 32.\n *\n * `\"auto\"` means \"whatever frames the drawing sensibly\", which for mocanvas\n * is the default padding: the export bounds already come from geometry\n * rather than from the culling pad, so there is no slack left to trim back.\n */\n padding?: number | \"auto\"\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 = typeof opts.padding === \"number\" ? 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"]}